UNPKG

21.2 kBJavaScriptView Raw
1import { labels, utils } from '@neo-one/utils-esnext-esm';
2import { concat, of as _of, timer } from 'rxjs';
3import { concatMap, shareReplay } from 'rxjs/operators';
4export class NodeAdapter {
5 constructor({ monitor, name, binary, dataPath, settings, }) {
6 this.monitor = monitor;
7 this.name = name;
8 this.binary = binary;
9 this.dataPath = dataPath;
10 this.mutableSettings = settings;
11 const { rpcAddress, tcpAddress, telemetryAddress } = this.getNodeStatus();
12 this.node$ = concat(_of({
13 name: this.name,
14 ready: false,
15 live: false,
16 rpcAddress,
17 tcpAddress,
18 telemetryAddress,
19 }), timer(0, 500).pipe(concatMap(async () => {
20 const config = this.getNodeStatus();
21 const [ready, live] = await Promise.all([this.isReady(), this.isLive()]);
22 return {
23 name: this.name,
24 ready,
25 live,
26 rpcAddress: config.rpcAddress,
27 tcpAddress: config.tcpAddress,
28 telemetryAddress: config.telemetryAddress,
29 };
30 }))).pipe(shareReplay(1));
31 }
32 getDebug() {
33 return [
34 ['Data Path', this.dataPath],
35 [
36 'Settings',
37 {
38 type: 'describe',
39 table: [
40 ['Type', this.mutableSettings.type],
41 [
42 'Is Test Net',
43 this.mutableSettings.isTestNet === undefined ? "'null'" : JSON.stringify(this.mutableSettings.isTestNet),
44 ],
45 [
46 'Seconds Per Block',
47 this.mutableSettings.secondsPerBlock === undefined
48 ? "'null'"
49 : JSON.stringify(this.mutableSettings.secondsPerBlock),
50 ],
51 [
52 'Standby Validators',
53 this.mutableSettings.standbyValidators === undefined
54 ? "'null'"
55 : JSON.stringify(this.mutableSettings.standbyValidators, undefined, 2),
56 ],
57 [
58 'Address',
59 this.mutableSettings.address === undefined ? "'null'" : JSON.stringify(this.mutableSettings.address),
60 ],
61 ['RPC Port', JSON.stringify(this.mutableSettings.rpcPort)],
62 ['Listen TCP Port', JSON.stringify(this.mutableSettings.listenTCPPort)],
63 ['Telemetry Port', JSON.stringify(this.mutableSettings.telemetryPort)],
64 ['Consensus Enabled', this.mutableSettings.consensus.enabled ? 'Yes' : 'No'],
65 ['Consensus Private Key', this.mutableSettings.consensus.options.privateKey],
66 ['Seeds', JSON.stringify(this.mutableSettings.seeds, undefined, 2)],
67 ['RPC Endpoints', JSON.stringify(this.mutableSettings.rpcEndpoints, undefined, 2)],
68 ],
69 },
70 ],
71 ];
72 }
73 async create() {
74 await this.monitor.withData({ [labels.NODE_NAME]: this.name }).captureLog(async () => this.createInternal(), {
75 name: 'neo_node_adapter_create',
76 message: `Created node ${this.name}`,
77 error: `Failed to create node ${this.name}`,
78 });
79 }
80 async update(settings) {
81 await this.monitor.withData({ [labels.NODE_NAME]: this.name }).captureLog(async () => {
82 await this.updateInternal(settings);
83 this.mutableSettings = settings;
84 }, {
85 name: 'neo_node_adapter_update',
86 message: `Updated node ${this.name}`,
87 error: `Failed to update node ${this.name}`,
88 });
89 }
90 async start() {
91 await this.monitor.withData({ [labels.NODE_NAME]: this.name }).captureLog(async () => {
92 await this.startInternal();
93 }, {
94 name: 'neo_node_adapter_start',
95 message: `Started node ${this.name}`,
96 error: `Failed to start node ${this.name}`,
97 });
98 }
99 async stop() {
100 await this.monitor.withData({ [labels.NODE_NAME]: this.name }).captureLog(async () => {
101 await this.stopInternal();
102 }, {
103 name: 'neo_node_adapter_stop',
104 message: `Stopped node ${this.name}`,
105 error: `Failed to stop node ${this.name}`,
106 });
107 }
108 async live(timeoutSeconds) {
109 const start = utils.nowSeconds();
110 // tslint:disable-next-line no-loop-statement
111 while (utils.nowSeconds() - start < timeoutSeconds) {
112 const isLive = await this.isLive();
113 if (isLive) {
114 return;
115 }
116 await new Promise((resolve) => setTimeout(resolve, 50));
117 }
118 throw new Error(`Node ${this.name} did not start.`);
119 }
120 async ready(timeoutSeconds) {
121 const start = utils.nowSeconds();
122 // tslint:disable-next-line no-loop-statement
123 while (utils.nowSeconds() - start < timeoutSeconds) {
124 const isLive = await this.isReady();
125 if (isLive) {
126 return;
127 }
128 await new Promise((resolve) => setTimeout(resolve, 50));
129 }
130 throw new Error(`Node ${this.name} is not ready.`);
131 }
132}
133
134//# sourceMappingURL=data:application/json;charset=utf8;base64,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LEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBc0I7UUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLDZDQUE2QztRQUM3QyxPQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxLQUFLLEdBQUcsY0FBYyxFQUFFO1lBQ2xELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLElBQUksTUFBTSxFQUFFO2dCQUNWLE9BQU87YUFDUjtZQUVELE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvRDtRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FRRiIsImZpbGUiOiJuZW8tb25lLXNlcnZlci1wbHVnaW4tbmV0d29yay9zcmMvbm9kZS9Ob2RlQWRhcHRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vbml0b3IgfSBmcm9tICdAbmVvLW9uZS9tb25pdG9yJztcbmltcG9ydCB7IEJpbmFyeSwgRGVzY3JpYmVUYWJsZSB9IGZyb20gJ0BuZW8tb25lL3NlcnZlci1wbHVnaW4nO1xuaW1wb3J0IHsgbGFiZWxzLCB1dGlscyB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB7IGNvbmNhdCwgT2JzZXJ2YWJsZSwgb2YgYXMgX29mLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY29uY2F0TWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5vZGVTZXR0aW5ncyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBOb2RlIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsaXZlOiBib29sZWFuO1xuICByZWFkb25seSByZWFkeTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcnBjQWRkcmVzczogc3RyaW5nO1xuICByZWFkb25seSB0Y3BBZGRyZXNzOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlU3RhdHVzIHtcbiAgcmVhZG9ubHkgcnBjQWRkcmVzczogc3RyaW5nO1xuICByZWFkb25seSB0Y3BBZGRyZXNzOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5vZGVBZGFwdGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG5vZGUkOiBPYnNlcnZhYmxlPE5vZGU+O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmluYXJ5OiBCaW5hcnk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhUGF0aDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9uaXRvcjogTW9uaXRvcjtcbiAgcHJvdGVjdGVkIG11dGFibGVTZXR0aW5nczogTm9kZVNldHRpbmdzO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih7XG4gICAgbW9uaXRvcixcbiAgICBuYW1lLFxuICAgIGJpbmFyeSxcbiAgICBkYXRhUGF0aCxcbiAgICBzZXR0aW5ncyxcbiAgfToge1xuICAgIHJlYWRvbmx5IG1vbml0b3I6IE1vbml0b3I7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGJpbmFyeTogQmluYXJ5O1xuICAgIHJlYWRvbmx5IGRhdGFQYXRoOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2V0dGluZ3M6IE5vZGVTZXR0aW5ncztcbiAgfSkge1xuICAgIHRoaXMubW9uaXRvciA9IG1vbml0b3I7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmJpbmFyeSA9IGJpbmFyeTtcbiAgICB0aGlzLmRhdGFQYXRoID0gZGF0YVBhdGg7XG5cbiAgICB0aGlzLm11dGFibGVTZXR0aW5ncyA9IHNldHRpbmdzO1xuXG4gICAgY29uc3QgeyBycGNBZGRyZXNzLCB0Y3BBZGRyZXNzLCB0ZWxlbWV0cnlBZGRyZXNzIH0gPSB0aGlzLmdldE5vZGVTdGF0dXMoKTtcbiAgICB0aGlzLm5vZGUkID0gY29uY2F0KFxuICAgICAgX29mKHtcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICByZWFkeTogZmFsc2UsXG4gICAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgICBycGNBZGRyZXNzLFxuICAgICAgICB0Y3BBZGRyZXNzLFxuICAgICAgICB0ZWxlbWV0cnlBZGRyZXNzLFxuICAgICAgfSksXG4gICAgICB0aW1lcigwLCA1MDApLnBpcGUoXG4gICAgICAgIGNvbmNhdE1hcChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXROb2RlU3RhdHVzKCk7XG4gICAgICAgICAgY29uc3QgW3JlYWR5LCBsaXZlXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmlzUmVhZHkoKSwgdGhpcy5pc0xpdmUoKV0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIHJlYWR5LFxuICAgICAgICAgICAgbGl2ZSxcbiAgICAgICAgICAgIHJwY0FkZHJlc3M6IGNvbmZpZy5ycGNBZGRyZXNzLFxuICAgICAgICAgICAgdGNwQWRkcmVzczogY29uZmlnLnRjcEFkZHJlc3MsXG4gICAgICAgICAgICB0ZWxlbWV0cnlBZGRyZXNzOiBjb25maWcudGVsZW1ldHJ5QWRkcmVzcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWJ1ZygpOiBEZXNjcmliZVRhYmxlIHtcbiAgICByZXR1cm4gW1xuICAgICAgWydEYXRhIFBhdGgnLCB0aGlzLmRhdGFQYXRoXSxcbiAgICAgIFtcbiAgICAgICAgJ1NldHRpbmdzJyxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdkZXNjcmliZScsXG4gICAgICAgICAgdGFibGU6IFtcbiAgICAgICAgICAgIFsnVHlwZScsIHRoaXMubXV0YWJsZVNldHRpbmdzLnR5cGVdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAnSXMgVGVzdCBOZXQnLFxuICAgICAgICAgICAgICB0aGlzLm11dGFibGVTZXR0aW5ncy5pc1Rlc3ROZXQgPT09IHVuZGVmaW5lZCA/IFwiJ251bGwnXCIgOiBKU09OLnN0cmluZ2lmeSh0aGlzLm11dGFibGVTZXR0aW5ncy5pc1Rlc3ROZXQpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgJ1NlY29uZHMgUGVyIEJsb2NrJyxcbiAgICAgICAgICAgICAgdGhpcy5tdXRhYmxlU2V0dGluZ3Muc2Vjb25kc1BlckJsb2NrID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IFwiJ251bGwnXCJcbiAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHRoaXMubXV0YWJsZVNldHRpbmdzLnNlY29uZHNQZXJCbG9jayksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAnU3RhbmRieSBWYWxpZGF0b3JzJyxcbiAgICAgICAgICAgICAgdGhpcy5tdXRhYmxlU2V0dGluZ3Muc3RhbmRieVZhbGlkYXRvcnMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gXCInbnVsbCdcIlxuICAgICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3Muc3RhbmRieVZhbGlkYXRvcnMsIHVuZGVmaW5lZCwgMiksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAnQWRkcmVzcycsXG4gICAgICAgICAgICAgIHRoaXMubXV0YWJsZVNldHRpbmdzLmFkZHJlc3MgPT09IHVuZGVmaW5lZCA/IFwiJ251bGwnXCIgOiBKU09OLnN0cmluZ2lmeSh0aGlzLm11dGFibGVTZXR0aW5ncy5hZGRyZXNzKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbJ1JQQyBQb3J0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3MucnBjUG9ydCldLFxuICAgICAgICAgICAgWydMaXN0ZW4gVENQIFBvcnQnLCBKU09OLnN0cmluZ2lmeSh0aGlzLm11dGFibGVTZXR0aW5ncy5saXN0ZW5UQ1BQb3J0KV0sXG4gICAgICAgICAgICBbJ1RlbGVtZXRyeSBQb3J0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3MudGVsZW1ldHJ5UG9ydCldLFxuICAgICAgICAgICAgWydDb25zZW5zdXMgRW5hYmxlZCcsIHRoaXMubXV0YWJsZVNldHRpbmdzLmNvbnNlbnN1cy5lbmFibGVkID8gJ1llcycgOiAnTm8nXSxcbiAgICAgICAgICAgIFsnQ29uc2Vuc3VzIFByaXZhdGUgS2V5JywgdGhpcy5tdXRhYmxlU2V0dGluZ3MuY29uc2Vuc3VzLm9wdGlvbnMucHJpdmF0ZUtleV0sXG4gICAgICAgICAgICBbJ1NlZWRzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3Muc2VlZHMsIHVuZGVmaW5lZCwgMildLFxuICAgICAgICAgICAgWydSUEMgRW5kcG9pbnRzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3MucnBjRW5kcG9pbnRzLCB1bmRlZmluZWQsIDIpXSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1vbml0b3Iud2l0aERhdGEoeyBbbGFiZWxzLk5PREVfTkFNRV06IHRoaXMubmFtZSB9KS5jYXB0dXJlTG9nKGFzeW5jICgpID0+IHRoaXMuY3JlYXRlSW50ZXJuYWwoKSwge1xuICAgICAgbmFtZTogJ25lb19ub2RlX2FkYXB0ZXJfY3JlYXRlJyxcbiAgICAgIG1lc3NhZ2U6IGBDcmVhdGVkIG5vZGUgJHt0aGlzLm5hbWV9YCxcbiAgICAgIGVycm9yOiBgRmFpbGVkIHRvIGNyZWF0ZSBub2RlICR7dGhpcy5uYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKHNldHRpbmdzOiBOb2RlU2V0dGluZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1vbml0b3Iud2l0aERhdGEoeyBbbGFiZWxzLk5PREVfTkFNRV06IHRoaXMubmFtZSB9KS5jYXB0dXJlTG9nKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUludGVybmFsKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5tdXRhYmxlU2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICduZW9fbm9kZV9hZGFwdGVyX3VwZGF0ZScsXG4gICAgICAgIG1lc3NhZ2U6IGBVcGRhdGVkIG5vZGUgJHt0aGlzLm5hbWV9YCxcbiAgICAgICAgZXJyb3I6IGBGYWlsZWQgdG8gdXBkYXRlIG5vZGUgJHt0aGlzLm5hbWV9YCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1vbml0b3Iud2l0aERhdGEoeyBbbGFiZWxzLk5PREVfTkFNRV06IHRoaXMubmFtZSB9KS5jYXB0dXJlTG9nKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0SW50ZXJuYWwoKTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICduZW9fbm9kZV9hZGFwdGVyX3N0YXJ0JyxcbiAgICAgICAgbWVzc2FnZTogYFN0YXJ0ZWQgbm9kZSAke3RoaXMubmFtZX1gLFxuICAgICAgICBlcnJvcjogYEZhaWxlZCB0byBzdGFydCBub2RlICR7dGhpcy5uYW1lfWAsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1vbml0b3Iud2l0aERhdGEoeyBbbGFiZWxzLk5PREVfTkFNRV06IHRoaXMubmFtZSB9KS5jYXB0dXJlTG9nKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BJbnRlcm5hbCgpO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ25lb19ub2RlX2FkYXB0ZXJfc3RvcCcsXG4gICAgICAgIG1lc3NhZ2U6IGBTdG9wcGVkIG5vZGUgJHt0aGlzLm5hbWV9YCxcbiAgICAgICAgZXJyb3I6IGBGYWlsZWQgdG8gc3RvcCBub2RlICR7dGhpcy5uYW1lfWAsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgZ2V0Tm9kZVN0YXR1cygpOiBOb2RlU3RhdHVzO1xuXG4gIHB1YmxpYyBhc3luYyBsaXZlKHRpbWVvdXRTZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IHV0aWxzLm5vd1NlY29uZHMoKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgICB3aGlsZSAodXRpbHMubm93U2Vjb25kcygpIC0gc3RhcnQgPCB0aW1lb3V0U2Vjb25kcykge1xuICAgICAgY29uc3QgaXNMaXZlID0gYXdhaXQgdGhpcy5pc0xpdmUoKTtcbiAgICAgIGlmIChpc0xpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MCkpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSAke3RoaXMubmFtZX0gZGlkIG5vdCBzdGFydC5gKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkeSh0aW1lb3V0U2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnQgPSB1dGlscy5ub3dTZWNvbmRzKCk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgd2hpbGUgKHV0aWxzLm5vd1NlY29uZHMoKSAtIHN0YXJ0IDwgdGltZW91dFNlY29uZHMpIHtcbiAgICAgIGNvbnN0IGlzTGl2ZSA9IGF3YWl0IHRoaXMuaXNSZWFkeSgpO1xuICAgICAgaWYgKGlzTGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlICR7dGhpcy5uYW1lfSBpcyBub3QgcmVhZHkuYCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgaXNMaXZlKCk6IFByb21pc2U8Ym9vbGVhbj47XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj47XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhc3luYyBjcmVhdGVJbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgdXBkYXRlSW50ZXJuYWwoX3NldHRpbmdzOiBOb2RlU2V0dGluZ3MpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgc3RhcnRJbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgc3RvcEludGVybmFsKCk6IFByb21pc2U8dm9pZD47XG59XG4iXX0=