active-connect-ng2 0.2.48 → 0.2.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/websocket/client.mjs +53 -3
- package/fesm2015/active-connect-ng2.mjs +52 -2
- package/fesm2015/active-connect-ng2.mjs.map +1 -1
- package/fesm2020/active-connect-ng2.mjs +52 -2
- package/fesm2020/active-connect-ng2.mjs.map +1 -1
- package/lib/websocket/client.d.ts +3 -0
- package/package.json +1 -1
|
@@ -87,7 +87,11 @@ export class WebsocketClient {
|
|
|
87
87
|
set Connected(value) {
|
|
88
88
|
if (value) {
|
|
89
89
|
this.sendBrowserInfoToServer();
|
|
90
|
-
this.auth(this.Token)
|
|
90
|
+
this.auth(this.Token)
|
|
91
|
+
.catch((err) => {
|
|
92
|
+
console.log('ActiveConnect: auth failed on reconnect: ' + err);
|
|
93
|
+
})
|
|
94
|
+
.then(() => {
|
|
91
95
|
Promise.all(WebsocketClient.onReconnectCallback.map((c) => c.Func ? c.Func() : null)).then(() => {
|
|
92
96
|
setTimeout(() => {
|
|
93
97
|
this.resetRequestedState();
|
|
@@ -116,6 +120,12 @@ export class WebsocketClient {
|
|
|
116
120
|
static addResetRequestingStateCallback(callback) {
|
|
117
121
|
WebsocketClient.resetRequestedStateCallbacks.push(callback);
|
|
118
122
|
}
|
|
123
|
+
clearHandshakeTimer() {
|
|
124
|
+
if (this.handshakeTimer !== undefined) {
|
|
125
|
+
clearTimeout(this.handshakeTimer);
|
|
126
|
+
this.handshakeTimer = undefined;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
119
129
|
create(url) {
|
|
120
130
|
if (this.ws) {
|
|
121
131
|
// Detach handlers first so the old socket's close event can't trigger
|
|
@@ -130,23 +140,61 @@ export class WebsocketClient {
|
|
|
130
140
|
}
|
|
131
141
|
}
|
|
132
142
|
this.clearReconnectTimer();
|
|
143
|
+
this.clearHandshakeTimer();
|
|
133
144
|
this.closed = false;
|
|
134
145
|
// create new connection
|
|
135
146
|
this.logEntry('TCP/HTTP:CONNECT-SERVER');
|
|
136
147
|
this.ws = new WebSocket(url + (this.supportsCache ? '?cache=true' : ''));
|
|
148
|
+
this.handshakeTimer = setTimeout(() => {
|
|
149
|
+
if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {
|
|
150
|
+
this.logEntry('TCP/HTTP:HANDSHAKE-TIMEOUT');
|
|
151
|
+
console.log('ActiveConnect: Handshake timed out, retrying connection...');
|
|
152
|
+
// Detach so the forced close below doesn't double-trigger reconnect logic.
|
|
153
|
+
this.ws.onopen = null;
|
|
154
|
+
this.ws.onmessage = null;
|
|
155
|
+
this.ws.onerror = null;
|
|
156
|
+
this.ws.onclose = null;
|
|
157
|
+
try {
|
|
158
|
+
this.ws.close();
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
// ignore - socket may already be in a bad state
|
|
162
|
+
}
|
|
163
|
+
if (!this.closed) {
|
|
164
|
+
this.clearReconnectTimer();
|
|
165
|
+
this.reconnectTimer = setTimeout(() => {
|
|
166
|
+
this.reconnectTimer = undefined;
|
|
167
|
+
this.connect(url);
|
|
168
|
+
}, 1000);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}, WebsocketClient.HANDSHAKE_TIMEOUT_MS);
|
|
137
172
|
this.ws.onerror = (err) => {
|
|
138
173
|
this.ws.close();
|
|
139
174
|
this.logEntry('TCP/HTTP:ERROR:' + err);
|
|
140
175
|
console.log('ActiveConnect: ' + err);
|
|
141
176
|
};
|
|
142
177
|
this.ws.onopen = () => {
|
|
178
|
+
this.clearHandshakeTimer();
|
|
143
179
|
this.logEntry('TCP/HTTP:CONNECTED');
|
|
144
180
|
this.Connected = true;
|
|
145
181
|
};
|
|
146
182
|
this.ws.onmessage = (e) => {
|
|
147
|
-
|
|
183
|
+
let parsed;
|
|
184
|
+
try {
|
|
185
|
+
parsed = JsonParser.parse(e.data.toString());
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
// A malformed frame must not throw inside the onmessage handler -
|
|
189
|
+
// that would silently kill message processing for the rest of the
|
|
190
|
+
// connection's lifetime without ever surfacing an error.
|
|
191
|
+
console.log('ActiveConnect: failed to parse incoming message: ' + err);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
this.messageReceived(parsed);
|
|
148
195
|
};
|
|
149
196
|
this.ws.onclose = () => {
|
|
197
|
+
this.clearHandshakeTimer();
|
|
150
198
|
this.logEntry('TCP/HTTP:CLOSED');
|
|
151
199
|
if (!this.closed) {
|
|
152
200
|
if (this.pool && this.pool.WssConnected)
|
|
@@ -370,6 +418,7 @@ export class WebsocketClient {
|
|
|
370
418
|
disconnect(restart) {
|
|
371
419
|
this.closed = true;
|
|
372
420
|
this.clearReconnectTimer();
|
|
421
|
+
this.clearHandshakeTimer();
|
|
373
422
|
if (this.ws)
|
|
374
423
|
this.ws.close();
|
|
375
424
|
if (!restart) {
|
|
@@ -385,8 +434,9 @@ export class WebsocketClient {
|
|
|
385
434
|
}
|
|
386
435
|
}
|
|
387
436
|
WebsocketClient.resetRequestedStateCallbacks = [];
|
|
437
|
+
WebsocketClient.HANDSHAKE_TIMEOUT_MS = 10000;
|
|
388
438
|
WebsocketClient.outbounds = new Map();
|
|
389
439
|
WebsocketClient.handles = new Map();
|
|
390
440
|
WebsocketClient.onSuccessHandlers = [];
|
|
391
441
|
WebsocketClient.onReconnectCallback = [];
|
|
392
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9saWIvd2Vic29ja2V0L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQsTUFBTSxPQUFPLGVBQWU7SUFJMUIsWUFDVSxHQUFZLEVBQ1osYUFBdUIsRUFDeEIsU0FBK0I7UUFGOUIsUUFBRyxHQUFILEdBQUcsQ0FBUztRQUNaLGtCQUFhLEdBQWIsYUFBYSxDQUFVO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBZ0VoQyxpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6Qix1QkFBa0IsR0FBMEMsRUFBRSxDQUFDO1FBUS9ELFdBQU0sR0FBRyxFQUFFLENBQUM7UUFvQ1osOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBeUUzQyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBMEN0QixvQkFBZSxHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ25ELG9CQUFlLEdBQTBDLElBQUksR0FBRyxFQUFFLENBQUM7UUEwT3BFLFdBQU0sR0FBRyxLQUFLLENBQUM7UUF6Y3BCLElBQUksYUFBYTtZQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRVMsTUFBTSxDQUFDLEdBQXVCO1FBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixJQUFJLFFBQVEsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDO1lBQ1QsUUFBUSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtnQkFDbEMsS0FBSyxRQUFRLENBQUMsQ0FBQztvQkFDYixRQUFRLEdBQUcsTUFBTSxDQUFDO29CQUNsQixJQUFJLEdBQUcsTUFBTSxDQUFDO29CQUNk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LENBQUM7SUFFdEIsSUFBSSxNQUFNO1FBQ1IsT0FBUSxJQUFZLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUM7O0FBblhjLDRDQUE0QixHQUFlLEVBQUUsQ0FBQztBQXNPOUMseUJBQVMsR0FXcEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQWdCQyx1QkFBTyxHQUFtQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBc0VwRCxpQ0FBaUIsR0FHMUIsRUFBRSxDQUFDO0FBS00sbUNBQW1CLEdBQXdCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5neEluZGV4ZWREQlNlcnZpY2UgfSBmcm9tICduZ3gtaW5kZXhlZC1kYic7XHJcbmltcG9ydCB7IERlY29yYWJsZUZ1bmN0aW9uIH0gZnJvbSAnLi9kZWNvcmF0b3JzL2Z1bmN0aW9uJztcclxuaW1wb3J0IHsgSnNvblBhcnNlciB9IGZyb20gJy4vanNvbi9qc29uLXBhcnNlcic7XHJcblxyXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0Q2xpZW50IHtcclxuICB3cyE6IFdlYlNvY2tldDtcclxuICBwb29sITogeyBXc3NDb25uZWN0ZWQ6IGJvb2xlYW4gfSB8IG51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB1cmw/OiBzdHJpbmcsXHJcbiAgICBwcml2YXRlIHN1cHBvcnRzQ2FjaGU/OiBib29sZWFuLFxyXG4gICAgcHVibGljIGRiU2VydmljZT86IE5neEluZGV4ZWREQlNlcnZpY2VcclxuICApIHtcclxuICAgIGlmIChzdXBwb3J0c0NhY2hlKSB0aGlzLmluaXRDYWNoZSgpO1xyXG4gICAgdGhpcy5zZXRVcmwodGhpcy51cmwpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHNldFVybCh1cmw6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKCF1cmwpIHtcclxuICAgICAgbGV0IHByb3RvY29sO1xyXG4gICAgICBsZXQgcG9ydDtcclxuICAgICAgc3dpdGNoIChkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkge1xyXG4gICAgICAgIGNhc2UgJ2h0dHBzOic6IHtcclxuICAgICAgICAgIHByb3RvY29sID0gJ3dzczonO1xyXG4gICAgICAgICAgcG9ydCA9ICc6NDQzJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICBwcm90b2NvbCA9ICd3czonO1xyXG4gICAgICAgICAgcG9ydCA9ICc6ODAnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHVybCA9IHByb3RvY29sICsgJy8vJyArIGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lICsgcG9ydCArICcvd3NzJztcclxuICAgIH1cclxuICAgIHRoaXMudXJsID0gdXJsO1xyXG4gICAgLy8gSW5pdGlhbCBzZXR1cDogbm90aGluZyB0byB0ZWFyIGRvd24geWV0LCBqdXN0IG9wZW4gdGhlIGZpcnN0IGNvbm5lY3Rpb24uXHJcbiAgICB0aGlzLmNsb3NlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jb25uZWN0KHRoaXMudXJsIGFzIHN0cmluZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbm5lY3QodXJsOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy50YXJnZXQuX19fY29ubmVjdGlvbklkKSB7XHJcbiAgICAgIHRoaXMudGFyZ2V0Ll9fX2Nvbm5lY3Rpb25JZCA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRhcmdldC5fX19jb25uZWN0aW9uSWQrKztcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud3MgJiZcclxuICAgICAgKHRoaXMud3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcgfHxcclxuICAgICAgICB0aGlzLndzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNyZWF0ZSh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXRUYWJTdXNwZW5kZWRMaXN0ZW5lcigpIHtcclxuICAgIGlmIChkb2N1bWVudCkge1xyXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4ge1xyXG4gICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgJ0FjdGl2ZUNvbm5lY3Q6IENsb3NpbmcgV2ViU29ja2V0IGR1ZSB0byB0YWIgc3VzcGVuc2lvbi4uLidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0FjdGl2ZUNvbm5lY3Q6IFJlY29ubmVjdGluZyBXZWJTb2NrZXQuLi4nKTtcclxuICAgICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNvbm5lY3QodGhpcy51cmwgYXMgc3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXF1ZXN0U3RhY2s6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSByZXF1ZXN0SGlzdG9yeUxvZ3M6IHsgdGltZXN0YW1wOiBEYXRlOyBtZXRob2Q6IHN0cmluZyB9W10gPSBbXTtcclxuICBwcml2YXRlIGxvZ0VudHJ5KG1ldGhvZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnJlcXVlc3RIaXN0b3J5TG9ncy5wdXNoKHsgdGltZXN0YW1wOiBuZXcgRGF0ZShEYXRlLm5vdygpKSwgbWV0aG9kIH0pO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IGxvZ3MoKTogeyB0aW1lc3RhbXA6IERhdGU7IG1ldGhvZDogc3RyaW5nIH1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0SGlzdG9yeUxvZ3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90b2tlbiA9ICcnO1xyXG4gIHB1YmxpYyBnZXQgVG9rZW4oKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5fdG9rZW4pIHtcclxuICAgICAgaWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UpXHJcbiAgICAgICAgdGhpcy5fdG9rZW4gPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJykgfHwgJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fdG9rZW47XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgVG9rZW4odmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3Rva2VuID0gdmFsO1xyXG4gICAgaWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9rZW4nLCB2YWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXQgQ29ubmVjdGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5zZW5kQnJvd3NlckluZm9Ub1NlcnZlcigpO1xyXG5cclxuICAgICAgdGhpcy5hdXRoKHRoaXMuVG9rZW4pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgV2Vic29ja2V0Q2xpZW50Lm9uUmVjb25uZWN0Q2FsbGJhY2subWFwKChjKSA9PlxyXG4gICAgICAgICAgICBjLkZ1bmMgPyBjLkZ1bmMoKSA6IG51bGxcclxuICAgICAgICAgIClcclxuICAgICAgICApLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRSZXF1ZXN0ZWRTdGF0ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RTdGFjay5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZW5kVG9Tb2NrZXQoZS5tZXRob2QsIGUuZGF0YSwgZmFsc2UsIGUubWVzc2FnZUlkKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RTdGFjayA9IHRoaXMucmVxdWVzdFN0YWNrLmZpbHRlcigoZTEpID0+IGUxICE9IGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBvb2wgJiYgdGhpcy5wb29sLldzc0Nvbm5lY3RlZCkgdGhpcy5wb29sLldzc0Nvbm5lY3RlZCA9IHZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyByZXNldFJlcXVlc3RlZFN0YXRlQ2FsbGJhY2tzOiBGdW5jdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBjb25uZWN0aW9uRXN0YWJsaXNoZWRPbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZXNldFJlcXVlc3RlZFN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkT25jZSkge1xyXG4gICAgICAvLyByZXNldCByZXF1ZXN0ZWQgc3RhdGUgZm9yIG91dGJvdW5kc1xyXG4gICAgICBXZWJzb2NrZXRDbGllbnQucmVzZXRSZXF1ZXN0ZWRTdGF0ZUNhbGxiYWNrcy5mb3JFYWNoKChyZXNldCkgPT4ge1xyXG4gICAgICAgIHJlc2V0KHRoaXMpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkT25jZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgYWRkUmVzZXRSZXF1ZXN0aW5nU3RhdGVDYWxsYmFjayhjYWxsYmFjazogRnVuY3Rpb24pIHtcclxuICAgIFdlYnNvY2tldENsaWVudC5yZXNldFJlcXVlc3RlZFN0YXRlQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGUodXJsOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLndzKSB7XHJcbiAgICAgIC8vIERldGFjaCBoYW5kbGVycyBmaXJzdCBzbyB0aGUgb2xkIHNvY2tldCdzIGNsb3NlIGV2ZW50IGNhbid0IHRyaWdnZXJcclxuICAgICAgLy8gYW5vdGhlciByZWNvbm5lY3QgY3ljbGUgb25jZSBpdCdzIG5vIGxvbmdlciB0aGUgXCJjdXJyZW50XCIgc29ja2V0LlxyXG4gICAgICB0aGlzLndzLm9ub3BlbiA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25tZXNzYWdlID0gbnVsbDtcclxuICAgICAgdGhpcy53cy5vbmVycm9yID0gbnVsbDtcclxuICAgICAgdGhpcy53cy5vbmNsb3NlID0gbnVsbDtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMud3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcgfHxcclxuICAgICAgICB0aGlzLndzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMud3MuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2xlYXJSZWNvbm5lY3RUaW1lcigpO1xyXG5cclxuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gY3JlYXRlIG5ldyBjb25uZWN0aW9uXHJcbiAgICB0aGlzLmxvZ0VudHJ5KCdUQ1AvSFRUUDpDT05ORUNULVNFUlZFUicpO1xyXG4gICAgdGhpcy53cyA9IG5ldyBXZWJTb2NrZXQodXJsICsgKHRoaXMuc3VwcG9ydHNDYWNoZSA/ICc/Y2FjaGU9dHJ1ZScgOiAnJykpO1xyXG4gICAgdGhpcy53cy5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAgICB0aGlzLndzLmNsb3NlKCk7XHJcbiAgICAgIHRoaXMubG9nRW50cnkoJ1RDUC9IVFRQOkVSUk9SOicgKyBlcnIpO1xyXG4gICAgICBjb25zb2xlLmxvZygnQWN0aXZlQ29ubmVjdDogJyArIGVycik7XHJcbiAgICB9O1xyXG4gICAgdGhpcy53cy5vbm9wZW4gPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMubG9nRW50cnkoJ1RDUC9IVFRQOkNPTk5FQ1RFRCcpO1xyXG4gICAgICB0aGlzLkNvbm5lY3RlZCA9IHRydWU7XHJcbiAgICB9O1xyXG4gICAgdGhpcy53cy5vbm1lc3NhZ2UgPSAoZSkgPT4ge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VSZWNlaXZlZChKc29uUGFyc2VyLnBhcnNlKGUuZGF0YS50b1N0cmluZygpKSk7XHJcbiAgICB9O1xyXG4gICAgdGhpcy53cy5vbmNsb3NlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmxvZ0VudHJ5KCdUQ1AvSFRUUDpDTE9TRUQnKTtcclxuICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xyXG4gICAgICAgIGlmICh0aGlzLnBvb2wgJiYgdGhpcy5wb29sLldzc0Nvbm5lY3RlZCkgdGhpcy5wb29sLldzc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9nRW50cnkoJ1RDUC9IVFRQOlJFU0VULVJFUVVFU1RFRC1PVVRCT1VORC1TVEFURScpO1xyXG4gICAgICAgIHRoaXMucmVzZXRSZXF1ZXN0ZWRTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuY2xlYXJSZWNvbm5lY3RUaW1lcigpO1xyXG4gICAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICB0aGlzLmNvbm5lY3QodXJsKTtcclxuICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjb25uZWN0VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgY2xlYXJSZWNvbm5lY3RUaW1lcigpIHtcclxuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpO1xyXG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXNzYWdlSWQ6IG51bWJlciA9IDA7XHJcbiAgcHJvdGVjdGVkIHNlbmRUb1NvY2tldChcclxuICAgIG1ldGhvZDogc3RyaW5nLFxyXG4gICAgZGF0YTogYW55LFxyXG4gICAgZG9udEVuc3VyZVRyYW5zbWlzc2lvbj86IGJvb2xlYW4sXHJcbiAgICBmb3JjZWRNZXNzYWdlSWQ/OiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IG1lc3NhZ2VJZCA9IGZvcmNlZE1lc3NhZ2VJZCA/PyArK3RoaXMubWVzc2FnZUlkO1xyXG4gICAgaWYgKHRoaXMud3MucmVhZHlTdGF0ZSAhPSB0aGlzLndzLk9QRU4pIHtcclxuICAgICAgaWYgKCFkb250RW5zdXJlVHJhbnNtaXNzaW9uKVxyXG4gICAgICAgIHRoaXMucmVxdWVzdFN0YWNrLnB1c2goeyBtZXRob2QsIGRhdGEsIG1lc3NhZ2VJZCB9KTtcclxuICAgICAgZWxzZSByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLndzLnNlbmQoSnNvblBhcnNlci5zdHJpbmdpZnkoeyBtZXRob2QsIHZhbHVlOiBkYXRhLCBtZXNzYWdlSWQgfSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1lc3NhZ2VJZDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGF1dGgodG9rZW46IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZW5kVG9Tb2NrZXQoJ2F1dGgudG9rZW4nLCB0b2tlbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VuZChcclxuICAgIG1ldGhvZDogc3RyaW5nLFxyXG4gICAgZGF0YTogYW55LFxyXG4gICAgZG9udEVuc3VyZVRyYW5zbWlzc2lvbj86IGJvb2xlYW5cclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5sb2dFbnRyeSgnU0VORDonICsgbWV0aG9kKTtcclxuICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHRoaXMuc2VuZFRvU29ja2V0KFxyXG4gICAgICBtZXRob2QsXHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIGRvbnRFbnN1cmVUcmFuc21pc3Npb24gfHwgZmFsc2VcclxuICAgICk7XHJcbiAgICBpZiAobWVzc2FnZUlkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmV4cGVjdE1ldGhvZChgbS4ke21ldGhvZH1gLCBtZXNzYWdlSWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWplY3RDYWxsYmFja3M6IE1hcDxudW1iZXIsIEZ1bmN0aW9uPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGV4cGVjdGVkTWV0aG9kczogTWFwPHN0cmluZyB8IG51bWJlciwgQXJyYXk8RnVuY3Rpb24+PiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIGV4cGVjdE1ldGhvZChtZXRob2Q6IHN0cmluZywgbWVzc2FnZUlkPzogbnVtYmVyIHwgbnVsbCkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKG1lc3NhZ2VJZCkge1xyXG4gICAgICAgIHRoaXMuZXhwZWN0ZWRNZXRob2RzLnNldChtZXNzYWdlSWQsIFtyZXNvbHZlXSk7XHJcbiAgICAgICAgdGhpcy5yZWplY3RDYWxsYmFja3Muc2V0KG1lc3NhZ2VJZCwgcmVqZWN0KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5leHBlY3RlZE1ldGhvZHMuaGFzKG1ldGhvZCkpIHtcclxuICAgICAgICAgIGxldCBhcnIgPSB0aGlzLmV4cGVjdGVkTWV0aG9kcy5nZXQobWV0aG9kKTtcclxuICAgICAgICAgIChhcnIgYXMgQXJyYXk8RnVuY3Rpb24+KS5wdXNoKHJlc29sdmUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmV4cGVjdGVkTWV0aG9kcy5zZXQobWV0aG9kLCBbcmVzb2x2ZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lc3NhZ2VSZWNlaXZlZCh7XHJcbiAgICBtZXRob2QsXHJcbiAgICB2YWx1ZSxcclxuICAgIG1lc3NhZ2VJZCxcclxuICAgIHNwZWNpZmljSGFzaCxcclxuICAgIGluc2VydGVkLFxyXG4gICAgdXBkYXRlZCxcclxuICAgIGRlbGV0ZWQsXHJcbiAgICBsZW5ndGhcclxuICB9OiB7XHJcbiAgICBtZXRob2Q6IHN0cmluZztcclxuICAgIHZhbHVlOiBhbnk7XHJcbiAgICBtZXNzYWdlSWQ6IG51bWJlciB8IG51bGw7XHJcbiAgICBzcGVjaWZpY0hhc2g6IG51bWJlciB8IG51bGw7XHJcbiAgICBpbnNlcnRlZDogYW55W10gfCBudWxsO1xyXG4gICAgdXBkYXRlZDogYW55W10gfCBudWxsO1xyXG4gICAgZGVsZXRlZDogYW55W10gfCBudWxsO1xyXG4gICAgbGVuZ3RoOiBudW1iZXIgfCBudWxsO1xyXG4gIH0pIHtcclxuICAgIHRoaXMubG9nRW50cnkoJ1JFQ0VJVkVEOicgKyBtZXRob2QpO1xyXG4gICAgaWYgKG1ldGhvZCA9PSAnX19fY2FjaGUnKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlT3V0Ym91bmRDYWNoZVJlcXVlc3QodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKG1lc3NhZ2VJZCkge1xyXG4gICAgICBpZiAobWV0aG9kID09ICdtLmVycm9yJykge1xyXG4gICAgICAgIGNvbnN0IHJlamVjdCA9IHRoaXMucmVqZWN0Q2FsbGJhY2tzLmdldChtZXNzYWdlSWQpO1xyXG4gICAgICAgIGlmIChyZWplY3QpIHtcclxuICAgICAgICAgIHJlamVjdCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1lc3NhZ2VJZCA9IC0xO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1lc3NhZ2VJZCAhPSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5leHBlY3RlZE1ldGhvZHMuZ2V0KG1lc3NhZ2VJZCk7XHJcbiAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGZ1bmMgPSBjYWxsYmFjay5zaGlmdCgpO1xyXG4gICAgICAgIGlmIChmdW5jKSBmdW5jKHZhbHVlKTtcclxuICAgICAgICB0aGlzLmludm9rZVN1Y2Nlc3NIYW5kbGVycyhtZXRob2QpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5leHBlY3RlZE1ldGhvZHMuZ2V0KG1ldGhvZCk7XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrICYmIGNhbGxiYWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGZ1bmMgPSBjYWxsYmFjay5zaGlmdCgpO1xyXG4gICAgICAgICAgaWYgKGZ1bmMpIGZ1bmModmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBvdXQgPSBXZWJzb2NrZXRDbGllbnQub3V0Ym91bmRzLmdldChtZXRob2QpO1xyXG4gICAgICAgICAgaWYgKG91dCkge1xyXG4gICAgICAgICAgICBvdXQodmFsdWUsIHNwZWNpZmljSGFzaCwgaW5zZXJ0ZWQsIHVwZGF0ZWQsIGRlbGV0ZWQsIGxlbmd0aCwgdGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGUgPSBXZWJzb2NrZXRDbGllbnQuaGFuZGxlcy5nZXQobWV0aG9kKTtcclxuICAgICAgICAgIGlmIChoYW5kbGUpIHtcclxuICAgICAgICAgICAgKGhhbmRsZS5GdW5jIGFzIEZ1bmN0aW9uKSh2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBFcnJvcihcclxuICAgICAgICAnTm8gTWVzc2FnZUlkIHdhcyBwcm92aWRlZCwgdGhlIGNvbm5lY3Rpb24gaXMgbm90IHN1cHBvcnRlZC4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU91dGJvdW5kQ2FjaGVSZXF1ZXN0KG1ldGhvZDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5kYlNlcnZpY2UpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLmRiU2VydmljZS5nZXRCeUtleSgnb3V0Ym91bmQnLCBtZXRob2QpLnN1YnNjcmliZSgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmQoJ19fX2NhY2hlJywge1xyXG4gICAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgICBzcGVjaWZpY0hhc2g6IGl0ZW0uc3BlY2lmaWNIYXNoIHx8IG51bGxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbmQoJ19fX2NhY2hlJywge1xyXG4gICAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgICBzcGVjaWZpY0hhc2g6IG51bGxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLnNlbmQoJ19fX2NhY2hlJywge1xyXG4gICAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgICAgc3BlY2lmaWNIYXNoOiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignQWN0aXZlQ29ubmVjdDogJyArIGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbmQoJ19fX2NhY2hlJywge1xyXG4gICAgICAgIG1ldGhvZCxcclxuICAgICAgICBzcGVjaWZpY0hhc2g6IG51bGxcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgJ0FjdGl2ZS1Db25uZWN0OiBDYWNoaW5nIG5vdCBwb3NzaWJsZSBhcyB0aGUgaW5kZXhlZERCIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCdcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIG91dGJvdW5kczogTWFwPFxyXG4gICAgc3RyaW5nLFxyXG4gICAgKFxyXG4gICAgICBkYXRhOiBhbnksXHJcbiAgICAgIHNwZWNpZmljSGFzaDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgaW5zZXJ0ZWQ6IGFueVtdIHwgbnVsbCxcclxuICAgICAgdXBkYXRlZDogYW55W10gfCBudWxsLFxyXG4gICAgICBkZWxldGVkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgIGxlbmd0aDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgX3RoaXM6IFdlYnNvY2tldENsaWVudFxyXG4gICAgKSA9PiB2b2lkXHJcbiAgPiA9IG5ldyBNYXAoKTtcclxuICBzdGF0aWMgZXhwZWN0T3V0Ym91bmQoXHJcbiAgICBtZXRob2Q6IHN0cmluZyxcclxuICAgIGNhbGxiYWNrOiAoXHJcbiAgICAgIGRhdGE6IGFueSxcclxuICAgICAgc3BlY2lmaWNIYXNoOiBudW1iZXIgfCBudWxsLFxyXG4gICAgICBpbnNlcnRlZDogYW55W10gfCBudWxsLFxyXG4gICAgICB1cGRhdGVkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgIGRlbGV0ZWQ6IGFueVtdIHwgbnVsbCxcclxuICAgICAgbGVuZ3RoOiBudW1iZXIgfCBudWxsLFxyXG4gICAgICBfdGhpczogV2Vic29ja2V0Q2xpZW50XHJcbiAgICApID0+IHZvaWRcclxuICApIHtcclxuICAgIFdlYnNvY2tldENsaWVudC5vdXRib3VuZHMuc2V0KG1ldGhvZCwgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgaGFuZGxlczogTWFwPHN0cmluZywgRGVjb3JhYmxlRnVuY3Rpb24+ID0gbmV3IE1hcCgpO1xyXG4gIHN0YXRpYyByZWdpc3RlckhhbmRsZShtZXRob2Q6IHN0cmluZywgY2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uKSB7XHJcbiAgICBXZWJzb2NrZXRDbGllbnQuaGFuZGxlcy5zZXQobWV0aG9kLCBjYWxsYmFjayk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMud3MpIHJldHVybiB0aGlzLndzLnJlYWR5U3RhdGUgPT0gV2ViU29ja2V0Lk9QRU47XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VuZEJyb3dzZXJJbmZvVG9TZXJ2ZXIoKSB7XHJcbiAgICAvLyBzZW5kIGJyb3dzZXIgLyBvcyBpbmZvcm1hdGlvblxyXG4gICAgY29uc3QgYnJvd3NlciA9IHRoaXMuZ2V0QnJvd3NlcigpO1xyXG4gICAgY29uc3Qgb3MgPSB0aGlzLmdldE9TKCk7XHJcbiAgICB0aGlzLnNlbmQoJ19fX2Jyb3dzZXInLCB7XHJcbiAgICAgIGJyb3dzZXI6IGAke2Jyb3dzZXIubmFtZX0gJHticm93c2VyLnZlcnNpb259ICR7b3N9YFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QnJvd3NlcigpOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0ge1xyXG4gICAgLy8gaHR0cHM6Ly93d3cuZ3JlZ29yeXZhcmdoZXNlLmNvbS9ob3ctdG8tZ2V0LWJyb3dzZXItbmFtZS1hbmQtdmVyc2lvbi12aWEtamF2YXNjcmlwdC9cclxuICAgIHZhciB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQsXHJcbiAgICAgIHRlbSxcclxuICAgICAgTSA9XHJcbiAgICAgICAgdWEubWF0Y2goXHJcbiAgICAgICAgICAvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cXC8pKVxcLz9cXHMqKFxcZCspL2lcclxuICAgICAgICApIHx8IFtdO1xyXG4gICAgaWYgKC90cmlkZW50L2kudGVzdChNWzFdKSkge1xyXG4gICAgICB0ZW0gPSAvXFxicnZbIDpdKyhcXGQrKS9nLmV4ZWModWEpIHx8IFtdO1xyXG4gICAgICByZXR1cm4geyBuYW1lOiAnSUUgJywgdmVyc2lvbjogdGVtWzFdIHx8ICcnIH07XHJcbiAgICB9XHJcbiAgICBpZiAoTVsxXSA9PT0gJ0Nocm9tZScpIHtcclxuICAgICAgdGVtID0gdWEubWF0Y2goL1xcYk9QUlxcLyhcXGQrKS8pO1xyXG4gICAgICBpZiAodGVtICE9IG51bGwpIHtcclxuICAgICAgICByZXR1cm4geyBuYW1lOiAnT3BlcmEnLCB2ZXJzaW9uOiB0ZW1bMV0gfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgTSA9IE1bMl0gPyBbTVsxXSwgTVsyXV0gOiBbbmF2aWdhdG9yLmFwcE5hbWUsIG5hdmlnYXRvci5hcHBWZXJzaW9uLCAnLT8nXTtcclxuICAgIGlmICgodGVtID0gdWEubWF0Y2goL3ZlcnNpb25cXC8oXFxkKykvaSkpICE9IG51bGwpIHtcclxuICAgICAgTS5zcGxpY2UoMSwgMSwgdGVtWzFdKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWU6IE1bMF0sXHJcbiAgICAgIHZlcnNpb246IE1bMV1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0T1MoKTogc3RyaW5nIHtcclxuICAgIHZhciB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxcclxuICAgICAgcGxhdGZvcm0gPSB3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtLFxyXG4gICAgICBtYWNvc1BsYXRmb3JtcyA9IFsnTWFjaW50b3NoJywgJ01hY0ludGVsJywgJ01hY1BQQycsICdNYWM2OEsnXSxcclxuICAgICAgd2luZG93c1BsYXRmb3JtcyA9IFsnV2luMzInLCAnV2luNjQnLCAnV2luZG93cycsICdXaW5DRSddLFxyXG4gICAgICBpb3NQbGF0Zm9ybXMgPSBbJ2lQaG9uZScsICdpUGFkJywgJ2lQb2QnXSxcclxuICAgICAgb3MgPSBudWxsO1xyXG5cclxuICAgIGlmIChtYWNvc1BsYXRmb3Jtcy5pbmRleE9mKHBsYXRmb3JtKSAhPT0gLTEpIHtcclxuICAgICAgb3MgPSAnTWFjIE9TJztcclxuICAgIH0gZWxzZSBpZiAoaW9zUGxhdGZvcm1zLmluZGV4T2YocGxhdGZvcm0pICE9PSAtMSkge1xyXG4gICAgICBvcyA9ICdpT1MnO1xyXG4gICAgfSBlbHNlIGlmICh3aW5kb3dzUGxhdGZvcm1zLmluZGV4T2YocGxhdGZvcm0pICE9PSAtMSkge1xyXG4gICAgICBvcyA9ICdXaW5kb3dzJztcclxuICAgIH0gZWxzZSBpZiAoL0FuZHJvaWQvLnRlc3QodXNlckFnZW50KSkge1xyXG4gICAgICBvcyA9ICdBbmRyb2lkJztcclxuICAgIH0gZWxzZSBpZiAoIW9zICYmIC9MaW51eC8udGVzdChwbGF0Zm9ybSkpIHtcclxuICAgICAgb3MgPSAnTGludXgnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvcyB8fCAnJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIG9uU3VjY2Vzc0hhbmRsZXJzOiB7XHJcbiAgICBjYWxsYmFjazogRGVjb3JhYmxlRnVuY3Rpb247XHJcbiAgICByZWdleHA6IFJlZ0V4cDtcclxuICB9W10gPSBbXTtcclxuICBwdWJsaWMgc3RhdGljIG9uU3VjY2VzcyhjYWxsYmFjazogRGVjb3JhYmxlRnVuY3Rpb24sIHJlZ2V4cDogUmVnRXhwKSB7XHJcbiAgICB0aGlzLm9uU3VjY2Vzc0hhbmRsZXJzLnB1c2goeyBjYWxsYmFjaywgcmVnZXhwIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgb25SZWNvbm5lY3RDYWxsYmFjazogRGVjb3JhYmxlRnVuY3Rpb25bXSA9IFtdO1xyXG4gIHN0YXRpYyBvblJlY29ubmVjdChjYWxsYmFjazogRGVjb3JhYmxlRnVuY3Rpb24pIHtcclxuICAgIFdlYnNvY2tldENsaWVudC5vblJlY29ubmVjdENhbGxiYWNrLnB1c2goY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnZva2VTdWNjZXNzSGFuZGxlcnMobWV0aG9kOiBzdHJpbmcpIHtcclxuICAgIFdlYnNvY2tldENsaWVudC5vblN1Y2Nlc3NIYW5kbGVyc1xyXG4gICAgICAuZmlsdGVyKChlKSA9PiBlLnJlZ2V4cC50ZXN0KG1ldGhvZCkpXHJcbiAgICAgIC5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgdmFyIHJlcyA9IChlLmNhbGxiYWNrLkZ1bmMgYXMgRnVuY3Rpb24pKCk7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMudGhlbikge1xyXG4gICAgICAgICAgcmVzLnRoZW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkaXNjb25uZWN0KHJlc3RhcnQ/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5jbGVhclJlY29ubmVjdFRpbWVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMud3MpIHRoaXMud3MuY2xvc2UoKTtcclxuXHJcbiAgICBpZiAoIXJlc3RhcnQpIHtcclxuICAgICAgdGhpcy53cy5vbm9wZW4gPSBudWxsO1xyXG4gICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25lcnJvciA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25jbG9zZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDYWNoZSgpIHt9XHJcblxyXG4gIGdldCB0YXJnZXQoKTogYW55IHtcclxuICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9fcHJvdG9fXztcclxuICB9XHJcbn1cclxuIl19
|
|
442
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9saWIvd2Vic29ja2V0L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQsTUFBTSxPQUFPLGVBQWU7SUFJMUIsWUFDVSxHQUFZLEVBQ1osYUFBdUIsRUFDeEIsU0FBK0I7UUFGOUIsUUFBRyxHQUFILEdBQUcsQ0FBUztRQUNaLGtCQUFhLEdBQWIsYUFBYSxDQUFVO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBZ0VoQyxpQkFBWSxHQUFVLEVBQUUsQ0FBQztRQUN6Qix1QkFBa0IsR0FBMEMsRUFBRSxDQUFDO1FBUS9ELFdBQU0sR0FBRyxFQUFFLENBQUM7UUF3Q1osOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBMEgzQyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBMEN0QixvQkFBZSxHQUEwQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ25ELG9CQUFlLEdBQTBDLElBQUksR0FBRyxFQUFFLENBQUM7UUEwT3BFLFdBQU0sR0FBRyxLQUFLLENBQUM7UUE5ZnBCLElBQUksYUFBYTtZQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRVMsTUFBTSxDQUFDLEdBQXVCO1FBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDUixJQUFJLFFBQVEsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDO1lBQ1QsUUFBUSxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtnQkFDbEMsS0FBSyxRQUFRLENBQUMsQ0FBQztvQkFDYixRQUFRLEdBQUcsTUFBTSxDQUFDO29CQUNsQixJQUFJLEdBQUcsTUFBTSxDQUFDO29CQUNk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QUFJLEVBQUUsQ0FBQzthQUNaO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBR00sVUFBVSxDQUFDLE9BQWlCO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLEVBQUU7WUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTdCLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRU8sU0FBUyxLQUFJLENBQUM7SUFFdEIsSUFBSSxNQUFNO1FBQ1IsT0FBUSxJQUFZLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUM7O0FBcmFjLDRDQUE0QixHQUFlLEVBQUUsQ0FBQztBQWdCckMsb0NBQW9CLEdBQUcsS0FBSyxDQUFDO0FBdVF0Qyx5QkFBUyxHQVdwQixJQUFJLEdBQUcsRUFBRSxDQUFDO0FBZ0JDLHVCQUFPLEdBQW1DLElBQUksR0FBRyxFQUFFLENBQUM7QUFzRXBELGlDQUFpQixHQUcxQixFQUFFLENBQUM7QUFLTSxtQ0FBbUIsR0FBd0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmd4SW5kZXhlZERCU2VydmljZSB9IGZyb20gJ25neC1pbmRleGVkLWRiJztcclxuaW1wb3J0IHsgRGVjb3JhYmxlRnVuY3Rpb24gfSBmcm9tICcuL2RlY29yYXRvcnMvZnVuY3Rpb24nO1xyXG5pbXBvcnQgeyBKc29uUGFyc2VyIH0gZnJvbSAnLi9qc29uL2pzb24tcGFyc2VyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRDbGllbnQge1xyXG4gIHdzITogV2ViU29ja2V0O1xyXG4gIHBvb2whOiB7IFdzc0Nvbm5lY3RlZDogYm9vbGVhbiB9IHwgbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHVybD86IHN0cmluZyxcclxuICAgIHByaXZhdGUgc3VwcG9ydHNDYWNoZT86IGJvb2xlYW4sXHJcbiAgICBwdWJsaWMgZGJTZXJ2aWNlPzogTmd4SW5kZXhlZERCU2VydmljZVxyXG4gICkge1xyXG4gICAgaWYgKHN1cHBvcnRzQ2FjaGUpIHRoaXMuaW5pdENhY2hlKCk7XHJcbiAgICB0aGlzLnNldFVybCh0aGlzLnVybCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2V0VXJsKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAoIXVybCkge1xyXG4gICAgICBsZXQgcHJvdG9jb2w7XHJcbiAgICAgIGxldCBwb3J0O1xyXG4gICAgICBzd2l0Y2ggKGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSB7XHJcbiAgICAgICAgY2FzZSAnaHR0cHM6Jzoge1xyXG4gICAgICAgICAgcHJvdG9jb2wgPSAnd3NzOic7XHJcbiAgICAgICAgICBwb3J0ID0gJzo0NDMnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIHByb3RvY29sID0gJ3dzOic7XHJcbiAgICAgICAgICBwb3J0ID0gJzo4MCc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdXJsID0gcHJvdG9jb2wgKyAnLy8nICsgZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgKyBwb3J0ICsgJy93c3MnO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cmwgPSB1cmw7XHJcbiAgICAvLyBJbml0aWFsIHNldHVwOiBub3RoaW5nIHRvIHRlYXIgZG93biB5ZXQsIGp1c3Qgb3BlbiB0aGUgZmlyc3QgY29ubmVjdGlvbi5cclxuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLmNvbm5lY3QodGhpcy51cmwgYXMgc3RyaW5nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29ubmVjdCh1cmw6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLnRhcmdldC5fX19jb25uZWN0aW9uSWQpIHtcclxuICAgICAgdGhpcy50YXJnZXQuX19fY29ubmVjdGlvbklkID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMudGFyZ2V0Ll9fX2Nvbm5lY3Rpb25JZCsrO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy53cyAmJlxyXG4gICAgICAodGhpcy53cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORyB8fFxyXG4gICAgICAgIHRoaXMud3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY3JlYXRlKHVybCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdFRhYlN1c3BlbmRlZExpc3RlbmVyKCkge1xyXG4gICAgaWYgKGRvY3VtZW50KSB7XHJcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAnQWN0aXZlQ29ubmVjdDogQ2xvc2luZyBXZWJTb2NrZXQgZHVlIHRvIHRhYiBzdXNwZW5zaW9uLi4uJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQWN0aXZlQ29ubmVjdDogUmVjb25uZWN0aW5nIFdlYlNvY2tldC4uLicpO1xyXG4gICAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY29ubmVjdCh0aGlzLnVybCBhcyBzdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RTdGFjazogYW55W10gPSBbXTtcclxuICBwcml2YXRlIHJlcXVlc3RIaXN0b3J5TG9nczogeyB0aW1lc3RhbXA6IERhdGU7IG1ldGhvZDogc3RyaW5nIH1bXSA9IFtdO1xyXG4gIHByaXZhdGUgbG9nRW50cnkobWV0aG9kOiBzdHJpbmcpIHtcclxuICAgIHRoaXMucmVxdWVzdEhpc3RvcnlMb2dzLnB1c2goeyB0aW1lc3RhbXA6IG5ldyBEYXRlKERhdGUubm93KCkpLCBtZXRob2QgfSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgbG9ncygpOiB7IHRpbWVzdGFtcDogRGF0ZTsgbWV0aG9kOiBzdHJpbmcgfVtdIHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3RIaXN0b3J5TG9ncztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Rva2VuID0gJyc7XHJcbiAgcHVibGljIGdldCBUb2tlbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLl90b2tlbikge1xyXG4gICAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZSlcclxuICAgICAgICB0aGlzLl90b2tlbiA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKSB8fCAnJztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl90b2tlbjtcclxuICB9XHJcbiAgcHVibGljIHNldCBUb2tlbih2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5fdG9rZW4gPSB2YWw7XHJcbiAgICBpZiAod2luZG93LmxvY2FsU3RvcmFnZSkgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b2tlbicsIHZhbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldCBDb25uZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlbmRCcm93c2VySW5mb1RvU2VydmVyKCk7XHJcblxyXG4gICAgICB0aGlzLmF1dGgodGhpcy5Ub2tlbilcclxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0FjdGl2ZUNvbm5lY3Q6IGF1dGggZmFpbGVkIG9uIHJlY29ubmVjdDogJyArIGVycik7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgV2Vic29ja2V0Q2xpZW50Lm9uUmVjb25uZWN0Q2FsbGJhY2subWFwKChjKSA9PlxyXG4gICAgICAgICAgICAgIGMuRnVuYyA/IGMuRnVuYygpIDogbnVsbFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdGVkU3RhdGUoKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RTdGFjay5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRUb1NvY2tldChlLm1ldGhvZCwgZS5kYXRhLCBmYWxzZSwgZS5tZXNzYWdlSWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0U3RhY2sgPSB0aGlzLnJlcXVlc3RTdGFjay5maWx0ZXIoKGUxKSA9PiBlMSAhPSBlKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBvb2wgJiYgdGhpcy5wb29sLldzc0Nvbm5lY3RlZCkgdGhpcy5wb29sLldzc0Nvbm5lY3RlZCA9IHZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIHN0YXRpYyByZXNldFJlcXVlc3RlZFN0YXRlQ2FsbGJhY2tzOiBGdW5jdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBjb25uZWN0aW9uRXN0YWJsaXNoZWRPbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZXNldFJlcXVlc3RlZFN0YXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkT25jZSkge1xyXG4gICAgICAvLyByZXNldCByZXF1ZXN0ZWQgc3RhdGUgZm9yIG91dGJvdW5kc1xyXG4gICAgICBXZWJzb2NrZXRDbGllbnQucmVzZXRSZXF1ZXN0ZWRTdGF0ZUNhbGxiYWNrcy5mb3JFYWNoKChyZXNldCkgPT4ge1xyXG4gICAgICAgIHJlc2V0KHRoaXMpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29ubmVjdGlvbkVzdGFibGlzaGVkT25jZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHB1YmxpYyBzdGF0aWMgYWRkUmVzZXRSZXF1ZXN0aW5nU3RhdGVDYWxsYmFjayhjYWxsYmFjazogRnVuY3Rpb24pIHtcclxuICAgIFdlYnNvY2tldENsaWVudC5yZXNldFJlcXVlc3RlZFN0YXRlQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSEFORFNIQUtFX1RJTUVPVVRfTVMgPSAxMDAwMDtcclxuICBwcml2YXRlIGhhbmRzaGFrZVRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNsZWFySGFuZHNoYWtlVGltZXIoKSB7XHJcbiAgICBpZiAodGhpcy5oYW5kc2hha2VUaW1lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhhbmRzaGFrZVRpbWVyKTtcclxuICAgICAgdGhpcy5oYW5kc2hha2VUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlKHVybDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy53cykge1xyXG4gICAgICAvLyBEZXRhY2ggaGFuZGxlcnMgZmlyc3Qgc28gdGhlIG9sZCBzb2NrZXQncyBjbG9zZSBldmVudCBjYW4ndCB0cmlnZ2VyXHJcbiAgICAgIC8vIGFub3RoZXIgcmVjb25uZWN0IGN5Y2xlIG9uY2UgaXQncyBubyBsb25nZXIgdGhlIFwiY3VycmVudFwiIHNvY2tldC5cclxuICAgICAgdGhpcy53cy5vbm9wZW4gPSBudWxsO1xyXG4gICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25lcnJvciA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25jbG9zZSA9IG51bGw7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLndzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XHJcbiAgICAgICAgdGhpcy53cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTlxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLndzLmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNsZWFyUmVjb25uZWN0VGltZXIoKTtcclxuICAgIHRoaXMuY2xlYXJIYW5kc2hha2VUaW1lcigpO1xyXG5cclxuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gY3JlYXRlIG5ldyBjb25uZWN0aW9uXHJcbiAgICB0aGlzLmxvZ0VudHJ5KCdUQ1AvSFRUUDpDT05ORUNULVNFUlZFUicpO1xyXG4gICAgdGhpcy53cyA9IG5ldyBXZWJTb2NrZXQodXJsICsgKHRoaXMuc3VwcG9ydHNDYWNoZSA/ICc/Y2FjaGU9dHJ1ZScgOiAnJykpO1xyXG5cclxuICAgIHRoaXMuaGFuZHNoYWtlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMud3MgJiYgdGhpcy53cy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykge1xyXG4gICAgICAgIHRoaXMubG9nRW50cnkoJ1RDUC9IVFRQOkhBTkRTSEFLRS1USU1FT1VUJyk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAnQWN0aXZlQ29ubmVjdDogSGFuZHNoYWtlIHRpbWVkIG91dCwgcmV0cnlpbmcgY29ubmVjdGlvbi4uLidcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIERldGFjaCBzbyB0aGUgZm9yY2VkIGNsb3NlIGJlbG93IGRvZXNuJ3QgZG91YmxlLXRyaWdnZXIgcmVjb25uZWN0IGxvZ2ljLlxyXG4gICAgICAgIHRoaXMud3Mub25vcGVuID0gbnVsbDtcclxuICAgICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy53cy5vbmVycm9yID0gbnVsbDtcclxuICAgICAgICB0aGlzLndzLm9uY2xvc2UgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLndzLmNsb3NlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAvLyBpZ25vcmUgLSBzb2NrZXQgbWF5IGFscmVhZHkgYmUgaW4gYSBiYWQgc3RhdGVcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNsb3NlZCkge1xyXG4gICAgICAgICAgdGhpcy5jbGVhclJlY29ubmVjdFRpbWVyKCk7XHJcbiAgICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdCh1cmwpO1xyXG4gICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCBXZWJzb2NrZXRDbGllbnQuSEFORFNIQUtFX1RJTUVPVVRfTVMpO1xyXG5cclxuICAgIHRoaXMud3Mub25lcnJvciA9IChlcnIpID0+IHtcclxuICAgICAgdGhpcy53cy5jbG9zZSgpO1xyXG4gICAgICB0aGlzLmxvZ0VudHJ5KCdUQ1AvSFRUUDpFUlJPUjonICsgZXJyKTtcclxuICAgICAgY29uc29sZS5sb2coJ0FjdGl2ZUNvbm5lY3Q6ICcgKyBlcnIpO1xyXG4gICAgfTtcclxuICAgIHRoaXMud3Mub25vcGVuID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsZWFySGFuZHNoYWtlVGltZXIoKTtcclxuICAgICAgdGhpcy5sb2dFbnRyeSgnVENQL0hUVFA6Q09OTkVDVEVEJyk7XHJcbiAgICAgIHRoaXMuQ29ubmVjdGVkID0gdHJ1ZTtcclxuICAgIH07XHJcbiAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChlKSA9PiB7XHJcbiAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcGFyc2VkID0gSnNvblBhcnNlci5wYXJzZShlLmRhdGEudG9TdHJpbmcoKSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIC8vIEEgbWFsZm9ybWVkIGZyYW1lIG11c3Qgbm90IHRocm93IGluc2lkZSB0aGUgb25tZXNzYWdlIGhhbmRsZXIgLVxyXG4gICAgICAgIC8vIHRoYXQgd291bGQgc2lsZW50bHkga2lsbCBtZXNzYWdlIHByb2Nlc3NpbmcgZm9yIHRoZSByZXN0IG9mIHRoZVxyXG4gICAgICAgIC8vIGNvbm5lY3Rpb24ncyBsaWZldGltZSB3aXRob3V0IGV2ZXIgc3VyZmFjaW5nIGFuIGVycm9yLlxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdBY3RpdmVDb25uZWN0OiBmYWlsZWQgdG8gcGFyc2UgaW5jb21pbmcgbWVzc2FnZTogJyArIGVycik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkKHBhcnNlZCk7XHJcbiAgICB9O1xyXG4gICAgdGhpcy53cy5vbmNsb3NlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNsZWFySGFuZHNoYWtlVGltZXIoKTtcclxuICAgICAgdGhpcy5sb2dFbnRyeSgnVENQL0hUVFA6Q0xPU0VEJyk7XHJcbiAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5wb29sICYmIHRoaXMucG9vbC5Xc3NDb25uZWN0ZWQpIHRoaXMucG9vbC5Xc3NDb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmxvZ0VudHJ5KCdUQ1AvSFRUUDpSRVNFVC1SRVFVRVNURUQtT1VUQk9VTkQtU1RBVEUnKTtcclxuICAgICAgICB0aGlzLnJlc2V0UmVxdWVzdGVkU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmNsZWFyUmVjb25uZWN0VGltZXIoKTtcclxuICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgdGhpcy5jb25uZWN0KHVybCk7XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY29ubmVjdFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIGNsZWFyUmVjb25uZWN0VGltZXIoKSB7XHJcbiAgICBpZiAodGhpcy5yZWNvbm5lY3RUaW1lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdFRpbWVyKTtcclxuICAgICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVzc2FnZUlkOiBudW1iZXIgPSAwO1xyXG4gIHByb3RlY3RlZCBzZW5kVG9Tb2NrZXQoXHJcbiAgICBtZXRob2Q6IHN0cmluZyxcclxuICAgIGRhdGE6IGFueSxcclxuICAgIGRvbnRFbnN1cmVUcmFuc21pc3Npb24/OiBib29sZWFuLFxyXG4gICAgZm9yY2VkTWVzc2FnZUlkPzogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBjb25zdCBtZXNzYWdlSWQgPSBmb3JjZWRNZXNzYWdlSWQgPz8gKyt0aGlzLm1lc3NhZ2VJZDtcclxuICAgIGlmICh0aGlzLndzLnJlYWR5U3RhdGUgIT0gdGhpcy53cy5PUEVOKSB7XHJcbiAgICAgIGlmICghZG9udEVuc3VyZVRyYW5zbWlzc2lvbilcclxuICAgICAgICB0aGlzLnJlcXVlc3RTdGFjay5wdXNoKHsgbWV0aG9kLCBkYXRhLCBtZXNzYWdlSWQgfSk7XHJcbiAgICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53cy5zZW5kKEpzb25QYXJzZXIuc3RyaW5naWZ5KHsgbWV0aG9kLCB2YWx1ZTogZGF0YSwgbWVzc2FnZUlkIH0pKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZXNzYWdlSWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhdXRoKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VuZFRvU29ja2V0KCdhdXRoLnRva2VuJywgdG9rZW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbmQoXHJcbiAgICBtZXRob2Q6IHN0cmluZyxcclxuICAgIGRhdGE6IGFueSxcclxuICAgIGRvbnRFbnN1cmVUcmFuc21pc3Npb24/OiBib29sZWFuXHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHRoaXMubG9nRW50cnkoJ1NFTkQ6JyArIG1ldGhvZCk7XHJcbiAgICBjb25zdCBtZXNzYWdlSWQgPSB0aGlzLnNlbmRUb1NvY2tldChcclxuICAgICAgbWV0aG9kLFxyXG4gICAgICBkYXRhLFxyXG4gICAgICBkb250RW5zdXJlVHJhbnNtaXNzaW9uIHx8IGZhbHNlXHJcbiAgICApO1xyXG4gICAgaWYgKG1lc3NhZ2VJZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5leHBlY3RNZXRob2QoYG0uJHttZXRob2R9YCwgbWVzc2FnZUlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVqZWN0Q2FsbGJhY2tzOiBNYXA8bnVtYmVyLCBGdW5jdGlvbj4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBleHBlY3RlZE1ldGhvZHM6IE1hcDxzdHJpbmcgfCBudW1iZXIsIEFycmF5PEZ1bmN0aW9uPj4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBleHBlY3RNZXRob2QobWV0aG9kOiBzdHJpbmcsIG1lc3NhZ2VJZD86IG51bWJlciB8IG51bGwpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChtZXNzYWdlSWQpIHtcclxuICAgICAgICB0aGlzLmV4cGVjdGVkTWV0aG9kcy5zZXQobWVzc2FnZUlkLCBbcmVzb2x2ZV0pO1xyXG4gICAgICAgIHRoaXMucmVqZWN0Q2FsbGJhY2tzLnNldChtZXNzYWdlSWQsIHJlamVjdCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwZWN0ZWRNZXRob2RzLmhhcyhtZXRob2QpKSB7XHJcbiAgICAgICAgICBsZXQgYXJyID0gdGhpcy5leHBlY3RlZE1ldGhvZHMuZ2V0KG1ldGhvZCk7XHJcbiAgICAgICAgICAoYXJyIGFzIEFycmF5PEZ1bmN0aW9uPikucHVzaChyZXNvbHZlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5leHBlY3RlZE1ldGhvZHMuc2V0KG1ldGhvZCwgW3Jlc29sdmVdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXNzYWdlUmVjZWl2ZWQoe1xyXG4gICAgbWV0aG9kLFxyXG4gICAgdmFsdWUsXHJcbiAgICBtZXNzYWdlSWQsXHJcbiAgICBzcGVjaWZpY0hhc2gsXHJcbiAgICBpbnNlcnRlZCxcclxuICAgIHVwZGF0ZWQsXHJcbiAgICBkZWxldGVkLFxyXG4gICAgbGVuZ3RoXHJcbiAgfToge1xyXG4gICAgbWV0aG9kOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogYW55O1xyXG4gICAgbWVzc2FnZUlkOiBudW1iZXIgfCBudWxsO1xyXG4gICAgc3BlY2lmaWNIYXNoOiBudW1iZXIgfCBudWxsO1xyXG4gICAgaW5zZXJ0ZWQ6IGFueVtdIHwgbnVsbDtcclxuICAgIHVwZGF0ZWQ6IGFueVtdIHwgbnVsbDtcclxuICAgIGRlbGV0ZWQ6IGFueVtdIHwgbnVsbDtcclxuICAgIGxlbmd0aDogbnVtYmVyIHwgbnVsbDtcclxuICB9KSB7XHJcbiAgICB0aGlzLmxvZ0VudHJ5KCdSRUNFSVZFRDonICsgbWV0aG9kKTtcclxuICAgIGlmIChtZXRob2QgPT0gJ19fX2NhY2hlJykge1xyXG4gICAgICB0aGlzLmhhbmRsZU91dGJvdW5kQ2FjaGVSZXF1ZXN0KHZhbHVlKTtcclxuICAgIH1cclxuICAgIGlmIChtZXNzYWdlSWQpIHtcclxuICAgICAgaWYgKG1ldGhvZCA9PSAnbS5lcnJvcicpIHtcclxuICAgICAgICBjb25zdCByZWplY3QgPSB0aGlzLnJlamVjdENhbGxiYWNrcy5nZXQobWVzc2FnZUlkKTtcclxuICAgICAgICBpZiAocmVqZWN0KSB7XHJcbiAgICAgICAgICByZWplY3QodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtZXNzYWdlSWQgPSAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXNzYWdlSWQgIT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuZXhwZWN0ZWRNZXRob2RzLmdldChtZXNzYWdlSWQpO1xyXG4gICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBmdW5jID0gY2FsbGJhY2suc2hpZnQoKTtcclxuICAgICAgICBpZiAoZnVuYykgZnVuYyh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5pbnZva2VTdWNjZXNzSGFuZGxlcnMobWV0aG9kKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuZXhwZWN0ZWRNZXRob2RzLmdldChtZXRob2QpO1xyXG4gICAgICAgIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjay5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBmdW5jID0gY2FsbGJhY2suc2hpZnQoKTtcclxuICAgICAgICAgIGlmIChmdW5jKSBmdW5jKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgb3V0ID0gV2Vic29ja2V0Q2xpZW50Lm91dGJvdW5kcy5nZXQobWV0aG9kKTtcclxuICAgICAgICAgIGlmIChvdXQpIHtcclxuICAgICAgICAgICAgb3V0KHZhbHVlLCBzcGVjaWZpY0hhc2gsIGluc2VydGVkLCB1cGRhdGVkLCBkZWxldGVkLCBsZW5ndGgsIHRoaXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgaGFuZGxlID0gV2Vic29ja2V0Q2xpZW50LmhhbmRsZXMuZ2V0KG1ldGhvZCk7XHJcbiAgICAgICAgICBpZiAoaGFuZGxlKSB7XHJcbiAgICAgICAgICAgIChoYW5kbGUuRnVuYyBhcyBGdW5jdGlvbikodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgJ05vIE1lc3NhZ2VJZCB3YXMgcHJvdmlkZWQsIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVPdXRib3VuZENhY2hlUmVxdWVzdChtZXRob2Q6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuZGJTZXJ2aWNlKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYlNlcnZpY2UuZ2V0QnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKS5zdWJzY3JpYmUoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5zZW5kKCdfX19jYWNoZScsIHtcclxuICAgICAgICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgICAgICAgc3BlY2lmaWNIYXNoOiBpdGVtLnNwZWNpZmljSGFzaCB8fCBudWxsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZW5kKCdfX19jYWNoZScsIHtcclxuICAgICAgICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgICAgICAgc3BlY2lmaWNIYXNoOiBudWxsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhpcy5zZW5kKCdfX19jYWNoZScsIHtcclxuICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgIHNwZWNpZmljSGFzaDogbnVsbFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6ICcgKyBlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZW5kKCdfX19jYWNoZScsIHtcclxuICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgc3BlY2lmaWNIYXNoOiBudWxsXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICdBY3RpdmUtQ29ubmVjdDogQ2FjaGluZyBub3QgcG9zc2libGUgYXMgdGhlIGluZGV4ZWREQiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBvdXRib3VuZHM6IE1hcDxcclxuICAgIHN0cmluZyxcclxuICAgIChcclxuICAgICAgZGF0YTogYW55LFxyXG4gICAgICBzcGVjaWZpY0hhc2g6IG51bWJlciB8IG51bGwsXHJcbiAgICAgIGluc2VydGVkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgIHVwZGF0ZWQ6IGFueVtdIHwgbnVsbCxcclxuICAgICAgZGVsZXRlZDogYW55W10gfCBudWxsLFxyXG4gICAgICBsZW5ndGg6IG51bWJlciB8IG51bGwsXHJcbiAgICAgIF90aGlzOiBXZWJzb2NrZXRDbGllbnRcclxuICAgICkgPT4gdm9pZFxyXG4gID4gPSBuZXcgTWFwKCk7XHJcbiAgc3RhdGljIGV4cGVjdE91dGJvdW5kKFxyXG4gICAgbWV0aG9kOiBzdHJpbmcsXHJcbiAgICBjYWxsYmFjazogKFxyXG4gICAgICBkYXRhOiBhbnksXHJcbiAgICAgIHNwZWNpZmljSGFzaDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgaW5zZXJ0ZWQ6IGFueVtdIHwgbnVsbCxcclxuICAgICAgdXBkYXRlZDogYW55W10gfCBudWxsLFxyXG4gICAgICBkZWxldGVkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgIGxlbmd0aDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgX3RoaXM6IFdlYnNvY2tldENsaWVudFxyXG4gICAgKSA9PiB2b2lkXHJcbiAgKSB7XHJcbiAgICBXZWJzb2NrZXRDbGllbnQub3V0Ym91bmRzLnNldChtZXRob2QsIGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGhhbmRsZXM6IE1hcDxzdHJpbmcsIERlY29yYWJsZUZ1bmN0aW9uPiA9IG5ldyBNYXAoKTtcclxuICBzdGF0aWMgcmVnaXN0ZXJIYW5kbGUobWV0aG9kOiBzdHJpbmcsIGNhbGxiYWNrOiBEZWNvcmFibGVGdW5jdGlvbikge1xyXG4gICAgV2Vic29ja2V0Q2xpZW50LmhhbmRsZXMuc2V0KG1ldGhvZCwgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLndzKSByZXR1cm4gdGhpcy53cy5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5PUEVOO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmRCcm93c2VySW5mb1RvU2VydmVyKCkge1xyXG4gICAgLy8gc2VuZCBicm93c2VyIC8gb3MgaW5mb3JtYXRpb25cclxuICAgIGNvbnN0IGJyb3dzZXIgPSB0aGlzLmdldEJyb3dzZXIoKTtcclxuICAgIGNvbnN0IG9zID0gdGhpcy5nZXRPUygpO1xyXG4gICAgdGhpcy5zZW5kKCdfX19icm93c2VyJywge1xyXG4gICAgICBicm93c2VyOiBgJHticm93c2VyLm5hbWV9ICR7YnJvd3Nlci52ZXJzaW9ufSAke29zfWBcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEJyb3dzZXIoKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHtcclxuICAgIC8vIGh0dHBzOi8vd3d3LmdyZWdvcnl2YXJnaGVzZS5jb20vaG93LXRvLWdldC1icm93c2VyLW5hbWUtYW5kLXZlcnNpb24tdmlhLWphdmFzY3JpcHQvXHJcbiAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LFxyXG4gICAgICB0ZW0sXHJcbiAgICAgIE0gPVxyXG4gICAgICAgIHVhLm1hdGNoKFxyXG4gICAgICAgICAgLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XFwvKSlcXC8/XFxzKihcXGQrKS9pXHJcbiAgICAgICAgKSB8fCBbXTtcclxuICAgIGlmICgvdHJpZGVudC9pLnRlc3QoTVsxXSkpIHtcclxuICAgICAgdGVtID0gL1xcYnJ2WyA6XSsoXFxkKykvZy5leGVjKHVhKSB8fCBbXTtcclxuICAgICAgcmV0dXJuIHsgbmFtZTogJ0lFICcsIHZlcnNpb246IHRlbVsxXSB8fCAnJyB9O1xyXG4gICAgfVxyXG4gICAgaWYgKE1bMV0gPT09ICdDaHJvbWUnKSB7XHJcbiAgICAgIHRlbSA9IHVhLm1hdGNoKC9cXGJPUFJcXC8oXFxkKykvKTtcclxuICAgICAgaWYgKHRlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgbmFtZTogJ09wZXJhJywgdmVyc2lvbjogdGVtWzFdIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIE0gPSBNWzJdID8gW01bMV0sIE1bMl1dIDogW25hdmlnYXRvci5hcHBOYW1lLCBuYXZpZ2F0b3IuYXBwVmVyc2lvbiwgJy0/J107XHJcbiAgICBpZiAoKHRlbSA9IHVhLm1hdGNoKC92ZXJzaW9uXFwvKFxcZCspL2kpKSAhPSBudWxsKSB7XHJcbiAgICAgIE0uc3BsaWNlKDEsIDEsIHRlbVsxXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lOiBNWzBdLFxyXG4gICAgICB2ZXJzaW9uOiBNWzFdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE9TKCk6IHN0cmluZyB7XHJcbiAgICB2YXIgdXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsXHJcbiAgICAgIHBsYXRmb3JtID0gd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybSxcclxuICAgICAgbWFjb3NQbGF0Zm9ybXMgPSBbJ01hY2ludG9zaCcsICdNYWNJbnRlbCcsICdNYWNQUEMnLCAnTWFjNjhLJ10sXHJcbiAgICAgIHdpbmRvd3NQbGF0Zm9ybXMgPSBbJ1dpbjMyJywgJ1dpbjY0JywgJ1dpbmRvd3MnLCAnV2luQ0UnXSxcclxuICAgICAgaW9zUGxhdGZvcm1zID0gWydpUGhvbmUnLCAnaVBhZCcsICdpUG9kJ10sXHJcbiAgICAgIG9zID0gbnVsbDtcclxuXHJcbiAgICBpZiAobWFjb3NQbGF0Zm9ybXMuaW5kZXhPZihwbGF0Zm9ybSkgIT09IC0xKSB7XHJcbiAgICAgIG9zID0gJ01hYyBPUyc7XHJcbiAgICB9IGVsc2UgaWYgKGlvc1BsYXRmb3Jtcy5pbmRleE9mKHBsYXRmb3JtKSAhPT0gLTEpIHtcclxuICAgICAgb3MgPSAnaU9TJztcclxuICAgIH0gZWxzZSBpZiAod2luZG93c1BsYXRmb3Jtcy5pbmRleE9mKHBsYXRmb3JtKSAhPT0gLTEpIHtcclxuICAgICAgb3MgPSAnV2luZG93cyc7XHJcbiAgICB9IGVsc2UgaWYgKC9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCkpIHtcclxuICAgICAgb3MgPSAnQW5kcm9pZCc7XHJcbiAgICB9IGVsc2UgaWYgKCFvcyAmJiAvTGludXgvLnRlc3QocGxhdGZvcm0pKSB7XHJcbiAgICAgIG9zID0gJ0xpbnV4JztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3MgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBvblN1Y2Nlc3NIYW5kbGVyczoge1xyXG4gICAgY2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uO1xyXG4gICAgcmVnZXhwOiBSZWdFeHA7XHJcbiAgfVtdID0gW107XHJcbiAgcHVibGljIHN0YXRpYyBvblN1Y2Nlc3MoY2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uLCByZWdleHA6IFJlZ0V4cCkge1xyXG4gICAgdGhpcy5vblN1Y2Nlc3NIYW5kbGVycy5wdXNoKHsgY2FsbGJhY2ssIHJlZ2V4cCB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIG9uUmVjb25uZWN0Q2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uW10gPSBbXTtcclxuICBzdGF0aWMgb25SZWNvbm5lY3QoY2FsbGJhY2s6IERlY29yYWJsZUZ1bmN0aW9uKSB7XHJcbiAgICBXZWJzb2NrZXRDbGllbnQub25SZWNvbm5lY3RDYWxsYmFjay5wdXNoKGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW52b2tlU3VjY2Vzc0hhbmRsZXJzKG1ldGhvZDogc3RyaW5nKSB7XHJcbiAgICBXZWJzb2NrZXRDbGllbnQub25TdWNjZXNzSGFuZGxlcnNcclxuICAgICAgLmZpbHRlcigoZSkgPT4gZS5yZWdleHAudGVzdChtZXRob2QpKVxyXG4gICAgICAuZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgIHZhciByZXMgPSAoZS5jYWxsYmFjay5GdW5jIGFzIEZ1bmN0aW9uKSgpO1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnRoZW4pIHtcclxuICAgICAgICAgIHJlcy50aGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgZGlzY29ubmVjdChyZXN0YXJ0PzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuY2xlYXJSZWNvbm5lY3RUaW1lcigpO1xyXG4gICAgdGhpcy5jbGVhckhhbmRzaGFrZVRpbWVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMud3MpIHRoaXMud3MuY2xvc2UoKTtcclxuXHJcbiAgICBpZiAoIXJlc3RhcnQpIHtcclxuICAgICAgdGhpcy53cy5vbm9wZW4gPSBudWxsO1xyXG4gICAgICB0aGlzLndzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25lcnJvciA9IG51bGw7XHJcbiAgICAgIHRoaXMud3Mub25jbG9zZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDYWNoZSgpIHt9XHJcblxyXG4gIGdldCB0YXJnZXQoKTogYW55IHtcclxuICAgIHJldHVybiAodGhpcyBhcyBhbnkpLl9fcHJvdG9fXztcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -155,7 +155,11 @@ class WebsocketClient {
|
|
|
155
155
|
set Connected(value) {
|
|
156
156
|
if (value) {
|
|
157
157
|
this.sendBrowserInfoToServer();
|
|
158
|
-
this.auth(this.Token)
|
|
158
|
+
this.auth(this.Token)
|
|
159
|
+
.catch((err) => {
|
|
160
|
+
console.log('ActiveConnect: auth failed on reconnect: ' + err);
|
|
161
|
+
})
|
|
162
|
+
.then(() => {
|
|
159
163
|
Promise.all(WebsocketClient.onReconnectCallback.map((c) => c.Func ? c.Func() : null)).then(() => {
|
|
160
164
|
setTimeout(() => {
|
|
161
165
|
this.resetRequestedState();
|
|
@@ -184,6 +188,12 @@ class WebsocketClient {
|
|
|
184
188
|
static addResetRequestingStateCallback(callback) {
|
|
185
189
|
WebsocketClient.resetRequestedStateCallbacks.push(callback);
|
|
186
190
|
}
|
|
191
|
+
clearHandshakeTimer() {
|
|
192
|
+
if (this.handshakeTimer !== undefined) {
|
|
193
|
+
clearTimeout(this.handshakeTimer);
|
|
194
|
+
this.handshakeTimer = undefined;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
187
197
|
create(url) {
|
|
188
198
|
if (this.ws) {
|
|
189
199
|
// Detach handlers first so the old socket's close event can't trigger
|
|
@@ -198,23 +208,61 @@ class WebsocketClient {
|
|
|
198
208
|
}
|
|
199
209
|
}
|
|
200
210
|
this.clearReconnectTimer();
|
|
211
|
+
this.clearHandshakeTimer();
|
|
201
212
|
this.closed = false;
|
|
202
213
|
// create new connection
|
|
203
214
|
this.logEntry('TCP/HTTP:CONNECT-SERVER');
|
|
204
215
|
this.ws = new WebSocket(url + (this.supportsCache ? '?cache=true' : ''));
|
|
216
|
+
this.handshakeTimer = setTimeout(() => {
|
|
217
|
+
if (this.ws && this.ws.readyState === WebSocket.CONNECTING) {
|
|
218
|
+
this.logEntry('TCP/HTTP:HANDSHAKE-TIMEOUT');
|
|
219
|
+
console.log('ActiveConnect: Handshake timed out, retrying connection...');
|
|
220
|
+
// Detach so the forced close below doesn't double-trigger reconnect logic.
|
|
221
|
+
this.ws.onopen = null;
|
|
222
|
+
this.ws.onmessage = null;
|
|
223
|
+
this.ws.onerror = null;
|
|
224
|
+
this.ws.onclose = null;
|
|
225
|
+
try {
|
|
226
|
+
this.ws.close();
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
// ignore - socket may already be in a bad state
|
|
230
|
+
}
|
|
231
|
+
if (!this.closed) {
|
|
232
|
+
this.clearReconnectTimer();
|
|
233
|
+
this.reconnectTimer = setTimeout(() => {
|
|
234
|
+
this.reconnectTimer = undefined;
|
|
235
|
+
this.connect(url);
|
|
236
|
+
}, 1000);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}, WebsocketClient.HANDSHAKE_TIMEOUT_MS);
|
|
205
240
|
this.ws.onerror = (err) => {
|
|
206
241
|
this.ws.close();
|
|
207
242
|
this.logEntry('TCP/HTTP:ERROR:' + err);
|
|
208
243
|
console.log('ActiveConnect: ' + err);
|
|
209
244
|
};
|
|
210
245
|
this.ws.onopen = () => {
|
|
246
|
+
this.clearHandshakeTimer();
|
|
211
247
|
this.logEntry('TCP/HTTP:CONNECTED');
|
|
212
248
|
this.Connected = true;
|
|
213
249
|
};
|
|
214
250
|
this.ws.onmessage = (e) => {
|
|
215
|
-
|
|
251
|
+
let parsed;
|
|
252
|
+
try {
|
|
253
|
+
parsed = JsonParser.parse(e.data.toString());
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
// A malformed frame must not throw inside the onmessage handler -
|
|
257
|
+
// that would silently kill message processing for the rest of the
|
|
258
|
+
// connection's lifetime without ever surfacing an error.
|
|
259
|
+
console.log('ActiveConnect: failed to parse incoming message: ' + err);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
this.messageReceived(parsed);
|
|
216
263
|
};
|
|
217
264
|
this.ws.onclose = () => {
|
|
265
|
+
this.clearHandshakeTimer();
|
|
218
266
|
this.logEntry('TCP/HTTP:CLOSED');
|
|
219
267
|
if (!this.closed) {
|
|
220
268
|
if (this.pool && this.pool.WssConnected)
|
|
@@ -440,6 +488,7 @@ class WebsocketClient {
|
|
|
440
488
|
disconnect(restart) {
|
|
441
489
|
this.closed = true;
|
|
442
490
|
this.clearReconnectTimer();
|
|
491
|
+
this.clearHandshakeTimer();
|
|
443
492
|
if (this.ws)
|
|
444
493
|
this.ws.close();
|
|
445
494
|
if (!restart) {
|
|
@@ -455,6 +504,7 @@ class WebsocketClient {
|
|
|
455
504
|
}
|
|
456
505
|
}
|
|
457
506
|
WebsocketClient.resetRequestedStateCallbacks = [];
|
|
507
|
+
WebsocketClient.HANDSHAKE_TIMEOUT_MS = 10000;
|
|
458
508
|
WebsocketClient.outbounds = new Map();
|
|
459
509
|
WebsocketClient.handles = new Map();
|
|
460
510
|
WebsocketClient.onSuccessHandlers = [];
|