appium 2.0.0-beta.2 → 2.0.0-beta.20

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 (70) hide show
  1. package/README.md +9 -9
  2. package/build/lib/appium-config.schema.json +0 -0
  3. package/build/lib/appium.js +157 -53
  4. package/build/lib/cli/argparse-actions.js +104 -0
  5. package/build/lib/cli/args.js +115 -279
  6. package/build/lib/cli/driver-command.js +11 -1
  7. package/build/lib/cli/extension-command.js +60 -8
  8. package/build/lib/cli/extension.js +30 -7
  9. package/build/lib/cli/npm.js +17 -14
  10. package/build/lib/cli/parser.js +152 -89
  11. package/build/lib/cli/plugin-command.js +11 -1
  12. package/build/lib/cli/utils.js +29 -3
  13. package/build/lib/config-file.js +141 -0
  14. package/build/lib/config.js +76 -61
  15. package/build/lib/driver-config.js +42 -19
  16. package/build/lib/drivers.js +8 -4
  17. package/build/lib/ext-config-io.js +165 -0
  18. package/build/lib/extension-config.js +130 -61
  19. package/build/lib/grid-register.js +22 -24
  20. package/build/lib/logger.js +3 -3
  21. package/build/lib/logsink.js +11 -13
  22. package/build/lib/main.js +197 -77
  23. package/build/lib/plugin-config.js +20 -10
  24. package/build/lib/plugins.js +4 -2
  25. package/build/lib/schema/appium-config-schema.js +252 -0
  26. package/build/lib/schema/arg-spec.js +120 -0
  27. package/build/lib/schema/cli-args.js +173 -0
  28. package/build/lib/schema/cli-transformers.js +76 -0
  29. package/build/lib/schema/index.js +36 -0
  30. package/build/lib/schema/keywords.js +62 -0
  31. package/build/lib/schema/schema.js +357 -0
  32. package/build/lib/utils.js +44 -99
  33. package/lib/appium-config.schema.json +277 -0
  34. package/lib/appium.js +201 -65
  35. package/lib/cli/argparse-actions.js +77 -0
  36. package/lib/cli/args.js +174 -375
  37. package/lib/cli/driver-command.js +4 -0
  38. package/lib/cli/extension-command.js +70 -5
  39. package/lib/cli/extension.js +25 -5
  40. package/lib/cli/npm.js +18 -12
  41. package/lib/cli/parser.js +254 -79
  42. package/lib/cli/plugin-command.js +4 -0
  43. package/lib/cli/utils.js +21 -1
  44. package/lib/config-file.js +227 -0
  45. package/lib/config.js +109 -62
  46. package/lib/driver-config.js +66 -11
  47. package/lib/drivers.js +4 -1
  48. package/lib/ext-config-io.js +287 -0
  49. package/lib/extension-config.js +225 -67
  50. package/lib/grid-register.js +27 -24
  51. package/lib/logger.js +1 -1
  52. package/lib/logsink.js +10 -7
  53. package/lib/main.js +211 -77
  54. package/lib/plugin-config.js +34 -5
  55. package/lib/plugins.js +1 -0
  56. package/lib/schema/appium-config-schema.js +286 -0
  57. package/lib/schema/arg-spec.js +218 -0
  58. package/lib/schema/cli-args.js +273 -0
  59. package/lib/schema/cli-transformers.js +123 -0
  60. package/lib/schema/index.js +2 -0
  61. package/lib/schema/keywords.js +119 -0
  62. package/lib/schema/schema.js +577 -0
  63. package/lib/utils.js +42 -88
  64. package/package.json +55 -80
  65. package/postinstall.js +71 -0
  66. package/types/appium-config.d.ts +197 -0
  67. package/types/types.d.ts +201 -0
  68. package/CHANGELOG.md +0 -3515
  69. package/build/lib/cli/parser-helpers.js +0 -82
  70. package/lib/cli/parser-helpers.js +0 -79
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.transformers = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _argparse = require("argparse");
13
+
14
+ var _fs = require("fs");
15
+
16
+ var _lodash = _interopRequireDefault(require("lodash"));
17
+
18
+ function parseCsvLine(value) {
19
+ return value.split(',').map(v => v.trim()).filter(Boolean);
20
+ }
21
+
22
+ function parseCsvFile(value) {
23
+ return value.split(/\r?\n/).map(v => v.trim()).filter(Boolean).flatMap(parseCsvLine);
24
+ }
25
+
26
+ const transformers = {
27
+ csv: value => {
28
+ let body;
29
+
30
+ try {
31
+ body = (0, _fs.readFileSync)(value, 'utf8');
32
+ } catch (err) {
33
+ if (err.code !== 'ENOENT') {
34
+ throw new _argparse.ArgumentTypeError(`Could not read file ${body}: ${err.message}`);
35
+ }
36
+ }
37
+
38
+ try {
39
+ return body ? parseCsvFile(body) : parseCsvLine(value);
40
+ } catch (err) {
41
+ throw new _argparse.ArgumentTypeError('Must be a comma-delimited string, e.g., "foo,bar,baz"');
42
+ }
43
+ },
44
+ json: jsonOrPath => {
45
+ let json = jsonOrPath;
46
+ let loadedFromFile = false;
47
+
48
+ try {
49
+ json = (0, _fs.readFileSync)(jsonOrPath, 'utf8');
50
+ loadedFromFile = true;
51
+ } catch (err) {
52
+ if (err.code !== 'ENOENT') {
53
+ throw err;
54
+ }
55
+ }
56
+
57
+ try {
58
+ const result = JSON.parse(json);
59
+
60
+ if (!_lodash.default.isPlainObject(result)) {
61
+ throw new Error(`'${_lodash.default.truncate(result, {
62
+ length: 100
63
+ })}' is not an object`);
64
+ }
65
+
66
+ return result;
67
+ } catch (e) {
68
+ const msg = loadedFromFile ? `The provided value of '${jsonOrPath}' must be a valid JSON` : `The provided value must be a valid JSON`;
69
+ throw new TypeError(`${msg}. Original error: ${e.message}`);
70
+ }
71
+ }
72
+ };
73
+ exports.transformers = transformers;require('source-map-support').install();
74
+
75
+
76
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvY2xpLXRyYW5zZm9ybWVycy5qcyJdLCJuYW1lcyI6WyJwYXJzZUNzdkxpbmUiLCJ2YWx1ZSIsInNwbGl0IiwibWFwIiwidiIsInRyaW0iLCJmaWx0ZXIiLCJCb29sZWFuIiwicGFyc2VDc3ZGaWxlIiwiZmxhdE1hcCIsInRyYW5zZm9ybWVycyIsImNzdiIsImJvZHkiLCJlcnIiLCJjb2RlIiwiQXJndW1lbnRUeXBlRXJyb3IiLCJtZXNzYWdlIiwianNvbiIsImpzb25PclBhdGgiLCJsb2FkZWRGcm9tRmlsZSIsInJlc3VsdCIsIkpTT04iLCJwYXJzZSIsIl8iLCJpc1BsYWluT2JqZWN0IiwiRXJyb3IiLCJ0cnVuY2F0ZSIsImxlbmd0aCIsImUiLCJtc2ciLCJUeXBlRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBZ0JBLFNBQVNBLFlBQVQsQ0FBdUJDLEtBQXZCLEVBQThCO0FBQzVCLFNBQU9BLEtBQUssQ0FDVEMsS0FESSxDQUNFLEdBREYsRUFFSkMsR0FGSSxDQUVDQyxDQUFELElBQU9BLENBQUMsQ0FBQ0MsSUFBRixFQUZQLEVBR0pDLE1BSEksQ0FHR0MsT0FISCxDQUFQO0FBSUQ7O0FBT0QsU0FBU0MsWUFBVCxDQUF1QlAsS0FBdkIsRUFBOEI7QUFDNUIsU0FBT0EsS0FBSyxDQUNUQyxLQURJLENBQ0UsT0FERixFQUVKQyxHQUZJLENBRUNDLENBQUQsSUFBT0EsQ0FBQyxDQUFDQyxJQUFGLEVBRlAsRUFHSkMsTUFISSxDQUdHQyxPQUhILEVBSUpFLE9BSkksQ0FJSVQsWUFKSixDQUFQO0FBS0Q7O0FBaUJNLE1BQU1VLFlBQVksR0FBRztBQU8xQkMsRUFBQUEsR0FBRyxFQUFHVixLQUFELElBQVc7QUFDZCxRQUFJVyxJQUFKOztBQUdBLFFBQUk7QUFDRkEsTUFBQUEsSUFBSSxHQUFHLHNCQUFhWCxLQUFiLEVBQW9CLE1BQXBCLENBQVA7QUFDRCxLQUZELENBRUUsT0FBT1ksR0FBUCxFQUFZO0FBQ1osVUFBSUEsR0FBRyxDQUFDQyxJQUFKLEtBQWEsUUFBakIsRUFBMkI7QUFDekIsY0FBTSxJQUFJQywyQkFBSixDQUNILHVCQUFzQkgsSUFBSyxLQUFJQyxHQUFHLENBQUNHLE9BQVEsRUFEeEMsQ0FBTjtBQUdEO0FBQ0Y7O0FBRUQsUUFBSTtBQUNGLGFBQU9KLElBQUksR0FBR0osWUFBWSxDQUFDSSxJQUFELENBQWYsR0FBd0JaLFlBQVksQ0FBQ0MsS0FBRCxDQUEvQztBQUNELEtBRkQsQ0FFRSxPQUFPWSxHQUFQLEVBQVk7QUFDWixZQUFNLElBQUlFLDJCQUFKLENBQ0osdURBREksQ0FBTjtBQUdEO0FBQ0YsR0E1QnlCO0FBbUMxQkUsRUFBQUEsSUFBSSxFQUFHQyxVQUFELElBQWdCO0FBQ3BCLFFBQUlELElBQUksR0FBR0MsVUFBWDtBQUNBLFFBQUlDLGNBQWMsR0FBRyxLQUFyQjs7QUFDQSxRQUFJO0FBTUZGLE1BQUFBLElBQUksR0FBRyxzQkFBYUMsVUFBYixFQUF5QixNQUF6QixDQUFQO0FBQ0FDLE1BQUFBLGNBQWMsR0FBRyxJQUFqQjtBQUNELEtBUkQsQ0FRRSxPQUFPTixHQUFQLEVBQVk7QUFFWixVQUFJQSxHQUFHLENBQUNDLElBQUosS0FBYSxRQUFqQixFQUEyQjtBQUN6QixjQUFNRCxHQUFOO0FBQ0Q7QUFDRjs7QUFDRCxRQUFJO0FBQ0YsWUFBTU8sTUFBTSxHQUFHQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0wsSUFBWCxDQUFmOztBQUNBLFVBQUksQ0FBQ00sZ0JBQUVDLGFBQUYsQ0FBZ0JKLE1BQWhCLENBQUwsRUFBOEI7QUFDNUIsY0FBTSxJQUFJSyxLQUFKLENBQ0gsSUFBR0YsZ0JBQUVHLFFBQUYsQ0FBV04sTUFBWCxFQUFtQjtBQUFDTyxVQUFBQSxNQUFNLEVBQUU7QUFBVCxTQUFuQixDQUFrQyxvQkFEbEMsQ0FBTjtBQUdEOztBQUNELGFBQU9QLE1BQVA7QUFDRCxLQVJELENBUUUsT0FBT1EsQ0FBUCxFQUFVO0FBQ1YsWUFBTUMsR0FBRyxHQUFHVixjQUFjLEdBQ3JCLDBCQUF5QkQsVUFBVyx3QkFEZixHQUVyQix5Q0FGTDtBQUdBLFlBQU0sSUFBSVksU0FBSixDQUFlLEdBQUVELEdBQUkscUJBQW9CRCxDQUFDLENBQUNaLE9BQVEsRUFBbkQsQ0FBTjtBQUNEO0FBQ0Y7QUFsRXlCLENBQXJCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IEFyZ3VtZW50VHlwZUVycm9yIH0gZnJvbSAnYXJncGFyc2UnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjdXN0b20ga2V5d29yZHMgZm9yIEFwcGl1bSBzY2hlbWFzLCBhcyB3ZWxsIGFzXG4gKiBcInRyYW5zZm9ybWVyc1wiIChzZWUgYGFyZ1RyYW5zZm9ybWVyc2AgYmVsb3cpLlxuICpcbiAqIEN1c3RvbSBrZXl3b3JkcyBhcmUganVzdCBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBhcHBlYXIgaW4gYSBzY2hlbWEgKGUuZy4sXG4gKiBgYXBwaXVtLWNvbmZpZy1zY2hlbWEuanNgKSBiZXlvbmQgd2hhdCB0aGUgSlNPTiBTY2hlbWEgc3BlYyBvZmZlcnMuICBUaGVzZVxuICogYXJlIHVzYWJsZSBieSBleHRlbnNpb25zLCBhcyB3ZWxsLlxuICovXG5cbi8qKlxuICogU3BsaXRzIGEgQ1NWIHN0cmluZyBpbnRvIGFuIGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuZnVuY3Rpb24gcGFyc2VDc3ZMaW5lICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWVcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHYpID0+IHYudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbi8qKlxuICogU3BsaXQgYSBmaWxlIGJ5IG5ld2xpbmUgdGhlbiBjYWxscyB7QGxpbmsgcGFyc2VDc3ZMaW5lfSBvbiBlYWNoIGxpbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuZnVuY3Rpb24gcGFyc2VDc3ZGaWxlICh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWVcbiAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgIC5tYXAoKHYpID0+IHYudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuZmxhdE1hcChwYXJzZUNzdkxpbmUpO1xufVxuXG4vKipcbiAqIE5hbWVzcGFjZSBjb250YWluaW5nIF90cmFuc2Zvcm1lcnNfIGZvciBDTEkgYXJndW1lbnRzLiAgXCJWYWxpZGF0b3JzXCIgYW5kXG4gKiBcImZvcm1hdHRlcnNcIiBkbyBub3QgYWN0dWFsbHkgbW9kaWZ5IHRoZSB2YWx1ZSwgYnV0IHRoZXNlIGRvLlxuICpcbiAqIFVzZSBjYXNlIGlzIGZvciB3aGVuIHRoZSBjb25maWcgZmlsZSBjYW4gYWNjZXB0IGUuZy4sIGEgYHN0cmluZ1tdYCwgYnV0IHRoZVxuICogQ0xJIGNhbiBvbmx5IHRha2UgYSBgc3RyaW5nYCAoYXMgYGFyZ3BhcnNlYCBzZWVtcyB0byBiZSBsaW1pdGVkIGluIHRoYXRcbiAqIGZhc2hpb247IGl0IGFsc28gY2Fubm90IHVuZGVyc3RhbmQgYW4gYXJndW1lbnQgaGF2aW5nIG11bHRpcGxlIHR5cGVzKS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGBjc3ZgIHRyYW5zZm9ybSB0YWtlcyBhIGBzdHJpbmdgIGFuZCByZXR1cm5zIGEgYHN0cmluZ1tdYCBieVxuICogc3BsaXR0aW5nIGl0IGJ5IGNvbW1hLS1fb3JfIGlmIHRoYXQgYHN0cmluZ2AgaGFwcGVucyB0byBiZSBhXG4gKiBmaWxlcGF0aC0tcmVhZGluZyB0aGUgZmlsZSBhcyBhIGAuY3N2YC5cbiAqXG4gKiBUaGlzIGNvbnRhaW5zIHNvbWUgY29weS1wYXN0ZWQgY29kZSBmcm9tIGBsaWIvY2xpL3BhcnNlci1oZWxwZXJzLmpzYCwgd2hpY2ggd2FzXG4gKiBvYmxpdGVyYXRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybWVycyA9IHtcbiAgLyoqXG4gICAqIEdpdmVuIGEgQ1NWLXN0eWxlIHN0cmluZyBvciBwYXRobmFtZSwgcGFyc2UgaXQgaW50byBhbiBhcnJheS5cbiAgICogVGhlIGZpbGUgY2FuIGFsc28gYmUgc3BsaXQgb24gbmV3bGluZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBjc3Y6ICh2YWx1ZSkgPT4ge1xuICAgIGxldCBib2R5O1xuICAgIC8vIHNpbmNlIHRoaXMgdmFsdWUgY291bGQgYmUgYSBzaW5nbGUgc3RyaW5nIChubyBjb21tYXMpIF9vcl8gYSBwYXRobmFtZSwgd2Ugd2lsbCBuZWVkXG4gICAgLy8gdG8gYXR0ZW1wdCB0byBwYXJzZSBpdCBhcyBhIGZpbGUgX2ZpcnN0Xy5cbiAgICB0cnkge1xuICAgICAgYm9keSA9IHJlYWRGaWxlU3luYyh2YWx1ZSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50VHlwZUVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgcmVhZCBmaWxlICR7Ym9keX06ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJvZHkgPyBwYXJzZUNzdkZpbGUoYm9keSkgOiBwYXJzZUNzdkxpbmUodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50VHlwZUVycm9yKFxuICAgICAgICAnTXVzdCBiZSBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcsIGUuZy4sIFwiZm9vLGJhcixiYXpcIicsXG4gICAgICApO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUGFyc2UgYSBzdHJpbmcgd2hpY2ggY291bGQgYmUgYSBwYXRoIHRvIGEgSlNPTiBmaWxlIG9yIGEgSlNPTiBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqc29uT3JQYXRoXG4gICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAqL1xuICBqc29uOiAoanNvbk9yUGF0aCkgPT4ge1xuICAgIGxldCBqc29uID0ganNvbk9yUGF0aDtcbiAgICBsZXQgbG9hZGVkRnJvbUZpbGUgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgLy8gdXNlIHN5bmNocm9ub3VzIGZpbGUgYWNjZXNzLCBhcyBgYXJncGFyc2VgIHByb3ZpZGVzIG5vIHdheSBvZiBlaXRoZXJcbiAgICAgIC8vIGF3YWl0aW5nIG9yIHVzaW5nIGNhbGxiYWNrcy4gVGhpcyBzdGVwIGhhcHBlbnMgaW4gc3RhcnR1cCwgaW4gd2hhdCBpc1xuICAgICAgLy8gZWZmZWN0aXZlbHkgY29tbWFuZC1saW5lIGNvZGUsIHNvIG5vdGhpbmcgaXMgYmxvY2tlZCBpbiB0ZXJtcyBvZlxuICAgICAgLy8gc2Vzc2lvbnMsIHNvIGhvbGRpbmcgdXAgdGhlIGV2ZW50IGxvb3AgZG9lcyBub3QgaW5jdXIgdGhlIHVzdWFsXG4gICAgICAvLyBkcmF3YmFja3MuXG4gICAgICBqc29uID0gcmVhZEZpbGVTeW5jKGpzb25PclBhdGgsICd1dGY4Jyk7XG4gICAgICBsb2FkZWRGcm9tRmlsZSA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyB1bnJlYWRhYmxlIGZpbGVzIGRvbid0IGNvdW50Li4uIGJ1dCBvdGhlciBwcm9ibGVtcyBkby5cbiAgICAgIGlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgIGlmICghXy5pc1BsYWluT2JqZWN0KHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAnJHtfLnRydW5jYXRlKHJlc3VsdCwge2xlbmd0aDogMTAwfSl9JyBpcyBub3QgYW4gb2JqZWN0YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbXNnID0gbG9hZGVkRnJvbUZpbGVcbiAgICAgICAgPyBgVGhlIHByb3ZpZGVkIHZhbHVlIG9mICcke2pzb25PclBhdGh9JyBtdXN0IGJlIGEgdmFsaWQgSlNPTmBcbiAgICAgICAgOiBgVGhlIHByb3ZpZGVkIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBKU09OYDtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7bXNnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfSxcbn07XG4iXSwiZmlsZSI6ImxpYi9zY2hlbWEvY2xpLXRyYW5zZm9ybWVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ require("source-map-support/register");
8
+
9
+ var _schema = require("./schema");
10
+
11
+ Object.keys(_schema).forEach(function (key) {
12
+ if (key === "default" || key === "__esModule") return;
13
+ if (key in exports && exports[key] === _schema[key]) return;
14
+ Object.defineProperty(exports, key, {
15
+ enumerable: true,
16
+ get: function () {
17
+ return _schema[key];
18
+ }
19
+ });
20
+ });
21
+
22
+ var _cliArgs = require("./cli-args");
23
+
24
+ Object.keys(_cliArgs).forEach(function (key) {
25
+ if (key === "default" || key === "__esModule") return;
26
+ if (key in exports && exports[key] === _cliArgs[key]) return;
27
+ Object.defineProperty(exports, key, {
28
+ enumerable: true,
29
+ get: function () {
30
+ return _cliArgs[key];
31
+ }
32
+ });
33
+ });require('source-map-support').install();
34
+
35
+
36
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc2NoZW1hJztcbmV4cG9ydCAqIGZyb20gJy4vY2xpLWFyZ3MnO1xuIl0sImZpbGUiOiJsaWIvc2NoZW1hL2luZGV4LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.keywords = void 0;
7
+
8
+ require("source-map-support/register");
9
+
10
+ var _cliTransformers = require("./cli-transformers");
11
+
12
+ const keywords = {
13
+ appiumCliAliases: {
14
+ keyword: 'appiumCliAliases',
15
+ metaSchema: {
16
+ type: 'array',
17
+ items: {
18
+ type: 'string',
19
+ minLength: 1
20
+ },
21
+ minItems: 1,
22
+ uniqueItems: true,
23
+ description: 'List of aliases for the argument. Aliases shorter than three (3) characters will be prefixed with a single dash; otherwise two (2).'
24
+ }
25
+ },
26
+ appiumCliDest: {
27
+ keyword: 'appiumCliDest',
28
+ metaSchema: {
29
+ type: 'string',
30
+ minLength: 1,
31
+ description: 'Name of the associated property in the parsed CLI arguments object'
32
+ }
33
+ },
34
+ appiumCliDescription: {
35
+ keyword: 'appiumCliDescription',
36
+ schemaType: 'string',
37
+ metaSchema: {
38
+ type: 'string',
39
+ minLength: 1,
40
+ description: 'Description to provide in the --help text of the CLI. Overrides `description`'
41
+ }
42
+ },
43
+ appiumCliTransformer: {
44
+ keyword: 'appiumCliTransformer',
45
+ metaSchema: {
46
+ type: 'string',
47
+ enum: Object.keys(_cliTransformers.transformers),
48
+ description: 'The name of a custom transformer to run against the value as provided via the CLI.'
49
+ }
50
+ },
51
+ appiumCliIgnore: {
52
+ keyword: 'appiumCliIgnore',
53
+ metaSchema: {
54
+ type: 'boolean',
55
+ description: 'If `true`, Appium will not provide this property as a CLI argument.'
56
+ }
57
+ }
58
+ };
59
+ exports.keywords = keywords;require('source-map-support').install();
60
+
61
+
62
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEva2V5d29yZHMuanMiXSwibmFtZXMiOlsia2V5d29yZHMiLCJhcHBpdW1DbGlBbGlhc2VzIiwia2V5d29yZCIsIm1ldGFTY2hlbWEiLCJ0eXBlIiwiaXRlbXMiLCJtaW5MZW5ndGgiLCJtaW5JdGVtcyIsInVuaXF1ZUl0ZW1zIiwiZGVzY3JpcHRpb24iLCJhcHBpdW1DbGlEZXN0IiwiYXBwaXVtQ2xpRGVzY3JpcHRpb24iLCJzY2hlbWFUeXBlIiwiYXBwaXVtQ2xpVHJhbnNmb3JtZXIiLCJlbnVtIiwiT2JqZWN0Iiwia2V5cyIsInRyYW5zZm9ybWVycyIsImFwcGl1bUNsaUlnbm9yZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRUE7O0FBTU8sTUFBTUEsUUFBUSxHQUFHO0FBWXRCQyxFQUFBQSxnQkFBZ0IsRUFBRTtBQUNoQkMsSUFBQUEsT0FBTyxFQUFFLGtCQURPO0FBRWhCQyxJQUFBQSxVQUFVLEVBQUU7QUFDVkMsTUFBQUEsSUFBSSxFQUFFLE9BREk7QUFFVkMsTUFBQUEsS0FBSyxFQUFFO0FBQ0xELFFBQUFBLElBQUksRUFBRSxRQUREO0FBRUxFLFFBQUFBLFNBQVMsRUFBRTtBQUZOLE9BRkc7QUFNVkMsTUFBQUEsUUFBUSxFQUFFLENBTkE7QUFPVkMsTUFBQUEsV0FBVyxFQUFFLElBUEg7QUFRVkMsTUFBQUEsV0FBVyxFQUFFO0FBUkg7QUFGSSxHQVpJO0FBbUN0QkMsRUFBQUEsYUFBYSxFQUFFO0FBQ2JSLElBQUFBLE9BQU8sRUFBRSxlQURJO0FBRWJDLElBQUFBLFVBQVUsRUFBRTtBQUNWQyxNQUFBQSxJQUFJLEVBQUUsUUFESTtBQUVWRSxNQUFBQSxTQUFTLEVBQUUsQ0FGRDtBQUdWRyxNQUFBQSxXQUFXLEVBQUU7QUFISDtBQUZDLEdBbkNPO0FBb0R0QkUsRUFBQUEsb0JBQW9CLEVBQUU7QUFDcEJULElBQUFBLE9BQU8sRUFBRSxzQkFEVztBQUVwQlUsSUFBQUEsVUFBVSxFQUFFLFFBRlE7QUFHcEJULElBQUFBLFVBQVUsRUFBRTtBQUNWQyxNQUFBQSxJQUFJLEVBQUUsUUFESTtBQUVWRSxNQUFBQSxTQUFTLEVBQUUsQ0FGRDtBQUdWRyxNQUFBQSxXQUFXLEVBQUU7QUFISDtBQUhRLEdBcERBO0FBbUV0QkksRUFBQUEsb0JBQW9CLEVBQUU7QUFDcEJYLElBQUFBLE9BQU8sRUFBRSxzQkFEVztBQUVwQkMsSUFBQUEsVUFBVSxFQUFFO0FBQ1ZDLE1BQUFBLElBQUksRUFBRSxRQURJO0FBRVZVLE1BQUFBLElBQUksRUFBRUMsTUFBTSxDQUFDQyxJQUFQLENBQVlDLDZCQUFaLENBRkk7QUFHVlIsTUFBQUEsV0FBVyxFQUFFO0FBSEg7QUFGUSxHQW5FQTtBQWdGdEJTLEVBQUFBLGVBQWUsRUFBRTtBQUNmaEIsSUFBQUEsT0FBTyxFQUFFLGlCQURNO0FBRWZDLElBQUFBLFVBQVUsRUFBRTtBQUNWQyxNQUFBQSxJQUFJLEVBQUUsU0FESTtBQUVWSyxNQUFBQSxXQUFXLEVBQUU7QUFGSDtBQUZHO0FBaEZLLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7IHRyYW5zZm9ybWVycyB9IGZyb20gJy4vY2xpLXRyYW5zZm9ybWVycyc7XG5cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBrZXl3b3JkIGRlZmluaXRpb25zIHRvIGFkZCB0byB0aGUgc2luZ2xldG9uIGBBanZgIGluc3RhbmNlLlxuICogQHR5cGUge1JlY29yZDxzdHJpbmcsS2V5d29yZERlZmluaXRpb24+fVxuICovXG5leHBvcnQgY29uc3Qga2V5d29yZHMgPSB7XG4gIC8qKlxuICAgKiBLZXl3b3JkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGNvbW1hbmQgYWxpYXMgbmFtZXMgZm9yIHRoZSBDTEkuXG4gICAqXG4gICAqIElmIGRlZmluZWQsIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGl0ZW0gaW4gdGhlIGFycmF5IGFuZCBpdCBtdXN0IGJlIG5vbi1lbXB0eS5cbiAgICogQWxsIGl0ZW1zIGluIHRoZSBhcnJheSBtdXN0IGJlIHVuaXF1ZS5cbiAgICpcbiAgICogQHRvZG8gQXZvaWQgYWxpYXMgY29sbGlzaW9ucyFcbiAgICogQHR5cGUge0tleXdvcmREZWZpbml0aW9ufVxuICAgKiBAZXhhbXBsZVxuICAgKiB7YXBwaXVtQ2xpQWxpYXNlczogWydCJywgJ2JvYmJ5JywgJ3JvYmVydCddfVxuICAgKi9cbiAgYXBwaXVtQ2xpQWxpYXNlczoge1xuICAgIGtleXdvcmQ6ICdhcHBpdW1DbGlBbGlhc2VzJyxcbiAgICBtZXRhU2NoZW1hOiB7XG4gICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgaXRlbXM6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgIH0sXG4gICAgICBtaW5JdGVtczogMSxcbiAgICAgIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICAgICAgZGVzY3JpcHRpb246ICdMaXN0IG9mIGFsaWFzZXMgZm9yIHRoZSBhcmd1bWVudC4gQWxpYXNlcyBzaG9ydGVyIHRoYW4gdGhyZWUgKDMpIGNoYXJhY3RlcnMgd2lsbCBiZSBwcmVmaXhlZCB3aXRoIGEgc2luZ2xlIGRhc2g7IG90aGVyd2lzZSB0d28gKDIpLidcbiAgICB9LFxuICB9LFxuICAvKipcbiAgICogS2V5d29yZCB0byBwcm92aWRlIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgZGVzdGluYXRpb24gKHBhcnNlZFxuICAgKiBhcmdzKSBvYmplY3QuIEJ5IGRlZmF1bHQsIHRoaXMgdmFsdWUgd2lsbCBiZSB3aGF0ZXZlciB0aGUgcHJvcGVydHkgbmFtZSBpcyxcbiAgICogYnV0IGNhbWVsLWNhc2VkLiBJZiBhIGZsYWcgbmVlZHMgc29tZXRoaW5nIF9vdGhlcl8gdGhhbiBqdXN0IGNhbWVsLWNhc2luZyxcbiAgICogdXNlIHRoaXMuXG4gICAqIEB0eXBlIHtLZXl3b3JkRGVmaW5pdGlvbn1cbiAgICogQGV4YW1wbGVcbiAgICogLy8gZm9yIHByb3AgJ25vLWNvbG9yJ1xuICAgKiB7YXBwaXVtQ2xpRGVzdDogJ05PQ09MT1InfSAvLyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBhcyBwcm9wZXJ0eSBgTk9DT0xPUmAgaW5zdGVhZCBvZiBgbm9Db2xvcmBcbiAgICovXG4gIGFwcGl1bUNsaURlc3Q6IHtcbiAgICBrZXl3b3JkOiAnYXBwaXVtQ2xpRGVzdCcsXG4gICAgbWV0YVNjaGVtYToge1xuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICBkZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIHBhcnNlZCBDTEkgYXJndW1lbnRzIG9iamVjdCdcbiAgICB9LFxuICB9LFxuXG4gIC8qKlxuICAgKiBDTEktc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnR5LiAgU29tZXRpbWVzIHRoZSBhbGxvd2VkIHR5cGUgY2FuXG4gICAqIGJlIGRpZmZlcmVudCBlbm91Z2ggb24gdGhlIENMSSB0aGF0IHByb3ZpZGluZyBhIGRlc2NyaXB0aW9uIHdyaXR0ZW4gZm9yIGFcbiAgICogY29uZmlnIGZpbGUgY29udGV4dCB3b3VsZG4ndCBtYWtlIHNlbnNlLlxuICAgKiBAdHlwZSB7S2V5d29yZERlZmluaXRpb259XG4gICAqIEBleGFtcGxlXG4gICAqIHthcHBpdW1DbGlEZXNjcmlwdGlvbjogJ1RoaXMgaXMgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nLCBidXQgaW4gdGhlIGNvbmZpZyBmaWxlIGl0IGlzIGFuIGFycmF5J31cbiAgICovXG4gIGFwcGl1bUNsaURlc2NyaXB0aW9uOiB7XG4gICAga2V5d29yZDogJ2FwcGl1bUNsaURlc2NyaXB0aW9uJyxcbiAgICBzY2hlbWFUeXBlOiAnc3RyaW5nJyxcbiAgICBtZXRhU2NoZW1hOiB7XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcHRpb24gdG8gcHJvdmlkZSBpbiB0aGUgLS1oZWxwIHRleHQgb2YgdGhlIENMSS4gT3ZlcnJpZGVzIGBkZXNjcmlwdGlvbmAnXG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogVHJhbnNmb3JtZXJzIGZvciBDTEkgYXJncy4gVGhlc2UgdXN1YWxseSB0YWtlIHN0cmluZ3MgdGhlbiBkbyBzb21ldGhpbmcgd2l0aCB0aGVtLCBsaWtlXG4gICAqIHJlYWQgYSBmaWxlIG9yIHBhcnNlIGZ1cnRoZXIuXG4gICAqIEB0eXBlIHtLZXl3b3JkRGVmaW5pdGlvbn1cbiAgICovXG4gIGFwcGl1bUNsaVRyYW5zZm9ybWVyOiB7XG4gICAga2V5d29yZDogJ2FwcGl1bUNsaVRyYW5zZm9ybWVyJyxcbiAgICBtZXRhU2NoZW1hOiB7XG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGVudW06IE9iamVjdC5rZXlzKHRyYW5zZm9ybWVycyksXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBuYW1lIG9mIGEgY3VzdG9tIHRyYW5zZm9ybWVyIHRvIHJ1biBhZ2FpbnN0IHRoZSB2YWx1ZSBhcyBwcm92aWRlZCB2aWEgdGhlIENMSS4nXG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogRmxhZyB0byB0ZWxsIEFwcGl1bSB0byBfbm90XyBwcm92aWRlIHRoaXMgcHJvcGVydHkgYXMgYSBDTEkgYXJndW1lbnQuXG4gICAqIEB0eXBlIHtLZXl3b3JkRGVmaW5pdGlvbn1cbiAgICovXG4gIGFwcGl1bUNsaUlnbm9yZToge1xuICAgIGtleXdvcmQ6ICdhcHBpdW1DbGlJZ25vcmUnLFxuICAgIG1ldGFTY2hlbWE6IHtcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSWYgYHRydWVgLCBBcHBpdW0gd2lsbCBub3QgcHJvdmlkZSB0aGlzIHByb3BlcnR5IGFzIGEgQ0xJIGFyZ3VtZW50LidcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogVGhlc2UgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgYXBwaXVtQ2xpVHJhbnNmb3JtZXJgIGtleXdvcmQuXG4gKiBVbmZvcnR1bmF0ZWx5LCBUUyBjYW5ub3QgaW5mZXIgdGhpcyBpbiBhIEpTIGNvbnRleHQuICBJbiBUUywgd2UnZCB1c2VcbiAqIGBhcyBjb25zdGAgd2hlbiBkZWZpbmluZyBgYXJnVHJhbnNmb3JtZXJzYCwgdGhlbiBnZXQgYGtleW9mIHR5cGVvZiBhcmdUcmFuc2Zvcm1lcnNgLiBhbGFzLlxuICogQHR5cGVkZWYgeydjc3YnfCdqc29uJ30gQXBwaXVtQ2xpVHJhbnNmb3JtZXJOYW1lXG4gKi9cblxuLyoqXG4gKiBUaGVzZSBhcmUgdGhlIGN1c3RvbSBrZXl3b3JkcyB0aGF0IEFwcGl1bSByZWNvZ25pemVzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFwcGl1bUpTT05TY2hlbWFLZXl3b3Jkc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFthcHBpdW1DbGlEZXN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthcHBpdW1DbGlEZXNjcmlwdGlvbl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFthcHBpdW1DbGlBbGlhc2VzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbYXBwaXVtQ2xpSWdub3JlXVxuICogQHByb3BlcnR5IHtBcHBpdW1DbGlUcmFuc2Zvcm1lck5hbWV9IFthcHBpdW1DbGlUcmFuc2Zvcm1lcl1cbiAqL1xuXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnYWp2JykuS2V5d29yZERlZmluaXRpb259IEtleXdvcmREZWZpbml0aW9uXG4gKi9cbiJdLCJmaWxlIjoibGliL3NjaGVtYS9rZXl3b3Jkcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.validate = exports.resetSchema = exports.registerSchema = exports.isFinalized = exports.isAllowedSchemaFileExtension = exports.hasArgSpec = exports.getSchema = exports.getDefaultsFromSchema = exports.getArgSpec = exports.flattenSchema = exports.finalizeSchema = exports.SchemaUnknownSchemaError = exports.SchemaNameConflictError = exports.SchemaFinalizationError = exports.ALLOWED_SCHEMA_EXTENSIONS = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ require("source-map-support/register");
13
+
14
+ var _ajv = _interopRequireDefault(require("ajv"));
15
+
16
+ var _ajvFormats = _interopRequireDefault(require("ajv-formats"));
17
+
18
+ var _lodash = _interopRequireDefault(require("lodash"));
19
+
20
+ var _path = _interopRequireDefault(require("path"));
21
+
22
+ var _extensionConfig = require("../extension-config");
23
+
24
+ var _utils = require("../utils");
25
+
26
+ var _appiumConfigSchema = _interopRequireDefault(require("./appium-config-schema"));
27
+
28
+ var _argSpec = require("./arg-spec");
29
+
30
+ var _keywords = require("./keywords");
31
+
32
+ const ALLOWED_SCHEMA_EXTENSIONS = new Set(['.json', '.js', '.cjs']);
33
+ exports.ALLOWED_SCHEMA_EXTENSIONS = ALLOWED_SCHEMA_EXTENSIONS;
34
+
35
+ class AppiumSchema {
36
+ constructor() {
37
+ (0, _defineProperty2.default)(this, "_argSpecs", new _utils.ReadonlyMap());
38
+ (0, _defineProperty2.default)(this, "_registeredSchemas", {
39
+ [_extensionConfig.DRIVER_TYPE]: new Map(),
40
+ [_extensionConfig.PLUGIN_TYPE]: new Map()
41
+ });
42
+ (0, _defineProperty2.default)(this, "_ajv", void 0);
43
+ (0, _defineProperty2.default)(this, "_finalizedSchemas", null);
44
+ this._ajv = AppiumSchema._instantiateAjv();
45
+ }
46
+
47
+ static create() {
48
+ var _AppiumSchema$_instan;
49
+
50
+ const instance = (_AppiumSchema$_instan = AppiumSchema._instance) !== null && _AppiumSchema$_instan !== void 0 ? _AppiumSchema$_instan : new AppiumSchema();
51
+ AppiumSchema._instance = instance;
52
+
53
+ _lodash.default.bindAll(instance, ['finalize', 'flatten', 'getArgSpec', 'getDefaults', 'getSchema', 'hasArgSpec', 'isFinalized', 'registerSchema', 'reset', 'validate']);
54
+
55
+ return instance;
56
+ }
57
+
58
+ hasRegisteredSchema(extType, extName) {
59
+ return this._registeredSchemas[extType].has(extName);
60
+ }
61
+
62
+ isFinalized() {
63
+ return Boolean(this._finalizedSchemas);
64
+ }
65
+
66
+ finalize() {
67
+ if (this.isFinalized()) {
68
+ return this._finalizedSchemas;
69
+ }
70
+
71
+ const ajv = this._ajv;
72
+
73
+ const baseSchema = _lodash.default.cloneDeep(_appiumConfigSchema.default);
74
+
75
+ const addArgSpecs = (schema, extType, extName) => {
76
+ for (let [propName, propSchema] of Object.entries(schema)) {
77
+ const argSpec = _argSpec.ArgSpec.create(propName, {
78
+ dest: propSchema.appiumCliDest,
79
+ defaultValue: propSchema.default,
80
+ extType,
81
+ extName
82
+ });
83
+
84
+ const {
85
+ arg
86
+ } = argSpec;
87
+
88
+ this._argSpecs.set(arg, argSpec);
89
+ }
90
+ };
91
+
92
+ addArgSpecs(_lodash.default.omit(baseSchema.properties.server.properties, [_extensionConfig.DRIVER_TYPE, _extensionConfig.PLUGIN_TYPE]));
93
+ const finalizedSchemas = {};
94
+
95
+ const finalSchema = _lodash.default.reduce(this._registeredSchemas, (baseSchema, extensionSchemas, extType) => {
96
+ extensionSchemas.forEach((schema, extName) => {
97
+ const $ref = _argSpec.ArgSpec.toSchemaBaseRef(extType, extName);
98
+
99
+ schema.$id = $ref;
100
+ schema.additionalProperties = false;
101
+ baseSchema.properties.server.properties[extType].properties[extName] = {
102
+ $ref,
103
+ $comment: extName
104
+ };
105
+ ajv.validateSchema(schema, true);
106
+ addArgSpecs(schema.properties, extType, extName);
107
+ ajv.addSchema(schema, $ref);
108
+ finalizedSchemas[$ref] = schema;
109
+ });
110
+ return baseSchema;
111
+ }, baseSchema);
112
+
113
+ ajv.addSchema(finalSchema, _argSpec.APPIUM_CONFIG_SCHEMA_ID);
114
+ finalizedSchemas[_argSpec.APPIUM_CONFIG_SCHEMA_ID] = finalSchema;
115
+ ajv.validateSchema(finalSchema, true);
116
+ this._finalizedSchemas = finalizedSchemas;
117
+ return Object.freeze(finalizedSchemas);
118
+ }
119
+
120
+ static _instantiateAjv() {
121
+ const ajv = (0, _ajvFormats.default)(new _ajv.default({
122
+ allErrors: true
123
+ }));
124
+
125
+ _lodash.default.forEach(_keywords.keywords, keyword => {
126
+ ajv.addKeyword(keyword);
127
+ });
128
+
129
+ return ajv;
130
+ }
131
+
132
+ reset() {
133
+ for (const schemaId of Object.keys((_this$_finalizedSchem = this._finalizedSchemas) !== null && _this$_finalizedSchem !== void 0 ? _this$_finalizedSchem : {})) {
134
+ var _this$_finalizedSchem;
135
+
136
+ this._ajv.removeSchema(schemaId);
137
+ }
138
+
139
+ this._argSpecs = new _utils.ReadonlyMap();
140
+ this._registeredSchemas = {
141
+ [_extensionConfig.DRIVER_TYPE]: new Map(),
142
+ [_extensionConfig.PLUGIN_TYPE]: new Map()
143
+ };
144
+ this._finalizedSchemas = null;
145
+ this._ajv = AppiumSchema._instantiateAjv();
146
+ }
147
+
148
+ registerSchema(extType, extName, schema) {
149
+ if (!(extType && extName && !_lodash.default.isEmpty(schema))) {
150
+ throw new TypeError('Expected nonempty extension type, extension name and schema parameters');
151
+ }
152
+
153
+ const normalizedExtName = _lodash.default.kebabCase(extName);
154
+
155
+ if (this.hasRegisteredSchema(extType, normalizedExtName)) {
156
+ if (this._registeredSchemas[extType].get(normalizedExtName) === schema) {
157
+ return;
158
+ }
159
+
160
+ throw new SchemaNameConflictError(extType, extName);
161
+ }
162
+
163
+ this._ajv.validateSchema(schema, true);
164
+
165
+ this._registeredSchemas[extType].set(normalizedExtName, schema);
166
+ }
167
+
168
+ getArgSpec(name, extType, extName) {
169
+ return this._argSpecs.get(_argSpec.ArgSpec.toArg(name, extType, extName));
170
+ }
171
+
172
+ hasArgSpec(name, extType, extName) {
173
+ return this._argSpecs.has(_argSpec.ArgSpec.toArg(name, extType, extName));
174
+ }
175
+
176
+ getDefaults() {
177
+ if (!this.isFinalized()) {
178
+ throw new SchemaFinalizationError();
179
+ }
180
+
181
+ return [...this._argSpecs.values()].reduce((defaults, {
182
+ defaultValue,
183
+ dest
184
+ }) => {
185
+ if (!_lodash.default.isUndefined(defaultValue)) {
186
+ defaults[dest] = defaultValue;
187
+ }
188
+
189
+ return defaults;
190
+ }, {});
191
+ }
192
+
193
+ flatten() {
194
+ const schema = this.getSchema();
195
+ const stack = [{
196
+ properties: schema.properties,
197
+ prefix: []
198
+ }];
199
+ const flattened = [];
200
+
201
+ for (const {
202
+ properties,
203
+ prefix
204
+ } of stack) {
205
+ const pairs = _lodash.default.toPairs(properties);
206
+
207
+ for (const [key, value] of pairs) {
208
+ const {
209
+ properties,
210
+ $ref
211
+ } = value;
212
+
213
+ if (properties) {
214
+ stack.push({
215
+ properties,
216
+ prefix: key === _argSpec.SERVER_PROP_NAME ? [] : [...prefix, key]
217
+ });
218
+ } else if ($ref) {
219
+ let refSchema;
220
+
221
+ try {
222
+ refSchema = this.getSchema($ref);
223
+ } catch (err) {
224
+ throw new SchemaUnknownSchemaError($ref);
225
+ }
226
+
227
+ const {
228
+ normalizedExtName
229
+ } = _argSpec.ArgSpec.extensionInfoFromRootSchemaId($ref);
230
+
231
+ if (!normalizedExtName) {
232
+ throw new ReferenceError(`Could not determine extension name from schema ID ${$ref}. This is a bug.`);
233
+ }
234
+
235
+ stack.push({
236
+ properties: refSchema.properties,
237
+ prefix: [...prefix, key, normalizedExtName]
238
+ });
239
+ } else if (key !== _extensionConfig.DRIVER_TYPE && key !== _extensionConfig.PLUGIN_TYPE) {
240
+ const [extType, extName] = prefix;
241
+ const argSpec = this.getArgSpec(key, extType, extName);
242
+
243
+ if (!argSpec) {
244
+ throw new ReferenceError(`Unknown argument with key ${key}, extType ${extType} and extName ${extName}. This is a bug.`);
245
+ }
246
+
247
+ flattened.push({
248
+ schema: _lodash.default.cloneDeep(value),
249
+ argSpec
250
+ });
251
+ }
252
+ }
253
+ }
254
+
255
+ return flattened;
256
+ }
257
+
258
+ getSchema(ref = _argSpec.APPIUM_CONFIG_SCHEMA_ID) {
259
+ return this._getValidator(ref).schema;
260
+ }
261
+
262
+ _getValidator(id = _argSpec.APPIUM_CONFIG_SCHEMA_ID) {
263
+ const validator = this._ajv.getSchema(id);
264
+
265
+ if (!validator) {
266
+ if (id === _argSpec.APPIUM_CONFIG_SCHEMA_ID) {
267
+ throw new SchemaFinalizationError();
268
+ } else {
269
+ throw new SchemaUnknownSchemaError(id);
270
+ }
271
+ }
272
+
273
+ return validator;
274
+ }
275
+
276
+ validate(value, ref = _argSpec.APPIUM_CONFIG_SCHEMA_ID) {
277
+ const validator = this._getValidator(ref);
278
+
279
+ return !validator(value) && _lodash.default.isArray(validator.errors) ? [...validator.errors] : [];
280
+ }
281
+
282
+ static isAllowedSchemaFileExtension(filename) {
283
+ return ALLOWED_SCHEMA_EXTENSIONS.has(_path.default.extname(filename));
284
+ }
285
+
286
+ }
287
+
288
+ (0, _defineProperty2.default)(AppiumSchema, "_instance", void 0);
289
+
290
+ class SchemaFinalizationError extends Error {
291
+ constructor() {
292
+ super('Schema not yet finalized; `finalize()` must be called first.');
293
+ (0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_FINALIZATION');
294
+ }
295
+
296
+ }
297
+
298
+ exports.SchemaFinalizationError = SchemaFinalizationError;
299
+
300
+ class SchemaNameConflictError extends Error {
301
+ constructor(extType, extName) {
302
+ super(`Name for ${extType} schema "${extName}" conflicts with an existing schema`);
303
+ (0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_NAME_CONFLICT');
304
+ (0, _defineProperty2.default)(this, "data", void 0);
305
+ this.data = {
306
+ extType,
307
+ extName
308
+ };
309
+ }
310
+
311
+ }
312
+
313
+ exports.SchemaNameConflictError = SchemaNameConflictError;
314
+
315
+ class SchemaUnknownSchemaError extends ReferenceError {
316
+ constructor(schemaId) {
317
+ super(`Unknown schema: "${schemaId}"`);
318
+ (0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_UNKNOWN_SCHEMA');
319
+ (0, _defineProperty2.default)(this, "data", void 0);
320
+ this.data = {
321
+ schemaId
322
+ };
323
+ }
324
+
325
+ }
326
+
327
+ exports.SchemaUnknownSchemaError = SchemaUnknownSchemaError;
328
+ const appiumSchema = AppiumSchema.create();
329
+ const {
330
+ registerSchema,
331
+ getArgSpec,
332
+ hasArgSpec,
333
+ isFinalized,
334
+ finalize: finalizeSchema,
335
+ reset: resetSchema,
336
+ validate,
337
+ getSchema,
338
+ flatten: flattenSchema,
339
+ getDefaults: getDefaultsFromSchema
340
+ } = appiumSchema;
341
+ exports.getDefaultsFromSchema = getDefaultsFromSchema;
342
+ exports.flattenSchema = flattenSchema;
343
+ exports.getSchema = getSchema;
344
+ exports.validate = validate;
345
+ exports.resetSchema = resetSchema;
346
+ exports.finalizeSchema = finalizeSchema;
347
+ exports.isFinalized = isFinalized;
348
+ exports.hasArgSpec = hasArgSpec;
349
+ exports.getArgSpec = getArgSpec;
350
+ exports.registerSchema = registerSchema;
351
+ const {
352
+ isAllowedSchemaFileExtension
353
+ } = AppiumSchema;
354
+ exports.isAllowedSchemaFileExtension = isAllowedSchemaFileExtension;require('source-map-support').install();
355
+
356
+
357
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvc2NoZW1hLmpzIl0sIm5hbWVzIjpbIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJTZXQiLCJBcHBpdW1TY2hlbWEiLCJjb25zdHJ1Y3RvciIsIlJlYWRvbmx5TWFwIiwiRFJJVkVSX1RZUEUiLCJNYXAiLCJQTFVHSU5fVFlQRSIsIl9hanYiLCJfaW5zdGFudGlhdGVBanYiLCJjcmVhdGUiLCJpbnN0YW5jZSIsIl9pbnN0YW5jZSIsIl8iLCJiaW5kQWxsIiwiaGFzUmVnaXN0ZXJlZFNjaGVtYSIsImV4dFR5cGUiLCJleHROYW1lIiwiX3JlZ2lzdGVyZWRTY2hlbWFzIiwiaGFzIiwiaXNGaW5hbGl6ZWQiLCJCb29sZWFuIiwiX2ZpbmFsaXplZFNjaGVtYXMiLCJmaW5hbGl6ZSIsImFqdiIsImJhc2VTY2hlbWEiLCJjbG9uZURlZXAiLCJhcHBpdW1Db25maWdTY2hlbWEiLCJhZGRBcmdTcGVjcyIsInNjaGVtYSIsInByb3BOYW1lIiwicHJvcFNjaGVtYSIsIk9iamVjdCIsImVudHJpZXMiLCJhcmdTcGVjIiwiQXJnU3BlYyIsImRlc3QiLCJhcHBpdW1DbGlEZXN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdCIsImFyZyIsIl9hcmdTcGVjcyIsInNldCIsIm9taXQiLCJwcm9wZXJ0aWVzIiwic2VydmVyIiwiZmluYWxpemVkU2NoZW1hcyIsImZpbmFsU2NoZW1hIiwicmVkdWNlIiwiZXh0ZW5zaW9uU2NoZW1hcyIsImZvckVhY2giLCIkcmVmIiwidG9TY2hlbWFCYXNlUmVmIiwiJGlkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCIkY29tbWVudCIsInZhbGlkYXRlU2NoZW1hIiwiYWRkU2NoZW1hIiwiQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQiLCJmcmVlemUiLCJBanYiLCJhbGxFcnJvcnMiLCJrZXl3b3JkcyIsImtleXdvcmQiLCJhZGRLZXl3b3JkIiwicmVzZXQiLCJzY2hlbWFJZCIsImtleXMiLCJyZW1vdmVTY2hlbWEiLCJyZWdpc3RlclNjaGVtYSIsImlzRW1wdHkiLCJUeXBlRXJyb3IiLCJub3JtYWxpemVkRXh0TmFtZSIsImtlYmFiQ2FzZSIsImdldCIsIlNjaGVtYU5hbWVDb25mbGljdEVycm9yIiwiZ2V0QXJnU3BlYyIsIm5hbWUiLCJ0b0FyZyIsImhhc0FyZ1NwZWMiLCJnZXREZWZhdWx0cyIsIlNjaGVtYUZpbmFsaXphdGlvbkVycm9yIiwidmFsdWVzIiwiZGVmYXVsdHMiLCJpc1VuZGVmaW5lZCIsImZsYXR0ZW4iLCJnZXRTY2hlbWEiLCJzdGFjayIsInByZWZpeCIsImZsYXR0ZW5lZCIsInBhaXJzIiwidG9QYWlycyIsImtleSIsInZhbHVlIiwicHVzaCIsIlNFUlZFUl9QUk9QX05BTUUiLCJyZWZTY2hlbWEiLCJlcnIiLCJTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsIlJlZmVyZW5jZUVycm9yIiwicmVmIiwiX2dldFZhbGlkYXRvciIsImlkIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJpc0FycmF5IiwiZXJyb3JzIiwiaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiIsImZpbGVuYW1lIiwicGF0aCIsImV4dG5hbWUiLCJFcnJvciIsImRhdGEiLCJhcHBpdW1TY2hlbWEiLCJmaW5hbGl6ZVNjaGVtYSIsInJlc2V0U2NoZW1hIiwiZmxhdHRlblNjaGVtYSIsImdldERlZmF1bHRzRnJvbVNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtPLE1BQU1BLHlCQUF5QixHQUFHLElBQUlDLEdBQUosQ0FBUSxDQUFDLE9BQUQsRUFBVSxLQUFWLEVBQWlCLE1BQWpCLENBQVIsQ0FBbEM7OztBQU9QLE1BQU1DLFlBQU4sQ0FBbUI7QUFtRGpCQyxFQUFBQSxXQUFXLEdBQUk7QUFBQSxxREF6Q0gsSUFBSUMsa0JBQUosRUF5Q0c7QUFBQSw4REEvQk07QUFB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RStELFFBQUYsRUFBWTtBQUNyQixVQUFPLG9CQUFtQkEsUUFBUyxHQUFuQztBQURxQixnREFWaEIsaUNBVWdCO0FBQUE7QUFFckIsU0FBSytDLElBQUwsR0FBWTtBQUFDL0MsTUFBQUE7QUFBRCxLQUFaO0FBQ0Q7O0FBakIwRDs7O0FBb0I3RCxNQUFNZ0QsWUFBWSxHQUFHaEgsWUFBWSxDQUFDUSxNQUFiLEVBQXJCO0FBRU8sTUFBTTtBQUNYMkQsRUFBQUEsY0FEVztBQUVYTyxFQUFBQSxVQUZXO0FBR1hHLEVBQUFBLFVBSFc7QUFJWDNELEVBQUFBLFdBSlc7QUFLWEcsRUFBQUEsUUFBUSxFQUFFNEYsY0FMQztBQU1YbEQsRUFBQUEsS0FBSyxFQUFFbUQsV0FOSTtBQU9YWCxFQUFBQSxRQVBXO0FBUVhuQixFQUFBQSxTQVJXO0FBU1hELEVBQUFBLE9BQU8sRUFBRWdDLGFBVEU7QUFVWHJDLEVBQUFBLFdBQVcsRUFBRXNDO0FBVkYsSUFXVEosWUFYRzs7Ozs7Ozs7Ozs7QUFZQSxNQUFNO0FBQUNOLEVBQUFBO0FBQUQsSUFBaUMxRyxZQUF2QyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQWp2IGZyb20gJ2Fqdic7XG5pbXBvcnQgYWRkRm9ybWF0cyBmcm9tICdhanYtZm9ybWF0cyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRX0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge1JlYWRvbmx5TWFwfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgYXBwaXVtQ29uZmlnU2NoZW1hIGZyb20gJy4vYXBwaXVtLWNvbmZpZy1zY2hlbWEnO1xuaW1wb3J0IHtBcmdTcGVjLCBTRVJWRVJfUFJPUF9OQU1FLCBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRH0gZnJvbSAnLi9hcmctc3BlYyc7XG5pbXBvcnQge2tleXdvcmRzfSBmcm9tICcuL2tleXdvcmRzJztcblxuLyoqXG4gKiBFeHRlbnNpb25zIHRoYXQgYW4gZXh0ZW5zaW9uIHNjaGVtYSBmaWxlIGNhbiBoYXZlLlxuICovXG5leHBvcnQgY29uc3QgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyA9IG5ldyBTZXQoWycuanNvbicsICcuanMnLCAnLmNqcyddKTtcblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIEFqdiBhbmQgc2NoZW1hLXJlbGF0ZWQgZnVuY3Rpb25zLlxuICpcbiAqIFNob3VsZCBoYXZlIGJlZW4gbmFtZWQgSGlnaGxhbmRlciwgYmVjYXVzZSBfdGhlcmUgY2FuIG9ubHkgYmUgb25lX1xuICovXG5jbGFzcyBBcHBpdW1TY2hlbWEge1xuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIHVuaXF1ZSBhcmd1bWVudCBJRHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQXJnU3BlY31zLlxuICAgKlxuICAgKiBBbiBcImFyZ3VtZW50XCIgaXMgYSBDTEkgYXJndW1lbnQgb3IgYSBjb25maWcgcHJvcGVydHkuXG4gICAqXG4gICAqIFVzZWQgdG8gcHJvdmlkZSBlYXN5IGxvb2t1cHMgb2YgYXJndW1lbnQgbWV0YWRhdGEgd2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyBvZiB0aG9zZSBhcmd1bWVudHMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWFkb25seU1hcDxzdHJpbmcsQXJnU3BlYz59XG4gICAqL1xuICBfYXJnU3BlY3MgPSBuZXcgUmVhZG9ubHlNYXAoKTtcblxuICAvKipcbiAgICogQSBtYXAgb2YgZXh0ZW5zaW9uIHR5cGVzIHRvIGV4dGVuc2lvbiBuYW1lcyB0byBzY2hlbWEgb2JqZWN0cy5cbiAgICpcbiAgICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gbmFtaW5nIGNvbmZsaWN0cy4gVGhlIHNjaGVtYXNcbiAgICogYXJlIHN0b3JlZCBoZXJlIGluIG1lbW9yeSB1bnRpbCB0aGUgaW5zdGFuY2UgaXMgX2ZpbmFsaXplZF8uXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8RXh0ZW5zaW9uVHlwZSxNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD4+fVxuICAgKi9cbiAgX3JlZ2lzdGVyZWRTY2hlbWFzID0ge1tEUklWRVJfVFlQRV06IG5ldyBNYXAoKSwgW1BMVUdJTl9UWVBFXTogbmV3IE1hcCgpfTtcblxuICAvKipcbiAgICogQWp2IGluc3RhbmNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtBanZ9XG4gICAqL1xuICBfYWp2O1xuXG4gIC8qKlxuICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtBcHBpdW1TY2hlbWF9XG4gICAqL1xuICBzdGF0aWMgX2luc3RhbmNlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgb2Ygc2NoZW1hIElEcyB0byBmaW5hbGl6ZWQgc2NoZW1hcy5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHJlZmVyZW5jZXMsIGJ1dCByYXRoZXIgdGhlIHJvb3Qgc2NoZW1hcyB0aGVtc2VsdmVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+P31cbiAgICovXG4gIF9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgQWp2LCBhZGRzIHN0YW5kYXJkIGZvcm1hdHMgYW5kIG91ciBjdXN0b20ga2V5d29yZHMuXG4gICAqIEBzZWUgaHR0cHM6Ly9ucG0uaW0vYWp2LWZvcm1hdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLl9hanYgPSBBcHBpdW1TY2hlbWEuX2luc3RhbnRpYXRlQWp2KCk7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBmdW5jdGlvbiBmb3Ige0BsaW5rIEFwcGl1bVNjaGVtYX0gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBjcmVhdGVzIGEgbmV3IG9uZS5cbiAgICogQmluZHMgcHVibGljIG1ldGhvZHMgdG8gdGhlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7QXBwaXVtU2NoZW1hfVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZSAoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID8/IG5ldyBBcHBpdW1TY2hlbWEoKTtcbiAgICBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgICBfLmJpbmRBbGwoaW5zdGFuY2UsIFtcbiAgICAgICdmaW5hbGl6ZScsXG4gICAgICAnZmxhdHRlbicsXG4gICAgICAnZ2V0QXJnU3BlYycsXG4gICAgICAnZ2V0RGVmYXVsdHMnLFxuICAgICAgJ2dldFNjaGVtYScsXG4gICAgICAnaGFzQXJnU3BlYycsXG4gICAgICAnaXNGaW5hbGl6ZWQnLFxuICAgICAgJ3JlZ2lzdGVyU2NoZW1hJyxcbiAgICAgICdyZXNldCcsXG4gICAgICAndmFsaWRhdGUnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGEgc2NoZW1hIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdXNpbmcgZ2l2ZW4gZXh0ZW5zaW9uIHR5cGUgYW5kIG5hbWUuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgZGVwZW5kIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBfZmluYWxpemVkXy5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJZiByZWdpc3RlcmVkXG4gICAqL1xuICBoYXNSZWdpc3RlcmVkU2NoZW1hIChleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLmhhcyhleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYHRydWVgIGlmIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemUgZmluYWxpemV9IGhhcyBiZWVuIGNhbGxlZFxuICAgKiBzdWNjZXNzZnVsbHkgYW5kIHtAbGluayBBcHBpdW1TY2hlbWEucmVzZXQgcmVzZXR9IGhhcyBub3QgYmVlbiBjYWxsZWQgc2luY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJZiBmaW5hbGl6ZWRcbiAgICovXG4gIGlzRmluYWxpemVkICgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9maW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgd2hlbiBubyBtb3JlIHNjaGVtYXMgd2lsbCBiZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgdGhyZWUgdGhpbmdzOlxuICAgKiAxLiBJdCBjb21iaW5lcyBhbGwgc2NoZW1hcyBmcm9tIGV4dGVuc2lvbnMgaW50byB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEsXG4gICAqICAgIHRoZW4gYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSBgQWp2YCBpbnN0YW5jZS5cbiAgICogMi4gSXQgYWRkcyBzY2hlbWFzIGZvciBfZWFjaF8gYXJndW1lbnQvcHJvcGVydHkgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAqICAgIFRoZSBDTEkgdXNlcyB0aGVzZSBzY2hlbWFzIHRvIHZhbGlkYXRlIHNwZWNpZmljIGFyZ3VtZW50cy5cbiAgICogMy4gVGhlIHNjaGVtYXMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IEpTT04gc2NoZW1hIGRyYWZ0LTA3ICh3aGljaCBpcyB0aGVcbiAgICogICAgb25seSBvbmUgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSlcbiAgICpcbiAgICogQW55IG1ldGhvZCBpbiB0aGlzIGluc3RhbmNlIHRoYXQgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogd2lsbCB0aHJvdyBpZiB0aGlzIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBJZiB0aGUgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQsIHRoaXMgaXMgYSBuby1vcC5cbiAgICogQHB1YmxpY1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBub3QgdmFsaWRcbiAgICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pj59IFJlY29yZCBvZiBzY2hlbWEgSURzIHRvIGZ1bGwgc2NoZW1hIG9iamVjdHNcbiAgICovXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD59ICovIChcbiAgICAgICAgdGhpcy5fZmluYWxpemVkU2NoZW1hc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhanYgPSB0aGlzLl9hanY7XG5cbiAgICAvLyBBanYgd2lsbCBfbXV0YXRlXyB0aGUgc2NoZW1hLCBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0LlxuICAgIGNvbnN0IGJhc2VTY2hlbWEgPSBfLmNsb25lRGVlcCgvKiogQHR5cGUge1N0cmljdFNjaGVtYU9iamVjdH0gKi8oYXBwaXVtQ29uZmlnU2NoZW1hKSk7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWFcbiAgICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV1cbiAgICAgKi9cbiAgICBjb25zdCBhZGRBcmdTcGVjcyA9IChzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpID0+IHtcbiAgICAgIGZvciAobGV0IFtwcm9wTmFtZSwgcHJvcFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgICBjb25zdCBhcmdTcGVjID0gQXJnU3BlYy5jcmVhdGUocHJvcE5hbWUsIHtcbiAgICAgICAgICBkZXN0OiBwcm9wU2NoZW1hLmFwcGl1bUNsaURlc3QsXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiBwcm9wU2NoZW1hLmRlZmF1bHQsXG4gICAgICAgICAgZXh0VHlwZSxcbiAgICAgICAgICBleHROYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qge2FyZ30gPSBhcmdTcGVjO1xuICAgICAgICB0aGlzLl9hcmdTcGVjcy5zZXQoYXJnLCBhcmdTcGVjKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYWRkQXJnU3BlY3MoXG4gICAgICBfLm9taXQoYmFzZVNjaGVtYS5wcm9wZXJ0aWVzLnNlcnZlci5wcm9wZXJ0aWVzLCBbXG4gICAgICAgIERSSVZFUl9UWVBFLFxuICAgICAgICBQTFVHSU5fVFlQRSxcbiAgICAgIF0pLFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IGZpbmFsaXplZFNjaGVtYXMgPSB7fTtcblxuICAgIGNvbnN0IGZpbmFsU2NoZW1hID0gXy5yZWR1Y2UoXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hcyxcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHt0eXBlb2YgYmFzZVNjaGVtYX0gYmFzZVNjaGVtYVxuICAgICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD59IGV4dGVuc2lvblNjaGVtYXNcbiAgICAgICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgICAgICovXG4gICAgICAoYmFzZVNjaGVtYSwgZXh0ZW5zaW9uU2NoZW1hcywgZXh0VHlwZSkgPT4ge1xuICAgICAgICBleHRlbnNpb25TY2hlbWFzLmZvckVhY2goKHNjaGVtYSwgZXh0TmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyZWYgPSBBcmdTcGVjLnRvU2NoZW1hQmFzZVJlZihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBzY2hlbWEuJGlkID0gJHJlZjtcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsgLy8gdGhpcyBtYWtlcyBgc2NoZW1hYCBiZWNvbWUgYSBgU3RyaWN0U2NoZW1hT2JqZWN0YFxuICAgICAgICAgIGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllc1tleHRUeXBlXS5wcm9wZXJ0aWVzW2V4dE5hbWVdID1cbiAgICAgICAgICAgIHskcmVmLCAkY29tbWVudDogZXh0TmFtZX07XG4gICAgICAgICAgYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG4gICAgICAgICAgYWRkQXJnU3BlY3Moc2NoZW1hLnByb3BlcnRpZXMsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgICAgICAgIGFqdi5hZGRTY2hlbWEoc2NoZW1hLCAkcmVmKTtcbiAgICAgICAgICBmaW5hbGl6ZWRTY2hlbWFzWyRyZWZdID0gLyoqIEB0eXBlIHtTdHJpY3RTY2hlbWFPYmplY3R9ICovKHNjaGVtYSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYmFzZVNjaGVtYTtcbiAgICAgIH0sXG4gICAgICBiYXNlU2NoZW1hLFxuICAgICk7XG5cbiAgICBhanYuYWRkU2NoZW1hKGZpbmFsU2NoZW1hLCBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCk7XG4gICAgZmluYWxpemVkU2NoZW1hc1tBUFBJVU1fQ09ORklHX1NDSEVNQV9JRF0gPSBmaW5hbFNjaGVtYTtcbiAgICBhanYudmFsaWRhdGVTY2hlbWEoZmluYWxTY2hlbWEsIHRydWUpO1xuXG4gICAgdGhpcy5fZmluYWxpemVkU2NoZW1hcyA9IGZpbmFsaXplZFNjaGVtYXM7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoZmluYWxpemVkU2NoZW1hcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyBhbmQgY3JlYXRlcyBhbiBBanYgaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtBanZ9XG4gICAqL1xuICBzdGF0aWMgX2luc3RhbnRpYXRlQWp2ICgpIHtcbiAgICBjb25zdCBhanYgPSBhZGRGb3JtYXRzKFxuICAgICAgbmV3IEFqdih7XG4gICAgICAgIC8vIHdpdGhvdXQgdGhpcyBub3QgbXVjaCB2YWxpZGF0aW9uIGFjdHVhbGx5IGhhcHBlbnNcbiAgICAgICAgYWxsRXJyb3JzOiB0cnVlLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIGFkZCBjdXN0b20ga2V5d29yZHMgdG8gYWp2LiBzZWUgc2NoZW1hLWtleXdvcmRzLmpzXG4gICAgXy5mb3JFYWNoKGtleXdvcmRzLCAoa2V5d29yZCkgPT4ge1xuICAgICAgYWp2LmFkZEtleXdvcmQoa2V5d29yZCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWp2O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGlzIGluc3RhbmNlIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogLSBSZW1vdmVzIGFsbCBhZGRlZCBzY2hlbWFzIGZyb20gdGhlIGBBanZgIGluc3RhbmNlXG4gICAqIC0gUmVzZXRzIHRoZSBtYXAgb2Yge0BsaW5rIEFyZ1NwZWMgQXJnU3BlY3N9XG4gICAqIC0gUmVzZXRzIHRoZSBtYXAgb2YgcmVnaXN0ZXJlZCBzY2hlbWFzXG4gICAqIC0gU2V0cyB0aGUge0BsaW5rIEFwcGl1bVNjaGVtYS5fZmluYWxpemVkIF9maW5hbGl6ZWR9IGZsYWcgdG8gYGZhbHNlYFxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0byBjYWxsIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9IGFnYWluLCB5b3UnbGwgd2FudCB0byBjYWxsIHRoaXMgZmlyc3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVzZXQgKCkge1xuICAgIGZvciAoY29uc3Qgc2NoZW1hSWQgb2YgT2JqZWN0LmtleXModGhpcy5fZmluYWxpemVkU2NoZW1hcyA/PyB7fSkpIHtcbiAgICAgIHRoaXMuX2Fqdi5yZW1vdmVTY2hlbWEoc2NoZW1hSWQpO1xuICAgIH1cbiAgICB0aGlzLl9hcmdTcGVjcyA9IG5ldyBSZWFkb25seU1hcCgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzID0ge1xuICAgICAgW0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLFxuICAgICAgW1BMVUdJTl9UWVBFXTogbmV3IE1hcCgpLFxuICAgIH07XG4gICAgdGhpcy5fZmluYWxpemVkU2NoZW1hcyA9IG51bGw7XG5cbiAgICAvLyBBanYgc2VlbXMgdG8gaGF2ZSBhbiBvdmVyLWVhZ2VyIGNhY2hlLCBzbyB3ZSBoYXZlIHRvIGR1bXAgdGhlIG9iamVjdCBlbnRpcmVseS5cbiAgICB0aGlzLl9hanYgPSBBcHBpdW1TY2hlbWEuX2luc3RhbnRpYXRlQWp2KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgc2NoZW1hIGZyb20gYW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIFwiZmFpbC1mYXN0XCIgaW4gdGhhdCB0aGUgc2NoZW1hIHdpbGwgaW1tZWRpYXRlbHkgYmUgdmFsaWRhdGVkIGFnYWluc3QgSlNPTiBzY2hlbWEgZHJhZnQtMDcgX29yXyB3aGF0ZXZlciB0aGUgdmFsdWUgb2YgdGhlIHNjaGVtYSdzIGAkc2NoZW1hYCBwcm9wIGlzLlxuICAgKlxuICAgKiBEb2VzIF9ub3RfIGFkZCB0aGUgc2NoZW1hIHRvIHRoZSBgYWp2YCBpbnN0YW5jZSAodGhpcyBpcyBkb25lIGJ5IHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9KS5cbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL2V4dC1jb25maWctaW8nKS5FeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBVbmlxdWUgZXh0ZW5zaW9uIG5hbWUgZm9yIGB0eXBlYFxuICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hIC0gU2NoZW1hIG9iamVjdFxuICAgKiBAdGhyb3dzIHtTY2hlbWFOYW1lQ29uZmxpY3RFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBhbiBpbnZhbGlkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVnaXN0ZXJTY2hlbWEgKGV4dFR5cGUsIGV4dE5hbWUsIHNjaGVtYSkge1xuICAgIGlmICghKGV4dFR5cGUgJiYgZXh0TmFtZSAmJiAhXy5pc0VtcHR5KHNjaGVtYSkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRXhwZWN0ZWQgbm9uZW1wdHkgZXh0ZW5zaW9uIHR5cGUsIGV4dGVuc2lvbiBuYW1lIGFuZCBzY2hlbWEgcGFyYW1ldGVycycsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHROYW1lID0gXy5rZWJhYkNhc2UoZXh0TmFtZSk7XG4gICAgaWYgKHRoaXMuaGFzUmVnaXN0ZXJlZFNjaGVtYShleHRUeXBlLCBub3JtYWxpemVkRXh0TmFtZSkpIHtcbiAgICAgIGlmICh0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5nZXQobm9ybWFsaXplZEV4dE5hbWUpID09PSBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFNjaGVtYU5hbWVDb25mbGljdEVycm9yKGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgIH1cbiAgICB0aGlzLl9hanYudmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0cnVlKTtcblxuICAgIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLnNldChub3JtYWxpemVkRXh0TmFtZSwgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEge0BsaW5rIEFyZ1NwZWN9IGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDTEkgYXJndW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV0gLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7QXJnU3BlY3x1bmRlZmluZWR9IEFyZ1NwZWMgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXRBcmdTcGVjIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ1NwZWNzLmdldChBcmdTcGVjLnRvQXJnKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaW5zdGFuY2Uga25vd3MgYWJvdXQgYW4gYXJndW1lbnQgYnkgdGhlIGdpdmVuIGBuYW1lYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDTEkgYXJndW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV0gLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHN1Y2ggYW4ge0BsaW5rIEFyZ1NwZWN9IGV4aXN0c1xuICAgKi9cbiAgaGFzQXJnU3BlYyAobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5oYXMoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGBSZWNvcmRgIG9mIGFyZ3VtZW50IFwiZGVzdFwiIHN0cmluZ3MgdG8gZGVmYXVsdCB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSBcImRlc3RcIiBzdHJpbmcgaXMgdGhlIHByb3BlcnR5IG5hbWUgaW4gb2JqZWN0IHJldHVybmVkIGJ5IGBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlclsncGFyc2VfYXJncyddYC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsQXJnU3BlY1snZGVmYXVsdFZhbHVlJ10+fVxuICAgKi9cbiAgZ2V0RGVmYXVsdHMgKCkge1xuICAgIGlmICghdGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi50aGlzLl9hcmdTcGVjcy52YWx1ZXMoKV0ucmVkdWNlKFxuICAgICAgKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCBkZXN0fSkgPT4ge1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgIGRlZmF1bHRzW2Rlc3RdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gc2NoZW1hIGludG8gYW4gYXJyYXkgb2YgYFNjaGVtYU9iamVjdGBzIGFuZCBhc3NvY2lhdGVkXG4gICAqIHtAbGluayBBcmdTcGVjIEFyZ1NwZWNzfS5cbiAgICpcbiAgICogQ29udmVydHMgbmVzdGVkIGV4dGVuc2lvbiBzY2hlbWFzIHRvIGtleXMgYmFzZWQgb24gdGhlIGV4dGVuc2lvbiB0eXBlIGFuZFxuICAgKiBuYW1lLiBVc2VkIHdoZW4gdHJhbnNsYXRpbmcgdG8gYGFyZ3BhcnNlYCBvcHRpb25zIG9yIGdldHRpbmcgdGhlIGxpc3Qgb2ZcbiAgICogZGVmYXVsdCB2YWx1ZXMgKHNlZSB7QGxpbmsgQXBwaXVtU2NoZW1hLmdldERlZmF1bHRzfSkgZm9yIENMSSBvciBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gaW50ZXJtZWRpYXRlIHJlcHJzZW50YXRpb24gdXNlZCBieSBgY2xpLWFyZ3NgXG4gICAqIG1vZHVsZSdzIGB0b1BhcnNlckFyZ3NgLCB3aGljaCBjb252ZXJ0cyB0aGUgZmluYWxpemVkIHNjaGVtYSB0byBwYXJhbWV0ZXJzXG4gICAqIHVzZWQgYnkgYGFyZ3BhcnNlYC5cbiAgICogQHRocm93cyBJZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplfSBoYXMgbm90IGJlZW4gY2FsbGVkIHlldC5cbiAgICogQHJldHVybnMge0ZsYXR0ZW5lZFNjaGVtYX1cbiAgICovXG4gIGZsYXR0ZW4gKCkge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7XG5cbiAgICAvKiogQHR5cGUge3twcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3QsIHByZWZpeDogc3RyaW5nW119W119ICovXG4gICAgY29uc3Qgc3RhY2sgPSBbe3Byb3BlcnRpZXM6IHNjaGVtYS5wcm9wZXJ0aWVzLCBwcmVmaXg6IFtdfV07XG4gICAgLyoqIEB0eXBlIHtGbGF0dGVuZWRTY2hlbWF9ICovXG4gICAgY29uc3QgZmxhdHRlbmVkID0gW107XG5cbiAgICAvLyB0aGlzIGJpdCBpcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gcmV3cml0dGVuIGFzIGEgZm9yIGxvb3AuXG4gICAgLy8gd2hlbiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSB3YW50IHRvIHRyYXZlcnNlLCB3ZSBhZGQgaXQgdG8gYHN0YWNrYFxuICAgIGZvciAoY29uc3Qge3Byb3BlcnRpZXMsIHByZWZpeH0gb2Ygc3RhY2spIHtcbiAgICAgIGNvbnN0IHBhaXJzID0gXy50b1BhaXJzKHByb3BlcnRpZXMpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qge3Byb3BlcnRpZXMsICRyZWZ9ID0gdmFsdWU7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBrZXkgPT09IFNFUlZFUl9QUk9QX05BTUUgPyBbXSA6IFsuLi5wcmVmaXgsIGtleV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJHJlZikge1xuICAgICAgICAgIGxldCByZWZTY2hlbWE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlZlNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCRyZWYpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIGFuIGV4dGVuc2lvbiBzY2hlbWEgc3VwcGxpZXMgYSAkcmVmIHRvIGEgbm9uLWV4aXN0ZW50IHNjaGVtYVxuICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcigkcmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge25vcm1hbGl6ZWRFeHROYW1lfSA9XG4gICAgICAgICAgICBBcmdTcGVjLmV4dGVuc2lvbkluZm9Gcm9tUm9vdFNjaGVtYUlkKCRyZWYpO1xuICAgICAgICAgIGlmICghbm9ybWFsaXplZEV4dE5hbWUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGV4dGVuc2lvbiBuYW1lIGZyb20gc2NoZW1hIElEICR7JHJlZn0uIFRoaXMgaXMgYSBidWcuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydGllczogcmVmU2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBwcmVmaXg6IFsuLi5wcmVmaXgsIGtleSwgbm9ybWFsaXplZEV4dE5hbWVdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gRFJJVkVSX1RZUEUgJiYga2V5ICE9PSBQTFVHSU5fVFlQRSkge1xuICAgICAgICAgIGNvbnN0IFtleHRUeXBlLCBleHROYW1lXSA9IHByZWZpeDtcbiAgICAgICAgICBjb25zdCBhcmdTcGVjID0gdGhpcy5nZXRBcmdTcGVjKFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtFeHRlbnNpb25UeXBlfSAqLyAoZXh0VHlwZSksXG4gICAgICAgICAgICBleHROYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFhcmdTcGVjKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgVW5rbm93biBhcmd1bWVudCB3aXRoIGtleSAke2tleX0sIGV4dFR5cGUgJHtleHRUeXBlfSBhbmQgZXh0TmFtZSAke2V4dE5hbWV9LiBUaGlzIGlzIGEgYnVnLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbGF0dGVuZWQucHVzaCh7c2NoZW1hOiBfLmNsb25lRGVlcCh2YWx1ZSksIGFyZ1NwZWN9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmbGF0dGVuZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzY2hlbWEgaXRzZWxmXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWZdIC0gU2NoZW1hIElEXG4gICAqIEB0aHJvd3MgSWYgdGhlIHNjaGVtYSBoYXMgbm90IHlldCBiZWVuIF9maW5hbGl6ZWRfXG4gICAqIEByZXR1cm5zIHtTY2hlbWFPYmplY3R9XG4gICAqL1xuICBnZXRTY2hlbWEgKHJlZiA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U2NoZW1hT2JqZWN0fSAqLyAodGhpcy5fZ2V0VmFsaWRhdG9yKHJlZikuc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgc2NoZW1hIHZhbGlkYXRvciBmdW5jdGlvbiBmcm9tIEFqdlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2lkXSAtIFNjaGVtYSBJRFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5WYWxpZGF0ZUZ1bmN0aW9ufVxuICAgKi9cbiAgX2dldFZhbGlkYXRvciAoaWQgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMuX2Fqdi5nZXRTY2hlbWEoaWQpO1xuICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICBpZiAoaWQgPT09IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcihpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gb2JqZWN0LCB2YWxpZGF0ZXMgaXQgYWdhaW5zdCB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEuXG4gICAqIElmIGVycm9ycyBvY2N1ciwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgbm9uLWVtcHR5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgKGhvcGVmdWxseSBhbiBvYmplY3QpIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlZl0gLSBTY2hlbWEgSUQgb3IgcmVmLlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLkVycm9yT2JqZWN0W119IEFycmF5IG9mIGVycm9ycywgaWYgYW55LlxuICAgKi9cbiAgdmFsaWRhdGUgKHZhbHVlLCByZWYgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IC8qKiBAdHlwZSB7aW1wb3J0KCdhanYnKS5WYWxpZGF0ZUZ1bmN0aW9ufSAqLyAoXG4gICAgICB0aGlzLl9nZXRWYWxpZGF0b3IocmVmKVxuICAgICk7XG4gICAgcmV0dXJuICF2YWxpZGF0b3IodmFsdWUpICYmIF8uaXNBcnJheSh2YWxpZGF0b3IuZXJyb3JzKVxuICAgICAgPyBbLi4udmFsaWRhdG9yLmVycm9yc11cbiAgICAgIDogW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYGZpbGVuYW1lYCdzIGZpbGUgZXh0ZW5zaW9uIGlzIGFsbG93ZWQgKGluIHtAbGluayBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TfSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uIChmaWxlbmFtZSkge1xuICAgIHJldHVybiBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLmhhcyhwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hfSBpbnN0YW5jZSBoYXMgbm90IHlldCBiZWVuIGZpbmFsaXplZCwgYnV0XG4gKiB0aGUgbWV0aG9kIGNhbGxlZCByZXF1aXJlcyBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYUZpbmFsaXphdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfRklOQUxJWkFUSU9OJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoJ1NjaGVtYSBub3QgeWV0IGZpbmFsaXplZDsgYGZpbmFsaXplKClgIG11c3QgYmUgY2FsbGVkIGZpcnN0LicpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBcInVuaXF1ZVwiIHNjaGVtYSBJRCBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWEgSUQuXG4gKlxuICogVGhpcyBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgY2F1c2VkIGJ5IGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgc2NoZW1hIHR3aWNlLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9OQU1FX0NPTkZMSUNUJztcblxuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHtleHRUeXBlOiBFeHRlbnNpb25UeXBlLCBleHROYW1lOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBzdXBlcihcbiAgICAgIGBOYW1lIGZvciAke2V4dFR5cGV9IHNjaGVtYSBcIiR7ZXh0TmFtZX1cIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWFgLFxuICAgICk7XG4gICAgdGhpcy5kYXRhID0ge2V4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzY2hlbWEgSUQgd2FzIGV4cGVjdGVkLCBidXQgaXQgZG9lc24ndCBleGlzdCBvbiB0aGUge0BsaW5rIEFqdn0gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IgZXh0ZW5kcyBSZWZlcmVuY2VFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTktOT1dOX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hSWQ6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYUlkXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc2NoZW1hSWQpIHtcbiAgICBzdXBlcihgVW5rbm93biBzY2hlbWE6IFwiJHtzY2hlbWFJZH1cImApO1xuICAgIHRoaXMuZGF0YSA9IHtzY2hlbWFJZH07XG4gIH1cbn1cblxuY29uc3QgYXBwaXVtU2NoZW1hID0gQXBwaXVtU2NoZW1hLmNyZWF0ZSgpO1xuXG5leHBvcnQgY29uc3Qge1xuICByZWdpc3RlclNjaGVtYSxcbiAgZ2V0QXJnU3BlYyxcbiAgaGFzQXJnU3BlYyxcbiAgaXNGaW5hbGl6ZWQsXG4gIGZpbmFsaXplOiBmaW5hbGl6ZVNjaGVtYSxcbiAgcmVzZXQ6IHJlc2V0U2NoZW1hLFxuICB2YWxpZGF0ZSxcbiAgZ2V0U2NoZW1hLFxuICBmbGF0dGVuOiBmbGF0dGVuU2NoZW1hLFxuICBnZXREZWZhdWx0czogZ2V0RGVmYXVsdHNGcm9tU2NoZW1hLFxufSA9IGFwcGl1bVNjaGVtYTtcbmV4cG9ydCBjb25zdCB7aXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbn0gPSBBcHBpdW1TY2hlbWE7XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0fSBTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dC1jb25maWctaW8nKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3QgaGF2aW5nIHByb3BlcnR5IGBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VgXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdHJpY3RQcm9wXG4gKiBAcHJvcGVydHkge2ZhbHNlfSBhZGRpdGlvbmFsUHJvcGVydGllc1xuICovXG5cbi8qKlxuICogQSB7QGxpbmsgU2NoZW1hT2JqZWN0fSB3aXRoIGBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VgXG4gKiBAdHlwZWRlZiB7U2NoZW1hT2JqZWN0ICYgU3RyaWN0UHJvcH0gU3RyaWN0U2NoZW1hT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBBIGxpc3Qgb2Ygc2NoZW1hcyBhc3NvY2lhdGVkIHdpdGggcHJvcGVydGllcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQXJnU3BlY30gb2JqZWN0cy5cbiAqXG4gKiBJbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGNvbnZlcnRpbmcgdGhlIGVudGlyZSBzY2hlbWEgZG93biB0byBDTEkgYXJndW1lbnRzLlxuICogQHR5cGVkZWYge3tzY2hlbWE6IFNjaGVtYU9iamVjdCwgYXJnU3BlYzogQXJnU3BlY31bXX0gRmxhdHRlbmVkU2NoZW1hXG4gKi9cbiJdLCJmaWxlIjoibGliL3NjaGVtYS9zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==