appium-android-driver 5.4.2 → 5.4.4

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.
Files changed (67) hide show
  1. package/build/index.js +1 -9
  2. package/build/lib/android-helpers.js +10 -194
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +4 -45
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +3 -78
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/alert.js +3 -10
  9. package/build/lib/commands/alert.js.map +1 -1
  10. package/build/lib/commands/app-management.js +4 -32
  11. package/build/lib/commands/app-management.js.map +1 -1
  12. package/build/lib/commands/context.js +6 -78
  13. package/build/lib/commands/context.js.map +1 -1
  14. package/build/lib/commands/coverage.js +1 -6
  15. package/build/lib/commands/coverage.js.map +1 -1
  16. package/build/lib/commands/element.js +4 -47
  17. package/build/lib/commands/element.js.map +1 -1
  18. package/build/lib/commands/emu-console.js +2 -7
  19. package/build/lib/commands/emu-console.js.map +1 -1
  20. package/build/lib/commands/execute.js +1 -13
  21. package/build/lib/commands/execute.js.map +1 -1
  22. package/build/lib/commands/file-actions.js +3 -44
  23. package/build/lib/commands/file-actions.js.map +1 -1
  24. package/build/lib/commands/find.js +3 -16
  25. package/build/lib/commands/find.js.map +1 -1
  26. package/build/lib/commands/general.js +4 -78
  27. package/build/lib/commands/general.js.map +1 -1
  28. package/build/lib/commands/ime.js +3 -14
  29. package/build/lib/commands/ime.js.map +1 -1
  30. package/build/lib/commands/index.js +3 -27
  31. package/build/lib/commands/index.js.map +1 -1
  32. package/build/lib/commands/intent.js +1 -40
  33. package/build/lib/commands/intent.js.map +1 -1
  34. package/build/lib/commands/log.js +3 -35
  35. package/build/lib/commands/log.js.map +1 -1
  36. package/build/lib/commands/media-projection.js +2 -47
  37. package/build/lib/commands/media-projection.js.map +1 -1
  38. package/build/lib/commands/network.js +4 -40
  39. package/build/lib/commands/network.js.map +1 -1
  40. package/build/lib/commands/performance.js +5 -57
  41. package/build/lib/commands/performance.js.map +1 -1
  42. package/build/lib/commands/recordscreen.js +1 -59
  43. package/build/lib/commands/recordscreen.js.map +1 -1
  44. package/build/lib/commands/shell.js +1 -15
  45. package/build/lib/commands/shell.js.map +1 -1
  46. package/build/lib/commands/streamscreen.js +7 -74
  47. package/build/lib/commands/streamscreen.js.map +1 -1
  48. package/build/lib/commands/system-bars.js +1 -23
  49. package/build/lib/commands/system-bars.js.map +1 -1
  50. package/build/lib/commands/touch.js +13 -79
  51. package/build/lib/commands/touch.js.map +1 -1
  52. package/build/lib/desired-caps.js +3 -4
  53. package/build/lib/desired-caps.js.map +1 -1
  54. package/build/lib/driver.js +8 -97
  55. package/build/lib/driver.js.map +1 -1
  56. package/build/lib/logger.js +1 -5
  57. package/build/lib/logger.js.map +1 -1
  58. package/build/lib/uiautomator.js +3 -24
  59. package/build/lib/uiautomator.js.map +1 -1
  60. package/build/lib/unlock-helpers.js +1 -61
  61. package/build/lib/unlock-helpers.js.map +1 -1
  62. package/build/lib/utils.js +1 -7
  63. package/build/lib/utils.js.map +1 -1
  64. package/build/lib/webview-helpers.js +1 -94
  65. package/build/lib/webview-helpers.js.map +1 -1
  66. package/lib/android-helpers.js +2 -1
  67. package/package.json +2 -2
@@ -1,26 +1,18 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = exports.commands = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _teen_process = require("teen_process");
15
-
16
11
  var _support = require("appium/support");
17
-
18
12
  var _driver = require("appium/driver");
19
-
20
13
  const ADB_SHELL_FEATURE = 'adb_shell';
21
14
  let commands = {};
22
15
  exports.commands = commands;
23
-
24
16
  commands.mobileShell = async function mobileShell(opts = {}) {
25
17
  this.ensureFeatureEnabled(ADB_SHELL_FEATURE);
26
18
  const {
@@ -29,14 +21,11 @@ commands.mobileShell = async function mobileShell(opts = {}) {
29
21
  timeout = 20000,
30
22
  includeStderr
31
23
  } = opts;
32
-
33
24
  if (!_lodash.default.isString(command)) {
34
25
  throw new _driver.errors.InvalidArgumentError(`The 'command' argument is mandatory`);
35
26
  }
36
-
37
27
  const adbArgs = [...this.adb.executable.defaultArgs, 'shell', command, ...(_lodash.default.isArray(args) ? args : [args])];
38
28
  this.log.debug(`Running '${this.adb.executable.path} ${_support.util.quote(adbArgs)}'`);
39
-
40
29
  try {
41
30
  const {
42
31
  stdout,
@@ -44,20 +33,17 @@ commands.mobileShell = async function mobileShell(opts = {}) {
44
33
  } = await (0, _teen_process.exec)(this.adb.executable.path, adbArgs, {
45
34
  timeout
46
35
  });
47
-
48
36
  if (includeStderr) {
49
37
  return {
50
38
  stdout,
51
39
  stderr
52
40
  };
53
41
  }
54
-
55
42
  return stdout;
56
43
  } catch (err) {
57
44
  this.log.errorAndThrow(`Cannot execute the '${command}' shell command. ` + `Original error: ${err.message}. ` + `StdOut: ${err.stdout}. StdErr: ${err.stderr}`);
58
45
  }
59
46
  };
60
-
61
47
  var _default = commands;
62
48
  exports.default = _default;
63
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBREJfU0hFTExfRkVBVFVSRSIsImNvbW1hbmRzIiwibW9iaWxlU2hlbGwiLCJvcHRzIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJjb21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJpbmNsdWRlU3RkZXJyIiwiXyIsImlzU3RyaW5nIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJhZGJBcmdzIiwiYWRiIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiaXNBcnJheSIsImxvZyIsImRlYnVnIiwicGF0aCIsInV0aWwiLCJxdW90ZSIsInN0ZG91dCIsInN0ZGVyciIsImV4ZWMiLCJlcnIiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zaGVsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEFEQl9TSEVMTF9GRUFUVVJFID0gJ2FkYl9zaGVsbCc7XG5cbmxldCBjb21tYW5kcyA9IHt9O1xuXG5jb21tYW5kcy5tb2JpbGVTaGVsbCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNoZWxsIChvcHRzID0ge30pIHtcbiAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChBREJfU0hFTExfRkVBVFVSRSk7XG5cbiAgY29uc3Qge1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyA9IFtdLFxuICAgIHRpbWVvdXQgPSAyMDAwMCxcbiAgICBpbmNsdWRlU3RkZXJyLFxuICB9ID0gb3B0cztcblxuICBpZiAoIV8uaXNTdHJpbmcoY29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ2NvbW1hbmQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG5cbiAgY29uc3QgYWRiQXJncyA9IFtcbiAgICAuLi50aGlzLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgY29tbWFuZCxcbiAgICAuLi4oXy5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXSlcbiAgXTtcbiAgdGhpcy5sb2cuZGVidWcoYFJ1bm5pbmcgJyR7dGhpcy5hZGIuZXhlY3V0YWJsZS5wYXRofSAke3V0aWwucXVvdGUoYWRiQXJncyl9J2ApO1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCBleGVjKHRoaXMuYWRiLmV4ZWN1dGFibGUucGF0aCwgYWRiQXJncywge3RpbWVvdXR9KTtcbiAgICBpZiAoaW5jbHVkZVN0ZGVycikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3Rkb3V0LFxuICAgICAgICBzdGRlcnJcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBleGVjdXRlIHRoZSAnJHtjb21tYW5kfScgc2hlbGwgY29tbWFuZC4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9LiBgICtcbiAgICAgIGBTdGRPdXQ6ICR7ZXJyLnN0ZG91dH0uIFN0ZEVycjogJHtlcnIuc3RkZXJyfWApO1xuICB9XG59O1xuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsV0FBMUI7QUFFQSxJQUFJQyxRQUFRLEdBQUcsRUFBZjs7O0FBRUFBLFFBQVEsQ0FBQ0MsV0FBVCxHQUF1QixlQUFlQSxXQUFmLENBQTRCQyxJQUFJLEdBQUcsRUFBbkMsRUFBdUM7RUFDNUQsS0FBS0Msb0JBQUwsQ0FBMEJKLGlCQUExQjtFQUVBLE1BQU07SUFDSkssT0FESTtJQUVKQyxJQUFJLEdBQUcsRUFGSDtJQUdKQyxPQUFPLEdBQUcsS0FITjtJQUlKQztFQUpJLElBS0ZMLElBTEo7O0VBT0EsSUFBSSxDQUFDTSxlQUFBLENBQUVDLFFBQUYsQ0FBV0wsT0FBWCxDQUFMLEVBQTBCO0lBQ3hCLE1BQU0sSUFBSU0sY0FBQSxDQUFPQyxvQkFBWCxDQUFpQyxxQ0FBakMsQ0FBTjtFQUNEOztFQUVELE1BQU1DLE9BQU8sR0FBRyxDQUNkLEdBQUcsS0FBS0MsR0FBTCxDQUFTQyxVQUFULENBQW9CQyxXQURULEVBRWQsT0FGYyxFQUdkWCxPQUhjLEVBSWQsSUFBSUksZUFBQSxDQUFFUSxPQUFGLENBQVVYLElBQVYsSUFBa0JBLElBQWxCLEdBQXlCLENBQUNBLElBQUQsQ0FBN0IsQ0FKYyxDQUFoQjtFQU1BLEtBQUtZLEdBQUwsQ0FBU0MsS0FBVCxDQUFnQixZQUFXLEtBQUtMLEdBQUwsQ0FBU0MsVUFBVCxDQUFvQkssSUFBSyxJQUFHQyxhQUFBLENBQUtDLEtBQUwsQ0FBV1QsT0FBWCxDQUFvQixHQUEzRTs7RUFDQSxJQUFJO0lBQ0YsTUFBTTtNQUFDVSxNQUFEO01BQVNDO0lBQVQsSUFBbUIsTUFBTSxJQUFBQyxrQkFBQSxFQUFLLEtBQUtYLEdBQUwsQ0FBU0MsVUFBVCxDQUFvQkssSUFBekIsRUFBK0JQLE9BQS9CLEVBQXdDO01BQUNOO0lBQUQsQ0FBeEMsQ0FBL0I7O0lBQ0EsSUFBSUMsYUFBSixFQUFtQjtNQUNqQixPQUFPO1FBQ0xlLE1BREs7UUFFTEM7TUFGSyxDQUFQO0lBSUQ7O0lBQ0QsT0FBT0QsTUFBUDtFQUNELENBVEQsQ0FTRSxPQUFPRyxHQUFQLEVBQVk7SUFDWixLQUFLUixHQUFMLENBQVNTLGFBQVQsQ0FBd0IsdUJBQXNCdEIsT0FBUSxtQkFBL0IsR0FDcEIsbUJBQWtCcUIsR0FBRyxDQUFDRSxPQUFRLElBRFYsR0FFcEIsV0FBVUYsR0FBRyxDQUFDSCxNQUFPLGFBQVlHLEdBQUcsQ0FBQ0YsTUFBTyxFQUYvQztFQUdEO0FBQ0YsQ0FuQ0Q7O2VBc0NldkIsUSJ9
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBREJfU0hFTExfRkVBVFVSRSIsImNvbW1hbmRzIiwibW9iaWxlU2hlbGwiLCJvcHRzIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJjb21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJpbmNsdWRlU3RkZXJyIiwiXyIsImlzU3RyaW5nIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJhZGJBcmdzIiwiYWRiIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiaXNBcnJheSIsImxvZyIsImRlYnVnIiwicGF0aCIsInV0aWwiLCJxdW90ZSIsInN0ZG91dCIsInN0ZGVyciIsImV4ZWMiLCJlcnIiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zaGVsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEFEQl9TSEVMTF9GRUFUVVJFID0gJ2FkYl9zaGVsbCc7XG5cbmxldCBjb21tYW5kcyA9IHt9O1xuXG5jb21tYW5kcy5tb2JpbGVTaGVsbCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVNoZWxsIChvcHRzID0ge30pIHtcbiAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChBREJfU0hFTExfRkVBVFVSRSk7XG5cbiAgY29uc3Qge1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyA9IFtdLFxuICAgIHRpbWVvdXQgPSAyMDAwMCxcbiAgICBpbmNsdWRlU3RkZXJyLFxuICB9ID0gb3B0cztcblxuICBpZiAoIV8uaXNTdHJpbmcoY29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ2NvbW1hbmQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG5cbiAgY29uc3QgYWRiQXJncyA9IFtcbiAgICAuLi50aGlzLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgY29tbWFuZCxcbiAgICAuLi4oXy5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXSlcbiAgXTtcbiAgdGhpcy5sb2cuZGVidWcoYFJ1bm5pbmcgJyR7dGhpcy5hZGIuZXhlY3V0YWJsZS5wYXRofSAke3V0aWwucXVvdGUoYWRiQXJncyl9J2ApO1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCBleGVjKHRoaXMuYWRiLmV4ZWN1dGFibGUucGF0aCwgYWRiQXJncywge3RpbWVvdXR9KTtcbiAgICBpZiAoaW5jbHVkZVN0ZGVycikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3Rkb3V0LFxuICAgICAgICBzdGRlcnJcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBleGVjdXRlIHRoZSAnJHtjb21tYW5kfScgc2hlbGwgY29tbWFuZC4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9LiBgICtcbiAgICAgIGBTdGRPdXQ6ICR7ZXJyLnN0ZG91dH0uIFN0ZEVycjogJHtlcnIuc3RkZXJyfWApO1xuICB9XG59O1xuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxXQUFXO0FBRXJDLElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFBQztBQUVsQkEsUUFBUSxDQUFDQyxXQUFXLEdBQUcsZUFBZUEsV0FBVyxDQUFFQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDNUQsSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQ0osaUJBQWlCLENBQUM7RUFFNUMsTUFBTTtJQUNKSyxPQUFPO0lBQ1BDLElBQUksR0FBRyxFQUFFO0lBQ1RDLE9BQU8sR0FBRyxLQUFLO0lBQ2ZDO0VBQ0YsQ0FBQyxHQUFHTCxJQUFJO0VBRVIsSUFBSSxDQUFDTSxlQUFDLENBQUNDLFFBQVEsQ0FBQ0wsT0FBTyxDQUFDLEVBQUU7SUFDeEIsTUFBTSxJQUFJTSxjQUFNLENBQUNDLG9CQUFvQixDQUFFLHFDQUFvQyxDQUFDO0VBQzlFO0VBRUEsTUFBTUMsT0FBTyxHQUFHLENBQ2QsR0FBRyxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsVUFBVSxDQUFDQyxXQUFXLEVBQ2xDLE9BQU8sRUFDUFgsT0FBTyxFQUNQLElBQUlJLGVBQUMsQ0FBQ1EsT0FBTyxDQUFDWCxJQUFJLENBQUMsR0FBR0EsSUFBSSxHQUFHLENBQUNBLElBQUksQ0FBQyxDQUFDLENBQ3JDO0VBQ0QsSUFBSSxDQUFDWSxHQUFHLENBQUNDLEtBQUssQ0FBRSxZQUFXLElBQUksQ0FBQ0wsR0FBRyxDQUFDQyxVQUFVLENBQUNLLElBQUssSUFBR0MsYUFBSSxDQUFDQyxLQUFLLENBQUNULE9BQU8sQ0FBRSxHQUFFLENBQUM7RUFDOUUsSUFBSTtJQUNGLE1BQU07TUFBQ1UsTUFBTTtNQUFFQztJQUFNLENBQUMsR0FBRyxNQUFNLElBQUFDLGtCQUFJLEVBQUMsSUFBSSxDQUFDWCxHQUFHLENBQUNDLFVBQVUsQ0FBQ0ssSUFBSSxFQUFFUCxPQUFPLEVBQUU7TUFBQ047SUFBTyxDQUFDLENBQUM7SUFDakYsSUFBSUMsYUFBYSxFQUFFO01BQ2pCLE9BQU87UUFDTGUsTUFBTTtRQUNOQztNQUNGLENBQUM7SUFDSDtJQUNBLE9BQU9ELE1BQU07RUFDZixDQUFDLENBQUMsT0FBT0csR0FBRyxFQUFFO0lBQ1osSUFBSSxDQUFDUixHQUFHLENBQUNTLGFBQWEsQ0FBRSx1QkFBc0J0QixPQUFRLG1CQUFrQixHQUNyRSxtQkFBa0JxQixHQUFHLENBQUNFLE9BQVEsSUFBRyxHQUNqQyxXQUFVRixHQUFHLENBQUNILE1BQU8sYUFBWUcsR0FBRyxDQUFDRixNQUFPLEVBQUMsQ0FBQztFQUNuRDtBQUNGLENBQUM7QUFBQyxlQUdhdkIsUUFBUTtBQUFBIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","names":["ADB_SHELL_FEATURE","commands","mobileShell","opts","ensureFeatureEnabled","command","args","timeout","includeStderr","_","isString","errors","InvalidArgumentError","adbArgs","adb","executable","defaultArgs","isArray","log","debug","path","util","quote","stdout","stderr","exec","err","errorAndThrow","message"],"sources":["../../../lib/commands/shell.js"],"sourcesContent":["import _ from 'lodash';\nimport { exec } from 'teen_process';\nimport { util } from 'appium/support';\nimport { errors } from 'appium/driver';\n\nconst ADB_SHELL_FEATURE = 'adb_shell';\n\nlet commands = {};\n\ncommands.mobileShell = async function mobileShell (opts = {}) {\n this.ensureFeatureEnabled(ADB_SHELL_FEATURE);\n\n const {\n command,\n args = [],\n timeout = 20000,\n includeStderr,\n } = opts;\n\n if (!_.isString(command)) {\n throw new errors.InvalidArgumentError(`The 'command' argument is mandatory`);\n }\n\n const adbArgs = [\n ...this.adb.executable.defaultArgs,\n 'shell',\n command,\n ...(_.isArray(args) ? args : [args])\n ];\n this.log.debug(`Running '${this.adb.executable.path} ${util.quote(adbArgs)}'`);\n try {\n const {stdout, stderr} = await exec(this.adb.executable.path, adbArgs, {timeout});\n if (includeStderr) {\n return {\n stdout,\n stderr\n };\n }\n return stdout;\n } catch (err) {\n this.log.errorAndThrow(`Cannot execute the '${command}' shell command. ` +\n `Original error: ${err.message}. ` +\n `StdOut: ${err.stdout}. StdErr: ${err.stderr}`);\n }\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA,MAAMA,iBAAiB,GAAG,WAA1B;AAEA,IAAIC,QAAQ,GAAG,EAAf;;;AAEAA,QAAQ,CAACC,WAAT,GAAuB,eAAeA,WAAf,CAA4BC,IAAI,GAAG,EAAnC,EAAuC;EAC5D,KAAKC,oBAAL,CAA0BJ,iBAA1B;EAEA,MAAM;IACJK,OADI;IAEJC,IAAI,GAAG,EAFH;IAGJC,OAAO,GAAG,KAHN;IAIJC;EAJI,IAKFL,IALJ;;EAOA,IAAI,CAACM,eAAA,CAAEC,QAAF,CAAWL,OAAX,CAAL,EAA0B;IACxB,MAAM,IAAIM,cAAA,CAAOC,oBAAX,CAAiC,qCAAjC,CAAN;EACD;;EAED,MAAMC,OAAO,GAAG,CACd,GAAG,KAAKC,GAAL,CAASC,UAAT,CAAoBC,WADT,EAEd,OAFc,EAGdX,OAHc,EAId,IAAII,eAAA,CAAEQ,OAAF,CAAUX,IAAV,IAAkBA,IAAlB,GAAyB,CAACA,IAAD,CAA7B,CAJc,CAAhB;EAMA,KAAKY,GAAL,CAASC,KAAT,CAAgB,YAAW,KAAKL,GAAL,CAASC,UAAT,CAAoBK,IAAK,IAAGC,aAAA,CAAKC,KAAL,CAAWT,OAAX,CAAoB,GAA3E;;EACA,IAAI;IACF,MAAM;MAACU,MAAD;MAASC;IAAT,IAAmB,MAAM,IAAAC,kBAAA,EAAK,KAAKX,GAAL,CAASC,UAAT,CAAoBK,IAAzB,EAA+BP,OAA/B,EAAwC;MAACN;IAAD,CAAxC,CAA/B;;IACA,IAAIC,aAAJ,EAAmB;MACjB,OAAO;QACLe,MADK;QAELC;MAFK,CAAP;IAID;;IACD,OAAOD,MAAP;EACD,CATD,CASE,OAAOG,GAAP,EAAY;IACZ,KAAKR,GAAL,CAASS,aAAT,CAAwB,uBAAsBtB,OAAQ,mBAA/B,GACpB,mBAAkBqB,GAAG,CAACE,OAAQ,IADV,GAEpB,WAAUF,GAAG,CAACH,MAAO,aAAYG,GAAG,CAACF,MAAO,EAF/C;EAGD;AACF,CAnCD;;eAsCevB,Q"}
1
+ {"version":3,"file":"shell.js","names":["ADB_SHELL_FEATURE","commands","mobileShell","opts","ensureFeatureEnabled","command","args","timeout","includeStderr","_","isString","errors","InvalidArgumentError","adbArgs","adb","executable","defaultArgs","isArray","log","debug","path","util","quote","stdout","stderr","exec","err","errorAndThrow","message"],"sources":["../../../lib/commands/shell.js"],"sourcesContent":["import _ from 'lodash';\nimport { exec } from 'teen_process';\nimport { util } from 'appium/support';\nimport { errors } from 'appium/driver';\n\nconst ADB_SHELL_FEATURE = 'adb_shell';\n\nlet commands = {};\n\ncommands.mobileShell = async function mobileShell (opts = {}) {\n this.ensureFeatureEnabled(ADB_SHELL_FEATURE);\n\n const {\n command,\n args = [],\n timeout = 20000,\n includeStderr,\n } = opts;\n\n if (!_.isString(command)) {\n throw new errors.InvalidArgumentError(`The 'command' argument is mandatory`);\n }\n\n const adbArgs = [\n ...this.adb.executable.defaultArgs,\n 'shell',\n command,\n ...(_.isArray(args) ? args : [args])\n ];\n this.log.debug(`Running '${this.adb.executable.path} ${util.quote(adbArgs)}'`);\n try {\n const {stdout, stderr} = await exec(this.adb.executable.path, adbArgs, {timeout});\n if (includeStderr) {\n return {\n stdout,\n stderr\n };\n }\n return stdout;\n } catch (err) {\n this.log.errorAndThrow(`Cannot execute the '${command}' shell command. ` +\n `Original error: ${err.message}. ` +\n `StdOut: ${err.stdout}. StdErr: ${err.stderr}`);\n }\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AAEA,MAAMA,iBAAiB,GAAG,WAAW;AAErC,IAAIC,QAAQ,GAAG,CAAC,CAAC;AAAC;AAElBA,QAAQ,CAACC,WAAW,GAAG,eAAeA,WAAW,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAC5D,IAAI,CAACC,oBAAoB,CAACJ,iBAAiB,CAAC;EAE5C,MAAM;IACJK,OAAO;IACPC,IAAI,GAAG,EAAE;IACTC,OAAO,GAAG,KAAK;IACfC;EACF,CAAC,GAAGL,IAAI;EAER,IAAI,CAACM,eAAC,CAACC,QAAQ,CAACL,OAAO,CAAC,EAAE;IACxB,MAAM,IAAIM,cAAM,CAACC,oBAAoB,CAAE,qCAAoC,CAAC;EAC9E;EAEA,MAAMC,OAAO,GAAG,CACd,GAAG,IAAI,CAACC,GAAG,CAACC,UAAU,CAACC,WAAW,EAClC,OAAO,EACPX,OAAO,EACP,IAAII,eAAC,CAACQ,OAAO,CAACX,IAAI,CAAC,GAAGA,IAAI,GAAG,CAACA,IAAI,CAAC,CAAC,CACrC;EACD,IAAI,CAACY,GAAG,CAACC,KAAK,CAAE,YAAW,IAAI,CAACL,GAAG,CAACC,UAAU,CAACK,IAAK,IAAGC,aAAI,CAACC,KAAK,CAACT,OAAO,CAAE,GAAE,CAAC;EAC9E,IAAI;IACF,MAAM;MAACU,MAAM;MAAEC;IAAM,CAAC,GAAG,MAAM,IAAAC,kBAAI,EAAC,IAAI,CAACX,GAAG,CAACC,UAAU,CAACK,IAAI,EAAEP,OAAO,EAAE;MAACN;IAAO,CAAC,CAAC;IACjF,IAAIC,aAAa,EAAE;MACjB,OAAO;QACLe,MAAM;QACNC;MACF,CAAC;IACH;IACA,OAAOD,MAAM;EACf,CAAC,CAAC,OAAOG,GAAG,EAAE;IACZ,IAAI,CAACR,GAAG,CAACS,aAAa,CAAE,uBAAsBtB,OAAQ,mBAAkB,GACrE,mBAAkBqB,GAAG,CAACE,OAAQ,IAAG,GACjC,WAAUF,GAAG,CAACH,MAAO,aAAYG,GAAG,CAACF,MAAO,EAAC,CAAC;EACnD;AACF,CAAC;AAAC,eAGavB,QAAQ;AAAA"}
@@ -1,34 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = void 0;
9
-
10
8
  require("source-map-support/register");
11
-
12
9
  var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
10
  var _support = require("appium/support");
15
-
16
11
  var _teen_process = require("teen_process");
17
-
18
12
  var _portscanner = require("portscanner");
19
-
20
13
  var _http = _interopRequireDefault(require("http"));
21
-
22
14
  var _net = _interopRequireDefault(require("net"));
23
-
24
15
  var _bluebird = _interopRequireDefault(require("bluebird"));
25
-
26
16
  var _asyncbox = require("asyncbox");
27
-
28
17
  var _child_process = require("child_process");
29
-
30
18
  var _url = _interopRequireDefault(require("url"));
31
-
32
19
  const commands = {};
33
20
  const RECORDING_INTERVAL_SEC = 5;
34
21
  const STREAMING_STARTUP_TIMEOUT_MS = 5000;
@@ -50,21 +37,17 @@ const DEFAULT_QUALITY = 70;
50
37
  const DEFAULT_BITRATE = 4000000;
51
38
  const BOUNDARY_STRING = '--2ae9746887f170b8cf7c271047ce314c';
52
39
  const ADB_SCREEN_STREAMING_FEATURE = 'adb_screen_streaming';
53
-
54
40
  function createStreamingLogger(streamName, udid) {
55
41
  return _support.logger.getLogger(`${streamName}@` + _lodash.default.truncate(udid, {
56
42
  length: 8,
57
43
  omission: ''
58
44
  }));
59
45
  }
60
-
61
46
  async function verifyStreamingRequirements(adb) {
62
47
  if (!_lodash.default.trim(await adb.shell(['which', SCREENRECORD_BINARY]))) {
63
48
  throw new Error(`The required '${SCREENRECORD_BINARY}' binary is not available on the device under test`);
64
49
  }
65
-
66
50
  const gstreamerCheckPromises = [];
67
-
68
51
  for (const binaryName of [GSTREAMER_BINARY, GST_INSPECT_BINARY]) {
69
52
  gstreamerCheckPromises.push((async () => {
70
53
  try {
@@ -74,44 +57,34 @@ async function verifyStreamingRequirements(adb) {
74
57
  }
75
58
  })());
76
59
  }
77
-
78
60
  await _bluebird.default.all(gstreamerCheckPromises);
79
61
  const moduleCheckPromises = [];
80
-
81
62
  for (const [name, modName] of _lodash.default.toPairs(REQUIRED_GST_PLUGINS)) {
82
63
  moduleCheckPromises.push((async () => {
83
64
  const {
84
65
  stdout
85
66
  } = await (0, _teen_process.exec)(GST_INSPECT_BINARY, [name]);
86
-
87
67
  if (!_lodash.default.includes(stdout, modName)) {
88
68
  throw new Error(`The required GStreamer plugin '${name}' from '${modName}' module is not installed. ` + `See ${GST_TUTORIAL_URL} for more details on how to install it.`);
89
69
  }
90
70
  })());
91
71
  }
92
-
93
72
  await _bluebird.default.all(moduleCheckPromises);
94
73
  }
95
-
96
74
  async function getDeviceInfo(adb, log = null) {
97
75
  const output = await adb.shell(['dumpsys', 'display']);
98
76
  const result = {};
99
-
100
77
  for (const [key, pattern] of [['width', /\bdeviceWidth=(\d+)/], ['height', /\bdeviceHeight=(\d+)/], ['fps', /\bfps=(\d+)/]]) {
101
78
  const match = pattern.exec(output);
102
-
103
79
  if (!match) {
104
80
  log === null || log === void 0 ? void 0 : log.debug(output);
105
81
  throw new Error(`Cannot parse the device ${key} from the adb command output. ` + `Check the server log for more details.`);
106
82
  }
107
-
108
83
  result[key] = parseInt(match[1], 10);
109
84
  }
110
-
111
85
  result.udid = adb.curDeviceId;
112
86
  return result;
113
87
  }
114
-
115
88
  async function initDeviceStreamingProc(adb, log, deviceInfo, opts = {}) {
116
89
  const {
117
90
  width,
@@ -121,42 +94,35 @@ async function initDeviceStreamingProc(adb, log, deviceInfo, opts = {}) {
121
94
  const adjustedWidth = parseInt(width, 10) || deviceInfo.width;
122
95
  const adjustedHeight = parseInt(height, 10) || deviceInfo.height;
123
96
  const adjustedBitrate = parseInt(bitRate, 10) || DEFAULT_BITRATE;
124
- let screenRecordCmd = SCREENRECORD_BINARY + ` --output-format=h264` + ` --time-limit=${RECORDING_INTERVAL_SEC}`;
125
-
97
+ let screenRecordCmd = SCREENRECORD_BINARY + ` --output-format=h264` +
98
+ ` --time-limit=${RECORDING_INTERVAL_SEC}`;
126
99
  if (width || height) {
127
100
  screenRecordCmd += ` --size=${adjustedWidth}x${adjustedHeight}`;
128
101
  }
129
-
130
102
  if (bitRate) {
131
103
  screenRecordCmd += ` --bit-rate=${adjustedBitrate}`;
132
104
  }
133
-
134
- const adbArgs = [...adb.executable.defaultArgs, 'exec-out', `while true; do ${screenRecordCmd} -; done`];
105
+ const adbArgs = [...adb.executable.defaultArgs, 'exec-out',
106
+ `while true; do ${screenRecordCmd} -; done`];
135
107
  const deviceStreaming = (0, _child_process.spawn)(adb.executable.path, adbArgs);
136
108
  deviceStreaming.on('exit', (code, signal) => {
137
109
  log.debug(`Device streaming process exited with code ${code}, signal ${signal}`);
138
110
  });
139
111
  let isStarted = false;
140
112
  const deviceStreamingLogger = createStreamingLogger(SCREENRECORD_BINARY, deviceInfo.udid);
141
-
142
113
  const errorsListener = chunk => {
143
114
  const stderr = chunk.toString();
144
-
145
115
  if (_lodash.default.trim(stderr)) {
146
116
  deviceStreamingLogger.debug(stderr);
147
117
  }
148
118
  };
149
-
150
119
  deviceStreaming.stderr.on('data', errorsListener);
151
-
152
120
  const startupListener = chunk => {
153
121
  if (!isStarted) {
154
122
  isStarted = !_lodash.default.isEmpty(chunk);
155
123
  }
156
124
  };
157
-
158
125
  deviceStreaming.stdout.on('data', startupListener);
159
-
160
126
  try {
161
127
  log.info(`Starting device streaming: ${_support.util.quote([adb.executable.path, ...adbArgs])}`);
162
128
  await (0, _asyncbox.waitForCondition)(() => isStarted, {
@@ -169,10 +135,8 @@ async function initDeviceStreamingProc(adb, log, deviceInfo, opts = {}) {
169
135
  deviceStreaming.stderr.removeListener('data', errorsListener);
170
136
  deviceStreaming.stdout.removeListener('data', startupListener);
171
137
  }
172
-
173
138
  return deviceStreaming;
174
139
  }
175
-
176
140
  async function initGstreamerPipeline(deviceStreamingProc, deviceInfo, log, opts = {}) {
177
141
  const {
178
142
  width,
@@ -191,16 +155,13 @@ async function initGstreamerPipeline(deviceStreamingProc, deviceInfo, log, opts
191
155
  log.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);
192
156
  });
193
157
  const gstreamerLogger = createStreamingLogger('gst', deviceInfo.udid);
194
-
195
158
  const gstOutputListener = (stdout, stderr) => {
196
159
  if (_lodash.default.trim(stderr || stdout)) {
197
160
  gstreamerLogger.debug(stderr || stdout);
198
161
  }
199
162
  };
200
-
201
163
  gstreamerPipeline.on('output', gstOutputListener);
202
164
  let didFail = false;
203
-
204
165
  try {
205
166
  log.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);
206
167
  await gstreamerPipeline.start(0);
@@ -222,10 +183,8 @@ async function initGstreamerPipeline(deviceStreamingProc, deviceInfo, log, opts
222
183
  gstreamerPipeline.removeListener('output', gstOutputListener);
223
184
  }
224
185
  }
225
-
226
186
  return gstreamerPipeline;
227
187
  }
228
-
229
188
  function extractRemoteAddress(req) {
230
189
  return req.headers['x-forwarded-for'] || req.socket.remoteAddress || req.connection.remoteAddress || req.connection.socket.remoteAddress;
231
190
  }
@@ -244,25 +203,20 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
244
203
  considerRotation = false,
245
204
  logPipelineDetails = false
246
205
  } = options;
247
-
248
206
  if (_lodash.default.isUndefined(this._screenStreamingProps)) {
249
207
  await verifyStreamingRequirements(this.adb);
250
208
  }
251
-
252
209
  if (!_lodash.default.isEmpty(this._screenStreamingProps)) {
253
210
  this.log.info(`The screen streaming session is already running. ` + `Stop it first in order to start a new one.`);
254
211
  return;
255
212
  }
256
-
257
213
  if ((await (0, _portscanner.checkPortStatus)(port, host)) === 'open') {
258
214
  this.log.info(`The port #${port} at ${host} is busy. ` + `Assuming the screen streaming is already running`);
259
215
  return;
260
216
  }
261
-
262
217
  if ((await (0, _portscanner.checkPortStatus)(tcpPort, TCP_HOST)) === 'open') {
263
218
  this.log.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` + `Make sure there are no leftovers from previous sessions.`);
264
219
  }
265
-
266
220
  this._screenStreamingProps = null;
267
221
  const deviceInfo = await getDeviceInfo(this.adb, this.log);
268
222
  const deviceStreamingProc = await initDeviceStreamingProc(this.adb, this.log, deviceInfo, {
@@ -271,7 +225,6 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
271
225
  bitRate
272
226
  });
273
227
  let gstreamerPipeline;
274
-
275
228
  try {
276
229
  gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, this.log, {
277
230
  width,
@@ -285,24 +238,18 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
285
238
  if (deviceStreamingProc.kill(0)) {
286
239
  deviceStreamingProc.kill();
287
240
  }
288
-
289
241
  throw e;
290
242
  }
291
-
292
243
  let mjpegSocket;
293
244
  let mjpegServer;
294
-
295
245
  try {
296
246
  await new _bluebird.default((resolve, reject) => {
297
247
  mjpegSocket = _net.default.createConnection(tcpPort, TCP_HOST, () => {
298
248
  this.log.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);
299
249
  mjpegServer = _http.default.createServer((req, res) => {
300
250
  const remoteAddress = extractRemoteAddress(req);
301
-
302
251
  const currentPathname = _url.default.parse(req.url).pathname;
303
-
304
252
  this.log.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` + `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);
305
-
306
253
  if (pathname && currentPathname !== pathname) {
307
254
  this.log.info('Rejecting the broadcast request since it does not match the given pathname');
308
255
  res.writeHead(404, {
@@ -313,7 +260,6 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
313
260
  res.end();
314
261
  return;
315
262
  }
316
-
317
263
  this.log.info('Starting MJPEG broadcast');
318
264
  res.writeHead(200, {
319
265
  'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',
@@ -345,22 +291,17 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
345
291
  if (deviceStreamingProc.kill(0)) {
346
292
  deviceStreamingProc.kill();
347
293
  }
348
-
349
294
  if (gstreamerPipeline.isRunning) {
350
295
  await gstreamerPipeline.stop();
351
296
  }
352
-
353
297
  if (mjpegSocket) {
354
298
  mjpegSocket.destroy();
355
299
  }
356
-
357
300
  if (mjpegServer && mjpegServer.listening) {
358
301
  mjpegServer.close();
359
302
  }
360
-
361
303
  throw e;
362
304
  }
363
-
364
305
  this._screenStreamingProps = {
365
306
  deviceStreamingProc,
366
307
  gstreamerPipeline,
@@ -369,39 +310,33 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
369
310
  };
370
311
  };
371
312
 
372
- commands.mobileStopScreenStreaming = async function mobileStopScreenStreaming() {
313
+ commands.mobileStopScreenStreaming = async function
314
+ mobileStopScreenStreaming() {
373
315
  if (_lodash.default.isEmpty(this._screenStreamingProps)) {
374
316
  if (!_lodash.default.isUndefined(this._screenStreamingProps)) {
375
317
  this.log.debug(`Screen streaming is not running. There is nothing to stop`);
376
318
  }
377
-
378
319
  return;
379
320
  }
380
-
381
321
  const {
382
322
  deviceStreamingProc,
383
323
  gstreamerPipeline,
384
324
  mjpegSocket,
385
325
  mjpegServer
386
326
  } = this._screenStreamingProps;
387
-
388
327
  try {
389
328
  mjpegSocket.end();
390
-
391
329
  if (mjpegServer.listening) {
392
330
  mjpegServer.close();
393
331
  }
394
-
395
332
  if (deviceStreamingProc.kill(0)) {
396
333
  deviceStreamingProc.kill('SIGINT');
397
334
  }
398
-
399
335
  if (gstreamerPipeline.isRunning) {
400
336
  try {
401
337
  await gstreamerPipeline.stop('SIGINT');
402
338
  } catch (e) {
403
339
  this.log.warn(e);
404
-
405
340
  try {
406
341
  await gstreamerPipeline.stop('SIGKILL');
407
342
  } catch (e1) {
@@ -409,13 +344,11 @@ commands.mobileStopScreenStreaming = async function mobileStopScreenStreaming()
409
344
  }
410
345
  }
411
346
  }
412
-
413
347
  this.log.info(`Successfully terminated the screen streaming MJPEG server`);
414
348
  } finally {
415
349
  this._screenStreamingProps = null;
416
350
  }
417
351
  };
418
-
419
352
  var _default = commands;
420
353
  exports.default = _default;
421
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIlJFQ09SRElOR19JTlRFUlZBTF9TRUMiLCJTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TIiwiR1NUUkVBTUVSX0JJTkFSWSIsInN5c3RlbSIsImlzV2luZG93cyIsIkdTVF9JTlNQRUNUX0JJTkFSWSIsIlJFUVVJUkVEX0dTVF9QTFVHSU5TIiwiYXZkZWNfaDI2NCIsImgyNjRwYXJzZSIsImpwZWdlbmMiLCJ0Y3BzZXJ2ZXJzaW5rIiwibXVsdGlwYXJ0bXV4IiwiU0NSRUVOUkVDT1JEX0JJTkFSWSIsIkdTVF9UVVRPUklBTF9VUkwiLCJERUZBVUxUX0hPU1QiLCJUQ1BfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIkRFRkFVTFRfUVVBTElUWSIsIkRFRkFVTFRfQklUUkFURSIsIkJPVU5EQVJZX1NUUklORyIsIkFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUiLCJjcmVhdGVTdHJlYW1pbmdMb2dnZXIiLCJzdHJlYW1OYW1lIiwidWRpZCIsImxvZ2dlciIsImdldExvZ2dlciIsIl8iLCJ0cnVuY2F0ZSIsImxlbmd0aCIsIm9taXNzaW9uIiwidmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIiwiYWRiIiwidHJpbSIsInNoZWxsIiwiRXJyb3IiLCJnc3RyZWFtZXJDaGVja1Byb21pc2VzIiwiYmluYXJ5TmFtZSIsInB1c2giLCJmcyIsIndoaWNoIiwiZSIsIkIiLCJhbGwiLCJtb2R1bGVDaGVja1Byb21pc2VzIiwibmFtZSIsIm1vZE5hbWUiLCJ0b1BhaXJzIiwic3Rkb3V0IiwiZXhlYyIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsImxvZyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImRlYnVnIiwicGFyc2VJbnQiLCJjdXJEZXZpY2VJZCIsImluaXREZXZpY2VTdHJlYW1pbmdQcm9jIiwiZGV2aWNlSW5mbyIsIm9wdHMiLCJ3aWR0aCIsImhlaWdodCIsImJpdFJhdGUiLCJhZGp1c3RlZFdpZHRoIiwiYWRqdXN0ZWRIZWlnaHQiLCJhZGp1c3RlZEJpdHJhdGUiLCJzY3JlZW5SZWNvcmRDbWQiLCJhZGJBcmdzIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiZGV2aWNlU3RyZWFtaW5nIiwic3Bhd24iLCJwYXRoIiwib24iLCJjb2RlIiwic2lnbmFsIiwiaXNTdGFydGVkIiwiZGV2aWNlU3RyZWFtaW5nTG9nZ2VyIiwiZXJyb3JzTGlzdGVuZXIiLCJjaHVuayIsInN0ZGVyciIsInRvU3RyaW5nIiwic3RhcnR1cExpc3RlbmVyIiwiaXNFbXB0eSIsImluZm8iLCJ1dGlsIiwicXVvdGUiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwicmVtb3ZlTGlzdGVuZXIiLCJpbml0R3N0cmVhbWVyUGlwZWxpbmUiLCJkZXZpY2VTdHJlYW1pbmdQcm9jIiwicXVhbGl0eSIsInRjcFBvcnQiLCJjb25zaWRlclJvdGF0aW9uIiwibG9nUGlwZWxpbmVEZXRhaWxzIiwiZ3N0cmVhbWVyUGlwZWxpbmUiLCJTdWJQcm9jZXNzIiwiTWF0aCIsIm1heCIsImZwcyIsInN0ZGlvIiwiZ3N0cmVhbWVyTG9nZ2VyIiwiZ3N0T3V0cHV0TGlzdGVuZXIiLCJkaWRGYWlsIiwicmVwIiwic3RhcnQiLCJjaGVja1BvcnRTdGF0dXMiLCJpZ24iLCJleHRyYWN0UmVtb3RlQWRkcmVzcyIsInJlcSIsImhlYWRlcnMiLCJzb2NrZXQiLCJyZW1vdGVBZGRyZXNzIiwiY29ubmVjdGlvbiIsIm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwib3B0aW9ucyIsImVuc3VyZUZlYXR1cmVFbmFibGVkIiwiaG9zdCIsInBvcnQiLCJwYXRobmFtZSIsImlzVW5kZWZpbmVkIiwiX3NjcmVlblN0cmVhbWluZ1Byb3BzIiwia2lsbCIsIm1qcGVnU29ja2V0IiwibWpwZWdTZXJ2ZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwibmV0IiwiY3JlYXRlQ29ubmVjdGlvbiIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjdXJyZW50UGF0aG5hbWUiLCJ1cmwiLCJwYXJzZSIsIndyaXRlSGVhZCIsIkNvbm5lY3Rpb24iLCJ3cml0ZSIsImVuZCIsIlByYWdtYSIsInBpcGUiLCJ3YXJuIiwibGlzdGVuIiwiZXJyb3IiLCJ0aW1lb3V0IiwiaXNSdW5uaW5nIiwic3RvcCIsImRlc3Ryb3kiLCJsaXN0ZW5pbmciLCJjbG9zZSIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJlMSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCBzeXN0ZW0sIGxvZ2dlciwgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMsIFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuY29uc3QgUkVDT1JESU5HX0lOVEVSVkFMX1NFQyA9IDU7XG5jb25zdCBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IEdTVFJFQU1FUl9CSU5BUlkgPSBgZ3N0LWxhdW5jaC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBHU1RfSU5TUEVDVF9CSU5BUlkgPSBgZ3N0LWluc3BlY3QtMS4wJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgUkVRVUlSRURfR1NUX1BMVUdJTlMgPSB7XG4gIGF2ZGVjX2gyNjQ6ICdnc3QtbGliYXYnLFxuICBoMjY0cGFyc2U6ICdnc3QtcGx1Z2lucy1iYWQnLFxuICBqcGVnZW5jOiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG4gIHRjcHNlcnZlcnNpbms6ICdnc3QtcGx1Z2lucy1iYXNlJyxcbiAgbXVsdGlwYXJ0bXV4OiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG59O1xuY29uc3QgU0NSRUVOUkVDT1JEX0JJTkFSWSA9ICdzY3JlZW5yZWNvcmQnO1xuY29uc3QgR1NUX1RVVE9SSUFMX1VSTCA9ICdodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZG9jdW1lbnRhdGlvbi9pbnN0YWxsaW5nL2luZGV4Lmh0bWwnO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBUQ1BfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9QT1JUID0gODA5MztcbmNvbnN0IERFRkFVTFRfUVVBTElUWSA9IDcwO1xuY29uc3QgREVGQVVMVF9CSVRSQVRFID0gNDAwMDAwMDsgLy8gNCBNYnBzXG5jb25zdCBCT1VOREFSWV9TVFJJTkcgPSAnLS0yYWU5NzQ2ODg3ZjE3MGI4Y2Y3YzI3MTA0N2NlMzE0Yyc7XG5cbmNvbnN0IEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUgPSAnYWRiX3NjcmVlbl9zdHJlYW1pbmcnO1xuXG5mdW5jdGlvbiBjcmVhdGVTdHJlYW1pbmdMb2dnZXIgKHN0cmVhbU5hbWUsIHVkaWQpIHtcbiAgcmV0dXJuIGxvZ2dlci5nZXRMb2dnZXIoYCR7c3RyZWFtTmFtZX1AYCArIF8udHJ1bmNhdGUodWRpZCwge1xuICAgIGxlbmd0aDogOCxcbiAgICBvbWlzc2lvbjogJycsXG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIChhZGIpIHtcbiAgaWYgKCFfLnRyaW0oYXdhaXQgYWRiLnNoZWxsKFsnd2hpY2gnLCBTQ1JFRU5SRUNPUkRfQklOQVJZXSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSByZXF1aXJlZCAnJHtTQ1JFRU5SRUNPUkRfQklOQVJZfScgYmluYXJ5IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0YCk7XG4gIH1cblxuICBjb25zdCBnc3RyZWFtZXJDaGVja1Byb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgYmluYXJ5TmFtZSBvZiBbR1NUUkVBTUVSX0JJTkFSWSwgR1NUX0lOU1BFQ1RfQklOQVJZXSkge1xuICAgIGdzdHJlYW1lckNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICcke2JpbmFyeU5hbWV9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgUEFUSCBvbiB0aGUgaG9zdCBzeXN0ZW0uIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGdzdHJlYW1lckNoZWNrUHJvbWlzZXMpO1xuXG4gIGNvbnN0IG1vZHVsZUNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgbW9kTmFtZV0gb2YgXy50b1BhaXJzKFJFUVVJUkVEX0dTVF9QTFVHSU5TKSkge1xuICAgIG1vZHVsZUNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKEdTVF9JTlNQRUNUX0JJTkFSWSwgW25hbWVdKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhzdGRvdXQsIG1vZE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHJlcXVpcmVkIEdTdHJlYW1lciBwbHVnaW4gJyR7bmFtZX0nIGZyb20gJyR7bW9kTmFtZX0nIG1vZHVsZSBpcyBub3QgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgU2VlICR7R1NUX1RVVE9SSUFMX1VSTH0gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gaW5zdGFsbCBpdC5gKTtcbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChtb2R1bGVDaGVja1Byb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mbyAoYWRiLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnZGlzcGxheSddKTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcGF0dGVybl0gb2YgW1xuICAgIFsnd2lkdGgnLCAvXFxiZGV2aWNlV2lkdGg9KFxcZCspL10sXG4gICAgWydoZWlnaHQnLCAvXFxiZGV2aWNlSGVpZ2h0PShcXGQrKS9dLFxuICAgIFsnZnBzJywgL1xcYmZwcz0oXFxkKykvXSxcbiAgXSkge1xuICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nPy5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGRldmljZSAke2tleX0gZnJvbSB0aGUgYWRiIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICAgYENoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMuYCk7XG4gICAgfVxuICAgIHJlc3VsdFtrZXldID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgfVxuICByZXN1bHQudWRpZCA9IGFkYi5jdXJEZXZpY2VJZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZVN0cmVhbWluZ1Byb2MgKGFkYiwgbG9nLCBkZXZpY2VJbmZvLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgYWRqdXN0ZWRCaXRyYXRlID0gcGFyc2VJbnQoYml0UmF0ZSwgMTApIHx8IERFRkFVTFRfQklUUkFURTtcbiAgbGV0IHNjcmVlblJlY29yZENtZCA9IFNDUkVFTlJFQ09SRF9CSU5BUlkgK1xuICAgIGAgLS1vdXRwdXQtZm9ybWF0PWgyNjRgICtcbiAgICAvLyA1IHNlY29uZHMgaXMgZmluZSB0byBkZXRlY3Qgcm90YXRpb24gY2hhbmdlc1xuICAgIGAgLS10aW1lLWxpbWl0PSR7UkVDT1JESU5HX0lOVEVSVkFMX1NFQ31gO1xuICBpZiAod2lkdGggfHwgaGVpZ2h0KSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1zaXplPSR7YWRqdXN0ZWRXaWR0aH14JHthZGp1c3RlZEhlaWdodH1gO1xuICB9XG4gIGlmIChiaXRSYXRlKSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1iaXQtcmF0ZT0ke2FkanVzdGVkQml0cmF0ZX1gO1xuICB9XG4gIGNvbnN0IGFkYkFyZ3MgPSBbXG4gICAgLi4uYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ2V4ZWMtb3V0JyxcbiAgICAvLyBUaGUgbG9vcCBpcyByZXF1aXJlZCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZSBtYXhpbXVtIHJlY29yZCBkdXJhdGlvblxuICAgIC8vIGZvciBzY3JlZW5yZWNvcmQgaXMgYWx3YXlzIGxpbWl0ZWRcbiAgICBgd2hpbGUgdHJ1ZTsgZG8gJHtzY3JlZW5SZWNvcmRDbWR9IC07IGRvbmVgLFxuICBdO1xuICBjb25zdCBkZXZpY2VTdHJlYW1pbmcgPSBzcGF3bihhZGIuZXhlY3V0YWJsZS5wYXRoLCBhZGJBcmdzKTtcbiAgZGV2aWNlU3RyZWFtaW5nLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIHN0cmVhbWluZyBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICB9KTtcblxuICBsZXQgaXNTdGFydGVkID0gZmFsc2U7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ0xvZ2dlciA9IGNyZWF0ZVN0cmVhbWluZ0xvZ2dlcihTQ1JFRU5SRUNPUkRfQklOQVJZLCBkZXZpY2VJbmZvLnVkaWQpO1xuICBjb25zdCBlcnJvcnNMaXN0ZW5lciA9IChjaHVuaykgPT4ge1xuICAgIGNvbnN0IHN0ZGVyciA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgaWYgKF8udHJpbShzdGRlcnIpKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdMb2dnZXIuZGVidWcoc3RkZXJyKTtcbiAgICB9XG4gIH07XG4gIGRldmljZVN0cmVhbWluZy5zdGRlcnIub24oJ2RhdGEnLCBlcnJvcnNMaXN0ZW5lcik7XG5cbiAgY29uc3Qgc3RhcnR1cExpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgaWYgKCFpc1N0YXJ0ZWQpIHtcbiAgICAgIGlzU3RhcnRlZCA9ICFfLmlzRW1wdHkoY2h1bmspO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZG91dC5vbignZGF0YScsIHN0YXJ0dXBMaXN0ZW5lcik7XG5cbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgZGV2aWNlIHN0cmVhbWluZzogJHt1dGlsLnF1b3RlKFthZGIuZXhlY3V0YWJsZS5wYXRoLCAuLi5hZGJBcmdzXSl9YCk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbigoKSA9PiBpc1N0YXJ0ZWQsIHtcbiAgICAgIHdhaXRNczogU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFxuICAgICAgYENhbm5vdCBzdGFydCB0aGUgc2NyZWVuIHN0cmVhbWluZyBwcm9jZXNzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5yZW1vdmVMaXN0ZW5lcignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcbiAgfVxuICByZXR1cm4gZGV2aWNlU3RyZWFtaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0R3N0cmVhbWVyUGlwZWxpbmUgKGRldmljZVN0cmVhbWluZ1Byb2MsIGRldmljZUluZm8sIGxvZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcXVhbGl0eSxcbiAgICB0Y3BQb3J0LFxuICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgZ3N0cmVhbWVyUGlwZWxpbmUgPSBuZXcgU3ViUHJvY2VzcyhHU1RSRUFNRVJfQklOQVJZLCBbXG4gICAgJy12JyxcbiAgICAnZmRzcmMnLCAnZmQ9MCcsXG4gICAgJyEnLCAndmlkZW8veC1oMjY0LCcgK1xuICAgICAgYHdpZHRoPSR7Y29uc2lkZXJSb3RhdGlvbiA/IE1hdGgubWF4KGFkanVzdGVkV2lkdGgsIGFkanVzdGVkSGVpZ2h0KSA6IGFkanVzdGVkV2lkdGh9LGAgK1xuICAgICAgYGhlaWdodD0ke2NvbnNpZGVyUm90YXRpb24gPyBNYXRoLm1heChhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCkgOiBhZGp1c3RlZEhlaWdodH0sYCArXG4gICAgICBgZnJhbWVyYXRlPSR7ZGV2aWNlSW5mby5mcHN9LzEsYCArXG4gICAgICAnYnl0ZS1zdHJlYW09dHJ1ZScsXG4gICAgJyEnLCAnaDI2NHBhcnNlJyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdhdmRlY19oMjY0JyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdqcGVnZW5jJywgYHF1YWxpdHk9JHtxdWFsaXR5fWAsXG4gICAgJyEnLCAnbXVsdGlwYXJ0bXV4JywgYGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWAsXG4gICAgJyEnLCAndGNwc2VydmVyc2luaycsIGBob3N0PSR7VENQX0hPU1R9YCwgYHBvcnQ9JHt0Y3BQb3J0fWAsXG4gIF0sIHtcbiAgICBzdGRpbzogW2RldmljZVN0cmVhbWluZ1Byb2Muc3Rkb3V0LCAncGlwZScsICdwaXBlJ11cbiAgfSk7XG4gIGdzdHJlYW1lclBpcGVsaW5lLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgUGlwZWxpbmUgc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuICBjb25zdCBnc3RyZWFtZXJMb2dnZXIgPSBjcmVhdGVTdHJlYW1pbmdMb2dnZXIoJ2dzdCcsIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGdzdE91dHB1dExpc3RlbmVyID0gKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgaWYgKF8udHJpbShzdGRlcnIgfHwgc3Rkb3V0KSkge1xuICAgICAgZ3N0cmVhbWVyTG9nZ2VyLmRlYnVnKHN0ZGVyciB8fCBzdGRvdXQpO1xuICAgIH1cbiAgfTtcbiAgZ3N0cmVhbWVyUGlwZWxpbmUub24oJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgbGV0IGRpZEZhaWwgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgR1N0cmVhbWVyIHBpcGVsaW5lOiAke2dzdHJlYW1lclBpcGVsaW5lLnJlcH1gKTtcbiAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdGFydCgwKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJztcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGlkRmFpbCA9IHRydWU7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHBpcGVsaW5lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCFsb2dQaXBlbGluZURldGFpbHMgfHwgZGlkRmFpbCkge1xuICAgICAgZ3N0cmVhbWVyUGlwZWxpbmUucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdzdHJlYW1lclBpcGVsaW5lO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UmVtb3RlQWRkcmVzcyAocmVxKSB7XG4gIHJldHVybiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ11cbiAgICB8fCByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3NcbiAgICB8fCByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gICAgfHwgcmVxLmNvbm5lY3Rpb24uc29ja2V0LnJlbW90ZUFkZHJlc3M7XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHNjYWxlZCB3aWR0aCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLiBJZiB1bnNldCB0aGVuIHRoZSBzY3JpcHQgd2lsbCBhc3NpZ24gaXRcbiAqIHRvIHRoZSBhY3R1YWwgc2NyZWVuIHdpZHRoIG1lYXN1cmVkIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIHNjYWxlZCBoZWlnaHQgb2YgdGhlIGRldmljZSdzIHNjcmVlbi4gSWYgdW5zZXQgdGhlbiB0aGUgc2NyaXB0IHdpbGwgYXNzaWduIGl0XG4gKiB0byB0aGUgYWN0dWFsIHNjcmVlbiBoZWlnaHQgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIGJpdHMgcGVyIHNlY29uZC5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQwMDAwMDAgKDQgTWIvcykuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaG9zdCBbMTI3LjAuMC4xXSAtIFRoZSBJUCBhZGRyZXNzL2hvc3QgbmFtZSB0byBzdGFydCB0aGUgTUpQRUcgc2VydmVyIG9uLlxuICogWW91IGNhbiBzZXQgaXQgdG8gYDAuMC4wLjBgIHRvIHRyaWdnZXIgdGhlIGJyb2FkY2FzdCBvbiBhbGwgYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGF0aG5hbWUgLSBUaGUgSFRUUCByZXF1ZXN0IHBhdGggdGhlIE1KUEVHIHNlcnZlciBzaG91bGQgYmUgYXZhaWxhYmxlIG9uLlxuICogSWYgdW5zZXQgdGhlbiBhbnkgcGF0aG5hbWUgb24gdGhlIGdpdmVuIGBob3N0YC9gcG9ydGAgY29tYmluYXRpb24gd2lsbCB3b3JrLiBOb3RlIHRoYXQgdGhlIHZhbHVlXG4gKiBzaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggYSBzaW5nbGUgc2xhc2g6IGAvYFxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0Y3BQb3J0IFs4MDk0XSAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCB0aGUgaW50ZXJuYWwgVENQIE1KUEVHIGJyb2FkY2FzdCBvbi5cbiAqIFRoaXMgdHlwZSBvZiBicm9hZGNhc3QgYWx3YXlzIHN0YXJ0cyBvbiB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIChgMTI3LjAuMC4xYCkuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHBvcnQgWzgwOTNdIC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHRoZSBNSlBFRyBzZXJ2ZXIgb24uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHF1YWxpdHkgWzcwXSAtIFRoZSBxdWFsaXR5IHZhbHVlIGZvciB0aGUgc3RyZWFtZWQgSlBFRyBpbWFnZXMuXG4gKiBUaGlzIG51bWJlciBzaG91bGQgYmUgaW4gcmFuZ2UgWzEsIDEwMF0sIHdoZXJlIDEwMCBpcyB0aGUgYmVzdCBxdWFsaXR5LlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gY29uc2lkZXJSb3RhdGlvbiBbZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCB0aGVuIEdTdHJlYW1lciBwaXBlbGluZSB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcmVzdWx0aW5nIGltYWdlcyB0byBwcm9wZXJseSBmaXQgaW1hZ2VzIGluIGJvdGggbGFuZHNjYXBlIGFuZFxuICogcG9ydHJhaXQgb3JpZW50YXRpb25zLiBTZXQgaXQgdG8gYHRydWVgIGlmIHRoZSBkZXZpY2Ugcm90YXRpb24gaXMgbm90IGdvaW5nIHRvIGJlIHRoZSBzYW1lIGR1cmluZyB0aGVcbiAqIGJyb2FkY2FzdGluZyBzZXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gbG9nUGlwZWxpbmVEZXRhaWxzIFtmYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBHU3RyZWFtZXIgcGlwZWxpbmUgZXZlbnRzIGludG9cbiAqIHRoZSBzdGFuZGFyZCBsb2cgb3V0cHV0LiBNaWdodCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyBkZXZpY2Ugc2NyZWVuIGJyb2FkY2FzdCBieSBjcmVhdGluZyBNSlBFRyBzZXJ2ZXIuXG4gKiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCBoYXZlIG5vIGVmZmVjdCB1bmxlc3MgdGhlIHByZXZpb3VzIHN0cmVhbWluZ1xuICogc2Vzc2lvbiBpcyBzdG9wcGVkLlxuICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB0aGUgYGFkYl9zY3JlZW5fc3RyZWFtaW5nYCBmZWF0dXJlIGlzXG4gKiBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHN0cmVhbWluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yXG4gKiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBob3N0IHN5c3RlbSBvclxuICogdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcgKG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgIHBvcnQgPSBERUZBVUxUX1BPUlQsXG4gICAgcGF0aG5hbWUsXG4gICAgdGNwUG9ydCA9IERFRkFVTFRfUE9SVCArIDEsXG4gICAgcXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWSxcbiAgICBjb25zaWRlclJvdGF0aW9uID0gZmFsc2UsXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIGF3YWl0IHZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyh0aGlzLmFkYik7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIHNjcmVlbiBzdHJlYW1pbmcgc2Vzc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFN0b3AgaXQgZmlyc3QgaW4gb3JkZXIgdG8gc3RhcnQgYSBuZXcgb25lLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyhwb3J0LCBob3N0KSkgPT09ICdvcGVuJykge1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSBwb3J0ICMke3BvcnR9IGF0ICR7aG9zdH0gaXMgYnVzeS4gYCArXG4gICAgICBgQXNzdW1pbmcgdGhlIHNjcmVlbiBzdHJlYW1pbmcgaXMgYWxyZWFkeSBydW5uaW5nYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJykge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBwb3J0ICMke3RjcFBvcnR9IGF0ICR7VENQX0hPU1R9IGlzIGJ1c3kuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbGVmdG92ZXJzIGZyb20gcHJldmlvdXMgc2Vzc2lvbnMuYCk7XG4gIH1cbiAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSBudWxsO1xuXG4gIGNvbnN0IGRldmljZUluZm8gPSBhd2FpdCBnZXREZXZpY2VJbmZvKHRoaXMuYWRiLCB0aGlzLmxvZyk7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ1Byb2MgPSBhd2FpdCBpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyh0aGlzLmFkYiwgdGhpcy5sb2csIGRldmljZUluZm8sIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgfSk7XG4gIGxldCBnc3RyZWFtZXJQaXBlbGluZTtcbiAgdHJ5IHtcbiAgICBnc3RyZWFtZXJQaXBlbGluZSA9IGF3YWl0IGluaXRHc3RyZWFtZXJQaXBlbGluZShkZXZpY2VTdHJlYW1pbmdQcm9jLCBkZXZpY2VJbmZvLCB0aGlzLmxvZywge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBxdWFsaXR5LFxuICAgICAgdGNwUG9ydCxcbiAgICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgICBsb2dQaXBlbGluZURldGFpbHMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxldCBtanBlZ1NvY2tldDtcbiAgbGV0IG1qcGVnU2VydmVyO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG1qcGVnU29ja2V0ID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24odGNwUG9ydCwgVENQX0hPU1QsICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBNSlBFRyBzdHJlYW0gYXQgdGNwOi8vJHtUQ1BfSE9TVH06JHt0Y3BQb3J0fWApO1xuICAgICAgICBtanBlZ1NlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKChyZXEsIHJlcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSBleHRyYWN0UmVtb3RlQWRkcmVzcyhyZXEpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRobmFtZSA9IHVybC5wYXJzZShyZXEudXJsKS5wYXRobmFtZTtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBHb3QgYW4gaW5jb21pbmcgc2NyZWVuIGJyYWRjYXN0aW5nIHJlcXVlc3QgZnJvbSAke3JlbW90ZUFkZHJlc3N9IGAgK1xuICAgICAgICAgICAgYCgke3JlcS5oZWFkZXJzWyd1c2VyLWFnZW50J10gfHwgJ1VzZXIgQWdlbnQgdW5rbm93bid9KSBhdCAke2N1cnJlbnRQYXRobmFtZX1gKTtcblxuICAgICAgICAgIGlmIChwYXRobmFtZSAmJiBjdXJyZW50UGF0aG5hbWUgIT09IHBhdGhuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZWplY3RpbmcgdGhlIGJyb2FkY2FzdCByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBwYXRobmFtZScpO1xuICAgICAgICAgICAgcmVzLndyaXRlSGVhZCg0MDQsIHtcbiAgICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLndyaXRlKGAnJHtjdXJyZW50UGF0aG5hbWV9JyBkaWQgbm90IG1hdGNoIGFueSBrbm93biBlbmRwb2ludHNgKTtcbiAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBNSlBFRyBicm9hZGNhc3QnKTtcbiAgICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgICAgJ0NhY2hlLUNvbnRyb2wnOiAnbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCcsXG4gICAgICAgICAgICBQcmFnbWE6ICduby1jYWNoZScsXG4gICAgICAgICAgICBDb25uZWN0aW9uOiAnY2xvc2UnLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGBtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlOyBib3VuZGFyeT0ke0JPVU5EQVJZX1NUUklOR31gXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtanBlZ1NvY2tldC5waXBlKHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oZSk7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fSBoYXMgYmVlbiBjbG9zZWRgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgTUpQRUcgc2VydmVyIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gICAgICB9KTtcbiAgICAgIG1qcGVnU29ja2V0Lm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKGUpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9KTtcbiAgICB9KS50aW1lb3V0KFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICBgQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHN0cmVhbWluZyBzZXJ2ZXIgd2l0aGluICR7U1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NU31tc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCk7XG4gICAgfVxuICAgIGlmIChnc3RyZWFtZXJQaXBlbGluZS5pc1J1bm5pbmcpIHtcbiAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU29ja2V0KSB7XG4gICAgICBtanBlZ1NvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChtanBlZ1NlcnZlciAmJiBtanBlZ1NlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgIG1qcGVnU2VydmVyLmNsb3NlKCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cblxuICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IHtcbiAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLFxuICAgIGdzdHJlYW1lclBpcGVsaW5lLFxuICAgIG1qcGVnU29ja2V0LFxuICAgIG1qcGVnU2VydmVyLFxuICB9O1xufTtcblxuLyoqXG4gKiBTdG9wIHNjcmVlbiBzdHJlYW1pbmcuXG4gKiBJZiBubyBzY3JlZW4gc3RyZWFtaW5nIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIHRoZW4gbm90aGluZyBpcyBkb25lLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyAoLyogb3B0aW9ucyA9IHt9ICovKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNjcmVlbiBzdHJlYW1pbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcGApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgZGV2aWNlU3RyZWFtaW5nUHJvYyxcbiAgICBnc3RyZWFtZXJQaXBlbGluZSxcbiAgICBtanBlZ1NvY2tldCxcbiAgICBtanBlZ1NlcnZlcixcbiAgfSA9IHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzO1xuXG4gIHRyeSB7XG4gICAgbWpwZWdTb2NrZXQuZW5kKCk7XG4gICAgaWYgKG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCdTSUdJTlQnKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHSU5UJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHS0lMTCcpO1xuICAgICAgICB9IGNhdGNoIChlMSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGUxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgdGVybWluYXRlZCB0aGUgc2NyZWVuIHN0cmVhbWluZyBNSlBFRyBzZXJ2ZXJgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IG51bGw7XG4gIH1cbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsQ0FBL0I7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxJQUFyQztBQUNBLE1BQU1DLGdCQUFnQixHQUFJLGlCQUFnQkMsZUFBQSxDQUFPQyxTQUFQLEtBQXFCLE1BQXJCLEdBQThCLEVBQUcsRUFBM0U7QUFDQSxNQUFNQyxrQkFBa0IsR0FBSSxrQkFBaUJGLGVBQUEsQ0FBT0MsU0FBUCxLQUFxQixNQUFyQixHQUE4QixFQUFHLEVBQTlFO0FBQ0EsTUFBTUUsb0JBQW9CLEdBQUc7RUFDM0JDLFVBQVUsRUFBRSxXQURlO0VBRTNCQyxTQUFTLEVBQUUsaUJBRmdCO0VBRzNCQyxPQUFPLEVBQUUsa0JBSGtCO0VBSTNCQyxhQUFhLEVBQUUsa0JBSlk7RUFLM0JDLFlBQVksRUFBRTtBQUxhLENBQTdCO0FBT0EsTUFBTUMsbUJBQW1CLEdBQUcsY0FBNUI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyx1RUFBekI7QUFDQSxNQUFNQyxZQUFZLEdBQUcsV0FBckI7QUFDQSxNQUFNQyxRQUFRLEdBQUcsV0FBakI7QUFDQSxNQUFNQyxZQUFZLEdBQUcsSUFBckI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsRUFBeEI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsT0FBeEI7QUFDQSxNQUFNQyxlQUFlLEdBQUcsb0NBQXhCO0FBRUEsTUFBTUMsNEJBQTRCLEdBQUcsc0JBQXJDOztBQUVBLFNBQVNDLHFCQUFULENBQWdDQyxVQUFoQyxFQUE0Q0MsSUFBNUMsRUFBa0Q7RUFDaEQsT0FBT0MsZUFBQSxDQUFPQyxTQUFQLENBQWtCLEdBQUVILFVBQVcsR0FBZCxHQUFtQkksZUFBQSxDQUFFQyxRQUFGLENBQVdKLElBQVgsRUFBaUI7SUFDMURLLE1BQU0sRUFBRSxDQURrRDtJQUUxREMsUUFBUSxFQUFFO0VBRmdELENBQWpCLENBQXBDLENBQVA7QUFJRDs7QUFFRCxlQUFlQywyQkFBZixDQUE0Q0MsR0FBNUMsRUFBaUQ7RUFDL0MsSUFBSSxDQUFDTCxlQUFBLENBQUVNLElBQUYsQ0FBTyxNQUFNRCxHQUFHLENBQUNFLEtBQUosQ0FBVSxDQUFDLE9BQUQsRUFBVXJCLG1CQUFWLENBQVYsQ0FBYixDQUFMLEVBQThEO0lBQzVELE1BQU0sSUFBSXNCLEtBQUosQ0FDSCxpQkFBZ0J0QixtQkFBb0Isb0RBRGpDLENBQU47RUFFRDs7RUFFRCxNQUFNdUIsc0JBQXNCLEdBQUcsRUFBL0I7O0VBQ0EsS0FBSyxNQUFNQyxVQUFYLElBQXlCLENBQUNsQyxnQkFBRCxFQUFtQkcsa0JBQW5CLENBQXpCLEVBQWlFO0lBQy9EOEIsc0JBQXNCLENBQUNFLElBQXZCLENBQTRCLENBQUMsWUFBWTtNQUN2QyxJQUFJO1FBQ0YsTUFBTUMsV0FBQSxDQUFHQyxLQUFILENBQVNILFVBQVQsQ0FBTjtNQUNELENBRkQsQ0FFRSxPQUFPSSxDQUFQLEVBQVU7UUFDVixNQUFNLElBQUlOLEtBQUosQ0FBVyxRQUFPRSxVQUFXLDREQUFuQixHQUNiLE9BQU12QixnQkFBaUIseUNBRHBCLENBQU47TUFFRDtJQUNGLENBUDJCLEdBQTVCO0VBUUQ7O0VBQ0QsTUFBTTRCLGlCQUFBLENBQUVDLEdBQUYsQ0FBTVAsc0JBQU4sQ0FBTjtFQUVBLE1BQU1RLG1CQUFtQixHQUFHLEVBQTVCOztFQUNBLEtBQUssTUFBTSxDQUFDQyxJQUFELEVBQU9DLE9BQVAsQ0FBWCxJQUE4Qm5CLGVBQUEsQ0FBRW9CLE9BQUYsQ0FBVXhDLG9CQUFWLENBQTlCLEVBQStEO0lBQzdEcUMsbUJBQW1CLENBQUNOLElBQXBCLENBQXlCLENBQUMsWUFBWTtNQUNwQyxNQUFNO1FBQUNVO01BQUQsSUFBVyxNQUFNLElBQUFDLGtCQUFBLEVBQUszQyxrQkFBTCxFQUF5QixDQUFDdUMsSUFBRCxDQUF6QixDQUF2Qjs7TUFDQSxJQUFJLENBQUNsQixlQUFBLENBQUV1QixRQUFGLENBQVdGLE1BQVgsRUFBbUJGLE9BQW5CLENBQUwsRUFBa0M7UUFDaEMsTUFBTSxJQUFJWCxLQUFKLENBQ0gsa0NBQWlDVSxJQUFLLFdBQVVDLE9BQVEsNkJBQXpELEdBQ0MsT0FBTWhDLGdCQUFpQix5Q0FGcEIsQ0FBTjtNQUdEO0lBQ0YsQ0FQd0IsR0FBekI7RUFRRDs7RUFDRCxNQUFNNEIsaUJBQUEsQ0FBRUMsR0FBRixDQUFNQyxtQkFBTixDQUFOO0FBQ0Q7O0FBRUQsZUFBZU8sYUFBZixDQUE4Qm5CLEdBQTlCLEVBQW1Db0IsR0FBRyxHQUFHLElBQXpDLEVBQStDO0VBQzdDLE1BQU1DLE1BQU0sR0FBRyxNQUFNckIsR0FBRyxDQUFDRSxLQUFKLENBQVUsQ0FBQyxTQUFELEVBQVksU0FBWixDQUFWLENBQXJCO0VBQ0EsTUFBTW9CLE1BQU0sR0FBRyxFQUFmOztFQUNBLEtBQUssTUFBTSxDQUFDQyxHQUFELEVBQU1DLE9BQU4sQ0FBWCxJQUE2QixDQUMzQixDQUFDLE9BQUQsRUFBVSxxQkFBVixDQUQyQixFQUUzQixDQUFDLFFBQUQsRUFBVyxzQkFBWCxDQUYyQixFQUczQixDQUFDLEtBQUQsRUFBUSxhQUFSLENBSDJCLENBQTdCLEVBSUc7SUFDRCxNQUFNQyxLQUFLLEdBQUdELE9BQU8sQ0FBQ1AsSUFBUixDQUFhSSxNQUFiLENBQWQ7O0lBQ0EsSUFBSSxDQUFDSSxLQUFMLEVBQVk7TUFDVkwsR0FBRyxTQUFILElBQUFBLEdBQUcsV0FBSCxZQUFBQSxHQUFHLENBQUVNLEtBQUwsQ0FBV0wsTUFBWDtNQUNBLE1BQU0sSUFBSWxCLEtBQUosQ0FBVywyQkFBMEJvQixHQUFJLGdDQUEvQixHQUNiLHdDQURHLENBQU47SUFFRDs7SUFDREQsTUFBTSxDQUFDQyxHQUFELENBQU4sR0FBY0ksUUFBUSxDQUFDRixLQUFLLENBQUMsQ0FBRCxDQUFOLEVBQVcsRUFBWCxDQUF0QjtFQUNEOztFQUNESCxNQUFNLENBQUM5QixJQUFQLEdBQWNRLEdBQUcsQ0FBQzRCLFdBQWxCO0VBQ0EsT0FBT04sTUFBUDtBQUNEOztBQUVELGVBQWVPLHVCQUFmLENBQXdDN0IsR0FBeEMsRUFBNkNvQixHQUE3QyxFQUFrRFUsVUFBbEQsRUFBOERDLElBQUksR0FBRyxFQUFyRSxFQUF5RTtFQUN2RSxNQUFNO0lBQ0pDLEtBREk7SUFFSkMsTUFGSTtJQUdKQztFQUhJLElBSUZILElBSko7RUFLQSxNQUFNSSxhQUFhLEdBQUdSLFFBQVEsQ0FBQ0ssS0FBRCxFQUFRLEVBQVIsQ0FBUixJQUF1QkYsVUFBVSxDQUFDRSxLQUF4RDtFQUNBLE1BQU1JLGNBQWMsR0FBR1QsUUFBUSxDQUFDTSxNQUFELEVBQVMsRUFBVCxDQUFSLElBQXdCSCxVQUFVLENBQUNHLE1BQTFEO0VBQ0EsTUFBTUksZUFBZSxHQUFHVixRQUFRLENBQUNPLE9BQUQsRUFBVSxFQUFWLENBQVIsSUFBeUIvQyxlQUFqRDtFQUNBLElBQUltRCxlQUFlLEdBQUd6RCxtQkFBbUIsR0FDdEMsdUJBRG1CLEdBR25CLGlCQUFnQlosc0JBQXVCLEVBSDFDOztFQUlBLElBQUkrRCxLQUFLLElBQUlDLE1BQWIsRUFBcUI7SUFDbkJLLGVBQWUsSUFBSyxXQUFVSCxhQUFjLElBQUdDLGNBQWUsRUFBOUQ7RUFDRDs7RUFDRCxJQUFJRixPQUFKLEVBQWE7SUFDWEksZUFBZSxJQUFLLGVBQWNELGVBQWdCLEVBQWxEO0VBQ0Q7O0VBQ0QsTUFBTUUsT0FBTyxHQUFHLENBQ2QsR0FBR3ZDLEdBQUcsQ0FBQ3dDLFVBQUosQ0FBZUMsV0FESixFQUVkLFVBRmMsRUFLYixrQkFBaUJILGVBQWdCLFVBTHBCLENBQWhCO0VBT0EsTUFBTUksZUFBZSxHQUFHLElBQUFDLG9CQUFBLEVBQU0zQyxHQUFHLENBQUN3QyxVQUFKLENBQWVJLElBQXJCLEVBQTJCTCxPQUEzQixDQUF4QjtFQUNBRyxlQUFlLENBQUNHLEVBQWhCLENBQW1CLE1BQW5CLEVBQTJCLENBQUNDLElBQUQsRUFBT0MsTUFBUCxLQUFrQjtJQUMzQzNCLEdBQUcsQ0FBQ00sS0FBSixDQUFXLDZDQUE0Q29CLElBQUssWUFBV0MsTUFBTyxFQUE5RTtFQUNELENBRkQ7RUFJQSxJQUFJQyxTQUFTLEdBQUcsS0FBaEI7RUFDQSxNQUFNQyxxQkFBcUIsR0FBRzNELHFCQUFxQixDQUFDVCxtQkFBRCxFQUFzQmlELFVBQVUsQ0FBQ3RDLElBQWpDLENBQW5EOztFQUNBLE1BQU0wRCxjQUFjLEdBQUlDLEtBQUQsSUFBVztJQUNoQyxNQUFNQyxNQUFNLEdBQUdELEtBQUssQ0FBQ0UsUUFBTixFQUFmOztJQUNBLElBQUkxRCxlQUFBLENBQUVNLElBQUYsQ0FBT21ELE1BQVAsQ0FBSixFQUFvQjtNQUNsQkgscUJBQXFCLENBQUN2QixLQUF0QixDQUE0QjBCLE1BQTVCO0lBQ0Q7RUFDRixDQUxEOztFQU1BVixlQUFlLENBQUNVLE1BQWhCLENBQXVCUCxFQUF2QixDQUEwQixNQUExQixFQUFrQ0ssY0FBbEM7O0VBRUEsTUFBTUksZUFBZSxHQUFJSCxLQUFELElBQVc7SUFDakMsSUFBSSxDQUFDSCxTQUFMLEVBQWdCO01BQ2RBLFNBQVMsR0FBRyxDQUFDckQsZUFBQSxDQUFFNEQsT0FBRixDQUFVSixLQUFWLENBQWI7SUFDRDtFQUNGLENBSkQ7O0VBS0FULGVBQWUsQ0FBQzFCLE1BQWhCLENBQXVCNkIsRUFBdkIsQ0FBMEIsTUFBMUIsRUFBa0NTLGVBQWxDOztFQUVBLElBQUk7SUFDRmxDLEdBQUcsQ0FBQ29DLElBQUosQ0FBVSw4QkFBNkJDLGFBQUEsQ0FBS0MsS0FBTCxDQUFXLENBQUMxRCxHQUFHLENBQUN3QyxVQUFKLENBQWVJLElBQWhCLEVBQXNCLEdBQUdMLE9BQXpCLENBQVgsQ0FBOEMsRUFBckY7SUFDQSxNQUFNLElBQUFvQiwwQkFBQSxFQUFpQixNQUFNWCxTQUF2QixFQUFrQztNQUN0Q1ksTUFBTSxFQUFFMUYsNEJBRDhCO01BRXRDMkYsVUFBVSxFQUFFO0lBRjBCLENBQWxDLENBQU47RUFJRCxDQU5ELENBTUUsT0FBT3BELENBQVAsRUFBVTtJQUNWVyxHQUFHLENBQUMwQyxhQUFKLENBQ0csOERBQTZEckQsQ0FBQyxDQUFDc0QsT0FBUSxFQUQxRTtFQUVELENBVEQsU0FTVTtJQUNSckIsZUFBZSxDQUFDVSxNQUFoQixDQUF1QlksY0FBdkIsQ0FBc0MsTUFBdEMsRUFBOENkLGNBQTlDO0lBQ0FSLGVBQWUsQ0FBQzFCLE1BQWhCLENBQXVCZ0QsY0FBdkIsQ0FBc0MsTUFBdEMsRUFBOENWLGVBQTlDO0VBQ0Q7O0VBQ0QsT0FBT1osZUFBUDtBQUNEOztBQUVELGVBQWV1QixxQkFBZixDQUFzQ0MsbUJBQXRDLEVBQTJEcEMsVUFBM0QsRUFBdUVWLEdBQXZFLEVBQTRFVyxJQUFJLEdBQUcsRUFBbkYsRUFBdUY7RUFDckYsTUFBTTtJQUNKQyxLQURJO0lBRUpDLE1BRkk7SUFHSmtDLE9BSEk7SUFJSkMsT0FKSTtJQUtKQyxnQkFMSTtJQU1KQztFQU5JLElBT0Z2QyxJQVBKO0VBUUEsTUFBTUksYUFBYSxHQUFHUixRQUFRLENBQUNLLEtBQUQsRUFBUSxFQUFSLENBQVIsSUFBdUJGLFVBQVUsQ0FBQ0UsS0FBeEQ7RUFDQSxNQUFNSSxjQUFjLEdBQUdULFFBQVEsQ0FBQ00sTUFBRCxFQUFTLEVBQVQsQ0FBUixJQUF3QkgsVUFBVSxDQUFDRyxNQUExRDtFQUNBLE1BQU1zQyxpQkFBaUIsR0FBRyxJQUFJQyx3QkFBSixDQUFlckcsZ0JBQWYsRUFBaUMsQ0FDekQsSUFEeUQsRUFFekQsT0FGeUQsRUFFaEQsTUFGZ0QsRUFHekQsR0FIeUQsRUFHcEQsa0JBQ0YsU0FBUWtHLGdCQUFnQixHQUFHSSxJQUFJLENBQUNDLEdBQUwsQ0FBU3ZDLGFBQVQsRUFBd0JDLGNBQXhCLENBQUgsR0FBNkNELGFBQWMsR0FEakYsR0FFRixVQUFTa0MsZ0JBQWdCLEdBQUdJLElBQUksQ0FBQ0MsR0FBTCxDQUFTdkMsYUFBVCxFQUF3QkMsY0FBeEIsQ0FBSCxHQUE2Q0EsY0FBZSxHQUZuRixHQUdGLGFBQVlOLFVBQVUsQ0FBQzZDLEdBQUksS0FIekIsR0FJSCxrQkFQdUQsRUFRekQsR0FSeUQsRUFRcEQsV0FSb0QsRUFTekQsR0FUeUQsRUFTcEQsT0FUb0QsRUFTM0Msa0JBVDJDLEVBVXpELEdBVnlELEVBVXBELFlBVm9ELEVBV3pELEdBWHlELEVBV3BELE9BWG9ELEVBVzNDLGtCQVgyQyxFQVl6RCxHQVp5RCxFQVlwRCxTQVpvRCxFQVl4QyxXQUFVUixPQUFRLEVBWnNCLEVBYXpELEdBYnlELEVBYXBELGNBYm9ELEVBYW5DLFlBQVcvRSxlQUFnQixFQWJRLEVBY3pELEdBZHlELEVBY3BELGVBZG9ELEVBY2xDLFFBQU9KLFFBQVMsRUFka0IsRUFjZCxRQUFPb0YsT0FBUSxFQWRELENBQWpDLEVBZXZCO0lBQ0RRLEtBQUssRUFBRSxDQUFDVixtQkFBbUIsQ0FBQ2xELE1BQXJCLEVBQTZCLE1BQTdCLEVBQXFDLE1BQXJDO0VBRE4sQ0FmdUIsQ0FBMUI7RUFrQkF1RCxpQkFBaUIsQ0FBQzFCLEVBQWxCLENBQXFCLE1BQXJCLEVBQTZCLENBQUNDLElBQUQsRUFBT0MsTUFBUCxLQUFrQjtJQUM3QzNCLEdBQUcsQ0FBQ00sS0FBSixDQUFXLCtDQUE4Q29CLElBQUssWUFBV0MsTUFBTyxFQUFoRjtFQUNELENBRkQ7RUFHQSxNQUFNOEIsZUFBZSxHQUFHdkYscUJBQXFCLENBQUMsS0FBRCxFQUFRd0MsVUFBVSxDQUFDdEMsSUFBbkIsQ0FBN0M7O0VBQ0EsTUFBTXNGLGlCQUFpQixHQUFHLENBQUM5RCxNQUFELEVBQVNvQyxNQUFULEtBQW9CO0lBQzVDLElBQUl6RCxlQUFBLENBQUVNLElBQUYsQ0FBT21ELE1BQU0sSUFBSXBDLE1BQWpCLENBQUosRUFBOEI7TUFDNUI2RCxlQUFlLENBQUNuRCxLQUFoQixDQUFzQjBCLE1BQU0sSUFBSXBDLE1BQWhDO0lBQ0Q7RUFDRixDQUpEOztFQUtBdUQsaUJBQWlCLENBQUMxQixFQUFsQixDQUFxQixRQUFyQixFQUErQmlDLGlCQUEvQjtFQUNBLElBQUlDLE9BQU8sR0FBRyxLQUFkOztFQUNBLElBQUk7SUFDRjNELEdBQUcsQ0FBQ29DLElBQUosQ0FBVSxnQ0FBK0JlLGlCQUFpQixDQUFDUyxHQUFJLEVBQS9EO0lBQ0EsTUFBTVQsaUJBQWlCLENBQUNVLEtBQWxCLENBQXdCLENBQXhCLENBQU47SUFDQSxNQUFNLElBQUF0QiwwQkFBQSxFQUFpQixZQUFZO01BQ2pDLElBQUk7UUFDRixPQUFPLENBQUMsTUFBTSxJQUFBdUIsNEJBQUEsRUFBZ0JkLE9BQWhCLEVBQXlCcEYsUUFBekIsQ0FBUCxNQUErQyxNQUF0RDtNQUNELENBRkQsQ0FFRSxPQUFPbUcsR0FBUCxFQUFZO1FBQ1osT0FBTyxLQUFQO01BQ0Q7SUFDRixDQU5LLEVBTUg7TUFDRHZCLE1BQU0sRUFBRTFGLDRCQURQO01BRUQyRixVQUFVLEVBQUU7SUFGWCxDQU5HLENBQU47RUFVRCxDQWJELENBYUUsT0FBT3BELENBQVAsRUFBVTtJQUNWc0UsT0FBTyxHQUFHLElBQVY7SUFDQTNELEdBQUcsQ0FBQzBDLGFBQUosQ0FDRywrREFBOERyRCxDQUFDLENBQUNzRCxPQUFRLEVBRDNFO0VBRUQsQ0FqQkQsU0FpQlU7SUFDUixJQUFJLENBQUNPLGtCQUFELElBQXVCUyxPQUEzQixFQUFvQztNQUNsQ1IsaUJBQWlCLENBQUNQLGNBQWxCLENBQWlDLFFBQWpDLEVBQTJDYyxpQkFBM0M7SUFDRDtFQUNGOztFQUNELE9BQU9QLGlCQUFQO0FBQ0Q7O0FBRUQsU0FBU2Esb0JBQVQsQ0FBK0JDLEdBQS9CLEVBQW9DO0VBQ2xDLE9BQU9BLEdBQUcsQ0FBQ0MsT0FBSixDQUFZLGlCQUFaLEtBQ0ZELEdBQUcsQ0FBQ0UsTUFBSixDQUFXQyxhQURULElBRUZILEdBQUcsQ0FBQ0ksVUFBSixDQUFlRCxhQUZiLElBR0ZILEdBQUcsQ0FBQ0ksVUFBSixDQUFlRixNQUFmLENBQXNCQyxhQUgzQjtBQUlEOztBQTJDRHhILFFBQVEsQ0FBQzBILDBCQUFULEdBQXNDLGVBQWVBLDBCQUFmLENBQTJDQyxPQUFPLEdBQUcsRUFBckQsRUFBeUQ7RUFDN0YsS0FBS0Msb0JBQUwsQ0FBMEJ2Ryw0QkFBMUI7RUFFQSxNQUFNO0lBQ0oyQyxLQURJO0lBRUpDLE1BRkk7SUFHSkMsT0FISTtJQUlKMkQsSUFBSSxHQUFHOUcsWUFKSDtJQUtKK0csSUFBSSxHQUFHN0csWUFMSDtJQU1KOEcsUUFOSTtJQU9KM0IsT0FBTyxHQUFHbkYsWUFBWSxHQUFHLENBUHJCO0lBUUprRixPQUFPLEdBQUdqRixlQVJOO0lBU0ptRixnQkFBZ0IsR0FBRyxLQVRmO0lBVUpDLGtCQUFrQixHQUFHO0VBVmpCLElBV0ZxQixPQVhKOztFQWFBLElBQUloRyxlQUFBLENBQUVxRyxXQUFGLENBQWMsS0FBS0MscUJBQW5CLENBQUosRUFBK0M7SUFDN0MsTUFBTWxHLDJCQUEyQixDQUFDLEtBQUtDLEdBQU4sQ0FBakM7RUFDRDs7RUFDRCxJQUFJLENBQUNMLGVBQUEsQ0FBRTRELE9BQUYsQ0FBVSxLQUFLMEMscUJBQWYsQ0FBTCxFQUE0QztJQUMxQyxLQUFLN0UsR0FBTCxDQUFTb0MsSUFBVCxDQUFlLG1EQUFELEdBQ1gsNENBREg7SUFFQTtFQUNEOztFQUNELElBQUksQ0FBQyxNQUFNLElBQUEwQiw0QkFBQSxFQUFnQlksSUFBaEIsRUFBc0JELElBQXRCLENBQVAsTUFBd0MsTUFBNUMsRUFBb0Q7SUFDbEQsS0FBS3pFLEdBQUwsQ0FBU29DLElBQVQsQ0FBZSxhQUFZc0MsSUFBSyxPQUFNRCxJQUFLLFlBQTdCLEdBQ1gsa0RBREg7SUFFQTtFQUNEOztFQUNELElBQUksQ0FBQyxNQUFNLElBQUFYLDRCQUFBLEVBQWdCZCxPQUFoQixFQUF5QnBGLFFBQXpCLENBQVAsTUFBK0MsTUFBbkQsRUFBMkQ7SUFDekQsS0FBS29DLEdBQUwsQ0FBUzBDLGFBQVQsQ0FBd0IsYUFBWU0sT0FBUSxPQUFNcEYsUUFBUyxZQUFwQyxHQUNwQiwwREFESDtFQUVEOztFQUNELEtBQUtpSCxxQkFBTCxHQUE2QixJQUE3QjtFQUVBLE1BQU1uRSxVQUFVLEdBQUcsTUFBTVgsYUFBYSxDQUFDLEtBQUtuQixHQUFOLEVBQVcsS0FBS29CLEdBQWhCLENBQXRDO0VBQ0EsTUFBTThDLG1CQUFtQixHQUFHLE1BQU1yQyx1QkFBdUIsQ0FBQyxLQUFLN0IsR0FBTixFQUFXLEtBQUtvQixHQUFoQixFQUFxQlUsVUFBckIsRUFBaUM7SUFDeEZFLEtBRHdGO0lBRXhGQyxNQUZ3RjtJQUd4RkM7RUFId0YsQ0FBakMsQ0FBekQ7RUFLQSxJQUFJcUMsaUJBQUo7O0VBQ0EsSUFBSTtJQUNGQSxpQkFBaUIsR0FBRyxNQUFNTixxQkFBcUIsQ0FBQ0MsbUJBQUQsRUFBc0JwQyxVQUF0QixFQUFrQyxLQUFLVixHQUF2QyxFQUE0QztNQUN6RlksS0FEeUY7TUFFekZDLE1BRnlGO01BR3pGa0MsT0FIeUY7TUFJekZDLE9BSnlGO01BS3pGQyxnQkFMeUY7TUFNekZDO0lBTnlGLENBQTVDLENBQS9DO0VBUUQsQ0FURCxDQVNFLE9BQU83RCxDQUFQLEVBQVU7SUFDVixJQUFJeUQsbUJBQW1CLENBQUNnQyxJQUFwQixDQUF5QixDQUF6QixDQUFKLEVBQWlDO01BQy9CaEMsbUJBQW1CLENBQUNnQyxJQUFwQjtJQUNEOztJQUNELE1BQU16RixDQUFOO0VBQ0Q7O0VBRUQsSUFBSTBGLFdBQUo7RUFDQSxJQUFJQyxXQUFKOztFQUNBLElBQUk7SUFDRixNQUFNLElBQUkxRixpQkFBSixDQUFNLENBQUMyRixPQUFELEVBQVVDLE1BQVYsS0FBcUI7TUFDL0JILFdBQVcsR0FBR0ksWUFBQSxDQUFJQyxnQkFBSixDQUFxQnBDLE9BQXJCLEVBQThCcEYsUUFBOUIsRUFBd0MsTUFBTTtRQUMxRCxLQUFLb0MsR0FBTCxDQUFTb0MsSUFBVCxDQUFlLG1EQUFrRHhFLFFBQVMsSUFBR29GLE9BQVEsRUFBckY7UUFDQWdDLFdBQVcsR0FBR0ssYUFBQSxDQUFLQyxZQUFMLENBQWtCLENBQUNyQixHQUFELEVBQU1zQixHQUFOLEtBQWM7VUFDNUMsTUFBTW5CLGFBQWEsR0FBR0osb0JBQW9CLENBQUNDLEdBQUQsQ0FBMUM7O1VBQ0EsTUFBTXVCLGVBQWUsR0FBR0MsWUFBQSxDQUFJQyxLQUFKLENBQVV6QixHQUFHLENBQUN3QixHQUFkLEVBQW1CZCxRQUEzQzs7VUFDQSxLQUFLM0UsR0FBTCxDQUFTb0MsSUFBVCxDQUFlLG1EQUFrRGdDLGFBQWMsR0FBakUsR0FDWCxJQUFHSCxHQUFHLENBQUNDLE9BQUosQ0FBWSxZQUFaLEtBQTZCLG9CQUFxQixRQUFPc0IsZUFBZ0IsRUFEL0U7O1VBR0EsSUFBSWIsUUFBUSxJQUFJYSxlQUFlLEtBQUtiLFFBQXBDLEVBQThDO1lBQzVDLEtBQUszRSxHQUFMLENBQVNvQyxJQUFULENBQWMsNEVBQWQ7WUFDQW1ELEdBQUcsQ0FBQ0ksU0FBSixDQUFjLEdBQWQsRUFBbUI7Y0FDakJDLFVBQVUsRUFBRSxPQURLO2NBRWpCLGdCQUFnQjtZQUZDLENBQW5CO1lBSUFMLEdBQUcsQ0FBQ00sS0FBSixDQUFXLElBQUdMLGVBQWdCLHFDQUE5QjtZQUNBRCxHQUFHLENBQUNPLEdBQUo7WUFDQTtVQUNEOztVQUVELEtBQUs5RixHQUFMLENBQVNvQyxJQUFULENBQWMsMEJBQWQ7VUFDQW1ELEdBQUcsQ0FBQ0ksU0FBSixDQUFjLEdBQWQsRUFBbUI7WUFDakIsaUJBQWlCLDJFQURBO1lBRWpCSSxNQUFNLEVBQUUsVUFGUztZQUdqQkgsVUFBVSxFQUFFLE9BSEs7WUFJakIsZ0JBQWlCLHVDQUFzQzVILGVBQWdCO1VBSnRELENBQW5CO1VBT0ErRyxXQUFXLENBQUNpQixJQUFaLENBQWlCVCxHQUFqQjtRQUNELENBMUJhLENBQWQ7UUEyQkFQLFdBQVcsQ0FBQ3ZELEVBQVosQ0FBZSxPQUFmLEVBQXlCcEMsQ0FBRCxJQUFPO1VBQzdCLEtBQUtXLEdBQUwsQ0FBU2lHLElBQVQsQ0FBYzVHLENBQWQ7VUFDQTZGLE1BQU0sQ0FBQzdGLENBQUQsQ0FBTjtRQUNELENBSEQ7UUFJQTJGLFdBQVcsQ0FBQ3ZELEVBQVosQ0FBZSxPQUFmLEVBQXdCLE1BQU07VUFDNUIsS0FBS3pCLEdBQUwsQ0FBU00sS0FBVCxDQUFnQiwwQkFBeUJtRSxJQUFLLElBQUdDLElBQUssa0JBQXREO1FBQ0QsQ0FGRDtRQUdBTSxXQUFXLENBQUN2RCxFQUFaLENBQWUsV0FBZixFQUE0QixNQUFNO1VBQ2hDLEtBQUt6QixHQUFMLENBQVNvQyxJQUFULENBQWUsK0NBQThDcUMsSUFBSyxJQUFHQyxJQUFLLEVBQTFFO1VBQ0FPLE9BQU87UUFDUixDQUhEO1FBSUFELFdBQVcsQ0FBQ2tCLE1BQVosQ0FBbUJ4QixJQUFuQixFQUF5QkQsSUFBekI7TUFDRCxDQXpDYSxDQUFkO01BMENBTSxXQUFXLENBQUN0RCxFQUFaLENBQWUsT0FBZixFQUF5QnBDLENBQUQsSUFBTztRQUM3QixLQUFLVyxHQUFMLENBQVNtRyxLQUFULENBQWU5RyxDQUFmO1FBQ0E2RixNQUFNLENBQUM3RixDQUFELENBQU47TUFDRCxDQUhEO0lBSUQsQ0EvQ0ssRUErQ0grRyxPQS9DRyxDQStDS3RKLDRCQS9DTCxFQWdESCxpREFBZ0RBLDRCQUE2QixJQWhEMUUsQ0FBTjtFQWlERCxDQWxERCxDQWtERSxPQUFPdUMsQ0FBUCxFQUFVO0lBQ1YsSUFBSXlELG1CQUFtQixDQUFDZ0MsSUFBcEIsQ0FBeUIsQ0FBekIsQ0FBSixFQUFpQztNQUMvQmhDLG1CQUFtQixDQUFDZ0MsSUFBcEI7SUFDRDs7SUFDRCxJQUFJM0IsaUJBQWlCLENBQUNrRCxTQUF0QixFQUFpQztNQUMvQixNQUFNbEQsaUJBQWlCLENBQUNtRCxJQUFsQixFQUFOO0lBQ0Q7O0lBQ0QsSUFBSXZCLFdBQUosRUFBaUI7TUFDZkEsV0FBVyxDQUFDd0IsT0FBWjtJQUNEOztJQUNELElBQUl2QixXQUFXLElBQUlBLFdBQVcsQ0FBQ3dCLFNBQS9CLEVBQTBDO01BQ3hDeEIsV0FBVyxDQUFDeUIsS0FBWjtJQUNEOztJQUNELE1BQU1wSCxDQUFOO0VBQ0Q7O0VBRUQsS0FBS3dGLHFCQUFMLEdBQTZCO0lBQzNCL0IsbUJBRDJCO0lBRTNCSyxpQkFGMkI7SUFHM0I0QixXQUgyQjtJQUkzQkM7RUFKMkIsQ0FBN0I7QUFNRCxDQXBJRDs7QUEwSUFwSSxRQUFRLENBQUM4Six5QkFBVCxHQUFxQyxlQUFlQSx5QkFBZixHQUE4RDtFQUNqRyxJQUFJbkksZUFBQSxDQUFFNEQsT0FBRixDQUFVLEtBQUswQyxxQkFBZixDQUFKLEVBQTJDO0lBQ3pDLElBQUksQ0FBQ3RHLGVBQUEsQ0FBRXFHLFdBQUYsQ0FBYyxLQUFLQyxxQkFBbkIsQ0FBTCxFQUFnRDtNQUM5QyxLQUFLN0UsR0FBTCxDQUFTTSxLQUFULENBQWdCLDJEQUFoQjtJQUNEOztJQUNEO0VBQ0Q7O0VBRUQsTUFBTTtJQUNKd0MsbUJBREk7SUFFSkssaUJBRkk7SUFHSjRCLFdBSEk7SUFJSkM7RUFKSSxJQUtGLEtBQUtILHFCQUxUOztFQU9BLElBQUk7SUFDRkUsV0FBVyxDQUFDZSxHQUFaOztJQUNBLElBQUlkLFdBQVcsQ0FBQ3dCLFNBQWhCLEVBQTJCO01BQ3pCeEIsV0FBVyxDQUFDeUIsS0FBWjtJQUNEOztJQUNELElBQUkzRCxtQkFBbUIsQ0FBQ2dDLElBQXBCLENBQXlCLENBQXpCLENBQUosRUFBaUM7TUFDL0JoQyxtQkFBbUIsQ0FBQ2dDLElBQXBCLENBQXlCLFFBQXpCO0lBQ0Q7O0lBQ0QsSUFBSTNCLGlCQUFpQixDQUFDa0QsU0FBdEIsRUFBaUM7TUFDL0IsSUFBSTtRQUNGLE1BQU1sRCxpQkFBaUIsQ0FBQ21ELElBQWxCLENBQXVCLFFBQXZCLENBQU47TUFDRCxDQUZELENBRUUsT0FBT2pILENBQVAsRUFBVTtRQUNWLEtBQUtXLEdBQUwsQ0FBU2lHLElBQVQsQ0FBYzVHLENBQWQ7O1FBQ0EsSUFBSTtVQUNGLE1BQU04RCxpQkFBaUIsQ0FBQ21ELElBQWxCLENBQXVCLFNBQXZCLENBQU47UUFDRCxDQUZELENBRUUsT0FBT0ssRUFBUCxFQUFXO1VBQ1gsS0FBSzNHLEdBQUwsQ0FBU21HLEtBQVQsQ0FBZVEsRUFBZjtRQUNEO01BQ0Y7SUFDRjs7SUFDRCxLQUFLM0csR0FBTCxDQUFTb0MsSUFBVCxDQUFlLDJEQUFmO0VBQ0QsQ0FyQkQsU0FxQlU7SUFDUixLQUFLeUMscUJBQUwsR0FBNkIsSUFBN0I7RUFDRDtBQUNGLENBdkNEOztlQTBDZWpJLFEifQ==
354
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIlJFQ09SRElOR19JTlRFUlZBTF9TRUMiLCJTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TIiwiR1NUUkVBTUVSX0JJTkFSWSIsInN5c3RlbSIsImlzV2luZG93cyIsIkdTVF9JTlNQRUNUX0JJTkFSWSIsIlJFUVVJUkVEX0dTVF9QTFVHSU5TIiwiYXZkZWNfaDI2NCIsImgyNjRwYXJzZSIsImpwZWdlbmMiLCJ0Y3BzZXJ2ZXJzaW5rIiwibXVsdGlwYXJ0bXV4IiwiU0NSRUVOUkVDT1JEX0JJTkFSWSIsIkdTVF9UVVRPUklBTF9VUkwiLCJERUZBVUxUX0hPU1QiLCJUQ1BfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIkRFRkFVTFRfUVVBTElUWSIsIkRFRkFVTFRfQklUUkFURSIsIkJPVU5EQVJZX1NUUklORyIsIkFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUiLCJjcmVhdGVTdHJlYW1pbmdMb2dnZXIiLCJzdHJlYW1OYW1lIiwidWRpZCIsImxvZ2dlciIsImdldExvZ2dlciIsIl8iLCJ0cnVuY2F0ZSIsImxlbmd0aCIsIm9taXNzaW9uIiwidmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIiwiYWRiIiwidHJpbSIsInNoZWxsIiwiRXJyb3IiLCJnc3RyZWFtZXJDaGVja1Byb21pc2VzIiwiYmluYXJ5TmFtZSIsInB1c2giLCJmcyIsIndoaWNoIiwiZSIsIkIiLCJhbGwiLCJtb2R1bGVDaGVja1Byb21pc2VzIiwibmFtZSIsIm1vZE5hbWUiLCJ0b1BhaXJzIiwic3Rkb3V0IiwiZXhlYyIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsImxvZyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImRlYnVnIiwicGFyc2VJbnQiLCJjdXJEZXZpY2VJZCIsImluaXREZXZpY2VTdHJlYW1pbmdQcm9jIiwiZGV2aWNlSW5mbyIsIm9wdHMiLCJ3aWR0aCIsImhlaWdodCIsImJpdFJhdGUiLCJhZGp1c3RlZFdpZHRoIiwiYWRqdXN0ZWRIZWlnaHQiLCJhZGp1c3RlZEJpdHJhdGUiLCJzY3JlZW5SZWNvcmRDbWQiLCJhZGJBcmdzIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiZGV2aWNlU3RyZWFtaW5nIiwic3Bhd24iLCJwYXRoIiwib24iLCJjb2RlIiwic2lnbmFsIiwiaXNTdGFydGVkIiwiZGV2aWNlU3RyZWFtaW5nTG9nZ2VyIiwiZXJyb3JzTGlzdGVuZXIiLCJjaHVuayIsInN0ZGVyciIsInRvU3RyaW5nIiwic3RhcnR1cExpc3RlbmVyIiwiaXNFbXB0eSIsImluZm8iLCJ1dGlsIiwicXVvdGUiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwicmVtb3ZlTGlzdGVuZXIiLCJpbml0R3N0cmVhbWVyUGlwZWxpbmUiLCJkZXZpY2VTdHJlYW1pbmdQcm9jIiwicXVhbGl0eSIsInRjcFBvcnQiLCJjb25zaWRlclJvdGF0aW9uIiwibG9nUGlwZWxpbmVEZXRhaWxzIiwiZ3N0cmVhbWVyUGlwZWxpbmUiLCJTdWJQcm9jZXNzIiwiTWF0aCIsIm1heCIsImZwcyIsInN0ZGlvIiwiZ3N0cmVhbWVyTG9nZ2VyIiwiZ3N0T3V0cHV0TGlzdGVuZXIiLCJkaWRGYWlsIiwicmVwIiwic3RhcnQiLCJjaGVja1BvcnRTdGF0dXMiLCJpZ24iLCJleHRyYWN0UmVtb3RlQWRkcmVzcyIsInJlcSIsImhlYWRlcnMiLCJzb2NrZXQiLCJyZW1vdGVBZGRyZXNzIiwiY29ubmVjdGlvbiIsIm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwib3B0aW9ucyIsImVuc3VyZUZlYXR1cmVFbmFibGVkIiwiaG9zdCIsInBvcnQiLCJwYXRobmFtZSIsImlzVW5kZWZpbmVkIiwiX3NjcmVlblN0cmVhbWluZ1Byb3BzIiwia2lsbCIsIm1qcGVnU29ja2V0IiwibWpwZWdTZXJ2ZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwibmV0IiwiY3JlYXRlQ29ubmVjdGlvbiIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjdXJyZW50UGF0aG5hbWUiLCJ1cmwiLCJwYXJzZSIsIndyaXRlSGVhZCIsIkNvbm5lY3Rpb24iLCJ3cml0ZSIsImVuZCIsIlByYWdtYSIsInBpcGUiLCJ3YXJuIiwibGlzdGVuIiwiZXJyb3IiLCJ0aW1lb3V0IiwiaXNSdW5uaW5nIiwic3RvcCIsImRlc3Ryb3kiLCJsaXN0ZW5pbmciLCJjbG9zZSIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJlMSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCBzeXN0ZW0sIGxvZ2dlciwgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMsIFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuY29uc3QgUkVDT1JESU5HX0lOVEVSVkFMX1NFQyA9IDU7XG5jb25zdCBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IEdTVFJFQU1FUl9CSU5BUlkgPSBgZ3N0LWxhdW5jaC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBHU1RfSU5TUEVDVF9CSU5BUlkgPSBgZ3N0LWluc3BlY3QtMS4wJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgUkVRVUlSRURfR1NUX1BMVUdJTlMgPSB7XG4gIGF2ZGVjX2gyNjQ6ICdnc3QtbGliYXYnLFxuICBoMjY0cGFyc2U6ICdnc3QtcGx1Z2lucy1iYWQnLFxuICBqcGVnZW5jOiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG4gIHRjcHNlcnZlcnNpbms6ICdnc3QtcGx1Z2lucy1iYXNlJyxcbiAgbXVsdGlwYXJ0bXV4OiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG59O1xuY29uc3QgU0NSRUVOUkVDT1JEX0JJTkFSWSA9ICdzY3JlZW5yZWNvcmQnO1xuY29uc3QgR1NUX1RVVE9SSUFMX1VSTCA9ICdodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZG9jdW1lbnRhdGlvbi9pbnN0YWxsaW5nL2luZGV4Lmh0bWwnO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBUQ1BfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9QT1JUID0gODA5MztcbmNvbnN0IERFRkFVTFRfUVVBTElUWSA9IDcwO1xuY29uc3QgREVGQVVMVF9CSVRSQVRFID0gNDAwMDAwMDsgLy8gNCBNYnBzXG5jb25zdCBCT1VOREFSWV9TVFJJTkcgPSAnLS0yYWU5NzQ2ODg3ZjE3MGI4Y2Y3YzI3MTA0N2NlMzE0Yyc7XG5cbmNvbnN0IEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUgPSAnYWRiX3NjcmVlbl9zdHJlYW1pbmcnO1xuXG5mdW5jdGlvbiBjcmVhdGVTdHJlYW1pbmdMb2dnZXIgKHN0cmVhbU5hbWUsIHVkaWQpIHtcbiAgcmV0dXJuIGxvZ2dlci5nZXRMb2dnZXIoYCR7c3RyZWFtTmFtZX1AYCArIF8udHJ1bmNhdGUodWRpZCwge1xuICAgIGxlbmd0aDogOCxcbiAgICBvbWlzc2lvbjogJycsXG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIChhZGIpIHtcbiAgaWYgKCFfLnRyaW0oYXdhaXQgYWRiLnNoZWxsKFsnd2hpY2gnLCBTQ1JFRU5SRUNPUkRfQklOQVJZXSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSByZXF1aXJlZCAnJHtTQ1JFRU5SRUNPUkRfQklOQVJZfScgYmluYXJ5IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0YCk7XG4gIH1cblxuICBjb25zdCBnc3RyZWFtZXJDaGVja1Byb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgYmluYXJ5TmFtZSBvZiBbR1NUUkVBTUVSX0JJTkFSWSwgR1NUX0lOU1BFQ1RfQklOQVJZXSkge1xuICAgIGdzdHJlYW1lckNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICcke2JpbmFyeU5hbWV9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgUEFUSCBvbiB0aGUgaG9zdCBzeXN0ZW0uIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGdzdHJlYW1lckNoZWNrUHJvbWlzZXMpO1xuXG4gIGNvbnN0IG1vZHVsZUNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgbW9kTmFtZV0gb2YgXy50b1BhaXJzKFJFUVVJUkVEX0dTVF9QTFVHSU5TKSkge1xuICAgIG1vZHVsZUNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKEdTVF9JTlNQRUNUX0JJTkFSWSwgW25hbWVdKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhzdGRvdXQsIG1vZE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHJlcXVpcmVkIEdTdHJlYW1lciBwbHVnaW4gJyR7bmFtZX0nIGZyb20gJyR7bW9kTmFtZX0nIG1vZHVsZSBpcyBub3QgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgU2VlICR7R1NUX1RVVE9SSUFMX1VSTH0gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gaW5zdGFsbCBpdC5gKTtcbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChtb2R1bGVDaGVja1Byb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mbyAoYWRiLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnZGlzcGxheSddKTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcGF0dGVybl0gb2YgW1xuICAgIFsnd2lkdGgnLCAvXFxiZGV2aWNlV2lkdGg9KFxcZCspL10sXG4gICAgWydoZWlnaHQnLCAvXFxiZGV2aWNlSGVpZ2h0PShcXGQrKS9dLFxuICAgIFsnZnBzJywgL1xcYmZwcz0oXFxkKykvXSxcbiAgXSkge1xuICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nPy5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGRldmljZSAke2tleX0gZnJvbSB0aGUgYWRiIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICAgYENoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMuYCk7XG4gICAgfVxuICAgIHJlc3VsdFtrZXldID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgfVxuICByZXN1bHQudWRpZCA9IGFkYi5jdXJEZXZpY2VJZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZVN0cmVhbWluZ1Byb2MgKGFkYiwgbG9nLCBkZXZpY2VJbmZvLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgYWRqdXN0ZWRCaXRyYXRlID0gcGFyc2VJbnQoYml0UmF0ZSwgMTApIHx8IERFRkFVTFRfQklUUkFURTtcbiAgbGV0IHNjcmVlblJlY29yZENtZCA9IFNDUkVFTlJFQ09SRF9CSU5BUlkgK1xuICAgIGAgLS1vdXRwdXQtZm9ybWF0PWgyNjRgICtcbiAgICAvLyA1IHNlY29uZHMgaXMgZmluZSB0byBkZXRlY3Qgcm90YXRpb24gY2hhbmdlc1xuICAgIGAgLS10aW1lLWxpbWl0PSR7UkVDT1JESU5HX0lOVEVSVkFMX1NFQ31gO1xuICBpZiAod2lkdGggfHwgaGVpZ2h0KSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1zaXplPSR7YWRqdXN0ZWRXaWR0aH14JHthZGp1c3RlZEhlaWdodH1gO1xuICB9XG4gIGlmIChiaXRSYXRlKSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1iaXQtcmF0ZT0ke2FkanVzdGVkQml0cmF0ZX1gO1xuICB9XG4gIGNvbnN0IGFkYkFyZ3MgPSBbXG4gICAgLi4uYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ2V4ZWMtb3V0JyxcbiAgICAvLyBUaGUgbG9vcCBpcyByZXF1aXJlZCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZSBtYXhpbXVtIHJlY29yZCBkdXJhdGlvblxuICAgIC8vIGZvciBzY3JlZW5yZWNvcmQgaXMgYWx3YXlzIGxpbWl0ZWRcbiAgICBgd2hpbGUgdHJ1ZTsgZG8gJHtzY3JlZW5SZWNvcmRDbWR9IC07IGRvbmVgLFxuICBdO1xuICBjb25zdCBkZXZpY2VTdHJlYW1pbmcgPSBzcGF3bihhZGIuZXhlY3V0YWJsZS5wYXRoLCBhZGJBcmdzKTtcbiAgZGV2aWNlU3RyZWFtaW5nLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIHN0cmVhbWluZyBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICB9KTtcblxuICBsZXQgaXNTdGFydGVkID0gZmFsc2U7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ0xvZ2dlciA9IGNyZWF0ZVN0cmVhbWluZ0xvZ2dlcihTQ1JFRU5SRUNPUkRfQklOQVJZLCBkZXZpY2VJbmZvLnVkaWQpO1xuICBjb25zdCBlcnJvcnNMaXN0ZW5lciA9IChjaHVuaykgPT4ge1xuICAgIGNvbnN0IHN0ZGVyciA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgaWYgKF8udHJpbShzdGRlcnIpKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdMb2dnZXIuZGVidWcoc3RkZXJyKTtcbiAgICB9XG4gIH07XG4gIGRldmljZVN0cmVhbWluZy5zdGRlcnIub24oJ2RhdGEnLCBlcnJvcnNMaXN0ZW5lcik7XG5cbiAgY29uc3Qgc3RhcnR1cExpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgaWYgKCFpc1N0YXJ0ZWQpIHtcbiAgICAgIGlzU3RhcnRlZCA9ICFfLmlzRW1wdHkoY2h1bmspO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZG91dC5vbignZGF0YScsIHN0YXJ0dXBMaXN0ZW5lcik7XG5cbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgZGV2aWNlIHN0cmVhbWluZzogJHt1dGlsLnF1b3RlKFthZGIuZXhlY3V0YWJsZS5wYXRoLCAuLi5hZGJBcmdzXSl9YCk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbigoKSA9PiBpc1N0YXJ0ZWQsIHtcbiAgICAgIHdhaXRNczogU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFxuICAgICAgYENhbm5vdCBzdGFydCB0aGUgc2NyZWVuIHN0cmVhbWluZyBwcm9jZXNzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5yZW1vdmVMaXN0ZW5lcignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcbiAgfVxuICByZXR1cm4gZGV2aWNlU3RyZWFtaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0R3N0cmVhbWVyUGlwZWxpbmUgKGRldmljZVN0cmVhbWluZ1Byb2MsIGRldmljZUluZm8sIGxvZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcXVhbGl0eSxcbiAgICB0Y3BQb3J0LFxuICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgZ3N0cmVhbWVyUGlwZWxpbmUgPSBuZXcgU3ViUHJvY2VzcyhHU1RSRUFNRVJfQklOQVJZLCBbXG4gICAgJy12JyxcbiAgICAnZmRzcmMnLCAnZmQ9MCcsXG4gICAgJyEnLCAndmlkZW8veC1oMjY0LCcgK1xuICAgICAgYHdpZHRoPSR7Y29uc2lkZXJSb3RhdGlvbiA/IE1hdGgubWF4KGFkanVzdGVkV2lkdGgsIGFkanVzdGVkSGVpZ2h0KSA6IGFkanVzdGVkV2lkdGh9LGAgK1xuICAgICAgYGhlaWdodD0ke2NvbnNpZGVyUm90YXRpb24gPyBNYXRoLm1heChhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCkgOiBhZGp1c3RlZEhlaWdodH0sYCArXG4gICAgICBgZnJhbWVyYXRlPSR7ZGV2aWNlSW5mby5mcHN9LzEsYCArXG4gICAgICAnYnl0ZS1zdHJlYW09dHJ1ZScsXG4gICAgJyEnLCAnaDI2NHBhcnNlJyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdhdmRlY19oMjY0JyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdqcGVnZW5jJywgYHF1YWxpdHk9JHtxdWFsaXR5fWAsXG4gICAgJyEnLCAnbXVsdGlwYXJ0bXV4JywgYGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWAsXG4gICAgJyEnLCAndGNwc2VydmVyc2luaycsIGBob3N0PSR7VENQX0hPU1R9YCwgYHBvcnQ9JHt0Y3BQb3J0fWAsXG4gIF0sIHtcbiAgICBzdGRpbzogW2RldmljZVN0cmVhbWluZ1Byb2Muc3Rkb3V0LCAncGlwZScsICdwaXBlJ11cbiAgfSk7XG4gIGdzdHJlYW1lclBpcGVsaW5lLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgUGlwZWxpbmUgc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuICBjb25zdCBnc3RyZWFtZXJMb2dnZXIgPSBjcmVhdGVTdHJlYW1pbmdMb2dnZXIoJ2dzdCcsIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGdzdE91dHB1dExpc3RlbmVyID0gKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgaWYgKF8udHJpbShzdGRlcnIgfHwgc3Rkb3V0KSkge1xuICAgICAgZ3N0cmVhbWVyTG9nZ2VyLmRlYnVnKHN0ZGVyciB8fCBzdGRvdXQpO1xuICAgIH1cbiAgfTtcbiAgZ3N0cmVhbWVyUGlwZWxpbmUub24oJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgbGV0IGRpZEZhaWwgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgR1N0cmVhbWVyIHBpcGVsaW5lOiAke2dzdHJlYW1lclBpcGVsaW5lLnJlcH1gKTtcbiAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdGFydCgwKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJztcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGlkRmFpbCA9IHRydWU7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHBpcGVsaW5lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCFsb2dQaXBlbGluZURldGFpbHMgfHwgZGlkRmFpbCkge1xuICAgICAgZ3N0cmVhbWVyUGlwZWxpbmUucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdzdHJlYW1lclBpcGVsaW5lO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UmVtb3RlQWRkcmVzcyAocmVxKSB7XG4gIHJldHVybiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ11cbiAgICB8fCByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3NcbiAgICB8fCByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gICAgfHwgcmVxLmNvbm5lY3Rpb24uc29ja2V0LnJlbW90ZUFkZHJlc3M7XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHNjYWxlZCB3aWR0aCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLiBJZiB1bnNldCB0aGVuIHRoZSBzY3JpcHQgd2lsbCBhc3NpZ24gaXRcbiAqIHRvIHRoZSBhY3R1YWwgc2NyZWVuIHdpZHRoIG1lYXN1cmVkIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIHNjYWxlZCBoZWlnaHQgb2YgdGhlIGRldmljZSdzIHNjcmVlbi4gSWYgdW5zZXQgdGhlbiB0aGUgc2NyaXB0IHdpbGwgYXNzaWduIGl0XG4gKiB0byB0aGUgYWN0dWFsIHNjcmVlbiBoZWlnaHQgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIGJpdHMgcGVyIHNlY29uZC5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQwMDAwMDAgKDQgTWIvcykuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaG9zdCBbMTI3LjAuMC4xXSAtIFRoZSBJUCBhZGRyZXNzL2hvc3QgbmFtZSB0byBzdGFydCB0aGUgTUpQRUcgc2VydmVyIG9uLlxuICogWW91IGNhbiBzZXQgaXQgdG8gYDAuMC4wLjBgIHRvIHRyaWdnZXIgdGhlIGJyb2FkY2FzdCBvbiBhbGwgYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGF0aG5hbWUgLSBUaGUgSFRUUCByZXF1ZXN0IHBhdGggdGhlIE1KUEVHIHNlcnZlciBzaG91bGQgYmUgYXZhaWxhYmxlIG9uLlxuICogSWYgdW5zZXQgdGhlbiBhbnkgcGF0aG5hbWUgb24gdGhlIGdpdmVuIGBob3N0YC9gcG9ydGAgY29tYmluYXRpb24gd2lsbCB3b3JrLiBOb3RlIHRoYXQgdGhlIHZhbHVlXG4gKiBzaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggYSBzaW5nbGUgc2xhc2g6IGAvYFxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0Y3BQb3J0IFs4MDk0XSAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCB0aGUgaW50ZXJuYWwgVENQIE1KUEVHIGJyb2FkY2FzdCBvbi5cbiAqIFRoaXMgdHlwZSBvZiBicm9hZGNhc3QgYWx3YXlzIHN0YXJ0cyBvbiB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIChgMTI3LjAuMC4xYCkuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHBvcnQgWzgwOTNdIC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHRoZSBNSlBFRyBzZXJ2ZXIgb24uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHF1YWxpdHkgWzcwXSAtIFRoZSBxdWFsaXR5IHZhbHVlIGZvciB0aGUgc3RyZWFtZWQgSlBFRyBpbWFnZXMuXG4gKiBUaGlzIG51bWJlciBzaG91bGQgYmUgaW4gcmFuZ2UgWzEsIDEwMF0sIHdoZXJlIDEwMCBpcyB0aGUgYmVzdCBxdWFsaXR5LlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gY29uc2lkZXJSb3RhdGlvbiBbZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCB0aGVuIEdTdHJlYW1lciBwaXBlbGluZSB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcmVzdWx0aW5nIGltYWdlcyB0byBwcm9wZXJseSBmaXQgaW1hZ2VzIGluIGJvdGggbGFuZHNjYXBlIGFuZFxuICogcG9ydHJhaXQgb3JpZW50YXRpb25zLiBTZXQgaXQgdG8gYHRydWVgIGlmIHRoZSBkZXZpY2Ugcm90YXRpb24gaXMgbm90IGdvaW5nIHRvIGJlIHRoZSBzYW1lIGR1cmluZyB0aGVcbiAqIGJyb2FkY2FzdGluZyBzZXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gbG9nUGlwZWxpbmVEZXRhaWxzIFtmYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBHU3RyZWFtZXIgcGlwZWxpbmUgZXZlbnRzIGludG9cbiAqIHRoZSBzdGFuZGFyZCBsb2cgb3V0cHV0LiBNaWdodCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyBkZXZpY2Ugc2NyZWVuIGJyb2FkY2FzdCBieSBjcmVhdGluZyBNSlBFRyBzZXJ2ZXIuXG4gKiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCBoYXZlIG5vIGVmZmVjdCB1bmxlc3MgdGhlIHByZXZpb3VzIHN0cmVhbWluZ1xuICogc2Vzc2lvbiBpcyBzdG9wcGVkLlxuICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB0aGUgYGFkYl9zY3JlZW5fc3RyZWFtaW5nYCBmZWF0dXJlIGlzXG4gKiBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHN0cmVhbWluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yXG4gKiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBob3N0IHN5c3RlbSBvclxuICogdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcgKG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgIHBvcnQgPSBERUZBVUxUX1BPUlQsXG4gICAgcGF0aG5hbWUsXG4gICAgdGNwUG9ydCA9IERFRkFVTFRfUE9SVCArIDEsXG4gICAgcXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWSxcbiAgICBjb25zaWRlclJvdGF0aW9uID0gZmFsc2UsXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIGF3YWl0IHZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyh0aGlzLmFkYik7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIHNjcmVlbiBzdHJlYW1pbmcgc2Vzc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFN0b3AgaXQgZmlyc3QgaW4gb3JkZXIgdG8gc3RhcnQgYSBuZXcgb25lLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyhwb3J0LCBob3N0KSkgPT09ICdvcGVuJykge1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSBwb3J0ICMke3BvcnR9IGF0ICR7aG9zdH0gaXMgYnVzeS4gYCArXG4gICAgICBgQXNzdW1pbmcgdGhlIHNjcmVlbiBzdHJlYW1pbmcgaXMgYWxyZWFkeSBydW5uaW5nYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJykge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBwb3J0ICMke3RjcFBvcnR9IGF0ICR7VENQX0hPU1R9IGlzIGJ1c3kuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbGVmdG92ZXJzIGZyb20gcHJldmlvdXMgc2Vzc2lvbnMuYCk7XG4gIH1cbiAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSBudWxsO1xuXG4gIGNvbnN0IGRldmljZUluZm8gPSBhd2FpdCBnZXREZXZpY2VJbmZvKHRoaXMuYWRiLCB0aGlzLmxvZyk7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ1Byb2MgPSBhd2FpdCBpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyh0aGlzLmFkYiwgdGhpcy5sb2csIGRldmljZUluZm8sIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgfSk7XG4gIGxldCBnc3RyZWFtZXJQaXBlbGluZTtcbiAgdHJ5IHtcbiAgICBnc3RyZWFtZXJQaXBlbGluZSA9IGF3YWl0IGluaXRHc3RyZWFtZXJQaXBlbGluZShkZXZpY2VTdHJlYW1pbmdQcm9jLCBkZXZpY2VJbmZvLCB0aGlzLmxvZywge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBxdWFsaXR5LFxuICAgICAgdGNwUG9ydCxcbiAgICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgICBsb2dQaXBlbGluZURldGFpbHMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxldCBtanBlZ1NvY2tldDtcbiAgbGV0IG1qcGVnU2VydmVyO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG1qcGVnU29ja2V0ID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24odGNwUG9ydCwgVENQX0hPU1QsICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBNSlBFRyBzdHJlYW0gYXQgdGNwOi8vJHtUQ1BfSE9TVH06JHt0Y3BQb3J0fWApO1xuICAgICAgICBtanBlZ1NlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKChyZXEsIHJlcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSBleHRyYWN0UmVtb3RlQWRkcmVzcyhyZXEpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRobmFtZSA9IHVybC5wYXJzZShyZXEudXJsKS5wYXRobmFtZTtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBHb3QgYW4gaW5jb21pbmcgc2NyZWVuIGJyYWRjYXN0aW5nIHJlcXVlc3QgZnJvbSAke3JlbW90ZUFkZHJlc3N9IGAgK1xuICAgICAgICAgICAgYCgke3JlcS5oZWFkZXJzWyd1c2VyLWFnZW50J10gfHwgJ1VzZXIgQWdlbnQgdW5rbm93bid9KSBhdCAke2N1cnJlbnRQYXRobmFtZX1gKTtcblxuICAgICAgICAgIGlmIChwYXRobmFtZSAmJiBjdXJyZW50UGF0aG5hbWUgIT09IHBhdGhuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZWplY3RpbmcgdGhlIGJyb2FkY2FzdCByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBwYXRobmFtZScpO1xuICAgICAgICAgICAgcmVzLndyaXRlSGVhZCg0MDQsIHtcbiAgICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLndyaXRlKGAnJHtjdXJyZW50UGF0aG5hbWV9JyBkaWQgbm90IG1hdGNoIGFueSBrbm93biBlbmRwb2ludHNgKTtcbiAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBNSlBFRyBicm9hZGNhc3QnKTtcbiAgICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgICAgJ0NhY2hlLUNvbnRyb2wnOiAnbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCcsXG4gICAgICAgICAgICBQcmFnbWE6ICduby1jYWNoZScsXG4gICAgICAgICAgICBDb25uZWN0aW9uOiAnY2xvc2UnLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGBtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlOyBib3VuZGFyeT0ke0JPVU5EQVJZX1NUUklOR31gXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtanBlZ1NvY2tldC5waXBlKHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oZSk7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fSBoYXMgYmVlbiBjbG9zZWRgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgTUpQRUcgc2VydmVyIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gICAgICB9KTtcbiAgICAgIG1qcGVnU29ja2V0Lm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKGUpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9KTtcbiAgICB9KS50aW1lb3V0KFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICBgQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHN0cmVhbWluZyBzZXJ2ZXIgd2l0aGluICR7U1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NU31tc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCk7XG4gICAgfVxuICAgIGlmIChnc3RyZWFtZXJQaXBlbGluZS5pc1J1bm5pbmcpIHtcbiAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU29ja2V0KSB7XG4gICAgICBtanBlZ1NvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChtanBlZ1NlcnZlciAmJiBtanBlZ1NlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgIG1qcGVnU2VydmVyLmNsb3NlKCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cblxuICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IHtcbiAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLFxuICAgIGdzdHJlYW1lclBpcGVsaW5lLFxuICAgIG1qcGVnU29ja2V0LFxuICAgIG1qcGVnU2VydmVyLFxuICB9O1xufTtcblxuLyoqXG4gKiBTdG9wIHNjcmVlbiBzdHJlYW1pbmcuXG4gKiBJZiBubyBzY3JlZW4gc3RyZWFtaW5nIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIHRoZW4gbm90aGluZyBpcyBkb25lLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyAoLyogb3B0aW9ucyA9IHt9ICovKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNjcmVlbiBzdHJlYW1pbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcGApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgZGV2aWNlU3RyZWFtaW5nUHJvYyxcbiAgICBnc3RyZWFtZXJQaXBlbGluZSxcbiAgICBtanBlZ1NvY2tldCxcbiAgICBtanBlZ1NlcnZlcixcbiAgfSA9IHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzO1xuXG4gIHRyeSB7XG4gICAgbWpwZWdTb2NrZXQuZW5kKCk7XG4gICAgaWYgKG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCdTSUdJTlQnKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHSU5UJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHS0lMTCcpO1xuICAgICAgICB9IGNhdGNoIChlMSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGUxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgdGVybWluYXRlZCB0aGUgc2NyZWVuIHN0cmVhbWluZyBNSlBFRyBzZXJ2ZXJgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IG51bGw7XG4gIH1cbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBRW5CLE1BQU1DLHNCQUFzQixHQUFHLENBQUM7QUFDaEMsTUFBTUMsNEJBQTRCLEdBQUcsSUFBSTtBQUN6QyxNQUFNQyxnQkFBZ0IsR0FBSSxpQkFBZ0JDLGVBQU0sQ0FBQ0MsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUcsRUFBQztBQUM1RSxNQUFNQyxrQkFBa0IsR0FBSSxrQkFBaUJGLGVBQU0sQ0FBQ0MsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUcsRUFBQztBQUMvRSxNQUFNRSxvQkFBb0IsR0FBRztFQUMzQkMsVUFBVSxFQUFFLFdBQVc7RUFDdkJDLFNBQVMsRUFBRSxpQkFBaUI7RUFDNUJDLE9BQU8sRUFBRSxrQkFBa0I7RUFDM0JDLGFBQWEsRUFBRSxrQkFBa0I7RUFDakNDLFlBQVksRUFBRTtBQUNoQixDQUFDO0FBQ0QsTUFBTUMsbUJBQW1CLEdBQUcsY0FBYztBQUMxQyxNQUFNQyxnQkFBZ0IsR0FBRyx1RUFBdUU7QUFDaEcsTUFBTUMsWUFBWSxHQUFHLFdBQVc7QUFDaEMsTUFBTUMsUUFBUSxHQUFHLFdBQVc7QUFDNUIsTUFBTUMsWUFBWSxHQUFHLElBQUk7QUFDekIsTUFBTUMsZUFBZSxHQUFHLEVBQUU7QUFDMUIs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