@neo-one/server-plugin
Version:
NEO•ONE Server plugin API.
207 lines (205 loc) • 29.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("@neo-one/utils");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const tasks_1 = require("./tasks");
class TaskWrapper {
constructor({ task, taskList, collapse, }) {
this.task = task;
this.taskList = taskList;
this.status$ = new rxjs_1.BehaviorSubject({
id: task.title,
title: task.title,
collapse,
});
this.skip = task.skip === undefined ? (_ctx) => false : task.skip;
this.getEnabled = task.enabled === undefined ? (_ctx) => true : task.enabled;
this.mutableAborted = false;
}
check(ctx) {
if (this.enabled && !this.pending && !this.done && !this.getEnabled(ctx)) {
this.status$.next(undefined);
}
}
get enabled() {
return this.status$.getValue() !== undefined;
}
get pending() {
const status = this.status$.getValue();
return status !== undefined && status.pending === true;
}
get done() {
const status = this.status$.getValue();
return status !== undefined && tasks_1.isTaskDone(status);
}
get error() {
const status = this.status$.getValue();
return status === undefined ? undefined : tasks_1.getTaskError(status);
}
abort() {
this.mutableAborted = true;
const status = this.status$.getValue();
if (status !== undefined) {
this.status$.next(Object.assign({}, status, { skipped: 'Aborted' }));
}
this.status$.complete();
}
complete() {
this.status$.complete();
}
async run(ctx) {
const statusIn = this.status$.getValue();
if (statusIn === undefined) {
this.status$.complete();
return;
}
if (this.mutableAborted) {
return;
}
let status = Object.assign({}, statusIn, { pending: true });
const onError = (error) => {
this.taskList.onError(error, ctx);
this.taskList.mutableSuperOnError(error);
};
try {
const skip = this.skip(ctx);
if (skip !== false) {
status = Object.assign({}, status, { pending: false, skipped: skip });
this.status$.next(status);
}
else {
this.status$.next(status);
const result = this.task.task(ctx);
let error;
let message;
if (result instanceof rxjs_1.Observable) {
await result
.pipe(operators_1.map((msg) => {
status = Object.assign({}, status, { message: msg });
this.status$.next(status);
}))
.toPromise();
}
else if (result instanceof Promise) {
message = await result;
}
else if (result instanceof TaskList) {
result.setSuperOnError(onError);
result.run(ctx);
const finalSubtasks = await result.status$
.pipe(operators_1.map((subtasks) => {
status = Object.assign({}, status, { subtasks });
this.status$.next(status);
return subtasks;
}))
.toPromise();
error = tasks_1.getTasksError(finalSubtasks);
}
this.status$.next(Object.assign({}, status, { pending: false, complete: error === undefined, message: message === undefined ? undefined : message, error }));
}
}
catch (error) {
const message = error.stack == undefined ? error.message : error.stack;
this.status$.next(Object.assign({}, status, { pending: false, error: message == undefined || message === '' ? 'Something went wrong.' : message }));
onError(error);
}
this.status$.complete();
}
}
class TaskList {
constructor({ tasks, concurrent = false, onError, onComplete, onDone, initialContext = {}, freshContext = false, collapse = true, }) {
this.tasks = tasks.map((task) => new TaskWrapper({
task,
taskList: this,
collapse,
}));
this.concurrent = concurrent;
this.onError =
onError === undefined
? (_error, _ctx) => {
}
: onError;
this.onComplete =
onComplete === undefined
? () => {
}
: onComplete;
this.onDone =
onDone === undefined
? (_failed) => {
}
: onDone;
this.initialContext = initialContext;
this.freshContext = freshContext;
this.mutableSuperOnError = (_error) => {
};
this.statusInternal$ = new rxjs_1.ReplaySubject(1);
}
get status$() {
this.run().catch((error) => this.onError(error, {}));
return this.statusInternal$;
}
async toPromise() {
const result = await this.status$.toPromise();
const error = tasks_1.getTasksError(result);
if (error !== undefined) {
throw new Error(error);
}
}
async abort() {
await this.abort$().toPromise();
}
abort$() {
this.tasks.forEach((task) => task.abort());
return this.status$;
}
setSuperOnError(onError) {
this.mutableSuperOnError = onError;
}
async run(ctxIn = {}) {
if (this.mutableSubscription !== undefined) {
return;
}
const ctx = this.freshContext ? {} : ctxIn;
Object.entries(this.initialContext).forEach(([key, value]) => {
ctx[key] = value;
});
this.checkAll(ctx);
this.mutableSubscription = rxjs_1.combineLatest(this.tasks.map((task) => task.status$))
.pipe(operators_1.map((statuses) => statuses.filter(utils_1.utils.notNull)))
.subscribe(this.statusInternal$);
await this.runTasks(ctx);
const err = tasks_1.getTasksError(this.tasks.map((task) => task.status$.getValue()).filter(utils_1.utils.notNull));
if (err === undefined) {
this.onComplete();
}
this.onDone(err !== undefined);
}
async runTasks(ctx) {
if (this.tasks.length === 0) {
this.statusInternal$.next([]);
return;
}
if (this.concurrent) {
await Promise.all(this.tasks.map(async (task) => task.run(ctx)));
}
else {
let error;
for (const task of this.tasks) {
if (error === undefined) {
await task.run(ctx);
}
else {
task.complete();
}
error = task.error;
}
}
}
checkAll(ctx) {
this.tasks.forEach((task) => task.check(ctx));
}
}
exports.TaskList = TaskList;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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b25lLXNlcnZlci1wbHVnaW4vc3JjL1Rhc2tMaXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAbmVvLW9uZS91dGlscyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0VGFza0Vycm9yLCBnZXRUYXNrc0Vycm9yLCBpc1Rhc2tEb25lIH0gZnJvbSAnLi90YXNrcyc7XG5pbXBvcnQgeyBUYXNrU3RhdHVzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbmV4cG9ydCB0eXBlIFRhc2tDb250ZXh0ID0gYW55O1xudHlwZSBTa2lwRm4gPSAoY3R4OiBUYXNrQ29udGV4dCkgPT4gc3RyaW5nIHwgYm9vbGVhbjtcbnR5cGUgRW5hYmxlZEZuID0gKGN0eDogVGFza0NvbnRleHQpID0+IGJvb2xlYW47XG50eXBlIE9uRXJyb3JGbiA9IChlcnJvcjogRXJyb3IsIGN0eDogVGFza0NvbnRleHQpID0+IHZvaWQ7XG50eXBlIE9uRG9uZUZuID0gKGZhaWxlZDogYm9vbGVhbikgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBUYXNrIHtcbiAgcmVhZG9ubHkgc2tpcD86IFNraXBGbjtcbiAgcmVhZG9ubHkgZW5hYmxlZD86IEVuYWJsZWRGbjtcbiAgcmVhZG9ubHkgdGFzazogKGN0eDogVGFza0NvbnRleHQpID0+IFByb21pc2U8dm9pZD4gfCBQcm9taXNlPHN0cmluZz4gfCBPYnNlcnZhYmxlPHN0cmluZz4gfCBUYXNrTGlzdCB8IHZvaWQ7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0xpc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgdGFza3M6IHJlYWRvbmx5IFRhc2tbXTtcbiAgcmVhZG9ubHkgY29uY3VycmVudD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG9uRXJyb3I/OiBPbkVycm9yRm47XG4gIHJlYWRvbmx5IG9uQ29tcGxldGU/OiAoKSA9PiB2b2lkO1xuICByZWFkb25seSBvbkRvbmU/OiBPbkRvbmVGbjtcbiAgcmVhZG9ubHkgaW5pdGlhbENvbnRleHQ/OiBUYXNrQ29udGV4dDtcbiAgcmVhZG9ubHkgZnJlc2hDb250ZXh0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY29sbGFwc2U/OiBib29sZWFuO1xufVxuXG5jbGFzcyBUYXNrV3JhcHBlciB7XG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXMkOiBCZWhhdmlvclN1YmplY3Q8VGFza1N0YXR1cyB8IHVuZGVmaW5lZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFzaztcbiAgcHJpdmF0ZSByZWFkb25seSB0YXNrTGlzdDogVGFza0xpc3Q7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2tpcDogU2tpcEZuO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEVuYWJsZWQ6IEVuYWJsZWRGbjtcbiAgcHJpdmF0ZSBtdXRhYmxlQWJvcnRlZDogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioe1xuICAgIHRhc2ssXG4gICAgdGFza0xpc3QsXG4gICAgY29sbGFwc2UsXG4gIH06IHtcbiAgICByZWFkb25seSB0YXNrOiBUYXNrO1xuICAgIHJlYWRvbmx5IHRhc2tMaXN0OiBUYXNrTGlzdDtcbiAgICByZWFkb25seSBjb2xsYXBzZTogYm9vbGVhbjtcbiAgfSkge1xuICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgdGhpcy50YXNrTGlzdCA9IHRhc2tMaXN0O1xuICAgIHRoaXMuc3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFza1N0YXR1cyB8IHVuZGVmaW5lZD4oe1xuICAgICAgaWQ6IHRhc2sudGl0bGUsXG4gICAgICB0aXRsZTogdGFzay50aXRsZSxcbiAgICAgIGNvbGxhcHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5za2lwID0gdGFzay5za2lwID09PSB1bmRlZmluZWQgPyAoX2N0eCkgPT4gZmFsc2UgOiB0YXNrLnNraXA7XG4gICAgdGhpcy5nZXRFbmFibGVkID0gdGFzay5lbmFibGVkID09PSB1bmRlZmluZWQgPyAoX2N0eCkgPT4gdHJ1ZSA6IHRhc2suZW5hYmxlZDtcbiAgICB0aGlzLm11dGFibGVBYm9ydGVkID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgY2hlY2soY3R4OiBUYXNrQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgIXRoaXMucGVuZGluZyAmJiAhdGhpcy5kb25lICYmICF0aGlzLmdldEVuYWJsZWQoY3R4KSkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzJC5nZXRWYWx1ZSgpICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5zdGF0dXMkLmdldFZhbHVlKCk7XG5cbiAgICByZXR1cm4gc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzLnBlbmRpbmcgPT09IHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRvbmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5zdGF0dXMkLmdldFZhbHVlKCk7XG5cbiAgICByZXR1cm4gc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgaXNUYXNrRG9uZShzdGF0dXMpO1xuICB9XG5cbiAgcHVibGljIGdldCBlcnJvcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuc3RhdHVzJC5nZXRWYWx1ZSgpO1xuXG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZ2V0VGFza0Vycm9yKHN0YXR1cyk7XG4gIH1cblxuICBwdWJsaWMgYWJvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5tdXRhYmxlQWJvcnRlZCA9IHRydWU7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5zdGF0dXMkLmdldFZhbHVlKCk7XG4gICAgaWYgKHN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YXR1cyQubmV4dCh7IC4uLnN0YXR1cywgc2tpcHBlZDogJ0Fib3J0ZWQnIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXR1cyQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjb21wbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXR1cyQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBydW4oY3R4OiBUYXNrQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXR1c0luID0gdGhpcy5zdGF0dXMkLmdldFZhbHVlKCk7XG4gICAgaWYgKHN0YXR1c0luID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhdHVzJC5jb21wbGV0ZSgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm11dGFibGVBYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHN0YXR1cyA9IHsgLi4uc3RhdHVzSW4sIHBlbmRpbmc6IHRydWUgfTtcblxuICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aGlzLnRhc2tMaXN0Lm9uRXJyb3IoZXJyb3IsIGN0eCk7XG4gICAgICB0aGlzLnRhc2tMaXN0Lm11dGFibGVTdXBlck9uRXJyb3IoZXJyb3IpO1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2tpcCA9IHRoaXMuc2tpcChjdHgpO1xuICAgICAgaWYgKHNraXAgIT09IGZhbHNlKSB7XG4gICAgICAgIHN0YXR1cyA9IHsgLi4uc3RhdHVzLCBwZW5kaW5nOiBmYWxzZSwgc2tpcHBlZDogc2tpcCB9O1xuICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQoc3RhdHVzKTtcblxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy1maW5uaXNoXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudGFzay50YXNrKGN0eCk7XG5cbiAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICBsZXQgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgdm9pZDtcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICBhd2FpdCByZXN1bHRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBtYXAoKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9IHsgLi4uc3RhdHVzLCBtZXNzYWdlOiBtc2cgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChzdGF0dXMpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBUYXNrTGlzdCkge1xuICAgICAgICAgIHJlc3VsdC5zZXRTdXBlck9uRXJyb3Iob25FcnJvcik7XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgICAgcmVzdWx0LnJ1bihjdHgpO1xuICAgICAgICAgIGNvbnN0IGZpbmFsU3VidGFza3MgPSBhd2FpdCByZXN1bHQuc3RhdHVzJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoc3VidGFza3MpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSB7IC4uLnN0YXR1cywgc3VidGFza3MgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChzdGF0dXMpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1YnRhc2tzO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgICAgICBlcnJvciA9IGdldFRhc2tzRXJyb3IoZmluYWxTdWJ0YXNrcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXR1cyQubmV4dCh7XG4gICAgICAgICAgLi4uc3RhdHVzLFxuICAgICAgICAgIHBlbmRpbmc6IGZhbHNlLFxuICAgICAgICAgIGNvbXBsZXRlOiBlcnJvciA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1lc3NhZ2UsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3Iuc3RhY2sgPT0gdW5kZWZpbmVkID8gZXJyb3IubWVzc2FnZSA6IGVycm9yLnN0YWNrO1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoe1xuICAgICAgICAuLi5zdGF0dXMsXG4gICAgICAgIHBlbmRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogbWVzc2FnZSA9PSB1bmRlZmluZWQgfHwgbWVzc2FnZSA9PT0gJycgPyAnU29tZXRoaW5nIHdlbnQgd3JvbmcuJyA6IG1lc3NhZ2UsXG4gICAgICB9KTtcblxuICAgICAgb25FcnJvcihlcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXMkLmNvbXBsZXRlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRhc2tMaXN0IHtcbiAgcHVibGljIG11dGFibGVTdXBlck9uRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHB1YmxpYyByZWFkb25seSBvbkVycm9yOiBPbkVycm9yRm47XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFza3M6IHJlYWRvbmx5IFRhc2tXcmFwcGVyW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uY3VycmVudDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNvbXBsZXRlOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uRG9uZTogT25Eb25lRm47XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdGlhbENvbnRleHQ6IFRhc2tDb250ZXh0O1xuICBwcml2YXRlIHJlYWRvbmx5IGZyZXNoQ29udGV4dDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0dXNJbnRlcm5hbCQ6IFJlcGxheVN1YmplY3Q8cmVhZG9ubHkgVGFza1N0YXR1c1tdPjtcbiAgcHJpdmF0ZSBtdXRhYmxlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHtcbiAgICB0YXNrcyxcbiAgICBjb25jdXJyZW50ID0gZmFsc2UsXG4gICAgb25FcnJvcixcbiAgICBvbkNvbXBsZXRlLFxuICAgIG9uRG9uZSxcbiAgICBpbml0aWFsQ29udGV4dCA9IHt9LFxuICAgIGZyZXNoQ29udGV4dCA9IGZhbHNlLFxuICAgIGNvbGxhcHNlID0gdHJ1ZSxcbiAgfTogVGFza0xpc3RPcHRpb25zKSB7XG4gICAgdGhpcy50YXNrcyA9IHRhc2tzLm1hcChcbiAgICAgICh0YXNrKSA9PlxuICAgICAgICBuZXcgVGFza1dyYXBwZXIoe1xuICAgICAgICAgIHRhc2ssXG4gICAgICAgICAgdGFza0xpc3Q6IHRoaXMsXG4gICAgICAgICAgY29sbGFwc2UsXG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgIHRoaXMub25FcnJvciA9XG4gICAgICBvbkVycm9yID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoX2Vycm9yLCBfY3R4KSA9PiB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICA6IG9uRXJyb3I7XG4gICAgdGhpcy5vbkNvbXBsZXRlID1cbiAgICAgIG9uQ29tcGxldGUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIDogb25Db21wbGV0ZTtcbiAgICB0aGlzLm9uRG9uZSA9XG4gICAgICBvbkRvbmUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChfZmFpbGVkKSA9PiB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICA6IG9uRG9uZTtcbiAgICB0aGlzLmluaXRpYWxDb250ZXh0ID0gaW5pdGlhbENvbnRleHQ7XG4gICAgdGhpcy5mcmVzaENvbnRleHQgPSBmcmVzaENvbnRleHQ7XG4gICAgdGhpcy5tdXRhYmxlU3VwZXJPbkVycm9yID0gKF9lcnJvcikgPT4ge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH07XG5cbiAgICB0aGlzLnN0YXR1c0ludGVybmFsJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICB9XG5cbiAgcHVibGljIGdldCBzdGF0dXMkKCk6IE9ic2VydmFibGU8cmVhZG9ubHkgVGFza1N0YXR1c1tdPiB7XG4gICAgdGhpcy5ydW4oKS5jYXRjaCgoZXJyb3IpID0+IHRoaXMub25FcnJvcihlcnJvciwge30pKTtcblxuICAgIHJldHVybiB0aGlzLnN0YXR1c0ludGVybmFsJDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0b1Byb21pc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdGF0dXMkLnRvUHJvbWlzZSgpO1xuICAgIGNvbnN0IGVycm9yID0gZ2V0VGFza3NFcnJvcihyZXN1bHQpO1xuICAgIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhYm9ydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmFib3J0JCgpLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHVibGljIGFib3J0JCgpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IFRhc2tTdGF0dXNbXT4ge1xuICAgIHRoaXMudGFza3MuZm9yRWFjaCgodGFzaykgPT4gdGFzay5hYm9ydCgpKTtcblxuICAgIHJldHVybiB0aGlzLnN0YXR1cyQ7XG4gIH1cblxuICBwdWJsaWMgc2V0U3VwZXJPbkVycm9yKG9uRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm11dGFibGVTdXBlck9uRXJyb3IgPSBvbkVycm9yO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJ1bihjdHhJbjogVGFza0NvbnRleHQgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm11dGFibGVTdWJzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN0eCA9IHRoaXMuZnJlc2hDb250ZXh0ID8ge30gOiBjdHhJbjtcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLmluaXRpYWxDb250ZXh0KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1vYmplY3QtbXV0YXRpb25cbiAgICAgIGN0eFtrZXldID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5jaGVja0FsbChjdHgpO1xuXG4gICAgdGhpcy5tdXRhYmxlU3Vic2NyaXB0aW9uID0gY29tYmluZUxhdGVzdCh0aGlzLnRhc2tzLm1hcCgodGFzaykgPT4gdGFzay5zdGF0dXMkKSlcbiAgICAgIC5waXBlKG1hcCgoc3RhdHVzZXMpOiByZWFkb25seSBUYXNrU3RhdHVzW10gPT4gc3RhdHVzZXMuZmlsdGVyKHV0aWxzLm5vdE51bGwpKSlcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5zdGF0dXNJbnRlcm5hbCQpO1xuXG4gICAgYXdhaXQgdGhpcy5ydW5UYXNrcyhjdHgpO1xuICAgIGNvbnN0IGVyciA9IGdldFRhc2tzRXJyb3IodGhpcy50YXNrcy5tYXAoKHRhc2spID0+IHRhc2suc3RhdHVzJC5nZXRWYWx1ZSgpKS5maWx0ZXIodXRpbHMubm90TnVsbCkpO1xuXG4gICAgaWYgKGVyciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9uQ29tcGxldGUoKTtcbiAgICB9XG4gICAgdGhpcy5vbkRvbmUoZXJyICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5UYXNrcyhjdHg6IFRhc2tDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudGFza3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0YXR1c0ludGVybmFsJC5uZXh0KFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmN1cnJlbnQpIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMudGFza3MubWFwKGFzeW5jICh0YXNrKSA9PiB0YXNrLnJ1bihjdHgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICBpZiAoZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGF3YWl0IHRhc2sucnVuKGN0eCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFzay5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yID0gdGFzay5lcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQWxsKGN0eDogVGFza0NvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tzLmZvckVhY2goKHRhc2spID0+IHRhc2suY2hlY2soY3R4KSk7XG4gIH1cbn1cbiJdfQ==