appium-uiautomator2-driver 1.62.0 → 1.65.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/README.md CHANGED
@@ -134,7 +134,7 @@ appium:unlockSuccessTimeout | Maximum number of milliseconds to wait until the d
134
134
 
135
135
  Capability Name | Description
136
136
  --- | ---
137
- appium:mjpegServerPort | The number of the port UiAutomator2 server starts the MJPEG server on. If not provided then no screenshots broadcast thread is started on the server side.
137
+ appium:mjpegServerPort | The number of the port UiAutomator2 server starts the MJPEG server on. If not provided then the screenshots broadcasting service on the remote device does not get exposed to a local port (e.g. no adb port forwarding is happening)
138
138
  appium:mjpegScreenshotUrl | The URL of a service that provides realtime device screenshots in MJPEG format. If provided then the actual command to retrieve a screenshot will be requesting pictures from this service rather than directly from the server
139
139
 
140
140
  ### Web Context
@@ -314,6 +314,7 @@ UiAutomator2 provides several extensions that allow to automate popular mobile g
314
314
 
315
315
  - mobile: dragGesture
316
316
  - mobile: flingGesture
317
+ - mobile: doubleClickGesture
317
318
  - mobile: longClickGesture
318
319
  - mobile: pinchCloseGesture
319
320
  - mobile: pinchOpenGesture
@@ -365,7 +366,7 @@ Name | Type | Required | Description | Example
365
366
  --- | --- | --- | --- | ---
366
367
  buttonLabel | string | no | The name/text of the alert button to click in order to accept it. If not provided then the driver will try to autodetect it | Accept
367
368
 
368
- ### mobile: acceptAlert
369
+ ### mobile: dismissAlert
369
370
 
370
371
  Tries to dismiss an Android alert. This method might not always be reliable as there is no single standard for how Android alerts should look like within the Accessibility representation.
371
372
 
@@ -639,6 +640,17 @@ Note that `description` in `page` can be an empty string most likely when it com
639
640
  }
640
641
  ```
641
642
 
643
+ ### mobile: installMultipleApks
644
+
645
+ Install applications via `install-multiple` option.
646
+ Please read more details in the corresponding section of the `adb --help` command output.
647
+
648
+ #### Arguments
649
+
650
+ Name | Type | Required | Description | Example
651
+ --- | --- | --- | --- | ---
652
+ apks | array<string> | yes | The path to APKs. Each path should be the full path to the apk to be installed, or an URL to a remote location. | `['/path/to/local.apk', 'https://github.com/appium/ruby_lib_core/blob/master/test/functional/app/api.apk.zip?raw=true']`
653
+ options | object | no | Installation options. If you want enable `-g` option, you could specify that `{grantPermissions: true}`. `allowTestPackages` corresponds `-t`, `useSdcard` corresponds `-s`, `replace` corresponds `-r` (`-r` is enabled by default), `partialInstall` corresponds `-p`. | `{grantPermissions: true, partialInstall: true}`
642
654
 
643
655
  ## Applications Management
644
656
 
@@ -13,10 +13,14 @@ var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
14
  var _logger = _interopRequireDefault(require("../logger"));
15
15
 
16
+ var _bluebird = _interopRequireDefault(require("bluebird"));
17
+
16
18
  var _appiumBaseDriver = require("appium-base-driver");
17
19
 
18
20
  var _appiumSupport = require("appium-support");
19
21
 
22
+ var _extensions = require("../extensions");
23
+
20
24
  let extensions = {},
21
25
  commands = {},
22
26
  helpers = {};
@@ -121,6 +125,7 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
121
125
  execEmuConsoleCommand: 'mobileExecEmuConsoleCommand',
122
126
  dragGesture: 'mobileDragGesture',
123
127
  flingGesture: 'mobileFlingGesture',
128
+ doubleClickGesture: 'mobileDoubleClickGesture',
124
129
  longClickGesture: 'mobileLongClickGesture',
125
130
  pinchCloseGesture: 'mobilePinchCloseGesture',
126
131
  pinchOpenGesture: 'mobilePinchOpenGesture',
@@ -150,7 +155,8 @@ extensions.executeMobile = async function (mobileCommand, opts = {}) {
150
155
  deleteFile: 'mobileDeleteFile',
151
156
  startService: 'mobileStartService',
152
157
  stopService: 'mobileStopService',
153
- getContexts: 'mobileGetContexts'
158
+ getContexts: 'mobileGetContexts',
159
+ installMultipleApks: 'mobileInstallMultipleApks'
154
160
  };
155
161
 
156
162
  if (!_lodash.default.has(mobileCommandsMapping, mobileCommand)) {
@@ -248,9 +254,18 @@ commands.mobileType = async function mobileType(opts = {}) {
248
254
  return await this.adb.typeUnicode(text);
249
255
  };
250
256
 
257
+ commands.mobileInstallMultipleApks = async function (opts = {}) {
258
+ if (!_lodash.default.isArray(opts.apks) || _lodash.default.isEmpty(opts.apks)) {
259
+ throw new _appiumBaseDriver.errors.InvalidArgumentError('No apks are given to install');
260
+ }
261
+
262
+ const apks = await _bluebird.default.all(opts.apks.map(app => this.helpers.configureApp(app, [_extensions.APK_EXTENSION])));
263
+ await this.adb.installMultipleApks(apks, opts.options);
264
+ };
265
+
251
266
  Object.assign(extensions, commands, helpers);
252
267
  var _default = extensions;
253
268
  exports.default = _default;require('source-map-support').install();
254
269
 
255
270
 
256
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXRXaW5kb3dTaXplIiwiZ2V0V2luZG93UmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwieCIsInkiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZHJhZ0dlc3R1cmUiLCJmbGluZ0dlc3R1cmUiLCJsb25nQ2xpY2tHZXN0dXJlIiwicGluY2hDbG9zZUdlc3R1cmUiLCJwaW5jaE9wZW5HZXN0dXJlIiwic3dpcGVHZXN0dXJlIiwic2Nyb2xsR2VzdHVyZSIsInNjcm9sbEJhY2tUbyIsInNjcm9sbCIsInZpZXdwb3J0U2NyZWVuc2hvdCIsInZpZXdwb3J0UmVjdCIsImRlZXBMaW5rIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJhY2NlcHRBbGVydCIsImRpc21pc3NBbGVydCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwidHlwZSIsInNlbnNvclNldCIsImRlbGV0ZUZpbGUiLCJzdGFydFNlcnZpY2UiLCJzdG9wU2VydmljZSIsImdldENvbnRleHRzIiwiaGFzIiwiZXJyb3JzIiwiVW5rbm93bkNvbW1hbmRFcnJvciIsImtleXMiLCJtb2JpbGVWaWV3cG9ydFNjcmVlbnNob3QiLCJnZXRWaWV3cG9ydFNjcmVlbnNob3QiLCJtb2JpbGVWaWV3UG9ydFJlY3QiLCJnZXRWaWV3UG9ydFJlY3QiLCJzZXRVcmwiLCJ1cmwiLCJzdGFydFVyaSIsIm1vYmlsZURlZXBMaW5rIiwicGFja2FnZSIsInBrZyIsIndhaXRGb3JMYXVuY2giLCJvcGVuTm90aWZpY2F0aW9ucyIsInVwZGF0ZVNldHRpbmdzIiwic2V0dGluZ3MiLCJkcml2ZXJPbmx5U2V0dGluZ3MiLCJzZXJ2ZXJTZXR0aW5ncyIsInNldHRpbmciLCJCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MiLCJpbmNsdWRlcyIsImlzRW1wdHkiLCJ1cGRhdGUiLCJnZXRTZXR0aW5ncyIsIndyYXBCb290c3RyYXBEaXNjb25uZWN0Iiwid3JhcHBlZCIsInN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSIsImNocm9tZWRyaXZlciIsInByb3h5UmVxUmVzIiwiYmluZCIsImp3cFByb3h5QWN0aXZlIiwibW9iaWxlR2V0RGV2aWNlSW5mbyIsIm1vYmlsZVR5cGUiLCJ0ZXh0IiwiaXNVbmRlZmluZWQiLCJ0eXBlVW5pY29kZSIsIk9iamVjdCIsImFzc2ln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QUFsQixDQUE4QkMsSUFBOUIsQ0FBbUMsS0FBS3JILFlBQXhDLENBQW5CO0FBQ0EsT0FBS3NILGNBQUwsR0FBc0IsSUFBdEI7QUFDRCxDQUpEOztBQVVBekgsUUFBUSxDQUFDMEgsbUJBQVQsR0FBK0Isa0JBQWtCO0FBQy9DLFNBQU8sTUFBTSxLQUFLdkgsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQWtDLHFCQUFsQyxFQUF5RCxLQUF6RCxDQUFiO0FBQ0QsQ0FGRDs7QUFrQkFMLFFBQVEsQ0FBQzJILFVBQVQsR0FBc0IsZUFBZUEsVUFBZixDQUEyQjNGLElBQUksR0FBRyxFQUFsQyxFQUFzQztBQUMxRCxRQUFNO0FBQ0o0RixJQUFBQTtBQURJLE1BRUY1RixJQUZKOztBQUdBLE1BQUlOLGdCQUFFbUcsV0FBRixDQUFjRCxJQUFkLENBQUosRUFBeUI7QUFDdkI5RyxvQkFBSXFCLGFBQUosQ0FBbUIsa0NBQW5CO0FBQ0Q7O0FBQ0QsU0FBTyxNQUFNLEtBQUs1QixHQUFMLENBQVN1SCxXQUFULENBQXFCRixJQUFyQixDQUFiO0FBQ0QsQ0FSRDs7QUFVQUcsTUFBTSxDQUFDQyxNQUFQLENBQWNqSSxVQUFkLEVBQTBCQyxRQUExQixFQUFvQ0MsT0FBcEM7ZUFFZUYsVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBlcnJvcnMsIEJBU0VEUklWRVJfSEFORExFRF9TRVRUSU5HUyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgeyBmcywgdGVtcERpciB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcblxubGV0IGV4dGVuc2lvbnMgPSB7fSxcbiAgICBjb21tYW5kcyA9IHt9LFxuICAgIGhlbHBlcnMgPSB7fTtcblxuY29tbWFuZHMuZ2V0UGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL3NvdXJjZScsICdHRVQnLCB7fSk7XG59O1xuXG5jb21tYW5kcy5nZXRDbGlwYm9hcmQgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDI5KVxuICAgID8gKGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvZ2V0X2NsaXBib2FyZCcsICdQT1NUJywge30pKVxuICAgIDogKGF3YWl0IHRoaXMuYWRiLmdldENsaXBib2FyZCgpKTtcbn07XG5cbi8vIE5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBmb3IgY29ycmVjdCB1bmljb2RlIHN1cHBvcnRcbmNvbW1hbmRzLmRvU2VuZEtleXMgPSBhc3luYyBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2tleXMnLCAnUE9TVCcsIHBhcmFtcyk7XG59O1xuXG4vLyB1aWF1dG9tYXRvcjIgZG9lc24ndCBzdXBwb3J0IG1ldGFzdGF0ZSBmb3Iga2V5ZXZlbnRzXG5jb21tYW5kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIChrZXljb2RlLCBtZXRhc3RhdGUpIHtcbiAgbG9nLmRlYnVnKGBJZ25vcmluZyBtZXRhc3RhdGUgJHttZXRhc3RhdGV9YCk7XG4gIGF3YWl0IHRoaXMuYWRiLmtleWV2ZW50KGtleWNvZGUpO1xufTtcblxuLy8gVXNlIEFEQiBzaW5jZSB3ZSBkb24ndCBoYXZlIFVpQXV0b21hdG9yXG5jb21tYW5kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudCg0KTtcbn07XG5cbmNvbW1hbmRzLmdldFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICBsb2cuaW5mbyhgTm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkLCByZXR1cm5pbmcgc3RyaW5ncyBmb3I6ICR7bGFuZ3VhZ2V9YCk7XG4gIH1cblxuICAvLyBDbGllbnRzIHJlcXVpcmUgdGhlIHJlc3VsdGluZyBtYXBwaW5nIHRvIGhhdmUgYm90aCBrZXlzXG4gIC8vIGFuZCB2YWx1ZXMgb2YgdHlwZSBzdHJpbmdcbiAgY29uc3QgcHJlcHJvY2Vzc1N0cmluZ3NNYXAgPSBmdW5jdGlvbiAobWFwcGluZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIF8udG9QYWlycyhtYXBwaW5nKSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBfLmlzU3RyaW5nKHZhbHVlKSA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIGlmICh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBzdHJpbmdzXG4gICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xuICB9XG5cbiAgaWYgKCF0aGlzLm9wdHMuYXBwICYmICF0aGlzLm9wdHMuYXBwUGFja2FnZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFwiT25lIG9mICdhcHAnIG9yICdhcHBQYWNrYWdlJyBjYXBhYmlsaXRpZXMgc2hvdWxkIG11c3QgYmUgc3BlY2lmaWVkXCIpO1xuICB9XG5cbiAgbGV0IGFwcCA9IHRoaXMub3B0cy5hcHA7XG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwcCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXBwID0gYXdhaXQgdGhpcy5hZGIucHVsbEFwayh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdG1wUm9vdCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYEZhaWxlZCB0byBwdWxsIGFuIGFwayBmcm9tICcke3RoaXMub3B0cy5hcHBQYWNrYWdlfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYXdhaXQgZnMuZXhpc3RzKGFwcCkpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgYXBwIGF0ICcke2FwcH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHthcGtTdHJpbmdzfSA9IGF3YWl0IHRoaXMuYWRiLmV4dHJhY3RTdHJpbmdzRnJvbUFwayhhcHAsIGxhbmd1YWdlLCB0bXBSb290KTtcbiAgICAgIHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0gPSBhcGtTdHJpbmdzO1xuICAgICAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKGFwa1N0cmluZ3MpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBleHRyYWN0IHN0cmluZ3MgZnJvbSAnJHthcHB9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuLy8gbWVtb2l6ZWQgaW4gY29uc3RydWN0b3JcbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy93aW5kb3cvY3VycmVudC9zaXplJywgJ0dFVCcsIHt9KTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IHRoaXMuZ2V0V2luZG93U2l6ZSgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gIH07XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG1vYmlsZUNvbW1hbmRzTWFwcGluZyA9IHtcbiAgICBzaGVsbDogJ21vYmlsZVNoZWxsJyxcblxuICAgIGV4ZWNFbXVDb25zb2xlQ29tbWFuZDogJ21vYmlsZUV4ZWNFbXVDb25zb2xlQ29tbWFuZCcsXG5cbiAgICBkcmFnR2VzdHVyZTogJ21vYmlsZURyYWdHZXN0dXJlJyxcbiAgICBmbGluZ0dlc3R1cmU6ICdtb2JpbGVGbGluZ0dlc3R1cmUnLFxuICAgIGxvbmdDbGlja0dlc3R1cmU6ICdtb2JpbGVMb25nQ2xpY2tHZXN0dXJlJyxcbiAgICBwaW5jaENsb3NlR2VzdHVyZTogJ21vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlJyxcbiAgICBwaW5jaE9wZW5HZXN0dXJlOiAnbW9iaWxlUGluY2hPcGVuR2VzdHVyZScsXG4gICAgc3dpcGVHZXN0dXJlOiAnbW9iaWxlU3dpcGVHZXN0dXJlJyxcbiAgICBzY3JvbGxHZXN0dXJlOiAnbW9iaWxlU2Nyb2xsR2VzdHVyZScsXG4gICAgc2Nyb2xsQmFja1RvOiAnbW9iaWxlU2Nyb2xsQmFja1RvJyxcbiAgICBzY3JvbGw6ICdtb2JpbGVTY3JvbGwnLFxuICAgIHZpZXdwb3J0U2NyZWVuc2hvdDogJ21vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCcsXG4gICAgdmlld3BvcnRSZWN0OiAnbW9iaWxlVmlld1BvcnRSZWN0JyxcblxuICAgIGRlZXBMaW5rOiAnbW9iaWxlRGVlcExpbmsnLFxuXG4gICAgc3RhcnRMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0JyxcbiAgICBzdG9wTG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0b3BMb2dzQnJvYWRjYXN0JyxcblxuICAgIGFjY2VwdEFsZXJ0OiAnbW9iaWxlQWNjZXB0QWxlcnQnLFxuICAgIGRpc21pc3NBbGVydDogJ21vYmlsZURpc21pc3NBbGVydCcsXG5cbiAgICBiYXR0ZXJ5SW5mbzogJ21vYmlsZUdldEJhdHRlcnlJbmZvJyxcblxuICAgIGRldmljZUluZm86ICdtb2JpbGVHZXREZXZpY2VJbmZvJyxcblxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcblxuICAgIGNoYW5nZVBlcm1pc3Npb25zOiAnbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMnLFxuICAgIGdldFBlcm1pc3Npb25zOiAnbW9iaWxlR2V0UGVybWlzc2lvbnMnLFxuXG4gICAgcGVyZm9ybUVkaXRvckFjdGlvbjogJ21vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24nLFxuXG4gICAgc3RhcnRTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZycsXG4gICAgc3RvcFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcnLFxuXG4gICAgZ2V0Tm90aWZpY2F0aW9uczogJ21vYmlsZUdldE5vdGlmaWNhdGlvbnMnLFxuXG4gICAgbGlzdFNtczogJ21vYmlsZUxpc3RTbXMnLFxuXG4gICAgdHlwZTogJ21vYmlsZVR5cGUnLFxuICAgIHNlbnNvclNldDogJ3NlbnNvclNldCcsXG5cbiAgICBkZWxldGVGaWxlOiAnbW9iaWxlRGVsZXRlRmlsZScsXG5cbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG4gIH07XG5cbiAgaWYgKCFfLmhhcyhtb2JpbGVDb21tYW5kc01hcHBpbmcsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kIFwiJHttb2JpbGVDb21tYW5kfVwiLiBgICtcbiAgICAgIGBPbmx5ICR7Xy5rZXlzKG1vYmlsZUNvbW1hbmRzTWFwcGluZyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbbW9iaWxlQ29tbWFuZHNNYXBwaW5nW21vYmlsZUNvbW1hbmRdXShvcHRzKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Vmlld3BvcnRTY3JlZW5zaG90KCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlY3RhbmdsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgUmVjdGFuZ2xlLlxuICovXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyB7UmVjdGFuZ2xlfSBUaGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVZpZXdQb3J0UmVjdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVZpZXdQb3J0UmVjdCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xufTtcblxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gKHVybCkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmwsIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVlcExpbmtPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHVybCAtIFRoZSBuYW1lIG9mIFVSTCB0byBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gcGFja2FnZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHN0YXJ0IHRoZSBVUkkgd2l0aC5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXRGb3JMYXVuY2ggW3RydWVdIC0gaWYgYGZhbHNlYCB0aGVuIGFkYiB3b24ndCB3YWl0XG4gKiBmb3IgdGhlIHN0YXJ0ZWQgYWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjb250cm9sXG4gKi9cblxuLyoqXG4gKiBTdGFydCBVUkwgdGhhdCB0YWtlIHVzZXJzIGRpcmVjdGx5IHRvIHNwZWNpZmljIGNvbnRlbnQgaW4gdGhlIGFwcFxuICogQHBhcmFtIHtEZWVwTGlua09wdHN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVlcExpbmsgPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1cmwsXG4gICAgcGFja2FnZTogcGtnLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCBwa2csIHsgd2FpdEZvckxhdW5jaCB9KTtcbn07XG5cbmNvbW1hbmRzLm9wZW5Ob3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9vcGVuX25vdGlmaWNhdGlvbnMnLCAnUE9TVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKHNldHRpbmdzKSB7XG4gIC8vIHdlIGhhdmUgc29tZSBzZXR0aW5ncyB0aGF0IGFyZSBzZXQgb24gdGhlIHNldHRpbmdzIG9iamVjdCBpbiB0aGUgZHJpdmVyXG4gIC8vIG9ubHksIGZvciBleGFtcGxlIGltYWdlIGZpbmRpbmcgc2V0dGluZ3MuIFRoZSB1aWF1dG8yIHNlcnZlciBkb2VzIG5vdCBrbm93XG4gIC8vIHdoYXQgdG8gZG8gd2l0aCB0aGVtLCBzbyBqdXN0IHNldCB0aGVtIG9uIHRoaXMgZHJpdmVyJ3Mgc2V0dGluZ3MgaW5zdGFuY2UsXG4gIC8vIGFuZCBkb24ndCBmb3J3YXJkIHRoZW0gdG8gdGhlIHNlcnZlclxuICBsZXQgZHJpdmVyT25seVNldHRpbmdzID0ge307XG4gIGxldCBzZXJ2ZXJTZXR0aW5ncyA9IHt9O1xuICBmb3IgKGxldCBbc2V0dGluZywgdmFsdWVdIG9mIF8udG9QYWlycyhzZXR0aW5ncykpIHtcbiAgICBpZiAoQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTLmluY2x1ZGVzKHNldHRpbmcpKSB7XG4gICAgICBkcml2ZXJPbmx5U2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VydmVyU2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoZHJpdmVyT25seVNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKGBGb3VuZCBzb21lIHNldHRpbmdzIGRlc2lnbmVkIHRvIGJlIGhhbmRsZWQgYnkgQmFzZURyaXZlcjogYCArXG4gICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoXy5rZXlzKGRyaXZlck9ubHlTZXR0aW5ncykpfS4gTm90IGAgK1xuICAgICAgICAgICAgIGBzZW5kaW5nIHRoZXNlIG9uIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyIGFuZCBpbnN0ZWFkIGAgK1xuICAgICAgICAgICAgIGBzZXR0aW5nIGRpcmVjdGx5IG9uIHRoZSBkcml2ZXJgKTtcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnVwZGF0ZShkcml2ZXJPbmx5U2V0dGluZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHNlcnZlclNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKCdGb3J3YXJkaW5nIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgdG8gdGhlIFVpQXV0b21hdG9yMiBzZXJ2ZXI6ICcgK1xuICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KF8ua2V5cyhzZXJ2ZXJTZXR0aW5ncykpKTtcbiAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnUE9TVCcsXG4gICAgICB7c2V0dGluZ3M6IHNlcnZlclNldHRpbmdzfSk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldFNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAvLyBhcyBhYm92ZSwgd2UgbWlnaHQgaGF2ZSBzb21lIGRyaXZlci1vbmx5IHNldHRpbmdzIHRvIHJldHVybiBhcyB3ZWxsXG4gIGNvbnN0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKTtcbiAgY29uc3Qgc2VydmVyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnR0VUJyk7XG4gIHJldHVybiB7Li4uZHJpdmVyT25seVNldHRpbmdzLCAuLi5zZXJ2ZXJTZXR0aW5nc307XG59O1xuXG4vKipcbiAqIE92ZXJyaWRpbmcgYXBwaXVtLWFuZHJvaWQtZHJpdmVyJ3Mgd3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QsXG4gKiB1bmxpa2UgaW4gYXBwaXVtLWFuZHJvaWQtZHJpdmVyIGF2b2lkaW5nIGFkYiByZXN0YXJ0aW5nIGFzIGl0IGludGVyblxuICoga2lsbHMgVWlBdXRvbWF0b3IyIHNlcnZlciBydW5uaW5nIGluIHRoZSBkZXZpY2UuXG4gKiovXG5oZWxwZXJzLndyYXBCb290c3RyYXBEaXNjb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gKHdyYXBwZWQpIHtcbiAgYXdhaXQgd3JhcHBlZCgpO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyIGFuZCByZWRpcmVjdCB0byB1aWF1dG9tYXRvcjJcbmhlbHBlcnMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbmZvIGVudHJpZXMgY2FuIGJlIGZvdW5kIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyL2Jsb2IvbWFzdGVyL2FwcC9zcmMvbWFpbi9qYXZhL2lvL2FwcGl1bS91aWF1dG9tYXRvcjIvaGFuZGxlci9HZXREZXZpY2VJbmZvLmphdmFcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0RGV2aWNlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvaW5mbycsICdHRVQnKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHlwaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfG51bWJlcnxib29sZWFufSB0ZXh0IC0gVGhlIHRleHQgdG8gdHlwZVxuICovXG5cbi8qKlxuICogVHlwZXMgdGhlIGdpdmVuIFVuaWNvZGUgc3RyaW5nLlxuICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgZm9jdXMgaXMgYWxyZWFkeSBwdXRcbiAqIHRvIHRoZSBkZXN0aW5hdGlvbiBpbnB1dCBmaWVsZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7VHlwaW5nT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW5wdXQgdGV4dCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byBhZGJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBgdGV4dGAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVR5cGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUeXBlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRleHQsXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc1VuZGVmaW5lZCh0ZXh0KSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgJ3RleHQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi50eXBlVW5pY29kZSh0ZXh0KTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VuZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
271
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sIm5hbWVzIjpbImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJnZXRQYWdlU291cmNlIiwidWlhdXRvbWF0b3IyIiwiandwcm94eSIsImNvbW1hbmQiLCJnZXRDbGlwYm9hcmQiLCJhZGIiLCJnZXRBcGlMZXZlbCIsImRvU2VuZEtleXMiLCJwYXJhbXMiLCJrZXlldmVudCIsImtleWNvZGUiLCJtZXRhc3RhdGUiLCJsb2ciLCJkZWJ1ZyIsImJhY2siLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsIl8iLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwiYXBrU3RyaW5ncyIsIm9wdHMiLCJhcHAiLCJhcHBQYWNrYWdlIiwiZXJyb3JBbmRUaHJvdyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInB1bGxBcGsiLCJlcnIiLCJtZXNzYWdlIiwiZnMiLCJleGlzdHMiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJyaW1yYWYiLCJnZXRXaW5kb3dTaXplIiwiZ2V0V2luZG93UmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwieCIsInkiLCJleGVjdXRlTW9iaWxlIiwibW9iaWxlQ29tbWFuZCIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwiZHJhZ0dlc3R1cmUiLCJmbGluZ0dlc3R1cmUiLCJkb3VibGVDbGlja0dlc3R1cmUiLCJsb25nQ2xpY2tHZXN0dXJlIiwicGluY2hDbG9zZUdlc3R1cmUiLCJwaW5jaE9wZW5HZXN0dXJlIiwic3dpcGVHZXN0dXJlIiwic2Nyb2xsR2VzdHVyZSIsInNjcm9sbEJhY2tUbyIsInNjcm9sbCIsInZpZXdwb3J0U2NyZWVuc2hvdCIsInZpZXdwb3J0UmVjdCIsImRlZXBMaW5rIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJhY2NlcHRBbGVydCIsImRpc21pc3NBbGVydCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwidHlwZSIsInNlbnNvclNldCIsImRlbGV0ZUZpbGUiLCJzdGFydFNlcnZpY2UiLCJzdG9wU2VydmljZSIsImdldENvbnRleHRzIiwiaW5zdGFsbE11bHRpcGxlQXBrcyIsImhhcyIsImVycm9ycyIsIlVua25vd25Db21tYW5kRXJyb3IiLCJrZXlzIiwibW9iaWxlVmlld3BvcnRTY3JlZW5zaG90IiwiZ2V0Vmlld3BvcnRTY3JlZW5zaG90IiwibW9iaWxlVmlld1BvcnRSZWN0IiwiZ2V0Vmlld1BvcnRSZWN0Iiwic2V0VXJsIiwidXJsIiwic3RhcnRVcmkiLCJtb2JpbGVEZWVwTGluayIsInBhY2thZ2UiLCJwa2ciLCJ3YWl0Rm9yTGF1bmNoIiwib3Blbk5vdGlmaWNhdGlvbnMiLCJ1cGRhdGVTZXR0aW5ncyIsInNldHRpbmdzIiwiZHJpdmVyT25seVNldHRpbmdzIiwic2VydmVyU2V0dGluZ3MiLCJzZXR0aW5nIiwiQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTIiwiaW5jbHVkZXMiLCJpc0VtcHR5IiwidXBkYXRlIiwiZ2V0U2V0dGluZ3MiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsIndyYXBwZWQiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsImJpbmQiLCJqd3BQcm94eUFjdGl2ZSIsIm1vYmlsZUdldERldmljZUluZm8iLCJtb2JpbGVUeXBlIiwidGV4dCIsImlzVW5kZWZpbmVkIiwidHlwZVVuaWNvZGUiLCJtb2JpbGVJbnN0YWxsTXVsdGlwbGVBcGtzIiwiaXNBcnJheSIsImFwa3MiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIkIiLCJhbGwiLCJtYXAiLCJjb25maWd1cmVBcHAiLCJBUEtfRVhURU5TSU9OIiwib3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxJQUFJQSxVQUFVLEdBQUcsRUFBakI7QUFBQSxJQUNJQyxRQUFRLEdBQUcsRUFEZjtBQUFBLElBRUlDLE9BQU8sR0FBRyxFQUZkOztBQUlBRCxRQUFRLENBQUNFLGFBQVQsR0FBeUIsa0JBQWtCO0FBQ3pDLFNBQU8sTUFBTSxLQUFLQyxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsU0FBbEMsRUFBNkMsS0FBN0MsRUFBb0QsRUFBcEQsQ0FBYjtBQUNELENBRkQ7O0FBSUFMLFFBQVEsQ0FBQ00sWUFBVCxHQUF3QixrQkFBa0I7QUFDeEMsU0FBUSxPQUFNLEtBQUtDLEdBQUwsQ0FBU0MsV0FBVCxFQUFOLElBQStCLEVBQWhDLEdBQ0YsTUFBTSxLQUFLTCxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsOEJBQWxDLEVBQWtFLE1BQWxFLEVBQTBFLEVBQTFFLENBREosR0FFRixNQUFNLEtBQUtFLEdBQUwsQ0FBU0QsWUFBVCxFQUZYO0FBR0QsQ0FKRDs7QUFPQU4sUUFBUSxDQUFDUyxVQUFULEdBQXNCLGdCQUFnQkMsTUFBaEIsRUFBd0I7QUFDNUMsUUFBTSxLQUFLUCxZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsT0FBbEMsRUFBMkMsTUFBM0MsRUFBbURLLE1BQW5ELENBQU47QUFDRCxDQUZEOztBQUtBVixRQUFRLENBQUNXLFFBQVQsR0FBb0IsZ0JBQWdCQyxPQUFoQixFQUF5QkMsU0FBekIsRUFBb0M7QUFDdERDLGtCQUFJ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QixFQUFtRDtBQUNqRCxVQUFNLElBQUl2Qyx5QkFBT3dDLG9CQUFYLENBQWdDLDhCQUFoQyxDQUFOO0FBQ0Q7O0FBQ0QsUUFBTUQsSUFBSSxHQUFHLE1BQU1FLGtCQUFFQyxHQUFGLENBQU10RyxJQUFJLENBQUNtRyxJQUFMLENBQ3RCSSxHQURzQixDQUNqQnRHLEdBQUQsSUFBUyxLQUFLaEMsT0FBTCxDQUFhdUksWUFBYixDQUEwQnZHLEdBQTFCLEVBQStCLENBQUN3Ryx5QkFBRCxDQUEvQixDQURTLENBQU4sQ0FBbkI7QUFFQSxRQUFNLEtBQUtsSSxHQUFMLENBQVNtRixtQkFBVCxDQUE2QnlDLElBQTdCLEVBQW1DbkcsSUFBSSxDQUFDMEcsT0FBeEMsQ0FBTjtBQUNELENBUEQ7O0FBU0FDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjN0ksVUFBZCxFQUEwQkMsUUFBMUIsRUFBb0NDLE9BQXBDO2VBRWVGLFUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZXJyb3JzLCBCQVNFRFJJVkVSX0hBTkRMRURfU0VUVElOR1MgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuaW1wb3J0IHsgZnMsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBBUEtfRVhURU5TSU9OIH0gZnJvbSAnLi4vZXh0ZW5zaW9ucyc7XG5cbmxldCBleHRlbnNpb25zID0ge30sXG4gICAgY29tbWFuZHMgPSB7fSxcbiAgICBoZWxwZXJzID0ge307XG5cbmNvbW1hbmRzLmdldFBhZ2VTb3VyY2UgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9zb3VyY2UnLCAnR0VUJywge30pO1xufTtcblxuY29tbWFuZHMuZ2V0Q2xpcGJvYXJkID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCkgPCAyOSlcbiAgICA/IChhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZGV2aWNlL2dldF9jbGlwYm9hcmQnLCAnUE9TVCcsIHt9KSlcbiAgICA6IChhd2FpdCB0aGlzLmFkYi5nZXRDbGlwYm9hcmQoKSk7XG59O1xuXG4vLyBOZWVkIHRvIG92ZXJyaWRlIHRoaXMgZm9yIGNvcnJlY3QgdW5pY29kZSBzdXBwb3J0XG5jb21tYW5kcy5kb1NlbmRLZXlzID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9rZXlzJywgJ1BPU1QnLCBwYXJhbXMpO1xufTtcblxuLy8gdWlhdXRvbWF0b3IyIGRvZXNuJ3Qgc3VwcG9ydCBtZXRhc3RhdGUgZm9yIGtleWV2ZW50c1xuY29tbWFuZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiAoa2V5Y29kZSwgbWV0YXN0YXRlKSB7XG4gIGxvZy5kZWJ1ZyhgSWdub3JpbmcgbWV0YXN0YXRlICR7bWV0YXN0YXRlfWApO1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChrZXljb2RlKTtcbn07XG5cbi8vIFVzZSBBREIgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBVaUF1dG9tYXRvclxuY29tbWFuZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoNCk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gKGxhbmd1YWdlKSB7XG4gIGlmICghbGFuZ3VhZ2UpIHtcbiAgICBsYW5ndWFnZSA9IGF3YWl0IHRoaXMuYWRiLmdldERldmljZUxhbmd1YWdlKCk7XG4gICAgbG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIGlmICghdGhpcy5vcHRzLmFwcCAmJiAhdGhpcy5vcHRzLmFwcFBhY2thZ2UpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhcIk9uZSBvZiAnYXBwJyBvciAnYXBwUGFja2FnZScgY2FwYWJpbGl0aWVzIHNob3VsZCBtdXN0IGJlIHNwZWNpZmllZFwiKTtcbiAgfVxuXG4gIGxldCBhcHAgPSB0aGlzLm9wdHMuYXBwO1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgaWYgKCFhcHApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcCA9IGF3YWl0IHRoaXMuYWRiLnB1bGxBcGsodGhpcy5vcHRzLmFwcFBhY2thZ2UsIHRtcFJvb3QpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHt0aGlzLm9wdHMuYXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHApKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGFwcCBhdCAnJHthcHB9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7YXBrU3RyaW5nc30gPSBhd2FpdCB0aGlzLmFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgdG1wUm9vdCk7XG4gICAgICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXBrU3RyaW5ncztcbiAgICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcChhcGtTdHJpbmdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgZXh0cmFjdCBzdHJpbmdzIGZyb20gJyR7YXBwfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gIH1cbn07XG5cbi8vIG1lbW9pemVkIGluIGNvbnN0cnVjdG9yXG5jb21tYW5kcy5nZXRXaW5kb3dTaXplID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvd2luZG93L2N1cnJlbnQvc2l6ZScsICdHRVQnLCB7fSk7XG59O1xuXG4vLyBGb3IgVzNDXG5jb21tYW5kcy5nZXRXaW5kb3dSZWN0ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBhd2FpdCB0aGlzLmdldFdpbmRvd1NpemUoKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICB9O1xufTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlTW9iaWxlID0gYXN5bmMgZnVuY3Rpb24gKG1vYmlsZUNvbW1hbmQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBtb2JpbGVDb21tYW5kc01hcHBpbmcgPSB7XG4gICAgc2hlbGw6ICdtb2JpbGVTaGVsbCcsXG5cbiAgICBleGVjRW11Q29uc29sZUNvbW1hbmQ6ICdtb2JpbGVFeGVjRW11Q29uc29sZUNvbW1hbmQnLFxuXG4gICAgZHJhZ0dlc3R1cmU6ICdtb2JpbGVEcmFnR2VzdHVyZScsXG4gICAgZmxpbmdHZXN0dXJlOiAnbW9iaWxlRmxpbmdHZXN0dXJlJyxcbiAgICBkb3VibGVDbGlja0dlc3R1cmU6ICdtb2JpbGVEb3VibGVDbGlja0dlc3R1cmUnLFxuICAgIGxvbmdDbGlja0dlc3R1cmU6ICdtb2JpbGVMb25nQ2xpY2tHZXN0dXJlJyxcbiAgICBwaW5jaENsb3NlR2VzdHVyZTogJ21vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlJyxcbiAgICBwaW5jaE9wZW5HZXN0dXJlOiAnbW9iaWxlUGluY2hPcGVuR2VzdHVyZScsXG4gICAgc3dpcGVHZXN0dXJlOiAnbW9iaWxlU3dpcGVHZXN0dXJlJyxcbiAgICBzY3JvbGxHZXN0dXJlOiAnbW9iaWxlU2Nyb2xsR2VzdHVyZScsXG4gICAgc2Nyb2xsQmFja1RvOiAnbW9iaWxlU2Nyb2xsQmFja1RvJyxcbiAgICBzY3JvbGw6ICdtb2JpbGVTY3JvbGwnLFxuICAgIHZpZXdwb3J0U2NyZWVuc2hvdDogJ21vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCcsXG4gICAgdmlld3BvcnRSZWN0OiAnbW9iaWxlVmlld1BvcnRSZWN0JyxcblxuICAgIGRlZXBMaW5rOiAnbW9iaWxlRGVlcExpbmsnLFxuXG4gICAgc3RhcnRMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0JyxcbiAgICBzdG9wTG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0b3BMb2dzQnJvYWRjYXN0JyxcblxuICAgIGFjY2VwdEFsZXJ0OiAnbW9iaWxlQWNjZXB0QWxlcnQnLFxuICAgIGRpc21pc3NBbGVydDogJ21vYmlsZURpc21pc3NBbGVydCcsXG5cbiAgICBiYXR0ZXJ5SW5mbzogJ21vYmlsZUdldEJhdHRlcnlJbmZvJyxcblxuICAgIGRldmljZUluZm86ICdtb2JpbGVHZXREZXZpY2VJbmZvJyxcblxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcblxuICAgIGNoYW5nZVBlcm1pc3Npb25zOiAnbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMnLFxuICAgIGdldFBlcm1pc3Npb25zOiAnbW9iaWxlR2V0UGVybWlzc2lvbnMnLFxuXG4gICAgcGVyZm9ybUVkaXRvckFjdGlvbjogJ21vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24nLFxuXG4gICAgc3RhcnRTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZycsXG4gICAgc3RvcFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcnLFxuXG4gICAgZ2V0Tm90aWZpY2F0aW9uczogJ21vYmlsZUdldE5vdGlmaWNhdGlvbnMnLFxuXG4gICAgbGlzdFNtczogJ21vYmlsZUxpc3RTbXMnLFxuXG4gICAgdHlwZTogJ21vYmlsZVR5cGUnLFxuICAgIHNlbnNvclNldDogJ3NlbnNvclNldCcsXG5cbiAgICBkZWxldGVGaWxlOiAnbW9iaWxlRGVsZXRlRmlsZScsXG5cbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICBpbnN0YWxsTXVsdGlwbGVBcGtzOiAnbW9iaWxlSW5zdGFsbE11bHRpcGxlQXBrcycsXG4gIH07XG5cbiAgaWYgKCFfLmhhcyhtb2JpbGVDb21tYW5kc01hcHBpbmcsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kIFwiJHttb2JpbGVDb21tYW5kfVwiLiBgICtcbiAgICAgIGBPbmx5ICR7Xy5rZXlzKG1vYmlsZUNvbW1hbmRzTWFwcGluZyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbbW9iaWxlQ29tbWFuZHNNYXBwaW5nW21vYmlsZUNvbW1hbmRdXShvcHRzKTtcbn07XG5cbmNvbW1hbmRzLm1vYmlsZVZpZXdwb3J0U2NyZWVuc2hvdCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Vmlld3BvcnRTY3JlZW5zaG90KCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlY3RhbmdsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBSZWN0YW5nbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgUmVjdGFuZ2xlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgUmVjdGFuZ2xlLlxuICovXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJucyB7UmVjdGFuZ2xlfSBUaGUgdmlld3BvcnQgY29vcmRpbmF0ZXMuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVZpZXdQb3J0UmVjdCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVZpZXdQb3J0UmVjdCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldFZpZXdQb3J0UmVjdCgpO1xufTtcblxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gKHVybCkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmwsIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVlcExpbmtPcHRzXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHVybCAtIFRoZSBuYW1lIG9mIFVSTCB0byBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gcGFja2FnZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIHN0YXJ0IHRoZSBVUkkgd2l0aC5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHdhaXRGb3JMYXVuY2ggW3RydWVdIC0gaWYgYGZhbHNlYCB0aGVuIGFkYiB3b24ndCB3YWl0XG4gKiBmb3IgdGhlIHN0YXJ0ZWQgYWN0aXZpdHkgdG8gcmV0dXJuIHRoZSBjb250cm9sXG4gKi9cblxuLyoqXG4gKiBTdGFydCBVUkwgdGhhdCB0YWtlIHVzZXJzIGRpcmVjdGx5IHRvIHNwZWNpZmljIGNvbnRlbnQgaW4gdGhlIGFwcFxuICogQHBhcmFtIHtEZWVwTGlua09wdHN9IG9wdHNcbiAqL1xuY29tbWFuZHMubW9iaWxlRGVlcExpbmsgPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB1cmwsXG4gICAgcGFja2FnZTogcGtnLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJsLCBwa2csIHsgd2FpdEZvckxhdW5jaCB9KTtcbn07XG5cbmNvbW1hbmRzLm9wZW5Ob3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2RldmljZS9vcGVuX25vdGlmaWNhdGlvbnMnLCAnUE9TVCcsIHt9KTtcbn07XG5cbmNvbW1hbmRzLnVwZGF0ZVNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKHNldHRpbmdzKSB7XG4gIC8vIHdlIGhhdmUgc29tZSBzZXR0aW5ncyB0aGF0IGFyZSBzZXQgb24gdGhlIHNldHRpbmdzIG9iamVjdCBpbiB0aGUgZHJpdmVyXG4gIC8vIG9ubHksIGZvciBleGFtcGxlIGltYWdlIGZpbmRpbmcgc2V0dGluZ3MuIFRoZSB1aWF1dG8yIHNlcnZlciBkb2VzIG5vdCBrbm93XG4gIC8vIHdoYXQgdG8gZG8gd2l0aCB0aGVtLCBzbyBqdXN0IHNldCB0aGVtIG9uIHRoaXMgZHJpdmVyJ3Mgc2V0dGluZ3MgaW5zdGFuY2UsXG4gIC8vIGFuZCBkb24ndCBmb3J3YXJkIHRoZW0gdG8gdGhlIHNlcnZlclxuICBsZXQgZHJpdmVyT25seVNldHRpbmdzID0ge307XG4gIGxldCBzZXJ2ZXJTZXR0aW5ncyA9IHt9O1xuICBmb3IgKGxldCBbc2V0dGluZywgdmFsdWVdIG9mIF8udG9QYWlycyhzZXR0aW5ncykpIHtcbiAgICBpZiAoQkFTRURSSVZFUl9IQU5ETEVEX1NFVFRJTkdTLmluY2x1ZGVzKHNldHRpbmcpKSB7XG4gICAgICBkcml2ZXJPbmx5U2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VydmVyU2V0dGluZ3Nbc2V0dGluZ10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoZHJpdmVyT25seVNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKGBGb3VuZCBzb21lIHNldHRpbmdzIGRlc2lnbmVkIHRvIGJlIGhhbmRsZWQgYnkgQmFzZURyaXZlcjogYCArXG4gICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoXy5rZXlzKGRyaXZlck9ubHlTZXR0aW5ncykpfS4gTm90IGAgK1xuICAgICAgICAgICAgIGBzZW5kaW5nIHRoZXNlIG9uIHRvIHRoZSBVaUF1dG9tYXRvcjIgc2VydmVyIGFuZCBpbnN0ZWFkIGAgK1xuICAgICAgICAgICAgIGBzZXR0aW5nIGRpcmVjdGx5IG9uIHRoZSBkcml2ZXJgKTtcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzLnVwZGF0ZShkcml2ZXJPbmx5U2V0dGluZ3MpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHNlcnZlclNldHRpbmdzKSkge1xuICAgIGxvZy5pbmZvKCdGb3J3YXJkaW5nIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgdG8gdGhlIFVpQXV0b21hdG9yMiBzZXJ2ZXI6ICcgK1xuICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KF8ua2V5cyhzZXJ2ZXJTZXR0aW5ncykpKTtcbiAgICBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnUE9TVCcsXG4gICAgICB7c2V0dGluZ3M6IHNlcnZlclNldHRpbmdzfSk7XG4gIH1cbn07XG5cbmNvbW1hbmRzLmdldFNldHRpbmdzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAvLyBhcyBhYm92ZSwgd2UgbWlnaHQgaGF2ZSBzb21lIGRyaXZlci1vbmx5IHNldHRpbmdzIHRvIHJldHVybiBhcyB3ZWxsXG4gIGNvbnN0IGRyaXZlck9ubHlTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MuZ2V0U2V0dGluZ3MoKTtcbiAgY29uc3Qgc2VydmVyU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vc2V0dGluZ3MnLCAnR0VUJyk7XG4gIHJldHVybiB7Li4uZHJpdmVyT25seVNldHRpbmdzLCAuLi5zZXJ2ZXJTZXR0aW5nc307XG59O1xuXG4vKipcbiAqIE92ZXJyaWRpbmcgYXBwaXVtLWFuZHJvaWQtZHJpdmVyJ3Mgd3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QsXG4gKiB1bmxpa2UgaW4gYXBwaXVtLWFuZHJvaWQtZHJpdmVyIGF2b2lkaW5nIGFkYiByZXN0YXJ0aW5nIGFzIGl0IGludGVyblxuICoga2lsbHMgVWlBdXRvbWF0b3IyIHNlcnZlciBydW5uaW5nIGluIHRoZSBkZXZpY2UuXG4gKiovXG5oZWxwZXJzLndyYXBCb290c3RyYXBEaXNjb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gKHdyYXBwZWQpIHtcbiAgYXdhaXQgd3JhcHBlZCgpO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyIGFuZCByZWRpcmVjdCB0byB1aWF1dG9tYXRvcjJcbmhlbHBlcnMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLnVpYXV0b21hdG9yMi5wcm94eVJlcVJlcy5iaW5kKHRoaXMudWlhdXRvbWF0b3IyKTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbmZvIGVudHJpZXMgY2FuIGJlIGZvdW5kIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS11aWF1dG9tYXRvcjItc2VydmVyL2Jsb2IvbWFzdGVyL2FwcC9zcmMvbWFpbi9qYXZhL2lvL2FwcGl1bS91aWF1dG9tYXRvcjIvaGFuZGxlci9HZXREZXZpY2VJbmZvLmphdmFcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0RGV2aWNlSW5mbyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9kZXZpY2UvaW5mbycsICdHRVQnKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHlwaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHshc3RyaW5nfG51bWJlcnxib29sZWFufSB0ZXh0IC0gVGhlIHRleHQgdG8gdHlwZVxuICovXG5cbi8qKlxuICogVHlwZXMgdGhlIGdpdmVuIFVuaWNvZGUgc3RyaW5nLlxuICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgZm9jdXMgaXMgYWxyZWFkeSBwdXRcbiAqIHRvIHRoZSBkZXN0aW5hdGlvbiBpbnB1dCBmaWVsZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7VHlwaW5nT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW5wdXQgdGV4dCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2VudCB0byBhZGJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBgdGV4dGAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHByb3ZpZGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVR5cGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUeXBlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHRleHQsXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc1VuZGVmaW5lZCh0ZXh0KSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgJ3RleHQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi50eXBlVW5pY29kZSh0ZXh0KTtcbn07XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhcnRpYWxJbnN0YWxsIFtmYWxzZV0gLSBJbnN0YWxsIGFwa3MgcGFydGlhbGx5LiBJdCBpcyB1c2VkIGZvciAnaW5zdGFsbC1tdWx0aXBsZScuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vYW5kcm9pZC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTExMDY0L3doYXQtaXMtYS1wYXJ0aWFsLWFwcGxpY2F0aW9uLWluc3RhbGwtdmlhLWFkYlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE11bHRpcGxlQXBrc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gYXBrcyAtIFRoZSBsaXN0IG9mIEFQS3MgdG8gaW5zdGFsbC4gRWFjaCBBUEsgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGFwa1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG93bmxvYWRhYmxlIFVSTCBhcyBIVFRQL0hUVFBTLlxuICogQHByb3BlcnR5IHtJbnN0YWxsT3B0aW9uc30gb3B0aW9uc1xuICovXG5cbi8qKlxuICogSW5zdGFsbCBtdWx0aXBsZSBBUEtzIHdpdGggYGluc3RhbGwtbXVsdGlwbGVgIG9wdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0luc3RhbGxNdWx0aXBsZUFwa3NPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBpbnN0YWxsaW5nIHRoZSBnaXZlbiBBUEtzLlxuICovXG5jb21tYW5kcy5tb2JpbGVJbnN0YWxsTXVsdGlwbGVBcGtzID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNBcnJheShvcHRzLmFwa3MpIHx8IF8uaXNFbXB0eShvcHRzLmFwa3MpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcignTm8gYXBrcyBhcmUgZ2l2ZW4gdG8gaW5zdGFsbCcpO1xuICB9XG4gIGNvbnN0IGFwa3MgPSBhd2FpdCBCLmFsbChvcHRzLmFwa3NcbiAgICAubWFwKChhcHApID0+IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwLCBbQVBLX0VYVEVOU0lPTl0pKSk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGxNdWx0aXBsZUFwa3MoYXBrcywgb3B0cy5vcHRpb25zKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VuZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -55,6 +55,18 @@ commands.mobileLongClickGesture = async function mobileLongClickGesture(opts = {
55
55
  });
56
56
  };
57
57
 
58
+ commands.mobileDoubleClickGesture = async function mobileDoubleClickGesture(opts = {}) {
59
+ const {
60
+ elementId,
61
+ x,
62
+ y
63
+ } = opts;
64
+ return await this.uiautomator2.jwproxy.command('/appium/gestures/double_click', 'POST', {
65
+ origin: toOrigin(elementId),
66
+ offset: toPoint(x, y)
67
+ });
68
+ };
69
+
58
70
  commands.mobileDragGesture = async function mobileDragGesture(opts = {}) {
59
71
  const {
60
72
  elementId,
@@ -205,4 +217,4 @@ var _default = commands;
205
217
  exports.default = _default;require('source-map-support').install();
206
218
 
207
219
 
208
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlcy5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsInRvT3JpZ2luIiwiZWxlbWVudCIsInV0aWwiLCJ3cmFwRWxlbWVudCIsInVud3JhcEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJ0b1BvaW50IiwieCIsInkiLCJfIiwiaXNGaW5pdGUiLCJ0b1JlY3QiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJzb21lIiwidiIsIm1vYmlsZUxvbmdDbGlja0dlc3R1cmUiLCJvcHRzIiwiZWxlbWVudElkIiwiZHVyYXRpb24iLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsIm9yaWdpbiIsIm9mZnNldCIsIm1vYmlsZURyYWdHZXN0dXJlIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzcGVlZCIsInN0YXJ0IiwiZW5kIiwibW9iaWxlRmxpbmdHZXN0dXJlIiwiZGlyZWN0aW9uIiwiYXJlYSIsIm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIiwicGVyY2VudCIsIm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUiLCJtb2JpbGVTd2lwZUdlc3R1cmUiLCJtb2JpbGVTY3JvbGxHZXN0dXJlIiwibW9iaWxlU2Nyb2xsQmFja1RvIiwiZWxlbWVudFRvSWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1vYmlsZVNjcm9sbCIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYXhTd2lwZXMiLCJwYXJhbXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOztBQUdBLFNBQVNDLFFBQVQsQ0FBbUJDLE9BQW5CLEVBQTRCO0FBQzFCLFNBQU9BLE9BQU8sR0FBR0Msb0JBQUtDLFdBQUwsQ0FBaUJELG9CQUFLRSxhQUFMLENBQW1CSCxPQUFuQixDQUFqQixDQUFILEdBQW1ESSxTQUFqRTtBQUNEOztBQUVELFNBQVNDLE9BQVQsQ0FBa0JD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QTRCO0FBQzFCLFVBQU0sSUFBSUoseUJBQU9DLG9CQUFYLENBQWlDLHVEQUFqQyxDQUFOO0FBQ0Q7O0FBQ0QsU0FBTyxNQUFNLEtBQUt4QixZQUFMLENBQWtCQyxPQUFsQixDQUEwQkMsT0FBMUIsQ0FBa0MsZUFBbEMsRUFBbUQsTUFBbkQsRUFBMkQ7QUFDdEUyQixJQUFBQSxNQUFNLEVBQUU7QUFDTjFCLE1BQUFBLE1BQU0sRUFBRXpCLFFBQVEsQ0FBQ0MsT0FBRCxDQURWO0FBRU4rQyxNQUFBQSxRQUZNO0FBRUlDLE1BQUFBLFFBRko7QUFFY0MsTUFBQUE7QUFGZDtBQUQ4RCxHQUEzRCxDQUFiO0FBTUQsQ0FYRDs7ZUFhZW5ELFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cblxuZnVuY3Rpb24gdG9PcmlnaW4gKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyB1dGlsLndyYXBFbGVtZW50KHV0aWwudW53cmFwRWxlbWVudChlbGVtZW50KSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHRvUG9pbnQgKHgsIHkpIHtcbiAgcmV0dXJuIF8uaXNGaW5pdGUoeCkgJiYgXy5pc0Zpbml0ZSh5KSA/IHt4LCB5fSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdG9SZWN0IChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpIHtcbiAgaWYgKFtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHRdLnNvbWUoKHYpID0+ICFfLmlzRmluaXRlKHYpKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHR9O1xufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9uZ0NsaWNrT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY2xpY2tlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbiBib3RoIGNsaWNrIG9mZnNldCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgb2Zmc2V0IGFyZSBwcm92aWRlZCB0aGVuIHRoZSBjb29yZGluYXRlc1xuICogYXJlIHBhcnNlZCBhcyByZWxhdGl2ZSBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geCAtIFRoZSB4IGNvb3JkaW5hdGUgdG8gY2xpY2sgb25cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGUgdG8gY2xpY2sgb25cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gZHVyYXRpb24gWzUwMF0gLSBDbGljayBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gKiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgY2xpY2sgdGhhdCBsYXN0cyBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uXG4gKlxuICogQHBhcmFtIHs/TG9uZ0NsaWNrT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVMb25nQ2xpY2tHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTG9uZ0NsaWNrR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgeCwgeSxcbiAgICBkdXJhdGlvbixcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvbG9uZ19jbGljaycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBvZmZzZXQ6IHRvUG9pbnQoeCwgeSksXG4gICAgZHVyYXRpb24sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEcmFnT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZHJhZ2dlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiB0aGUgc3RhcnQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIHRoZSBzdGFydCBjb29yZGluYXRlcyBhcmUgcHJvdmlkZWQgdGhlbiB0aGVzZVxuICogY29vcmRpbmF0ZXMgYXJlIGNvbnNpZGVyZWQgYXMgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBlbGVtZW50IGNvcm5lci5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3RhcnRYIC0gVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRzXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHN0YXJ0WSAtIFRoZSB5IGNvb3JkaW5hdGUgd2hlcmUgdGhlIGRyYWdnaW5nIHN0YXJ0c1xuICogQHByb3BlcnR5IHshbnVtYmVyfSBlbmRYIC0gVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgZW5kc1xuICogQHByb3BlcnR5IHshbnVtYmVyfSBlbmRZIC0gVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgZW5kc1xuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbMjUwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtXG4gKiB0aGlzIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogRHJhZ3MgdGhpcyBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gez9EcmFnT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVEcmFnR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURyYWdHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBzdGFydFgsIHN0YXJ0WSxcbiAgICBlbmRYLCBlbmRZLFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9kcmFnJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIHN0YXJ0OiB0b1BvaW50KHN0YXJ0WCwgc3RhcnRZKSxcbiAgICBlbmQ6IHRvUG9pbnQoZW5kWCwgZW5kWSksXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBGbGluZ09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIGZsaW5nZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gZmxpbmcgYm91bmRpbmcgYXJlYSBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhpc1xuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0b3AgLSBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIGZsaW5nIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBkaXJlY3Rpb24gLSBEaXJlY3Rpb24gb2YgdGhlIGZsaW5nLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOiBgdXBgLCBgZG93bmAsIGBsZWZ0YCBhbmQgYHJpZ2h0YCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzc1MDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybSB0aGlzXG4gKiBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gZmxpbmdcbiAqIHZlbG9jaXR5IGZvciB0aGUgZ2l2ZW4gdmlldyAoNTAgYnkgZGVmYXVsdClcbiAqL1xuXG4vKipcbiAqIERyYWdzIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIHs/RmxpbmdPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGNhbiBzdGlsbCBzY3JvbGwgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi5cbiAqL1xuY29tbWFuZHMubW9iaWxlRmxpbmdHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRmxpbmdHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgZGlyZWN0aW9uLFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9mbGluZycsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQaW5jaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIHBpbmNoZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gcGluY2ggYm91bmRpbmcgYXJlYSBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhlXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgcGluY2ggYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IHBlcmNlbnQgLSBUaGUgc2l6ZSBvZiB0aGUgcGluY2ggYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBwaW5jaCBhcmVhIHNpemUuXG4gKiBWYWxpZCB2YWx1ZXMgbXVzdCBiZSBmbG9hdCBudW1iZXJzIGluIHJhbmdlIDAuLjEsIHdoZXJlIDEuMCBpcyAxMDAlXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFsyNTAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm1cbiAqIHRoaXMgZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHBpbmNoIGNsb3NlIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/UGluY2hPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGluY2hDbG9zZUdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9waW5jaF9jbG9zZScsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBwaW5jaCBvcGVuIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/UGluY2hPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQaW5jaE9wZW5HZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvcGluY2hfb3BlbicsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dpcGVPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBzd2lwZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpZCBpcyBtaXNzaW5nIHRoZW4gc3dpcGUgYm91bmRpbmcgYXJlYSBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhlXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGRpcmVjdGlvbiAtIERpcmVjdGlvbiBvZiB0aGUgc3dpcGUuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6IGB1cGAsIGBkb3duYCwgYGxlZnRgIGFuZCBgcmlnaHRgIChjYXNlIGluc2Vuc2l0aXZlKVxuICogQHByb3BlcnR5IHshbnVtYmVyfSBwZXJjZW50IC0gVGhlIHNpemUgb2YgdGhlIHN3aXBlIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgc3dpcGUgYXJlYSBzaXplLlxuICogVmFsaWQgdmFsdWVzIG11c3QgYmUgZmxvYXQgbnVtYmVycyBpbiByYW5nZSAwLi4xLCB3aGVyZSAxLjAgaXMgMTAwJVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbNTAwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtIHRoaXNcbiAqIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBzd2lwZSBnZXN0dXJlLlxuICpcbiAqIEBwYXJhbSB7P1N3aXBlT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICovXG5jb21tYW5kcy5tb2JpbGVTd2lwZUdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTd2lwZUdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvc3dpcGUnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgYXJlYTogdG9SZWN0KGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCksXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JvbGxPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBzY3JvbGxlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBzY3JvbGwgYm91bmRpbmcgYXJlYSBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhIGFyZSBwcm92aWRlZCB0aGVuIHRoaXNcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGggb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHNjcm9sbCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGRpcmVjdGlvbiAtIERpcmVjdGlvbiBvZiB0aGUgc2Nyb2xsLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOiBgdXBgLCBgZG93bmAsIGBsZWZ0YCBhbmQgYHJpZ2h0YCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gcGVyY2VudCAtIFRoZSBzaXplIG9mIHRoZSBzY3JvbGwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBzY3JvbGxpbmcgYXJlYSBzaXplLlxuICogVmFsaWQgdmFsdWVzIG11c3QgYmUgZmxvYXQgbnVtYmVycyBncmVhdGVyIHRoYW4gemVybywgd2hlcmUgMS4wIGlzIDEwMCVcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzUwMDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybSB0aGlzIGdlc3R1cmVcbiAqIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgc2Nyb2xsIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/U2Nyb2xsT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHByb3ZpZGVkIG9wdGlvbnMgYXJlIG5vdCB2YWxpZFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG9iamVjdCBjYW4gc3RpbGwgc2Nyb2xsIGluIHRoZSBnaXZlbiBkaXJlY3Rpb24uXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbEdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTY3JvbGxHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsXG4gICAgZGlyZWN0aW9uLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3Njcm9sbCcsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcm9sbEVsZW1lbnRUb0VsZW1lbnRPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWxlbWVudElkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnQsXG4gKiB3aGljaCBpcyBnb2luZyB0byBiZSBzY3JvbGxlZC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiBpcyBhIHZhbGlkIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBpdCB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgXG4gKiBzdHJhdGVneS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbGVtZW50VG9JZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaXRlbSwgd2hpY2ggYmVsb25nc1xuICogdG8gdGhlIHNjcm9sbGFibGUgZWxlbWVudCBhYm92ZSwgYW5kIHdoaWNoIHNob3VsZCBiZWNvbWUgdmlzaWJsZSBhZnRlclxuICogdGhlIHNjcm9sbGluZyBvcGVyYXRpb24gaXMgZmluaXNoZWQuIEl0IGlzIHJlcXVpcmVkIHRoaXMgZWxlbWVudFxuICogd2FzIGxvY2F0ZWQgYnkgYC1hbmRyb2lkIHVpYXV0b21hdG9yYCBzdHJhdGVneS5cbiAqL1xuXG4vKipcbiAqIFNjcm9sbHMgdGhlIGdpdmVuIHNjcm9sbGFibGUgZWxlbWVudCBgZWxlbWVudElkYCB1bnRpbCBgZWxlbWVudFRvSWRgXG4gKiBiZWNvbWVzIHZpc2libGUuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGUgYGVsZW1lbnRUb0lkYFxuICogaXMgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSB2aWV3IHBvcnQuIE90aGVyd2lzZSBpdCB3b3VsZCBzY3JvbGxcbiAqIHRvIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgc2Nyb2xsYWJsZSBjb250cm9sIGFuZCB0cmllcyB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gZWxlbWVudFxuICogYnkgc2Nyb2xsaW5nIGl0cyBwYXJlbnQgdG8gdGhlIGVuZCBzdGVwIGJ5IHN0ZXAuIFRoZSBzY3JvbGwgZGlyZWN0aW9uICh2ZXJ0aWNhbCBvciBob3Jpem9udGFsKVxuICogaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0ge1Njcm9sbEVsZW1lbnRUb0VsZW1lbnRPcHRzfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHNjcm9sbGluZyBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZFxuICovXG5jb21tYW5kcy5tb2JpbGVTY3JvbGxCYWNrVG8gPSBhc3luYyBmdW5jdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtlbGVtZW50SWQsIGVsZW1lbnRUb0lkfSA9IG9wdHM7XG4gIGlmICghZWxlbWVudElkIHx8ICFlbGVtZW50VG9JZCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYEJvdGggZWxlbWVudElkIGFuZCBlbGVtZW50VG9JZCBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoXG4gICAgYC9hcHBpdW0vZWxlbWVudC8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50SWQpfS9zY3JvbGxfdG8vJHt1dGlsLnVud3JhcEVsZW1lbnQoZWxlbWVudFRvSWQpfWAsICdQT1NUJywge30pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JvbGxPcHRzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnQgVGhlIGlkZW50aWZpZXIgb2YgYW4gZWxlbWVudC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiBpcyBhIHZhbGlkIHNjcm9sbGFibGUgY29udGFpbmVyIGFuZCBpdCB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgXG4gKiBzdHJhdGVneS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJvdmlkZWQgdGhlbiB0aGUgZmlyc3QgY3VycmVudGx5IGF2YWlsYWJsZSBzY3JvbGxhYmxlIHZpZXdcbiAqIGlzIHNlbGVjdGVkIGZvciB0aGUgaW50ZXJhY3Rpb24uXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHN0cmF0ZWd5IFRoZSBmb2xsb3dpbmcgc3RyYXRlZ2llcyBhcmUgc3VwcG9ydGVkOlxuICogLSBgYWNjZXNzaWJpbGl0eSBpZGAgKFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbilcbiAqIC0gYGNsYXNzIG5hbWVgIChVaVNlbGVjdG9yKCkuY2xhc3NOYW1lKVxuICogLSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgIChVaVNlbGVjdG9yKVxuICogQHByb3BlcnR5IHshc3RyaW5nfSBzZWxlY3RvciBUaGUgY29ycmVzcG9uZGluZyBsb29rdXAgdmFsdWUgZm9yIHRoZSBnaXZlblxuICogc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IG1heFN3aXBlcyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dpcGVzIHRvIHBlcmZvcm1cbiAqIG9uIHRoZSB0YXJnZXQgc2Nyb2xsYWJsZSB2aWV3IGluIG9yZGVyIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50LlxuICogSW4gY2FzZSB0aGlzIHZhbHVlIGlzIHVuc2V0IHRoZW4gaXQgd291bGQgYmUgcmV0cmlldmVkIGZyb20gdGhlIHNjcm9sbGFibGVcbiAqIGVsZW1lbnQgaXRzZWxmICh2dWEgYGdldE1heFNlYXJjaFN3aXBlcygpYCBwcm9wZXJ0eSkuXG4gKi9cblxuLyoqXG4gKiBTY3JvbGxzIHRoZSBnaXZlbiBzY3JvbGxhYmxlIGVsZW1lbnQgdW50aWwgdGhlIGVsZW1lbnQgaWRlbnRpZmllZFxuICogYnkgYHN0cmF0ZWd5YCBhbmQgYHNlbGVjdG9yYCBiZWNvbWVzIHZpc2libGUuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSBpZiB0aGVcbiAqIGRlc3RpbmF0aW9uIGVsZW1lbnQgaXMgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSB2aWV3IHBvcnQuIE90aGVyd2lzZSBpdCB3b3VsZCBzY3JvbGxcbiAqIHRvIHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB0aGUgc2Nyb2xsYWJsZSBjb250cm9sIGFuZCB0cmllcyB0byByZWFjaCB0aGUgZGVzdGluYXRpb24gZWxlbWVudFxuICogYnkgc2Nyb2xsaW5nIGl0cyBwYXJlbnQgdG8gdGhlIGVuZCBzdGVwIGJ5IHN0ZXAuIFRoZSBzY3JvbGwgZGlyZWN0aW9uICh2ZXJ0aWNhbCBvciBob3Jpem9udGFsKVxuICogaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS5cbiAqXG4gKiBAcGFyYW0ge1Njcm9sbE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbCA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnQsIHN0cmF0ZWd5LCBzZWxlY3RvciwgbWF4U3dpcGVzfSA9IG9wdHM7XG4gIGlmICghc3RyYXRlZ3kgfHwgIXNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgQm90aCBzdHJhdGVneSBhbmQgc2VsZWN0b3IgYXJndW1lbnRzIG11c3QgYmUgcHJvdmlkZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvdG91Y2gvc2Nyb2xsJywgJ1BPU1QnLCB7XG4gICAgcGFyYW1zOiB7XG4gICAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnQpLFxuICAgICAgc3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXNcbiAgICB9LFxuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvZ2VzdHVyZXMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
220
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9nZXN0dXJlcy5qcyJdLCJuYW1lcyI6WyJjb21tYW5kcyIsInRvT3JpZ2luIiwiZWxlbWVudCIsInV0aWwiLCJ3cmFwRWxlbWVudCIsInVud3JhcEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJ0b1BvaW50IiwieCIsInkiLCJfIiwiaXNGaW5pdGUiLCJ0b1JlY3QiLCJsZWZ0IiwidG9wIiwid2lkdGgiLCJoZWlnaHQiLCJzb21lIiwidiIsIm1vYmlsZUxvbmdDbGlja0dlc3R1cmUiLCJvcHRzIiwiZWxlbWVudElkIiwiZHVyYXRpb24iLCJ1aWF1dG9tYXRvcjIiLCJqd3Byb3h5IiwiY29tbWFuZCIsIm9yaWdpbiIsIm9mZnNldCIsIm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSIsIm1vYmlsZURyYWdHZXN0dXJlIiwic3RhcnRYIiwic3RhcnRZIiwiZW5kWCIsImVuZFkiLCJzcGVlZCIsInN0YXJ0IiwiZW5kIiwibW9iaWxlRmxpbmdHZXN0dXJlIiwiZGlyZWN0aW9uIiwiYXJlYSIsIm1vYmlsZVBpbmNoQ2xvc2VHZXN0dXJlIiwicGVyY2VudCIsIm1vYmlsZVBpbmNoT3Blbkdlc3R1cmUiLCJtb2JpbGVTd2lwZUdlc3R1cmUiLCJtb2JpbGVTY3JvbGxHZXN0dXJlIiwibW9iaWxlU2Nyb2xsQmFja1RvIiwiZWxlbWVudFRvSWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1vYmlsZVNjcm9sbCIsInN0cmF0ZWd5Iiwic2VsZWN0b3IiLCJtYXhTd2lwZXMiLCJwYXJhbXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOztBQUdBLFNBQVNDLFFBQVQsQ0FBbUJDLE9BQW5CLEVBQTRCO0FBQzFCLFNBQU9BLE9BQU8sR0FBR0Msb0JBQUtDLFdBQUwsQ0FBaUJELG9CQUFLRSxhQUFMLENBQW1CSCxPQUFuQixDQUFqQixDQUFILEdBQW1ESSxTQUFqRTtB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LFNBQU8sTUFBTSxLQUFLekIsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLE9BQTFCLENBQ1YsbUJBQWtCdEIsb0JBQUtFLGFBQUwsQ0FBbUJnQixTQUFuQixDQUE4QixjQUFhbEIsb0JBQUtFLGFBQUwsQ0FBbUJ5QyxXQUFuQixDQUFnQyxFQURuRixFQUNzRixNQUR0RixFQUM4RixFQUQ5RixDQUFiO0FBRUQsQ0FQRDs7QUFzQ0E5QyxRQUFRLENBQUNpRCxZQUFULEdBQXdCLGdCQUFnQjdCLElBQUksR0FBRyxFQUF2QixFQUEyQjtBQUNqRCxRQUFNO0FBQUNsQixJQUFBQSxPQUFEO0FBQVVnRCxJQUFBQSxRQUFWO0FBQW9CQyxJQUFBQSxRQUFwQjtBQUE4QkMsSUFBQUE7QUFBOUIsTUFBMkNoQyxJQUFqRDs7QUFDQSxNQUFJLENBQUM4QixRQUFELElBQWEsQ0FBQ0MsUUFBbEIsRUFBNEI7QUFDMUIsVUFBTSxJQUFJSix5QkFBT0Msb0JBQVgsQ0FBaUMsdURBQWpDLENBQU47QUFDRDs7QUFDRCxTQUFPLE1BQU0sS0FBS3pCLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxPQUExQixDQUFrQyxlQUFsQyxFQUFtRCxNQUFuRCxFQUEyRDtBQUN0RTRCLElBQUFBLE1BQU0sRUFBRTtBQUNOM0IsTUFBQUEsTUFBTSxFQUFFekIsUUFBUSxDQUFDQyxPQUFELENBRFY7QUFFTmdELE1BQUFBLFFBRk07QUFFSUMsTUFBQUEsUUFGSjtBQUVjQyxNQUFBQTtBQUZkO0FBRDhELEdBQTNELENBQWI7QUFNRCxDQVhEOztlQWFlcEQsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtLWJhc2UtZHJpdmVyJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuXG5mdW5jdGlvbiB0b09yaWdpbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IHV0aWwud3JhcEVsZW1lbnQodXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnQpKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdG9Qb2ludCAoeCwgeSkge1xuICByZXR1cm4gXy5pc0Zpbml0ZSh4KSAmJiBfLmlzRmluaXRlKHkpID8ge3gsIHl9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB0b1JlY3QgKGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCkge1xuICBpZiAoW2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodF0uc29tZSgodikgPT4gIV8uaXNGaW5pdGUodikpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4ge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodH07XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb25nQ2xpY2tPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBjbGlja2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuIGJvdGggY2xpY2sgb2Zmc2V0IGNvb3JkaW5hdGVzIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCBvZmZzZXQgYXJlIHByb3ZpZGVkIHRoZW4gdGhlIGNvb3JkaW5hdGVzXG4gKiBhcmUgcGFyc2VkIGFzIHJlbGF0aXZlIG9mZnNldHMgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50LlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZSB0byBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBkdXJhdGlvbiBbNTAwXSAtIENsaWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAqIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBjbGljayB0aGF0IGxhc3RzIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb25cbiAqXG4gKiBAcGFyYW0gez9Mb25nQ2xpY2tPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUxvbmdDbGlja0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVMb25nQ2xpY2tHZXN0dXJlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGVsZW1lbnRJZCxcbiAgICB4LCB5LFxuICAgIGR1cmF0aW9uLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9sb25nX2NsaWNrJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIG9mZnNldDogdG9Qb2ludCh4LCB5KSxcbiAgICBkdXJhdGlvbixcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERvdWJsZUNsaWNrT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZG91YmxlIGNsaWNrZWQuXG4gKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4gYm90aCBjbGljayBvZmZzZXQgY29vcmRpbmF0ZXMgbXVzdCBiZSBwcm92aWRlZC5cbiAqIElmIGJvdGggdGhlIGVsZW1lbnQgaWQgYW5kIG9mZnNldCBhcmUgcHJvdmlkZWQgdGhlbiB0aGUgY29vcmRpbmF0ZXNcbiAqIGFyZSBwYXJzZWQgYXMgcmVsYXRpdmUgb2Zmc2V0cyBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlIHRvIGRvdWJsZSBjbGljayBvblxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB5IC0gVGhlIHkgY29vcmRpbmF0ZSB0byBkb3VibGUgY2xpY2sgb25cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgY2xpY2sgdGhhdCBsYXN0cyBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uXG4gKlxuICogQHBhcmFtIHs/RG91YmxlQ2xpY2tPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZURvdWJsZUNsaWNrR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgeCwgeSxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvZG91YmxlX2NsaWNrJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIG9mZnNldDogdG9Qb2ludCh4LCB5KSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERyYWdPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGVsZW1lbnRJZCAtIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0byBiZSBkcmFnZ2VkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHRoZSBzdGFydCBjb29yZGluYXRlcyBtdXN0IGJlIHByb3ZpZGVkLlxuICogSWYgYm90aCB0aGUgZWxlbWVudCBpZCBhbmQgdGhlIHN0YXJ0IGNvb3JkaW5hdGVzIGFyZSBwcm92aWRlZCB0aGVuIHRoZXNlXG4gKiBjb29yZGluYXRlcyBhcmUgY29uc2lkZXJlZCBhcyBvZmZzZXRzIGZyb20gdGhlIHRvcCBsZWZ0IGVsZW1lbnQgY29ybmVyLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzdGFydFggLSBUaGUgeCBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydHNcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3RhcnRZIC0gVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgZHJhZ2dpbmcgc3RhcnRzXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IGVuZFggLSBUaGUgeCBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBlbmRzXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IGVuZFkgLSBUaGUgeSBjb29yZGluYXRlIHdoZXJlIHRoZSBkcmFnZ2luZyBlbmRzXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFsyNTAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm1cbiAqIHRoaXMgZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBEcmFncyB0aGlzIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7P0RyYWdPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURyYWdHZXN0dXJlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlRHJhZ0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIHN0YXJ0WCwgc3RhcnRZLFxuICAgIGVuZFgsIGVuZFksXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2RyYWcnLCAnUE9TVCcsIHtcbiAgICBvcmlnaW46IHRvT3JpZ2luKGVsZW1lbnRJZCksXG4gICAgc3RhcnQ6IHRvUG9pbnQoc3RhcnRYLCBzdGFydFkpLFxuICAgIGVuZDogdG9Qb2ludChlbmRYLCBlbmRZKSxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEZsaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZmxpbmdlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBmbGluZyBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGlzXG4gKiBhcmVhIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGxlZnQgLSBUaGUgbGVmdCBjb29yZGluYXRlIG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRvcCAtIFRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgZmxpbmcgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBmbGluZyBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGRpcmVjdGlvbiAtIERpcmVjdGlvbiBvZiB0aGUgZmxpbmcuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6IGB1cGAsIGBkb3duYCwgYGxlZnRgIGFuZCBgcmlnaHRgIChjYXNlIGluc2Vuc2l0aXZlKVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbNzUwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtIHRoaXNcbiAqIGdlc3R1cmUgaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSBmbGluZ1xuICogdmVsb2NpdHkgZm9yIHRoZSBnaXZlbiB2aWV3ICg1MCBieSBkZWZhdWx0KVxuICovXG5cbi8qKlxuICogRHJhZ3MgdG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gez9GbGluZ09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBvYmplY3QgY2FuIHN0aWxsIHNjcm9sbCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLlxuICovXG5jb21tYW5kcy5tb2JpbGVGbGluZ0dlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVGbGluZ0dlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBkaXJlY3Rpb24sXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL2ZsaW5nJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBpbmNoT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBlbGVtZW50SWQgLSBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgcGluY2hlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBwaW5jaCBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgcGluY2ggYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGVcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBwaW5jaCBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHBpbmNoIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IW51bWJlcn0gcGVyY2VudCAtIFRoZSBzaXplIG9mIHRoZSBwaW5jaCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHBpbmNoIGFyZWEgc2l6ZS5cbiAqIFZhbGlkIHZhbHVlcyBtdXN0IGJlIGZsb2F0IG51bWJlcnMgaW4gcmFuZ2UgMC4uMSwgd2hlcmUgMS4wIGlzIDEwMCVcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gc3BlZWQgWzI1MDAgKiBkaXNwbGF5RGVuc2l0eV0gLSBUaGUgc3BlZWQgYXQgd2hpY2ggdG8gcGVyZm9ybVxuICogdGhpcyBnZXN0dXJlIGluIHBpeGVscyBwZXIgc2Vjb25kLiBUaGUgdmFsdWUgbXVzdCBub3QgYmUgbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgcGluY2ggY2xvc2UgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9QaW5jaE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlUGluY2hDbG9zZUdlc3R1cmUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQaW5jaENsb3NlR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgdGhpcy51aWF1dG9tYXRvcjIuandwcm94eS5jb21tYW5kKCcvYXBwaXVtL2dlc3R1cmVzL3BpbmNoX2Nsb3NlJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHBpbmNoIG9wZW4gZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9QaW5jaE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBwcm92aWRlZCBvcHRpb25zIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlUGluY2hPcGVuR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBpbmNoT3Blbkdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9waW5jaF9vcGVuJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIHBlcmNlbnQsXG4gICAgc3BlZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2lwZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIHN3aXBlZC5cbiAqIElmIHRoZSBlbGVtZW50IGlkIGlzIG1pc3NpbmcgdGhlbiBzd2lwZSBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc3dpcGUgYm91bmRpbmcgYXJlYSBhcmUgcHJvdmlkZWQgdGhlbiB0aGVcbiAqIGFyZWEgaXMgZWZmZWN0aXZlbHkgaWdub3JlZC5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbGVmdCAtIFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBzd2lwZSBib3VuZGluZyBhcmVhXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQgb2YgdGhlIHN3aXBlIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBzd2lwZS5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTogYHVwYCwgYGRvd25gLCBgbGVmdGAgYW5kIGByaWdodGAgKGNhc2UgaW5zZW5zaXRpdmUpXG4gKiBAcHJvcGVydHkgeyFudW1iZXJ9IHBlcmNlbnQgLSBUaGUgc2l6ZSBvZiB0aGUgc3dpcGUgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBzd2lwZSBhcmVhIHNpemUuXG4gKiBWYWxpZCB2YWx1ZXMgbXVzdCBiZSBmbG9hdCBudW1iZXJzIGluIHJhbmdlIDAuLjEsIHdoZXJlIDEuMCBpcyAxMDAlXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHNwZWVkIFs1MDAwICogZGlzcGxheURlbnNpdHldIC0gVGhlIHNwZWVkIGF0IHdoaWNoIHRvIHBlcmZvcm0gdGhpc1xuICogZ2VzdHVyZSBpbiBwaXhlbHMgcGVyIHNlY29uZC4gVGhlIHZhbHVlIG11c3Qgbm90IGJlIG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtcyBhIHN3aXBlIGdlc3R1cmUuXG4gKlxuICogQHBhcmFtIHs/U3dpcGVPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN3aXBlR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN3aXBlR2VzdHVyZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBlbGVtZW50SWQsXG4gICAgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZCgnL2FwcGl1bS9nZXN0dXJlcy9zd2lwZScsICdQT1NUJywge1xuICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudElkKSxcbiAgICBhcmVhOiB0b1JlY3QobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KSxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcm9sbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudElkIC0gVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRvIGJlIHNjcm9sbGVkLlxuICogSWYgdGhlIGVsZW1lbnQgaWQgaXMgbWlzc2luZyB0aGVuIHNjcm9sbCBib3VuZGluZyBhcmVhIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBJZiBib3RoIHRoZSBlbGVtZW50IGlkIGFuZCB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWEgYXJlIHByb3ZpZGVkIHRoZW4gdGhpc1xuICogYXJlYSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBsZWZ0IC0gVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdG9wIC0gVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBzY3JvbGwgYm91bmRpbmcgYXJlYVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodCBvZiB0aGUgc2Nyb2xsIGJvdW5kaW5nIGFyZWFcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gZGlyZWN0aW9uIC0gRGlyZWN0aW9uIG9mIHRoZSBzY3JvbGwuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6IGB1cGAsIGBkb3duYCwgYGxlZnRgIGFuZCBgcmlnaHRgIChjYXNlIGluc2Vuc2l0aXZlKVxuICogQHByb3BlcnR5IHshbnVtYmVyfSBwZXJjZW50IC0gVGhlIHNpemUgb2YgdGhlIHNjcm9sbCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHNjcm9sbGluZyBhcmVhIHNpemUuXG4gKiBWYWxpZCB2YWx1ZXMgbXVzdCBiZSBmbG9hdCBudW1iZXJzIGdyZWF0ZXIgdGhhbiB6ZXJvLCB3aGVyZSAxLjAgaXMgMTAwJVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBzcGVlZCBbNTAwMCAqIGRpc3BsYXlEZW5zaXR5XSAtIFRoZSBzcGVlZCBhdCB3aGljaCB0byBwZXJmb3JtIHRoaXMgZ2VzdHVyZVxuICogaW4gcGl4ZWxzIHBlciBzZWNvbmQuIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBuZWdhdGl2ZVxuICovXG5cbi8qKlxuICogUGVyZm9ybXMgYSBzY3JvbGwgZ2VzdHVyZS5cbiAqXG4gKiBAcGFyYW0gez9TY3JvbGxPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgcHJvdmlkZWQgb3B0aW9ucyBhcmUgbm90IHZhbGlkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgb2JqZWN0IGNhbiBzdGlsbCBzY3JvbGwgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi5cbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsR2VzdHVyZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNjcm9sbEdlc3R1cmUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgZWxlbWVudElkLFxuICAgIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCxcbiAgICBkaXJlY3Rpb24sXG4gICAgcGVyY2VudCxcbiAgICBzcGVlZCxcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy9hcHBpdW0vZ2VzdHVyZXMvc2Nyb2xsJywgJ1BPU1QnLCB7XG4gICAgb3JpZ2luOiB0b09yaWdpbihlbGVtZW50SWQpLFxuICAgIGFyZWE6IHRvUmVjdChsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpLFxuICAgIGRpcmVjdGlvbixcbiAgICBwZXJjZW50LFxuICAgIHNwZWVkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2Nyb2xsRWxlbWVudFRvRWxlbWVudE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbGVtZW50SWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNjcm9sbGFibGUgZWxlbWVudCxcbiAqIHdoaWNoIGlzIGdvaW5nIHRvIGJlIHNjcm9sbGVkLiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIGlzIGEgdmFsaWQgc2Nyb2xsYWJsZSBjb250YWluZXIgYW5kIGl0IHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmBcbiAqIHN0cmF0ZWd5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVsZW1lbnRUb0lkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpdGVtLCB3aGljaCBiZWxvbmdzXG4gKiB0byB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50IGFib3ZlLCBhbmQgd2hpY2ggc2hvdWxkIGJlY29tZSB2aXNpYmxlIGFmdGVyXG4gKiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBpcyBmaW5pc2hlZC4gSXQgaXMgcmVxdWlyZWQgdGhpcyBlbGVtZW50XG4gKiB3YXMgbG9jYXRlZCBieSBgLWFuZHJvaWQgdWlhdXRvbWF0b3JgIHN0cmF0ZWd5LlxuICovXG5cbi8qKlxuICogU2Nyb2xscyB0aGUgZ2l2ZW4gc2Nyb2xsYWJsZSBlbGVtZW50IGBlbGVtZW50SWRgIHVudGlsIGBlbGVtZW50VG9JZGBcbiAqIGJlY29tZXMgdmlzaWJsZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZSBgZWxlbWVudFRvSWRgXG4gKiBpcyBhbHJlYWR5IHZpc2libGUgaW4gdGhlIHZpZXcgcG9ydC4gT3RoZXJ3aXNlIGl0IHdvdWxkIHNjcm9sbFxuICogdG8gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBzY3JvbGxhYmxlIGNvbnRyb2wgYW5kIHRyaWVzIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50XG4gKiBieSBzY3JvbGxpbmcgaXRzIHBhcmVudCB0byB0aGUgZW5kIHN0ZXAgYnkgc3RlcC4gVGhlIHNjcm9sbCBkaXJlY3Rpb24gKHZlcnRpY2FsIG9yIGhvcml6b250YWwpXG4gKiBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSB7U2Nyb2xsRWxlbWVudFRvRWxlbWVudE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgc2Nyb2xsaW5nIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVNjcm9sbEJhY2tUbyA9IGFzeW5jIGZ1bmN0aW9uIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2VsZW1lbnRJZCwgZWxlbWVudFRvSWR9ID0gb3B0cztcbiAgaWYgKCFlbGVtZW50SWQgfHwgIWVsZW1lbnRUb0lkKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgQm90aCBlbGVtZW50SWQgYW5kIGVsZW1lbnRUb0lkIGFyZ3VtZW50cyBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMudWlhdXRvbWF0b3IyLmp3cHJveHkuY29tbWFuZChcbiAgICBgL2FwcGl1bS9lbGVtZW50LyR7dXRpbC51bndyYXBFbGVtZW50KGVsZW1lbnRJZCl9L3Njcm9sbF90by8ke3V0aWwudW53cmFwRWxlbWVudChlbGVtZW50VG9JZCl9YCwgJ1BPU1QnLCB7fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcm9sbE9wdHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZWxlbWVudCBUaGUgaWRlbnRpZmllciBvZiBhbiBlbGVtZW50LiBJdCBpcyByZXF1aXJlZCB0aGlzIGVsZW1lbnRcbiAqIGlzIGEgdmFsaWQgc2Nyb2xsYWJsZSBjb250YWluZXIgYW5kIGl0IHdhcyBsb2NhdGVkIGJ5IGAtYW5kcm9pZCB1aWF1dG9tYXRvcmBcbiAqIHN0cmF0ZWd5LiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBmaXJzdCBjdXJyZW50bHkgYXZhaWxhYmxlIHNjcm9sbGFibGUgdmlld1xuICogaXMgc2VsZWN0ZWQgZm9yIHRoZSBpbnRlcmFjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gc3RyYXRlZ3kgVGhlIGZvbGxvd2luZyBzdHJhdGVnaWVzIGFyZSBzdXBwb3J0ZWQ6XG4gKiAtIGBhY2Nlc3NpYmlsaXR5IGlkYCAoVWlTZWxlY3RvcigpLmRlc2NyaXB0aW9uKVxuICogLSBgY2xhc3MgbmFtZWAgKFVpU2VsZWN0b3IoKS5jbGFzc05hbWUpXG4gKiAtIGAtYW5kcm9pZCB1aWF1dG9tYXRvcmAgKFVpU2VsZWN0b3IpXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IHNlbGVjdG9yIFRoZSBjb3JyZXNwb25kaW5nIGxvb2t1cCB2YWx1ZSBmb3IgdGhlIGdpdmVuXG4gKiBzdHJhdGVneS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbWF4U3dpcGVzIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2lwZXMgdG8gcGVyZm9ybVxuICogb24gdGhlIHRhcmdldCBzY3JvbGxhYmxlIHZpZXcgaW4gb3JkZXIgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIGVsZW1lbnQuXG4gKiBJbiBjYXNlIHRoaXMgdmFsdWUgaXMgdW5zZXQgdGhlbiBpdCB3b3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc2Nyb2xsYWJsZVxuICogZWxlbWVudCBpdHNlbGYgKHZ1YSBgZ2V0TWF4U2VhcmNoU3dpcGVzKClgIHByb3BlcnR5KS5cbiAqL1xuXG4vKipcbiAqIFNjcm9sbHMgdGhlIGdpdmVuIHNjcm9sbGFibGUgZWxlbWVudCB1bnRpbCB0aGUgZWxlbWVudCBpZGVudGlmaWVkXG4gKiBieSBgc3RyYXRlZ3lgIGFuZCBgc2VsZWN0b3JgIGJlY29tZXMgdmlzaWJsZS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIHRoZVxuICogZGVzdGluYXRpb24gZWxlbWVudCBpcyBhbHJlYWR5IHZpc2libGUgaW4gdGhlIHZpZXcgcG9ydC4gT3RoZXJ3aXNlIGl0IHdvdWxkIHNjcm9sbFxuICogdG8gdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBzY3JvbGxhYmxlIGNvbnRyb2wgYW5kIHRyaWVzIHRvIHJlYWNoIHRoZSBkZXN0aW5hdGlvbiBlbGVtZW50XG4gKiBieSBzY3JvbGxpbmcgaXRzIHBhcmVudCB0byB0aGUgZW5kIHN0ZXAgYnkgc3RlcC4gVGhlIHNjcm9sbCBkaXJlY3Rpb24gKHZlcnRpY2FsIG9yIGhvcml6b250YWwpXG4gKiBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSB7U2Nyb2xsT3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBzY3JvbGxpbmcgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWRcbiAqL1xuY29tbWFuZHMubW9iaWxlU2Nyb2xsID0gYXN5bmMgZnVuY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7ZWxlbWVudCwgc3RyYXRlZ3ksIHNlbGVjdG9yLCBtYXhTd2lwZXN9ID0gb3B0cztcbiAgaWYgKCFzdHJhdGVneSB8fCAhc2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBCb3RoIHN0cmF0ZWd5IGFuZCBzZWxlY3RvciBhcmd1bWVudHMgbXVzdCBiZSBwcm92aWRlZGApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnVpYXV0b21hdG9yMi5qd3Byb3h5LmNvbW1hbmQoJy90b3VjaC9zY3JvbGwnLCAnUE9TVCcsIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIG9yaWdpbjogdG9PcmlnaW4oZWxlbWVudCksXG4gICAgICBzdHJhdGVneSwgc2VsZWN0b3IsIG1heFN3aXBlc1xuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9nZXN0dXJlcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -20,6 +20,7 @@ parser.registerNestingOperators('>', '+', '~');
20
20
  parser.registerAttrEqualityMods('^', '$', '*', '~');
21
21
  parser.enableSubstitutes();
22
22
  const RESOURCE_ID = 'resource-id';
23
+ const ID_LOCATOR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9._]*:id\/[\S]+$/;
23
24
  const BOOLEAN_ATTRS = ['checkable', 'checked', 'clickable', 'enabled', 'focusable', 'focused', 'long-clickable', 'scrollable', 'selected'];
24
25
  const NUMERIC_ATTRS = ['index', 'instance'];
25
26
  const STR_ATTRS = ['description', RESOURCE_ID, 'text', 'class-name', 'package-name'];
@@ -68,8 +69,8 @@ function getWordMatcherRegex(word) {
68
69
  return `\\b(\\w*${(0, _lodash.escapeRegExp)(word)}\\w*)\\b`;
69
70
  }
70
71
 
71
- function prependAndroidId(str) {
72
- return str.startsWith('android:id/') ? str : `android:id/${str}`;
72
+ function formatIdLocator(locator) {
73
+ return ID_LOCATOR_PATTERN.test(locator) ? locator : `android:id/${locator}`;
73
74
  }
74
75
 
75
76
  function parseAttr(cssAttr) {
@@ -91,7 +92,7 @@ function parseAttr(cssAttr) {
91
92
  let value = cssAttr.value || '';
92
93
 
93
94
  if (attrName === RESOURCE_ID) {
94
- value = prependAndroidId(value);
95
+ value = formatIdLocator(value);
95
96
  }
96
97
 
97
98
  if (value === '') {
@@ -171,7 +172,7 @@ function parseCssRule(cssRule) {
171
172
  }
172
173
 
173
174
  if (cssRule.id) {
174
- uiAutomatorSelector += `.resourceId("${prependAndroidId(cssRule.id)}")`;
175
+ uiAutomatorSelector += `.resourceId("${formatIdLocator(cssRule.id)}")`;
175
176
  }
176
177
 
177
178
  if (cssRule.attrs) {
@@ -229,4 +230,4 @@ var _default = CssConverter;
229
230
  exports.default = _default;require('source-map-support').install();
230
231
 
231
232
 
232
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jc3MtY29udmVydGVyLmpzIl0sIm5hbWVzIjpbIkNzc0NvbnZlcnRlciIsInBhcnNlciIsIkNzc1NlbGVjdG9yUGFyc2VyIiwicmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MiLCJyZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnMiLCJyZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMiLCJlbmFibGVTdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwiYXNzZXJ0R2V0Qm9vbCIsImNzcyIsInZhbCIsInZhbHVlIiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJhc3NlcnRHZXRBdHRyTmFtZSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwicHJlcGVuZEFuZHJvaWRJZCIsInN0YXJ0c1dpdGgiLCJwYXJzZUF0dHIiLCJjc3NBdHRyIiwidmFsdWVUeXBlIiwibWV0aG9kTmFtZSIsIm9wZXJhdG9yIiwicGFyc2VQc2V1ZG8iLCJjc3NQc2V1ZG8iLCJwc2V1ZG9OYW1lIiwicGFyc2VDc3NSdWxlIiwiY3NzUnVsZSIsIm5lc3RpbmdPcGVyYXRvciIsInVpQXV0b21hdG9yU2VsZWN0b3IiLCJ0YWdOYW1lIiwiYW5kcm9pZENsYXNzIiwiY2xhc3NOYW1lcyIsImNzc0NsYXNzTmFtZXMiLCJwdXNoIiwiaWQiLCJhdHRycyIsImF0dHIiLCJwc2V1ZG9zIiwicHNldWRvIiwicnVsZSIsInBhcnNlQ3NzT2JqZWN0IiwidHlwZSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzU2VsZWN0b3IiLCJjc3NPYmoiLCJwYXJzZSIsImUiLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsWUFBWSxHQUFHLEVBQXJCO0FBRUEsTUFBTUMsTUFBTSxHQUFHLElBQUlDLG9DQUFKLEVBQWY7QUFDQUQsTUFBTSxDQUFDRSx1QkFBUCxDQUErQixLQUEvQjtBQUNBRixNQUFNLENBQUNHLHdCQUFQLENBQWdDLEdBQWhDLEVBQXFDLEdBQXJDLEVBQTBDLEdBQTFDO0FBQ0FILE1BQU0sQ0FBQ0ksd0JBQVAsQ0FBZ0MsR0FBaEMsRUFBcUMsR0FBckMsRUFBMEMsR0FBMUMsRUFBK0MsR0FBL0M7QUFDQUosTUFBTSxDQUFDSyxpQkFBUDtBQUVBLE1BQU1DLFdBQVcsR0FBRyxhQUFwQjtBQUVBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQURvQixFQUNQLFNBRE8sRUFDSSxXQURKLEVBQ2lCLFNBRGpCLEVBQzRCLFdBRDVCLEVBRXBCLFNBRm9CLEVBRVQsZ0JBRlMsRUFFUyxZQUZULEVBRXVCLFVBRnZCLENBQXRCO0FBS0EsTUFBTUMsYUFBYSxHQUFHLENBQ3BCLE9BRG9CLEVBQ1gsVUFEVyxDQUF0QjtBQUlBLE1BQU1DLFNBQVMsR0FBRyxDQUNoQixhQURnQixFQUNESCxXQURDLEVBQ1ksTUFEWixFQUNvQixZQURwQixFQUNrQyxjQURsQyxDQUFsQjtBQUlBLE1BQU1JLFNBQVMsR0FBRyxDQUNoQixHQUFHSCxhQURhLEVBRWhCLEdBQUdDLGFBRmEsRUFHaEIsR0FBR0MsU0FIYSxDQUFsQjtBQU1BLE1BQU1FLGlCQUFpQixHQUFHLENBQ3hCLENBQUNMLFdBQUQsRUFBYyxDQUFDLElBQUQsQ0FBZCxDQUR3QixFQUV4QixDQUFDLGFBQUQsRUFBZ0IsQ0FDZCxxQkFEYyxFQUNTLGNBRFQsRUFFZCxNQUZjLEVBRU4sa0JBRk0sQ0FBaEIsQ0FGd0IsRUFNeEIsQ0FBQyxPQUFELEVB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QUNNLE1BQUQsQ0FBckI7QUFDRCxHQUZELENBRUUsT0FBT0UsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJQyx5QkFBT0Msb0JBQVgsQ0FBaUMsNkJBQTRCTCxXQUFZLGVBQWNHLENBQUUsR0FBekYsQ0FBTjtBQUNEO0FBQ0YsQ0FaRDs7ZUFjZXRFLFkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDc3NTZWxlY3RvclBhcnNlciB9IGZyb20gJ2Nzcy1zZWxlY3Rvci1wYXJzZXInO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5cbmNvbnN0IENzc0NvbnZlcnRlciA9IHt9O1xuXG5jb25zdCBwYXJzZXIgPSBuZXcgQ3NzU2VsZWN0b3JQYXJzZXIoKTtcbnBhcnNlci5yZWdpc3RlclNlbGVjdG9yUHNldWRvcygnaGFzJyk7XG5wYXJzZXIucmVnaXN0ZXJOZXN0aW5nT3BlcmF0b3JzKCc+JywgJysnLCAnficpO1xucGFyc2VyLnJlZ2lzdGVyQXR0ckVxdWFsaXR5TW9kcygnXicsICckJywgJyonLCAnficpO1xucGFyc2VyLmVuYWJsZVN1YnN0aXR1dGVzKCk7XG5cbmNvbnN0IFJFU09VUkNFX0lEID0gJ3Jlc291cmNlLWlkJztcblxuY29uc3QgQk9PTEVBTl9BVFRSUyA9IFtcbiAgJ2NoZWNrYWJsZScsICdjaGVja2VkJywgJ2NsaWNrYWJsZScsICdlbmFibGVkJywgJ2ZvY3VzYWJsZScsXG4gICdmb2N1c2VkJywgJ2xvbmctY2xpY2thYmxlJywgJ3Njcm9sbGFibGUnLCAnc2VsZWN0ZWQnLFxuXTtcblxuY29uc3QgTlVNRVJJQ19BVFRSUyA9IFtcbiAgJ2luZGV4JywgJ2luc3RhbmNlJyxcbl07XG5cbmNvbnN0IFNUUl9BVFRSUyA9IFtcbiAgJ2Rlc2NyaXB0aW9uJywgUkVTT1VSQ0VfSUQsICd0ZXh0JywgJ2NsYXNzLW5hbWUnLCAncGFja2FnZS1uYW1lJ1xuXTtcblxuY29uc3QgQUxMX0FUVFJTID0gW1xuICAuLi5CT09MRUFOX0FUVFJTLFxuICAuLi5OVU1FUklDX0FUVFJTLFxuICAuLi5TVFJfQVRUUlMsXG5dO1xuXG5jb25zdCBBVFRSSUJVVEVfQUxJQVNFUyA9IFtcbiAgW1JFU09VUkNFX0lELCBbJ2lkJ11dLFxuICBbJ2Rlc2NyaXB0aW9uJywgW1xuICAgICdjb250ZW50LWRlc2NyaXB0aW9uJywgJ2NvbnRlbnQtZGVzYycsXG4gICAgJ2Rlc2MnLCAnYWNjZXNzaWJpbGl0eS1pZCcsXG4gIF1dLFxuICBbJ2luZGV4JywgWydudGgtY2hpbGQnXV0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnQgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRvIHNuYWtlIGNhc2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaHlwaGVuIHNlcGFyYXRlZCB3b3JkIHRyYW5zbGF0ZWQgdG8gc25ha2UgY2FzZVxuICovXG5mdW5jdGlvbiB0b1NuYWtlQ2FzZSAoc3RyKSB7XG4gIGlmICghc3RyKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IHRva2VucyA9IHN0ci5zcGxpdCgnLScpLm1hcCgoc3RyKSA9PiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSk7XG4gIGNvbnN0IG91dCA9IHRva2Vucy5qb2luKCcnKTtcbiAgcmV0dXJuIG91dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG91dC5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NOYW1lVmFsdWVPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P25hbWV9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIENTUyBvYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKi9cblxuLyoqXG4gKiBHZXQgdGhlIGJvb2xlYW4gZnJvbSBhIENTUyBvYmplY3QuIElmIGVtcHR5LCByZXR1cm4gdHJ1ZS4gSWYgbm90IHRydWUvZmFsc2UvZW1wdHksIHRocm93IGV4Y2VwdGlvblxuICpcbiAqIEBwYXJhbSB7Q3NzTmFtZVZhbHVlT2JqZWN0fSBjc3MgQSBDU1Mgb2JqZWN0IHRoYXQgaGFzICduYW1lJyBhbmQgJ3ZhbHVlJ1xuICogQHJldHVybnMge3N0cmluZ30gRWl0aGVyICd0cnVlJyBvciAnZmFsc2UnLiBJZiB2YWx1ZSBpcyBlbXB0eSwgcmV0dXJuICd0cnVlJ1xuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRCb29sIChjc3MpIHtcbiAgY29uc3QgdmFsID0gY3NzLnZhbHVlPy50b0xvd2VyQ2FzZSgpIHx8ICd0cnVlJzsgLy8gYW4gb21pdHRlZCBib29sZWFuIGF0dHJpYnV0ZSBtZWFucyAndHJ1ZScgKGUuZy46IGlucHV0W2NoZWNrZWRdIG1lYW5zIGNoZWNrZWQgaXMgdHJ1ZSlcbiAgaWYgKFsndHJ1ZScsICdmYWxzZSddLmluY2x1ZGVzKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzLm5hbWV9JyBtdXN0IGJlIHRydWUsIGZhbHNlIG9yIGVtcHR5LiBGb3VuZCAnJHtjc3MudmFsdWV9J2ApO1xufVxuXG4vKipcbiAqIEdldCB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBDU1MgYXR0cmlidXRlIG5hbWVcbiAqXG4gKiBDb252ZXJ0cyB0byBsb3dlcmNhc2UgYW5kIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuXG4gKiB3aGF0IGl0IGlzIGFuIGFsaWFzIGZvclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjc3MgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNhbm9uaWNhbCBhdHRyaWJ1dGUgbmFtZVxuICovXG5mdW5jdGlvbiBhc3NlcnRHZXRBdHRyTmFtZSAoY3NzKSB7XG4gIGNvbnN0IGF0dHJOYW1lID0gY3NzLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBhbmQgaWYgaXQgaXMsIHJldHVybiBpdFxuICBpZiAoQUxMX0FUVFJTLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gSWYgYXR0ck5hbWUgaXMgYW4gYWxpYXMgZm9yIHNvbWV0aGluZyBlbHNlLCByZXR1cm4gdGhhdFxuICBmb3IgKGNvbnN0IFtvZmZpY2lhbEF0dHIsIGFsaWFzQXR0cnNdIG9mIEFUVFJJQlVURV9BTElBU0VTKSB7XG4gICAgaWYgKGFsaWFzQXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICByZXR1cm4gb2ZmaWNpYWxBdHRyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2F0dHJOYW1lfScgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICBgU3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlICcke0FMTF9BVFRSUy5qb2luKCcsICcpfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgYSByZWdleCB0aGF0IG1hdGNoZXMgYSB3aG9sZSB3b3JkLiBGb3IgdGhlIH49IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgcmVnZXggXCJ3b3JkXCIgbWF0Y2hlclxuICovXG5mdW5jdGlvbiBnZXRXb3JkTWF0Y2hlclJlZ2V4ICh3b3JkKSB7XG4gIHJldHVybiBgXFxcXGIoXFxcXHcqJHtlc2NhcGVSZWdFeHAod29yZCl9XFxcXHcqKVxcXFxiYDtcbn1cblxuLyoqXG4gKiBBZGQgYW5kcm9pZDppZC8gdG8gYmVnaW5uaW5nIG9mIHN0cmluZyBpZiBpdCdzIG5vdCB0aGVyZSBhbHJlYWR5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nIHdpdGggYGFuZHJvaWQ6aWQvYCBwcmVwZW5kZWQgKGlmIGl0IHdhc24ndCBhbHJlYWR5KVxuICovXG5mdW5jdGlvbiBwcmVwZW5kQW5kcm9pZElkIChzdHIpIHtcbiAgcmV0dXJuIHN0ci5zdGFydHNXaXRoKCdhbmRyb2lkOmlkLycpID8gc3RyIDogYGFuZHJvaWQ6aWQvJHtzdHJ9YDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NBdHRyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUeXBlIG9mIGF0dHJpYnV0ZSAobXVzdCBiZSBzdHJpbmcgb3IgZW1wdHkpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIGJldHdlZW4gdmFsdWUgYW5kIHZhbHVlIHR5cGUgKD0sICo9LCAsIF49LCAkPSlcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBDU1MgYXR0cmlidXRlIGludG8gYSBVaVNlbGVjdG9yIG1ldGhvZCBjYWxsXG4gKlxuICogQHBhcmFtIHtDc3NBdHRyfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDU1MgYXR0cmlidXRlIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICBpZiAoY3NzQXR0ci52YWx1ZVR5cGUgJiYgY3NzQXR0ci52YWx1ZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7Y3NzQXR0ci52YWx1ZX0nIGlzIGFuIGludmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICAgIGBPbmx5ICdzdHJpbmcnIGFuZCBlbXB0eSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHN1cHBvcnRlZC4gRm91bmQgJyR7Y3NzQXR0ci52YWx1ZVR5cGV9J2ApO1xuICB9XG4gIGNvbnN0IGF0dHJOYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzQXR0cik7XG4gIGNvbnN0IG1ldGhvZE5hbWUgPSB0b1NuYWtlQ2FzZShhdHRyTmFtZSk7XG5cbiAgLy8gVmFsaWRhdGUgdGhhdCBpdCdzIGEgc3VwcG9ydGVkIGF0dHJpYnV0ZVxuICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBzdXBwb3J0ZWQuIFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSBgICtcbiAgICAgIGAnJHtbLi4uU1RSX0FUVFJTLCAuLi5CT09MRUFOX0FUVFJTXS5qb2luKCcsICcpfSdgKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGJvb2xlYW4sIGlmIGl0J3MgYSBib29sZWFuIGF0dHJpYnV0ZVxuICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7YXNzZXJ0R2V0Qm9vbChjc3NBdHRyKX0pYDtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSBwYXJzZSBhcyBzdHJpbmdcbiAgbGV0IHZhbHVlID0gY3NzQXR0ci52YWx1ZSB8fCAnJztcbiAgaWYgKGF0dHJOYW1lID09PSBSRVNPVVJDRV9JRCkge1xuICAgIHZhbHVlID0gcHJlcGVuZEFuZHJvaWRJZCh2YWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiXCIpYDtcbiAgfVxuXG4gIHN3aXRjaCAoY3NzQXR0ci5vcGVyYXRvcikge1xuICAgIGNhc2UgJz0nOlxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfShcIiR7dmFsdWV9XCIpYDtcbiAgICBjYXNlICcqPSc6XG4gICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1Db250YWlucyhcIiR7dmFsdWV9XCIpYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiJHtlc2NhcGVSZWdFeHAodmFsdWUpfVwiKWA7XG4gICAgY2FzZSAnXj0nOlxuICAgICAgaWYgKFsnZGVzY3JpcHRpb24nLCAndGV4dCddLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9U3RhcnRzV2l0aChcIiR7dmFsdWV9XCIpYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiXiR7ZXNjYXBlUmVnRXhwKHZhbHVlKX1cIilgO1xuICAgIGNhc2UgJyQ9JzpcbiAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiJHtlc2NhcGVSZWdFeHAodmFsdWUpfSRcIilgO1xuICAgIGNhc2UgJ349JzpcbiAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1NYXRjaGVzKFwiJHtnZXRXb3JkTWF0Y2hlclJlZ2V4KHZhbHVlKX1cIilgO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBVbnJlYWNoYWJsZSwgYnV0IGFkZGluZyBlcnJvciBpbiBjYXNlIGEgbmV3IENTUyBhdHRyaWJ1dGUgaXMgYWRkZWQuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIENTUyBhdHRyaWJ1dGUgb3BlcmF0b3IgJyR7Y3NzQXR0ci5vcGVyYXRvcn0nLiBgICtcbiAgICAgICAgYCAnPScsICcqPScsICdePScsICckPScgYW5kICd+PScgYXJlIHN1cHBvcnRlZC5gKTtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1BzZXVkb1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZVR5cGUgVGhlIHR5cGUgb2YgQ1NTIHBzZXVkbyBzZWxlY3RvciAoaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvY3NzLXNlbGVjdG9yLXBhcnNlciBmb3IgcmVmZXJlbmNlKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwc2V1ZG8gc2VsZWN0b3JcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBDU1MgcHNldWRvIGNsYXNzIHRvIGEgVWlTZWxlY3RvclxuICpcbiAqIEBwYXJhbSB7Q3NzUHNldWRvfSBjc3NQc2V1ZG8gQ1NTIFBzZXVkbyBjbGFzc1xuICogQHJldHVybnMge3N0cmluZ30gUHNldWRvIHNlbGVjdG9yIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUHNldWRvIChjc3NQc2V1ZG8pIHtcbiAgaWYgKGNzc1BzZXVkby52YWx1ZVR5cGUgJiYgY3NzUHNldWRvLnZhbHVlVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzc1BzZXVkby5uYW1lfT0ke2Nzc1BzZXVkby52YWx1ZX0nLiBgICtcbiAgICAgIGBVbnN1cHBvcnRlZCBjc3MgcHNldWRvIGNsYXNzIHZhbHVlIHR5cGU6ICcke2Nzc1BzZXVkby52YWx1ZVR5cGV9Jy4gT25seSAnc3RyaW5nJyB0eXBlIG9yIGVtcHR5IGlzIHN1cHBvcnRlZC5gKTtcbiAgfVxuXG4gIGNvbnN0IHBzZXVkb05hbWUgPSBhc3NlcnRHZXRBdHRyTmFtZShjc3NQc2V1ZG8pO1xuXG4gIGlmIChCT09MRUFOX0FUVFJTLmluY2x1ZGVzKHBzZXVkb05hbWUpKSB7XG4gICAgcmV0dXJuIGAuJHt0b1NuYWtlQ2FzZShwc2V1ZG9OYW1lKX0oJHthc3NlcnRHZXRCb29sKGNzc1BzZXVkbyl9KWA7XG4gIH1cblxuICBpZiAoTlVNRVJJQ19BVFRSUy5pbmNsdWRlcyhwc2V1ZG9OYW1lKSkge1xuICAgIHJldHVybiBgLiR7cHNldWRvTmFtZX0oJHtjc3NQc2V1ZG8udmFsdWV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NSdWxlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG5lc3RpbmdPcGVyYXRvciBUaGUgbmVzdGluZyBvcGVyYXRvciAoYWthOiBjb21iaW5hdG9yIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0YWdOYW1lIFRoZSB0YWcgbmFtZSAoYWthOiB0eXBlIHNlbGVjdG9yIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9UeXBlX3NlbGVjdG9ycylcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ1tdfSBjbGFzc05hbWVzIEFuIGFycmF5IG9mIENTUyBjbGFzcyBuYW1lc1xuICogQHByb3BlcnR5IHs/Q3NzQXR0cltdfSBhdHRycyBBbiBhcnJheSBvZiBDU1MgYXR0cmlidXRlc1xuICogQHByb3BlcnR5IHs/Q3NzUHNldWRvW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBwc2V1ZG9zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGlkIENTUyBpZGVudGlmaWVyXG4gKiBAcHJvcGVydHkgez9Dc3NSdWxlfSBydWxlIEEgZGVzY2VuZGFudCBvZiB0aGlzIENTUyBydWxlXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0IGEgQ1NTIHJ1bGUgdG8gYSBVaVNlbGVjdG9yXG4gKiBAcGFyYW0ge0Nzc1J1bGV9IGNzc1J1bGUgQ1NTIHJ1bGUgZGVmaW5pdGlvblxuICovXG5mdW5jdGlvbiBwYXJzZUNzc1J1bGUgKGNzc1J1bGUpIHtcbiAgY29uc3QgeyBuZXN0aW5nT3BlcmF0b3IgfSA9IGNzc1J1bGU7XG4gIGlmIChuZXN0aW5nT3BlcmF0b3IgJiYgbmVzdGluZ09wZXJhdG9yICE9PSAnICcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke25lc3RpbmdPcGVyYXRvcn0nIGlzIG5vdCBhIHN1cHBvcnRlZCBjb21iaW5hdG9yLiBgICtcbiAgICAgIGBPbmx5IGNoaWxkIGNvbWJpbmF0b3IgKD4pIGFuZCBkZXNjZW5kYW50IGNvbWJpbmF0b3IgYXJlIHN1cHBvcnRlZC5gKTtcbiAgfVxuXG4gIGxldCB1aUF1dG9tYXRvclNlbGVjdG9yID0gJ25ldyBVaVNlbGVjdG9yKCknO1xuICBpZiAoY3NzUnVsZS50YWdOYW1lICYmIGNzc1J1bGUudGFnTmFtZSAhPT0gJyonKSB7XG4gICAgbGV0IGFuZHJvaWRDbGFzcyA9IFtjc3NSdWxlLnRhZ05hbWVdO1xuICAgIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgIGZvciAoY29uc3QgY3NzQ2xhc3NOYW1lcyBvZiBjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICAgICAgYW5kcm9pZENsYXNzLnB1c2goY3NzQ2xhc3NOYW1lcyk7XG4gICAgICB9XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lKFwiJHthbmRyb2lkQ2xhc3Muam9pbignLicpfVwiKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWVNYXRjaGVzKFwiJHtjc3NSdWxlLnRhZ05hbWV9XCIpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY3NzUnVsZS5jbGFzc05hbWVzKSB7XG4gICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUuY2xhc3NOYW1lcy5qb2luKCdcXFxcLicpfVwiKWA7XG4gIH1cbiAgaWYgKGNzc1J1bGUuaWQpIHtcbiAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAucmVzb3VyY2VJZChcIiR7cHJlcGVuZEFuZHJvaWRJZChjc3NSdWxlLmlkKX1cIilgO1xuICB9XG4gIGlmIChjc3NSdWxlLmF0dHJzKSB7XG4gICAgZm9yIChjb25zdCBhdHRyIG9mIGNzc1J1bGUuYXR0cnMpIHtcbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gcGFyc2VBdHRyKGF0dHIpO1xuICAgIH1cbiAgfVxuICBpZiAoY3NzUnVsZS5wc2V1ZG9zKSB7XG4gICAgZm9yIChjb25zdCBwc2V1ZG8gb2YgY3NzUnVsZS5wc2V1ZG9zKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHBhcnNlUHNldWRvKHBzZXVkbyk7XG4gICAgfVxuICB9XG4gIGlmIChjc3NSdWxlLnJ1bGUpIHtcbiAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2hpbGRTZWxlY3Rvcigke3BhcnNlQ3NzUnVsZShjc3NSdWxlLnJ1bGUpfSlgO1xuICB9XG4gIHJldHVybiB1aUF1dG9tYXRvclNlbGVjdG9yO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc09iamVjdFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB0eXBlIFR5cGUgb2YgQ1NTIG9iamVjdC4gJ3J1bGUnLCAncnVsZXNldCcgb3IgJ3NlbGVjdG9ycydcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgQ1NTIG9iamVjdCB0byBVaUF1dG9tYXRvcjIgc2VsZWN0b3JcbiAqIEBwYXJhbSB7Q3NzT2JqZWN0fSBjc3MgQ1NTIG9iamVjdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIENTUyBvYmplY3QgcGFyc2VkIGFzIGEgVWlTZWxlY3RvclxuICovXG5mdW5jdGlvbiBwYXJzZUNzc09iamVjdCAoY3NzKSB7XG4gIHN3aXRjaCAoY3NzLnR5cGUpIHtcbiAgICBjYXNlICdydWxlJzpcbiAgICAgIHJldHVybiBwYXJzZUNzc1J1bGUoY3NzKTtcbiAgICBjYXNlICdydWxlU2V0JzpcbiAgICAgIHJldHVybiBwYXJzZUNzc09iamVjdChjc3MucnVsZSk7XG4gICAgY2FzZSAnc2VsZWN0b3JzJzpcbiAgICAgIHJldHVybiBjc3Muc2VsZWN0b3JzLm1hcCgoc2VsZWN0b3IpID0+IHBhcnNlQ3NzT2JqZWN0KHNlbGVjdG9yKSkuam9pbignOyAnKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBUaGlzIGlzIG5ldmVyIHJlYWNoYWJsZSwgYnV0IGlmIGl0IGV2ZXIgaXMgZG8gdGhpcy5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVWlBdXRvbWF0b3IgZG9lcyBub3Qgc3VwcG9ydCAnJHtjc3MudHlwZX0nIGNzcy4gT25seSBzdXBwb3J0cyAncnVsZScsICdydWxlU2V0JywgJ3NlbGVjdG9ycycgYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQ1NTIHNlbGVjdG9yIHRvIGEgVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gY3NzU2VsZWN0b3IgQ1NTIFNlbGVjdG9yXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgQ1NTIHNlbGVjdG9yIGNvbnZlcnRlZCB0byBhIFVpU2VsZWN0b3JcbiAqL1xuQ3NzQ29udmVydGVyLnRvVWlBdXRvbWF0b3JTZWxlY3RvciA9IGZ1bmN0aW9uIHRvVWlBdXRvbWF0b3JTZWxlY3RvciAoY3NzU2VsZWN0b3IpIHtcbiAgbGV0IGNzc09iajtcbiAgdHJ5IHtcbiAgICBjc3NPYmogPSBwYXJzZXIucGFyc2UoY3NzU2VsZWN0b3IpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkU2VsZWN0b3JFcnJvcihgSW52YWxpZCBDU1Mgc2VsZWN0b3IgJyR7Y3NzU2VsZWN0b3J9Jy4gUmVhc29uOiAnJHtlfSdgKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZUNzc09iamVjdChjc3NPYmopO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkU2VsZWN0b3JFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIHNlbGVjdG9yICcke2Nzc1NlbGVjdG9yfScuIFJlYXNvbjogJyR7ZX0nYCk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IENzc0NvbnZlcnRlcjsiXSwiZmlsZSI6ImxpYi9jc3MtY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
233
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jc3MtY29udmVydGVyLmpzIl0sIm5hbWVzIjpbIkNzc0NvbnZlcnRlciIsInBhcnNlciIsIkNzc1NlbGVjdG9yUGFyc2VyIiwicmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MiLCJyZWdpc3Rlck5lc3RpbmdPcGVyYXRvcnMiLCJyZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMiLCJlbmFibGVTdWJzdGl0dXRlcyIsIlJFU09VUkNFX0lEIiwiSURfTE9DQVRPUl9QQVRURVJOIiwiQk9PTEVBTl9BVFRSUyIsIk5VTUVSSUNfQVRUUlMiLCJTVFJfQVRUUlMiLCJBTExfQVRUUlMiLCJBVFRSSUJVVEVfQUxJQVNFUyIsInRvU25ha2VDYXNlIiwic3RyIiwidG9rZW5zIiwic3BsaXQiLCJtYXAiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidG9Mb3dlckNhc2UiLCJvdXQiLCJqb2luIiwiYXNzZXJ0R2V0Qm9vbCIsImNzcyIsInZhbCIsInZhbHVlIiwiaW5jbHVkZXMiLCJFcnJvciIsIm5hbWUiLCJhc3NlcnRHZXRBdHRyTmFtZSIsImF0dHJOYW1lIiwib2ZmaWNpYWxBdHRyIiwiYWxpYXNBdHRycyIsImdldFdvcmRNYXRjaGVyUmVnZXgiLCJ3b3JkIiwiZm9ybWF0SWRMb2NhdG9yIiwibG9jYXRvciIsInRlc3QiLCJwYXJzZUF0dHIiLCJjc3NBdHRyIiwidmFsdWVUeXBlIiwibWV0aG9kTmFtZSIsIm9wZXJhdG9yIiwicGFyc2VQc2V1ZG8iLCJjc3NQc2V1ZG8iLCJwc2V1ZG9OYW1lIiwicGFyc2VDc3NSdWxlIiwiY3NzUnVsZSIsIm5lc3RpbmdPcGVyYXRvciIsInVpQXV0b21hdG9yU2VsZWN0b3IiLCJ0YWdOYW1lIiwiYW5kcm9pZENsYXNzIiwiY2xhc3NOYW1lcyIsImNzc0NsYXNzTmFtZXMiLCJwdXNoIiwiaWQiLCJhdHRycyIsImF0dHIiLCJwc2V1ZG9zIiwicHNldWRvIiwicnVsZSIsInBhcnNlQ3NzT2JqZWN0IiwidHlwZSIsInNlbGVjdG9ycyIsInNlbGVjdG9yIiwidG9VaUF1dG9tYXRvclNlbGVjdG9yIiwiY3NzU2VsZWN0b3IiLCJjc3NPYmoiLCJwYXJzZSIsImUiLCJlcnJvcnMiLCJJbnZhbGlkU2VsZWN0b3JFcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsWUFBWSxHQUFHLEVBQXJCO0FBRUEsTUFBTUMsTUFBTSxHQUFHLElBQUlDLG9DQUFKLEVBQWY7QUFDQUQsTUFBTSxDQUFDRSx1QkFBUCxDQUErQixLQUEvQjtBQUNBRixNQUFNLENBQUNHLHdCQUFQLENBQWdDLEdBQWhDLEVBQXFDLEdBQXJDLEVBQTBDLEdBQTFDO0FBQ0FILE1BQU0sQ0FBQ0ksd0JBQVAsQ0FBZ0MsR0FBaEMsRUFBcUMsR0FBckMsRUFBMEMsR0FBMUMsRUFBK0MsR0FBL0M7QUFDQUosTUFBTSxDQUFDSyxpQkFBUDtBQUVBLE1BQU1DLFdBQVcsR0FBRyxhQUFwQjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLHFDQUEzQjtBQUVBLE1BQU1DLGFBQWEsR0FBRyxDQUNwQixXQURvQixFQUNQLFNBRE8sRUFDSSxXQURKLEVBQ2lCLFNBRGpCLEVBQzRCLFdBRDVCLEVBRXBCLFNBRm9CLEVBRVQsZ0JBRlMsRUFFUyxZQUZULEVBRXVCLFVBRnZCLENBQXRCO0FBS0EsTUFBTUMsYUFBYSxHQUFHLENBQ3BCLE9BRG9CLEVBQ1gsVUFEVyxDQUF0QjtBQUlBLE1BQU1DLFNBQVMsR0FBRyxDQUNoQixhQURnQixFQUNESixXQURDLEVBQ1ksTUFEWixFQUNvQixZQURwQixFQUNrQyxjQURsQyxDQUFsQjtBQUlBLE1BQU1LLFNBQVMsR0FBRyxDQUNoQixHQUFHSCxhQURhLEVBRWhCLEdBQUdDLGFBRmEsRUFHaEIsR0FBR0MsU0FIYSxDQUFsQjtBQU1BLE1BQU1FLGlCQUFpQixHQUFHLENBQ3hCLENBQUNOLFdBQUQsRUFBYyxDQUFDLElBQUQsQ0FBZCxDQUR3QixFQUV4QixDQUFDLGFBQUQsRUFBZ0IsQ0FDZCxxQkFEYyxFQUNTLGNB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QUF3QkwsV0FBWSxlQUFjRyxDQUFFLEdBQXJGLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQ0YsV0FBT1IsY0FBYyxDQUFDTSxNQUFELENBQXJCO0FBQ0QsR0FGRCxDQUVFLE9BQU9FLENBQVAsRUFBVTtBQUNWLFVBQU0sSUFBSUMseUJBQU9DLG9CQUFYLENBQWlDLDZCQUE0QkwsV0FBWSxlQUFjRyxDQUFFLEdBQXpGLENBQU47QUFDRDtBQUNGLENBWkQ7O2VBY2V4RSxZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3NzU2VsZWN0b3JQYXJzZXIgfSBmcm9tICdjc3Mtc2VsZWN0b3ItcGFyc2VyJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0tYmFzZS1kcml2ZXInO1xuXG5jb25zdCBDc3NDb252ZXJ0ZXIgPSB7fTtcblxuY29uc3QgcGFyc2VyID0gbmV3IENzc1NlbGVjdG9yUGFyc2VyKCk7XG5wYXJzZXIucmVnaXN0ZXJTZWxlY3RvclBzZXVkb3MoJ2hhcycpO1xucGFyc2VyLnJlZ2lzdGVyTmVzdGluZ09wZXJhdG9ycygnPicsICcrJywgJ34nKTtcbnBhcnNlci5yZWdpc3RlckF0dHJFcXVhbGl0eU1vZHMoJ14nLCAnJCcsICcqJywgJ34nKTtcbnBhcnNlci5lbmFibGVTdWJzdGl0dXRlcygpO1xuXG5jb25zdCBSRVNPVVJDRV9JRCA9ICdyZXNvdXJjZS1pZCc7XG5jb25zdCBJRF9MT0NBVE9SX1BBVFRFUk4gPSAvXlthLXpBLVpfXVthLXpBLVowLTkuX10qOmlkXFwvW1xcU10rJC87XG5cbmNvbnN0IEJPT0xFQU5fQVRUUlMgPSBbXG4gICdjaGVja2FibGUnLCAnY2hlY2tlZCcsICdjbGlja2FibGUnLCAnZW5hYmxlZCcsICdmb2N1c2FibGUnLFxuICAnZm9jdXNlZCcsICdsb25nLWNsaWNrYWJsZScsICdzY3JvbGxhYmxlJywgJ3NlbGVjdGVkJyxcbl07XG5cbmNvbnN0IE5VTUVSSUNfQVRUUlMgPSBbXG4gICdpbmRleCcsICdpbnN0YW5jZScsXG5dO1xuXG5jb25zdCBTVFJfQVRUUlMgPSBbXG4gICdkZXNjcmlwdGlvbicsIFJFU09VUkNFX0lELCAndGV4dCcsICdjbGFzcy1uYW1lJywgJ3BhY2thZ2UtbmFtZSdcbl07XG5cbmNvbnN0IEFMTF9BVFRSUyA9IFtcbiAgLi4uQk9PTEVBTl9BVFRSUyxcbiAgLi4uTlVNRVJJQ19BVFRSUyxcbiAgLi4uU1RSX0FUVFJTLFxuXTtcblxuY29uc3QgQVRUUklCVVRFX0FMSUFTRVMgPSBbXG4gIFtSRVNPVVJDRV9JRCwgWydpZCddXSxcbiAgWydkZXNjcmlwdGlvbicsIFtcbiAgICAnY29udGVudC1kZXNjcmlwdGlvbicsICdjb250ZW50LWRlc2MnLFxuICAgICdkZXNjJywgJ2FjY2Vzc2liaWxpdHktaWQnLFxuICBdXSxcbiAgWydpbmRleCcsIFsnbnRoLWNoaWxkJ11dLFxuXTtcblxuLyoqXG4gKiBDb252ZXJ0IGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0byBzbmFrZSBjYXNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGhlbiBzZXBhcmF0ZWQgd29yZCB0cmFuc2xhdGVkIHRvIHNuYWtlIGNhc2VcbiAqL1xuZnVuY3Rpb24gdG9TbmFrZUNhc2UgKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBzdHIuc3BsaXQoJy0nKS5tYXAoKHN0cikgPT4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCBvdXQgPSB0b2tlbnMuam9pbignJyk7XG4gIHJldHVybiBvdXQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBvdXQuc2xpY2UoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzTmFtZVZhbHVlT2JqZWN0XG4gKiBAcHJvcGVydHkgez9uYW1lfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBDU1Mgb2JqZWN0XG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgQ1NTIG9iamVjdFxuICovXG5cbi8qKlxuICogR2V0IHRoZSBib29sZWFuIGZyb20gYSBDU1Mgb2JqZWN0LiBJZiBlbXB0eSwgcmV0dXJuIHRydWUuIElmIG5vdCB0cnVlL2ZhbHNlL2VtcHR5LCB0aHJvdyBleGNlcHRpb25cbiAqXG4gKiBAcGFyYW0ge0Nzc05hbWVWYWx1ZU9iamVjdH0gY3NzIEEgQ1NTIG9iamVjdCB0aGF0IGhhcyAnbmFtZScgYW5kICd2YWx1ZSdcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJy4gSWYgdmFsdWUgaXMgZW1wdHksIHJldHVybiAndHJ1ZSdcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0Qm9vbCAoY3NzKSB7XG4gIGNvbnN0IHZhbCA9IGNzcy52YWx1ZT8udG9Mb3dlckNhc2UoKSB8fCAndHJ1ZSc7IC8vIGFuIG9taXR0ZWQgYm9vbGVhbiBhdHRyaWJ1dGUgbWVhbnMgJ3RydWUnIChlLmcuOiBpbnB1dFtjaGVja2VkXSBtZWFucyBjaGVja2VkIGlzIHRydWUpXG4gIGlmIChbJ3RydWUnLCAnZmFsc2UnXS5pbmNsdWRlcyh2YWwpKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYCcke2Nzcy5uYW1lfScgbXVzdCBiZSB0cnVlLCBmYWxzZSBvciBlbXB0eS4gRm91bmQgJyR7Y3NzLnZhbHVlfSdgKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGEgQ1NTIGF0dHJpYnV0ZSBuYW1lXG4gKlxuICogQ29udmVydHMgdG8gbG93ZXJjYXNlIGFuZCBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbiBhbGlhcyBmb3Igc29tZXRoaW5nIGVsc2UsIHJldHVyblxuICogd2hhdCBpdCBpcyBhbiBhbGlhcyBmb3JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgYXR0cmlidXRlIG5hbWVcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0R2V0QXR0ck5hbWUgKGNzcykge1xuICBjb25zdCBhdHRyTmFtZSA9IGNzcy5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ2hlY2sgaWYgaXQncyBzdXBwb3J0ZWQgYW5kIGlmIGl0IGlzLCByZXR1cm4gaXRcbiAgaWYgKEFMTF9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIGF0dHJOYW1lIGlzIGFuIGFsaWFzIGZvciBzb21ldGhpbmcgZWxzZSwgcmV0dXJuIHRoYXRcbiAgZm9yIChjb25zdCBbb2ZmaWNpYWxBdHRyLCBhbGlhc0F0dHJzXSBvZiBBVFRSSUJVVEVfQUxJQVNFUykge1xuICAgIGlmIChhbGlhc0F0dHJzLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgcmV0dXJuIG9mZmljaWFsQXR0cjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZS4gYCArXG4gICAgYFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSAnJHtBTExfQVRUUlMuam9pbignLCAnKX0nYCk7XG59XG5cbi8qKlxuICogR2V0IGEgcmVnZXggdGhhdCBtYXRjaGVzIGEgd2hvbGUgd29yZC4gRm9yIHRoZSB+PSBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBIHJlZ2V4IFwid29yZFwiIG1hdGNoZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V29yZE1hdGNoZXJSZWdleCAod29yZCkge1xuICByZXR1cm4gYFxcXFxiKFxcXFx3KiR7ZXNjYXBlUmVnRXhwKHdvcmQpfVxcXFx3KilcXFxcYmA7XG59XG5cbi8qKlxuICogQWRkIGFuZHJvaWQ6aWQvIHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdG9yIFRoZSBpbml0aWFsIGxvY2F0b3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFN0cmluZyB3aXRoIGBhbmRyb2lkOmlkL2AgcHJlcGVuZGVkIChpZiBpdCB3YXNuJ3QgYWxyZWFkeSlcbiAqL1xuZnVuY3Rpb24gZm9ybWF0SWRMb2NhdG9yIChsb2NhdG9yKSB7XG4gIHJldHVybiBJRF9MT0NBVE9SX1BBVFRFUk4udGVzdChsb2NhdG9yKSA/IGxvY2F0b3IgOiBgYW5kcm9pZDppZC8ke2xvY2F0b3J9YDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NBdHRyXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUeXBlIG9mIGF0dHJpYnV0ZSAobXVzdCBiZSBzdHJpbmcgb3IgZW1wdHkpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gb3BlcmF0b3IgVGhlIG9wZXJhdG9yIGJldHdlZW4gdmFsdWUgYW5kIHZhbHVlIHR5cGUgKD0sICo9LCAsIF49LCAkPSlcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBDU1MgYXR0cmlidXRlIGludG8gYSBVaVNlbGVjdG9yIG1ldGhvZCBjYWxsXG4gKlxuICogQHBhcmFtIHtDc3NBdHRyfSBjc3NBdHRyIENTUyBhdHRyaWJ1dGUgb2JqZWN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDU1MgYXR0cmlidXRlIHBhcnNlZCBhcyBVaVNlbGVjdG9yXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXR0ciAoY3NzQXR0cikge1xuICBpZiAoY3NzQXR0ci52YWx1ZVR5cGUgJiYgY3NzQXR0ci52YWx1ZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtjc3NBdHRyLm5hbWV9PSR7Y3NzQXR0ci52YWx1ZX0nIGlzIGFuIGludmFsaWQgYXR0cmlidXRlLiBgICtcbiAgICAgIGBPbmx5ICdzdHJpbmcnIGFuZCBlbXB0eSBhdHRyaWJ1dGUgdHlwZXMgYXJlIHN1cHBvcnRlZC4gRm91bmQgJyR7Y3NzQXR0ci52YWx1ZVR5cGV9J2ApO1xuICB9XG4gIGNvbnN0IGF0dHJOYW1lID0gYXNzZXJ0R2V0QXR0ck5hbWUoY3NzQXR0cik7XG4gIGNvbnN0IG1ldGhvZE5hbWUgPSB0b1NuYWtlQ2FzZShhdHRyTmFtZSk7XG5cbiAgLy8gVmFsaWRhdGUgdGhhdCBpdCdzIGEgc3VwcG9ydGVkIGF0dHJpYnV0ZVxuICBpZiAoIVNUUl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkgJiYgIUJPT0xFQU5fQVRUUlMuaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHthdHRyTmFtZX0nIGlzIG5vdCBzdXBwb3J0ZWQuIFN1cHBvcnRlZCBhdHRyaWJ1dGVzIGFyZSBgICtcbiAgICAgIGAnJHtbLi4uU1RSX0FUVFJTLCAuLi5CT09MRUFOX0FUVFJTXS5qb2luKCcsICcpfSdgKTtcbiAgfVxuXG4gIC8vIFBhcnNlIGJvb2xlYW4sIGlmIGl0J3MgYSBib29sZWFuIGF0dHJpYnV0ZVxuICBpZiAoQk9PTEVBTl9BVFRSUy5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KCR7YXNzZXJ0R2V0Qm9vbChjc3NBdHRyKX0pYDtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSBwYXJzZSBhcyBzdHJpbmdcbiAgbGV0IHZhbHVlID0gY3NzQXR0ci52YWx1ZSB8fCAnJztcbiAgaWYgKGF0dHJOYW1lID09PSBSRVNPVVJDRV9JRCkge1xuICAgIHZhbHVlID0gZm9ybWF0SWRMb2NhdG9yKHZhbHVlKTtcbiAgfVxuICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJcIilgO1xuICB9XG5cbiAgc3dpdGNoIChjc3NBdHRyLm9wZXJhdG9yKSB7XG4gICAgY2FzZSAnPSc6XG4gICAgICByZXR1cm4gYC4ke21ldGhvZE5hbWV9KFwiJHt2YWx1ZX1cIilgO1xuICAgIGNhc2UgJyo9JzpcbiAgICAgIGlmIChbJ2Rlc2NyaXB0aW9uJywgJ3RleHQnXS5pbmNsdWRlcyhhdHRyTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfUNvbnRhaW5zKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9XCIpYDtcbiAgICBjYXNlICdePSc6XG4gICAgICBpZiAoWydkZXNjcmlwdGlvbicsICd0ZXh0J10uaW5jbHVkZXMoYXR0ck5hbWUpKSB7XG4gICAgICAgIHJldHVybiBgLiR7bWV0aG9kTmFtZX1TdGFydHNXaXRoKFwiJHt2YWx1ZX1cIilgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCJeJHtlc2NhcGVSZWdFeHAodmFsdWUpfVwiKWA7XG4gICAgY2FzZSAnJD0nOlxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2VzY2FwZVJlZ0V4cCh2YWx1ZSl9JFwiKWA7XG4gICAgY2FzZSAnfj0nOlxuICAgICAgcmV0dXJuIGAuJHttZXRob2ROYW1lfU1hdGNoZXMoXCIke2dldFdvcmRNYXRjaGVyUmVnZXgodmFsdWUpfVwiKWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFVucmVhY2hhYmxlLCBidXQgYWRkaW5nIGVycm9yIGluIGNhc2UgYSBuZXcgQ1NTIGF0dHJpYnV0ZSBpcyBhZGRlZC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQ1NTIGF0dHJpYnV0ZSBvcGVyYXRvciAnJHtjc3NBdHRyLm9wZXJhdG9yfScuIGAgK1xuICAgICAgICBgICc9JywgJyo9JywgJ149JywgJyQ9JyBhbmQgJ349JyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ3NzUHNldWRvXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZhbHVlVHlwZSBUaGUgdHlwZSBvZiBDU1MgcHNldWRvIHNlbGVjdG9yIChodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9jc3Mtc2VsZWN0b3ItcGFyc2VyIGZvciByZWZlcmVuY2UpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBzZXVkbyBzZWxlY3RvclxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHBzZXVkbyBzZWxlY3RvclxuICovXG5cbi8qKlxuICogQ29udmVydCBhIENTUyBwc2V1ZG8gY2xhc3MgdG8gYSBVaVNlbGVjdG9yXG4gKlxuICogQHBhcmFtIHtDc3NQc2V1ZG99IGNzc1BzZXVkbyBDU1MgUHNldWRvIGNsYXNzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBQc2V1ZG8gc2VsZWN0b3IgcGFyc2VkIGFzIFVpU2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gcGFyc2VQc2V1ZG8gKGNzc1BzZXVkbykge1xuICBpZiAoY3NzUHNldWRvLnZhbHVlVHlwZSAmJiBjc3NQc2V1ZG8udmFsdWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7Y3NzUHNldWRvLm5hbWV9PSR7Y3NzUHNldWRvLnZhbHVlfScuIGAgK1xuICAgICAgYFVuc3VwcG9ydGVkIGNzcyBwc2V1ZG8gY2xhc3MgdmFsdWUgdHlwZTogJyR7Y3NzUHNldWRvLnZhbHVlVHlwZX0nLiBPbmx5ICdzdHJpbmcnIHR5cGUgb3IgZW1wdHkgaXMgc3VwcG9ydGVkLmApO1xuICB9XG5cbiAgY29uc3QgcHNldWRvTmFtZSA9IGFzc2VydEdldEF0dHJOYW1lKGNzc1BzZXVkbyk7XG5cbiAgaWYgKEJPT0xFQU5fQVRUUlMuaW5jbHVkZXMocHNldWRvTmFtZSkpIHtcbiAgICByZXR1cm4gYC4ke3RvU25ha2VDYXNlKHBzZXVkb05hbWUpfSgke2Fzc2VydEdldEJvb2woY3NzUHNldWRvKX0pYDtcbiAgfVxuXG4gIGlmIChOVU1FUklDX0FUVFJTLmluY2x1ZGVzKHBzZXVkb05hbWUpKSB7XG4gICAgcmV0dXJuIGAuJHtwc2V1ZG9OYW1lfSgke2Nzc1BzZXVkby52YWx1ZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENzc1J1bGVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbmVzdGluZ09wZXJhdG9yIFRoZSBuZXN0aW5nIG9wZXJhdG9yIChha2E6IGNvbWJpbmF0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMpXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHRhZ05hbWUgVGhlIHRhZyBuYW1lIChha2E6IHR5cGUgc2VsZWN0b3IgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL1R5cGVfc2VsZWN0b3JzKVxuICogQHByb3BlcnR5IHs/c3RyaW5nW119IGNsYXNzTmFtZXMgQW4gYXJyYXkgb2YgQ1NTIGNsYXNzIG5hbWVzXG4gKiBAcHJvcGVydHkgez9Dc3NBdHRyW119IGF0dHJzIEFuIGFycmF5IG9mIENTUyBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkgez9Dc3NQc2V1ZG9bXX0gYXR0cnMgQW4gYXJyYXkgb2YgQ1NTIHBzZXVkb3NcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaWQgQ1NTIGlkZW50aWZpZXJcbiAqIEBwcm9wZXJ0eSB7P0Nzc1J1bGV9IHJ1bGUgQSBkZXNjZW5kYW50IG9mIHRoaXMgQ1NTIHJ1bGVcbiAqL1xuXG4vKipcbiAqIENvbnZlcnQgYSBDU1MgcnVsZSB0byBhIFVpU2VsZWN0b3JcbiAqIEBwYXJhbSB7Q3NzUnVsZX0gY3NzUnVsZSBDU1MgcnVsZSBkZWZpbml0aW9uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ3NzUnVsZSAoY3NzUnVsZSkge1xuICBjb25zdCB7IG5lc3RpbmdPcGVyYXRvciB9ID0gY3NzUnVsZTtcbiAgaWYgKG5lc3RpbmdPcGVyYXRvciAmJiBuZXN0aW5nT3BlcmF0b3IgIT09ICcgJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7bmVzdGluZ09wZXJhdG9yfScgaXMgbm90IGEgc3VwcG9ydGVkIGNvbWJpbmF0b3IuIGAgK1xuICAgICAgYE9ubHkgY2hpbGQgY29tYmluYXRvciAoPikgYW5kIGRlc2NlbmRhbnQgY29tYmluYXRvciBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG5cbiAgbGV0IHVpQXV0b21hdG9yU2VsZWN0b3IgPSAnbmV3IFVpU2VsZWN0b3IoKSc7XG4gIGlmIChjc3NSdWxlLnRhZ05hbWUgJiYgY3NzUnVsZS50YWdOYW1lICE9PSAnKicpIHtcbiAgICBsZXQgYW5kcm9pZENsYXNzID0gW2Nzc1J1bGUudGFnTmFtZV07XG4gICAgaWYgKGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgZm9yIChjb25zdCBjc3NDbGFzc05hbWVzIG9mIGNzc1J1bGUuY2xhc3NOYW1lcykge1xuICAgICAgICBhbmRyb2lkQ2xhc3MucHVzaChjc3NDbGFzc05hbWVzKTtcbiAgICAgIH1cbiAgICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5jbGFzc05hbWUoXCIke2FuZHJvaWRDbGFzcy5qb2luKCcuJyl9XCIpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNsYXNzTmFtZU1hdGNoZXMoXCIke2Nzc1J1bGUudGFnTmFtZX1cIilgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjc3NSdWxlLmNsYXNzTmFtZXMpIHtcbiAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IGAuY2xhc3NOYW1lTWF0Y2hlcyhcIiR7Y3NzUnVsZS5jbGFzc05hbWVzLmpvaW4oJ1xcXFwuJyl9XCIpYDtcbiAgfVxuICBpZiAoY3NzUnVsZS5pZCkge1xuICAgIHVpQXV0b21hdG9yU2VsZWN0b3IgKz0gYC5yZXNvdXJjZUlkKFwiJHtmb3JtYXRJZExvY2F0b3IoY3NzUnVsZS5pZCl9XCIpYDtcbiAgfVxuICBpZiAoY3NzUnVsZS5hdHRycykge1xuICAgIGZvciAoY29uc3QgYXR0ciBvZiBjc3NSdWxlLmF0dHJzKSB7XG4gICAgICB1aUF1dG9tYXRvclNlbGVjdG9yICs9IHBhcnNlQXR0cihhdHRyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGNzc1J1bGUucHNldWRvcykge1xuICAgIGZvciAoY29uc3QgcHNldWRvIG9mIGNzc1J1bGUucHNldWRvcykge1xuICAgICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBwYXJzZVBzZXVkbyhwc2V1ZG8pO1xuICAgIH1cbiAgfVxuICBpZiAoY3NzUnVsZS5ydWxlKSB7XG4gICAgdWlBdXRvbWF0b3JTZWxlY3RvciArPSBgLmNoaWxkU2VsZWN0b3IoJHtwYXJzZUNzc1J1bGUoY3NzUnVsZS5ydWxlKX0pYDtcbiAgfVxuICByZXR1cm4gdWlBdXRvbWF0b3JTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDc3NPYmplY3RcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdHlwZSBUeXBlIG9mIENTUyBvYmplY3QuICdydWxlJywgJ3J1bGVzZXQnIG9yICdzZWxlY3RvcnMnXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0IENTUyBvYmplY3QgdG8gVWlBdXRvbWF0b3IyIHNlbGVjdG9yXG4gKiBAcGFyYW0ge0Nzc09iamVjdH0gY3NzIENTUyBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBDU1Mgb2JqZWN0IHBhcnNlZCBhcyBhIFVpU2VsZWN0b3JcbiAqL1xuZnVuY3Rpb24gcGFyc2VDc3NPYmplY3QgKGNzcykge1xuICBzd2l0Y2ggKGNzcy50eXBlKSB7XG4gICAgY2FzZSAncnVsZSc6XG4gICAgICByZXR1cm4gcGFyc2VDc3NSdWxlKGNzcyk7XG4gICAgY2FzZSAncnVsZVNldCc6XG4gICAgICByZXR1cm4gcGFyc2VDc3NPYmplY3QoY3NzLnJ1bGUpO1xuICAgIGNhc2UgJ3NlbGVjdG9ycyc6XG4gICAgICByZXR1cm4gY3NzLnNlbGVjdG9ycy5tYXAoKHNlbGVjdG9yKSA9PiBwYXJzZUNzc09iamVjdChzZWxlY3RvcikpLmpvaW4oJzsgJyk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVGhpcyBpcyBuZXZlciByZWFjaGFibGUsIGJ1dCBpZiBpdCBldmVyIGlzIGRvIHRoaXMuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVpQXV0b21hdG9yIGRvZXMgbm90IHN1cHBvcnQgJyR7Y3NzLnR5cGV9JyBjc3MuIE9ubHkgc3VwcG9ydHMgJ3J1bGUnLCAncnVsZVNldCcsICdzZWxlY3RvcnMnIGApO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIENTUyBzZWxlY3RvciB0byBhIFVpQXV0b21hdG9yMiBzZWxlY3RvclxuICogQHBhcmFtIHtzdHJpbmd9IGNzc1NlbGVjdG9yIENTUyBTZWxlY3RvclxuICogQHJldHVybnMge3N0cmluZ30gVGhlIENTUyBzZWxlY3RvciBjb252ZXJ0ZWQgdG8gYSBVaVNlbGVjdG9yXG4gKi9cbkNzc0NvbnZlcnRlci50b1VpQXV0b21hdG9yU2VsZWN0b3IgPSBmdW5jdGlvbiB0b1VpQXV0b21hdG9yU2VsZWN0b3IgKGNzc1NlbGVjdG9yKSB7XG4gIGxldCBjc3NPYmo7XG4gIHRyeSB7XG4gICAgY3NzT2JqID0gcGFyc2VyLnBhcnNlKGNzc1NlbGVjdG9yKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYEludmFsaWQgQ1NTIHNlbGVjdG9yICcke2Nzc1NlbGVjdG9yfScuIFJlYXNvbjogJyR7ZX0nYCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VDc3NPYmplY3QoY3NzT2JqKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZFNlbGVjdG9yRXJyb3IoYFVuc3VwcG9ydGVkIENTUyBzZWxlY3RvciAnJHtjc3NTZWxlY3Rvcn0nLiBSZWFzb246ICcke2V9J2ApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDc3NDb252ZXJ0ZXI7Il0sImZpbGUiOiJsaWIvY3NzLWNvbnZlcnRlci5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9