@neocomplexx/ngx-neo-directives-mat
Version:
307 lines • 40.3 kB
JavaScript
// tslint:disable:indent
import { __awaiter, __decorate, __metadata } from "tslib";
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';
export const COMMAND_CONFIG = new InjectionToken('COMMAND_CONFIG');
export const 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>
* ```
*/
let CommandDirective = class CommandDirective {
constructor(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;
}
ngOnInit() {
// 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(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(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', (event) => __awaiter(this, void 0, void 0, function* () {
event.preventDefault();
event.stopPropagation();
if (this.element.nativeElement.localName === 'input') {
return;
}
this.executeCommand();
}));
this.element.nativeElement.addEventListener('focusin', (event) => __awaiter(this, void 0, void 0, function* () {
event.preventDefault();
event.stopPropagation();
this.executeCommand();
}));
}
else {
this.element.nativeElement.addEventListener('keydown', (event) => __awaiter(this, void 0, void 0, function* () {
if ((event.which === 13 || event.keyCode === 13)) {
event.preventDefault();
event.stopPropagation();
this.executeCommand();
}
}));
this.element.nativeElement.addEventListener('click', (event) => __awaiter(this, void 0, void 0, function* () {
if (this.element.nativeElement.localName === 'input') {
return;
}
event.preventDefault();
if (this.stopPropagation) {
event.stopPropagation();
}
this.executeCommand();
}));
}
}
executeCommand() {
if (!this.element.nativeElement.disabled)
this.command.canExecute = true;
this.command.verifyCommandExecutionPipe();
this.command.execute(this.commandValue);
}
ngOnDestroy() {
if (this.command) {
this.command.destroy();
}
if (this.canExecute$$) {
this.canExecute$$.unsubscribe();
}
if (this.isExecuting$$) {
this.isExecuting$$.unsubscribe();
}
}
isMobileOperatingSystem() {
let isMobile = false;
const 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.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef }
];
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "command", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "commandOptions", void 0);
__decorate([
Input(),
__metadata("design:type", Boolean)
], CommandDirective.prototype, "commandCanExecute", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "commandValue", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "commandNextFocus", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "stopPropagation", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CommandDirective.prototype, "setEnabled", void 0);
CommandDirective = __decorate([
Directive({
// tslint:disable-next-line:directive-selector
selector: '[command]'
}),
__metadata("design:paramtypes", [Renderer2,
ElementRef])
], CommandDirective);
export { CommandDirective };
/**
* Command object used to encapsulate information which is needed to perform an action.
*/
export class Command {
/**
* Creates an instance of Command.
*/
constructor(executeParam, canExecute$, isAsync, delay) {
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$, (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(x => {
const canExecute = !x;
this.canExecute = canExecute;
return canExecute;
}));
this.isExecuting$$ = this.isExecuting$.pipe(tap(x => this.isExecuting = x))
.subscribe();
}
this.buildExecutionPipe(executeParam, isAsync, delay);
}
verifyCommandExecutionPipe() {
if (this.executionPipe$.observers.length === 0) {
this.buildExecutionPipe(this.executeParam, this.isAsync, this.delay);
}
}
execute(value) {
this.executingParam = value;
this.executionPipe$.next(value);
}
executeWithResult(value) {
return __awaiter(this, void 0, void 0, function* () {
this.executingParam = value;
this.executionPipe$.next(value);
return yield this.result;
});
}
destroy() {
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;
}
}
buildExecutionPipe(executeParm, isAsync, delay) {
let pipe$ = this.executionPipe$.pipe(filter(() => this.canExecute), tap(() => {
this.isExecuting$.next(true);
if (isAsync && this.asyncAction != null) {
this.resultAsyncAction = this.asyncAction(undefined);
}
}));
pipe$ = isAsync
? pipe$.pipe(switchMap((value) => {
if (delay && delay > 0) {
if (this.delaySubscribe) {
this.delaySubscribe.unsubscribe();
}
const delayTimer = timer(delay);
this.delaySubscribe = delayTimer.subscribe(t => { executeParm(value); });
return Promise.resolve(null);
}
else {
const result = executeParm(value);
return Promise.resolve(result);
}
}))
: pipe$.pipe(tap((value) => { executeParm(value); }));
pipe$ = pipe$.pipe(tap(() => {
// 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);
}, (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();
}
setNextFocus(element) {
this.elementNextFocus = element;
}
setEnabledValue(enabled) {
this.setEnabled = enabled;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1kaXJlY3RpdmVzLW1hdC8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtY29tbWFuZC9jb21tYW5kLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7O0FBRXhCLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sRUFBNEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQVMsZ0JBQWdCLENBQUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBbUI7SUFDckQsaUJBQWlCLEVBQUUsV0FBVztDQUM5QixDQUFDO0FBQ0Y7OztJQUdJO0FBR0o7Ozs7OztHQU1HO0FBS0gsSUFBYSxnQkFBZ0IsR0FBN0IsTUFBYSxnQkFBZ0I7SUFrQjVCLFlBQ1MsUUFBbUIsRUFDbkIsT0FBbUI7UUFEbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBYm5CLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLGdEQUFnRDtRQUN2QyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBSW5CLFdBQU0sR0FBbUIsc0JBQXNCLENBQUM7UUFFaEQscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLDJCQUFzQixHQUFHLEtBQUssQ0FBQztJQUtsQyxDQUFDO0lBRU4s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Z0IsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEUsQ0FBQyxFQUNBLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFO2dCQUFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQUU7WUFDL0csSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTSxZQUFZLENBQUMsT0FBWTtRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFDTSxlQUFlLENBQUMsT0FBTztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztJQUMzQixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTppbmRlbnRcclxuXHJcbmltcG9ydCB7RGlyZWN0aXZlLCBJbnB1dCwgRWxlbWVudFJlZiwgSW5qZWN0aW9uVG9rZW4sIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgdGltZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YXAsIGZpbHRlciwgc3dpdGNoTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBPblJldHVybkRpcmVjdGl2ZSB9IGZyb20gJy4uL29uUmV0dXJuLmRpcmVjdGl2ZSc7XHJcblxyXG5leHBvcnQgY29uc3QgQ09NTUFORF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignQ09NTUFORF9DT05GSUcnKTtcclxuXHJcbmV4cG9ydCBjb25zdCBDT01NQU5EX0RFRkFVTFRfQ09ORklHOiBDb21tYW5kT3B0aW9ucyA9IHtcclxuXHRleGVjdXRpbmdDc3NDbGFzczogJ2V4ZWN1dGluZycsXHJcbn07XHJcbi8qXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlQ29uZmlnKGNvbmZpZzogQ29tbWFuZE9wdGlvbnMpOiBhbnkge1xyXG5cdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBDT01NQU5EX0RFRkFVTFRfQ09ORklHLCBjb25maWcpO1xyXG59ICovXHJcblxyXG5cclxuLyoqXHJcbiAqXHJcbiAqICMjIyBFeGFtcGxlIHdpdGggb3B0aW9uc1xyXG4gKiBgYGBodG1sXHJcbiAqIDxidXR0b24gW2NvbW1hbmRdPSdzYXZlQ21kJyBbY29tbWFuZE9wdGlvbnNdPSd7ZXhlY3V0aW5nQ3NzQ2xhc3M6ICdpbi1wcm9ncmVzcyd9Jz5TYXZlPC9idXR0b24+XHJcbiAqIGBgYFxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcblx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxyXG5cdHNlbGVjdG9yOiAnW2NvbW1hbmRdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcblx0QElucHV0KCkgY29tbWFuZDogSUNvbW1hbmQ7XHJcblx0QElucHV0KCkgY29tbWFuZE9wdGlvbnM6IENvbW1hbmRPcHRpb25zO1xyXG5cdEBJbnB1dCgpIGNvbW1hbmRDYW5FeGVjdXRlOiBib29sZWFuO1xyXG5cdEBJbnB1dCgpIGNvbW1hbmRWYWx1ZTogYW55O1xyXG5cdEBJbnB1dCgpIGNvbW1hbmROZXh0Rm9jdXM6IGFueTtcclxuXHRASW5wdXQoKSBzdG9wUHJvcGFnYXRpb24gPSBmYWxzZTtcclxuXHQvLyBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJykgaXNEaXNhYmxlZDogYm9vbGVhbjtcclxuXHRASW5wdXQoKSBzZXRFbmFibGVkID0gdHJ1ZTtcclxuXHRwcml2YXRlIGNhbkV4ZWN1dGUkJDogU3Vic2NyaXB0aW9uO1xyXG5cdHByaXZhdGUgaXNFeGVjdXRpbmckJDogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRwcml2YXRlIGNvbmZpZzogQ29tbWFuZE9wdGlvbnMgPSBDT01NQU5EX0RFRkFVTFRfQ09ORklHO1xyXG5cclxuXHRwcml2YXRlIG93bkRpc2FibGVkU3RhdGUgPSBmYWxzZTtcclxuXHRwcml2YXRlIGNvbW1hbmREaXNhYmxlZENoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcblx0XHRwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWZcclxuXHQpIHsgIH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHQvLyBjb25zb2xlLmxvZygnW2NvbW1hbmREaXJlY3RpdmU6OmluaXRdJyk7XHJcblx0XHQgdGhpcy5jb21tYW5kT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCB0aGlzLmNvbW1hbmRPcHRpb25zKTtcclxuXHJcblx0XHRpZiAoIXRoaXMuY29tbWFuZCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1tjb21tYW5kRGlyZWN0aXZlXSBjb21tYW5kIHNob3VsZCBiZSBkZWZpbmVkIScpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5jb21tYW5kLnZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCk7XHJcblx0XHRcdHRoaXMuY29tbWFuZC5zZXROZXh0Rm9jdXModGhpcy5jb21tYW5kTmV4dEZvY3VzKTtcclxuXHRcdFx0dGhpcy5jb21tYW5kLnNldEVuYWJsZWRWYWx1ZSh0aGlzLnNldEVuYWJsZWQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdidXR0b24nKSB7XHJcblx0XHQvLyBcdGxldCB0aGlzQXV4ID0gdGhpcztcdC8vIFNldCB1cCBhIG5ldyBvYnNlcnZlclxyXG5cdFx0Ly8gXHR2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHtcclxuXHRcdC8vIFx0XHRtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtdXRhdGlvbikge1xyXG5cdFx0Ly8gXHRcdFx0Ly8gQ2hlY2sgdGhlIG1vZGlmaWVkIGF0dHJpYnV0ZU5hbWUgaXMgXCJkaXNhYmxlZFwiXHJcblx0XHQvLyBcdFx0XHRpZighdGhpc0F1eC5jb21tYW5kRGlzYWJsZWRDaGFuZ2VkKSB7XHJcblx0XHQvLyBcdFx0XHRcdGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSBcImRpc2FibGVkXCIpIHtcclxuXHRcdC8vIFx0XHRcdFx0XHR0aGlzQXV4Lm93bkRpc2FibGVkU3RhdGUgPSB0aGlzQXV4LmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZDtcclxuXHRcdC8vIFx0XHRcdFx0fVxyXG5cdFx0Ly8gXHRcdFx0fSBlbHNlIHtcclxuXHRcdC8vIFx0XHRcdFx0dGhpc0F1eC5jb21tYW5kRGlzYWJsZWRDaGFuZ2VkID0gZmFsc2U7XHJcblx0XHQvLyBcdFx0XHR9XHJcblx0XHQvLyBcdFx0fSk7XHJcblx0XHQvLyBcdH0pO1xyXG5cdFx0Ly8gXHQvLyBDb25maWd1cmUgdG8gb25seSBsaXN0ZW4gdG8gYXR0cmlidXRlIGNoYW5nZXNcclxuXHRcdC8vIFx0dmFyIGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSB9O1xyXG5cdFx0Ly8gXHQvLyBTdGFydCBvYnNlcnZpbmcgbXlFbGVtXHJcblx0XHQvLyBcdG9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XHJcblx0XHQvLyB9XHJcblxyXG5cdFx0dGhpcy5jYW5FeGVjdXRlJCQgPSB0aGlzLmNvbW1hbmQuY2FuRXhlY3V0ZSQucGlwZShcclxuXHRcdFx0dGFwKHggPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdidXR0b24nKSB7XHJcblx0XHRcdFx0XHR0aGlzLmNvbW1hbmREaXNhYmxlZENoYW5nZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tbWFuZFZhbHVlID09IHRoaXMuY29tbWFuZC5leGVjdXRpbmdQYXJhbSkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9ICF4O1xyXG5cdFx0XHRcdFx0XHQvLyB9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gISghdGhpcy5vd25EaXNhYmxlZFN0YXRlICYmIHgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpLnN1YnNjcmliZSgpO1xyXG5cdFx0dGhpcy5pc0V4ZWN1dGluZyQkID0gdGhpcy5jb21tYW5kLmlzRXhlY3V0aW5nJC5waXBlKFxyXG5cdFx0XHR0YXAoeCA9PiB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tjb21tYW5kRGlyZWN0aXZlOjppc0V4ZWN1dGluZyRdJywgeCk7XHJcbiAgICAgICAgeCA/IHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuY29tbWFuZE9wdGlvbnMuZXhlY3V0aW5nQ3NzQ2xhc3MpIDogdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5jb21tYW5kT3B0aW9ucy5leGVjdXRpbmdDc3NDbGFzcyk7XHJcblx0XHRcdH0pKS5zdWJzY3JpYmUoKTtcclxuXHJcblx0XHRpZiAodGhpcy5pc01vYmlsZU9wZXJhdGluZ1N5c3RlbSgpKSB7XHJcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBhc3luYyAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdpbnB1dCcpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGFzeW5jIChldmVudCkgPT4ge1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBhc3luYyAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAoKGV2ZW50LndoaWNoID09PSAxMyB8fCBldmVudC5rZXlDb2RlID09PSAxMykpIHtcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUNvbW1hbmQoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdpbnB1dCcpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRpZiAodGhpcy5zdG9wUHJvcGFnYXRpb24pIHtcclxuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVDb21tYW5kKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdGV4ZWN1dGVDb21tYW5kKCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkgdGhpcy5jb21tYW5kLmNhbkV4ZWN1dGUgPSB0cnVlO1xyXG5cdFx0dGhpcy5jb21tYW5kLnZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCk7XHJcblx0XHR0aGlzLmNvbW1hbmQuZXhlY3V0ZSh0aGlzLmNvbW1hbmRWYWx1ZSk7XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpIHtcclxuXHRcdGlmICh0aGlzLmNvbW1hbmQpIHsgdGhpcy5jb21tYW5kLmRlc3Ryb3koKTsgfVxyXG5cdFx0aWYgKHRoaXMuY2FuRXhlY3V0ZSQkKSB7IHRoaXMuY2FuRXhlY3V0ZSQkLnVuc3Vic2NyaWJlKCk7IH1cclxuXHRcdGlmICh0aGlzLmlzRXhlY3V0aW5nJCQpIHsgdGhpcy5pc0V4ZWN1dGluZyQkLnVuc3Vic2NyaWJlKCk7IH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgaXNNb2JpbGVPcGVyYXRpbmdTeXN0ZW0oKTogYm9vbGVhbiB7XHJcblx0XHRsZXQgaXNNb2JpbGUgPSBmYWxzZTtcclxuXHRcdGNvbnN0IHVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvcjtcclxuXHJcblx0XHQvLyBXaW5kb3dzIFBob25lIG11c3QgY29tZSBmaXJzdCBiZWNhdXNlIGl0cyBVQSBhbHNvIGNvbnRhaW5zIFwiQW5kcm9pZFwiXHJcblx0XHRpZiAoL3dpbmRvd3MgcGhvbmUvaS50ZXN0KHVzZXJBZ2VudCkpIHtcclxuXHRcdFx0aXNNb2JpbGUgPSB0cnVlOyAvLyBcIldpbmRvd3MgUGhvbmVcIjtcclxuXHRcdH0gZWxzZSBpZiAoL2FuZHJvaWQvaS50ZXN0KHVzZXJBZ2VudCkpIHtcclxuXHRcdFx0aXNNb2JpbGUgPSB0cnVlOyAvLyBcIkFuZHJvaWRcIjtcclxuXHRcdH0gZWxzZSBpZiAoL2lQYWR8aVBob25lfGlQb2QvLnRlc3QodXNlckFnZW50KSkge1xyXG5cdFx0XHQvLyBpT1MgZGV0ZWN0aW9uIGZyb206IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkwMzk4ODUvMTc3NzEwXHJcblx0XHRcdGlzTW9iaWxlID0gdHJ1ZTsgLy8gXCJpT1NcIjtcclxuXHRcdH1cclxuXHJcblx0XHRpc01vYmlsZSA9IGZhbHNlO1xyXG5cclxuXHRcdHJldHVybiBpc01vYmlsZTsgLy8gXCJ1bmtub3duXCI7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRPcHRpb25zIHtcclxuXHQvKipcclxuXHQgKiBDc3MgQ2xhc3Mgd2hpY2ggZ2V0cyBhZGRlZC9yZW1vdmVkIG9uIHRoZSBDb21tYW5kIGVsZW1lbnQncyBob3N0IHdoaWxlIENvbW1hbmQgaXNFeGVjdXRpbmckLlxyXG5cdCAqXHJcblx0ICovXHJcblx0ZXhlY3V0aW5nQ3NzQ2xhc3M6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQ29tbWFuZCB7XHJcblxyXG5cdGV4ZWN1dGluZ1BhcmFtOiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgY29tbWFuZCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLlxyXG5cdCAqL1xyXG5cdGlzRXhlY3V0aW5nOiBib29sZWFuO1xyXG5cdGlzRXhlY3V0aW5nJD86IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlIG9yIG5vdC5cclxuXHQgKi9cclxuXHRjYW5FeGVjdXRlOiBib29sZWFuO1xyXG5cdGNhbkV4ZWN1dGUkPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHQvKipcclxuXHQgKiBFeGVjdXRlIGZ1bmN0aW9uIHRvIGludm9rZS5cclxuXHQgKi9cclxuXHRleGVjdXRlKHZhbHVlPzogYW55KTogdm9pZDtcclxuXHJcblx0LyoqXHJcblx0ICogRXhlY3V0ZSBmdW5jdGlvbiB0byBpbnZva2UgYW5kIHJldHVybiBhIHJlc3VsdCBpbiBQcm9taXNlLlxyXG5cdCAqL1xyXG5cdGV4ZWN1dGVXaXRoUmVzdWx0KHZhbHVlPzogYW55KTogUHJvbWlzZTxhbnk+O1xyXG5cdC8qKlxyXG5cdCAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBieSBzdWJzY3JpcHRpb25zLlxyXG5cdCAqL1xyXG5cdGRlc3Ryb3koKTogdm9pZDtcclxuXHJcblx0dmVyaWZ5Q29tbWFuZEV4ZWN1dGlvblBpcGUoKTtcclxuXHJcblx0c2V0TmV4dEZvY3VzKGVsZW1lbnQ6IGFueSk7XHJcblxyXG5cdHNldEVuYWJsZWRWYWx1ZShlbmFibGU6IGJvb2xlYW4pO1xyXG5cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBDb21tYW5kIG9iamVjdCB1c2VkIHRvIGVuY2Fwc3VsYXRlIGluZm9ybWF0aW9uIHdoaWNoIGlzIG5lZWRlZCB0byBwZXJmb3JtIGFuIGFjdGlvbi5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb21tYW5kIGltcGxlbWVudHMgSUNvbW1hbmQge1xyXG5cclxuXHRpc0V4ZWN1dGluZyA9IGZhbHNlO1xyXG5cdGlzRXhlY3V0aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cdGNhbkV4ZWN1dGUgPSB0cnVlO1xyXG5cdGNhbkV4ZWN1dGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuXHRwcml2YXRlIGV4ZWN1dGlvblBpcGUkID0gbmV3IFN1YmplY3Q8e30+KCk7XHJcblx0cHJpdmF0ZSBpc0V4ZWN1dGluZyQkOiBTdWJzY3JpcHRpb247XHJcblx0cHJpdmF0ZSBjYW5FeGVjdXRlJCQ6IFN1YnNjcmlwdGlvbjtcclxuXHRwcml2YXRlIGV4ZWN1dGlvblBpcGUkJDogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRwcml2YXRlIGVsZW1lbnROZXh0Rm9jdXM6IGFueTtcclxuXHJcblx0cHVibGljIHJlc3VsdDogUHJvbWlzZTxhbnk+O1xyXG5cclxuXHRwdWJsaWMgYXN5bmNBY3Rpb246IChhbnkpID0+IGFueTtcclxuXHRwdWJsaWMgcmVzdWx0QXN5bmNBY3Rpb246IGFueTtcclxuXHJcblx0cHVibGljIGV4ZWN1dGluZ1BhcmFtOiBhbnk7XHJcblxyXG5cdHByaXZhdGUgZGVsYXlTdWJzY3JpYmU6IFN1YnNjcmlwdGlvbjtcclxuXHJcblx0cHJpdmF0ZSBzZXRFbmFibGVkID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb21tYW5kLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBleGVjdXRlUGFyYW06IChhbnk/KSA9PiBhbnksXHJcblx0XHRjYW5FeGVjdXRlJD86IE9ic2VydmFibGU8Ym9vbGVhbj4sXHJcblx0XHRwcml2YXRlIGlzQXN5bmM/OiBib29sZWFuLFxyXG5cdFx0cHJpdmF0ZSBkZWxheT86IG51bWJlclxyXG5cdCkge1xyXG5cdFx0aWYgKGNhbkV4ZWN1dGUkKSB7XHJcblx0XHRcdHRoaXMuY2FuRXhlY3V0ZSQgPSBjb21iaW5lTGF0ZXN0KFxyXG5cdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLFxyXG5cdFx0XHRcdGNhbkV4ZWN1dGUkXHJcblx0XHRcdFx0LCAoaXNFeGVjdXRpbmcsIGNhbkV4ZWN1dGVSZXN1bHQpID0+IHtcclxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZDo6Y29tYmluZUxhdGVzdCRdIHVwZGF0ZSEnLCB7IGlzRXhlY3V0aW5nLCBjYW5FeGVjdXRlUmVzdWx0IH0pO1xyXG5cdFx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyA9IGlzRXhlY3V0aW5nO1xyXG5cdFx0XHRcdFx0dGhpcy5jYW5FeGVjdXRlID0gIWlzRXhlY3V0aW5nICYmIGNhbkV4ZWN1dGVSZXN1bHQ7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jYW5FeGVjdXRlO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR0aGlzLmNhbkV4ZWN1dGUkJCA9IHRoaXMuY2FuRXhlY3V0ZSQuc3Vic2NyaWJlKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmNhbkV4ZWN1dGUkID0gdGhpcy5pc0V4ZWN1dGluZyQucGlwZShtYXAoeCA9PiB7XHJcblx0XHRcdFx0Y29uc3QgY2FuRXhlY3V0ZSA9ICF4O1xyXG5cdFx0XHRcdHRoaXMuY2FuRXhlY3V0ZSA9IGNhbkV4ZWN1dGU7XHJcblx0XHRcdFx0cmV0dXJuIGNhbkV4ZWN1dGU7XHJcblx0XHRcdH0pKTtcclxuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQkID0gdGhpcy5pc0V4ZWN1dGluZyQucGlwZShcclxuXHRcdFx0XHR0YXAoeCA9PiB0aGlzLmlzRXhlY3V0aW5nID0geCkpXHJcblx0XHRcdFx0LnN1YnNjcmliZSgpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5idWlsZEV4ZWN1dGlvblBpcGUoZXhlY3V0ZVBhcmFtLCBpc0FzeW5jLCBkZWxheSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgdmVyaWZ5Q29tbWFuZEV4ZWN1dGlvblBpcGUoKSB7XHJcblx0XHRpZiAodGhpcy5leGVjdXRpb25QaXBlJC5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdHRoaXMuYnVpbGRFeGVjdXRpb25QaXBlKHRoaXMuZXhlY3V0ZVBhcmFtLCB0aGlzLmlzQXN5bmMsIHRoaXMuZGVsYXkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZXhlY3V0ZSh2YWx1ZT86IGFueSkge1xyXG5cdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHZhbHVlO1xyXG5cdFx0dGhpcy5leGVjdXRpb25QaXBlJC5uZXh0KHZhbHVlKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGV4ZWN1dGVXaXRoUmVzdWx0KHZhbHVlPzogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuXHRcdHRoaXMuZXhlY3V0aW5nUGFyYW0gPSB2YWx1ZTtcclxuXHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQubmV4dCh2YWx1ZSk7XHJcblx0XHRyZXR1cm4gYXdhaXQgdGhpcy5yZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRkZXN0cm95KCkge1xyXG5cdFx0aWYgKHRoaXMuZXhlY3V0aW9uUGlwZSQkKSB7XHJcblx0XHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQkLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5jYW5FeGVjdXRlJCQpIHtcclxuXHRcdFx0dGhpcy5jYW5FeGVjdXRlJCQudW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHRcdGlmICh0aGlzLmlzRXhlY3V0aW5nJCQpIHtcclxuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQkLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblx0XHRpZiAodGhpcy5pc0V4ZWN1dGluZyQpIHtcclxuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQuY29tcGxldGUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5hc3luY0FjdGlvbiAhPSBudWxsKSB7XHJcblx0XHRcdHRoaXMuYXN5bmNBY3Rpb24gPSBudWxsO1xyXG5cdFx0XHR0aGlzLnJlc3VsdEFzeW5jQWN0aW9uID0gbnVsbDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgYnVpbGRFeGVjdXRpb25QaXBlKGV4ZWN1dGVQYXJtOiAoYW55PykgPT4gYW55LCBpc0FzeW5jPzogYm9vbGVhbiwgZGVsYXk/OiBudW1iZXIpIHtcclxuXHRcdGxldCBwaXBlJCA9IHRoaXMuZXhlY3V0aW9uUGlwZSQucGlwZShcclxuXHRcdFx0ZmlsdGVyKCgpID0+IHRoaXMuY2FuRXhlY3V0ZSksXHJcblx0XHRcdHRhcCgoKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQubmV4dCh0cnVlKTtcclxuXHRcdFx0XHRpZiAoaXNBc3luYyAmJiB0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHsgdGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IHRoaXMuYXN5bmNBY3Rpb24odW5kZWZpbmVkKTsgfVxyXG5cdFx0XHR9KSk7XHJcblxyXG5cdFx0cGlwZSQgPSBpc0FzeW5jXHJcblx0XHRcdD8gcGlwZSQucGlwZShzd2l0Y2hNYXAoKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0aWYgKGRlbGF5ICYmIGRlbGF5ID4gMCkge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuZGVsYXlTdWJzY3JpYmUpIHsgdGhpcy5kZWxheVN1YnNjcmliZS51bnN1YnNjcmliZSgpOyB9XHJcblx0XHRcdFx0XHRjb25zdCBkZWxheVRpbWVyID0gdGltZXIoZGVsYXkpO1xyXG5cdFx0XHRcdFx0dGhpcy5kZWxheVN1YnNjcmliZSA9IGRlbGF5VGltZXIuc3Vic2NyaWJlKHQgPT4geyBleGVjdXRlUGFybSh2YWx1ZSk7IH0pO1xyXG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gZXhlY3V0ZVBhcm0odmFsdWUpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSkpXHJcblx0XHRcdDogcGlwZSQucGlwZSh0YXAoKHZhbHVlKSA9PiB7IGV4ZWN1dGVQYXJtKHZhbHVlKTsgfSkpO1xyXG5cclxuXHRcdHBpcGUkID0gcGlwZSQucGlwZSh0YXAoKCkgPT4ge1xyXG5cdFx0XHQvLyBjb25zb2xlLmxvZygnW2NvbW1hbmQ6OmV4Y3V0aW9uUGlwZSRdIGRvIzIgLSBzZXQgaWRsZScpO1xyXG5cdFx0XHR0aGlzLmlzRXhlY3V0aW5nJC5uZXh0KGZhbHNlKTtcclxuXHRcdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0aWYgKGlzQXN5bmMgJiYgdGhpcy5hc3luY0FjdGlvbiAhPSBudWxsKSB7IHRoaXMucmVzdWx0QXN5bmNBY3Rpb24gPSB0aGlzLmFzeW5jQWN0aW9uKHRoaXMucmVzdWx0QXN5bmNBY3Rpb24pOyB9XHJcblx0XHRcdE9uUmV0dXJuRGlyZWN0aXZlLnNldE5leHRGb2N1cyh0aGlzLmVsZW1lbnROZXh0Rm9jdXMsIHRoaXMuc2V0RW5hYmxlZCk7XHJcblx0XHR9LFxyXG5cdFx0XHQoZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKCdbY29tbWFuZDo6ZXhjdXRpb25QaXBlJF0gZG8jMiBlcnJvciAtIHNldCBpZGxlJyArIGUudG9TdHJpbmcoKSk7XHJcblx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQubmV4dChmYWxzZSk7XHJcblx0XHRcdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRpZiAoaXNBc3luYyAmJiB0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHsgdGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IHRoaXMuYXN5bmNBY3Rpb24odGhpcy5yZXN1bHRBc3luY0FjdGlvbik7IH1cclxuXHRcdFx0XHR0aGlzLmJ1aWxkRXhlY3V0aW9uUGlwZShleGVjdXRlUGFybSwgaXNBc3luYywgZGVsYXkpO1xyXG5cdFx0XHR9KSk7XHJcblx0XHR0aGlzLmV4ZWN1dGlvblBpcGUkJCA9IHBpcGUkLnN1YnNjcmliZSgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIHNldE5leHRGb2N1cyhlbGVtZW50OiBhbnkpIHtcclxuXHRcdHRoaXMuZWxlbWVudE5leHRGb2N1cyA9IGVsZW1lbnQ7XHJcblx0fVxyXG5cdHB1YmxpYyBzZXRFbmFibGVkVmFsdWUoZW5hYmxlZCkge1xyXG5cdFx0dGhpcy5zZXRFbmFibGVkID0gZW5hYmxlZDtcclxuXHR9XHJcbn1cclxuIl19