UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

116 lines 18.8 kB
import { Component, forwardRef, Input, Output, EventEmitter } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { IconSelectorService } from '../icon-selector.service'; import { GainsightService } from '@c8y/ngx-components'; import { PRODUCT_EXPERIENCE_ICON_SELECTOR } from '@c8y/ngx-components/icon-selector/model'; import * as i0 from "@angular/core"; import * as i1 from "../icon-selector.service"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@angular/common"; import * as i4 from "ngx-bootstrap/tooltip"; /** * A component which acts as a wrapper for the icon selector. * * Example 1: * ``` <c8y-icon-selector-wrapper [selectedIcon]="'water'" (onSelect)="selectIcon($event)" ></c8y-icon-selector-wrapper> * ``` * OR as a part of a formGroup * Example 2: * ``` <c8y-icon-selector-wrapper name="icon" formControlName="icon"> </c8y-icon-selector-wrapper> * ``` */ export class IconSelectorWrapperComponent { constructor(iconSelector, gainsightService) { this.iconSelector = iconSelector; this.gainsightService = gainsightService; this.canRemoveIcon = false; /** * The displayed icon size, the value has to be multiple of 8. */ this.iconSize = 32; this.onSelect = new EventEmitter(); /** * @ignore */ // eslint-disable-next-line @typescript-eslint/no-empty-function this.onChange = () => { }; } /** * @ignore * @param icon The value to update */ writeValue(icon) { this.selectedIcon = icon; } /** * @ignore * @param fn The function to register for changes */ registerOnChange(fn) { this.onChange = fn; } /** * @ignore * @param fn The function to register for changes */ registerOnTouched(fn) { this.onTouched = fn; } removeIcon() { this.onSelect.emit(undefined); } async openIconSelector() { try { this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ICON_SELECTOR.EVENTS.ICON_SELECTOR, { component: PRODUCT_EXPERIENCE_ICON_SELECTOR.COMPONENTS.ICON_SELECTOR_WRAPPER_COMPONENT, action: PRODUCT_EXPERIENCE_ICON_SELECTOR.ACTIONS.OPEN_ICON_SELECTOR }); const icon = await this.iconSelector.selectIcon({ currentSelection: this.selectedIcon }); this.onChange(icon); this.selectedIcon = icon; this.onSelect.emit(icon); this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ICON_SELECTOR.EVENTS.ICON_SELECTOR, { component: PRODUCT_EXPERIENCE_ICON_SELECTOR.COMPONENTS.ICON_SELECTOR_WRAPPER_COMPONENT, action: PRODUCT_EXPERIENCE_ICON_SELECTOR.ACTIONS.ICON_SELECTED }); } catch { // nothing to do } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IconSelectorWrapperComponent, deps: [{ token: i1.IconSelectorService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: { canRemoveIcon: "canRemoveIcon", selectedIcon: "selectedIcon", iconSize: "iconSize" }, outputs: { onSelect: "onSelect" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => IconSelectorWrapperComponent), multi: true } ], ngImport: i0, template: "<div class=\"d-flex a-i-center j-c-center p-relative\">\n <div\n class=\"icon-{{ iconSize }} text-center l-h-1 fit-w fit-h\"\n *ngIf=\"selectedIcon\"\n >\n <i\n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"selectedIcon\"\n ></i>\n </div>\n\n <div\n class=\"icon-{{ iconSize }} text-muted text-center a-s-stretch fit-w\"\n style=\"border: 2px dashed var(--c8y-root-component-border-color)\"\n *ngIf=\"!selectedIcon\"\n >\n <span class=\"d-flex a-i-center j-c-center text-12 fit-h\">\n <em>{{ 'Auto' | translate }}</em>\n </span>\n </div>\n <div class=\"showOnHover d-flex j-c-center p-absolute fit-h fit-w\">\n <button\n class=\"btn btn-dot btn-icon btn-sm m-0\"\n title=\"{{ 'Select icon' | translate }}\"\n [attr.aria-label]=\"'Select icon' | translate\"\n type=\"button\"\n (click)=\"openIconSelector()\"\n *ngIf=\"!selectedIcon\"\n >\n {{ 'Select' | translate }}\n </button>\n <button\n class=\"btn btn-dot btn-sm btn-icon m-0\"\n [attr.aria-label]=\"'Change icon' | translate\"\n tooltip=\"{{ 'Change icon' | translate }}\"\n placement=\"top\"\n [delay]=\"500\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"selectedIcon\"\n (click)=\"openIconSelector()\"\n >\n <i [c8yIcon]=\"'replace'\"></i>\n </button>\n <button\n class=\"btn btn-dot btn-dot--danger btn-icon btn-sm m-0\"\n [attr.aria-label]=\"'Remove icon and use default icon' | translate\"\n tooltip=\"{{ 'Remove icon and use default icon' | translate }}\"\n placement=\"top\"\n [delay]=\"500\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"selectedIcon && canRemoveIcon\"\n (click)=\"removeIcon()\"\n >\n <i [c8yIcon]=\"'trash'\"></i>\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IconSelectorWrapperComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-icon-selector-wrapper', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => IconSelectorWrapperComponent), multi: true } ], template: "<div class=\"d-flex a-i-center j-c-center p-relative\">\n <div\n class=\"icon-{{ iconSize }} text-center l-h-1 fit-w fit-h\"\n *ngIf=\"selectedIcon\"\n >\n <i\n class=\"c8y-icon-duocolor\"\n [c8yIcon]=\"selectedIcon\"\n ></i>\n </div>\n\n <div\n class=\"icon-{{ iconSize }} text-muted text-center a-s-stretch fit-w\"\n style=\"border: 2px dashed var(--c8y-root-component-border-color)\"\n *ngIf=\"!selectedIcon\"\n >\n <span class=\"d-flex a-i-center j-c-center text-12 fit-h\">\n <em>{{ 'Auto' | translate }}</em>\n </span>\n </div>\n <div class=\"showOnHover d-flex j-c-center p-absolute fit-h fit-w\">\n <button\n class=\"btn btn-dot btn-icon btn-sm m-0\"\n title=\"{{ 'Select icon' | translate }}\"\n [attr.aria-label]=\"'Select icon' | translate\"\n type=\"button\"\n (click)=\"openIconSelector()\"\n *ngIf=\"!selectedIcon\"\n >\n {{ 'Select' | translate }}\n </button>\n <button\n class=\"btn btn-dot btn-sm btn-icon m-0\"\n [attr.aria-label]=\"'Change icon' | translate\"\n tooltip=\"{{ 'Change icon' | translate }}\"\n placement=\"top\"\n [delay]=\"500\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"selectedIcon\"\n (click)=\"openIconSelector()\"\n >\n <i [c8yIcon]=\"'replace'\"></i>\n </button>\n <button\n class=\"btn btn-dot btn-dot--danger btn-icon btn-sm m-0\"\n [attr.aria-label]=\"'Remove icon and use default icon' | translate\"\n tooltip=\"{{ 'Remove icon and use default icon' | translate }}\"\n placement=\"top\"\n [delay]=\"500\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"selectedIcon && canRemoveIcon\"\n (click)=\"removeIcon()\"\n >\n <i [c8yIcon]=\"'trash'\"></i>\n </button>\n </div>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.IconSelectorService }, { type: i2.GainsightService }], propDecorators: { canRemoveIcon: [{ type: Input }], selectedIcon: [{ type: Input }], iconSize: [{ type: Input }], onSelect: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1zZWxlY3Rvci13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2ljb24tc2VsZWN0b3IvaWNvbi1zZWxlY3Rvci13cmFwcGVyL2ljb24tc2VsZWN0b3Itd3JhcHBlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9pY29uLXNlbGVjdG9yL2ljb24tc2VsZWN0b3Itd3JhcHBlci9pY29uLXNlbGVjdG9yLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7QUFDM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFZSCxNQUFNLE9BQU8sNEJBQTRCO0lBY3ZDLFlBQ1UsWUFBaUMsRUFDakMsZ0JBQWtDO1FBRGxDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBZm5DLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRS9COztXQUVHO1FBQ00sYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNiLGFBQVEsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVk5RDs7V0FFRztRQUNILGdFQUFnRTtRQUNoRSxhQUFRLEdBQTRCLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQU4xQyxDQUFDO0lBUUo7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLElBQVk7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEVBQWM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLEVBQWM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQjtRQUNwQixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7Z0JBQ3hGLFNBQVMsRUFBRSxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsK0JBQStCO2dCQUN0RixNQUFNLEVBQUUsZ0NBQWdDLENBQUMsT0FBTyxDQUFDLGtCQUFrQjthQUNwRSxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUM5QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsWUFBWTthQUNwQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsZ0NBQWdDLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtnQkFDeEYsU0FBUyxFQUFFLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQywrQkFBK0I7Z0JBQ3RGLE1BQU0sRUFBRSxnQ0FBZ0MsQ0FBQyxPQUFPLENBQUMsYUFBYTthQUMvRCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsZ0JBQWdCO1FBQ2xCLENBQUM7SUFDSCxDQUFDOytHQXhFVSw0QkFBNEI7bUdBQTVCLDRCQUE0Qix1TEFSNUI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixDQUFDO2dCQUMzRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsMEJDL0JILG96REEyREE7OzRGRDFCYSw0QkFBNEI7a0JBWHhDLFNBQVM7K0JBQ0UsMkJBQTJCLGFBRTFCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDZCQUE2QixDQUFDOzRCQUMzRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjt1SEFHUSxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEljb25TZWxlY3RvclNlcnZpY2UgfSBmcm9tICcuLi9pY29uLXNlbGVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgUFJPRFVDVF9FWFBFUklFTkNFX0lDT05fU0VMRUNUT1IgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ljb24tc2VsZWN0b3IvbW9kZWwnO1xuLyoqXG4gKiBBIGNvbXBvbmVudCB3aGljaCBhY3RzIGFzIGEgd3JhcHBlciBmb3IgdGhlIGljb24gc2VsZWN0b3IuXG4gKlxuICogRXhhbXBsZSAxOlxuICogYGBgXG4gICAgPGM4eS1pY29uLXNlbGVjdG9yLXdyYXBwZXJcbiAgICAgICAgW3NlbGVjdGVkSWNvbl09XCInd2F0ZXInXCJcbiAgICAgICAgKG9uU2VsZWN0KT1cInNlbGVjdEljb24oJGV2ZW50KVwiXG4gICAgPjwvYzh5LWljb24tc2VsZWN0b3Itd3JhcHBlcj5cbiAqIGBgYFxuICogT1IgYXMgYSBwYXJ0IG9mIGEgZm9ybUdyb3VwXG4gKiBFeGFtcGxlIDI6XG4gKiBgYGBcbiAgICA8Yzh5LWljb24tc2VsZWN0b3Itd3JhcHBlciBuYW1lPVwiaWNvblwiIGZvcm1Db250cm9sTmFtZT1cImljb25cIj5cbiAgICA8L2M4eS1pY29uLXNlbGVjdG9yLXdyYXBwZXI+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWljb24tc2VsZWN0b3Itd3JhcHBlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9pY29uLXNlbGVjdG9yLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEljb25TZWxlY3RvcldyYXBwZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgSWNvblNlbGVjdG9yV3JhcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY2FuUmVtb3ZlSWNvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWxlY3RlZEljb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5ZWQgaWNvbiBzaXplLCB0aGUgdmFsdWUgaGFzIHRvIGJlIG11bHRpcGxlIG9mIDguXG4gICAqL1xuICBASW5wdXQoKSBpY29uU2l6ZSA9IDMyO1xuICBAT3V0cHV0KCkgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpY29uU2VsZWN0b3I6IEljb25TZWxlY3RvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKiBAcGFyYW0gaWNvbiBUaGUgdmFsdWUgdG8gdXBkYXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKGljb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRJY29uID0gaWNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgZm9yIGNoYW5nZXNcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIGZvciBjaGFuZ2VzXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICByZW1vdmVJY29uKCkge1xuICAgIHRoaXMub25TZWxlY3QuZW1pdCh1bmRlZmluZWQpO1xuICB9XG5cbiAgYXN5bmMgb3Blbkljb25TZWxlY3RvcigpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChQUk9EVUNUX0VYUEVSSUVOQ0VfSUNPTl9TRUxFQ1RPUi5FVkVOVFMuSUNPTl9TRUxFQ1RPUiwge1xuICAgICAgICBjb21wb25lbnQ6IFBST0RVQ1RfRVhQRVJJRU5DRV9JQ09OX1NFTEVDVE9SLkNPTVBPTkVOVFMuSUNPTl9TRUxFQ1RPUl9XUkFQUEVSX0NPTVBPTkVOVCxcbiAgICAgICAgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0VfSUNPTl9TRUxFQ1RPUi5BQ1RJT05TLk9QRU5fSUNPTl9TRUxFQ1RPUlxuICAgICAgfSk7XG4gICAgICBjb25zdCBpY29uID0gYXdhaXQgdGhpcy5pY29uU2VsZWN0b3Iuc2VsZWN0SWNvbih7XG4gICAgICAgIGN1cnJlbnRTZWxlY3Rpb246IHRoaXMuc2VsZWN0ZWRJY29uXG4gICAgICB9KTtcbiAgICAgIHRoaXMub25DaGFuZ2UoaWNvbik7XG4gICAgICB0aGlzLnNlbGVjdGVkSWNvbiA9IGljb247XG4gICAgICB0aGlzLm9uU2VsZWN0LmVtaXQoaWNvbik7XG4gICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFBST0RVQ1RfRVhQRVJJRU5DRV9JQ09OX1NFTEVDVE9SLkVWRU5UUy5JQ09OX1NFTEVDVE9SLCB7XG4gICAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFX0lDT05fU0VMRUNUT1IuQ09NUE9ORU5UUy5JQ09OX1NFTEVDVE9SX1dSQVBQRVJfQ09NUE9ORU5ULFxuICAgICAgICBhY3Rpb246IFBST0RVQ1RfRVhQRVJJRU5DRV9JQ09OX1NFTEVDVE9SLkFDVElPTlMuSUNPTl9TRUxFQ1RFRFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgai1jLWNlbnRlciBwLXJlbGF0aXZlXCI+XG4gIDxkaXZcbiAgICBjbGFzcz1cImljb24te3sgaWNvblNpemUgfX0gdGV4dC1jZW50ZXIgbC1oLTEgZml0LXcgZml0LWhcIlxuICAgICpuZ0lmPVwic2VsZWN0ZWRJY29uXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cImM4eS1pY29uLWR1b2NvbG9yXCJcbiAgICAgIFtjOHlJY29uXT1cInNlbGVjdGVkSWNvblwiXG4gICAgPjwvaT5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwiaWNvbi17eyBpY29uU2l6ZSB9fSB0ZXh0LW11dGVkIHRleHQtY2VudGVyIGEtcy1zdHJldGNoIGZpdC13XCJcbiAgICBzdHlsZT1cImJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1jOHktcm9vdC1jb21wb25lbnQtYm9yZGVyLWNvbG9yKVwiXG4gICAgKm5nSWY9XCIhc2VsZWN0ZWRJY29uXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgai1jLWNlbnRlciB0ZXh0LTEyIGZpdC1oXCI+XG4gICAgICA8ZW0+e3sgJ0F1dG8nIHwgdHJhbnNsYXRlIH19PC9lbT5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2hvd09uSG92ZXIgZC1mbGV4IGotYy1jZW50ZXIgcC1hYnNvbHV0ZSBmaXQtaCBmaXQtd1wiPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWljb24gYnRuLXNtIG0tMFwiXG4gICAgICB0aXRsZT1cInt7ICdTZWxlY3QgaWNvbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0IGljb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cIm9wZW5JY29uU2VsZWN0b3IoKVwiXG4gICAgICAqbmdJZj1cIiFzZWxlY3RlZEljb25cIlxuICAgID5cbiAgICAgIHt7ICdTZWxlY3QnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tc20gYnRuLWljb24gbS0wXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NoYW5nZSBpY29uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICB0b29sdGlwPVwie3sgJ0NoYW5nZSBpY29uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKm5nSWY9XCJzZWxlY3RlZEljb25cIlxuICAgICAgKGNsaWNrKT1cIm9wZW5JY29uU2VsZWN0b3IoKVwiXG4gICAgPlxuICAgICAgPGkgW2M4eUljb25dPVwiJ3JlcGxhY2UnXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIGJ0bi1pY29uIGJ0bi1zbSBtLTBcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlIGljb24gYW5kIHVzZSBkZWZhdWx0IGljb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgIHRvb2x0aXA9XCJ7eyAnUmVtb3ZlIGljb24gYW5kIHVzZSBkZWZhdWx0IGljb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAqbmdJZj1cInNlbGVjdGVkSWNvbiAmJiBjYW5SZW1vdmVJY29uXCJcbiAgICAgIChjbGljayk9XCJyZW1vdmVJY29uKClcIlxuICAgID5cbiAgICAgIDxpIFtjOHlJY29uXT1cIid0cmFzaCdcIj48L2k+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=