@appium/base-driver 8.2.4 → 8.3.0
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/build/lib/basedriver/commands/find.js +4 -11
- package/build/lib/basedriver/commands/log.js +3 -6
- package/build/lib/basedriver/commands/session.js +18 -27
- package/build/lib/basedriver/commands/settings.js +4 -8
- package/build/lib/basedriver/commands/timeout.js +10 -15
- package/build/lib/basedriver/device-settings.js +14 -2
- package/build/lib/basedriver/driver.js +22 -20
- package/build/lib/basedriver/helpers.js +9 -9
- package/build/lib/express/express-logging.js +2 -2
- package/build/lib/express/idempotency.js +2 -2
- package/build/lib/helpers/capabilities.js +39 -0
- package/build/lib/index.js +3 -5
- package/build/lib/jsonwp-proxy/protocol-converter.js +18 -12
- package/build/lib/jsonwp-proxy/proxy.js +19 -12
- package/build/lib/protocol/protocol.js +36 -27
- package/build/lib/protocol/routes.js +67 -1
- package/build/test/basedriver/capabilities-specs.js +43 -1
- package/build/test/basedriver/capability-specs.js +126 -167
- package/build/test/basedriver/commands/log-specs.js +12 -5
- package/build/test/basedriver/driver-tests.js +11 -14
- package/build/test/basedriver/timeout-specs.js +7 -9
- package/build/test/express/server-e2e-specs.js +10 -5
- package/build/test/express/server-specs.js +22 -16
- package/build/test/express/static-specs.js +10 -5
- package/build/test/protocol/fake-driver.js +12 -15
- package/build/test/protocol/protocol-e2e-specs.js +16 -10
- package/build/test/protocol/routes-specs.js +2 -2
- package/lib/basedriver/commands/find.js +3 -6
- package/lib/basedriver/commands/log.js +2 -4
- package/lib/basedriver/commands/session.js +21 -22
- package/lib/basedriver/commands/settings.js +3 -5
- package/lib/basedriver/commands/timeout.js +9 -10
- package/lib/basedriver/device-settings.js +10 -1
- package/lib/basedriver/driver.js +25 -12
- package/lib/basedriver/helpers.js +13 -11
- package/lib/express/express-logging.js +1 -1
- package/lib/express/idempotency.js +1 -1
- package/lib/helpers/capabilities.js +25 -0
- package/lib/index.js +2 -2
- package/lib/jsonwp-proxy/protocol-converter.js +14 -13
- package/lib/jsonwp-proxy/proxy.js +16 -12
- package/lib/protocol/protocol.js +34 -29
- package/lib/protocol/routes.js +60 -1
- package/package.json +29 -22
- package/test/basedriver/capabilities-specs.js +34 -2
- package/test/basedriver/capability-specs.js +120 -146
- package/test/basedriver/commands/log-specs.js +12 -3
- package/test/basedriver/driver-tests.js +12 -7
- package/test/basedriver/timeout-specs.js +6 -11
- package/build/lib/protocol/sessions-cache.js +0 -88
- package/lib/protocol/sessions-cache.js +0 -74
|
@@ -31,7 +31,7 @@ var _http = _interopRequireDefault(require("http"));
|
|
|
31
31
|
|
|
32
32
|
var _https = _interopRequireDefault(require("https"));
|
|
33
33
|
|
|
34
|
-
const
|
|
34
|
+
const DEFAULT_LOG = _support.logger.getLogger('WD Proxy');
|
|
35
35
|
|
|
36
36
|
const DEFAULT_REQUEST_TIMEOUT = 240000;
|
|
37
37
|
const COMPACT_ERROR_PATTERNS = [/\bECONNREFUSED\b/, /socket hang up/];
|
|
@@ -64,7 +64,14 @@ class JWProxy {
|
|
|
64
64
|
};
|
|
65
65
|
this.httpAgent = new _http.default.Agent(agentOpts);
|
|
66
66
|
this.httpsAgent = new _https.default.Agent(agentOpts);
|
|
67
|
-
this.protocolConverter = new _protocolConverter.default(this.proxy.bind(this));
|
|
67
|
+
this.protocolConverter = new _protocolConverter.default(this.proxy.bind(this), opts.log);
|
|
68
|
+
this._log = opts.log;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
get log() {
|
|
72
|
+
var _this$_log;
|
|
73
|
+
|
|
74
|
+
return (_this$_log = this._log) !== null && _this$_log !== void 0 ? _this$_log : DEFAULT_LOG;
|
|
68
75
|
}
|
|
69
76
|
|
|
70
77
|
async request(requestConfig) {
|
|
@@ -186,7 +193,7 @@ class JWProxy {
|
|
|
186
193
|
}
|
|
187
194
|
}
|
|
188
195
|
|
|
189
|
-
log.debug(`Proxying [${method} ${url || '/'}] to [${method} ${newUrl}] ` + (reqOpts.data ? `with body: ${truncateBody(reqOpts.data)}` : 'with no body'));
|
|
196
|
+
this.log.debug(`Proxying [${method} ${url || '/'}] to [${method} ${newUrl}] ` + (reqOpts.data ? `with body: ${truncateBody(reqOpts.data)}` : 'with no body'));
|
|
190
197
|
|
|
191
198
|
const throwProxyError = error => {
|
|
192
199
|
const err = new Error(`The request to ${url} has failed`);
|
|
@@ -210,7 +217,7 @@ class JWProxy {
|
|
|
210
217
|
throwProxyError(data);
|
|
211
218
|
}
|
|
212
219
|
|
|
213
|
-
log.debug(`Got response with status ${status}: ${truncateBody(data)}`);
|
|
220
|
+
this.log.debug(`Got response with status ${status}: ${truncateBody(data)}`);
|
|
214
221
|
isResponseLogged = true;
|
|
215
222
|
const isSessionCreationRequest = /\/session$/.test(url) && method === 'POST';
|
|
216
223
|
|
|
@@ -220,7 +227,7 @@ class JWProxy {
|
|
|
220
227
|
}
|
|
221
228
|
|
|
222
229
|
this.downstreamProtocol = this.getProtocolFromResBody(data);
|
|
223
|
-
log.info(`Determined the downstream protocol as '${this.downstreamProtocol}'`);
|
|
230
|
+
this.log.info(`Determined the downstream protocol as '${this.downstreamProtocol}'`);
|
|
224
231
|
}
|
|
225
232
|
|
|
226
233
|
if (_lodash.default.has(data, 'status') && parseInt(data.status, 10) !== 0) {
|
|
@@ -241,15 +248,15 @@ class JWProxy {
|
|
|
241
248
|
if (_support.util.hasValue(e.response)) {
|
|
242
249
|
if (!isResponseLogged) {
|
|
243
250
|
const error = truncateBody(e.response.data);
|
|
244
|
-
log.info(_support.util.hasValue(e.response.status) ? `Got response with status ${e.response.status}: ${error}` : `Got response with unknown status: ${error}`);
|
|
251
|
+
this.log.info(_support.util.hasValue(e.response.status) ? `Got response with status ${e.response.status}: ${error}` : `Got response with unknown status: ${error}`);
|
|
245
252
|
}
|
|
246
253
|
} else {
|
|
247
254
|
proxyErrorMsg = `Could not proxy command to the remote server. Original error: ${e.message}`;
|
|
248
255
|
|
|
249
256
|
if (COMPACT_ERROR_PATTERNS.some(p => p.test(e.message))) {
|
|
250
|
-
log.info(e.message);
|
|
257
|
+
this.log.info(e.message);
|
|
251
258
|
} else {
|
|
252
|
-
log.info(e.stack);
|
|
259
|
+
this.log.info(e.stack);
|
|
253
260
|
}
|
|
254
261
|
}
|
|
255
262
|
|
|
@@ -293,7 +300,7 @@ class JWProxy {
|
|
|
293
300
|
return await this.proxy(url, method, body);
|
|
294
301
|
}
|
|
295
302
|
|
|
296
|
-
log.debug(`Matched '${url}' to command name '${commandName}'`);
|
|
303
|
+
this.log.debug(`Matched '${url}' to command name '${commandName}'`);
|
|
297
304
|
return await this.protocolConverter.convertAndProxy(commandName, url, method, body);
|
|
298
305
|
}
|
|
299
306
|
|
|
@@ -359,10 +366,10 @@ class JWProxy {
|
|
|
359
366
|
|
|
360
367
|
if (_lodash.default.has(resBodyObj, 'sessionId')) {
|
|
361
368
|
if (reqSessionId) {
|
|
362
|
-
log.info(`Replacing sessionId ${resBodyObj.sessionId} with ${reqSessionId}`);
|
|
369
|
+
this.log.info(`Replacing sessionId ${resBodyObj.sessionId} with ${reqSessionId}`);
|
|
363
370
|
resBodyObj.sessionId = reqSessionId;
|
|
364
371
|
} else if (this.sessionId) {
|
|
365
|
-
log.info(`Replacing sessionId ${resBodyObj.sessionId} with ${this.sessionId}`);
|
|
372
|
+
this.log.info(`Replacing sessionId ${resBodyObj.sessionId} with ${this.sessionId}`);
|
|
366
373
|
resBodyObj.sessionId = this.sessionId;
|
|
367
374
|
}
|
|
368
375
|
}
|
|
@@ -378,4 +385,4 @@ var _default = JWProxy;
|
|
|
378
385
|
exports.default = _default;require('source-map-support').install();
|
|
379
386
|
|
|
380
387
|
|
|
381
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9qc29ud3AtcHJveHkvcHJveHkuanMiXSwibmFtZXMiOlsibG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiREVGQVVMVF9SRVFVRVNUX1RJTUVPVVQiLCJDT01QQUNUX0VSUk9SX1BBVFRFUk5TIiwiTUpTT05XUCIsIlczQyIsIlBST1RPQ09MUyIsIkpXUHJveHkiLCJjb25zdHJ1Y3RvciIsIm9wdHMiLCJfIiwiZGVmYXVsdHMiLCJzY2hlbWUiLCJzZXJ2ZXIiLCJwb3J0IiwiYmFzZSIsIkRFRkFVTFRfQkFTRV9QQVRIIiwicmVxQmFzZVBhdGgiLCJzZXNzaW9uSWQiLCJ0aW1lb3V0IiwidG9Mb3dlckNhc2UiLCJfYWN0aXZlUmVxdWVzdHMiLCJfZG93bnN0cmVhbVByb3RvY29sIiwiYWdlbnRPcHRzIiwia2VlcEFsaXZlIiwibWF4U29ja2V0cyIsIm1heEZyZWVTb2NrZXRzIiwiaHR0cEFnZW50IiwiaHR0cCIsIkFnZW50IiwiaHR0cHNBZ2VudCIsImh0dHBzIiwicHJvdG9jb2xDb252ZXJ0ZXIiLCJQcm90b2NvbENvbnZlcnRlciIsInByb3h5IiwiYmluZCIsInJlcXVlc3QiLCJyZXF1ZXN0Q29uZmlnIiwicmVxUHJvbWlzZSIsInB1c2giLCJwdWxsIiwiZ2V0QWN0aXZlUmVxdWVzdHNDb3VudCIsImxlbmd0aCIsImNhbmNlbEFjdGl2ZVJlcXVlc3RzIiwiZW5kcG9pbnRSZXF1aXJlc1Nlc3Npb25JZCIsImVuZHBvaW50IiwiaW5jbHVkZXMiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJ2YWx1ZSIsImdldFVybEZvclByb3h5IiwidXJsIiwicHJveHlCYXNlIiwiZW5kcG9pbnRSZSIsInJlbWFpbmluZ1VybCIsInRlc3QiLCJmaXJzdCIsIlJlZ0V4cCIsImV4ZWMiLCJFcnJvciIsInJlcGxhY2UiLCJzdHJpcFByZWZpeFJlIiwicmVxdWlyZXNTZXNzaW9uSWQiLCJzZXNzaW9uQmFzZVJlIiwibWF0Y2giLCJtZXRob2QiLCJib2R5IiwidG9VcHBlckNhc2UiLCJuZXdVcmwiLCJ0cnVuY2F0ZUJvZHkiLCJjb250ZW50IiwidHJ1bmNhdGUiLCJpc1N0cmluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJNQVhfTE9HX0JPRFlfTEVOR1RIIiwicmVxT3B0cyIsImhlYWRlcnMiLCJhY2NlcHQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJkYXRhIiwicGFyc2UiLCJlIiwiZGVidWciLCJ0aHJvd1Byb3h5RXJyb3IiLCJlcnJvciIsImVyciIsInJlc3BvbnNlIiwic3RhdHVzIiwiaXNSZXNwb25zZUxvZ2dlZCIsImlzUGxhaW5PYmplY3QiLCJpc1Nlc3Npb25DcmVhdGlvblJlcXVlc3QiLCJnZXRQcm90b2NvbEZyb21SZXNCb2R5IiwiaW5mbyIsImhhcyIsInBhcnNlSW50IiwicmVzIiwic3RhdHVzQ29kZSIsInByb3h5RXJyb3JNc2ciLCJtZXNzYWdlIiwic29tZSIsInAiLCJzdGFjayIsImVycm9ycyIsIlByb3h5UmVxdWVzdEVycm9yIiwicmVzT2JqIiwiaXNJbnRlZ2VyIiwiaXNVbmRlZmluZWQiLCJyZXF1ZXN0VG9Db21tYW5kTmFtZSIsImV4dHJhY3RDb21tYW5kTmFtZSIsInBhdHRlcm4iLCJwYXRoTWF0Y2giLCJjb21tYW5kTmFtZSIsImVzY2FwZVJlZ0V4cCIsInByb3h5Q29tbWFuZCIsImNvbnZlcnRBbmRQcm94eSIsImNvbW1hbmQiLCJyZXNCb2R5T2JqIiwiZ2V0QWN0dWFsRXJyb3IiLCJVbmtub3duRXJyb3IiLCJwcm90b2NvbCIsImlzTmFOIiwiaXNFbXB0eSIsInN0YWNrdHJhY2UiLCJnZXRTZXNzaW9uSWRGcm9tVXJsIiwicHJveHlSZXFSZXMiLCJyZXEiLCJvcmlnaW5hbFVybCIsInNldCIsInJlcVNlc3Npb25JZCIsInNlbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsR0FBRyxHQUFHQyxnQkFBT0MsU0FBUCxD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VyxRQUFRLENBQUNYLE9BQXZCO0FBQ0FvQixJQUFBQSxHQUFHLENBQUNnQyxHQUFKLENBQVEsY0FBUixFQUF3QnpDLFFBQVEsQ0FBQ1gsT0FBVCxDQUFpQixjQUFqQixDQUF4QjtBQUlBLFVBQU1xRCxZQUFZLEdBQUcsS0FBS0wsbUJBQUwsQ0FBeUJFLEdBQUcsQ0FBQ0MsV0FBN0IsQ0FBckI7O0FBQ0EsUUFBSXJILGdCQUFFb0YsR0FBRixDQUFNdUIsVUFBTixFQUFrQixXQUFsQixDQUFKLEVBQW9DO0FBQ2xDLFVBQUlZLFlBQUosRUFBa0I7QUFDaEJsSSxRQUFBQSxHQUFHLENBQUM4RixJQUFKLENBQVUsdUJBQXNCd0IsVUFBVSxDQUFDbkcsU0FBVSxTQUFRK0csWUFBYSxFQUExRTtBQUNBWixRQUFBQSxVQUFVLENBQUNuRyxTQUFYLEdBQXVCK0csWUFBdkI7QUFDRCxPQUhELE1BR08sSUFBSSxLQUFLL0csU0FBVCxFQUFvQjtBQUN6Qm5CLFFBQUFBLEdBQUcsQ0FBQzhGLElBQUosQ0FBVSx1QkFBc0J3QixVQUFVLENBQUNuRyxTQUFVLFNBQVEsS0FBS0EsU0FBVSxFQUE1RTtBQUNBbUcsUUFBQUEsVUFBVSxDQUFDbkcsU0FBWCxHQUF1QixLQUFLQSxTQUE1QjtBQUNEO0FBQ0Y7O0FBQ0RtRyxJQUFBQSxVQUFVLENBQUNyRSxLQUFYLEdBQW1CLGtDQUFvQnFFLFVBQVUsQ0FBQ3JFLEtBQS9CLENBQW5CO0FBQ0FnRCxJQUFBQSxHQUFHLENBQUNSLE1BQUosQ0FBV0QsUUFBUSxDQUFDVSxVQUFwQixFQUFnQ2lDLElBQWhDLENBQXFDMUQsSUFBSSxDQUFDQyxTQUFMLENBQWUsMkJBQWE0QyxVQUFiLENBQWYsQ0FBckM7QUFDRDs7QUFqVFc7OztlQXFUQzlHLE8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgbG9nZ2VyLCB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBnZXRTdW1tYXJ5QnlDb2RlIH0gZnJvbSAnLi4vanNvbndwLXN0YXR1cy9zdGF0dXMnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBpc0Vycm9yVHlwZSwgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlXG59IGZyb20gJy4uL3Byb3RvY29sL2Vycm9ycyc7XG5pbXBvcnQgeyByb3V0ZVRvQ29tbWFuZE5hbWUgfSBmcm9tICcuLi9wcm90b2NvbCc7XG5pbXBvcnQgeyBNQVhfTE9HX0JPRFlfTEVOR1RILCBERUZBVUxUX0JBU0VfUEFUSCwgUFJPVE9DT0xTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBQcm90b2NvbENvbnZlcnRlciBmcm9tICcuL3Byb3RvY29sLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBmb3JtYXRSZXNwb25zZVZhbHVlLCBmb3JtYXRTdGF0dXMgfSBmcm9tICcuLi9wcm90b2NvbC9oZWxwZXJzJztcbmltcG9ydCBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IGh0dHBzIGZyb20gJ2h0dHBzJztcblxuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdXRCBQcm94eScpO1xuY29uc3QgREVGQVVMVF9SRVFVRVNUX1RJTUVPVVQgPSAyNDAwMDA7XG5jb25zdCBDT01QQUNUX0VSUk9SX1BBVFRFUk5TID0gW1xuICAvXFxiRUNPTk5SRUZVU0VEXFxiLyxcbiAgL3NvY2tldCBoYW5nIHVwLyxcbl07XG5cbmNvbnN0IHtNSlNPTldQLCBXM0N9ID0gUFJPVE9DT0xTO1xuXG5jbGFzcyBKV1Byb3h5IHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSkge1xuICAgIF8uZGVmYXVsdHModGhpcywgb3B0cywge1xuICAgICAgc2NoZW1lOiAnaHR0cCcsXG4gICAgICBzZXJ2ZXI6ICdsb2NhbGhvc3QnLFxuICAgICAgcG9ydDogNDQ0NCxcbiAgICAgIGJhc2U6IERFRkFVTFRfQkFTRV9QQVRILFxuICAgICAgcmVxQmFzZVBhdGg6IERFRkFVTFRfQkFTRV9QQVRILFxuICAgICAgc2Vzc2lvbklkOiBudWxsLFxuICAgICAgdGltZW91dDogREVGQVVMVF9SRVFVRVNUX1RJTUVPVVQsXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlbWUgPSB0aGlzLnNjaGVtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzID0gW107XG4gICAgdGhpcy5fZG93bnN0cmVhbVByb3RvY29sID0gbnVsbDtcbiAgICBjb25zdCBhZ2VudE9wdHMgPSB7XG4gICAgICBrZWVwQWxpdmU6IG9wdHMua2VlcEFsaXZlID8/IHRydWUsXG4gICAgICBtYXhTb2NrZXRzOiAxMCxcbiAgICAgIG1heEZyZWVTb2NrZXRzOiA1LFxuICAgIH07XG4gICAgdGhpcy5odHRwQWdlbnQgPSBuZXcgaHR0cC5BZ2VudChhZ2VudE9wdHMpO1xuICAgIHRoaXMuaHR0cHNBZ2VudCA9IG5ldyBodHRwcy5BZ2VudChhZ2VudE9wdHMpO1xuICAgIHRoaXMucHJvdG9jb2xDb252ZXJ0ZXIgPSBuZXcgUHJvdG9jb2xDb252ZXJ0ZXIodGhpcy5wcm94eS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyByZXF1ZXN0cyB0byB0aGUgZG93bnN0cmVhbSBzZXJ2ZXJcbiAgICpcbiAgICogQHByaXZhdGUgLSBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSxcbiAgICogaXQgdXNlcyBjbGllbnQtc3BlY2lmaWMgYXJndW1lbnRzIGFuZCByZXNwb25zZXMhXG4gICAqXG4gICAqIEBwYXJhbSB7QXhpb3NSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIHtBeGlvc1Jlc3BvbnNlfVxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdCAocmVxdWVzdENvbmZpZykge1xuICAgIGNvbnN0IHJlcVByb21pc2UgPSBheGlvcyhyZXF1ZXN0Q29uZmlnKTtcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cy5wdXNoKHJlcVByb21pc2UpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVxUHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgXy5wdWxsKHRoaXMuX2FjdGl2ZVJlcXVlc3RzLCByZXFQcm9taXNlKTtcbiAgICB9XG4gIH1cblxuICBnZXRBY3RpdmVSZXF1ZXN0c0NvdW50ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUmVxdWVzdHMubGVuZ3RoO1xuICB9XG5cbiAgY2FuY2VsQWN0aXZlUmVxdWVzdHMgKCkge1xuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzID0gW107XG4gIH1cblxuICBlbmRwb2ludFJlcXVpcmVzU2Vzc2lvbklkIChlbmRwb2ludCkge1xuICAgIHJldHVybiAhXy5pbmNsdWRlcyhbJy9zZXNzaW9uJywgJy9zZXNzaW9ucycsICcvc3RhdHVzJ10sIGVuZHBvaW50KTtcbiAgfVxuXG4gIHNldCBkb3duc3RyZWFtUHJvdG9jb2wgKHZhbHVlKSB7XG4gICAgdGhpcy5fZG93bnN0cmVhbVByb3RvY29sID0gdmFsdWU7XG4gICAgdGhpcy5wcm90b2NvbENvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBkb3duc3RyZWFtUHJvdG9jb2wgKCkge1xuICAgIHJldHVybiB0aGlzLl9kb3duc3RyZWFtUHJvdG9jb2w7XG4gIH1cblxuICBnZXRVcmxGb3JQcm94eSAodXJsKSB7XG4gICAgaWYgKHVybCA9PT0gJycpIHtcbiAgICAgIHVybCA9ICcvJztcbiAgICB9XG4gICAgY29uc3QgcHJveHlCYXNlID0gYCR7dGhpcy5zY2hlbWV9Oi8vJHt0aGlzLnNlcnZlcn06JHt0aGlzLnBvcnR9JHt0aGlzLmJhc2V9YDtcbiAgICBjb25zdCBlbmRwb2ludFJlID0gJygvKHNlc3Npb258c3RhdHVzKSknO1xuICAgIGxldCByZW1haW5pbmdVcmwgPSAnJztcbiAgICBpZiAoL15odHRwLy50ZXN0KHVybCkpIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gKG5ldyBSZWdFeHAoYChodHRwcz86Ly8uKykke2VuZHBvaW50UmV9YCkpLmV4ZWModXJsKTtcbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHb3QgYSBjb21wbGV0ZSB1cmwgYnV0IGNvdWxkIG5vdCBleHRyYWN0IEpXUCBlbmRwb2ludCcpO1xuICAgICAgfVxuICAgICAgcmVtYWluaW5nVXJsID0gdXJsLnJlcGxhY2UoZmlyc3RbMV0sICcnKTtcbiAgICB9IGVsc2UgaWYgKChuZXcgUmVnRXhwKCdeLycpKS50ZXN0KHVybCkpIHtcbiAgICAgIHJlbWFpbmluZ1VybCA9IHVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGtub3cgd2hhdCB0byBkbyB3aXRoIHVybCAnJHt1cmx9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmlwUHJlZml4UmUgPSBuZXcgUmVnRXhwKCdeLio/KC8oc2Vzc2lvbnxzdGF0dXMpLiopJCcpO1xuICAgIGlmIChzdHJpcFByZWZpeFJlLnRlc3QocmVtYWluaW5nVXJsKSkge1xuICAgICAgcmVtYWluaW5nVXJsID0gc3RyaXBQcmVmaXhSZS5leGVjKHJlbWFpbmluZ1VybClbMV07XG4gICAgfVxuXG4gICAgaWYgKCEobmV3IFJlZ0V4cChlbmRwb2ludFJlKSkudGVzdChyZW1haW5pbmdVcmwpKSB7XG4gICAgICByZW1haW5pbmdVcmwgPSBgL3Nlc3Npb24vJHt0aGlzLnNlc3Npb25JZH0ke3JlbWFpbmluZ1VybH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVpcmVzU2Vzc2lvbklkID0gdGhpcy5lbmRwb2ludFJlcXVpcmVzU2Vzc2lvbklkKHJlbWFpbmluZ1VybCk7XG5cbiAgICBpZiAocmVxdWlyZXNTZXNzaW9uSWQgJiYgdGhpcy5zZXNzaW9uSWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJ5aW5nIHRvIHByb3h5IGEgc2Vzc2lvbiBjb21tYW5kIHdpdGhvdXQgc2Vzc2lvbiBpZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb25CYXNlUmUgPSBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKFteL10rKScpO1xuICAgIGlmIChzZXNzaW9uQmFzZVJlLnRlc3QocmVtYWluaW5nVXJsKSkge1xuICAgICAgLy8gd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSAvc2Vzc2lvbi86aWQvZm9vYmFyLCBzbyB3ZSBuZWVkIHRvIHJlcGxhY2VcbiAgICAgIC8vIHRoZSBzZXNzaW9uIGlkXG4gICAgICBjb25zdCBtYXRjaCA9IHNlc3Npb25CYXNlUmUuZXhlYyhyZW1haW5pbmdVcmwpO1xuICAgICAgcmVtYWluaW5nVXJsID0gcmVtYWluaW5nVXJsLnJlcGxhY2UobWF0Y2hbMV0sIHRoaXMuc2Vzc2lvbklkKTtcbiAgICB9IGVsc2UgaWYgKHJlcXVpcmVzU2Vzc2lvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIDpzZXNzaW9uIHNlY3Rpb24gZm9yIHVybDogJHtyZW1haW5pbmdVcmx9YCk7XG4gICAgfVxuICAgIHJlbWFpbmluZ1VybCA9IHJlbWFpbmluZ1VybC5yZXBsYWNlKC9cXC8kLywgJycpOyAvLyBjYW4ndCBoYXZlIHRyYWlsaW5nIHNsYXNoZXNcblxuICAgIHJldHVybiBwcm94eUJhc2UgKyByZW1haW5pbmdVcmw7XG4gIH1cblxuICBhc3luYyBwcm94eSAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgbWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgbmV3VXJsID0gdGhpcy5nZXRVcmxGb3JQcm94eSh1cmwpO1xuICAgIGNvbnN0IHRydW5jYXRlQm9keSA9IChjb250ZW50KSA9PiBfLnRydW5jYXRlKFxuICAgICAgXy5pc1N0cmluZyhjb250ZW50KSA/IGNvbnRlbnQgOiBKU09OLnN0cmluZ2lmeShjb250ZW50KSxcbiAgICAgIHsgbGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIIH0pO1xuICAgIGNvbnN0IHJlcU9wdHMgPSB7XG4gICAgICB1cmw6IG5ld1VybCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgKi8qJyxcbiAgICAgIH0sXG4gICAgICBwcm94eTogZmFsc2UsXG4gICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICBodHRwQWdlbnQ6IHRoaXMuaHR0cEFnZW50LFxuICAgICAgaHR0cHNBZ2VudDogdGhpcy5odHRwc0FnZW50LFxuICAgIH07XG4gICAgLy8gR0VUIG1ldGhvZHMgc2hvdWxkbid0IGhhdmUgYW55IGJvZHkuIE1vc3Qgc2VydmVycyBhcmUgT0sgd2l0aCB0aGlzLCBidXQgV2ViRHJpdmVyQWdlbnQgdGhyb3dzIDQwMCBlcnJvcnNcbiAgICBpZiAodXRpbC5oYXNWYWx1ZShib2R5KSAmJiBtZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICBpZiAodHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVxT3B0cy5kYXRhID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGludGVycHJldCB0aGUgcmVxdWVzdCBib2R5IGFzIHZhbGlkIEpTT046ICR7dHJ1bmNhdGVCb2R5KGJvZHkpfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXFPcHRzLmRhdGEgPSBib2R5O1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZy5kZWJ1ZyhgUHJveHlpbmcgWyR7bWV0aG9kfSAke3VybCB8fCAnLyd9XSB0byBbJHttZXRob2R9ICR7bmV3VXJsfV0gYCArXG4gICAgICAocmVxT3B0cy5kYXRhID8gYHdpdGggYm9keTogJHt0cnVuY2F0ZUJvZHkocmVxT3B0cy5kYXRhKX1gIDogJ3dpdGggbm8gYm9keScpKTtcblxuICAgIGNvbnN0IHRocm93UHJveHlFcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBUaGUgcmVxdWVzdCB0byAke3VybH0gaGFzIGZhaWxlZGApO1xuICAgICAgZXJyLnJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiBlcnJvcixcbiAgICAgICAgc3RhdHVzOiA1MDBcbiAgICAgIH07XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfTtcbiAgICBsZXQgaXNSZXNwb25zZUxvZ2dlZCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7ZGF0YSwgc3RhdHVzLCBoZWFkZXJzfSA9IGF3YWl0IHRoaXMucmVxdWVzdChyZXFPcHRzKTtcbiAgICAgIC8vIGBkYXRhYCBtaWdodCBiZSByZWFsbHkgYmlnXG4gICAgICAvLyBCZSBjYXJlZnVsIHdoaWxlIGhhbmRsaW5nIGl0IHRvIGF2b2lkIG1lbW9yeSBsZWFrc1xuICAgICAgaWYgKCFfLmlzUGxhaW5PYmplY3QoZGF0YSkpIHtcbiAgICAgICAgLy8gVGhlIHJlc3BvbnNlIHNob3VsZCBiZSBhIHZhbGlkIEpTT04gb2JqZWN0XG4gICAgICAgIC8vIElmIGl0IGNhbm5vdCBiZSBjb2VyY2VkIHRvIGFuIG9iamVjdCB0aGVuIHRoZSByZXNwb25zZSBpcyB3cm9uZ1xuICAgICAgICB0aHJvd1Byb3h5RXJyb3IoZGF0YSk7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYEdvdCByZXNwb25zZSB3aXRoIHN0YXR1cyAke3N0YXR1c306ICR7dHJ1bmNhdGVCb2R5KGRhdGEpfWApO1xuICAgICAgaXNSZXNwb25zZUxvZ2dlZCA9IHRydWU7XG4gICAgICBjb25zdCBpc1Nlc3Npb25DcmVhdGlvblJlcXVlc3QgPSAvXFwvc2Vzc2lvbiQvLnRlc3QodXJsKSAmJiBtZXRob2QgPT09ICdQT1NUJztcbiAgICAgIGlmIChpc1Nlc3Npb25DcmVhdGlvblJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBkYXRhLnNlc3Npb25JZCB8fCAoZGF0YS52YWx1ZSB8fCB7fSkuc2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG93bnN0cmVhbVByb3RvY29sID0gdGhpcy5nZXRQcm90b2NvbEZyb21SZXNCb2R5KGRhdGEpO1xuICAgICAgICBsb2cuaW5mbyhgRGV0ZXJtaW5lZCB0aGUgZG93bnN0cmVhbSBwcm90b2NvbCBhcyAnJHt0aGlzLmRvd25zdHJlYW1Qcm90b2NvbH0nYCk7XG4gICAgICB9XG4gICAgICBpZiAoXy5oYXMoZGF0YSwgJ3N0YXR1cycpICYmIHBhcnNlSW50KGRhdGEuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgLy8gU29tZSBzZXJ2ZXJzLCBsaWtlIGNocm9tZWRyaXZlciBtYXkgcmV0dXJuIHJlc3BvbnNlIGNvZGUgMjAwIGZvciBub24temVybyBKU09OV1Agc3RhdHVzZXNcbiAgICAgICAgdGhyb3dQcm94eUVycm9yKGRhdGEpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID0ge3N0YXR1c0NvZGU6IHN0YXR1cywgaGVhZGVycywgYm9keTogZGF0YX07XG4gICAgICByZXR1cm4gW3JlcywgZGF0YV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gV2Ugb25seSBjb25zaWRlciBhbiBlcnJvciB1bmV4cGVjdGVkIGlmIHRoaXMgd2FzIG5vdFxuICAgICAgLy8gYW4gYXN5bmMgcmVxdWVzdCBtb2R1bGUgZXJyb3Igb3IgaWYgdGhlIHJlc3BvbnNlIGNhbm5vdCBiZSBjYXN0IHRvXG4gICAgICAvLyBhIHZhbGlkIEpTT05cbiAgICAgIGxldCBwcm94eUVycm9yTXNnID0gZS5tZXNzYWdlO1xuICAgICAgaWYgKHV0aWwuaGFzVmFsdWUoZS5yZXNwb25zZSkpIHtcbiAgICAgICAgaWYgKCFpc1Jlc3BvbnNlTG9nZ2VkKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB0cnVuY2F0ZUJvZHkoZS5yZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICBsb2cuaW5mbyh1dGlsLmhhc1ZhbHVlKGUucmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICAgPyBgR290IHJlc3BvbnNlIHdpdGggc3RhdHVzICR7ZS5yZXNwb25zZS5zdGF0dXN9OiAke2Vycm9yfWBcbiAgICAgICAgICAgIDogYEdvdCByZXNwb25zZSB3aXRoIHVua25vd24gc3RhdHVzOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm94eUVycm9yTXNnID0gYENvdWxkIG5vdCBwcm94eSBjb21tYW5kIHRvIHRoZSByZW1vdGUgc2VydmVyLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YDtcbiAgICAgICAgaWYgKENPTVBBQ1RfRVJST1JfUEFUVEVSTlMuc29tZSgocCkgPT4gcC50ZXN0KGUubWVzc2FnZSkpKSB7XG4gICAgICAgICAgbG9nLmluZm8oZS5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuaW5mbyhlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcihwcm94eUVycm9yTXNnLCBlLnJlc3BvbnNlPy5kYXRhLCBlLnJlc3BvbnNlPy5zdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIGdldFByb3RvY29sRnJvbVJlc0JvZHkgKHJlc09iaikge1xuICAgIGlmIChfLmlzSW50ZWdlcihyZXNPYmouc3RhdHVzKSkge1xuICAgICAgcmV0dXJuIE1KU09OV1A7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChyZXNPYmoudmFsdWUpKSB7XG4gICAgICByZXR1cm4gVzNDO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RUb0NvbW1hbmROYW1lICh1cmwsIG1ldGhvZCkge1xuICAgIGNvbnN0IGV4dHJhY3RDb21tYW5kTmFtZSA9IChwYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXRoTWF0Y2ggPSBwYXR0ZXJuLmV4ZWModXJsKTtcbiAgICAgIHJldHVybiBwYXRoTWF0Y2ggPyByb3V0ZVRvQ29tbWFuZE5hbWUocGF0aE1hdGNoWzFdLCBtZXRob2QsIHRoaXMucmVxQmFzZVBhdGgpIDogbnVsbDtcbiAgICB9O1xuICAgIGxldCBjb21tYW5kTmFtZSA9IHJvdXRlVG9Db21tYW5kTmFtZSh1cmwsIG1ldGhvZCwgdGhpcy5yZXFCYXNlUGF0aCk7XG4gICAgaWYgKCFjb21tYW5kTmFtZSAmJiBfLmluY2x1ZGVzKHVybCwgYCR7dGhpcy5yZXFCYXNlUGF0aH0vc2Vzc2lvbi9gKSkge1xuICAgICAgY29tbWFuZE5hbWUgPSBleHRyYWN0Q29tbWFuZE5hbWUobmV3IFJlZ0V4cChgJHtfLmVzY2FwZVJlZ0V4cCh0aGlzLnJlcUJhc2VQYXRoKX0vc2Vzc2lvbi9bXi9dKyguKylgKSk7XG4gICAgfVxuICAgIGlmICghY29tbWFuZE5hbWUgJiYgXy5pbmNsdWRlcyh1cmwsIHRoaXMucmVxQmFzZVBhdGgpKSB7XG4gICAgICBjb21tYW5kTmFtZSA9IGV4dHJhY3RDb21tYW5kTmFtZShuZXcgUmVnRXhwKGAke18uZXNjYXBlUmVnRXhwKHRoaXMucmVxQmFzZVBhdGgpfSgvLispYCkpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZE5hbWU7XG4gIH1cblxuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gdGhpcy5yZXF1ZXN0VG9Db21tYW5kTmFtZSh1cmwsIG1ldGhvZCk7XG4gICAgaWYgKCFjb21tYW5kTmFtZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHkodXJsLCBtZXRob2QsIGJvZHkpO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYE1hdGNoZWQgJyR7dXJsfScgdG8gY29tbWFuZCBuYW1lICcke2NvbW1hbmROYW1lfSdgKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3RvY29sQ29udmVydGVyLmNvbnZlcnRBbmRQcm94eShjb21tYW5kTmFtZSwgdXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG5cbiAgYXN5bmMgY29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIGxldCByZXNCb2R5T2JqO1xuICAgIHRyeSB7XG4gICAgICBbcmVzcG9uc2UsIHJlc0JvZHlPYmpdID0gYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnIuZ2V0QWN0dWFsRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkVycm9yKGVyci5tZXNzYWdlKTtcbiAgICB9XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLmdldFByb3RvY29sRnJvbVJlc0JvZHkocmVzQm9keU9iaik7XG4gICAgaWYgKHByb3RvY29sID09PSBNSlNPTldQKSB7XG4gICAgICAvLyBHb3QgcmVzcG9uc2UgaW4gTUpTT05XUCBmb3JtYXRcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSAyMDAgJiYgcmVzQm9keU9iai5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc0JvZHlPYmoudmFsdWU7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBwYXJzZUludChyZXNCb2R5T2JqLnN0YXR1cywgMTApO1xuICAgICAgaWYgKCFpc05hTihzdGF0dXMpICYmIHN0YXR1cyAhPT0gMCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHJlc0JvZHlPYmoudmFsdWU7XG4gICAgICAgIGlmIChfLmhhcyhtZXNzYWdlLCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShzdGF0dXMsIF8uaXNFbXB0eShtZXNzYWdlKSA/IGdldFN1bW1hcnlCeUNvZGUoc3RhdHVzKSA6IG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvdG9jb2wgPT09IFczQykge1xuICAgICAgLy8gR290IHJlc3BvbnNlIGluIFczQyBmb3JtYXRcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlIDwgMzAwKSB7XG4gICAgICAgIHJldHVybiByZXNCb2R5T2JqLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChyZXNCb2R5T2JqLnZhbHVlKSAmJiByZXNCb2R5T2JqLnZhbHVlLmVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKHJlc0JvZHlPYmoudmFsdWUuZXJyb3IsIHJlc0JvZHlPYmoudmFsdWUubWVzc2FnZSwgcmVzQm9keU9iai52YWx1ZS5zdGFja3RyYWNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDIwMCkge1xuICAgICAgLy8gVW5rbm93biBwcm90b2NvbC4gS2VlcGluZyBpdCBiZWNhdXNlIG9mIHRoZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICByZXR1cm4gcmVzQm9keU9iajtcbiAgICB9XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoYERpZCBub3Qga25vdyB3aGF0IHRvIGRvIHdpdGggcmVzcG9uc2UgY29kZSAnJHtyZXNwb25zZS5zdGF0dXNDb2RlfScgYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFuZCByZXNwb25zZSBib2R5ICcke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkocmVzQm9keU9iaiksIHtsZW5ndGg6IDMwMH0pfSdgKTtcbiAgfVxuXG4gIGdldFNlc3Npb25JZEZyb21VcmwgKHVybCkge1xuICAgIGNvbnN0IG1hdGNoID0gdXJsLm1hdGNoKC9cXC9zZXNzaW9uXFwvKFteL10rKS8pO1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogbnVsbDtcbiAgfVxuXG4gIGFzeW5jIHByb3h5UmVxUmVzIChyZXEsIHJlcykge1xuICAgIGNvbnN0IFtyZXNwb25zZSwgcmVzQm9keU9ial0gPSBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZChyZXEub3JpZ2luYWxVcmwsIHJlcS5tZXRob2QsIHJlcS5ib2R5KTtcblxuICAgIHJlcy5oZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcbiAgICByZXMuc2V0KCdjb250ZW50LXR5cGUnLCByZXNwb25zZS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSk7XG4gICAgLy8gaWYgdGhlIHByb3hpZWQgcmVzcG9uc2UgY29udGFpbnMgYSBzZXNzaW9uSWQgdGhhdCB0aGUgZG93bnN0cmVhbVxuICAgIC8vIGRyaXZlciBoYXMgZ2VuZXJhdGVkLCB3ZSBkb24ndCB3YW50IHRvIHJldHVybiB0aGF0IHRvIHRoZSBjbGllbnQuXG4gICAgLy8gSW5zdGVhZCwgcmV0dXJuIHRoZSBpZCBmcm9tIHRoZSByZXF1ZXN0IG9yIGZyb20gY3VycmVudCBzZXNzaW9uXG4gICAgY29uc3QgcmVxU2Vzc2lvbklkID0gdGhpcy5nZXRTZXNzaW9uSWRGcm9tVXJsKHJlcS5vcmlnaW5hbFVybCk7XG4gICAgaWYgKF8uaGFzKHJlc0JvZHlPYmosICdzZXNzaW9uSWQnKSkge1xuICAgICAgaWYgKHJlcVNlc3Npb25JZCkge1xuICAgICAgICBsb2cuaW5mbyhgUmVwbGFjaW5nIHNlc3Npb25JZCAke3Jlc0JvZHlPYmouc2Vzc2lvbklkfSB3aXRoICR7cmVxU2Vzc2lvbklkfWApO1xuICAgICAgICByZXNCb2R5T2JqLnNlc3Npb25JZCA9IHJlcVNlc3Npb25JZDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXNzaW9uSWQpIHtcbiAgICAgICAgbG9nLmluZm8oYFJlcGxhY2luZyBzZXNzaW9uSWQgJHtyZXNCb2R5T2JqLnNlc3Npb25JZH0gd2l0aCAke3RoaXMuc2Vzc2lvbklkfWApO1xuICAgICAgICByZXNCb2R5T2JqLnNlc3Npb25JZCA9IHRoaXMuc2Vzc2lvbklkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXNCb2R5T2JqLnZhbHVlID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShyZXNCb2R5T2JqLnZhbHVlKTtcbiAgICByZXMuc3RhdHVzKHJlc3BvbnNlLnN0YXR1c0NvZGUpLnNlbmQoSlNPTi5zdHJpbmdpZnkoZm9ybWF0U3RhdHVzKHJlc0JvZHlPYmopKSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSldQcm94eSB9O1xuZXhwb3J0IGRlZmF1bHQgSldQcm94eTtcbiJdLCJmaWxlIjoibGliL2pzb253cC1wcm94eS9wcm94eS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
388
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9qc29ud3AtcHJveHkvcHJveHkuanMiXSwibmFtZXMiOlsiREVGQVVMVF9MT0ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJERUZBVUxUX1JFUVVFU1RfVElNRU9VVCIsIkNPTVBBQ1RfRVJST1JfUEFUVEVSTlMiLCJNSlNPTldQIiwiVzNDIiwiUFJPVE9DT0xTIiwiSldQcm94eSIsImNvbnN0cnVjdG9yIiwib3B0cyIsIl8iLCJkZWZhdWx0cyIsInNjaGVtZSIsInNlcnZlciIsInBvcnQiLCJiYXNlIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJyZXFCYXNlUGF0aCIsInNlc3Npb25JZCIsInRpbWVvdXQiLCJ0b0xvd2VyQ2FzZSIsIl9hY3RpdmVSZXF1ZXN0cyIsIl9kb3duc3RyZWFtUHJvdG9jb2wiLCJhZ2VudE9wdHMiLCJrZWVwQWxpdmUiLCJtYXhTb2NrZXRzIiwibWF4RnJlZVNvY2tldHMiLCJodHRwQWdlbnQiLCJodHRwIiwiQWdlbnQiLCJodHRwc0FnZW50IiwiaHR0cHMiLCJwcm90b2NvbENvbnZlcnRlciIsIlByb3RvY29sQ29udmVydGVyIiwicHJveHkiLCJiaW5kIiwibG9nIiwiX2xvZyIsInJlcXVlc3QiLCJyZXF1ZXN0Q29uZmlnIiwicmVxUHJvbWlzZSIsInB1c2giLCJwdWxsIiwiZ2V0QWN0aXZlUmVxdWVzdHNDb3VudCIsImxlbmd0aCIsImNhbmNlbEFjdGl2ZVJlcXVlc3RzIiwiZW5kcG9pbnRSZXF1aXJlc1Nlc3Npb25JZCIsImVuZHBvaW50IiwiaW5jbHVkZXMiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJ2YWx1ZSIsImdldFVybEZvclByb3h5IiwidXJsIiwicHJveHlCYXNlIiwiZW5kcG9pbnRSZSIsInJlbWFpbmluZ1VybCIsInRlc3QiLCJmaXJzdCIsIlJlZ0V4cCIsImV4ZWMiLCJFcnJvciIsInJlcGxhY2UiLCJzdHJpcFByZWZpeFJlIiwicmVxdWlyZXNTZXNzaW9uSWQiLCJzZXNzaW9uQmFzZVJlIiwibWF0Y2giLCJtZXRob2QiLCJib2R5IiwidG9VcHBlckNhc2UiLCJuZXdVcmwiLCJ0cnVuY2F0ZUJvZHkiLCJjb250ZW50IiwidHJ1bmNhdGUiLCJpc1N0cmluZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJNQVhfTE9HX0JPRFlfTEVOR1RIIiwicmVxT3B0cyIsImhlYWRlcnMiLCJhY2NlcHQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJkYXRhIiwicGFyc2UiLCJlIiwiZGVidWciLCJ0aHJvd1Byb3h5RXJyb3IiLCJlcnJvciIsImVyciIsInJlc3BvbnNlIiwic3RhdHVzIiwiaXNSZXNwb25zZUxvZ2dlZCIsImlzUGxhaW5PYmplY3QiLCJpc1Nlc3Npb25DcmVhdGlvblJlcXVlc3QiLCJnZXRQcm90b2NvbEZyb21SZXNCb2R5IiwiaW5mbyIsImhhcyIsInBhcnNlSW50IiwicmVzIiwic3RhdHVzQ29kZSIsInByb3h5RXJyb3JNc2ciLCJtZXNzYWdlIiwic29tZSIsInAiLCJzdGFjayIsImVycm9ycyIsIlByb3h5UmVxdWVzdEVycm9yIiwicmVzT2JqIiwiaXNJbnRlZ2VyIiwiaXNVbmRlZmluZWQiLCJyZXF1ZXN0VG9Db21tYW5kTmFtZSIsImV4dHJhY3RDb21tYW5kTmFtZSIsInBhdHRlcm4iLCJwYXRoTWF0Y2giLCJjb21tYW5kTmFtZSIsImVzY2FwZVJlZ0V4cCIsInByb3h5Q29tbWFuZCIsImNvbnZlcnRBbmRQcm94eSIsImNvbW1hbmQiLCJyZXNCb2R5T2JqIiwiZ2V0QWN0dWFsRXJyb3IiLCJVbmtub3duRXJyb3IiLCJwcm90b2NvbCIsImlzTmFOIiwiaXNFbXB0eSIsInN0YWNrdHJhY2UiLCJnZXRTZXNzaW9uSWRGcm9tVXJsIiwicHJveHlSZXFSZXMiLCJyZXEiLCJvcmlnaW5hbFVybCIsInNldCIsInJlcVNlc3Npb25JZCIsInNlbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsV0FB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Q0Q7O0FBdFRXOzs7ZUEwVENoSCxPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGxvZ2dlciwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgZ2V0U3VtbWFyeUJ5Q29kZSB9IGZyb20gJy4uL2pzb253cC1zdGF0dXMvc3RhdHVzJztcbmltcG9ydCB7XG4gIGVycm9ycywgaXNFcnJvclR5cGUsIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlLCBlcnJvckZyb21XM0NKc29uQ29kZVxufSBmcm9tICcuLi9wcm90b2NvbC9lcnJvcnMnO1xuaW1wb3J0IHsgcm91dGVUb0NvbW1hbmROYW1lIH0gZnJvbSAnLi4vcHJvdG9jb2wnO1xuaW1wb3J0IHsgTUFYX0xPR19CT0RZX0xFTkdUSCwgREVGQVVMVF9CQVNFX1BBVEgsIFBST1RPQ09MUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgUHJvdG9jb2xDb252ZXJ0ZXIgZnJvbSAnLi9wcm90b2NvbC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgZm9ybWF0UmVzcG9uc2VWYWx1ZSwgZm9ybWF0U3RhdHVzIH0gZnJvbSAnLi4vcHJvdG9jb2wvaGVscGVycyc7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcyc7XG5cbmNvbnN0IERFRkFVTFRfTE9HID0gbG9nZ2VyLmdldExvZ2dlcignV0QgUHJveHknKTtcbmNvbnN0IERFRkFVTFRfUkVRVUVTVF9USU1FT1VUID0gMjQwMDAwO1xuY29uc3QgQ09NUEFDVF9FUlJPUl9QQVRURVJOUyA9IFtcbiAgL1xcYkVDT05OUkVGVVNFRFxcYi8sXG4gIC9zb2NrZXQgaGFuZyB1cC8sXG5dO1xuXG5jb25zdCB7TUpTT05XUCwgVzNDfSA9IFBST1RPQ09MUztcblxuY2xhc3MgSldQcm94eSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBfLmRlZmF1bHRzKHRoaXMsIG9wdHMsIHtcbiAgICAgIHNjaGVtZTogJ2h0dHAnLFxuICAgICAgc2VydmVyOiAnbG9jYWxob3N0JyxcbiAgICAgIHBvcnQ6IDQ0NDQsXG4gICAgICBiYXNlOiBERUZBVUxUX0JBU0VfUEFUSCxcbiAgICAgIHJlcUJhc2VQYXRoOiBERUZBVUxUX0JBU0VfUEFUSCxcbiAgICAgIHNlc3Npb25JZDogbnVsbCxcbiAgICAgIHRpbWVvdXQ6IERFRkFVTFRfUkVRVUVTVF9USU1FT1VULFxuICAgIH0pO1xuICAgIHRoaXMuc2NoZW1lID0gdGhpcy5zY2hlbWUudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2Rvd25zdHJlYW1Qcm90b2NvbCA9IG51bGw7XG4gICAgY29uc3QgYWdlbnRPcHRzID0ge1xuICAgICAga2VlcEFsaXZlOiBvcHRzLmtlZXBBbGl2ZSA/PyB0cnVlLFxuICAgICAgbWF4U29ja2V0czogMTAsXG4gICAgICBtYXhGcmVlU29ja2V0czogNSxcbiAgICB9O1xuICAgIHRoaXMuaHR0cEFnZW50ID0gbmV3IGh0dHAuQWdlbnQoYWdlbnRPcHRzKTtcbiAgICB0aGlzLmh0dHBzQWdlbnQgPSBuZXcgaHR0cHMuQWdlbnQoYWdlbnRPcHRzKTtcbiAgICB0aGlzLnByb3RvY29sQ29udmVydGVyID0gbmV3IFByb3RvY29sQ29udmVydGVyKHRoaXMucHJveHkuYmluZCh0aGlzKSwgb3B0cy5sb2cpO1xuICAgIHRoaXMuX2xvZyA9IG9wdHMubG9nO1xuICB9XG5cbiAgZ2V0IGxvZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZyA/PyBERUZBVUxUX0xPRztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyByZXF1ZXN0cyB0byB0aGUgZG93bnN0cmVhbSBzZXJ2ZXJcbiAgICpcbiAgICogQHByaXZhdGUgLSBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseSxcbiAgICogaXQgdXNlcyBjbGllbnQtc3BlY2lmaWMgYXJndW1lbnRzIGFuZCByZXNwb25zZXMhXG4gICAqXG4gICAqIEBwYXJhbSB7QXhpb3NSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIHtBeGlvc1Jlc3BvbnNlfVxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdCAocmVxdWVzdENvbmZpZykge1xuICAgIGNvbnN0IHJlcVByb21pc2UgPSBheGlvcyhyZXF1ZXN0Q29uZmlnKTtcbiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cy5wdXNoKHJlcVByb21pc2UpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVxUHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgXy5wdWxsKHRoaXMuX2FjdGl2ZVJlcXVlc3RzLCByZXFQcm9taXNlKTtcbiAgICB9XG4gIH1cblxuICBnZXRBY3RpdmVSZXF1ZXN0c0NvdW50ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUmVxdWVzdHMubGVuZ3RoO1xuICB9XG5cbiAgY2FuY2VsQWN0aXZlUmVxdWVzdHMgKCkge1xuICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzID0gW107XG4gIH1cblxuICBlbmRwb2ludFJlcXVpcmVzU2Vzc2lvbklkIChlbmRwb2ludCkge1xuICAgIHJldHVybiAhXy5pbmNsdWRlcyhbJy9zZXNzaW9uJywgJy9zZXNzaW9ucycsICcvc3RhdHVzJ10sIGVuZHBvaW50KTtcbiAgfVxuXG4gIHNldCBkb3duc3RyZWFtUHJvdG9jb2wgKHZhbHVlKSB7XG4gICAgdGhpcy5fZG93bnN0cmVhbVByb3RvY29sID0gdmFsdWU7XG4gICAgdGhpcy5wcm90b2NvbENvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBkb3duc3RyZWFtUHJvdG9jb2wgKCkge1xuICAgIHJldHVybiB0aGlzLl9kb3duc3RyZWFtUHJvdG9jb2w7XG4gIH1cblxuICBnZXRVcmxGb3JQcm94eSAodXJsKSB7XG4gICAgaWYgKHVybCA9PT0gJycpIHtcbiAgICAgIHVybCA9ICcvJztcbiAgICB9XG4gICAgY29uc3QgcHJveHlCYXNlID0gYCR7dGhpcy5zY2hlbWV9Oi8vJHt0aGlzLnNlcnZlcn06JHt0aGlzLnBvcnR9JHt0aGlzLmJhc2V9YDtcbiAgICBjb25zdCBlbmRwb2ludFJlID0gJygvKHNlc3Npb258c3RhdHVzKSknO1xuICAgIGxldCByZW1haW5pbmdVcmwgPSAnJztcbiAgICBpZiAoL15odHRwLy50ZXN0KHVybCkpIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gKG5ldyBSZWdFeHAoYChodHRwcz86Ly8uKykke2VuZHBvaW50UmV9YCkpLmV4ZWModXJsKTtcbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHb3QgYSBjb21wbGV0ZSB1cmwgYnV0IGNvdWxkIG5vdCBleHRyYWN0IEpXUCBlbmRwb2ludCcpO1xuICAgICAgfVxuICAgICAgcmVtYWluaW5nVXJsID0gdXJsLnJlcGxhY2UoZmlyc3RbMV0sICcnKTtcbiAgICB9IGVsc2UgaWYgKChuZXcgUmVnRXhwKCdeLycpKS50ZXN0KHVybCkpIHtcbiAgICAgIHJlbWFpbmluZ1VybCA9IHVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGtub3cgd2hhdCB0byBkbyB3aXRoIHVybCAnJHt1cmx9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmlwUHJlZml4UmUgPSBuZXcgUmVnRXhwKCdeLio/KC8oc2Vzc2lvbnxzdGF0dXMpLiopJCcpO1xuICAgIGlmIChzdHJpcFByZWZpeFJlLnRlc3QocmVtYWluaW5nVXJsKSkge1xuICAgICAgcmVtYWluaW5nVXJsID0gc3RyaXBQcmVmaXhSZS5leGVjKHJlbWFpbmluZ1VybClbMV07XG4gICAgfVxuXG4gICAgaWYgKCEobmV3IFJlZ0V4cChlbmRwb2ludFJlKSkudGVzdChyZW1haW5pbmdVcmwpKSB7XG4gICAgICByZW1haW5pbmdVcmwgPSBgL3Nlc3Npb24vJHt0aGlzLnNlc3Npb25JZH0ke3JlbWFpbmluZ1VybH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVpcmVzU2Vzc2lvbklkID0gdGhpcy5lbmRwb2ludFJlcXVpcmVzU2Vzc2lvbklkKHJlbWFpbmluZ1VybCk7XG5cbiAgICBpZiAocmVxdWlyZXNTZXNzaW9uSWQgJiYgdGhpcy5zZXNzaW9uSWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJ5aW5nIHRvIHByb3h5IGEgc2Vzc2lvbiBjb21tYW5kIHdpdGhvdXQgc2Vzc2lvbiBpZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb25CYXNlUmUgPSBuZXcgUmVnRXhwKCdeL3Nlc3Npb24vKFteL10rKScpO1xuICAgIGlmIChzZXNzaW9uQmFzZVJlLnRlc3QocmVtYWluaW5nVXJsKSkge1xuICAgICAgLy8gd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSAvc2Vzc2lvbi86aWQvZm9vYmFyLCBzbyB3ZSBuZWVkIHRvIHJlcGxhY2VcbiAgICAgIC8vIHRoZSBzZXNzaW9uIGlkXG4gICAgICBjb25zdCBtYXRjaCA9IHNlc3Npb25CYXNlUmUuZXhlYyhyZW1haW5pbmdVcmwpO1xuICAgICAgcmVtYWluaW5nVXJsID0gcmVtYWluaW5nVXJsLnJlcGxhY2UobWF0Y2hbMV0sIHRoaXMuc2Vzc2lvbklkKTtcbiAgICB9IGVsc2UgaWYgKHJlcXVpcmVzU2Vzc2lvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIDpzZXNzaW9uIHNlY3Rpb24gZm9yIHVybDogJHtyZW1haW5pbmdVcmx9YCk7XG4gICAgfVxuICAgIHJlbWFpbmluZ1VybCA9IHJlbWFpbmluZ1VybC5yZXBsYWNlKC9cXC8kLywgJycpOyAvLyBjYW4ndCBoYXZlIHRyYWlsaW5nIHNsYXNoZXNcblxuICAgIHJldHVybiBwcm94eUJhc2UgKyByZW1haW5pbmdVcmw7XG4gIH1cblxuICBhc3luYyBwcm94eSAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgbWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgbmV3VXJsID0gdGhpcy5nZXRVcmxGb3JQcm94eSh1cmwpO1xuICAgIGNvbnN0IHRydW5jYXRlQm9keSA9IChjb250ZW50KSA9PiBfLnRydW5jYXRlKFxuICAgICAgXy5pc1N0cmluZyhjb250ZW50KSA/IGNvbnRlbnQgOiBKU09OLnN0cmluZ2lmeShjb250ZW50KSxcbiAgICAgIHsgbGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIIH0pO1xuICAgIGNvbnN0IHJlcU9wdHMgPSB7XG4gICAgICB1cmw6IG5ld1VybCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgICAgYWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgKi8qJyxcbiAgICAgIH0sXG4gICAgICBwcm94eTogZmFsc2UsXG4gICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICBodHRwQWdlbnQ6IHRoaXMuaHR0cEFnZW50LFxuICAgICAgaHR0cHNBZ2VudDogdGhpcy5odHRwc0FnZW50LFxuICAgIH07XG4gICAgLy8gR0VUIG1ldGhvZHMgc2hvdWxkbid0IGhhdmUgYW55IGJvZHkuIE1vc3Qgc2VydmVycyBhcmUgT0sgd2l0aCB0aGlzLCBidXQgV2ViRHJpdmVyQWdlbnQgdGhyb3dzIDQwMCBlcnJvcnNcbiAgICBpZiAodXRpbC5oYXNWYWx1ZShib2R5KSAmJiBtZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICBpZiAodHlwZW9mIGJvZHkgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVxT3B0cy5kYXRhID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGludGVycHJldCB0aGUgcmVxdWVzdCBib2R5IGFzIHZhbGlkIEpTT046ICR7dHJ1bmNhdGVCb2R5KGJvZHkpfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXFPcHRzLmRhdGEgPSBib2R5O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubG9nLmRlYnVnKGBQcm94eWluZyBbJHttZXRob2R9ICR7dXJsIHx8ICcvJ31dIHRvIFske21ldGhvZH0gJHtuZXdVcmx9XSBgICtcbiAgICAgIChyZXFPcHRzLmRhdGEgPyBgd2l0aCBib2R5OiAke3RydW5jYXRlQm9keShyZXFPcHRzLmRhdGEpfWAgOiAnd2l0aCBubyBib2R5JykpO1xuXG4gICAgY29uc3QgdGhyb3dQcm94eUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFRoZSByZXF1ZXN0IHRvICR7dXJsfSBoYXMgZmFpbGVkYCk7XG4gICAgICBlcnIucmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IGVycm9yLFxuICAgICAgICBzdGF0dXM6IDUwMFxuICAgICAgfTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9O1xuICAgIGxldCBpc1Jlc3BvbnNlTG9nZ2VkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtkYXRhLCBzdGF0dXMsIGhlYWRlcnN9ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHJlcU9wdHMpO1xuICAgICAgLy8gYGRhdGFgIG1pZ2h0IGJlIHJlYWxseSBiaWdcbiAgICAgIC8vIEJlIGNhcmVmdWwgd2hpbGUgaGFuZGxpbmcgaXQgdG8gYXZvaWQgbWVtb3J5IGxlYWtzXG4gICAgICBpZiAoIV8uaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgICAgICAvLyBUaGUgcmVzcG9uc2Ugc2hvdWxkIGJlIGEgdmFsaWQgSlNPTiBvYmplY3RcbiAgICAgICAgLy8gSWYgaXQgY2Fubm90IGJlIGNvZXJjZWQgdG8gYW4gb2JqZWN0IHRoZW4gdGhlIHJlc3BvbnNlIGlzIHdyb25nXG4gICAgICAgIHRocm93UHJveHlFcnJvcihkYXRhKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBHb3QgcmVzcG9uc2Ugd2l0aCBzdGF0dXMgJHtzdGF0dXN9OiAke3RydW5jYXRlQm9keShkYXRhKX1gKTtcbiAgICAgIGlzUmVzcG9uc2VMb2dnZWQgPSB0cnVlO1xuICAgICAgY29uc3QgaXNTZXNzaW9uQ3JlYXRpb25SZXF1ZXN0ID0gL1xcL3Nlc3Npb24kLy50ZXN0KHVybCkgJiYgbWV0aG9kID09PSAnUE9TVCc7XG4gICAgICBpZiAoaXNTZXNzaW9uQ3JlYXRpb25SZXF1ZXN0KSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gZGF0YS5zZXNzaW9uSWQgfHwgKGRhdGEudmFsdWUgfHwge30pLnNlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvd25zdHJlYW1Qcm90b2NvbCA9IHRoaXMuZ2V0UHJvdG9jb2xGcm9tUmVzQm9keShkYXRhKTtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgRGV0ZXJtaW5lZCB0aGUgZG93bnN0cmVhbSBwcm90b2NvbCBhcyAnJHt0aGlzLmRvd25zdHJlYW1Qcm90b2NvbH0nYCk7XG4gICAgICB9XG4gICAgICBpZiAoXy5oYXMoZGF0YSwgJ3N0YXR1cycpICYmIHBhcnNlSW50KGRhdGEuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgLy8gU29tZSBzZXJ2ZXJzLCBsaWtlIGNocm9tZWRyaXZlciBtYXkgcmV0dXJuIHJlc3BvbnNlIGNvZGUgMjAwIGZvciBub24temVybyBKU09OV1Agc3RhdHVzZXNcbiAgICAgICAgdGhyb3dQcm94eUVycm9yKGRhdGEpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID0ge3N0YXR1c0NvZGU6IHN0YXR1cywgaGVhZGVycywgYm9keTogZGF0YX07XG4gICAgICByZXR1cm4gW3JlcywgZGF0YV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gV2Ugb25seSBjb25zaWRlciBhbiBlcnJvciB1bmV4cGVjdGVkIGlmIHRoaXMgd2FzIG5vdFxuICAgICAgLy8gYW4gYXN5bmMgcmVxdWVzdCBtb2R1bGUgZXJyb3Igb3IgaWYgdGhlIHJlc3BvbnNlIGNhbm5vdCBiZSBjYXN0IHRvXG4gICAgICAvLyBhIHZhbGlkIEpTT05cbiAgICAgIGxldCBwcm94eUVycm9yTXNnID0gZS5tZXNzYWdlO1xuICAgICAgaWYgKHV0aWwuaGFzVmFsdWUoZS5yZXNwb25zZSkpIHtcbiAgICAgICAgaWYgKCFpc1Jlc3BvbnNlTG9nZ2VkKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSB0cnVuY2F0ZUJvZHkoZS5yZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKHV0aWwuaGFzVmFsdWUoZS5yZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgICA/IGBHb3QgcmVzcG9uc2Ugd2l0aCBzdGF0dXMgJHtlLnJlc3BvbnNlLnN0YXR1c306ICR7ZXJyb3J9YFxuICAgICAgICAgICAgOiBgR290IHJlc3BvbnNlIHdpdGggdW5rbm93biBzdGF0dXM6ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3h5RXJyb3JNc2cgPSBgQ291bGQgbm90IHByb3h5IGNvbW1hbmQgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgICBpZiAoQ09NUEFDVF9FUlJPUl9QQVRURVJOUy5zb21lKChwKSA9PiBwLnRlc3QoZS5tZXNzYWdlKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGUubWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcihwcm94eUVycm9yTXNnLCBlLnJlc3BvbnNlPy5kYXRhLCBlLnJlc3BvbnNlPy5zdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIGdldFByb3RvY29sRnJvbVJlc0JvZHkgKHJlc09iaikge1xuICAgIGlmIChfLmlzSW50ZWdlcihyZXNPYmouc3RhdHVzKSkge1xuICAgICAgcmV0dXJuIE1KU09OV1A7XG4gICAgfVxuICAgIGlmICghXy5pc1VuZGVmaW5lZChyZXNPYmoudmFsdWUpKSB7XG4gICAgICByZXR1cm4gVzNDO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RUb0NvbW1hbmROYW1lICh1cmwsIG1ldGhvZCkge1xuICAgIGNvbnN0IGV4dHJhY3RDb21tYW5kTmFtZSA9IChwYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXRoTWF0Y2ggPSBwYXR0ZXJuLmV4ZWModXJsKTtcbiAgICAgIHJldHVybiBwYXRoTWF0Y2ggPyByb3V0ZVRvQ29tbWFuZE5hbWUocGF0aE1hdGNoWzFdLCBtZXRob2QsIHRoaXMucmVxQmFzZVBhdGgpIDogbnVsbDtcbiAgICB9O1xuICAgIGxldCBjb21tYW5kTmFtZSA9IHJvdXRlVG9Db21tYW5kTmFtZSh1cmwsIG1ldGhvZCwgdGhpcy5yZXFCYXNlUGF0aCk7XG4gICAgaWYgKCFjb21tYW5kTmFtZSAmJiBfLmluY2x1ZGVzKHVybCwgYCR7dGhpcy5yZXFCYXNlUGF0aH0vc2Vzc2lvbi9gKSkge1xuICAgICAgY29tbWFuZE5hbWUgPSBleHRyYWN0Q29tbWFuZE5hbWUobmV3IFJlZ0V4cChgJHtfLmVzY2FwZVJlZ0V4cCh0aGlzLnJlcUJhc2VQYXRoKX0vc2Vzc2lvbi9bXi9dKyguKylgKSk7XG4gICAgfVxuICAgIGlmICghY29tbWFuZE5hbWUgJiYgXy5pbmNsdWRlcyh1cmwsIHRoaXMucmVxQmFzZVBhdGgpKSB7XG4gICAgICBjb21tYW5kTmFtZSA9IGV4dHJhY3RDb21tYW5kTmFtZShuZXcgUmVnRXhwKGAke18uZXNjYXBlUmVnRXhwKHRoaXMucmVxQmFzZVBhdGgpfSgvLispYCkpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZE5hbWU7XG4gIH1cblxuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGNvbnN0IGNvbW1hbmROYW1lID0gdGhpcy5yZXF1ZXN0VG9Db21tYW5kTmFtZSh1cmwsIG1ldGhvZCk7XG4gICAgaWYgKCFjb21tYW5kTmFtZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucHJveHkodXJsLCBtZXRob2QsIGJvZHkpO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgTWF0Y2hlZCAnJHt1cmx9JyB0byBjb21tYW5kIG5hbWUgJyR7Y29tbWFuZE5hbWV9J2ApO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvdG9jb2xDb252ZXJ0ZXIuY29udmVydEFuZFByb3h5KGNvbW1hbmROYW1lLCB1cmwsIG1ldGhvZCwgYm9keSk7XG4gIH1cblxuICBhc3luYyBjb21tYW5kICh1cmwsIG1ldGhvZCwgYm9keSA9IG51bGwpIHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgbGV0IHJlc0JvZHlPYmo7XG4gICAgdHJ5IHtcbiAgICAgIFtyZXNwb25zZSwgcmVzQm9keU9ial0gPSBhd2FpdCB0aGlzLnByb3h5Q29tbWFuZCh1cmwsIG1ldGhvZCwgYm9keSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVyci5nZXRBY3R1YWxFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb25zdCBwcm90b2NvbCA9IHRoaXMuZ2V0UHJvdG9jb2xGcm9tUmVzQm9keShyZXNCb2R5T2JqKTtcbiAgICBpZiAocHJvdG9jb2wgPT09IE1KU09OV1ApIHtcbiAgICAgIC8vIEdvdCByZXNwb25zZSBpbiBNSlNPTldQIGZvcm1hdFxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDIwMCAmJiByZXNCb2R5T2JqLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVzQm9keU9iai52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IHBhcnNlSW50KHJlc0JvZHlPYmouc3RhdHVzLCAxMCk7XG4gICAgICBpZiAoIWlzTmFOKHN0YXR1cykgJiYgc3RhdHVzICE9PSAwKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gcmVzQm9keU9iai52YWx1ZTtcbiAgICAgICAgaWYgKF8uaGFzKG1lc3NhZ2UsICdtZXNzYWdlJykpIHtcbiAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKHN0YXR1cywgXy5pc0VtcHR5KG1lc3NhZ2UpID8gZ2V0U3VtbWFyeUJ5Q29kZShzdGF0dXMpIDogbWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PT0gVzNDKSB7XG4gICAgICAvLyBHb3QgcmVzcG9uc2UgaW4gVzNDIGZvcm1hdFxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDApIHtcbiAgICAgICAgcmV0dXJuIHJlc0JvZHlPYmoudmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KHJlc0JvZHlPYmoudmFsdWUpICYmIHJlc0JvZHlPYmoudmFsdWUuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JGcm9tVzNDSnNvbkNvZGUocmVzQm9keU9iai52YWx1ZS5lcnJvciwgcmVzQm9keU9iai52YWx1ZS5tZXNzYWdlLCByZXNCb2R5T2JqLnZhbHVlLnN0YWNrdHJhY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAvLyBVbmtub3duIHByb3RvY29sLiBLZWVwaW5nIGl0IGJlY2F1c2Ugb2YgdGhlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgIHJldHVybiByZXNCb2R5T2JqO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25FcnJvcihgRGlkIG5vdCBrbm93IHdoYXQgdG8gZG8gd2l0aCByZXNwb25zZSBjb2RlICcke3Jlc3BvbnNlLnN0YXR1c0NvZGV9JyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYW5kIHJlc3BvbnNlIGJvZHkgJyR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShyZXNCb2R5T2JqKSwge2xlbmd0aDogMzAwfSl9J2ApO1xuICB9XG5cbiAgZ2V0U2Vzc2lvbklkRnJvbVVybCAodXJsKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goL1xcL3Nlc3Npb25cXC8oW14vXSspLyk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xuICB9XG5cbiAgYXN5bmMgcHJveHlSZXFSZXMgKHJlcSwgcmVzKSB7XG4gICAgY29uc3QgW3Jlc3BvbnNlLCByZXNCb2R5T2JqXSA9IGF3YWl0IHRoaXMucHJveHlDb21tYW5kKHJlcS5vcmlnaW5hbFVybCwgcmVxLm1ldGhvZCwgcmVxLmJvZHkpO1xuXG4gICAgcmVzLmhlYWRlcnMgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgIHJlcy5zZXQoJ2NvbnRlbnQtdHlwZScsIHJlc3BvbnNlLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKTtcbiAgICAvLyBpZiB0aGUgcHJveGllZCByZXNwb25zZSBjb250YWlucyBhIHNlc3Npb25JZCB0aGF0IHRoZSBkb3duc3RyZWFtXG4gICAgLy8gZHJpdmVyIGhhcyBnZW5lcmF0ZWQsIHdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoYXQgdG8gdGhlIGNsaWVudC5cbiAgICAvLyBJbnN0ZWFkLCByZXR1cm4gdGhlIGlkIGZyb20gdGhlIHJlcXVlc3Qgb3IgZnJvbSBjdXJyZW50IHNlc3Npb25cbiAgICBjb25zdCByZXFTZXNzaW9uSWQgPSB0aGlzLmdldFNlc3Npb25JZEZyb21VcmwocmVxLm9yaWdpbmFsVXJsKTtcbiAgICBpZiAoXy5oYXMocmVzQm9keU9iaiwgJ3Nlc3Npb25JZCcpKSB7XG4gICAgICBpZiAocmVxU2Vzc2lvbklkKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFJlcGxhY2luZyBzZXNzaW9uSWQgJHtyZXNCb2R5T2JqLnNlc3Npb25JZH0gd2l0aCAke3JlcVNlc3Npb25JZH1gKTtcbiAgICAgICAgcmVzQm9keU9iai5zZXNzaW9uSWQgPSByZXFTZXNzaW9uSWQ7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2Vzc2lvbklkKSB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFJlcGxhY2luZyBzZXNzaW9uSWQgJHtyZXNCb2R5T2JqLnNlc3Npb25JZH0gd2l0aCAke3RoaXMuc2Vzc2lvbklkfWApO1xuICAgICAgICByZXNCb2R5T2JqLnNlc3Npb25JZCA9IHRoaXMuc2Vzc2lvbklkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXNCb2R5T2JqLnZhbHVlID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShyZXNCb2R5T2JqLnZhbHVlKTtcbiAgICByZXMuc3RhdHVzKHJlc3BvbnNlLnN0YXR1c0NvZGUpLnNlbmQoSlNPTi5zdHJpbmdpZnkoZm9ybWF0U3RhdHVzKHJlc0JvZHlPYmopKSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgSldQcm94eSB9O1xuZXhwb3J0IGRlZmF1bHQgSldQcm94eTtcbiJdLCJmaWxlIjoibGliL2pzb253cC1wcm94eS9wcm94eS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
@@ -29,7 +29,7 @@ var _helpers = require("./helpers");
|
|
|
29
29
|
|
|
30
30
|
var _constants = require("../constants");
|
|
31
31
|
|
|
32
|
-
var
|
|
32
|
+
var _capabilities = require("../helpers/capabilities");
|
|
33
33
|
|
|
34
34
|
const CREATE_SESSION_COMMAND = 'createSession';
|
|
35
35
|
exports.CREATE_SESSION_COMMAND = CREATE_SESSION_COMMAND;
|
|
@@ -42,24 +42,44 @@ class Protocol {}
|
|
|
42
42
|
|
|
43
43
|
exports.Protocol = Protocol;
|
|
44
44
|
|
|
45
|
-
function determineProtocol(
|
|
46
|
-
return _lodash.default.
|
|
45
|
+
function determineProtocol(createSessionArgs) {
|
|
46
|
+
return _lodash.default.some(createSessionArgs, _capabilities.isW3cCaps) ? _constants.PROTOCOLS.W3C : _constants.PROTOCOLS.MJSONWP;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
function extractProtocol(driver, sessionId = null) {
|
|
50
|
+
var _dstDriver$protocol;
|
|
51
|
+
|
|
50
52
|
const dstDriver = _lodash.default.isFunction(driver.driverForSession) ? driver.driverForSession(sessionId) : driver;
|
|
51
53
|
|
|
52
54
|
if (dstDriver === driver) {
|
|
53
55
|
return driver.protocol;
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
return dstDriver ? dstDriver.protocol :
|
|
58
|
+
return (_dstDriver$protocol = dstDriver === null || dstDriver === void 0 ? void 0 : dstDriver.protocol) !== null && _dstDriver$protocol !== void 0 ? _dstDriver$protocol : _constants.PROTOCOLS.W3C;
|
|
57
59
|
}
|
|
58
60
|
|
|
59
61
|
function isSessionCommand(command) {
|
|
60
62
|
return !_lodash.default.includes(_routes.NO_SESSION_ID_COMMANDS, command);
|
|
61
63
|
}
|
|
62
64
|
|
|
65
|
+
function getLogger(driver, sessionId = null) {
|
|
66
|
+
var _driver$driverForSess, _dstDriver$log;
|
|
67
|
+
|
|
68
|
+
const dstDriver = sessionId && _lodash.default.isFunction(driver.driverForSession) ? (_driver$driverForSess = driver.driverForSession(sessionId)) !== null && _driver$driverForSess !== void 0 ? _driver$driverForSess : driver : driver;
|
|
69
|
+
|
|
70
|
+
if (_lodash.default.isFunction((_dstDriver$log = dstDriver.log) === null || _dstDriver$log === void 0 ? void 0 : _dstDriver$log.info)) {
|
|
71
|
+
return dstDriver.log;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let logPrefix = dstDriver.constructor ? `${dstDriver.constructor.name}@${_support.node.getObjectId(dstDriver).substring(0, 8)}` : 'AppiumDriver';
|
|
75
|
+
|
|
76
|
+
if (sessionId) {
|
|
77
|
+
logPrefix += ` (${sessionId.substring(0, 8)})`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return _support.logger.getLogger(logPrefix);
|
|
81
|
+
}
|
|
82
|
+
|
|
63
83
|
function wrapParams(paramSets, jsonObj) {
|
|
64
84
|
let res = jsonObj;
|
|
65
85
|
|
|
@@ -166,11 +186,11 @@ function makeArgs(requestParams, jsonObj, payloadParams, protocol) {
|
|
|
166
186
|
|
|
167
187
|
function routeConfiguringFunction(driver) {
|
|
168
188
|
if (!driver.sessionExists) {
|
|
169
|
-
throw new Error('Drivers
|
|
189
|
+
throw new Error('Drivers must implement `sessionExists` property');
|
|
170
190
|
}
|
|
171
191
|
|
|
172
192
|
if (!(driver.executeCommand || driver.execute)) {
|
|
173
|
-
throw new Error('Drivers
|
|
193
|
+
throw new Error('Drivers must implement `executeCommand` or `execute` method');
|
|
174
194
|
}
|
|
175
195
|
|
|
176
196
|
return function addRoutes(app, {
|
|
@@ -211,8 +231,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
|
|
|
211
231
|
return;
|
|
212
232
|
}
|
|
213
233
|
|
|
214
|
-
|
|
215
|
-
|
|
234
|
+
getLogger(driver, req.params.sessionId).debug(`Would have proxied ` + `command directly, but a plugin exists which might require its value, so will let ` + `its value be collected internally and made part of plugin chain`);
|
|
216
235
|
didPluginOverrideProxy = true;
|
|
217
236
|
}
|
|
218
237
|
|
|
@@ -229,7 +248,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
|
|
|
229
248
|
}
|
|
230
249
|
|
|
231
250
|
if (spec.command === CREATE_SESSION_COMMAND) {
|
|
232
|
-
currentProtocol = determineProtocol(
|
|
251
|
+
currentProtocol = determineProtocol(makeArgs(req.params, jsonObj, spec.payloadParams || {}));
|
|
233
252
|
}
|
|
234
253
|
|
|
235
254
|
checkParams(spec.payloadParams, jsonObj, currentProtocol);
|
|
@@ -240,7 +259,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
|
|
|
240
259
|
_validators.validators[spec.command](...args);
|
|
241
260
|
}
|
|
242
261
|
|
|
243
|
-
|
|
262
|
+
getLogger(driver, req.params.sessionId).debug(`Calling ` + `${driver.constructor.name}.${spec.command}() with args: ` + _lodash.default.truncate(JSON.stringify(args), {
|
|
244
263
|
length: _constants.MAX_LOG_BODY_LENGTH
|
|
245
264
|
}));
|
|
246
265
|
|
|
@@ -265,10 +284,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
|
|
|
265
284
|
|
|
266
285
|
if (spec.command === CREATE_SESSION_COMMAND) {
|
|
267
286
|
newSessionId = driverRes[0];
|
|
268
|
-
|
|
269
|
-
_sessionsCache.default.putSession(newSessionId, currentProtocol);
|
|
270
|
-
|
|
271
|
-
_sessionsCache.default.getLogger(newSessionId, currentProtocol).debug(`Cached the protocol value '${currentProtocol}' for the new session ${newSessionId}`);
|
|
287
|
+
getLogger(driver, newSessionId).debug(`Cached the protocol value '${currentProtocol}' for the new session ${newSessionId}`);
|
|
272
288
|
|
|
273
289
|
if (currentProtocol === _constants.PROTOCOLS.MJSONWP) {
|
|
274
290
|
driverRes = driverRes[1];
|
|
@@ -282,12 +298,10 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
|
|
|
282
298
|
driverRes = (0, _helpers.formatResponseValue)(driverRes);
|
|
283
299
|
|
|
284
300
|
if (spec.command === DELETE_SESSION_COMMAND) {
|
|
285
|
-
|
|
301
|
+
getLogger(driver, req.params.sessionId).debug(`Received response: ${_lodash.default.truncate(JSON.stringify(driverRes), {
|
|
286
302
|
length: _constants.MAX_LOG_BODY_LENGTH
|
|
287
303
|
})}`);
|
|
288
|
-
|
|
289
|
-
_sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug('But deleting session, so not returning');
|
|
290
|
-
|
|
304
|
+
getLogger(driver, req.params.sessionId).debug('But deleting session, so not returning');
|
|
291
305
|
driverRes = null;
|
|
292
306
|
}
|
|
293
307
|
|
|
@@ -300,14 +314,9 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
|
|
|
300
314
|
}
|
|
301
315
|
|
|
302
316
|
httpResBody.value = driverRes;
|
|
303
|
-
|
|
304
|
-
_sessionsCache.default.getLogger(req.params.sessionId || newSessionId, currentProtocol).debug(`Responding ` + `to client with driver.${spec.command}() result: ${_lodash.default.truncate(JSON.stringify(driverRes), {
|
|
317
|
+
getLogger(driver, req.params.sessionId || newSessionId).debug(`Responding ` + `to client with driver.${spec.command}() result: ${_lodash.default.truncate(JSON.stringify(driverRes), {
|
|
305
318
|
length: _constants.MAX_LOG_BODY_LENGTH
|
|
306
319
|
})}`);
|
|
307
|
-
|
|
308
|
-
if (spec.command === DELETE_SESSION_COMMAND) {
|
|
309
|
-
_sessionsCache.default.resetLogger(req.params.sessionId);
|
|
310
|
-
}
|
|
311
320
|
} catch (err) {
|
|
312
321
|
let actualErr = err;
|
|
313
322
|
currentProtocol = currentProtocol || extractProtocol(driver, req.params.sessionId || newSessionId);
|
|
@@ -320,7 +329,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
|
|
|
320
329
|
if ((0, _errors.isErrorType)(err, _errors.errors.ProxyRequestError)) {
|
|
321
330
|
actualErr = err.getActualError();
|
|
322
331
|
} else {
|
|
323
|
-
|
|
332
|
+
getLogger(driver, req.params.sessionId || newSessionId).debug(`Encountered internal error running command: ${errMsg}`);
|
|
324
333
|
}
|
|
325
334
|
|
|
326
335
|
[httpStatus, httpResBody] = (0, _errors.getResponseForW3CError)(actualErr);
|
|
@@ -370,7 +379,7 @@ function driverShouldDoJwpProxy(driver, req, command) {
|
|
|
370
379
|
}
|
|
371
380
|
|
|
372
381
|
async function doJwpProxy(driver, req, res) {
|
|
373
|
-
|
|
382
|
+
getLogger(driver, req.params.sessionId).info('Driver proxy active, passing request on via HTTP proxy');
|
|
374
383
|
|
|
375
384
|
if (!driver.canProxy(req.params.sessionId)) {
|
|
376
385
|
throw new Error('Trying to proxy to a server but the driver is unable to proxy');
|
|
@@ -388,4 +397,4 @@ async function doJwpProxy(driver, req, res) {
|
|
|
388
397
|
}require('source-map-support').install();
|
|
389
398
|
|
|
390
399
|
|
|
391
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJfIiwiaXNQbGFpbk9iamVjdCIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiU0VTU0lPTlNfQ0FDSEUiLCJnZXRQcm90b2NvbCIsImlzU2Vzc2lvbkNvbW1hbmQiLCJjb21tYW5kIiwiaW5jbHVkZXMiLCJOT19TRVNTSU9OX0lEX0NPTU1BTkRTIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJnZXRMb2dnZXIiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwiY29uc3RydWN0b3IiLCJuYW1lIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaGFzIiwiZXJyb3IiLCJ2YWx1ZSIsInB1dFNlc3Npb24iLCJ1dGlsIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJpc05hTiIsInBhcnNlSW50Iiwic3RhY2t0cmFjZSIsInJlc2V0TG9nZ2VyIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJQcm94eVJlcXVlc3RFcnJvciIsImdldEFjdHVhbEVycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJpbmZvIiwiY2FuUHJveHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBpc0Vycm9yVHlwZSwgZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcixcbiAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlLFxufSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBNRVRIT0RfTUFQLCBOT19TRVNTSU9OX0lEX0NPTU1BTkRTIH0gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzcG9uc2VWYWx1ZSwgZm9ybWF0U3RhdHVzLFxufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTUFYX0xPR19CT0RZX0xFTkdUSCwgUFJPVE9DT0xTLCBERUZBVUxUX0JBU0VfUEFUSCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgU0VTU0lPTlNfQ0FDSEUgZnJvbSAnLi9zZXNzaW9ucy1jYWNoZSc7XG5cblxuY29uc3QgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCA9ICdjcmVhdGVTZXNzaW9uJztcbmNvbnN0IERFTEVURV9TRVNTSU9OX0NPTU1BTkQgPSAnZGVsZXRlU2Vzc2lvbic7XG5jb25zdCBHRVRfU1RBVFVTX0NPTU1BTkQgPSAnZ2V0U3RhdHVzJztcblxuY2xhc3MgUHJvdG9jb2wge31cblxuZnVuY3Rpb24gZGV0ZXJtaW5lUHJvdG9jb2wgKGRlc2lyZWRDYXBhYmlsaXRpZXMsIHJlcXVpcmVkQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpIHtcbiAgcmV0dXJuIF8uaXNQbGFpbk9iamVjdChjYXBhYmlsaXRpZXMpID9cbiAgICBQUk9UT0NPTFMuVzNDIDpcbiAgICBQUk9UT0NPTFMuTUpTT05XUDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFByb3RvY29sIChkcml2ZXIsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3QgZHN0RHJpdmVyID0gXy5pc0Z1bmN0aW9uKGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKVxuICAgID8gZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgIDogZHJpdmVyO1xuICBpZiAoZHN0RHJpdmVyID09PSBkcml2ZXIpIHtcbiAgICAvLyBTaG9ydGNpcmN1aXQgaWYgdGhlIGRyaXZlciBpbnN0YW5jZSBpcyBub3QgYW4gdW1icmVsbGEgZHJpdmVyXG4gICAgLy8gb3IgaXQgaXMgRmFrZSBkcml2ZXIgaW5zdGFuY2UsIHdoZXJlIGBkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbmBcbiAgICAvLyBhbHdheXMgcmV0dXJucyBzZWxmIGluc3RhbmNlXG4gICAgcmV0dXJuIGRyaXZlci5wcm90b2NvbDtcbiAgfVxuXG4gIC8vIEV4dHJhY3QgdGhlIHByb3RvY29sIGZvciB0aGUgY3VycmVudCBzZXNzaW9uIGlmIHRoZSBnaXZlbiBkcml2ZXIgaXMgdGhlIHVtYnJlbGxhIG9uZVxuICByZXR1cm4gZHN0RHJpdmVyID8gZHN0RHJpdmVyLnByb3RvY29sIDogU0VTU0lPTlNfQ0FDSEUuZ2V0UHJvdG9jb2woc2Vzc2lvbklkKTtcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gIV8uaW5jbHVkZXMoTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgY29tbWFuZCk7XG59XG5cbmZ1bmN0aW9uIHdyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBzZXROZXR3b3JrQ29ubmVjdGlvbiB3aGljaCBzZW5kIHBhcmFtZXRlcnMgd3JhcHBlZCBpbnNpZGUgYSBrZXkgc3VjaCBhc1xuICAgKiBcInBhcmFtZXRlcnNcIi4gVGhpcyBmdW5jdGlvbiB1bndyYXBzIHRoZW0gKGVnLiB7XCJwYXJhbWV0ZXJzXCI6IHtcInR5cGVcIjogMX19IGJlY29tZXMge1widHlwZVwiOiAxfSkuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICAvLyBzb21lIGNsaWVudHMsIGxpa2UgcnVieSwgZG9uJ3Qgd3JhcFxuICAgIGlmIChqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdKSB7XG4gICAgICByZXMgPSBqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqLCBwcm90b2NvbCkge1xuICBsZXQgcmVxdWlyZWRQYXJhbXMgPSBbXTtcbiAgbGV0IG9wdGlvbmFsUGFyYW1zID0gW107XG4gIGxldCByZWNlaXZlZFBhcmFtcyA9IF8ua2V5cyhqc29uT2JqKTtcblxuICBpZiAocGFyYW1TZXRzKSB7XG4gICAgaWYgKHBhcmFtU2V0cy5yZXF1aXJlZCkge1xuICAgICAgLy8gd2UgbWlnaHQgaGF2ZSBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLFxuICAgICAgLy8gb3IgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIHBhcmFtZXRlcnMsIHNvIHN0YW5kYXJkaXplXG4gICAgICBpZiAoIV8uaXNBcnJheShfLmZpcnN0KHBhcmFtU2V0cy5yZXF1aXJlZCkpKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gW3BhcmFtU2V0cy5yZXF1aXJlZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IHBhcmFtU2V0cy5yZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUganVzdCBhbiBhcnJheVxuICAgIGlmIChwYXJhbVNldHMub3B0aW9uYWwpIHtcbiAgICAgIG9wdGlvbmFsUGFyYW1zID0gcGFyYW1TZXRzLm9wdGlvbmFsO1xuICAgIH1cblxuICAgIC8vIElmIGEgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGFzIHRoZSAndmFsaWRhdGUnIGtleSwgaXQgd2lsbCBoZXJlIGJlIGNhbGxlZCB3aXRoXG4gICAgLy8ganNvbk9iaiBhcyB0aGUgcGFyYW0uIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGZhbHN5LCB2ZXJpZmljYXRpb24gd2lsbCBiZVxuICAgIC8vIGNvbnNpZGVyZWQgdG8gaGF2ZSBwYXNzZWQuIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGVsc2UsIHRoYXQgd2lsbCBiZSB0aGVcbiAgICAvLyBhcmd1bWVudCB0byBhbiBlcnJvciB3aGljaCBpcyB0aHJvd24gdG8gdGhlIHVzZXJcbiAgICBpZiAocGFyYW1TZXRzLnZhbGlkYXRlKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IHBhcmFtU2V0cy52YWxpZGF0ZShqc29uT2JqLCBwcm90b2NvbCk7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihtZXNzYWdlLCBqc29uT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpZiB3ZSBoYXZlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFsbCBpcyB3ZWxsXG4gIGlmIChyZXF1aXJlZFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiB0aGUgc2Vzc2lvbiBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdzZXNzaW9uSWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdzZXNzaW9uSWQnKTtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIGFuIGVsZW1lbnQgaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignaWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdpZCcpO1xuICB9XG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgY2hlY2sgYWdhaW5zdCBvdXIgYXJndW1lbnRzXG4gIGZvciAobGV0IHBhcmFtcyBvZiByZXF1aXJlZFBhcmFtcykge1xuICAgIGlmIChfLmRpZmZlcmVuY2UocmVjZWl2ZWRQYXJhbXMsIHBhcmFtcywgb3B0aW9uYWxQYXJhbXMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBfLmRpZmZlcmVuY2UocGFyYW1zLCByZWNlaXZlZFBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBoYXZlIGEgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCBpcyBjb3JyZWN0XG4gICAgICAvLyBzbyBzaG9ydC1jaXJjdWl0XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKHBhcmFtU2V0cywgcmVjZWl2ZWRQYXJhbXMpO1xufVxuXG4vKlxuICogVGhpcyBtZXRob2QgdGFrZXMgMyBwaWVjZXMgb2YgZGF0YTogcmVxdWVzdCBwYXJhbWV0ZXJzICgncmVxdWVzdFBhcmFtcycpLFxuICogYSByZXF1ZXN0IEpTT04gYm9keSAoJ2pzb25PYmonKSwgYW5kICdwYXlsb2FkUGFyYW1zJywgd2hpY2ggaXMgdGhlIHNlY3Rpb25cbiAqIGZyb20gdGhlIHJvdXRlIGRlZmluaXRpb24gZm9yIGEgcGFydGljdWxhciBlbmRwb2ludCB3aGljaCBoYXMgaW5zdHJ1Y3Rpb25zXG4gKiBvbiBoYW5kbGluZyBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsXG4gKiBiZSBhcHBsaWVkIHRvIGEgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gbWFrZUFyZ3MgKHJlcXVlc3RQYXJhbXMsIGpzb25PYmosIHBheWxvYWRQYXJhbXMsIHByb3RvY29sKSB7XG4gIC8vIFdlIHdhbnQgdG8gcGFzcyB0aGUgXCJ1cmxcIiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kcyBpbiByZXZlcnNlIG9yZGVyXG4gIC8vIHNpbmNlIHRoZSBjb21tYW5kIHdpbGwgc29tZXRpbWVzIHdhbnQgdG8gaWdub3JlLCBzYXksIHRoZSBzZXNzaW9uSWQuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHV0dGluZyBzZXNzaW9uSWQgbGFzdCwgd2hpY2ggbWVhbnMgaW4gSlMgd2UgY2FuXG4gIC8vIG9taXQgaXQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuXG4gIGxldCB1cmxQYXJhbXMgPSBfLmtleXMocmVxdWVzdFBhcmFtcykucmV2ZXJzZSgpO1xuXG4gIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIGEgYmFzaWMgYXJyYXkgaW5cbiAgLy8gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gc3RhcnQgdGhlcmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBhcmVcbiAgLy8gbXVsdGlwbGUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRob3VnaCwgc28gaGFuZGxlIHRoYXQgY2FzZVxuICAvLyB0b28uXG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IHBheWxvYWRQYXJhbXMucmVxdWlyZWQ7XG4gIGlmIChfLmlzQXJyYXkoXy5maXJzdChwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSkpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRoZW4gd2Ugd2lsbCBoYXZlIGFuXG4gICAgLy8gYXJyYXkgb2YgYXJyYXlzIGluIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIGxvb3AgdGhyb3VnaCBlYWNoIHNldCBhbmRcbiAgICAvLyBwaWNrIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHdoaWNoIEpTT04gcGFyYW1zIHdlcmUgYWN0dWFsbHkgc2VudC4gV2UndmVcbiAgICAvLyBhbHJlYWR5IGJlZW4gdGhyb3VnaCB2YWxpZGF0aW9uIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZmluZCBhIG1hdGNoLlxuICAgIGxldCBrZXlzID0gXy5rZXlzKGpzb25PYmopO1xuICAgIGZvciAobGV0IHBhcmFtcyBvZiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy53aXRob3V0KHBhcmFtcywgLi4ua2V5cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBOb3cgd2UgY29uc3RydWN0IG91ciBsaXN0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICBsZXQgYXJncztcbiAgaWYgKF8uaXNGdW5jdGlvbihwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKSkge1xuICAgIC8vIEluIHRoZSByb3V0ZSBzcGVjLCBhIHBhcnRpY3VsYXIgcm91dGUgbWlnaHQgZGVmaW5lIGEgJ21ha2VBcmdzJyBmdW5jdGlvblxuICAgIC8vIGlmIGl0IHdhbnRzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0byB0dXJuIEpTT04gcGFyYW1ldGVycyBpbnRvIGNvbW1hbmRcbiAgICAvLyBhcmd1bWVudHMuIFNvIHdlIHBhc3MgaXQgdGhlIEpTT04gcGFyYW1ldGVycyBhbmQgaXQgcmV0dXJucyBhbiBhcnJheVxuICAgIC8vIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgaGFuZGxpbmcgY29tbWFuZC4gRm9yIGV4YW1wbGUgaWYgaXQgcmV0dXJuc1xuICAgIC8vIFsxLCAyLCAzXSwgd2Ugd2lsbCBjYWxsIGBjb21tYW5kKDEsIDIsIDMsIC4uLilgICh1cmwgcGFyYW1zIGFyZSBzZXBhcmF0ZVxuICAgIC8vIGZyb20gSlNPTiBwYXJhbXMgYW5kIGdldCBjb25jYXRlbmF0ZWQgYmVsb3cpLlxuICAgIGFyZ3MgPSBwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKGpzb25PYmosIHByb3RvY29sKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGNvbGxlY3QgYWxsIHRoZSByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1zIGFuZCBmbGF0dGVuIHRoZW1cbiAgICAvLyBpbnRvIGFuIGFyZ3VtZW50IGFycmF5XG4gICAgYXJncyA9IF8uZmxhdHRlbihyZXF1aXJlZFBhcmFtcykubWFwKChwKSA9PiBqc29uT2JqW3BdKTtcbiAgICBpZiAocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkge1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KF8uZmxhdHRlbihwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKS5tYXAoKHApID0+IGpzb25PYmpbcF0pKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSwgZ2V0IG91ciB1cmwgcGFyYW1zIChzZXNzaW9uIGlkLCBlbGVtZW50IGlkLCBldGMuLi4pIG9uIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGxpc3RcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVybFBhcmFtcy5tYXAoKHUpID0+IHJlcXVlc3RQYXJhbXNbdV0pKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiAoZHJpdmVyKSB7XG4gIGlmICghZHJpdmVyLnNlc3Npb25FeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgdXNlZCB3aXRoIE1KU09OV1AgbXVzdCBpbXBsZW1lbnQgYHNlc3Npb25FeGlzdHNgJyk7XG4gIH1cblxuICBpZiAoIShkcml2ZXIuZXhlY3V0ZUNvbW1hbmQgfHwgZHJpdmVyLmV4ZWN1dGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEcml2ZXJzIHVzZWQgd2l0aCBNSlNPTldQIG11c3QgaW1wbGVtZW50IGBleGVjdXRlQ29tbWFuZGAgb3IgYGV4ZWN1dGVgJyk7XG4gIH1cblxuICAvLyByZXR1cm4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIGFkZCBhbGwgdGhlIHJvdXRlcyB0byB0aGUgZHJpdmVyLiBIZXJlIGV4dHJhTWV0aG9kcyBtaWdodCBiZVxuICAvLyBwYXNzZWQgaW4gYXMgZGVmaW5lZCBieSBBcHBpdW0gcGx1Z2lucywgc28gd2UgbmVlZCB0byBhZGQgdGhvc2UgdG8gdGhlIGRlZmF1bHQgbGlzdFxuICByZXR1cm4gZnVuY3Rpb24gYWRkUm91dGVzIChhcHAsIHtiYXNlUGF0aCA9IERFRkFVTFRfQkFTRV9QQVRILCBleHRyYU1ldGhvZE1hcCA9IHt9fSkge1xuICAgIC8vIHN0b3JlIGJhc2VQYXRoIG9uIHRoZSBkcml2ZXIgaW5zdGFuY2Ugc28gaXQgY2FuIHVzZSBpdCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmb3IgZXhhbXBsZSBpbiBkZXRlcm1pbmluZyBwcm94eSBhdm9pZGFuY2VcbiAgICBkcml2ZXIuYmFzZVBhdGggPSBiYXNlUGF0aDtcblxuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB7Li4uTUVUSE9EX01BUCwgLi4uZXh0cmFNZXRob2RNYXB9O1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgbWV0aG9kc10gb2YgXy50b1BhaXJzKGFsbE1ldGhvZHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2QsIHNwZWNdIG9mIF8udG9QYWlycyhtZXRob2RzKSkge1xuICAgICAgICAvLyBzZXQgdXAgdGhlIGV4cHJlc3Mgcm91dGUgaGFuZGxlclxuICAgICAgICBidWlsZEhhbmRsZXIoYXBwLCBtZXRob2QsIGAke2Jhc2VQYXRofSR7cGF0aH1gLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc2lvbkNvbW1hbmQoc3BlYy5jb21tYW5kKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhhbmRsZXIgKGFwcCwgbWV0aG9kLCBwYXRoLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc0NtZCkge1xuICBsZXQgYXN5bmNIYW5kbGVyID0gYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgbGV0IGpzb25PYmogPSByZXEuYm9keTtcbiAgICBsZXQgaHR0cFJlc0JvZHkgPSB7fTtcbiAgICBsZXQgaHR0cFN0YXR1cyA9IDIwMDtcbiAgICBsZXQgbmV3U2Vzc2lvbklkO1xuICAgIGxldCBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gaWYgdGhpcyBpcyBhIHNlc3Npb24gY29tbWFuZCBidXQgd2UgZG9uJ3QgaGF2ZSBhIHNlc3Npb24sXG4gICAgICAvLyBlcnJvciBvdXQgZWFybHkgKGVzcGVjaWFsbHkgYmVmb3JlIHByb3h5aW5nKVxuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhZHJpdmVyLnNlc3Npb25FeGlzdHMocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgcHJveHlpbmcgY29tbWFuZHMgdG8gYW5vdGhlciBKU09OV1Agc2VydmVyLCBieXBhc3MgYWxsIG91clxuICAgICAgLy8gY2hlY2tzIGFuZCBhc3N1bWUgdGhlIHVwc3RyZWFtIHNlcnZlciBrbm93cyB3aGF0IGl0J3MgZG9pbmcuIEJ1dCBrZWVwIHRoaXMgaW4gdGhlXG4gICAgICAvLyB0cnkvY2F0Y2ggYmxvY2sgc28gaWYgcHJveHlpbmcgaXRzZWxmIGZhaWxzLCB3ZSBnaXZlIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50LiBPZiBjb3Vyc2Ugd2VcbiAgICAgIC8vIG9ubHkgd2FudCB0byBkbyB0aGVzZSB3aGVuIHdlIGhhdmUgYSBzZXNzaW9uIGNvbW1hbmQ7IHRoZSBBcHBpdW0gZHJpdmVyIG11c3QgYmVcbiAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBzdGFydC9zdG9wIHNlc3Npb24sIGV0Yy4uLiBXZSBhbHNvIGFsbG93IHRoZSBjb21tYW5kIHNwZWMgdG8gZGVjbGFyZSB0aGF0XG4gICAgICAvLyB0aGlzIGNvbW1hbmQgc2hvdWxkIG5ldmVyIGJlIHByb3hpZWQgKHdoaWNoIGlzIHVzZWZ1bCBmb3IgcGx1Z2luIGRldmVsb3BlcnMgd2hvIGFkZFxuICAgICAgLy8gY29tbWFuZHMgYW5kIGdlbmVyYWxseSB3b3VsZCBub3Qgd2FudCB0aGF0IGNvbW1hbmQgdG8gYmUgcHJveGllZCBpbnN0ZWFkIG9mIGhhbmRsZWQgYnkgdGhlXG4gICAgICAvLyBwbHVnaW4pXG4gICAgICBsZXQgZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSA9IGZhbHNlO1xuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhc3BlYy5uZXZlclByb3h5ICYmIGRyaXZlclNob3VsZERvSndwUHJveHkoZHJpdmVyLCByZXEsIHNwZWMuY29tbWFuZCkpIHtcbiAgICAgICAgaWYgKCFkcml2ZXIucGx1Z2luc1RvSGFuZGxlQ21kIHx8XG4gICAgICAgICAgICBkcml2ZXIucGx1Z2luc1RvSGFuZGxlQ21kKHNwZWMuY29tbWFuZCwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZyhgV291bGQgaGF2ZSBwcm94aWVkIGAgK1xuICAgICAgICAgIGBjb21tYW5kIGRpcmVjdGx5LCBidXQgYSBwbHVnaW4gZXhpc3RzIHdoaWNoIG1pZ2h0IHJlcXVpcmUgaXRzIHZhbHVlLCBzbyB3aWxsIGxldCBgICtcbiAgICAgICAgICBgaXRzIHZhbHVlIGJlIGNvbGxlY3RlZCBpbnRlcm5hbGx5IGFuZCBtYWRlIHBhcnQgb2YgcGx1Z2luIGNoYWluYCk7XG4gICAgICAgIGRpZFBsdWdpbk92ZXJyaWRlUHJveHkgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBhIGNvbW1hbmQgaXMgbm90IGluIG91ciBtZXRob2QgbWFwLCBpdCdzIGJlY2F1c2Ugd2VcbiAgICAgIC8vIGhhdmUgbm8gcGxhbnMgdG8gZXZlciBpbXBsZW1lbnQgaXRcbiAgICAgIGlmICghc3BlYy5jb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyB3cmFwIHBhcmFtcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChzcGVjLnBheWxvYWRQYXJhbXMgJiYgc3BlYy5wYXlsb2FkUGFyYW1zLndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHdyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgLy8gdW53cmFwIHBhcmFtcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChzcGVjLnBheWxvYWRQYXJhbXMgJiYgc3BlYy5wYXlsb2FkUGFyYW1zLnVud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gdW53cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGRldGVybWluZSBwcm90b2NvbCBieSBzZXNzaW9uIGNyZWF0aW9uIGFyZ3MsIHNvIHdlIGNhbiB0aHJvdyBhXG4gICAgICAgIC8vIHByb3Blcmx5IGZvcm1hdHRlZCBlcnJvciBpZiBhcmd1bWVudHMgdmFsaWRhdGlvbiBmYWlsc1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkZXRlcm1pbmVQcm90b2NvbCguLi5tYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30pKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGpzb24gcGF5bG9hZCBjb25mb3JtcyB0byB0aGUgc3BlY1xuICAgICAgY2hlY2tQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqLCBjdXJyZW50UHJvdG9jb2wpO1xuXG4gICAgICAvLyB0dXJuIHRoZSBjb21tYW5kIGFuZCBqc29uIHBheWxvYWQgaW50byBhbiBhcmd1bWVudCBsaXN0IGZvclxuICAgICAgLy8gdGhlIGRyaXZlciBtZXRob2RzXG4gICAgICBsZXQgYXJncyA9IG1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSwgY3VycmVudFByb3RvY29sKTtcbiAgICAgIGxldCBkcml2ZXJSZXM7XG4gICAgICAvLyB2YWxpZGF0ZSBjb21tYW5kIGFyZ3MgYWNjb3JkaW5nIHRvIE1KU09OV1BcbiAgICAgIGlmICh2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0pIHtcbiAgICAgICAgdmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBydW4gdGhlIGRyaXZlciBjb21tYW5kIHdyYXBwZWQgaW5zaWRlIHRoZSBhcmd1bWVudCB2YWxpZGF0b3JzXG4gICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoYENhbGxpbmcgYCArXG4gICAgICAgIGAke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfS4ke3NwZWMuY29tbWFuZH0oKSB3aXRoIGFyZ3M6IGAgK1xuICAgICAgICBfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGFyZ3MpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSkpO1xuXG4gICAgICBpZiAoZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSkge1xuICAgICAgICAvLyBUT0RPIGZvciBub3cgd2UgYWRkIHRoaXMgaW5mb3JtYXRpb24gb24gdGhlIGFyZ3MgbGlzdCwgYnV0IHRoYXQncyBtaXhpbmcgcHVycG9zZXMgaGVyZS5cbiAgICAgICAgLy8gV2UgcmVhbGx5IHNob3VsZCBhZGQgYW5vdGhlciAnb3B0aW9ucycgcGFyYW1ldGVyIHRvICdleGVjdXRlQ29tbWFuZCcsIGJ1dCB0aGlzIHdvdWxkIGJlXG4gICAgICAgIC8vIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBhbGwgZHJpdmVycyBzbyB3b3VsZCBuZWVkIHRvIGJlIGhhbmRsZWQgY2FyZWZ1bGx5LlxuICAgICAgICBhcmdzLnB1c2goe3JlcUZvclByb3h5OiByZXF9KTtcbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVDb21tYW5kKHNwZWMuY29tbWFuZCwgLi4uYXJncyk7XG5cbiAgICAgIC8vIEdldCB0aGUgcHJvdG9jb2wgYWZ0ZXIgZXhlY3V0ZUNvbW1hbmRcbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKSB8fCBjdXJyZW50UHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIGBleGVjdXRlQ29tbWFuZGAgd2FzIG92ZXJyaWRkZW4gYW5kIHRoZSBtZXRob2QgcmV0dXJucyBhbiBvYmplY3RcbiAgICAgIC8vIHdpdGggYSBwcm90b2NvbCBhbmQgdmFsdWUvZXJyb3IgcHJvcGVydHksIHJlLWFzc2lnbiB0aGUgcHJvdG9jb2xcbiAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzKSAmJiBfLmhhcyhkcml2ZXJSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRyaXZlclJlcy5wcm90b2NvbCB8fCBjdXJyZW50UHJvdG9jb2w7XG4gICAgICAgIGlmIChkcml2ZXJSZXMuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBkcml2ZXJSZXMuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB1bnBhY2sgY3JlYXRlU2Vzc2lvbiByZXNwb25zZVxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBuZXdTZXNzaW9uSWQgPSBkcml2ZXJSZXNbMF07XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLnB1dFNlc3Npb24obmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIobmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YCk7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGRyaXZlclJlcyA9IHtcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZHJpdmVyUmVzWzFdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShkcml2ZXJSZXMpO1xuXG4gICAgICAvLyBkZWxldGUgc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgZXZlbiBpZiBzdWNjZXNzZnVsXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKVxuICAgICAgICAgIC5kZWJ1ZyhgUmVjZWl2ZWQgcmVzcG9uc2U6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSl9YCk7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZygnQnV0IGRlbGV0aW5nIHNlc3Npb24sIHNvIG5vdCByZXR1cm5pbmcnKTtcbiAgICAgICAgZHJpdmVyUmVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHN0YXR1cyBpcyBub3QgMCwgIHRocm93IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBmb3Igc3RhdHVzIGNvZGUuXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMpKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcy5zdGF0dXMpICYmICFpc05hTihkcml2ZXJSZXMuc3RhdHVzKSAmJiBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShkcml2ZXJSZXMuc3RhdHVzLCBkcml2ZXJSZXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMudmFsdWUpICYmIGRyaXZlclJlcy52YWx1ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKGRyaXZlclJlcy52YWx1ZS5lcnJvciwgZHJpdmVyUmVzLnZhbHVlLm1lc3NhZ2UsIGRyaXZlclJlcy52YWx1ZS5zdGFja3RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keS52YWx1ZSA9IGRyaXZlclJlcztcbiAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoYFJlc3BvbmRpbmcgYCArXG4gICAgICAgIGB0byBjbGllbnQgd2l0aCBkcml2ZXIuJHtzcGVjLmNvbW1hbmR9KCkgcmVzdWx0OiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ga2VlcCB0aGUgbG9nZ2VyIGluc3RhbmNlIGluIHRoZSBjYWNoZVxuICAgICAgICAvLyBhZnRlciB0aGUgc2Vzc2lvbiBpcyBkZWxldGVkLCBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBsb2dnaW5nIGhpc3RvcnlcbiAgICAgICAgLy8gYW5kIGNvbnN1bWVzIHRoZSBtZW1vcnlcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUucmVzZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmlndXJlIG91dCB3aGF0IG91ciByZXNwb25zZSBzaG91bGQgYmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgIGxldCBhY3R1YWxFcnIgPSBlcnI7XG5cbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGN1cnJlbnRQcm90b2NvbCB8fCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpO1xuXG4gICAgICBsZXQgZXJyTXNnID0gZXJyLnN0YWNrdHJhY2UgfHwgZXJyLnN0YWNrO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGVyck1zZywgZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBtb3JlIGluZm9ybWF0aW9uLCBhZGQgaXQuIGJ1dCBvZnRlbiB0aGUgbWVzc2FnZVxuICAgICAgICAvLyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgdHJhY2VcbiAgICAgICAgZXJyTXNnID0gYCR7ZXJyLm1lc3NhZ2V9JHtlcnJNc2cgPyAoJ1xcbicgKyBlcnJNc2cpIDogJyd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgICAgYWN0dWFsRXJyID0gZXJyLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBFbmNvdW50ZXJlZCBpbnRlcm5hbCBlcnJvciBydW5uaW5nIGNvbW1hbmQ6ICR7ZXJyTXNnfWApO1xuICAgICAgfVxuXG4gICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuICAgIH1cblxuICAgIC8vIGRlY29kZSB0aGUgcmVzcG9uc2UsIHdoaWNoIGlzIGVpdGhlciBhIHN0cmluZyBvciBqc29uXG4gICAgaWYgKF8uaXNTdHJpbmcoaHR0cFJlc0JvZHkpKSB7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLnNlbmQoaHR0cFJlc0JvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3U2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBodHRwUmVzQm9keS52YWx1ZS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBzZXNzaW9uSWQgaW4gVzNDIHJlc3BvbnNlc1xuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBkZWxldGUgaHR0cFJlc0JvZHkuc2Vzc2lvbklkO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keSA9IGZvcm1hdFN0YXR1cyhodHRwUmVzQm9keSk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgY29tbWFuZCkge1xuICAvLyBkcml2ZXJzIG5lZWQgdG8gZXhwbGljaXRseSBzYXkgd2hlbiB0aGUgcHJveHkgaXMgYWN0aXZlXG4gIGlmICghZHJpdmVyLnByb3h5QWN0aXZlKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBuZXZlciBwcm94eSBkZWxldGVTZXNzaW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIHRoZSBjb250YWluaW5nXG4gIC8vIGRyaXZlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiBpdHNlbGYgdXBcbiAgaWYgKGNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBhdm9pZGFuY2Ugc2NoZW1hLCBhbmQgc2F5IHdlIHNob3VsZG4ndCBwcm94eSBpZiBhbnl0aGluZyBpbiB0aGVcbiAgLy8gYXZvaWQgbGlzdCBtYXRjaGVzIG91ciByZXFcbiAgaWYgKGRyaXZlci5wcm94eVJvdXRlSXNBdm9pZGVkKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCByZXEubWV0aG9kLCByZXEub3JpZ2luYWxVcmwsIHJlcS5ib2R5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgcmVzKSB7XG4gIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpKVxuICAgIC5pbmZvKCdEcml2ZXIgcHJveHkgYWN0aXZlLCBwYXNzaW5nIHJlcXVlc3Qgb24gdmlhIEhUVFAgcHJveHknKTtcblxuICAvLyBjaGVjayB0aGF0IHRoZSBpbm5lciBkcml2ZXIgaGFzIGEgcHJveHkgZnVuY3Rpb25cbiAgaWYgKCFkcml2ZXIuY2FuUHJveHkocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcnlpbmcgdG8gcHJveHkgdG8gYSBzZXJ2ZXIgYnV0IHRoZSBkcml2ZXIgaXMgdW5hYmxlIHRvIHByb3h5Jyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoJ3Byb3h5UmVxUmVzJywgcmVxLCByZXMsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwcm94eS4gUHJveHkgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IHtcbiAgUHJvdG9jb2wsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgaXNTZXNzaW9uQ29tbWFuZCxcbiAgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSwgZGV0ZXJtaW5lUHJvdG9jb2wsIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsXG4gIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsIEdFVF9TVEFUVVNfQ09NTUFORCxcbn07XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|
|
400
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJjcmVhdGVTZXNzaW9uQXJncyIsIl8iLCJzb21lIiwiaXNXM2NDYXBzIiwiUFJPVE9DT0xTIiwiVzNDIiwiTUpTT05XUCIsImV4dHJhY3RQcm90b2NvbCIsImRyaXZlciIsInNlc3Npb25JZCIsImRzdERyaXZlciIsImlzRnVuY3Rpb24iLCJkcml2ZXJGb3JTZXNzaW9uIiwicHJvdG9jb2wiLCJpc1Nlc3Npb25Db21tYW5kIiwiY29tbWFuZCIsImluY2x1ZGVzIiwiTk9fU0VTU0lPTl9JRF9DT01NQU5EUyIsImdldExvZ2dlciIsImxvZyIsImluZm8iLCJsb2dQcmVmaXgiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJub2RlIiwiZ2V0T2JqZWN0SWQiLCJzdWJzdHJpbmciLCJsb2dnZXIiLCJ3cmFwUGFyYW1zIiwicGFyYW1TZXRzIiwianNvbk9iaiIsInJlcyIsImlzQXJyYXkiLCJpc09iamVjdCIsIndyYXAiLCJ1bndyYXBQYXJhbXMiLCJ1bndyYXAiLCJjaGVja1BhcmFtcyIsInJlcXVpcmVkUGFyYW1zIiwib3B0aW9uYWxQYXJhbXMiLCJyZWNlaXZlZFBhcmFtcyIsImtleXMiLCJyZXF1aXJlZCIsImZpcnN0Iiwib3B0aW9uYWwiLCJ2YWxpZGF0ZSIsIm1lc3NhZ2UiLCJlcnJvcnMiLCJCYWRQYXJhbWV0ZXJzRXJyb3IiLCJsZW5ndGgiLCJpbmRleE9mIiwicHVzaCIsInBhcmFtcyIsImRpZmZlcmVuY2UiLCJtYWtlQXJncyIsInJlcXVlc3RQYXJhbXMiLCJwYXlsb2FkUGFyYW1zIiwidXJsUGFyYW1zIiwicmV2ZXJzZSIsIndpdGhvdXQiLCJhcmdzIiwiZmxhdHRlbiIsIm1hcCIsInAiLCJjb25jYXQiLCJ1Iiwicm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIiwic2Vzc2lvbkV4aXN0cyIsIkVycm9yIiwiZXhlY3V0ZUNvbW1hbmQiLCJleGVjdXRlIiwiYWRkUm91dGVzIiwiYXBwIiwiYmFzZVBhdGgiLCJERUZBVUxUX0JBU0VfUEFUSCIsImV4dHJhTWV0aG9kTWFwIiwiYWxsTWV0aG9kcyIsIk1FVEhPRF9NQVAiLCJwYXRoIiwibWV0aG9kcyIsInRvUGFpcnMiLCJtZXRob2QiLCJzcGVjIiwiYnVpbGRIYW5kbGVyIiwiaXNTZXNzQ21kIiwiYXN5bmNIYW5kbGVyIiwicmVxIiwiYm9keSIsImh0dHBSZXNCb2R5IiwiaHR0cFN0YXR1cyIsIm5ld1Nlc3Npb25JZCIsImN1cnJlbnRQcm90b2NvbCIsIk5vU3VjaERyaXZlckVycm9yIiwiZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSIsIm5ldmVyUHJveHkiLCJkcml2ZXJTaG91bGREb0p3cFByb3h5IiwicGx1Z2luc1RvSGFuZGxlQ21kIiwiZG9Kd3BQcm94eSIsImRlYnVnIiwiTm90SW1wbGVtZW50ZWRFcnJvciIsImRyaXZlclJlcyIsInZhbGlkYXRvcnMiLCJ0cnVuY2F0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJNQVhfTE9HX0JPRFlfTEVOR1RIIiwicmVxRm9yUHJveHkiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiZXJyb3IiLCJ2YWx1ZSIsImNhcGFiaWxpdGllcyIsInV0aWwiLCJoYXNWYWx1ZSIsInN0YXR1cyIsImlzTmFOIiwicGFyc2VJbnQiLCJzdGFja3RyYWNlIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJQcm94eVJlcXVlc3RFcnJvciIsImdldEFjdHVhbEVycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJjYW5Qcm94eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7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MUMsVUFBTSxJQUFJMkQsS0FBSixDQUFVLCtEQUFWLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQ0YsVUFBTTVELE1BQU0sQ0FBQzZELGNBQVAsQ0FBc0IsYUFBdEIsRUFBcUNpQixHQUFyQyxFQUEwQ3ZELEdBQTFDLEVBQStDdUQsR0FBRyxDQUFDbEMsTUFBSixDQUFXM0MsU0FBMUQsQ0FBTjtBQUNELEdBRkQsQ0FFRSxPQUFPNkcsR0FBUCxFQUFZO0FBQ1osUUFBSSx5QkFBWUEsR0FBWixFQUFpQnZFLGVBQU8yRSxpQkFBeEIsQ0FBSixFQUFnRDtBQUM5QyxZQUFNSixHQUFOO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsWUFBTSxJQUFJbEQsS0FBSixDQUFXLGlDQUFnQ2tELEdBQUcsQ0FBQ3hFLE9BQVEsRUFBdkQsQ0FBTjtBQUNEO0FBQ0Y7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB1dGlsLCBsb2dnZXIsIG5vZGUgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgdmFsaWRhdG9ycyB9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBlcnJvcnMsIGlzRXJyb3JUeXBlLCBnZXRSZXNwb25zZUZvclczQ0Vycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSwgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IE1FVEhPRF9NQVAsIE5PX1NFU1NJT05fSURfQ09NTUFORFMgfSBmcm9tICcuL3JvdXRlcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBmb3JtYXRSZXNwb25zZVZhbHVlLCBmb3JtYXRTdGF0dXMgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTUFYX0xPR19CT0RZX0xFTkdUSCwgUFJPVE9DT0xTLCBERUZBVUxUX0JBU0VfUEFUSCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc1czY0NhcHMgfSBmcm9tICcuLi9oZWxwZXJzL2NhcGFiaWxpdGllcyc7XG5cblxuY29uc3QgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCA9ICdjcmVhdGVTZXNzaW9uJztcbmNvbnN0IERFTEVURV9TRVNTSU9OX0NPTU1BTkQgPSAnZGVsZXRlU2Vzc2lvbic7XG5jb25zdCBHRVRfU1RBVFVTX0NPTU1BTkQgPSAnZ2V0U3RhdHVzJztcblxuY2xhc3MgUHJvdG9jb2wge31cblxuZnVuY3Rpb24gZGV0ZXJtaW5lUHJvdG9jb2wgKGNyZWF0ZVNlc3Npb25BcmdzKSB7XG4gIHJldHVybiBfLnNvbWUoY3JlYXRlU2Vzc2lvbkFyZ3MsIGlzVzNjQ2FwcykgPyBQUk9UT0NPTFMuVzNDIDogUFJPVE9DT0xTLk1KU09OV1A7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm90b2NvbCAoZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9IF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICA/IGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICA6IGRyaXZlcjtcbiAgaWYgKGRzdERyaXZlciA9PT0gZHJpdmVyKSB7XG4gICAgLy8gU2hvcnRjaXJjdWl0IGlmIHRoZSBkcml2ZXIgaW5zdGFuY2UgaXMgbm90IGFuIHVtYnJlbGxhIGRyaXZlclxuICAgIC8vIG9yIGl0IGlzIEZha2UgZHJpdmVyIGluc3RhbmNlLCB3aGVyZSBgZHJpdmVyLmRyaXZlckZvclNlc3Npb25gXG4gICAgLy8gYWx3YXlzIHJldHVybnMgc2VsZiBpbnN0YW5jZVxuICAgIHJldHVybiBkcml2ZXIucHJvdG9jb2w7XG4gIH1cblxuICAvLyBFeHRyYWN0IHRoZSBwcm90b2NvbCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZiB0aGUgZ2l2ZW4gZHJpdmVyIGlzIHRoZSB1bWJyZWxsYSBvbmVcbiAgcmV0dXJuIGRzdERyaXZlcj8ucHJvdG9jb2wgPz8gUFJPVE9DT0xTLlczQztcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gIV8uaW5jbHVkZXMoTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgY29tbWFuZCk7XG59XG5cbmZ1bmN0aW9uIGdldExvZ2dlciAoZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9IHNlc3Npb25JZCAmJiBfLmlzRnVuY3Rpb24oZHJpdmVyLmRyaXZlckZvclNlc3Npb24pXG4gICAgPyAoZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKSA/PyBkcml2ZXIpXG4gICAgOiBkcml2ZXI7XG4gIGlmIChfLmlzRnVuY3Rpb24oZHN0RHJpdmVyLmxvZz8uaW5mbykpIHtcbiAgICByZXR1cm4gZHN0RHJpdmVyLmxvZztcbiAgfVxuXG4gIGxldCBsb2dQcmVmaXggPSBkc3REcml2ZXIuY29uc3RydWN0b3JcbiAgICA/IGAke2RzdERyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfUAke25vZGUuZ2V0T2JqZWN0SWQoZHN0RHJpdmVyKS5zdWJzdHJpbmcoMCwgOCl9YFxuICAgIDogJ0FwcGl1bURyaXZlcic7XG4gIGlmIChzZXNzaW9uSWQpIHtcbiAgICBsb2dQcmVmaXggKz0gYCAoJHtzZXNzaW9uSWQuc3Vic3RyaW5nKDAsIDgpfSlgO1xuICB9XG4gIHJldHVybiBsb2dnZXIuZ2V0TG9nZ2VyKGxvZ1ByZWZpeCk7XG59XG5cbmZ1bmN0aW9uIHdyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBzZXROZXR3b3JrQ29ubmVjdGlvbiB3aGljaCBzZW5kIHBhcmFtZXRlcnMgd3JhcHBlZCBpbnNpZGUgYSBrZXkgc3VjaCBhc1xuICAgKiBcInBhcmFtZXRlcnNcIi4gVGhpcyBmdW5jdGlvbiB1bndyYXBzIHRoZW0gKGVnLiB7XCJwYXJhbWV0ZXJzXCI6IHtcInR5cGVcIjogMX19IGJlY29tZXMge1widHlwZVwiOiAxfSkuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICAvLyBzb21lIGNsaWVudHMsIGxpa2UgcnVieSwgZG9uJ3Qgd3JhcFxuICAgIGlmIChqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdKSB7XG4gICAgICByZXMgPSBqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqLCBwcm90b2NvbCkge1xuICBsZXQgcmVxdWlyZWRQYXJhbXMgPSBbXTtcbiAgbGV0IG9wdGlvbmFsUGFyYW1zID0gW107XG4gIGxldCByZWNlaXZlZFBhcmFtcyA9IF8ua2V5cyhqc29uT2JqKTtcblxuICBpZiAocGFyYW1TZXRzKSB7XG4gICAgaWYgKHBhcmFtU2V0cy5yZXF1aXJlZCkge1xuICAgICAgLy8gd2UgbWlnaHQgaGF2ZSBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLFxuICAgICAgLy8gb3IgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIHBhcmFtZXRlcnMsIHNvIHN0YW5kYXJkaXplXG4gICAgICBpZiAoIV8uaXNBcnJheShfLmZpcnN0KHBhcmFtU2V0cy5yZXF1aXJlZCkpKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gW3BhcmFtU2V0cy5yZXF1aXJlZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IHBhcmFtU2V0cy5yZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUganVzdCBhbiBhcnJheVxuICAgIGlmIChwYXJhbVNldHMub3B0aW9uYWwpIHtcbiAgICAgIG9wdGlvbmFsUGFyYW1zID0gcGFyYW1TZXRzLm9wdGlvbmFsO1xuICAgIH1cblxuICAgIC8vIElmIGEgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGFzIHRoZSAndmFsaWRhdGUnIGtleSwgaXQgd2lsbCBoZXJlIGJlIGNhbGxlZCB3aXRoXG4gICAgLy8ganNvbk9iaiBhcyB0aGUgcGFyYW0uIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGZhbHN5LCB2ZXJpZmljYXRpb24gd2lsbCBiZVxuICAgIC8vIGNvbnNpZGVyZWQgdG8gaGF2ZSBwYXNzZWQuIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGVsc2UsIHRoYXQgd2lsbCBiZSB0aGVcbiAgICAvLyBhcmd1bWVudCB0byBhbiBlcnJvciB3aGljaCBpcyB0aHJvd24gdG8gdGhlIHVzZXJcbiAgICBpZiAocGFyYW1TZXRzLnZhbGlkYXRlKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IHBhcmFtU2V0cy52YWxpZGF0ZShqc29uT2JqLCBwcm90b2NvbCk7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihtZXNzYWdlLCBqc29uT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpZiB3ZSBoYXZlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFsbCBpcyB3ZWxsXG4gIGlmIChyZXF1aXJlZFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiB0aGUgc2Vzc2lvbiBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdzZXNzaW9uSWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdzZXNzaW9uSWQnKTtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIGFuIGVsZW1lbnQgaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignaWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdpZCcpO1xuICB9XG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgY2hlY2sgYWdhaW5zdCBvdXIgYXJndW1lbnRzXG4gIGZvciAobGV0IHBhcmFtcyBvZiByZXF1aXJlZFBhcmFtcykge1xuICAgIGlmIChfLmRpZmZlcmVuY2UocmVjZWl2ZWRQYXJhbXMsIHBhcmFtcywgb3B0aW9uYWxQYXJhbXMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBfLmRpZmZlcmVuY2UocGFyYW1zLCByZWNlaXZlZFBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBoYXZlIGEgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCBpcyBjb3JyZWN0XG4gICAgICAvLyBzbyBzaG9ydC1jaXJjdWl0XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKHBhcmFtU2V0cywgcmVjZWl2ZWRQYXJhbXMpO1xufVxuXG4vKlxuICogVGhpcyBtZXRob2QgdGFrZXMgMyBwaWVjZXMgb2YgZGF0YTogcmVxdWVzdCBwYXJhbWV0ZXJzICgncmVxdWVzdFBhcmFtcycpLFxuICogYSByZXF1ZXN0IEpTT04gYm9keSAoJ2pzb25PYmonKSwgYW5kICdwYXlsb2FkUGFyYW1zJywgd2hpY2ggaXMgdGhlIHNlY3Rpb25cbiAqIGZyb20gdGhlIHJvdXRlIGRlZmluaXRpb24gZm9yIGEgcGFydGljdWxhciBlbmRwb2ludCB3aGljaCBoYXMgaW5zdHJ1Y3Rpb25zXG4gKiBvbiBoYW5kbGluZyBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsXG4gKiBiZSBhcHBsaWVkIHRvIGEgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gbWFrZUFyZ3MgKHJlcXVlc3RQYXJhbXMsIGpzb25PYmosIHBheWxvYWRQYXJhbXMsIHByb3RvY29sKSB7XG4gIC8vIFdlIHdhbnQgdG8gcGFzcyB0aGUgXCJ1cmxcIiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kcyBpbiByZXZlcnNlIG9yZGVyXG4gIC8vIHNpbmNlIHRoZSBjb21tYW5kIHdpbGwgc29tZXRpbWVzIHdhbnQgdG8gaWdub3JlLCBzYXksIHRoZSBzZXNzaW9uSWQuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHV0dGluZyBzZXNzaW9uSWQgbGFzdCwgd2hpY2ggbWVhbnMgaW4gSlMgd2UgY2FuXG4gIC8vIG9taXQgaXQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuXG4gIGxldCB1cmxQYXJhbXMgPSBfLmtleXMocmVxdWVzdFBhcmFtcykucmV2ZXJzZSgpO1xuXG4gIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIGEgYmFzaWMgYXJyYXkgaW5cbiAgLy8gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gc3RhcnQgdGhlcmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBhcmVcbiAgLy8gbXVsdGlwbGUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRob3VnaCwgc28gaGFuZGxlIHRoYXQgY2FzZVxuICAvLyB0b28uXG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IHBheWxvYWRQYXJhbXMucmVxdWlyZWQ7XG4gIGlmIChfLmlzQXJyYXkoXy5maXJzdChwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSkpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRoZW4gd2Ugd2lsbCBoYXZlIGFuXG4gICAgLy8gYXJyYXkgb2YgYXJyYXlzIGluIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIGxvb3AgdGhyb3VnaCBlYWNoIHNldCBhbmRcbiAgICAvLyBwaWNrIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHdoaWNoIEpTT04gcGFyYW1zIHdlcmUgYWN0dWFsbHkgc2VudC4gV2UndmVcbiAgICAvLyBhbHJlYWR5IGJlZW4gdGhyb3VnaCB2YWxpZGF0aW9uIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZmluZCBhIG1hdGNoLlxuICAgIGxldCBrZXlzID0gXy5rZXlzKGpzb25PYmopO1xuICAgIGZvciAobGV0IHBhcmFtcyBvZiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy53aXRob3V0KHBhcmFtcywgLi4ua2V5cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBOb3cgd2UgY29uc3RydWN0IG91ciBsaXN0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICBsZXQgYXJncztcbiAgaWYgKF8uaXNGdW5jdGlvbihwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKSkge1xuICAgIC8vIEluIHRoZSByb3V0ZSBzcGVjLCBhIHBhcnRpY3VsYXIgcm91dGUgbWlnaHQgZGVmaW5lIGEgJ21ha2VBcmdzJyBmdW5jdGlvblxuICAgIC8vIGlmIGl0IHdhbnRzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0byB0dXJuIEpTT04gcGFyYW1ldGVycyBpbnRvIGNvbW1hbmRcbiAgICAvLyBhcmd1bWVudHMuIFNvIHdlIHBhc3MgaXQgdGhlIEpTT04gcGFyYW1ldGVycyBhbmQgaXQgcmV0dXJucyBhbiBhcnJheVxuICAgIC8vIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgaGFuZGxpbmcgY29tbWFuZC4gRm9yIGV4YW1wbGUgaWYgaXQgcmV0dXJuc1xuICAgIC8vIFsxLCAyLCAzXSwgd2Ugd2lsbCBjYWxsIGBjb21tYW5kKDEsIDIsIDMsIC4uLilgICh1cmwgcGFyYW1zIGFyZSBzZXBhcmF0ZVxuICAgIC8vIGZyb20gSlNPTiBwYXJhbXMgYW5kIGdldCBjb25jYXRlbmF0ZWQgYmVsb3cpLlxuICAgIGFyZ3MgPSBwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKGpzb25PYmosIHByb3RvY29sKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGNvbGxlY3QgYWxsIHRoZSByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1zIGFuZCBmbGF0dGVuIHRoZW1cbiAgICAvLyBpbnRvIGFuIGFyZ3VtZW50IGFycmF5XG4gICAgYXJncyA9IF8uZmxhdHRlbihyZXF1aXJlZFBhcmFtcykubWFwKChwKSA9PiBqc29uT2JqW3BdKTtcbiAgICBpZiAocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkge1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KF8uZmxhdHRlbihwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKS5tYXAoKHApID0+IGpzb25PYmpbcF0pKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSwgZ2V0IG91ciB1cmwgcGFyYW1zIChzZXNzaW9uIGlkLCBlbGVtZW50IGlkLCBldGMuLi4pIG9uIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGxpc3RcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVybFBhcmFtcy5tYXAoKHUpID0+IHJlcXVlc3RQYXJhbXNbdV0pKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiAoZHJpdmVyKSB7XG4gIGlmICghZHJpdmVyLnNlc3Npb25FeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgbXVzdCBpbXBsZW1lbnQgYHNlc3Npb25FeGlzdHNgIHByb3BlcnR5Jyk7XG4gIH1cblxuICBpZiAoIShkcml2ZXIuZXhlY3V0ZUNvbW1hbmQgfHwgZHJpdmVyLmV4ZWN1dGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEcml2ZXJzIG11c3QgaW1wbGVtZW50IGBleGVjdXRlQ29tbWFuZGAgb3IgYGV4ZWN1dGVgIG1ldGhvZCcpO1xuICB9XG5cbiAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBhZGQgYWxsIHRoZSByb3V0ZXMgdG8gdGhlIGRyaXZlci4gSGVyZSBleHRyYU1ldGhvZHMgbWlnaHQgYmVcbiAgLy8gcGFzc2VkIGluIGFzIGRlZmluZWQgYnkgQXBwaXVtIHBsdWdpbnMsIHNvIHdlIG5lZWQgdG8gYWRkIHRob3NlIHRvIHRoZSBkZWZhdWx0IGxpc3RcbiAgcmV0dXJuIGZ1bmN0aW9uIGFkZFJvdXRlcyAoYXBwLCB7YmFzZVBhdGggPSBERUZBVUxUX0JBU0VfUEFUSCwgZXh0cmFNZXRob2RNYXAgPSB7fX0pIHtcbiAgICAvLyBzdG9yZSBiYXNlUGF0aCBvbiB0aGUgZHJpdmVyIGluc3RhbmNlIHNvIGl0IGNhbiB1c2UgaXQgaWYgbmVjZXNzYXJ5XG4gICAgLy8gZm9yIGV4YW1wbGUgaW4gZGV0ZXJtaW5pbmcgcHJveHkgYXZvaWRhbmNlXG4gICAgZHJpdmVyLmJhc2VQYXRoID0gYmFzZVBhdGg7XG5cbiAgICBjb25zdCBhbGxNZXRob2RzID0gey4uLk1FVEhPRF9NQVAsIC4uLmV4dHJhTWV0aG9kTWFwfTtcblxuICAgIGZvciAoY29uc3QgW3BhdGgsIG1ldGhvZHNdIG9mIF8udG9QYWlycyhhbGxNZXRob2RzKSkge1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kLCBzcGVjXSBvZiBfLnRvUGFpcnMobWV0aG9kcykpIHtcbiAgICAgICAgLy8gc2V0IHVwIHRoZSBleHByZXNzIHJvdXRlIGhhbmRsZXJcbiAgICAgICAgYnVpbGRIYW5kbGVyKGFwcCwgbWV0aG9kLCBgJHtiYXNlUGF0aH0ke3BhdGh9YCwgc3BlYywgZHJpdmVyLCBpc1Nlc3Npb25Db21tYW5kKHNwZWMuY29tbWFuZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIYW5kbGVyIChhcHAsIG1ldGhvZCwgcGF0aCwgc3BlYywgZHJpdmVyLCBpc1Nlc3NDbWQpIHtcbiAgbGV0IGFzeW5jSGFuZGxlciA9IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGxldCBqc29uT2JqID0gcmVxLmJvZHk7XG4gICAgbGV0IGh0dHBSZXNCb2R5ID0ge307XG4gICAgbGV0IGh0dHBTdGF0dXMgPSAyMDA7XG4gICAgbGV0IG5ld1Nlc3Npb25JZDtcbiAgICBsZXQgY3VycmVudFByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGlmIHRoaXMgaXMgYSBzZXNzaW9uIGNvbW1hbmQgYnV0IHdlIGRvbid0IGhhdmUgYSBzZXNzaW9uLFxuICAgICAgLy8gZXJyb3Igb3V0IGVhcmx5IChlc3BlY2lhbGx5IGJlZm9yZSBwcm94eWluZylcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIWRyaXZlci5zZXNzaW9uRXhpc3RzKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHByb3h5aW5nIGNvbW1hbmRzIHRvIGFub3RoZXIgSlNPTldQIHNlcnZlciwgYnlwYXNzIGFsbCBvdXJcbiAgICAgIC8vIGNoZWNrcyBhbmQgYXNzdW1lIHRoZSB1cHN0cmVhbSBzZXJ2ZXIga25vd3Mgd2hhdCBpdCdzIGRvaW5nLiBCdXQga2VlcCB0aGlzIGluIHRoZVxuICAgICAgLy8gdHJ5L2NhdGNoIGJsb2NrIHNvIGlmIHByb3h5aW5nIGl0c2VsZiBmYWlscywgd2UgZ2l2ZSBhIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4gT2YgY291cnNlIHdlXG4gICAgICAvLyBvbmx5IHdhbnQgdG8gZG8gdGhlc2Ugd2hlbiB3ZSBoYXZlIGEgc2Vzc2lvbiBjb21tYW5kOyB0aGUgQXBwaXVtIGRyaXZlciBtdXN0IGJlXG4gICAgICAvLyByZXNwb25zaWJsZSBmb3Igc3RhcnQvc3RvcCBzZXNzaW9uLCBldGMuLi4gV2UgYWxzbyBhbGxvdyB0aGUgY29tbWFuZCBzcGVjIHRvIGRlY2xhcmUgdGhhdFxuICAgICAgLy8gdGhpcyBjb21tYW5kIHNob3VsZCBuZXZlciBiZSBwcm94aWVkICh3aGljaCBpcyB1c2VmdWwgZm9yIHBsdWdpbiBkZXZlbG9wZXJzIHdobyBhZGRcbiAgICAgIC8vIGNvbW1hbmRzIGFuZCBnZW5lcmFsbHkgd291bGQgbm90IHdhbnQgdGhhdCBjb21tYW5kIHRvIGJlIHByb3hpZWQgaW5zdGVhZCBvZiBoYW5kbGVkIGJ5IHRoZVxuICAgICAgLy8gcGx1Z2luKVxuICAgICAgbGV0IGRpZFBsdWdpbk92ZXJyaWRlUHJveHkgPSBmYWxzZTtcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIXNwZWMubmV2ZXJQcm94eSAmJiBkcml2ZXJTaG91bGREb0p3cFByb3h5KGRyaXZlciwgcmVxLCBzcGVjLmNvbW1hbmQpKSB7XG4gICAgICAgIGlmICghZHJpdmVyLnBsdWdpbnNUb0hhbmRsZUNtZCB8fFxuICAgICAgICAgICAgZHJpdmVyLnBsdWdpbnNUb0hhbmRsZUNtZChzcGVjLmNvbW1hbmQsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhd2FpdCBkb0p3cFByb3h5KGRyaXZlciwgcmVxLCByZXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoYFdvdWxkIGhhdmUgcHJveGllZCBgICtcbiAgICAgICAgICBgY29tbWFuZCBkaXJlY3RseSwgYnV0IGEgcGx1Z2luIGV4aXN0cyB3aGljaCBtaWdodCByZXF1aXJlIGl0cyB2YWx1ZSwgc28gd2lsbCBsZXQgYCArXG4gICAgICAgICAgYGl0cyB2YWx1ZSBiZSBjb2xsZWN0ZWQgaW50ZXJuYWxseSBhbmQgbWFkZSBwYXJ0IG9mIHBsdWdpbiBjaGFpbmApO1xuICAgICAgICBkaWRQbHVnaW5PdmVycmlkZVByb3h5ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYSBjb21tYW5kIGlzIG5vdCBpbiBvdXIgbWV0aG9kIG1hcCwgaXQncyBiZWNhdXNlIHdlXG4gICAgICAvLyBoYXZlIG5vIHBsYW5zIHRvIGV2ZXIgaW1wbGVtZW50IGl0XG4gICAgICBpZiAoIXNwZWMuY29tbWFuZCkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gd3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB3cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIC8vIHVud3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy51bndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHVud3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIHRyeSB0byBkZXRlcm1pbmUgcHJvdG9jb2wgYnkgc2Vzc2lvbiBjcmVhdGlvbiBhcmdzLCBzbyB3ZSBjYW4gdGhyb3cgYVxuICAgICAgICAvLyBwcm9wZXJseSBmb3JtYXR0ZWQgZXJyb3IgaWYgYXJndW1lbnRzIHZhbGlkYXRpb24gZmFpbHNcbiAgICAgICAgY3VycmVudFByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2wobWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBqc29uIHBheWxvYWQgY29uZm9ybXMgdG8gdGhlIHNwZWNcbiAgICAgIGNoZWNrUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaiwgY3VycmVudFByb3RvY29sKTtcblxuICAgICAgLy8gdHVybiB0aGUgY29tbWFuZCBhbmQganNvbiBwYXlsb2FkIGludG8gYW4gYXJndW1lbnQgbGlzdCBmb3JcbiAgICAgIC8vIHRoZSBkcml2ZXIgbWV0aG9kc1xuICAgICAgbGV0IGFyZ3MgPSBtYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30sIGN1cnJlbnRQcm90b2NvbCk7XG4gICAgICBsZXQgZHJpdmVyUmVzO1xuICAgICAgLy8gdmFsaWRhdGUgY29tbWFuZCBhcmdzIGFjY29yZGluZyB0byBNSlNPTldQXG4gICAgICBpZiAodmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKSB7XG4gICAgICAgIHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSguLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gcnVuIHRoZSBkcml2ZXIgY29tbWFuZCB3cmFwcGVkIGluc2lkZSB0aGUgYXJndW1lbnQgdmFsaWRhdG9yc1xuICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmRlYnVnKGBDYWxsaW5nIGAgK1xuICAgICAgICBgJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0uJHtzcGVjLmNvbW1hbmR9KCkgd2l0aCBhcmdzOiBgICtcbiAgICAgICAgXy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShhcmdzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pKTtcblxuICAgICAgaWYgKGRpZFBsdWdpbk92ZXJyaWRlUHJveHkpIHtcbiAgICAgICAgLy8gVE9ETyBmb3Igbm93IHdlIGFkZCB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZSBhcmdzIGxpc3QsIGJ1dCB0aGF0J3MgbWl4aW5nIHB1cnBvc2VzIGhlcmUuXG4gICAgICAgIC8vIFdlIHJlYWxseSBzaG91bGQgYWRkIGFub3RoZXIgJ29wdGlvbnMnIHBhcmFtZXRlciB0byAnZXhlY3V0ZUNvbW1hbmQnLCBidXQgdGhpcyB3b3VsZCBiZVxuICAgICAgICAvLyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYWxsIGRyaXZlcnMgc28gd291bGQgbmVlZCB0byBiZSBoYW5kbGVkIGNhcmVmdWxseS5cbiAgICAgICAgYXJncy5wdXNoKHtyZXFGb3JQcm94eTogcmVxfSk7XG4gICAgICB9XG5cbiAgICAgIGRyaXZlclJlcyA9IGF3YWl0IGRyaXZlci5leGVjdXRlQ29tbWFuZChzcGVjLmNvbW1hbmQsIC4uLmFyZ3MpO1xuXG4gICAgICAvLyBHZXQgdGhlIHByb3RvY29sIGFmdGVyIGV4ZWN1dGVDb21tYW5kXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkgfHwgY3VycmVudFByb3RvY29sO1xuXG4gICAgICAvLyBJZiBgZXhlY3V0ZUNvbW1hbmRgIHdhcyBvdmVycmlkZGVuIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0XG4gICAgICAvLyB3aXRoIGEgcHJvdG9jb2wgYW5kIHZhbHVlL2Vycm9yIHByb3BlcnR5LCByZS1hc3NpZ24gdGhlIHByb3RvY29sXG4gICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGRyaXZlclJlcykgJiYgXy5oYXMoZHJpdmVyUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkcml2ZXJSZXMucHJvdG9jb2wgfHwgY3VycmVudFByb3RvY29sO1xuICAgICAgICBpZiAoZHJpdmVyUmVzLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZHJpdmVyUmVzLmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdW5wYWNrIGNyZWF0ZVNlc3Npb24gcmVzcG9uc2VcbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgbmV3U2Vzc2lvbklkID0gZHJpdmVyUmVzWzBdO1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCBuZXdTZXNzaW9uSWQpXG4gICAgICAgICAgLmRlYnVnKGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YCk7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGRyaXZlclJlcyA9IHtcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZHJpdmVyUmVzWzFdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShkcml2ZXJSZXMpO1xuXG4gICAgICAvLyBkZWxldGUgc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgZXZlbiBpZiBzdWNjZXNzZnVsXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKVxuICAgICAgICAgIC5kZWJ1ZyhgUmVjZWl2ZWQgcmVzcG9uc2U6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSl9YCk7XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5kZWJ1ZygnQnV0IGRlbGV0aW5nIHNlc3Npb24sIHNvIG5vdCByZXR1cm5pbmcnKTtcbiAgICAgICAgZHJpdmVyUmVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHN0YXR1cyBpcyBub3QgMCwgIHRocm93IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBmb3Igc3RhdHVzIGNvZGUuXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMpKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcy5zdGF0dXMpICYmICFpc05hTihkcml2ZXJSZXMuc3RhdHVzKSAmJiBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShkcml2ZXJSZXMuc3RhdHVzLCBkcml2ZXJSZXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMudmFsdWUpICYmIGRyaXZlclJlcy52YWx1ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKGRyaXZlclJlcy52YWx1ZS5lcnJvciwgZHJpdmVyUmVzLnZhbHVlLm1lc3NhZ2UsIGRyaXZlclJlcy52YWx1ZS5zdGFja3RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keS52YWx1ZSA9IGRyaXZlclJlcztcbiAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCkuZGVidWcoYFJlc3BvbmRpbmcgYCArXG4gICAgICAgIGB0byBjbGllbnQgd2l0aCBkcml2ZXIuJHtzcGVjLmNvbW1hbmR9KCkgcmVzdWx0OiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmlndXJlIG91dCB3aGF0IG91ciByZXNwb25zZSBzaG91bGQgYmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgIGxldCBhY3R1YWxFcnIgPSBlcnI7XG5cbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGN1cnJlbnRQcm90b2NvbCB8fCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpO1xuXG4gICAgICBsZXQgZXJyTXNnID0gZXJyLnN0YWNrdHJhY2UgfHwgZXJyLnN0YWNrO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGVyck1zZywgZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBtb3JlIGluZm9ybWF0aW9uLCBhZGQgaXQuIGJ1dCBvZnRlbiB0aGUgbWVzc2FnZVxuICAgICAgICAvLyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgdHJhY2VcbiAgICAgICAgZXJyTXNnID0gYCR7ZXJyLm1lc3NhZ2V9JHtlcnJNc2cgPyAoJ1xcbicgKyBlcnJNc2cpIDogJyd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgICAgYWN0dWFsRXJyID0gZXJyLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpXG4gICAgICAgICAgLmRlYnVnKGBFbmNvdW50ZXJlZCBpbnRlcm5hbCBlcnJvciBydW5uaW5nIGNvbW1hbmQ6ICR7ZXJyTXNnfWApO1xuICAgICAgfVxuXG4gICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuICAgIH1cblxuICAgIC8vIGRlY29kZSB0aGUgcmVzcG9uc2UsIHdoaWNoIGlzIGVpdGhlciBhIHN0cmluZyBvciBqc29uXG4gICAgaWYgKF8uaXNTdHJpbmcoaHR0cFJlc0JvZHkpKSB7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLnNlbmQoaHR0cFJlc0JvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3U2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBodHRwUmVzQm9keS52YWx1ZS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBzZXNzaW9uSWQgaW4gVzNDIHJlc3BvbnNlc1xuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBkZWxldGUgaHR0cFJlc0JvZHkuc2Vzc2lvbklkO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keSA9IGZvcm1hdFN0YXR1cyhodHRwUmVzQm9keSk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgY29tbWFuZCkge1xuICAvLyBkcml2ZXJzIG5lZWQgdG8gZXhwbGljaXRseSBzYXkgd2hlbiB0aGUgcHJveHkgaXMgYWN0aXZlXG4gIGlmICghZHJpdmVyLnByb3h5QWN0aXZlKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBuZXZlciBwcm94eSBkZWxldGVTZXNzaW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIHRoZSBjb250YWluaW5nXG4gIC8vIGRyaXZlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiBpdHNlbGYgdXBcbiAgaWYgKGNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBhdm9pZGFuY2Ugc2NoZW1hLCBhbmQgc2F5IHdlIHNob3VsZG4ndCBwcm94eSBpZiBhbnl0aGluZyBpbiB0aGVcbiAgLy8gYXZvaWQgbGlzdCBtYXRjaGVzIG91ciByZXFcbiAgaWYgKGRyaXZlci5wcm94eVJvdXRlSXNBdm9pZGVkKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCByZXEubWV0aG9kLCByZXEub3JpZ2luYWxVcmwsIHJlcS5ib2R5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgcmVzKSB7XG4gIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKVxuICAgIC5pbmZvKCdEcml2ZXIgcHJveHkgYWN0aXZlLCBwYXNzaW5nIHJlcXVlc3Qgb24gdmlhIEhUVFAgcHJveHknKTtcblxuICAvLyBjaGVjayB0aGF0IHRoZSBpbm5lciBkcml2ZXIgaGFzIGEgcHJveHkgZnVuY3Rpb25cbiAgaWYgKCFkcml2ZXIuY2FuUHJveHkocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcnlpbmcgdG8gcHJveHkgdG8gYSBzZXJ2ZXIgYnV0IHRoZSBkcml2ZXIgaXMgdW5hYmxlIHRvIHByb3h5Jyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoJ3Byb3h5UmVxUmVzJywgcmVxLCByZXMsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwcm94eS4gUHJveHkgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IHtcbiAgUHJvdG9jb2wsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgaXNTZXNzaW9uQ29tbWFuZCxcbiAgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSwgZGV0ZXJtaW5lUHJvdG9jb2wsIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsXG4gIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsIEdFVF9TVEFUVVNfQ09NTUFORCxcbn07XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
|