appium 2.0.0-beta.5 → 2.0.0-beta.52

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 (199) hide show
  1. package/README.md +156 -63
  2. package/build/lib/appium.d.ts +226 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +694 -439
  5. package/build/lib/appium.js.map +1 -0
  6. package/build/lib/cli/args.d.ts +17 -0
  7. package/build/lib/cli/args.d.ts.map +1 -0
  8. package/build/lib/cli/args.js +253 -319
  9. package/build/lib/cli/args.js.map +1 -0
  10. package/build/lib/cli/driver-command.d.ts +102 -0
  11. package/build/lib/cli/driver-command.d.ts.map +1 -0
  12. package/build/lib/cli/driver-command.js +126 -81
  13. package/build/lib/cli/driver-command.js.map +1 -0
  14. package/build/lib/cli/extension-command.d.ts +385 -0
  15. package/build/lib/cli/extension-command.d.ts.map +1 -0
  16. package/build/lib/cli/extension-command.js +731 -383
  17. package/build/lib/cli/extension-command.js.map +1 -0
  18. package/build/lib/cli/extension.d.ts +23 -0
  19. package/build/lib/cli/extension.d.ts.map +1 -0
  20. package/build/lib/cli/extension.js +71 -54
  21. package/build/lib/cli/extension.js.map +1 -0
  22. package/build/lib/cli/parser.d.ts +84 -0
  23. package/build/lib/cli/parser.d.ts.map +1 -0
  24. package/build/lib/cli/parser.js +240 -128
  25. package/build/lib/cli/parser.js.map +1 -0
  26. package/build/lib/cli/plugin-command.d.ts +99 -0
  27. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  28. package/build/lib/cli/plugin-command.js +120 -81
  29. package/build/lib/cli/plugin-command.js.map +1 -0
  30. package/build/lib/cli/utils.d.ts +29 -0
  31. package/build/lib/cli/utils.d.ts.map +1 -0
  32. package/build/lib/cli/utils.js +72 -51
  33. package/build/lib/cli/utils.js.map +1 -0
  34. package/build/lib/config-file.d.ts +100 -0
  35. package/build/lib/config-file.d.ts.map +1 -0
  36. package/build/lib/config-file.js +207 -0
  37. package/build/lib/config-file.js.map +1 -0
  38. package/build/lib/config.d.ts +49 -0
  39. package/build/lib/config.d.ts.map +1 -0
  40. package/build/lib/config.js +265 -201
  41. package/build/lib/config.js.map +1 -0
  42. package/build/lib/constants.d.ts +49 -0
  43. package/build/lib/constants.d.ts.map +1 -0
  44. package/build/lib/constants.js +66 -0
  45. package/build/lib/constants.js.map +1 -0
  46. package/build/lib/extension/driver-config.d.ts +82 -0
  47. package/build/lib/extension/driver-config.d.ts.map +1 -0
  48. package/build/lib/extension/driver-config.js +212 -0
  49. package/build/lib/extension/driver-config.js.map +1 -0
  50. package/build/lib/extension/extension-config.d.ts +249 -0
  51. package/build/lib/extension/extension-config.d.ts.map +1 -0
  52. package/build/lib/extension/extension-config.js +581 -0
  53. package/build/lib/extension/extension-config.js.map +1 -0
  54. package/build/lib/extension/index.d.ts +48 -0
  55. package/build/lib/extension/index.d.ts.map +1 -0
  56. package/build/lib/extension/index.js +105 -0
  57. package/build/lib/extension/index.js.map +1 -0
  58. package/build/lib/extension/manifest-migrations.d.ts +27 -0
  59. package/build/lib/extension/manifest-migrations.d.ts.map +1 -0
  60. package/build/lib/extension/manifest-migrations.js +118 -0
  61. package/build/lib/extension/manifest-migrations.js.map +1 -0
  62. package/build/lib/extension/manifest.d.ts +145 -0
  63. package/build/lib/extension/manifest.d.ts.map +1 -0
  64. package/build/lib/extension/manifest.js +521 -0
  65. package/build/lib/extension/manifest.js.map +1 -0
  66. package/build/lib/extension/package-changed.d.ts +11 -0
  67. package/build/lib/extension/package-changed.d.ts.map +1 -0
  68. package/build/lib/extension/package-changed.js +62 -0
  69. package/build/lib/extension/package-changed.js.map +1 -0
  70. package/build/lib/extension/plugin-config.d.ts +56 -0
  71. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  72. package/build/lib/extension/plugin-config.js +102 -0
  73. package/build/lib/extension/plugin-config.js.map +1 -0
  74. package/build/lib/grid-register.d.ts +10 -0
  75. package/build/lib/grid-register.d.ts.map +1 -0
  76. package/build/lib/grid-register.js +122 -144
  77. package/build/lib/grid-register.js.map +1 -0
  78. package/build/lib/logger.d.ts +3 -0
  79. package/build/lib/logger.d.ts.map +1 -0
  80. package/build/lib/logger.js +5 -17
  81. package/build/lib/logger.js.map +1 -0
  82. package/build/lib/logsink.d.ts +4 -0
  83. package/build/lib/logsink.d.ts.map +1 -0
  84. package/build/lib/logsink.js +190 -187
  85. package/build/lib/logsink.js.map +1 -0
  86. package/build/lib/main.d.ts +62 -0
  87. package/build/lib/main.d.ts.map +1 -0
  88. package/build/lib/main.js +348 -228
  89. package/build/lib/main.js.map +1 -0
  90. package/build/lib/schema/arg-spec.d.ts +143 -0
  91. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  92. package/build/lib/schema/arg-spec.js +164 -0
  93. package/build/lib/schema/arg-spec.js.map +1 -0
  94. package/build/lib/schema/cli-args.d.ts +19 -0
  95. package/build/lib/schema/cli-args.d.ts.map +1 -0
  96. package/build/lib/schema/cli-args.js +217 -0
  97. package/build/lib/schema/cli-args.js.map +1 -0
  98. package/build/lib/schema/cli-transformers.d.ts +5 -0
  99. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  100. package/build/lib/schema/cli-transformers.js +124 -0
  101. package/build/lib/schema/cli-transformers.js.map +1 -0
  102. package/build/lib/schema/index.d.ts +3 -0
  103. package/build/lib/schema/index.d.ts.map +1 -0
  104. package/build/lib/schema/index.js +19 -0
  105. package/build/lib/schema/index.js.map +1 -0
  106. package/build/lib/schema/keywords.d.ts +24 -0
  107. package/build/lib/schema/keywords.d.ts.map +1 -0
  108. package/build/lib/schema/keywords.js +128 -0
  109. package/build/lib/schema/keywords.js.map +1 -0
  110. package/build/lib/schema/schema.d.ts +259 -0
  111. package/build/lib/schema/schema.d.ts.map +1 -0
  112. package/build/lib/schema/schema.js +615 -0
  113. package/build/lib/schema/schema.js.map +1 -0
  114. package/build/lib/utils.d.ts +121 -0
  115. package/build/lib/utils.d.ts.map +1 -0
  116. package/build/lib/utils.js +351 -273
  117. package/build/lib/utils.js.map +1 -0
  118. package/build/tsconfig.tsbuildinfo +1 -0
  119. package/build/types/cli.d.ts +134 -0
  120. package/build/types/cli.d.ts.map +1 -0
  121. package/build/types/cli.js +3 -0
  122. package/build/types/cli.js.map +1 -0
  123. package/build/types/index.d.ts +15 -0
  124. package/build/types/index.d.ts.map +1 -0
  125. package/build/types/index.js +19 -0
  126. package/build/types/index.js.map +1 -0
  127. package/build/types/manifest/base.d.ts +135 -0
  128. package/build/types/manifest/base.d.ts.map +1 -0
  129. package/build/types/manifest/base.js +3 -0
  130. package/build/types/manifest/base.js.map +1 -0
  131. package/build/types/manifest/index.d.ts +19 -0
  132. package/build/types/manifest/index.d.ts.map +1 -0
  133. package/build/types/manifest/index.js +40 -0
  134. package/build/types/manifest/index.js.map +1 -0
  135. package/build/types/manifest/v3.d.ts +139 -0
  136. package/build/types/manifest/v3.d.ts.map +1 -0
  137. package/build/types/manifest/v3.js +3 -0
  138. package/build/types/manifest/v3.js.map +1 -0
  139. package/driver.d.ts +1 -0
  140. package/driver.js +14 -0
  141. package/index.js +11 -0
  142. package/lib/appium.js +535 -186
  143. package/lib/cli/args.js +267 -422
  144. package/lib/cli/driver-command.js +126 -23
  145. package/lib/cli/extension-command.js +679 -271
  146. package/lib/cli/extension.js +48 -17
  147. package/lib/cli/parser.js +263 -83
  148. package/lib/cli/plugin-command.js +115 -20
  149. package/lib/cli/utils.js +24 -10
  150. package/lib/config-file.js +220 -0
  151. package/lib/config.js +244 -110
  152. package/lib/constants.js +71 -0
  153. package/lib/extension/driver-config.js +250 -0
  154. package/lib/extension/extension-config.js +682 -0
  155. package/lib/extension/index.js +116 -0
  156. package/lib/extension/manifest-migrations.js +120 -0
  157. package/lib/extension/manifest.js +573 -0
  158. package/lib/extension/package-changed.js +64 -0
  159. package/lib/extension/plugin-config.js +112 -0
  160. package/lib/grid-register.js +49 -35
  161. package/lib/logger.js +1 -2
  162. package/lib/logsink.js +64 -38
  163. package/lib/main.js +321 -101
  164. package/lib/schema/arg-spec.js +229 -0
  165. package/lib/schema/cli-args.js +238 -0
  166. package/lib/schema/cli-transformers.js +119 -0
  167. package/lib/schema/index.js +2 -0
  168. package/lib/schema/keywords.js +136 -0
  169. package/lib/schema/schema.js +722 -0
  170. package/lib/utils.js +291 -167
  171. package/package.json +83 -84
  172. package/plugin.d.ts +1 -0
  173. package/plugin.js +13 -0
  174. package/scripts/autoinstall-extensions.js +237 -0
  175. package/support.d.ts +1 -0
  176. package/support.js +13 -0
  177. package/tsconfig.json +25 -0
  178. package/types/cli.ts +189 -0
  179. package/types/index.ts +20 -0
  180. package/types/manifest/README.md +30 -0
  181. package/types/manifest/base.ts +158 -0
  182. package/types/manifest/index.ts +27 -0
  183. package/types/manifest/v3.ts +161 -0
  184. package/CHANGELOG.md +0 -3515
  185. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  186. package/build/lib/cli/npm.js +0 -208
  187. package/build/lib/cli/parser-helpers.js +0 -82
  188. package/build/lib/driver-config.js +0 -77
  189. package/build/lib/drivers.js +0 -96
  190. package/build/lib/extension-config.js +0 -253
  191. package/build/lib/plugin-config.js +0 -59
  192. package/build/lib/plugins.js +0 -14
  193. package/lib/cli/npm.js +0 -184
  194. package/lib/cli/parser-helpers.js +0 -79
  195. package/lib/driver-config.js +0 -46
  196. package/lib/drivers.js +0 -81
  197. package/lib/extension-config.js +0 -209
  198. package/lib/plugin-config.js +0 -34
  199. package/lib/plugins.js +0 -10
@@ -1,295 +1,373 @@
1
1
  "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.inspectObject = inspectObject;
9
- exports.parseCapsForInnerDriver = parseCapsForInnerDriver;
10
- exports.insertAppiumPrefixes = insertAppiumPrefixes;
11
- exports.getPackageVersion = getPackageVersion;
12
- exports.pullSettings = pullSettings;
13
- exports.removeAppiumPrefixes = removeAppiumPrefixes;
14
- exports.rootDir = void 0;
15
-
16
- require("source-map-support/register");
17
-
18
- var _lodash = _interopRequireDefault(require("lodash"));
19
-
20
- var _logger = _interopRequireDefault(require("./logger"));
21
-
22
- var _appiumBaseDriver = require("appium-base-driver");
23
-
24
- var _findRoot = _interopRequireDefault(require("find-root"));
25
-
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.adjustNodePath = exports.removeAppiumPrefixes = exports.pullSettings = exports.getPackageVersion = exports.insertAppiumPrefixes = exports.parseCapsForInnerDriver = exports.inspect = exports.isPluginCommandArgs = exports.isDriverCommandArgs = exports.isExtensionCommandArgs = exports.isServerCommandArgs = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const logger_1 = __importDefault(require("./logger"));
9
+ const base_driver_1 = require("@appium/base-driver");
10
+ const util_1 = require("util");
11
+ const support_1 = require("@appium/support");
12
+ const path_1 = __importDefault(require("path"));
13
+ const constants_1 = require("./constants");
26
14
  const W3C_APPIUM_PREFIX = 'appium';
27
-
28
- function inspectObject(args) {
29
- function getValueArray(obj, indent = ' ') {
30
- if (!_lodash.default.isObject(obj)) {
31
- return [obj];
32
- }
33
-
34
- let strArr = ['{'];
35
-
36
- for (let [arg, value] of _lodash.default.toPairs(obj)) {
37
- if (!_lodash.default.isObject(value)) {
38
- strArr.push(`${indent} ${arg}: ${value}`);
39
- } else {
40
- value = getValueArray(value, `${indent} `);
41
- strArr.push(`${indent} ${arg}: ${value.shift()}`);
42
- strArr.push(...value);
43
- }
44
- }
45
-
46
- strArr.push(`${indent}}`);
47
- return strArr;
48
- }
49
-
50
- for (let [arg, value] of _lodash.default.toPairs(args)) {
51
- value = getValueArray(value);
52
-
53
- _logger.default.info(` ${arg}: ${value.shift()}`);
54
-
55
- for (let val of value) {
56
- _logger.default.info(val);
15
+ const STANDARD_CAPS_LOWERCASE = new Set([...base_driver_1.STANDARD_CAPS].map((cap) => cap.toLowerCase()));
16
+ /**
17
+ *
18
+ * If `stdout` is a TTY, this is `true`.
19
+ *
20
+ * Used for tighter control over log output.
21
+ * @type {boolean}
22
+ */
23
+ const isStdoutTTY = process.stdout.isTTY;
24
+ /**
25
+ * Dumps to value to the console using `info` logger.
26
+ *
27
+ * @todo May want to force color to be `false` if {@link isStdoutTTY} is `false`.
28
+ */
29
+ const inspect = lodash_1.default.flow(lodash_1.default.partialRight(
30
+ /** @type {(object: any, options: import('util').InspectOptions) => string} */ (util_1.inspect), { colors: true, depth: null, compact: !isStdoutTTY }), (...args) => {
31
+ logger_1.default.info(...args);
32
+ });
33
+ exports.inspect = inspect;
34
+ /**
35
+ * Takes the caps that were provided in the request and translates them
36
+ * into caps that can be used by the inner drivers.
37
+ *
38
+ * @template {Constraints} C
39
+ * @template [J=any]
40
+ * @param {J} jsonwpCapabilities
41
+ * @param {W3CCapabilities<C>} w3cCapabilities
42
+ * @param {C} constraints
43
+ * @param {NSCapabilities<C>} [defaultCapabilities]
44
+ * @returns {ParsedDriverCaps<C,J>|InvalidCaps<C,J>}
45
+ */
46
+ function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraints = /** @type {C} */ ({}), defaultCapabilities = {}) {
47
+ // Check if the caller sent JSONWP caps, W3C caps, or both
48
+ const hasW3CCaps = lodash_1.default.isPlainObject(w3cCapabilities) &&
49
+ (lodash_1.default.has(w3cCapabilities, 'alwaysMatch') || lodash_1.default.has(w3cCapabilities, 'firstMatch'));
50
+ const hasJSONWPCaps = lodash_1.default.isPlainObject(jsonwpCapabilities);
51
+ let desiredCaps = /** @type {ParsedDriverCaps<C>['desiredCaps']} */ ({});
52
+ /** @type {ParsedDriverCaps<C>['processedW3CCapabilities']} */
53
+ let processedW3CCapabilities;
54
+ /** @type {ParsedDriverCaps<C>['processedJsonwpCapabilities']} */
55
+ let processedJsonwpCapabilities;
56
+ if (!hasW3CCaps) {
57
+ return /** @type {InvalidCaps<C>} */ ({
58
+ protocol: base_driver_1.PROTOCOLS.W3C,
59
+ error: new Error('W3C capabilities should be provided'),
60
+ });
57
61
  }
58
- }
59
- }
60
-
61
- function parseCapsForInnerDriver(jsonwpCapabilities, w3cCapabilities, constraints = {}, defaultCapabilities = {}) {
62
- const hasW3CCaps = _lodash.default.isPlainObject(w3cCapabilities) && (_lodash.default.has(w3cCapabilities, 'alwaysMatch') || _lodash.default.has(w3cCapabilities, 'firstMatch'));
63
-
64
- const hasJSONWPCaps = _lodash.default.isPlainObject(jsonwpCapabilities);
65
-
66
- let protocol = null;
67
- let desiredCaps = {};
68
- let processedW3CCapabilities = null;
69
- let processedJsonwpCapabilities = null;
70
-
71
- if (!hasJSONWPCaps && !hasW3CCaps) {
72
- return {
73
- protocol: _appiumBaseDriver.PROTOCOLS.W3C,
74
- error: new Error('Either JSONWP or W3C capabilities should be provided')
75
- };
76
- }
77
-
78
- const {
79
- W3C,
80
- MJSONWP
81
- } = _appiumBaseDriver.PROTOCOLS;
82
- jsonwpCapabilities = _lodash.default.cloneDeep(jsonwpCapabilities);
83
- w3cCapabilities = _lodash.default.cloneDeep(w3cCapabilities);
84
- defaultCapabilities = _lodash.default.cloneDeep(defaultCapabilities);
85
-
86
- if (!_lodash.default.isEmpty(defaultCapabilities)) {
87
- if (hasW3CCaps) {
88
- for (const [defaultCapKey, defaultCapValue] of _lodash.default.toPairs(defaultCapabilities)) {
89
- let isCapAlreadySet = false;
90
-
91
- for (const firstMatchEntry of w3cCapabilities.firstMatch || []) {
92
- if (_lodash.default.isPlainObject(firstMatchEntry) && _lodash.default.has(removeAppiumPrefixes(firstMatchEntry), removeAppiumPrefix(defaultCapKey))) {
93
- isCapAlreadySet = true;
94
- break;
95
- }
62
+ const { W3C } = base_driver_1.PROTOCOLS;
63
+ const protocol = W3C;
64
+ // Make sure we don't mutate the original arguments
65
+ jsonwpCapabilities = lodash_1.default.cloneDeep(jsonwpCapabilities);
66
+ w3cCapabilities = lodash_1.default.cloneDeep(w3cCapabilities);
67
+ defaultCapabilities = lodash_1.default.cloneDeep(defaultCapabilities);
68
+ if (!lodash_1.default.isEmpty(defaultCapabilities)) {
69
+ if (hasW3CCaps) {
70
+ for (const [defaultCapKey, defaultCapValue] of lodash_1.default.toPairs(defaultCapabilities)) {
71
+ let isCapAlreadySet = false;
72
+ // Check if the key is already present in firstMatch entries
73
+ for (const firstMatchEntry of w3cCapabilities.firstMatch ?? []) {
74
+ if (lodash_1.default.isPlainObject(firstMatchEntry) &&
75
+ lodash_1.default.has(removeAppiumPrefixes(firstMatchEntry), removeAppiumPrefix(defaultCapKey))) {
76
+ isCapAlreadySet = true;
77
+ break;
78
+ }
79
+ }
80
+ // Check if the key is already present in alwaysMatch entries
81
+ isCapAlreadySet =
82
+ isCapAlreadySet ||
83
+ (lodash_1.default.isPlainObject(w3cCapabilities.alwaysMatch) &&
84
+ lodash_1.default.has(removeAppiumPrefixes(w3cCapabilities.alwaysMatch), removeAppiumPrefix(defaultCapKey)));
85
+ if (isCapAlreadySet) {
86
+ // Skip if the key is already present in the provided caps
87
+ continue;
88
+ }
89
+ // Only add the default capability if it is not overridden
90
+ if (lodash_1.default.isEmpty(w3cCapabilities.firstMatch)) {
91
+ w3cCapabilities.firstMatch = /** @type {W3CCapabilities<C>['firstMatch']} */ ([
92
+ { [defaultCapKey]: defaultCapValue },
93
+ ]);
94
+ }
95
+ else {
96
+ w3cCapabilities.firstMatch[0][defaultCapKey] = defaultCapValue;
97
+ }
98
+ }
96
99
  }
97
-
98
- isCapAlreadySet = isCapAlreadySet || _lodash.default.isPlainObject(w3cCapabilities.alwaysMatch) && _lodash.default.has(removeAppiumPrefixes(w3cCapabilities.alwaysMatch), removeAppiumPrefix(defaultCapKey));
99
-
100
- if (isCapAlreadySet) {
101
- continue;
100
+ if (hasJSONWPCaps) {
101
+ jsonwpCapabilities = {
102
+ ...removeAppiumPrefixes(defaultCapabilities),
103
+ ...jsonwpCapabilities,
104
+ };
102
105
  }
103
-
104
- if (_lodash.default.isEmpty(w3cCapabilities.firstMatch)) {
105
- w3cCapabilities.firstMatch = [{
106
- [defaultCapKey]: defaultCapValue
107
- }];
108
- } else {
109
- w3cCapabilities.firstMatch[0][defaultCapKey] = defaultCapValue;
110
- }
111
- }
112
106
  }
113
-
107
+ // Get MJSONWP caps
114
108
  if (hasJSONWPCaps) {
115
- jsonwpCapabilities = Object.assign({}, removeAppiumPrefixes(defaultCapabilities), jsonwpCapabilities);
116
- }
117
- }
118
-
119
- if (hasJSONWPCaps) {
120
- protocol = MJSONWP;
121
- desiredCaps = jsonwpCapabilities;
122
- processedJsonwpCapabilities = { ...jsonwpCapabilities
123
- };
124
- }
125
-
126
- if (hasW3CCaps) {
127
- protocol = W3C;
128
- let isFixingNeededForW3cCaps = false;
129
-
130
- try {
131
- desiredCaps = (0, _appiumBaseDriver.processCapabilities)(w3cCapabilities, constraints, true);
132
- } catch (error) {
133
- if (!hasJSONWPCaps) {
134
- return {
135
- desiredCaps,
136
- processedJsonwpCapabilities,
137
- processedW3CCapabilities,
138
- protocol,
139
- error
140
- };
141
- }
142
-
143
- _logger.default.info(`Could not parse W3C capabilities: ${error.message}`);
144
-
145
- isFixingNeededForW3cCaps = true;
146
- }
147
-
148
- if (hasJSONWPCaps && !isFixingNeededForW3cCaps) {
149
- const differingKeys = _lodash.default.difference(_lodash.default.keys(removeAppiumPrefixes(processedJsonwpCapabilities)), _lodash.default.keys(removeAppiumPrefixes(desiredCaps)));
150
-
151
- if (!_lodash.default.isEmpty(differingKeys)) {
152
- _logger.default.info(`The following capabilities were provided in the JSONWP desired capabilities that are missing ` + `in W3C capabilities: ${JSON.stringify(differingKeys)}`);
153
-
154
- isFixingNeededForW3cCaps = true;
155
- }
109
+ processedJsonwpCapabilities = { ...jsonwpCapabilities };
156
110
  }
157
-
158
- if (isFixingNeededForW3cCaps && hasJSONWPCaps) {
159
- _logger.default.info('Trying to fix W3C capabilities by merging them with JSONWP caps');
160
-
161
- w3cCapabilities = fixW3cCapabilities(w3cCapabilities, jsonwpCapabilities);
162
-
163
- try {
164
- desiredCaps = (0, _appiumBaseDriver.processCapabilities)(w3cCapabilities, constraints, true);
165
- } catch (error) {
166
- _logger.default.warn(`Could not parse fixed W3C capabilities: ${error.message}. Falling back to JSONWP protocol`);
167
-
168
- return {
169
- desiredCaps: processedJsonwpCapabilities,
170
- processedJsonwpCapabilities,
171
- processedW3CCapabilities: null,
172
- protocol: MJSONWP
111
+ // Get W3C caps
112
+ if (hasW3CCaps) {
113
+ // Call the process capabilities algorithm to find matching caps on the W3C
114
+ // (see: https://github.com/jlipps/simple-wd-spec#processing-capabilities)
115
+ try {
116
+ desiredCaps = (0, base_driver_1.processCapabilities)(w3cCapabilities, constraints, true);
117
+ }
118
+ catch (error) {
119
+ logger_1.default.info(`Could not parse W3C capabilities: ${error.message}`);
120
+ return /** @type {InvalidCaps<C,J>} */ ({
121
+ desiredCaps,
122
+ processedJsonwpCapabilities,
123
+ processedW3CCapabilities,
124
+ protocol,
125
+ error,
126
+ });
127
+ }
128
+ // Create a new w3c capabilities payload that contains only the matching caps in `alwaysMatch`
129
+ processedW3CCapabilities = {
130
+ alwaysMatch: { ...insertAppiumPrefixes(desiredCaps) },
131
+ firstMatch: [{}],
173
132
  };
174
- }
175
- }
176
-
177
- processedW3CCapabilities = {
178
- alwaysMatch: { ...insertAppiumPrefixes(desiredCaps)
179
- },
180
- firstMatch: [{}]
181
- };
182
- }
183
-
184
- return {
185
- desiredCaps,
186
- processedJsonwpCapabilities,
187
- processedW3CCapabilities,
188
- protocol
189
- };
190
- }
191
-
192
- function fixW3cCapabilities(w3cCaps, jsonwpCaps) {
193
- const result = {
194
- firstMatch: w3cCaps.firstMatch || [],
195
- alwaysMatch: w3cCaps.alwaysMatch || {}
196
- };
197
-
198
- const keysToInsert = _lodash.default.keys(jsonwpCaps);
199
-
200
- const removeMatchingKeys = match => {
201
- _lodash.default.pull(keysToInsert, match);
202
-
203
- const colonIndex = match.indexOf(':');
204
-
205
- if (colonIndex >= 0 && match.length > colonIndex) {
206
- _lodash.default.pull(keysToInsert, match.substring(colonIndex + 1));
207
- }
208
-
209
- if (keysToInsert.includes(`${W3C_APPIUM_PREFIX}:${match}`)) {
210
- _lodash.default.pull(keysToInsert, `${W3C_APPIUM_PREFIX}:${match}`);
211
133
  }
212
- };
213
-
214
- for (const firstMatchEntry of result.firstMatch) {
215
- for (const pair of _lodash.default.toPairs(firstMatchEntry)) {
216
- removeMatchingKeys(pair[0]);
217
- }
218
- }
219
-
220
- for (const pair of _lodash.default.toPairs(result.alwaysMatch)) {
221
- removeMatchingKeys(pair[0]);
222
- }
223
-
224
- for (const key of keysToInsert) {
225
- result.alwaysMatch[key] = jsonwpCaps[key];
226
- }
227
-
228
- return result;
134
+ return /** @type {ParsedDriverCaps<C,J>} */ ({
135
+ desiredCaps,
136
+ processedJsonwpCapabilities,
137
+ processedW3CCapabilities,
138
+ protocol,
139
+ });
229
140
  }
230
-
141
+ exports.parseCapsForInnerDriver = parseCapsForInnerDriver;
142
+ /**
143
+ * Takes a capabilities objects and prefixes capabilities with `appium:`
144
+ * @template {Constraints} [C={}]
145
+ * @param {Capabilities<C>} caps - Desired capabilities object
146
+ * @returns {NSCapabilities<C>}
147
+ */
231
148
  function insertAppiumPrefixes(caps) {
232
- const STANDARD_CAPS = ['browserName', 'browserVersion', 'platformName', 'acceptInsecureCerts', 'pageLoadStrategy', 'proxy', 'setWindowRect', 'timeouts', 'unhandledPromptBehavior'];
233
- let prefixedCaps = {};
234
-
235
- for (let [name, value] of _lodash.default.toPairs(caps)) {
236
- if (STANDARD_CAPS.includes(name) || name.includes(':')) {
237
- prefixedCaps[name] = value;
238
- } else {
239
- prefixedCaps[`${W3C_APPIUM_PREFIX}:${name}`] = value;
240
- }
241
- }
242
-
243
- return prefixedCaps;
149
+ return /** @type {NSCapabilities<C>} */ (lodash_1.default.mapKeys(caps, (_, key) => STANDARD_CAPS_LOWERCASE.has(key.toLowerCase()) || key.includes(':')
150
+ ? key
151
+ : `${W3C_APPIUM_PREFIX}:${key}`));
244
152
  }
245
-
153
+ exports.insertAppiumPrefixes = insertAppiumPrefixes;
154
+ /**
155
+ * @template {Constraints} [C={}]
156
+ * @param {NSCapabilities<C>} caps
157
+ * @returns {Capabilities<C>}
158
+ */
246
159
  function removeAppiumPrefixes(caps) {
247
- if (!_lodash.default.isPlainObject(caps)) {
248
- return caps;
249
- }
250
-
251
- const fixedCaps = {};
252
-
253
- for (let [name, value] of _lodash.default.toPairs(caps)) {
254
- fixedCaps[removeAppiumPrefix(name)] = value;
255
- }
256
-
257
- return fixedCaps;
160
+ return /** @type {Capabilities<C>} */ (lodash_1.default.mapKeys(caps, (_, key) => removeAppiumPrefix(key)));
258
161
  }
259
-
162
+ exports.removeAppiumPrefixes = removeAppiumPrefixes;
163
+ /**
164
+ * @param {string} key
165
+ * @returns {string}
166
+ */
260
167
  function removeAppiumPrefix(key) {
261
- const prefix = `${W3C_APPIUM_PREFIX}:`;
262
- return _lodash.default.startsWith(key, prefix) ? key.substring(prefix.length) : key;
168
+ const prefix = `${W3C_APPIUM_PREFIX}:`;
169
+ return lodash_1.default.startsWith(key, prefix) ? key.substring(prefix.length) : key;
263
170
  }
264
-
171
+ /**
172
+ *
173
+ * @param {string} pkgName
174
+ * @returns {string|undefined}
175
+ */
265
176
  function getPackageVersion(pkgName) {
266
- const pkgInfo = require(`${pkgName}/package.json`) || {};
267
- return pkgInfo.version;
177
+ const pkgInfo = require(`${pkgName}/package.json`) || {};
178
+ return pkgInfo.version;
179
+ }
180
+ exports.getPackageVersion = getPackageVersion;
181
+ /**
182
+ * Adjusts NODE_PATH environment variable,
183
+ * so drivers and plugins could load their peer dependencies.
184
+ * Read https://nodejs.org/api/modules.html#loading-from-the-global-folders
185
+ * for more details.
186
+ * @returns {void}
187
+ */
188
+ function adjustNodePath() {
189
+ const selfRoot = support_1.node.getModuleRootSync('appium', __filename);
190
+ if (!selfRoot || path_1.default.dirname(selfRoot).length >= selfRoot.length) {
191
+ return;
192
+ }
193
+ const nodeModulesRoot = path_1.default.dirname(selfRoot);
194
+ const refreshRequirePaths = () => {
195
+ try {
196
+ // ! This hack allows us to avoid modification of import
197
+ // ! statements in client modules. It uses a private API though,
198
+ // ! so it could break (maybe, eventually).
199
+ // See https://gist.github.com/branneman/8048520#7-the-hack
200
+ // @ts-ignore
201
+ require('module').Module._initPaths();
202
+ return true;
203
+ }
204
+ catch (e) {
205
+ return false;
206
+ }
207
+ };
208
+ if (!process.env.NODE_PATH) {
209
+ process.env.NODE_PATH = nodeModulesRoot;
210
+ if (refreshRequirePaths()) {
211
+ process.env.APPIUM_OMIT_PEER_DEPS = '1';
212
+ }
213
+ else {
214
+ delete process.env.NODE_PATH;
215
+ }
216
+ return;
217
+ }
218
+ const nodePathParts = process.env.NODE_PATH.split(path_1.default.delimiter);
219
+ if (nodePathParts.includes(nodeModulesRoot)) {
220
+ process.env.APPIUM_OMIT_PEER_DEPS = '1';
221
+ return;
222
+ }
223
+ nodePathParts.push(nodeModulesRoot);
224
+ process.env.NODE_PATH = nodePathParts.join(path_1.default.delimiter);
225
+ if (refreshRequirePaths()) {
226
+ process.env.APPIUM_OMIT_PEER_DEPS = '1';
227
+ }
228
+ else {
229
+ process.env.NODE_PATH = lodash_1.default.without(nodePathParts, nodeModulesRoot).join(path_1.default.delimiter);
230
+ }
268
231
  }
269
-
232
+ exports.adjustNodePath = adjustNodePath;
233
+ /**
234
+ * Pulls the initial values of Appium settings from the given capabilities argument.
235
+ * Each setting item must satisfy the following format:
236
+ * `setting[setting_name]: setting_value`
237
+ * The capabilities argument itself gets mutated, so it does not contain parsed
238
+ * settings anymore to avoid further parsing issues.
239
+ * Check
240
+ * https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/settings.md
241
+ * for more details on the available settings.
242
+ *
243
+ * @param {?Object} caps - Capabilities dictionary. It is mutated if
244
+ * one or more settings have been pulled from it
245
+ * @return {Object} - An empty dictionary if the given caps contains no
246
+ * setting items or a dictionary containing parsed Appium setting names along with
247
+ * their values.
248
+ */
270
249
  function pullSettings(caps) {
271
- if (!_lodash.default.isPlainObject(caps) || _lodash.default.isEmpty(caps)) {
272
- return {};
273
- }
274
-
275
- const result = {};
276
-
277
- for (const [key, value] of _lodash.default.toPairs(caps)) {
278
- const match = /\bsettings\[(\S+)\]$/.exec(key);
279
-
280
- if (!match) {
281
- continue;
250
+ if (!lodash_1.default.isPlainObject(caps) || lodash_1.default.isEmpty(caps)) {
251
+ return {};
252
+ }
253
+ const result = {};
254
+ for (const [key, value] of lodash_1.default.toPairs(caps)) {
255
+ const match = /\bsettings\[(\S+)\]$/.exec(key);
256
+ if (!match) {
257
+ continue;
258
+ }
259
+ result[match[1]] = value;
260
+ delete caps[key];
282
261
  }
283
-
284
- result[match[1]] = value;
285
- delete caps[key];
286
- }
287
-
288
- return result;
262
+ return result;
263
+ }
264
+ exports.pullSettings = pullSettings;
265
+ /**
266
+ * @template {CliCommand} [Cmd=ServerCommand]
267
+ * @template {CliExtensionSubcommand|void} [SubCmd=void]
268
+ * @param {Args<Cmd, SubCmd>} args
269
+ * @returns {args is Args<ServerCommand>}
270
+ */
271
+ function isServerCommandArgs(args) {
272
+ return args.subcommand === constants_1.SERVER_SUBCOMMAND;
273
+ }
274
+ exports.isServerCommandArgs = isServerCommandArgs;
275
+ /**
276
+ * @template {CliCommand} [Cmd=ServerCommand]
277
+ * @template {CliExtensionSubcommand|void} [SubCmd=void]
278
+ * @param {Args<Cmd, SubCmd>} args
279
+ * @returns {args is Args<CliExtensionCommand, SubCmd>}
280
+ */
281
+ function isExtensionCommandArgs(args) {
282
+ return args.subcommand === constants_1.DRIVER_TYPE || args.subcommand === constants_1.PLUGIN_TYPE;
283
+ }
284
+ exports.isExtensionCommandArgs = isExtensionCommandArgs;
285
+ /**
286
+ * @template {CliCommand} Cmd
287
+ * @template {CliExtensionSubcommand} SubCmd
288
+ * @param {Args<Cmd, SubCmd>} args
289
+ * @returns {args is Args<DriverCommand, SubCmd>}
290
+ */
291
+ function isDriverCommandArgs(args) {
292
+ return args.subcommand === constants_1.DRIVER_TYPE;
293
+ }
294
+ exports.isDriverCommandArgs = isDriverCommandArgs;
295
+ /**
296
+ * @template {CliCommand} Cmd
297
+ * @template {CliExtensionSubcommand} SubCmd
298
+ * @param {Args<Cmd, SubCmd>} args
299
+ * @returns {args is Args<PluginCommand, SubCmd>}
300
+ */
301
+ function isPluginCommandArgs(args) {
302
+ return args.subcommand === constants_1.PLUGIN_TYPE;
289
303
  }
290
-
291
- const rootDir = (0, _findRoot.default)(__dirname);
292
- exports.rootDir = rootDir;require('source-map-support').install();
293
-
294
-
295
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJXM0NfQVBQSVVNX1BSRUZJWCIsImluc3BlY3RPYmplY3QiLCJhcmdzIiwiZ2V0VmFsdWVBcnJheSIsIm9iaiIsImluZGVudCIsIl8iLCJpc09iamVjdCIsInN0ckFyciIsImFyZyIsInZhbHVlIiwidG9QYWlycyIsInB1c2giLCJzaGlmdCIsImxvZ2dlciIsImluZm8iLCJ2YWwiLCJwYXJzZUNhcHNGb3JJbm5lckRyaXZlciIsImpzb253cENhcGFiaWxpdGllcyIsInczY0NhcGFiaWxpdGllcyIsImNvbnN0cmFpbnRzIiwiZGVmYXVsdENhcGFiaWxpdGllcyIsImhhc1czQ0NhcHMiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiaGFzSlNPTldQQ2FwcyIsInByb3RvY29sIiwiZGVzaXJlZENhcHMiLCJwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMiLCJwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMiLCJQUk9UT0NPTFMiLCJXM0MiLCJlcnJvciIsIkVycm9yIiwiTUpTT05XUCIsImNsb25lRGVlcCIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwS2V5IiwiZGVmYXVsdENhcFZhbHVlIiwiaXNDYXBBbHJlYWR5U2V0IiwiZmlyc3RNYXRjaEVudHJ5IiwiZmlyc3RNYXRjaCIsInJlbW92ZUFwcGl1bVByZWZpeGVzIiwicmVtb3ZlQXBwaXVtUHJlZml4IiwiYWx3YXlzTWF0Y2giLCJPYmplY3QiLCJhc3NpZ24iLCJpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMiLCJtZXNzYWdlIiwiZGlmZmVyaW5nS2V5cyIsImRpZmZlcmVuY2UiLCJrZXlzIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpeFczY0NhcGFiaWxpdGllcyIsIndhcm4iLCJpbnNlcnRBcHBpdW1QcmVmaXhlcyIsInczY0NhcHMiLCJqc29ud3BDYXBzIiwicmVzdWx0Iiwia2V5c1RvSW5zZXJ0IiwicmVtb3ZlTWF0Y2hpbmdLZXlzIiwibWF0Y2giLCJwdWxsIiwiY29sb25JbmRleCIsImluZGV4T2YiLCJsZW5ndGgiLCJzdWJzdHJpbmciLCJpbmNsdWRlcyIsInBhaXIiLCJrZXkiLCJjYXBzIiwiU1RBTkRBUkRfQ0FQUyIsInByZWZpeGVkQ2FwcyIsIm5hbWUiLCJmaXhlZENhcHMiLCJwcmVmaXgiLCJzdGFydHNXaXRoIiwiZ2V0UGFja2FnZVZlcnNpb24iLCJwa2dOYW1lIiwicGtnSW5mbyIsInJlcXVpcmUiLCJ2ZXJzaW9uIiwicHVsbFNldHRpbmdzIiwiZXhlYyIsInJvb3REaXIiLCJfX2Rpcm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsaUJBQWlCLEdBQUcsUUFBMUI7O0FBRUEsU0FBU0MsYUFBVCxDQUF3QkMsSUFBeEIsRUFBOEI7QUFDNUIsV0FBU0MsYUFBVCxDQUF3QkMsR0FBeEIsRUFBNkJDLE1BQU0sR0FBRyxJQUF0QyxFQUE0QztBQUMxQyxRQUFJLENBQUNDLGdCQUFFQyxRQUFGLENBQVdILEdBQVgsQ0FBTCxFQUFzQjtBQUNwQixhQUFPLENBQUNBLEdBQUQsQ0FBUDtBQUNEOztBQUVELFFBQUlJLE1BQU0sR0FBRyxDQUFDLEdBQUQsQ0FBYjs7QUFDQSxTQUFLLElBQUksQ0FBQ0MsR0FBRCxFQUFNQyxLQUFOLENBQVQsSUFBeUJKLGdCQUFFSyxPQUFGLENBQVVQLEdBQVYsQ0FBekIsRUFBeUM7QUFDdkMsVUFBSSxDQUFDRSxnQkFBRUMsUUFBRixDQUFXRyxLQUFYLENBQUwsRUFBd0I7QUFDdEJGLFFBQUFBLE1BQU0sQ0FBQ0ksSUFBUCxDQUFhLEdBQUVQLE1BQU8sS0FBSUksR0FBSSxLQUFJQyxLQUFNLEVBQXhDO0FBQ0QsT0FGRCxNQUVPO0FBQ0xBLFFBQUFBLEtBQUssR0FBR1AsYUFBYSxDQUFDTyxLQUFELEVBQVMsR0FBRUwsTUFBTyxJQUFsQixDQUFyQjtBQUNBRyxRQUFBQSxNQUFNLENBQUNJLElBQVAsQ0FBYSxHQUFFUCxNQUFPLEtBQUlJLEdBQUksS0FBSUMsS0FBSyxD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akUsZ0JBQUU4QixPQUFGLENBQVVtQyxJQUFWLENBQTlCLEVBQStDO0FBQzdDLFdBQU8sRUFBUDtBQUNEOztBQUVELFFBQU1aLE1BQU0sR0FBRyxFQUFmOztBQUNBLE9BQUssTUFBTSxDQUFDVyxHQUFELEVBQU01RCxLQUFOLENBQVgsSUFBMkJKLGdCQUFFSyxPQUFGLENBQVU0RCxJQUFWLENBQTNCLEVBQTRDO0FBQzFDLFVBQU1ULEtBQUssR0FBRyx1QkFBdUJzQixJQUF2QixDQUE0QmQsR0FBNUIsQ0FBZDs7QUFDQSxRQUFJLENBQUNSLEtBQUwsRUFBWTtBQUNWO0FBQ0Q7O0FBRURILElBQUFBLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLENBQUQsQ0FBTixDQUFOLEdBQW1CcEQsS0FBbkI7QUFDQSxXQUFPNkQsSUFBSSxDQUFDRCxHQUFELENBQVg7QUFDRDs7QUFDRCxTQUFPWCxNQUFQO0FBQ0Q7O0FBRUQsTUFBTTBCLE9BQU8sR0FBRyx1QkFBU0MsU0FBVCxDQUFoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHByb2Nlc3NDYXBhYmlsaXRpZXMsIFBST1RPQ09MUyB9IGZyb20gJ2FwcGl1bS1iYXNlLWRyaXZlcic7XG5pbXBvcnQgZmluZFJvb3QgZnJvbSAnZmluZC1yb290JztcblxuY29uc3QgVzNDX0FQUElVTV9QUkVGSVggPSAnYXBwaXVtJztcblxuZnVuY3Rpb24gaW5zcGVjdE9iamVjdCAoYXJncykge1xuICBmdW5jdGlvbiBnZXRWYWx1ZUFycmF5IChvYmosIGluZGVudCA9ICcgICcpIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkge1xuICAgICAgcmV0dXJuIFtvYmpdO1xuICAgIH1cblxuICAgIGxldCBzdHJBcnIgPSBbJ3snXTtcbiAgICBmb3IgKGxldCBbYXJnLCB2YWx1ZV0gb2YgXy50b1BhaXJzKG9iaikpIHtcbiAgICAgIGlmICghXy5pc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fSAgJHthcmd9OiAke3ZhbHVlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBnZXRWYWx1ZUFycmF5KHZhbHVlLCBgJHtpbmRlbnR9ICBgKTtcbiAgICAgICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fSAgJHthcmd9OiAke3ZhbHVlLnNoaWZ0KCl9YCk7XG4gICAgICAgIHN0ckFyci5wdXNoKC4uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyQXJyLnB1c2goYCR7aW5kZW50fX1gKTtcbiAgICByZXR1cm4gc3RyQXJyO1xuICB9XG4gIGZvciAobGV0IFthcmcsIHZhbHVlXSBvZiBfLnRvUGFpcnMoYXJncykpIHtcbiAgICB2YWx1ZSA9IGdldFZhbHVlQXJyYXkodmFsdWUpO1xuICAgIGxvZ2dlci5pbmZvKGAgICR7YXJnfTogJHt2YWx1ZS5zaGlmdCgpfWApO1xuICAgIGZvciAobGV0IHZhbCBvZiB2YWx1ZSkge1xuICAgICAgbG9nZ2VyLmluZm8odmFsKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyB0aGUgY2FwcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyYW5zbGF0ZXMgdGhlbVxuICogaW50byBjYXBzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGlubmVyIGRyaXZlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGpzb253cENhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IHczY0NhcGFiaWxpdGllc1xuICogQHBhcmFtIHtPYmplY3R9IGNvbnN0cmFpbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENhcGFiaWxpdGllc1xuICovXG5mdW5jdGlvbiBwYXJzZUNhcHNGb3JJbm5lckRyaXZlciAoanNvbndwQ2FwYWJpbGl0aWVzLCB3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzID0ge30sIGRlZmF1bHRDYXBhYmlsaXRpZXMgPSB7fSkge1xuICAvLyBDaGVjayBpZiB0aGUgY2FsbGVyIHNlbnQgSlNPTldQIGNhcHMsIFczQyBjYXBzLCBvciBib3RoXG4gIGNvbnN0IGhhc1czQ0NhcHMgPSBfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzKSAmJlxuICAgIChfLmhhcyh3M2NDYXBhYmlsaXRpZXMsICdhbHdheXNNYXRjaCcpIHx8IF8uaGFzKHczY0NhcGFiaWxpdGllcywgJ2ZpcnN0TWF0Y2gnKSk7XG4gIGNvbnN0IGhhc0pTT05XUENhcHMgPSBfLmlzUGxhaW5PYmplY3QoanNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgbGV0IHByb3RvY29sID0gbnVsbDtcbiAgbGV0IGRlc2lyZWRDYXBzID0ge307XG4gIGxldCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMgPSBudWxsO1xuICBsZXQgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzID0gbnVsbDtcblxuICBpZiAoIWhhc0pTT05XUENhcHMgJiYgIWhhc1czQ0NhcHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2w6IFBST1RPQ09MUy5XM0MsXG4gICAgICBlcnJvcjogbmV3IEVycm9yKCdFaXRoZXIgSlNPTldQIG9yIFczQyBjYXBhYmlsaXRpZXMgc2hvdWxkIGJlIHByb3ZpZGVkJyksXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHtXM0MsIE1KU09OV1B9ID0gUFJPVE9DT0xTO1xuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuICBqc29ud3BDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcChqc29ud3BDYXBhYmlsaXRpZXMpO1xuICB3M2NDYXBhYmlsaXRpZXMgPSBfLmNsb25lRGVlcCh3M2NDYXBhYmlsaXRpZXMpO1xuICBkZWZhdWx0Q2FwYWJpbGl0aWVzID0gXy5jbG9uZURlZXAoZGVmYXVsdENhcGFiaWxpdGllcyk7XG5cbiAgaWYgKCFfLmlzRW1wdHkoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICBpZiAoaGFzVzNDQ2Fwcykge1xuICAgICAgZm9yIChjb25zdCBbZGVmYXVsdENhcEtleSwgZGVmYXVsdENhcFZhbHVlXSBvZiBfLnRvUGFpcnMoZGVmYXVsdENhcGFiaWxpdGllcykpIHtcbiAgICAgICAgbGV0IGlzQ2FwQWxyZWFkeVNldCA9IGZhbHNlO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiBmaXJzdE1hdGNoIGVudHJpZXNcbiAgICAgICAgZm9yIChjb25zdCBmaXJzdE1hdGNoRW50cnkgb2YgKHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoIHx8IFtdKSkge1xuICAgICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZmlyc3RNYXRjaEVudHJ5KVxuICAgICAgICAgICAgICAmJiBfLmhhcyhyZW1vdmVBcHBpdW1QcmVmaXhlcyhmaXJzdE1hdGNoRW50cnkpLCByZW1vdmVBcHBpdW1QcmVmaXgoZGVmYXVsdENhcEtleSkpKSB7XG4gICAgICAgICAgICBpc0NhcEFscmVhZHlTZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50IGluIGFsd2F5c01hdGNoIGVudHJpZXNcbiAgICAgICAgaXNDYXBBbHJlYWR5U2V0ID0gaXNDYXBBbHJlYWR5U2V0IHx8IChfLmlzUGxhaW5PYmplY3QodzNjQ2FwYWJpbGl0aWVzLmFsd2F5c01hdGNoKVxuICAgICAgICAgICYmIF8uaGFzKHJlbW92ZUFwcGl1bVByZWZpeGVzKHczY0NhcGFiaWxpdGllcy5hbHdheXNNYXRjaCksIHJlbW92ZUFwcGl1bVByZWZpeChkZWZhdWx0Q2FwS2V5KSkpO1xuICAgICAgICBpZiAoaXNDYXBBbHJlYWR5U2V0KSB7XG4gICAgICAgICAgLy8gU2tpcCBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWQgY2Fwc1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBhZGQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0eSBpZiBpdCBpcyBub3Qgb3ZlcnJpZGRlblxuICAgICAgICBpZiAoXy5pc0VtcHR5KHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoKSkge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoID0gW3tbZGVmYXVsdENhcEtleV06IGRlZmF1bHRDYXBWYWx1ZX1dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHczY0NhcGFiaWxpdGllcy5maXJzdE1hdGNoWzBdW2RlZmF1bHRDYXBLZXldID0gZGVmYXVsdENhcFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgICBqc29ud3BDYXBhYmlsaXRpZXMgPSBPYmplY3QuYXNzaWduKHt9LCByZW1vdmVBcHBpdW1QcmVmaXhlcyhkZWZhdWx0Q2FwYWJpbGl0aWVzKSwganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgTUpTT05XUCBjYXBzXG4gIGlmIChoYXNKU09OV1BDYXBzKSB7XG4gICAgcHJvdG9jb2wgPSBNSlNPTldQO1xuICAgIGRlc2lyZWRDYXBzID0ganNvbndwQ2FwYWJpbGl0aWVzO1xuICAgIHByb2Nlc3NlZEpzb253cENhcGFiaWxpdGllcyA9IHsuLi5qc29ud3BDYXBhYmlsaXRpZXN9O1xuICB9XG5cbiAgLy8gR2V0IFczQyBjYXBzXG4gIGlmIChoYXNXM0NDYXBzKSB7XG4gICAgcHJvdG9jb2wgPSBXM0M7XG4gICAgLy8gQ2FsbCB0aGUgcHJvY2VzcyBjYXBhYmlsaXRpZXMgYWxnb3JpdGhtIHRvIGZpbmQgbWF0Y2hpbmcgY2FwcyBvbiB0aGUgVzNDXG4gICAgLy8gKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2psaXBwcy9zaW1wbGUtd2Qtc3BlYyNwcm9jZXNzaW5nLWNhcGFiaWxpdGllcylcbiAgICBsZXQgaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFoYXNKU09OV1BDYXBzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGVzaXJlZENhcHMsXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllcyxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKGBDb3VsZCBub3QgcGFyc2UgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaGFzSlNPTldQQ2FwcyAmJiAhaXNGaXhpbmdOZWVkZWRGb3JXM2NDYXBzKSB7XG4gICAgICBjb25zdCBkaWZmZXJpbmdLZXlzID0gXy5kaWZmZXJlbmNlKF8ua2V5cyhyZW1vdmVBcHBpdW1QcmVmaXhlcyhwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMpKSwgXy5rZXlzKHJlbW92ZUFwcGl1bVByZWZpeGVzKGRlc2lyZWRDYXBzKSkpO1xuICAgICAgaWYgKCFfLmlzRW1wdHkoZGlmZmVyaW5nS2V5cykpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFRoZSBmb2xsb3dpbmcgY2FwYWJpbGl0aWVzIHdlcmUgcHJvdmlkZWQgaW4gdGhlIEpTT05XUCBkZXNpcmVkIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBtaXNzaW5nIGAgK1xuICAgICAgICAgIGBpbiBXM0MgY2FwYWJpbGl0aWVzOiAke0pTT04uc3RyaW5naWZ5KGRpZmZlcmluZ0tleXMpfWApO1xuICAgICAgICBpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0ZpeGluZ05lZWRlZEZvclczY0NhcHMgJiYgaGFzSlNPTldQQ2Fwcykge1xuICAgICAgbG9nZ2VyLmluZm8oJ1RyeWluZyB0byBmaXggVzNDIGNhcGFiaWxpdGllcyBieSBtZXJnaW5nIHRoZW0gd2l0aCBKU09OV1AgY2FwcycpO1xuICAgICAgdzNjQ2FwYWJpbGl0aWVzID0gZml4VzNjQ2FwYWJpbGl0aWVzKHczY0NhcGFiaWxpdGllcywganNvbndwQ2FwYWJpbGl0aWVzKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlc2lyZWRDYXBzID0gcHJvY2Vzc0NhcGFiaWxpdGllcyh3M2NDYXBhYmlsaXRpZXMsIGNvbnN0cmFpbnRzLCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBDb3VsZCBub3QgcGFyc2UgZml4ZWQgVzNDIGNhcGFiaWxpdGllczogJHtlcnJvci5tZXNzYWdlfS4gRmFsbGluZyBiYWNrIHRvIEpTT05XUCBwcm90b2NvbGApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRlc2lyZWRDYXBzOiBwcm9jZXNzZWRKc29ud3BDYXBhYmlsaXRpZXMsXG4gICAgICAgICAgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLFxuICAgICAgICAgIHByb2Nlc3NlZFczQ0NhcGFiaWxpdGllczogbnVsbCxcbiAgICAgICAgICBwcm90b2NvbDogTUpTT05XUCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgdzNjIGNhcGFiaWxpdGllcyBwYXlsb2FkIHRoYXQgY29udGFpbnMgb25seSB0aGUgbWF0Y2hpbmcgY2FwcyBpbiBgYWx3YXlzTWF0Y2hgXG4gICAgcHJvY2Vzc2VkVzNDQ2FwYWJpbGl0aWVzID0ge1xuICAgICAgYWx3YXlzTWF0Y2g6IHsuLi5pbnNlcnRBcHBpdW1QcmVmaXhlcyhkZXNpcmVkQ2Fwcyl9LFxuICAgICAgZmlyc3RNYXRjaDogW3t9XSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtkZXNpcmVkQ2FwcywgcHJvY2Vzc2VkSnNvbndwQ2FwYWJpbGl0aWVzLCBwcm9jZXNzZWRXM0NDYXBhYmlsaXRpZXMsIHByb3RvY29sfTtcbn1cblxuLyoqXG4gKiBUaGlzIGhlbHBlciBtZXRob2QgdHJpZXMgdG8gZml4IGNvcnJ1cHRlZCBXM0MgY2FwYWJpbGl0aWVzIGJ5XG4gKiBtZXJnaW5nIHRoZW0gdG8gZXhpc3RpbmcgSlNPTldQIGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdzNjQ2FwcyBXM0MgY2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0ge09iamVjdH0ganNvbndwQ2FwcyBKU09OV1AgY2FwYWJpbGl0aWVzXG4gKiBAcmV0dXJuIHtPYmplY3R9IEZpeGVkIFczQyBjYXBhYmlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gZml4VzNjQ2FwYWJpbGl0aWVzICh3M2NDYXBzLCBqc29ud3BDYXBzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBmaXJzdE1hdGNoOiB3M2NDYXBzLmZpcnN0TWF0Y2ggfHwgW10sXG4gICAgYWx3YXlzTWF0Y2g6IHczY0NhcHMuYWx3YXlzTWF0Y2ggfHwge30sXG4gIH07XG4gIGNvbnN0IGtleXNUb0luc2VydCA9IF8ua2V5cyhqc29ud3BDYXBzKTtcbiAgY29uc3QgcmVtb3ZlTWF0Y2hpbmdLZXlzID0gKG1hdGNoKSA9PiB7XG4gICAgXy5wdWxsKGtleXNUb0luc2VydCwgbWF0Y2gpO1xuICAgIGNvbnN0IGNvbG9uSW5kZXggPSBtYXRjaC5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGNvbG9uSW5kZXggPj0gMCAmJiBtYXRjaC5sZW5ndGggPiBjb2xvbkluZGV4KSB7XG4gICAgICBfLnB1bGwoa2V5c1RvSW5zZXJ0LCBtYXRjaC5zdWJzdHJpbmcoY29sb25JbmRleCArIDEpKTtcbiAgICB9XG4gICAgaWYgKGtleXNUb0luc2VydC5pbmNsdWRlcyhgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHttYXRjaH1gKSkge1xuICAgICAgXy5wdWxsKGtleXNUb0luc2VydCwgYCR7VzNDX0FQUElVTV9QUkVGSVh9OiR7bWF0Y2h9YCk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoY29uc3QgZmlyc3RNYXRjaEVudHJ5IG9mIHJlc3VsdC5maXJzdE1hdGNoKSB7XG4gICAgZm9yIChjb25zdCBwYWlyIG9mIF8udG9QYWlycyhmaXJzdE1hdGNoRW50cnkpKSB7XG4gICAgICByZW1vdmVNYXRjaGluZ0tleXMocGFpclswXSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwYWlyIG9mIF8udG9QYWlycyhyZXN1bHQuYWx3YXlzTWF0Y2gpKSB7XG4gICAgcmVtb3ZlTWF0Y2hpbmdLZXlzKHBhaXJbMF0pO1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvSW5zZXJ0KSB7XG4gICAgcmVzdWx0LmFsd2F5c01hdGNoW2tleV0gPSBqc29ud3BDYXBzW2tleV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIGNhcGFiaWxpdGllcyBvYmplY3RzIGFuZCBwcmVmaXhlcyBjYXBhYmlsaXRpZXMgd2l0aCBgYXBwaXVtOmBcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYXBzIERlc2lyZWQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICovXG5mdW5jdGlvbiBpbnNlcnRBcHBpdW1QcmVmaXhlcyAoY2Fwcykge1xuICAvLyBTdGFuZGFyZCwgbm9uLXByZWZpeGVkIGNhcGFiaWxpdGllcyAoc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi10YWJsZS1vZi1zdGFuZGFyZC1jYXBhYmlsaXRpZXMpXG4gIGNvbnN0IFNUQU5EQVJEX0NBUFMgPSBbXG4gICAgJ2Jyb3dzZXJOYW1lJyxcbiAgICAnYnJvd3NlclZlcnNpb24nLFxuICAgICdwbGF0Zm9ybU5hbWUnLFxuICAgICdhY2NlcHRJbnNlY3VyZUNlcnRzJyxcbiAgICAncGFnZUxvYWRTdHJhdGVneScsXG4gICAgJ3Byb3h5JyxcbiAgICAnc2V0V2luZG93UmVjdCcsXG4gICAgJ3RpbWVvdXRzJyxcbiAgICAndW5oYW5kbGVkUHJvbXB0QmVoYXZpb3InXG4gIF07XG5cbiAgbGV0IHByZWZpeGVkQ2FwcyA9IHt9O1xuICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIF8udG9QYWlycyhjYXBzKSkge1xuICAgIGlmIChTVEFOREFSRF9DQVBTLmluY2x1ZGVzKG5hbWUpIHx8IG5hbWUuaW5jbHVkZXMoJzonKSkge1xuICAgICAgcHJlZml4ZWRDYXBzW25hbWVdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeGVkQ2Fwc1tgJHtXM0NfQVBQSVVNX1BSRUZJWH06JHtuYW1lfWBdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmVmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFwcGl1bVByZWZpeGVzIChjYXBzKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhcHMpKSB7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCBmaXhlZENhcHMgPSB7fTtcbiAgZm9yIChsZXQgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBmaXhlZENhcHNbcmVtb3ZlQXBwaXVtUHJlZml4KG5hbWUpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBmaXhlZENhcHM7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFwcGl1bVByZWZpeCAoa2V5KSB7XG4gIGNvbnN0IHByZWZpeCA9IGAke1czQ19BUFBJVU1fUFJFRklYfTpgO1xuICByZXR1cm4gXy5zdGFydHNXaXRoKGtleSwgcHJlZml4KSA/IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkgOiBrZXk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uIChwa2dOYW1lKSB7XG4gIGNvbnN0IHBrZ0luZm8gPSByZXF1aXJlKGAke3BrZ05hbWV9L3BhY2thZ2UuanNvbmApIHx8IHt9O1xuICByZXR1cm4gcGtnSW5mby52ZXJzaW9uO1xufVxuXG4vKipcbiAqIFB1bGxzIHRoZSBpbml0aWFsIHZhbHVlcyBvZiBBcHBpdW0gc2V0dGluZ3MgZnJvbSB0aGUgZ2l2ZW4gY2FwYWJpbGl0aWVzIGFyZ3VtZW50LlxuICogRWFjaCBzZXR0aW5nIGl0ZW0gbXVzdCBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICogYHNldHRpbmdbc2V0dGluZ19uYW1lXTogc2V0dGluZ192YWx1ZWBcbiAqIFRoZSBjYXBhYmlsaXRpZXMgYXJndW1lbnQgaXRzZWxmIGdldHMgbXV0YXRlZCwgc28gaXQgZG9lcyBub3QgY29udGFpbiBwYXJzZWRcbiAqIHNldHRpbmdzIGFueW1vcmUgdG8gYXZvaWQgZnVydGhlciBwYXJzaW5nIGlzc3Vlcy5cbiAqIENoZWNrXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9ibG9iL21hc3Rlci9kb2NzL2VuL2FkdmFuY2VkLWNvbmNlcHRzL3NldHRpbmdzLm1kXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBhdmFpbGFibGUgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHs/T2JqZWN0fSBjYXBzIC0gQ2FwYWJpbGl0aWVzIGRpY3Rpb25hcnkuIEl0IGlzIG11dGF0ZWQgaWZcbiAqIG9uZSBvciBtb3JlIHNldHRpbmdzIGhhdmUgYmVlbiBwdWxsZWQgZnJvbSBpdFxuICogQHJldHVybiB7T2JqZWN0fSAtIEFuIGVtcHR5IGRpY3Rpb25hcnkgaWYgdGhlIGdpdmVuIGNhcHMgY29udGFpbnMgbm9cbiAqIHNldHRpbmcgaXRlbXMgb3IgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgcGFyc2VkIEFwcGl1bSBzZXR0aW5nIG5hbWVzIGFsb25nIHdpdGhcbiAqIHRoZWlyIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gcHVsbFNldHRpbmdzIChjYXBzKSB7XG4gIGlmICghXy5pc1BsYWluT2JqZWN0KGNhcHMpIHx8IF8uaXNFbXB0eShjYXBzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMoY2FwcykpIHtcbiAgICBjb25zdCBtYXRjaCA9IC9cXGJzZXR0aW5nc1xcWyhcXFMrKVxcXSQvLmV4ZWMoa2V5KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXN1bHRbbWF0Y2hbMV1dID0gdmFsdWU7XG4gICAgZGVsZXRlIGNhcHNba2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb25zdCByb290RGlyID0gZmluZFJvb3QoX19kaXJuYW1lKTtcblxuZXhwb3J0IHtcbiAgaW5zcGVjdE9iamVjdCwgcGFyc2VDYXBzRm9ySW5uZXJEcml2ZXIsIGluc2VydEFwcGl1bVByZWZpeGVzLCByb290RGlyLFxuICBnZXRQYWNrYWdlVmVyc2lvbiwgcHVsbFNldHRpbmdzLCByZW1vdmVBcHBpdW1QcmVmaXhlcyxcbn07XG4iXSwiZmlsZSI6ImxpYi91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
304
+ exports.isPluginCommandArgs = isPluginCommandArgs;
305
+ /**
306
+ * @typedef {import('@appium/types').StringRecord} StringRecord
307
+ * @typedef {import('@appium/types').BaseDriverCapConstraints} BaseDriverCapConstraints
308
+ */
309
+ /**
310
+ * @template {Constraints} [C=BaseDriverCapConstraints]
311
+ * @template [J=any]
312
+ * @typedef ParsedDriverCaps
313
+ * @property {Capabilities<C>} desiredCaps
314
+ * @property {string} protocol
315
+ * @property {J} [processedJsonwpCapabilities]
316
+ * @property {W3CCapabilities<C>} [processedW3CCapabilities]
317
+ */
318
+ /**
319
+ * @todo protocol is more specific
320
+ * @template {Constraints} [C=BaseDriverCapConstraints]
321
+ * @template [J=any]
322
+ * @typedef InvalidCaps
323
+ * @property {Error} error
324
+ * @property {string} protocol
325
+ * @property {Capabilities<C>} [desiredCaps]
326
+ * @property {J} [processedJsonwpCapabilities]
327
+ * @property {W3CCapabilities<C>} [processedW3CCapabilities]
328
+ */
329
+ /**
330
+ * @template {Constraints} [C=BaseDriverCapConstraints]
331
+ * @template {StringRecord|void} [Extra=void]
332
+ * @typedef {import('@appium/types').Capabilities<C, Extra>} Capabilities
333
+ */
334
+ /**
335
+ * @template {Constraints} [C=BaseDriverCapConstraints]
336
+ * @template {StringRecord|void} [Extra=void]
337
+ * @typedef {import('@appium/types').W3CCapabilities<C, Extra>} W3CCapabilities
338
+ */
339
+ /**
340
+ * @template {Constraints} [C=BaseDriverCapConstraints]
341
+ * @template {StringRecord|void} [Extra=void]
342
+ * @typedef {import('@appium/types').NSCapabilities<C, Extra>} NSCapabilities
343
+ */
344
+ /**
345
+ * @template {Constraints} C
346
+ * @typedef {import('@appium/types').ConstraintsToCaps<C>} ConstraintsToCaps
347
+ */
348
+ /**
349
+ * @template T
350
+ * @typedef {import('type-fest').StringKeyOf<T>} StringKeyOf
351
+ */
352
+ /**
353
+ * @typedef {import('@appium/types').Constraints} Constraints
354
+ */
355
+ /**
356
+ * @typedef {import('appium/types').CliCommand} CliCommand
357
+ * @typedef {import('appium/types').CliExtensionSubcommand} CliExtensionSubcommand
358
+ * @typedef {import('appium/types').CliExtensionCommand} CliExtensionCommand
359
+ * @typedef {import('appium/types').ServerCommand} ServerCommand
360
+ * @typedef {import('appium/types').DriverCommand} DriverCommand
361
+ * @typedef {import('appium/types').PluginCommand} PluginCommand
362
+ */
363
+ /**
364
+ * @template {CliCommand} [Cmd=ServerCommand]
365
+ * @template {CliExtensionSubcommand|void} [SubCmd=void]
366
+ * @typedef {import('appium/types').Args<Cmd, SubCmd>} Args
367
+ */
368
+ /**
369
+ * @template {CliCommand} [Cmd=ServerCommand]
370
+ * @template {CliExtensionSubcommand|void} [SubCmd=void]
371
+ * @typedef {import('appium/types').ParsedArgs<Cmd, SubCmd>} ParsedArgs
372
+ */
373
+ //# sourceMappingURL=utils.js.map