UNPKG

@taiga-ui/kit

Version:
263 lines 33 kB
var TuiPaginationComponent_1; import { __decorate, __param } from "tslib"; import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, forwardRef, Inject, Input, Optional, Output, QueryList, ViewChildren, } from '@angular/core'; import { AbstractTuiInteractive, clamp, EMPTY_QUERY, isNativeFocusedIn, setNativeFocused, TUI_FOCUSABLE_ITEM_ACCESSOR, tuiDefaultProp, } from '@taiga-ui/cdk'; import { TuiAppearance, TuiBrightness, TuiButtonComponent, TuiHorizontalDirection, TuiModeDirective, TuiSizeS, } from '@taiga-ui/core'; import { TUI_PAGINATION_TEXTS } from '@taiga-ui/kit/tokens'; import { horizontalDirectionToNumber } from '@taiga-ui/kit/utils/math'; import { Observable } from 'rxjs'; const DOTS_LENGTH = 1; const ACTIVE_ITEM_LENGTH = 1; export function nonNegativeInteger(length) { return Number.isInteger(length) && length >= 0; } // @dynamic let TuiPaginationComponent = TuiPaginationComponent_1 = class TuiPaginationComponent extends AbstractTuiInteractive { constructor(elementRef, modeDirective, texts$) { super(); this.elementRef = elementRef; this.modeDirective = modeDirective; this.texts$ = texts$; this.length = 1; this.size = 'm'; this.disabled = false; /** * Amount of visible pages around active page */ this.activePadding = 1; /** * Amount of visible pages at the edges */ this.sidePadding = 1; /** * Customization for page number display. */ this.content = null; /** * Active page index */ this.index = 0; this.indexChange = new EventEmitter(); this.elements = EMPTY_QUERY; } get nativeFocusableElement() { if (this.disabled) { return null; } let activeElementIndex = 0; const { elementsLength } = this; for (let i = 0; i < elementsLength; i++) { const itemIndex = this.getItemIndexByElementIndex(i); if (itemIndex) { activeElementIndex++; } if (itemIndex === this.index) { break; } } const activeElement = this.elements.find((_, index) => index === activeElementIndex); return activeElement ? activeElement.nativeFocusableElement : null; } get focused() { return isNativeFocusedIn(this.elementRef.nativeElement); } /** * Number of items in a container. */ get elementsLength() { return this.itemsFit ? this.length : this.maxElementsLength; } get sizeM() { return this.size === 'm'; } get mode() { return this.modeDirective ? this.modeDirective.mode : null; } get arrowIsDisabledLeft() { return this.index === 0; } get arrowIsDisabledRight() { return this.reverseIndex === 0; } elementIsFocusable(index) { return this.index === index && !this.focused; } getItemContext(index) { return { $implicit: index }; } /** * Get index by element index * @param elementIndex * @returns index or null (for '…') */ getItemIndexByElementIndex(elementIndex) { if (!this.sizeM) { return elementIndex; } if (elementIndex < this.sidePadding) { return elementIndex; } if (elementIndex === this.sidePadding && this.hasCollapsedItems(this.index)) { return null; } const reverseElementIndex = this.lastElementIndex - elementIndex; if (reverseElementIndex === this.sidePadding && this.hasCollapsedItems(this.reverseIndex)) { return null; } if (reverseElementIndex < this.sidePadding) { return this.lastIndex - reverseElementIndex; } const computedIndex = this.index - this.maxHalfLength + elementIndex; return clamp(computedIndex, elementIndex, this.lastIndex - reverseElementIndex); } getElementMode(index) { return this.index === index ? "primary" /* Primary */ : "flat" /* Flat */; } getSmallElementMode(index, mode) { return this.index === index && mode !== 'onLight' ? "primary" /* Primary */ : "secondary" /* Secondary */; } onElementClick(index) { this.updateIndex(index); } onElementKeyDownArrowLeft(element) { if (element === this.elements.first) { return; } const previous = this.elements.find((_, index, array) => array[index + 1] === element); if (previous && previous.nativeFocusableElement) { setNativeFocused(previous.nativeFocusableElement); } } onElementKeyDownArrowRight(element) { if (element === this.elements.last) { return; } const next = this.elements.find((_, index, array) => array[index - 1] === element); if (next && next.nativeFocusableElement) { setNativeFocused(next.nativeFocusableElement); } } onArrowClick(direction) { this.tryChangeTo(direction); this.focusActive(); } onActiveZone(focused) { this.updateFocused(focused); } /** * Active index from the end */ get reverseIndex() { return this.lastIndex - this.index; } /** * Max number of elements in half (not counting the middle one). */ get maxHalfLength() { return this.sidePadding + DOTS_LENGTH + this.activePadding; } /** * Is there '...' anywhere */ get itemsFit() { return this.length <= this.maxElementsLength; } /** * Max number of elements */ get maxElementsLength() { return this.maxHalfLength * 2 + ACTIVE_ITEM_LENGTH; } get lastIndex() { return this.length - 1; } get lastElementIndex() { return this.elementsLength - 1; } /** * Are there collapsed items at that index * @param index * @returns there are collapsed items */ hasCollapsedItems(index) { return !this.itemsFit && index > this.maxHalfLength; } tryChangeTo(direction) { this.updateIndex(clamp(this.index + horizontalDirectionToNumber(direction), 0, this.lastIndex)); } focusActive() { const { nativeFocusableElement } = this; if (nativeFocusableElement) { setNativeFocused(nativeFocusableElement); } } updateIndex(index) { if (this.index === index) { return; } this.index = index; this.indexChange.emit(index); } }; TuiPaginationComponent.ctorParameters = () => [ { type: ElementRef, decorators: [{ type: Inject, args: [ElementRef,] }] }, { type: TuiModeDirective, decorators: [{ type: Optional }, { type: Inject, args: [TuiModeDirective,] }] }, { type: Observable, decorators: [{ type: Inject, args: [TUI_PAGINATION_TEXTS,] }] } ]; __decorate([ Input(), tuiDefaultProp(nonNegativeInteger, 'Must be non-negative integer') ], TuiPaginationComponent.prototype, "length", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "size", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "disabled", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "activePadding", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "sidePadding", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiPaginationComponent.prototype, "content", void 0); __decorate([ Input(), tuiDefaultProp(nonNegativeInteger, 'Must be non-negative integer') ], TuiPaginationComponent.prototype, "index", void 0); __decorate([ Output() ], TuiPaginationComponent.prototype, "indexChange", void 0); __decorate([ ViewChildren('element', { read: TUI_FOCUSABLE_ITEM_ACCESSOR }) ], TuiPaginationComponent.prototype, "elements", void 0); TuiPaginationComponent = TuiPaginationComponent_1 = __decorate([ Component({ selector: 'tui-pagination', template: "<div class=\"content\" (tuiActiveZoneChange)=\"onActiveZone($event)\">\n <ng-container *ngIf=\"sizeM && (texts$ | async) as texts; else smallButtons\">\n <button\n tuiIconButton\n type=\"button\"\n tuiPreventDefault=\"mousedown\"\n class=\"button\"\n size=\"s\"\n appearance=\"flat\"\n icon=\"tuiIconChevronLeft\"\n [title]=\"texts[0]\"\n [disabled]=\"arrowIsDisabledLeft\"\n [focusable]=\"false\"\n (click)=\"onArrowClick('left')\"\n ></button>\n <ng-container *tuiRepeatTimes=\"let elementIndex of elementsLength\">\n <ng-container\n *tuiLet=\"getItemIndexByElementIndex(elementIndex) as index\"\n >\n <button\n *ngIf=\"index !== null; else dotsTemplate\"\n #element\n tuiButton\n type=\"button\"\n automation-id=\"tui-pagination__element\"\n class=\"button\"\n shape=\"square\"\n size=\"s\"\n [disabled]=\"disabled\"\n [focusable]=\"elementIsFocusable(index)\"\n [appearance]=\"getElementMode(index)\"\n (click)=\"onElementClick(index)\"\n (keydown.arrowLeft.prevent)=\"onElementKeyDownArrowLeft(element)\"\n (keydown.arrowRight.prevent)=\"onElementKeyDownArrowRight(element)\"\n >\n <div\n polymorpheus-outlet\n [content]=\"content || index + 1\"\n [context]=\"getItemContext(index)\"\n ></div>\n </button>\n </ng-container>\n </ng-container>\n <button\n tuiIconButton\n type=\"button\"\n tuiPreventDefault=\"mousedown\"\n class=\"button\"\n size=\"s\"\n appearance=\"flat\"\n icon=\"tuiIconChevronRight\"\n [title]=\"texts[1]\"\n [disabled]=\"arrowIsDisabledRight\"\n [focusable]=\"false\"\n (click)=\"onArrowClick('right')\"\n ></button>\n </ng-container>\n <ng-template #smallButtons>\n <button\n *tuiRepeatTimes=\"let indexItem of length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n shape=\"square\"\n [class.button_active]=\"indexItem === index\"\n [disabled]=\"disabled\"\n [focusable]=\"elementIsFocusable(indexItem)\"\n [appearance]=\"getSmallElementMode(indexItem, mode)\"\n (click)=\"onElementClick(indexItem)\"\n (keydown.arrowLeft.prevent)=\"onElementKeyDownArrowLeft(element)\"\n (keydown.arrowRight.prevent)=\"onElementKeyDownArrowRight(element)\"\n ></button>\n </ng-template>\n <ng-template #dotsTemplate>\n <div automation-id=\"tui-pagination__element\" class=\"dots\"></div>\n </ng-template>\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: TUI_FOCUSABLE_ITEM_ACCESSOR, useExisting: forwardRef(() => TuiPaginationComponent_1), }, ], styles: [":host{font:var(--tui-font-text-s);color:var(--tui-text-01);display:block;text-align:center}.content{display:flex;justify-content:center}.button{margin:0 2px;flex-shrink:0}.button_active{background:currentColor}.button.button.button_small{width:8px;height:8px;margin:0}.button.button.button_small:not(:first-child){margin-left:8px}.dots{width:var(--tui-height-s);height:var(--tui-height-s);line-height:var(--tui-height-s);margin:0 2px;flex-shrink:0;color:var(--tui-text-03);text-align:center;cursor:default}.dots:before{content:'\\2026'}"] }), __param(0, Inject(ElementRef)), __param(1, Optional()), __param(1, Inject(TuiModeDirective)), __param(2, Inject(TUI_PAGINATION_TEXTS)) ], TuiPaginationComponent); export { TuiPaginationComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdGFpZ2EtdWkva2l0L2NvbXBvbmVudHMvcGFnaW5hdGlvbi8iLCJzb3VyY2VzIjpbInBhZ2luYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEdBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILHNCQUFzQixFQUN0QixLQUFLLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsMkJBQTJCLEVBRTNCLGNBQWMsR0FHakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGFBQWEsRUFDYixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsUUFBUSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFckUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVoQyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDdEIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFN0IsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDN0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELFdBQVc7QUFhWCxJQUFhLHNCQUFzQiw4QkFBbkMsTUFBYSxzQkFDVCxTQUFRLHNCQUFzQjtJQWdEOUIsWUFDeUMs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QUFFLENBQUMsd0JBQXNCLENBQUM7YUFDeEQ7U0FDSjs7S0FDSixDQUFDO0lBbURPLFdBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2xCLFdBQUEsUUFBUSxFQUFFLENBQUE7SUFDVixXQUFBLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRXhCLFdBQUEsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUE7R0F0RHhCLHNCQUFzQixDQW1SbEM7U0FuUlksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFR1aUludGVyYWN0aXZlLFxuICAgIGNsYW1wLFxuICAgIEVNUFRZX1FVRVJZLFxuICAgIGlzTmF0aXZlRm9jdXNlZEluLFxuICAgIHNldE5hdGl2ZUZvY3VzZWQsXG4gICAgVFVJX0ZPQ1VTQUJMRV9JVEVNX0FDQ0VTU09SLFxuICAgIFR1aUNvbnRleHRXaXRoSW1wbGljaXQsXG4gICAgdHVpRGVmYXVsdFByb3AsXG4gICAgVHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yLFxuICAgIFR1aU5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHtcbiAgICBUdWlBcHBlYXJhbmNlLFxuICAgIFR1aUJyaWdodG5lc3MsXG4gICAgVHVpQnV0dG9uQ29tcG9uZW50LFxuICAgIFR1aUhvcml6b250YWxEaXJlY3Rpb24sXG4gICAgVHVpTW9kZURpcmVjdGl2ZSxcbiAgICBUdWlTaXplUyxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtUVUlfUEFHSU5BVElPTl9URVhUU30gZnJvbSAnQHRhaWdhLXVpL2tpdC90b2tlbnMnO1xuaW1wb3J0IHtob3Jpem9udGFsRGlyZWN0aW9uVG9OdW1iZXJ9IGZyb20gJ0B0YWlnYS11aS9raXQvdXRpbHMvbWF0aCc7XG5pbXBvcnQge1BvbHltb3JwaGV1c0NvbnRlbnR9IGZyb20gJ0B0aW5rb2ZmL25nLXBvbHltb3JwaGV1cyc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuXG5jb25zdCBET1RTX0xFTkdUSCA9IDE7XG5jb25zdCBBQ1RJVkVfSVRFTV9MRU5HVEggPSAxO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTmVnYXRpdmVJbnRlZ2VyKGxlbmd0aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobGVuZ3RoKSAmJiBsZW5ndGggPj0gMDtcbn1cblxuLy8gQGR5bmFtaWNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndHVpLXBhZ2luYXRpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3BhZ2luYXRpb24uc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUdWlQYWdpbmF0aW9uQ29tcG9uZW50KSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBBYnN0cmFjdFR1aUludGVyYWN0aXZlXG4gICAgaW1wbGVtZW50cyBUdWlGb2N1c2FibGVFbGVtZW50QWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKG5vbk5lZ2F0aXZlSW50ZWdlciwgJ011c3QgYmUgbm9uLW5lZ2F0aXZlIGludGVnZXInKVxuICAgIGxlbmd0aCA9IDE7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgc2l6ZTogVHVpU2l6ZVMgPSAnbSc7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgcmVhZG9ubHkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB2aXNpYmxlIHBhZ2VzIGFyb3VuZCBhY3RpdmUgcGFnZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBhY3RpdmVQYWRkaW5nID0gMTtcblxuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB2aXNpYmxlIHBhZ2VzIGF0IHRoZSBlZGdlc1xuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBzaWRlUGFkZGluZyA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b21pemF0aW9uIGZvciBwYWdlIG51bWJlciBkaXNwbGF5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBjb250ZW50OiBQb2x5bW9ycGhldXNDb250ZW50PFR1aUNvbnRleHRXaXRoSW1wbGljaXQ8bnVtYmVyPj4gfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEFjdGl2ZSBwYWdlIGluZGV4XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3Aobm9uTmVnYXRpdmVJbnRlZ2VyLCAnTXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlcicpXG4gICAgaW5kZXggPSAwO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgaW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ2VsZW1lbnQnLCB7cmVhZDogVFVJX0ZPQ1VTQUJMRV9JVEVNX0FDQ0VTU09SfSlcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRzOiBRdWVyeUxpc3Q8VHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yPiA9IEVNUFRZX1FVRVJZO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRWxlbWVudFJlZikgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChUdWlNb2RlRGlyZWN0aXZlKVxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGVEaXJlY3RpdmU6IFR1aU1vZGVEaXJlY3RpdmUgfCBudWxsLFxuICAgICAgICBASW5qZWN0KFRVSV9QQUdJTkFUSU9OX1RFWFRTKSByZWFkb25seSB0ZXh0cyQ6IE9ic2VydmFibGU8W3N0cmluZywgc3RyaW5nXT4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgZ2V0IG5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQoKTogVHVpTmF0aXZlRm9jdXNhYmxlRWxlbWVudCB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWN0aXZlRWxlbWVudEluZGV4ID0gMDtcbiAgICAgICAgY29uc3Qge2VsZW1lbnRzTGVuZ3RofSA9IHRoaXM7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50c0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSB0aGlzLmdldEl0ZW1JbmRleEJ5RWxlbWVudEluZGV4KGkpO1xuXG4gICAgICAgICAgICBpZiAoaXRlbUluZGV4KSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudEluZGV4Kys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpdGVtSW5kZXggPT09IHRoaXMuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgICAoXywgaW5kZXgpID0+IGluZGV4ID09PSBhY3RpdmVFbGVtZW50SW5kZXgsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQgPyBhY3RpdmVFbGVtZW50Lm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQgOiBudWxsO1xuICAgIH1cblxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNOYXRpdmVGb2N1c2VkSW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpdGVtcyBpbiBhIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBnZXQgZWxlbWVudHNMZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNGaXQgPyB0aGlzLmxlbmd0aCA6IHRoaXMubWF4RWxlbWVudHNMZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0IHNpemVNKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplID09PSAnbSc7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGUoKTogVHVpQnJpZ2h0bmVzcyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlRGlyZWN0aXZlID8gdGhpcy5tb2RlRGlyZWN0aXZlLm1vZGUgOiBudWxsO1xuICAgIH1cblxuICAgIGdldCBhcnJvd0lzRGlzYWJsZWRMZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDtcbiAgICB9XG5cbiAgICBnZXQgYXJyb3dJc0Rpc2FibGVkUmlnaHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJldmVyc2VJbmRleCA9PT0gMDtcbiAgICB9XG5cbiAgICBlbGVtZW50SXNGb2N1c2FibGUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gaW5kZXggJiYgIXRoaXMuZm9jdXNlZDtcbiAgICB9XG5cbiAgICBnZXRJdGVtQ29udGV4dChpbmRleDogbnVtYmVyKTogVHVpQ29udGV4dFdpdGhJbXBsaWNpdDxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHskaW1wbGljaXQ6IGluZGV4fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5kZXggYnkgZWxlbWVudCBpbmRleFxuICAgICAqIEBwYXJhbSBlbGVtZW50SW5kZXhcbiAgICAgKiBAcmV0dXJucyBpbmRleCBvciBudWxsIChmb3IgJ+KApicpXG4gICAgICovXG4gICAgZ2V0SXRlbUluZGV4QnlFbGVtZW50SW5kZXgoZWxlbWVudEluZGV4OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnNpemVNKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnRJbmRleCA8IHRoaXMuc2lkZVBhZGRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50SW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWxlbWVudEluZGV4ID09PSB0aGlzLnNpZGVQYWRkaW5nICYmIHRoaXMuaGFzQ29sbGFwc2VkSXRlbXModGhpcy5pbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2ZXJzZUVsZW1lbnRJbmRleCA9IHRoaXMubGFzdEVsZW1lbnRJbmRleCAtIGVsZW1lbnRJbmRleDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICByZXZlcnNlRWxlbWVudEluZGV4ID09PSB0aGlzLnNpZGVQYWRkaW5nICYmXG4gICAgICAgICAgICB0aGlzLmhhc0NvbGxhcHNlZEl0ZW1zKHRoaXMucmV2ZXJzZUluZGV4KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldmVyc2VFbGVtZW50SW5kZXggPCB0aGlzLnNpZGVQYWRkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0SW5kZXggLSByZXZlcnNlRWxlbWVudEluZGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcHV0ZWRJbmRleCA9IHRoaXMuaW5kZXggLSB0aGlzLm1heEhhbGZMZW5ndGggKyBlbGVtZW50SW5kZXg7XG5cbiAgICAgICAgcmV0dXJuIGNsYW1wKGNvbXB1dGVkSW5kZXgsIGVsZW1lbnRJbmRleCwgdGhpcy5sYXN0SW5kZXggLSByZXZlcnNlRWxlbWVudEluZGV4KTtcbiAgICB9XG5cbiAgICBnZXRFbGVtZW50TW9kZShpbmRleDogbnVtYmVyKTogVHVpQXBwZWFyYW5jZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSBpbmRleCA/IFR1aUFwcGVhcmFuY2UuUHJpbWFyeSA6IFR1aUFwcGVhcmFuY2UuRmxhdDtcbiAgICB9XG5cbiAgICBnZXRTbWFsbEVsZW1lbnRNb2RlKGluZGV4OiBudW1iZXIsIG1vZGU6IFR1aUJyaWdodG5lc3MgfCBudWxsKTogVHVpQXBwZWFyYW5jZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSBpbmRleCAmJiBtb2RlICE9PSAnb25MaWdodCdcbiAgICAgICAgICAgID8gVHVpQXBwZWFyYW5jZS5QcmltYXJ5XG4gICAgICAgICAgICA6IFR1aUFwcGVhcmFuY2UuU2Vjb25kYXJ5O1xuICAgIH1cblxuICAgIG9uRWxlbWVudENsaWNrKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGVJbmRleChpbmRleCk7XG4gICAgfVxuXG4gICAgb25FbGVtZW50S2V5RG93bkFycm93TGVmdChlbGVtZW50OiBUdWlCdXR0b25Db21wb25lbnQpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IHRoaXMuZWxlbWVudHMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5lbGVtZW50cy5maW5kKFxuICAgICAgICAgICAgKF8sIGluZGV4LCBhcnJheSkgPT4gYXJyYXlbaW5kZXggKyAxXSA9PT0gZWxlbWVudCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocHJldmlvdXMgJiYgcHJldmlvdXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudCkge1xuICAgICAgICAgICAgc2V0TmF0aXZlRm9jdXNlZChwcmV2aW91cy5uYXRpdmVGb2N1c2FibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRWxlbWVudEtleURvd25BcnJvd1JpZ2h0KGVsZW1lbnQ6IFR1aUJ1dHRvbkNvbXBvbmVudCkge1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gdGhpcy5lbGVtZW50cy5sYXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5lbGVtZW50cy5maW5kKFxuICAgICAgICAgICAgKF8sIGluZGV4LCBhcnJheSkgPT4gYXJyYXlbaW5kZXggLSAxXSA9PT0gZWxlbWVudCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobmV4dCAmJiBuZXh0Lm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHNldE5hdGl2ZUZvY3VzZWQobmV4dC5uYXRpdmVGb2N1c2FibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQXJyb3dDbGljayhkaXJlY3Rpb246IFR1aUhvcml6b250YWxEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy50cnlDaGFuZ2VUbyhkaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmZvY3VzQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgb25BY3RpdmVab25lKGZvY3VzZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb2N1c2VkKGZvY3VzZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjdGl2ZSBpbmRleCBmcm9tIHRoZSBlbmRcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCByZXZlcnNlSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdEluZGV4IC0gdGhpcy5pbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhbGYgKG5vdCBjb3VudGluZyB0aGUgbWlkZGxlIG9uZSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgbWF4SGFsZkxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zaWRlUGFkZGluZyArIERPVFNfTEVOR1RIICsgdGhpcy5hY3RpdmVQYWRkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElzIHRoZXJlICcuLi4nIGFueXdoZXJlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgaXRlbXNGaXQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA8PSB0aGlzLm1heEVsZW1lbnRzTGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1heCBudW1iZXIgb2YgZWxlbWVudHNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBtYXhFbGVtZW50c0xlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhIYWxmTGVuZ3RoICogMiArIEFDVElWRV9JVEVNX0xFTkdUSDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsYXN0SW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBsYXN0RWxlbWVudEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzTGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcmUgdGhlcmUgY29sbGFwc2VkIGl0ZW1zIGF0IHRoYXQgaW5kZXhcbiAgICAgKiBAcGFyYW0gaW5kZXhcbiAgICAgKiBAcmV0dXJucyB0aGVyZSBhcmUgY29sbGFwc2VkIGl0ZW1zXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYXNDb2xsYXBzZWRJdGVtcyhpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pdGVtc0ZpdCAmJiBpbmRleCA+IHRoaXMubWF4SGFsZkxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRyeUNoYW5nZVRvKGRpcmVjdGlvbjogVHVpSG9yaXpvbnRhbERpcmVjdGlvbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUluZGV4KFxuICAgICAgICAgICAgY2xhbXAodGhpcy5pbmRleCArIGhvcml6b250YWxEaXJlY3Rpb25Ub051bWJlcihkaXJlY3Rpb24pLCAwLCB0aGlzLmxhc3RJbmRleCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0FjdGl2ZSgpIHtcbiAgICAgICAgY29uc3Qge25hdGl2ZUZvY3VzYWJsZUVsZW1lbnR9ID0gdGhpcztcblxuICAgICAgICBpZiAobmF0aXZlRm9jdXNhYmxlRWxlbWVudCkge1xuICAgICAgICAgICAgc2V0TmF0aXZlRm9jdXNlZChuYXRpdmVGb2N1c2FibGVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW5kZXgoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5pbmRleENoYW5nZS5lbWl0KGluZGV4KTtcbiAgICB9XG59XG4iXX0=