UNPKG

ngx-mat-dropdown

Version:
293 lines (291 loc) 24.4 kB
/** * @fileoverview added by tsickle * Generated from: lib/mat-dropdown.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, } from "@angular/core"; import { FormControl } from "@angular/forms"; import { MatSelect } from "@angular/material/select"; import { ReplaySubject, Subject } from "rxjs"; import { take, takeUntil } from "rxjs/operators"; import { DropdownSettingsModel } from "./dropdown-settings.model"; export class MatDropdownComponent { constructor() { this.dropdownCtrl = new FormControl(); this.appearance = "outline"; /** * control for the MatSelect filter keyword */ this.FilterCtrl = new FormControl(); this.dropdownList = []; this.onselectItems = new EventEmitter(); this.filteredBanks = new ReplaySubject(1); /** * Subject that emits when the component has been destroyed. */ this._onDestroy = new Subject(); } /** * @param {?} isTrue * @return {?} */ set dropdownDisabled(isTrue) { if (isTrue) { this.dropdownCtrl.disable(); } else { this.dropdownCtrl.enable(); } } /** * @param {?} list * @return {?} */ set getdropdownList(list) { if (list) { this.dropdownList = list; this.filteredBanks.next(list.slice()); } else { } } /** * @param {?} evt * @return {?} */ set onselect(evt) { if (evt) { this.selectedItems = evt; // console.log(evt, this.preBind); this.dropdownCtrl.setValue(evt); } else { if (this.dropdownSettings.multiple) { this.selectedItems = []; } else this.selectedItems = null; this.dropdownCtrl.setValue(evt); } } /** * @return {?} */ ngOnInit() { // set intial value // listen for search field value changes this.FilterCtrl.valueChanges .pipe(takeUntil(this._onDestroy)) .subscribe((/** * @return {?} */ () => { /** @type {?} */ let evt = this.FilterCtrl.value; this._filter(evt); })); } /** * @private * @param {?} evt * @return {?} */ _filter(evt) { if (evt) this.filteredBanks.next(this.dropdownList.filter((/** * @param {?} x * @return {?} */ (x) => x[this.dropdownSettings.labelKey] .toLowerCase() .includes(evt.val.toLowerCase())))); else this.filteredBanks.next(this.dropdownList.slice()); } /** * @return {?} */ ngAfterViewInit() { //this.dropdownCtrl.setValue(this.selectedItems); if (!this.dropdownSettings.multiple) this.setInitialValue(); } /** * @return {?} */ ngOnDestroy() { this._onDestroy.next(); this._onDestroy.complete(); } /** * @private * @return {?} */ setInitialValue() { this.filteredBanks .pipe(take(1), takeUntil(this._onDestroy)) .subscribe((/** * @return {?} */ () => { this.singleSelect.compareWith = (/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => { if (a && b) return (a[this.dropdownSettings.keyValue] === b[this.dropdownSettings.keyValue]); }); })); } /** * @param {?} evt * @return {?} */ OnSelectedEvent(evt) { this.onselectItems.emit(evt.source); //if (evt.isUserInput) { // this.onselectItems.emit(evt.source); //} else { // this.onselectItems.emit({ value: null }); //} } // multi /** * @param {?} checked * @return {?} */ AllClicked(checked) { //console.log(checked, this.multidropdownCtrl) if (checked.checked) { // this.multidropdownCtrl.patchValue([...this.dropdownList.map(item => item.key), 0]); /** @type {?} */ let items = this.dropdownList.map((/** * @param {?} item * @return {?} */ (item) => item)); this.dropdownCtrl.setValue(items); } else { // this.multidropdownCtrl.patchValue([]); this.dropdownCtrl.setValue([]); } this.onselectItems.emit(this.dropdownCtrl); } /** * @param {?} check * @return {?} */ ischecked(check) { /** @type {?} */ let selected = this.dropdownCtrl.value; return (this.dropdownList && selected && selected.length > 0 && this.dropdownList.length == selected.length); } /** * @return {?} */ isIndeterminate() { /** @type {?} */ let selected = this.dropdownCtrl.value; return (this.dropdownList && selected && selected.length > 0 && selected.length < this.dropdownList.length); } /** * @return {?} */ openedChange() { if (!this.innerSelectAll || !this.innerSelectAll.nativeElement) { return; } /** @type {?} */ let SelectAllElement = this.innerSelectAll.nativeElement; /** @type {?} */ let SelectAllPanelElement; while ((SelectAllElement = SelectAllElement.parentElement)) { if (SelectAllElement.classList.contains("mat-select-panel")) { SelectAllPanelElement = SelectAllElement; break; } } if (SelectAllPanelElement) { this.innerSelectAll.nativeElement.style.width = SelectAllPanelElement.clientWidth + "px"; /** @type {?} */ let children = this.innerSelectAll.nativeElement.childNodes; //if (children) // children[0].childNodes[0].style.width = SelectallpanelElement.clientWidth + 'px'; } } } MatDropdownComponent.decorators = [ { type: Component, args: [{ selector: "ngx-mat-dropdown", template: "<mat-form-field appearance=\"{{appearance}}\">\r\n <mat-label>{{dropdownSettings?.placeholder}}</mat-label>\r\n <mat-select disableOptionCentering [formControl]=\"dropdownCtrl\" [attr.id]=\"dropdownSettings?.id\" \r\n (selectionChange)=\"OnSelectedEvent($event)\"\r\n [placeholder]=\"dropdownSettings.placeholder \" \r\n #singleSelect [multiple]=\"dropdownSettings?.multiple\" \r\n matTooltip=\"{{selectedItems ? selectedItems[dropdownSettings.labelKey] : ''}}\"\r\n [multiple]=\"dropdownSettings?.multiple\">\r\n <mat-select-search [formControl]=\"FilterCtrl\" [multiple]=\"dropdownSettings?.multiple\" *ngIf=\"dropdownList.length > 5\"></mat-select-search>\r\n <div #innerSelectall [style.top.px]=\"dropdownList?.length <= 5 ? 0 : 44\" class=\"mat-select-all-inner\" *ngIf=\"dropdownList?.length !== 0 && dropdownSettings.multiple\" >\r\n <mat-checkbox class=\"mat-option mat-select-checkbox\" [disableRipple]=\"true\" [indeterminate]=\"isIndeterminate()\" [checked]=\"ischecked(check)\" (change)=\"AllClicked($event)\" #check>\r\n {{ check.checked ? ('Unselect All' ) : ('Select All' ) }}\r\n </mat-checkbox>\r\n </div>\r\n <mat-option *ngIf=\"dropdownList.length && !dropdownSettings.multiple\">None</mat-option>\r\n <mat-option *ngFor=\"let item of filteredBanks | async\" [value]=\"item\" \r\n matTooltip=\"{{item[dropdownSettings.labelKey]}}\">\r\n {{ item[dropdownSettings.labelKey] }}\r\n </mat-option>\r\n </mat-select>\r\n</mat-form-field>", styles: [` .mat-select-all-inner { position: absolute; top: 52px; width: calc(100% + 3px); background: white; z-index: 100; font-size: inherit; box-shadow: none; border-radius: 0; -webkit-transform: translate3d(0,0,0); } `] }] } ]; /** @nocollapse */ MatDropdownComponent.ctorParameters = () => []; MatDropdownComponent.propDecorators = { dropdownCtrl: [{ type: Input, args: ["ctrl",] }], appearance: [{ type: Input }], dropdownSettings: [{ type: Input, args: ["dropdownSettings",] }], dropdownDisabled: [{ type: Input, args: ["disabled",] }], getdropdownList: [{ type: Input, args: ["dropdownList",] }], onselect: [{ type: Input, args: ["selectedItems",] }], onselectItems: [{ type: Output, args: ["onselectItems",] }], singleSelect: [{ type: ViewChild, args: ["singleSelect", { read: ElementRef },] }], innerSelectAll: [{ type: ViewChild, args: ["innerSelectall", { read: ElementRef, static: true },] }] }; if (false) { /** @type {?} */ MatDropdownComponent.prototype.dropdownCtrl; /** @type {?} */ MatDropdownComponent.prototype.appearance; /** * control for the MatSelect filter keyword * @type {?} */ MatDropdownComponent.prototype.FilterCtrl; /** @type {?} */ MatDropdownComponent.prototype.dropdownSettings; /** @type {?} */ MatDropdownComponent.prototype.dropdownList; /** @type {?} */ MatDropdownComponent.prototype.selectedItems; /** @type {?} */ MatDropdownComponent.prototype.onselectItems; /** @type {?} */ MatDropdownComponent.prototype.filteredBanks; /** @type {?} */ MatDropdownComponent.prototype.singleSelect; /** @type {?} */ MatDropdownComponent.prototype.innerSelectAll; /** * Subject that emits when the component has been destroyed. * @type {?} * @private */ MatDropdownComponent.prototype._onDestroy; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXQtZHJvcGRvd24vIiwic291cmNlcyI6WyJsaWIvbWF0LWRyb3Bkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFxQmxFLE1BQU0sT0FBTyxvQkFBb0I7SUFzRC9CO1FBcERPLGlCQUFZLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUMsZUFBVSxHQUFXLFNBQVMsQ0FBQzs7OztRQUVqQyxlQUFVLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFjbkQsaUJBQVksR0FBZSxFQUFFLENBQUM7UUF3Qkwsa0JBQWEsR0FFbEMsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV4QixrQkFBYSxHQUF5QixJQUFJLGFBQWEsQ0FBUSxDQUFDLENBQUMsQ0FBQzs7OztRQUtqRSxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUUxQixDQUFDOzs7OztJQTVDaEIsSUFDSSxnQkFBZ0IsQ0FBQyxNQUFlO1FBQ2xDLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM3QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM1QjtJQUNILENBQUM7Ozs7O0lBR0QsSUFDSSxlQUFlLENBQUMsSUFBUztRQUMzQixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZDO2FBQU07U0FDTjtJQUNILENBQUM7Ozs7O0lBR0QsSUFDSSxRQUFRLENBQUMsR0FBRztRQUNkLElBQUksR0FBRyxFQUFFO1lBQ1AsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7WUFDekIsa0NBQWtDO1lBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2pDO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO2FBQ3pCOztnQkFBTSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7Ozs7SUFhRCxRQUFRO1FBQ04sbUJBQW1CO1FBQ25CLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVk7YUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDaEMsU0FBUzs7O1FBQUMsR0FBRyxFQUFFOztnQkFDVixHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO1lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEIsQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDOzs7Ozs7SUFFTyxPQUFPLENBQUMsR0FBRztRQUNqQixJQUFJLEdBQUc7WUFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNOzs7O1lBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztpQkFDOUIsV0FBVyxFQUFFO2lCQUNiLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQ25DLENBQ0YsQ0FBQzs7WUFDQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQzs7OztJQUVELGVBQWU7UUFDYixpREFBaUQ7UUFFakQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzlELENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7Ozs7O0lBQ08sZUFBZTtRQUNyQixJQUFJLENBQUMsYUFBYTthQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN6QyxTQUFTOzs7UUFBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVc7Ozs7O1lBQUcsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO3dCQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUNsQyxDQUFDO1lBQ04sQ0FBQyxDQUFBLENBQUM7UUFDSixDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBRUQsZUFBZSxDQUFDLEdBQUc7UUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLHdCQUF3QjtRQUN4QiwwQ0FBMEM7UUFDMUMsVUFBVTtRQUNWLCtDQUErQztRQUMvQyxHQUFHO0lBQ0wsQ0FBQzs7Ozs7O0lBR0QsVUFBVSxDQUFDLE9BQU87UUFDaEIsOENBQThDO1FBQzlDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTs7O2dCQUVmLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUc7Ozs7WUFBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFDO1lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO2FBQU07WUFDTCx5Q0FBeUM7WUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7Ozs7SUFDRCxTQUFTLENBQUMsS0FBSzs7WUFDVCxRQUFRLEdBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLO1FBQzNDLE9BQU8sQ0FDTCxJQUFJLENBQUMsWUFBWTtZQUNqQixRQUFRO1lBQ1IsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQzVDLENBQUM7SUFDSixDQUFDOzs7O0lBQ0QsZUFBZTs7WUFDVCxRQUFRLEdBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLO1FBQzNDLE9BQU8sQ0FDTCxJQUFJLENBQUMsWUFBWTtZQUNqQixRQUFRO1lBQ1IsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQzNDLENBQUM7SUFDSixDQUFDOzs7O0lBRUQsWUFBWTtRQUVWLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUU7WUFDOUQsT0FBTztTQUNSOztZQUNHLGdCQUFnQixHQUFnQixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWE7O1lBQ2pFLHFCQUFrQztRQUN0QyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDMUQsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQzNELHFCQUFxQixHQUFHLGdCQUFnQixDQUFDO2dCQUN6QyxNQUFNO2FBQ1A7U0FDRjtRQUNELElBQUkscUJBQXFCLEVBQUU7WUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUs7Z0JBQzNDLHFCQUFxQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O2dCQUN2QyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsVUFBVTtZQUMzRCxlQUFlO1lBQ2YsdUZBQXVGO1NBQ3hGO0lBQ0gsQ0FBQzs7O1lBdExGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixxbkRBQTRDO3lCQUNuQzs7Ozs7Ozs7Ozs7Ozs7R0FjUjthQUNGOzs7OzsyQkFFRSxLQUFLLFNBQUMsTUFBTTt5QkFFWixLQUFLOytCQUlMLEtBQUssU0FBQyxrQkFBa0I7K0JBR3hCLEtBQUssU0FBQyxVQUFVOzhCQVVoQixLQUFLLFNBQUMsY0FBYzt1QkFVcEIsS0FBSyxTQUFDLGVBQWU7NEJBYXJCLE1BQU0sU0FBQyxlQUFlOzJCQUt0QixTQUFTLFNBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTs2QkFDOUMsU0FBUyxTQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOzs7O0lBaEQvRCw0Q0FDcUQ7O0lBQ3JELDBDQUF3Qzs7Ozs7SUFFeEMsMENBQW1EOztJQUVuRCxnREFDd0M7O0lBV3hDLDRDQUE4Qjs7SUFVOUIsNkNBQW1COztJQWNuQiw2Q0FFK0I7O0lBRS9CLDZDQUF5RTs7SUFDekUsNENBQXlFOztJQUN6RSw4Q0FDMkI7Ozs7OztJQUUzQiwwQ0FBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTWF0U2VsZWN0IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NlbGVjdFwiO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IERyb3Bkb3duU2V0dGluZ3NNb2RlbCB9IGZyb20gXCIuL2Ryb3Bkb3duLXNldHRpbmdzLm1vZGVsXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJuZ3gtbWF0LWRyb3Bkb3duXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vbWF0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlczogW2BcbiAgLm1hdC1zZWxlY3QtYWxsLWlubmVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiA1MnB4O1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzcHgpO1xuICAgIFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG59XG5cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KFwiY3RybFwiKVxuICBwdWJsaWMgZHJvcGRvd25DdHJsOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBzdHJpbmcgPSBcIm91dGxpbmVcIjtcbiAgLyoqIGNvbnRyb2wgZm9yIHRoZSBNYXRTZWxlY3QgZmlsdGVyIGtleXdvcmQgKi9cbiAgcHVibGljIEZpbHRlckN0cmw6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG5cbiAgQElucHV0KFwiZHJvcGRvd25TZXR0aW5nc1wiKVxuICBkcm9wZG93blNldHRpbmdzOiBEcm9wZG93blNldHRpbmdzTW9kZWw7XG5cbiAgQElucHV0KFwiZGlzYWJsZWRcIilcbiAgc2V0IGRyb3Bkb3duRGlzYWJsZWQoaXNUcnVlOiBib29sZWFuKSB7XG4gICAgaWYgKGlzVHJ1ZSkge1xuICAgICAgdGhpcy5kcm9wZG93bkN0cmwuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyb3Bkb3duQ3RybC5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICBkcm9wZG93bkxpc3Q6IEFycmF5PGFueT4gPSBbXTtcbiAgQElucHV0KFwiZHJvcGRvd25MaXN0XCIpXG4gIHNldCBnZXRkcm9wZG93bkxpc3QobGlzdDogYW55KSB7XG4gICAgaWYgKGxpc3QpIHtcbiAgICAgIHRoaXMuZHJvcGRvd25MaXN0ID0gbGlzdDtcbiAgICAgIHRoaXMuZmlsdGVyZWRCYW5rcy5uZXh0KGxpc3Quc2xpY2UoKSk7XG4gICAgfSBlbHNlIHtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RlZEl0ZW1zOiBhbnk7XG4gIEBJbnB1dChcInNlbGVjdGVkSXRlbXNcIilcbiAgc2V0IG9uc2VsZWN0KGV2dCkge1xuICAgIGlmIChldnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IGV2dDtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGV2dCwgdGhpcy5wcmVCaW5kKTtcbiAgICAgIHRoaXMuZHJvcGRvd25DdHJsLnNldFZhbHVlKGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duU2V0dGluZ3MubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICB9IGVsc2UgdGhpcy5zZWxlY3RlZEl0ZW1zID0gbnVsbDtcbiAgICAgIHRoaXMuZHJvcGRvd25DdHJsLnNldFZhbHVlKGV2dCk7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoXCJvbnNlbGVjdEl0ZW1zXCIpIG9uc2VsZWN0SXRlbXM6IEV2ZW50RW1pdHRlcjxcbiAgICBPYmplY3RcbiAgPiA9IG5ldyBFdmVudEVtaXR0ZXI8T2JqZWN0PigpO1xuXG4gIHB1YmxpYyBmaWx0ZXJlZEJhbmtzOiBSZXBsYXlTdWJqZWN0PGFueVtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0PGFueVtdPigxKTtcbiAgQFZpZXdDaGlsZChcInNpbmdsZVNlbGVjdFwiLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgc2luZ2xlU2VsZWN0OiBNYXRTZWxlY3Q7XG4gIEBWaWV3Q2hpbGQoXCJpbm5lclNlbGVjdGFsbFwiLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBpbm5lclNlbGVjdEFsbDogRWxlbWVudFJlZjtcbiAgLyoqIFN1YmplY3QgdGhhdCBlbWl0cyB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gZGVzdHJveWVkLiAqL1xuICBwcml2YXRlIF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gc2V0IGludGlhbCB2YWx1ZVxuICAgIC8vIGxpc3RlbiBmb3Igc2VhcmNoIGZpZWxkIHZhbHVlIGNoYW5nZXNcbiAgICB0aGlzLkZpbHRlckN0cmwudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBsZXQgZXZ0ID0gdGhpcy5GaWx0ZXJDdHJsLnZhbHVlO1xuICAgICAgICB0aGlzLl9maWx0ZXIoZXZ0KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyKGV2dCkge1xuICAgIGlmIChldnQpXG4gICAgICB0aGlzLmZpbHRlcmVkQmFua3MubmV4dChcbiAgICAgICAgdGhpcy5kcm9wZG93bkxpc3QuZmlsdGVyKCh4KSA9PlxuICAgICAgICAgIHhbdGhpcy5kcm9wZG93blNldHRpbmdzLmxhYmVsS2V5XVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyhldnQudmFsLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgZWxzZSB0aGlzLmZpbHRlcmVkQmFua3MubmV4dCh0aGlzLmRyb3Bkb3duTGlzdC5zbGljZSgpKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvL3RoaXMuZHJvcGRvd25DdHJsLnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcyk7XG5cbiAgICBpZiAoIXRoaXMuZHJvcGRvd25TZXR0aW5ncy5tdWx0aXBsZSkgdGhpcy5zZXRJbml0aWFsVmFsdWUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5fb25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJbml0aWFsVmFsdWUoKSB7XG4gICAgdGhpcy5maWx0ZXJlZEJhbmtzXG4gICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNpbmdsZVNlbGVjdC5jb21wYXJlV2l0aCA9IChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChhICYmIGIpXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBhW3RoaXMuZHJvcGRvd25TZXR0aW5ncy5rZXlWYWx1ZV0gPT09XG4gICAgICAgICAgICAgIGJbdGhpcy5kcm9wZG93blNldHRpbmdzLmtleVZhbHVlXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgT25TZWxlY3RlZEV2ZW50KGV2dCkge1xuICAgIHRoaXMub25zZWxlY3RJdGVtcy5lbWl0KGV2dC5zb3VyY2UpO1xuICAgIC8vaWYgKGV2dC5pc1VzZXJJbnB1dCkge1xuICAgIC8vICAgIHRoaXMub25zZWxlY3RJdGVtcy5lbWl0KGV2dC5zb3VyY2UpO1xuICAgIC8vfSBlbHNlIHtcbiAgICAvLyAgICB0aGlzLm9uc2VsZWN0SXRlbXMuZW1pdCh7IHZhbHVlOiBudWxsIH0pO1xuICAgIC8vfVxuICB9XG5cbiAgLy8gbXVsdGlcbiAgQWxsQ2xpY2tlZChjaGVja2VkKSB7XG4gICAgLy9jb25zb2xlLmxvZyhjaGVja2VkLCB0aGlzLm11bHRpZHJvcGRvd25DdHJsKVxuICAgIGlmIChjaGVja2VkLmNoZWNrZWQpIHtcbiAgICAgIC8vIHRoaXMubXVsdGlkcm9wZG93bkN0cmwucGF0Y2hWYWx1ZShbLi4udGhpcy5kcm9wZG93bkxpc3QubWFwKGl0ZW0gPT4gaXRlbS5rZXkpLCAwXSk7XG4gICAgICBsZXQgaXRlbXMgPSB0aGlzLmRyb3Bkb3duTGlzdC5tYXAoKGl0ZW0pID0+IGl0ZW0pO1xuICAgICAgdGhpcy5kcm9wZG93bkN0cmwuc2V0VmFsdWUoaXRlbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLm11bHRpZHJvcGRvd25DdHJsLnBhdGNoVmFsdWUoW10pO1xuICAgICAgdGhpcy5kcm9wZG93bkN0cmwuc2V0VmFsdWUoW10pO1xuICAgIH1cbiAgICB0aGlzLm9uc2VsZWN0SXRlbXMuZW1pdCh0aGlzLmRyb3Bkb3duQ3RybCk7XG4gIH1cbiAgaXNjaGVja2VkKGNoZWNrKTogYm9vbGVhbiB7XG4gICAgbGV0IHNlbGVjdGVkOiBhbnkgPSB0aGlzLmRyb3Bkb3duQ3RybC52YWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kcm9wZG93bkxpc3QgJiZcbiAgICAgIHNlbGVjdGVkICYmXG4gICAgICBzZWxlY3RlZC5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLmRyb3Bkb3duTGlzdC5sZW5ndGggPT0gc2VsZWN0ZWQubGVuZ3RoXG4gICAgKTtcbiAgfVxuICBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgbGV0IHNlbGVjdGVkOiBhbnkgPSB0aGlzLmRyb3Bkb3duQ3RybC52YWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kcm9wZG93bkxpc3QgJiZcbiAgICAgIHNlbGVjdGVkICYmXG4gICAgICBzZWxlY3RlZC5sZW5ndGggPiAwICYmXG4gICAgICBzZWxlY3RlZC5sZW5ndGggPCB0aGlzLmRyb3Bkb3duTGlzdC5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgb3BlbmVkQ2hhbmdlKCkge1xuICAgIFxuICAgIGlmICghdGhpcy5pbm5lclNlbGVjdEFsbCB8fCAhdGhpcy5pbm5lclNlbGVjdEFsbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBTZWxlY3RBbGxFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuaW5uZXJTZWxlY3RBbGwubmF0aXZlRWxlbWVudDtcbiAgICBsZXQgU2VsZWN0QWxsUGFuZWxFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICB3aGlsZSAoKFNlbGVjdEFsbEVsZW1lbnQgPSBTZWxlY3RBbGxFbGVtZW50LnBhcmVudEVsZW1lbnQpKSB7XG4gICAgICBpZiAoU2VsZWN0QWxsRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJtYXQtc2VsZWN0LXBhbmVsXCIpKSB7XG4gICAgICAgIFNlbGVjdEFsbFBhbmVsRWxlbWVudCA9IFNlbGVjdEFsbEVsZW1lbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoU2VsZWN0QWxsUGFuZWxFbGVtZW50KSB7XG4gICAgICB0aGlzLmlubmVyU2VsZWN0QWxsLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPVxuICAgICAgICBTZWxlY3RBbGxQYW5lbEVsZW1lbnQuY2xpZW50V2lkdGggKyBcInB4XCI7XG4gICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLmlubmVyU2VsZWN0QWxsLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgIC8vaWYgKGNoaWxkcmVuKVxuICAgICAgLy8gICAgY2hpbGRyZW5bMF0uY2hpbGROb2Rlc1swXS5zdHlsZS53aWR0aCA9IFNlbGVjdGFsbHBhbmVsRWxlbWVudC5jbGllbnRXaWR0aCArICdweCc7XG4gICAgfVxuICB9XG59XG4iXX0=