appium-xcuitest-driver 4.19.0 → 4.20.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/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## [4.20.0](https://github.com/appium/appium-xcuitest-driver/compare/v4.19.1...v4.20.0) (2023-03-28)
2
+
3
+
4
+ ### Features
5
+
6
+ * Add command for mobileRemoveCertificate for real devices ([#1529](https://github.com/appium/appium-xcuitest-driver/issues/1529)) ([2255f31](https://github.com/appium/appium-xcuitest-driver/commit/2255f3129d952c804dde3c1328aaacceb1e7df79))
7
+
8
+ ## [4.19.1](https://github.com/appium/appium-xcuitest-driver/compare/v4.19.0...v4.19.1) (2023-03-12)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Make sure the app is not reinstalled if noReset is requested ([4e8ccba](https://github.com/appium/appium-xcuitest-driver/commit/4e8ccba99d5e7b491ecdca0d5e17188e76165223))
14
+ * Tune app install condition ([d64805b](https://github.com/appium/appium-xcuitest-driver/commit/d64805b80fb1f1ab4a13fa1ebcdbb8915548d883))
15
+
1
16
  ## [4.19.0](https://github.com/appium/appium-xcuitest-driver/compare/v4.18.4...v4.19.0) (2023-03-03)
2
17
 
3
18
 
@@ -337,17 +337,26 @@ commands.mobileInstallCertificate = async function mobileInstallCertificate(opts
337
337
  await _support.fs.rimraf(tmpRoot);
338
338
  }
339
339
  };
340
- commands.mobileListCertificates = async function mobileListCertificates() {
340
+ commands.mobileRemoveCertificate = async function mobileRemoveCertificate(opts = {}) {
341
+ const {
342
+ name
343
+ } = opts;
341
344
  if (!this.isRealDevice()) {
342
345
  throw new _driver.errors.NotImplementedError('This extension is only supported on real devices');
343
346
  }
344
347
  const client = new _pyIosDeviceClient.default(this.opts.udid);
345
- if (await client.assertExists(false)) {
346
- return await client.listProfiles();
348
+ await client.assertExists(true);
349
+ return await client.removeProfile(name);
350
+ };
351
+ commands.mobileListCertificates = async function mobileListCertificates() {
352
+ if (!this.isRealDevice()) {
353
+ throw new _driver.errors.NotImplementedError('This extension is only supported on real devices');
347
354
  }
348
- throw new Error('pyidevice is not installed on your system, command cannot be executed.');
355
+ const client = new _pyIosDeviceClient.default(this.opts.udid);
356
+ await client.assertExists(true);
357
+ return await client.listProfiles();
349
358
  };
350
359
  Object.assign(extensions, commands);
351
360
  var _default = extensions;
352
361
  exports.default = _default;
353
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3VwcG9ydCIsIl9hc3luY2JveCIsIl9ibHVlYmlyZCIsIl9vcyIsIl9wYXRoIiwiX2h0dHAiLCJfdGVlbl9wcm9jZXNzIiwiX3BvcnRzY2FubmVyIiwiX3B5SW9zRGV2aWNlQ2xpZW50IiwiX2RyaXZlciIsImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImV4cG9ydHMiLCJDT05GSUdfRVhURU5TSU9OIiwiSE9TVF9QT1JUX1JBTkdFIiwiVE1QU0VSVkVSX1NUQVJUVVBfVElNRU9VVCIsIlNldHRpbmdzIiwiR2VuZXJhbCIsInR5cGUiLCJ2YWx1ZSIsIlByb2ZpbGUiLCJBYm91dCIsIkNlcnRpZmljYXRlX1RydXN0X1NldHRpbmdzIiwiQnV0dG9uIiwiSW5zdGFsbCIsIkFsbG93IiwiRG9uZSIsIlJldHVybl90b19TZXR0aW5ncyIsIkFsZXJ0IiwiZXh0cmFjdENvbW1vbk5hbWUiLCJjZXJ0QnVmZmVyIiwidGVtcENlcnQiLCJ0ZW1wRGlyIiwib3BlbiIsInByZWZpeCIsInN1ZmZpeCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsInN0ZG91dCIsImV4ZWMiLCJwYXJzZUNvbW1vbk5hbWUiLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJyaW1yYWYiLCJMSUJSRV9TU0xfUEFUVEVSTiIsIk9QRU5fU1NMX1BBVFRFUk4iLCJzdHJpbmdDZXJ0aWZpY2F0ZSIsInJlc3VsdCIsInJlZHVjZSIsImFjYyIsInIiLCJtYXRjaCIsInRvTW9iaWxlQ29uZmlnIiwiY29tbW9uTmFtZSIsImdldFVVSUQiLCJ1dGlsIiwidXVpZFY0IiwidG9VcHBlckNhc2UiLCJjb250ZW50VXVpZCIsIlBheWxvYWRDb250ZW50IiwiUGF5bG9hZENlcnRpZmljYXRlRmlsZU5hbWUiLCJQYXlsb2FkRGVzY3JpcHRpb24iLCJQYXlsb2FkRGlzcGxheU5hbWUiLCJQYXlsb2FkSWRlbnRpZmllciIsIlBheWxvYWRUeXBlIiwiUGF5bG9hZFVVSUQiLCJQYXlsb2FkVmVyc2lvbiIsIm9zIiwiaG9zdG5hbWUiLCJzcGxpdCIsIlBheWxvYWRSZW1vdmFsRGlzYWxsb3dlZCIsImNsaWNrRWxlbWVudCIsImRyaXZlciIsImxvY2F0b3IiLCJvcHRpb25zIiwiZWxlbWVudCIsInRpbWVvdXQiLCJza2lwSWZJbnZpc2libGUiLCJsb29rdXBEZWxheSIsInJldHJ5SW50ZXJ2YWwiLCJmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMiLCJKU09OIiwic3RyaW5naWZ5IiwibmF0aXZlQ2xpY2siLCJpbnN0YWxsUHJlMTIyQ2VydGlmaWNhdGUiLCJCIiwiZGVsYXkiLCJ0cnVzdENlcnRpZmljYXRlSW5QcmVmZXJlbmNlcyIsIm5hbWUiLCJzd2l0Y2hMb2NhdG9yIiwicmV0cnkiLCJtb2JpbGVTd2lwZSIsImRpcmVjdGlvbiIsInBvc3RBY2NlcHRBbGVydCIsImluc3RhbGxQb3N0MTIyQ2VydGlmaWNhdGUiLCJhY3RpdmF0ZUFwcCIsImlzQ2VydEZvdW5kIiwic3dpcGVOdW0iLCJtb2JpbGVJbnN0YWxsQ2VydGlmaWNhdGUiLCJvcHRzIiwiY29udGVudCIsImlzUm9vdCIsIl8iLCJpc0VtcHR5IiwiaXNTaW11bGF0b3IiLCJtZXRob2ROYW1lIiwiZGV2aWNlIiwic2ltY3RsIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwicmF3IiwiZSIsImxvZyIsImRlYnVnIiwiaW5mbyIsImNsaWVudCIsIlB5aWRldmljZSIsInVkaWQiLCJhc3NlcnRFeGlzdHMiLCJpbnN0YWxsUHJvZmlsZSIsInBheWxvYWQiLCJ0bXBSb290Iiwib3BlbkRpciIsInRtcFBvcnQiLCJmaW5kQVBvcnROb3RJblVzZSIsImNvbmZpZ05hbWUiLCJjb25maWdQYXRoIiwicmVzb2x2ZSIsInRtcFNlcnZlciIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjb25maWdGaWxlIiwicmVhZEZpbGUiLCJlbmQiLCJjbiIsIm1vYmlsZUNvbmZpZyIsInBsaXN0IiwidXBkYXRlUGxpc3RGaWxlIiwiaG9zdCIsImNlcnRVcmwiLCJsaXN0ZW4iLCJ3YWl0Rm9yQ29uZGl0aW9uIiwiY2hlY2tQb3J0U3RhdHVzIiwiaWduIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImlzUmVhbERldmljZSIsInByb3h5Q29tbWFuZCIsInVybCIsImlzV2ViQ29udGV4dCIsInNldFVybCIsIm9wZW5VcmwiLCJpc0NlcnRBbHJlYWR5SW5zdGFsbGVkIiwiY29tcGFyZVZlcnNpb25zIiwicGxhdGZvcm1WZXJzaW9uIiwiYnVuZGxlSWQiLCJ3YXJuIiwidG9Jbk1lbW9yeUJhc2U2NCIsImNsb3NlIiwibW9iaWxlTGlzdENlcnRpZmljYXRlcyIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJsaXN0UHJvZmlsZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvY2VydGlmaWNhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCBwbGlzdCwgdGVtcERpciwgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwsIHJldHJ5LCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlLCBjaGVja1BvcnRTdGF0dXMgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgUHlpZGV2aWNlIGZyb20gJy4uL3B5LWlvcy1kZXZpY2UtY2xpZW50JztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5sZXQgZXh0ZW5zaW9ucyA9IHt9LCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBDT05GSUdfRVhURU5TSU9OID0gJ21vYmlsZWNvbmZpZyc7XG5jb25zdCBIT1NUX1BPUlRfUkFOR0UgPSBbMzgyMDAsIDM4Mjk5XTtcbmNvbnN0IFRNUFNFUlZFUl9TVEFSVFVQX1RJTUVPVVQgPSA1MDAwO1xuY29uc3QgU2V0dGluZ3MgPSB7XG4gIEdlbmVyYWw6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdHZW5lcmFsJyxcbiAgfSxcbiAgUHJvZmlsZToge1xuICAgIHR5cGU6ICctaW9zIHByZWRpY2F0ZSBzdHJpbmcnLFxuICAgIHZhbHVlOiBgbmFtZSBCRUdJTlNXSVRIICdQcm9maWxlJ2AsXG4gIH0sXG4gIEFib3V0OiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnQWJvdXQnLFxuICB9LFxuICBDZXJ0aWZpY2F0ZV9UcnVzdF9TZXR0aW5nczoge1xuICAgIHR5cGU6ICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICB2YWx1ZTogJ0NlcnRpZmljYXRlIFRydXN0IFNldHRpbmdzJyxcbiAgfSxcbn07XG5jb25zdCBCdXR0b24gPSB7XG4gIEluc3RhbGw6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdJbnN0YWxsJyxcbiAgfSxcbiAgQWxsb3c6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdBbGxvdycsXG4gIH0sXG4gIERvbmU6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdEb25lJyxcbiAgfSxcbiAgUmV0dXJuX3RvX1NldHRpbmdzOiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnUmV0dXJuIHRvIFNldHRpbmdzJyxcbiAgfSxcbn07XG5jb25zdCBBbGVydCA9IHtcbiAgSW5zdGFsbDoge1xuICAgIHR5cGU6ICctaW9zIGNsYXNzIGNoYWluJyxcbiAgICB2YWx1ZTogJyoqL1hDVUlFbGVtZW50VHlwZUFueVtgdHlwZSA9PSBcXCdYQ1VJRWxlbWVudFR5cGVBbGVydFxcJyBPUiB0eXBlID09IFxcJ1hDVUlFbGVtZW50VHlwZVNoZWV0XFwnYF0vKiovWENVSUVsZW1lbnRUeXBlQnV0dG9uW2BsYWJlbCA9PSBcXCdJbnN0YWxsXFwnYF0nLFxuICB9LFxufTtcblxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0Q29tbW9uTmFtZSAoY2VydEJ1ZmZlcikge1xuICBjb25zdCB0ZW1wQ2VydCA9IGF3YWl0IHRlbXBEaXIub3Blbih7XG4gICAgcHJlZml4OiAnY2VydCcsXG4gICAgc3VmZml4OiAnLmNlcidcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBDZXJ0LnBhdGgsIGNlcnRCdWZmZXIpO1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnb3BlbnNzbCcsIFsneDUwOScsICctbm9vdXQnLCAnLXN1YmplY3QnLCAnLWluJywgdGVtcENlcnQucGF0aF0pO1xuICAgIHJldHVybiBwYXJzZUNvbW1vbk5hbWUoc3Rkb3V0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgY29tbW9uIG5hbWUgdmFsdWUgZnJvbSB0aGUgY2VydGlmaWNhdGUuIElzIGl0IHZhbGlkIGFuZCBiYXNlNjQtZW5jb2RlZD8gYCArXG4gICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGVtcENlcnQucGF0aCk7XG4gIH1cbn1cblxuY29uc3QgTElCUkVfU1NMX1BBVFRFUk4gPSAvXFwvQ049KFteXFwvXSspLzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuY29uc3QgT1BFTl9TU0xfUEFUVEVSTiA9IC8sXFxzQ05cXHM9XFxzKFteLF0rKS87XG5cbmZ1bmN0aW9uIHBhcnNlQ29tbW9uTmFtZSAoc3RyaW5nQ2VydGlmaWNhdGUpIHtcbiAgY29uc3QgcmVzdWx0ID0gW0xJQlJFX1NTTF9QQVRURVJOLCBPUEVOX1NTTF9QQVRURVJOXS5yZWR1Y2UoKGFjYywgcikgPT4ge1xuICAgIGlmIChhY2MpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gci5leGVjKHN0cmluZ0NlcnRpZmljYXRlKTtcbiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG4gIH0sIG51bGwpO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgbm8gY29tbW9uIG5hbWUgdmFsdWUgaW4gJyR7c3RyaW5nQ2VydGlmaWNhdGV9JyBvdXRwdXRgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBBcHBsZSdzIG92ZXItdGhlLWFpciBjb25maWd1cmF0aW9uIHByb2ZpbGVcbiAqIGZvciBjZXJ0aWZpY2F0ZSBkZXBsb3ltZW50IGJhc2VkIG9uIHRoZSBnaXZlbiBQRU0gY2VydGlmaWNhdGUgY29udGVudC5cbiAqIFJlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvY29udGVudC9kb2N1bWVudGF0aW9uL05ldHdvcmtpbmdJbnRlcm5ldC9Db25jZXB0dWFsL2lQaG9uZU9UQUNvbmZpZ3VyYXRpb24vSW50cm9kdWN0aW9uL0ludHJvZHVjdGlvbi5odG1sXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHN1Y2ggcHJvZmlsZXMuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGNlcnRCdWZmZXIgLSBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgUEVNIGNlcnRpZmljYXRlIGVuY29kZWQgaW50byBOb2RlSlMgYnVmZmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbW9uTmFtZSAtIENlcnRpZmljYXRlJ3MgY29tbW9uIG5hbWVcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBlbmNvZGVkIHN0cnVjdHVyZSBvZiB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUsIHdoaWNoIGlzIHJlYWR5IHRvIGJlIHBhc3NlZFxuICogYXMgYW4gYXJndW1lbnQgdG8gcGxpc3QgYnVpbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgcGFyc2VkXG4gKi9cbmZ1bmN0aW9uIHRvTW9iaWxlQ29uZmlnIChjZXJ0QnVmZmVyLCBjb21tb25OYW1lKSB7XG4gIGNvbnN0IGdldFVVSUQgPSAoKSA9PiB1dGlsLnV1aWRWNCgpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IGNvbnRlbnRVdWlkID0gZ2V0VVVJRCgpO1xuICByZXR1cm4ge1xuICAgIFBheWxvYWRDb250ZW50OiBbe1xuICAgICAgUGF5bG9hZENlcnRpZmljYXRlRmlsZU5hbWU6IGAke2NvbW1vbk5hbWV9LmNlcmAsXG4gICAgICBQYXlsb2FkQ29udGVudDogY2VydEJ1ZmZlcixcbiAgICAgIFBheWxvYWREZXNjcmlwdGlvbjogJ0FkZHMgYSBDQSByb290IGNlcnRpZmljYXRlJyxcbiAgICAgIFBheWxvYWREaXNwbGF5TmFtZTogY29tbW9uTmFtZSxcbiAgICAgIFBheWxvYWRJZGVudGlmaWVyOiBgY29tLmFwcGxlLnNlY3VyaXR5LnJvb3QuJHtjb250ZW50VXVpZH1gLFxuICAgICAgUGF5bG9hZFR5cGU6ICdjb20uYXBwbGUuc2VjdXJpdHkucm9vdCcsXG4gICAgICBQYXlsb2FkVVVJRDogY29udGVudFV1aWQsXG4gICAgICBQYXlsb2FkVmVyc2lvbjogMVxuICAgIH1dLFxuICAgIFBheWxvYWREaXNwbGF5TmFtZTogY29tbW9uTmFtZSxcbiAgICBQYXlsb2FkSWRlbnRpZmllcjogYCR7b3MuaG9zdG5hbWUoKS5zcGxpdCgnLicpWzBdfS4ke2dldFVVSUQoKX1gLFxuICAgIFBheWxvYWRSZW1vdmFsRGlzYWxsb3dlZDogZmFsc2UsXG4gICAgUGF5bG9hZFR5cGU6ICdDb25maWd1cmF0aW9uJyxcbiAgICBQYXlsb2FkVVVJRDogZ2V0VVVJRCgpLFxuICAgIFBheWxvYWRWZXJzaW9uOiAxXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsaWNrRWxlbWVudCAoZHJpdmVyLCBsb2NhdG9yLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGVsZW1lbnQgPSBudWxsO1xuICBjb25zdCB7XG4gICAgdGltZW91dCA9IDUwMDAsXG4gICAgc2tpcElmSW52aXNpYmxlID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxvb2t1cERlbGF5ID0gNTAwO1xuICB0cnkge1xuICAgIGVsZW1lbnQgPSBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgPCBsb29rdXBEZWxheSA/IDEgOiB0aW1lb3V0IC8gbG9va3VwRGVsYXksIGxvb2t1cERlbGF5LFxuICAgICAgKCkgPT4gZHJpdmVyLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhsb2NhdG9yLnR5cGUsIGxvY2F0b3IudmFsdWUsIGZhbHNlKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChza2lwSWZJbnZpc2libGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCAke0pTT04uc3RyaW5naWZ5KGxvY2F0b3IpfSB3aXRoaW4gJHt0aW1lb3V0fW1zIHRpbWVvdXRgKTtcbiAgfVxuICBhd2FpdCBkcml2ZXIubmF0aXZlQ2xpY2soZWxlbWVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsUHJlMTIyQ2VydGlmaWNhdGUgKGRyaXZlcikge1xuICAvLyBBY2NlcHQgU2FmYXJpIGFsZXJ0XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5BbGxvdywge1xuICAgIC8vIGNlcnRpZmljYXRlIGxvYWQgbWlnaHQgdGFrZSBzb21lIHRpbWUgb24gc2xvdyBtYWNoaW5lc1xuICAgIHRpbWVvdXQ6IDE1MDAwLFxuICB9KTtcbiAgLy8gV2FpdCB1bnRpbCBQcmVmZXJlbmNlcyBhcmUgb3BlbmVkXG4gIGF3YWl0IEIuZGVsYXkoMjAwMCk7XG5cbiAgLy8gR28gdGhyb3VnaCBQcmVmZXJlbmNlcyB3aXphcmRcbiAgaWYgKCFhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uSW5zdGFsbCwge1xuICAgIHNraXBJZkludmlzaWJsZTogdHJ1ZSxcbiAgfSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gV2UgbmVlZCB0byBjbGljayBJbnN0YWxsIGJ1dHRvbiBvbiB0d28gZGlmZmVyZW50IHRhYnNcbiAgLy8gVGhlIHNlY29uZCBvbmUgY29uZmlybXMgdGhlIHByZXZpb3VzXG4gIGF3YWl0IEIuZGVsYXkoMTUwMCk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5JbnN0YWxsKTtcbiAgLy8gQWNjZXB0IGFsZXJ0XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEFsZXJ0Lkluc3RhbGwpO1xuICAvLyBGaW5pc2ggYWRkaW5nIGNlcnRpZmljYXRlXG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5Eb25lKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRydXN0Q2VydGlmaWNhdGVJblByZWZlcmVuY2VzIChkcml2ZXIsIG5hbWUpIHtcbiAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgU2V0dGluZ3MuR2VuZXJhbCk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIFNldHRpbmdzLkFib3V0KTtcbiAgY29uc3Qgc3dpdGNoTG9jYXRvciA9IHtcbiAgICB0eXBlOiAnLWlvcyBjbGFzcyBjaGFpbicsXG4gICAgdmFsdWU6IGAqKi9YQ1VJRWxlbWVudFR5cGVDZWxsW1xcYGxhYmVsID09ICcke25hbWV9J1xcYF0vKiovWENVSUVsZW1lbnRUeXBlU3dpdGNoYCxcbiAgfTtcbiAgYXdhaXQgcmV0cnkoNSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRyaXZlci5tb2JpbGVTd2lwZSh7XG4gICAgICBlbGVtZW50OiBhd2FpdCBkcml2ZXIuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZVRhYmxlJywgZmFsc2UpLFxuICAgICAgZGlyZWN0aW9uOiAndXAnXG4gICAgfSk7XG4gICAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgU2V0dGluZ3MuQ2VydGlmaWNhdGVfVHJ1c3RfU2V0dGluZ3MsIHtcbiAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICB9KTtcblxuICAgIGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoc3dpdGNoTG9jYXRvci50eXBlLCBzd2l0Y2hMb2NhdG9yLnZhbHVlLCBmYWxzZSk7XG4gIH0pO1xuICAvLyBPbmx5IGNsaWNrIHRoZSBzd2l0Y2ggaWYgaXQgaXMgc2V0IHRvIE9mZlxuICBpZiAoYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwge1xuICAgIHR5cGU6IHN3aXRjaExvY2F0b3IudHlwZSxcbiAgICB2YWx1ZTogYCR7c3dpdGNoTG9jYXRvci52YWx1ZX1bXFxgdmFsdWUgPT0gJzAnXFxgXWBcbiAgfSwge1xuICAgIHRpbWVvdXQ6IDEwMDAsXG4gICAgc2tpcElmSW52aXNpYmxlOiB0cnVlLFxuICB9KSkge1xuICAgIGF3YWl0IGRyaXZlci5wb3N0QWNjZXB0QWxlcnQoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsUG9zdDEyMkNlcnRpZmljYXRlIChkcml2ZXIsIG5hbWUpIHtcbiAgLy8gQWNjZXB0IFNhZmFyaSBhbGVydFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uQWxsb3csIHtcbiAgICAvLyBjZXJ0aWZpY2F0ZSBsb2FkIG1pZ2h0IHRha2Ugc29tZSB0aW1lIG9uIHNsb3cgbWFjaGluZXNcbiAgICB0aW1lb3V0OiAxNTAwMCxcbiAgfSk7XG4gIC8vIFdhaXQgZm9yIHRoZSBzZWNvbmQgYWxlcnRcbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcblxuICBhd2FpdCBkcml2ZXIucG9zdEFjY2VwdEFsZXJ0KCk7XG4gIGF3YWl0IGRyaXZlci5hY3RpdmF0ZUFwcCgnY29tLmFwcGxlLlByZWZlcmVuY2VzJyk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIFNldHRpbmdzLkdlbmVyYWwpO1xuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBTZXR0aW5ncy5Qcm9maWxlKTtcbiAgLy8gU2VsZWN0IHRoZSB0YXJnZXQgY2VydFxuICBsZXQgaXNDZXJ0Rm91bmQgPSBmYWxzZTtcbiAgZm9yIChsZXQgc3dpcGVOdW0gPSAwOyBzd2lwZU51bSA8IDU7ICsrc3dpcGVOdW0pIHtcbiAgICBpZiAoYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwge1xuICAgICAgdHlwZTogJy1pb3MgY2xhc3MgY2hhaW4nLFxuICAgICAgdmFsdWU6IGAqKi9YQ1VJRWxlbWVudFR5cGVDZWxsW1xcYGxhYmVsID09ICcke25hbWV9J1xcYF1gLFxuICAgIH0sIHtcbiAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICAgIHNraXBJZkludmlzaWJsZTogdHJ1ZSxcbiAgICB9KSkge1xuICAgICAgaXNDZXJ0Rm91bmQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgZHJpdmVyLm1vYmlsZVN3aXBlKHtcbiAgICAgIGVsZW1lbnQ6IGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlVGFibGUnLCBmYWxzZSksXG4gICAgICBkaXJlY3Rpb246ICd1cCdcbiAgICB9KTtcbiAgfVxuICBpZiAoIWlzQ2VydEZvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjZXJ0aWZpY2F0ZXMgbGlzdGApO1xuICB9XG5cbiAgLy8gSW5zdGFsbCBvcHRpb24gaXMgb25seSB2aXNpYmxlIGlmIHRoZSBjZXJ0IGlzIG5vdCBpbnN0YWxsZWQgeWV0XG4gIGlmICghYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgQnV0dG9uLkluc3RhbGwsIHtcbiAgICBza2lwSWZJbnZpc2libGU6IHRydWUsXG4gIH0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGF3YWl0IEIuZGVsYXkoMTUwMCk7XG4gIC8vIENvbmZpcm0gdW50cnVzdGVkIGNlcnQgaW5zdGFsbFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uSW5zdGFsbCk7XG4gIC8vIEFjY2VwdCBhbGVydFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBBbGVydC5JbnN0YWxsKTtcbiAgLy8gRmluaXNoIGFkZGluZyBjZXJ0aWZpY2F0ZVxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uRG9uZSk7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2VydGlmaWNhdGVJbnN0YWxsYXRpb25PcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHshc3RyaW5nfSBjb250ZW50IC0gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcHVibGljIGNlcnRpZmljYXRlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbW1vbk5hbWUgLSBDb21tb24gbmFtZSBvZiB0aGUgY2VydGlmaWNhdGUuIElmIHRoaXMgaXMgbm90IHNldFxuICogdGhlbiB0aGUgc2NyaXB0IHdpbGwgdHJ5IHRvIHBhcnNlIGl0IGZyb20gdGhlIGdpdmVuIGNlcnRpZmljYXRlIGNvbnRlbnQuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBpc1Jvb3QgW3RydWVdIC0gVGhpcyBvcHRpb24gZGVmaW5lcyB3aGVyZSB0aGUgY2VydGlmaWNhdGUgc2hvdWxkIGJlXG4gKiBpbnN0YWxsZWQgdG86IGVpdGhlciBUcnVzdGVkIFJvb3QgU3RvcmUgKGB0cnVlYCwgdGhlIGRlZmF1bHQgb3B0aW9uKSBvclxuICogdGhlIEtleWNoYWluIChgZmFsc2VgKS4gT24gZW52aXJvbm1lbnRzIG90aGVyIHRoYW4gWGNvZGUgMTEuNCsgU2ltdWxhdG9yIHRoaXNcbiAqIG9wdGlvbiBpcyBpZ25vcmVkLlxuICovXG5cbi8qKlxuICogSW5zdGFsbHMgYSBjdXN0b20gY2VydGlmaWNhdGUgb250byB0aGUgZGV2aWNlLlxuICogU2luY2UgWGNvZGUgU0RLIDExLjQgQXBwbGUgaGFzIGFkZGVkIGEgZGVkaWNhdGVkIHNpbWN0bCBzdWJjb21tYW5kIHRvIHF1aWNrbHkgaGFuZGxlXG4gKiBjZXJ0aWZpY2F0ZXMgb24gU2ltdWxhdG9yIG92ZXIgQ0xJLlxuICogT24gcmVhbCBkZXZpY2VzIG9yIHNpbXVsYXRvcnMgYmVmb3JlIFhjb2RlIDExLjQgU0RLXG4gKiBBcHBsZSBwcm92aWRlcyBubyBvZmZpY2lhbCB3YXkgdG8gZG8gaXQgdmlhIHRoZSBjb21tYW5kIGxpbmUuXG4gKiBJbiBzdWNoIGNhc2UgKGFuZCBhbHNvIGFzIGEgZmFsbGJhY2sgaWYgQ0xJIHNldHVwIGZhaWxzKVxuICogdGhpcyBtZXRob2QgdHJpZXMgdG8gd3JhcCB0aGUgY2VydGlmaWNhdGUgaW50byAubW9iaWxlY29uZmlnIGZvcm1hdFxuICogYW5kIHRoZW4gZGVwbG95cyB0aGUgd3JhcHBlZCBmaWxlIHRvIHRoZSBpbnRlcm5hbCBIVFRQIHNlcnZlcixcbiAqIHNvIG9uZSBjYW4gb3BlbiBpdCB2aWEgbW9iaWxlIFNhZmFyaS5cbiAqIFRoZW4gdGhlIGFsZ29yaXRobSBnb2VzIHRocm91Z2ggdGhlIHByb2ZpbGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBieVxuICogY2xpY2tpbmcgdGhlIG5lY2Vzc2FyeSBidXR0b25zIHVzaW5nIFdlYkRyaXZlckFnZW50LlxuICpcbiAqIEBwYXJhbSB7Q2VydGlmaWNhdGVJbnN0YWxsYXRpb25PcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGNvbnRlbnQgb2YgdGhlIGdlbmVyYXRlZCAubW9iaWxlY29uZmlnIGZpbGUgYXNcbiAqIGJhc2U2NC1lbmNvZGVkIHN0cmluZy4gVGhpcyBjb25maWcgbWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKiBJZiB0aGUgY2VydGlmaWNhdGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCB2aWEgQ0xJIHRoZW4gbm90aGluZyBpcyByZXR1cm5lZC5cbiAqL1xuY29tbWFuZHMubW9iaWxlSW5zdGFsbENlcnRpZmljYXRlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSW5zdGFsbENlcnRpZmljYXRlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGNvbnRlbnQsXG4gICAgY29tbW9uTmFtZSxcbiAgICBpc1Jvb3QgPSB0cnVlLFxuICB9ID0gb3B0cztcbiAgaWYgKF8uaXNFbXB0eShjb250ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2VydGlmaWNhdGUgY29udGVudCBzaG91bGQgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICBpZiAodGhpcy5pc1NpbXVsYXRvcigpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBpc1Jvb3QgPyAnYWRkUm9vdENlcnRpZmljYXRlJyA6ICdhZGRDZXJ0aWZpY2F0ZSc7XG4gICAgICBhd2FpdCB0aGlzLm9wdHMuZGV2aWNlLnNpbWN0bFttZXRob2ROYW1lXShcbiAgICAgICAgQnVmZmVyLmZyb20oY29udGVudCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCksIHtyYXc6IHRydWV9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVGhlIGNlcnRpZmljYXRlIGNhbm5vdCBiZSBpbnN0YWxsZWQgdmlhIENMSS4gYCArXG4gICAgICAgIGBGYWxsaW5nIGJhY2sgdG8gVUktYmFzZWQgZGVwbG95bWVudGApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUHlpZGV2aWNlKHRoaXMub3B0cy51ZGlkKTtcbiAgICBpZiAoYXdhaXQgY2xpZW50LmFzc2VydEV4aXN0cyhmYWxzZSkpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5pbnN0YWxsUHJvZmlsZSh7cGF5bG9hZDogQnVmZmVyLmZyb20oY29udGVudCwgJ2Jhc2U2NCcpfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ3B5aWRldmljZSBpcyBub3QgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLiAnICtcbiAgICAgICAgJ0ZhbGxpbmcgYmFjayB0byB0aGUgKHNsb3cpIFVJLWJhc2VkIGluc3RhbGxhdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgY29uc3QgdG1wUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKEhPU1RfUE9SVF9SQU5HRVswXSwgSE9TVF9QT1JUX1JBTkdFWzFdKTtcbiAgY29uc3QgY29uZmlnTmFtZSA9IGBhcHBpdW0uJHtDT05GSUdfRVhURU5TSU9OfWA7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgY29uZmlnTmFtZSk7XG4gIGNvbnN0IHRtcFNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIGZ1bmN0aW9uIChfLCByZXMpIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gYXdhaXQgZnMucmVhZEZpbGUoY29uZmlnUGF0aCk7XG4gICAgcmVzLmVuZChjb25maWdGaWxlKTtcbiAgfSk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2VydEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQsICdiYXNlNjQnKTtcbiAgICBjb25zdCBjbiA9IGNvbW1vbk5hbWUgfHwgYXdhaXQgZXh0cmFjdENvbW1vbk5hbWUoY2VydEJ1ZmZlcik7XG4gICAgY29uc3QgbW9iaWxlQ29uZmlnID0gdG9Nb2JpbGVDb25maWcoY2VydEJ1ZmZlciwgY24pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwbGlzdC51cGRhdGVQbGlzdEZpbGUoY29uZmlnUGF0aCwgbW9iaWxlQ29uZmlnLCBmYWxzZSwgZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RvcmUgdGhlIGdlbmVyYXRlZCBjb25maWcgYXMgJyR7Y29uZmlnUGF0aH0nLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBvcy5ob3N0bmFtZSgpO1xuICAgICAgY29uc3QgY2VydFVybCA9IGBodHRwOi8vJHtob3N0fToke3RtcFBvcnR9LyR7Y29uZmlnTmFtZX1gO1xuICAgICAgYXdhaXQgdG1wU2VydmVyLmxpc3Rlbih0bXBQb3J0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyh0bXBQb3J0LCBob3N0KSkgPT09ICdvcGVuJztcbiAgICAgICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICB3YWl0TXM6IFRNUFNFUlZFUl9TVEFSVFVQX1RJTUVPVVQsXG4gICAgICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFRoZSB0ZW1wb3Jhcnkgd2ViIHNlcnZlciBpcyBydW5uaW5nIGF0IGh0dHA6Ly8ke2hvc3R9OiR7dG1wUG9ydH1gKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdGVtcG9yYXJ5IHdlYiBzZXJ2ZXIgY2Fubm90IGJlIHN0YXJ0ZWQgYXQgaHR0cDovLyR7aG9zdH06JHt0bXBQb3J0fS5gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzUmVhbERldmljZSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy91cmwnLCAnUE9TVCcsIHt1cmw6IGNlcnRVcmx9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjb21tYW5kIGFib3ZlIGRvZXMgbm90IGFsd2F5cyB3b3JrIG9uIHJlYWwgZGV2aWNlc1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRVcmwoY2VydFVybCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub3B0cy5kZXZpY2Uub3BlblVybChjZXJ0VXJsKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzQ2VydEFscmVhZHlJbnN0YWxsZWQgPSBmYWxzZTtcbiAgICAgIGlmICh1dGlsLmNvbXBhcmVWZXJzaW9ucyh0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uLCAnPj0nLCAnMTIuMicpKSB7XG4gICAgICAgIGlmIChhd2FpdCBpbnN0YWxsUG9zdDEyMkNlcnRpZmljYXRlKHRoaXMsIGNuKSkge1xuICAgICAgICAgIGF3YWl0IGNsaWNrRWxlbWVudCh0aGlzLCBTZXR0aW5ncy5Qcm9maWxlKTtcbiAgICAgICAgICBhd2FpdCB0cnVzdENlcnRpZmljYXRlSW5QcmVmZXJlbmNlcyh0aGlzLCBjbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXNDZXJ0QWxyZWFkeUluc3RhbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhd2FpdCBpbnN0YWxsUHJlMTIyQ2VydGlmaWNhdGUodGhpcykpIHtcbiAgICAgICAgICBhd2FpdCBjbGlja0VsZW1lbnQodGhpcywgQnV0dG9uLlJldHVybl90b19TZXR0aW5ncyk7XG4gICAgICAgICAgYXdhaXQgdHJ1c3RDZXJ0aWZpY2F0ZUluUHJlZmVyZW5jZXModGhpcywgY24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzQ2VydEFscmVhZHlJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNDZXJ0QWxyZWFkeUluc3RhbGxlZCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBJdCBsb29rcyBsaWtlIHRoZSAnJHtjbn0nIGNlcnRpZmljYXRlIGhhcyBiZWVuIGFscmVhZHkgYWRkZWQgdG8gdGhlIENBIHJvb3RgKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMub3B0cy5idW5kbGVJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVBcHAodGhpcy5vcHRzLmJ1bmRsZUlkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCByZXN0b3JlIHRoZSBhcHBsaWNhdGlvbiAnJHt0aGlzLm9wdHMuYnVuZGxlSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCB1dGlsLnRvSW5NZW1vcnlCYXNlNjQoY29uZmlnUGF0aCkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgdG1wU2VydmVyLmNsb3NlKCk7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG4vKipcbiAqIExpc3RzIGluc3RhbGxlZCBjZXJ0aWZpY2F0ZXMgZm9yIHJlYWwgZGV2aWNlcyBvbmx5XG4gKiBpZiBbcHktaW9zLWRldmljZV0oaHR0cHM6Ly9naXRodWIuY29tL1l1ZUNoZW4tQy9weS1pb3MtZGV2aWNlKSB0b29sXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIHNlcnZlciBtYWNoaW5lLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgbWFwIG9mIGNlcnRpZmljYXRlcyBpbnN0YWxsZWQgb24gdGhlIHJlYWwgZGV2aWNlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYXR0ZW1wdGluZyB0byBsaXN0IGNlcnRpZmljYXRlcyBmb3Igc2ltdWxhdGVkIGRldmljZSBvciBpZiBweS1pb3MtZGV2aWNlXG4gKiBpcyBub3QgaW5zdGFsbGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUxpc3RDZXJ0aWZpY2F0ZXMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVMaXN0Q2VydGlmaWNhdGVzICgpIHtcbiAgaWYgKCF0aGlzLmlzUmVhbERldmljZSgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCdUaGlzIGV4dGVuc2lvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiByZWFsIGRldmljZXMnKTtcbiAgfVxuICBjb25zdCBjbGllbnQgPSBuZXcgUHlpZGV2aWNlKHRoaXMub3B0cy51ZGlkKTtcbiAgaWYgKGF3YWl0IGNsaWVudC5hc3NlcnRFeGlzdHMoZmFsc2UpKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNsaWVudC5saXN0UHJvZmlsZXMoKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ3B5aWRldmljZSBpcyBub3QgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLCBjb21tYW5kIGNhbm5vdCBiZSBleGVjdXRlZC4nKTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIHBhcnNlQ29tbW9uTmFtZSB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0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
362
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3VwcG9ydCIsIl9hc3luY2JveCIsIl9ibHVlYmlyZCIsIl9vcyIsIl9wYXRoIiwiX2h0dHAiLCJfdGVlbl9wcm9jZXNzIiwiX3BvcnRzY2FubmVyIiwiX3B5SW9zRGV2aWNlQ2xpZW50IiwiX2RyaXZlciIsImV4dGVuc2lvbnMiLCJjb21tYW5kcyIsImV4cG9ydHMiLCJDT05GSUdfRVhURU5TSU9OIiwiSE9TVF9QT1JUX1JBTkdFIiwiVE1QU0VSVkVSX1NUQVJUVVBfVElNRU9VVCIsIlNldHRpbmdzIiwiR2VuZXJhbCIsInR5cGUiLCJ2YWx1ZSIsIlByb2ZpbGUiLCJBYm91dCIsIkNlcnRpZmljYXRlX1RydXN0X1NldHRpbmdzIiwiQnV0dG9uIiwiSW5zdGFsbCIsIkFsbG93IiwiRG9uZSIsIlJldHVybl90b19TZXR0aW5ncyIsIkFsZXJ0IiwiZXh0cmFjdENvbW1vbk5hbWUiLCJjZXJ0QnVmZmVyIiwidGVtcENlcnQiLCJ0ZW1wRGlyIiwib3BlbiIsInByZWZpeCIsInN1ZmZpeCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsInN0ZG91dCIsImV4ZWMiLCJwYXJzZUNvbW1vbk5hbWUiLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJyaW1yYWYiLCJMSUJSRV9TU0xfUEFUVEVSTiIsIk9QRU5fU1NMX1BBVFRFUk4iLCJzdHJpbmdDZXJ0aWZpY2F0ZSIsInJlc3VsdCIsInJlZHVjZSIsImFjYyIsInIiLCJtYXRjaCIsInRvTW9iaWxlQ29uZmlnIiwiY29tbW9uTmFtZSIsImdldFVVSUQiLCJ1dGlsIiwidXVpZFY0IiwidG9VcHBlckNhc2UiLCJjb250ZW50VXVpZCIsIlBheWxvYWRDb250ZW50IiwiUGF5bG9hZENlcnRpZmljYXRlRmlsZU5hbWUiLCJQYXlsb2FkRGVzY3JpcHRpb24iLCJQYXlsb2FkRGlzcGxheU5hbWUiLCJQYXlsb2FkSWRlbnRpZmllciIsIlBheWxvYWRUeXBlIiwiUGF5bG9hZFVVSUQiLCJQYXlsb2FkVmVyc2lvbiIsIm9zIiwiaG9zdG5hbWUiLCJzcGxpdCIsIlBheWxvYWRSZW1vdmFsRGlzYWxsb3dlZCIsImNsaWNrRWxlbWVudCIsImRyaXZlciIsImxvY2F0b3IiLCJvcHRpb25zIiwiZWxlbWVudCIsInRpbWVvdXQiLCJza2lwSWZJbnZpc2libGUiLCJsb29rdXBEZWxheSIsInJldHJ5SW50ZXJ2YWwiLCJmaW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMiLCJKU09OIiwic3RyaW5naWZ5IiwibmF0aXZlQ2xpY2siLCJpbnN0YWxsUHJlMTIyQ2VydGlmaWNhdGUiLCJCIiwiZGVsYXkiLCJ0cnVzdENlcnRpZmljYXRlSW5QcmVmZXJlbmNlcyIsIm5hbWUiLCJzd2l0Y2hMb2NhdG9yIiwicmV0cnkiLCJtb2JpbGVTd2lwZSIsImRpcmVjdGlvbiIsInBvc3RBY2NlcHRBbGVydCIsImluc3RhbGxQb3N0MTIyQ2VydGlmaWNhdGUiLCJhY3RpdmF0ZUFwcCIsImlzQ2VydEZvdW5kIiwic3dpcGVOdW0iLCJtb2JpbGVJbnN0YWxsQ2VydGlmaWNhdGUiLCJvcHRzIiwiY29udGVudCIsImlzUm9vdCIsIl8iLCJpc0VtcHR5IiwiaXNTaW11bGF0b3IiLCJtZXRob2ROYW1lIiwiZGV2aWNlIiwic2ltY3RsIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwicmF3IiwiZSIsImxvZyIsImRlYnVnIiwiaW5mbyIsImNsaWVudCIsIlB5aWRldmljZSIsInVkaWQiLCJhc3NlcnRFeGlzdHMiLCJpbnN0YWxsUHJvZmlsZSIsInBheWxvYWQiLCJ0bXBSb290Iiwib3BlbkRpciIsInRtcFBvcnQiLCJmaW5kQVBvcnROb3RJblVzZSIsImNvbmZpZ05hbWUiLCJjb25maWdQYXRoIiwicmVzb2x2ZSIsInRtcFNlcnZlciIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjb25maWdGaWxlIiwicmVhZEZpbGUiLCJlbmQiLCJjbiIsIm1vYmlsZUNvbmZpZyIsInBsaXN0IiwidXBkYXRlUGxpc3RGaWxlIiwiaG9zdCIsImNlcnRVcmwiLCJsaXN0ZW4iLCJ3YWl0Rm9yQ29uZGl0aW9uIiwiY2hlY2tQb3J0U3RhdHVzIiwiaWduIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImlzUmVhbERldmljZSIsInByb3h5Q29tbWFuZCIsInVybCIsImlzV2ViQ29udGV4dCIsInNldFVybCIsIm9wZW5VcmwiLCJpc0NlcnRBbHJlYWR5SW5zdGFsbGVkIiwiY29tcGFyZVZlcnNpb25zIiwicGxhdGZvcm1WZXJzaW9uIiwiYnVuZGxlSWQiLCJ3YXJuIiwidG9Jbk1lbW9yeUJhc2U2NCIsImNsb3NlIiwibW9iaWxlUmVtb3ZlQ2VydGlmaWNhdGUiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwicmVtb3ZlUHJvZmlsZSIsIm1vYmlsZUxpc3RDZXJ0aWZpY2F0ZXMiLCJsaXN0UHJvZmlsZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvY2VydGlmaWNhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCBwbGlzdCwgdGVtcERpciwgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwsIHJldHJ5LCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGZpbmRBUG9ydE5vdEluVXNlLCBjaGVja1BvcnRTdGF0dXMgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgUHlpZGV2aWNlIGZyb20gJy4uL3B5LWlvcy1kZXZpY2UtY2xpZW50JztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5sZXQgZXh0ZW5zaW9ucyA9IHt9LCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBDT05GSUdfRVhURU5TSU9OID0gJ21vYmlsZWNvbmZpZyc7XG5jb25zdCBIT1NUX1BPUlRfUkFOR0UgPSBbMzgyMDAsIDM4Mjk5XTtcbmNvbnN0IFRNUFNFUlZFUl9TVEFSVFVQX1RJTUVPVVQgPSA1MDAwO1xuY29uc3QgU2V0dGluZ3MgPSB7XG4gIEdlbmVyYWw6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdHZW5lcmFsJyxcbiAgfSxcbiAgUHJvZmlsZToge1xuICAgIHR5cGU6ICctaW9zIHByZWRpY2F0ZSBzdHJpbmcnLFxuICAgIHZhbHVlOiBgbmFtZSBCRUdJTlNXSVRIICdQcm9maWxlJ2AsXG4gIH0sXG4gIEFib3V0OiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnQWJvdXQnLFxuICB9LFxuICBDZXJ0aWZpY2F0ZV9UcnVzdF9TZXR0aW5nczoge1xuICAgIHR5cGU6ICdhY2Nlc3NpYmlsaXR5IGlkJyxcbiAgICB2YWx1ZTogJ0NlcnRpZmljYXRlIFRydXN0IFNldHRpbmdzJyxcbiAgfSxcbn07XG5jb25zdCBCdXR0b24gPSB7XG4gIEluc3RhbGw6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdJbnN0YWxsJyxcbiAgfSxcbiAgQWxsb3c6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdBbGxvdycsXG4gIH0sXG4gIERvbmU6IHtcbiAgICB0eXBlOiAnYWNjZXNzaWJpbGl0eSBpZCcsXG4gICAgdmFsdWU6ICdEb25lJyxcbiAgfSxcbiAgUmV0dXJuX3RvX1NldHRpbmdzOiB7XG4gICAgdHlwZTogJ2FjY2Vzc2liaWxpdHkgaWQnLFxuICAgIHZhbHVlOiAnUmV0dXJuIHRvIFNldHRpbmdzJyxcbiAgfSxcbn07XG5jb25zdCBBbGVydCA9IHtcbiAgSW5zdGFsbDoge1xuICAgIHR5cGU6ICctaW9zIGNsYXNzIGNoYWluJyxcbiAgICB2YWx1ZTogJyoqL1hDVUlFbGVtZW50VHlwZUFueVtgdHlwZSA9PSBcXCdYQ1VJRWxlbWVudFR5cGVBbGVydFxcJyBPUiB0eXBlID09IFxcJ1hDVUlFbGVtZW50VHlwZVNoZWV0XFwnYF0vKiovWENVSUVsZW1lbnRUeXBlQnV0dG9uW2BsYWJlbCA9PSBcXCdJbnN0YWxsXFwnYF0nLFxuICB9LFxufTtcblxuXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0Q29tbW9uTmFtZSAoY2VydEJ1ZmZlcikge1xuICBjb25zdCB0ZW1wQ2VydCA9IGF3YWl0IHRlbXBEaXIub3Blbih7XG4gICAgcHJlZml4OiAnY2VydCcsXG4gICAgc3VmZml4OiAnLmNlcidcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBDZXJ0LnBhdGgsIGNlcnRCdWZmZXIpO1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYygnb3BlbnNzbCcsIFsneDUwOScsICctbm9vdXQnLCAnLXN1YmplY3QnLCAnLWluJywgdGVtcENlcnQucGF0aF0pO1xuICAgIHJldHVybiBwYXJzZUNvbW1vbk5hbWUoc3Rkb3V0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgY29tbW9uIG5hbWUgdmFsdWUgZnJvbSB0aGUgY2VydGlmaWNhdGUuIElzIGl0IHZhbGlkIGFuZCBiYXNlNjQtZW5jb2RlZD8gYCArXG4gICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodGVtcENlcnQucGF0aCk7XG4gIH1cbn1cblxuY29uc3QgTElCUkVfU1NMX1BBVFRFUk4gPSAvXFwvQ049KFteXFwvXSspLzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuY29uc3QgT1BFTl9TU0xfUEFUVEVSTiA9IC8sXFxzQ05cXHM9XFxzKFteLF0rKS87XG5cbmZ1bmN0aW9uIHBhcnNlQ29tbW9uTmFtZSAoc3RyaW5nQ2VydGlmaWNhdGUpIHtcbiAgY29uc3QgcmVzdWx0ID0gW0xJQlJFX1NTTF9QQVRURVJOLCBPUEVOX1NTTF9QQVRURVJOXS5yZWR1Y2UoKGFjYywgcikgPT4ge1xuICAgIGlmIChhY2MpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoID0gci5leGVjKHN0cmluZ0NlcnRpZmljYXRlKTtcbiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG4gIH0sIG51bGwpO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgbm8gY29tbW9uIG5hbWUgdmFsdWUgaW4gJyR7c3RyaW5nQ2VydGlmaWNhdGV9JyBvdXRwdXRgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBBcHBsZSdzIG92ZXItdGhlLWFpciBjb25maWd1cmF0aW9uIHByb2ZpbGVcbiAqIGZvciBjZXJ0aWZpY2F0ZSBkZXBsb3ltZW50IGJhc2VkIG9uIHRoZSBnaXZlbiBQRU0gY2VydGlmaWNhdGUgY29udGVudC5cbiAqIFJlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvY29udGVudC9kb2N1bWVudGF0aW9uL05ldHdvcmtpbmdJbnRlcm5ldC9Db25jZXB0dWFsL2lQaG9uZU9UQUNvbmZpZ3VyYXRpb24vSW50cm9kdWN0aW9uL0ludHJvZHVjdGlvbi5odG1sXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHN1Y2ggcHJvZmlsZXMuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGNlcnRCdWZmZXIgLSBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgUEVNIGNlcnRpZmljYXRlIGVuY29kZWQgaW50byBOb2RlSlMgYnVmZmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbW9uTmFtZSAtIENlcnRpZmljYXRlJ3MgY29tbW9uIG5hbWVcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBlbmNvZGVkIHN0cnVjdHVyZSBvZiB0aGUgZ2l2ZW4gY2VydGlmaWNhdGUsIHdoaWNoIGlzIHJlYWR5IHRvIGJlIHBhc3NlZFxuICogYXMgYW4gYXJndW1lbnQgdG8gcGxpc3QgYnVpbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmUgcGFyc2VkXG4gKi9cbmZ1bmN0aW9uIHRvTW9iaWxlQ29uZmlnIChjZXJ0QnVmZmVyLCBjb21tb25OYW1lKSB7XG4gIGNvbnN0IGdldFVVSUQgPSAoKSA9PiB1dGlsLnV1aWRWNCgpLnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IGNvbnRlbnRVdWlkID0gZ2V0VVVJRCgpO1xuICByZXR1cm4ge1xuICAgIFBheWxvYWRDb250ZW50OiBbe1xuICAgICAgUGF5bG9hZENlcnRpZmljYXRlRmlsZU5hbWU6IGAke2NvbW1vbk5hbWV9LmNlcmAsXG4gICAgICBQYXlsb2FkQ29udGVudDogY2VydEJ1ZmZlcixcbiAgICAgIFBheWxvYWREZXNjcmlwdGlvbjogJ0FkZHMgYSBDQSByb290IGNlcnRpZmljYXRlJyxcbiAgICAgIFBheWxvYWREaXNwbGF5TmFtZTogY29tbW9uTmFtZSxcbiAgICAgIFBheWxvYWRJZGVudGlmaWVyOiBgY29tLmFwcGxlLnNlY3VyaXR5LnJvb3QuJHtjb250ZW50VXVpZH1gLFxuICAgICAgUGF5bG9hZFR5cGU6ICdjb20uYXBwbGUuc2VjdXJpdHkucm9vdCcsXG4gICAgICBQYXlsb2FkVVVJRDogY29udGVudFV1aWQsXG4gICAgICBQYXlsb2FkVmVyc2lvbjogMVxuICAgIH1dLFxuICAgIFBheWxvYWREaXNwbGF5TmFtZTogY29tbW9uTmFtZSxcbiAgICBQYXlsb2FkSWRlbnRpZmllcjogYCR7b3MuaG9zdG5hbWUoKS5zcGxpdCgnLicpWzBdfS4ke2dldFVVSUQoKX1gLFxuICAgIFBheWxvYWRSZW1vdmFsRGlzYWxsb3dlZDogZmFsc2UsXG4gICAgUGF5bG9hZFR5cGU6ICdDb25maWd1cmF0aW9uJyxcbiAgICBQYXlsb2FkVVVJRDogZ2V0VVVJRCgpLFxuICAgIFBheWxvYWRWZXJzaW9uOiAxXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsaWNrRWxlbWVudCAoZHJpdmVyLCBsb2NhdG9yLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGVsZW1lbnQgPSBudWxsO1xuICBjb25zdCB7XG4gICAgdGltZW91dCA9IDUwMDAsXG4gICAgc2tpcElmSW52aXNpYmxlID0gZmFsc2VcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxvb2t1cERlbGF5ID0gNTAwO1xuICB0cnkge1xuICAgIGVsZW1lbnQgPSBhd2FpdCByZXRyeUludGVydmFsKHRpbWVvdXQgPCBsb29rdXBEZWxheSA/IDEgOiB0aW1lb3V0IC8gbG9va3VwRGVsYXksIGxvb2t1cERlbGF5LFxuICAgICAgKCkgPT4gZHJpdmVyLmZpbmROYXRpdmVFbGVtZW50T3JFbGVtZW50cyhsb2NhdG9yLnR5cGUsIGxvY2F0b3IudmFsdWUsIGZhbHNlKVxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChza2lwSWZJbnZpc2libGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCAke0pTT04uc3RyaW5naWZ5KGxvY2F0b3IpfSB3aXRoaW4gJHt0aW1lb3V0fW1zIHRpbWVvdXRgKTtcbiAgfVxuICBhd2FpdCBkcml2ZXIubmF0aXZlQ2xpY2soZWxlbWVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsUHJlMTIyQ2VydGlmaWNhdGUgKGRyaXZlcikge1xuICAvLyBBY2NlcHQgU2FmYXJpIGFsZXJ0XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5BbGxvdywge1xuICAgIC8vIGNlcnRpZmljYXRlIGxvYWQgbWlnaHQgdGFrZSBzb21lIHRpbWUgb24gc2xvdyBtYWNoaW5lc1xuICAgIHRpbWVvdXQ6IDE1MDAwLFxuICB9KTtcbiAgLy8gV2FpdCB1bnRpbCBQcmVmZXJlbmNlcyBhcmUgb3BlbmVkXG4gIGF3YWl0IEIuZGVsYXkoMjAwMCk7XG5cbiAgLy8gR28gdGhyb3VnaCBQcmVmZXJlbmNlcyB3aXphcmRcbiAgaWYgKCFhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uSW5zdGFsbCwge1xuICAgIHNraXBJZkludmlzaWJsZTogdHJ1ZSxcbiAgfSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gV2UgbmVlZCB0byBjbGljayBJbnN0YWxsIGJ1dHRvbiBvbiB0d28gZGlmZmVyZW50IHRhYnNcbiAgLy8gVGhlIHNlY29uZCBvbmUgY29uZmlybXMgdGhlIHByZXZpb3VzXG4gIGF3YWl0IEIuZGVsYXkoMTUwMCk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5JbnN0YWxsKTtcbiAgLy8gQWNjZXB0IGFsZXJ0XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEFsZXJ0Lkluc3RhbGwpO1xuICAvLyBGaW5pc2ggYWRkaW5nIGNlcnRpZmljYXRlXG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIEJ1dHRvbi5Eb25lKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRydXN0Q2VydGlmaWNhdGVJblByZWZlcmVuY2VzIChkcml2ZXIsIG5hbWUpIHtcbiAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgU2V0dGluZ3MuR2VuZXJhbCk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIFNldHRpbmdzLkFib3V0KTtcbiAgY29uc3Qgc3dpdGNoTG9jYXRvciA9IHtcbiAgICB0eXBlOiAnLWlvcyBjbGFzcyBjaGFpbicsXG4gICAgdmFsdWU6IGAqKi9YQ1VJRWxlbWVudFR5cGVDZWxsW1xcYGxhYmVsID09ICcke25hbWV9J1xcYF0vKiovWENVSUVsZW1lbnRUeXBlU3dpdGNoYCxcbiAgfTtcbiAgYXdhaXQgcmV0cnkoNSwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRyaXZlci5tb2JpbGVTd2lwZSh7XG4gICAgICBlbGVtZW50OiBhd2FpdCBkcml2ZXIuZmluZE5hdGl2ZUVsZW1lbnRPckVsZW1lbnRzKCdjbGFzcyBuYW1lJywgJ1hDVUlFbGVtZW50VHlwZVRhYmxlJywgZmFsc2UpLFxuICAgICAgZGlyZWN0aW9uOiAndXAnXG4gICAgfSk7XG4gICAgYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgU2V0dGluZ3MuQ2VydGlmaWNhdGVfVHJ1c3RfU2V0dGluZ3MsIHtcbiAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICB9KTtcblxuICAgIGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoc3dpdGNoTG9jYXRvci50eXBlLCBzd2l0Y2hMb2NhdG9yLnZhbHVlLCBmYWxzZSk7XG4gIH0pO1xuICAvLyBPbmx5IGNsaWNrIHRoZSBzd2l0Y2ggaWYgaXQgaXMgc2V0IHRvIE9mZlxuICBpZiAoYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwge1xuICAgIHR5cGU6IHN3aXRjaExvY2F0b3IudHlwZSxcbiAgICB2YWx1ZTogYCR7c3dpdGNoTG9jYXRvci52YWx1ZX1bXFxgdmFsdWUgPT0gJzAnXFxgXWBcbiAgfSwge1xuICAgIHRpbWVvdXQ6IDEwMDAsXG4gICAgc2tpcElmSW52aXNpYmxlOiB0cnVlLFxuICB9KSkge1xuICAgIGF3YWl0IGRyaXZlci5wb3N0QWNjZXB0QWxlcnQoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsUG9zdDEyMkNlcnRpZmljYXRlIChkcml2ZXIsIG5hbWUpIHtcbiAgLy8gQWNjZXB0IFNhZmFyaSBhbGVydFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uQWxsb3csIHtcbiAgICAvLyBjZXJ0aWZpY2F0ZSBsb2FkIG1pZ2h0IHRha2Ugc29tZSB0aW1lIG9uIHNsb3cgbWFjaGluZXNcbiAgICB0aW1lb3V0OiAxNTAwMCxcbiAgfSk7XG4gIC8vIFdhaXQgZm9yIHRoZSBzZWNvbmQgYWxlcnRcbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcblxuICBhd2FpdCBkcml2ZXIucG9zdEFjY2VwdEFsZXJ0KCk7XG4gIGF3YWl0IGRyaXZlci5hY3RpdmF0ZUFwcCgnY29tLmFwcGxlLlByZWZlcmVuY2VzJyk7XG4gIGF3YWl0IGNsaWNrRWxlbWVudChkcml2ZXIsIFNldHRpbmdzLkdlbmVyYWwpO1xuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBTZXR0aW5ncy5Qcm9maWxlKTtcbiAgLy8gU2VsZWN0IHRoZSB0YXJnZXQgY2VydFxuICBsZXQgaXNDZXJ0Rm91bmQgPSBmYWxzZTtcbiAgZm9yIChsZXQgc3dpcGVOdW0gPSAwOyBzd2lwZU51bSA8IDU7ICsrc3dpcGVOdW0pIHtcbiAgICBpZiAoYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwge1xuICAgICAgdHlwZTogJy1pb3MgY2xhc3MgY2hhaW4nLFxuICAgICAgdmFsdWU6IGAqKi9YQ1VJRWxlbWVudFR5cGVDZWxsW1xcYGxhYmVsID09ICcke25hbWV9J1xcYF1gLFxuICAgIH0sIHtcbiAgICAgIHRpbWVvdXQ6IDUwMCxcbiAgICAgIHNraXBJZkludmlzaWJsZTogdHJ1ZSxcbiAgICB9KSkge1xuICAgICAgaXNDZXJ0Rm91bmQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgZHJpdmVyLm1vYmlsZVN3aXBlKHtcbiAgICAgIGVsZW1lbnQ6IGF3YWl0IGRyaXZlci5maW5kTmF0aXZlRWxlbWVudE9yRWxlbWVudHMoJ2NsYXNzIG5hbWUnLCAnWENVSUVsZW1lbnRUeXBlVGFibGUnLCBmYWxzZSksXG4gICAgICBkaXJlY3Rpb246ICd1cCdcbiAgICB9KTtcbiAgfVxuICBpZiAoIWlzQ2VydEZvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuYW1lfScgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjZXJ0aWZpY2F0ZXMgbGlzdGApO1xuICB9XG5cbiAgLy8gSW5zdGFsbCBvcHRpb24gaXMgb25seSB2aXNpYmxlIGlmIHRoZSBjZXJ0IGlzIG5vdCBpbnN0YWxsZWQgeWV0XG4gIGlmICghYXdhaXQgY2xpY2tFbGVtZW50KGRyaXZlciwgQnV0dG9uLkluc3RhbGwsIHtcbiAgICBza2lwSWZJbnZpc2libGU6IHRydWUsXG4gIH0pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGF3YWl0IEIuZGVsYXkoMTUwMCk7XG4gIC8vIENvbmZpcm0gdW50cnVzdGVkIGNlcnQgaW5zdGFsbFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uSW5zdGFsbCk7XG4gIC8vIEFjY2VwdCBhbGVydFxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBBbGVydC5JbnN0YWxsKTtcbiAgLy8gRmluaXNoIGFkZGluZyBjZXJ0aWZpY2F0ZVxuICBhd2FpdCBjbGlja0VsZW1lbnQoZHJpdmVyLCBCdXR0b24uRG9uZSk7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2VydGlmaWNhdGVJbnN0YWxsYXRpb25PcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHshc3RyaW5nfSBjb250ZW50IC0gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcHVibGljIGNlcnRpZmljYXRlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGNvbW1vbk5hbWUgLSBDb21tb24gbmFtZSBvZiB0aGUgY2VydGlmaWNhdGUuIElmIHRoaXMgaXMgbm90IHNldFxuICogdGhlbiB0aGUgc2NyaXB0IHdpbGwgdHJ5IHRvIHBhcnNlIGl0IGZyb20gdGhlIGdpdmVuIGNlcnRpZmljYXRlIGNvbnRlbnQuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBpc1Jvb3QgW3RydWVdIC0gVGhpcyBvcHRpb24gZGVmaW5lcyB3aGVyZSB0aGUgY2VydGlmaWNhdGUgc2hvdWxkIGJlXG4gKiBpbnN0YWxsZWQgdG86IGVpdGhlciBUcnVzdGVkIFJvb3QgU3RvcmUgKGB0cnVlYCwgdGhlIGRlZmF1bHQgb3B0aW9uKSBvclxuICogdGhlIEtleWNoYWluIChgZmFsc2VgKS4gT24gZW52aXJvbm1lbnRzIG90aGVyIHRoYW4gWGNvZGUgMTEuNCsgU2ltdWxhdG9yIHRoaXNcbiAqIG9wdGlvbiBpcyBpZ25vcmVkLlxuICovXG5cbi8qKlxuICogSW5zdGFsbHMgYSBjdXN0b20gY2VydGlmaWNhdGUgb250byB0aGUgZGV2aWNlLlxuICogU2luY2UgWGNvZGUgU0RLIDExLjQgQXBwbGUgaGFzIGFkZGVkIGEgZGVkaWNhdGVkIHNpbWN0bCBzdWJjb21tYW5kIHRvIHF1aWNrbHkgaGFuZGxlXG4gKiBjZXJ0aWZpY2F0ZXMgb24gU2ltdWxhdG9yIG92ZXIgQ0xJLlxuICogT24gcmVhbCBkZXZpY2VzIG9yIHNpbXVsYXRvcnMgYmVmb3JlIFhjb2RlIDExLjQgU0RLXG4gKiBBcHBsZSBwcm92aWRlcyBubyBvZmZpY2lhbCB3YXkgdG8gZG8gaXQgdmlhIHRoZSBjb21tYW5kIGxpbmUuXG4gKiBJbiBzdWNoIGNhc2UgKGFuZCBhbHNvIGFzIGEgZmFsbGJhY2sgaWYgQ0xJIHNldHVwIGZhaWxzKVxuICogdGhpcyBtZXRob2QgdHJpZXMgdG8gd3JhcCB0aGUgY2VydGlmaWNhdGUgaW50byAubW9iaWxlY29uZmlnIGZvcm1hdFxuICogYW5kIHRoZW4gZGVwbG95cyB0aGUgd3JhcHBlZCBmaWxlIHRvIHRoZSBpbnRlcm5hbCBIVFRQIHNlcnZlcixcbiAqIHNvIG9uZSBjYW4gb3BlbiBpdCB2aWEgbW9iaWxlIFNhZmFyaS5cbiAqIFRoZW4gdGhlIGFsZ29yaXRobSBnb2VzIHRocm91Z2ggdGhlIHByb2ZpbGUgaW5zdGFsbGF0aW9uIHByb2NlZHVyZSBieVxuICogY2xpY2tpbmcgdGhlIG5lY2Vzc2FyeSBidXR0b25zIHVzaW5nIFdlYkRyaXZlckFnZW50LlxuICpcbiAqIEBwYXJhbSB7Q2VydGlmaWNhdGVJbnN0YWxsYXRpb25PcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGNvbnRlbnQgb2YgdGhlIGdlbmVyYXRlZCAubW9iaWxlY29uZmlnIGZpbGUgYXNcbiAqIGJhc2U2NC1lbmNvZGVkIHN0cmluZy4gVGhpcyBjb25maWcgbWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKiBJZiB0aGUgY2VydGlmaWNhdGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCB2aWEgQ0xJIHRoZW4gbm90aGluZyBpcyByZXR1cm5lZC5cbiAqL1xuY29tbWFuZHMubW9iaWxlSW5zdGFsbENlcnRpZmljYXRlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSW5zdGFsbENlcnRpZmljYXRlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGNvbnRlbnQsXG4gICAgY29tbW9uTmFtZSxcbiAgICBpc1Jvb3QgPSB0cnVlLFxuICB9ID0gb3B0cztcbiAgaWYgKF8uaXNFbXB0eShjb250ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2VydGlmaWNhdGUgY29udGVudCBzaG91bGQgbm90IGJlIGVtcHR5Jyk7XG4gIH1cblxuICBpZiAodGhpcy5pc1NpbXVsYXRvcigpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBpc1Jvb3QgPyAnYWRkUm9vdENlcnRpZmljYXRlJyA6ICdhZGRDZXJ0aWZpY2F0ZSc7XG4gICAgICBhd2FpdCB0aGlzLm9wdHMuZGV2aWNlLnNpbWN0bFttZXRob2ROYW1lXShcbiAgICAgICAgQnVmZmVyLmZyb20oY29udGVudCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCksIHtyYXc6IHRydWV9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgdGhpcy5sb2cuaW5mbyhgVGhlIGNlcnRpZmljYXRlIGNhbm5vdCBiZSBpbnN0YWxsZWQgdmlhIENMSS4gYCArXG4gICAgICAgIGBGYWxsaW5nIGJhY2sgdG8gVUktYmFzZWQgZGVwbG95bWVudGApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgUHlpZGV2aWNlKHRoaXMub3B0cy51ZGlkKTtcbiAgICBpZiAoYXdhaXQgY2xpZW50LmFzc2VydEV4aXN0cyhmYWxzZSkpIHtcbiAgICAgIGF3YWl0IGNsaWVudC5pbnN0YWxsUHJvZmlsZSh7cGF5bG9hZDogQnVmZmVyLmZyb20oY29udGVudCwgJ2Jhc2U2NCcpfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ3B5aWRldmljZSBpcyBub3QgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLiAnICtcbiAgICAgICAgJ0ZhbGxpbmcgYmFjayB0byB0aGUgKHNsb3cpIFVJLWJhc2VkIGluc3RhbGxhdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgY29uc3QgdG1wUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKEhPU1RfUE9SVF9SQU5HRVswXSwgSE9TVF9QT1JUX1JBTkdFWzFdKTtcbiAgY29uc3QgY29uZmlnTmFtZSA9IGBhcHBpdW0uJHtDT05GSUdfRVhURU5TSU9OfWA7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUodG1wUm9vdCwgY29uZmlnTmFtZSk7XG4gIGNvbnN0IHRtcFNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGFzeW5jIGZ1bmN0aW9uIChfLCByZXMpIHtcbiAgICBjb25zdCBjb25maWdGaWxlID0gYXdhaXQgZnMucmVhZEZpbGUoY29uZmlnUGF0aCk7XG4gICAgcmVzLmVuZChjb25maWdGaWxlKTtcbiAgfSk7XG4gIHRyeSB7XG4gICAgY29uc3QgY2VydEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQsICdiYXNlNjQnKTtcbiAgICBjb25zdCBjbiA9IGNvbW1vbk5hbWUgfHwgYXdhaXQgZXh0cmFjdENvbW1vbk5hbWUoY2VydEJ1ZmZlcik7XG4gICAgY29uc3QgbW9iaWxlQ29uZmlnID0gdG9Nb2JpbGVDb25maWcoY2VydEJ1ZmZlciwgY24pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwbGlzdC51cGRhdGVQbGlzdEZpbGUoY29uZmlnUGF0aCwgbW9iaWxlQ29uZmlnLCBmYWxzZSwgZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RvcmUgdGhlIGdlbmVyYXRlZCBjb25maWcgYXMgJyR7Y29uZmlnUGF0aH0nLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBvcy5ob3N0bmFtZSgpO1xuICAgICAgY29uc3QgY2VydFVybCA9IGBodHRwOi8vJHtob3N0fToke3RtcFBvcnR9LyR7Y29uZmlnTmFtZX1gO1xuICAgICAgYXdhaXQgdG1wU2VydmVyLmxpc3Rlbih0bXBQb3J0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyh0bXBQb3J0LCBob3N0KSkgPT09ICdvcGVuJztcbiAgICAgICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICB3YWl0TXM6IFRNUFNFUlZFUl9TVEFSVFVQX1RJTUVPVVQsXG4gICAgICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFRoZSB0ZW1wb3Jhcnkgd2ViIHNlcnZlciBpcyBydW5uaW5nIGF0IGh0dHA6Ly8ke2hvc3R9OiR7dG1wUG9ydH1gKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdGVtcG9yYXJ5IHdlYiBzZXJ2ZXIgY2Fubm90IGJlIHN0YXJ0ZWQgYXQgaHR0cDovLyR7aG9zdH06JHt0bXBQb3J0fS5gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzUmVhbERldmljZSgpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm94eUNvbW1hbmQoJy91cmwnLCAnUE9TVCcsIHt1cmw6IGNlcnRVcmx9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjb21tYW5kIGFib3ZlIGRvZXMgbm90IGFsd2F5cyB3b3JrIG9uIHJlYWwgZGV2aWNlc1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRVcmwoY2VydFVybCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub3B0cy5kZXZpY2Uub3BlblVybChjZXJ0VXJsKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzQ2VydEFscmVhZHlJbnN0YWxsZWQgPSBmYWxzZTtcbiAgICAgIGlmICh1dGlsLmNvbXBhcmVWZXJzaW9ucyh0aGlzLm9wdHMucGxhdGZvcm1WZXJzaW9uLCAnPj0nLCAnMTIuMicpKSB7XG4gICAgICAgIGlmIChhd2FpdCBpbnN0YWxsUG9zdDEyMkNlcnRpZmljYXRlKHRoaXMsIGNuKSkge1xuICAgICAgICAgIGF3YWl0IGNsaWNrRWxlbWVudCh0aGlzLCBTZXR0aW5ncy5Qcm9maWxlKTtcbiAgICAgICAgICBhd2FpdCB0cnVzdENlcnRpZmljYXRlSW5QcmVmZXJlbmNlcyh0aGlzLCBjbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXNDZXJ0QWxyZWFkeUluc3RhbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhd2FpdCBpbnN0YWxsUHJlMTIyQ2VydGlmaWNhdGUodGhpcykpIHtcbiAgICAgICAgICBhd2FpdCBjbGlja0VsZW1lbnQodGhpcywgQnV0dG9uLlJldHVybl90b19TZXR0aW5ncyk7XG4gICAgICAgICAgYXdhaXQgdHJ1c3RDZXJ0aWZpY2F0ZUluUHJlZmVyZW5jZXModGhpcywgY24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzQ2VydEFscmVhZHlJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNDZXJ0QWxyZWFkeUluc3RhbGxlZCkge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBJdCBsb29rcyBsaWtlIHRoZSAnJHtjbn0nIGNlcnRpZmljYXRlIGhhcyBiZWVuIGFscmVhZHkgYWRkZWQgdG8gdGhlIENBIHJvb3RgKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMub3B0cy5idW5kbGVJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVBcHAodGhpcy5vcHRzLmJ1bmRsZUlkKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCByZXN0b3JlIHRoZSBhcHBsaWNhdGlvbiAnJHt0aGlzLm9wdHMuYnVuZGxlSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChhd2FpdCB1dGlsLnRvSW5NZW1vcnlCYXNlNjQoY29uZmlnUGF0aCkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgdG1wU2VydmVyLmNsb3NlKCk7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgaW5zdGFsbGVkIGNlcnRpZmljYXRlcyBmb3IgcmVhbCBkZXZpY2VzIG9ubHlcbiAqIGlmIFtweS1pb3MtZGV2aWNlXShodHRwczovL2dpdGh1Yi5jb20vWXVlQ2hlbi1DL3B5LWlvcy1kZXZpY2UpIHRvb2xcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyIG1hY2hpbmUuXG4gKlxuICogQHByb3BlcnR5IHshc3RyaW5nfSBuYW1lIC0gTmFtZSBvZiBjZXJ0aWZpY2F0ZSB0byByZW1vdmVcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgc3RhdHVzIGFja25vd2xlZGdtZW50IGlmIHN1Y2Nlc3NmdWxseSByZW1vdmVkIGNlcnRpZmljYXRlIG9yICdOb25lJ1xuICogQHRocm93cyB7RXJyb3J9IElmIGF0dGVtcHRpbmcgdG8gcmVtb3RlIGNlcnRpZmljYXRlcyBmb3Igc2ltdWxhdGVkIGRldmljZSBvciBpZiBweS1pb3MtZGV2aWNlXG4gKiBpcyBub3QgaW5zdGFsbGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVJlbW92ZUNlcnRpZmljYXRlID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUmVtb3ZlQ2VydGlmaWNhdGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgbmFtZVxuICB9ID0gb3B0cztcbiAgaWYgKCF0aGlzLmlzUmVhbERldmljZSgpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCdUaGlzIGV4dGVuc2lvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiByZWFsIGRldmljZXMnKTtcbiAgfVxuICBjb25zdCBjbGllbnQgPSBuZXcgUHlpZGV2aWNlKHRoaXMub3B0cy51ZGlkKTtcbiAgYXdhaXQgY2xpZW50LmFzc2VydEV4aXN0cyh0cnVlKTtcbiAgcmV0dXJuIGF3YWl0IGNsaWVudC5yZW1vdmVQcm9maWxlKG5hbWUpO1xufTtcblxuLyoqXG4gKiBMaXN0cyBpbnN0YWxsZWQgY2VydGlmaWNhdGVzIGZvciByZWFsIGRldmljZXMgb25seVxuICogaWYgW3B5LWlvcy1kZXZpY2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9ZdWVDaGVuLUMvcHktaW9zLWRldmljZSkgdG9vbFxuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIgbWFjaGluZS5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIG1hcCBvZiBjZXJ0aWZpY2F0ZXMgaW5zdGFsbGVkIG9uIHRoZSByZWFsIGRldmljZVxuICogQHRocm93cyB7RXJyb3J9IElmIGF0dGVtcHRpbmcgdG8gbGlzdCBjZXJ0aWZpY2F0ZXMgZm9yIHNpbXVsYXRlZCBkZXZpY2Ugb3IgaWYgcHktaW9zLWRldmljZVxuICogaXMgbm90IGluc3RhbGxlZFxuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0Q2VydGlmaWNhdGVzID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdENlcnRpZmljYXRlcyAoKSB7XG4gIGlmICghdGhpcy5pc1JlYWxEZXZpY2UoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcignVGhpcyBleHRlbnNpb24gaXMgb25seSBzdXBwb3J0ZWQgb24gcmVhbCBkZXZpY2VzJyk7XG4gIH1cbiAgY29uc3QgY2xpZW50ID0gbmV3IFB5aWRldmljZSh0aGlzLm9wdHMudWRpZCk7XG4gIGF3YWl0IGNsaWVudC5hc3NlcnRFeGlzdHModHJ1ZSk7XG4gIHJldHVybiBhd2FpdCBjbGllbnQubGlzdFByb2ZpbGVzKCk7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBwYXJzZUNvbW1vbk5hbWUgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFNBQUEs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
@@ -1 +1 @@
1
- {"version":3,"file":"certificate.js","names":["_lodash","_interopRequireDefault","require","_support","_asyncbox","_bluebird","_os","_path","_http","_teen_process","_portscanner","_pyIosDeviceClient","_driver","extensions","commands","exports","CONFIG_EXTENSION","HOST_PORT_RANGE","TMPSERVER_STARTUP_TIMEOUT","Settings","General","type","value","Profile","About","Certificate_Trust_Settings","Button","Install","Allow","Done","Return_to_Settings","Alert","extractCommonName","certBuffer","tempCert","tempDir","open","prefix","suffix","fs","writeFile","path","stdout","exec","parseCommonName","err","Error","message","rimraf","LIBRE_SSL_PATTERN","OPEN_SSL_PATTERN","stringCertificate","result","reduce","acc","r","match","toMobileConfig","commonName","getUUID","util","uuidV4","toUpperCase","contentUuid","PayloadContent","PayloadCertificateFileName","PayloadDescription","PayloadDisplayName","PayloadIdentifier","PayloadType","PayloadUUID","PayloadVersion","os","hostname","split","PayloadRemovalDisallowed","clickElement","driver","locator","options","element","timeout","skipIfInvisible","lookupDelay","retryInterval","findNativeElementOrElements","JSON","stringify","nativeClick","installPre122Certificate","B","delay","trustCertificateInPreferences","name","switchLocator","retry","mobileSwipe","direction","postAcceptAlert","installPost122Certificate","activateApp","isCertFound","swipeNum","mobileInstallCertificate","opts","content","isRoot","_","isEmpty","isSimulator","methodName","device","simctl","Buffer","from","toString","raw","e","log","debug","info","client","Pyidevice","udid","assertExists","installProfile","payload","tmpRoot","openDir","tmpPort","findAPortNotInUse","configName","configPath","resolve","tmpServer","http","createServer","res","configFile","readFile","end","cn","mobileConfig","plist","updatePlistFile","host","certUrl","listen","waitForCondition","checkPortStatus","ign","waitMs","intervalMs","isRealDevice","proxyCommand","url","isWebContext","setUrl","openUrl","isCertAlreadyInstalled","compareVersions","platformVersion","bundleId","warn","toInMemoryBase64","close","mobileListCertificates","errors","NotImplementedError","listProfiles","Object","assign","_default","default"],"sources":["../../../lib/commands/certificate.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, plist, tempDir, util } from 'appium/support';\nimport { retryInterval, retry, waitForCondition } from 'asyncbox';\nimport B from 'bluebird';\nimport os from 'os';\nimport path from 'path';\nimport http from 'http';\nimport { exec } from 'teen_process';\nimport { findAPortNotInUse, checkPortStatus } from 'portscanner';\nimport Pyidevice from '../py-ios-device-client';\nimport { errors } from 'appium/driver';\n\nlet extensions = {}, commands = {};\n\nconst CONFIG_EXTENSION = 'mobileconfig';\nconst HOST_PORT_RANGE = [38200, 38299];\nconst TMPSERVER_STARTUP_TIMEOUT = 5000;\nconst Settings = {\n General: {\n type: 'accessibility id',\n value: 'General',\n },\n Profile: {\n type: '-ios predicate string',\n value: `name BEGINSWITH 'Profile'`,\n },\n About: {\n type: 'accessibility id',\n value: 'About',\n },\n Certificate_Trust_Settings: {\n type: 'accessibility id',\n value: 'Certificate Trust Settings',\n },\n};\nconst Button = {\n Install: {\n type: 'accessibility id',\n value: 'Install',\n },\n Allow: {\n type: 'accessibility id',\n value: 'Allow',\n },\n Done: {\n type: 'accessibility id',\n value: 'Done',\n },\n Return_to_Settings: {\n type: 'accessibility id',\n value: 'Return to Settings',\n },\n};\nconst Alert = {\n Install: {\n type: '-ios class chain',\n value: '**/XCUIElementTypeAny[`type == \\'XCUIElementTypeAlert\\' OR type == \\'XCUIElementTypeSheet\\'`]/**/XCUIElementTypeButton[`label == \\'Install\\'`]',\n },\n};\n\n\nasync function extractCommonName (certBuffer) {\n const tempCert = await tempDir.open({\n prefix: 'cert',\n suffix: '.cer'\n });\n try {\n await fs.writeFile(tempCert.path, certBuffer);\n const {stdout} = await exec('openssl', ['x509', '-noout', '-subject', '-in', tempCert.path]);\n return parseCommonName(stdout);\n } catch (err) {\n throw new Error(`Cannot parse common name value from the certificate. Is it valid and base64-encoded? ` +\n `Original error: ${err.message}`);\n } finally {\n await fs.rimraf(tempCert.path);\n }\n}\n\nconst LIBRE_SSL_PATTERN = /\\/CN=([^\\/]+)/; // eslint-disable-line no-useless-escape\nconst OPEN_SSL_PATTERN = /,\\sCN\\s=\\s([^,]+)/;\n\nfunction parseCommonName (stringCertificate) {\n const result = [LIBRE_SSL_PATTERN, OPEN_SSL_PATTERN].reduce((acc, r) => {\n if (acc) {\n return acc;\n }\n const match = r.exec(stringCertificate);\n return match && match[1];\n }, null);\n if (!result) {\n throw new Error(`There is no common name value in '${stringCertificate}' output`);\n }\n return result;\n}\n\n/**\n * Generates Apple's over-the-air configuration profile\n * for certificate deployment based on the given PEM certificate content.\n * Read https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/Introduction/Introduction.html\n * for more details on such profiles.\n *\n * @param {Buffer} certBuffer - The actual content of PEM certificate encoded into NodeJS buffer\n * @param {string} commonName - Certificate's common name\n * @returns {Object} The encoded structure of the given certificate, which is ready to be passed\n * as an argument to plist builder\n * @throws {Error} If the given certificate cannot be parsed\n */\nfunction toMobileConfig (certBuffer, commonName) {\n const getUUID = () => util.uuidV4().toUpperCase();\n const contentUuid = getUUID();\n return {\n PayloadContent: [{\n PayloadCertificateFileName: `${commonName}.cer`,\n PayloadContent: certBuffer,\n PayloadDescription: 'Adds a CA root certificate',\n PayloadDisplayName: commonName,\n PayloadIdentifier: `com.apple.security.root.${contentUuid}`,\n PayloadType: 'com.apple.security.root',\n PayloadUUID: contentUuid,\n PayloadVersion: 1\n }],\n PayloadDisplayName: commonName,\n PayloadIdentifier: `${os.hostname().split('.')[0]}.${getUUID()}`,\n PayloadRemovalDisallowed: false,\n PayloadType: 'Configuration',\n PayloadUUID: getUUID(),\n PayloadVersion: 1\n };\n}\n\nasync function clickElement (driver, locator, options = {}) {\n let element = null;\n const {\n timeout = 5000,\n skipIfInvisible = false\n } = options;\n const lookupDelay = 500;\n try {\n element = await retryInterval(timeout < lookupDelay ? 1 : timeout / lookupDelay, lookupDelay,\n () => driver.findNativeElementOrElements(locator.type, locator.value, false)\n );\n } catch (err) {\n if (skipIfInvisible) {\n return false;\n }\n throw new Error(`Cannot find ${JSON.stringify(locator)} within ${timeout}ms timeout`);\n }\n await driver.nativeClick(element);\n return true;\n}\n\nasync function installPre122Certificate (driver) {\n // Accept Safari alert\n await clickElement(driver, Button.Allow, {\n // certificate load might take some time on slow machines\n timeout: 15000,\n });\n // Wait until Preferences are opened\n await B.delay(2000);\n\n // Go through Preferences wizard\n if (!await clickElement(driver, Button.Install, {\n skipIfInvisible: true,\n })) {\n return false;\n }\n // We need to click Install button on two different tabs\n // The second one confirms the previous\n await B.delay(1500);\n await clickElement(driver, Button.Install);\n // Accept alert\n await clickElement(driver, Alert.Install);\n // Finish adding certificate\n await clickElement(driver, Button.Done);\n return true;\n}\n\nasync function trustCertificateInPreferences (driver, name) {\n await clickElement(driver, Settings.General);\n await clickElement(driver, Settings.About);\n const switchLocator = {\n type: '-ios class chain',\n value: `**/XCUIElementTypeCell[\\`label == '${name}'\\`]/**/XCUIElementTypeSwitch`,\n };\n await retry(5, async () => {\n await driver.mobileSwipe({\n element: await driver.findNativeElementOrElements('class name', 'XCUIElementTypeTable', false),\n direction: 'up'\n });\n await clickElement(driver, Settings.Certificate_Trust_Settings, {\n timeout: 500,\n });\n\n await driver.findNativeElementOrElements(switchLocator.type, switchLocator.value, false);\n });\n // Only click the switch if it is set to Off\n if (await clickElement(driver, {\n type: switchLocator.type,\n value: `${switchLocator.value}[\\`value == '0'\\`]`\n }, {\n timeout: 1000,\n skipIfInvisible: true,\n })) {\n await driver.postAcceptAlert();\n }\n}\n\nasync function installPost122Certificate (driver, name) {\n // Accept Safari alert\n await clickElement(driver, Button.Allow, {\n // certificate load might take some time on slow machines\n timeout: 15000,\n });\n // Wait for the second alert\n await B.delay(2000);\n\n await driver.postAcceptAlert();\n await driver.activateApp('com.apple.Preferences');\n await clickElement(driver, Settings.General);\n await clickElement(driver, Settings.Profile);\n // Select the target cert\n let isCertFound = false;\n for (let swipeNum = 0; swipeNum < 5; ++swipeNum) {\n if (await clickElement(driver, {\n type: '-ios class chain',\n value: `**/XCUIElementTypeCell[\\`label == '${name}'\\`]`,\n }, {\n timeout: 500,\n skipIfInvisible: true,\n })) {\n isCertFound = true;\n break;\n }\n\n await driver.mobileSwipe({\n element: await driver.findNativeElementOrElements('class name', 'XCUIElementTypeTable', false),\n direction: 'up'\n });\n }\n if (!isCertFound) {\n throw new Error(`'${name}' cannot be found in the certificates list`);\n }\n\n // Install option is only visible if the cert is not installed yet\n if (!await clickElement(driver, Button.Install, {\n skipIfInvisible: true,\n })) {\n return false;\n }\n await B.delay(1500);\n // Confirm untrusted cert install\n await clickElement(driver, Button.Install);\n // Accept alert\n await clickElement(driver, Alert.Install);\n // Finish adding certificate\n await clickElement(driver, Button.Done);\n\n return true;\n}\n\n/**\n * @typedef {Object} CertificateInstallationOptions\n *\n * @property {!string} content - Base64-encoded content of the public certificate\n * @property {?string} commonName - Common name of the certificate. If this is not set\n * then the script will try to parse it from the given certificate content.\n * @property {?boolean} isRoot [true] - This option defines where the certificate should be\n * installed to: either Trusted Root Store (`true`, the default option) or\n * the Keychain (`false`). On environments other than Xcode 11.4+ Simulator this\n * option is ignored.\n */\n\n/**\n * Installs a custom certificate onto the device.\n * Since Xcode SDK 11.4 Apple has added a dedicated simctl subcommand to quickly handle\n * certificates on Simulator over CLI.\n * On real devices or simulators before Xcode 11.4 SDK\n * Apple provides no official way to do it via the command line.\n * In such case (and also as a fallback if CLI setup fails)\n * this method tries to wrap the certificate into .mobileconfig format\n * and then deploys the wrapped file to the internal HTTP server,\n * so one can open it via mobile Safari.\n * Then the algorithm goes through the profile installation procedure by\n * clicking the necessary buttons using WebDriverAgent.\n *\n * @param {CertificateInstallationOptions} opts\n * @returns {?string} The content of the generated .mobileconfig file as\n * base64-encoded string. This config might be useful for debugging purposes.\n * If the certificate has been successfully set via CLI then nothing is returned.\n */\ncommands.mobileInstallCertificate = async function mobileInstallCertificate (opts = {}) {\n const {\n content,\n commonName,\n isRoot = true,\n } = opts;\n if (_.isEmpty(content)) {\n throw new Error('Certificate content should not be empty');\n }\n\n if (this.isSimulator()) {\n try {\n const methodName = isRoot ? 'addRootCertificate' : 'addCertificate';\n await this.opts.device.simctl[methodName](\n Buffer.from(content, 'base64').toString(), {raw: true}\n );\n return;\n } catch (e) {\n this.log.debug(e);\n this.log.info(`The certificate cannot be installed via CLI. ` +\n `Falling back to UI-based deployment`);\n }\n } else {\n const client = new Pyidevice(this.opts.udid);\n if (await client.assertExists(false)) {\n await client.installProfile({payload: Buffer.from(content, 'base64')});\n return;\n } else {\n this.log.info('pyidevice is not installed on your system. ' +\n 'Falling back to the (slow) UI-based installation');\n }\n }\n\n const tmpRoot = await tempDir.openDir();\n const tmpPort = await findAPortNotInUse(HOST_PORT_RANGE[0], HOST_PORT_RANGE[1]);\n const configName = `appium.${CONFIG_EXTENSION}`;\n const configPath = path.resolve(tmpRoot, configName);\n const tmpServer = http.createServer(async function (_, res) {\n const configFile = await fs.readFile(configPath);\n res.end(configFile);\n });\n try {\n const certBuffer = Buffer.from(content, 'base64');\n const cn = commonName || await extractCommonName(certBuffer);\n const mobileConfig = toMobileConfig(certBuffer, cn);\n try {\n await plist.updatePlistFile(configPath, mobileConfig, false, false);\n } catch (err) {\n throw new Error(`Cannot store the generated config as '${configPath}'. ` +\n `Original error: ${err.message}`);\n }\n\n try {\n const host = os.hostname();\n const certUrl = `http://${host}:${tmpPort}/${configName}`;\n await tmpServer.listen(tmpPort);\n try {\n await waitForCondition(async () => {\n try {\n return (await checkPortStatus(tmpPort, host)) === 'open';\n } catch (ign) {\n return false;\n }\n }, {\n waitMs: TMPSERVER_STARTUP_TIMEOUT,\n intervalMs: 300,\n });\n this.log.debug(`The temporary web server is running at http://${host}:${tmpPort}`);\n } catch (e) {\n throw new Error(`The temporary web server cannot be started at http://${host}:${tmpPort}.`);\n }\n if (this.isRealDevice()) {\n try {\n await this.proxyCommand('/url', 'POST', {url: certUrl});\n } catch (err) {\n if (this.isWebContext()) {\n // The command above does not always work on real devices\n await this.setUrl(certUrl);\n } else {\n throw err;\n }\n }\n } else {\n await this.opts.device.openUrl(certUrl);\n }\n\n let isCertAlreadyInstalled = false;\n if (util.compareVersions(this.opts.platformVersion, '>=', '12.2')) {\n if (await installPost122Certificate(this, cn)) {\n await clickElement(this, Settings.Profile);\n await trustCertificateInPreferences(this, cn);\n } else {\n isCertAlreadyInstalled = true;\n }\n } else {\n if (await installPre122Certificate(this)) {\n await clickElement(this, Button.Return_to_Settings);\n await trustCertificateInPreferences(this, cn);\n } else {\n isCertAlreadyInstalled = true;\n }\n }\n if (isCertAlreadyInstalled) {\n this.log.info(`It looks like the '${cn}' certificate has been already added to the CA root`);\n }\n } finally {\n if (this.opts.bundleId) {\n try {\n await this.activateApp(this.opts.bundleId);\n } catch (e) {\n this.log.warn(`Cannot restore the application '${this.opts.bundleId}'. Original error: ${e.message}`);\n }\n }\n }\n\n return (await util.toInMemoryBase64(configPath)).toString();\n } finally {\n await tmpServer.close();\n await fs.rimraf(tmpRoot);\n }\n};\n\n/**\n * Lists installed certificates for real devices only\n * if [py-ios-device](https://github.com/YueChen-C/py-ios-device) tool\n * is available on the server machine.\n *\n * @returns {Object} Returns map of certificates installed on the real device\n * @throws {Error} If attempting to list certificates for simulated device or if py-ios-device\n * is not installed\n */\ncommands.mobileListCertificates = async function mobileListCertificates () {\n if (!this.isRealDevice()) {\n throw new errors.NotImplementedError('This extension is only supported on real devices');\n }\n const client = new Pyidevice(this.opts.udid);\n if (await client.assertExists(false)) {\n return await client.listProfiles();\n }\n throw new Error('pyidevice is not installed on your system, command cannot be executed.');\n};\n\nObject.assign(extensions, commands);\nexport { commands, parseCommonName };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"certificate.js","names":["_lodash","_interopRequireDefault","require","_support","_asyncbox","_bluebird","_os","_path","_http","_teen_process","_portscanner","_pyIosDeviceClient","_driver","extensions","commands","exports","CONFIG_EXTENSION","HOST_PORT_RANGE","TMPSERVER_STARTUP_TIMEOUT","Settings","General","type","value","Profile","About","Certificate_Trust_Settings","Button","Install","Allow","Done","Return_to_Settings","Alert","extractCommonName","certBuffer","tempCert","tempDir","open","prefix","suffix","fs","writeFile","path","stdout","exec","parseCommonName","err","Error","message","rimraf","LIBRE_SSL_PATTERN","OPEN_SSL_PATTERN","stringCertificate","result","reduce","acc","r","match","toMobileConfig","commonName","getUUID","util","uuidV4","toUpperCase","contentUuid","PayloadContent","PayloadCertificateFileName","PayloadDescription","PayloadDisplayName","PayloadIdentifier","PayloadType","PayloadUUID","PayloadVersion","os","hostname","split","PayloadRemovalDisallowed","clickElement","driver","locator","options","element","timeout","skipIfInvisible","lookupDelay","retryInterval","findNativeElementOrElements","JSON","stringify","nativeClick","installPre122Certificate","B","delay","trustCertificateInPreferences","name","switchLocator","retry","mobileSwipe","direction","postAcceptAlert","installPost122Certificate","activateApp","isCertFound","swipeNum","mobileInstallCertificate","opts","content","isRoot","_","isEmpty","isSimulator","methodName","device","simctl","Buffer","from","toString","raw","e","log","debug","info","client","Pyidevice","udid","assertExists","installProfile","payload","tmpRoot","openDir","tmpPort","findAPortNotInUse","configName","configPath","resolve","tmpServer","http","createServer","res","configFile","readFile","end","cn","mobileConfig","plist","updatePlistFile","host","certUrl","listen","waitForCondition","checkPortStatus","ign","waitMs","intervalMs","isRealDevice","proxyCommand","url","isWebContext","setUrl","openUrl","isCertAlreadyInstalled","compareVersions","platformVersion","bundleId","warn","toInMemoryBase64","close","mobileRemoveCertificate","errors","NotImplementedError","removeProfile","mobileListCertificates","listProfiles","Object","assign","_default","default"],"sources":["../../../lib/commands/certificate.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, plist, tempDir, util } from 'appium/support';\nimport { retryInterval, retry, waitForCondition } from 'asyncbox';\nimport B from 'bluebird';\nimport os from 'os';\nimport path from 'path';\nimport http from 'http';\nimport { exec } from 'teen_process';\nimport { findAPortNotInUse, checkPortStatus } from 'portscanner';\nimport Pyidevice from '../py-ios-device-client';\nimport { errors } from 'appium/driver';\n\nlet extensions = {}, commands = {};\n\nconst CONFIG_EXTENSION = 'mobileconfig';\nconst HOST_PORT_RANGE = [38200, 38299];\nconst TMPSERVER_STARTUP_TIMEOUT = 5000;\nconst Settings = {\n General: {\n type: 'accessibility id',\n value: 'General',\n },\n Profile: {\n type: '-ios predicate string',\n value: `name BEGINSWITH 'Profile'`,\n },\n About: {\n type: 'accessibility id',\n value: 'About',\n },\n Certificate_Trust_Settings: {\n type: 'accessibility id',\n value: 'Certificate Trust Settings',\n },\n};\nconst Button = {\n Install: {\n type: 'accessibility id',\n value: 'Install',\n },\n Allow: {\n type: 'accessibility id',\n value: 'Allow',\n },\n Done: {\n type: 'accessibility id',\n value: 'Done',\n },\n Return_to_Settings: {\n type: 'accessibility id',\n value: 'Return to Settings',\n },\n};\nconst Alert = {\n Install: {\n type: '-ios class chain',\n value: '**/XCUIElementTypeAny[`type == \\'XCUIElementTypeAlert\\' OR type == \\'XCUIElementTypeSheet\\'`]/**/XCUIElementTypeButton[`label == \\'Install\\'`]',\n },\n};\n\n\nasync function extractCommonName (certBuffer) {\n const tempCert = await tempDir.open({\n prefix: 'cert',\n suffix: '.cer'\n });\n try {\n await fs.writeFile(tempCert.path, certBuffer);\n const {stdout} = await exec('openssl', ['x509', '-noout', '-subject', '-in', tempCert.path]);\n return parseCommonName(stdout);\n } catch (err) {\n throw new Error(`Cannot parse common name value from the certificate. Is it valid and base64-encoded? ` +\n `Original error: ${err.message}`);\n } finally {\n await fs.rimraf(tempCert.path);\n }\n}\n\nconst LIBRE_SSL_PATTERN = /\\/CN=([^\\/]+)/; // eslint-disable-line no-useless-escape\nconst OPEN_SSL_PATTERN = /,\\sCN\\s=\\s([^,]+)/;\n\nfunction parseCommonName (stringCertificate) {\n const result = [LIBRE_SSL_PATTERN, OPEN_SSL_PATTERN].reduce((acc, r) => {\n if (acc) {\n return acc;\n }\n const match = r.exec(stringCertificate);\n return match && match[1];\n }, null);\n if (!result) {\n throw new Error(`There is no common name value in '${stringCertificate}' output`);\n }\n return result;\n}\n\n/**\n * Generates Apple's over-the-air configuration profile\n * for certificate deployment based on the given PEM certificate content.\n * Read https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/Introduction/Introduction.html\n * for more details on such profiles.\n *\n * @param {Buffer} certBuffer - The actual content of PEM certificate encoded into NodeJS buffer\n * @param {string} commonName - Certificate's common name\n * @returns {Object} The encoded structure of the given certificate, which is ready to be passed\n * as an argument to plist builder\n * @throws {Error} If the given certificate cannot be parsed\n */\nfunction toMobileConfig (certBuffer, commonName) {\n const getUUID = () => util.uuidV4().toUpperCase();\n const contentUuid = getUUID();\n return {\n PayloadContent: [{\n PayloadCertificateFileName: `${commonName}.cer`,\n PayloadContent: certBuffer,\n PayloadDescription: 'Adds a CA root certificate',\n PayloadDisplayName: commonName,\n PayloadIdentifier: `com.apple.security.root.${contentUuid}`,\n PayloadType: 'com.apple.security.root',\n PayloadUUID: contentUuid,\n PayloadVersion: 1\n }],\n PayloadDisplayName: commonName,\n PayloadIdentifier: `${os.hostname().split('.')[0]}.${getUUID()}`,\n PayloadRemovalDisallowed: false,\n PayloadType: 'Configuration',\n PayloadUUID: getUUID(),\n PayloadVersion: 1\n };\n}\n\nasync function clickElement (driver, locator, options = {}) {\n let element = null;\n const {\n timeout = 5000,\n skipIfInvisible = false\n } = options;\n const lookupDelay = 500;\n try {\n element = await retryInterval(timeout < lookupDelay ? 1 : timeout / lookupDelay, lookupDelay,\n () => driver.findNativeElementOrElements(locator.type, locator.value, false)\n );\n } catch (err) {\n if (skipIfInvisible) {\n return false;\n }\n throw new Error(`Cannot find ${JSON.stringify(locator)} within ${timeout}ms timeout`);\n }\n await driver.nativeClick(element);\n return true;\n}\n\nasync function installPre122Certificate (driver) {\n // Accept Safari alert\n await clickElement(driver, Button.Allow, {\n // certificate load might take some time on slow machines\n timeout: 15000,\n });\n // Wait until Preferences are opened\n await B.delay(2000);\n\n // Go through Preferences wizard\n if (!await clickElement(driver, Button.Install, {\n skipIfInvisible: true,\n })) {\n return false;\n }\n // We need to click Install button on two different tabs\n // The second one confirms the previous\n await B.delay(1500);\n await clickElement(driver, Button.Install);\n // Accept alert\n await clickElement(driver, Alert.Install);\n // Finish adding certificate\n await clickElement(driver, Button.Done);\n return true;\n}\n\nasync function trustCertificateInPreferences (driver, name) {\n await clickElement(driver, Settings.General);\n await clickElement(driver, Settings.About);\n const switchLocator = {\n type: '-ios class chain',\n value: `**/XCUIElementTypeCell[\\`label == '${name}'\\`]/**/XCUIElementTypeSwitch`,\n };\n await retry(5, async () => {\n await driver.mobileSwipe({\n element: await driver.findNativeElementOrElements('class name', 'XCUIElementTypeTable', false),\n direction: 'up'\n });\n await clickElement(driver, Settings.Certificate_Trust_Settings, {\n timeout: 500,\n });\n\n await driver.findNativeElementOrElements(switchLocator.type, switchLocator.value, false);\n });\n // Only click the switch if it is set to Off\n if (await clickElement(driver, {\n type: switchLocator.type,\n value: `${switchLocator.value}[\\`value == '0'\\`]`\n }, {\n timeout: 1000,\n skipIfInvisible: true,\n })) {\n await driver.postAcceptAlert();\n }\n}\n\nasync function installPost122Certificate (driver, name) {\n // Accept Safari alert\n await clickElement(driver, Button.Allow, {\n // certificate load might take some time on slow machines\n timeout: 15000,\n });\n // Wait for the second alert\n await B.delay(2000);\n\n await driver.postAcceptAlert();\n await driver.activateApp('com.apple.Preferences');\n await clickElement(driver, Settings.General);\n await clickElement(driver, Settings.Profile);\n // Select the target cert\n let isCertFound = false;\n for (let swipeNum = 0; swipeNum < 5; ++swipeNum) {\n if (await clickElement(driver, {\n type: '-ios class chain',\n value: `**/XCUIElementTypeCell[\\`label == '${name}'\\`]`,\n }, {\n timeout: 500,\n skipIfInvisible: true,\n })) {\n isCertFound = true;\n break;\n }\n\n await driver.mobileSwipe({\n element: await driver.findNativeElementOrElements('class name', 'XCUIElementTypeTable', false),\n direction: 'up'\n });\n }\n if (!isCertFound) {\n throw new Error(`'${name}' cannot be found in the certificates list`);\n }\n\n // Install option is only visible if the cert is not installed yet\n if (!await clickElement(driver, Button.Install, {\n skipIfInvisible: true,\n })) {\n return false;\n }\n await B.delay(1500);\n // Confirm untrusted cert install\n await clickElement(driver, Button.Install);\n // Accept alert\n await clickElement(driver, Alert.Install);\n // Finish adding certificate\n await clickElement(driver, Button.Done);\n\n return true;\n}\n\n/**\n * @typedef {Object} CertificateInstallationOptions\n *\n * @property {!string} content - Base64-encoded content of the public certificate\n * @property {?string} commonName - Common name of the certificate. If this is not set\n * then the script will try to parse it from the given certificate content.\n * @property {?boolean} isRoot [true] - This option defines where the certificate should be\n * installed to: either Trusted Root Store (`true`, the default option) or\n * the Keychain (`false`). On environments other than Xcode 11.4+ Simulator this\n * option is ignored.\n */\n\n/**\n * Installs a custom certificate onto the device.\n * Since Xcode SDK 11.4 Apple has added a dedicated simctl subcommand to quickly handle\n * certificates on Simulator over CLI.\n * On real devices or simulators before Xcode 11.4 SDK\n * Apple provides no official way to do it via the command line.\n * In such case (and also as a fallback if CLI setup fails)\n * this method tries to wrap the certificate into .mobileconfig format\n * and then deploys the wrapped file to the internal HTTP server,\n * so one can open it via mobile Safari.\n * Then the algorithm goes through the profile installation procedure by\n * clicking the necessary buttons using WebDriverAgent.\n *\n * @param {CertificateInstallationOptions} opts\n * @returns {?string} The content of the generated .mobileconfig file as\n * base64-encoded string. This config might be useful for debugging purposes.\n * If the certificate has been successfully set via CLI then nothing is returned.\n */\ncommands.mobileInstallCertificate = async function mobileInstallCertificate (opts = {}) {\n const {\n content,\n commonName,\n isRoot = true,\n } = opts;\n if (_.isEmpty(content)) {\n throw new Error('Certificate content should not be empty');\n }\n\n if (this.isSimulator()) {\n try {\n const methodName = isRoot ? 'addRootCertificate' : 'addCertificate';\n await this.opts.device.simctl[methodName](\n Buffer.from(content, 'base64').toString(), {raw: true}\n );\n return;\n } catch (e) {\n this.log.debug(e);\n this.log.info(`The certificate cannot be installed via CLI. ` +\n `Falling back to UI-based deployment`);\n }\n } else {\n const client = new Pyidevice(this.opts.udid);\n if (await client.assertExists(false)) {\n await client.installProfile({payload: Buffer.from(content, 'base64')});\n return;\n } else {\n this.log.info('pyidevice is not installed on your system. ' +\n 'Falling back to the (slow) UI-based installation');\n }\n }\n\n const tmpRoot = await tempDir.openDir();\n const tmpPort = await findAPortNotInUse(HOST_PORT_RANGE[0], HOST_PORT_RANGE[1]);\n const configName = `appium.${CONFIG_EXTENSION}`;\n const configPath = path.resolve(tmpRoot, configName);\n const tmpServer = http.createServer(async function (_, res) {\n const configFile = await fs.readFile(configPath);\n res.end(configFile);\n });\n try {\n const certBuffer = Buffer.from(content, 'base64');\n const cn = commonName || await extractCommonName(certBuffer);\n const mobileConfig = toMobileConfig(certBuffer, cn);\n try {\n await plist.updatePlistFile(configPath, mobileConfig, false, false);\n } catch (err) {\n throw new Error(`Cannot store the generated config as '${configPath}'. ` +\n `Original error: ${err.message}`);\n }\n\n try {\n const host = os.hostname();\n const certUrl = `http://${host}:${tmpPort}/${configName}`;\n await tmpServer.listen(tmpPort);\n try {\n await waitForCondition(async () => {\n try {\n return (await checkPortStatus(tmpPort, host)) === 'open';\n } catch (ign) {\n return false;\n }\n }, {\n waitMs: TMPSERVER_STARTUP_TIMEOUT,\n intervalMs: 300,\n });\n this.log.debug(`The temporary web server is running at http://${host}:${tmpPort}`);\n } catch (e) {\n throw new Error(`The temporary web server cannot be started at http://${host}:${tmpPort}.`);\n }\n if (this.isRealDevice()) {\n try {\n await this.proxyCommand('/url', 'POST', {url: certUrl});\n } catch (err) {\n if (this.isWebContext()) {\n // The command above does not always work on real devices\n await this.setUrl(certUrl);\n } else {\n throw err;\n }\n }\n } else {\n await this.opts.device.openUrl(certUrl);\n }\n\n let isCertAlreadyInstalled = false;\n if (util.compareVersions(this.opts.platformVersion, '>=', '12.2')) {\n if (await installPost122Certificate(this, cn)) {\n await clickElement(this, Settings.Profile);\n await trustCertificateInPreferences(this, cn);\n } else {\n isCertAlreadyInstalled = true;\n }\n } else {\n if (await installPre122Certificate(this)) {\n await clickElement(this, Button.Return_to_Settings);\n await trustCertificateInPreferences(this, cn);\n } else {\n isCertAlreadyInstalled = true;\n }\n }\n if (isCertAlreadyInstalled) {\n this.log.info(`It looks like the '${cn}' certificate has been already added to the CA root`);\n }\n } finally {\n if (this.opts.bundleId) {\n try {\n await this.activateApp(this.opts.bundleId);\n } catch (e) {\n this.log.warn(`Cannot restore the application '${this.opts.bundleId}'. Original error: ${e.message}`);\n }\n }\n }\n\n return (await util.toInMemoryBase64(configPath)).toString();\n } finally {\n await tmpServer.close();\n await fs.rimraf(tmpRoot);\n }\n};\n\n/**\n * Removes installed certificates for real devices only\n * if [py-ios-device](https://github.com/YueChen-C/py-ios-device) tool\n * is available on the server machine.\n *\n * @property {!string} name - Name of certificate to remove\n * @returns {Object} Returns status acknowledgment if successfully removed certificate or 'None'\n * @throws {Error} If attempting to remote certificates for simulated device or if py-ios-device\n * is not installed\n */\ncommands.mobileRemoveCertificate = async function mobileRemoveCertificate (opts = {}) {\n const {\n name\n } = opts;\n if (!this.isRealDevice()) {\n throw new errors.NotImplementedError('This extension is only supported on real devices');\n }\n const client = new Pyidevice(this.opts.udid);\n await client.assertExists(true);\n return await client.removeProfile(name);\n};\n\n/**\n * Lists installed certificates for real devices only\n * if [py-ios-device](https://github.com/YueChen-C/py-ios-device) tool\n * is available on the server machine.\n *\n * @returns {Object} Returns map of certificates installed on the real device\n * @throws {Error} If attempting to list certificates for simulated device or if py-ios-device\n * is not installed\n */\ncommands.mobileListCertificates = async function mobileListCertificates () {\n if (!this.isRealDevice()) {\n throw new errors.NotImplementedError('This extension is only supported on real devices');\n }\n const client = new Pyidevice(this.opts.udid);\n await client.assertExists(true);\n return await client.listProfiles();\n};\n\nObject.assign(extensions, commands);\nexport { commands, parseCommonName };\nexport default extensions;\n"],"mappings":"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"}
@@ -80,6 +80,7 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
80
80
  startPerfRecord: 'mobileStartPerfRecord',
81
81
  stopPerfRecord: 'mobileStopPerfRecord',
82
82
  installCertificate: 'mobileInstallCertificate',
83
+ removeCertificate: 'mobileRemoveCertificate',
83
84
  listCertificates: 'mobileListCertificates',
84
85
  startLogsBroadcast: 'mobileStartLogsBroadcast',
85
86
  stopLogsBroadcast: 'mobileStopLogsBroadcast',
@@ -133,4 +134,4 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
133
134
  };
134
135
  var _default = extensions;
135
136
  exports.default = _default;
136
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX3N1cHBvcnQiLCJleHRlbnNpb25zIiwicmVjZWl2ZUFzeW5jUmVzcG9uc2UiLCJzdGF0dXMiLCJ2YWx1ZSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsInV0aWwiLCJoYXNWYWx1ZSIsImFzeW5jUHJvbWlzZSIsIndhcm4iLCJyZWplY3QiLCJlcnJvckZyb21Db2RlIiwibWVzc2FnZSIsIl8iLCJpc1N0cmluZyIsImVycm9yIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJzdGFja3RyYWNlIiwicmVzb2x2ZSIsImV4ZWN1dGUiLCJzY3JpcHQiLCJhcmdzIiwibWF0Y2giLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJpc0FycmF5IiwiaXNXZWJDb250ZXh0IiwiY29udmVydEVsZW1lbnRzRm9yQXRvbXMiLCJyZXN1bHQiLCJleGVjdXRlQXRvbSIsImNhY2hlV2ViRWxlbWVudHMiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiZXhlY3V0ZUFzeW5jIiwiYXN5bmNXYWl0TXMiLCJwcm9taXNlIiwicmVtb3RlIiwiZXhlY3V0ZUF0b21Bc3luYyIsImN1cldlYkZyYW1lcyIsIndhaXRGb3JBdG9tIiwibW9iaWxlQ29tbWFuZCIsIm9wdHMiLCJjb21tYW5kTWFwIiwidGFwIiwic2Nyb2xsIiwic2VsZWN0UGlja2VyV2hlZWxWYWx1ZSIsInN3aXBlIiwicGluY2giLCJkb3VibGVUYXAiLCJ0d29GaW5nZXJUYXAiLCJ0YXBXaXRoTnVtYmVyT2ZUYXBzIiwidG91Y2hBbmRIb2xkIiwiZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uIiwicm90YXRlRWxlbWVudCIsImRyYWdGcm9tVG9XaXRoVmVsb2NpdHkiLCJmb3JjZVByZXNzIiwic2Nyb2xsVG9FbGVtZW50IiwiYWxlcnQiLCJzZXRQYXN0ZWJvYXJkIiwiZ2V0UGFzdGVib2FyZCIsInNvdXJjZSIsImdldENvbnRleHRzIiwiaW5zdGFsbEFwcCIsImlzQXBwSW5zdGFsbGVkIiwicmVtb3ZlQXBwIiwibGF1bmNoQXBwIiwidGVybWluYXRlQXBwIiwia2lsbEFwcCIsInF1ZXJ5QXBwU3RhdGUiLCJhY3RpdmF0ZUFwcCIsImxpc3RBcHBzIiwidmlld3BvcnRTY3JlZW5zaG90Iiwidmlld3BvcnRSZWN0Iiwic3RhcnRQZXJmUmVjb3JkIiwic3RvcFBlcmZSZWNvcmQiLCJpbnN0YWxsQ2VydGlmaWNhdGUiLCJsaXN0Q2VydGlmaWNhdGVzIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJiYXR0ZXJ5SW5mbyIsImRldmljZUluZm8iLCJnZXREZXZpY2VUaW1lIiwiYWN0aXZlQXBwSW5mbyIsImRldmljZVNjcmVlbkluZm8iLCJwcmVzc0J1dHRvbiIsImVucm9sbEJpb21ldHJpYyIsInNlbmRCaW9tZXRyaWNNYXRjaCIsImlzQmlvbWV0cmljRW5yb2xsZWQiLCJjbGVhcktleWNoYWlucyIsImdldFBlcm1pc3Npb24iLCJzZXRQZXJtaXNzaW9uIiwicmVzZXRQZXJtaXNzaW9uIiwiZ2V0QXBwZWFyYW5jZSIsInNldEFwcGVhcmFuY2UiLCJzaXJpQ29tbWFuZCIsInB1c2hGaWxlIiwicHVsbEZpbGUiLCJwdWxsRm9sZGVyIiwiZGVsZXRlRmlsZSIsImRlbGV0ZUZvbGRlciIsInN0YXJ0QXVkaW9SZWNvcmRpbmciLCJzdG9wQXVkaW9SZWNvcmRpbmciLCJydW5YQ1Rlc3QiLCJpbnN0YWxsWENUZXN0QnVuZGxlIiwibGlzdFhDVGVzdEJ1bmRsZXMiLCJsaXN0WENUZXN0c0luVGVzdEJ1bmRsZSIsInB1c2hOb3RpZmljYXRpb24iLCJleHBlY3ROb3RpZmljYXRpb24iLCJwZXJmb3JtSW9IaWRFdmVudCIsImNvbmZpZ3VyZUxvY2FsaXphdGlvbiIsInJlc2V0TG9jYXRpb25TZXJ2aWNlIiwic3RhcnRQY2FwIiwic3RvcFBjYXAiLCJsaXN0Q29uZGl0aW9uSW5kdWNlcnMiLCJlbmFibGVDb25kaXRpb25JbmR1Y2VyIiwiZGlzYWJsZUNvbmRpdGlvbkluZHVjZXIiLCJ1cGRhdGVTYWZhcmlQcmVmZXJlbmNlcyIsImRlZXBMaW5rIiwic2V0U2ltdWxhdGVkTG9jYXRpb24iLCJnZXRTaW11bGF0ZWRMb2NhdGlvbiIsInJlc2V0U2ltdWxhdGVkTG9jYXRpb24iLCJoYXMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyIsImpvaW4iLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2V4ZWN1dGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIGVycm9ycywgZXJyb3JGcm9tQ29kZSwgZXJyb3JGcm9tVzNDSnNvbkNvZGVcbn0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuXG5jb25zdCBleHRlbnNpb25zID0ge307XG5cbmV4dGVuc2lvbnMucmVjZWl2ZUFzeW5jUmVzcG9uc2UgPSBhc3luYyBmdW5jdGlvbiByZWNlaXZlQXN5bmNSZXNwb25zZSAoc3RhdHVzLCB2YWx1ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgdGhpcy5sb2cuZGVidWcoYFJlY2VpdmVkIGFzeW5jIHJlc3BvbnNlOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHRoaXMuYXN5bmNQcm9taXNlKSkge1xuICAgIHRoaXMubG9nLndhcm4oYFJlY2VpdmVkIGFzeW5jIHJlc3BvbnNlIHdoZW4gd2Ugd2VyZSBub3QgZXhwZWN0aW5nIG9uZSEgYCArXG4gICAgICBgUmVzcG9uc2Ugd2FzOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodXRpbC5oYXNWYWx1ZShzdGF0dXMpICYmIHN0YXR1cyAhPT0gMCkge1xuICAgIC8vIE1KU09OV1BcbiAgICByZXR1cm4gdGhpcy5hc3luY1Byb21pc2UucmVqZWN0KGVycm9yRnJvbUNvZGUoc3RhdHVzLCB2YWx1ZS5tZXNzYWdlKSk7XG4gIH1cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKHN0YXR1cykgJiYgdmFsdWUgJiYgXy5pc1N0cmluZyh2YWx1ZS5lcnJvcikpIHtcbiAgICAvLyBXM0NcbiAgICByZXR1cm4gdGhpcy5hc3luY1Byb21pc2UucmVqZWN0KGVycm9yRnJvbVczQ0pzb25Db2RlKHZhbHVlLmVycm9yLCB2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5zdGFja3RyYWNlKSk7XG4gIH1cbiAgcmV0dXJuIHRoaXMuYXN5bmNQcm9taXNlLnJlc29sdmUodmFsdWUpO1xufTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZSAoc2NyaXB0LCBhcmdzKSB7XG4gIGlmIChzY3JpcHQubWF0Y2goL15tb2JpbGU6LykpIHtcbiAgICBzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSgvXm1vYmlsZTovLCAnJykudHJpbSgpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVNb2JpbGUoc2NyaXB0LCBfLmlzQXJyYXkoYXJncykgPyBhcmdzWzBdIDogYXJncyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIGFyZ3MgPSB0aGlzLmNvbnZlcnRFbGVtZW50c0ZvckF0b21zKGFyZ3MpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUF0b20oJ2V4ZWN1dGVfc2NyaXB0JywgW3NjcmlwdCwgYXJnc10pO1xuICAgIHJldHVybiB0aGlzLmNhY2hlV2ViRWxlbWVudHMocmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxufTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlQXN5bmMgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlQXN5bmMgKHNjcmlwdCwgYXJncykge1xuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGFyZ3MgPSB0aGlzLmNvbnZlcnRFbGVtZW50c0ZvckF0b21zKGFyZ3MpO1xuICB0aGlzLmFzeW5jV2FpdE1zID0gdGhpcy5hc3luY1dhaXRNcyB8fCAwO1xuICBjb25zdCBwcm9taXNlID0gdGhpcy5yZW1vdGUuZXhlY3V0ZUF0b21Bc3luYygnZXhlY3V0ZV9hc3luY19zY3JpcHQnLCBbXG4gICAgc2NyaXB0LCBhcmdzLCB0aGlzLmFzeW5jV2FpdE1zXG4gIF0sIHRoaXMuY3VyV2ViRnJhbWVzKTtcbiAgcmV0dXJuIHRoaXMuY2FjaGVXZWJFbGVtZW50cyhhd2FpdCB0aGlzLndhaXRGb3JBdG9tKHByb21pc2UpKTtcbn07XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZU1vYmlsZSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVNb2JpbGUgKG1vYmlsZUNvbW1hbmQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBjb21tYW5kTWFwID0ge1xuICAgIC8vcmVnaW9uIGdlc3R1cmVzIHN1cHBvcnRcbiAgICB0YXA6ICdtb2JpbGVUYXAnLFxuICAgIHNjcm9sbDogJ21vYmlsZVNjcm9sbCcsXG4gICAgc2VsZWN0UGlja2VyV2hlZWxWYWx1ZTogJ21vYmlsZVNlbGVjdFBpY2tlcldoZWVsVmFsdWUnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjY4LXN3aXBlbGVmdD9sYW5ndWFnZT1vYmpjXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NzQtc3dpcGVyaWdodD9sYW5ndWFnZT1vYmpjXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2Njctc3dpcGV1cD9sYW5ndWFnZT1vYmpjXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NjQtc3dpcGVkb3duP2xhbmd1YWdlPW9iamNcbiAgICBzd2lwZTogJ21vYmlsZVN3aXBlJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2OS1waW5jaHdpdGhzY2FsZT9sYW5ndWFnZT1vYmpjXG4gICAgcGluY2g6ICdtb2JpbGVQaW5jaCcsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NzMtZG91YmxldGFwP2xhbmd1YWdlPW9iamNcbiAgICBkb3VibGVUYXA6ICdtb2JpbGVEb3VibGVUYXAnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4Njc1LXR3b2ZpbmdlcnRhcD9sYW5ndWFnZT1vYmpjXG4gICAgdHdvRmluZ2VyVGFwOiAnbW9iaWxlVHdvRmluZ2VyVGFwJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY3MS10YXB3aXRobnVtYmVyb2Z0YXBzP2xhbmd1YWdlPW9iamNcbiAgICB0YXBXaXRoTnVtYmVyT2ZUYXBzOiAnbW9iaWxlVGFwV2l0aE51bWJlck9mVGFwcycsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NjMtcHJlc3Nmb3JkdXJhdGlvbj9sYW5ndWFnZT1vYmpjXG4gICAgdG91Y2hBbmRIb2xkOiAnbW9iaWxlVG91Y2hBbmRIb2xkJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY3MC1wcmVzc2ZvcmR1cmF0aW9uP2xhbmd1YWdlPW9iamNcbiAgICBkcmFnRnJvbVRvRm9yRHVyYXRpb246ICdtb2JpbGVEcmFnRnJvbVRvRm9yRHVyYXRpb24nLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjY1LXJvdGF0ZT9sYW5ndWFnZT1vYmpjXG4gICAgcm90YXRlRWxlbWVudDogJ21vYmlsZVJvdGF0ZUVsZW1lbnQnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpY29vcmRpbmF0ZS8zNTUxNjkyLXByZXNzZm9yZHVyYXRpb24/bGFuZ3VhZ2U9b2JqY1xuICAgIGRyYWdGcm9tVG9XaXRoVmVsb2NpdHk6ICdtb2JpbGVEcmFnRnJvbVRvV2l0aFZlbG9jaXR5JyxcbiAgICBmb3JjZVByZXNzOiAnbW9iaWxlRm9yY2VQcmVzcycsXG4gICAgc2Nyb2xsVG9FbGVtZW50OiAnbW9iaWxlU2Nyb2xsVG9FbGVtZW50JyxcblxuICAgIC8vZW5kcmVnaW9uIGdlc3R1cmVzIHN1cHBvcnRcbiAgICBhbGVydDogJ21vYmlsZUhhbmRsZUFsZXJ0JyxcblxuICAgIHNldFBhc3RlYm9hcmQ6ICdtb2JpbGVTZXRQYXN0ZWJvYXJkJyxcbiAgICBnZXRQYXN0ZWJvYXJkOiAnbW9iaWxlR2V0UGFzdGVib2FyZCcsXG5cbiAgICBzb3VyY2U6ICdtb2JpbGVHZXRTb3VyY2UnLFxuICAgIGdldENvbnRleHRzOiAnbW9iaWxlR2V0Q29udGV4dHMnLFxuXG4gICAgLy9yZWdpb24gbXVsdGlwbGUgYXBwcyBtYW5hZ2VtZW50XG4gICAgaW5zdGFsbEFwcDogJ21vYmlsZUluc3RhbGxBcHAnLFxuICAgIGlzQXBwSW5zdGFsbGVkOiAnbW9iaWxlSXNBcHBJbnN0YWxsZWQnLFxuICAgIHJlbW92ZUFwcDogJ21vYmlsZVJlbW92ZUFwcCcsXG4gICAgbGF1bmNoQXBwOiAnbW9iaWxlTGF1bmNoQXBwJyxcbiAgICB0ZXJtaW5hdGVBcHA6ICdtb2JpbGVUZXJtaW5hdGVBcHAnLFxuICAgIGtpbGxBcHA6ICdtb2JpbGVLaWxsQXBwJyxcbiAgICBxdWVyeUFwcFN0YXRlOiAnbW9iaWxlUXVlcnlBcHBTdGF0ZScsXG4gICAgYWN0aXZhdGVBcHA6ICdtb2JpbGVBY3RpdmF0ZUFwcCcsXG4gICAgbGlzdEFwcHM6ICdtb2JpbGVMaXN0QXBwcycsXG4gICAgLy9lbmRyZWdpb24gbXVsdGlwbGUgYXBwcyBtYW5hZ2VtZW50XG5cbiAgICB2aWV3cG9ydFNjcmVlbnNob3Q6ICdnZXRWaWV3cG9ydFNjcmVlbnNob3QnLFxuICAgIHZpZXdwb3J0UmVjdDogJ2dldFZpZXdwb3J0UmVjdCcsXG5cbiAgICBzdGFydFBlcmZSZWNvcmQ6ICdtb2JpbGVTdGFydFBlcmZSZWNvcmQnLFxuICAgIHN0b3BQZXJmUmVjb3JkOiAnbW9iaWxlU3RvcFBlcmZSZWNvcmQnLFxuXG4gICAgaW5zdGFsbENlcnRpZmljYXRlOiAnbW9iaWxlSW5zdGFsbENlcnRpZmljYXRlJyxcbiAgICBsaXN0Q2VydGlmaWNhdGVzOiAnbW9iaWxlTGlzdENlcnRpZmljYXRlcycsXG5cbiAgICBzdGFydExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdGFydExvZ3NCcm9hZGNhc3QnLFxuICAgIHN0b3BMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RvcExvZ3NCcm9hZGNhc3QnLFxuXG4gICAgYmF0dGVyeUluZm86ICdtb2JpbGVHZXRCYXR0ZXJ5SW5mbycsXG4gICAgZGV2aWNlSW5mbzogJ21vYmlsZUdldERldmljZUluZm8nLFxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcbiAgICBhY3RpdmVBcHBJbmZvOiAnbW9iaWxlR2V0QWN0aXZlQXBwSW5mbycsXG4gICAgZGV2aWNlU2NyZWVuSW5mbzogJ2dldFNjcmVlbkluZm8nLFxuXG4gICAgcHJlc3NCdXR0b246ICdtb2JpbGVQcmVzc0J1dHRvbicsXG5cbiAgICBlbnJvbGxCaW9tZXRyaWM6ICdtb2JpbGVFbnJvbGxCaW9tZXRyaWMnLFxuICAgIHNlbmRCaW9tZXRyaWNNYXRjaDogJ21vYmlsZVNlbmRCaW9tZXRyaWNNYXRjaCcsXG4gICAgaXNCaW9tZXRyaWNFbnJvbGxlZDogJ21vYmlsZUlzQmlvbWV0cmljRW5yb2xsZWQnLFxuXG4gICAgY2xlYXJLZXljaGFpbnM6ICdtb2JpbGVDbGVhcktleWNoYWlucycsXG5cbiAgICBnZXRQZXJtaXNzaW9uOiAnbW9iaWxlR2V0UGVybWlzc2lvbicsXG4gICAgc2V0UGVybWlzc2lvbjogJ21vYmlsZVNldFBlcm1pc3Npb25zJyxcbiAgICByZXNldFBlcm1pc3Npb246ICdtb2JpbGVSZXNldFBlcm1pc3Npb24nLFxuXG4gICAgZ2V0QXBwZWFyYW5jZTogJ21vYmlsZUdldEFwcGVhcmFuY2UnLFxuICAgIHNldEFwcGVhcmFuY2U6ICdtb2JpbGVTZXRBcHBlYXJhbmNlJyxcblxuICAgIHNpcmlDb21tYW5kOiAnbW9iaWxlU2lyaUNvbW1hbmQnLFxuXG4gICAgcHVzaEZpbGU6ICdtb2JpbGVQdXNoRmlsZScsXG4gICAgcHVsbEZpbGU6ICdtb2JpbGVQdWxsRmlsZScsXG4gICAgcHVsbEZvbGRlcjogJ21vYmlsZVB1bGxGb2xkZXInLFxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcbiAgICBkZWxldGVGb2xkZXI6ICdtb2JpbGVEZWxldGVGb2xkZXInLFxuXG4gICAgc3RhcnRBdWRpb1JlY29yZGluZzogJ3N0YXJ0QXVkaW9SZWNvcmRpbmcnLFxuICAgIHN0b3BBdWRpb1JlY29yZGluZzogJ3N0b3BBdWRpb1JlY29yZGluZycsXG5cbiAgICAvLyBYQ1Rlc3RcbiAgICBydW5YQ1Rlc3Q6ICdtb2JpbGVSdW5YQ1Rlc3QnLFxuICAgIGluc3RhbGxYQ1Rlc3RCdW5kbGU6ICdtb2JpbGVJbnN0YWxsWENUZXN0QnVuZGxlJyxcbiAgICBsaXN0WENUZXN0QnVuZGxlczogJ21vYmlsZUxpc3RYQ1Rlc3RCdW5kbGVzJyxcbiAgICBsaXN0WENUZXN0c0luVGVzdEJ1bmRsZTogJ21vYmlsZUxpc3RYQ1Rlc3RzSW5UZXN0QnVuZGxlJyxcblxuICAgIHB1c2hOb3RpZmljYXRpb246ICdtb2JpbGVQdXNoTm90aWZpY2F0aW9uJyxcbiAgICBleHBlY3ROb3RpZmljYXRpb246ICdtb2JpbGVFeHBlY3ROb3RpZmljYXRpb24nLFxuXG4gICAgcGVyZm9ybUlvSGlkRXZlbnQ6ICdtb2JpbGVQZXJmb3JtSW9IaWRFdmVudCcsXG5cbiAgICBjb25maWd1cmVMb2NhbGl6YXRpb246ICdtb2JpbGVDb25maWd1cmVMb2NhbGl6YXRpb24nLFxuXG4gICAgcmVzZXRMb2NhdGlvblNlcnZpY2U6ICdtb2JpbGVSZXNldExvY2F0aW9uU2VydmljZScsXG5cbiAgICBzdGFydFBjYXA6ICdtb2JpbGVTdGFydFBjYXAnLFxuICAgIHN0b3BQY2FwOiAnbW9iaWxlU3RvcFBjYXAnLFxuICAgIGxpc3RDb25kaXRpb25JbmR1Y2VyczogJ21vYmlsZUxpc3RDb25kaXRpb25JbmR1Y2VycycsXG4gICAgZW5hYmxlQ29uZGl0aW9uSW5kdWNlcjogJ21vYmlsZUVuYWJsZUNvbmRpdGlvbkluZHVjZXInLFxuICAgIGRpc2FibGVDb25kaXRpb25JbmR1Y2VyOiAnbW9iaWxlRGlzYWJsZUNvbmRpdGlvbkluZHVjZXInLFxuXG4gICAgdXBkYXRlU2FmYXJpUHJlZmVyZW5jZXM6ICdtb2JpbGVVcGRhdGVTYWZhcmlQcmVmZXJlbmNlcycsXG5cbiAgICBkZWVwTGluazogJ21vYmlsZURlZXBMaW5rJyxcblxuICAgIHNldFNpbXVsYXRlZExvY2F0aW9uOiAnbW9iaWxlU2V0U2ltdWxhdGVkTG9jYXRpb24nLFxuICAgIGdldFNpbXVsYXRlZExvY2F0aW9uOiAnbW9iaWxlR2V0U2ltdWxhdGVkTG9jYXRpb24nLFxuICAgIHJlc2V0U2ltdWxhdGVkTG9jYXRpb246ICdtb2JpbGVSZXNldFNpbXVsYXRlZExvY2F0aW9uJyxcbiAgfTtcblxuICBpZiAoIV8uaGFzKGNvbW1hbmRNYXAsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kICcke21vYmlsZUNvbW1hbmR9Jy4gT25seSAke18ua2V5cyhjb21tYW5kTWFwKS5qb2luKCcsICcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW2NvbW1hbmRNYXBbbW9iaWxlQ29tbWFuZF1dKG9wdHMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFHQSxJQUFBRSxRQUFBLEdBQUFGLE9BQUE7QUFFQSxNQUFNRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBRXJCQSxVQUFVLENBQUNDLG9CQUFvQixHQUFHLGVBQWVBLG9CQUFvQkEsQ0FBRUMsTUFBTSxFQUFFQyxLQUFLLEVBQUU7RUFDcEYsSUFBSSxDQUFDQyxHQUFHLENBQUNDLEtBQUssQ0FBRSw0QkFBMkJDLElBQUksQ0FBQ0MsU0FBUyxDQUFDSixLQUFLLENBQUUsRUFBQyxDQUFDO0VBQ25FLElBQUksQ0FBQ0ssYUFBSSxDQUFDQyxRQUFRLENBQUMsSUFBSSxDQUFDQyxZQUFZLENBQUMsRUFBRTtJQUNyQyxJQUFJLENBQUNOLEdBQUcsQ0FBQ08sSUFBSSxDQUFFLDBEQUF5RCxHQUNyRSxpQkFBZ0JMLElBQUksQ0FBQ0MsU0FBUyxDQUFDSixLQUFLLENBQUUsRUFBQyxDQUFDO0lBQzNDO0VBQ0Y7RUFFQSxJQUFJSyxhQUFJLENBQUNDLFFBQVEsQ0FBQ1AsTUFBTSxDQUFDLElBQUlBLE1BQU0sS0FB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
137
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX3N1cHBvcnQiLCJleHRlbnNpb25zIiwicmVjZWl2ZUFzeW5jUmVzcG9uc2UiLCJzdGF0dXMiLCJ2YWx1ZSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsInV0aWwiLCJoYXNWYWx1ZSIsImFzeW5jUHJvbWlzZSIsIndhcm4iLCJyZWplY3QiLCJlcnJvckZyb21Db2RlIiwibWVzc2FnZSIsIl8iLCJpc1N0cmluZyIsImVycm9yIiwiZXJyb3JGcm9tVzNDSnNvbkNvZGUiLCJzdGFja3RyYWNlIiwicmVzb2x2ZSIsImV4ZWN1dGUiLCJzY3JpcHQiLCJhcmdzIiwibWF0Y2giLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJpc0FycmF5IiwiaXNXZWJDb250ZXh0IiwiY29udmVydEVsZW1lbnRzRm9yQXRvbXMiLCJyZXN1bHQiLCJleGVjdXRlQXRvbSIsImNhY2hlV2ViRWxlbWVudHMiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiZXhlY3V0ZUFzeW5jIiwiYXN5bmNXYWl0TXMiLCJwcm9taXNlIiwicmVtb3RlIiwiZXhlY3V0ZUF0b21Bc3luYyIsImN1cldlYkZyYW1lcyIsIndhaXRGb3JBdG9tIiwibW9iaWxlQ29tbWFuZCIsIm9wdHMiLCJjb21tYW5kTWFwIiwidGFwIiwic2Nyb2xsIiwic2VsZWN0UGlja2VyV2hlZWxWYWx1ZSIsInN3aXBlIiwicGluY2giLCJkb3VibGVUYXAiLCJ0d29GaW5nZXJUYXAiLCJ0YXBXaXRoTnVtYmVyT2ZUYXBzIiwidG91Y2hBbmRIb2xkIiwiZHJhZ0Zyb21Ub0ZvckR1cmF0aW9uIiwicm90YXRlRWxlbWVudCIsImRyYWdGcm9tVG9XaXRoVmVsb2NpdHkiLCJmb3JjZVByZXNzIiwic2Nyb2xsVG9FbGVtZW50IiwiYWxlcnQiLCJzZXRQYXN0ZWJvYXJkIiwiZ2V0UGFzdGVib2FyZCIsInNvdXJjZSIsImdldENvbnRleHRzIiwiaW5zdGFsbEFwcCIsImlzQXBwSW5zdGFsbGVkIiwicmVtb3ZlQXBwIiwibGF1bmNoQXBwIiwidGVybWluYXRlQXBwIiwia2lsbEFwcCIsInF1ZXJ5QXBwU3RhdGUiLCJhY3RpdmF0ZUFwcCIsImxpc3RBcHBzIiwidmlld3BvcnRTY3JlZW5zaG90Iiwidmlld3BvcnRSZWN0Iiwic3RhcnRQZXJmUmVjb3JkIiwic3RvcFBlcmZSZWNvcmQiLCJpbnN0YWxsQ2VydGlmaWNhdGUiLCJyZW1vdmVDZXJ0aWZpY2F0ZSIsImxpc3RDZXJ0aWZpY2F0ZXMiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImJhdHRlcnlJbmZvIiwiZGV2aWNlSW5mbyIsImdldERldmljZVRpbWUiLCJhY3RpdmVBcHBJbmZvIiwiZGV2aWNlU2NyZWVuSW5mbyIsInByZXNzQnV0dG9uIiwiZW5yb2xsQmlvbWV0cmljIiwic2VuZEJpb21ldHJpY01hdGNoIiwiaXNCaW9tZXRyaWNFbnJvbGxlZCIsImNsZWFyS2V5Y2hhaW5zIiwiZ2V0UGVybWlzc2lvbiIsInNldFBlcm1pc3Npb24iLCJyZXNldFBlcm1pc3Npb24iLCJnZXRBcHBlYXJhbmNlIiwic2V0QXBwZWFyYW5jZSIsInNpcmlDb21tYW5kIiwicHVzaEZpbGUiLCJwdWxsRmlsZSIsInB1bGxGb2xkZXIiLCJkZWxldGVGaWxlIiwiZGVsZXRlRm9sZGVyIiwic3RhcnRBdWRpb1JlY29yZGluZyIsInN0b3BBdWRpb1JlY29yZGluZyIsInJ1blhDVGVzdCIsImluc3RhbGxYQ1Rlc3RCdW5kbGUiLCJsaXN0WENUZXN0QnVuZGxlcyIsImxpc3RYQ1Rlc3RzSW5UZXN0QnVuZGxlIiwicHVzaE5vdGlmaWNhdGlvbiIsImV4cGVjdE5vdGlmaWNhdGlvbiIsInBlcmZvcm1Jb0hpZEV2ZW50IiwiY29uZmlndXJlTG9jYWxpemF0aW9uIiwicmVzZXRMb2NhdGlvblNlcnZpY2UiLCJzdGFydFBjYXAiLCJzdG9wUGNhcCIsImxpc3RDb25kaXRpb25JbmR1Y2VycyIsImVuYWJsZUNvbmRpdGlvbkluZHVjZXIiLCJkaXNhYmxlQ29uZGl0aW9uSW5kdWNlciIsInVwZGF0ZVNhZmFyaVByZWZlcmVuY2VzIiwiZGVlcExpbmsiLCJzZXRTaW11bGF0ZWRMb2NhdGlvbiIsImdldFNpbXVsYXRlZExvY2F0aW9uIiwicmVzZXRTaW11bGF0ZWRMb2NhdGlvbiIsImhhcyIsIlVua25vd25Db21tYW5kRXJyb3IiLCJrZXlzIiwiam9pbiIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZXhlY3V0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBlcnJvckZyb21Db2RlLCBlcnJvckZyb21XM0NKc29uQ29kZVxufSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5cbmNvbnN0IGV4dGVuc2lvbnMgPSB7fTtcblxuZXh0ZW5zaW9ucy5yZWNlaXZlQXN5bmNSZXNwb25zZSA9IGFzeW5jIGZ1bmN0aW9uIHJlY2VpdmVBc3luY1Jlc3BvbnNlIChzdGF0dXMsIHZhbHVlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hd2FpdFxuICB0aGlzLmxvZy5kZWJ1ZyhgUmVjZWl2ZWQgYXN5bmMgcmVzcG9uc2U6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICBpZiAoIXV0aWwuaGFzVmFsdWUodGhpcy5hc3luY1Byb21pc2UpKSB7XG4gICAgdGhpcy5sb2cud2FybihgUmVjZWl2ZWQgYXN5bmMgcmVzcG9uc2Ugd2hlbiB3ZSB3ZXJlIG5vdCBleHBlY3Rpbmcgb25lISBgICtcbiAgICAgIGBSZXNwb25zZSB3YXM6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh1dGlsLmhhc1ZhbHVlKHN0YXR1cykgJiYgc3RhdHVzICE9PSAwKSB7XG4gICAgLy8gTUpTT05XUFxuICAgIHJldHVybiB0aGlzLmFzeW5jUHJvbWlzZS5yZWplY3QoZXJyb3JGcm9tQ29kZShzdGF0dXMsIHZhbHVlLm1lc3NhZ2UpKTtcbiAgfVxuICBpZiAoIXV0aWwuaGFzVmFsdWUoc3RhdHVzKSAmJiB2YWx1ZSAmJiBfLmlzU3RyaW5nKHZhbHVlLmVycm9yKSkge1xuICAgIC8vIFczQ1xuICAgIHJldHVybiB0aGlzLmFzeW5jUHJvbWlzZS5yZWplY3QoZXJyb3JGcm9tVzNDSnNvbkNvZGUodmFsdWUuZXJyb3IsIHZhbHVlLm1lc3NhZ2UsIHZhbHVlLnN0YWNrdHJhY2UpKTtcbiAgfVxuICByZXR1cm4gdGhpcy5hc3luY1Byb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGUgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlIChzY3JpcHQsIGFyZ3MpIHtcbiAgaWYgKHNjcmlwdC5tYXRjaCgvXm1vYmlsZTovKSkge1xuICAgIHNjcmlwdCA9IHNjcmlwdC5yZXBsYWNlKC9ebW9iaWxlOi8sICcnKS50cmltKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU1vYmlsZShzY3JpcHQsIF8uaXNBcnJheShhcmdzKSA/IGFyZ3NbMF0gOiBhcmdzKTtcbiAgfSBlbHNlIGlmICh0aGlzLmlzV2ViQ29udGV4dCgpKSB7XG4gICAgYXJncyA9IHRoaXMuY29udmVydEVsZW1lbnRzRm9yQXRvbXMoYXJncyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlQXRvbSgnZXhlY3V0ZV9zY3JpcHQnLCBbc2NyaXB0LCBhcmdzXSk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVXZWJFbGVtZW50cyhyZXN1bHQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVBc3luYyA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBc3luYyAoc2NyaXB0LCBhcmdzKSB7XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgYXJncyA9IHRoaXMuY29udmVydEVsZW1lbnRzRm9yQXRvbXMoYXJncyk7XG4gIHRoaXMuYXN5bmNXYWl0TXMgPSB0aGlzLmFzeW5jV2FpdE1zIHx8IDA7XG4gIGNvbnN0IHByb21pc2UgPSB0aGlzLnJlbW90ZS5leGVjdXRlQXRvbUFzeW5jKCdleGVjdXRlX2FzeW5jX3NjcmlwdCcsIFtcbiAgICBzY3JpcHQsIGFyZ3MsIHRoaXMuYXN5bmNXYWl0TXNcbiAgXSwgdGhpcy5jdXJXZWJGcmFtZXMpO1xuICByZXR1cm4gdGhpcy5jYWNoZVdlYkVsZW1lbnRzKGF3YWl0IHRoaXMud2FpdEZvckF0b20ocHJvbWlzZSkpO1xufTtcblxuZXh0ZW5zaW9ucy5leGVjdXRlTW9iaWxlID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU1vYmlsZSAobW9iaWxlQ29tbWFuZCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IGNvbW1hbmRNYXAgPSB7XG4gICAgLy9yZWdpb24gZ2VzdHVyZXMgc3VwcG9ydFxuICAgIHRhcDogJ21vYmlsZVRhcCcsXG4gICAgc2Nyb2xsOiAnbW9iaWxlU2Nyb2xsJyxcbiAgICBzZWxlY3RQaWNrZXJXaGVlbFZhbHVlOiAnbW9iaWxlU2VsZWN0UGlja2VyV2hlZWxWYWx1ZScsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2Njgtc3dpcGVsZWZ0P2xhbmd1YWdlPW9iamNcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY3NC1zd2lwZXJpZ2h0P2xhbmd1YWdlPW9iamNcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2Ny1zd2lwZXVwP2xhbmd1YWdlPW9iamNcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2NC1zd2lwZWRvd24/bGFuZ3VhZ2U9b2JqY1xuICAgIHN3aXBlOiAnbW9iaWxlU3dpcGUnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjY5LXBpbmNod2l0aHNjYWxlP2xhbmd1YWdlPW9iamNcbiAgICBwaW5jaDogJ21vYmlsZVBpbmNoJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY3My1kb3VibGV0YXA/bGFuZ3VhZ2U9b2JqY1xuICAgIGRvdWJsZVRhcDogJ21vYmlsZURvdWJsZVRhcCcsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NzUtdHdvZmluZ2VydGFwP2xhbmd1YWdlPW9iamNcbiAgICB0d29GaW5nZXJUYXA6ICdtb2JpbGVUd29GaW5nZXJUYXAnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjcxLXRhcHdpdGhudW1iZXJvZnRhcHM/bGFuZ3VhZ2U9b2JqY1xuICAgIHRhcFdpdGhOdW1iZXJPZlRhcHM6ICdtb2JpbGVUYXBXaXRoTnVtYmVyT2ZUYXBzJyxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWVsZW1lbnQvMTYxODY2My1wcmVzc2ZvcmR1cmF0aW9uP2xhbmd1YWdlPW9iamNcbiAgICB0b3VjaEFuZEhvbGQ6ICdtb2JpbGVUb3VjaEFuZEhvbGQnLFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpZWxlbWVudC8xNjE4NjcwLXByZXNzZm9yZHVyYXRpb24/bGFuZ3VhZ2U9b2JqY1xuICAgIGRyYWdGcm9tVG9Gb3JEdXJhdGlvbjogJ21vYmlsZURyYWdGcm9tVG9Gb3JEdXJhdGlvbicsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWllbGVtZW50LzE2MTg2NjUtcm90YXRlP2xhbmd1YWdlPW9iamNcbiAgICByb3RhdGVFbGVtZW50OiAnbW9iaWxlUm90YXRlRWxlbWVudCcsXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWljb29yZGluYXRlLzM1NTE2OTItcHJlc3Nmb3JkdXJhdGlvbj9sYW5ndWFnZT1vYmpjXG4gICAgZHJhZ0Zyb21Ub1dpdGhWZWxvY2l0eTogJ21vYmlsZURyYWdGcm9tVG9XaXRoVmVsb2NpdHknLFxuICAgIGZvcmNlUHJlc3M6ICdtb2JpbGVGb3JjZVByZXNzJyxcbiAgICBzY3JvbGxUb0VsZW1lbnQ6ICdtb2JpbGVTY3JvbGxUb0VsZW1lbnQnLFxuXG4gICAgLy9lbmRyZWdpb24gZ2VzdHVyZXMgc3VwcG9ydFxuICAgIGFsZXJ0OiAnbW9iaWxlSGFuZGxlQWxlcnQnLFxuXG4gICAgc2V0UGFzdGVib2FyZDogJ21vYmlsZVNldFBhc3RlYm9hcmQnLFxuICAgIGdldFBhc3RlYm9hcmQ6ICdtb2JpbGVHZXRQYXN0ZWJvYXJkJyxcblxuICAgIHNvdXJjZTogJ21vYmlsZUdldFNvdXJjZScsXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICAvL3JlZ2lvbiBtdWx0aXBsZSBhcHBzIG1hbmFnZW1lbnRcbiAgICBpbnN0YWxsQXBwOiAnbW9iaWxlSW5zdGFsbEFwcCcsXG4gICAgaXNBcHBJbnN0YWxsZWQ6ICdtb2JpbGVJc0FwcEluc3RhbGxlZCcsXG4gICAgcmVtb3ZlQXBwOiAnbW9iaWxlUmVtb3ZlQXBwJyxcbiAgICBsYXVuY2hBcHA6ICdtb2JpbGVMYXVuY2hBcHAnLFxuICAgIHRlcm1pbmF0ZUFwcDogJ21vYmlsZVRlcm1pbmF0ZUFwcCcsXG4gICAga2lsbEFwcDogJ21vYmlsZUtpbGxBcHAnLFxuICAgIHF1ZXJ5QXBwU3RhdGU6ICdtb2JpbGVRdWVyeUFwcFN0YXRlJyxcbiAgICBhY3RpdmF0ZUFwcDogJ21vYmlsZUFjdGl2YXRlQXBwJyxcbiAgICBsaXN0QXBwczogJ21vYmlsZUxpc3RBcHBzJyxcbiAgICAvL2VuZHJlZ2lvbiBtdWx0aXBsZSBhcHBzIG1hbmFnZW1lbnRcblxuICAgIHZpZXdwb3J0U2NyZWVuc2hvdDogJ2dldFZpZXdwb3J0U2NyZWVuc2hvdCcsXG4gICAgdmlld3BvcnRSZWN0OiAnZ2V0Vmlld3BvcnRSZWN0JyxcblxuICAgIHN0YXJ0UGVyZlJlY29yZDogJ21vYmlsZVN0YXJ0UGVyZlJlY29yZCcsXG4gICAgc3RvcFBlcmZSZWNvcmQ6ICdtb2JpbGVTdG9wUGVyZlJlY29yZCcsXG5cbiAgICBpbnN0YWxsQ2VydGlmaWNhdGU6ICdtb2JpbGVJbnN0YWxsQ2VydGlmaWNhdGUnLFxuICAgIHJlbW92ZUNlcnRpZmljYXRlOiAnbW9iaWxlUmVtb3ZlQ2VydGlmaWNhdGUnLFxuICAgIGxpc3RDZXJ0aWZpY2F0ZXM6ICdtb2JpbGVMaXN0Q2VydGlmaWNhdGVzJyxcblxuICAgIHN0YXJ0TG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCcsXG4gICAgc3RvcExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCcsXG5cbiAgICBiYXR0ZXJ5SW5mbzogJ21vYmlsZUdldEJhdHRlcnlJbmZvJyxcbiAgICBkZXZpY2VJbmZvOiAnbW9iaWxlR2V0RGV2aWNlSW5mbycsXG4gICAgZ2V0RGV2aWNlVGltZTogJ21vYmlsZUdldERldmljZVRpbWUnLFxuICAgIGFjdGl2ZUFwcEluZm86ICdtb2JpbGVHZXRBY3RpdmVBcHBJbmZvJyxcbiAgICBkZXZpY2VTY3JlZW5JbmZvOiAnZ2V0U2NyZWVuSW5mbycsXG5cbiAgICBwcmVzc0J1dHRvbjogJ21vYmlsZVByZXNzQnV0dG9uJyxcblxuICAgIGVucm9sbEJpb21ldHJpYzogJ21vYmlsZUVucm9sbEJpb21ldHJpYycsXG4gICAgc2VuZEJpb21ldHJpY01hdGNoOiAnbW9iaWxlU2VuZEJpb21ldHJpY01hdGNoJyxcbiAgICBpc0Jpb21ldHJpY0Vucm9sbGVkOiAnbW9iaWxlSXNCaW9tZXRyaWNFbnJvbGxlZCcsXG5cbiAgICBjbGVhcktleWNoYWluczogJ21vYmlsZUNsZWFyS2V5Y2hhaW5zJyxcblxuICAgIGdldFBlcm1pc3Npb246ICdtb2JpbGVHZXRQZXJtaXNzaW9uJyxcbiAgICBzZXRQZXJtaXNzaW9uOiAnbW9iaWxlU2V0UGVybWlzc2lvbnMnLFxuICAgIHJlc2V0UGVybWlzc2lvbjogJ21vYmlsZVJlc2V0UGVybWlzc2lvbicsXG5cbiAgICBnZXRBcHBlYXJhbmNlOiAnbW9iaWxlR2V0QXBwZWFyYW5jZScsXG4gICAgc2V0QXBwZWFyYW5jZTogJ21vYmlsZVNldEFwcGVhcmFuY2UnLFxuXG4gICAgc2lyaUNvbW1hbmQ6ICdtb2JpbGVTaXJpQ29tbWFuZCcsXG5cbiAgICBwdXNoRmlsZTogJ21vYmlsZVB1c2hGaWxlJyxcbiAgICBwdWxsRmlsZTogJ21vYmlsZVB1bGxGaWxlJyxcbiAgICBwdWxsRm9sZGVyOiAnbW9iaWxlUHVsbEZvbGRlcicsXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuICAgIGRlbGV0ZUZvbGRlcjogJ21vYmlsZURlbGV0ZUZvbGRlcicsXG5cbiAgICBzdGFydEF1ZGlvUmVjb3JkaW5nOiAnc3RhcnRBdWRpb1JlY29yZGluZycsXG4gICAgc3RvcEF1ZGlvUmVjb3JkaW5nOiAnc3RvcEF1ZGlvUmVjb3JkaW5nJyxcblxuICAgIC8vIFhDVGVzdFxuICAgIHJ1blhDVGVzdDogJ21vYmlsZVJ1blhDVGVzdCcsXG4gICAgaW5zdGFsbFhDVGVzdEJ1bmRsZTogJ21vYmlsZUluc3RhbGxYQ1Rlc3RCdW5kbGUnLFxuICAgIGxpc3RYQ1Rlc3RCdW5kbGVzOiAnbW9iaWxlTGlzdFhDVGVzdEJ1bmRsZXMnLFxuICAgIGxpc3RYQ1Rlc3RzSW5UZXN0QnVuZGxlOiAnbW9iaWxlTGlzdFhDVGVzdHNJblRlc3RCdW5kbGUnLFxuXG4gICAgcHVzaE5vdGlmaWNhdGlvbjogJ21vYmlsZVB1c2hOb3RpZmljYXRpb24nLFxuICAgIGV4cGVjdE5vdGlmaWNhdGlvbjogJ21vYmlsZUV4cGVjdE5vdGlmaWNhdGlvbicsXG5cbiAgICBwZXJmb3JtSW9IaWRFdmVudDogJ21vYmlsZVBlcmZvcm1Jb0hpZEV2ZW50JyxcblxuICAgIGNvbmZpZ3VyZUxvY2FsaXphdGlvbjogJ21vYmlsZUNvbmZpZ3VyZUxvY2FsaXphdGlvbicsXG5cbiAgICByZXNldExvY2F0aW9uU2VydmljZTogJ21vYmlsZVJlc2V0TG9jYXRpb25TZXJ2aWNlJyxcblxuICAgIHN0YXJ0UGNhcDogJ21vYmlsZVN0YXJ0UGNhcCcsXG4gICAgc3RvcFBjYXA6ICdtb2JpbGVTdG9wUGNhcCcsXG4gICAgbGlzdENvbmRpdGlvbkluZHVjZXJzOiAnbW9iaWxlTGlzdENvbmRpdGlvbkluZHVjZXJzJyxcbiAgICBlbmFibGVDb25kaXRpb25JbmR1Y2VyOiAnbW9iaWxlRW5hYmxlQ29uZGl0aW9uSW5kdWNlcicsXG4gICAgZGlzYWJsZUNvbmRpdGlvbkluZHVjZXI6ICdtb2JpbGVEaXNhYmxlQ29uZGl0aW9uSW5kdWNlcicsXG5cbiAgICB1cGRhdGVTYWZhcmlQcmVmZXJlbmNlczogJ21vYmlsZVVwZGF0ZVNhZmFyaVByZWZlcmVuY2VzJyxcblxuICAgIGRlZXBMaW5rOiAnbW9iaWxlRGVlcExpbmsnLFxuXG4gICAgc2V0U2ltdWxhdGVkTG9jYXRpb246ICdtb2JpbGVTZXRTaW11bGF0ZWRMb2NhdGlvbicsXG4gICAgZ2V0U2ltdWxhdGVkTG9jYXRpb246ICdtb2JpbGVHZXRTaW11bGF0ZWRMb2NhdGlvbicsXG4gICAgcmVzZXRTaW11bGF0ZWRMb2NhdGlvbjogJ21vYmlsZVJlc2V0U2ltdWxhdGVkTG9jYXRpb24nLFxuICB9O1xuXG4gIGlmICghXy5oYXMoY29tbWFuZE1hcCwgbW9iaWxlQ29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25Db21tYW5kRXJyb3IoYFVua25vd24gbW9iaWxlIGNvbW1hbmQgJyR7bW9iaWxlQ29tbWFuZH0nLiBPbmx5ICR7Xy5rZXlzKGNvbW1hbmRNYXApLmpvaW4oJywgJyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbY29tbWFuZE1hcFttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUdBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUVBLE1BQU1HLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckJBLFVBQVUsQ0FBQ0Msb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CQSxDQUFFQyxNQUFNLEVBQUVDLEtBQUssRUFBRTtFQUNwRixJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLDRCQUEyQkMsSUFBSSxDQUFDQyxTQUFTLENBQUNKLEtBQUssQ0FBRSxFQUFDLENBQUM7RUFDbkUsSUFBSSxDQUFDSyxhQUFJLENBQUNDLFFBQVEsQ0FBQyxJQUFJLENBQUNDLFlBQVksQ0FBQyxFQUFFO0lBQ3JDLElBQUksQ0FBQ04sR0FBRyxDQUFDTyxJQUFJLENBQUUsMERBQXlELEdBQ3JFLGlCQUFnQkwsSUFBSSxDQUFDQyxTQUFTLENBQUNKLEtBQUssQ0FBRSxFQUFDLENB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
@@ -1 +1 @@
1
- {"version":3,"file":"execute.js","names":["_lodash","_interopRequireDefault","require","_driver","_support","extensions","receiveAsyncResponse","status","value","log","debug","JSON","stringify","util","hasValue","asyncPromise","warn","reject","errorFromCode","message","_","isString","error","errorFromW3CJsonCode","stacktrace","resolve","execute","script","args","match","replace","trim","executeMobile","isArray","isWebContext","convertElementsForAtoms","result","executeAtom","cacheWebElements","errors","NotImplementedError","executeAsync","asyncWaitMs","promise","remote","executeAtomAsync","curWebFrames","waitForAtom","mobileCommand","opts","commandMap","tap","scroll","selectPickerWheelValue","swipe","pinch","doubleTap","twoFingerTap","tapWithNumberOfTaps","touchAndHold","dragFromToForDuration","rotateElement","dragFromToWithVelocity","forcePress","scrollToElement","alert","setPasteboard","getPasteboard","source","getContexts","installApp","isAppInstalled","removeApp","launchApp","terminateApp","killApp","queryAppState","activateApp","listApps","viewportScreenshot","viewportRect","startPerfRecord","stopPerfRecord","installCertificate","listCertificates","startLogsBroadcast","stopLogsBroadcast","batteryInfo","deviceInfo","getDeviceTime","activeAppInfo","deviceScreenInfo","pressButton","enrollBiometric","sendBiometricMatch","isBiometricEnrolled","clearKeychains","getPermission","setPermission","resetPermission","getAppearance","setAppearance","siriCommand","pushFile","pullFile","pullFolder","deleteFile","deleteFolder","startAudioRecording","stopAudioRecording","runXCTest","installXCTestBundle","listXCTestBundles","listXCTestsInTestBundle","pushNotification","expectNotification","performIoHidEvent","configureLocalization","resetLocationService","startPcap","stopPcap","listConditionInducers","enableConditionInducer","disableConditionInducer","updateSafariPreferences","deepLink","setSimulatedLocation","getSimulatedLocation","resetSimulatedLocation","has","UnknownCommandError","keys","join","_default","exports","default"],"sources":["../../../lib/commands/execute.js"],"sourcesContent":["import _ from 'lodash';\nimport {\n errors, errorFromCode, errorFromW3CJsonCode\n} from 'appium/driver';\nimport { util } from 'appium/support';\n\nconst extensions = {};\n\nextensions.receiveAsyncResponse = async function receiveAsyncResponse (status, value) { // eslint-disable-line require-await\n this.log.debug(`Received async response: ${JSON.stringify(value)}`);\n if (!util.hasValue(this.asyncPromise)) {\n this.log.warn(`Received async response when we were not expecting one! ` +\n `Response was: ${JSON.stringify(value)}`);\n return;\n }\n\n if (util.hasValue(status) && status !== 0) {\n // MJSONWP\n return this.asyncPromise.reject(errorFromCode(status, value.message));\n }\n if (!util.hasValue(status) && value && _.isString(value.error)) {\n // W3C\n return this.asyncPromise.reject(errorFromW3CJsonCode(value.error, value.message, value.stacktrace));\n }\n return this.asyncPromise.resolve(value);\n};\n\nextensions.execute = async function execute (script, args) {\n if (script.match(/^mobile:/)) {\n script = script.replace(/^mobile:/, '').trim();\n return await this.executeMobile(script, _.isArray(args) ? args[0] : args);\n } else if (this.isWebContext()) {\n args = this.convertElementsForAtoms(args);\n const result = await this.executeAtom('execute_script', [script, args]);\n return this.cacheWebElements(result);\n } else {\n throw new errors.NotImplementedError();\n }\n};\n\nextensions.executeAsync = async function executeAsync (script, args) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n args = this.convertElementsForAtoms(args);\n this.asyncWaitMs = this.asyncWaitMs || 0;\n const promise = this.remote.executeAtomAsync('execute_async_script', [\n script, args, this.asyncWaitMs\n ], this.curWebFrames);\n return this.cacheWebElements(await this.waitForAtom(promise));\n};\n\nextensions.executeMobile = async function executeMobile (mobileCommand, opts = {}) {\n const commandMap = {\n //region gestures support\n tap: 'mobileTap',\n scroll: 'mobileScroll',\n selectPickerWheelValue: 'mobileSelectPickerWheelValue',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618668-swipeleft?language=objc\n // https://developer.apple.com/documentation/xctest/xcuielement/1618674-swiperight?language=objc\n // https://developer.apple.com/documentation/xctest/xcuielement/1618667-swipeup?language=objc\n // https://developer.apple.com/documentation/xctest/xcuielement/1618664-swipedown?language=objc\n swipe: 'mobileSwipe',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618669-pinchwithscale?language=objc\n pinch: 'mobilePinch',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618673-doubletap?language=objc\n doubleTap: 'mobileDoubleTap',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618675-twofingertap?language=objc\n twoFingerTap: 'mobileTwoFingerTap',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618671-tapwithnumberoftaps?language=objc\n tapWithNumberOfTaps: 'mobileTapWithNumberOfTaps',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618663-pressforduration?language=objc\n touchAndHold: 'mobileTouchAndHold',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618670-pressforduration?language=objc\n dragFromToForDuration: 'mobileDragFromToForDuration',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618665-rotate?language=objc\n rotateElement: 'mobileRotateElement',\n // https://developer.apple.com/documentation/xctest/xcuicoordinate/3551692-pressforduration?language=objc\n dragFromToWithVelocity: 'mobileDragFromToWithVelocity',\n forcePress: 'mobileForcePress',\n scrollToElement: 'mobileScrollToElement',\n\n //endregion gestures support\n alert: 'mobileHandleAlert',\n\n setPasteboard: 'mobileSetPasteboard',\n getPasteboard: 'mobileGetPasteboard',\n\n source: 'mobileGetSource',\n getContexts: 'mobileGetContexts',\n\n //region multiple apps management\n installApp: 'mobileInstallApp',\n isAppInstalled: 'mobileIsAppInstalled',\n removeApp: 'mobileRemoveApp',\n launchApp: 'mobileLaunchApp',\n terminateApp: 'mobileTerminateApp',\n killApp: 'mobileKillApp',\n queryAppState: 'mobileQueryAppState',\n activateApp: 'mobileActivateApp',\n listApps: 'mobileListApps',\n //endregion multiple apps management\n\n viewportScreenshot: 'getViewportScreenshot',\n viewportRect: 'getViewportRect',\n\n startPerfRecord: 'mobileStartPerfRecord',\n stopPerfRecord: 'mobileStopPerfRecord',\n\n installCertificate: 'mobileInstallCertificate',\n listCertificates: 'mobileListCertificates',\n\n startLogsBroadcast: 'mobileStartLogsBroadcast',\n stopLogsBroadcast: 'mobileStopLogsBroadcast',\n\n batteryInfo: 'mobileGetBatteryInfo',\n deviceInfo: 'mobileGetDeviceInfo',\n getDeviceTime: 'mobileGetDeviceTime',\n activeAppInfo: 'mobileGetActiveAppInfo',\n deviceScreenInfo: 'getScreenInfo',\n\n pressButton: 'mobilePressButton',\n\n enrollBiometric: 'mobileEnrollBiometric',\n sendBiometricMatch: 'mobileSendBiometricMatch',\n isBiometricEnrolled: 'mobileIsBiometricEnrolled',\n\n clearKeychains: 'mobileClearKeychains',\n\n getPermission: 'mobileGetPermission',\n setPermission: 'mobileSetPermissions',\n resetPermission: 'mobileResetPermission',\n\n getAppearance: 'mobileGetAppearance',\n setAppearance: 'mobileSetAppearance',\n\n siriCommand: 'mobileSiriCommand',\n\n pushFile: 'mobilePushFile',\n pullFile: 'mobilePullFile',\n pullFolder: 'mobilePullFolder',\n deleteFile: 'mobileDeleteFile',\n deleteFolder: 'mobileDeleteFolder',\n\n startAudioRecording: 'startAudioRecording',\n stopAudioRecording: 'stopAudioRecording',\n\n // XCTest\n runXCTest: 'mobileRunXCTest',\n installXCTestBundle: 'mobileInstallXCTestBundle',\n listXCTestBundles: 'mobileListXCTestBundles',\n listXCTestsInTestBundle: 'mobileListXCTestsInTestBundle',\n\n pushNotification: 'mobilePushNotification',\n expectNotification: 'mobileExpectNotification',\n\n performIoHidEvent: 'mobilePerformIoHidEvent',\n\n configureLocalization: 'mobileConfigureLocalization',\n\n resetLocationService: 'mobileResetLocationService',\n\n startPcap: 'mobileStartPcap',\n stopPcap: 'mobileStopPcap',\n listConditionInducers: 'mobileListConditionInducers',\n enableConditionInducer: 'mobileEnableConditionInducer',\n disableConditionInducer: 'mobileDisableConditionInducer',\n\n updateSafariPreferences: 'mobileUpdateSafariPreferences',\n\n deepLink: 'mobileDeepLink',\n\n setSimulatedLocation: 'mobileSetSimulatedLocation',\n getSimulatedLocation: 'mobileGetSimulatedLocation',\n resetSimulatedLocation: 'mobileResetSimulatedLocation',\n };\n\n if (!_.has(commandMap, mobileCommand)) {\n throw new errors.UnknownCommandError(`Unknown mobile command '${mobileCommand}'. Only ${_.keys(commandMap).join(', ')} commands are supported.`);\n }\n return await this[commandMap[mobileCommand]](opts);\n};\n\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"execute.js","names":["_lodash","_interopRequireDefault","require","_driver","_support","extensions","receiveAsyncResponse","status","value","log","debug","JSON","stringify","util","hasValue","asyncPromise","warn","reject","errorFromCode","message","_","isString","error","errorFromW3CJsonCode","stacktrace","resolve","execute","script","args","match","replace","trim","executeMobile","isArray","isWebContext","convertElementsForAtoms","result","executeAtom","cacheWebElements","errors","NotImplementedError","executeAsync","asyncWaitMs","promise","remote","executeAtomAsync","curWebFrames","waitForAtom","mobileCommand","opts","commandMap","tap","scroll","selectPickerWheelValue","swipe","pinch","doubleTap","twoFingerTap","tapWithNumberOfTaps","touchAndHold","dragFromToForDuration","rotateElement","dragFromToWithVelocity","forcePress","scrollToElement","alert","setPasteboard","getPasteboard","source","getContexts","installApp","isAppInstalled","removeApp","launchApp","terminateApp","killApp","queryAppState","activateApp","listApps","viewportScreenshot","viewportRect","startPerfRecord","stopPerfRecord","installCertificate","removeCertificate","listCertificates","startLogsBroadcast","stopLogsBroadcast","batteryInfo","deviceInfo","getDeviceTime","activeAppInfo","deviceScreenInfo","pressButton","enrollBiometric","sendBiometricMatch","isBiometricEnrolled","clearKeychains","getPermission","setPermission","resetPermission","getAppearance","setAppearance","siriCommand","pushFile","pullFile","pullFolder","deleteFile","deleteFolder","startAudioRecording","stopAudioRecording","runXCTest","installXCTestBundle","listXCTestBundles","listXCTestsInTestBundle","pushNotification","expectNotification","performIoHidEvent","configureLocalization","resetLocationService","startPcap","stopPcap","listConditionInducers","enableConditionInducer","disableConditionInducer","updateSafariPreferences","deepLink","setSimulatedLocation","getSimulatedLocation","resetSimulatedLocation","has","UnknownCommandError","keys","join","_default","exports","default"],"sources":["../../../lib/commands/execute.js"],"sourcesContent":["import _ from 'lodash';\nimport {\n errors, errorFromCode, errorFromW3CJsonCode\n} from 'appium/driver';\nimport { util } from 'appium/support';\n\nconst extensions = {};\n\nextensions.receiveAsyncResponse = async function receiveAsyncResponse (status, value) { // eslint-disable-line require-await\n this.log.debug(`Received async response: ${JSON.stringify(value)}`);\n if (!util.hasValue(this.asyncPromise)) {\n this.log.warn(`Received async response when we were not expecting one! ` +\n `Response was: ${JSON.stringify(value)}`);\n return;\n }\n\n if (util.hasValue(status) && status !== 0) {\n // MJSONWP\n return this.asyncPromise.reject(errorFromCode(status, value.message));\n }\n if (!util.hasValue(status) && value && _.isString(value.error)) {\n // W3C\n return this.asyncPromise.reject(errorFromW3CJsonCode(value.error, value.message, value.stacktrace));\n }\n return this.asyncPromise.resolve(value);\n};\n\nextensions.execute = async function execute (script, args) {\n if (script.match(/^mobile:/)) {\n script = script.replace(/^mobile:/, '').trim();\n return await this.executeMobile(script, _.isArray(args) ? args[0] : args);\n } else if (this.isWebContext()) {\n args = this.convertElementsForAtoms(args);\n const result = await this.executeAtom('execute_script', [script, args]);\n return this.cacheWebElements(result);\n } else {\n throw new errors.NotImplementedError();\n }\n};\n\nextensions.executeAsync = async function executeAsync (script, args) {\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n\n args = this.convertElementsForAtoms(args);\n this.asyncWaitMs = this.asyncWaitMs || 0;\n const promise = this.remote.executeAtomAsync('execute_async_script', [\n script, args, this.asyncWaitMs\n ], this.curWebFrames);\n return this.cacheWebElements(await this.waitForAtom(promise));\n};\n\nextensions.executeMobile = async function executeMobile (mobileCommand, opts = {}) {\n const commandMap = {\n //region gestures support\n tap: 'mobileTap',\n scroll: 'mobileScroll',\n selectPickerWheelValue: 'mobileSelectPickerWheelValue',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618668-swipeleft?language=objc\n // https://developer.apple.com/documentation/xctest/xcuielement/1618674-swiperight?language=objc\n // https://developer.apple.com/documentation/xctest/xcuielement/1618667-swipeup?language=objc\n // https://developer.apple.com/documentation/xctest/xcuielement/1618664-swipedown?language=objc\n swipe: 'mobileSwipe',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618669-pinchwithscale?language=objc\n pinch: 'mobilePinch',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618673-doubletap?language=objc\n doubleTap: 'mobileDoubleTap',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618675-twofingertap?language=objc\n twoFingerTap: 'mobileTwoFingerTap',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618671-tapwithnumberoftaps?language=objc\n tapWithNumberOfTaps: 'mobileTapWithNumberOfTaps',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618663-pressforduration?language=objc\n touchAndHold: 'mobileTouchAndHold',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618670-pressforduration?language=objc\n dragFromToForDuration: 'mobileDragFromToForDuration',\n // https://developer.apple.com/documentation/xctest/xcuielement/1618665-rotate?language=objc\n rotateElement: 'mobileRotateElement',\n // https://developer.apple.com/documentation/xctest/xcuicoordinate/3551692-pressforduration?language=objc\n dragFromToWithVelocity: 'mobileDragFromToWithVelocity',\n forcePress: 'mobileForcePress',\n scrollToElement: 'mobileScrollToElement',\n\n //endregion gestures support\n alert: 'mobileHandleAlert',\n\n setPasteboard: 'mobileSetPasteboard',\n getPasteboard: 'mobileGetPasteboard',\n\n source: 'mobileGetSource',\n getContexts: 'mobileGetContexts',\n\n //region multiple apps management\n installApp: 'mobileInstallApp',\n isAppInstalled: 'mobileIsAppInstalled',\n removeApp: 'mobileRemoveApp',\n launchApp: 'mobileLaunchApp',\n terminateApp: 'mobileTerminateApp',\n killApp: 'mobileKillApp',\n queryAppState: 'mobileQueryAppState',\n activateApp: 'mobileActivateApp',\n listApps: 'mobileListApps',\n //endregion multiple apps management\n\n viewportScreenshot: 'getViewportScreenshot',\n viewportRect: 'getViewportRect',\n\n startPerfRecord: 'mobileStartPerfRecord',\n stopPerfRecord: 'mobileStopPerfRecord',\n\n installCertificate: 'mobileInstallCertificate',\n removeCertificate: 'mobileRemoveCertificate',\n listCertificates: 'mobileListCertificates',\n\n startLogsBroadcast: 'mobileStartLogsBroadcast',\n stopLogsBroadcast: 'mobileStopLogsBroadcast',\n\n batteryInfo: 'mobileGetBatteryInfo',\n deviceInfo: 'mobileGetDeviceInfo',\n getDeviceTime: 'mobileGetDeviceTime',\n activeAppInfo: 'mobileGetActiveAppInfo',\n deviceScreenInfo: 'getScreenInfo',\n\n pressButton: 'mobilePressButton',\n\n enrollBiometric: 'mobileEnrollBiometric',\n sendBiometricMatch: 'mobileSendBiometricMatch',\n isBiometricEnrolled: 'mobileIsBiometricEnrolled',\n\n clearKeychains: 'mobileClearKeychains',\n\n getPermission: 'mobileGetPermission',\n setPermission: 'mobileSetPermissions',\n resetPermission: 'mobileResetPermission',\n\n getAppearance: 'mobileGetAppearance',\n setAppearance: 'mobileSetAppearance',\n\n siriCommand: 'mobileSiriCommand',\n\n pushFile: 'mobilePushFile',\n pullFile: 'mobilePullFile',\n pullFolder: 'mobilePullFolder',\n deleteFile: 'mobileDeleteFile',\n deleteFolder: 'mobileDeleteFolder',\n\n startAudioRecording: 'startAudioRecording',\n stopAudioRecording: 'stopAudioRecording',\n\n // XCTest\n runXCTest: 'mobileRunXCTest',\n installXCTestBundle: 'mobileInstallXCTestBundle',\n listXCTestBundles: 'mobileListXCTestBundles',\n listXCTestsInTestBundle: 'mobileListXCTestsInTestBundle',\n\n pushNotification: 'mobilePushNotification',\n expectNotification: 'mobileExpectNotification',\n\n performIoHidEvent: 'mobilePerformIoHidEvent',\n\n configureLocalization: 'mobileConfigureLocalization',\n\n resetLocationService: 'mobileResetLocationService',\n\n startPcap: 'mobileStartPcap',\n stopPcap: 'mobileStopPcap',\n listConditionInducers: 'mobileListConditionInducers',\n enableConditionInducer: 'mobileEnableConditionInducer',\n disableConditionInducer: 'mobileDisableConditionInducer',\n\n updateSafariPreferences: 'mobileUpdateSafariPreferences',\n\n deepLink: 'mobileDeepLink',\n\n setSimulatedLocation: 'mobileSetSimulatedLocation',\n getSimulatedLocation: 'mobileGetSimulatedLocation',\n resetSimulatedLocation: 'mobileResetSimulatedLocation',\n };\n\n if (!_.has(commandMap, mobileCommand)) {\n throw new errors.UnknownCommandError(`Unknown mobile command '${mobileCommand}'. Only ${_.keys(commandMap).join(', ')} commands are supported.`);\n }\n return await this[commandMap[mobileCommand]](opts);\n};\n\nexport default extensions;\n"],"mappings":"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"}