UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

116 lines (114 loc) 22.8 kB
/* MIT License Copyright (c) 2019 Temainfo Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { debounceTime } from 'rxjs/internal/operators'; import { Subject, Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "../../../i18n/i18n.service"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; import * as i4 from "../../../input/input"; import * as i5 from "../../../dropdownicon/dropdownicon"; export class TlDatatabaleColumnFilter { get filterPlaceholder() { return this.i18n.getLocale().Datatable.filterPlaceholder; } get dropdownResetPlaceholder() { return this.i18n.getLocale().Datatable.dropdownResetPlaceholder; } constructor(i18n) { this.i18n = i18n; this.filterEvent = new EventEmitter(); this.keydownFilterEvent = new EventEmitter(); this.filters = { matchMode: {}, value: {} }; this.subject = new Subject(); this.subscription = new Subscription(); } ngOnInit() { this.subscription.add(this.subject.pipe(debounceTime(600)).subscribe((event) => { if (event !== undefined) { const filterEventObject = this.makeFilterEvent(); this.filterEvent.emit(filterEventObject); } })); } onKeyDown($event) { this.keydownFilterEvent.emit($event); } onChangeFilter(event) { this.subject.next(event); } onClear(event) { this.subject.next(event); } makeFilterEvent() { const filter = { filters: {} }; this.tlColumnFilter.forEach((column) => { if (this.filters.value[column.field]) { filter.filters[column.field] = { value: this.getValueByType(column), matchMode: this.filters.matchMode[column.field] ? this.filters.matchMode[column.field] : this.getDefaultMath(column) }; } }); return Object.keys(filter.filters).length ? filter : { filters: {} }; } getDefaultMath(column) { switch (column.type) { case 'text': return 'contains'; case 'number': return 'equals'; case 'date': return 'equals'; default: return 'contains'; } } getValueByType(column) { switch (column.type) { case 'text': return this.filters.value[column.field]; case 'number': return parseInt(this.filters.value[column.field], 10); case 'date': return this.filters.value[column.field]; default: return this.filters.value[column.field]; } } ngOnDestroy() { this.subscription.unsubscribe(); } } /** @nocollapse */ TlDatatabaleColumnFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlDatatabaleColumnFilter, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlDatatabaleColumnFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlDatatabaleColumnFilter, selector: "[tlColumnFilter]", inputs: { tlColumnFilter: "tlColumnFilter" }, outputs: { filterEvent: "filterEvent", keydownFilterEvent: "keydownFilterEvent" }, ngImport: i0, template: "<ng-template ngFor let-column let-index [ngForOf]=\"tlColumnFilter\">\n <th class=\"ui-cel ui-filter-cel\">\n <div class=\"ui-filter\">\n <div class=\"ui-dropdown\"\n *ngIf=\"column?.showFilterOptions && column?.filterOptions.length\"\n [ngClass]=\"{'-without-dropdown': !column?.showFilterOptions}\">\n\n\n <tl-dropdown-icon\n *ngIf=\"column?.showFilter\"\n [data]=\"column?.filterOptions\"\n [widthItems]=\"'185px'\"\n [heightItems]=\"'25px'\"\n [keyIcon]=\"'icon'\"\n [keyText]=\"'description'\"\n [keyValue]=\"'valueItem'\"\n [defaultOptionText]=\"dropdownResetPlaceholder\"\n [ngModel]=\"filters.matchMode[column.field]\"\n (ngModelChange)=\"onChangeFilter(filters.matchMode[column.field] = $event)\">\n </tl-dropdown-icon>\n\n </div>\n <div class=\"ui-input\">\n <tl-input *ngIf=\"column?.showFilter\"\n [clearButton]=\"true\"\n [height]=\"'23px'\"\n (keydown)=\"onKeyDown($event)\"\n [ngModel]=\"filters.value[column.field]\"\n (ngModelChange)=\"onChangeFilter(filters.value[column.field] = $event)\"\n (clear)=\"onClear($event)\"\n [placeholder]=\"filterPlaceholder\"\n [type]=\"column?.type\" >\n </tl-input>\n </div>\n </div>\n </th>\n</ng-template>\n\n\n", styles: [".ui-cel{padding:0;align-items:center;overflow:hidden;white-space:nowrap}.ui-cel:last-child{border-right:none}.ui-dropdown{text-align:left;width:35px;display:table-cell}.ui-dropdown.-without-dropdown{width:0}.ui-input{width:100%;padding-left:1px}.ui-filter-cel{padding:4px}.ui-filter{width:100%;display:flex}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.TlInput, selector: "tl-input", inputs: ["textBefore", "textAfter", "labelPlacement", "labelSize", "name", "label", "color", "iconBefore", "iconAfter", "clearButton", "readonly", "required", "disabled", "autocomplete", "maxlength", "tabindex", "textAlign", "mask", "placeholder", "type", "height", "withBorder", "flatBorder"], outputs: ["clear", "overlayOrigin", "clickAddon", "click", "focus", "blur", "valid", "completeMask"] }, { kind: "component", type: i5.TlDropdownIcon, selector: "tl-dropdown-icon", inputs: ["data", "disabled", "defaultIcon", "color", "heightIcon", "widthIcon", "heightItems", "widthItems", "keyIcon", "defaultOptionText", "hasDefaultOption", "keyText", "keyValue"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlDatatabaleColumnFilter, decorators: [{ type: Component, args: [{ selector: '[tlColumnFilter]', template: "<ng-template ngFor let-column let-index [ngForOf]=\"tlColumnFilter\">\n <th class=\"ui-cel ui-filter-cel\">\n <div class=\"ui-filter\">\n <div class=\"ui-dropdown\"\n *ngIf=\"column?.showFilterOptions && column?.filterOptions.length\"\n [ngClass]=\"{'-without-dropdown': !column?.showFilterOptions}\">\n\n\n <tl-dropdown-icon\n *ngIf=\"column?.showFilter\"\n [data]=\"column?.filterOptions\"\n [widthItems]=\"'185px'\"\n [heightItems]=\"'25px'\"\n [keyIcon]=\"'icon'\"\n [keyText]=\"'description'\"\n [keyValue]=\"'valueItem'\"\n [defaultOptionText]=\"dropdownResetPlaceholder\"\n [ngModel]=\"filters.matchMode[column.field]\"\n (ngModelChange)=\"onChangeFilter(filters.matchMode[column.field] = $event)\">\n </tl-dropdown-icon>\n\n </div>\n <div class=\"ui-input\">\n <tl-input *ngIf=\"column?.showFilter\"\n [clearButton]=\"true\"\n [height]=\"'23px'\"\n (keydown)=\"onKeyDown($event)\"\n [ngModel]=\"filters.value[column.field]\"\n (ngModelChange)=\"onChangeFilter(filters.value[column.field] = $event)\"\n (clear)=\"onClear($event)\"\n [placeholder]=\"filterPlaceholder\"\n [type]=\"column?.type\" >\n </tl-input>\n </div>\n </div>\n </th>\n</ng-template>\n\n\n", styles: [".ui-cel{padding:0;align-items:center;overflow:hidden;white-space:nowrap}.ui-cel:last-child{border-right:none}.ui-dropdown{text-align:left;width:35px;display:table-cell}.ui-dropdown.-without-dropdown{width:0}.ui-input{width:100%;padding-left:1px}.ui-filter-cel{padding:4px}.ui-filter{width:100%;display:flex}\n"] }] }], ctorParameters: function () { return [{ type: i1.I18nService }]; }, propDecorators: { tlColumnFilter: [{ type: Input, args: ['tlColumnFilter'] }], filterEvent: [{ type: Output }], keydownFilterEvent: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXRhYmxlLWNvbHVtbi1maWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnVseS11aS9zcmMvY29tcG9uZW50cy9kYXRhdGFibGUvcGFydHMvY29sdW1uLWZpbHRlci9kYXRhdGFibGUtY29sdW1uLWZpbHRlci50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2RhdGF0YWJsZS9wYXJ0cy9jb2x1bW4tZmlsdGVyL2RhdGF0YWJsZS1jb2x1bW4tZmlsdGVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBb0JFO0FBRUYsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQzFELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQVc3QyxNQUFNLE9BQU8sd0JBQXdCO0lBVWpDLElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksd0JBQXdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUM7SUFDbEUsQ0FBQztJQU1ELFlBQXFCLElBQWlCO1FBQWpCLFNBQUksR0FBSixJQUFJLENBQWE7UUFsQjVCLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEQsdUJBQWtCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFOUQsWUFBTyxHQUFtQixFQUFFLFNBQVMsRUFBRSxFQUFFLEVB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Q0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUM7Z0JBQ0UsT0FBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEMsQ0FBQzs7eUlBMUZRLHdCQUF3Qjs2SEFBeEIsd0JBQXdCLHlMQ3JDckMsc29EQXVDQTs0RkRGYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0ksa0JBQWtCO2tHQU1ILGNBQWM7c0JBQXRDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUViLFdBQVc7c0JBQXBCLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgICBNSVQgTGljZW5zZVxuXG4gICAgQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICAgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAgICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAgICBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICAgIFNPRlRXQVJFLlxuKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2kxOG4vaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlckV2ZW50TWV0YWRhdGEsIEZpbHRlck1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vbWV0YWRhdGFzL2ZpbHRlci5tZXRhZGF0YSc7XG5pbXBvcnQgeyBUbERhdGF0YWJsZUNvbHVtbiB9IGZyb20gJy4uL2NvbHVtbi9kYXRhdGFibGUtY29sdW1uJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1t0bENvbHVtbkZpbHRlcl0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhdGFibGUtY29sdW1uLWZpbHRlci5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kYXRhdGFibGUtY29sdW1uLWZpbHRlci5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVGxEYXRhdGFiYWxlQ29sdW1uRmlsdGVyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCd0bENvbHVtbkZpbHRlcicpIHRsQ29sdW1uRmlsdGVyOiBUbERhdGF0YWJsZUNvbHVtbltdO1xuXG4gICAgQE91dHB1dCgpIGZpbHRlckV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKSBrZXlkb3duRmlsdGVyRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHVibGljIGZpbHRlcnM6IEZpbHRlck1ldGFkYXRhID0geyBtYXRjaE1vZGU6IHt9LCB2YWx1ZToge30gfTtcblxuICAgIGdldCBmaWx0ZXJQbGFjZWhvbGRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuRGF0YXRhYmxlLmZpbHRlclBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGdldCBkcm9wZG93blJlc2V0UGxhY2Vob2xkZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pMThuLmdldExvY2FsZSgpLkRhdGF0YWJsZS5kcm9wZG93blJlc2V0UGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJqZWN0ID0gIG5ldyBTdWJqZWN0KCk7XG5cbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9ICBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBjb25zdHJ1Y3RvciggcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgdGhpcy5zdWJqZWN0LnBpcGUoIGRlYm91bmNlVGltZSg2MDApICkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJFdmVudE9iamVjdCA9IHRoaXMubWFrZUZpbHRlckV2ZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJFdmVudC5lbWl0KCBmaWx0ZXJFdmVudE9iamVjdCApIDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG9uS2V5RG93biggJGV2ZW50ICkge1xuICAgICAgdGhpcy5rZXlkb3duRmlsdGVyRXZlbnQuZW1pdCgkZXZlbnQpO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlRmlsdGVyKGV2ZW50KSB7XG4gICAgICB0aGlzLnN1YmplY3QubmV4dChldmVudCk7XG4gICAgfVxuXG4gICAgb25DbGVhcihldmVudCkge1xuICAgICAgdGhpcy5zdWJqZWN0Lm5leHQoZXZlbnQpO1xuICAgIH1cblxuICAgIG1ha2VGaWx0ZXJFdmVudCgpOiBGaWx0ZXJFdmVudE1ldGFkYXRhIHtcbiAgICAgICAgY29uc3QgZmlsdGVyOiBGaWx0ZXJFdmVudE1ldGFkYXRhID0geyBmaWx0ZXJzOiB7fSB9O1xuXG4gICAgICAgIHRoaXMudGxDb2x1bW5GaWx0ZXIuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzLnZhbHVlW2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXIuZmlsdGVyc1tjb2x1bW4uZmllbGRdID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRWYWx1ZUJ5VHlwZShjb2x1bW4pLFxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IHRoaXMuZmlsdGVycy5tYXRjaE1vZGVbY29sdW1uLmZpZWxkXSA/IHRoaXMuZmlsdGVycy5tYXRjaE1vZGVbY29sdW1uLmZpZWxkXSA6IHRoaXMuZ2V0RGVmYXVsdE1hdGgoIGNvbHVtbiApXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGZpbHRlci5maWx0ZXJzKS5sZW5ndGggPyBmaWx0ZXIgOiB7IGZpbHRlcnM6IHt9IH07XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdE1hdGgoIGNvbHVtbjogVGxEYXRhdGFibGVDb2x1bW4gKTogYW55IHtcbiAgICAgIHN3aXRjaCAoIGNvbHVtbi50eXBlICkge1xuICAgICAgICBjYXNlICd0ZXh0JyA6XG4gICAgICAgICAgcmV0dXJuICdjb250YWlucyc7XG4gICAgICAgIGNhc2UgJ251bWJlcicgOlxuICAgICAgICAgIHJldHVybiAnZXF1YWxzJztcbiAgICAgICAgY2FzZSAnZGF0ZScgOlxuICAgICAgICAgIHJldHVybiAnZXF1YWxzJztcbiAgICAgICAgZGVmYXVsdCA6XG4gICAgICAgICAgcmV0dXJuICAnY29udGFpbnMnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGdldFZhbHVlQnlUeXBlKCBjb2x1bW46IFRsRGF0YXRhYmxlQ29sdW1uICk6IGFueSB7XG4gICAgICBzd2l0Y2ggKCBjb2x1bW4udHlwZSApIHtcbiAgICAgICAgY2FzZSAndGV4dCcgOlxuICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMudmFsdWVbY29sdW1uLmZpZWxkXTtcbiAgICAgICAgY2FzZSAnbnVtYmVyJyA6XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZmlsdGVycy52YWx1ZVtjb2x1bW4uZmllbGRdLCAxMCk7XG4gICAgICAgIGNhc2UgJ2RhdGUnIDpcbiAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJzLnZhbHVlW2NvbHVtbi5maWVsZF07XG4gICAgICAgIGRlZmF1bHQgOlxuICAgICAgICAgIHJldHVybiAgdGhpcy5maWx0ZXJzLnZhbHVlW2NvbHVtbi5maWVsZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtY29sdW1uIGxldC1pbmRleCBbbmdGb3JPZl09XCJ0bENvbHVtbkZpbHRlclwiPlxuICAgIDx0aCBjbGFzcz1cInVpLWNlbCB1aS1maWx0ZXItY2VsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uPy5zaG93RmlsdGVyT3B0aW9ucyAmJiBjb2x1bW4/LmZpbHRlck9wdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyctd2l0aG91dC1kcm9wZG93bic6ICFjb2x1bW4/LnNob3dGaWx0ZXJPcHRpb25zfVwiPlxuXG5cbiAgICAgICAgICAgICAgPHRsLWRyb3Bkb3duLWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbj8uc2hvd0ZpbHRlclwiXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwiY29sdW1uPy5maWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBbd2lkdGhJdGVtc109XCInMTg1cHgnXCJcbiAgICAgICAgICAgICAgICBbaGVpZ2h0SXRlbXNdPVwiJzI1cHgnXCJcbiAgICAgICAgICAgICAgICBba2V5SWNvbl09XCInaWNvbidcIlxuICAgICAgICAgICAgICAgIFtrZXlUZXh0XT1cIidkZXNjcmlwdGlvbidcIlxuICAgICAgICAgICAgICAgIFtrZXlWYWx1ZV09XCIndmFsdWVJdGVtJ1wiXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRPcHRpb25UZXh0XT1cImRyb3Bkb3duUmVzZXRQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVycy5tYXRjaE1vZGVbY29sdW1uLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2VGaWx0ZXIoZmlsdGVycy5tYXRjaE1vZGVbY29sdW1uLmZpZWxkXSA9ICRldmVudClcIj5cbiAgICAgICAgICAgICAgPC90bC1kcm9wZG93bi1pY29uPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgIGNsYXNzPVwidWktaW5wdXRcIj5cbiAgICAgICAgICAgICAgICA8dGwtaW5wdXQgKm5nSWY9XCJjb2x1bW4/LnNob3dGaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xlYXJCdXR0b25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiJzIzcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJzLnZhbHVlW2NvbHVtbi5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZUZpbHRlcihmaWx0ZXJzLnZhbHVlW2NvbHVtbi5maWVsZF0gPSAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsZWFyKT1cIm9uQ2xlYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXJQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImNvbHVtbj8udHlwZVwiID5cbiAgICAgICAgICAgICAgICA8L3RsLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvdGg+XG48L25nLXRlbXBsYXRlPlxuXG5cbiJdfQ==