UNPKG

@w11k/ngx-present

Version:

Angular based Presentation Tool

880 lines 56.4 kB
/** * @fileoverview added by tsickle * Generated from: lib/slide-by-slide/slide-by-slide.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __extends, __read, __spread } from "tslib"; import { Injectable, Injector } from '@angular/core'; import { Router } from '@angular/router'; import { skipNil, skipPropertyNil } from '@w11k/rx-ninja'; import { Commands, Facade } from '@w11k/tydux'; import { combineLatest, Subject } from 'rxjs'; import { filter, map, take, takeUntil, withLatestFrom } from 'rxjs/operators'; import { isNotEditable, nonNavigationEvent } from '../core/event.service'; import { PresentationService } from '../core/presentation.service'; import { Slide } from '../core/presentation.types'; import { flattenDeep, maxDepth } from '../core/utils'; import { tableOfContentSlides } from '../theming/table-of-content'; import { calculateCoordinates, compareCoordinates, coordinateToSlideMap, equalCoordinates, isValidCoordinate, routeParamsToCoordinate, } from './slide-by-slide.functions'; import * as i0 from "@angular/core"; import * as i1 from "../core/presentation.service"; import * as i2 from "@angular/router"; var SlideBySlideState = /** @class */ (function () { function SlideBySlideState() { this.coordinatesMaxDepth = 0; this.slides = []; this.slideMap = {}; } return SlideBySlideState; }()); export { SlideBySlideState }; if (false) { /** @type {?} */ SlideBySlideState.prototype.coordinatesMaxDepth; /** @type {?} */ SlideBySlideState.prototype.slides; /** @type {?} */ SlideBySlideState.prototype.slideMap; /** @type {?} */ SlideBySlideState.prototype.currentSlide; /** @type {?} */ SlideBySlideState.prototype.currentMode; } var SlideBySlideMutator = /** @class */ (function (_super) { __extends(SlideBySlideMutator, _super); function SlideBySlideMutator() { return _super.call(this) || this; } /** * @param {?} slide * @return {?} */ SlideBySlideMutator.prototype.setCurrentSlide = /** * @param {?} slide * @return {?} */ function (slide) { this.state.currentSlide = slide; }; /** * @param {?} mode * @return {?} */ SlideBySlideMutator.prototype.setCurrentMode = /** * @param {?} mode * @return {?} */ function (mode) { this.state.currentMode = mode; }; /** * @param {?} slides * @return {?} */ SlideBySlideMutator.prototype.setSlides = /** * @param {?} slides * @return {?} */ function (slides) { this.state.coordinatesMaxDepth = maxDepth(slides); this.state.slides = flattenDeep(slides); this.state.slideMap = coordinateToSlideMap(this.state.slides); }; return SlideBySlideMutator; }(Commands)); export { SlideBySlideMutator }; var SlideBySlideService = /** @class */ (function (_super) { __extends(SlideBySlideService, _super); function SlideBySlideService(injector, presentation, router) { var _this = _super.call(this, 'SlideBySlide', new SlideBySlideState(), new SlideBySlideMutator()) || this; _this.presentation = presentation; _this.router = router; _this.onDestroy$ = new Subject(); _this.presentation.select((/** * @param {?} state * @return {?} */ function (state) { return state.slides; })) .pipe(takeUntil(_this.onDestroy$)) .subscribe((/** * @param {?} slides * @return {?} */ function (slides) { return _this.commands.setSlides(slides); })); return _this; } /** * @param {?} coordinatesToKeep * @param {?=} mode * @return {?} */ SlideBySlideService.prototype.navigateToNext = /** * @param {?} coordinatesToKeep * @param {?=} mode * @return {?} */ function (coordinatesToKeep, mode) { var _this = this; this.nextSlide(coordinatesToKeep) .pipe(take(1)) .subscribe((/** * @param {?} slide * @return {?} */ function (slide) { return _this.navigateAbsolute(slide, mode); })); }; /** * @param {?} coordinatesToKeep * @param {?=} mode * @return {?} */ SlideBySlideService.prototype.navigateToPrevious = /** * @param {?} coordinatesToKeep * @param {?=} mode * @return {?} */ function (coordinatesToKeep, mode) { var _this = this; this.previousSlide(coordinatesToKeep) .pipe(take(1)) .subscribe((/** * @param {?} slide * @return {?} */ function (slide) { return _this.navigateAbsolute(slide, mode); })); }; /** * @param {?} coordinatesToKeep * @param {?=} prefix * @return {?} */ SlideBySlideService.prototype.previousSlide = /** * @param {?} coordinatesToKeep * @param {?=} prefix * @return {?} */ function (coordinatesToKeep, prefix) { return this.navigateRelative(-1, coordinatesToKeep); }; /** * @param {?} coordinatesToKeep * @return {?} */ SlideBySlideService.prototype.nextSlide = /** * @param {?} coordinatesToKeep * @return {?} */ function (coordinatesToKeep) { return this.navigateRelative(1, coordinatesToKeep); }; /** * @param {?=} mode * @return {?} */ SlideBySlideService.prototype.navigateToNextToc = /** * @param {?=} mode * @return {?} */ function (mode) { var _this = this; this.nextToc('forward') .pipe(take(1)) .subscribe((/** * @param {?} slide * @return {?} */ function (slide) { return _this.navigateAbsolute(slide, mode); })); }; /** * @param {?=} mode * @return {?} */ SlideBySlideService.prototype.navigateToPreviousToc = /** * @param {?=} mode * @return {?} */ function (mode) { var _this = this; this.nextToc('backward') .pipe(take(1)) .subscribe((/** * @param {?} slide * @return {?} */ function (slide) { return _this.navigateAbsolute(slide, mode); })); }; /** * @param {?} direction * @return {?} */ SlideBySlideService.prototype.nextToc = /** * @param {?} direction * @return {?} */ function (direction) { /** @type {?} */ var currentSlide$ = this.select((/** * @param {?} state * @return {?} */ function (state) { return state.currentSlide; })) .pipe(skipNil()); /** @type {?} */ var tocSlides$ = this.select((/** * @param {?} state * @return {?} */ function (state) { return state.slides; })) .pipe(skipNil(), filter((/** * @param {?} x * @return {?} */ function (x) { return x.length !== 0; })), map(tableOfContentSlides)); return combineLatest(currentSlide$, tocSlides$) .pipe(map((/** * @param {?} __0 * @return {?} */ function (_a) { var _b = __read(_a, 2), currentSlide = _b[0], tocSlides = _b[1]; if (direction === 'forward') { return tocSlides.find((/** * @param {?} tocSlide * @return {?} */ function (tocSlide) { return compareCoordinates(tocSlide.coordinates, currentSlide.coordinates) === 1; })); } else { return tocSlides.slice().reverse().find((/** * @param {?} tocSlide * @return {?} */ function (tocSlide) { return compareCoordinates(tocSlide.coordinates, currentSlide.coordinates) === -1; })); } }))); }; /** * @param {?} move * @param {?} coordinatesToKeep * @return {?} */ SlideBySlideService.prototype.navigateRelative = /** * @param {?} move * @param {?} coordinatesToKeep * @return {?} */ function (move, coordinatesToKeep) { /** @type {?} */ var currentSlide$ = this.select((/** * @param {?} state * @return {?} */ function (state) { return state.currentSlide; })) .pipe(skipNil()); /** @type {?} */ var slides$ = this.select((/** * @param {?} state * @return {?} */ function (state) { return state.slides; })) .pipe(skipNil(), filter((/** * @param {?} x * @return {?} */ function (x) { return x.length !== 0; }))); /** @type {?} */ var depth$ = this.select((/** * @param {?} state * @return {?} */ function (state) { return state.coordinatesMaxDepth; })) .pipe(skipNil()); return combineLatest(slides$, currentSlide$, depth$) .pipe(map((/** * @param {?} __0 * @return {?} */ function (_a) { var _b = __read(_a, 3), slides = _b[0], current = _b[1], depth = _b[2]; return calculateCoordinates(slides, current, move, coordinatesToKeep, depth); }))); }; /** * @param {?} target * @param {?=} mode * @return {?} */ SlideBySlideService.prototype.navigateAbsolute = /** * @param {?} target * @param {?=} mode * @return {?} */ function (target, mode) { /** @type {?} */ var slide; if (target instanceof Slide) { slide = target; } else { slide = this.state.slides.find((/** * @param {?} x * @return {?} */ function (x) { return equalCoordinates(target, x.coordinates); })); } if (slide === undefined) { return; } /** @type {?} */ var modeWithFallback; if (mode !== undefined) { modeWithFallback = mode; } else if (this.state.currentMode !== undefined) { modeWithFallback = this.state.currentMode; } else { modeWithFallback = 'slide'; } /** @type {?} */ var link = __spread(["/" + modeWithFallback], slide.coordinates); return this.router.navigate(link, { queryParamsHandling: 'merge' }); }; /** * @param {?=} prefix * @return {?} */ SlideBySlideService.prototype.navigateToFirst = /** * @param {?=} prefix * @return {?} */ function (prefix) { var _this = this; this.firstSlide() .pipe(take(1), takeUntil(this.onDestroy$)) .subscribe((/** * @param {?} slide * @return {?} */ function (slide) { return _this.navigateAbsolute(slide, prefix); })); }; /** * @return {?} */ SlideBySlideService.prototype.firstSlide = /** * @return {?} */ function () { return this.select((/** * @param {?} state * @return {?} */ function (state) { return state.slides; })) .pipe(skipNil(), filter((/** * @param {?} slides * @return {?} */ function (slides) { return slides.length > 0; })), map((/** * @param {?} slides * @return {?} */ function (slides) { return slides[0]; }))); }; /** * @param {?} coordinates * @return {?} */ SlideBySlideService.prototype.isValidCoordinate = /** * @param {?} coordinates * @return {?} */ function (coordinates) { return this.presentation.select((/** * @param {?} state * @return {?} */ function (state) { return state.slides; })) .pipe(skipNil(), filter((/** * @param {?} slides * @return {?} */ function (slides) { return slides.length > 0; })), map((/** * @param {?} slides * @return {?} */ function (slides) { return isValidCoordinate(slides, coordinates); }))); }; /** * @private * @param {?} coordinates * @return {?} */ SlideBySlideService.prototype.coordinatesToSlide = /** * @private * @param {?} coordinates * @return {?} */ function (coordinates) { return this.state.slideMap[coordinates.join('.')]; }; /** * @param {?} route * @return {?} */ SlideBySlideService.prototype.setCurrentModeAndSlide = /** * @param {?} route * @return {?} */ function (route) { /** @type {?} */ var coordinates = routeParamsToCoordinate(route.params); /** @type {?} */ var mode = (/** @type {?} */ (route.url[0].path)); /** @type {?} */ var slide = this.coordinatesToSlide(coordinates); this.commands.setCurrentSlide(slide); this.commands.setCurrentMode(mode); }; /** * @return {?} */ SlideBySlideService.prototype.ngOnDestroy = /** * @return {?} */ function () { this.onDestroy$.next(); }; SlideBySlideService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ SlideBySlideService.ctorParameters = function () { return [ { type: Injector }, { type: PresentationService }, { type: Router } ]; }; /** @nocollapse */ SlideBySlideService.ɵprov = i0.ɵɵdefineInjectable({ factory: function SlideBySlideService_Factory() { return new SlideBySlideService(i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.PresentationService), i0.ɵɵinject(i2.Router)); }, token: SlideBySlideService, providedIn: "root" }); return SlideBySlideService; }(Facade)); export { SlideBySlideService }; if (false) { /** * @type {?} * @private */ SlideBySlideService.prototype.onDestroy$; /** * @type {?} * @private */ SlideBySlideService.prototype.presentation; /** * @type {?} * @private */ SlideBySlideService.prototype.router; } var NavigateSectionForward = /** @class */ (function () { function NavigateSectionForward(service) { this.service = service; } /** * @param {?} events$ * @return {?} */ NavigateSectionForward.prototype.init = /** * @param {?} events$ * @return {?} */ function (events$) { var _this = this; events$ .pipe(filter(isNotEditable), // arrow down + alt || arrow right + alt filter((/** * @param {?} event * @return {?} */ function (event) { if (event.keyCode === 40 && event.altKey) { return true; } else if (event.keyCode === 39 && event.altKey) { return true; } return false; }))) .subscribe((/** * @return {?} */ function () { _this.service.navigateToNextToc(); })); }; NavigateSectionForward.decorators = [ { type: Injectable } ]; /** @nocollapse */ NavigateSectionForward.ctorParameters = function () { return [ { type: SlideBySlideService } ]; }; return NavigateSectionForward; }()); export { NavigateSectionForward }; if (false) { /** * @type {?} * @private */ NavigateSectionForward.prototype.service; } var NavigateSlideForward = /** @class */ (function () { function NavigateSlideForward(service) { this.service = service; } /** * @param {?} events$ * @return {?} */ NavigateSlideForward.prototype.init = /** * @param {?} events$ * @return {?} */ function (events$) { var _this = this; events$ .pipe(filter(nonNavigationEvent), // arrow down, arrow right, or page down filter((/** * @param {?} event * @return {?} */ function (event) { return event.keyCode === 40 || event.keyCode === 39 || event.keyCode === 34; }))) .subscribe((/** * @return {?} */ function () { _this.service.navigateToNext(-1); })); }; NavigateSlideForward.decorators = [ { type: Injectable } ]; /** @nocollapse */ NavigateSlideForward.ctorParameters = function () { return [ { type: SlideBySlideService } ]; }; return NavigateSlideForward; }()); export { NavigateSlideForward }; if (false) { /** * @type {?} * @private */ NavigateSlideForward.prototype.service; } var NavigateSectionBackward = /** @class */ (function () { function NavigateSectionBackward(service) { this.service = service; } /** * @param {?} events$ * @return {?} */ NavigateSectionBackward.prototype.init = /** * @param {?} events$ * @return {?} */ function (events$) { var _this = this; events$ .pipe(filter(isNotEditable), // arrow up + alt || arrow left + alt filter((/** * @param {?} event * @return {?} */ function (event) { if (event.keyCode === 38 && event.altKey) { return true; } else if (event.keyCode === 37 && event.altKey) { return true; } return false; }))) .subscribe((/** * @return {?} */ function () { _this.service.navigateToPreviousToc(); })); }; NavigateSectionBackward.decorators = [ { type: Injectable } ]; /** @nocollapse */ NavigateSectionBackward.ctorParameters = function () { return [ { type: SlideBySlideService } ]; }; return NavigateSectionBackward; }()); export { NavigateSectionBackward }; if (false) { /** * @type {?} * @private */ NavigateSectionBackward.prototype.service; } var NavigateSlideBackward = /** @class */ (function () { function NavigateSlideBackward(service) { this.service = service; } /** * @param {?} events$ * @return {?} */ NavigateSlideBackward.prototype.init = /** * @param {?} events$ * @return {?} */ function (events$) { var _this = this; events$ .pipe(filter(nonNavigationEvent), // arrow up, arrow left or page up filter((/** * @param {?} event * @return {?} */ function (event) { return event.keyCode === 38 || event.keyCode === 37 || event.keyCode === 33; }))) .subscribe((/** * @return {?} */ function () { _this.service.navigateToPrevious(-1); })); }; NavigateSlideBackward.decorators = [ { type: Injectable } ]; /** @nocollapse */ NavigateSlideBackward.ctorParameters = function () { return [ { type: SlideBySlideService } ]; }; return NavigateSlideBackward; }()); export { NavigateSlideBackward }; if (false) { /** * @type {?} * @private */ NavigateSlideBackward.prototype.service; } var NavigateToFirstSlide = /** @class */ (function () { function NavigateToFirstSlide(service) { this.service = service; } /** * @param {?} events$ * @return {?} */ NavigateToFirstSlide.prototype.init = /** * @param {?} events$ * @return {?} */ function (events$) { var _this = this; events$ .pipe(filter(nonNavigationEvent), // pos 1 filter((/** * @param {?} event * @return {?} */ function (event) { return event.keyCode === 36; }))) .subscribe((/** * @return {?} */ function () { _this.service.navigateToFirst(); })); }; NavigateToFirstSlide.decorators = [ { type: Injectable } ]; /** @nocollapse */ NavigateToFirstSlide.ctorParameters = function () { return [ { type: SlideBySlideService } ]; }; return NavigateToFirstSlide; }()); export { NavigateToFirstSlide }; if (false) { /** * @type {?} * @private */ NavigateToFirstSlide.prototype.service; } var NavigateToOverview = /** @class */ (function () { function NavigateToOverview(service, presentation) { this.service = service; this.presentation = presentation; } /** * @param {?} events$ * @return {?} */ NavigateToOverview.prototype.init = /** * @param {?} events$ * @return {?} */ function (events$) { var _this = this; /** @type {?} */ var config$ = this.presentation.select((/** * @param {?} state * @return {?} */ function (state) { return state.config.navigation.overview; })) .pipe(skipPropertyNil('component')); /** @type {?} */ var slide$ = this.service.select() .pipe(withLatestFrom(config$), map((/** * @param {?} __0 * @return {?} */ function (_a) { var _b = __read(_a, 2), state = _b[0], config = _b[1]; return state.slides.find((/** * @param {?} slide * @return {?} */ function (slide) { return slide.component === config.component; })); }))); events$ .pipe(filter(nonNavigationEvent), // pos 1 filter((/** * @param {?} event * @return {?} */ function (event) { // o return event.keyCode === 79; })), withLatestFrom(slide$)) .subscribe((/** * @param {?} __0 * @return {?} */ function (_a) { var _b = __read(_a, 2), event = _b[0], slide = _b[1]; _this.service.navigateAbsolute(slide); })); }; NavigateToOverview.decorators = [ { type: Injectable } ]; /** @nocollapse */ NavigateToOverview.ctorParameters = function () { return [ { type: SlideBySlideService }, { type: PresentationService } ]; }; return NavigateToOverview; }()); export { NavigateToOverview }; if (false) { /** * @type {?} * @private */ NavigateToOverview.prototype.service; /** * @type {?} * @private */ NavigateToOverview.prototype.presentation; } var TogglePresenter = /** @class */ (function () { function TogglePresenter(service, router) { this.service = service; this.router = router; } /** * @param {?} events$ * @return {?} */ TogglePresenter.prototype.init = /** * @param {?} events$ * @return {?} */ function (events$) { var _this = this; /** @type {?} */ var slide$ = this.service.select(); events$ .pipe(filter(isNotEditable), // letter p filter((/** * @param {?} event * @return {?} */ function (event) { return event.keyCode === 80 && event.altKey; })), withLatestFrom(slide$)) .subscribe((/** * @param {?} __0 * @return {?} */ function (_a) { var _b = __read(_a, 2), event = _b[0], state = _b[1]; /** @type {?} */ var mode; if (state.currentMode === 'presenter') { mode = 'slide'; } else { mode = 'presenter'; } /** @type {?} */ var coordinates = []; if (state.currentSlide !== undefined) { coordinates = state.currentSlide.coordinates; } /** @type {?} */ var link = __spread([mode], coordinates); _this.router.navigate(link, { queryParamsHandling: 'merge' }); })); }; TogglePresenter.decorators = [ { type: Injectable } ]; /** @nocollapse */ TogglePresenter.ctorParameters = function () { return [ { type: SlideBySlideService }, { type: Router } ]; }; return TogglePresenter; }()); export { TogglePresenter }; if (false) { /** * @type {?} * @private */ TogglePresenter.prototype.service; /** * @type {?} * @private */ TogglePresenter.prototype.router; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtYnktc2xpZGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B3MTFrL25neC1wcmVzZW50LyIsInNvdXJjZXMiOlsibGliL3NsaWRlLWJ5LXNsaWRlL3NsaWRlLWJ5LXNsaWRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUEwQixNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBMEIsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQWUsS0FBSyxFQUFVLE1BQU0sNEJBQTRCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsdUJBQXVCLEdBQ3hCLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFJcEM7SUFPRTtRQU5PLHdCQUFtQixHQUFHLENBQUMsQ0FBQztR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QUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDOztnQkFsQ0YsVUFBVTs7OztnQkFFNkIsbUJBQW1CO2dCQTVXMUIsTUFBTTs7SUE2WXZDLHNCQUFDO0NBQUEsQUFuQ0QsSUFtQ0M7U0FsQ1ksZUFBZTs7Ozs7O0lBQ2Qsa0NBQTZDOzs7OztJQUM3QyxpQ0FBK0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgc2tpcE5pbCwgc2tpcFByb3BlcnR5TmlsIH0gZnJvbSAnQHcxMWsvcngtbmluamEnO1xuaW1wb3J0IHsgQ29tbWFuZHMsIEZhY2FkZSB9IGZyb20gJ0B3MTFrL3R5ZHV4JztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlLCB0YWtlVW50aWwsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNOb3RFZGl0YWJsZSwgS2V5Ym9hcmRFdmVudFByb2Nlc3Nvciwgbm9uTmF2aWdhdGlvbkV2ZW50IH0gZnJvbSAnLi4vY29yZS9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXNlbnRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3ByZXNlbnRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvb3JkaW5hdGVzLCBTbGlkZSwgU2xpZGVzIH0gZnJvbSAnLi4vY29yZS9wcmVzZW50YXRpb24udHlwZXMnO1xuaW1wb3J0IHsgZmxhdHRlbkRlZXAsIG1heERlcHRoIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyB0YWJsZU9mQ29udGVudFNsaWRlcyB9IGZyb20gJy4uL3RoZW1pbmcvdGFibGUtb2YtY29udGVudCc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVDb29yZGluYXRlcyxcbiAgY29tcGFyZUNvb3JkaW5hdGVzLFxuICBjb29yZGluYXRlVG9TbGlkZU1hcCxcbiAgZXF1YWxDb29yZGluYXRlcyxcbiAgaXNWYWxpZENvb3JkaW5hdGUsXG4gIHJvdXRlUGFyYW1zVG9Db29yZGluYXRlLFxufSBmcm9tICcuL3NsaWRlLWJ5LXNsaWRlLmZ1bmN0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIE1vZGUgPSAnc2xpZGUnIHwgJ3ByZXNlbnRlcic7XG5cbmV4cG9ydCBjbGFzcyBTbGlkZUJ5U2xpZGVTdGF0ZSB7XG4gIHB1YmxpYyBjb29yZGluYXRlc01heERlcHRoID0gMDtcbiAgcHVibGljIHNsaWRlczogU2xpZGVbXSA9IFtdO1xuICBwdWJsaWMgc2xpZGVNYXA6IHsgW2tleTogc3RyaW5nXTogU2xpZGUgfSA9IHt9O1xuICBwdWJsaWMgY3VycmVudFNsaWRlOiBTbGlkZSB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGN1cnJlbnRNb2RlOiBNb2RlIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbn1cblxuZXhwb3J0IGNsYXNzIFNsaWRlQnlTbGlkZU11dGF0b3IgZXh0ZW5kcyBDb21tYW5kczxTbGlkZUJ5U2xpZGVTdGF0ZT4ge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBzZXRDdXJyZW50U2xpZGUoc2xpZGU6IFNsaWRlKSB7XG4gICAgdGhpcy5zdGF0ZS5jdXJyZW50U2xpZGUgPSBzbGlkZTtcbiAgfVxuXG4gIHNldEN1cnJlbnRNb2RlKG1vZGU6IE1vZGUpIHtcbiAgICB0aGlzLnN0YXRlLmN1cnJlbnRNb2RlID0gbW9kZTtcbiAgfVxuXG4gIHNldFNsaWRlcyhzbGlkZXM6IFNsaWRlcykge1xuICAgIHRoaXMuc3RhdGUuY29vcmRpbmF0ZXNNYXhEZXB0aCA9IG1heERlcHRoKHNsaWRlcyk7XG4gICAgdGhpcy5zdGF0ZS5zbGlkZXMgPSBmbGF0dGVuRGVlcChzbGlkZXMpO1xuICAgIHRoaXMuc3RhdGUuc2xpZGVNYXAgPSBjb29yZGluYXRlVG9TbGlkZU1hcCh0aGlzLnN0YXRlLnNsaWRlcyk7XG4gIH1cblxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTbGlkZUJ5U2xpZGVTZXJ2aWNlIGV4dGVuZHMgRmFjYWRlPFNsaWRlQnlTbGlkZVN0YXRlLCBTbGlkZUJ5U2xpZGVNdXRhdG9yPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHByZXNlbnRhdGlvbjogUHJlc2VudGF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcikge1xuICAgIHN1cGVyKCdTbGlkZUJ5U2xpZGUnLCBuZXcgU2xpZGVCeVNsaWRlU3RhdGUoKSwgbmV3IFNsaWRlQnlTbGlkZU11dGF0b3IoKSk7XG5cbiAgICB0aGlzLnByZXNlbnRhdGlvbi5zZWxlY3Qoc3RhdGUgPT4gc3RhdGUuc2xpZGVzKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKHNsaWRlcyA9PiB0aGlzLmNvbW1hbmRzLnNldFNsaWRlcyhzbGlkZXMpKTtcbiAgfVxuXG4gIG5hdmlnYXRlVG9OZXh0KGNvb3JkaW5hdGVzVG9LZWVwOiBudW1iZXIgfCB1bmRlZmluZWQsIG1vZGU/OiBzdHJpbmcpIHtcbiAgICB0aGlzLm5leHRTbGlkZShjb29yZGluYXRlc1RvS2VlcClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKHNsaWRlID0+IHRoaXMubmF2aWdhdGVBYnNvbHV0ZShzbGlkZSwgbW9kZSkpO1xuICB9XG5cbiAgbmF2aWdhdGVUb1ByZXZpb3VzKGNvb3JkaW5hdGVzVG9LZWVwOiBudW1iZXIgfCB1bmRlZmluZWQsIG1vZGU/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnByZXZpb3VzU2xpZGUoY29vcmRpbmF0ZXNUb0tlZXApXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShzbGlkZSA9PiB0aGlzLm5hdmlnYXRlQWJzb2x1dGUoc2xpZGUsIG1vZGUpKTtcbiAgfVxuXG4gIHByZXZpb3VzU2xpZGUoY29vcmRpbmF0ZXNUb0tlZXA6IG51bWJlciB8IHVuZGVmaW5lZCwgcHJlZml4Pzogc3RyaW5nKTogT2JzZXJ2YWJsZTxTbGlkZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRlUmVsYXRpdmUoLTEsIGNvb3JkaW5hdGVzVG9LZWVwKTtcbiAgfVxuXG4gIG5leHRTbGlkZShjb29yZGluYXRlc1RvS2VlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxTbGlkZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYXRlUmVsYXRpdmUoMSwgY29vcmRpbmF0ZXNUb0tlZXApO1xuICB9XG5cbiAgbmF2aWdhdGVUb05leHRUb2MobW9kZT86IHN0cmluZykge1xuICAgIHRoaXMubmV4dFRvYygnZm9yd2FyZCcpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShzbGlkZSA9PiB0aGlzLm5hdmlnYXRlQWJzb2x1dGUoc2xpZGUsIG1vZGUpKTtcbiAgfVxuXG4gIG5hdmlnYXRlVG9QcmV2aW91c1RvYyhtb2RlPzogc3RyaW5nKSB7XG4gICAgdGhpcy5uZXh0VG9jKCdiYWNrd2FyZCcpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShzbGlkZSA9PiB0aGlzLm5hdmlnYXRlQWJzb2x1dGUoc2xpZGUsIG1vZGUpKTtcbiAgfVxuXG4gIG5leHRUb2MoZGlyZWN0aW9uOiAnZm9yd2FyZCcgfCAnYmFja3dhcmQnKTogT2JzZXJ2YWJsZTxTbGlkZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRTbGlkZSQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5jdXJyZW50U2xpZGUpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpLFxuICAgICAgKTtcblxuICAgIGNvbnN0IHRvY1NsaWRlcyQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zbGlkZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpLFxuICAgICAgICBmaWx0ZXIoeCA9PiB4Lmxlbmd0aCAhPT0gMCksXG4gICAgICAgIG1hcCh0YWJsZU9mQ29udGVudFNsaWRlcyksXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoY3VycmVudFNsaWRlJCwgdG9jU2xpZGVzJClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKFtjdXJyZW50U2xpZGUsIHRvY1NsaWRlc10pID0+IHtcbiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAnZm9yd2FyZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2NTbGlkZXMuZmluZCh0b2NTbGlkZSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBjb21wYXJlQ29vcmRpbmF0ZXModG9jU2xpZGUuY29vcmRpbmF0ZXMsIGN1cnJlbnRTbGlkZS5jb29yZGluYXRlcykgPT09IDE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRvY1NsaWRlcy5zbGljZSgpLnJldmVyc2UoKS5maW5kKHRvY1NsaWRlID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVDb29yZGluYXRlcyh0b2NTbGlkZS5jb29yZGluYXRlcywgY3VycmVudFNsaWRlLmNvb3JkaW5hdGVzKSA9PT0gLTE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIG5hdmlnYXRlUmVsYXRpdmUobW92ZTogbnVtYmVyLCBjb29yZGluYXRlc1RvS2VlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxTbGlkZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRTbGlkZSQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5jdXJyZW50U2xpZGUpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpXG4gICAgICApO1xuXG4gICAgY29uc3Qgc2xpZGVzJCA9IHRoaXMuc2VsZWN0KHN0YXRlID0+IHN0YXRlLnNsaWRlcylcbiAgICAgIC5waXBlKFxuICAgICAgICBza2lwTmlsKCksXG4gICAgICAgIGZpbHRlcih4ID0+IHgubGVuZ3RoICE9PSAwKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBkZXB0aCQgPSB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5jb29yZGluYXRlc01heERlcHRoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHNraXBOaWwoKVxuICAgICAgKTtcblxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHNsaWRlcyQsIGN1cnJlbnRTbGlkZSQsIGRlcHRoJClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKFtzbGlkZXMsIGN1cnJlbnQsIGRlcHRoXSkgPT4gY2FsY3VsYXRlQ29vcmRpbmF0ZXMoc2xpZGVzLCBjdXJyZW50LCBtb3ZlLCBjb29yZGluYXRlc1RvS2VlcCwgZGVwdGgpKSxcbiAgICAgICk7XG4gIH1cblxuICBuYXZpZ2F0ZUFic29sdXRlKHRhcmdldDogQ29vcmRpbmF0ZXMgfCBTbGlkZSB8IHVuZGVmaW5lZCwgbW9kZT86IHN0cmluZykge1xuICAgIGxldCBzbGlkZTogU2xpZGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgU2xpZGUpIHtcbiAgICAgIHNsaWRlID0gdGFyZ2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzbGlkZSA9IHRoaXMuc3RhdGUuc2xpZGVzLmZpbmQoeCA9PiBlcXVhbENvb3JkaW5hdGVzKHRhcmdldCwgeC5jb29yZGluYXRlcykpO1xuICAgIH1cblxuICAgIGlmIChzbGlkZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1vZGVXaXRoRmFsbGJhY2s6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChtb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVXaXRoRmFsbGJhY2sgPSBtb2RlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5jdXJyZW50TW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlV2l0aEZhbGxiYWNrID0gdGhpcy5zdGF0ZS5jdXJyZW50TW9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZVdpdGhGYWxsYmFjayA9ICdzbGlkZSc7XG4gICAgfVxuXG4gICAgY29uc3QgbGluayA9IFsgYC8ke21vZGVXaXRoRmFsbGJhY2t9YCwgLi4uc2xpZGUuY29vcmRpbmF0ZXMgXTtcblxuICAgIHJldHVybiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShsaW5rLCB7IHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScgfSk7XG4gIH1cblxuICBuYXZpZ2F0ZVRvRmlyc3QocHJlZml4Pzogc3RyaW5nKSB7XG4gICAgdGhpcy5maXJzdFNsaWRlKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoc2xpZGUgPT4gdGhpcy5uYXZpZ2F0ZUFic29sdXRlKHNsaWRlLCBwcmVmaXgpKTtcbiAgfVxuXG4gIGZpcnN0U2xpZGUoKTogT2JzZXJ2YWJsZTxTbGlkZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zbGlkZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpLFxuICAgICAgICBmaWx0ZXIoc2xpZGVzID0+IHNsaWRlcy5sZW5ndGggPiAwKSxcbiAgICAgICAgbWFwKHNsaWRlcyA9PiBzbGlkZXNbMF0pXG4gICAgICApO1xuICB9XG5cbiAgaXNWYWxpZENvb3JkaW5hdGUoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uLnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5zbGlkZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcE5pbCgpLFxuICAgICAgICBmaWx0ZXIoc2xpZGVzID0+IHNsaWRlcy5sZW5ndGggPiAwKSxcbiAgICAgICAgbWFwKHNsaWRlcyA9PiBpc1ZhbGlkQ29vcmRpbmF0ZShzbGlkZXMsIGNvb3JkaW5hdGVzKSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvb3JkaW5hdGVzVG9TbGlkZShjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpOiBTbGlkZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc2xpZGVNYXBbY29vcmRpbmF0ZXMuam9pbignLicpXTtcbiAgfVxuXG4gIHNldEN1cnJlbnRNb2RlQW5kU2xpZGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpIHtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IHJvdXRlUGFyYW1zVG9Db29yZGluYXRlKHJvdXRlLnBhcmFtcyk7XG4gICAgY29uc3QgbW9kZTogTW9kZSA9IHJvdXRlLnVybFswXS5wYXRoIGFzIE1vZGU7XG4gICAgY29uc3Qgc2xpZGUgPSB0aGlzLmNvb3JkaW5hdGVzVG9TbGlkZShjb29yZGluYXRlcyk7XG5cbiAgICB0aGlzLmNvbW1hbmRzLnNldEN1cnJlbnRTbGlkZShzbGlkZSk7XG4gICAgdGhpcy5jb21tYW5kcy5zZXRDdXJyZW50TW9kZShtb2RlKTtc