UNPKG

@asoftwareworld/form-builder-pro

Version:

ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b

186 lines 28.2 kB
import { Component, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { isDefined } from '@asoftwareworld/form-builder-pro/utils'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/material/tooltip"; export class AswEditorSelect { elRef; r; options = []; // tslint:disable-next-line:no-input-rename isHidden; selectedOption; disabled = false; optionId = 0; get label() { return this.selectedOption && this.selectedOption.hasOwnProperty('label') ? this.selectedOption.label : 'Select'; } opened = false; get value() { return this.selectedOption.value; } hidden = 'inline-block'; changeEvent = new EventEmitter(); labelButton; constructor(elRef, r) { this.elRef = elRef; this.r = r; } ngOnInit() { this.selectedOption = this.options[0]; if (isDefined(this.isHidden) && this.isHidden) { this.hide(); } } hide() { this.hidden = 'none'; } optionSelect(option, event) { event.stopPropagation(); this.setValue(option.value); this.onChange(this.selectedOption.value); this.changeEvent.emit(this.selectedOption.value); this.onTouched(); this.opened = false; } toggleOpen(event) { // event.stopPropagation(); if (this.disabled) { return; } this.opened = !this.opened; } onClick($event) { if (!this.elRef.nativeElement.contains($event.target)) { this.close(); } } close() { this.opened = false; } get isOpen() { return this.opened; } writeValue(value) { if (!value || typeof value !== 'string') { return; } this.setValue(value); } setValue(value) { let index = 0; const selectedEl = this.options.find((el, i) => { index = i; return el.value === value; }); if (selectedEl) { this.selectedOption = selectedEl; this.optionId = index; } } onChange = () => { }; onTouched = () => { }; registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.labelButton.nativeElement.disabled = isDisabled; const div = this.labelButton.nativeElement; const action = isDisabled ? 'addClass' : 'removeClass'; this.r[action](div, 'disabled'); this.disabled = isDisabled; } handleKeyDown($event) { if (!this.opened) { return; } // console.log($event.key); // if (KeyCode[$event.key]) { switch ($event.key) { case 'ArrowDown': this._handleArrowDown(); break; case 'ArrowUp': this._handleArrowUp(); break; case 'Space': this._handleSpace(); break; case 'Enter': this._handleEnter($event); break; case 'Tab': this._handleTab(); break; case 'Escape': this.close(); $event.preventDefault(); break; case 'Backspace': this._handleBackspace(); break; } // } else if ($event.key && $event.key.length === 1) { // this._keyPress$.next($event.key.toLocaleLowerCase()); // } } _handleArrowDown() { if (this.optionId < this.options.length - 1) { this.optionId++; } } _handleArrowUp() { if (this.optionId >= 1) { this.optionId--; } } _handleSpace() { } _handleEnter($event) { this.optionSelect(this.options[this.optionId], $event); } _handleTab() { } _handleBackspace() { } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswEditorSelect, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AswEditorSelect, selector: "asw-editor-select", inputs: { options: "options", isHidden: ["hidden", "isHidden"] }, outputs: { changeEvent: "change" }, host: { listeners: { "document:click": "onClick($event)", "keydown": "handleKeyDown($event)" }, properties: { "style.display": "this.hidden" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AswEditorSelect), multi: true } ], viewQueries: [{ propertyName: "labelButton", first: true, predicate: ["labelButton"], descendants: true, static: true }], ngImport: i0, template: "<span class=\"asw-font asw-picker\" [ngClass]=\"{'asw-expanded':isOpen}\">\r\n <button [tabIndex]=\"-1\" #labelButton tabindex=\"0\" type=\"button\" role=\"button\" class=\"asw-picker-label\" matTooltip=\"{{label}}\"\r\n (click)=\"toggleOpen($event);\">{{label}}\r\n <svg viewBox=\"0 0 18 18\">\r\n <polygon class=\"asw-stroke\" points=\"7 11 9 13 11 11 7 11\"></polygon>\r\n <polygon class=\"asw-stroke\" points=\"7 7 9 5 11 7 7 7\"></polygon>\r\n </svg>\r\n </button>\r\n <span class=\"asw-picker-options\">\r\n <button tabindex=\"-1\" type=\"button\" role=\"button\" class=\"asw-picker-item\"\r\n *ngFor=\"let item of options; let i = index\"\r\n [ngClass]=\"{'selected': item.value === value, 'focused': i === optionId}\"\r\n (click)=\"optionSelect(item, $event)\">\r\n {{item.label}}\r\n </button>\r\n <span class=\"dropdown-item\" *ngIf=\"!options.length\">No items for select</span>\r\n </span>\r\n</span>", styles: [".asw-font.asw-picker{color:#1a73e8;display:inline-block;width:100%;position:relative;vertical-align:middle}.asw-font .asw-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:10px;position:relative;width:100%;line-height:26px;vertical-align:middle;font-size:100%;text-align:left;background-color:#fff;min-width:2rem;float:left;border:1px solid #ddd;text-overflow:clip;overflow:hidden;white-space:nowrap;min-height:2.4rem;color:#1a73e8;background-color:#e8f0fe}.asw-font .asw-picker-label:before{content:\"\";position:absolute;right:0;top:0;width:20px;height:100%}.asw-font .asw-picker-label:focus{outline:none}.asw-font .asw-picker-label:hover{cursor:pointer;background-color:#e8f0fe;transition:.2s ease}.asw-font .asw-picker-label:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.asw-font .asw-picker-label:disabled:before{background:linear-gradient(to right,#f5f5f5 100%,#fff)}.asw-font .asw-picker-label svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.asw-font .asw-picker-label svg:not(:root){overflow:hidden}.asw-font .asw-picker-label svg .asw-stroke{fill:none;stroke:#1a73e8;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.asw-font .asw-picker-options{background-color:#fff;display:none;min-width:100%;position:absolute;white-space:nowrap;z-index:3;border:1px solid transparent;box-shadow:#0003 0 2px 8px}.asw-font .asw-picker-options .asw-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px;padding-left:5px;z-index:3;text-align:left;background-color:transparent;min-width:2rem;width:100%;border:0 solid #ddd}.asw-font .asw-picker-options .asw-picker-item.selected{color:#1a73e8;background-color:#e8f0fe}.asw-font.asw-expanded{display:block;margin-top:-1px;z-index:1}.asw-font.asw-expanded .asw-picker-label{color:#1a73e8;z-index:2}.asw-font.asw-expanded .asw-picker-label svg{color:#1a73e8;z-index:2}.asw-font.asw-expanded .asw-picker-label svg .asw-stroke{stroke:#1a73e8}.asw-font.asw-expanded .asw-picker-options{display:block;margin-top:-1px;top:100%;z-index:3;border-color:#ccc}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswEditorSelect, decorators: [{ type: Component, args: [{ selector: 'asw-editor-select', encapsulation: ViewEncapsulation.None, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AswEditorSelect), multi: true } ], template: "<span class=\"asw-font asw-picker\" [ngClass]=\"{'asw-expanded':isOpen}\">\r\n <button [tabIndex]=\"-1\" #labelButton tabindex=\"0\" type=\"button\" role=\"button\" class=\"asw-picker-label\" matTooltip=\"{{label}}\"\r\n (click)=\"toggleOpen($event);\">{{label}}\r\n <svg viewBox=\"0 0 18 18\">\r\n <polygon class=\"asw-stroke\" points=\"7 11 9 13 11 11 7 11\"></polygon>\r\n <polygon class=\"asw-stroke\" points=\"7 7 9 5 11 7 7 7\"></polygon>\r\n </svg>\r\n </button>\r\n <span class=\"asw-picker-options\">\r\n <button tabindex=\"-1\" type=\"button\" role=\"button\" class=\"asw-picker-item\"\r\n *ngFor=\"let item of options; let i = index\"\r\n [ngClass]=\"{'selected': item.value === value, 'focused': i === optionId}\"\r\n (click)=\"optionSelect(item, $event)\">\r\n {{item.label}}\r\n </button>\r\n <span class=\"dropdown-item\" *ngIf=\"!options.length\">No items for select</span>\r\n </span>\r\n</span>", styles: [".asw-font.asw-picker{color:#1a73e8;display:inline-block;width:100%;position:relative;vertical-align:middle}.asw-font .asw-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:10px;position:relative;width:100%;line-height:26px;vertical-align:middle;font-size:100%;text-align:left;background-color:#fff;min-width:2rem;float:left;border:1px solid #ddd;text-overflow:clip;overflow:hidden;white-space:nowrap;min-height:2.4rem;color:#1a73e8;background-color:#e8f0fe}.asw-font .asw-picker-label:before{content:\"\";position:absolute;right:0;top:0;width:20px;height:100%}.asw-font .asw-picker-label:focus{outline:none}.asw-font .asw-picker-label:hover{cursor:pointer;background-color:#e8f0fe;transition:.2s ease}.asw-font .asw-picker-label:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.asw-font .asw-picker-label:disabled:before{background:linear-gradient(to right,#f5f5f5 100%,#fff)}.asw-font .asw-picker-label svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.asw-font .asw-picker-label svg:not(:root){overflow:hidden}.asw-font .asw-picker-label svg .asw-stroke{fill:none;stroke:#1a73e8;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.asw-font .asw-picker-options{background-color:#fff;display:none;min-width:100%;position:absolute;white-space:nowrap;z-index:3;border:1px solid transparent;box-shadow:#0003 0 2px 8px}.asw-font .asw-picker-options .asw-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px;padding-left:5px;z-index:3;text-align:left;background-color:transparent;min-width:2rem;width:100%;border:0 solid #ddd}.asw-font .asw-picker-options .asw-picker-item.selected{color:#1a73e8;background-color:#e8f0fe}.asw-font.asw-expanded{display:block;margin-top:-1px;z-index:1}.asw-font.asw-expanded .asw-picker-label{color:#1a73e8;z-index:2}.asw-font.asw-expanded .asw-picker-label svg{color:#1a73e8;z-index:2}.asw-font.asw-expanded .asw-picker-label svg .asw-stroke{stroke:#1a73e8}.asw-font.asw-expanded .asw-picker-options{display:block;margin-top:-1px;top:100%;z-index:3;border-color:#ccc}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { options: [{ type: Input }], isHidden: [{ type: Input, args: ['hidden'] }], hidden: [{ type: HostBinding, args: ['style.display'] }], changeEvent: [{ type: Output, args: ['change'] }], labelButton: [{ type: ViewChild, args: ['labelButton', { static: true }] }], onClick: [{ type: HostListener, args: ['document:click', ['$event']] }], handleKeyDown: [{ type: HostListener, args: ['keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXNlbGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2VkaXRvci9lZGl0b3Itc2VsZWN0L2VkaXRvci1zZWxlY3QudHMiLCIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLXNlbGVjdC9lZGl0b3Itc2VsZWN0Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBYSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0ssT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7OztBQW9CbkUsTUFBTSxPQUFPLGVBQWU7SUEyQlo7SUFDQTtJQTNCSCxPQUFPLEdBQW1CLEVBQUUsQ0FBQztJQUV0QywyQ0FBMkM7SUFDMUIsUUFBUSxDQUFXO0lBRXBDLGNBQWMsQ0FBZ0I7SUFDOUIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRWIsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3JILENBQUM7SUFFRCxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRTZCLE1BQU0sR0FBRyxjQUFjLENBQUM7SUFFcEMsV0FBVyxHQUFHLElBQUksWUFB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QkFnQmUsTUFBTTtzQkFBbkMsV0FBVzt1QkFBQyxlQUFlO2dCQUVWLFdBQVc7c0JBQTVCLE1BQU07dUJBQUMsUUFBUTtnQkFFNEIsV0FBVztzQkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQW9DMUMsT0FBTztzQkFETixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXNEMUMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNEZWZpbmVkIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci1wcm8vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2Fzdy1lZGl0b3Itc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZWRpdG9yLXNlbGVjdC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9lZGl0b3Itc2VsZWN0LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzd0VkaXRvclNlbGVjdCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBBc3dFZGl0b3JTZWxlY3QgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBASW5wdXQoKSBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICAgIEBJbnB1dCgnaGlkZGVuJykgaXNIaWRkZW4/OiBib29sZWFuO1xuXG4gICAgc2VsZWN0ZWRPcHRpb24hOiBTZWxlY3RPcHRpb247XG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBvcHRpb25JZCA9IDA7XG5cbiAgICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcHRpb24gJiYgdGhpcy5zZWxlY3RlZE9wdGlvbi5oYXNPd25Qcm9wZXJ0eSgnbGFiZWwnKSA/IHRoaXMuc2VsZWN0ZWRPcHRpb24ubGFiZWwgOiAnU2VsZWN0JztcbiAgICB9XG5cbiAgICBvcGVuZWQgPSBmYWxzZTtcblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbi52YWx1ZTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBoaWRkZW4gPSAnaW5saW5lLWJsb2NrJztcblxuICAgIEBPdXRwdXQoJ2NoYW5nZScpIGNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZCgnbGFiZWxCdXR0b24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBsYWJlbEJ1dHRvbiE6IEVsZW1lbnRSZWY7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSByOiBSZW5kZXJlcjJcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHRoaXMub3B0aW9uc1swXTtcbiAgICAgICAgaWYgKGlzRGVmaW5lZCh0aGlzLmlzSGlkZGVuKSAmJiB0aGlzLmlzSGlkZGVuKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhpZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlkZGVuID0gJ25vbmUnO1xuICAgIH1cblxuICAgIG9wdGlvblNlbGVjdChvcHRpb246IFNlbGVjdE9wdGlvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnNlbGVjdGVkT3B0aW9uLnZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLm9wZW5lZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRvZ2dsZU9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcGVuZWQgPSAhdGhpcy5vcGVuZWQ7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICAgIG9uQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKCRldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuZWQ7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHNldFZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbCA9IHRoaXMub3B0aW9ucy5maW5kKChlbCwgaSkgPT4ge1xuICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgcmV0dXJuIGVsLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWxlY3RlZEVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uID0gc2VsZWN0ZWRFbDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uSWQgPSBpbmRleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2hhbmdlOiBhbnkgPSAoKSA9PiB7fTtcbiAgICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHt9O1xuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMubGFiZWxCdXR0b24ubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIGNvbnN0IGRpdiA9IHRoaXMubGFiZWxCdXR0b24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gaXNEaXNhYmxlZCA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnO1xuICAgICAgICB0aGlzLnJbYWN0aW9uXShkaXYsICdkaXNhYmxlZCcpO1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgICBoYW5kbGVLZXlEb3duKCRldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3BlbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJGV2ZW50LmtleSk7XG4gICAgICAgIC8vIGlmIChLZXlDb2RlWyRldmVudC5rZXldKSB7XG4gICAgICAgIHN3aXRjaCAoJGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVBcnJvd0Rvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUFycm93VXAoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVTcGFjZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVudGVyKCRldmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVRhYigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCYWNrc3BhY2UnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUJhY2tzcGFjZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIH0gZWxzZSBpZiAoJGV2ZW50LmtleSAmJiAkZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyB0aGlzLl9rZXlQcmVzcyQubmV4dCgkZXZlbnQua2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgX2hhbmRsZUFycm93RG93bigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uSWQgPCB0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25JZCsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2hhbmRsZUFycm93VXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbklkID49IDEpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uSWQtLTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9oYW5kbGVTcGFjZSgpOiB2b2lkIHt9XG5cbiAgICBfaGFuZGxlRW50ZXIoJGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcHRpb25TZWxlY3QodGhpcy5vcHRpb25zW3RoaXMub3B0aW9uSWRdLCAkZXZlbnQpO1xuICAgIH1cblxuICAgIF9oYW5kbGVUYWIoKTogdm9pZCB7fVxuXG4gICAgX2hhbmRsZUJhY2tzcGFjZSgpOiB2b2lkIHt9XG59XG4iLCI8c3BhbiBjbGFzcz1cImFzdy1mb250IGFzdy1waWNrZXJcIiBbbmdDbGFzc109XCJ7J2Fzdy1leHBhbmRlZCc6aXNPcGVufVwiPlxyXG4gICAgPGJ1dHRvbiBbdGFiSW5kZXhdPVwiLTFcIiAjbGFiZWxCdXR0b24gdGFiaW5kZXg9XCIwXCIgdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cImFzdy1waWNrZXItbGFiZWxcIiBtYXRUb29sdGlwPVwie3tsYWJlbH19XCJcclxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlT3BlbigkZXZlbnQpO1wiPnt7bGFiZWx9fVxyXG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxOCAxOFwiPlxyXG4gICAgICAgICAgICA8cG9seWdvbiBjbGFzcz1cImFzdy1zdHJva2VcIiBwb2ludHM9XCI3IDExIDkgMTMgMTEgMTEgNyAxMVwiPjwvcG9seWdvbj5cclxuICAgICAgICAgICAgPHBvbHlnb24gY2xhc3M9XCJhc3ctc3Ryb2tlXCIgcG9pbnRzPVwiNyA3IDkgNSAxMSA3IDcgN1wiPjwvcG9seWdvbj5cclxuICAgICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJhc3ctcGlja2VyLW9wdGlvbnNcIj5cclxuICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cImJ1dHRvblwiIGNsYXNzPVwiYXN3LXBpY2tlci1pdGVtXCJcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9uczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWQnOiBpdGVtLnZhbHVlID09PSB2YWx1ZSwgJ2ZvY3VzZWQnOiBpID09PSBvcHRpb25JZH1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3B0aW9uU2VsZWN0KGl0ZW0sICRldmVudClcIj5cclxuICAgICAgICAgICAge3tpdGVtLmxhYmVsfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAqbmdJZj1cIiFvcHRpb25zLmxlbmd0aFwiPk5vIGl0ZW1zIGZvciBzZWxlY3Q8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbjwvc3Bhbj4iXX0=