UNPKG

ngx-slice-kit

Version:

[![npm version](https://badge.fury.io/js/ngx-slice-kit.svg)](https://badge.fury.io/js/ngx-slice-kit)

224 lines 33.6 kB
import { Component, EventEmitter, forwardRef, HostBinding, Inject, Input, Output, PLATFORM_ID, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { DOCUMENT, isPlatformServer } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "../dropdown.service"; import * as i2 from "../options.service"; import * as i3 from "@angular/common"; import * as i4 from "../../buttons/icon/icon.component"; export class SelectComponent { constructor(document, platformId, dropdownService, optionsService) { this.document = document; this.platformId = platformId; this.dropdownService = dropdownService; this.optionsService = optionsService; this.options = []; this.label = ''; this.placeholder = ''; this.small = false; this.multi = false; this.enableNullValue = false; this.caption = ''; this.focusEvent = new EventEmitter(); this.blurEvent = new EventEmitter(); this.resultEvent = new EventEmitter(); this.error = undefined; } set required(val) { this.req = val === '' || val === true; } get required() { return this.req; } get isDisabled() { return this.disabled; } getOptions() { return [...this.options].map(o => { o.selected = this.multi ? this.currentValues?.has(o) : this.currentValue === o; return o; }); } isInactive() { return this.multi ? !this.currentValues?.size : !this.currentValue; } hasValuesToDrop() { return this.enableNullValue && !this.isInactive(); } onOpen(ev) { this.isOpen = true; this.emitFocus(); } onClose(ev) { this.isOpen = false; this.emitBlur(); } emitBlur() { if (this.focused) { this.focused = false; this.blurEvent.emit(); } } emitFocus() { if (!this.focused) { this.focused = true; this.focusEvent.emit(); } } selected() { if (this.multi) { const selectedOptions = []; this.currentValues?.forEach(o => { selectedOptions.push(o.label); }); return selectedOptions.length ? selectedOptions.join(', ') : ''; } else { return this.currentValue?.label; } } onResult(option) { this.onTouched(); if (this.multi) { this.addValue(option); } else { this.writeValue(option); } } writeValue(val) { if (val?.size > 0) { this.currentValues = val; const multipleResult = this.options.filter(o => this.currentValues.has(o)); this.onChange(multipleResult); this.resultEvent.emit(multipleResult); } else { this.currentValue = val; this.onChange(val); this.resultEvent.emit(this.currentValue); } } addValue(o) { const alreadySelected = this.currentValues.has(o); o.selected = !alreadySelected; alreadySelected ? this.currentValues.delete(o) : this.currentValues.add(o); this.writeValue(this.currentValues); } clearValue(e) { e.stopPropagation(); this.multi ? this.currentValues?.clear() : this.currentValue = undefined; this.writeValue(undefined); } onChange(value) { } onTouched() { } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; } showDropdown() { if (isPlatformServer(this.platformId)) { return; } if (this.isOpen) { return; } this.onOpen(); this.optionsService.options = this.getOptions(); const opts = { triggerRect: this.selectElem.nativeElement.getBoundingClientRect(), fitWidth: true, multi: this.multi, parentElem: this.selectElem.nativeElement, }; this.dropdownService.showDropdown(opts).subscribe(res => { this.onClose(); // this.optionsService.options = null; if (res) { this.onResult(res); } }); } ngOnInit() { if (this.multi) { this.enableNullValue = true; this.currentValues = new Set(); } } ngOnDestroy() { this.blurEvent.complete(); this.focusEvent.complete(); this.resultEvent.complete(); } } SelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: SelectComponent, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: i1.DropdownService }, { token: i2.OptionsService }], target: i0.ɵɵFactoryTarget.Component }); SelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: SelectComponent, selector: "sdk-select", inputs: { required: "required", options: "options", label: "label", placeholder: "placeholder", disabled: "disabled", small: "small", multi: "multi", enableNullValue: "enableNullValue", icon: "icon", caption: "caption", error: "error", isDisabled: "isDisabled" }, outputs: { focusEvent: "focusEvent", blurEvent: "blurEvent", resultEvent: "resultEvent" }, host: { properties: { "class.invalid": "this.error", "class.disabled": "this.isDisabled" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent), multi: true } ], viewQueries: [{ propertyName: "selectElem", first: true, predicate: ["select"], descendants: true, static: true }], ngImport: i0, template: "<label class=\"sdk-select-label\"\n [class.active]=\"!!(currentValue || currentValues?.size)\"\n [class.small]=\"small\">\n {{label}}\n <span *ngIf=\"required\" class=\"sdk-select-label-required-mark\">&nbsp;*</span>\n</label>\n\n<div class=\"sdk-select\" #select (click)=\"showDropdown()\">\n <div class=\"sdk-select-wrap\" [ngClass]=\"{small: small, active: isOpen, invalid: error}\">\n <span class=\"sdk-select-icon\" *ngIf=\"icon\">\n <sdk-icon [icon]=\"icon\" [size]=\"small ? 16 : 24\"></sdk-icon>\n </span>\n <p class=\"sdk-select-value\" title=\"{{selected()}}\">\n {{selected()}}\n <span class=\"inactive\" *ngIf=\"isInactive()\">{{placeholder}}</span>\n </p>\n <span class=\"sdk-select-icon actions\">\n <ng-container *ngIf=\"!hasValuesToDrop()\">\n <div class=\"interface-icon-wrap icon-chevron\" [class.active]=\"isOpen\">\n <sdk-icon icon=\"chevron_down\" [size]=\"24\" [inline]=\"true\"></sdk-icon>\n </div>\n </ng-container>\n <ng-container *ngIf=\"hasValuesToDrop()\">\n <div class=\"interface-icon-wrap icon-clear\">\n <sdk-icon icon=\"close\" [size]=\"16\" [inline]=\"true\" (click)=\"clearValue($event)\"></sdk-icon>\n </div>\n </ng-container>\n </span>\n </div>\n</div>\n\n<div class=\"sdk-caption\" *ngIf=\"caption\">\n {{caption}}\n</div>\n<div class=\"sdk-error\" *ngIf=\"error\">\n <sdk-icon icon=\"alert\" color=\"var(--warn)\" size=\"12\"></sdk-icon>\n {{error ? error : ''}}\n</div>\n\n\n", styles: [":host{display:flex;min-width:160px;width:100%;flex-direction:column;position:relative}:host.invalid{animation:shake .4s}:host.disabled{opacity:.6;pointer-events:none;cursor:default}.sdk-select-label{color:var(--base-a50);transition:all .2s;font-size:17px;margin-bottom:2px}.sdk-select-label.small{font-size:15px}.sdk-select-label.active{color:var(--base-a90)}.sdk-select-label-required-mark{color:var(--warn)}.sdk-select{position:relative;background-color:var(--background-a90);border-radius:8px;overflow:hidden}.sdk-select-wrap{display:flex;align-items:center;padding:10px 16px;height:44px;cursor:pointer;border-radius:8px;border-color:var(--regular-a50);border-width:1px;border-style:solid}.sdk-select-wrap.invalid{transition:all .2s ease;border-color:var(--warn);background-color:var(--warn-a20-rgb)}.sdk-select-wrap.small{padding:5px 12px;height:32px}.sdk-select-wrap.small .sdk-select-value{font-size:15px}.sdk-select-wrap.small .sdk-select-icon{margin-right:4px}.sdk-select-wrap.active{transition:border-color .2s ease;border-color:var(--regular-a100)}.sdk-select-wrap .sdk-select-icon{margin-right:8px}.sdk-select-wrap .sdk-select-icon.actions{margin-right:0;margin-left:8px}.sdk-select-value{flex-basis:100%;color:var(--base-a90);width:100%;font-size:17px;font-weight:400;line-height:24px;outline:none;border:none;transition:all .4s;font-family:Inter,sans-serif;overflow:hidden;white-space:nowrap;-ms-text-overflow:ellipsis;text-overflow:ellipsis}.sdk-select-value .inactive{color:var(--base-a50)}.interface-icon-wrap{transition:all .2s}.interface-icon-wrap:hover{opacity:.8}.interface-icon-wrap.icon-chevron{height:24px;width:24px}.interface-icon-wrap.active{transform:scaleY(-1)}.interface-icon-wrap.icon-clear{height:16px;width:16px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IconComponent, selector: "sdk-icon", inputs: ["icon", "image", "inline", "size", "color"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: SelectComponent, decorators: [{ type: Component, args: [{ selector: 'sdk-select', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SelectComponent), multi: true } ], template: "<label class=\"sdk-select-label\"\n [class.active]=\"!!(currentValue || currentValues?.size)\"\n [class.small]=\"small\">\n {{label}}\n <span *ngIf=\"required\" class=\"sdk-select-label-required-mark\">&nbsp;*</span>\n</label>\n\n<div class=\"sdk-select\" #select (click)=\"showDropdown()\">\n <div class=\"sdk-select-wrap\" [ngClass]=\"{small: small, active: isOpen, invalid: error}\">\n <span class=\"sdk-select-icon\" *ngIf=\"icon\">\n <sdk-icon [icon]=\"icon\" [size]=\"small ? 16 : 24\"></sdk-icon>\n </span>\n <p class=\"sdk-select-value\" title=\"{{selected()}}\">\n {{selected()}}\n <span class=\"inactive\" *ngIf=\"isInactive()\">{{placeholder}}</span>\n </p>\n <span class=\"sdk-select-icon actions\">\n <ng-container *ngIf=\"!hasValuesToDrop()\">\n <div class=\"interface-icon-wrap icon-chevron\" [class.active]=\"isOpen\">\n <sdk-icon icon=\"chevron_down\" [size]=\"24\" [inline]=\"true\"></sdk-icon>\n </div>\n </ng-container>\n <ng-container *ngIf=\"hasValuesToDrop()\">\n <div class=\"interface-icon-wrap icon-clear\">\n <sdk-icon icon=\"close\" [size]=\"16\" [inline]=\"true\" (click)=\"clearValue($event)\"></sdk-icon>\n </div>\n </ng-container>\n </span>\n </div>\n</div>\n\n<div class=\"sdk-caption\" *ngIf=\"caption\">\n {{caption}}\n</div>\n<div class=\"sdk-error\" *ngIf=\"error\">\n <sdk-icon icon=\"alert\" color=\"var(--warn)\" size=\"12\"></sdk-icon>\n {{error ? error : ''}}\n</div>\n\n\n", styles: [":host{display:flex;min-width:160px;width:100%;flex-direction:column;position:relative}:host.invalid{animation:shake .4s}:host.disabled{opacity:.6;pointer-events:none;cursor:default}.sdk-select-label{color:var(--base-a50);transition:all .2s;font-size:17px;margin-bottom:2px}.sdk-select-label.small{font-size:15px}.sdk-select-label.active{color:var(--base-a90)}.sdk-select-label-required-mark{color:var(--warn)}.sdk-select{position:relative;background-color:var(--background-a90);border-radius:8px;overflow:hidden}.sdk-select-wrap{display:flex;align-items:center;padding:10px 16px;height:44px;cursor:pointer;border-radius:8px;border-color:var(--regular-a50);border-width:1px;border-style:solid}.sdk-select-wrap.invalid{transition:all .2s ease;border-color:var(--warn);background-color:var(--warn-a20-rgb)}.sdk-select-wrap.small{padding:5px 12px;height:32px}.sdk-select-wrap.small .sdk-select-value{font-size:15px}.sdk-select-wrap.small .sdk-select-icon{margin-right:4px}.sdk-select-wrap.active{transition:border-color .2s ease;border-color:var(--regular-a100)}.sdk-select-wrap .sdk-select-icon{margin-right:8px}.sdk-select-wrap .sdk-select-icon.actions{margin-right:0;margin-left:8px}.sdk-select-value{flex-basis:100%;color:var(--base-a90);width:100%;font-size:17px;font-weight:400;line-height:24px;outline:none;border:none;transition:all .4s;font-family:Inter,sans-serif;overflow:hidden;white-space:nowrap;-ms-text-overflow:ellipsis;text-overflow:ellipsis}.sdk-select-value .inactive{color:var(--base-a50)}.interface-icon-wrap{transition:all .2s}.interface-icon-wrap:hover{opacity:.8}.interface-icon-wrap.icon-chevron{height:24px;width:24px}.interface-icon-wrap.active{transform:scaleY(-1)}.interface-icon-wrap.icon-clear{height:16px;width:16px}\n"] }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: i1.DropdownService }, { type: i2.OptionsService }]; }, propDecorators: { required: [{ type: Input }], selectElem: [{ type: ViewChild, args: ['select', { static: true }] }], options: [{ type: Input }], label: [{ type: Input }], placeholder: [{ type: Input }], disabled: [{ type: Input }], small: [{ type: Input }], multi: [{ type: Input }], enableNullValue: [{ type: Input }], icon: [{ type: Input }], caption: [{ type: Input }], focusEvent: [{ type: Output }], blurEvent: [{ type: Output }], resultEvent: [{ type: Output }], error: [{ type: Input }, { type: HostBinding, args: ['class.invalid'] }], isDisabled: [{ type: Input }, { type: HostBinding, args: ['class.disabled'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXNsaWNlLWtpdC9zcmMvbGliL2Ryb3Bkb3ducy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXNsaWNlLWtpdC9zcmMvbGliL2Ryb3Bkb3ducy9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBRVQsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFrQjdELE1BQU0sT0FBTyxlQUFlO0lBd0N4QixZQUM4QixRQUFhLEVBQ1YsVUFBZSxFQUNwQyxlQUFnQyxFQUNoQyxjQUE4QjtRQUhaLGFBQVEsR0FBUixRQUFRLENBQUs7UUFDVixlQUFVLEdBQVYsVUFBVSxDQUFLO1FBQ3BDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUEvQjFCLFlBQU8sR0FBa0IsRUFBRSxDQUFDO1FBQzVCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUVqQixVQUFLLEdBQVksS0FBSyxDQUFDO1FBQ3ZCLFVBQUssR0FBWSxLQUFLLENBQUM7UUFDdkIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsWUFBTyxHQUFXLEVBQUUsQ0FBQztRQUVwQixlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkQsY0FB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QUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUVXLFVBQVU7c0JBQTFCLE1BQU07Z0JBQ1UsU0FBUztzQkFBekIsTUFBTTtnQkFDVSxXQUFXO3NCQUEzQixNQUFNO2dCQUdBLEtBQUs7c0JBRFgsS0FBSzs7c0JBQUksV0FBVzt1QkFBQyxlQUFlO2dCQUkxQixVQUFVO3NCQURwQixLQUFLOztzQkFBSSxXQUFXO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE9wdGlvbk1vZGVsIH0gZnJvbSAnLi4vZHJvcGRvd24tb3B0aW9uLm1vZGVsJztcbmltcG9ydCB7IERyb3Bkb3duT3B0aW9ucyB9IGZyb20gJy4uL2Ryb3Bkb3duLm1vZGVsJztcbmltcG9ydCB7IERyb3Bkb3duU2VydmljZSB9IGZyb20gJy4uL2Ryb3Bkb3duLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9vcHRpb25zLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Nkay1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVxOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNldCByZXF1aXJlZCh2YWw6IGFueSkge1xuICAgICAgICB0aGlzLnJlcSA9IHZhbCA9PT0gJycgfHwgdmFsID09PSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxO1xuICAgIH1cblxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdCcsIHtzdGF0aWM6IHRydWV9KSBwdWJsaWMgc2VsZWN0RWxlbTogRWxlbWVudFJlZjtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBPcHRpb25Nb2RlbFtdID0gW107XG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsID0gJyc7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyID0gJyc7XG4gICAgQElucHV0KCkgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzbWFsbDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtdWx0aTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVOdWxsVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaWNvbjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjYXB0aW9uOiBzdHJpbmcgPSAnJztcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBibHVyRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgcmVzdWx0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQElucHV0KCkgQEhvc3RCaW5kaW5nKCdjbGFzcy5pbnZhbGlkJylcbiAgICBwdWJsaWMgZXJyb3I6IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICAgIEBJbnB1dCgpIEBIb3N0QmluZGluZygnY2xhc3MuZGlzYWJsZWQnKVxuICAgIHB1YmxpYyBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGlzT3BlbjogYm9vbGVhbjtcbiAgICBwdWJsaWMgZm9jdXNlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgY3VycmVudFZhbHVlOiBPcHRpb25Nb2RlbDtcbiAgICBwdWJsaWMgY3VycmVudFZhbHVlczogU2V0PE9wdGlvbk1vZGVsPjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55LFxuICAgICAgICBwcml2YXRlIGRyb3Bkb3duU2VydmljZTogRHJvcGRvd25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG9wdGlvbnNTZXJ2aWNlOiBPcHRpb25zU2VydmljZSxcbiAgICApIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3B0aW9ucygpOiBPcHRpb25Nb2RlbFtdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLm9wdGlvbnNdLm1hcChvID0+IHtcbiAgICAgICAgICAgIG8uc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gdGhpcy5jdXJyZW50VmFsdWVzPy5oYXMobykgOiB0aGlzLmN1cnJlbnRWYWx1ZSA9PT0gbztcbiAgICAgICAgICAgIHJldHVybiBvO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNJbmFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGkgPyAhdGhpcy5jdXJyZW50VmFsdWVzPy5zaXplIDogIXRoaXMuY3VycmVudFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNWYWx1ZXNUb0Ryb3AoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZU51bGxWYWx1ZSAmJiAhdGhpcy5pc0luYWN0aXZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uT3Blbihldj8pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmVtaXRGb2N1cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNsb3NlKGV2Pyk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXRCbHVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXRCbHVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0Rm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0V2ZW50LmVtaXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RlZCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5tdWx0aSkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zID0gW107XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZXM/LmZvckVhY2gobyA9PiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25zLnB1c2goby5sYWJlbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoID8gc2VsZWN0ZWRPcHRpb25zLmpvaW4oJywgJykgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRWYWx1ZT8ubGFiZWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZXN1bHQob3B0aW9uOiBPcHRpb25Nb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICBpZiAodGhpcy5tdWx0aSkge1xuICAgICAgICAgICAgdGhpcy5hZGRWYWx1ZShvcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKG9wdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbD8uc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlcyA9IHZhbDtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlUmVzdWx0ID0gdGhpcy5vcHRpb25zLmZpbHRlcihvID0+IHRoaXMuY3VycmVudFZhbHVlcy5oYXMobykpO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShtdWx0aXBsZVJlc3VsdCk7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdEV2ZW50LmVtaXQobXVsdGlwbGVSZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB2YWw7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbCk7XG4gICAgICAgICAgICB0aGlzLnJlc3VsdEV2ZW50LmVtaXQodGhpcy5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFZhbHVlKG86IE9wdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFscmVhZHlTZWxlY3RlZCA9IHRoaXMuY3VycmVudFZhbHVlcy5oYXMobyk7XG4gICAgICAgIG8uc2VsZWN0ZWQgPSAhYWxyZWFkeVNlbGVjdGVkO1xuICAgICAgICBhbHJlYWR5U2VsZWN0ZWQgPyB0aGlzLmN1cnJlbnRWYWx1ZXMuZGVsZXRlKG8pIDogdGhpcy5jdXJyZW50VmFsdWVzLmFkZChvKTtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuY3VycmVudFZhbHVlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyVmFsdWUoZSk6IHZvaWQge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLm11bHRpID8gdGhpcy5jdXJyZW50VmFsdWVzPy5jbGVhcigpIDogdGhpcy5jdXJyZW50VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNoYW5nZSh2YWx1ZSk6IHZvaWQge1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRvdWNoZWQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd0Ryb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uT3BlbigpO1xuICAgICAgICB0aGlzLm9wdGlvbnNTZXJ2aWNlLm9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcblxuICAgICAgICBjb25zdCBvcHRzOiBEcm9wZG93bk9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0cmlnZ2VyUmVjdDogdGhpcy5zZWxlY3RFbGVtLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICBmaXRXaWR0aDogdHJ1ZSxcbiAgICAgICAgICAgIG11bHRpOiB0aGlzLm11bHRpLFxuICAgICAgICAgICAgcGFyZW50RWxlbTogdGhpcy5zZWxlY3RFbGVtLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5kcm9wZG93blNlcnZpY2Uuc2hvd0Ryb3Bkb3duKG9wdHMpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgICAgICAgICAvLyB0aGlzLm9wdGlvbnNTZXJ2aWNlLm9wdGlvbnMgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICAgIHRoaXMub25SZXN1bHQocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tdWx0aSkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVOdWxsVmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWVzID0gbmV3IFNldDxPcHRpb25Nb2RlbD4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ibHVyRXZlbnQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5mb2N1c0V2ZW50LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMucmVzdWx0RXZlbnQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8bGFiZWwgY2xhc3M9XCJzZGstc2VsZWN0LWxhYmVsXCJcbiAgICAgICBbY2xhc3MuYWN0aXZlXT1cIiEhKGN1cnJlbnRWYWx1ZSB8fCBjdXJyZW50VmFsdWVzPy5zaXplKVwiXG4gICAgICAgW2NsYXNzLnNtYWxsXT1cInNtYWxsXCI+XG4gICAge3tsYWJlbH19XG4gICAgPHNwYW4gKm5nSWY9XCJyZXF1aXJlZFwiIGNsYXNzPVwic2RrLXNlbGVjdC1sYWJlbC1yZXF1aXJlZC1tYXJrXCI+Jm5ic3A7Kjwvc3Bhbj5cbjwvbGFiZWw+XG5cbjxkaXYgY2xhc3M9XCJzZGstc2VsZWN0XCIgI3NlbGVjdCAoY2xpY2spPVwic2hvd0Ryb3Bkb3duKClcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2RrLXNlbGVjdC13cmFwXCIgW25nQ2xhc3NdPVwie3NtYWxsOiBzbWFsbCwgYWN0aXZlOiBpc09wZW4sIGludmFsaWQ6IGVycm9yfVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInNkay1zZWxlY3QtaWNvblwiICpuZ0lmPVwiaWNvblwiPlxuICAgICAgICAgICAgPHNkay1pY29uIFtpY29uXT1cImljb25cIiBbc2l6ZV09XCJzbWFsbCA/IDE2IDogMjRcIj48L3Nkay1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxwIGNsYXNzPVwic2RrLXNlbGVjdC12YWx1ZVwiIHRpdGxlPVwie3tzZWxlY3RlZCgpfX1cIj5cbiAgICAgICAgICAgIHt7c2VsZWN0ZWQoKX19XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImluYWN0aXZlXCIgKm5nSWY9XCJpc0luYWN0aXZlKClcIj57e3BsYWNlaG9sZGVyfX08L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGstc2VsZWN0LWljb24gYWN0aW9uc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoYXNWYWx1ZXNUb0Ryb3AoKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnRlcmZhY2UtaWNvbi13cmFwIGljb24tY2hldnJvblwiIFtjbGFzcy5hY3RpdmVdPVwiaXNPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZGstaWNvbiBpY29uPVwiY2hldnJvbl9kb3duXCIgW3NpemVdPVwiMjRcIiBbaW5saW5lXT1cInRydWVcIj48L3Nkay1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzVmFsdWVzVG9Ecm9wKClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJmYWNlLWljb24td3JhcCBpY29uLWNsZWFyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzZGstaWNvbiBpY29uPVwiY2xvc2VcIiBbc2l6ZV09XCIxNlwiIFtpbmxpbmVdPVwidHJ1ZVwiIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIj48L3Nkay1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwic2RrLWNhcHRpb25cIiAqbmdJZj1cImNhcHRpb25cIj5cbiAgICB7e2NhcHRpb259fVxuPC9kaXY+XG48ZGl2IGNsYXNzPVwic2RrLWVycm9yXCIgKm5nSWY9XCJlcnJvclwiPlxuICAgIDxzZGstaWNvbiBpY29uPVwiYWxlcnRcIiBjb2xvcj1cInZhcigtLXdhcm4pXCIgc2l6ZT1cIjEyXCI+PC9zZGstaWNvbj5cbiAgICB7e2Vycm9yID8gZXJyb3IgOiAnJ319XG48L2Rpdj5cblxuXG4iXX0=