UNPKG

@vismaux/ngx-nordic-cool

Version:
277 lines 30.4 kB
import { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes'; import { ComponentPortal } from '@angular/cdk/portal'; import { Directive, HostListener, Input, } from '@angular/core'; import { Subject } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; import { NcTooltipComponent } from './tooltip.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; export class NcTooltipDirective { constructor(elementRef, overlay, ngZone) { this.elementRef = elementRef; this.overlay = overlay; this.ngZone = ngZone; /** @ignore */ this.destroyed$ = new Subject(); /** @ignore */ this._content = null; /** @ignore */ this._placement = 'right'; /** @ignore */ this._offset = 15; /** @ignore */ this.mouseOver = false; } set content(value) { if (value === this._content) { return; } this._content = value; // Hide tooltip with empty content if (!this._content && this.overlayRef?.hasAttached()) { this.hide(); return; } // Update the content in case tooltip is already opened if (this.overlayRef?.hasAttached()) { this.tooltipInstance.content = this._content; this.tooltipInstance._markForCheck(); } } get content() { return this._content; } set style(value) { if (value === this._style) { return; } this._style = value; // Update the content in case tooltip is already opened if (this.overlayRef?.hasAttached()) { this.tooltipInstance.style = this._style; this.tooltipInstance._markForCheck(); } } get style() { return this._style; } set offset(value) { if (value === undefined) { return; } if (this._offset === value) { return; } this._offset = value; this.updateTooltipPlacement(); } get offset() { return this._offset; } set placement(value) { if (this._placement === value) { return; } this._placement = value; this.updateTooltipPlacement(); } get placement() { return this._placement; } /** @ignore */ ngOnDestroy() { this.destroyed$.next(); this.destroyed$.complete(); this.overlayRef?.detach(); this.overlayRef?.dispose(); } show() { if (this.overlayRef?.hasAttached()) { return; } const overlayRef = this.createOverlay(); this.tooltipPortal = this.tooltipPortal ?? new ComponentPortal(NcTooltipComponent); this.tooltipInstanceDestroyed$ = new Subject(); this.tooltipInstance = overlayRef.attach(this.tooltipPortal).instance; this.tooltipInstance.content = this.content; this.tooltipInstance.style = this.style; this.tooltipInstance .afterMouseLeave() .pipe(takeUntil(this.tooltipInstanceDestroyed$)) .subscribe(() => setTimeout(() => this.softHide())); // Tell the instance current position (left, right, top, bottom) this.currentPosition$ .pipe(takeUntil(this.tooltipInstanceDestroyed$)) .subscribe((position) => { this.ngZone.run(() => { this.tooltipInstance.position = position; this.tooltipInstance.offset = this.offset; this.tooltipInstance._markForCheck(); }); }); } hide() { if (!this.overlayRef?.hasAttached()) { return; } this.overlayRef.detach(); this.tooltipInstanceDestroyed$.next(); this.tooltipInstanceDestroyed$.complete(); this.tooltipInstance = null; } toggle() { if (!this.overlayRef?.hasAttached()) { this.show(); return; } this.hide(); } /** @ignore */ projectComponent(componentType) { if (!this.tooltipInstance) { throw new Error(`Trying to project content into a tooltip that is not yet created.`); } return this.tooltipInstance.projectComponent(componentType); } /** @ignore */ handleMouseEnter() { if (this.disabled) { return; } this.mouseOver = true; this.show(); } /** @ignore */ handleMouseLeave() { if (this.disabled) { return; } this.mouseOver = false; setTimeout(() => this.softHide()); } /** * closes only if mouse is not over the host element nor the tooltip itself * @ignore */ softHide() { if (!this.mouseOver && !this.tooltipInstance?.mouseOver) { this.hide(); } } /** @ignore */ createOverlay() { if (this.overlayRef) { return this.overlayRef; } const positionStrategy = this.overlay .position() .flexibleConnectedTo(this.elementRef); this.currentPosition$ = positionStrategy.positionChanges.pipe(map((pos) => pos.connectionPair.panelClass)); const scrollStrategy = this.overlay.scrollStrategies.reposition(); this.overlayRef = this.overlay.create({ positionStrategy, scrollStrategy }); this.overlayRef .keydownEvents() .pipe(takeUntil(this.destroyed$)) .subscribe((event) => { if (this.overlayRef?.hasAttached() && event.keyCode === ESCAPE && !hasModifierKey(event)) { this.hide(); } }); this.updatePosition(); return this.overlayRef; } /** @ignore */ updateTooltipPlacement() { if (this.overlayRef) { this.updatePosition(); this.overlayRef.updatePosition(); } } /** @ignore */ updatePosition() { const position = this.overlayRef.getConfig() .positionStrategy; const positions = this.getPositions(this._placement); position.withPositions(positions); } /** @ignore */ getPositions(preferredPlacement) { const right = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: this.offset, panelClass: 'right', }; const left = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -this.offset, panelClass: 'left', }; const top = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -this.offset, panelClass: 'top', }; const bottom = { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: this.offset, panelClass: 'bottom', }; switch (preferredPlacement) { case 'right': return [right, left, bottom, top]; case 'left': return [left, right, bottom, top]; case 'top': return [top, bottom, right, left]; case 'bottom': return [bottom, top, right, left]; default: throw new SyntaxError(`"${preferredPlacement}" value for 'placement' property is not supported. Available options: after, before, top, bottom, left or right.`); } } } NcTooltipDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcTooltipDirective, deps: [{ token: i0.ElementRef }, { token: i1.Overlay }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); NcTooltipDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.3", type: NcTooltipDirective, selector: "[ncTooltip]", inputs: { content: ["ncTooltip", "content"], style: ["ncTooltipStyle", "style"], disabled: ["ncTooltipDisabled", "disabled"], offset: ["ncTooltipOffsetSize", "offset"], placement: "placement" }, host: { listeners: { "mouseenter": "handleMouseEnter()", "mouseleave": "handleMouseLeave()" } }, exportAs: ["ncTooltip"], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: NcTooltipDirective, decorators: [{ type: Directive, args: [{ selector: '[ncTooltip]', exportAs: 'ncTooltip', }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Overlay }, { type: i0.NgZone }]; }, propDecorators: { content: [{ type: Input, args: ['ncTooltip'] }], style: [{ type: Input, args: ['ncTooltipStyle'] }], disabled: [{ type: Input, args: ['ncTooltipDisabled'] }], offset: [{ type: Input, args: ['ncTooltipOffsetSize'] }], placement: [{ type: Input }], handleMouseEnter: [{ type: HostListener, args: ['mouseenter'] }], handleMouseLeave: [{ type: HostListener, args: ['mouseleave'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9yZGljLWNvb2wvc3JjL2xpYi90b29sdGlwL3Rvb2x0aXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFPL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssR0FLTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7OztBQVN6RCxNQUFNLE9BQU8sa0JBQWtCO0lBaUc3QixZQUNVLFVBQXNCLEVBQ3RCLE9BQWdCLEVBQ2hCLE1BQWM7UUFGZCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5HeEIsY0FBYztRQUNKLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLGNBQWM7UUFDTixhQUFRLEdBQXFDLElBQUksQ0FBQztRQVcxRCxjQUFjO1FBQ04sZUFBVSxHQUF1QixPQUFPLENBQUM7UUFHakQsY0FBYztRQUNOLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDN0IsY0FBYztRQUNOLGNBQVMsR0FBWSxLQUFLLENBQUM7SUErRWhDLENBQUM7SUE3RUosSUFDSSxPQUFPLENBQUMsS0FBdUM7UUFDakQsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMzQixPQUFPO1NBQ1I7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LElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEMsS0FBSyxNQUFNO2dCQUNULE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwQyxLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEM7Z0JBQ0UsTUFBTSxJQUFJLFdBQVcsQ0FDbkIsSUFBSSxrQkFBa0Isa0hBQWtILENBQ3pJLENBQUM7U0FDTDtJQUNILENBQUM7OytHQWhUVSxrQkFBa0I7bUdBQWxCLGtCQUFrQjsyRkFBbEIsa0JBQWtCO2tCQUo5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixRQUFRLEVBQUUsV0FBVztpQkFDdEI7NElBMEJLLE9BQU87c0JBRFYsS0FBSzt1QkFBQyxXQUFXO2dCQXdCZCxLQUFLO3NCQURSLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQWlCSyxRQUFRO3NCQUFuQyxLQUFLO3VCQUFDLG1CQUFtQjtnQkFFdEIsTUFBTTtzQkFEVCxLQUFLO3VCQUFDLHFCQUFxQjtnQkFtQnhCLFNBQVM7c0JBRFosS0FBSztnQkF5Rk4sZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsWUFBWTtnQkFXMUIsZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVTQ0FQRSwgaGFzTW9kaWZpZXJLZXkgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGVkUG9zaXRpb24sXG4gIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTmNUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi90b29sdGlwLmNvbXBvbmVudCc7XG5cbmV4cG9ydCB0eXBlIE5jVG9vbHRpcFBsYWNlbWVudCA9ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wJyB8ICdib3R0b20nO1xuZXhwb3J0IHR5cGUgTmNUb29sdGlwU3R5bGUgPSAnZGVmYXVsdCcgfCAnZXJyb3InO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmNUb29sdGlwXScsXG4gIGV4cG9ydEFzOiAnbmNUb29sdGlwJyxcbn0pXG5leHBvcnQgY2xhc3MgTmNUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJvdGVjdGVkIGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdCgpO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9jb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgdG9vbHRpcEluc3RhbmNlRGVzdHJveWVkJDogU3ViamVjdDx2b2lkPjtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHRvb2x0aXBQb3J0YWw6IENvbXBvbmVudFBvcnRhbDxOY1Rvb2x0aXBDb21wb25lbnQ+O1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHRvb2x0aXBJbnN0YW5jZTogTmNUb29sdGlwQ29tcG9uZW50O1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIGN1cnJlbnRQb3NpdGlvbiQ6IE9ic2VydmFibGU8TmNUb29sdGlwUGxhY2VtZW50PjtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfcGxhY2VtZW50OiBOY1Rvb2x0aXBQbGFjZW1lbnQgPSAncmlnaHQnO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9zdHlsZTogTmNUb29sdGlwU3R5bGU7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgX29mZnNldDogbnVtYmVyID0gMTU7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgbW91c2VPdmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCduY1Rvb2x0aXAnKVxuICBzZXQgY29udGVudCh2YWx1ZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZW50ID0gdmFsdWU7XG5cbiAgICAvLyBIaWRlIHRvb2x0aXAgd2l0aCBlbXB0eSBjb250ZW50XG4gICAgaWYgKCF0aGlzLl9jb250ZW50ICYmIHRoaXMub3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSkge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250ZW50IGluIGNhc2UgdG9vbHRpcCBpcyBhbHJlYWR5IG9wZW5lZFxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRoaXMudG9vbHRpcEluc3RhbmNlLmNvbnRlbnQgPSB0aGlzLl9jb250ZW50O1xuICAgICAgdGhpcy50b29sdGlwSW5zdGFuY2UuX21hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBnZXQgY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgfVxuICBASW5wdXQoJ25jVG9vbHRpcFN0eWxlJylcbiAgc2V0IHN0eWxlKHZhbHVlOiBOY1Rvb2x0aXBTdHlsZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5fc3R5bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zdHlsZSA9IHZhbHVlO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb250ZW50IGluIGNhc2UgdG9vbHRpcCBpcyBhbHJlYWR5IG9wZW5lZFxuICAgIGlmICh0aGlzLm92ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRoaXMudG9vbHRpcEluc3RhbmNlLnN0eWxlID0gdGhpcy5fc3R5bGU7XG4gICAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG4gIGdldCBzdHlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3R5bGU7XG4gIH1cbiAgQElucHV0KCduY1Rvb2x0aXBEaXNhYmxlZCcpIGRpc2FibGVkOiBib29sZWFuO1xuICBASW5wdXQoJ25jVG9vbHRpcE9mZnNldFNpemUnKVxuICBzZXQgb2Zmc2V0KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb2Zmc2V0ID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX29mZnNldCA9IHZhbHVlO1xuXG4gICAgdGhpcy51cGRhdGVUb29sdGlwUGxhY2VtZW50KCk7XG4gIH1cbiAgZ2V0IG9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb2Zmc2V0O1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHBsYWNlbWVudCh2YWx1ZTogTmNUb29sdGlwUGxhY2VtZW50KSB7XG4gICAgaWYgKHRoaXMuX3BsYWNlbWVudCA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wbGFjZW1lbnQgPSB2YWx1ZTtcblxuICAgIHRoaXMudXBkYXRlVG9vbHRpcFBsYWNlbWVudCgpO1xuICB9XG4gIGdldCBwbGFjZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlbWVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLm92ZXJsYXlSZWY/LmRldGFjaCgpO1xuICAgIHRoaXMub3ZlcmxheVJlZj8uZGlzcG9zZSgpO1xuICB9XG5cbiAgc2hvdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuY3JlYXRlT3ZlcmxheSgpO1xuICAgIHRoaXMudG9vbHRpcFBvcnRhbCA9XG4gICAgICB0aGlzLnRvb2x0aXBQb3J0YWwgPz8gbmV3IENvbXBvbmVudFBvcnRhbChOY1Rvb2x0aXBDb21wb25lbnQpO1xuXG4gICAgdGhpcy50b29sdGlwSW5zdGFuY2VEZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcbiAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZSA9IG92ZXJsYXlSZWYuYXR0YWNoKHRoaXMudG9vbHRpcFBvcnRhbCkuaW5zdGFuY2U7XG4gICAgdGhpcy50b29sdGlwSW5zdGFuY2UuY29udGVudCA9IHRoaXMuY29udGVudDtcbiAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZS5zdHlsZSA9IHRoaXMuc3R5bGU7XG4gICAgdGhpcy50b29sdGlwSW5zdGFuY2VcbiAgICAgIC5hZnRlck1vdXNlTGVhdmUoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudG9vbHRpcEluc3RhbmNlRGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zb2Z0SGlkZSgpKSk7XG5cbiAgICAvLyBUZWxsIHRoZSBpbnN0YW5jZSBjdXJyZW50IHBvc2l0aW9uIChsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pXG4gICAgdGhpcy5jdXJyZW50UG9zaXRpb24kXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy50b29sdGlwSW5zdGFuY2VEZXN0cm95ZWQkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHBvc2l0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy50b29sdGlwSW5zdGFuY2UucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgICAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZS5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICAgICAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBoaWRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcbiAgICB0aGlzLnRvb2x0aXBJbnN0YW5jZURlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMudG9vbHRpcEluc3RhbmNlRGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMudG9vbHRpcEluc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMub3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSkge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGlkZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJvamVjdENvbXBvbmVudDxUPihjb21wb25lbnRUeXBlOiBUeXBlPFQ+KTogVCB7XG4gICAgaWYgKCF0aGlzLnRvb2x0aXBJbnN0YW5jZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJ5aW5nIHRvIHByb2plY3QgY29udGVudCBpbnRvIGEgdG9vbHRpcCB0aGF0IGlzIG5vdCB5ZXQgY3JlYXRlZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvb2x0aXBJbnN0YW5jZS5wcm9qZWN0Q29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gIGhhbmRsZU1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tb3VzZU92ZXIgPSB0cnVlO1xuICAgIHRoaXMuc2hvdygpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gIGhhbmRsZU1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tb3VzZU92ZXIgPSBmYWxzZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc29mdEhpZGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogY2xvc2VzIG9ubHkgaWYgbW91c2UgaXMgbm90IG92ZXIgdGhlIGhvc3QgZWxlbWVudCBub3IgdGhlIHRvb2x0aXAgaXRzZWxmXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgc29mdEhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLm1vdXNlT3ZlciAmJiAhdGhpcy50b29sdGlwSW5zdGFuY2U/Lm1vdXNlT3Zlcikge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCk6IE92ZXJsYXlSZWYge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLm92ZXJsYXlSZWY7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxuICAgICAgLnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuZWxlbWVudFJlZik7XG4gICAgdGhpcy5jdXJyZW50UG9zaXRpb24kID0gcG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbkNoYW5nZXMucGlwZShcbiAgICAgIG1hcCgocG9zKSA9PiBwb3MuY29ubmVjdGlvblBhaXIucGFuZWxDbGFzcyBhcyBOY1Rvb2x0aXBQbGFjZW1lbnQpXG4gICAgKTtcblxuICAgIGNvbnN0IHNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpO1xuXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7IHBvc2l0aW9uU3RyYXRlZ3ksIHNjcm9sbFN0cmF0ZWd5IH0pO1xuICAgIHRoaXMub3ZlcmxheVJlZlxuICAgICAgLmtleWRvd25FdmVudHMoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpICYmXG4gICAgICAgICAgZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFICYmXG4gICAgICAgICAgIWhhc01vZGlmaWVyS2V5KGV2ZW50KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG5cbiAgICByZXR1cm4gdGhpcy5vdmVybGF5UmVmO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwUGxhY2VtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLm92ZXJsYXlSZWYuZ2V0Q29uZmlnKClcbiAgICAgIC5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneTtcbiAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLmdldFBvc2l0aW9ucyh0aGlzLl9wbGFjZW1lbnQpO1xuICAgIHBvc2l0aW9uLndpdGhQb3NpdGlvbnMocG9zaXRpb25zKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25zKFxuICAgIHByZWZlcnJlZFBsYWNlbWVudDogTmNUb29sdGlwUGxhY2VtZW50XG4gICk6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICAgIGNvbnN0IHJpZ2h0OiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtcbiAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0LFxuICAgICAgcGFuZWxDbGFzczogJ3JpZ2h0JyxcbiAgICB9O1xuXG4gICAgY29uc3QgbGVmdDogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICBvdmVybGF5WTogJ2NlbnRlcicsXG4gICAgICBvZmZzZXRYOiAtdGhpcy5vZmZzZXQsXG4gICAgICBwYW5lbENsYXNzOiAnbGVmdCcsXG4gICAgfTtcblxuICAgIGNvbnN0IHRvcDogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICBvcmlnaW5YOiAnY2VudGVyJyxcbiAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgb2Zmc2V0WTogLXRoaXMub2Zmc2V0LFxuICAgICAgcGFuZWxDbGFzczogJ3RvcCcsXG4gICAgfTtcblxuICAgIGNvbnN0IGJvdHRvbTogQ29ubmVjdGVkUG9zaXRpb24gPSB7XG4gICAgICBvcmlnaW5YOiAnY2VudGVyJyxcbiAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxuICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXQsXG4gICAgICBwYW5lbENsYXNzOiAnYm90dG9tJyxcbiAgICB9O1xuXG4gICAgc3dpdGNoIChwcmVmZXJyZWRQbGFjZW1lbnQpIHtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIFtyaWdodCwgbGVmdCwgYm90dG9tLCB0b3BdO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHJldHVybiBbbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wXTtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIHJldHVybiBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHJldHVybiBbYm90dG9tLCB0b3AsIHJpZ2h0LCBsZWZ0XTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICBgXCIke3ByZWZlcnJlZFBsYWNlbWVudH1cIiB2YWx1ZSBmb3IgJ3BsYWNlbWVudCcgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4gQXZhaWxhYmxlIG9wdGlvbnM6IGFmdGVyLCBiZWZvcmUsIHRvcCwgYm90dG9tLCBsZWZ0IG9yIHJpZ2h0LmBcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==