UNPKG

@neocomplexx/ngx-neo-directives

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

660 lines 48.2 kB
/** * @fileoverview added by tsickle * Generated from: lib/ngx-command/command.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; // tslint:disable:indent import { Directive, Input, ElementRef, InjectionToken, Renderer2 } from '@angular/core'; import { Subject, BehaviorSubject, combineLatest, timer } from 'rxjs'; import { map, tap, filter, switchMap } from 'rxjs/operators'; import { OnReturnDirective } from '../onReturn.directive'; /** @type {?} */ export var COMMAND_CONFIG = new InjectionToken('COMMAND_CONFIG'); /** @type {?} */ export var COMMAND_DEFAULT_CONFIG = { executingCssClass: 'executing', }; /* export function provideConfig(config: CommandOptions): any { return Object.assign({}, COMMAND_DEFAULT_CONFIG, config); } */ /** * * ### Example with options * ```html * <button [command]='saveCmd' [commandOptions]='{executingCssClass: 'in-progress'}'>Save</button> * ``` */ var CommandDirective = /** @class */ (function () { function CommandDirective(renderer, element) { this.renderer = renderer; this.element = element; this.stopPropagation = false; // @HostBinding('disabled') isDisabled: boolean; this.setEnabled = true; this.config = COMMAND_DEFAULT_CONFIG; this.ownDisabledState = false; this.commandDisabledChanged = false; } /** * @return {?} */ CommandDirective.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; // console.log('[commandDirective::init]'); this.commandOptions = Object.assign({}, this.config, this.commandOptions); if (!this.command) { throw new Error('[commandDirective] command should be defined!'); } else { this.command.verifyCommandExecutionPipe(); this.command.setNextFocus(this.commandNextFocus); this.command.setEnabledValue(this.setEnabled); } // if (this.element.nativeElement.localName === 'button') { // let thisAux = this; // Set up a new observer // var observer = new MutationObserver(function(mutations) { // mutations.forEach(function(mutation) { // // Check the modified attributeName is "disabled" // if(!thisAux.commandDisabledChanged) { // if (mutation.attributeName === "disabled") { // thisAux.ownDisabledState = thisAux.element.nativeElement.disabled; // } // } else { // thisAux.commandDisabledChanged = false; // } // }); // }); // // Configure to only listen to attribute changes // var config = { attributes: true }; // // Start observing myElem // observer.observe(this.element.nativeElement, config); // } this.canExecute$$ = this.command.canExecute$.pipe(tap((/** * @param {?} x * @return {?} */ function (x) { if (_this.element.nativeElement.localName === 'button') { _this.commandDisabledChanged = true; if (_this.commandValue == _this.command.executingParam) { _this.element.nativeElement.disabled = !x; // } else { // this.element.nativeElement.disabled = !(!this.ownDisabledState && x); } } }))).subscribe(); this.isExecuting$$ = this.command.isExecuting$.pipe(tap((/** * @param {?} x * @return {?} */ function (x) { // console.log('[commandDirective::isExecuting$]', x); x ? _this.renderer.addClass(_this.element.nativeElement, _this.commandOptions.executingCssClass) : _this.renderer.removeClass(_this.element.nativeElement, _this.commandOptions.executingCssClass); }))).subscribe(); if (this.isMobileOperatingSystem()) { this.element.nativeElement.addEventListener('touchstart', (/** * @param {?} event * @return {?} */ function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { event.preventDefault(); event.stopPropagation(); if (this.element.nativeElement.localName === 'input') { return [2 /*return*/]; } this.executeCommand(); return [2 /*return*/]; }); }); })); this.element.nativeElement.addEventListener('focusin', (/** * @param {?} event * @return {?} */ function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { event.preventDefault(); event.stopPropagation(); this.executeCommand(); return [2 /*return*/]; }); }); })); } else { this.element.nativeElement.addEventListener('keydown', (/** * @param {?} event * @return {?} */ function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { if ((event.which === 13 || event.keyCode === 13)) { event.preventDefault(); event.stopPropagation(); this.executeCommand(); } return [2 /*return*/]; }); }); })); this.element.nativeElement.addEventListener('click', (/** * @param {?} event * @return {?} */ function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { if (this.element.nativeElement.localName === 'input') { return [2 /*return*/]; } event.preventDefault(); if (this.stopPropagation) { event.stopPropagation(); } this.executeCommand(); return [2 /*return*/]; }); }); })); } }; /** * @return {?} */ CommandDirective.prototype.executeCommand = /** * @return {?} */ function () { if (!this.element.nativeElement.disabled) this.command.canExecute = true; this.command.verifyCommandExecutionPipe(); this.command.execute(this.commandValue); }; /** * @return {?} */ CommandDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.command) { this.command.destroy(); } if (this.canExecute$$) { this.canExecute$$.unsubscribe(); } if (this.isExecuting$$) { this.isExecuting$$.unsubscribe(); } }; /** * @private * @return {?} */ CommandDirective.prototype.isMobileOperatingSystem = /** * @private * @return {?} */ function () { /** @type {?} */ var isMobile = false; /** @type {?} */ var userAgent = navigator.userAgent || navigator.vendor; // Windows Phone must come first because its UA also contains "Android" if (/windows phone/i.test(userAgent)) { isMobile = true; // "Windows Phone"; } else if (/android/i.test(userAgent)) { isMobile = true; // "Android"; } else if (/iPad|iPhone|iPod/.test(userAgent)) { // iOS detection from: http://stackoverflow.com/a/9039885/177710 isMobile = true; // "iOS"; } isMobile = false; return isMobile; // "unknown"; }; CommandDirective.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: '[command]' },] } ]; /** @nocollapse */ CommandDirective.ctorParameters = function () { return [ { type: Renderer2 }, { type: ElementRef } ]; }; CommandDirective.propDecorators = { command: [{ type: Input }], commandOptions: [{ type: Input }], commandCanExecute: [{ type: Input }], commandValue: [{ type: Input }], stopPropagation: [{ type: Input }], commandNextFocus: [{ type: Input }], setEnabled: [{ type: Input }] }; return CommandDirective; }()); export { CommandDirective }; if (false) { /** @type {?} */ CommandDirective.prototype.command; /** @type {?} */ CommandDirective.prototype.commandOptions; /** @type {?} */ CommandDirective.prototype.commandCanExecute; /** @type {?} */ CommandDirective.prototype.commandValue; /** @type {?} */ CommandDirective.prototype.stopPropagation; /** @type {?} */ CommandDirective.prototype.commandNextFocus; /** @type {?} */ CommandDirective.prototype.setEnabled; /** * @type {?} * @private */ CommandDirective.prototype.canExecute$$; /** * @type {?} * @private */ CommandDirective.prototype.isExecuting$$; /** * @type {?} * @private */ CommandDirective.prototype.config; /** * @type {?} * @private */ CommandDirective.prototype.ownDisabledState; /** * @type {?} * @private */ CommandDirective.prototype.commandDisabledChanged; /** * @type {?} * @private */ CommandDirective.prototype.renderer; /** * @type {?} * @private */ CommandDirective.prototype.element; } /** * @record */ export function CommandOptions() { } if (false) { /** * Css Class which gets added/removed on the Command element's host while Command isExecuting$. * * @type {?} */ CommandOptions.prototype.executingCssClass; } /** * @record */ export function ICommand() { } if (false) { /** @type {?} */ ICommand.prototype.executingParam; /** * Determines whether the command is currently executing. * @type {?} */ ICommand.prototype.isExecuting; /** @type {?|undefined} */ ICommand.prototype.isExecuting$; /** * Determines whether the command can execute or not. * @type {?} */ ICommand.prototype.canExecute; /** @type {?|undefined} */ ICommand.prototype.canExecute$; /** * Execute function to invoke. * @param {?=} value * @return {?} */ ICommand.prototype.execute = function (value) { }; /** * Execute function to invoke and return a result in Promise. * @param {?=} value * @return {?} */ ICommand.prototype.executeWithResult = function (value) { }; /** * Disposes all resources held by subscriptions. * @return {?} */ ICommand.prototype.destroy = function () { }; /** * @return {?} */ ICommand.prototype.verifyCommandExecutionPipe = function () { }; /** * @param {?} element * @return {?} */ ICommand.prototype.setNextFocus = function (element) { }; /** * @param {?} enable * @return {?} */ ICommand.prototype.setEnabledValue = function (enable) { }; } /** * Command object used to encapsulate information which is needed to perform an action. */ var /** * Command object used to encapsulate information which is needed to perform an action. */ Command = /** @class */ (function () { /** * Creates an instance of Command. */ function Command(executeParam, canExecute$, isAsync, delay) { var _this = this; this.executeParam = executeParam; this.isAsync = isAsync; this.delay = delay; this.isExecuting = false; this.isExecuting$ = new BehaviorSubject(false); this.canExecute = true; this.executionPipe$ = new Subject(); this.setEnabled = true; if (canExecute$) { this.canExecute$ = combineLatest(this.isExecuting$, canExecute$, (/** * @param {?} isExecuting * @param {?} canExecuteResult * @return {?} */ function (isExecuting, canExecuteResult) { // console.log('[command::combineLatest$] update!', { isExecuting, canExecuteResult }); _this.isExecuting = isExecuting; _this.canExecute = !isExecuting && canExecuteResult; return _this.canExecute; })); this.canExecute$$ = this.canExecute$.subscribe(); } else { this.canExecute$ = this.isExecuting$.pipe(map((/** * @param {?} x * @return {?} */ function (x) { /** @type {?} */ var canExecute = !x; _this.canExecute = canExecute; return canExecute; }))); this.isExecuting$$ = this.isExecuting$.pipe(tap((/** * @param {?} x * @return {?} */ function (x) { return _this.isExecuting = x; }))) .subscribe(); } this.buildExecutionPipe(executeParam, isAsync, delay); } /** * @return {?} */ Command.prototype.verifyCommandExecutionPipe = /** * @return {?} */ function () { if (this.executionPipe$.observers.length === 0) { this.buildExecutionPipe(this.executeParam, this.isAsync, this.delay); } }; /** * @param {?=} value * @return {?} */ Command.prototype.execute = /** * @param {?=} value * @return {?} */ function (value) { this.executingParam = value; this.executionPipe$.next(value); }; /** * @param {?=} value * @return {?} */ Command.prototype.executeWithResult = /** * @param {?=} value * @return {?} */ function (value) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: this.executingParam = value; this.executionPipe$.next(value); return [4 /*yield*/, this.result]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * @return {?} */ Command.prototype.destroy = /** * @return {?} */ function () { if (this.executionPipe$$) { this.executionPipe$$.unsubscribe(); } if (this.canExecute$$) { this.canExecute$$.unsubscribe(); } if (this.isExecuting$$) { this.isExecuting$$.unsubscribe(); } if (this.isExecuting$) { this.isExecuting$.complete(); } if (this.asyncAction != null) { this.asyncAction = null; this.resultAsyncAction = null; } }; /** * @private * @param {?} executeParm * @param {?=} isAsync * @param {?=} delay * @return {?} */ Command.prototype.buildExecutionPipe = /** * @private * @param {?} executeParm * @param {?=} isAsync * @param {?=} delay * @return {?} */ function (executeParm, isAsync, delay) { var _this = this; /** @type {?} */ var pipe$ = this.executionPipe$.pipe(filter((/** * @return {?} */ function () { return _this.canExecute; })), tap((/** * @return {?} */ function () { _this.isExecuting$.next(true); if (isAsync && _this.asyncAction != null) { _this.resultAsyncAction = _this.asyncAction(undefined); } }))); pipe$ = isAsync ? pipe$.pipe(switchMap((/** * @param {?} value * @return {?} */ function (value) { if (delay && delay > 0) { if (_this.delaySubscribe) { _this.delaySubscribe.unsubscribe(); } /** @type {?} */ var delayTimer = timer(delay); _this.delaySubscribe = delayTimer.subscribe((/** * @param {?} t * @return {?} */ function (t) { executeParm(value); })); return Promise.resolve(null); } else { /** @type {?} */ var result = executeParm(value); return Promise.resolve(result); } }))) : pipe$.pipe(tap((/** * @param {?} value * @return {?} */ function (value) { executeParm(value); }))); pipe$ = pipe$.pipe(tap((/** * @return {?} */ function () { // console.log('[command::excutionPipe$] do#2 - set idle'); _this.isExecuting$.next(false); _this.executingParam = undefined; if (isAsync && _this.asyncAction != null) { _this.resultAsyncAction = _this.asyncAction(_this.resultAsyncAction); } OnReturnDirective.setNextFocus(_this.elementNextFocus, _this.setEnabled); }), (/** * @param {?} e * @return {?} */ function (e) { console.log('[command::excutionPipe$] do#2 error - set idle' + e.toString()); _this.isExecuting$.next(false); _this.executingParam = undefined; if (isAsync && _this.asyncAction != null) { _this.resultAsyncAction = _this.asyncAction(_this.resultAsyncAction); } _this.buildExecutionPipe(executeParm, isAsync, delay); }))); this.executionPipe$$ = pipe$.subscribe(); }; /** * @param {?} element * @return {?} */ Command.prototype.setNextFocus = /** * @param {?} element * @return {?} */ function (element) { this.elementNextFocus = element; }; /** * @param {?} enabled * @return {?} */ Command.prototype.setEnabledValue = /** * @param {?} enabled * @return {?} */ function (enabled) { this.setEnabled = enabled; }; return Command; }()); /** * Command object used to encapsulate information which is needed to perform an action. */ export { Command }; if (false) { /** @type {?} */ Command.prototype.isExecuting; /** @type {?} */ Command.prototype.isExecuting$; /** @type {?} */ Command.prototype.canExecute; /** @type {?} */ Command.prototype.canExecute$; /** * @type {?} * @private */ Command.prototype.executionPipe$; /** * @type {?} * @private */ Command.prototype.isExecuting$$; /** * @type {?} * @private */ Command.prototype.canExecute$$; /** * @type {?} * @private */ Command.prototype.executionPipe$$; /** * @type {?} * @private */ Command.prototype.elementNextFocus; /** @type {?} */ Command.prototype.result; /** @type {?} */ Command.prototype.asyncAction; /** @type {?} */ Command.prototype.resultAsyncAction; /** @type {?} */ Command.prototype.executingParam; /** * @type {?} * @private */ Command.prototype.delaySubscribe; /** * @type {?} * @private */ Command.prototype.setEnabled; /** * @type {?} * @private */ Command.prototype.executeParam; /** * @type {?} * @private */ Command.prototype.isAsync; /** * @type {?} * @private */ Command.prototype.delay; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1kaXJlY3RpdmVzLyIsInNvdXJjZXMiOlsibGliL25neC1jb21tYW5kL2NvbW1hbmQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUE0QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUUxRCxNQUFNLEtBQU8sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFTLGdCQUFnQixDQUFDOztBQUUxRSxNQUFNLEtBQU8sc0JBQXNCLEdBQW1CO0lBQ3JELGlCQUFpQixFQUFFLFdBQVc7Q0FDOUI7Ozs7Ozs7Ozs7OztBQWNEO0lBc0JDLDBCQUNTLFFBQW1CLEVBQ25CLE9BQW1CO1FBRG5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQWRuQixvQkFBZSxHQUFHLEtBQUssQ0FBQzs7UUFHeEIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUluQixXQUFNLEdBQW1CLHNCQUFzQixDQUFDO1FBRWhELHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QiwyQkFBc0IsR0FBRyxLQUFLLENBQUM7SUFLbkMsQ0FBQzs7OztJQUVMLG1DQUFROzs7SUFBUjtRQUFBLGlCQW1GQztRQWxGQSwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFD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Q0FBQyxBQTVJRCxJQTRJQzs7Ozs7OztJQTFJQSw4QkFBb0I7O0lBQ3BCLCtCQUFtRDs7SUFDbkQsNkJBQWtCOztJQUNsQiw4QkFBaUM7Ozs7O0lBRWpDLGlDQUEyQzs7Ozs7SUFDM0MsZ0NBQW9DOzs7OztJQUNwQywrQkFBbUM7Ozs7O0lBQ25DLGtDQUFzQzs7Ozs7SUFFdEMsbUNBQThCOztJQUU5Qix5QkFBNEI7O0lBRTVCLDhCQUFpQzs7SUFDakMsb0NBQThCOztJQUU5QixpQ0FBMkI7Ozs7O0lBRTNCLGlDQUFxQzs7Ozs7SUFFckMsNkJBQTBCOzs7OztJQU16QiwrQkFBbUM7Ozs7O0lBRW5DLDBCQUF5Qjs7Ozs7SUFDekIsd0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6aW5kZW50XG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBFbGVtZW50UmVmLCBJbmplY3Rpb25Ub2tlbiwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFwLCBmaWx0ZXIsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgT25SZXR1cm5EaXJlY3RpdmUgfSBmcm9tICcuLi9vblJldHVybi5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgQ09NTUFORF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignQ09NTUFORF9DT05GSUcnKTtcblxuZXhwb3J0IGNvbnN0IENPTU1BTkRfREVGQVVMVF9DT05GSUc6IENvbW1hbmRPcHRpb25zID0ge1xuXHRleGVjdXRpbmdDc3NDbGFzczogJ2V4ZWN1dGluZycsXG59O1xuLypcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlQ29uZmlnKGNvbmZpZzogQ29tbWFuZE9wdGlvbnMpOiBhbnkge1xuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgQ09NTUFORF9ERUZBVUxUX0NPTkZJRywgY29uZmlnKTtcbn0gKi9cblxuXG4vKipcbiAqXG4gKiAjIyMgRXhhbXBsZSB3aXRoIG9wdGlvbnNcbiAqIGBgYGh0bWxcbiAqIDxidXR0b24gW2NvbW1hbmRdPSdzYXZlQ21kJyBbY29tbWFuZE9wdGlvbnNdPSd7ZXhlY3V0aW5nQ3NzQ2xhc3M6ICdpbi1wcm9ncmVzcyd9Jz5TYXZlPC9idXR0b24+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3Jcblx0c2VsZWN0b3I6ICdbY29tbWFuZF0nXG59KVxuZXhwb3J0IGNsYXNzIENvbW1hbmREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cblx0QElucHV0KCkgY29tbWFuZDogSUNvbW1hbmQ7XG5cdEBJbnB1dCgpIGNvbW1hbmRPcHRpb25zOiBDb21tYW5kT3B0aW9ucztcblx0QElucHV0KCkgY29tbWFuZENhbkV4ZWN1dGU6IGJvb2xlYW47XG5cdEBJbnB1dCgpIGNvbW1hbmRWYWx1ZTogYW55O1xuXHRASW5wdXQoKSBzdG9wUHJvcGFnYXRpb24gPSBmYWxzZTtcblx0QElucHV0KCkgY29tbWFuZE5leHRGb2N1czogYW55O1xuXHQvLyBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJykgaXNEaXNhYmxlZDogYm9vbGVhbjtcblx0QElucHV0KCkgc2V0RW5hYmxlZCA9IHRydWU7XG5cdHByaXZhdGUgY2FuRXhlY3V0ZSQkOiBTdWJzY3JpcHRpb247XG5cdHByaXZhdGUgaXNFeGVjdXRpbmckJDogU3Vic2NyaXB0aW9uO1xuXG5cdHByaXZhdGUgY29uZmlnOiBDb21tYW5kT3B0aW9ucyA9IENPTU1BTkRfREVGQVVMVF9DT05GSUc7XG5cblx0cHJpdmF0ZSBvd25EaXNhYmxlZFN0YXRlID0gZmFsc2U7XG5cdHByaXZhdGUgY29tbWFuZERpc2FibGVkQ2hhbmdlZCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcblx0XHRwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWZcblx0KSB7IH1cblxuXHRuZ09uSW5pdCgpIHtcblx0XHQvLyBjb25zb2xlLmxvZygnW2NvbW1hbmREaXJlY3RpdmU6OmluaXRdJyk7XG5cdFx0dGhpcy5jb21tYW5kT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCB0aGlzLmNvbW1hbmRPcHRpb25zKTtcblxuXHRcdGlmICghdGhpcy5jb21tYW5kKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1tjb21tYW5kRGlyZWN0aXZlXSBjb21tYW5kIHNob3VsZCBiZSBkZWZpbmVkIScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNvbW1hbmQudmVyaWZ5Q29tbWFuZEV4ZWN1dGlvblBpcGUoKTtcblx0XHRcdHRoaXMuY29tbWFuZC5zZXROZXh0Rm9jdXModGhpcy5jb21tYW5kTmV4dEZvY3VzKTtcblx0XHRcdHRoaXMuY29tbWFuZC5zZXRFbmFibGVkVmFsdWUodGhpcy5zZXRFbmFibGVkKTtcblx0XHR9XG5cblx0XHQvLyBpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQubG9jYWxOYW1lID09PSAnYnV0dG9uJykge1xuXHRcdC8vIFx0bGV0IHRoaXNBdXggPSB0aGlzO1x0Ly8gU2V0IHVwIGEgbmV3IG9ic2VydmVyXG5cdFx0Ly8gXHR2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHtcblx0XHQvLyBcdFx0bXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24obXV0YXRpb24pIHtcblx0XHQvLyBcdFx0XHQvLyBDaGVjayB0aGUgbW9kaWZpZWQgYXR0cmlidXRlTmFtZSBpcyBcImRpc2FibGVkXCJcblx0XHQvLyBcdFx0XHRpZighdGhpc0F1eC5jb21tYW5kRGlzYWJsZWRDaGFuZ2VkKSB7XG5cdFx0Ly8gXHRcdFx0XHRpZiAobXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gXCJkaXNhYmxlZFwiKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdHRoaXNBdXgub3duRGlzYWJsZWRTdGF0ZSA9IHRoaXNBdXguZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkO1xuXHRcdC8vIFx0XHRcdFx0fVxuXHRcdC8vIFx0XHRcdH0gZWxzZSB7XG5cdFx0Ly8gXHRcdFx0XHR0aGlzQXV4LmNvbW1hbmREaXNhYmxlZENoYW5nZWQgPSBmYWxzZTtcblx0XHQvLyBcdFx0XHR9XG5cdFx0Ly8gXHRcdH0pO1xuXHRcdC8vIFx0fSk7XG5cdFx0Ly8gXHQvLyBDb25maWd1cmUgdG8gb25seSBsaXN0ZW4gdG8gYXR0cmlidXRlIGNoYW5nZXNcblx0XHQvLyBcdHZhciBjb25maWcgPSB7IGF0dHJpYnV0ZXM6IHRydWUgfTtcblx0XHQvLyBcdC8vIFN0YXJ0IG9ic2VydmluZyBteUVsZW1cblx0XHQvLyBcdG9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XG5cdFx0Ly8gfVxuXG5cdFx0dGhpcy5jYW5FeGVjdXRlJCQgPSB0aGlzLmNvbW1hbmQuY2FuRXhlY3V0ZSQucGlwZShcblx0XHRcdHRhcCh4ID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmxvY2FsTmFtZSA9PT0gJ2J1dHRvbicpIHtcblx0XHRcdFx0XHR0aGlzLmNvbW1hbmREaXNhYmxlZENoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGlmICh0aGlzLmNvbW1hbmRWYWx1ZSA9PSB0aGlzLmNvbW1hbmQuZXhlY3V0aW5nUGFyYW0pIHtcblx0XHRcdFx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gIXg7XG5cdFx0XHRcdFx0XHQvLyB9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gXHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9ICEoIXRoaXMub3duRGlzYWJsZWRTdGF0ZSAmJiB4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pKS5zdWJzY3JpYmUoKTtcblx0XHR0aGlzLmlzRXhlY3V0aW5nJCQgPSB0aGlzLmNvbW1hbmQuaXNFeGVjdXRpbmckLnBpcGUoXG5cdFx0XHR0YXAoeCA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZERpcmVjdGl2ZTo6aXNFeGVjdXRpbmckXScsIHgpO1xuICAgICAgICB4ID8gdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5jb21tYW5kT3B0aW9ucy5leGVjdXRpbmdDc3NDbGFzcykgOiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbW1hbmRPcHRpb25zLmV4ZWN1dGluZ0Nzc0NsYXNzKTtcblx0XHRcdH0pKS5zdWJzY3JpYmUoKTtcblxuXHRcdGlmICh0aGlzLmlzTW9iaWxlT3BlcmF0aW5nU3lzdGVtKCkpIHtcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBhc3luYyAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdpbnB1dCcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgYXN5bmMgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR0aGlzLmV4ZWN1dGVDb21tYW5kKCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGFzeW5jIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuXHRcdFx0XHRpZiAoKGV2ZW50LndoaWNoID09PSAxMyB8fCBldmVudC5rZXlDb2RlID09PSAxMykpIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUNvbW1hbmQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQubG9jYWxOYW1lID09PSAnaW5wdXQnKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGlmICh0aGlzLnN0b3BQcm9wYWdhdGlvbikge1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZXhlY3V0ZUNvbW1hbmQoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHR9XG5cblx0ZXhlY3V0ZUNvbW1hbmQoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkgdGhpcy5jb21tYW5kLmNhbkV4ZWN1dGUgPSB0cnVlO1xuXHRcdHRoaXMuY29tbWFuZC52ZXJpZnlDb21tYW5kRXhlY3V0aW9uUGlwZSgpO1xuXHRcdHRoaXMuY29tbWFuZC5leGVjdXRlKHRoaXMuY29tbWFuZFZhbHVlKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdGlmICh0aGlzLmNvbW1hbmQpIHsgdGhpcy5jb21tYW5kLmRlc3Ryb3koKTsgfVxuXHRcdGlmICh0aGlzLmNhbkV4ZWN1dGUkJCkgeyB0aGlzLmNhbkV4ZWN1dGUkJC51bnN1YnNjcmliZSgpOyB9XG5cdFx0aWYgKHRoaXMuaXNFeGVjdXRpbmckJCkgeyB0aGlzLmlzRXhlY3V0aW5nJCQudW5zdWJzY3JpYmUoKTsgfVxuXHR9XG5cblx0cHJpdmF0ZSBpc01vYmlsZU9wZXJhdGluZ1N5c3RlbSgpOiBib29sZWFuIHtcblx0XHRsZXQgaXNNb2JpbGUgPSBmYWxzZTtcblx0XHRjb25zdCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3I7XG5cblx0XHQvLyBXaW5kb3dzIFBob25lIG11c3QgY29tZSBmaXJzdCBiZWNhdXNlIGl0cyBVQSBhbHNvIGNvbnRhaW5zIFwiQW5kcm9pZFwiXG5cdFx0aWYgKC93aW5kb3dzIHBob25lL2kudGVzdCh1c2VyQWdlbnQpKSB7XG5cdFx0XHRpc01vYmlsZSA9IHRydWU7IC8vIFwiV2luZG93cyBQaG9uZVwiO1xuXHRcdH0gZWxzZSBpZiAoL2FuZHJvaWQvaS50ZXN0KHVzZXJBZ2VudCkpIHtcblx0XHRcdGlzTW9iaWxlID0gdHJ1ZTsgLy8gXCJBbmRyb2lkXCI7XG5cdFx0fSBlbHNlIGlmICgvaVBhZHxpUGhvbmV8aVBvZC8udGVzdCh1c2VyQWdlbnQpKSB7XG5cdFx0XHQvLyBpT1MgZGV0ZWN0aW9uIGZyb206IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkwMzk4ODUvMTc3NzEwXG5cdFx0XHRpc01vYmlsZSA9IHRydWU7IC8vIFwiaU9TXCI7XG5cdFx0fVxuXG5cdFx0aXNNb2JpbGUgPSBmYWxzZTtcblxuXHRcdHJldHVybiBpc01vYmlsZTsgLy8gXCJ1bmtub3duXCI7XG5cdH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kT3B0aW9ucyB7XG5cdC8qKlxuXHQgKiBDc3MgQ2xhc3Mgd2hpY2ggZ2V0cyBhZGRlZC9yZW1vdmVkIG9uIHRoZSBDb21tYW5kIGVsZW1lbnQncyBob3N0IHdoaWxlIENvbW1hbmQgaXNFeGVjdXRpbmckLlxuXHQgKlxuXHQgKi9cblx0ZXhlY3V0aW5nQ3NzQ2xhc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tbWFuZCB7XG5cblx0ZXhlY3V0aW5nUGFyYW06IGFueTtcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGN1cnJlbnRseSBleGVjdXRpbmcuXG5cdCAqL1xuXHRpc0V4ZWN1dGluZzogYm9vbGVhbjtcblx0aXNFeGVjdXRpbmckPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZSBvciBub3QuXG5cdCAqL1xuXHRjYW5FeGVjdXRlOiBib29sZWFuO1xuXHRjYW5FeGVjdXRlJD86IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGZ1bmN0aW9uIHRvIGludm9rZS5cblx0ICovXG5cdGV4ZWN1dGUodmFsdWU/OiBhbnkpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGZ1bmN0aW9uIHRvIGludm9rZSBhbmQgcmV0dXJuIGEgcmVzdWx0IGluIFByb21pc2UuXG5cdCAqL1xuXHRleGVjdXRlV2l0aFJlc3VsdCh2YWx1ZT86IGFueSk6IFByb21pc2U8YW55Pjtcblx0LyoqXG5cdCAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBieSBzdWJzY3JpcHRpb25zLlxuXHQgKi9cblx0ZGVzdHJveSgpOiB2b2lkO1xuXG5cdHZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCk7XG5cblx0c2V0TmV4dEZvY3VzKGVsZW1lbnQ6IGFueSk7XG5cblx0c2V0RW5hYmxlZFZhbHVlKGVuYWJsZTogYm9vbGVhbik7XG5cbn1cblxuXG4vKipcbiAqIENvbW1hbmQgb2JqZWN0IHVzZWQgdG8gZW5jYXBzdWxhdGUgaW5mb3JtYXRpb24gd2hpY2ggaXMgbmVlZGVkIHRvIHBlcmZvcm0gYW4gYWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ29tbWFuZCBpbXBsZW1lbnRzIElDb21tYW5kIHtcblxuXHRpc0V4ZWN1dGluZyA9IGZhbHNlO1xuXHRpc0V4ZWN1dGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblx0Y2FuRXhlY3V0ZSA9IHRydWU7XG5cdGNhbkV4ZWN1dGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG5cdHByaXZhdGUgZXhlY3V0aW9uUGlwZSQgPSBuZXcgU3ViamVjdDx7fT4oKTtcblx0cHJpdmF0ZSBpc0V4ZWN1dGluZyQkOiBTdWJzY3JpcHRpb247XG5cdHByaXZhdGUgY2FuRXhlY3V0ZSQkOiBTdWJzY3JpcHRpb247XG5cdHByaXZhdGUgZXhlY3V0aW9uUGlwZSQkOiBTdWJzY3JpcHRpb247XG5cblx0cHJpdmF0ZSBlbGVtZW50TmV4dEZvY3VzOiBhbnk7XG5cblx0cHVibGljIHJlc3VsdDogUHJvbWlzZTxhbnk+O1xuXG5cdHB1YmxpYyBhc3luY0FjdGlvbjogKGFueSkgPT4gYW55O1xuXHRwdWJsaWMgcmVzdWx0QXN5bmNBY3Rpb246IGFueTtcblxuXHRwdWJsaWMgZXhlY3V0aW5nUGFyYW06IGFueTtcblxuXHRwcml2YXRlIGRlbGF5U3Vic2NyaWJlOiBTdWJzY3JpcHRpb247XG5cblx0cHJpdmF0ZSBzZXRFbmFibGVkID0gdHJ1ZTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb21tYW5kLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSBleGVjdXRlUGFyYW06IChhbnk/KSA9PiBhbnksXG5cdFx0Y2FuRXhlY3V0ZSQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+LFxuXHRcdHByaXZhdGUgaXNBc3luYz86IGJvb2xlYW4sXG5cdFx0cHJpdmF0ZSBkZWxheT86IG51bWJlclxuXHQpIHtcblx0XHRpZiAoY2FuRXhlY3V0ZSQpIHtcblx0XHRcdHRoaXMuY2FuRXhlY3V0ZSQgPSBjb21iaW5lTGF0ZXN0KFxuXHRcdFx0XHR0aGlzLmlzRXhlY3V0aW5nJCxcblx0XHRcdFx0Y2FuRXhlY3V0ZSRcblx0XHRcdFx0LCAoaXNFeGVjdXRpbmcsIGNhbkV4ZWN1dGVSZXN1bHQpID0+IHtcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnW2NvbW1hbmQ6OmNvbWJpbmVMYXRlc3QkXSB1cGRhdGUhJywgeyBpc0V4ZWN1dGluZywgY2FuRXhlY3V0ZVJlc3VsdCB9KTtcblx0XHRcdFx0XHR0aGlzLmlzRXhlY3V0aW5nID0gaXNFeGVjdXRpbmc7XG5cdFx0XHRcdFx0dGhpcy5jYW5FeGVjdXRlID0gIWlzRXhlY3V0aW5nICYmIGNhbkV4ZWN1dGVSZXN1bHQ7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY2FuRXhlY3V0ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR0aGlzLmNhbkV4ZWN1dGUkJCA9IHRoaXMuY2FuRXhlY3V0ZSQuc3Vic2NyaWJlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY2FuRXhlY3V0ZSQgPSB0aGlzLmlzRXhlY3V0aW5nJC5waXBlKG1hcCh4ID0+IHtcblx0XHRcdFx0Y29uc3QgY2FuRXhlY3V0ZSA9ICF4O1xuXHRcdFx0XHR0aGlzLmNhbkV4ZWN1dGUgPSBjYW5FeGVjdXRlO1xuXHRcdFx0XHRyZXR1cm4gY2FuRXhlY3V0ZTtcblx0XHRcdH0pKTtcblx0XHRcdHRoaXMuaXNFeGVjdXRpbmckJCA9IHRoaXMuaXNFeGVjdXRpbmckLnBpcGUoXG5cdFx0XHRcdHRhcCh4ID0+IHRoaXMuaXNFeGVjdXRpbmcgPSB4KSlcblx0XHRcdFx0LnN1YnNjcmliZSgpO1xuXHRcdH1cblx0XHR0aGlzLmJ1aWxkRXhlY3V0aW9uUGlwZShleGVjdXRlUGFyYW0sIGlzQXN5bmMsIGRlbGF5KTtcblx0fVxuXG5cdHB1YmxpYyB2ZXJpZnlDb21tYW5kRXhlY3V0aW9uUGlwZSgpIHtcblx0XHRpZiAodGhpcy5leGVjdXRpb25QaXBlJC5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aGlzLmJ1aWxkRXhlY3V0aW9uUGlwZSh0aGlzLmV4ZWN1dGVQYXJhbSwgdGhpcy5pc0FzeW5jLCB0aGlzLmRlbGF5KTtcblx0XHR9XG5cdH1cblxuXHRleGVjdXRlKHZhbHVlPzogYW55KSB7XG5cdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHZhbHVlO1xuXHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQubmV4dCh2YWx1ZSk7XG5cdH1cblxuXHRhc3luYyBleGVjdXRlV2l0aFJlc3VsdCh2YWx1ZT86IGFueSk6IFByb21pc2U8YW55PiB7XG5cdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHZhbHVlO1xuXHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQubmV4dCh2YWx1ZSk7XG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMucmVzdWx0O1xuXHR9XG5cblx0ZGVzdHJveSgpIHtcblx0XHRpZiAodGhpcy5leGVjdXRpb25QaXBlJCQpIHtcblx0XHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQkLnVuc3Vic2NyaWJlKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmNhbkV4ZWN1dGUkJCkge1xuXHRcdFx0dGhpcy5jYW5FeGVjdXRlJCQudW5zdWJzY3JpYmUoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuaXNFeGVjdXRpbmckJCkge1xuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQkLnVuc3Vic2NyaWJlKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmlzRXhlY3V0aW5nJCkge1xuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQuY29tcGxldGUoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5hc3luY0FjdGlvbiAhPSBudWxsKSB7XG5cdFx0XHR0aGlzLmFzeW5jQWN0aW9uID0gbnVsbDtcblx0XHRcdHRoaXMucmVzdWx0QXN5bmNBY3Rpb24gPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYnVpbGRFeGVjdXRpb25QaXBlKGV4ZWN1dGVQYXJtOiAoYW55PykgPT4gYW55LCBpc0FzeW5jPzogYm9vbGVhbiwgZGVsYXk/OiBudW1iZXIpIHtcblx0XHRsZXQgcGlwZSQgPSB0aGlzLmV4ZWN1dGlvblBpcGUkLnBpcGUoXG5cdFx0XHRmaWx0ZXIoKCkgPT4gdGhpcy5jYW5FeGVjdXRlKSxcblx0XHRcdHRhcCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLm5leHQodHJ1ZSk7XG5cdFx0XHRcdGlmIChpc0FzeW5jICYmIHRoaXMuYXN5bmNBY3Rpb24gIT0gbnVsbCkgeyB0aGlzLnJlc3VsdEFzeW5jQWN0aW9uID0gdGhpcy5hc3luY0FjdGlvbih1bmRlZmluZWQpOyB9XG5cdFx0XHR9KSk7XG5cblx0XHRwaXBlJCA9IGlzQXN5bmNcblx0XHRcdD8gcGlwZSQucGlwZShzd2l0Y2hNYXAoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcblx0XHRcdFx0XHRpZiAodGhpcy5kZWxheVN1YnNjcmliZSkgeyB0aGlzLmRlbGF5U3Vic2NyaWJlLnVuc3Vic2NyaWJlKCk7IH1cblx0XHRcdFx0XHRjb25zdCBkZWxheVRpbWVyID0gdGltZXIoZGVsYXkpO1xuXHRcdFx0XHRcdHRoaXMuZGVsYXlTdWJzY3JpYmUgPSBkZWxheVRpbWVyLnN1YnNjcmliZSh0ID0+IHsgZXhlY3V0ZVBhcm0odmFsdWUpOyB9KTtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGV4ZWN1dGVQYXJtKHZhbHVlKTtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKVxuXHRcdFx0OiBwaXBlJC5waXBlKHRhcCgodmFsdWUpID0+IHsgZXhlY3V0ZVBhcm0odmFsdWUpOyB9KSk7XG5cblx0XHRwaXBlJCA9IHBpcGUkLnBpcGUodGFwKCgpID0+IHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZDo6ZXhjdXRpb25QaXBlJF0gZG8jMiAtIHNldCBpZGxlJyk7XG5cdFx0XHR0aGlzLmlzRXhlY3V0aW5nJC5uZXh0KGZhbHNlKTtcblx0XHRcdHRoaXMuZXhlY3V0aW5nUGFyYW0gPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoaXNBc3luYyAmJiB0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHsgdGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IHRoaXMuYXN5bmNBY3Rpb24odGhpcy5yZXN1bHRBc3luY0FjdGlvbik7IH1cblx0XHRcdE9uUmV0dXJuRGlyZWN0aXZlLnNldE5leHRGb2N1cyh0aGlzLmVsZW1lbnROZXh0Rm9jdXMsIHRoaXMuc2V0RW5hYmxlZCk7XG5cdFx0fSxcblx0XHRcdChlKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdbY29tbWFuZDo6ZXhjdXRpb25QaXBlJF0gZG8jMiBlcnJvciAtIHNldCBpZGxlJyArIGUudG9TdHJpbmcoKSk7XG5cdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLm5leHQoZmFsc2UpO1xuXHRcdFx0XHR0aGlzLmV4ZWN1dGluZ1BhcmFtID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoaXNBc3luYyAmJiB0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHsgdGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IHRoaXMuYXN5bmNBY3Rpb24odGhpcy5yZXN1bHRBc3luY0FjdGlvbik7IH1cblx0XHRcdFx0dGhpcy5idWlsZEV4ZWN1dGlvblBpcGUoZXhlY3V0ZVBhcm0sIGlzQXN5bmMsIGRlbGF5KTtcblx0XHRcdH0pKTtcblx0XHR0aGlzLmV4ZWN1dGlvblBpcGUkJCA9IHBpcGUkLnN1YnNjcmliZSgpO1xuXHR9XG5cblx0cHVibGljIHNldE5leHRGb2N1cyhlbGVtZW50OiBhbnkpIHtcblx0XHR0aGlzLmVsZW1lbnROZXh0Rm9jdXMgPSBlbGVtZW50O1xuXHR9XG5cdHB1YmxpYyBzZXRFbmFibGVkVmFsdWUoZW5hYmxlZCkge1xuXHRcdHRoaXMuc2V0RW5hYmxlZCA9IGVuYWJsZWQ7XG5cdH1cbn1cbiJdfQ==