UNPKG

igot-cb-tour-guide

Version:
227 lines 34.1 kB
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"; import * as i0 from "@angular/core"; import * as i1 from "./windowref.service"; export class GuidedTourService { errorHandler; windowRef; dom; guidedTourCurrentStepStream; guidedTourOrbShowingStream; _guidedTourCurrentStepSubject = new Subject(); _guidedTourOrbShowingSubject = new Subject(); _currentTourStepIndex = 0; _currentTour = null; _onFirstStep = true; _onLastStep = true; _onResizeMessage = false; constructor(errorHandler, windowRef, dom) { this.errorHandler = errorHandler; this.windowRef = windowRef; this.dom = dom; this.guidedTourCurrentStepStream = this._guidedTourCurrentStepSubject.asObservable(); this.guidedTourOrbShowingStream = this._guidedTourOrbShowingSubject.asObservable(); fromEvent(this.windowRef.nativeWindow, 'resize').pipe(debounceTime(200)).subscribe(() => { if (this._currentTour && this._currentTourStepIndex > -1) { if (this._currentTour.minimumScreenSize && this._currentTour.minimumScreenSize >= this.windowRef.nativeWindow.innerWidth) { this._onResizeMessage = true; const 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)); } } }); } nextStep() { 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(() => { 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(); } } backStep() { 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(() => { 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(); } } skipTour() { if (this._currentTour.skipCallback) { this._currentTour.skipCallback(this._currentTourStepIndex); } this.resetTour(); } resetTour() { this.dom.body.classList.remove('tour-open'); this._currentTour = null; this._currentTourStepIndex = 0; this._guidedTourCurrentStepSubject.next(null); } startTour(tour) { this._currentTour = cloneDeep(tour); this._currentTour.steps = this._currentTour.steps.filter(step => !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(); } } } activateOrb() { this._guidedTourOrbShowingSubject.next(false); this.dom.body.classList.add('tour-open'); } _setFirstAndLast() { this._onLastStep = (this._currentTour.steps.length - 1) === this._currentTourStepIndex; this._onFirstStep = this._currentTourStepIndex === 0; } _checkSelectorValidity() { if (this._currentTour.steps[this._currentTourStepIndex].selector) { const 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; } get onLastStep() { return this._onLastStep; } get onFirstStep() { return this._onFirstStep; } get onResizeMessage() { return this._onResizeMessage; } get currentTourStepDisplay() { return this._currentTourStepIndex + 1; } get currentTourStepCount() { return this._currentTour && this._currentTour.steps ? this._currentTour.steps.length : 0; } get preventBackdropFromAdvancing() { return this._currentTour && this._currentTour.preventBackdropFromAdvancing; } getPreparedTourStep(index) { return this.setTourOrientation(this._currentTour.steps[index]); } setTourOrientation(step) { const convertedStep = cloneDeep(step); if (convertedStep.orientation && !(typeof convertedStep.orientation === 'string') && convertedStep.orientation.length) { convertedStep.orientation.sort((a, b) => { if (!b.maximumSize) { return 1; } if (!a.maximumSize) { return -1; } return b.maximumSize - a.maximumSize; }); let currentOrientation = Orientation.Top; convertedStep.orientation.forEach((orientationConfig) => { if (!orientationConfig.maximumSize || this.windowRef.nativeWindow.innerWidth <= orientationConfig.maximumSize) { currentOrientation = orientationConfig.orientationDirection; } }); convertedStep.orientation = currentOrientation; } return convertedStep; } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidedTourService, deps: [{ token: i0.ErrorHandler }, { token: i1.WindowRefService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidedTourService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuidedTourService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.ErrorHandler }, { type: i1.WindowRefService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGVkLXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ndWlkZWQtdG91ci9zcmMvbGliL2d1aWRlZC10b3VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQWMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQXdCLFdBQVcsRUFBNEIsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBR3ZELE1BQU0sT0FBTyxpQkFBaUI7SUFhZjtJQUNDO0lBQ2tCO0lBZHZCLDJCQUEyQixDQUF1QjtJQUNsRCwwQkFBMEIsQ0FBc0I7SUFFL0MsNkJBQTZCLEdBQUcsSUFBSSxPQUFPLEVBQVksQ0FBQztJQUN4RCw0QkFBNEIsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBQ3RELHFCQUFxQixHQUFHLENBQUMsQ0FBQztJQUMxQixZQUFZLEdBQWUsSUFBSSxDQUFDO0lBQ2hDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDcEIsV0FBVyxHQUFHLElBQUksQ0FBQztJQUNuQixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFakMsWUFDVyxZQUEwQixFQUN6QixTQUEyQixFQUNULEdBQUc7UUFGdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDekIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDVCxRQUFHLEdBQUgsR0FBRyxDQUFB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QyxDQUFDLENBQUMsV0FBVyxFQUFFO29CQUNoQixPQUFPLENBQUMsQ0FBQztpQkFDWjtnQkFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtvQkFDaEIsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDYjtnQkFDRCxPQUFPLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksa0JBQWtCLEdBQWdCLFdBQVcsQ0FBQyxHQUFHLENBQUM7WUFDckQsYUFBYSxDQUFDLFdBQTBDLENBQUMsT0FBTyxDQUM3RCxDQUFDLGlCQUEyQyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxJQUFJLGlCQUFpQixDQUFDLFdBQVcsRUFBRTtvQkFDM0csa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsb0JBQW9CLENBQUM7aUJBQy9EO1lBQ0wsQ0FBQyxDQUNKLENBQUM7WUFFRixhQUFhLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDO1NBQ2xEO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDekIsQ0FBQzsySEFoT1EsaUJBQWlCLDhFQWVkLFFBQVE7K0hBZlgsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVOzswQkFnQkYsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3VpZGVkVG91ciwgVG91clN0ZXAsIE9yaWVudGF0aW9uLCBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2d1aWRlZC10b3VyLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBXaW5kb3dSZWZTZXJ2aWNlIH0gZnJvbSBcIi4vd2luZG93cmVmLnNlcnZpY2VcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEd1aWRlZFRvdXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3RyZWFtOiBPYnNlcnZhYmxlPFRvdXJTdGVwPjtcbiAgICBwdWJsaWMgZ3VpZGVkVG91ck9yYlNob3dpbmdTdHJlYW06IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBwcml2YXRlIF9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VG91clN0ZXA+KCk7XG4gICAgcHJpdmF0ZSBfZ3VpZGVkVG91ck9yYlNob3dpbmdTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICBwcml2YXRlIF9jdXJyZW50VG91clN0ZXBJbmRleCA9IDA7XG4gICAgcHJpdmF0ZSBfY3VycmVudFRvdXI6IEd1aWRlZFRvdXIgPSBudWxsO1xuICAgIHByaXZhdGUgX29uRmlyc3RTdGVwID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9vbkxhc3RTdGVwID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9vblJlc2l6ZU1lc3NhZ2UgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXIsXG4gICAgICAgIHByaXZhdGUgd2luZG93UmVmOiBXaW5kb3dSZWZTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvbVxuICAgICkge1xuICAgICAgICB0aGlzLmd1aWRlZFRvdXJDdXJyZW50U3RlcFN0cmVhbSA9IHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgIHRoaXMuZ3VpZGVkVG91ck9yYlNob3dpbmdTdHJlYW0gPSB0aGlzLl9ndWlkZWRUb3VyT3JiU2hvd2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICAgICAgZnJvbUV2ZW50KHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdywgJ3Jlc2l6ZScpLnBpcGUoZGVib3VuY2VUaW1lKDIwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIgJiYgdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5taW5pbXVtU2NyZWVuU2l6ZSAmJiB0aGlzLl9jdXJyZW50VG91ci5taW5pbXVtU2NyZWVuU2l6ZSA+PSB0aGlzLndpbmRvd1JlZi5uYXRpdmVXaW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblJlc2l6ZU1lc3NhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2cgPSB0aGlzLl9jdXJyZW50VG91ci5yZXNpemVEaWFsb2cgfHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdQbGVhc2UgcmVzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdZb3UgaGF2ZSByZXNpemVkIHRoZSB0b3VyIHRvIGEgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbCB0byBjb250aW51ZS4gUGxlYXNlIHJlc2l6ZSB0aGUgYnJvd3NlciB0byBhIGxhcmdlciBzaXplIHRvIGNvbnRpbnVlIHRoZSB0b3VyIG9yIGNsb3NlIHRoZSB0b3VyLidcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQoZGlhbG9nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblJlc2l6ZU1lc3NhZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRTdGVwKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmNsb3NlQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uY2xvc2VBY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggKyAxXSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgrKztcbiAgICAgICAgICAgIHRoaXMuX3NldEZpcnN0QW5kTGFzdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgLy8gVXN1YWxseSBhbiBhY3Rpb24gaXMgb3BlbmluZyBzb21ldGhpbmcgc28gd2UgbmVlZCB0byBnaXZlIGl0IHRpbWUgdG8gcmVuZGVyLlxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hlY2tTZWxlY3RvclZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hlY2tTZWxlY3RvclZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIubmV4dENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIubmV4dENhbGxiYWNrKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4LCB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLmNvbXBsZXRlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5jb21wbGV0ZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlc2V0VG91cigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGJhY2tTdGVwKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmNsb3NlQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uY2xvc2VBY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggLSAxXSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgtLTtcbiAgICAgICAgICAgIHRoaXMuX3NldEZpcnN0QW5kTGFzdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrU3RlcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5uZXh0Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5wcmV2Q2FsbGJhY2sodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgsIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0VG91cigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNraXBUb3VyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc2tpcENhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5za2lwQ2FsbGJhY2sodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXRUb3VyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0VG91cigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kb20uYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0b3VyLW9wZW4nKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRvdXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhcnRUb3VyKHRvdXI6IEd1aWRlZFRvdXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRvdXIgPSBjbG9uZURlZXAodG91cik7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzID0gdGhpcy5fY3VycmVudFRvdXIuc3RlcHMuZmlsdGVyKHN0ZXAgPT4gIXN0ZXAuc2tpcFN0ZXApO1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCA9IDA7XG4gICAgICAgIHRoaXMuX3NldEZpcnN0QW5kTGFzdCgpO1xuICAgICAgICB0aGlzLl9ndWlkZWRUb3VyT3JiU2hvd2luZ1N1YmplY3QubmV4dCh0aGlzLl9jdXJyZW50VG91ci51c2VPcmIpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5zdGVwcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAmJiAoIXRoaXMuX2N1cnJlbnRUb3VyLm1pbmltdW1TY3JlZW5TaXplXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5pbm5lcldpZHRoID49IHRoaXMuX2N1cnJlbnRUb3VyLm1pbmltdW1TY3JlZW5TaXplKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2N1cnJlbnRUb3VyLnVzZU9yYikge1xuICAgICAgICAgICAgICAgIHRoaXMuZG9tLmJvZHkuY2xhc3NMaXN0LmFkZCgndG91ci1vcGVuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5hY3Rpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlT3JiKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9ndWlkZWRUb3VyT3JiU2hvd2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMuZG9tLmJvZHkuY2xhc3NMaXN0LmFkZCgndG91ci1vcGVuJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Rmlyc3RBbmRMYXN0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkxhc3RTdGVwID0gKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzLmxlbmd0aCAtIDEpID09PSB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleDtcbiAgICAgICAgdGhpcy5fb25GaXJzdFN0ZXAgPSB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCA9PT0gMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHRoaXMuZG9tLnF1ZXJ5U2VsZWN0b3IodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLnNlbGVjdG9yKTtcbiAgICAgICAgICAgIGlmICghc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGVycm9yIGhhbmRsZXIgaXMgY29uZmlndXJlZCB0aGlzIHNob3VsZCBub3QgYmxvY2sgdGhlIGJyb3dzZXIuXG4gICAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihgRXJyb3IgZmluZGluZyBzZWxlY3RvciAke3RoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5zZWxlY3Rvcn0gb24gc3RlcCAke3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ICsgMX0gZHVyaW5nIGd1aWRlZCB0b3VyOiAke3RoaXMuX2N1cnJlbnRUb3VyLnRvdXJJZH1gKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb25MYXN0U3RlcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uTGFzdFN0ZXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvbkZpcnN0U3RlcCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRmlyc3RTdGVwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb25SZXNpemVNZXNzYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25SZXNpemVNZXNzYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFRvdXJTdGVwRGlzcGxheSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggKyAxO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY3VycmVudFRvdXJTdGVwQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUb3VyICYmIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzID8gdGhpcy5fY3VycmVudFRvdXIuc3RlcHMubGVuZ3RoIDogMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHByZXZlbnRCYWNrZHJvcEZyb21BZHZhbmNpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VG91ciAmJiB0aGlzLl9jdXJyZW50VG91ci5wcmV2ZW50QmFja2Ryb3BGcm9tQWR2YW5jaW5nO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJlcGFyZWRUb3VyU3RlcChpbmRleDogbnVtYmVyKTogVG91clN0ZXAge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRUb3VyT3JpZW50YXRpb24odGhpcy5fY3VycmVudFRvdXIuc3RlcHNbaW5kZXhdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFRvdXJPcmllbnRhdGlvbihzdGVwOiBUb3VyU3RlcCk6IFRvdXJTdGVwIHtcbiAgICAgICAgY29uc3QgY29udmVydGVkU3RlcCA9IGNsb25lRGVlcChzdGVwKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29udmVydGVkU3RlcC5vcmllbnRhdGlvblxuICAgICAgICAgICAgJiYgISh0eXBlb2YgY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAmJiAoY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiBhcyBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb25bXSkubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgKGNvbnZlcnRlZFN0ZXAub3JpZW50YXRpb24gYXMgT3JpZW50YXRpb25Db25maWd1cmF0aW9uW10pLnNvcnQoKGE6IE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbiwgYjogT3JpZW50YXRpb25Db25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFiLm1heGltdW1TaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWEubWF4aW11bVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYi5tYXhpbXVtU2l6ZSAtIGEubWF4aW11bVNpemU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IGN1cnJlbnRPcmllbnRhdGlvbjogT3JpZW50YXRpb24gPSBPcmllbnRhdGlvbi5Ub3A7XG4gICAgICAgICAgICAoY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiBhcyBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb25bXSkuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAob3JpZW50YXRpb25Db25maWc6IE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaWVudGF0aW9uQ29uZmlnLm1heGltdW1TaXplIHx8IHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5pbm5lcldpZHRoIDw9IG9yaWVudGF0aW9uQ29uZmlnLm1heGltdW1TaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3JpZW50YXRpb24gPSBvcmllbnRhdGlvbkNvbmZpZy5vcmllbnRhdGlvbkRpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnZlcnRlZFN0ZXAub3JpZW50YXRpb24gPSBjdXJyZW50T3JpZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFN0ZXA7XG4gICAgfVxufVxuIl19