ngx-pluto
Version:
408 lines • 37.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, ElementRef, Input, Renderer2, TemplateRef } from '@angular/core';
import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { NpTooltip } from './tooltip.component';
/** @type {?} */
const OFFSET = 4;
/**
* Tooltip提示文本
*
* <example-url>https://stackblitz.com/edit/np-tooltip-sample?embed=1&file=src/app/app.component.html</example-url>
*/
export class NpTooltipDirective {
/**
* @param {?} overlay
* @param {?} overlayPositionBuilder
* @param {?} elementRef
* @param {?} renderer
*/
constructor(overlay, overlayPositionBuilder, elementRef, renderer) {
this.overlay = overlay;
this.overlayPositionBuilder = overlayPositionBuilder;
this.elementRef = elementRef;
this.renderer = renderer;
/**
* 显示提示文本
*/
this.text = '';
/**
* 支持上、右、下、左、上左、上右、下左、下右8个方向展示提示文本,默认展示上方提示文本
*/
this.position = 'top';
/**
* 提示文本背景色
*/
this.bgColor = 'rgba(73, 89, 106, .7)';
/**
* 提示文本水平方向X轴位移
*/
this.offsetX = null;
/**
* 提示文本垂直方向Y轴位移
*/
this.offsetY = null;
/**
* 是否展示提示文本指向箭头,默认展示
*/
this.showArrow = true;
/**
* 触发方式,默认为鼠标hover
*/
this.trigger = 'hover';
this.withPositions = {
originX: 'center',
originY: 'top',
overlayX: 'center',
overlayY: 'bottom',
offsetX: 0,
offsetY: -2 * OFFSET
};
}
/**
* @return {?}
*/
ngOnInit() {
this.initWithPositions();
/** @type {?} */
const positionStrategy = this.overlayPositionBuilder
.flexibleConnectedTo(this.elementRef)
.withPositions([this.withPositions]);
this.overlayRef = this.overlay.create({ positionStrategy, hasBackdrop: this.trigger === 'click' });
this.overlayRef.backdropClick().subscribe((/**
* @param {?} res
* @return {?}
*/
res => {
this.hide();
}));
}
/**
* @return {?}
*/
ngAfterViewInit() {
/** @type {?} */
let overlayElement;
if (this.trigger === 'hover') {
this.renderer.listen(this.elementRef.nativeElement, 'mouseenter', (/**
* @return {?}
*/
() => this.delayEnterLeave(true, true, 0.15)));
this.renderer.listen(this.elementRef.nativeElement, 'mouseleave', (/**
* @return {?}
*/
() => {
this.delayEnterLeave(true, false, 0.1);
if (this.overlayRef && !overlayElement) { // NOTE: we bind events under "mouseleave" due to the overlayRef is only created after the overlay was completely shown up
overlayElement = this.overlayRef.overlayElement;
this.renderer.listen(overlayElement, 'mouseenter', (/**
* @return {?}
*/
() => this.delayEnterLeave(false, true)));
this.renderer.listen(overlayElement, 'mouseleave', (/**
* @return {?}
*/
() => this.delayEnterLeave(false, false)));
}
}));
}
else if (this.trigger === 'click') {
this.renderer.listen(this.elementRef.nativeElement, 'click', (/**
* @param {?} e
* @return {?}
*/
(e) => {
e.preventDefault();
this.show();
}));
}
}
/**
* @private
* @return {?}
*/
initWithPositions() {
switch (this.position) {
case 'top':
this.withPositions = {
originX: 'center',
originY: 'top',
overlayX: 'center',
overlayY: 'bottom',
offsetX: this.offsetX === null ? 0 : this.offsetX,
offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY
};
break;
case 'right':
this.withPositions = {
originX: 'end',
originY: 'center',
overlayX: 'start',
overlayY: 'center',
offsetX: this.offsetX === null ? 2 * OFFSET : this.offsetX,
offsetY: this.offsetY === null ? 0 : this.offsetY
};
break;
case 'bottom':
this.withPositions = {
originX: 'center',
originY: 'bottom',
overlayX: 'center',
overlayY: 'top',
offsetX: this.offsetX === null ? 0 : this.offsetX,
offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY
};
break;
case 'left':
this.withPositions = {
originX: 'start',
originY: 'center',
overlayX: 'end',
overlayY: 'center',
offsetX: this.offsetX === null ? -2 * OFFSET : this.offsetX,
offsetY: this.offsetY === null ? 0 : this.offsetY
};
break;
case 'topLeft':
this.withPositions = {
originX: 'start',
originY: 'top',
overlayX: 'end',
overlayY: 'bottom',
offsetX: this.offsetX === null ? OFFSET : this.offsetX,
offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY
};
break;
case 'topRight':
this.withPositions = {
originX: 'end',
originY: 'top',
overlayX: 'start',
overlayY: 'bottom',
offsetX: this.offsetX === null ? -OFFSET : this.offsetX,
offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY
};
break;
case 'bottomLeft':
this.withPositions = {
originX: 'start',
originY: 'bottom',
overlayX: 'end',
overlayY: 'top',
offsetX: this.offsetX === null ? OFFSET : this.offsetX,
offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY
};
break;
case 'bottomRight':
this.withPositions = {
originX: 'end',
originY: 'bottom',
overlayX: 'start',
overlayY: 'top',
offsetX: this.offsetX === null ? -OFFSET : this.offsetX,
offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY
};
break;
default:
break;
}
if (this.position === 'top') {
this.elementRef.nativeElement.classList.add('arrow-bottom');
}
}
/**
* @private
* @return {?}
*/
buildArrow() {
if (!this.overlayRef || !this.overlayRef.hostElement) {
return;
}
/** @type {?} */
let arrowPosition;
switch (this.position) {
case 'top':
arrowPosition = 'arrow-bottom';
break;
case 'right':
arrowPosition = 'arrow-left';
break;
case 'bottom':
arrowPosition = 'arrow-top';
break;
case 'left':
arrowPosition = 'arrow-right';
break;
case 'topLeft':
arrowPosition = 'arrow-bottomRight';
break;
case 'topRight':
arrowPosition = 'arrow-bottomLeft';
break;
case 'bottomLeft':
arrowPosition = 'arrow-topRight';
break;
case 'bottomRight':
arrowPosition = 'arrow-topLeft';
break;
default:
break;
}
/** @type {?} */
let tooltipTag = this.overlayRef.hostElement.getElementsByTagName('np-tooltip')[0];
if (tooltipTag) {
tooltipTag.classList.add(arrowPosition);
}
}
/**
* @private
* @param {?} isOrigin
* @param {?} isEnter
* @param {?=} delay
* @return {?}
*/
delayEnterLeave(isOrigin, isEnter, delay = -1) {
if (this.delayTimer) { // Clear timer during the delay time
window.clearTimeout(this.delayTimer);
this.delayTimer = null;
}
else if (delay > 0) {
this.delayTimer = window.setTimeout((/**
* @return {?}
*/
() => {
this.delayTimer = null;
isEnter ? this.show() : this.hide();
}), delay * 1000);
}
else {
isEnter && isOrigin ? this.show() : this.hide(); // [Compatible] The "isOrigin" is used due to the tooltip will not hide immediately (may caused by the fade-out animation)
}
}
/**
* @return {?}
*/
show() {
if (this.overlayRef.hasAttached()) {
return;
}
/** @type {?} */
const tooltipRef = this.overlayRef.attach(new ComponentPortal(NpTooltip));
if (this.text) {
tooltipRef.instance.text = this.text;
}
if (this.template) {
tooltipRef.instance.template = this.template;
}
tooltipRef.instance.bgColor = this.bgColor;
if (this.showArrow) {
this.buildArrow();
}
}
/**
* @return {?}
*/
hide() {
if (this.overlayRef.hasAttached) {
this.overlayRef.detach();
}
}
}
NpTooltipDirective.decorators = [
{ type: Directive, args: [{ selector: '[npTooltip]' },] }
];
/** @nocollapse */
NpTooltipDirective.ctorParameters = () => [
{ type: Overlay },
{ type: OverlayPositionBuilder },
{ type: ElementRef },
{ type: Renderer2 }
];
NpTooltipDirective.propDecorators = {
text: [{ type: Input, args: ['npTooltip',] }],
template: [{ type: Input }],
position: [{ type: Input }],
bgColor: [{ type: Input }],
offsetX: [{ type: Input }],
offsetY: [{ type: Input }],
showArrow: [{ type: Input }],
trigger: [{ type: Input }]
};
if (false) {
/**
* 显示提示文本
* @type {?}
*/
NpTooltipDirective.prototype.text;
/**
* 支持自定义模板ng-template展示提示文本
* @type {?}
*/
NpTooltipDirective.prototype.template;
/**
* 支持上、右、下、左、上左、上右、下左、下右8个方向展示提示文本,默认展示上方提示文本
* @type {?}
*/
NpTooltipDirective.prototype.position;
/**
* 提示文本背景色
* @type {?}
*/
NpTooltipDirective.prototype.bgColor;
/**
* 提示文本水平方向X轴位移
* @type {?}
*/
NpTooltipDirective.prototype.offsetX;
/**
* 提示文本垂直方向Y轴位移
* @type {?}
*/
NpTooltipDirective.prototype.offsetY;
/**
* 是否展示提示文本指向箭头,默认展示
* @type {?}
*/
NpTooltipDirective.prototype.showArrow;
/**
* 触发方式,默认为鼠标hover
* @type {?}
*/
NpTooltipDirective.prototype.trigger;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.overlayRef;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.withPositions;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.delayTimer;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.overlay;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.overlayPositionBuilder;
/**
* @type {?}
* @private
*/
NpTooltipDirective.prototype.elementRef;
/** @type {?} */
NpTooltipDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsVUFBVSxFQUFnQixLQUFLLEVBQVUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7TUFFMUMsTUFBTSxHQUFHLENBQUM7Ozs7OztBQVFoQixNQUFNLE9BQU8sa0JBQWtCOzs7Ozs7O0lBOEIzQixZQUFvQixPQUFnQixFQUN4QixzQkFBOEMsRUFDOUMsVUFBc0IsRUFDdkIsUUFBbUI7UUFIVixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ3hCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFXOzs7O1FBOUJWLFNBQUksR0FBRyxFQUFFLENBQUM7Ozs7UUFJckIsYUFBUSxHQUFzQixLQUFLLENBQUM7Ozs7UUFFcEMsWUFBTyxHQUFXLHVCQUF1QixDQUFDOzs7O1FBRTFDLFlBQU8sR0FBVyxJQUFJLENBQUM7Ozs7UUFFdkIsWUFBTyxHQUFXLElBQUksQ0FBQzs7OztRQUV2QixjQUFTLEdBQVksSUFBSSxDQUFDOzs7O1FBRTFCLFlBQU8sR0FBc0IsT0FBTyxDQUFDO1FBR3RDLGtCQUFhLEdBQVE7WUFDekIsT0FBTyxFQUFFLFFBQVE7WUFDakIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZ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QUNBLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7OztZQW5QSixTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFOzs7O1lBWDdCLE9BQU87WUFBRSxzQkFBc0I7WUFETixVQUFVO1lBQStCLFNBQVM7OzttQkFnQi9FLEtBQUssU0FBQyxXQUFXO3VCQUVqQixLQUFLO3VCQUVMLEtBQUs7c0JBRUwsS0FBSztzQkFFTCxLQUFLO3NCQUVMLEtBQUs7d0JBRUwsS0FBSztzQkFFTCxLQUFLOzs7Ozs7O0lBZE4sa0NBQThCOzs7OztJQUU5QixzQ0FBb0M7Ozs7O0lBRXBDLHNDQUE2Qzs7Ozs7SUFFN0MscUNBQW1EOzs7OztJQUVuRCxxQ0FBZ0M7Ozs7O0lBRWhDLHFDQUFnQzs7Ozs7SUFFaEMsdUNBQW1DOzs7OztJQUVuQyxxQ0FBOEM7Ozs7O0lBRTlDLHdDQUErQjs7Ozs7SUFDL0IsMkNBT0U7Ozs7O0lBQ0Ysd0NBQW1COzs7OztJQUVQLHFDQUF3Qjs7Ozs7SUFDaEMsb0RBQXNEOzs7OztJQUN0RCx3Q0FBOEI7O0lBQzlCLHNDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIFJlbmRlcmVyMiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVBvc2l0aW9uQnVpbGRlciwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IE5wVG9vbHRpcCB9IGZyb20gJy4vdG9vbHRpcC5jb21wb25lbnQnO1xyXG5cclxuY29uc3QgT0ZGU0VUID0gNDtcclxuXHJcbi8qKlxyXG4qIFRvb2x0aXDmj5DnpLrmlofmnKxcclxuKiBcclxuKiA8ZXhhbXBsZS11cmw+aHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L25wLXRvb2x0aXAtc2FtcGxlP2VtYmVkPTEmZmlsZT1zcmMvYXBwL2FwcC5jb21wb25lbnQuaHRtbDwvZXhhbXBsZS11cmw+XHJcbiovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tucFRvb2x0aXBdJyB9KVxyXG5leHBvcnQgY2xhc3MgTnBUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICAvKirmmL7npLrmj5DnpLrmlofmnKwgKi9cclxuICAgIEBJbnB1dCgnbnBUb29sdGlwJykgdGV4dCA9ICcnO1xyXG4gICAgLyoq5pSv5oyB6Ieq5a6a5LmJ5qih5p2/bmctdGVtcGxhdGXlsZXnpLrmj5DnpLrmlofmnKwgKi9cclxuICAgIEBJbnB1dCgpIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgLyoq5pSv5oyB5LiK44CB5Y+z44CB5LiL44CB5bem44CB5LiK5bem44CB5LiK5Y+z44CB5LiL5bem44CB5LiL5Y+zOOS4quaWueWQkeWxleekuuaPkOekuuaWh+acrO+8jOm7mOiupOWxleekuuS4iuaWueaPkOekuuaWh+acrCAqL1xyXG4gICAgQElucHV0KCkgcG9zaXRpb246IE5wVG9vbHRpcFBvc2l0aW9uID0gJ3RvcCc7XHJcbiAgICAvKirmj5DnpLrmlofmnKzog4zmma/oibIgKi9cclxuICAgIEBJbnB1dCgpIGJnQ29sb3I6IHN0cmluZyA9ICdyZ2JhKDczLCA4OSwgMTA2LCAuNyknO1xyXG4gICAgLyoq5o+Q56S65paH5pys5rC05bmz5pa55ZCRWOi9tOS9jeenuyAqL1xyXG4gICAgQElucHV0KCkgb2Zmc2V0WDogbnVtYmVyID0gbnVsbDtcclxuICAgIC8qKuaPkOekuuaWh+acrOWeguebtOaWueWQkVnovbTkvY3np7sgKi9cclxuICAgIEBJbnB1dCgpIG9mZnNldFk6IG51bWJlciA9IG51bGw7XHJcbiAgICAvKirmmK/lkKblsZXnpLrmj5DnpLrmlofmnKzmjIflkJHnrq3lpLTvvIzpu5jorqTlsZXnpLogKi9cclxuICAgIEBJbnB1dCgpIHNob3dBcnJvdzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvKirop6blj5HmlrnlvI/vvIzpu5jorqTkuLrpvKDmoIdob3ZlciAqL1xyXG4gICAgQElucHV0KCkgdHJpZ2dlcjogJ2hvdmVyJyB8ICdjbGljaycgPSAnaG92ZXInO1xyXG5cclxuICAgIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZjtcclxuICAgIHByaXZhdGUgd2l0aFBvc2l0aW9uczogYW55ID0ge1xyXG4gICAgICAgIG9yaWdpblg6ICdjZW50ZXInLFxyXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcclxuICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXHJcbiAgICAgICAgb2Zmc2V0WDogMCxcclxuICAgICAgICBvZmZzZXRZOiAtMiAqIE9GRlNFVFxyXG4gICAgfTtcclxuICAgIHByaXZhdGUgZGVsYXlUaW1lcjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXHJcbiAgICAgICAgcHJpdmF0ZSBvdmVybGF5UG9zaXRpb25CdWlsZGVyOiBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdFdpdGhQb3NpdGlvbnMoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVBvc2l0aW9uQnVpbGRlclxyXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLmVsZW1lbnRSZWYpXHJcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFt0aGlzLndpdGhQb3NpdGlvbnNdKTtcclxuXHJcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7IHBvc2l0aW9uU3RyYXRlZ3ksIGhhc0JhY2tkcm9wOiB0aGlzLnRyaWdnZXIgPT09ICdjbGljaycgfSk7XHJcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIGxldCBvdmVybGF5RWxlbWVudDtcclxuICAgICAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnaG92ZXInKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicsICgpID0+IHRoaXMuZGVsYXlFbnRlckxlYXZlKHRydWUsIHRydWUsIDAuMTUpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheUVudGVyTGVhdmUodHJ1ZSwgZmFsc2UsIDAuMSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmICYmICFvdmVybGF5RWxlbWVudCkgeyAvLyBOT1RFOiB3ZSBiaW5kIGV2ZW50cyB1bmRlciBcIm1vdXNlbGVhdmVcIiBkdWUgdG8gdGhlIG92ZXJsYXlSZWYgaXMgb25seSBjcmVhdGVkIGFmdGVyIHRoZSBvdmVybGF5IHdhcyBjb21wbGV0ZWx5IHNob3duIHVwXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4ob3ZlcmxheUVsZW1lbnQsICdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy5kZWxheUVudGVyTGVhdmUoZmFsc2UsIHRydWUpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihvdmVybGF5RWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLmRlbGF5RW50ZXJMZWF2ZShmYWxzZSwgZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyaWdnZXIgPT09ICdjbGljaycpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFdpdGhQb3NpdGlvbnMoKSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFggPT09IG51bGwgPyAwIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IC0yICogT0ZGU0VUIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gMiAqIE9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAwIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFggPT09IG51bGwgPyAwIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IC0yICogT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDAgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAndG9wTGVmdCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IE9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAtMiAqIE9GRlNFVCA6IHRoaXMub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd0b3BSaWdodCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IC1PRkZTRVQgOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZID09PSBudWxsID8gLTIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tTGVmdCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IE9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAyICogT0ZGU0VUIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gLU9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAyICogT0ZGU0VUIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSAndG9wJykge1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhcnJvdy1ib3R0b20nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEFycm93KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5vdmVybGF5UmVmIHx8ICF0aGlzLm92ZXJsYXlSZWYuaG9zdEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGFycm93UG9zaXRpb246IHN0cmluZztcclxuICAgICAgICBzd2l0Y2ggKHRoaXMucG9zaXRpb24pIHtcclxuICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctYm90dG9tJ1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctbGVmdCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy10b3AnXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LXJpZ2h0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RvcExlZnQnOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy1ib3R0b21SaWdodCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd0b3BSaWdodCc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LWJvdHRvbUxlZnQnXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tTGVmdCc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LXRvcFJpZ2h0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctdG9wTGVmdCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdG9vbHRpcFRhZyA9IHRoaXMub3ZlcmxheVJlZi5ob3N0RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbnAtdG9vbHRpcCcpWzBdO1xyXG4gICAgICAgIGlmICh0b29sdGlwVGFnKSB7XHJcbiAgICAgICAgICAgIHRvb2x0aXBUYWcuY2xhc3NMaXN0LmFkZChhcnJvd1Bvc2l0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWxheUVudGVyTGVhdmUoaXNPcmlnaW46IGJvb2xlYW4sIGlzRW50ZXI6IGJvb2xlYW4sIGRlbGF5OiBudW1iZXIgPSAtMSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmRlbGF5VGltZXIpIHsgLy8gQ2xlYXIgdGltZXIgZHVyaW5nIHRoZSBkZWxheSB0aW1lXHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5kZWxheVRpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5kZWxheVRpbWVyID0gbnVsbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGF5VGltZXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaXNFbnRlciA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH0sIGRlbGF5ICogMTAwMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXNFbnRlciAmJiBpc09yaWdpbiA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7IC8vIFtDb21wYXRpYmxlXSBUaGUgXCJpc09yaWdpblwiIGlzIHVzZWQgZHVlIHRvIHRoZSB0b29sdGlwIHdpbGwgbm90IGhpZGUgaW1tZWRpYXRlbHkgKG1heSBjYXVzZWQgYnkgdGhlIGZhZGUtb3V0IGFuaW1hdGlvbilcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpIHtcclxuICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdG9vbHRpcFJlZjogQ29tcG9uZW50UmVmPE5wVG9vbHRpcD5cclxuICAgICAgICAgICAgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTnBUb29sdGlwKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRleHQpIHtcclxuICAgICAgICAgICAgdG9vbHRpcFJlZi5pbnN0YW5jZS50ZXh0ID0gdGhpcy50ZXh0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdG9vbHRpcFJlZi5pbnN0YW5jZS50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0b29sdGlwUmVmLmluc3RhbmNlLmJnQ29sb3IgPSB0aGlzLmJnQ29sb3I7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBcnJvdykge1xyXG4gICAgICAgICAgICB0aGlzLmJ1aWxkQXJyb3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE5wVG9vbHRpcFBvc2l0aW9uID0gJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAndG9wTGVmdCcgfCAndG9wUmlnaHQnIHwgJ2JvdHRvbUxlZnQnIHwgJ2JvdHRvbVJpZ2h0JzsiXX0=