appium-uiautomator2-driver 1.72.0 → 2.0.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.
@@ -5,13 +5,13 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.default = exports.SERVER_TEST_PACKAGE_ID = exports.SERVER_PACKAGE_ID = exports.INSTRUMENTATION_TARGET = exports.UiAutomator2Server = void 0;
8
+ exports.default = exports.UiAutomator2Server = exports.SERVER_TEST_PACKAGE_ID = exports.SERVER_PACKAGE_ID = exports.INSTRUMENTATION_TARGET = void 0;
9
9
 
10
10
  require("source-map-support/register");
11
11
 
12
12
  var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
- var _appiumBaseDriver = require("appium-base-driver");
14
+ var _baseDriver = require("@appium/base-driver");
15
15
 
16
16
  var _asyncbox = require("asyncbox");
17
17
 
@@ -19,7 +19,7 @@ var _logger = _interopRequireDefault(require("./logger"));
19
19
 
20
20
  var _appiumUiautomator2Server = require("appium-uiautomator2-server");
21
21
 
22
- var _appiumSupport = require("appium-support");
22
+ var _support = require("@appium/support");
23
23
 
24
24
  var _bluebird = _interopRequireDefault(require("bluebird"));
25
25
 
@@ -40,12 +40,12 @@ exports.SERVER_TEST_PACKAGE_ID = SERVER_TEST_PACKAGE_ID;
40
40
  const INSTRUMENTATION_TARGET = `${SERVER_TEST_PACKAGE_ID}/androidx.test.runner.AndroidJUnitRunner`;
41
41
  exports.INSTRUMENTATION_TARGET = INSTRUMENTATION_TARGET;
42
42
 
43
- const instrumentationLogger = _appiumSupport.logger.getLogger('Instrumentation');
43
+ const instrumentationLogger = _support.logger.getLogger('Instrumentation');
44
44
 
45
- class UIA2Proxy extends _appiumBaseDriver.JWProxy {
45
+ class UIA2Proxy extends _baseDriver.JWProxy {
46
46
  async proxyCommand(url, method, body = null) {
47
47
  if (this.didInstrumentationExit) {
48
- throw new _appiumBaseDriver.errors.InvalidContextError(`'${method} ${url}' cannot be proxied to UiAutomator2 server because ` + 'the instrumentation process is not running (probably crashed). ' + 'Check the server log and/or the logcat output for more details');
48
+ throw new _baseDriver.errors.InvalidContextError(`'${method} ${url}' cannot be proxied to UiAutomator2 server because ` + 'the instrumentation process is not running (probably crashed). ' + 'Check the server log and/or the logcat output for more details');
49
49
  }
50
50
 
51
51
  return await super.proxyCommand(url, method, body);
@@ -56,7 +56,7 @@ class UIA2Proxy extends _appiumBaseDriver.JWProxy {
56
56
  class UiAutomator2Server {
57
57
  constructor(opts = {}) {
58
58
  for (let req of REQD_PARAMS) {
59
- if (!opts || !_appiumSupport.util.hasValue(opts[req])) {
59
+ if (!opts || !_support.util.hasValue(opts[req])) {
60
60
  throw new Error(`Option '${req}' is required!`);
61
61
  }
62
62
 
@@ -81,7 +81,7 @@ class UiAutomator2Server {
81
81
  }
82
82
 
83
83
  async installServerApk(installTimeout = SERVER_INSTALL_RETRIES * 1000) {
84
- const tmpRoot = await _appiumSupport.tempDir.openDir();
84
+ const tmpRoot = await _support.tempDir.openDir();
85
85
 
86
86
  const packageInfosMapper = async ({
87
87
  appPath,
@@ -98,7 +98,7 @@ class UiAutomator2Server {
98
98
 
99
99
  const dstPath = _path.default.resolve(tmpRoot, _path.default.basename(appPath));
100
100
 
101
- await _appiumSupport.fs.copyFile(appPath, dstPath);
101
+ await _support.fs.copyFile(appPath, dstPath);
102
102
  return {
103
103
  appPath: dstPath,
104
104
  appId
@@ -178,7 +178,7 @@ class UiAutomator2Server {
178
178
  }
179
179
  }
180
180
  } finally {
181
- await _appiumSupport.fs.rimraf(tmpRoot);
181
+ await _support.fs.rimraf(tmpRoot);
182
182
  }
183
183
 
184
184
  await this.verifyServicesAvailability();
@@ -247,7 +247,7 @@ class UiAutomator2Server {
247
247
  }
248
248
 
249
249
  const timeout = caps.uiautomator2ServerLaunchTimeout || SERVER_LAUNCH_TIMEOUT;
250
- const timer = new _appiumSupport.timing.Timer().start();
250
+ const timer = new _support.timing.Timer().start();
251
251
  let retries = 0;
252
252
  const maxRetries = 2;
253
253
  const delayBetweenRetries = 3000;
@@ -357,7 +357,7 @@ class UiAutomator2Server {
357
357
  if (activeSessionIds.length) {
358
358
  _logger.default.debug(`The following obsolete sessions are still running: ${JSON.stringify(activeSessionIds)}`);
359
359
 
360
- _logger.default.debug(`Cleaning up ${_appiumSupport.util.pluralize('obsolete session', activeSessionIds.length, true)}`);
360
+ _logger.default.debug(`Cleaning up ${_support.util.pluralize('obsolete session', activeSessionIds.length, true)}`);
361
361
 
362
362
  await _bluebird.default.all(activeSessionIds.map(id => _axios.default.delete(`http://${this.host}:${this.systemPort}/wd/hub/session/${id}`)));
363
363
  await _bluebird.default.delay(1000);
@@ -388,4 +388,4 @@ var _default = UiAutomator2Server;
388
388
  exports.default = _default;require('source-map-support').install();
389
389
 
390
390
 
391
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aWF1dG9tYXRvcjIuanMiXSwibmFtZXMiOlsiUkVRRF9QQVJBTVMiLCJTRVJWRVJfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfSU5TVEFMTF9SRVRSSUVTIiwiU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJJTlNUUlVNRU5UQVRJT05fVEFSR0VUIiwiaW5zdHJ1bWVudGF0aW9uTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiVUlBMlByb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRJbnN0cnVtZW50YXRpb25FeGl0IiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIlVpQXV0b21hdG9yMlNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJwcm94eU9wdHMiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInN5c3RlbVBvcnQiLCJrZWVwQWxpdmUiLCJyZWFkVGltZW91dCIsInRpbWVvdXQiLCJqd3Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwiY29tbWFuZCIsImluc3RhbGxTZXJ2ZXJBcGsiLCJpbnN0YWxsVGltZW91dCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInBhY2thZ2VJbmZvc01hcHBlciIsImFwcFBhdGgiLCJhcHBJZCIsImhlbHBlcnMiLCJpc1dyaXRlYWJsZSIsImxvZyIsImluZm8iLCJkc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJiYXNlbmFtZSIsImZzIiwiY29weUZpbGUiLCJwYWNrYWdlc0luZm8iLCJCIiwiYWxsIiwibWFwIiwiYXBrUGF0aCIsInRlc3RBcGtQYXRoIiwic2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMiLCJzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMiLCJpc0FwcEluc3RhbGxlZCIsImFkYiIsImNoZWNrQXBrQ2VydCIsInNpZ25BcHAiLCJhcHBTdGF0ZSIsImdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlIiwiZGVidWciLCJBUFBfSU5TVEFMTF9TVEFURSIsIk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEIiwiTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJpbmNsdWRlcyIsIk5PVF9JTlNUQUxMRUQiLCJ1bmluc3RhbGxBcGsiLCJlcnIiLCJ3YXJuIiwibWVzc2FnZSIsImluc3RhbGwiLCJub0luY3JlbWVudGFsIiwicmVwbGFjZSIsInRpbWVvdXRDYXBOYW1lIiwicmltcmFmIiwidmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkiLCJpc1BtU2VydmljZUF2YWlsYWJsZSIsInBtT3V0cHV0IiwicG1FcnJvciIsInNoZWxsIiwiZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvciIsImxpbmUiLCJzcGxpdCIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJzZXJ2ZXJWZXJzaW9uIiwidWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInJldHJpZXMiLCJtYXhSZXRyaWVzIiwiZGVsYXlCZXR3ZWVuUmV0cmllcyIsInN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImVycm9yQW5kVGhyb3ciLCJkZWxheSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwiY21kIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInB1c2giLCJfIiwiaXNCb29sZWFuIiwiaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dCIsInRyaW0iLCJjb2RlIiwiZGVsZXRlU2Vzc2lvbiIsInN0cmljdENsZWFudXAiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsdXJhbGl6ZSIsImF4aW9zIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxzQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMseUJBQXhCLENBQWdDO0FBQ1osUUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0FBQzVDLFFBQUksS0FBS0Msc0JBQVQsRUFBaUM7QUFDL0IsWUFBTSxJQUFJQyx5QkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0EsaUVBREEsR0FFQSxnRUFISSxDQUFOO0FBSUQ7O0FBQ0Qs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QVNrRixtQkFBVCxDQUE2QixhQUE3QixDQUFOO0FBQ0QsS0FGRCxDQUVFLE9BQU9ELE1BQVAsRUFBZSxDQUFFO0FBQ3BCOztBQTNTc0I7OztlQStTVmhJLGtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEpXUHJveHksIGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge1xuICBTRVJWRVJfQVBLX1BBVEggYXMgYXBrUGF0aCxcbiAgVEVTVF9BUEtfUEFUSCBhcyB0ZXN0QXBrUGF0aCxcbiAgdmVyc2lvbiBhcyBzZXJ2ZXJWZXJzaW9uXG59IGZyb20gJ2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyJztcbmltcG9ydCB7XG4gIHV0aWwsIGxvZ2dlciwgdGVtcERpciwgZnMsIHRpbWluZ1xufSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgaGVscGVycyBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5jb25zdCBSRVFEX1BBUkFNUyA9IFsnYWRiJywgJ3RtcERpcicsICdob3N0JywgJ3N5c3RlbVBvcnQnLCAnZGV2aWNlUG9ydCcsICdkaXNhYmxlV2luZG93QW5pbWF0aW9uJ107XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IFNFUlZFUl9JTlNUQUxMX1JFVFJJRVMgPSAyMDtcbmNvbnN0IFNFUlZJQ0VTX0xBVU5DSF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTRVJWRVJfUEFDS0FHRV9JRCA9ICdpby5hcHBpdW0udWlhdXRvbWF0b3IyLnNlcnZlcic7XG5jb25zdCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEID0gYCR7U0VSVkVSX1BBQ0tBR0VfSUR9LnRlc3RgO1xuY29uc3QgSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCA9IGAke1NFUlZFUl9URVNUX1BBQ0tBR0VfSUR9L2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcmA7XG5jb25zdCBpbnN0cnVtZW50YXRpb25Mb2dnZXIgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdJbnN0cnVtZW50YXRpb24nKTtcblxuY2xhc3MgVUlBMlByb3h5IGV4dGVuZHMgSldQcm94eSB7XG4gIGFzeW5jIHByb3h5Q29tbWFuZCAodXJsLCBtZXRob2QsIGJvZHkgPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQ29udGV4dEVycm9yKFxuICAgICAgICBgJyR7bWV0aG9kfSAke3VybH0nIGNhbm5vdCBiZSBwcm94aWVkIHRvIFVpQXV0b21hdG9yMiBzZXJ2ZXIgYmVjYXVzZSBgICtcbiAgICAgICAgJ3RoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBpcyBub3QgcnVubmluZyAocHJvYmFibHkgY3Jhc2hlZCkuICcgK1xuICAgICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgYW5kL29yIHRoZSBsb2djYXQgb3V0cHV0IGZvciBtb3JlIGRldGFpbHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLnByb3h5Q29tbWFuZCh1cmwsIG1ldGhvZCwgYm9keSk7XG4gIH1cbn1cblxuY2xhc3MgVWlBdXRvbWF0b3IyU2VydmVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMgPSB7fSkge1xuICAgIGZvciAobGV0IHJlcSBvZiBSRVFEX1BBUkFNUykge1xuICAgICAgaWYgKCFvcHRzIHx8ICF1dGlsLmhhc1ZhbHVlKG9wdHNbcmVxXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gJyR7cmVxfScgaXMgcmVxdWlyZWQhYCk7XG4gICAgICB9XG4gICAgICB0aGlzW3JlcV0gPSBvcHRzW3JlcV07XG4gICAgfVxuICAgIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UgPSBvcHRzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlO1xuICAgIGNvbnN0IHByb3h5T3B0cyA9IHtcbiAgICAgIHNlcnZlcjogdGhpcy5ob3N0LFxuICAgICAgcG9ydDogdGhpcy5zeXN0ZW1Qb3J0LFxuICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgIH07XG4gICAgaWYgKG9wdHMucmVhZFRpbWVvdXQgJiYgb3B0cy5yZWFkVGltZW91dCA+IDApIHtcbiAgICAgIHByb3h5T3B0cy50aW1lb3V0ID0gb3B0cy5yZWFkVGltZW91dDtcbiAgICB9XG4gICAgdGhpcy5qd3Byb3h5ID0gbmV3IFVJQTJQcm94eShwcm94eU9wdHMpO1xuICAgIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmp3cHJveHkucHJveHlSZXFSZXMuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmp3cHJveHkpO1xuICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgdGhlIGFwa3Mgb24gdG8gdGhlIGRldmljZSBvciBlbXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbGxUaW1lb3V0IC0gSW5zdGFsbGF0aW9uIHRpbWVvdXRcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZXJ2ZXJBcGsgKGluc3RhbGxUaW1lb3V0ID0gU0VSVkVSX0lOU1RBTExfUkVUUklFUyAqIDEwMDApIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgY29uc3QgcGFja2FnZUluZm9zTWFwcGVyID0gYXN5bmMgKHthcHBQYXRoLCBhcHBJZH0pID0+IHtcbiAgICAgIGlmIChhd2FpdCBoZWxwZXJzLmlzV3JpdGVhYmxlKGFwcFBhdGgpKSB7XG4gICAgICAgIHJldHVybiB7IGFwcFBhdGgsIGFwcElkIH07XG4gICAgICB9XG5cbiAgICAgIGxvZy5pbmZvKGBTZXJ2ZXIgcGFja2FnZSBhdCAnJHthcHBQYXRofScgaXMgbm90IHdyaXRlYWJsZS4gYCArXG4gICAgICAgIGBXaWxsIGNvcHkgaXQgaW50byB0aGUgdGVtcG9yYXJ5IGxvY2F0aW9uIGF0ICcke3RtcFJvb3R9JyBhcyBhIHdvcmthcm91bmQuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgbWFraW5nIHRoaXMgZmlsZSB3cml0ZWFibGUgbWFudWFsbHkgaW4gb3JkZXIgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2Ygc2Vzc2lvbiBzdGFydHVwLmApO1xuICAgICAgY29uc3QgZHN0UGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwcFBhdGgpKTtcbiAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKGFwcFBhdGgsIGRzdFBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwUGF0aDogZHN0UGF0aCxcbiAgICAgICAgYXBwSWQsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFja2FnZXNJbmZvID0gYXdhaXQgQi5hbGwoQi5tYXAoW1xuICAgICAgICB7XG4gICAgICAgICAgYXBwUGF0aDogYXBrUGF0aCxcbiAgICAgICAgICBhcHBJZDogU0VSVkVSX1BBQ0tBR0VfSUQsXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBhcHBQYXRoOiB0ZXN0QXBrUGF0aCxcbiAgICAgICAgICBhcHBJZDogU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCxcbiAgICAgICAgfSxcbiAgICAgIF0sIHBhY2thZ2VJbmZvc01hcHBlcikpO1xuXG4gICAgICBsZXQgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBmYWxzZTtcbiAgICAgIGxldCBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3Qge2FwcElkLCBhcHBQYXRofSBvZiBwYWNrYWdlc0luZm8pIHtcbiAgICAgICAgaWYgKGFwcElkID09PSBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEKSB7XG4gICAgICAgICAgY29uc3QgaXNBcHBJbnN0YWxsZWQgPSBhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCk7XG5cbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCBpbiBnZXR0aW5nIHRoZSBzdGF0ZSBmb3IgdGVzdCBzZXJ2ZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lcyBub3QgY29udGFpbiB2ZXJzaW9uIGluZm9cbiAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydChhcHBQYXRoLCBhcHBJZCkpIHtcbiAgICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgYXBwUGF0aCk7XG4gICAgICAgICAgICBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IGlzQXBwSW5zdGFsbGVkO1xuICAgICAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlzQXBwSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBwbGljYXRpb25JbnN0YWxsU3RhdGUoYXBwUGF0aCwgYXBwSWQpO1xuICAgICAgICBsb2cuZGVidWcoYCR7YXBwSWR9IGluc3RhbGxhdGlvbiBzdGF0ZTogJHthcHBTdGF0ZX1gKTtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuYWRiLmNoZWNrQXBrQ2VydChhcHBQYXRoLCBhcHBJZCkpIHtcbiAgICAgICAgICBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8IFtcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk9MREVSX1ZFUlNJT05fSU5TVEFMTEVELFxuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQsXG4gICAgICAgICAgXS5pbmNsdWRlcyhhcHBTdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgaGVscGVycy5zaWduQXBwKHRoaXMuYWRiLCBhcHBQYXRoKTtcbiAgICAgICAgICBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzIHx8ICFbXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVELFxuICAgICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBbXG4gICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgXS5pbmNsdWRlcyhhcHBTdGF0ZSk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgU2VydmVyIHBhY2thZ2VzIGFyZSAke3Nob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA/ICcnIDogJ25vdCAnfWdvaW5nIHRvIGJlIChyZSlpbnN0YWxsZWRgKTtcbiAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgJiYgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgbG9nLmluZm8oJ0Z1bGwgcGFja2FnZXMgcmVpbnN0YWxsIGlzIGdvaW5nIHRvIGJlIHBlcmZvcm1lZCcpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB7YXBwSWQsIGFwcFBhdGh9IG9mIHBhY2thZ2VzSW5mbykge1xuICAgICAgICBpZiAoc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKGFwcElkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZy53YXJuKGBFcnJvciB1bmluc3RhbGxpbmcgJyR7YXBwSWR9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwoYXBwUGF0aCwge1xuICAgICAgICAgICAgbm9JbmNyZW1lbnRhbDogdHJ1ZSxcbiAgICAgICAgICAgIHJlcGxhY2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBpbnN0YWxsVGltZW91dCxcbiAgICAgICAgICAgIHRpbWVvdXRDYXBOYW1lOiAndWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMudmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkoKTtcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5ICgpIHtcbiAgICBsb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHtTRVJWSUNFU19MQVVOQ0hfVElNRU9VVH1tcyBmb3Igc2VydmljZXMgdG8gYmUgYXZhaWxhYmxlYCk7XG4gICAgbGV0IGlzUG1TZXJ2aWNlQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgbGV0IHBtT3V0cHV0ID0gJyc7XG4gICAgbGV0IHBtRXJyb3IgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1BtU2VydmljZUF2YWlsYWJsZSkge1xuICAgICAgICAgIHBtRXJyb3IgPSBudWxsO1xuICAgICAgICAgIHBtT3V0cHV0ID0gJyc7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydwbScsICdsaXN0JywgJ2luc3RydW1lbnRhdGlvbiddKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHBtT3V0cHV0LmluY2x1ZGVzKCdDb3VsZCBub3QgYWNjZXNzIHRoZSBQYWNrYWdlIE1hbmFnZXInKSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IG5ldyBFcnJvcihgUHJvYmxlbSBydW5uaW5nIFBhY2thZ2UgTWFuYWdlcjogJHtwbU91dHB1dH1gKTtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgfSBlbHNlIGlmIChwbU91dHB1dC5pbmNsdWRlcyhJTlNUUlVNRU5UQVRJT05fVEFSR0VUKSkge1xuICAgICAgICAgICAgcG1PdXRwdXQgPSAnJzsgLy8gcmVtb3ZlIG91dHB1dCwgc28gaXQgaXMgbm90IHByaW50ZWQgYmVsb3dcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgSW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfScgaXMgYXZhaWxhYmxlYCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgICAgICAgaXNQbVNlcnZpY2VBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXBtRXJyb3IpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoJ1RoZSBpbnN0cnVtZW50YXRpb24gdGFyZ2V0IGlzIG5vdCBsaXN0ZWQgYnkgUGFja2FnZSBNYW5hZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1BtU2VydmljZUF2YWlsYWJsZTtcbiAgICAgIH0sIHtcbiAgICAgICAgd2FpdE1zOiBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCxcbiAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yKGBVbmFibGUgdG8gZmluZCBpbnN0cnVtZW50YXRpb24gdGFyZ2V0ICcke0lOU1RSVU1FTlRBVElPTl9UQVJHRVR9JzogJHsocG1FcnJvciB8fCB7fSkubWVzc2FnZX1gKTtcbiAgICAgIGlmIChwbU91dHB1dCkge1xuICAgICAgICBsb2cuZGVidWcoJ0F2YWlsYWJsZSB0YXJnZXRzOicpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcG1PdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGAgICAgJHtsaW5lLnJlcGxhY2UoJ2luc3RydW1lbnRhdGlvbjonLCAnJyl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdGFydFNlc3Npb24gKGNhcHMpIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzKCk7XG4gICAgaWYgKGNhcHMuc2tpcFNlcnZlckluc3RhbGxhdGlvbikge1xuICAgICAgbG9nLmluZm8oYCdza2lwU2VydmVySW5zdGFsbGF0aW9uJyBpcyBzZXQuIEF0dGVtcHRpbmcgdG8gdXNlIFVJQXV0b21hdG9yMiBzZXJ2ZXIgZnJvbSB0aGUgZGV2aWNlYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGBTdGFydGluZyBVSUF1dG9tYXRvcjIgc2VydmVyICR7c2VydmVyVmVyc2lvbn1gKTtcbiAgICAgIGxvZy5pbmZvKGBVc2luZyBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gJyR7YXBrUGF0aH0nIGFuZCB0ZXN0IGZyb20gJyR7dGVzdEFwa1BhdGh9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXQgPSBjYXBzLnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQgfHwgU0VSVkVSX0xBVU5DSF9USU1FT1VUO1xuICAgIGNvbnN0IHRpbWVyID0gbmV3IHRpbWluZy5UaW1lcigpLnN0YXJ0KCk7XG4gICAgbGV0IHJldHJpZXMgPSAwO1xuICAgIGNvbnN0IG1heFJldHJpZXMgPSAyO1xuICAgIGNvbnN0IGRlbGF5QmV0d2VlblJldHJpZXMgPSAzMDAwO1xuICAgIHdoaWxlIChyZXRyaWVzIDwgbWF4UmV0cmllcykge1xuICAgICAgbG9nLmluZm8oYFdhaXRpbmcgdXAgdG8gJHt0aW1lb3V0fW1zIGZvciBVaUF1dG9tYXRvcjIgdG8gYmUgb25saW5lLi4uYCk7XG4gICAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IGZhbHNlO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydEluc3RydW1lbnRhdGlvblByb2Nlc3MoKTtcbiAgICAgIGlmICghdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBzaG9ydCBjaXJjdWl0IHRvIHJldHJ5IG9yIGZhaWwgZmFzdFxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgd2FpdE1zOiB0aW1lb3V0LFxuICAgICAgICAgICAgaW50ZXJ2YWxNczogMTAwMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgd2l0aGluICR7dGltZW91dH1tcyB0aW1lb3V0LiBgXG4gICAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LiAnXG4gICAgICAgICAgICArIGBZb3UgY291bGQgYWxzbyB0cnkgdG8gaW5jcmVhc2UgdGhlIHZhbHVlIG9mICd1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JyBjYXBhYmlsaXR5YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHJpZXMrKztcbiAgICAgIGlmIChyZXRyaWVzID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coJ1RoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuICdcbiAgICAgICAgICArICdNYWtlIHN1cmUgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QgZG9lcyBub3QgY3Jhc2ggYW5kIGludmVzdGlnYXRlIHRoZSBsb2djYXQgb3V0cHV0LicpO1xuICAgICAgfVxuICAgICAgbG9nLndhcm4oYFRoZSBpbnN0cnVtZW50YXRpb24gcHJvY2VzcyBoYXMgYmVlbiB1bmV4cGVjdGVkbHkgdGVybWluYXRlZC4gYFxuICAgICAgICArIGBSZXRyeWluZyBVaUF1dG9tYXRvcjIgc3RhcnR1cCAoIyR7cmV0cmllc30gb2YgJHttYXhSZXRyaWVzIC0gMX0pYCk7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzKHRydWUpO1xuICAgICAgYXdhaXQgQi5kZWxheShkZWxheUJldHdlZW5SZXRyaWVzKTtcbiAgICB9XG5cbiAgICBsb2cuZGVidWcoYFRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgdG9vayBgXG4gICAgICArIGAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge1xuICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgIGZpcnN0TWF0Y2g6IFtjYXBzXSxcbiAgICAgICAgYWx3YXlzTWF0Y2g6IHt9LFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzICgpIHtcbiAgICBjb25zdCBjbWQgPSBbJ2FtJywgJ2luc3RydW1lbnQnLCAnLXcnXTtcbiAgICBpZiAodGhpcy5kaXNhYmxlV2luZG93QW5pbWF0aW9uKSB7XG4gICAgICBjbWQucHVzaCgnLS1uby13aW5kb3ctYW5pbWF0aW9uJyk7XG4gICAgfVxuICAgIGlmIChfLmlzQm9vbGVhbih0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKSkge1xuICAgICAgY21kLnB1c2goJy1lJywgJ0RJU0FCTEVfU1VQUFJFU1NfQUNDRVNTSUJJTElUWV9TRVJWSUNFUycsIHRoaXMuZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UpO1xuICAgIH1cbiAgICAvLyBEaXNhYmxlIEdvb2dsZSBhbmFseXRpY3MgdG8gcHJldmVudCBwb3NzaWJsZSBmYXRhbCBleGNlcHRpb25cbiAgICBjbWQucHVzaCgnLWUnLCAnZGlzYWJsZUFuYWx5dGljcycsIHRydWUpO1xuICAgIGNtZC5wdXNoKElOU1RSVU1FTlRBVElPTl9UQVJHRVQpO1xuICAgIGNvbnN0IGluc3RydW1lbnRhdGlvblByb2Nlc3MgPSB0aGlzLmFkYi5jcmVhdGVTdWJQcm9jZXNzKFsnc2hlbGwnLCAuLi5jbWRdKTtcbiAgICBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IF8udHJpbShzdGRvdXQgfHwgc3RkZXJyKTtcbiAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKG91dHB1dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICBpbnN0cnVtZW50YXRpb25Mb2dnZXIuZGVidWcoYFRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKTtcbiAgICAgIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0ID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhd2FpdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzLnN0YXJ0KDApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlU2Vzc2lvbiAoKSB7XG4gICAgbG9nLmRlYnVnKCdEZWxldGluZyBVaUF1dG9tYXRvcjIgc2VydmVyIHNlc3Npb24nKTtcbiAgICAvLyByZWx5IG9uIGp3cHJveHkncyBpbnRlbGxpZ2VuY2UgdG8ga25vdyB3aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgYW5kXG4gICAgLy8gZGVsZXRlIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5qd3Byb3h5LmNvbW1hbmQoJy8nLCAnREVMRVRFJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihgRGlkIG5vdCBnZXQgY29uZmlybWF0aW9uIFVpQXV0b21hdG9yMiBkZWxldGVTZXNzaW9uIHdvcmtlZDsgYCArXG4gICAgICAgICAgYEVycm9yIHdhczogJHtlcnJ9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2xlYW51cEF1dG9tYXRpb25MZWZ0b3ZlcnMgKHN0cmljdENsZWFudXAgPSBmYWxzZSkge1xuICAgIGxvZy5kZWJ1ZyhgUGVyZm9ybWluZyAke3N0cmljdENsZWFudXAgPyAnc3RyaWN0JyA6ICdzaGFsbG93J30gY2xlYW51cCBvZiBhdXRvbWF0aW9uIGxlZnRvdmVyc2ApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHt2YWx1ZX0gPSAoYXdhaXQgYXhpb3Moe1xuICAgICAgICB1cmw6IGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS93ZC9odWIvc2Vzc2lvbnNgLFxuICAgICAgICB0aW1lb3V0OiA1MDAsXG4gICAgICB9KSkuZGF0YTtcbiAgICAgIGNvbnN0IGFjdGl2ZVNlc3Npb25JZHMgPSB2YWx1ZS5tYXAoKHtpZH0pID0+IGlkKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYWN0aXZlU2Vzc2lvbklkcy5sZW5ndGgpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZm9sbG93aW5nIG9ic29sZXRlIHNlc3Npb25zIGFyZSBzdGlsbCBydW5uaW5nOiAke0pTT04uc3RyaW5naWZ5KGFjdGl2ZVNlc3Npb25JZHMpfWApO1xuICAgICAgICBsb2cuZGVidWcoYENsZWFuaW5nIHVwICR7dXRpbC5wbHVyYWxpemUoJ29ic29sZXRlIHNlc3Npb24nLCBhY3RpdmVTZXNzaW9uSWRzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICAgIGF3YWl0IEIuYWxsKGFjdGl2ZVNlc3Npb25JZHNcbiAgICAgICAgICAubWFwKChpZCkgPT4gYXhpb3MuZGVsZXRlKGBodHRwOi8vJHt0aGlzLmhvc3R9OiR7dGhpcy5zeXN0ZW1Qb3J0fS93ZC9odWIvc2Vzc2lvbi8ke2lkfWApKVxuICAgICAgICApO1xuICAgICAgICAvLyBMZXQgYWxsIHNlc3Npb25zIHRvIGJlIHByb3Blcmx5IHRlcm1pbmF0ZWQgYmVmb3JlIGNvbnRpbnVpbmdcbiAgICAgICAgYXdhaXQgQi5kZWxheSgxMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5kZWJ1ZygnTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBzZXNzaW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgKCR7ZS5tZXNzYWdlfSlgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQpO1xuICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICBpZiAoIXN0cmljdENsZWFudXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEwNzQ5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtpbGxQcm9jZXNzZXNCeU5hbWUoJ3VpYXV0b21hdG9yJyk7XG4gICAgfSBjYXRjaCAoaWdub3JlKSB7fVxuICB9XG59XG5cbmV4cG9ydCB7IFVpQXV0b21hdG9yMlNlcnZlciwgSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCwgU0VSVkVSX1BBQ0tBR0VfSUQsIFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQgfTtcbmV4cG9ydCBkZWZhdWx0IFVpQXV0b21hdG9yMlNlcnZlcjtcbiJdLCJmaWxlIjoibGliL3VpYXV0b21hdG9yMi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
391
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91aWF1dG9tYXRvcjIuanMiXSwibmFtZXMiOlsiUkVRRF9QQVJBTVMiLCJTRVJWRVJfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfSU5TVEFMTF9SRVRSSUVTIiwiU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQiLCJTRVJWRVJfUEFDS0FHRV9JRCIsIlNFUlZFUl9URVNUX1BBQ0tBR0VfSUQiLCJJTlNUUlVNRU5UQVRJT05fVEFSR0VUIiwiaW5zdHJ1bWVudGF0aW9uTG9nZ2VyIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiVUlBMlByb3h5IiwiSldQcm94eSIsInByb3h5Q29tbWFuZCIsInVybCIsIm1ldGhvZCIsImJvZHkiLCJkaWRJbnN0cnVtZW50YXRpb25FeGl0IiwiZXJyb3JzIiwiSW52YWxpZENvbnRleHRFcnJvciIsIlVpQXV0b21hdG9yMlNlcnZlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsInJlcSIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiZGlzYWJsZVN1cHByZXNzQWNjZXNzaWJpbGl0eVNlcnZpY2UiLCJwcm94eU9wdHMiLCJzZXJ2ZXIiLCJob3N0IiwicG9ydCIsInN5c3RlbVBvcnQiLCJrZWVwQWxpdmUiLCJyZWFkVGltZW91dCIsInRpbWVvdXQiLCJqd3Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwiY29tbWFuZCIsImluc3RhbGxTZXJ2ZXJBcGsiLCJpbnN0YWxsVGltZW91dCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInBhY2thZ2VJbmZvc01hcHBlciIsImFwcFBhdGgiLCJhcHBJZCIsImhlbHBlcnMiLCJpc1dyaXRlYWJsZSIsImxvZyIsImluZm8iLCJkc3RQYXRoIiwicGF0aCIsInJlc29sdmUiLCJiYXNlbmFtZSIsImZzIiwiY29weUZpbGUiLCJwYWNrYWdlc0luZm8iLCJCIiwiYWxsIiwibWFwIiwiYXBrUGF0aCIsInRlc3RBcGtQYXRoIiwic2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMiLCJzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMiLCJpc0FwcEluc3RhbGxlZCIsImFkYiIsImNoZWNrQXBrQ2VydCIsInNpZ25BcHAiLCJhcHBTdGF0ZSIsImdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlIiwiZGVidWciLCJBUFBfSU5TVEFMTF9TVEFURSIsIk9MREVSX1ZFUlNJT05fSU5TVEFMTEVEIiwiTkVXRVJfVkVSU0lPTl9JTlNUQUxMRUQiLCJpbmNsdWRlcyIsIk5PVF9JTlNUQUxMRUQiLCJ1bmluc3RhbGxBcGsiLCJlcnIiLCJ3YXJuIiwibWVzc2FnZSIsImluc3RhbGwiLCJub0luY3JlbWVudGFsIiwicmVwbGFjZSIsInRpbWVvdXRDYXBOYW1lIiwicmltcmFmIiwidmVyaWZ5U2VydmljZXNBdmFpbGFiaWxpdHkiLCJpc1BtU2VydmljZUF2YWlsYWJsZSIsInBtT3V0cHV0IiwicG1FcnJvciIsInNoZWxsIiwiZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvciIsImxpbmUiLCJzcGxpdCIsInN0YXJ0U2Vzc2lvbiIsImNhcHMiLCJjbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyIsInNraXBTZXJ2ZXJJbnN0YWxsYXRpb24iLCJzZXJ2ZXJWZXJzaW9uIiwidWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGFydCIsInJldHJpZXMiLCJtYXhSZXRyaWVzIiwiZGVsYXlCZXR3ZWVuUmV0cmllcyIsInN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImVycm9yQW5kVGhyb3ciLCJkZWxheSIsImdldER1cmF0aW9uIiwiYXNNaWxsaVNlY29uZHMiLCJ0b0ZpeGVkIiwiY2FwYWJpbGl0aWVzIiwiZmlyc3RNYXRjaCIsImFsd2F5c01hdGNoIiwiY21kIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInB1c2giLCJfIiwiaXNCb29sZWFuIiwiaW5zdHJ1bWVudGF0aW9uUHJvY2VzcyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsIm91dHB1dCIsInRyaW0iLCJjb2RlIiwiZGVsZXRlU2Vzc2lvbiIsInN0cmljdENsZWFudXAiLCJ2YWx1ZSIsImRhdGEiLCJhY3RpdmVTZXNzaW9uSWRzIiwiaWQiLCJmaWx0ZXIiLCJCb29sZWFuIiwibGVuZ3RoIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsdXJhbGl6ZSIsImF4aW9zIiwiZGVsZXRlIiwiZm9yY2VTdG9wIiwiaWdub3JlIiwia2lsbFByb2Nlc3Nlc0J5TmFtZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxXQUFXLEdBQUcsQ0FBQyxLQUFELEVBQVEsUUFBUixFQUFrQixNQUFsQixFQUEwQixZQUExQixFQUF3QyxZQUF4QyxFQUFzRCx3QkFBdEQsQ0FBcEI7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxLQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLEVBQS9CO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUcsS0FBaEM7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRywrQkFBMUI7O0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUksR0FBRUQsaUJBQWtCLE9BQXBEOztBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVELHNCQUF1QiwwQ0FBekQ7OztBQUNBLE1BQU1FLHFCQUFxQixHQUFHQyxnQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBOUI7O0FBRUEsTUFBTUMsU0FBTixTQUF3QkMsbUJBQXhCLENBQWdDO0FBQ1osUUFBWkMsWUFBWSxDQUFFQyxHQUFGLEVBQU9DLE1BQVAsRUFBZUMsSUFBSSxHQUFHLElBQXRCLEVBQTRCO0FBQzVDLFFBQUksS0FBS0Msc0JBQVQsRUFBaUM7QUFDL0IsWUFBTSxJQUFJQyxtQkFBT0MsbUJBQVgsQ0FDSCxJQUFHSixNQUFPLElBQUdELEdBQUkscURBQWxCLEdBQ0EsaUVBREEsR0FFQSxnRUFISSxDQUFOO0FBSUQ7O0FBQ0Qs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LG1CQUFULENBQTZCLGFBQTdCLENBQU47QUFDRCxLQUZELENBRUUsT0FBT0QsTUFBUCxFQUFlLENBQUU7QUFDcEI7O0FBM1NzQjs7O2VBK1NWaEksa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSldQcm94eSwgZXJyb3JzIH0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge1xuICBTRVJWRVJfQVBLX1BBVEggYXMgYXBrUGF0aCxcbiAgVEVTVF9BUEtfUEFUSCBhcyB0ZXN0QXBrUGF0aCxcbiAgdmVyc2lvbiBhcyBzZXJ2ZXJWZXJzaW9uXG59IGZyb20gJ2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyJztcbmltcG9ydCB7XG4gIHV0aWwsIGxvZ2dlciwgdGVtcERpciwgZnMsIHRpbWluZ1xufSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgUkVRRF9QQVJBTVMgPSBbJ2FkYicsICd0bXBEaXInLCAnaG9zdCcsICdzeXN0ZW1Qb3J0JywgJ2RldmljZVBvcnQnLCAnZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiddO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUID0gMzAwMDA7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9SRVRSSUVTID0gMjA7XG5jb25zdCBTRVJWSUNFU19MQVVOQ0hfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0VSVkVSX1BBQ0tBR0VfSUQgPSAnaW8uYXBwaXVtLnVpYXV0b21hdG9yMi5zZXJ2ZXInO1xuY29uc3QgU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCA9IGAke1NFUlZFUl9QQUNLQUdFX0lEfS50ZXN0YDtcbmNvbnN0IElOU1RSVU1FTlRBVElPTl9UQVJHRVQgPSBgJHtTRVJWRVJfVEVTVF9QQUNLQUdFX0lEfS9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXJgO1xuY29uc3QgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyID0gbG9nZ2VyLmdldExvZ2dlcignSW5zdHJ1bWVudGF0aW9uJyk7XG5cbmNsYXNzIFVJQTJQcm94eSBleHRlbmRzIEpXUHJveHkge1xuICBhc3luYyBwcm94eUNvbW1hbmQgKHVybCwgbWV0aG9kLCBib2R5ID0gbnVsbCkge1xuICAgIGlmICh0aGlzLmRpZEluc3RydW1lbnRhdGlvbkV4aXQpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZENvbnRleHRFcnJvcihcbiAgICAgICAgYCcke21ldGhvZH0gJHt1cmx9JyBjYW5ub3QgYmUgcHJveGllZCB0byBVaUF1dG9tYXRvcjIgc2VydmVyIGJlY2F1c2UgYCArXG4gICAgICAgICd0aGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcgKHByb2JhYmx5IGNyYXNoZWQpLiAnICtcbiAgICAgICAgJ0NoZWNrIHRoZSBzZXJ2ZXIgbG9nIGFuZC9vciB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBzdXBlci5wcm94eUNvbW1hbmQodXJsLCBtZXRob2QsIGJvZHkpO1xuICB9XG59XG5cbmNsYXNzIFVpQXV0b21hdG9yMlNlcnZlciB7XG4gIGNvbnN0cnVjdG9yIChvcHRzID0ge30pIHtcbiAgICBmb3IgKGxldCByZXEgb2YgUkVRRF9QQVJBTVMpIHtcbiAgICAgIGlmICghb3B0cyB8fCAhdXRpbC5oYXNWYWx1ZShvcHRzW3JlcV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uICcke3JlcX0nIGlzIHJlcXVpcmVkIWApO1xuICAgICAgfVxuICAgICAgdGhpc1tyZXFdID0gb3B0c1tyZXFdO1xuICAgIH1cbiAgICB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlID0gb3B0cy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZTtcbiAgICBjb25zdCBwcm94eU9wdHMgPSB7XG4gICAgICBzZXJ2ZXI6IHRoaXMuaG9zdCxcbiAgICAgIHBvcnQ6IHRoaXMuc3lzdGVtUG9ydCxcbiAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICB9O1xuICAgIGlmIChvcHRzLnJlYWRUaW1lb3V0ICYmIG9wdHMucmVhZFRpbWVvdXQgPiAwKSB7XG4gICAgICBwcm94eU9wdHMudGltZW91dCA9IG9wdHMucmVhZFRpbWVvdXQ7XG4gICAgfVxuICAgIHRoaXMuandwcm94eSA9IG5ldyBVSUEyUHJveHkocHJveHlPcHRzKTtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5qd3Byb3h5KTtcbiAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIHRoZSBhcGtzIG9uIHRvIHRoZSBkZXZpY2Ugb3IgZW11bGF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnN0YWxsVGltZW91dCAtIEluc3RhbGxhdGlvbiB0aW1lb3V0XG4gICAqL1xuICBhc3luYyBpbnN0YWxsU2VydmVyQXBrIChpbnN0YWxsVGltZW91dCA9IFNFUlZFUl9JTlNUQUxMX1JFVFJJRVMgKiAxMDAwKSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvc01hcHBlciA9IGFzeW5jICh7YXBwUGF0aCwgYXBwSWR9KSA9PiB7XG4gICAgICBpZiAoYXdhaXQgaGVscGVycy5pc1dyaXRlYWJsZShhcHBQYXRoKSkge1xuICAgICAgICByZXR1cm4geyBhcHBQYXRoLCBhcHBJZCB9O1xuICAgICAgfVxuXG4gICAgICBsb2cuaW5mbyhgU2VydmVyIHBhY2thZ2UgYXQgJyR7YXBwUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICBgV2lsbCBjb3B5IGl0IGludG8gdGhlIHRlbXBvcmFyeSBsb2NhdGlvbiBhdCAnJHt0bXBSb290fScgYXMgYSB3b3JrYXJvdW5kLiBgICtcbiAgICAgICAgYENvbnNpZGVyIG1ha2luZyB0aGlzIGZpbGUgd3JpdGVhYmxlIG1hbnVhbGx5IGluIG9yZGVyIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHNlc3Npb24gc3RhcnR1cC5gKTtcbiAgICAgIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgcGF0aC5iYXNlbmFtZShhcHBQYXRoKSk7XG4gICAgICBhd2FpdCBmcy5jb3B5RmlsZShhcHBQYXRoLCBkc3RQYXRoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFwcFBhdGg6IGRzdFBhdGgsXG4gICAgICAgIGFwcElkLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VzSW5mbyA9IGF3YWl0IEIuYWxsKEIubWFwKFtcbiAgICAgICAge1xuICAgICAgICAgIGFwcFBhdGg6IGFwa1BhdGgsXG4gICAgICAgICAgYXBwSWQ6IFNFUlZFUl9QQUNLQUdFX0lELFxuICAgICAgICB9LCB7XG4gICAgICAgICAgYXBwUGF0aDogdGVzdEFwa1BhdGgsXG4gICAgICAgICAgYXBwSWQ6IFNFUlZFUl9URVNUX1BBQ0tBR0VfSUQsXG4gICAgICAgIH0sXG4gICAgICBdLCBwYWNrYWdlSW5mb3NNYXBwZXIpKTtcblxuICAgICAgbGV0IHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzID0gZmFsc2U7XG4gICAgICBsZXQgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IHthcHBJZCwgYXBwUGF0aH0gb2YgcGFja2FnZXNJbmZvKSB7XG4gICAgICAgIGlmIChhcHBJZCA9PT0gU0VSVkVSX1RFU1RfUEFDS0FHRV9JRCkge1xuICAgICAgICAgIGNvbnN0IGlzQXBwSW5zdGFsbGVkID0gYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpO1xuXG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcG9pbnQgaW4gZ2V0dGluZyB0aGUgc3RhdGUgZm9yIHRlc3Qgc2VydmVyLFxuICAgICAgICAgIC8vIHNpbmNlIGl0IGRvZXMgbm90IGNvbnRhaW4gdmVyc2lvbiBpbmZvXG4gICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwUGF0aCwgYXBwSWQpKSB7XG4gICAgICAgICAgICBhd2FpdCBoZWxwZXJzLnNpZ25BcHAodGhpcy5hZGIsIGFwcFBhdGgpO1xuICAgICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBpc0FwcEluc3RhbGxlZDtcbiAgICAgICAgICAgIHNob3VsZEluc3RhbGxTZXJ2ZXJQYWNrYWdlcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpc0FwcEluc3RhbGxlZCkge1xuICAgICAgICAgICAgc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwcGxpY2F0aW9uSW5zdGFsbFN0YXRlKGFwcFBhdGgsIGFwcElkKTtcbiAgICAgICAgbG9nLmRlYnVnKGAke2FwcElkfSBpbnN0YWxsYXRpb24gc3RhdGU6ICR7YXBwU3RhdGV9YCk7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmFkYi5jaGVja0Fwa0NlcnQoYXBwUGF0aCwgYXBwSWQpKSB7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCBbXG4gICAgICAgICAgICB0aGlzLmFkYi5BUFBfSU5TVEFMTF9TVEFURS5PTERFUl9WRVJTSU9OX0lOU1RBTExFRCxcbiAgICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5FV0VSX1ZFUlNJT05fSU5TVEFMTEVELFxuICAgICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGhlbHBlcnMuc2lnbkFwcCh0aGlzLmFkYiwgYXBwUGF0aCk7XG4gICAgICAgICAgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRVbmluc3RhbGxTZXJ2ZXJQYWNrYWdlcyB8fCAhW1xuICAgICAgICAgICAgdGhpcy5hZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRCxcbiAgICAgICAgICBdLmluY2x1ZGVzKGFwcFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPSBzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgc2hvdWxkVW5pbnN0YWxsU2VydmVyUGFja2FnZXMgfHwgW1xuICAgICAgICAgIHRoaXMuYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQsXG4gICAgICAgIF0uaW5jbHVkZXMoYXBwU3RhdGUpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYFNlcnZlciBwYWNrYWdlcyBhcmUgJHtzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMgPyAnJyA6ICdub3QgJ31nb2luZyB0byBiZSAocmUpaW5zdGFsbGVkYCk7XG4gICAgICBpZiAoc2hvdWxkSW5zdGFsbFNlcnZlclBhY2thZ2VzICYmIHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgIGxvZy5pbmZvKCdGdWxsIHBhY2thZ2VzIHJlaW5zdGFsbCBpcyBnb2luZyB0byBiZSBwZXJmb3JtZWQnKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qge2FwcElkLCBhcHBQYXRofSBvZiBwYWNrYWdlc0luZm8pIHtcbiAgICAgICAgaWYgKHNob3VsZFVuaW5zdGFsbFNlcnZlclBhY2thZ2VzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhhcHBJZCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2cud2FybihgRXJyb3IgdW5pbnN0YWxsaW5nICcke2FwcElkfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaG91bGRJbnN0YWxsU2VydmVyUGFja2FnZXMpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKGFwcFBhdGgsIHtcbiAgICAgICAgICAgIG5vSW5jcmVtZW50YWw6IHRydWUsXG4gICAgICAgICAgICByZXBsYWNlOiB0cnVlLFxuICAgICAgICAgICAgdGltZW91dDogaW5zdGFsbFRpbWVvdXQsXG4gICAgICAgICAgICB0aW1lb3V0Q2FwTmFtZTogJ3VpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnZlcmlmeVNlcnZpY2VzQXZhaWxhYmlsaXR5KCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlTZXJ2aWNlc0F2YWlsYWJpbGl0eSAoKSB7XG4gICAgbG9nLmRlYnVnKGBXYWl0aW5nIHVwIHRvICR7U0VSVklDRVNfTEFVTkNIX1RJTUVPVVR9bXMgZm9yIHNlcnZpY2VzIHRvIGJlIGF2YWlsYWJsZWApO1xuICAgIGxldCBpc1BtU2VydmljZUF2YWlsYWJsZSA9IGZhbHNlO1xuICAgIGxldCBwbU91dHB1dCA9ICcnO1xuICAgIGxldCBwbUVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghaXNQbVNlcnZpY2VBdmFpbGFibGUpIHtcbiAgICAgICAgICBwbUVycm9yID0gbnVsbDtcbiAgICAgICAgICBwbU91dHB1dCA9ICcnO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwbU91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdpbnN0cnVtZW50YXRpb24nXSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcG1FcnJvciA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwbU91dHB1dC5pbmNsdWRlcygnQ291bGQgbm90IGFjY2VzcyB0aGUgUGFja2FnZSBNYW5hZ2VyJykpIHtcbiAgICAgICAgICAgIHBtRXJyb3IgPSBuZXcgRXJyb3IoYFByb2JsZW0gcnVubmluZyBQYWNrYWdlIE1hbmFnZXI6ICR7cG1PdXRwdXR9YCk7XG4gICAgICAgICAgICBwbU91dHB1dCA9ICcnOyAvLyByZW1vdmUgb3V0cHV0LCBzbyBpdCBpcyBub3QgcHJpbnRlZCBiZWxvd1xuICAgICAgICAgIH0gZWxzZSBpZiAocG1PdXRwdXQuaW5jbHVkZXMoSU5TVFJVTUVOVEFUSU9OX1RBUkdFVCkpIHtcbiAgICAgICAgICAgIHBtT3V0cHV0ID0gJyc7IC8vIHJlbW92ZSBvdXRwdXQsIHNvIGl0IGlzIG5vdCBwcmludGVkIGJlbG93XG4gICAgICAgICAgICBsb2cuZGVidWcoYEluc3RydW1lbnRhdGlvbiB0YXJnZXQgJyR7SU5TVFJVTUVOVEFUSU9OX1RBUkdFVH0nIGlzIGF2YWlsYWJsZWApO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXNcbiAgICAgICAgICAgIGlzUG1TZXJ2aWNlQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFwbUVycm9yKSB7XG4gICAgICAgICAgICBwbUVycm9yID0gbmV3IEVycm9yKCdUaGUgaW5zdHJ1bWVudGF0aW9uIHRhcmdldCBpcyBub3QgbGlzdGVkIGJ5IFBhY2thZ2UgTWFuYWdlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNQbVNlcnZpY2VBdmFpbGFibGU7XG4gICAgICB9LCB7XG4gICAgICAgIHdhaXRNczogU0VSVklDRVNfTEFVTkNIX1RJTUVPVVQsXG4gICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvcihgVW5hYmxlIHRvIGZpbmQgaW5zdHJ1bWVudGF0aW9uIHRhcmdldCAnJHtJTlNUUlVNRU5UQVRJT05fVEFSR0VUfSc6ICR7KHBtRXJyb3IgfHwge30pLm1lc3NhZ2V9YCk7XG4gICAgICBpZiAocG1PdXRwdXQpIHtcbiAgICAgICAgbG9nLmRlYnVnKCdBdmFpbGFibGUgdGFyZ2V0czonKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHBtT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgICAgICR7bGluZS5yZXBsYWNlKCdpbnN0cnVtZW50YXRpb246JywgJycpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTZXNzaW9uIChjYXBzKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycygpO1xuICAgIGlmIChjYXBzLnNraXBTZXJ2ZXJJbnN0YWxsYXRpb24pIHtcbiAgICAgIGxvZy5pbmZvKGAnc2tpcFNlcnZlckluc3RhbGxhdGlvbicgaXMgc2V0LiBBdHRlbXB0aW5nIHRvIHVzZSBVSUF1dG9tYXRvcjIgc2VydmVyIGZyb20gdGhlIGRldmljZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbyhgU3RhcnRpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciAke3NlcnZlclZlcnNpb259YCk7XG4gICAgICBsb2cuaW5mbyhgVXNpbmcgVUlBdXRvbWF0b3IyIHNlcnZlciBmcm9tICcke2Fwa1BhdGh9JyBhbmQgdGVzdCBmcm9tICcke3Rlc3RBcGtQYXRofSdgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0ID0gY2Fwcy51aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0IHx8IFNFUlZFUl9MQVVOQ0hfVElNRU9VVDtcbiAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgIGxldCByZXRyaWVzID0gMDtcbiAgICBjb25zdCBtYXhSZXRyaWVzID0gMjtcbiAgICBjb25zdCBkZWxheUJldHdlZW5SZXRyaWVzID0gMzAwMDtcbiAgICB3aGlsZSAocmV0cmllcyA8IG1heFJldHJpZXMpIHtcbiAgICAgIGxvZy5pbmZvKGBXYWl0aW5nIHVwIHRvICR7dGltZW91dH1tcyBmb3IgVWlBdXRvbWF0b3IyIHRvIGJlIG9ubGluZS4uLmApO1xuICAgICAgdGhpcy5qd3Byb3h5LmRpZEluc3RydW1lbnRhdGlvbkV4aXQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRJbnN0cnVtZW50YXRpb25Qcm9jZXNzKCk7XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gc2hvcnQgY2lyY3VpdCB0byByZXRyeSBvciBmYWlsIGZhc3RcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXRNczogdGltZW91dCxcbiAgICAgICAgICAgIGludGVydmFsTXM6IDEwMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkIHdpdGhpbiAke3RpbWVvdXR9bXMgdGltZW91dC4gYFxuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4gJ1xuICAgICAgICAgICAgKyBgWW91IGNvdWxkIGFsc28gdHJ5IHRvIGluY3JlYXNlIHRoZSB2YWx1ZSBvZiAndWlhdXRvbWF0b3IyU2VydmVyTGF1bmNoVGltZW91dCcgY2FwYWJpbGl0eWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuandwcm94eS5kaWRJbnN0cnVtZW50YXRpb25FeGl0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXRyaWVzKys7XG4gICAgICBpZiAocmV0cmllcyA+PSBtYXhSZXRyaWVzKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KCdUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgY2Fubm90IGJlIGluaXRpYWxpemVkLiAnXG4gICAgICAgICAgKyAnTWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0IGRvZXMgbm90IGNyYXNoIGFuZCBpbnZlc3RpZ2F0ZSB0aGUgbG9nY2F0IG91dHB1dC4nKTtcbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKGBUaGUgaW5zdHJ1bWVudGF0aW9uIHByb2Nlc3MgaGFzIGJlZW4gdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQuIGBcbiAgICAgICAgKyBgUmV0cnlpbmcgVWlBdXRvbWF0b3IyIHN0YXJ0dXAgKCMke3JldHJpZXN9IG9mICR7bWF4UmV0cmllcyAtIDF9KWApO1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQXV0b21hdGlvbkxlZnRvdmVycyh0cnVlKTtcbiAgICAgIGF3YWl0IEIuZGVsYXkoZGVsYXlCZXR3ZWVuUmV0cmllcyk7XG4gICAgfVxuXG4gICAgbG9nLmRlYnVnKGBUaGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGluc3RydW1lbnRhdGlvbiBwcm9jZXNzIHRvb2sgYFxuICAgICAgKyBgJHt0aW1lci5nZXREdXJhdGlvbigpLmFzTWlsbGlTZWNvbmRzLnRvRml4ZWQoMCl9bXNgKTtcbiAgICBhd2FpdCB0aGlzLmp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBmaXJzdE1hdGNoOiBbY2Fwc10sXG4gICAgICAgIGFsd2F5c01hdGNoOiB7fSxcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0SW5zdHJ1bWVudGF0aW9uUHJvY2VzcyAoKSB7XG4gICAgY29uc3QgY21kID0gWydhbScsICdpbnN0cnVtZW50JywgJy13J107XG4gICAgaWYgKHRoaXMuZGlzYWJsZVdpbmRvd0FuaW1hdGlvbikge1xuICAgICAgY21kLnB1c2goJy0tbm8td2luZG93LWFuaW1hdGlvbicpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Jvb2xlYW4odGhpcy5kaXNhYmxlU3VwcHJlc3NBY2Nlc3NpYmlsaXR5U2VydmljZSkpIHtcbiAgICAgIGNtZC5wdXNoKCctZScsICdESVNBQkxFX1NVUFBSRVNTX0FDQ0VTU0lCSUxJVFlfU0VSVklDRVMnLCB0aGlzLmRpc2FibGVTdXBwcmVzc0FjY2Vzc2liaWxpdHlTZXJ2aWNlKTtcbiAgICB9XG4gICAgLy8gRGlzYWJsZSBHb29nbGUgYW5hbHl0aWNzIHRvIHByZXZlbnQgcG9zc2libGUgZmF0YWwgZXhjZXB0aW9uXG4gICAgY21kLnB1c2goJy1lJywgJ2Rpc2FibGVBbmFseXRpY3MnLCB0cnVlKTtcbiAgICBjbWQucHVzaChJTlNUUlVNRU5UQVRJT05fVEFSR0VUKTtcbiAgICBjb25zdCBpbnN0cnVtZW50YXRpb25Qcm9jZXNzID0gdGhpcy5hZGIuY3JlYXRlU3ViUHJvY2VzcyhbJ3NoZWxsJywgLi4uY21kXSk7XG4gICAgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBfLnRyaW0oc3Rkb3V0IHx8IHN0ZGVycik7XG4gICAgICBpZiAob3V0cHV0KSB7XG4gICAgICAgIGluc3RydW1lbnRhdGlvbkxvZ2dlci5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGluc3RydW1lbnRhdGlvblByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgaW5zdHJ1bWVudGF0aW9uTG9nZ2VyLmRlYnVnKGBUaGUgcHJvY2VzcyBoYXMgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7XG4gICAgICB0aGlzLmp3cHJveHkuZGlkSW5zdHJ1bWVudGF0aW9uRXhpdCA9IHRydWU7XG4gICAgfSk7XG4gICAgYXdhaXQgaW5zdHJ1bWVudGF0aW9uUHJvY2Vzcy5zdGFydCgwKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVNlc3Npb24gKCkge1xuICAgIGxvZy5kZWJ1ZygnRGVsZXRpbmcgVWlBdXRvbWF0b3IyIHNlcnZlciBzZXNzaW9uJyk7XG4gICAgLy8gcmVseSBvbiBqd3Byb3h5J3MgaW50ZWxsaWdlbmNlIHRvIGtub3cgd2hhdCB3ZSdyZSB0YWxraW5nIGFib3V0IGFuZFxuICAgIC8vIGRlbGV0ZSB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuandwcm94eS5jb21tYW5kKCcvJywgJ0RFTEVURScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYERpZCBub3QgZ2V0IGNvbmZpcm1hdGlvbiBVaUF1dG9tYXRvcjIgZGVsZXRlU2Vzc2lvbiB3b3JrZWQ7IGAgK1xuICAgICAgICAgIGBFcnJvciB3YXM6ICR7ZXJyfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBBdXRvbWF0aW9uTGVmdG92ZXJzIChzdHJpY3RDbGVhbnVwID0gZmFsc2UpIHtcbiAgICBsb2cuZGVidWcoYFBlcmZvcm1pbmcgJHtzdHJpY3RDbGVhbnVwID8gJ3N0cmljdCcgOiAnc2hhbGxvdyd9IGNsZWFudXAgb2YgYXV0b21hdGlvbiBsZWZ0b3ZlcnNgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dmFsdWV9ID0gKGF3YWl0IGF4aW9zKHtcbiAgICAgICAgdXJsOiBgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vd2QvaHViL3Nlc3Npb25zYCxcbiAgICAgICAgdGltZW91dDogNTAwLFxuICAgICAgfSkpLmRhdGE7XG4gICAgICBjb25zdCBhY3RpdmVTZXNzaW9uSWRzID0gdmFsdWUubWFwKCh7aWR9KSA9PiBpZCkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgaWYgKGFjdGl2ZVNlc3Npb25JZHMubGVuZ3RoKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgVGhlIGZvbGxvd2luZyBvYnNvbGV0ZSBzZXNzaW9ucyBhcmUgc3RpbGwgcnVubmluZzogJHtKU09OLnN0cmluZ2lmeShhY3RpdmVTZXNzaW9uSWRzKX1gKTtcbiAgICAgICAgbG9nLmRlYnVnKGBDbGVhbmluZyB1cCAke3V0aWwucGx1cmFsaXplKCdvYnNvbGV0ZSBzZXNzaW9uJywgYWN0aXZlU2Vzc2lvbklkcy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgICBhd2FpdCBCLmFsbChhY3RpdmVTZXNzaW9uSWRzXG4gICAgICAgICAgLm1hcCgoaWQpID0+IGF4aW9zLmRlbGV0ZShgaHR0cDovLyR7dGhpcy5ob3N0fToke3RoaXMuc3lzdGVtUG9ydH0vd2QvaHViL3Nlc3Npb24vJHtpZH1gKSlcbiAgICAgICAgKTtcbiAgICAgICAgLy8gTGV0IGFsbCBzZXNzaW9ucyB0byBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkIGJlZm9yZSBjb250aW51aW5nXG4gICAgICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoJ05vIG9ic29sZXRlIHNlc3Npb25zIGhhdmUgYmVlbiBkZXRlY3RlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgTm8gb2Jzb2xldGUgc2Vzc2lvbnMgaGF2ZSBiZWVuIGRldGVjdGVkICgke2UubWVzc2FnZX0pYCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcChTRVJWRVJfVEVTVF9QQUNLQUdFX0lEKTtcbiAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgaWYgKCFzdHJpY3RDbGVhbnVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMDc0OVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5raWxsUHJvY2Vzc2VzQnlOYW1lKCd1aWF1dG9tYXRvcicpO1xuICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgfVxufVxuXG5leHBvcnQgeyBVaUF1dG9tYXRvcjJTZXJ2ZXIsIElOU1RSVU1FTlRBVElPTl9UQVJHRVQsIFNFUlZFUl9QQUNLQUdFX0lELCBTRVJWRVJfVEVTVF9QQUNLQUdFX0lEIH07XG5leHBvcnQgZGVmYXVsdCBVaUF1dG9tYXRvcjJTZXJ2ZXI7XG4iXSwiZmlsZSI6ImxpYi91aWF1dG9tYXRvcjIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
package/lib/.DS_Store ADDED
Binary file
@@ -1,7 +1,7 @@
1
1
  import log from '../logger';
2
2
  import _ from 'lodash';
3
- import { util } from 'appium-support';
4
- import { PROTOCOLS, W3C_ELEMENT_KEY } from 'appium-base-driver';
3
+ import { util } from '@appium/support';
4
+ import { PROTOCOLS, W3C_ELEMENT_KEY } from '@appium/base-driver';
5
5
 
6
6
  let commands = {}, helpers = {}, extensions = {};
7
7
 
@@ -1,6 +1,6 @@
1
1
  import CssConverter from '../css-converter';
2
2
 
3
- let helpers = {}, extensions = {};
3
+ const helpers = {};
4
4
 
5
5
  // we override the xpath search for this first-visible-child selector, which
6
6
  // looks like /*[@firstVisible="true"]
@@ -24,15 +24,11 @@ helpers.doFindElementOrEls = async function (params) {
24
24
  }
25
25
  if (params.strategy === 'css selector') {
26
26
  params.strategy = '-android uiautomator';
27
- params.selector = CssConverter.toUiAutomatorSelector(params.selector);
28
- }
29
- if (params.multiple) {
30
- return await this.uiautomator2.jwproxy.command(`/elements`, 'POST', params);
31
- } else {
32
- return await this.uiautomator2.jwproxy.command(`/element`, 'POST', params);
27
+ params.selector = new CssConverter(params.selector, this.opts.appPackage)
28
+ .toUiAutomatorSelector();
33
29
  }
30
+ return await this.uiautomator2.jwproxy.command(`/element${params.multiple ? 's' : ''}`, 'POST', params);
34
31
  };
35
32
 
36
- Object.assign(extensions, helpers);
37
33
  export { helpers };
38
- export default extensions;
34
+ export default helpers;
@@ -1,8 +1,8 @@
1
1
  import _ from 'lodash';
2
2
  import log from '../logger';
3
3
  import B from 'bluebird';
4
- import { errors, BASEDRIVER_HANDLED_SETTINGS } from 'appium-base-driver';
5
- import { fs, tempDir } from 'appium-support';
4
+ import { errors, BASEDRIVER_HANDLED_SETTINGS } from '@appium/base-driver';
5
+ import { fs, tempDir } from '@appium/support';
6
6
  import { APK_EXTENSION } from '../extensions';
7
7
 
8
8
  let extensions = {},
@@ -170,6 +170,8 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
170
170
  installMultipleApks: 'mobileInstallMultipleApks',
171
171
 
172
172
  unlock: 'mobileUnlock',
173
+
174
+ refreshGpsCache: 'mobileRefreshGpsCache',
173
175
  };
174
176
 
175
177
  if (!_.has(mobileCommandsMapping, mobileCommand)) {
@@ -1,6 +1,6 @@
1
- import { util } from 'appium-support';
1
+ import { util } from '@appium/support';
2
2
  import _ from 'lodash';
3
- import { errors } from 'appium-base-driver';
3
+ import { errors } from '@appium/base-driver';
4
4
 
5
5
  const commands = {};
6
6
 
@@ -1,4 +1,4 @@
1
- import { imageUtil } from 'appium-support';
1
+ import { imageUtil } from '@appium/support';
2
2
 
3
3
 
4
4
  let extensions = {}, commands = {};