UNPKG

cb-tour-guide

Version:
429 lines 39.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { debounceTime } from 'rxjs/operators'; import { ErrorHandler, Inject, Injectable } from '@angular/core'; import { Subject, fromEvent } from 'rxjs'; import { Orientation } from './guided-tour.constants'; import { cloneDeep } from 'lodash'; import { DOCUMENT } from "@angular/common"; import { WindowRefService } from "./windowref.service"; var GuidedTourService = /** @class */ (function () { function GuidedTourService(errorHandler, windowRef, dom) { var _this = this; this.errorHandler = errorHandler; this.windowRef = windowRef; this.dom = dom; this._guidedTourCurrentStepSubject = new Subject(); this._guidedTourOrbShowingSubject = new Subject(); this._currentTourStepIndex = 0; this._currentTour = null; this._onFirstStep = true; this._onLastStep = true; this._onResizeMessage = false; this.guidedTourCurrentStepStream = this._guidedTourCurrentStepSubject.asObservable(); this.guidedTourOrbShowingStream = this._guidedTourOrbShowingSubject.asObservable(); fromEvent(this.windowRef.nativeWindow, 'resize').pipe(debounceTime(200)).subscribe((/** * @return {?} */ function () { if (_this._currentTour && _this._currentTourStepIndex > -1) { if (_this._currentTour.minimumScreenSize && _this._currentTour.minimumScreenSize >= _this.windowRef.nativeWindow.innerWidth) { _this._onResizeMessage = true; /** @type {?} */ var dialog = _this._currentTour.resizeDialog || { title: 'Please resize', content: 'You have resized the tour to a size that is too small to continue. Please resize the browser to a larger size to continue the tour or close the tour.' }; _this._guidedTourCurrentStepSubject.next(dialog); } else { _this._onResizeMessage = false; _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } } })); } /** * @return {?} */ GuidedTourService.prototype.nextStep = /** * @return {?} */ function () { var _this = this; if (this._currentTour.steps[this._currentTourStepIndex].closeAction) { this._currentTour.steps[this._currentTourStepIndex].closeAction(); } if (this._currentTour.steps[this._currentTourStepIndex + 1]) { this._currentTourStepIndex++; this._setFirstAndLast(); if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); // Usually an action is opening something so we need to give it time to render. setTimeout((/** * @return {?} */ function () { if (_this._checkSelectorValidity()) { _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } else { _this.nextStep(); } })); } else { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } } if (this._currentTour.nextCallback) { this._currentTour.nextCallback(this._currentTourStepIndex, this._currentTour.steps[this._currentTourStepIndex]); } } else { if (this._currentTour.completeCallback) { this._currentTour.completeCallback(); } this.resetTour(); } }; /** * @return {?} */ GuidedTourService.prototype.backStep = /** * @return {?} */ function () { var _this = this; if (this._currentTour.steps[this._currentTourStepIndex].closeAction) { this._currentTour.steps[this._currentTourStepIndex].closeAction(); } if (this._currentTour.steps[this._currentTourStepIndex - 1]) { this._currentTourStepIndex--; this._setFirstAndLast(); if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); setTimeout((/** * @return {?} */ function () { if (_this._checkSelectorValidity()) { _this._guidedTourCurrentStepSubject.next(_this.getPreparedTourStep(_this._currentTourStepIndex)); } else { _this.backStep(); } })); } else { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.backStep(); } } if (this._currentTour.nextCallback) { this._currentTour.prevCallback(this._currentTourStepIndex, this._currentTour.steps[this._currentTourStepIndex]); } } else { this.resetTour(); } }; /** * @return {?} */ GuidedTourService.prototype.skipTour = /** * @return {?} */ function () { if (this._currentTour.skipCallback) { this._currentTour.skipCallback(this._currentTourStepIndex); } if (this._currentTour.closeModalCallback) { this._currentTour.closeModalCallback(); } this.resetTour(); }; /** * @return {?} */ GuidedTourService.prototype.resetTour = /** * @return {?} */ function () { this.dom.body.classList.remove('tour-open'); this._currentTour = null; this._currentTourStepIndex = 0; this._guidedTourCurrentStepSubject.next(null); }; /** * @param {?} tour * @return {?} */ GuidedTourService.prototype.startTour = /** * @param {?} tour * @return {?} */ function (tour) { this._currentTour = cloneDeep(tour); this._currentTour.steps = this._currentTour.steps.filter((/** * @param {?} step * @return {?} */ function (step) { return !step.skipStep; })); this._currentTourStepIndex = 0; this._setFirstAndLast(); this._guidedTourOrbShowingSubject.next(this._currentTour.useOrb); if (this._currentTour.steps.length > 0 && (!this._currentTour.minimumScreenSize || (this.windowRef.nativeWindow.innerWidth >= this._currentTour.minimumScreenSize))) { if (!this._currentTour.useOrb) { this.dom.body.classList.add('tour-open'); } if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); } if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } } }; /** * @return {?} */ GuidedTourService.prototype.activateOrb = /** * @return {?} */ function () { this._guidedTourOrbShowingSubject.next(false); this.dom.body.classList.add('tour-open'); }; /** * @private * @return {?} */ GuidedTourService.prototype._setFirstAndLast = /** * @private * @return {?} */ function () { this._onLastStep = (this._currentTour.steps.length - 1) === this._currentTourStepIndex; this._onFirstStep = this._currentTourStepIndex === 0; }; /** * @private * @return {?} */ GuidedTourService.prototype._checkSelectorValidity = /** * @private * @return {?} */ function () { if (this._currentTour.steps[this._currentTourStepIndex].selector) { /** @type {?} */ var selectedElement = this.dom.querySelector(this._currentTour.steps[this._currentTourStepIndex].selector); if (!selectedElement) { this.errorHandler.handleError( // If error handler is configured this should not block the browser. new Error("Error finding selector " + this._currentTour.steps[this._currentTourStepIndex].selector + " on step " + (this._currentTourStepIndex + 1) + " during guided tour: " + this._currentTour.tourId)); return false; } } return true; }; Object.defineProperty(GuidedTourService.prototype, "onLastStep", { get: /** * @return {?} */ function () { return this._onLastStep; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "onFirstStep", { get: /** * @return {?} */ function () { return this._onFirstStep; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "onResizeMessage", { get: /** * @return {?} */ function () { return this._onResizeMessage; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "currentTourStepDisplay", { get: /** * @return {?} */ function () { return this._currentTourStepIndex + 1; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "currentTourStepCount", { get: /** * @return {?} */ function () { return this._currentTour && this._currentTour.steps ? this._currentTour.steps.length : 0; }, enumerable: true, configurable: true }); Object.defineProperty(GuidedTourService.prototype, "preventBackdropFromAdvancing", { get: /** * @return {?} */ function () { return this._currentTour && this._currentTour.preventBackdropFromAdvancing; }, enumerable: true, configurable: true }); /** * @private * @param {?} index * @return {?} */ GuidedTourService.prototype.getPreparedTourStep = /** * @private * @param {?} index * @return {?} */ function (index) { return this.setTourOrientation(this._currentTour.steps[index]); }; /** * @private * @param {?} step * @return {?} */ GuidedTourService.prototype.setTourOrientation = /** * @private * @param {?} step * @return {?} */ function (step) { var _this = this; /** @type {?} */ var convertedStep = cloneDeep(step); if (convertedStep.orientation && !(typeof convertedStep.orientation === 'string') && ((/** @type {?} */ (convertedStep.orientation))).length) { ((/** @type {?} */ (convertedStep.orientation))).sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { if (!b.maximumSize) { return 1; } if (!a.maximumSize) { return -1; } return b.maximumSize - a.maximumSize; })); /** @type {?} */ var currentOrientation_1 = Orientation.Top; ((/** @type {?} */ (convertedStep.orientation))).forEach((/** * @param {?} orientationConfig * @return {?} */ function (orientationConfig) { if (!orientationConfig.maximumSize || _this.windowRef.nativeWindow.innerWidth <= orientationConfig.maximumSize) { currentOrientation_1 = orientationConfig.orientationDirection; } })); convertedStep.orientation = currentOrientation_1; } return convertedStep; }; GuidedTourService.decorators = [ { type: Injectable } ]; /** @nocollapse */ GuidedTourService.ctorParameters = function () { return [ { type: ErrorHandler }, { type: WindowRefService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; }; return GuidedTourService; }()); export { GuidedTourService }; if (false) { /** @type {?} */ GuidedTourService.prototype.guidedTourCurrentStepStream; /** @type {?} */ GuidedTourService.prototype.guidedTourOrbShowingStream; /** * @type {?} * @private */ GuidedTourService.prototype._guidedTourCurrentStepSubject; /** * @type {?} * @private */ GuidedTourService.prototype._guidedTourOrbShowingSubject; /** * @type {?} * @private */ GuidedTourService.prototype._currentTourStepIndex; /** * @type {?} * @private */ GuidedTourService.prototype._currentTour; /** * @type {?} * @private */ GuidedTourService.prototype._onFirstStep; /** * @type {?} * @private */ GuidedTourService.prototype._onLastStep; /** * @type {?} * @private */ GuidedTourService.prototype._onResizeMessage; /** @type {?} */ GuidedTourService.prototype.errorHandler; /** * @type {?} * @private */ GuidedTourService.prototype.windowRef; /** * @type {?} * @private */ GuidedTourService.prototype.dom; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGVkLXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NiLXRvdXItZ3VpZGUvIiwic291cmNlcyI6WyJsaWIvZ3VpZGVkLXRvdXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQWMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQXdCLFdBQVcsRUFBNEIsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RDtJQWFJLDJCQUNXLFlBQTBCLEVBQ3pCLFNBQTJCLEVBQ1QsR0FBRztRQUhqQyxpQkF3QkM7UUF2QlUsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDekIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDVCxRQUFHLEdBQUgsR0FBRyxDQUFBO1FBWHpCLGtDQUE2QixHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7UUFDeEQsaUNBQTRCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN0RCwwQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFDMUIsaUJBQVksR0FBZSxJQUFJLENBQUM7UUFDaEMsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBTzdCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckYsSUFB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O0NBQUEsQUFyT0QsSUFxT0M7U0FwT1ksaUJBQWlCOzs7SUFDMUIsd0RBQXlEOztJQUN6RCx1REFBdUQ7Ozs7O0lBRXZELDBEQUFnRTs7Ozs7SUFDaEUseURBQThEOzs7OztJQUM5RCxrREFBa0M7Ozs7O0lBQ2xDLHlDQUF3Qzs7Ozs7SUFDeEMseUNBQTRCOzs7OztJQUM1Qix3Q0FBMkI7Ozs7O0lBQzNCLDZDQUFpQzs7SUFHN0IseUNBQWlDOzs7OztJQUNqQyxzQ0FBbUM7Ozs7O0lBQ25DLGdDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciwgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEd1aWRlZFRvdXIsIFRvdXJTdGVwLCBPcmllbnRhdGlvbiwgT3JpZW50YXRpb25Db25maWd1cmF0aW9uIH0gZnJvbSAnLi9ndWlkZWQtdG91ci5jb25zdGFudHMnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgV2luZG93UmVmU2VydmljZSB9IGZyb20gXCIuL3dpbmRvd3JlZi5zZXJ2aWNlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHdWlkZWRUb3VyU2VydmljZSB7XG4gICAgcHVibGljIGd1aWRlZFRvdXJDdXJyZW50U3RlcFN0cmVhbTogT2JzZXJ2YWJsZTxUb3VyU3RlcD47XG4gICAgcHVibGljIGd1aWRlZFRvdXJPcmJTaG93aW5nU3RyZWFtOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgcHJpdmF0ZSBfZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdCA9IG5ldyBTdWJqZWN0PFRvdXJTdGVwPigpO1xuICAgIHByaXZhdGUgX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gICAgcHJpdmF0ZSBfY3VycmVudFRvdXJTdGVwSW5kZXggPSAwO1xuICAgIHByaXZhdGUgX2N1cnJlbnRUb3VyOiBHdWlkZWRUb3VyID0gbnVsbDtcbiAgICBwcml2YXRlIF9vbkZpcnN0U3RlcCA9IHRydWU7XG4gICAgcHJpdmF0ZSBfb25MYXN0U3RlcCA9IHRydWU7XG4gICAgcHJpdmF0ZSBfb25SZXNpemVNZXNzYWdlID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVyLFxuICAgICAgICBwcml2YXRlIHdpbmRvd1JlZjogV2luZG93UmVmU2VydmljZSxcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb21cbiAgICApIHtcbiAgICAgICAgdGhpcy5ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdHJlYW0gPSB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgICAgICB0aGlzLmd1aWRlZFRvdXJPcmJTaG93aW5nU3RyZWFtID0gdGhpcy5fZ3VpZGVkVG91ck9yYlNob3dpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3csICdyZXNpemUnKS5waXBlKGRlYm91bmNlVGltZSgyMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyICYmIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemUgJiYgdGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemUgPj0gdGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXNpemVNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nID0gdGhpcy5fY3VycmVudFRvdXIucmVzaXplRGlhbG9nIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUGxlYXNlIHJlc2l6ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAnWW91IGhhdmUgcmVzaXplZCB0aGUgdG91ciB0byBhIHNpemUgdGhhdCBpcyB0b28gc21hbGwgdG8gY29udGludWUuIFBsZWFzZSByZXNpemUgdGhlIGJyb3dzZXIgdG8gYSBsYXJnZXIgc2l6ZSB0byBjb250aW51ZSB0aGUgdG91ciBvciBjbG9zZSB0aGUgdG91ci4nXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KGRpYWxvZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25SZXNpemVNZXNzYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXh0U3RlcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5jbG9zZUFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmNsb3NlQWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ICsgMV0pIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4Kys7XG4gICAgICAgICAgICB0aGlzLl9zZXRGaXJzdEFuZExhc3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbigpO1xuICAgICAgICAgICAgICAgIC8vIFVzdWFsbHkgYW4gYWN0aW9uIGlzIG9wZW5pbmcgc29tZXRoaW5nIHNvIHdlIG5lZWQgdG8gZ2l2ZSBpdCB0aW1lIHRvIHJlbmRlci5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLm5leHRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLm5leHRDYWxsYmFjayh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCwgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5jb21wbGV0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuY29tcGxldGVDYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXNldFRvdXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBiYWNrU3RlcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5jbG9zZUFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmNsb3NlQWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4IC0gMV0pIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4LS07XG4gICAgICAgICAgICB0aGlzLl9zZXRGaXJzdEFuZExhc3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbigpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hlY2tTZWxlY3RvclZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja1N0ZXAoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hlY2tTZWxlY3RvclZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja1N0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIubmV4dENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIucHJldkNhbGxiYWNrKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4LCB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldFRvdXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBza2lwVG91cigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnNraXBDYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc2tpcENhbGxiYWNrKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuY2xvc2VNb2RhbENhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5jbG9zZU1vZGFsQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0VG91cigpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldFRvdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9tLmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgndG91ci1vcGVuJyk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0VG91cih0b3VyOiBHdWlkZWRUb3VyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyID0gY2xvbmVEZWVwKHRvdXIpO1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwcyA9IHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzLmZpbHRlcihzdGVwID0+ICFzdGVwLnNraXBTdGVwKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9zZXRGaXJzdEFuZExhc3QoKTtcbiAgICAgICAgdGhpcy5fZ3VpZGVkVG91ck9yYlNob3dpbmdTdWJqZWN0Lm5leHQodGhpcy5fY3VycmVudFRvdXIudXNlT3JiKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgJiYgKCF0aGlzLl9jdXJyZW50VG91ci5taW5pbXVtU2NyZWVuU2l6ZVxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuaW5uZXJXaWR0aCA+PSB0aGlzLl9jdXJyZW50VG91ci5taW5pbXVtU2NyZWVuU2l6ZSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jdXJyZW50VG91ci51c2VPcmIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvbS5ib2R5LmNsYXNzTGlzdC5hZGQoJ3RvdXItb3BlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hlY2tTZWxlY3RvclZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZU9yYigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZ3VpZGVkVG91ck9yYlNob3dpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLmRvbS5ib2R5LmNsYXNzTGlzdC5hZGQoJ3RvdXItb3BlbicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEZpcnN0QW5kTGFzdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25MYXN0U3RlcCA9ICh0aGlzLl9jdXJyZW50VG91ci5zdGVwcy5sZW5ndGggLSAxKSA9PT0gdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXg7XG4gICAgICAgIHRoaXMuX29uRmlyc3RTdGVwID0gdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggPT09IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hlY2tTZWxlY3RvclZhbGlkaXR5KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLnNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSB0aGlzLmRvbS5xdWVyeVNlbGVjdG9yKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5zZWxlY3Rvcik7XG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBlcnJvciBoYW5kbGVyIGlzIGNvbmZpZ3VyZWQgdGhpcyBzaG91bGQgbm90IGJsb2NrIHRoZSBicm93c2VyLlxuICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoYEVycm9yIGZpbmRpbmcgc2VsZWN0b3IgJHt0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uc2VsZWN0b3J9IG9uIHN0ZXAgJHt0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCArIDF9IGR1cmluZyBndWlkZWQgdG91cjogJHt0aGlzLl9jdXJyZW50VG91ci50b3VySWR9YClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9uTGFzdFN0ZXAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkxhc3RTdGVwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb25GaXJzdFN0ZXAoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkZpcnN0U3RlcDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9uUmVzaXplTWVzc2FnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uUmVzaXplTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUb3VyU3RlcERpc3BsYXkoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ICsgMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRUb3VyU3RlcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VG91ciAmJiB0aGlzLl9jdXJyZW50VG91ci5zdGVwcyA/IHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzLmxlbmd0aCA6IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcmV2ZW50QmFja2Ryb3BGcm9tQWR2YW5jaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRvdXIgJiYgdGhpcy5fY3VycmVudFRvdXIucHJldmVudEJhY2tkcm9wRnJvbUFkdmFuY2luZztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByZXBhcmVkVG91clN0ZXAoaW5kZXg6IG51bWJlcik6IFRvdXJTdGVwIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0VG91ck9yaWVudGF0aW9uKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW2luZGV4XSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRUb3VyT3JpZW50YXRpb24oc3RlcDogVG91clN0ZXApOiBUb3VyU3RlcCB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZFN0ZXAgPSBjbG9uZURlZXAoc3RlcCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbnZlcnRlZFN0ZXAub3JpZW50YXRpb25cbiAgICAgICAgICAgICYmICEodHlwZW9mIGNvbnZlcnRlZFN0ZXAub3JpZW50YXRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgJiYgKGNvbnZlcnRlZFN0ZXAub3JpZW50YXRpb24gYXMgT3JpZW50YXRpb25Db25maWd1cmF0aW9uW10pLmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIChjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uIGFzIE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbltdKS5zb3J0KChhOiBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb24sIGI6IE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghYi5tYXhpbXVtU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFhLm1heGltdW1TaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGIubWF4aW11bVNpemUgLSBhLm1heGltdW1TaXplO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50T3JpZW50YXRpb246IE9yaWVudGF0aW9uID0gT3JpZW50YXRpb24uVG9wO1xuICAgICAgICAgICAgKGNvbnZlcnRlZFN0ZXAub3JpZW50YXRpb24gYXMgT3JpZW50YXRpb25Db25maWd1cmF0aW9uW10pLmZvckVhY2goXG4gICAgICAgICAgICAgICAgKG9yaWVudGF0aW9uQ29uZmlnOiBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmllbnRhdGlvbkNvbmZpZy5tYXhpbXVtU2l6ZSB8fCB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuaW5uZXJXaWR0aCA8PSBvcmllbnRhdGlvbkNvbmZpZy5tYXhpbXVtU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9yaWVudGF0aW9uID0gb3JpZW50YXRpb25Db25maWcub3JpZW50YXRpb25EaXJlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uID0gY3VycmVudE9yaWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb252ZXJ0ZWRTdGVwO1xuICAgIH1cbn1cbiJdfQ==