ngy-tutorial
Version:
327 lines • 47.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
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';
var PromptComponent = /** @class */ (function () {
function PromptComponent(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 {?}
*/
PromptComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
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 = tslib_1.__assign({}, this.options.actionTexts);
}
if (this.step.options && this.step.options.actionTexts) {
this.appliedTexts = tslib_1.__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 {?}
*/
PromptComponent.prototype.finishTutorial = /**
* @return {?}
*/
function () {
this.svc.hideTutorial();
};
/**
* @return {?}
*/
PromptComponent.prototype.nextStep = /**
* @return {?}
*/
function () {
this.svc.nextStep();
};
/**
* @return {?}
*/
PromptComponent.prototype.previousStep = /**
* @return {?}
*/
function () {
this.svc.previousStep();
};
/**
* @param {?=} elem
* @param {?=} placement
* @return {?}
*/
PromptComponent.prototype.setPromptForElement = /**
* @param {?=} elem
* @param {?=} placement
* @return {?}
*/
function (elem, placement) {
var _this = this;
setTimeout(function () {
/** @type {?} */
var promptPositionInfo = _this.prompt.nativeElement.getBoundingClientRect();
/** @type {?} */
var viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
/** @type {?} */
var viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
/** @type {?} */
var promptH = promptPositionInfo.height;
/** @type {?} */
var promptW = promptPositionInfo.width;
if (!elem || placement === undefined) {
_this.setPromptPosition(viewW / 2 - promptW / 2, viewH / 2 - promptH / 2);
}
else {
/** @type {?} */
var 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(function () {
_this.overrideButtonDisable = _this.isPromptCoveringElement(elem) || _this.isElementOutOfView(elem);
}, 200);
}
});
};
/**
* @private
* @param {?} left
* @param {?} top
* @return {?}
*/
PromptComponent.prototype.setPromptPosition = /**
* @private
* @param {?} left
* @param {?} top
* @return {?}
*/
function (left, top) {
/** @type {?} */
var promptPositionInfo = this.prompt.nativeElement.getBoundingClientRect();
/** @type {?} */
var viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
/** @type {?} */
var viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
/** @type {?} */
var promptH = promptPositionInfo.height;
/** @type {?} */
var 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 {?}
*/
PromptComponent.prototype.isPromptCoveringElement = /**
* @private
* @param {?} elem
* @return {?}
*/
function (elem) {
if (!elem) {
return false;
}
/** @type {?} */
var promptPositionInfo = this.prompt.nativeElement.getBoundingClientRect();
/** @type {?} */
var promptL = promptPositionInfo.left;
/** @type {?} */
var promptT = promptPositionInfo.top;
/** @type {?} */
var promptLW = promptL + promptPositionInfo.width;
/** @type {?} */
var promptTH = promptT + promptPositionInfo.height;
/** @type {?} */
var positionInfo = elem.getBoundingClientRect();
/** @type {?} */
var elementL = positionInfo.left;
/** @type {?} */
var elementT = positionInfo.top;
/** @type {?} */
var elementCenterX = elementL + positionInfo.width / 2;
/** @type {?} */
var elementCenterY = elementT + positionInfo.height / 2;
if (promptTH < elementCenterY || promptT > elementCenterY || promptLW < elementCenterX || promptL > elementCenterX) {
return false;
}
else {
return true;
}
};
/**
* @private
* @param {?} elem
* @return {?}
*/
PromptComponent.prototype.isElementOutOfView = /**
* @private
* @param {?} elem
* @return {?}
*/
function (elem) {
/** @type {?} */
var positionInfo = elem.getBoundingClientRect();
/** @type {?} */
var viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
/** @type {?} */
var 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\"\n #prompt>\n <h2 class=\"title ngy-tutorial-title\" [ngClass]=\"appliedClasses.title\" *ngIf=\"step.title\" [innerHTML]=\"titleSafe\"></h2>\n <p class=\"prompt ngy-tutorial-prompt\" [ngClass]=\"appliedClasses.prompt\" *ngIf=\"step.prompt\" [innerHTML]=\"promptSafe\"></p>\n <div class=\"action-container\">\n <div class=\"actions left\">\n <button id=\"lib-ngy-tutorial-previous-btn\" *ngIf=\"(stepNumber !== 0) && (!step.options.disablePrevious || overrideButtonDisable)\" class=\"ngy-tutorial-previous-btn\"\n (click)=\"previousStep()\" [ngClass]=\"appliedClasses.previousBtn\"><i [ngClass]=\"appliedClasses.previousIcon\"\n *ngIf=\"appliedClasses.previousIcon\"></i> {{appliedTexts.previous ? appliedTexts.previous : \"Previous\"}}</button>\n <button id=\"lib-ngy-tutorial-skip-btn\" [ngClass]=\"appliedClasses.skipBtn\" *ngIf=\"stepNumber===0\" class=\"ngy-tutorial-skip-btn\"\n (click)=\"finishTutorial()\"><i [ngClass]=\"appliedClasses.skipIcon\" *ngIf=\"appliedClasses.skipIcon\"></i>\n {{appliedTexts.skip ? appliedTexts.skip : \"Skip\"}}</button>\n </div>\n <div class=\"actions right\">\n <button id=\"lib-ngy-tutorial-next-btn\" *ngIf=\"(stepNumber !== totalSteps - 1) && (!step.options.disableNext || overrideButtonDisable)\" class=\"ngy-tutorial-next-btn\"\n (click)=\"nextStep()\" [ngClass]=\"appliedClasses.nextBtn\"><i [ngClass]=\"appliedClasses.nextIcon\" *ngIf=\"appliedClasses.nextIcon\"></i>\n {{appliedTexts.next ? appliedTexts.next : \"Next\"}}</button>\n <button id=\"lib-ngy-tutorial-finish-btn\" *ngIf=\"(stepNumber === totalSteps - 1) && (!step.options.disableNext || overrideButtonDisable)\"\n class=\"ngy-tutorial-finish-btn\" (click)=\"finishTutorial()\" [ngClass]=\"appliedClasses.finishBtn\"><i [ngClass]=\"appliedClasses.finishIcon\"\n *ngIf=\"appliedClasses.finishIcon\"></i>\n {{appliedTexts.finish ? appliedTexts.finish : \"Finish\"}}</button>\n </div>\n </div>\n</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 = function () { return [
{ 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',] }]
};
return PromptComponent;
}());
export { PromptComponent };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbXB0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neS10dXRvcmlhbC8iLCJzb3VyY2VzIjpbImxpYi9wcm9tcHQvcHJvbXB0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhGLE9BQU8sRUFBRSxtQkFBbUIsRUFBc0QsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDO0lBd0NFLHlCQUNVLEdBQXVCLEVBQ3ZCLElBQWtCLEVBQ0EsUUFBYSxFQUNDLE9BQStCO1FBSC9ELFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBQ3ZCLFNBQUksR0FBSixJQUFJLENBQWM7UUFDQSxhQUFRLEdBQVIsUUFBUSxDQUFLO1FBQ0MsWUFBTyxHQUFQLE9BQU8sQ0FBd0I7UUFkaEUsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFPeEIsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFPbEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7OztJQUVELGtDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDM0IsSUFBSSxD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K0I7Ozs7O0lBQy9CLCtCQUEwQjs7Ozs7SUFDMUIsbUNBQXVDOzs7OztJQUN2QyxrQ0FBdUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IElUdXRvcmlhbFN0ZXAgfSBmcm9tICcuLi9hcGkvaS10dXRvcmlhbC1zdGVwJztcclxuaW1wb3J0IHsgU3RlcFByb21wdFBsYWNlbWVudCwgSUluaXRpYWxpemF0aW9uT3B0aW9ucywgSVN0ZXBDbGFzc2VzLCBJQWN0aW9uVGV4dHMgfSBmcm9tICcuLi9hcGkvaS1vcHRpb25zJztcclxuaW1wb3J0IHsgTmd5VHV0b3JpYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbmd5LXR1dG9yaWFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW5neS10dXRvcmlhbC1wcm9tcHQnLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInByb21wdC1jb250YWluZXIgc21vb3RoLTIgbmd5LXR1dG9yaWFsLXByb21wdC1jb250YWluZXJcIiBbbmdDbGFzc109XCJhcHBsaWVkQ2xhc3Nlcy5jb250YWluZXJcIiAqbmdJZj1cInN0ZXBcIlxyXG4gICNwcm9tcHQ+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=