@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
227 lines • 28.3 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Directive, Inject, Input, TemplateRef, } from '@angular/core';
import { arrow, autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';
import { ReplaySubject, delay, fromEvent, iif, merge, of, switchMap, takeUntil } from 'rxjs';
import * as i0 from "@angular/core";
export class DokuTooltip {
constructor(renderer, document, ngZone, elementRef, appRef) {
this.renderer = renderer;
this.document = document;
this.ngZone = ngZone;
this.elementRef = elementRef;
this.appRef = appRef;
/**
* Content of the tooltip.
* It can be a string or a template for more customization.
*
* @default ''
*/
this.content = '';
/**
* The color of the tooltip.
* Either `dark` or `light`.
* @default 'dark'
*/
this.color = 'dark';
/**
* The placement of the tooltip.
* @default 'top'
*/
this.placement = 'top';
/**
* Whether tooltip should stay when hovering on its element.
* @default false
*/
this.stayOnHover = false;
/**
* Whether to disable the tooltip.
* Disabled tooltip can't be opened.
* @default false
*/
this.disabled = false;
this.isShown = false;
this.destroy$ = new ReplaySubject();
}
get classes() {
return ['d-tooltip', 'd-text-body-s', `d-tooltip-${this.color}`];
}
ngOnInit() {
this.handleEventsShow();
this.handleEventsHide();
this.tooltipElement = this.createTooltipElement();
}
ngOnDestroy() {
this.destroy$.next(1);
this.destroy$.complete();
this.hide();
this.tooltipElement = undefined;
this.tooltipContentElement = undefined;
this.tooltipArrowElement = undefined;
}
/**
* Show tooltip programmatically.
*/
show() {
if (this.disabled)
return;
if (this.isShown || !this.tooltipElement)
return;
this.isShown = true;
this.setTooltipContent(this.content);
this.document.body.appendChild(this.tooltipElement);
this.doAutoUpdatePosition();
}
/**
* Hide tooltip programmatically.
*/
hide() {
if (!this.isShown || !this.tooltipElement)
return;
this.isShown = false;
this.document.body.removeChild(this.tooltipElement);
this.cleanup?.();
this.viewRef?.destroy();
this.elementRef.nativeElement.blur();
}
/**
* Toggle tooltip programmatically.
*/
toggle() {
this.isShown ? this.hide() : this.show();
}
/**
* Update the content of the tooltip with new one.
*/
updateContent(content) {
this.setTooltipContent(content);
}
createTooltipElement() {
const element = this.renderer.createElement('div');
element.className = this.classes.join(' ');
this.tooltipContentElement = this.createTooltipContentElement();
element.appendChild(this.tooltipContentElement);
this.tooltipArrowElement = this.createArrowElement();
element.appendChild(this.tooltipArrowElement);
return element;
}
createTooltipContentElement() {
return this.renderer.createElement('div');
}
createArrowElement() {
const element = this.renderer.createElement('div');
element.className = 'd-tooltip-arrow';
return element;
}
setTooltipContent(content) {
if (!this.tooltipContentElement)
return;
this.tooltipContentElement.replaceChildren();
if (content instanceof TemplateRef) {
this.viewRef?.destroy();
this.viewRef = content.createEmbeddedView({});
this.appRef.attachView(this.viewRef);
this.tooltipContentElement.append(...this.viewRef.rootNodes);
this.viewRef.detectChanges();
}
if (typeof content === 'string') {
this.tooltipContentElement.appendChild(this.document.createTextNode(content));
}
}
updatePosition() {
if (!this.elementRef.nativeElement || !this.tooltipElement || !this.tooltipArrowElement)
return;
computePosition(this.elementRef.nativeElement, this.tooltipElement, {
placement: this.placement,
middleware: [
offset(6),
flip(),
shift({ padding: 8 }),
arrow({ element: this.tooltipArrowElement }),
],
}).then(({ x, y, placement, middlewareData }) => {
if (!this.tooltipElement)
return;
Object.assign(this.tooltipElement.style, { top: `${y}px`, left: `${x}px` });
// Positioning the arrow element
if (middlewareData.arrow && this.tooltipArrowElement) {
const { x: arrowX, y: arrowY } = middlewareData.arrow;
const staticSide = {
top: 'bottom',
right: 'left',
bottom: 'top',
left: 'right',
}[placement.split('-')[0]];
Object.assign(this.tooltipArrowElement.style, {
left: arrowX != null || arrowX != undefined ? `${arrowX}px` : '',
top: arrowY != null || arrowY != undefined ? `${arrowY}px` : '',
right: '',
bottom: '',
[staticSide]: '-4px',
});
}
});
}
doAutoUpdatePosition() {
this.ngZone.runOutsideAngular(() => {
if (!this.elementRef.nativeElement || !this.tooltipElement)
return;
this.cleanup = autoUpdate(this.elementRef.nativeElement, this.tooltipElement, () => {
this.updatePosition();
});
});
}
handleEventsShow() {
this.ngZone.runOutsideAngular(() => {
merge(fromEvent(this.elementRef.nativeElement, 'mouseenter'), fromEvent(this.elementRef.nativeElement, 'focus'))
.pipe(takeUntil(this.destroy$))
.subscribe(() => {
this.show();
});
});
}
handleEventsHide() {
this.ngZone.runOutsideAngular(() => {
merge(fromEvent(this.elementRef.nativeElement, 'mouseleave'), fromEvent(this.elementRef.nativeElement, 'blur'))
.pipe(switchMap((event) => this.stayOnHover ? this.handleHoveringTooltipElement(event) : of(event)), takeUntil(this.destroy$))
.subscribe(() => {
this.hide();
});
});
}
handleHoveringTooltipElement(event) {
if (!this.tooltipElement)
return of(event);
return of(event).pipe(delay(50), switchMap(() => iif(() => !!this.tooltipElement?.matches(':hover'),
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
fromEvent(this.tooltipElement, 'mouseleave'), of(event))));
}
}
DokuTooltip.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTooltip, deps: [{ token: i0.Renderer2 }, { token: DOCUMENT }, { token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Directive });
DokuTooltip.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: DokuTooltip, isStandalone: true, selector: "[doku-tooltip]", inputs: { content: ["doku-tooltip", "content"], color: ["tooltipColor", "color"], placement: ["tooltipPlacement", "placement"], stayOnHover: ["tooltipStayOnHover", "stayOnHover"], disabled: ["tooltipDisabled", "disabled"] }, exportAs: ["dokuTooltip"], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTooltip, decorators: [{
type: Directive,
args: [{
selector: '[doku-tooltip]',
exportAs: 'dokuTooltip',
standalone: true,
}]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ApplicationRef }]; }, propDecorators: { content: [{
type: Input,
args: ['doku-tooltip']
}], color: [{
type: Input,
args: ['tooltipColor']
}], placement: [{
type: Input,
args: ['tooltipPlacement']
}], stayOnHover: [{
type: Input,
args: ['tooltipStayOnHover']
}], disabled: [{
type: Input,
args: ['tooltipDisabled']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLFNBQVMsRUFHVCxNQUFNLEVBQ04sS0FBSyxFQUtMLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFRN0YsTUFBTSxPQUFPLFdBQVc7SUE2Q3RCLFlBQ1UsUUFBbUIsRUFDRCxRQUFrQixFQUNwQyxNQUFjLEVBQ2QsVUFBc0IsRUFDdEIsTUFBc0I7UUFKdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNELGFBQVEsR0FBUixRQUFRLENBQVU7UUFDcEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFqRGhDOzs7OztXQUtHO1FBQ29CLFlBQU8sR0FBa0MsRUFBRSxDQUFDO1FBRW5FOzs7O1dBSUc7UUFDb0IsVUFBSyxHQUFxQixNQUFNLENBQUM7UUFFeEQ7OztXQUdHO1FBQ3dCLGNBQVMsR0FBeUIsS0FBSyxDQUFDO1FBRW5FOzs7V0FHRztRQUMwQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVqRDs7OztXQUlHO1FBQ3VCLGFBQVEsR0FBRyxL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QUM5QyxvRUFBb0U7UUFDcEUsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFlLEVBQUUsWUFBWSxDQUFDLEVBQzdDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FDVixDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7O3dHQS9PVSxXQUFXLDJDQStDWixRQUFROzRGQS9DUCxXQUFXOzJGQUFYLFdBQVc7a0JBTHZCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBZ0RJLE1BQU07MkJBQUMsUUFBUTt1SEF4Q0ssT0FBTztzQkFBN0IsS0FBSzt1QkFBQyxjQUFjO2dCQU9FLEtBQUs7c0JBQTNCLEtBQUs7dUJBQUMsY0FBYztnQkFNTSxTQUFTO3NCQUFuQyxLQUFLO3VCQUFDLGtCQUFrQjtnQkFNSSxXQUFXO3NCQUF2QyxLQUFLO3VCQUFDLG9CQUFvQjtnQkFPRCxRQUFRO3NCQUFqQyxLQUFLO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEVtYmVkZGVkVmlld1JlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgUmVuZGVyZXIyLFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhcnJvdywgYXV0b1VwZGF0ZSwgY29tcHV0ZVBvc2l0aW9uLCBmbGlwLCBvZmZzZXQsIHNoaWZ0IH0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBkZWxheSwgZnJvbUV2ZW50LCBpaWYsIG1lcmdlLCBvZiwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERva3VUb29sdGlwUGxhY2VtZW50IH0gZnJvbSAnLi90b29sdGlwLmludGVyZmFjZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkb2t1LXRvb2x0aXBdJyxcbiAgZXhwb3J0QXM6ICdkb2t1VG9vbHRpcCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIERva3VUb29sdGlwIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogQ29udGVudCBvZiB0aGUgdG9vbHRpcC5cbiAgICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgdGVtcGxhdGUgZm9yIG1vcmUgY3VzdG9taXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgnZG9rdS10b29sdGlwJykgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj4gPSAnJztcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSB0b29sdGlwLlxuICAgKiBFaXRoZXIgYGRhcmtgIG9yIGBsaWdodGAuXG4gICAqIEBkZWZhdWx0ICdkYXJrJ1xuICAgKi9cbiAgQElucHV0KCd0b29sdGlwQ29sb3InKSBjb2xvcjogJ2RhcmsnIHwgJ2xpZ2h0JyA9ICdkYXJrJztcblxuICAvKipcbiAgICogVGhlIHBsYWNlbWVudCBvZiB0aGUgdG9vbHRpcC5cbiAgICogQGRlZmF1bHQgJ3RvcCdcbiAgICovXG4gIEBJbnB1dCgndG9vbHRpcFBsYWNlbWVudCcpIHBsYWNlbWVudDogRG9rdVRvb2x0aXBQbGFjZW1lbnQgPSAndG9wJztcblxuICAvKipcbiAgICogV2hldGhlciB0b29sdGlwIHNob3VsZCBzdGF5IHdoZW4gaG92ZXJpbmcgb24gaXRzIGVsZW1lbnQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ3Rvb2x0aXBTdGF5T25Ib3ZlcicpIHN0YXlPbkhvdmVyID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgdG9vbHRpcC5cbiAgICogRGlzYWJsZWQgdG9vbHRpcCBjYW4ndCBiZSBvcGVuZWQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ3Rvb2x0aXBEaXNhYmxlZCcpIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBpc1Nob3duID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSB0b29sdGlwRWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHRvb2x0aXBDb250ZW50RWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHRvb2x0aXBBcnJvd0VsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSB2aWV3UmVmPzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXG4gIHByaXZhdGUgY2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWZcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBnZXQgY2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsnZC10b29sdGlwJywgJ2QtdGV4dC1ib2R5LXMnLCBgZC10b29sdGlwLSR7dGhpcy5jb2xvcn1gXTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlRXZlbnRzU2hvdygpO1xuICAgIHRoaXMuaGFuZGxlRXZlbnRzSGlkZSgpO1xuXG4gICAgdGhpcy50b29sdGlwRWxlbWVudCA9IHRoaXMuY3JlYXRlVG9vbHRpcEVsZW1lbnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgxKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5oaWRlKCk7XG4gICAgdGhpcy50b29sdGlwRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRvb2x0aXBDb250ZW50RWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRvb2x0aXBBcnJvd0VsZW1lbnQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB0b29sdGlwIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqL1xuICBzaG93KCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNTaG93biB8fCAhdGhpcy50b29sdGlwRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTaG93biA9IHRydWU7XG4gICAgdGhpcy5zZXRUb29sdGlwQ29udGVudCh0aGlzLmNvbnRlbnQpO1xuICAgIHRoaXMuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBFbGVtZW50KTtcbiAgICB0aGlzLmRvQXV0b1VwZGF0ZVBvc2l0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0b29sdGlwIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqL1xuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5pc1Nob3duIHx8ICF0aGlzLnRvb2x0aXBFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5pc1Nob3duID0gZmFsc2U7XG4gICAgdGhpcy5kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRoaXMudG9vbHRpcEVsZW1lbnQpO1xuICAgIHRoaXMuY2xlYW51cD8uKCk7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0b29sdGlwIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqL1xuICB0b2dnbGUoKSB7XG4gICAgdGhpcy5pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIHRvb2x0aXAgd2l0aCBuZXcgb25lLlxuICAgKi9cbiAgdXBkYXRlQ29udGVudChjb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx1bmtub3duPikge1xuICAgIHRoaXMuc2V0VG9vbHRpcENvbnRlbnQoY29udGVudCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRvb2x0aXBFbGVtZW50KCkge1xuICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuY2xhc3Nlcy5qb2luKCcgJyk7XG5cbiAgICB0aGlzLnRvb2x0aXBDb250ZW50RWxlbWVudCA9IHRoaXMuY3JlYXRlVG9vbHRpcENvbnRlbnRFbGVtZW50KCk7XG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBDb250ZW50RWxlbWVudCk7XG5cbiAgICB0aGlzLnRvb2x0aXBBcnJvd0VsZW1lbnQgPSB0aGlzLmNyZWF0ZUFycm93RWxlbWVudCgpO1xuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwQXJyb3dFbGVtZW50KTtcblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sdGlwQ29udGVudEVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2JykgYXMgSFRNTERpdkVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFycm93RWxlbWVudCgpIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSAnZC10b29sdGlwLWFycm93JztcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VG9vbHRpcENvbnRlbnQoY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj4pIHtcbiAgICBpZiAoIXRoaXMudG9vbHRpcENvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy50b29sdGlwQ29udGVudEVsZW1lbnQucmVwbGFjZUNoaWxkcmVuKCk7XG5cbiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XG4gICAgICB0aGlzLnZpZXdSZWY/LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudmlld1JlZiA9IGNvbnRlbnQuY3JlYXRlRW1iZWRkZWRWaWV3KHt9KTtcbiAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy52aWV3UmVmKTtcbiAgICAgIHRoaXMudG9vbHRpcENvbnRlbnRFbGVtZW50LmFwcGVuZCguLi50aGlzLnZpZXdSZWYucm9vdE5vZGVzKTtcbiAgICAgIHRoaXMudmlld1JlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy50b29sdGlwQ29udGVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQb3NpdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IHx8ICF0aGlzLnRvb2x0aXBFbGVtZW50IHx8ICF0aGlzLnRvb2x0aXBBcnJvd0VsZW1lbnQpIHJldHVybjtcbiAgICBjb21wdXRlUG9zaXRpb24odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMudG9vbHRpcEVsZW1lbnQsIHtcbiAgICAgIHBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnQsXG4gICAgICBtaWRkbGV3YXJlOiBbXG4gICAgICAgIG9mZnNldCg2KSxcbiAgICAgICAgZmxpcCgpLFxuICAgICAgICBzaGlmdCh7IHBhZGRpbmc6IDggfSksXG4gICAgICAgIGFycm93KHsgZWxlbWVudDogdGhpcy50b29sdGlwQXJyb3dFbGVtZW50IH0pLFxuICAgICAgXSxcbiAgICB9KS50aGVuKCh7IHgsIHksIHBsYWNlbWVudCwgbWlkZGxld2FyZURhdGEgfSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnRvb2x0aXBFbGVtZW50KSByZXR1cm47XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMudG9vbHRpcEVsZW1lbnQuc3R5bGUsIHsgdG9wOiBgJHt5fXB4YCwgbGVmdDogYCR7eH1weGAgfSk7XG5cbiAgICAgIC8vIFBvc2l0aW9uaW5nIHRoZSBhcnJvdyBlbGVtZW50XG4gICAgICBpZiAobWlkZGxld2FyZURhdGEuYXJyb3cgJiYgdGhpcy50b29sdGlwQXJyb3dFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgeDogYXJyb3dYLCB5OiBhcnJvd1kgfSA9IG1pZGRsZXdhcmVEYXRhLmFycm93O1xuICAgICAgICBjb25zdCBzdGF0aWNTaWRlID0ge1xuICAgICAgICAgIHRvcDogJ2JvdHRvbScsXG4gICAgICAgICAgcmlnaHQ6ICdsZWZ0JyxcbiAgICAgICAgICBib3R0b206ICd0b3AnLFxuICAgICAgICAgIGxlZnQ6ICdyaWdodCcsXG4gICAgICAgIH1bcGxhY2VtZW50LnNwbGl0KCctJylbMF1dIGFzIHN0cmluZztcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMudG9vbHRpcEFycm93RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgIGxlZnQ6IGFycm93WCAhPSBudWxsIHx8IGFycm93WCAhPSB1bmRlZmluZWQgPyBgJHthcnJvd1h9cHhgIDogJycsXG4gICAgICAgICAgdG9wOiBhcnJvd1kgIT0gbnVsbCB8fCBhcnJvd1kgIT0gdW5kZWZpbmVkID8gYCR7YXJyb3dZfXB4YCA6ICcnLFxuICAgICAgICAgIHJpZ2h0OiAnJyxcbiAgICAgICAgICBib3R0b206ICcnLFxuICAgICAgICAgIFtzdGF0aWNTaWRlXTogJy00cHgnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZG9BdXRvVXBkYXRlUG9zaXRpb24oKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCB8fCAhdGhpcy50b29sdGlwRWxlbWVudCkgcmV0dXJuO1xuICAgICAgdGhpcy5jbGVhbnVwID0gYXV0b1VwZGF0ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy50b29sdGlwRWxlbWVudCwgKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXZlbnRzU2hvdygpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBtZXJnZShcbiAgICAgICAgZnJvbUV2ZW50KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50LCAnbW91c2VlbnRlcicpLFxuICAgICAgICBmcm9tRXZlbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsICdmb2N1cycpXG4gICAgICApXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFdmVudHNIaWRlKCkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIG1lcmdlKFxuICAgICAgICBmcm9tRXZlbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsICdtb3VzZWxlYXZlJyksXG4gICAgICAgIGZyb21FdmVudCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCwgJ2JsdXInKVxuICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgdGhpcy5zdGF5T25Ib3ZlciA/IHRoaXMuaGFuZGxlSG92ZXJpbmdUb29sdGlwRWxlbWVudChldmVudCkgOiBvZihldmVudClcbiAgICAgICAgICApLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSG92ZXJpbmdUb29sdGlwRWxlbWVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMudG9vbHRpcEVsZW1lbnQpIHJldHVybiBvZihldmVudCk7XG4gICAgcmV0dXJuIG9mKGV2ZW50KS5waXBlKFxuICAgICAgZGVsYXkoNTApLFxuICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgIGlpZihcbiAgICAgICAgICAoKSA9PiAhIXRoaXMudG9vbHRpcEVsZW1lbnQ/Lm1hdGNoZXMoJzpob3ZlcicpLFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgZnJvbUV2ZW50KHRoaXMudG9vbHRpcEVsZW1lbnQhLCAnbW91c2VsZWF2ZScpLFxuICAgICAgICAgIG9mKGV2ZW50KVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuIl19