UNPKG

ngx-slice-kit

Version:

[![npm version](https://badge.fury.io/js/ngx-slice-kit.svg)](https://badge.fury.io/js/ngx-slice-kit)

180 lines 29.1 kB
import { Component, Input, ViewChild } from '@angular/core'; import { BehaviorSubject, fromEvent, Subscription } from 'rxjs'; import { delay, throttleTime } from 'rxjs/operators'; import { slideInAnimation } from '../../core/animations/slide-in'; import * as i0 from "@angular/core"; import * as i1 from "../../core/theme/theme.service"; export class TabsGroupComponent { constructor(themeService, cdRef) { this.themeService = themeService; this.cdRef = cdRef; this.activeTabStyle = 'border'; this.animation = false; this.subscription = new Subscription(); this.tabGroup = []; this.allTabsWidth = 0; this.arrowWidth = 40; this.containerPosition$ = new BehaviorSubject(null); this.slideMeasure = { width: 0, left: 0 }; } selectTab(selectedTab = null, index = null) { setTimeout(() => { this.curTab = this.containerElement.querySelector(`.sdk-tab-container__tab--active`); this.curTabClientRect = this.curTab.getBoundingClientRect(); // if current element not fully visible if (this.isArrows) { if ((this.curTabClientRect.left - this.arrowWidth) < this.containerRect.left) { const visiblePart = this.curTabClientRect.right - this.arrowWidth - this.containerRect.left; const hiddenPart = this.curTabClientRect.width - visiblePart; const additionalPadding = 40; this.scrollLeft(hiddenPart + additionalPadding); } if ((this.curTabClientRect.right + this.arrowWidth) > this.containerRect.right) { const visiblePart = this.containerRect.right - this.arrowWidth - this.curTabClientRect.left; const hiddenPart = this.curTabClientRect.width - visiblePart; const additionalPadding = 40; this.scrollRight(hiddenPart + additionalPadding); } } this.setUnderlineMeasure(); }); } scrollRight(step = null) { let x = parseInt(this.tabsWrapperElement.style.left, 10) || 0; const defaultStep = this.containerRect.width / 100 * 30; let scrollStep = defaultStep; this.tabsScrollRect = this.tabsWrapperElement.getBoundingClientRect(); if (this.tabsScrollRect.right - scrollStep < this.containerRect.right + this.arrowWidth) { scrollStep = (this.tabsScrollRect.right - this.containerRect.right) + this.arrowWidth; } else { scrollStep = step ? step : defaultStep; } x -= scrollStep; this.moveContainer(x); } scrollLeft(step = null) { let x = parseInt(this.tabsWrapperElement.style.left, 10) || 0; const defaultStep = this.containerRect.width / 100 * 30; let scrollStep = defaultStep; this.tabsScrollRect = this.tabsWrapperElement.getBoundingClientRect(); if (this.tabsScrollRect.left + scrollStep > this.containerRect.left + this.arrowWidth) { x = 0; } else { scrollStep = step ? step : defaultStep; x += scrollStep; } this.moveContainer(x); } moveContainer(x) { let newX = x; if (Math.abs(x) + this.containerWidth - (this.arrowLeftElement.offsetWidth * 2) > this.allTabsWidth) { newX = this.containerWidth - (this.arrowLeftElement.offsetWidth * 2) - this.allTabsWidth; } this.tabsWrapperElement.style.left = newX + 'px'; this.containerPosition$.next(true); } setUnderlineMeasure() { this.curTabClientRect = this.curTab.getBoundingClientRect(); this.slideMeasure.width = `${this.curTabClientRect.width}px`; this.slideMeasure.left = `${this.curTab.offsetLeft}px`; } setSizes() { this.containerRect = this.containerElement.getBoundingClientRect(); this.containerWidth = this.containerRect.width; this.tabsWrapperWidth = this.containerWidth - (this.isArrows ? (this.arrowWidth * 2) : 0); } setTabSizes() { this.allTabsWidth = 0; this.tabsViewElements.forEach(tab => { const tabWidth = tab.offsetWidth; this.allTabsWidth += tabWidth; if (tabWidth > this.tabsWrapperWidth) { tab.classList.add('sdk-tab-container__tab--oversize'); } }); this.tabsScrollRect = this.tabsWrapperElement.getBoundingClientRect(); } changeRects() { this.tabsScrollRect = this.tabsWrapperElement.getBoundingClientRect(); this.curTabClientRect = this.curTab.getBoundingClientRect(); } setSubscriptions() { this.subscription = this.containerPosition$.pipe(delay(400)).subscribe(() => this.changeRects()); const subResize = fromEvent(window, 'resize') .subscribe(() => { this.setSizes(); this.isArrows = this.allTabsWidth > this.containerWidth; if (!this.isArrows) { const x = Math.abs(parseFloat(this.tabsWrapperElement.style.left)) || 0; this.tabsWrapperElement.style.left = '0px'; if (x !== 0) { this.slideMeasure.left = `${parseFloat(this.slideMeasure.left) + x}px`; } } }); const subRightArrow = fromEvent(this.arrowRightElement, 'click') .pipe(throttleTime(500)) .subscribe(() => { this.scrollRight(); }); const subLeftArrow = fromEvent(this.arrowLeftElement, 'click') .pipe(throttleTime(500)) .subscribe(() => { this.scrollLeft(); }); this.subscription.add(subResize); this.subscription.add(subRightArrow); this.subscription.add(subLeftArrow); } ngOnInit() { this.containerElement = this.containerElement.nativeElement || this.containerElement; this.tabsWrapperElement = this.tabsWrapperElement.nativeElement || this.tabsWrapperElement; this.arrowLeftElement = this.arrowLeftElement.nativeElement || this.arrowLeftElement; this.arrowRightElement = this.arrowRightElement.nativeElement || this.arrowRightElement; this.setSizes(); this.setSubscriptions(); } ngAfterViewInit() { this.tabsViewElements = Array.from(this.tabsWrapperElement.children); this.setTabSizes(); this.isArrows = this.allTabsWidth > this.containerWidth; } ngAfterViewChecked() { this.cdRef.detectChanges(); } ngOnDestroy() { this.subscription.unsubscribe(); } } TabsGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TabsGroupComponent, deps: [{ token: i1.ThemeService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); TabsGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: TabsGroupComponent, selector: "ng-component", inputs: { activeTabStyle: "activeTabStyle", animation: "animation" }, viewQueries: [{ propertyName: "containerElement", first: true, predicate: ["container"], descendants: true, static: true }, { propertyName: "tabsWrapperElement", first: true, predicate: ["tabs"], descendants: true, static: true }, { propertyName: "arrowLeftElement", first: true, predicate: ["arrowLeft"], descendants: true, static: true }, { propertyName: "arrowRightElement", first: true, predicate: ["arrowRight"], descendants: true, static: true }], ngImport: i0, template: '', isInline: true, styles: [""], animations: [ slideInAnimation ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TabsGroupComponent, decorators: [{ type: Component, args: [{ template: '', animations: [ slideInAnimation ] }] }], ctorParameters: function () { return [{ type: i1.ThemeService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { activeTabStyle: [{ type: Input }], animation: [{ type: Input }], containerElement: [{ type: ViewChild, args: ['container', { static: true }] }], tabsWrapperElement: [{ type: ViewChild, args: ['tabs', { static: true }] }], arrowLeftElement: [{ type: ViewChild, args: ['arrowLeft', { static: true }] }], arrowRightElement: [{ type: ViewChild, args: ['arrowRight', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25neC1zbGljZS1raXQvc3JjL2xpYi9uYXZpZ2F0aW9uL3RhYnMtZ3JvdXAvdGFicy1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUlILFNBQVMsRUFDVCxLQUFLLEVBR0wsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7QUFTbEUsTUFBTSxPQUFPLGtCQUFrQjtJQWdDM0IsWUFDVyxZQUEwQixFQUN2QixLQUF3QjtRQUQzQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUN2QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQS9CdEIsbUJBQWMsR0FBVyxRQUFRLENBQUM7UUFDbEMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQU9wQyxpQkFBWSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBSWhELGFBQVEsR0FBVSxFQUFFLENBQUM7UUFHckIsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFDekIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQU14Qix1QkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQyxpQkFBWSxHQUE4QjtZQUM3QyxLQUFLLEVBQUUsQ0FBQztZQUNSLElBQUksRUFBRSxDQUFDO1NBQ1YsQ0FBQztJQU1GLENBQUM7SUFHTSxTQUFTLENBQUMsV0FBVyxHQUFHLElBQUksRUFBRSxLQUFLLEdBQUcsSUFBSTtRQUM3QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFB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QUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzVELENBQUM7SUFFTSxrQkFBa0I7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEMsQ0FBQzs7K0dBN0xRLGtCQUFrQjttR0FBbEIsa0JBQWtCLGdrQkFOakIsRUFBRSw0Q0FFQTtRQUNSLGdCQUFnQjtLQUNuQjsyRkFFUSxrQkFBa0I7a0JBUDlCLFNBQVM7K0JBQ0ksRUFBRSxjQUVBO3dCQUNSLGdCQUFnQjtxQkFDbkI7bUlBS2UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUV5QyxnQkFBZ0I7c0JBQTlELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDSSxrQkFBa0I7c0JBQTNELFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDYyxnQkFBZ0I7c0JBQTlELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDVSxpQkFBaUI7c0JBQWhFLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksIE9uSW5pdCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnQsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS90aGVtZS90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IGRlbGF5LCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBzbGlkZUluQW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9hbmltYXRpb25zL3NsaWRlLWluJztcblxuQENvbXBvbmVudCh7XG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIHN0eWxlVXJsczogWycuL3RhYnMtZ3JvdXAuY29tcG9uZW50LnNjc3MnXSxcbiAgICBhbmltYXRpb25zOiBbXG4gICAgICAgIHNsaWRlSW5BbmltYXRpb25cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95IHtcbiAgICBwdWJsaWMgdGFiczogUXVlcnlMaXN0PGFueT47XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgYWN0aXZlVGFiU3R5bGU6IHN0cmluZyA9ICdib3JkZXInO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhbmltYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHtzdGF0aWM6IHRydWV9KSBwdWJsaWMgY29udGFpbmVyRWxlbWVudDtcbiAgICBAVmlld0NoaWxkKCd0YWJzJywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyB0YWJzV3JhcHBlckVsZW1lbnQ7XG4gICAgQFZpZXdDaGlsZCgnYXJyb3dMZWZ0Jywge3N0YXRpYzogdHJ1ZX0pIHB1YmxpYyBhcnJvd0xlZnRFbGVtZW50O1xuICAgIEBWaWV3Q2hpbGQoJ2Fycm93UmlnaHQnLCB7c3RhdGljOiB0cnVlfSkgcHVibGljIGFycm93UmlnaHRFbGVtZW50O1xuXG4gICAgcHVibGljIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgcHVibGljIHRhYnNWaWV3RWxlbWVudHM6IEhUTUxFbGVtZW50W107XG4gICAgcHVibGljIGN1clRhYjogSFRNTEVsZW1lbnQ7XG4gICAgcHVibGljIHRhYkdyb3VwOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyBjb250YWluZXJXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyB0YWJzV3JhcHBlcldpZHRoOiBudW1iZXI7XG4gICAgcHVibGljIGFsbFRhYnNXaWR0aDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgYXJyb3dXaWR0aDogbnVtYmVyID0gNDA7XG4gICAgcHVibGljIGlzQXJyb3dzOiBib29sZWFuO1xuICAgIHB1YmxpYyB0YWJzU2Nyb2xsUmVjdDogQ2xpZW50UmVjdDtcbiAgICBwdWJsaWMgY3VyVGFiQ2xpZW50UmVjdDogQ2xpZW50UmVjdDtcbiAgICBwdWJsaWMgY29udGFpbmVyUmVjdDogQ2xpZW50UmVjdDtcblxuICAgIHB1YmxpYyBjb250YWluZXJQb3NpdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gICAgcHVibGljIHNsaWRlTWVhc3VyZTogeyB3aWR0aDogYW55LCBsZWZ0OiBhbnkgfSA9IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGxlZnQ6IDBcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICkge1xuICAgIH1cblxuXG4gICAgcHVibGljIHNlbGVjdFRhYihzZWxlY3RlZFRhYiA9IG51bGwsIGluZGV4ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VyVGFiID0gdGhpcy5jb250YWluZXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5zZGstdGFiLWNvbnRhaW5lcl9fdGFiLS1hY3RpdmVgKTtcbiAgICAgICAgICAgIHRoaXMuY3VyVGFiQ2xpZW50UmVjdCA9IHRoaXMuY3VyVGFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAvLyBpZiBjdXJyZW50IGVsZW1lbnQgbm90IGZ1bGx5IHZpc2libGVcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQXJyb3dzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLmN1clRhYkNsaWVudFJlY3QubGVmdCAtIHRoaXMuYXJyb3dXaWR0aCkgPCB0aGlzLmNvbnRhaW5lclJlY3QubGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpYmxlUGFydCA9IHRoaXMuY3VyVGFiQ2xpZW50UmVjdC5yaWdodCAtIHRoaXMuYXJyb3dXaWR0aCAtIHRoaXMuY29udGFpbmVyUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRkZW5QYXJ0ID0gdGhpcy5jdXJUYWJDbGllbnRSZWN0LndpZHRoIC0gdmlzaWJsZVBhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxQYWRkaW5nID0gNDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGVmdChoaWRkZW5QYXJ0ICsgYWRkaXRpb25hbFBhZGRpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuY3VyVGFiQ2xpZW50UmVjdC5yaWdodCArIHRoaXMuYXJyb3dXaWR0aCkgPiB0aGlzLmNvbnRhaW5lclJlY3QucmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlzaWJsZVBhcnQgPSB0aGlzLmNvbnRhaW5lclJlY3QucmlnaHQgLSB0aGlzLmFycm93V2lkdGggLSB0aGlzLmN1clRhYkNsaWVudFJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkZGVuUGFydCA9IHRoaXMuY3VyVGFiQ2xpZW50UmVjdC53aWR0aCAtIHZpc2libGVQYXJ0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUGFkZGluZyA9IDQwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFJpZ2h0KGhpZGRlblBhcnQgKyBhZGRpdGlvbmFsUGFkZGluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRVbmRlcmxpbmVNZWFzdXJlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzY3JvbGxSaWdodChzdGVwID0gbnVsbCk6IHZvaWQge1xuICAgICAgICBsZXQgeDogbnVtYmVyID0gcGFyc2VJbnQodGhpcy50YWJzV3JhcHBlckVsZW1lbnQuc3R5bGUubGVmdCwgMTApIHx8IDA7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRTdGVwID0gdGhpcy5jb250YWluZXJSZWN0LndpZHRoIC8gMTAwICogMzA7XG4gICAgICAgIGxldCBzY3JvbGxTdGVwID0gZGVmYXVsdFN0ZXA7XG4gICAgICAgIHRoaXMudGFic1Njcm9sbFJlY3QgPSB0aGlzLnRhYnNXcmFwcGVyRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAodGhpcy50YWJzU2Nyb2xsUmVjdC5yaWdodCAtIHNjcm9sbFN0ZXAgPCB0aGlzLmNvbnRhaW5lclJlY3QucmlnaHQgKyB0aGlzLmFycm93V2lkdGgpIHtcbiAgICAgICAgICAgIHNjcm9sbFN0ZXAgPSAodGhpcy50YWJzU2Nyb2xsUmVjdC5yaWdodCAtIHRoaXMuY29udGFpbmVyUmVjdC5yaWdodCkgKyB0aGlzLmFycm93V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3JvbGxTdGVwID0gc3RlcCA/IHN0ZXAgOiBkZWZhdWx0U3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHggLT0gc2Nyb2xsU3RlcDtcblxuICAgICAgICB0aGlzLm1vdmVDb250YWluZXIoeCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNjcm9sbExlZnQoc3RlcCA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgbGV0IHg6IG51bWJlciA9IHBhcnNlSW50KHRoaXMudGFic1dyYXBwZXJFbGVtZW50LnN0eWxlLmxlZnQsIDEwKSB8fCAwO1xuICAgICAgICBjb25zdCBkZWZhdWx0U3RlcCA9IHRoaXMuY29udGFpbmVyUmVjdC53aWR0aCAvIDEwMCAqIDMwO1xuICAgICAgICBsZXQgc2Nyb2xsU3RlcCA9IGRlZmF1bHRTdGVwO1xuICAgICAgICB0aGlzLnRhYnNTY3JvbGxSZWN0ID0gdGhpcy50YWJzV3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGFic1Njcm9sbFJlY3QubGVmdCArIHNjcm9sbFN0ZXAgPiB0aGlzLmNvbnRhaW5lclJlY3QubGVmdCArIHRoaXMuYXJyb3dXaWR0aCkge1xuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3JvbGxTdGVwID0gc3RlcCA/IHN0ZXAgOiBkZWZhdWx0U3RlcDtcbiAgICAgICAgICAgIHggKz0gc2Nyb2xsU3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW92ZUNvbnRhaW5lcih4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbW92ZUNvbnRhaW5lcih4KTogdm9pZCB7XG4gICAgICAgIGxldCBuZXdYOiBudW1iZXIgPSB4O1xuICAgICAgICBpZiAoTWF0aC5hYnMoeCkgKyB0aGlzLmNvbnRhaW5lcldpZHRoIC0gKHRoaXMuYXJyb3dMZWZ0RWxlbWVudC5vZmZzZXRXaWR0aCAqIDIpID4gdGhpcy5hbGxUYWJzV2lkdGgpIHtcbiAgICAgICAgICAgIG5ld1ggPSB0aGlzLmNvbnRhaW5lcldpZHRoIC0gKHRoaXMuYXJyb3dMZWZ0RWxlbWVudC5vZmZzZXRXaWR0aCAqIDIpIC0gdGhpcy5hbGxUYWJzV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50YWJzV3JhcHBlckVsZW1lbnQuc3R5bGUubGVmdCA9IG5ld1ggKyAncHgnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclBvc2l0aW9uJC5uZXh0KHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRVbmRlcmxpbmVNZWFzdXJlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1clRhYkNsaWVudFJlY3QgPSB0aGlzLmN1clRhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5zbGlkZU1lYXN1cmUud2lkdGggPSBgJHt0aGlzLmN1clRhYkNsaWVudFJlY3Qud2lkdGh9cHhgO1xuICAgICAgICB0aGlzLnNsaWRlTWVhc3VyZS5sZWZ0ID0gYCR7dGhpcy5jdXJUYWIub2Zmc2V0TGVmdH1weGA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFNpemVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSB0aGlzLmNvbnRhaW5lclJlY3Qud2lkdGg7XG4gICAgICAgIHRoaXMudGFic1dyYXBwZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyV2lkdGggLSAodGhpcy5pc0Fycm93cyA/ICh0aGlzLmFycm93V2lkdGggKiAyKSA6IDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUYWJTaXplcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxUYWJzV2lkdGggPSAwO1xuICAgICAgICB0aGlzLnRhYnNWaWV3RWxlbWVudHMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFiV2lkdGggPSB0YWIub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICB0aGlzLmFsbFRhYnNXaWR0aCArPSB0YWJXaWR0aDtcbiAgICAgICAgICAgIGlmICh0YWJXaWR0aCA+IHRoaXMudGFic1dyYXBwZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgIHRhYi5jbGFzc0xpc3QuYWRkKCdzZGstdGFiLWNvbnRhaW5lcl9fdGFiLS1vdmVyc2l6ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRhYnNTY3JvbGxSZWN0ID0gdGhpcy50YWJzV3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZVJlY3RzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhYnNTY3JvbGxSZWN0ID0gdGhpcy50YWJzV3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY3VyVGFiQ2xpZW50UmVjdCA9IHRoaXMuY3VyVGFiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY29udGFpbmVyUG9zaXRpb24kLnBpcGUoZGVsYXkoNDAwKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hhbmdlUmVjdHMoKSk7XG5cbiAgICAgICAgY29uc3Qgc3ViUmVzaXplID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNpemVzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Fycm93cyA9IHRoaXMuYWxsVGFic1dpZHRoID4gdGhpcy5jb250YWluZXJXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNBcnJvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IE1hdGguYWJzKHBhcnNlRmxvYXQodGhpcy50YWJzV3JhcHBlckVsZW1lbnQuc3R5bGUubGVmdCkpIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFic1dyYXBwZXJFbGVtZW50LnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVNZWFzdXJlLmxlZnQgPSBgJHtwYXJzZUZsb2F0KHRoaXMuc2xpZGVNZWFzdXJlLmxlZnQpICsgeH1weGA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzdWJSaWdodEFycm93ID0gZnJvbUV2ZW50KHRoaXMuYXJyb3dSaWdodEVsZW1lbnQsICdjbGljaycpXG4gICAgICAgICAgICAucGlwZSh0aHJvdHRsZVRpbWUoNTAwKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsUmlnaHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdWJMZWZ0QXJyb3cgPSBmcm9tRXZlbnQodGhpcy5hcnJvd0xlZnRFbGVtZW50LCAnY2xpY2snKVxuICAgICAgICAgICAgLnBpcGUodGhyb3R0bGVUaW1lKDUwMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChzdWJSZXNpemUpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoc3ViUmlnaHRBcnJvdyk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChzdWJMZWZ0QXJyb3cpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbGVtZW50ID0gdGhpcy5jb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy5jb250YWluZXJFbGVtZW50O1xuICAgICAgICB0aGlzLnRhYnNXcmFwcGVyRWxlbWVudCA9IHRoaXMudGFic1dyYXBwZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgfHwgdGhpcy50YWJzV3JhcHBlckVsZW1lbnQ7XG4gICAgICAgIHRoaXMuYXJyb3dMZWZ0RWxlbWVudCA9IHRoaXMuYXJyb3dMZWZ0RWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IHRoaXMuYXJyb3dMZWZ0RWxlbWVudDtcbiAgICAgICAgdGhpcy5hcnJvd1JpZ2h0RWxlbWVudCA9IHRoaXMuYXJyb3dSaWdodEVsZW1lbnQubmF0aXZlRWxlbWVudCB8fCB0aGlzLmFycm93UmlnaHRFbGVtZW50O1xuICAgICAgICB0aGlzLnNldFNpemVzKCk7XG4gICAgICAgIHRoaXMuc2V0U3Vic2NyaXB0aW9ucygpO1xuICAgIH1cblxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YWJzVmlld0VsZW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLnRhYnNXcmFwcGVyRWxlbWVudC5jaGlsZHJlbik7XG4gICAgICAgIHRoaXMuc2V0VGFiU2l6ZXMoKTtcbiAgICAgICAgdGhpcy5pc0Fycm93cyA9IHRoaXMuYWxsVGFic1dpZHRoID4gdGhpcy5jb250YWluZXJXaWR0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxufVxuIl19