UNPKG

ng-zorro-antd

Version:

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

141 lines 24.7 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Component, ChangeDetectionStrategy, ContentChildren, ElementRef, ContentChild, ChangeDetectorRef } from '@angular/core'; import { BehaviorSubject, combineLatest, ReplaySubject, Subject } from 'rxjs'; import { filter, map, pairwise, startWith, switchMap, takeUntil, withLatestFrom } from 'rxjs/operators'; import { NzResizeObserver } from 'ng-zorro-antd/cdk/resize-observer'; import { NzOverflowItemDirective } from './overflow-item.directive'; import { NzOverflowRestDirective } from './overflow-rest.directive'; import { NzOverflowSuffixDirective } from './overflow-suffix.directive'; export class NzOverflowContainerComponent { constructor(nzResizeObserver, elementRef, cdr) { this.nzResizeObserver = nzResizeObserver; this.elementRef = elementRef; this.cdr = cdr; this.contentInit$ = new Subject(); this.overflowItems = undefined; this.overflowSuffix = undefined; this.overflowRest = undefined; this.overflowItems$ = new ReplaySubject(1); this.destroy$ = new Subject(); this.containerWidth$ = this.nzResizeObserver .observe(this.elementRef.nativeElement) .pipe(map(([item]) => item.target.clientWidth || 0)); this.restWidth$ = new BehaviorSubject(0); this.suffixWidth$ = new BehaviorSubject(0); this.suffixFixedStart$ = new BehaviorSubject(null); this.displayCount$ = new BehaviorSubject(Number.MAX_SAFE_INTEGER); this.restReady$ = new BehaviorSubject(false); this.maxRestWith$ = this.restWidth$.pipe(pairwise(), map(([prevRestWidth, restWidth]) => Math.max(prevRestWidth, restWidth))); this.omittedItems$ = combineLatest([this.overflowItems$, this.displayCount$]).pipe(withLatestFrom(this.contentInit$), map(([[overflowItems, displayCount]]) => overflowItems.toArray().slice(displayCount + 1))); this.displayRest$ = combineLatest([this.restReady$, this.omittedItems$]).pipe(map(([restReady, omittedItems]) => restReady && !!omittedItems.length)); } updateDisplayCount(count, notReady) { this.displayCount$.next(count); if (this.overflowItems && !notReady) { this.restReady$.next(count < this.overflowItems.length - 1); } } ngOnInit() { const overflowItemsWidth$ = this.overflowItems$.pipe(switchMap(items => combineLatest(items.map(item => item.itemWidth$)))); this.overflowItems$.pipe(takeUntil(this.destroy$)).subscribe(overflowItems => { if (!overflowItems.length) { this.displayCount$.next(0); this.suffixFixedStart$.next(null); } }); combineLatest([overflowItemsWidth$, this.containerWidth$, this.maxRestWith$, this.restWidth$, this.suffixWidth$]) .pipe(filter(([, containerWidth, maxRestWith]) => !!(containerWidth && maxRestWith)), takeUntil(this.destroy$)) .subscribe(([overflowItemsWidth, containerWidth, maxRestWith, restWidth, suffixWidth]) => { let totalWidth = suffixWidth; const len = overflowItemsWidth.length; const lastIndex = len - 1; for (let i = 0; i < len; i += 1) { const currentItemWidth = overflowItemsWidth[i]; // Break since data not ready if (currentItemWidth === undefined) { this.updateDisplayCount(i - 1, true); break; } else { // Find best match totalWidth += currentItemWidth; if ( // Only one means `totalWidth` is the final width (lastIndex === 0 && totalWidth <= containerWidth) || // Last two width will be the final width (i === lastIndex - 1 && overflowItemsWidth[lastIndex] !== undefined && totalWidth + overflowItemsWidth[lastIndex] <= containerWidth)) { // Additional check if match the end this.updateDisplayCount(lastIndex); this.suffixFixedStart$.next(null); break; } else if (totalWidth + maxRestWith > containerWidth) { // Can not hold all the content to show rest this.updateDisplayCount(i - 1); this.suffixFixedStart$.next(totalWidth - currentItemWidth - suffixWidth + restWidth); break; } this.cdr.detectChanges(); } } if (this.overflowSuffix && overflowItemsWidth[0] !== undefined && overflowItemsWidth[0] + suffixWidth > containerWidth) { this.suffixFixedStart$.next(null); } this.cdr.detectChanges(); }); combineLatest([this.suffixFixedStart$, this.displayCount$]) .pipe(takeUntil(this.destroy$)) .subscribe(([suffixFixedStart, displayCount]) => { var _a; (_a = this.overflowSuffix) === null || _a === void 0 ? void 0 : _a.setSuffixStyle(suffixFixedStart, displayCount); }); combineLatest([this.displayCount$, this.overflowItems$]) .pipe(takeUntil(this.destroy$)) .subscribe(([displayCount, overflowItems]) => overflowItems.forEach((item, index) => item.setItemStyle(index <= displayCount, index))); combineLatest([this.displayRest$, this.displayCount$]) .pipe(takeUntil(this.destroy$)) .subscribe(([displayRest, displayCount]) => { var _a; (_a = this.overflowRest) === null || _a === void 0 ? void 0 : _a.setRestStyle(displayRest, displayRest ? displayCount : Number.MAX_SAFE_INTEGER); }); } ngAfterContentInit() { var _a, _b, _c; (_a = this.overflowItems) === null || _a === void 0 ? void 0 : _a.changes.pipe(startWith(this.overflowItems)).subscribe(this.overflowItems$); (_b = this.overflowSuffix) === null || _b === void 0 ? void 0 : _b.suffixWidth$.subscribe(this.suffixWidth$); (_c = this.overflowRest) === null || _c === void 0 ? void 0 : _c.restWidth$.subscribe(this.restWidth$); this.contentInit$.next(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } } NzOverflowContainerComponent.decorators = [ { type: Component, args: [{ selector: 'nz-overflow-container', template: ` <ng-content></ng-content> <ng-content select="[appOverflowRest]"></ng-content> <ng-content select="[appOverflowSuffix]"></ng-content>`, providers: [NzResizeObserver], changeDetection: ChangeDetectionStrategy.OnPush },] } ]; NzOverflowContainerComponent.ctorParameters = () => [ { type: NzResizeObserver }, { type: ElementRef }, { type: ChangeDetectorRef } ]; NzOverflowContainerComponent.propDecorators = { overflowItems: [{ type: ContentChildren, args: [NzOverflowItemDirective,] }], overflowSuffix: [{ type: ContentChild, args: [NzOverflowSuffixDirective,] }], overflowRest: [{ type: ContentChild, args: [NzOverflowRestDirective,] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmZsb3ctY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY2RrL292ZXJmbG93L292ZXJmbG93LWNvbnRhaW5lci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsZUFBZSxFQUVmLFVBQVUsRUFJVixZQUFZLEVBQ1osaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBVXhFLE1BQU0sT0FBTyw0QkFBNEI7SUFvQ3ZDLFlBQ1UsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3RCLEdBQXNCO1FBRnRCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXRDaEMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRW5DLGtCQUFhLEdBQW1ELFNBQVMsQ0FBQztRQUUxRSxtQkFBYyxHQUEwQyxTQUFTLENBQUM7UUFDM0IsaUJBQVksR0FBd0MsU0FBUyxDQUFDO1FBQ3JHLG1CQUFjLEdBQUcsSUFBSSxhQUFhLENBQXFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLG9CQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjthQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7YUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzVDLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQzdELGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQVMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDckUsZUFBVSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2pELGlCQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ2pDLFFBQVEsRUFBRSxFQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUN4RSxDQUFDO1FBQ0Ysa0JBQWEsR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDM0UsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUMxRixDQUFDO1FBQ0YsaUJBQVksR0FBRyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDdEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUN2RSxDQUFDO0lBYUMsQ0FBQztJQVhKLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxRQUFrQjtRQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQVFELFFBQVE7UUFDTixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUNsRCxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQzlDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDbkM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILGFBQWEsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUM5RyxJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQzlFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCO2FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFO1lBQ3ZGLElBQUksVUFBVSxHQUFHLFdBQVcsQ0FBQztZQUM3QixNQUFNLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7WUFDdEMsTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLDZCQUE2QjtnQkFDN0IsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNyQyxNQUFNO2lCQUNQO3FCQUFNO29CQUNMLGtCQUFrQjtvQkFDbEIsVUFBVSxJQUFJLGdCQUFnQixDQUFDO29CQUUvQjtvQkFDRSxpREFBaUQ7b0JBQ2pELENBQUMsU0FBUyxLQUFLLENBQUMsSUFBSSxVQUFVLElBQUksY0FBYyxDQUFDO3dCQUNqRCx5Q0FBeUM7d0JBQ3pDLENBQUMsQ0FBQyxLQUFLLFNBQVMsR0FBRyxDQUFDOzRCQUNsQixrQkFBa0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTOzRCQUMzQyxVQUFVLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFFLElBQUksY0FBYyxDQUFDLEVBQ2hFO3dCQUNBLG9DQUFvQzt3QkFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNsQyxNQUFNO3FCQUNQO3lCQUFNLElBQUksVUFBVSxHQUFHLFdBQVcsR0FBRyxjQUFjLEVBQUU7d0JBQ3BELDRDQUE0Qzt3QkFDNUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLEdBQUcsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDO3dCQUNyRixNQUFNO3FCQUNQO29CQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQzFCO2FBQ0Y7WUFDRCxJQUNFLElBQUksQ0FBQyxjQUFjO2dCQUNuQixrQkFBa0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTO2dCQUNuQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsY0FBYyxFQUNwRDtnQkFDQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25DO1lBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNMLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDeEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsRUFBRSxFQUFFOztZQUM5QyxNQUFBLElBQUksQ0FBQyxjQUFjLDBDQUFFLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztRQUNMLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FDM0MsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUN4RixDQUFDO1FBQ0osYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRTs7WUFDekMsTUFBQSxJQUFJLENBQUMsWUFBWSwwQ0FBRSxZQUFZLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCxrQkFBa0I7O1FBQ2hCLE1BQUEsSUFBSSxDQUFDLGFBQWEsMENBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0YsTUFBQSxJQUFJLENBQUMsY0FBYywwQ0FBRSxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRCxNQUFBLElBQUksQ0FBQyxZQUFZLDBDQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7O1lBdklGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxRQUFRLEVBQUU7OzJEQUUrQztnQkFDekQsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzdCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEOzs7WUFiUSxnQkFBZ0I7WUFWdkIsVUFBVTtZQUtWLGlCQUFpQjs7OzRCQXFCaEIsZUFBZSxTQUFDLHVCQUF1Qjs2QkFFdkMsWUFBWSxTQUFDLHlCQUF5QjsyQkFFdEMsWUFBWSxTQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ29udGVudENoaWxkLFxuICBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHBhaXJ3aXNlLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpSZXNpemVPYnNlcnZlciB9IGZyb20gJ25nLXpvcnJvLWFudGQvY2RrL3Jlc2l6ZS1vYnNlcnZlcic7XG5cbmltcG9ydCB7IE56T3ZlcmZsb3dJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9vdmVyZmxvdy1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOek92ZXJmbG93UmVzdERpcmVjdGl2ZSB9IGZyb20gJy4vb3ZlcmZsb3ctcmVzdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnpPdmVyZmxvd1N1ZmZpeERpcmVjdGl2ZSB9IGZyb20gJy4vb3ZlcmZsb3ctc3VmZml4LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LW92ZXJmbG93LWNvbnRhaW5lcicsXG4gIHRlbXBsYXRlOiBgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwT3ZlcmZsb3dSZXN0XVwiPjwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwT3ZlcmZsb3dTdWZmaXhdXCI+PC9uZy1jb250ZW50PmAsXG4gIHByb3ZpZGVyczogW056UmVzaXplT2JzZXJ2ZXJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBOek92ZXJmbG93Q29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBjb250ZW50SW5pdCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBAQ29udGVudENoaWxkcmVuKE56T3ZlcmZsb3dJdGVtRGlyZWN0aXZlKVxuICBvdmVyZmxvd0l0ZW1zOiBRdWVyeUxpc3Q8TnpPdmVyZmxvd0l0ZW1EaXJlY3RpdmU+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBAQ29udGVudENoaWxkKE56T3ZlcmZsb3dTdWZmaXhEaXJlY3RpdmUpXG4gIG92ZXJmbG93U3VmZml4OiBOek92ZXJmbG93U3VmZml4RGlyZWN0aXZlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBAQ29udGVudENoaWxkKE56T3ZlcmZsb3dSZXN0RGlyZWN0aXZlKSBvdmVyZmxvd1Jlc3Q6IE56T3ZlcmZsb3dSZXN0RGlyZWN0aXZlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBvdmVyZmxvd0l0ZW1zJCA9IG5ldyBSZXBsYXlTdWJqZWN0PFF1ZXJ5TGlzdDxOek92ZXJmbG93SXRlbURpcmVjdGl2ZT4+KDEpO1xuICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGNvbnRhaW5lcldpZHRoJCA9IHRoaXMubnpSZXNpemVPYnNlcnZlclxuICAgIC5vYnNlcnZlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KVxuICAgIC5waXBlKG1hcCgoW2l0ZW1dKSA9PiBpdGVtLnRhcmdldC5jbGllbnRXaWR0aCB8fCAwKSk7XG4gIHJlc3RXaWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHN1ZmZpeFdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgc3VmZml4Rml4ZWRTdGFydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICBkaXNwbGF5Q291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcbiAgcmVzdFJlYWR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBtYXhSZXN0V2l0aCQgPSB0aGlzLnJlc3RXaWR0aCQucGlwZShcbiAgICBwYWlyd2lzZSgpLFxuICAgIG1hcCgoW3ByZXZSZXN0V2lkdGgsIHJlc3RXaWR0aF0pID0+IE1hdGgubWF4KHByZXZSZXN0V2lkdGgsIHJlc3RXaWR0aCkpXG4gICk7XG4gIG9taXR0ZWRJdGVtcyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLm92ZXJmbG93SXRlbXMkLCB0aGlzLmRpc3BsYXlDb3VudCRdKS5waXBlKFxuICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuY29udGVudEluaXQkKSxcbiAgICBtYXAoKFtbb3ZlcmZsb3dJdGVtcywgZGlzcGxheUNvdW50XV0pID0+IG92ZXJmbG93SXRlbXMudG9BcnJheSgpLnNsaWNlKGRpc3BsYXlDb3VudCArIDEpKVxuICApO1xuICBkaXNwbGF5UmVzdCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnJlc3RSZWFkeSQsIHRoaXMub21pdHRlZEl0ZW1zJF0pLnBpcGUoXG4gICAgbWFwKChbcmVzdFJlYWR5LCBvbWl0dGVkSXRlbXNdKSA9PiByZXN0UmVhZHkgJiYgISFvbWl0dGVkSXRlbXMubGVuZ3RoKVxuICApO1xuXG4gIHVwZGF0ZURpc3BsYXlDb3VudChjb3VudDogbnVtYmVyLCBub3RSZWFkeT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlDb3VudCQubmV4dChjb3VudCk7XG4gICAgaWYgKHRoaXMub3ZlcmZsb3dJdGVtcyAmJiAhbm90UmVhZHkpIHtcbiAgICAgIHRoaXMucmVzdFJlYWR5JC5uZXh0KGNvdW50IDwgdGhpcy5vdmVyZmxvd0l0ZW1zLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbnpSZXNpemVPYnNlcnZlcjogTnpSZXNpemVPYnNlcnZlcixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBvdmVyZmxvd0l0ZW1zV2lkdGgkID0gdGhpcy5vdmVyZmxvd0l0ZW1zJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKGl0ZW1zID0+IGNvbWJpbmVMYXRlc3QoaXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5pdGVtV2lkdGgkKSkpXG4gICAgKSBhcyBPYnNlcnZhYmxlPG51bWJlcltdPjtcbiAgICB0aGlzLm92ZXJmbG93SXRlbXMkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUob3ZlcmZsb3dJdGVtcyA9PiB7XG4gICAgICBpZiAoIW92ZXJmbG93SXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheUNvdW50JC5uZXh0KDApO1xuICAgICAgICB0aGlzLnN1ZmZpeEZpeGVkU3RhcnQkLm5leHQobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29tYmluZUxhdGVzdChbb3ZlcmZsb3dJdGVtc1dpZHRoJCwgdGhpcy5jb250YWluZXJXaWR0aCQsIHRoaXMubWF4UmVzdFdpdGgkLCB0aGlzLnJlc3RXaWR0aCQsIHRoaXMuc3VmZml4V2lkdGgkXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKFssIGNvbnRhaW5lcldpZHRoLCBtYXhSZXN0V2l0aF0pID0+ICEhKGNvbnRhaW5lcldpZHRoICYmIG1heFJlc3RXaXRoKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW292ZXJmbG93SXRlbXNXaWR0aCwgY29udGFpbmVyV2lkdGgsIG1heFJlc3RXaXRoLCByZXN0V2lkdGgsIHN1ZmZpeFdpZHRoXSkgPT4ge1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IHN1ZmZpeFdpZHRoO1xuICAgICAgICBjb25zdCBsZW4gPSBvdmVyZmxvd0l0ZW1zV2lkdGgubGVuZ3RoO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBsZW4gLSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudEl0ZW1XaWR0aCA9IG92ZXJmbG93SXRlbXNXaWR0aFtpXTtcbiAgICAgICAgICAvLyBCcmVhayBzaW5jZSBkYXRhIG5vdCByZWFkeVxuICAgICAgICAgIGlmIChjdXJyZW50SXRlbVdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGlzcGxheUNvdW50KGkgLSAxLCB0cnVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaW5kIGJlc3QgbWF0Y2hcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gY3VycmVudEl0ZW1XaWR0aDtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBtZWFucyBgdG90YWxXaWR0aGAgaXMgdGhlIGZpbmFsIHdpZHRoXG4gICAgICAgICAgICAgIChsYXN0SW5kZXggPT09IDAgJiYgdG90YWxXaWR0aCA8PSBjb250YWluZXJXaWR0aCkgfHxcbiAgICAgICAgICAgICAgLy8gTGFzdCB0d28gd2lkdGggd2lsbCBiZSB0aGUgZmluYWwgd2lkdGhcbiAgICAgICAgICAgICAgKGkgPT09IGxhc3RJbmRleCAtIDEgJiZcbiAgICAgICAgICAgICAgICBvdmVyZmxvd0l0ZW1zV2lkdGhbbGFzdEluZGV4XSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdG90YWxXaWR0aCArIG92ZXJmbG93SXRlbXNXaWR0aFtsYXN0SW5kZXhdISA8PSBjb250YWluZXJXaWR0aClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIGlmIG1hdGNoIHRoZSBlbmRcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Q291bnQobGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgdGhpcy5zdWZmaXhGaXhlZFN0YXJ0JC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG90YWxXaWR0aCArIG1heFJlc3RXaXRoID4gY29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgLy8gQ2FuIG5vdCBob2xkIGFsbCB0aGUgY29udGVudCB0byBzaG93IHJlc3RcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5Q291bnQoaSAtIDEpO1xuICAgICAgICAgICAgICB0aGlzLnN1ZmZpeEZpeGVkU3RhcnQkLm5leHQodG90YWxXaWR0aCAtIGN1cnJlbnRJdGVtV2lkdGggLSBzdWZmaXhXaWR0aCArIHJlc3RXaWR0aCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5vdmVyZmxvd1N1ZmZpeCAmJlxuICAgICAgICAgIG92ZXJmbG93SXRlbXNXaWR0aFswXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgb3ZlcmZsb3dJdGVtc1dpZHRoWzBdICsgc3VmZml4V2lkdGggPiBjb250YWluZXJXaWR0aFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnN1ZmZpeEZpeGVkU3RhcnQkLm5leHQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnN1ZmZpeEZpeGVkU3RhcnQkLCB0aGlzLmRpc3BsYXlDb3VudCRdKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoW3N1ZmZpeEZpeGVkU3RhcnQsIGRpc3BsYXlDb3VudF0pID0+IHtcbiAgICAgICAgdGhpcy5vdmVyZmxvd1N1ZmZpeD8uc2V0U3VmZml4U3R5bGUoc3VmZml4Rml4ZWRTdGFydCwgZGlzcGxheUNvdW50KTtcbiAgICAgIH0pO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZGlzcGxheUNvdW50JCwgdGhpcy5vdmVyZmxvd0l0ZW1zJF0pXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbZGlzcGxheUNvdW50LCBvdmVyZmxvd0l0ZW1zXSkgPT5cbiAgICAgICAgb3ZlcmZsb3dJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gaXRlbS5zZXRJdGVtU3R5bGUoaW5kZXggPD0gZGlzcGxheUNvdW50LCBpbmRleCkpXG4gICAgICApO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZGlzcGxheVJlc3QkLCB0aGlzLmRpc3BsYXlDb3VudCRdKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoW2Rpc3BsYXlSZXN0LCBkaXNwbGF5Q291bnRdKSA9PiB7XG4gICAgICAgIHRoaXMub3ZlcmZsb3dSZXN0Py5zZXRSZXN0U3R5bGUoZGlzcGxheVJlc3QsIGRpc3BsYXlSZXN0ID8gZGlzcGxheUNvdW50IDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICAgICAgfSk7XG4gIH1cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3ZlcmZsb3dJdGVtcz8uY2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLm92ZXJmbG93SXRlbXMpKS5zdWJzY3JpYmUodGhpcy5vdmVyZmxvd0l0ZW1zJCk7XG4gICAgdGhpcy5vdmVyZmxvd1N1ZmZpeD8uc3VmZml4V2lkdGgkLnN1YnNjcmliZSh0aGlzLnN1ZmZpeFdpZHRoJCk7XG4gICAgdGhpcy5vdmVyZmxvd1Jlc3Q/LnJlc3RXaWR0aCQuc3Vic2NyaWJlKHRoaXMucmVzdFdpZHRoJCk7XG4gICAgdGhpcy5jb250ZW50SW5pdCQubmV4dCgpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19