UNPKG

ng-devui

Version:

DevUI components based on Angular

278 lines 35.1 kB
import { __decorate, __metadata } from "tslib"; import { DOCUMENT } from '@angular/common'; import { ComponentFactoryResolver, Directive, ElementRef, Inject, Injector, Input, ViewContainerRef } from '@angular/core'; import { OverlayContainerRef } from 'ng-devui/overlay-container'; import { DevConfigService, WithConfig } from 'ng-devui/utils'; import { fromEvent, Subject, Subscription } from 'rxjs'; import { debounceTime, filter, map, takeUntil } from 'rxjs/operators'; import { PopoverComponent } from './popover.component'; import * as i0 from "@angular/core"; import * as i1 from "ng-devui/overlay-container"; import * as i2 from "ng-devui/utils"; export class PopoverDirective { /** * popover内容 */ set content(_popoverContent) { this._content = _popoverContent; if (this.popoverComponentRef) { this.popoverComponentRef.instance.content = _popoverContent; setTimeout(() => { if (this.popoverComponentRef) { this.popoverComponentRef.instance.updatePosition(); } }); } } /** * @deprecated Use showAnimation to replace. */ set showAnimate(isShowAnimate) { this.showAnimation = isShowAnimate; } /** * @deprecated Use mouseLeaveDelay to replace. * 曾经是触发移入popover内部的延迟时间 * 废弃,现在使用参数mouseLeaveDelay代替 */ set hoverDelayTime(delayTime) { this.mouseLeaveDelay = delayTime; } set visible(_isShow) { if (_isShow) { // when set value and create component at the same time,should wait after ng2 dirty check done setTimeout(() => this.show(), 0); } else { this.hide(); } } get eleAppendToBody() { return this.appendToBody || this.triggerElementRef.nativeElement.style.position === 'fixed'; } constructor(triggerElementRef, overlayContainerRef, viewContainerRef, injector, componentFactoryResolver, devConfigService, doc) { this.triggerElementRef = triggerElementRef; this.overlayContainerRef = overlayContainerRef; this.viewContainerRef = viewContainerRef; this.injector = injector; this.componentFactoryResolver = componentFactoryResolver; this.devConfigService = devConfigService; this.doc = doc; this.subscription = new Subscription(); /** * popover显示位置 */ this.position = ['top', 'right', 'bottom', 'left']; /** * 是否显示动画 */ this.showAnimation = true; /** * 自动隐藏系数,弹出框超出已设置的 scrollELment 边界时会自动隐藏,该值与弹出框的宽或高乘积控制超出边界多少后自动隐藏,为负数时不隐藏 */ this.autoHideCoefficient = 0; /** * `appendToBody`默认可以不传,仅当popover绑定元素外层宽高不够时,overflow为hidden,不想popover的弹出框被一并隐藏掉。 */ this.appendToBody = true; this.zIndex = 1060; this.popType = 'default'; // 触发 popover 的方式(点击/鼠标悬停等) this.trigger = 'click'; /** * @deprecated * 是否可以移入popover内部 */ this.hoverToContent = false; // 防止每次鼠标不小心经过目标元素就会显示出PopOver的内容,所以增加适当的延迟。 this.mouseEnterDelay = 150; // 因为鼠标移出之后如果立刻消失会很突然,所以增加略小一些的延迟,使得既不突然也反应灵敏 this.mouseLeaveDelay = 100; this.unsubscribe$ = new Subject(); this.unsubscribeP$ = new Subject(); this.onDocumentClick = (event) => { event.stopPropagation(); if (this.controlled && !this.triggerElementRef.nativeElement.contains(event.target) && !(this.popoverComponentRef && this.popoverComponentRef.instance.elementRef.nativeElement.contains(event.target))) { this.hide(); } }; this.document = this.doc; } createPopover() { if (this.eleAppendToBody) { this.popoverComponentRef = this.overlayContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(PopoverComponent)); } else { this.popoverComponentRef = this.viewContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(PopoverComponent), this.viewContainerRef.length, this.injector); } Object.assign(this.popoverComponentRef.instance, { content: this._content, triggerElementRef: this.triggerElementRef, position: this.position, popType: this.popType, popMaxWidth: this.popMaxWidth, scrollElement: this.scrollElement, appendToBody: this.eleAppendToBody, zIndex: this.zIndex, showAnimation: this.showAnimation, popoverStyle: this.popoverStyle, autoHideCoefficient: this.autoHideCoefficient, }); // 对创建的ToolTip组件添加鼠标移入和移出的监听事件 if (this.popoverComponentRef.instance.elementRef.nativeElement && this.trigger === 'hover') { this.addMouseEvent(); } } addMouseEvent() { const el = this.popoverComponentRef.instance.elementRef.nativeElement; fromEvent(el, 'mouseenter') .pipe(map((event) => { this.isEnter = true; return event; }), debounceTime(0), filter((event) => this.isEnter), takeUntil(this.unsubscribeP$)) .subscribe(() => { if (!this.popoverComponentRef) { this.show(); } }); fromEvent(el, 'mouseleave') .pipe(map((event) => { this.isEnter = false; return event; }), debounceTime(this.mouseLeaveDelay), filter((event) => !this.isEnter), takeUntil(this.unsubscribeP$)) .subscribe(() => { this.hide(); }); } show() { this.hide(); if (!this.popoverComponentRef) { this.createPopover(); } this.popoverComponentRef.instance.show(); this.document.addEventListener('click', this.onDocumentClick); } destroy() { if (this.popoverComponentRef) { this.popoverComponentRef.destroy(); this.popoverComponentRef = null; } this.document.removeEventListener('click', this.onDocumentClick); if (this.unsubscribeP$) { this.unsubscribeP$.next(); this.unsubscribeP$.complete(); } } ngOnInit() { const element = this.triggerElementRef.nativeElement; if (this.trigger === 'click') { this.subscription.add(fromEvent(element, 'click').subscribe((event) => { if (this.controlled) { this.show(); } })); } else if (this.trigger === 'hover') { fromEvent(element, 'mouseenter') .pipe(map((event) => { this.isEnter = true; return event; }), debounceTime(this.mouseEnterDelay), filter((event) => this.isEnter), takeUntil(this.unsubscribe$)) .subscribe(() => { if (!this.popoverComponentRef && this.controlled) { this.show(); } }); fromEvent(element, 'mouseleave') .pipe(map((event) => { this.isEnter = false; return event; }), debounceTime(this.mouseLeaveDelay), filter((event) => !this.isEnter), takeUntil(this.unsubscribe$)) .subscribe(() => { if (this.controlled) { this.hide(); } }); } } ngOnDestroy() { if (this.unsubscribeP$) { this.unsubscribeP$.next(); this.unsubscribeP$.complete(); } this.unsubscribe$.next(); this.unsubscribe$.complete(); this.destroy(); this.subscription.unsubscribe(); } hide() { if (this.popoverComponentRef) { if (!this.showAnimation) { this.destroy(); return; } this.popoverComponentRef.instance.hide(); this.popoverComponentRef.instance.onHidden = () => { this.destroy(); }; } if (this.unsubscribeP$) { this.unsubscribeP$.next(); this.unsubscribeP$.complete(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PopoverDirective, deps: [{ token: i0.ElementRef }, { token: i1.OverlayContainerRef }, { token: i0.ViewContainerRef }, { token: i0.Injector }, { token: i0.ComponentFactoryResolver }, { token: i2.DevConfigService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: PopoverDirective, selector: "[dPopover]", inputs: { content: "content", controlled: "controlled", position: "position", showAnimation: "showAnimation", showAnimate: "showAnimate", scrollElement: "scrollElement", autoHideCoefficient: "autoHideCoefficient", appendToBody: "appendToBody", zIndex: "zIndex", popType: "popType", popMaxWidth: "popMaxWidth", trigger: "trigger", hoverToContent: "hoverToContent", hoverDelayTime: "hoverDelayTime", popoverStyle: "popoverStyle", mouseEnterDelay: "mouseEnterDelay", mouseLeaveDelay: "mouseLeaveDelay", visible: "visible" }, exportAs: ["dPopover"], ngImport: i0 }); } } __decorate([ WithConfig(), __metadata("design:type", Object) ], PopoverDirective.prototype, "showAnimation", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PopoverDirective, decorators: [{ type: Directive, args: [{ selector: '[dPopover]', exportAs: 'dPopover', }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.OverlayContainerRef }, { type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i0.ComponentFactoryResolver }, { type: i2.DevConfigService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { content: [{ type: Input }], controlled: [{ type: Input }], position: [{ type: Input }], showAnimation: [{ type: Input }], showAnimate: [{ type: Input }], scrollElement: [{ type: Input }], autoHideCoefficient: [{ type: Input }], appendToBody: [{ type: Input }], zIndex: [{ type: Input }], popType: [{ type: Input }], popMaxWidth: [{ type: Input }], trigger: [{ type: Input }], hoverToContent: [{ type: Input }], hoverDelayTime: [{ type: Input }], popoverStyle: [{ type: Input }], mouseEnterDelay: [{ type: Input }], mouseLeaveDelay: [{ type: Input }], visible: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9wb3BvdmVyL3BvcG92ZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLHdCQUF3QixFQUV4QixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUlMLGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQU92RCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTNCOztPQUVHO0lBQ0gsSUFBYSxPQUFPLENBQUMsZUFBZTtRQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQztZQUM1RCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3JELENBQUM7WUFDSCxD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bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFFBQVEsRUFBRSxVQUFVO2lCQUNyQjs7MEJBd0dJLE1BQU07MkJBQUMsUUFBUTt5Q0FoR0wsT0FBTztzQkFBbkIsS0FBSztnQkFjRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSWlCLGFBQWE7c0JBQW5DLEtBQUs7Z0JBS08sV0FBVztzQkFBdkIsS0FBSztnQkFPRyxhQUFhO3NCQUFyQixLQUFLO2dCQUlHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTUcsY0FBYztzQkFBdEIsS0FBSztnQkFPTyxjQUFjO3NCQUExQixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUtPLE9BQU87c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbmplY3QsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE92ZXJsYXlDb250YWluZXJSZWYgfSBmcm9tICduZy1kZXZ1aS9vdmVybGF5LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IERldkNvbmZpZ1NlcnZpY2UsIFdpdGhDb25maWcgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQb3BvdmVyVHlwZSwgUG9zaXRpb25UeXBlLCBUcmlnZ2VyVHlwZSB9IGZyb20gJy4vcG9wb3Zlci50eXBlcyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkUG9wb3Zlcl0nLFxyXG4gIGV4cG9ydEFzOiAnZFBvcG92ZXInLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUG9wb3ZlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwb3BvdmVyQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8UG9wb3ZlckNvbXBvbmVudD47XHJcbiAgX2NvbnRlbnQ6IHN0cmluZyB8IEhUTUxFbGVtZW50IHwgVGVtcGxhdGVSZWY8YW55PjtcclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIC8qKlxyXG4gICAqIHBvcG92ZXLlhoXlrrlcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgY29udGVudChfcG9wb3ZlckNvbnRlbnQpIHtcclxuICAgIHRoaXMuX2NvbnRlbnQgPSBfcG9wb3ZlckNvbnRlbnQ7XHJcbiAgICBpZiAodGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb250ZW50ID0gX3BvcG92ZXJDb250ZW50O1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UudXBkYXRlUG9zaXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiDmmK/lkKbpgJrov4d2aXNpYmxl5p2l5o6n5Yi2cG9wb3ZlcueKtuaAgVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNvbnRyb2xsZWQ6IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogcG9wb3ZlcuaYvuekuuS9jee9rlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBvc2l0aW9uOiBQb3NpdGlvblR5cGUgfCBQb3NpdGlvblR5cGVbXSA9IFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J107XHJcbiAgLyoqXHJcbiAgICog5piv5ZCm5pi+56S65Yqo55S7XHJcbiAgICovXHJcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBzaG93QW5pbWF0aW9uID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHNob3dBbmltYXRpb24gdG8gcmVwbGFjZS5cclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgc2hvd0FuaW1hdGUoaXNTaG93QW5pbWF0ZTogYW55KSB7XHJcbiAgICB0aGlzLnNob3dBbmltYXRpb24gPSBpc1Nob3dBbmltYXRlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogYHNjcm9sbEVsZW1lbnRgIOm7mOiupOWAvOaYryBgd2luZG93IGAsIOWPr+S7peS4jeS8oO+8jOWPquacieW9k+mhtemdoueahOa7muWKqOS4jeWcqCB3aW5kb3cg5LiUYGFwcGVuZFRvQm9keWDlsZ7mgKfkuLpgdHJ1ZWDkuIrnmoTml7blgJnmiY3pnIDopoHkvKDpgJJcclxuICAgKi9cclxuICBASW5wdXQoKSBzY3JvbGxFbGVtZW50OiBFbGVtZW50O1xyXG4gIC8qKlxyXG4gICAqIOiHquWKqOmakOiXj+ezu+aVsO+8jOW8ueWHuuahhui2heWHuuW3suiuvue9rueahCBzY3JvbGxFTG1lbnQg6L6555WM5pe25Lya6Ieq5Yqo6ZqQ6JeP77yM6K+l5YC85LiO5by55Ye65qGG55qE5a695oiW6auY5LmY56ev5o6n5Yi26LaF5Ye66L6555WM5aSa5bCR5ZCO6Ieq5Yqo6ZqQ6JeP77yM5Li66LSf5pWw5pe25LiN6ZqQ6JePXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXV0b0hpZGVDb2VmZmljaWVudCA9IDA7XHJcbiAgLyoqXHJcbiAgICogYGFwcGVuZFRvQm9keWDpu5jorqTlj6/ku6XkuI3kvKDvvIzku4XlvZNwb3BvdmVy57uR5a6a5YWD57Sg5aSW5bGC5a696auY5LiN5aSf5pe277yMb3ZlcmZsb3fkuLpoaWRkZW7vvIzkuI3mg7Nwb3BvdmVy55qE5by55Ye65qGG6KKr5LiA5bm26ZqQ6JeP5o6J44CCXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXBwZW5kVG9Cb2R5ID0gdHJ1ZTtcclxuICBASW5wdXQoKSB6SW5kZXggPSAxMDYwO1xyXG4gIEBJbnB1dCgpIHBvcFR5cGU6IFBvcG92ZXJUeXBlID0gJ2RlZmF1bHQnO1xyXG4gIEBJbnB1dCgpIHBvcE1heFdpZHRoOiBudW1iZXI7XHJcbiAgLy8g6Kem5Y+RIHBvcG92ZXIg55qE5pa55byP77yI54K55Ye7L+m8oOagh+aCrOWBnOetie+8iVxyXG4gIEBJbnB1dCgpIHRyaWdnZXI6IFRyaWdnZXJUeXBlID0gJ2NsaWNrJztcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWRcclxuICAgKiDmmK/lkKblj6/ku6Xnp7vlhaVwb3BvdmVy5YaF6YOoXHJcbiAgICovXHJcbiAgQElucHV0KCkgaG92ZXJUb0NvbnRlbnQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgVXNlIG1vdXNlTGVhdmVEZWxheSB0byByZXBsYWNlLlxyXG4gICAqIOabvue7j+aYr+inpuWPkeenu+WFpXBvcG92ZXLlhoXpg6jnmoTlu7bov5/ml7bpl7RcclxuICAgKiDlup/lvIMs546w5Zyo5L2/55So5Y+C5pWwbW91c2VMZWF2ZURlbGF55Luj5pu/XHJcbiAgICovXHJcbiAgQElucHV0KCkgc2V0IGhvdmVyRGVsYXlUaW1lKGRlbGF5VGltZTogYW55KSB7XHJcbiAgICB0aGlzLm1vdXNlTGVhdmVEZWxheSA9IGRlbGF5VGltZTtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9ruagt+W8j1xyXG4gIEBJbnB1dCgpIHBvcG92ZXJTdHlsZTogb2JqZWN0O1xyXG5cclxuICAvLyDpmLLmraLmr4/mrKHpvKDmoIfkuI3lsI/lv4Pnu4/ov4fnm67moIflhYPntKDlsLHkvJrmmL7npLrlh7pQb3BPdmVy55qE5YaF5a6577yM5omA5Lul5aKe5Yqg6YCC5b2T55qE5bu26L+f44CCXHJcbiAgQElucHV0KCkgbW91c2VFbnRlckRlbGF5ID0gMTUwO1xyXG5cclxuICAvLyDlm6DkuLrpvKDmoIfnp7vlh7rkuYvlkI7lpoLmnpznq4vliLvmtojlpLHkvJrlvojnqoHnhLbvvIzmiYDku6Xlop7liqDnlaXlsI/kuIDkupvnmoTlu7bov5/vvIzkvb/lvpfml6LkuI3nqoHnhLbkuZ/lj43lupTngbXmlY9cclxuICBASW5wdXQoKSBtb3VzZUxlYXZlRGVsYXkgPSAxMDA7XHJcbiAgaXNFbnRlcjogYm9vbGVhbjtcclxuICB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHVuc3Vic2NyaWJlUCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIGRvY3VtZW50OiBEb2N1bWVudDtcclxuICBASW5wdXQoKSBzZXQgdmlzaWJsZShfaXNTaG93OiBib29sZWFuKSB7XHJcbiAgICBpZiAoX2lzU2hvdykge1xyXG4gICAgICAvLyB3aGVuIHNldCB2YWx1ZSBhbmQgY3JlYXRlIGNvbXBvbmVudCBhdCB0aGUgc2FtZSB0aW1l77yMc2hvdWxkIHdhaXQgYWZ0ZXIgbmcyIGRpcnR5IGNoZWNrIGRvbmVcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3coKSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IGVsZUFwcGVuZFRvQm9keSgpIHtcclxuICAgIHJldHVybiB0aGlzLmFwcGVuZFRvQm9keSB8fCB0aGlzLnRyaWdnZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPT09ICdmaXhlZCc7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJpZ2dlckVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIG92ZXJsYXlDb250YWluZXJSZWY6IE92ZXJsYXlDb250YWluZXJSZWYsXHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIGRldkNvbmZpZ1NlcnZpY2U6IERldkNvbmZpZ1NlcnZpY2UsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55XHJcbiAgKSB7XHJcbiAgICB0aGlzLmRvY3VtZW50ID0gdGhpcy5kb2M7XHJcbiAgfVxyXG5cclxuICBvbkRvY3VtZW50Q2xpY2sgPSAoZXZlbnQpID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKHRoaXMuY29udHJvbGxlZCAmJiAhdGhpcy50cmlnZ2VyRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcclxuICAgICAgISh0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYgJiYgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSkge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjcmVhdGVQb3BvdmVyKCkge1xyXG4gICAgaWYgKHRoaXMuZWxlQXBwZW5kVG9Cb2R5KSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheUNvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUG9wb3ZlckNvbXBvbmVudClcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUG9wb3ZlckNvbXBvbmVudCksXHJcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxcclxuICAgICAgICB0aGlzLmluamVjdG9yXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UsIHtcclxuICAgICAgY29udGVudDogdGhpcy5fY29udGVudCxcclxuICAgICAgdHJpZ2dlckVsZW1lbnRSZWY6IHRoaXMudHJpZ2dlckVsZW1lbnRSZWYsXHJcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLFxyXG4gICAgICBwb3BUeXBlOiB0aGlzLnBvcFR5cGUsXHJcbiAgICAgIHBvcE1heFdpZHRoOiB0aGlzLnBvcE1heFdpZHRoLFxyXG4gICAgICBzY3JvbGxFbGVtZW50OiB0aGlzLnNjcm9sbEVsZW1lbnQsXHJcbiAgICAgIGFwcGVuZFRvQm9keTogdGhpcy5lbGVBcHBlbmRUb0JvZHksXHJcbiAgICAgIHpJbmRleDogdGhpcy56SW5kZXgsXHJcbiAgICAgIHNob3dBbmltYXRpb246IHRoaXMuc2hvd0FuaW1hdGlvbixcclxuICAgICAgcG9wb3ZlclN0eWxlOiB0aGlzLnBvcG92ZXJTdHlsZSxcclxuICAgICAgYXV0b0hpZGVDb2VmZmljaWVudDogdGhpcy5hdXRvSGlkZUNvZWZmaWNpZW50LFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5a+55Yib5bu655qEVG9vbFRpcOe7hOS7tua3u+WKoOm8oOagh+enu+WFpeWSjOenu+WHuueahOebkeWQrOS6i+S7tlxyXG4gICAgaWYgKHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy50cmlnZ2VyID09PSAnaG92ZXInKSB7XHJcbiAgICAgIHRoaXMuYWRkTW91c2VFdmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBhZGRNb3VzZUV2ZW50KCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuaW5zdGFuY2UuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgZnJvbUV2ZW50KGVsLCAnbW91c2VlbnRlcicpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgoZXZlbnQpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNFbnRlciA9IHRydWU7XHJcbiAgICAgICAgICByZXR1cm4gZXZlbnQ7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+IHRoaXMuaXNFbnRlciksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmVQJClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMucG9wb3ZlckNvbXBvbmVudFJlZikge1xyXG4gICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIGZyb21FdmVudChlbCwgJ21vdXNlbGVhdmUnKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzRW50ZXIgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybiBldmVudDtcclxuICAgICAgICB9KSxcclxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5tb3VzZUxlYXZlRGVsYXkpLFxyXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+ICF0aGlzLmlzRW50ZXIpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlUCQpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgaWYgKCF0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5jcmVhdGVQb3BvdmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLnNob3coKTtcclxuICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uRG9jdW1lbnRDbGljayk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZikge1xyXG4gICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcclxuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlUCQpIHtcclxuICAgICAgdGhpcy51bnN1YnNjcmliZVAkLm5leHQoKTtcclxuICAgICAgdGhpcy51bnN1YnNjcmliZVAkLmNvbXBsZXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnRyaWdnZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnY2xpY2snKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgICBmcm9tRXZlbnQoZWxlbWVudCwgJ2NsaWNrJykuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnRyaWdnZXIgPT09ICdob3ZlcicpIHtcclxuICAgICAgZnJvbUV2ZW50KGVsZW1lbnQsICdtb3VzZWVudGVyJylcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc0VudGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5tb3VzZUVudGVyRGVsYXkpLFxyXG4gICAgICAgICAgZmlsdGVyKChldmVudCkgPT4gdGhpcy5pc0VudGVyKSxcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiAmJiB0aGlzLmNvbnRyb2xsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zaG93KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBmcm9tRXZlbnQoZWxlbWVudCwgJ21vdXNlbGVhdmUnKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbWFwKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzRW50ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5tb3VzZUxlYXZlRGVsYXkpLFxyXG4gICAgICAgICAgZmlsdGVyKChldmVudCkgPT4gIXRoaXMuaXNFbnRlciksXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmVQJCkge1xyXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlUCQubmV4dCgpO1xyXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlUCQuY29tcGxldGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcclxuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmRlc3Ryb3koKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgaWYgKHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZikge1xyXG4gICAgICBpZiAoIXRoaXMuc2hvd0FuaW1hdGlvbikge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLmhpZGUoKTtcclxuICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmLmluc3RhbmNlLm9uSGlkZGVuID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSgpO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmVQJCkge1xyXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlUCQubmV4dCgpO1xyXG4gICAgICB0aGlzLnVuc3Vic2NyaWJlUCQuY29tcGxldGUoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19