UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

183 lines 29 kB
import { Component, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core'; import { Subject } from 'rxjs'; import { LocaleProviderService } from 'ng-zorro-antd-mobile/locale-provider'; import { takeUntil } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd-mobile/locale-provider"; import * as i2 from "@angular/common"; import * as i3 from "ng-zorro-antd-mobile/flex"; import * as i4 from "ng-zorro-antd-mobile/list"; import * as i5 from "ng-zorro-antd-mobile/button"; import * as i6 from "./sub-menu/sub-menu.component"; export class MenuComponent { get data() { return this._data; } set data(v) { this._data = v; this.initData(); } constructor(_localeProviderService) { this._localeProviderService = _localeProviderService; this.prefixCls = 'am-menu'; this.subMenuPrefixCls = 'am-sub-menu'; this.radioPrefixCls = 'am-radio'; this.multiSelectMenuBtnsCls = 'am-multi-select-btns'; this.menuSelectContanerPrefixCls = 'am-menu-select-container'; this.locale = { okText: '', cancelText: '' }; this._data = []; this._unsubscribe$ = new Subject(); this.level = 2; this.value = []; this.height = document.documentElement.clientHeight / 2; this.multiSelect = false; this.onChange = new EventEmitter(); this.onOk = new EventEmitter(); this.onCancel = new EventEmitter(); } onMenuOk() { this.onOk.emit(this.value); } onMenuCancel() { this.onCancel.emit(); } getNewFsv() { let firstValue = ''; if (this.value && this.value.length) { firstValue = this.value[0]; } else if (this._data && this._data.length && !this._data[0].isLeaf) { firstValue = this._data[0].value; } return firstValue; } onClickFirstLevelItem(dataItem) { this.firstLevelSelectValue = dataItem.value; if (dataItem.isLeaf && this.onChange) { this.onChange.emit([dataItem.value]); } this.initData(); } onClickSubMenuItem(dataItem) { this.value = this.getSelectValue(dataItem); this.initData(); setTimeout(() => { this.onChange.emit(this.value); }, 300); } getSelectValue(dataItem) { if (this.multiSelect) { if (this.value && this.value.length > 0) { if (this.level === 2 && this.value[0] !== this.firstLevelSelectValue) { return [this.firstLevelSelectValue, [dataItem.value]]; } else { if (this.level == 1) { const chosenValues = Array.from(this.value); const existIndex = chosenValues.indexOf(dataItem.value); if (existIndex === -1) { chosenValues.push(dataItem.value); } else { chosenValues.splice(existIndex, 1); } return chosenValues; } else { const chosenValues = Array.from(this.value[1]); const existIndex = chosenValues.indexOf(dataItem.value); if (existIndex === -1) { chosenValues.push(dataItem.value); } else { chosenValues.splice(existIndex, 1); } return [this.firstLevelSelectValue, chosenValues]; } } } else { return this.level === 2 ? [this.firstLevelSelectValue, [dataItem.value]] : [dataItem.value]; } } return this.level === 2 ? [this.firstLevelSelectValue, dataItem.value] : [dataItem.value]; } initData() { this.subMenuData = this._data; if (this.level === 2) { let parent = this._data; if (this.firstLevelSelectValue && this.firstLevelSelectValue !== '') { parent = this._data.filter(dataItem => dataItem.value === this.firstLevelSelectValue); } if (parent[0] && parent[0].children && parent[0].isLeaf !== true) { this.subMenuData = parent[0].children; } else { this.subMenuData = []; } } let subValue = (this.value && this.value.length > 0 && [...this.value]) || []; if (this.level === 2 && subValue.length > 1) { subValue.shift(); if (this.multiSelect) { subValue = subValue[0]; } } this.subSelInitItem = this.subMenuData .filter(dataItem => subValue.indexOf(dataItem.value) !== -1) .map(item => { return item.value; }); const parentValue = this.value && this.value.length > 1 && this.level === 2 ? this.value[0] : null; this.showSelect = true; if (this.level === 2 && parentValue !== this.firstLevelSelectValue) { this.showSelect = false; } } getClass(dataItem) { return this.dataItemSelected(dataItem) ? this.prefixCls + '-selected' : ''; } dataItemSelected(dataItem) { return dataItem.value === this.firstLevelSelectValue; } ngOnInit() { this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => { this.locale = this._localeProviderService.getLocaleSubObj('Menu'); }); this.firstLevelSelectValue = this.getNewFsv(); this.heightStyle = { height: this.height + 'px' }; this.initData(); } ngOnDestroy() { this._unsubscribe$.next(); this._unsubscribe$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: MenuComponent, deps: [{ token: i1.LocaleProviderService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: MenuComponent, selector: "Menu, nzm-menu", inputs: { data: "data", level: "level", value: "value", height: "height", multiSelect: "multiSelect" }, outputs: { onChange: "onChange", onOk: "onOk", onCancel: "onCancel" }, ngImport: i0, template: "<Flex class=\"{{ prefixCls }}\" [ngStyle]=\"heightStyle\" [direction]=\"'column'\" [align]=\"'stretch'\">\n <Flex class=\"{{ menuSelectContanerPrefixCls }}\" [align]=\"'start'\">\n <FlexItem *ngIf=\"level == 2\">\n <List role=\"tablist\">\n <ListItem\n role=\"tab\"\n *ngFor=\"let dataItem of data; let i = index\"\n [className]=\"getClass(dataItem)\"\n (click)=\"onClickFirstLevelItem(dataItem)\"\n >\n {{ dataItem.label }}\n </ListItem>\n </List>\n </FlexItem>\n\n <FlexItem role=\"tabpanel\" aria-hidden=\"false\" class=\"{{ menuSelectContanerPrefixCls }}-submenu\">\n <SubMenu\n [subMenuPrefixCls]=\"subMenuPrefixCls\"\n [radioPrefixCls]=\"radioPrefixCls\"\n [subMenuData]=\"subMenuData\"\n [selItem]=\"subSelInitItem\"\n [showSelect]=\"showSelect\"\n [multiSelect]=\"multiSelect\"\n (onSel)=\"onClickSubMenuItem($event)\"\n >\n </SubMenu>\n </FlexItem>\n </Flex>\n\n <div *ngIf=\"multiSelect\" class=\"{{ multiSelectMenuBtnsCls }}\">\n <a Button [className]=\"'am-multi-select-btns-btn'\" [inline]=\"true\" (onClick)=\"onMenuCancel()\">\n {{ locale.cancelText }}\n </a>\n <a Button [className]=\"'am-multi-select-btns-btn'\" [inline]=\"true\" [type]=\"'primary'\" (onClick)=\"onMenuOk()\">\n {{ locale.okText }}\n </a>\n </div>\n</Flex>\n", dependencies: [{ 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: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.FlexComponent, selector: "Flex, nzm-flex", inputs: ["direction", "wrap", "justify", "align", "alignContent"] }, { kind: "component", type: i3.FlexItemComponent, selector: "FlexItem, nzm-flex-item" }, { kind: "component", type: i4.ListComponent, selector: "List, nzm-list", inputs: ["className", "renderHeader", "renderFooter"] }, { kind: "component", type: i4.ListItemComponent, selector: "ListItem, nzm-list-item", inputs: ["extra", "className", "arrow", "multipleLine", "error", "wrap", "align", "platform", "disabled", "thumb"], outputs: ["onClick"] }, { kind: "component", type: i5.ButtonComponent, selector: "[Button], nzm-button", inputs: ["type", "size", "disabled", "loading", "inline", "icon", "className"], outputs: ["onClick"] }, { kind: "component", type: i6.SubMenuComponent, selector: "SubMenu, nzm-sub-menu", inputs: ["radioPrefixCls", "showSelect", "selItem", "subMenuPrefixCls", "subMenuData", "multiSelect"], outputs: ["onSel"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: MenuComponent, decorators: [{ type: Component, args: [{ selector: 'Menu, nzm-menu', encapsulation: ViewEncapsulation.None, template: "<Flex class=\"{{ prefixCls }}\" [ngStyle]=\"heightStyle\" [direction]=\"'column'\" [align]=\"'stretch'\">\n <Flex class=\"{{ menuSelectContanerPrefixCls }}\" [align]=\"'start'\">\n <FlexItem *ngIf=\"level == 2\">\n <List role=\"tablist\">\n <ListItem\n role=\"tab\"\n *ngFor=\"let dataItem of data; let i = index\"\n [className]=\"getClass(dataItem)\"\n (click)=\"onClickFirstLevelItem(dataItem)\"\n >\n {{ dataItem.label }}\n </ListItem>\n </List>\n </FlexItem>\n\n <FlexItem role=\"tabpanel\" aria-hidden=\"false\" class=\"{{ menuSelectContanerPrefixCls }}-submenu\">\n <SubMenu\n [subMenuPrefixCls]=\"subMenuPrefixCls\"\n [radioPrefixCls]=\"radioPrefixCls\"\n [subMenuData]=\"subMenuData\"\n [selItem]=\"subSelInitItem\"\n [showSelect]=\"showSelect\"\n [multiSelect]=\"multiSelect\"\n (onSel)=\"onClickSubMenuItem($event)\"\n >\n </SubMenu>\n </FlexItem>\n </Flex>\n\n <div *ngIf=\"multiSelect\" class=\"{{ multiSelectMenuBtnsCls }}\">\n <a Button [className]=\"'am-multi-select-btns-btn'\" [inline]=\"true\" (onClick)=\"onMenuCancel()\">\n {{ locale.cancelText }}\n </a>\n <a Button [className]=\"'am-multi-select-btns-btn'\" [inline]=\"true\" [type]=\"'primary'\" (onClick)=\"onMenuOk()\">\n {{ locale.okText }}\n </a>\n </div>\n</Flex>\n" }] }], ctorParameters: () => [{ type: i1.LocaleProviderService }], propDecorators: { data: [{ type: Input }], level: [{ type: Input }], value: [{ type: Input }], height: [{ type: Input }], multiSelect: [{ type: Input }], onChange: [{ type: Output }], onOk: [{ type: Output }], onCancel: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL21lbnUvbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL21lbnUvbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLGlCQUFpQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQVkzQyxNQUFNLE9BQU8sYUFBYTtJQW1CeEIsSUFDSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQWdCRCxZQUFvQixzQkFBNkM7UUFBN0MsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF1QjtRQXpDakUsY0FBUyxHQUFXLFNBQVMsQ0FBQztRQUM5QixxQkFBZ0IsR0FBVyxhQUFhLENBQUM7UUFDekMsbUJBQWMsR0FBVyxVQUFVLENBQUM7UUFDcEMsMkJBQXNCLEdBQVcsc0JBQXNCLENBQUM7UUFDeEQsZ0NBQTJCLEdBQVcsMEJBQTBCLENBQUM7UUFNakUsV0FBTSxHQUFnQjtZQUNwQixNQUFNLEVBQUUsRUFBRTtZQUNWLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQztRQUVNLFVBQUssR0FBZSxFQUFFLENBQUM7UUFDdkIsa0JBQWEsR0FBa0IsSUFBSSxPQUFPLEVBQVEs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QUM7UUFFSCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxXQUFXLEdBQUc7WUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSTtTQUMzQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7OEdBM0tVLGFBQWE7a0dBQWIsYUFBYSxxT0NmMUIsKzRDQXNDQTs7MkZEdkJhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsZ0JBQWdCLGlCQUVYLGlCQUFpQixDQUFDLElBQUk7MEZBc0JqQyxJQUFJO3NCQURQLEtBQUs7Z0JBU04sS0FBSztzQkFESixLQUFLO2dCQUdOLEtBQUs7c0JBREosS0FBSztnQkFHTixNQUFNO3NCQURMLEtBQUs7Z0JBR04sV0FBVztzQkFEVixLQUFLO2dCQUdOLFFBQVE7c0JBRFAsTUFBTTtnQkFHUCxJQUFJO3NCQURILE1BQU07Z0JBR1AsUUFBUTtzQkFEUCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC1tb2JpbGUvbG9jYWxlLXByb3ZpZGVyJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW50ZXJmYWNlIExvY2FsZVZhbHVlIHtcbiAgb2tUZXh0OiBzdHJpbmc7XG4gIGNhbmNlbFRleHQ6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnTWVudSwgbnptLW1lbnUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tbWVudSc7XG4gIHN1Yk1lbnVQcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1zdWItbWVudSc7XG4gIHJhZGlvUHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tcmFkaW8nO1xuICBtdWx0aVNlbGVjdE1lbnVCdG5zQ2xzOiBzdHJpbmcgPSAnYW0tbXVsdGktc2VsZWN0LWJ0bnMnO1xuICBtZW51U2VsZWN0Q29udGFuZXJQcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1tZW51LXNlbGVjdC1jb250YWluZXInO1xuICBmaXJzdExldmVsU2VsZWN0VmFsdWU6IG51bWJlciB8IHN0cmluZztcbiAgaGVpZ2h0U3R5bGU6IG9iamVjdDtcbiAgc3ViTWVudURhdGE6IEFycmF5PGFueT47XG4gIHNob3dTZWxlY3Q6IGJvb2xlYW47XG4gIHN1YlNlbEluaXRJdGVtOiBvYmplY3Q7XG4gIGxvY2FsZTogTG9jYWxlVmFsdWUgPSB7XG4gICAgb2tUZXh0OiAnJyxcbiAgICBjYW5jZWxUZXh0OiAnJ1xuICB9O1xuXG4gIHByaXZhdGUgX2RhdGE6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmUkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBASW5wdXQoKVxuICBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuICBzZXQgZGF0YSh2KSB7XG4gICAgdGhpcy5fZGF0YSA9IHY7XG4gICAgdGhpcy5pbml0RGF0YSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGxldmVsOiBudW1iZXIgPSAyO1xuICBASW5wdXQoKVxuICB2YWx1ZTogQXJyYXk8YW55PiA9IFtdO1xuICBASW5wdXQoKVxuICBoZWlnaHQ6IG51bWJlciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgLyAyO1xuICBASW5wdXQoKVxuICBtdWx0aVNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbk9rOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxlUHJvdmlkZXJTZXJ2aWNlOiBMb2NhbGVQcm92aWRlclNlcnZpY2UpIHt9XG5cbiAgb25NZW51T2soKSB7XG4gICAgdGhpcy5vbk9rLmVtaXQodGhpcy52YWx1ZSk7XG4gIH1cblxuICBvbk1lbnVDYW5jZWwoKSB7XG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBnZXROZXdGc3YoKSB7XG4gICAgbGV0IGZpcnN0VmFsdWUgPSAnJztcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCkge1xuICAgICAgZmlyc3RWYWx1ZSA9IHRoaXMudmFsdWVbMF0gYXMgc3RyaW5nO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxlbmd0aCAmJiAhdGhpcy5fZGF0YVswXS5pc0xlYWYpIHtcbiAgICAgIGZpcnN0VmFsdWUgPSB0aGlzLl9kYXRhWzBdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZmlyc3RWYWx1ZTtcbiAgfVxuXG4gIG9uQ2xpY2tGaXJzdExldmVsSXRlbShkYXRhSXRlbSkge1xuICAgIHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlID0gZGF0YUl0ZW0udmFsdWU7XG4gICAgaWYgKGRhdGFJdGVtLmlzTGVhZiAmJiB0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoW2RhdGFJdGVtLnZhbHVlXSk7XG4gICAgfVxuICAgIHRoaXMuaW5pdERhdGEoKTtcbiAgfVxuXG4gIG9uQ2xpY2tTdWJNZW51SXRlbShkYXRhSXRlbSkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLmdldFNlbGVjdFZhbHVlKGRhdGFJdGVtKTtcbiAgICB0aGlzLmluaXREYXRhKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgfSwgMzAwKTtcbiAgfVxuXG4gIGdldFNlbGVjdFZhbHVlKGRhdGFJdGVtKSB7XG4gICAgaWYgKHRoaXMubXVsdGlTZWxlY3QpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAodGhpcy5sZXZlbCA9PT0gMiAmJiB0aGlzLnZhbHVlWzBdICE9PSB0aGlzLmZpcnN0TGV2ZWxTZWxlY3RWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiBbdGhpcy5maXJzdExldmVsU2VsZWN0VmFsdWUsIFtkYXRhSXRlbS52YWx1ZV1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmxldmVsID09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNob3NlblZhbHVlcyA9IEFycmF5LmZyb20odGhpcy52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBleGlzdEluZGV4ID0gY2hvc2VuVmFsdWVzLmluZGV4T2YoZGF0YUl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgaWYgKGV4aXN0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgIGNob3NlblZhbHVlcy5wdXNoKGRhdGFJdGVtLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNob3NlblZhbHVlcy5zcGxpY2UoZXhpc3RJbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2hvc2VuVmFsdWVzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjaG9zZW5WYWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMudmFsdWVbMV0pO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RJbmRleCA9IGNob3NlblZhbHVlcy5pbmRleE9mKGRhdGFJdGVtLnZhbHVlKTtcbiAgICAgICAgICAgIGlmIChleGlzdEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICBjaG9zZW5WYWx1ZXMucHVzaChkYXRhSXRlbS52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaG9zZW5WYWx1ZXMuc3BsaWNlKGV4aXN0SW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmZpcnN0TGV2ZWxTZWxlY3RWYWx1ZSwgY2hvc2VuVmFsdWVzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxldmVsID09PSAyID8gW3RoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlLCBbZGF0YUl0ZW0udmFsdWVdXSA6IFtkYXRhSXRlbS52YWx1ZV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxldmVsID09PSAyID8gW3RoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlLCBkYXRhSXRlbS52YWx1ZV0gOiBbZGF0YUl0ZW0udmFsdWVdO1xuICB9XG5cbiAgaW5pdERhdGEoKSB7XG4gICAgdGhpcy5zdWJNZW51RGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgaWYgKHRoaXMubGV2ZWwgPT09IDIpIHtcbiAgICAgIGxldCBwYXJlbnQgPSB0aGlzLl9kYXRhO1xuICAgICAgaWYgKHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlICYmIHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlICE9PSAnJykge1xuICAgICAgICBwYXJlbnQgPSB0aGlzLl9kYXRhLmZpbHRlcihkYXRhSXRlbSA9PiBkYXRhSXRlbS52YWx1ZSA9PT0gdGhpcy5maXJzdExldmVsU2VsZWN0VmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudFswXSAmJiBwYXJlbnRbMF0uY2hpbGRyZW4gJiYgcGFyZW50WzBdLmlzTGVhZiAhPT0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnN1Yk1lbnVEYXRhID0gcGFyZW50WzBdLmNoaWxkcmVuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdWJNZW51RGF0YSA9IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzdWJWYWx1ZSA9ICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMCAmJiBbLi4udGhpcy52YWx1ZV0pIHx8IFtdO1xuICAgIGlmICh0aGlzLmxldmVsID09PSAyICYmIHN1YlZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgIHN1YlZhbHVlLnNoaWZ0KCk7XG4gICAgICBpZiAodGhpcy5tdWx0aVNlbGVjdCkge1xuICAgICAgICBzdWJWYWx1ZSA9IHN1YlZhbHVlWzBdIGFzIHN0cmluZ1tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViU2VsSW5pdEl0ZW0gPSB0aGlzLnN1Yk1lbnVEYXRhXG4gICAgICAuZmlsdGVyKGRhdGFJdGVtID0+IHN1YlZhbHVlLmluZGV4T2YoZGF0YUl0ZW0udmFsdWUpICE9PSAtMSlcbiAgICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgfSk7XG5cbiAgICBjb25zdCBwYXJlbnRWYWx1ZSA9IHRoaXMudmFsdWUgJiYgdGhpcy52YWx1ZS5sZW5ndGggPiAxICYmIHRoaXMubGV2ZWwgPT09IDIgPyB0aGlzLnZhbHVlWzBdIDogbnVsbDtcblxuICAgIHRoaXMuc2hvd1NlbGVjdCA9IHRydWU7XG4gICAgaWYgKHRoaXMubGV2ZWwgPT09IDIgJiYgcGFyZW50VmFsdWUgIT09IHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlKSB7XG4gICAgICB0aGlzLnNob3dTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXRDbGFzcyhkYXRhSXRlbSkge1xuICAgIHJldHVybiB0aGlzLmRhdGFJdGVtU2VsZWN0ZWQoZGF0YUl0ZW0pID8gdGhpcy5wcmVmaXhDbHMgKyAnLXNlbGVjdGVkJyA6ICcnO1xuICB9XG5cbiAgZGF0YUl0ZW1TZWxlY3RlZChkYXRhSXRlbSkge1xuICAgIHJldHVybiBkYXRhSXRlbS52YWx1ZSA9PT0gdGhpcy5maXJzdExldmVsU2VsZWN0VmFsdWU7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLl9sb2NhbGVQcm92aWRlclNlcnZpY2UubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMubG9jYWxlID0gPExvY2FsZVZhbHVlPnRoaXMuX2xvY2FsZVByb3ZpZGVyU2VydmljZS5nZXRMb2NhbGVTdWJPYmooJ01lbnUnKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmlyc3RMZXZlbFNlbGVjdFZhbHVlID0gdGhpcy5nZXROZXdGc3YoKTtcblxuICAgIHRoaXMuaGVpZ2h0U3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0ICsgJ3B4J1xuICAgIH07XG4gICAgdGhpcy5pbml0RGF0YSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPEZsZXggY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX1cIiBbbmdTdHlsZV09XCJoZWlnaHRTdHlsZVwiIFtkaXJlY3Rpb25dPVwiJ2NvbHVtbidcIiBbYWxpZ25dPVwiJ3N0cmV0Y2gnXCI+XG4gIDxGbGV4IGNsYXNzPVwie3sgbWVudVNlbGVjdENvbnRhbmVyUHJlZml4Q2xzIH19XCIgW2FsaWduXT1cIidzdGFydCdcIj5cbiAgICA8RmxleEl0ZW0gKm5nSWY9XCJsZXZlbCA9PSAyXCI+XG4gICAgICA8TGlzdCByb2xlPVwidGFibGlzdFwiPlxuICAgICAgICA8TGlzdEl0ZW1cbiAgICAgICAgICByb2xlPVwidGFiXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YUl0ZW0gb2YgZGF0YTsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW2NsYXNzTmFtZV09XCJnZXRDbGFzcyhkYXRhSXRlbSlcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrRmlyc3RMZXZlbEl0ZW0oZGF0YUl0ZW0pXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGRhdGFJdGVtLmxhYmVsIH19XG4gICAgICAgIDwvTGlzdEl0ZW0+XG4gICAgICA8L0xpc3Q+XG4gICAgPC9GbGV4SXRlbT5cblxuICAgIDxGbGV4SXRlbSByb2xlPVwidGFicGFuZWxcIiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgY2xhc3M9XCJ7eyBtZW51U2VsZWN0Q29udGFuZXJQcmVmaXhDbHMgfX0tc3VibWVudVwiPlxuICAgICAgPFN1Yk1lbnVcbiAgICAgICAgW3N1Yk1lbnVQcmVmaXhDbHNdPVwic3ViTWVudVByZWZpeENsc1wiXG4gICAgICAgIFtyYWRpb1ByZWZpeENsc109XCJyYWRpb1ByZWZpeENsc1wiXG4gICAgICAgIFtzdWJNZW51RGF0YV09XCJzdWJNZW51RGF0YVwiXG4gICAgICAgIFtzZWxJdGVtXT1cInN1YlNlbEluaXRJdGVtXCJcbiAgICAgICAgW3Nob3dTZWxlY3RdPVwic2hvd1NlbGVjdFwiXG4gICAgICAgIFttdWx0aVNlbGVjdF09XCJtdWx0aVNlbGVjdFwiXG4gICAgICAgIChvblNlbCk9XCJvbkNsaWNrU3ViTWVudUl0ZW0oJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICA8L1N1Yk1lbnU+XG4gICAgPC9GbGV4SXRlbT5cbiAgPC9GbGV4PlxuXG4gIDxkaXYgKm5nSWY9XCJtdWx0aVNlbGVjdFwiIGNsYXNzPVwie3sgbXVsdGlTZWxlY3RNZW51QnRuc0NscyB9fVwiPlxuICAgIDxhIEJ1dHRvbiBbY2xhc3NOYW1lXT1cIidhbS1tdWx0aS1zZWxlY3QtYnRucy1idG4nXCIgW2lubGluZV09XCJ0cnVlXCIgKG9uQ2xpY2spPVwib25NZW51Q2FuY2VsKClcIj5cbiAgICAgIHt7IGxvY2FsZS5jYW5jZWxUZXh0IH19XG4gICAgPC9hPlxuICAgIDxhIEJ1dHRvbiBbY2xhc3NOYW1lXT1cIidhbS1tdWx0aS1zZWxlY3QtYnRucy1idG4nXCIgW2lubGluZV09XCJ0cnVlXCIgW3R5cGVdPVwiJ3ByaW1hcnknXCIgKG9uQ2xpY2spPVwib25NZW51T2soKVwiPlxuICAgICAge3sgbG9jYWxlLm9rVGV4dCB9fVxuICAgIDwvYT5cbiAgPC9kaXY+XG48L0ZsZXg+XG4iXX0=