UNPKG

ngy-tutorial

Version:
319 lines 46.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, ViewChild, ElementRef, Inject } from '@angular/core'; import { StepPromptPlacement } from '../api/i-options'; import { NgyTutorialService } from '../ngy-tutorial.service'; import { DomSanitizer } from '@angular/platform-browser'; import { DOCUMENT } from '@angular/common'; export class PromptComponent { /** * @param {?} svc * @param {?} sani * @param {?} document * @param {?} options */ constructor(svc, sani, document, options) { this.svc = svc; this.sani = sani; this.document = document; this.options = options; this.stepNumber = 0; this.totalSteps = 0; this.overrideButtonDisable = false; this.margin = 10; this.appliedClasses = {}; this.appliedTexts = {}; } /** * @return {?} */ ngOnInit() { this.appliedClasses = {}; this.appliedTexts = {}; if (this.options.classToAdd) { this.appliedClasses.container = this.options.classToAdd.container ? this.options.classToAdd.container : []; this.appliedClasses.title = this.options.classToAdd.title ? this.options.classToAdd.title : []; this.appliedClasses.prompt = this.options.classToAdd.prompt ? this.options.classToAdd.prompt : []; this.appliedClasses.nextBtn = this.options.classToAdd.nextBtn ? this.options.classToAdd.nextBtn : []; this.appliedClasses.previousBtn = this.options.classToAdd.previousBtn ? this.options.classToAdd.previousBtn : []; this.appliedClasses.finishBtn = this.options.classToAdd.finishBtn ? this.options.classToAdd.finishBtn : []; this.appliedClasses.skipBtn = this.options.classToAdd.skipBtn ? this.options.classToAdd.skipBtn : []; this.appliedClasses.nextIcon = this.options.classToAdd.nextIcon ? this.options.classToAdd.nextIcon : ''; this.appliedClasses.previousIcon = this.options.classToAdd.previousIcon ? this.options.classToAdd.previousIcon : ''; this.appliedClasses.finishIcon = this.options.classToAdd.finishIcon ? this.options.classToAdd.finishIcon : ''; this.appliedClasses.skipIcon = this.options.classToAdd.skipIcon ? this.options.classToAdd.skipIcon : ''; } if (this.step.options && this.step.options.classToAdd) { // tslint:disable-next-line:max-line-length this.appliedClasses.container = this.appliedClasses.container.concat(this.step.options.classToAdd.container ? this.step.options.classToAdd.container : []); // tslint:disable-next-line:max-line-length this.appliedClasses.title = this.appliedClasses.title.concat(this.step.options.classToAdd.title ? this.step.options.classToAdd.title : []); // tslint:disable-next-line:max-line-length this.appliedClasses.prompt = this.appliedClasses.prompt.concat(this.step.options.classToAdd.prompt ? this.step.options.classToAdd.prompt : []); // tslint:disable-next-line:max-line-length this.appliedClasses.nextBtn = this.appliedClasses.nextBtn.concat(this.step.options.classToAdd.nextBtn ? this.step.options.classToAdd.nextBtn : []); // tslint:disable-next-line:max-line-length this.appliedClasses.previousBtn = this.appliedClasses.previousBtn.concat(this.step.options.classToAdd.previousBtn ? this.step.options.classToAdd.previousBtn : []); // tslint:disable-next-line:max-line-length this.appliedClasses.finishBtn = this.appliedClasses.finishBtn.concat(this.step.options.classToAdd.finishBtn ? this.step.options.classToAdd.finishBtn : []); // tslint:disable-next-line:max-line-length this.appliedClasses.skipBtn = this.appliedClasses.skipBtn.concat(this.step.options.classToAdd.skipBtn ? this.step.options.classToAdd.skipBtn : []); // tslint:disable-next-line:max-line-length this.appliedClasses.nextIcon = this.step.options.classToAdd.nextIcon ? this.step.options.classToAdd.nextIcon : this.appliedClasses.nextIcon; // tslint:disable-next-line:max-line-length this.appliedClasses.previousIcon = this.step.options.classToAdd.previousIcon ? this.step.options.classToAdd.previousIcon : this.appliedClasses.previousIcon; // tslint:disable-next-line:max-line-length this.appliedClasses.finishIcon = this.step.options.classToAdd.finishIcon ? this.step.options.classToAdd.finishIcon : this.appliedClasses.finishIcon; // tslint:disable-next-line:max-line-length this.appliedClasses.skipIcon = this.step.options.classToAdd.skipIcon ? this.step.options.classToAdd.skipIcon : this.appliedClasses.skipIcon; } if (this.options.actionTexts) { this.appliedTexts = Object.assign({}, this.options.actionTexts); } if (this.step.options && this.step.options.actionTexts) { this.appliedTexts = Object.assign({}, this.appliedTexts, this.step.options.actionTexts); } if (this.step.title) { this.titleSafe = this.sani.bypassSecurityTrustHtml(this.step.title); } if (this.step.prompt) { this.promptSafe = this.sani.bypassSecurityTrustHtml(this.step.prompt); } } /** * @return {?} */ finishTutorial() { this.svc.hideTutorial(); } /** * @return {?} */ nextStep() { this.svc.nextStep(); } /** * @return {?} */ previousStep() { this.svc.previousStep(); } /** * @param {?=} elem * @param {?=} placement * @return {?} */ setPromptForElement(elem, placement) { setTimeout(() => { /** @type {?} */ const promptPositionInfo = this.prompt.nativeElement.getBoundingClientRect(); /** @type {?} */ const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); /** @type {?} */ const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); /** @type {?} */ const promptH = promptPositionInfo.height; /** @type {?} */ const promptW = promptPositionInfo.width; if (!elem || placement === undefined) { this.setPromptPosition(viewW / 2 - promptW / 2, viewH / 2 - promptH / 2); } else { /** @type {?} */ const positionInfo = elem.getBoundingClientRect(); if (placement === StepPromptPlacement.Right) { this.setPromptPosition(positionInfo.left + positionInfo.width + 2 * this.margin, positionInfo.top + positionInfo.height / 2 - promptH / 2); } else if (placement === StepPromptPlacement.Left) { this.setPromptPosition(positionInfo.left - promptW - 2 * this.margin, positionInfo.top + positionInfo.height / 2 - promptH / 2); } else if (placement === StepPromptPlacement.Above) { this.setPromptPosition(positionInfo.left + positionInfo.width / 2 - promptW / 2, positionInfo.top - 2 * this.margin - promptH); } else { this.setPromptPosition(positionInfo.left + positionInfo.width / 2 - promptW / 2, positionInfo.top + positionInfo.height + 2 * this.margin); } setTimeout(() => { this.overrideButtonDisable = this.isPromptCoveringElement(elem) || this.isElementOutOfView(elem); }, 200); } }); } /** * @private * @param {?} left * @param {?} top * @return {?} */ setPromptPosition(left, top) { /** @type {?} */ const promptPositionInfo = this.prompt.nativeElement.getBoundingClientRect(); /** @type {?} */ const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); /** @type {?} */ const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); /** @type {?} */ const promptH = promptPositionInfo.height; /** @type {?} */ const promptW = promptPositionInfo.width; if (left < this.margin) { left = this.margin; } if (top < this.margin) { top = this.margin; } if (left > viewW - promptW - this.margin) { left = viewW - promptW - this.margin; } if (top > viewH - promptH - this.margin) { top = viewH - promptH - this.margin; } this.prompt.nativeElement.style.left = `${left}px`; this.prompt.nativeElement.style.top = `${top}px`; } /** * @private * @param {?} elem * @return {?} */ isPromptCoveringElement(elem) { if (!elem) { return false; } /** @type {?} */ const promptPositionInfo = this.prompt.nativeElement.getBoundingClientRect(); /** @type {?} */ const promptL = promptPositionInfo.left; /** @type {?} */ const promptT = promptPositionInfo.top; /** @type {?} */ const promptLW = promptL + promptPositionInfo.width; /** @type {?} */ const promptTH = promptT + promptPositionInfo.height; /** @type {?} */ const positionInfo = elem.getBoundingClientRect(); /** @type {?} */ const elementL = positionInfo.left; /** @type {?} */ const elementT = positionInfo.top; /** @type {?} */ const elementCenterX = elementL + positionInfo.width / 2; /** @type {?} */ const elementCenterY = elementT + positionInfo.height / 2; if (promptTH < elementCenterY || promptT > elementCenterY || promptLW < elementCenterX || promptL > elementCenterX) { return false; } else { return true; } } /** * @private * @param {?} elem * @return {?} */ isElementOutOfView(elem) { /** @type {?} */ const positionInfo = elem.getBoundingClientRect(); /** @type {?} */ const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); /** @type {?} */ const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); if (positionInfo.top + positionInfo.height / 2 > viewH || positionInfo.left + positionInfo.width / 2 > viewW) { return true; } else { return false; } } } PromptComponent.decorators = [ { type: Component, args: [{ selector: 'lib-ngy-tutorial-prompt', template: `<div class="prompt-container smooth-2 ngy-tutorial-prompt-container" [ngClass]="appliedClasses.container" *ngIf="step" #prompt> <h2 class="title ngy-tutorial-title" [ngClass]="appliedClasses.title" *ngIf="step.title" [innerHTML]="titleSafe"></h2> <p class="prompt ngy-tutorial-prompt" [ngClass]="appliedClasses.prompt" *ngIf="step.prompt" [innerHTML]="promptSafe"></p> <div class="action-container"> <div class="actions left"> <button id="lib-ngy-tutorial-previous-btn" *ngIf="(stepNumber !== 0) && (!step.options.disablePrevious || overrideButtonDisable)" class="ngy-tutorial-previous-btn" (click)="previousStep()" [ngClass]="appliedClasses.previousBtn"><i [ngClass]="appliedClasses.previousIcon" *ngIf="appliedClasses.previousIcon"></i> {{appliedTexts.previous ? appliedTexts.previous : "Previous"}}</button> <button id="lib-ngy-tutorial-skip-btn" [ngClass]="appliedClasses.skipBtn" *ngIf="stepNumber===0" class="ngy-tutorial-skip-btn" (click)="finishTutorial()"><i [ngClass]="appliedClasses.skipIcon" *ngIf="appliedClasses.skipIcon"></i> {{appliedTexts.skip ? appliedTexts.skip : "Skip"}}</button> </div> <div class="actions right"> <button id="lib-ngy-tutorial-next-btn" *ngIf="(stepNumber !== totalSteps - 1) && (!step.options.disableNext || overrideButtonDisable)" class="ngy-tutorial-next-btn" (click)="nextStep()" [ngClass]="appliedClasses.nextBtn"><i [ngClass]="appliedClasses.nextIcon" *ngIf="appliedClasses.nextIcon"></i> {{appliedTexts.next ? appliedTexts.next : "Next"}}</button> <button id="lib-ngy-tutorial-finish-btn" *ngIf="(stepNumber === totalSteps - 1) && (!step.options.disableNext || overrideButtonDisable)" class="ngy-tutorial-finish-btn" (click)="finishTutorial()" [ngClass]="appliedClasses.finishBtn"><i [ngClass]="appliedClasses.finishIcon" *ngIf="appliedClasses.finishIcon"></i> {{appliedTexts.finish ? appliedTexts.finish : "Finish"}}</button> </div> </div> </div>`, styles: [`.prompt-container{max-width:40vw;border-radius:3px;padding:10px;background:#222;box-shadow:0 0 6px rgba(0,0,0,.6);display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative}@media screen and (max-width:768px){.prompt-container{max-width:95vw}}@media screen and (max-width:992px) and (min-width:768px){.prompt-container{max-width:85vw}}.prompt-container .title{margin-bottom:10px}.prompt-container .prompt{text-align:center}.prompt-container .action-container{margin-top:10px;display:flex;width:100%;flex-direction:row}.prompt-container .action-container .actions{width:100%;display:flex;padding:10px}.prompt-container .action-container .actions.left{align-items:flex-start}.prompt-container .action-container .actions.right{justify-content:flex-end}.smooth-2{transition:.2s cubic-bezier(.645,.045,.355,1)}`] },] }, ]; PromptComponent.ctorParameters = () => [ { type: NgyTutorialService }, { type: DomSanitizer }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: undefined, decorators: [{ type: Inject, args: ['ngy-tutorial-options',] }] } ]; PromptComponent.propDecorators = { stepNumber: [{ type: Input }], totalSteps: [{ type: Input }], step: [{ type: Input }], prompt: [{ type: ViewChild, args: ['prompt',] }] }; if (false) { /** @type {?} */ PromptComponent.prototype.stepNumber; /** @type {?} */ PromptComponent.prototype.totalSteps; /** @type {?} */ PromptComponent.prototype.step; /** @type {?} */ PromptComponent.prototype.prompt; /** @type {?} */ PromptComponent.prototype.appliedClasses; /** @type {?} */ PromptComponent.prototype.appliedTexts; /** @type {?} */ PromptComponent.prototype.titleSafe; /** @type {?} */ PromptComponent.prototype.promptSafe; /** @type {?} */ PromptComponent.prototype.overrideButtonDisable; /** * @type {?} * @private */ PromptComponent.prototype.margin; /** * @type {?} * @private */ PromptComponent.prototype.svc; /** * @type {?} * @private */ PromptComponent.prototype.sani; /** * @type {?} * @private */ PromptComponent.prototype.document; /** * @type {?} * @private */ PromptComponent.prototype.options; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neS10dXRvcmlhbC8iLCJzb3VyY2VzIjpbImxpYi9wcm9tcHQvcHJvbXB0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLG1CQUFtQixFQUFzRCxNQUFNLGtCQUFrQixDQUFDO0FBQzNHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUE4QjNDLE1BQU07Ozs7Ozs7SUFZSixZQUNVLEdBQXVCLEVBQ3ZCLElBQWtCLEVBQ0EsUUFBYSxFQUNDLE9BQStCO1FBSC9ELFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBQ3ZCLFNBQUksR0FBSixJQUFJLENBQWM7UUFDQSxhQUFRLEdBQVIsUUFBUSxDQUFLO1FBQ0MsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFkaEUsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFPeEIsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFPbEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7OztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQzNCLElBQUks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VUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0osMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzSSwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9JLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkosMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFV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bXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IElUdXRvcmlhbFN0ZXAgfSBmcm9tICcuLi9hcGkvaS10dXRvcmlhbC1zdGVwJztcclxuaW1wb3J0IHsgU3RlcFByb21wdFBsYWNlbWVudCwgSUluaXRpYWxpemF0aW9uT3B0aW9ucywgSVN0ZXBDbGFzc2VzLCBJQWN0aW9uVGV4dHMgfSBmcm9tICcuLi9hcGkvaS1vcHRpb25zJztcclxuaW1wb3J0IHsgTmd5VHV0b3JpYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbmd5LXR1dG9yaWFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW5neS10dXRvcmlhbC1wcm9tcHQnLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInByb21wdC1jb250YWluZXIgc21vb3RoLTIgbmd5LXR1dG9yaWFsLXByb21wdC1jb250YWluZXJcIiBbbmdDbGFzc109XCJhcHBsaWVkQ2xhc3Nlcy5jb250YWluZXJcIiAqbmdJZj1cInN0ZXBcIlxyXG4gICNwcm9tcHQ+XHJcbiAgPGgyIGNsYXNzPVwidGl0bGUgbmd5LXR1dG9yaWFsLXRpdGxlXCIgW25nQ2xhc3NdPVwiYXBwbGllZENsYXNzZXMudGl0bGVcIiAqbmdJZj1cInN0ZXAudGl0bGVcIiBbaW5uZXJIVE1MXT1cInRpdGxlU2FmZVwiPjwvaDI+XHJcbiAgPHAgY2xhc3M9XCJwcm9tcHQgbmd5LXR1dG9yaWFsLXByb21wdFwiIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLnByb21wdFwiICpuZ0lmPVwic3RlcC5wcm9tcHRcIiBbaW5uZXJIVE1MXT1cInByb21wdFNhZmVcIj48L3A+XHJcbiAgPGRpdiBjbGFzcz1cImFjdGlvbi1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zIGxlZnRcIj5cclxuICAgICAgPGJ1dHRvbiBpZD1cImxpYi1uZ3ktdHV0b3JpYWwtcHJldmlvdXMtYnRuXCIgKm5nSWY9XCIoc3RlcE51bWJlciAhPT0gMCkgJiYgKCFzdGVwLm9wdGlvbnMuZGlzYWJsZVByZXZpb3VzIHx8IG92ZXJyaWRlQnV0dG9uRGlzYWJsZSlcIiBjbGFzcz1cIm5neS10dXRvcmlhbC1wcmV2aW91cy1idG5cIlxyXG4gICAgICAgIChjbGljayk9XCJwcmV2aW91c1N0ZXAoKVwiIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLnByZXZpb3VzQnRuXCI+PGkgW25nQ2xhc3NdPVwiYXBwbGllZENsYXNzZXMucHJldmlvdXNJY29uXCJcclxuICAgICAgICAgICpuZ0lmPVwiYXBwbGllZENsYXNzZXMucHJldmlvdXNJY29uXCI+PC9pPiB7e2FwcGxpZWRUZXh0cy5wcmV2aW91cyA/IGFwcGxpZWRUZXh0cy5wcmV2aW91cyA6IFwiUHJldmlvdXNcIn19PC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gaWQ9XCJsaWItbmd5LXR1dG9yaWFsLXNraXAtYnRuXCIgW25nQ2xhc3NdPVwiYXBwbGllZENsYXNzZXMuc2tpcEJ0blwiICpuZ0lmPVwic3RlcE51bWJlcj09PTBcIiBjbGFzcz1cIm5neS10dXRvcmlhbC1za2lwLWJ0blwiXHJcbiAgICAgICAgKGNsaWNrKT1cImZpbmlzaFR1dG9yaWFsKClcIj48aSBbbmdDbGFzc109XCJhcHBsaWVkQ2xhc3Nlcy5za2lwSWNvblwiICpuZ0lmPVwiYXBwbGllZENsYXNzZXMuc2tpcEljb25cIj48L2k+XHJcbiAgICAgICAge3thcHBsaWVkVGV4dHMuc2tpcCA/IGFwcGxpZWRUZXh0cy5za2lwIDogXCJTa2lwXCJ9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucyByaWdodFwiPlxyXG4gICAgICA8YnV0dG9uIGlkPVwibGliLW5neS10dXRvcmlhbC1uZXh0LWJ0blwiICpuZ0lmPVwiKHN0ZXBOdW1iZXIgIT09IHRvdGFsU3RlcHMgLSAxKSAmJiAoIXN0ZXAub3B0aW9ucy5kaXNhYmxlTmV4dCB8fCBvdmVycmlkZUJ1dHRvbkRpc2FibGUpXCIgY2xhc3M9XCJuZ3ktdHV0b3JpYWwtbmV4dC1idG5cIlxyXG4gICAgICAgIChjbGljayk9XCJuZXh0U3RlcCgpXCIgW25nQ2xhc3NdPVwiYXBwbGllZENsYXNzZXMubmV4dEJ0blwiPjxpIFtuZ0NsYXNzXT1cImFwcGxpZWRDbGFzc2VzLm5leHRJY29uXCIgKm5nSWY9XCJhcHBsaWVkQ2xhc3Nlcy5uZXh0SWNvblwiPjwvaT5cclxuICAgICAgICB7e2FwcGxpZWRUZXh0cy5uZXh0ID8gYXBwbGllZFRleHRzLm5leHQgOiBcIk5leHRcIn19PC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gaWQ9XCJsaWItbmd5LXR1dG9yaWFsLWZpbmlzaC1idG5cIiAqbmdJZj1cIihzdGVwTnVtYmVyID09PSB0b3RhbFN0ZXBzIC0gMSkgJiYgKCFzdGVwLm9wdGlvbnMuZGlzYWJsZU5leHQgfHwgb3ZlcnJpZGVCdXR0b25EaXNhYmxlKVwiXHJcbiAgICAgICAgY2xhc3M9XCJuZ3ktdHV0b3JpYWwtZmluaXNoLWJ0blwiIChjbGljayk9XCJmaW5pc2hUdXRvcmlhbCgpXCIgW25nQ2xhc3NdPVwiYXBwbGllZENsYXNzZXMuZmluaXNoQnRuXCI+PGkgW25nQ2xhc3NdPVwiYXBwbGllZENsYXNzZXMuZmluaXNoSWNvblwiXHJcbiAgICAgICAgICAqbmdJZj1cImFwcGxpZWRDbGFzc2VzLmZpbmlzaEljb25cIj48L2k+XHJcbiAgICAgICAge3thcHBsaWVkVGV4dHMuZmluaXNoID8gYXBwbGllZFRleHRzLmZpbmlzaCA6IFwiRmluaXNoXCJ9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PmAsXHJcbiAgc3R5bGVzOiBbYC5wcm9tcHQtY29udGFpbmVye21heC13aWR0aDo0MHZ3O2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6MTBweDtiYWNrZ3JvdW5kOiMyMjI7Ym94LXNoYWRvdzowIDAgNnB4IHJnYmEoMCwwLDAsLjYpO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cG9zaXRpb246cmVsYXRpdmV9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjhweCl7LnByb21wdC1jb250YWluZXJ7bWF4LXdpZHRoOjk1dnd9fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6OTkycHgpIGFuZCAobWluLXdpZHRoOjc2OHB4KXsucHJvbXB0LWNvbnRhaW5lcnttYXgtd2lkdGg6ODV2d319LnByb21wdC1jb250YWluZXIgLnRpdGxle21hcmdpbi1ib3R0b206MTBweH0ucHJvbXB0LWNvbnRhaW5lciAucHJvbXB0e3RleHQtYWxpZ246Y2VudGVyfS5wcm9tcHQtY29udGFpbmVyIC5hY3Rpb24tY29udGFpbmVye21hcmdpbi10b3A6MTBweDtkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJTtmbGV4LWRpcmVjdGlvbjpyb3d9LnByb21wdC1jb250YWluZXIgLmFjdGlvbi1jb250YWluZXIgLmFjdGlvbnN7d2lkdGg6MTAwJTtkaXNwbGF5OmZsZXg7cGFkZGluZzoxMHB4fS5wcm9tcHQtY29udGFpbmVyIC5hY3Rpb24tY29udGFpbmVyIC5hY3Rpb25zLmxlZnR7YWxpZ24taXRlbXM6ZmxleC1zdGFydH0ucHJvbXB0LWNvbnRhaW5lciAuYWN0aW9uLWNvbnRhaW5lciAuYWN0aW9ucy5yaWdodHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LnNtb290aC0ye3RyYW5zaXRpb246LjJzIGN1YmljLWJlemllciguNjQ1LC4wNDUsLjM1NSwxKX1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvbXB0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgc3RlcE51bWJlciA9IDA7XHJcbiAgQElucHV0KCkgdG90YWxTdGVwcyA9IDA7XHJcbiAgQElucHV0KCkgc3RlcDogSVR1dG9yaWFsU3RlcDtcclxuICBAVmlld0NoaWxkKCdwcm9tcHQnKSBwcm9tcHQ6IEVsZW1lbnRSZWY7XHJcbiAgYXBwbGllZENsYXNzZXM6IElTdGVwQ2xhc3NlcztcclxuICBhcHBsaWVkVGV4dHM6IElBY3Rpb25UZXh0cztcclxuICB0aXRsZVNhZmU6IFNhZmVIdG1sO1xyXG4gIHByb21wdFNhZmU6IFNhZmVIdG1sO1xyXG4gIG92ZXJyaWRlQnV0dG9uRGlzYWJsZSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbWFyZ2luID0gMTA7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHN2YzogTmd5VHV0b3JpYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzYW5pOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXHJcbiAgICBASW5qZWN0KCduZ3ktdHV0b3JpYWwtb3B0aW9ucycpIHByaXZhdGUgb3B0aW9uczogSUluaXRpYWxpemF0aW9uT3B0aW9uc1xyXG4gICkge1xyXG4gICAgdGhpcy5hcHBsaWVkQ2xhc3NlcyA9IHt9O1xyXG4gICAgdGhpcy5hcHBsaWVkVGV4dHMgPSB7fTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5hcHBsaWVkQ2xhc3NlcyA9IHt9O1xyXG4gICAgdGhpcy5hcHBsaWVkVGV4dHMgPSB7fTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZCkge1xyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLmNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLmNvbnRhaW5lciA/IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLmNvbnRhaW5lciA6IFtdO1xyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLnRpdGxlID0gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQudGl0bGUgPyB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC50aXRsZSA6IFtdO1xyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLnByb21wdCA9IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLnByb21wdCA/IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLnByb21wdCA6IFtdO1xyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLm5leHRCdG4gPSB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5uZXh0QnRuID8gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQubmV4dEJ0biA6IFtdO1xyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLnByZXZpb3VzQnRuID0gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQucHJldmlvdXNCdG4gPyB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5wcmV2aW91c0J0biA6IFtdO1xyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLmZpbmlzaEJ0biA9IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLmZpbmlzaEJ0biA/IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLmZpbmlzaEJ0biA6IFtdO1xyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLnNraXBCdG4gPSB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5za2lwQnRuID8gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQuc2tpcEJ0biA6IFtdO1xyXG5cclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5uZXh0SWNvbiA9IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLm5leHRJY29uID8gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQubmV4dEljb24gOiAnJztcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcmV2aW91c0ljb24gPSB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5wcmV2aW91c0ljb24gPyB0aGlzLm9wdGlvbnMuY2xhc3NUb0FkZC5wcmV2aW91c0ljb24gOiAnJztcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5maW5pc2hJY29uID0gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQuZmluaXNoSWNvbiA/IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLmZpbmlzaEljb24gOiAnJztcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5za2lwSWNvbiA9IHRoaXMub3B0aW9ucy5jbGFzc1RvQWRkLnNraXBJY29uID8gdGhpcy5vcHRpb25zLmNsYXNzVG9BZGQuc2tpcEljb24gOiAnJztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN0ZXAub3B0aW9ucyAmJiB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkKSB7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5jb250YWluZXIgPSB0aGlzLmFwcGxpZWRDbGFzc2VzLmNvbnRhaW5lci5jb25jYXQodGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5jb250YWluZXIgPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLmNvbnRhaW5lciA6IFtdKTtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLnRpdGxlID0gdGhpcy5hcHBsaWVkQ2xhc3Nlcy50aXRsZS5jb25jYXQodGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC50aXRsZSA/IHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQudGl0bGUgOiBbXSk7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcm9tcHQgPSB0aGlzLmFwcGxpZWRDbGFzc2VzLnByb21wdC5jb25jYXQodGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5wcm9tcHQgPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLnByb21wdCA6IFtdKTtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLm5leHRCdG4gPSB0aGlzLmFwcGxpZWRDbGFzc2VzLm5leHRCdG4uY29uY2F0KHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQubmV4dEJ0biA/IHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQubmV4dEJ0biA6IFtdKTtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLnByZXZpb3VzQnRuID0gdGhpcy5hcHBsaWVkQ2xhc3Nlcy5wcmV2aW91c0J0bi5jb25jYXQodGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5wcmV2aW91c0J0biA/IHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQucHJldmlvdXNCdG4gOiBbXSk7XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5maW5pc2hCdG4gPSB0aGlzLmFwcGxpZWRDbGFzc2VzLmZpbmlzaEJ0bi5jb25jYXQodGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5maW5pc2hCdG4gPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLmZpbmlzaEJ0biA6IFtdKTtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLnNraXBCdG4gPSB0aGlzLmFwcGxpZWRDbGFzc2VzLnNraXBCdG4uY29uY2F0KHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQuc2tpcEJ0biA/IHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQuc2tpcEJ0biA6IFtdKTtcclxuXHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5uZXh0SWNvbiA9IHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQubmV4dEljb24gPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLm5leHRJY29uIDogdGhpcy5hcHBsaWVkQ2xhc3Nlcy5uZXh0SWNvbjtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLnByZXZpb3VzSWNvbiA9IHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQucHJldmlvdXNJY29uID8gdGhpcy5zdGVwLm9wdGlvbnMuY2xhc3NUb0FkZC5wcmV2aW91c0ljb24gOiB0aGlzLmFwcGxpZWRDbGFzc2VzLnByZXZpb3VzSWNvbjtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICB0aGlzLmFwcGxpZWRDbGFzc2VzLmZpbmlzaEljb24gPSB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLmZpbmlzaEljb24gPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLmZpbmlzaEljb24gOiB0aGlzLmFwcGxpZWRDbGFzc2VzLmZpbmlzaEljb247XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgdGhpcy5hcHBsaWVkQ2xhc3Nlcy5za2lwSWNvbiA9IHRoaXMuc3RlcC5vcHRpb25zLmNsYXNzVG9BZGQuc2tpcEljb24gPyB0aGlzLnN0ZXAub3B0aW9ucy5jbGFzc1RvQWRkLnNraXBJY29uIDogdGhpcy5hcHBsaWVkQ2xhc3Nlcy5za2lwSWNvbjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuYWN0aW9uVGV4dHMpIHtcclxuICAgICAgdGhpcy5hcHBsaWVkVGV4dHMgPSB7XHJcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLmFjdGlvblRleHRzXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdGVwLm9wdGlvbnMgJiYgdGhpcy5zdGVwLm9wdGlvbnMuYWN0aW9uVGV4dHMpIHtcclxuICAgICAgdGhpcy5hcHBsaWVkVGV4dHMgPSB7XHJcbiAgICAgICAgLi4udGhpcy5hcHBsaWVkVGV4dHMsXHJcbiAgICAgICAgLi4udGhpcy5zdGVwLm9wdGlvbnMuYWN0aW9uVGV4dHNcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN0ZXAudGl0bGUpIHtcclxuICAgICAgdGhpcy50aXRsZVNhZmUgPSB0aGlzLnNhbmkuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5zdGVwLnRpdGxlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN0ZXAucHJvbXB0KSB7XHJcbiAgICAgIHRoaXMucHJvbXB0U2FmZSA9IHRoaXMuc2FuaS5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLnN0ZXAucHJvbXB0KTtcclxuICAgIH1cclxuICB9XHJcbiAgZmluaXNoVHV0b3JpYWwoKSB7XHJcbiAgICB0aGlzLnN2Yy5oaWRlVHV0b3JpYWwoKTtcclxuICB9XHJcbiAgbmV4dFN0ZXAoKSB7XHJcbiAgICB0aGlzLnN2Yy5uZXh0U3RlcCgpO1xyXG4gIH1cclxuICBwcmV2aW91c1N0ZXAoKSB7XHJcbiAgICB0aGlzLnN2Yy5wcmV2aW91c1N0ZXAoKTtcclxuICB9XHJcbiAgc2V0UHJvbXB0Rm9yRWxlbWVudChlbGVtPzogYW55LCBwbGFjZW1lbnQ/OiBTdGVwUHJvbXB0UGxhY2VtZW50KSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgcHJvbXB0UG9zaXRpb25JbmZvID0gdGhpcy5wcm9tcHQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgY29uc3Qgdmlld1cgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xyXG4gICAgICBjb25zdCB2aWV3SCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcclxuICAgICAgY29uc3QgcHJvbXB0SCA9IHByb21wdFBvc2l0aW9uSW5mby5oZWlnaHQ7XHJcbiAgICAgIGNvbnN0IHByb21wdFcgPSBwcm9tcHRQb3NpdGlvbkluZm8ud2lkdGg7XHJcbiAgICAgIGlmICghZWxlbSB8fCBwbGFjZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuc2V0UHJvbXB0UG9zaXRpb24odmlld1cgLyAyIC0gcHJvbXB0VyAvIDIsIHZpZXdIIC8gMiAtIHByb21wdEggLyAyKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbkluZm8gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGlmIChwbGFjZW1lbnQgPT09IFN0ZXBQcm9tcHRQbGFjZW1lbnQuUmlnaHQpIHtcclxuICAgICAgICAgIHRoaXMuc2V0UHJvbXB0UG9zaXRpb24oXHJcbiAgICAgICAgICAgIHBvc2l0aW9uSW5mby5sZWZ0ICsgcG9zaXRpb25JbmZvLndpZHRoICsgMiAqIHRoaXMubWFyZ2luLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkluZm8udG9wICsgcG9zaXRpb25JbmZvLmhlaWdodCAvIDIgLSBwcm9tcHRIIC8gMik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09IFN0ZXBQcm9tcHRQbGFjZW1lbnQuTGVmdCkge1xyXG4gICAgICAgICAgdGhpcy5zZXRQcm9tcHRQb3NpdGlvbihcclxuICAgICAgICAgICAgcG9zaXRpb25JbmZvLmxlZnQgLSBwcm9tcHRXIC0gMiAqIHRoaXMubWFyZ2luLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkluZm8udG9wICsgcG9zaXRpb25JbmZvLmhlaWdodCAvIDIgLSBwcm9tcHRIIC8gMik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwbGFjZW1lbnQgPT09IFN0ZXBQcm9tcHRQbGFjZW1lbnQuQWJvdmUpIHtcclxuICAgICAgICAgIHRoaXMuc2V0UHJvbXB0UG9zaXRpb24oXHJcbiAgICAgICAgICAgIHBvc2l0aW9uSW5mby5sZWZ0ICsgcG9zaXRpb25JbmZvLndpZHRoIC8gMiAtIHByb21wdFcgLyAyLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkluZm8udG9wIC0gMiAqIHRoaXMubWFyZ2luIC0gcHJvbXB0SFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZXRQcm9tcHRQb3NpdGlvbihcclxuICAgICAgICAgICAgcG9zaXRpb25JbmZvLmxlZnQgKyBwb3NpdGlvbkluZm8ud2lkdGggLyAyIC0gcHJvbXB0VyAvIDIsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uSW5mby50b3AgKyBwb3NpdGlvbkluZm8uaGVpZ2h0ICsgMiAqIHRoaXMubWFyZ2luXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMub3ZlcnJpZGVCdXR0b25EaXNhYmxlID0gdGhpcy5pc1Byb21wdENvdmVyaW5nRWxlbWVudChlbGVtKSB8fCB0aGlzLmlzRWxlbWVudE91dE9mVmlldyhlbGVtKTtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBzZXRQcm9tcHRQb3NpdGlvbihsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBwcm9tcHRQb3NpdGlvbkluZm8gPSB0aGlzLnByb21wdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3Qgdmlld1cgPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xyXG4gICAgY29uc3Qgdmlld0ggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XHJcbiAgICBjb25zdCBwcm9tcHRIID0gcHJvbXB0UG9zaXRpb25JbmZvLmhlaWdodDtcclxuICAgIGNvbnN0IHByb21wdFcgPSBwcm9tcHRQb3NpdGlvbkluZm8ud2lkdGg7XHJcbiAgICBpZiAobGVmdCA8IHRoaXMubWFyZ2luKSB7XHJcbiAgICAgIGxlZnQgPSB0aGlzLm1hcmdpbjtcclxuICAgIH1cclxuICAgIGlmICh0b3AgPCB0aGlzLm1hcmdpbikge1xyXG4gICAgICB0b3AgPSB0aGlzLm1hcmdpbjtcclxuICAgIH1cclxuICAgIGlmIChsZWZ0ID4gdmlld1cgLSBwcm9tcHRXIC0gdGhpcy5tYXJnaW4pIHtcclxuICAgICAgbGVmdCA9IHZpZXdXIC0gcHJvbXB0VyAtIHRoaXMubWFyZ2luO1xyXG4gICAgfVxyXG4gICAgaWYgKHRvcCA+IHZpZXdIIC0gcHJvbXB0SCAtIHRoaXMubWFyZ2luKSB7XHJcbiAgICAgIHRvcCA9IHZpZXdIIC0gcHJvbXB0SCAtIHRoaXMubWFyZ2luO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9tcHQubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XHJcbiAgICB0aGlzLnByb21wdC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XHJcbiAgfVxyXG4gIHByaXZhdGUgaXNQcm9tcHRDb3ZlcmluZ0VsZW1lbnQoZWxlbTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZighZWxlbSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwcm9tcHRQb3NpdGlvbkluZm8gPSB0aGlzLnByb21wdC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgcHJvbXB0TCA9IHByb21wdFBvc2l0aW9uSW5mby5sZWZ0O1xyXG4gICAgY29uc3QgcHJvbXB0VCA9IHByb21wdFBvc2l0aW9uSW5mby50b3A7XHJcbiAgICBjb25zdCBwcm9tcHRMVyA9IHByb21wdEwgKyBwcm9tcHRQb3NpdGlvbkluZm8ud2lkdGg7XHJcbiAgICBjb25zdCBwcm9tcHRUSCA9IHByb21wdFQgKyBwcm9tcHRQb3NpdGlvbkluZm8uaGVpZ2h0O1xyXG4gICAgY29uc3QgcG9zaXRpb25JbmZvID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IGVsZW1lbnRMID0gcG9zaXRpb25JbmZvLmxlZnQ7XHJcbiAgICBjb25zdCBlbGVtZW50VCA9IHBvc2l0aW9uSW5mby50b3A7XHJcbiAgICBjb25zdCBlbGVtZW50Q2VudGVyWCA9IGVsZW1lbnRMICsgcG9zaXRpb25JbmZvLndpZHRoIC8gMjtcclxuICAgIGNvbnN0IGVsZW1lbnRDZW50ZXJZID0gZWxlbWVudFQgKyBwb3NpdGlvbkluZm8uaGVpZ2h0IC8gMjtcclxuICAgIGlmKHByb21wdFRIIDwgZWxlbWVudENlbnRlclkgfHwgcHJvbXB0VCA+IGVsZW1lbnRDZW50ZXJZIHx8IHByb21wdExXIDwgZWxlbWVudENlbnRlclggfHwgcHJvbXB0TCA+IGVsZW1lbnRDZW50ZXJYKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGlzRWxlbWVudE91dE9mVmlldyhlbGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uSW5mbyA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB2aWV3VyA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XHJcbiAgICBjb25zdCB2aWV3SCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTtcclxuICAgIGlmKHBvc2l0aW9uSW5mby50b3AgKyBwb3NpdGlvbkluZm8uaGVpZ2h0IC8gMiA+IHZpZXdIIHx8IHBvc2l0aW9uSW5mby5sZWZ0ICsgcG9zaXRpb25JbmZvLndpZHRoIC8gMiA+IHZpZXdXKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=