UNPKG

ngy-tutorial

Version:
269 lines (268 loc) 28.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild, ElementRef, Inject } from '@angular/core'; import { trigger, transition, animate, keyframes, style, query } from '@angular/animations'; import { PromptComponent } from '../prompt/prompt.component'; import { DOCUMENT } from '@angular/common'; import { NgyTutorialService } from '../ngy-tutorial.service'; export class NgyTutorialComponent { /** * @param {?} svc * @param {?} document */ constructor(svc, document) { this.svc = svc; this.document = document; this.enabled = false; this.steps = []; this.currentStep = 0; this.svc.toShow.subscribe(stps => { this.steps = stps; this.currentStep = 0; if (this.steps.length) { this.enabled = true; setTimeout(() => { this.setupUIForStep(); }); } else { this.enabled = false; } }); this.svc.currentStep.subscribe(step => { this.currentStep = step; if (this.currentStep >= this.steps.length || this.currentStep < 0) { this.svc.hideTutorial(); } if (this.enabled) { setTimeout(() => { this.setupUIForStep(); }); } }); } /** * @return {?} */ ngOnInit() { } /** * @private * @return {?} */ setupUIForStep() { /** @type {?} */ const step = this.steps[this.currentStep]; if (step) { this.resetCovers(); this.prompt.ngOnInit(); if (!step.options.relatedElement) { this.coverAll(); } else { /** @type {?} */ const elem = this.document.body.querySelector(`#${step.options.relatedElement}`); if (elem) { this.coverShowElement(elem); this.prompt.setPromptForElement(elem, step.options.placement); if (step.options.disableInteraction) { this.coverElement(elem); } } else { this.coverAll(); } } } } /** * @private * @param {?} element * @return {?} */ coverElement(element) { /** @type {?} */ const positionInfo = element.getBoundingClientRect(); /** @type {?} */ const margin = 10; this.setPosition(this.elementCover.nativeElement, positionInfo.left - margin, positionInfo.top - margin, positionInfo.width + 2 * margin, positionInfo.height + 2 * margin); } /** * @private * @return {?} */ coverAll() { if (this.topCover) { this.topCover.nativeElement.style.left = '0'; this.topCover.nativeElement.style.top = '0'; this.topCover.nativeElement.style.height = '100vh'; this.prompt.setPromptForElement(); } } /** * @private * @param {?} element * @return {?} */ coverShowElement(element) { /** @type {?} */ const positionInfo = element.getBoundingClientRect(); /** @type {?} */ const margin = 10; /** @type {?} */ const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); /** @type {?} */ const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); this.setPosition(this.topCover.nativeElement, 0, 0, viewW, positionInfo.top - margin); this.setPosition(this.leftCover.nativeElement, 0, positionInfo.top - margin, positionInfo.left - margin, positionInfo.height + 2 * margin); this.setPosition(this.rightCover.nativeElement, positionInfo.left + positionInfo.width + margin, positionInfo.top - margin, viewW - positionInfo.left - positionInfo.width - margin, positionInfo.height + 2 * margin); this.setPosition(this.bottomCover.nativeElement, 0, positionInfo.top + positionInfo.height + margin, viewW, viewH - positionInfo.top - positionInfo.height - margin); } /** * @private * @param {?} element * @param {?} left * @param {?} top * @param {?} width * @param {?} height * @return {?} */ setPosition(element, left, top, width, height) { element.style.left = `${left}px`; element.style.top = `${top}px`; element.style.width = `${width}px`; element.style.height = `${height}px`; } /** * @private * @return {?} */ resetCovers() { if (this.topCover) { this.topCover.nativeElement.style.removeProperty('height'); this.topCover.nativeElement.style.removeProperty('width'); this.topCover.nativeElement.style.removeProperty('top'); this.topCover.nativeElement.style.removeProperty('left'); } if (this.leftCover) { this.leftCover.nativeElement.style.removeProperty('height'); this.leftCover.nativeElement.style.removeProperty('width'); this.leftCover.nativeElement.style.removeProperty('top'); this.leftCover.nativeElement.style.removeProperty('left'); } if (this.rightCover) { this.rightCover.nativeElement.style.removeProperty('height'); this.rightCover.nativeElement.style.removeProperty('width'); this.rightCover.nativeElement.style.removeProperty('top'); this.rightCover.nativeElement.style.removeProperty('left'); } if (this.bottomCover) { this.bottomCover.nativeElement.style.removeProperty('height'); this.bottomCover.nativeElement.style.removeProperty('width'); this.bottomCover.nativeElement.style.removeProperty('top'); this.bottomCover.nativeElement.style.removeProperty('left'); } if (this.elementCover) { this.elementCover.nativeElement.style.removeProperty('height'); this.elementCover.nativeElement.style.removeProperty('width'); this.elementCover.nativeElement.style.removeProperty('top'); this.elementCover.nativeElement.style.removeProperty('left'); } } } NgyTutorialComponent.decorators = [ { type: Component, args: [{ selector: 'lib-ngy-tutorial', template: `<lib-ngy-tutorial-prompt *ngIf="enabled" @fadeAnimation [step]="steps[currentStep]" [stepNumber]="currentStep" [totalSteps]="steps.length" #prompt></lib-ngy-tutorial-prompt> <div class="window-cover full-width" #topCover *ngIf="enabled" @fadeAnimation> </div> <div class="window-cover" #leftCover *ngIf="enabled" @fadeAnimation> </div> <div class="window-cover" #rightCover *ngIf="enabled" @fadeAnimation> </div> <div class="window-cover full-width" #bottomCover *ngIf="enabled" @fadeAnimation> </div> <div class="element-cover" #elementCover> </div>`, styles: [`:host{position:fixed;left:0;top:0;width:0;height:0}.window-cover{position:fixed;background:rgba(0,0,0,.8);z-index:998}.window-cover.full-width{width:100vw}.element-cover{position:fixed;z-index:998}lib-ngy-tutorial-prompt{top:0;left:0;position:fixed;z-index:999}`], animations: [ trigger('fadeAnimation', [ transition('void => *', [ query(':self', animate('0.3s ease-in-out', keyframes([ style({ opacity: 0 }), style({ opacity: 1 }), ])), { optional: true }), ]), transition('* => void', [ query(':self', animate('0.3s ease-in-out', keyframes([ style({ opacity: 1 }), style({ opacity: 0 }), ])), { optional: true }), ]), ]), ] },] }, ]; NgyTutorialComponent.ctorParameters = () => [ { type: NgyTutorialService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; NgyTutorialComponent.propDecorators = { topCover: [{ type: ViewChild, args: ['topCover',] }], leftCover: [{ type: ViewChild, args: ['leftCover',] }], rightCover: [{ type: ViewChild, args: ['rightCover',] }], bottomCover: [{ type: ViewChild, args: ['bottomCover',] }], elementCover: [{ type: ViewChild, args: ['elementCover',] }], prompt: [{ type: ViewChild, args: ['prompt',] }] }; if (false) { /** @type {?} */ NgyTutorialComponent.prototype.enabled; /** @type {?} */ NgyTutorialComponent.prototype.steps; /** @type {?} */ NgyTutorialComponent.prototype.currentStep; /** * @type {?} * @private */ NgyTutorialComponent.prototype.topCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.leftCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.rightCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.bottomCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.elementCover; /** * @type {?} * @private */ NgyTutorialComponent.prototype.prompt; /** * @type {?} * @private */ NgyTutorialComponent.prototype.svc; /** * @type {?} * @private */ NgyTutorialComponent.prototype.document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHV0b3JpYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd5LXR1dG9yaWFsLyIsInNvdXJjZXMiOlsibGliL3R1dG9yaWFsL3R1dG9yaWFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBb0M3RCxNQUFNOzs7OztJQVdKLFlBQ1UsR0FBdUIsRUFDTCxRQUFhO1FBRC9CLFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBQ0wsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQVh6QyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFVBQUssR0FBb0IsRUFBRSxDQUFDO1FBQzVCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBV2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsQ0FB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UUFBUTs7O3VCQVJqQixTQUFTLFNBQUMsVUFBVTt3QkFDcEIsU0FBUyxTQUFDLFdBQVc7eUJBQ3JCLFNBQVMsU0FBQyxZQUFZOzBCQUN0QixTQUFTLFNBQUMsYUFBYTsyQkFDdkIsU0FBUyxTQUFDLGNBQWM7cUJBQ3hCLFNBQVMsU0FBQyxRQUFROzs7O0lBUm5CLHVDQUFnQjs7SUFDaEIscUNBQTRCOztJQUM1QiwyQ0FBZ0I7Ozs7O0lBQ2hCLHdDQUFvRDs7Ozs7SUFDcEQseUNBQXNEOzs7OztJQUN0RCwwQ0FBd0Q7Ozs7O0lBQ3hELDJDQUEwRDs7Ozs7SUFDMUQsNENBQTREOzs7OztJQUM1RCxzQ0FBcUQ7Ozs7O0lBRW5ELG1DQUErQjs7Ozs7SUFDL0Isd0NBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0cmlnZ2VyLCB0cmFuc2l0aW9uLCBhbmltYXRlLCBrZXlmcmFtZXMsIHN0eWxlLCBxdWVyeSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgSVR1dG9yaWFsU3RlcCB9IGZyb20gJy4uL2FwaS9pLXR1dG9yaWFsLXN0ZXAnO1xuaW1wb3J0IHsgUHJvbXB0Q29tcG9uZW50IH0gZnJvbSAnLi4vcHJvbXB0L3Byb21wdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3RlcFByb21wdFBsYWNlbWVudCB9IGZyb20gJy4uL2FwaS9pLW9wdGlvbnMnO1xuaW1wb3J0IHsgTmd5VHV0b3JpYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbmd5LXR1dG9yaWFsLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbmd5LXR1dG9yaWFsJyxcbiAgdGVtcGxhdGU6IGA8bGliLW5neS10dXRvcmlhbC1wcm9tcHQgKm5nSWY9XCJlbmFibGVkXCIgQGZhZGVBbmltYXRpb24gW3N0ZXBdPVwic3RlcHNbY3VycmVudFN0ZXBdXCIgW3N0ZXBOdW1iZXJdPVwiY3VycmVudFN0ZXBcIiBbdG90YWxTdGVwc109XCJzdGVwcy5sZW5ndGhcIiAjcHJvbXB0PjwvbGliLW5neS10dXRvcmlhbC1wcm9tcHQ+XG48ZGl2IGNsYXNzPVwid2luZG93LWNvdmVyIGZ1bGwtd2lkdGhcIiAjdG9wQ292ZXIgKm5nSWY9XCJlbmFibGVkXCIgQGZhZGVBbmltYXRpb24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3aW5kb3ctY292ZXJcIiAjbGVmdENvdmVyICpuZ0lmPVwiZW5hYmxlZFwiIEBmYWRlQW5pbWF0aW9uPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwid2luZG93LWNvdmVyXCIgI3JpZ2h0Q292ZXIgKm5nSWY9XCJlbmFibGVkXCIgQGZhZGVBbmltYXRpb24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3aW5kb3ctY292ZXIgZnVsbC13aWR0aFwiICNib3R0b21Db3ZlciAqbmdJZj1cImVuYWJsZWRcIiBAZmFkZUFuaW1hdGlvbj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImVsZW1lbnQtY292ZXJcIiAjZWxlbWVudENvdmVyPlxuXG48L2Rpdj5gLFxuICBzdHlsZXM6IFtgOmhvc3R7cG9zaXRpb246Zml4ZWQ7bGVmdDowO3RvcDowO3dpZHRoOjA7aGVpZ2h0OjB9LndpbmRvdy1jb3Zlcntwb3NpdGlvbjpmaXhlZDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpO3otaW5kZXg6OTk4fS53aW5kb3ctY292ZXIuZnVsbC13aWR0aHt3aWR0aDoxMDB2d30uZWxlbWVudC1jb3Zlcntwb3NpdGlvbjpmaXhlZDt6LWluZGV4Ojk5OH1saWItbmd5LXR1dG9yaWFsLXByb21wdHt0b3A6MDtsZWZ0OjA7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDo5OTl9YF0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdmYWRlQW5pbWF0aW9uJywgW1xuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW1xuICAgICAgICBxdWVyeSgnOnNlbGYnLFxuICAgICAgICAgIGFuaW1hdGUoJzAuM3MgZWFzZS1pbi1vdXQnLCBrZXlmcmFtZXMoW1xuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAxIH0pLFxuICAgICAgICAgIF0pKSwgeyBvcHRpb25hbDogdHJ1ZSB9KSxcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW1xuICAgICAgICBxdWVyeSgnOnNlbGYnLFxuICAgICAgICAgIGFuaW1hdGUoJzAuM3MgZWFzZS1pbi1vdXQnLCBrZXlmcmFtZXMoW1xuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAxIH0pLFxuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxuICAgICAgICAgIF0pKSwgeyBvcHRpb25hbDogdHJ1ZSB9KSxcbiAgICAgIF0pLFxuICAgIF0pLFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neVR1dG9yaWFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBlbmFibGVkID0gZmFsc2U7XG4gIHN0ZXBzOiBJVHV0b3JpYWxTdGVwW10gPSBbXTtcbiAgY3VycmVudFN0ZXAgPSAwO1xuICBAVmlld0NoaWxkKCd0b3BDb3ZlcicpIHByaXZhdGUgdG9wQ292ZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2xlZnRDb3ZlcicpIHByaXZhdGUgbGVmdENvdmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdyaWdodENvdmVyJykgcHJpdmF0ZSByaWdodENvdmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdib3R0b21Db3ZlcicpIHByaXZhdGUgYm90dG9tQ292ZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2VsZW1lbnRDb3ZlcicpIHByaXZhdGUgZWxlbWVudENvdmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwcm9tcHQnKSBwcml2YXRlIHByb21wdDogUHJvbXB0Q29tcG9uZW50O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN2YzogTmd5VHV0b3JpYWxTZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgKSB7XG4gICAgdGhpcy5zdmMudG9TaG93LnN1YnNjcmliZShzdHBzID0+IHtcbiAgICAgIHRoaXMuc3RlcHMgPSBzdHBzO1xuICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IDA7XG4gICAgICBpZiAodGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR1cFVJRm9yU3RlcCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc3ZjLmN1cnJlbnRTdGVwLnN1YnNjcmliZShzdGVwID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBzdGVwO1xuICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPj0gdGhpcy5zdGVwcy5sZW5ndGggfHwgdGhpcy5jdXJyZW50U3RlcCA8IDApIHtcbiAgICAgICAgdGhpcy5zdmMuaGlkZVR1dG9yaWFsKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dXBVSUZvclN0ZXAoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFVJRm9yU3RlcCgpIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwXTtcbiAgICBpZiAoc3RlcCkge1xuICAgICAgdGhpcy5yZXNldENvdmVycygpO1xuICAgICAgdGhpcy5wcm9tcHQubmdPbkluaXQoKTtcbiAgICAgIGlmICghc3RlcC5vcHRpb25zLnJlbGF0ZWRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY292ZXJBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihgIyR7c3RlcC5vcHRpb25zLnJlbGF0ZWRFbGVtZW50fWApO1xuICAgICAgICBpZiAoZWxlbSkge1xuICAgICAgICAgIHRoaXMuY292ZXJTaG93RWxlbWVudChlbGVtKTtcbiAgICAgICAgICB0aGlzLnByb21wdC5zZXRQcm9tcHRGb3JFbGVtZW50KGVsZW0sIHN0ZXAub3B0aW9ucy5wbGFjZW1lbnQpO1xuICAgICAgICAgIGlmIChzdGVwLm9wdGlvbnMuZGlzYWJsZUludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvdmVyRWxlbWVudChlbGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb3ZlckFsbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY292ZXJFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBwb3NpdGlvbkluZm8gPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1hcmdpbiA9IDEwO1xuICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5lbGVtZW50Q292ZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIHBvc2l0aW9uSW5mby5sZWZ0IC0gbWFyZ2luLFxuICAgICAgcG9zaXRpb25JbmZvLnRvcCAtIG1hcmdpbixcbiAgICAgIHBvc2l0aW9uSW5mby53aWR0aCArIDIgKiBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8uaGVpZ2h0ICsgMiAqIG1hcmdpbik7XG4gIH1cbiAgcHJpdmF0ZSBjb3ZlckFsbCgpIHtcbiAgICBpZiAodGhpcy50b3BDb3Zlcikge1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICB0aGlzLnRvcENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gJzAnO1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDB2aCc7XG4gICAgICB0aGlzLnByb21wdC5zZXRQcm9tcHRGb3JFbGVtZW50KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY292ZXJTaG93RWxlbWVudChlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgY29uc3QgcG9zaXRpb25JbmZvID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtYXJnaW4gPSAxMDtcbiAgICBjb25zdCB2aWV3VyA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gICAgY29uc3Qgdmlld0ggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLnRvcENvdmVyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHZpZXdXLFxuICAgICAgcG9zaXRpb25JbmZvLnRvcCAtIG1hcmdpbik7XG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLmxlZnRDb3Zlci5uYXRpdmVFbGVtZW50LFxuICAgICAgMCxcbiAgICAgIHBvc2l0aW9uSW5mby50b3AgLSBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8ubGVmdCAtIG1hcmdpbixcbiAgICAgIHBvc2l0aW9uSW5mby5oZWlnaHQgKyAyICogbWFyZ2luKTtcbiAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMucmlnaHRDb3Zlci5uYXRpdmVFbGVtZW50LFxuICAgICAgcG9zaXRpb25JbmZvLmxlZnQgKyBwb3NpdGlvbkluZm8ud2lkdGggKyBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8udG9wIC0gbWFyZ2luLFxuICAgICAgdmlld1cgLSBwb3NpdGlvbkluZm8ubGVmdCAtIHBvc2l0aW9uSW5mby53aWR0aCAtIG1hcmdpbixcbiAgICAgIHBvc2l0aW9uSW5mby5oZWlnaHQgKyAyICogbWFyZ2luKTtcbiAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuYm90dG9tQ292ZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIDAsXG4gICAgICBwb3NpdGlvbkluZm8udG9wICsgcG9zaXRpb25JbmZvLmhlaWdodCArIG1hcmdpbixcbiAgICAgIHZpZXdXLFxuICAgICAgdmlld0ggLSBwb3NpdGlvbkluZm8udG9wIC0gcG9zaXRpb25JbmZvLmhlaWdodCAtIG1hcmdpbik7XG5cbiAgfVxuXG4gIHByaXZhdGUgc2V0UG9zaXRpb24oZWxlbWVudDogYW55LCBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgfVxuICBwcml2YXRlIHJlc2V0Q292ZXJzKCkge1xuICAgIGlmICh0aGlzLnRvcENvdmVyKSB7XG4gICAgICB0aGlzLnRvcENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd3aWR0aCcpO1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIHRoaXMudG9wQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sZWZ0Q292ZXIpIHtcbiAgICAgIHRoaXMubGVmdENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy5sZWZ0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIHRoaXMubGVmdENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RvcCcpO1xuICAgICAgdGhpcy5sZWZ0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yaWdodENvdmVyKSB7XG4gICAgICB0aGlzLnJpZ2h0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7XG4gICAgICB0aGlzLnJpZ2h0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdsZWZ0Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJvdHRvbUNvdmVyKSB7XG4gICAgICB0aGlzLmJvdHRvbUNvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy5ib3R0b21Db3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd3aWR0aCcpO1xuICAgICAgdGhpcy5ib3R0b21Db3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIHRoaXMuYm90dG9tQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbGVtZW50Q292ZXIpIHtcbiAgICAgIHRoaXMuZWxlbWVudENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy5lbGVtZW50Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIHRoaXMuZWxlbWVudENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RvcCcpO1xuICAgICAgdGhpcy5lbGVtZW50Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=