UNPKG

@taiga-ui/kit

Version:
191 lines • 26.3 kB
import { __decorate, __param } from "tslib"; import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, HostBinding, Inject, Input, Output, QueryList, TemplateRef, ViewChild, } from '@angular/core'; import { EMPTY_QUERY, getClosestFocusable, isNativeFocused, setNativeFocused, tuiDefaultProp, } from '@taiga-ui/cdk'; import { TUI_MORE_WORD } from '@taiga-ui/kit/tokens'; import { Observable } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { TuiTabDirective } from '../tab.directive'; import { TuiTabComponent } from '../tab/tab.component'; import { TAB_MARGIN } from '../tabs.const'; import { TABS_PROVIDERS, TABS_REFRESH } from './tabs-with-more.providers'; // @dynamic var TuiTabsWithMoreComponent = /** @class */ (function () { function TuiTabsWithMoreComponent(refresh$, elementRef, changeDetectorRef, moreWord$) { this.refresh$ = refresh$; this.elementRef = elementRef; this.changeDetectorRef = changeDetectorRef; this.moreWord$ = moreWord$; this.moreContent = ''; this.underline = true; this.activeItemIndex = 0; this.itemsLimit = Infinity; this.activeItemIndexChange = new EventEmitter(); this.items = EMPTY_QUERY; this.open = false; this.maxIndex = Infinity; } Object.defineProperty(TuiTabsWithMoreComponent.prototype, "tabs", { get: function () { return Array.from(this.elementRef.nativeElement.querySelectorAll('[tuiTab]')); }, enumerable: true, configurable: true }); Object.defineProperty(TuiTabsWithMoreComponent.prototype, "activeElement", { get: function () { return this.tabs[this.activeItemIndex] || null; }, enumerable: true, configurable: true }); Object.defineProperty(TuiTabsWithMoreComponent.prototype, "isMoreVisible", { get: function () { return this.lastVisibleIndex < this.items.length - 1; }, enumerable: true, configurable: true }); Object.defineProperty(TuiTabsWithMoreComponent.prototype, "isMoreFocusable", { get: function () { return !!this.moreButton && isNativeFocused(this.moreButton.nativeElement); }, enumerable: true, configurable: true }); Object.defineProperty(TuiTabsWithMoreComponent.prototype, "lastVisibleIndex", { get: function () { if (this.itemsLimit + 1 >= this.items.length) { return this.maxIndex; } var offset = this.itemsLimit - 1 > this.activeItemIndex ? 1 : 2; return Math.min(this.itemsLimit - offset, this.maxIndex); }, enumerable: true, configurable: true }); TuiTabsWithMoreComponent.prototype.ngAfterViewInit = function () { var _this = this; this.refresh$ .pipe(map(function () { return _this.getMaxIndex(); }), filter(function (maxIndex) { return _this.maxIndex !== maxIndex; })) .subscribe(function (maxIndex) { _this.maxIndex = maxIndex; _this.changeDetectorRef.detectChanges(); }); }; TuiTabsWithMoreComponent.prototype.onActiveItemIndexChange = function (activeItemIndex) { this.updateActiveItemIndex(activeItemIndex); }; TuiTabsWithMoreComponent.prototype.onClick = function (index) { this.open = false; this.focusMore(); this.updateActiveItemIndex(index); }; TuiTabsWithMoreComponent.prototype.onArrowRight = function (element) { if (isNativeFocused(element)) { this.focusMore(); } }; TuiTabsWithMoreComponent.prototype.onArrowLeft = function () { var tabs = this.tabs; var index = tabs.length - 2; while (index >= 0) { setNativeFocused(tabs[index]); if (isNativeFocused(tabs[index])) { return; } index--; } }; TuiTabsWithMoreComponent.prototype.onWrapperArrow = function (button, wrapper, prev) { var target = getClosestFocusable(button, prev, wrapper); if (target) { setNativeFocused(target); } }; TuiTabsWithMoreComponent.prototype.focusMore = function () { if (this.moreButton) { setNativeFocused(this.moreButton.nativeElement); } }; TuiTabsWithMoreComponent.prototype.getMaxIndex = function () { var _a = this, tabs = _a.tabs, activeItemIndex = _a.activeItemIndex; if (tabs.length < 2) { return 0; } var clientWidth = this.elementRef.nativeElement.clientWidth; var activeWidth = tabs[activeItemIndex] ? tabs[activeItemIndex].scrollWidth : 0; var moreWidth = tabs[tabs.length - 1].scrollWidth; var maxIndex = tabs.length - 2; var total = tabs.reduce(function (acc, tab) { return acc + tab.scrollWidth; }, 0) + maxIndex * TAB_MARGIN - moreWidth; if (total <= clientWidth) { return Infinity; } while (maxIndex) { total -= tabs[maxIndex].scrollWidth + TAB_MARGIN; maxIndex--; var activeOffset = activeItemIndex > maxIndex ? activeWidth + TAB_MARGIN : 0; if (total + activeOffset + moreWidth + TAB_MARGIN < clientWidth) { return maxIndex; } } return 0; }; TuiTabsWithMoreComponent.prototype.updateActiveItemIndex = function (activeItemIndex) { if (this.activeItemIndex === activeItemIndex) { return; } this.activeItemIndex = activeItemIndex; this.activeItemIndexChange.emit(activeItemIndex); this.maxIndex = this.getMaxIndex(); }; TuiTabsWithMoreComponent.ctorParameters = function () { return [ { type: Observable, decorators: [{ type: Inject, args: [TABS_REFRESH,] }] }, { type: ElementRef, decorators: [{ type: Inject, args: [ElementRef,] }] }, { type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] }, { type: Observable, decorators: [{ type: Inject, args: [TUI_MORE_WORD,] }] } ]; }; __decorate([ Input(), tuiDefaultProp() ], TuiTabsWithMoreComponent.prototype, "moreContent", void 0); __decorate([ Input(), HostBinding('class._underline'), tuiDefaultProp() ], TuiTabsWithMoreComponent.prototype, "underline", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiTabsWithMoreComponent.prototype, "activeItemIndex", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiTabsWithMoreComponent.prototype, "itemsLimit", void 0); __decorate([ Output() ], TuiTabsWithMoreComponent.prototype, "activeItemIndexChange", void 0); __decorate([ ContentChildren(TuiTabDirective, { read: TemplateRef }) ], TuiTabsWithMoreComponent.prototype, "items", void 0); __decorate([ ViewChild(TuiTabComponent, { read: ElementRef }) ], TuiTabsWithMoreComponent.prototype, "moreButton", void 0); TuiTabsWithMoreComponent = __decorate([ Component({ selector: 'tui-tabs-with-more, nav[tuiTabsWithMore]', template: "<ng-container *ngIf=\"items.changes | async\"></ng-container>\n<div class=\"wrapper\">\n <tui-tabs\n class=\"tabs\"\n [underline]=\"false\"\n [activeItemIndex]=\"activeItemIndex\"\n (activeItemIndexChange)=\"onActiveItemIndexChange($event)\"\n (keydown.arrowRight)=\"onArrowRight($event.target)\"\n >\n <ng-container *ngFor=\"let item of items; let index = index\">\n <ng-container\n *ngIf=\"index <= lastVisibleIndex; else hidden\"\n [ngTemplateOutlet]=\"item\"\n ></ng-container>\n <ng-template #hidden>\n <div\n class=\"overflown\"\n [class.overflown_hidden]=\"index !== activeItemIndex\"\n >\n <ng-container *ngTemplateOutlet=\"item\"></ng-container>\n </div>\n </ng-template>\n </ng-container>\n </tui-tabs>\n <tui-hosted-dropdown\n class=\"more_wrapper\"\n [class.overflown_hidden]=\"!isMoreVisible\"\n [content]=\"dropdown\"\n [(open)]=\"open\"\n >\n <button\n tuiTab\n type=\"button\"\n class=\"more\"\n [class._active]=\"open\"\n [tuiFocusable]=\"isMoreFocusable\"\n (keydown.arrowLeft.prevent)=\"onArrowLeft()\"\n >\n <span polymorpheus-outlet [content]=\"moreContent || more\"></span>\n </button>\n <ng-template #more>\n {{moreWord$ | async}}\n <tui-svg\n src=\"tuiIconChevronDown\"\n class=\"icon\"\n [class.icon_rotated]=\"open\"\n ></tui-svg>\n </ng-template>\n </tui-hosted-dropdown>\n <ng-template #dropdown>\n <div\n #element\n class=\"dropdown\"\n (keydown.arrowUp.prevent)=\"onWrapperArrow($event.target, element, true)\"\n (keydown.arrowDown.prevent)=\"onWrapperArrow($event.target, element, false)\"\n >\n <div\n *ngFor=\"let item of items; let index = index\"\n (tui-tab-activate)=\"onClick(index)\"\n >\n <ng-container\n *ngIf=\"index > lastVisibleIndex && index !== activeItemIndex\"\n [ngTemplateOutlet]=\"item\"\n ></ng-container>\n </div>\n </div>\n </ng-template>\n <tui-underline *ngIf=\"underline\" [element]=\"activeElement\"></tui-underline>\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, providers: TABS_PROVIDERS, styles: [":host{font:var(--tui-font-text-m);position:relative;display:flex;height:var(--tui-height-l);box-sizing:border-box;color:var(--tui-text-02);box-shadow:inset 0 -1px var(--tui-base-03);overflow:hidden}.wrapper{position:relative;display:flex}.tabs{height:inherit;font-size:inherit;font-weight:inherit;overflow:visible;box-shadow:none;color:inherit}.overflown{margin-right:24px}.overflown_hidden{margin:0;width:0;max-width:0;overflow:hidden;visibility:hidden}.more_wrapper{height:100%}.icon{transition-property:transform;transition-duration:.3s;transition-timing-function:ease-in-out;margin-right:-4px;vertical-align:bottom}.icon_rotated{transform:rotate(180deg)}.dropdown{padding:8px 0}.dropdown ::ng-deep [tuiTab]{width:100%;height:44px;justify-content:flex-start;margin:0;padding:0 16px;color:var(--tui-text-02)}.dropdown ::ng-deep [tuiTab]:before{display:none}.dropdown ::ng-deep [tuiTab]._active,.dropdown ::ng-deep [tuiTab]:focus,.dropdown ::ng-deep [tuiTab]:hover{box-shadow:none;color:var(--tui-base-08);background:var(--tui-base-02)}"] }), __param(0, Inject(TABS_REFRESH)), __param(1, Inject(ElementRef)), __param(2, Inject(ChangeDetectorRef)), __param(3, Inject(TUI_MORE_WORD)) ], TuiTabsWithMoreComponent); return TuiTabsWithMoreComponent; }()); export { TuiTabsWithMoreComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy13aXRoLW1vcmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRhaWdhLXVpL2tpdC9jb21wb25lbnRzL3RhYnMvIiwic291cmNlcyI6WyJ0YWJzLXdpdGgtbW9yZS90YWJzLXdpdGgtbW9yZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxhQUFhLEVBQ2IsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsY0FBYyxFQUFFLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRXhFLFdBQVc7QUFRWDtJQStCSSxrQ0FDMkMsUUFBNkIsRUFDL0IsVUFBbUMsRUFDNUIsaUJBQW9DLEVBQ2hELFNBQTZCO1FBSHRCLGFBQVEsR0FBUixRQUFRLENBQXFCO1FBQy9CLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQzVCLHNCQUFp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LE1BQU0sU0FBQyxpQkFBaUI7Z0JBQ2tCLFVBQVUsdUJBQXBELE1BQU0sU0FBQyxhQUFhOztJQWhDekI7UUFGQyxLQUFLLEVBQUU7UUFDUCxjQUFjLEVBQUU7aUVBQ3FCO0lBS3RDO1FBSEMsS0FBSyxFQUFFO1FBQ1AsV0FBVyxDQUFDLGtCQUFrQixDQUFDO1FBQy9CLGNBQWMsRUFBRTsrREFDQTtJQUlqQjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTtxRUFDRztJQUlwQjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTtnRUFDSztJQUd0QjtRQURDLE1BQU0sRUFBRTsyRUFDbUQ7SUFHNUQ7UUFEQyxlQUFlLENBQUMsZUFBZSxFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBQyxDQUFDOzJEQUNHO0lBT3pEO1FBREMsU0FBUyxDQUFDLGVBQWUsRUFBRSxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQztnRUFDYTtJQTdCbkQsd0JBQXdCO1FBUHBDLFNBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSwwQ0FBMEM7WUFDcEQsaWdGQUE2QztZQUU3QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtZQUMvQyxTQUFTLEVBQUUsY0FBYzs7U0FDNUIsQ0FBQztRQWlDTyxXQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNwQixXQUFBLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNsQixXQUFBLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ3pCLFdBQUEsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO09BbkNqQix3QkFBd0IsQ0F1S3BDO0lBQUQsK0JBQUM7Q0FBQSxBQXZLRCxJQXVLQztTQXZLWSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBFTVBUWV9RVUVSWSxcbiAgICBnZXRDbG9zZXN0Rm9jdXNhYmxlLFxuICAgIGlzTmF0aXZlRm9jdXNlZCxcbiAgICBzZXROYXRpdmVGb2N1c2VkLFxuICAgIHR1aURlZmF1bHRQcm9wLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7VFVJX01PUkVfV09SRH0gZnJvbSAnQHRhaWdhLXVpL2tpdC90b2tlbnMnO1xuaW1wb3J0IHtQb2x5bW9ycGhldXNDb250ZW50fSBmcm9tICdAdGlua29mZi9uZy1wb2x5bW9ycGhldXMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyLCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7VHVpVGFiRGlyZWN0aXZlfSBmcm9tICcuLi90YWIuZGlyZWN0aXZlJztcbmltcG9ydCB7VHVpVGFiQ29tcG9uZW50fSBmcm9tICcuLi90YWIvdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQge1RBQl9NQVJHSU59IGZyb20gJy4uL3RhYnMuY29uc3QnO1xuaW1wb3J0IHtUQUJTX1BST1ZJREVSUywgVEFCU19SRUZSRVNIfSBmcm9tICcuL3RhYnMtd2l0aC1tb3JlLnByb3ZpZGVycyc7XG5cbi8vIEBkeW5hbWljXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3R1aS10YWJzLXdpdGgtbW9yZSwgbmF2W3R1aVRhYnNXaXRoTW9yZV0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJzLXdpdGgtbW9yZS50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi90YWJzLXdpdGgtbW9yZS5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBUQUJTX1BST1ZJREVSUyxcbn0pXG5leHBvcnQgY2xhc3MgVHVpVGFic1dpdGhNb3JlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIG1vcmVDb250ZW50OiBQb2x5bW9ycGhldXNDb250ZW50ID0gJyc7XG5cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuX3VuZGVybGluZScpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICB1bmRlcmxpbmUgPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIGFjdGl2ZUl0ZW1JbmRleCA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgaXRlbXNMaW1pdCA9IEluZmluaXR5O1xuXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgYWN0aXZlSXRlbUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBAQ29udGVudENoaWxkcmVuKFR1aVRhYkRpcmVjdGl2ZSwge3JlYWQ6IFRlbXBsYXRlUmVmfSlcbiAgICByZWFkb25seSBpdGVtczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPHt9Pj4gPSBFTVBUWV9RVUVSWTtcblxuICAgIG9wZW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgbWF4SW5kZXggPSBJbmZpbml0eTtcblxuICAgIEBWaWV3Q2hpbGQoVHVpVGFiQ29tcG9uZW50LCB7cmVhZDogRWxlbWVudFJlZn0pXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb3JlQnV0dG9uPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChUQUJTX1JFRlJFU0gpIHByaXZhdGUgcmVhZG9ubHkgcmVmcmVzaCQ6IE9ic2VydmFibGU8dW5rbm93bj4sXG4gICAgICAgIEBJbmplY3QoRWxlbWVudFJlZikgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgQEluamVjdChDaGFuZ2VEZXRlY3RvclJlZikgcHJpdmF0ZSByZWFkb25seSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoVFVJX01PUkVfV09SRCkgcmVhZG9ubHkgbW9yZVdvcmQkOiBPYnNlcnZhYmxlPHN0cmluZz4sXG4gICAgKSB7fVxuXG4gICAgZ2V0IHRhYnMoKTogUmVhZG9ubHlBcnJheTxIVE1MRWxlbWVudD4ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbdHVpVGFiXScpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBhY3RpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYnNbdGhpcy5hY3RpdmVJdGVtSW5kZXhdIHx8IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGlzTW9yZVZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RWaXNpYmxlSW5kZXggPCB0aGlzLml0ZW1zLmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgZ2V0IGlzTW9yZUZvY3VzYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5tb3JlQnV0dG9uICYmIGlzTmF0aXZlRm9jdXNlZCh0aGlzLm1vcmVCdXR0b24ubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNMaW1pdCArIDEgPj0gdGhpcy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1heEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5pdGVtc0xpbWl0IC0gMSA+IHRoaXMuYWN0aXZlSXRlbUluZGV4ID8gMSA6IDI7XG5cbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuaXRlbXNMaW1pdCAtIG9mZnNldCwgdGhpcy5tYXhJbmRleCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnJlZnJlc2gkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5nZXRNYXhJbmRleCgpKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIobWF4SW5kZXggPT4gdGhpcy5tYXhJbmRleCAhPT0gbWF4SW5kZXgpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShtYXhJbmRleCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXhJbmRleCA9IG1heEluZGV4O1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25BY3RpdmVJdGVtSW5kZXhDaGFuZ2UoYWN0aXZlSXRlbUluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVJdGVtSW5kZXgoYWN0aXZlSXRlbUluZGV4KTtcbiAgICB9XG5cbiAgICBvbkNsaWNrKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZm9jdXNNb3JlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlSXRlbUluZGV4KGluZGV4KTtcbiAgICB9XG5cbiAgICBvbkFycm93UmlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGlzTmF0aXZlRm9jdXNlZChlbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c01vcmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQXJyb3dMZWZ0KCkge1xuICAgICAgICBjb25zdCB7dGFic30gPSB0aGlzO1xuICAgICAgICBsZXQgaW5kZXggPSB0YWJzLmxlbmd0aCAtIDI7XG5cbiAgICAgICAgd2hpbGUgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQodGFic1tpbmRleF0pO1xuXG4gICAgICAgICAgICBpZiAoaXNOYXRpdmVGb2N1c2VkKHRhYnNbaW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uV3JhcHBlckFycm93KGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQsIHdyYXBwZXI6IEhUTUxFbGVtZW50LCBwcmV2OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGdldENsb3Nlc3RGb2N1c2FibGUoYnV0dG9uLCBwcmV2LCB3cmFwcGVyKTtcblxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICBzZXROYXRpdmVGb2N1c2VkKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzTW9yZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubW9yZUJ1dHRvbikge1xuICAgICAgICAgICAgc2V0TmF0aXZlRm9jdXNlZCh0aGlzLm1vcmVCdXR0b24ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1heEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHt0YWJzLCBhY3RpdmVJdGVtSW5kZXh9ID0gdGhpcztcblxuICAgICAgICBpZiAodGFicy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtjbGllbnRXaWR0aH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgYWN0aXZlV2lkdGggPSB0YWJzW2FjdGl2ZUl0ZW1JbmRleF0gPyB0YWJzW2FjdGl2ZUl0ZW1JbmRleF0uc2Nyb2xsV2lkdGggOiAwO1xuICAgICAgICBjb25zdCBtb3JlV2lkdGggPSB0YWJzW3RhYnMubGVuZ3RoIC0gMV0uc2Nyb2xsV2lkdGg7XG4gICAgICAgIGxldCBtYXhJbmRleCA9IHRhYnMubGVuZ3RoIC0gMjtcbiAgICAgICAgbGV0IHRvdGFsID1cbiAgICAgICAgICAgIHRhYnMucmVkdWNlKChhY2MsIHRhYikgPT4gYWNjICsgdGFiLnNjcm9sbFdpZHRoLCAwKSArXG4gICAgICAgICAgICBtYXhJbmRleCAqIFRBQl9NQVJHSU4gLVxuICAgICAgICAgICAgbW9yZVdpZHRoO1xuXG4gICAgICAgIGlmICh0b3RhbCA8PSBjbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKG1heEluZGV4KSB7XG4gICAgICAgICAgICB0b3RhbCAtPSB0YWJzW21heEluZGV4XS5zY3JvbGxXaWR0aCArIFRBQl9NQVJHSU47XG4gICAgICAgICAgICBtYXhJbmRleC0tO1xuXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVPZmZzZXQgPVxuICAgICAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleCA+IG1heEluZGV4ID8gYWN0aXZlV2lkdGggKyBUQUJfTUFSR0lOIDogMDtcblxuICAgICAgICAgICAgaWYgKHRvdGFsICsgYWN0aXZlT2Zmc2V0ICsgbW9yZVdpZHRoICsgVEFCX01BUkdJTiA8IGNsaWVudFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1heEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVBY3RpdmVJdGVtSW5kZXgoYWN0aXZlSXRlbUluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSXRlbUluZGV4ID09PSBhY3RpdmVJdGVtSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlSXRlbUluZGV4ID0gYWN0aXZlSXRlbUluZGV4O1xuICAgICAgICB0aGlzLmFjdGl2ZUl0ZW1JbmRleENoYW5nZS5lbWl0KGFjdGl2ZUl0ZW1JbmRleCk7XG4gICAgICAgIHRoaXMubWF4SW5kZXggPSB0aGlzLmdldE1heEluZGV4KCk7XG4gICAgfVxufVxuIl19