appium 2.0.0-beta.4 → 2.0.0-beta.42

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 (153) hide show
  1. package/README.md +10 -11
  2. package/build/lib/appium.d.ts +204 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +256 -131
  5. package/build/lib/cli/args.d.ts +17 -0
  6. package/build/lib/cli/args.d.ts.map +1 -0
  7. package/build/lib/cli/args.js +96 -282
  8. package/build/lib/cli/driver-command.d.ts +37 -0
  9. package/build/lib/cli/driver-command.d.ts.map +1 -0
  10. package/build/lib/cli/driver-command.js +27 -18
  11. package/build/lib/cli/extension-command.d.ts +376 -0
  12. package/build/lib/cli/extension-command.d.ts.map +1 -0
  13. package/build/lib/cli/extension-command.js +287 -156
  14. package/build/lib/cli/extension.d.ts +22 -0
  15. package/build/lib/cli/extension.d.ts.map +1 -0
  16. package/build/lib/cli/extension.js +31 -17
  17. package/build/lib/cli/parser.d.ts +84 -0
  18. package/build/lib/cli/parser.d.ts.map +1 -0
  19. package/build/lib/cli/parser.js +164 -94
  20. package/build/lib/cli/plugin-command.d.ts +34 -0
  21. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  22. package/build/lib/cli/plugin-command.js +26 -19
  23. package/build/lib/cli/utils.d.ts +29 -0
  24. package/build/lib/cli/utils.d.ts.map +1 -0
  25. package/build/lib/cli/utils.js +27 -3
  26. package/build/lib/config-file.d.ts +100 -0
  27. package/build/lib/config-file.d.ts.map +1 -0
  28. package/build/lib/config-file.js +136 -0
  29. package/build/lib/config.d.ts +49 -0
  30. package/build/lib/config.d.ts.map +1 -0
  31. package/build/lib/config.js +119 -96
  32. package/build/lib/constants.d.ts +48 -0
  33. package/build/lib/constants.d.ts.map +1 -0
  34. package/build/lib/constants.js +60 -0
  35. package/build/lib/extension/driver-config.d.ts +81 -0
  36. package/build/lib/extension/driver-config.d.ts.map +1 -0
  37. package/build/lib/extension/driver-config.js +177 -0
  38. package/build/lib/extension/extension-config.d.ts +242 -0
  39. package/build/lib/extension/extension-config.d.ts.map +1 -0
  40. package/build/lib/extension/extension-config.js +436 -0
  41. package/build/lib/extension/index.d.ts +48 -0
  42. package/build/lib/extension/index.d.ts.map +1 -0
  43. package/build/lib/extension/index.js +75 -0
  44. package/build/lib/extension/manifest.d.ts +174 -0
  45. package/build/lib/extension/manifest.d.ts.map +1 -0
  46. package/build/lib/extension/manifest.js +256 -0
  47. package/build/lib/extension/package-changed.d.ts +11 -0
  48. package/build/lib/extension/package-changed.d.ts.map +1 -0
  49. package/build/lib/extension/package-changed.js +66 -0
  50. package/build/lib/extension/plugin-config.d.ts +57 -0
  51. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  52. package/build/lib/extension/plugin-config.js +78 -0
  53. package/build/lib/grid-register.d.ts +10 -0
  54. package/build/lib/grid-register.d.ts.map +1 -0
  55. package/build/lib/grid-register.js +21 -25
  56. package/build/lib/logger.d.ts +3 -0
  57. package/build/lib/logger.d.ts.map +1 -0
  58. package/build/lib/logger.js +4 -6
  59. package/build/lib/logsink.d.ts +4 -0
  60. package/build/lib/logsink.d.ts.map +1 -0
  61. package/build/lib/logsink.js +14 -17
  62. package/build/lib/main.d.ts +55 -0
  63. package/build/lib/main.d.ts.map +1 -0
  64. package/build/lib/main.js +183 -91
  65. package/build/lib/schema/arg-spec.d.ts +143 -0
  66. package/build/lib/schema/arg-spec.d.ts.map +1 -0
  67. package/build/lib/schema/arg-spec.js +119 -0
  68. package/build/lib/schema/cli-args.d.ts +19 -0
  69. package/build/lib/schema/cli-args.d.ts.map +1 -0
  70. package/build/lib/schema/cli-args.js +178 -0
  71. package/build/lib/schema/cli-transformers.d.ts +5 -0
  72. package/build/lib/schema/cli-transformers.d.ts.map +1 -0
  73. package/build/lib/schema/cli-transformers.js +74 -0
  74. package/build/lib/schema/index.d.ts +3 -0
  75. package/build/lib/schema/index.d.ts.map +1 -0
  76. package/build/lib/schema/index.js +34 -0
  77. package/build/lib/schema/keywords.d.ts +24 -0
  78. package/build/lib/schema/keywords.d.ts.map +1 -0
  79. package/build/lib/schema/keywords.js +70 -0
  80. package/build/lib/schema/schema.d.ts +259 -0
  81. package/build/lib/schema/schema.d.ts.map +1 -0
  82. package/build/lib/schema/schema.js +450 -0
  83. package/build/lib/utils.d.ts +66 -0
  84. package/build/lib/utils.d.ts.map +1 -0
  85. package/build/lib/utils.js +35 -139
  86. package/build/tsconfig.tsbuildinfo +1 -0
  87. package/build/types/appium-manifest.d.ts +59 -0
  88. package/build/types/appium-manifest.d.ts.map +1 -0
  89. package/build/types/cli.d.ts +123 -0
  90. package/build/types/cli.d.ts.map +1 -0
  91. package/build/types/extension-manifest.d.ts +55 -0
  92. package/build/types/extension-manifest.d.ts.map +1 -0
  93. package/build/types/index.d.ts +16 -0
  94. package/build/types/index.d.ts.map +1 -0
  95. package/driver.d.ts +1 -0
  96. package/driver.js +14 -0
  97. package/index.js +11 -0
  98. package/lib/appium.js +520 -186
  99. package/lib/cli/args.js +267 -422
  100. package/lib/cli/driver-command.js +58 -23
  101. package/lib/cli/extension-command.js +613 -260
  102. package/lib/cli/extension.js +47 -17
  103. package/lib/cli/parser.js +263 -83
  104. package/lib/cli/plugin-command.js +48 -20
  105. package/lib/cli/utils.js +24 -10
  106. package/lib/config-file.js +219 -0
  107. package/lib/config.js +243 -110
  108. package/lib/constants.js +69 -0
  109. package/lib/extension/driver-config.js +249 -0
  110. package/lib/extension/extension-config.js +677 -0
  111. package/lib/extension/index.js +116 -0
  112. package/lib/extension/manifest.js +475 -0
  113. package/lib/extension/package-changed.js +64 -0
  114. package/lib/extension/plugin-config.js +113 -0
  115. package/lib/grid-register.js +49 -35
  116. package/lib/logger.js +1 -2
  117. package/lib/logsink.js +38 -33
  118. package/lib/main.js +308 -100
  119. package/lib/schema/arg-spec.js +229 -0
  120. package/lib/schema/cli-args.js +238 -0
  121. package/lib/schema/cli-transformers.js +115 -0
  122. package/lib/schema/index.js +2 -0
  123. package/lib/schema/keywords.js +136 -0
  124. package/lib/schema/schema.js +717 -0
  125. package/lib/utils.js +121 -140
  126. package/package.json +85 -85
  127. package/plugin.d.ts +1 -0
  128. package/plugin.js +13 -0
  129. package/scripts/autoinstall-extensions.js +185 -0
  130. package/support.d.ts +1 -0
  131. package/support.js +13 -0
  132. package/test.d.ts +7 -0
  133. package/test.js +13 -0
  134. package/types/appium-manifest.ts +73 -0
  135. package/types/cli.ts +150 -0
  136. package/types/extension-manifest.ts +64 -0
  137. package/types/index.ts +21 -0
  138. package/CHANGELOG.md +0 -3515
  139. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  140. package/build/lib/cli/npm.js +0 -206
  141. package/build/lib/cli/parser-helpers.js +0 -82
  142. package/build/lib/driver-config.js +0 -77
  143. package/build/lib/drivers.js +0 -96
  144. package/build/lib/extension-config.js +0 -253
  145. package/build/lib/plugin-config.js +0 -59
  146. package/build/lib/plugins.js +0 -14
  147. package/lib/cli/npm.js +0 -183
  148. package/lib/cli/parser-helpers.js +0 -79
  149. package/lib/driver-config.js +0 -46
  150. package/lib/drivers.js +0 -81
  151. package/lib/extension-config.js +0 -209
  152. package/lib/plugin-config.js +0 -34
  153. package/lib/plugins.js +0 -10
@@ -0,0 +1,436 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.INSTALL_TYPE_NPM = exports.INSTALL_TYPE_LOCAL = exports.INSTALL_TYPE_GITHUB = exports.INSTALL_TYPE_GIT = exports.INSTALL_TYPES = exports.ExtensionConfig = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ var _bluebird = _interopRequireDefault(require("bluebird"));
15
+
16
+ var _path = _interopRequireDefault(require("path"));
17
+
18
+ var _resolveFrom = _interopRequireDefault(require("resolve-from"));
19
+
20
+ var _semver = require("semver");
21
+
22
+ var _support = require("@appium/support");
23
+
24
+ var _extension = require("../cli/extension");
25
+
26
+ var _config = require("../config");
27
+
28
+ var _logger = _interopRequireDefault(require("../logger"));
29
+
30
+ var _schema = require("../schema/schema");
31
+
32
+ const INSTALL_TYPE_NPM = 'npm';
33
+ exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
34
+ const INSTALL_TYPE_LOCAL = 'local';
35
+ exports.INSTALL_TYPE_LOCAL = INSTALL_TYPE_LOCAL;
36
+ const INSTALL_TYPE_GITHUB = 'github';
37
+ exports.INSTALL_TYPE_GITHUB = INSTALL_TYPE_GITHUB;
38
+ const INSTALL_TYPE_GIT = 'git';
39
+ exports.INSTALL_TYPE_GIT = INSTALL_TYPE_GIT;
40
+ const INSTALL_TYPES = new Set([INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM]);
41
+ exports.INSTALL_TYPES = INSTALL_TYPES;
42
+
43
+ class ExtensionConfig {
44
+ extensionType;
45
+ configKey;
46
+ installedExtensions;
47
+ log;
48
+ manifest;
49
+ _listDataCache;
50
+
51
+ constructor(extensionType, manifest) {
52
+ this.extensionType = extensionType;
53
+ this.configKey = `${extensionType}s`;
54
+ this.installedExtensions = manifest.getExtensionData(extensionType);
55
+ this.manifest = manifest;
56
+ }
57
+
58
+ get manifestPath() {
59
+ return this.manifest.manifestPath;
60
+ }
61
+
62
+ get appiumHome() {
63
+ return this.manifest.appiumHome;
64
+ }
65
+
66
+ getProblems(extName, extManifest) {
67
+ return [...this.getGenericConfigProblems(extManifest, extName), ...this.getConfigProblems(extManifest, extName), ...this.getSchemaProblems(extManifest, extName)];
68
+ }
69
+
70
+ async getWarnings(extName, extManifest) {
71
+ const [genericConfigWarnings, configWarnings] = await _bluebird.default.all([this.getGenericConfigWarnings(extManifest, extName), this.getConfigWarnings(extManifest, extName)]);
72
+ return [...genericConfigWarnings, ...configWarnings];
73
+ }
74
+
75
+ async getConfigWarnings(extManifest, extName) {
76
+ return [];
77
+ }
78
+
79
+ getValidationResultSummaries(errorMap = new Map(), warningMap = new Map()) {
80
+ const errorSummaries = [];
81
+
82
+ for (const [extName, problems] of errorMap.entries()) {
83
+ if (_lodash.default.isEmpty(problems)) {
84
+ continue;
85
+ }
86
+
87
+ errorSummaries.push(`${this.extensionType} "${extName}" had ${_support.util.pluralize('error', problems.length)} and will not be available:`);
88
+
89
+ for (const problem of problems) {
90
+ errorSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
91
+ }
92
+ }
93
+
94
+ const warningSummaries = [];
95
+
96
+ for (const [extName, warnings] of warningMap.entries()) {
97
+ if (_lodash.default.isEmpty(warnings)) {
98
+ continue;
99
+ }
100
+
101
+ const extTypeText = _lodash.default.capitalize(this.extensionType);
102
+
103
+ const problemEnumerationText = _support.util.pluralize('potential problem', warnings.length, true);
104
+
105
+ warningSummaries.push(`${extTypeText} "${extName}" has ${problemEnumerationText}: `);
106
+
107
+ for (const warning of warnings) {
108
+ warningSummaries.push(` - ${warning}`);
109
+ }
110
+ }
111
+
112
+ return {
113
+ errorSummaries,
114
+ warningSummaries
115
+ };
116
+ }
117
+
118
+ async _validate(exts) {
119
+ const errorMap = new Map();
120
+ const warningMap = new Map();
121
+
122
+ for (const [extName, extManifest] of _lodash.default.toPairs(exts)) {
123
+ const [errors, warnings] = await _bluebird.default.all([this.getProblems(extName, extManifest), this.getWarnings(extName, extManifest)]);
124
+
125
+ if (errors.length) {
126
+ delete exts[extName];
127
+ }
128
+
129
+ errorMap.set(extName, errors);
130
+ warningMap.set(extName, warnings);
131
+ }
132
+
133
+ const {
134
+ errorSummaries,
135
+ warningSummaries
136
+ } = this.getValidationResultSummaries(errorMap, warningMap);
137
+
138
+ if (!_lodash.default.isEmpty(errorSummaries)) {
139
+ _logger.default.error(`Appium encountered ${_support.util.pluralize('error', errorMap.size, true)} while validating ${this.configKey} found in manifest ${this.manifestPath}`);
140
+
141
+ for (const summary of errorSummaries) {
142
+ _logger.default.error(summary);
143
+ }
144
+ } else {
145
+ if (!_lodash.default.isEmpty(warningSummaries)) {
146
+ _logger.default.warn(`Appium encountered ${_support.util.pluralize('warning', warningMap.size, true)} while validating ${this.configKey} found in manifest ${this.manifestPath}`);
147
+
148
+ for (const summary of warningSummaries) {
149
+ _logger.default.warn(summary);
150
+ }
151
+ }
152
+ }
153
+
154
+ return exts;
155
+ }
156
+
157
+ async getListData() {
158
+ if (this._listDataCache) {
159
+ return this._listDataCache;
160
+ }
161
+
162
+ const CommandClass = _extension.commandClasses[this.extensionType];
163
+ const cmd = new CommandClass({
164
+ config: this,
165
+ json: true
166
+ });
167
+ const listData = await cmd.list({
168
+ showInstalled: true,
169
+ showUpdates: true
170
+ });
171
+ this._listDataCache = listData;
172
+ return listData;
173
+ }
174
+
175
+ async getGenericConfigWarnings(extManifest, extName) {
176
+ const {
177
+ appiumVersion,
178
+ installSpec,
179
+ installType,
180
+ pkgName
181
+ } = extManifest;
182
+ const warnings = [];
183
+ const invalidFields = [];
184
+
185
+ if (!_lodash.default.isString(installSpec)) {
186
+ invalidFields.push('installSpec');
187
+ }
188
+
189
+ if (!INSTALL_TYPES.has(installType)) {
190
+ invalidFields.push('installType');
191
+ }
192
+
193
+ const extTypeText = _lodash.default.capitalize(this.extensionType);
194
+
195
+ if (invalidFields.length) {
196
+ const invalidFieldsEnumerationText = _support.util.pluralize('invalid or missing field', invalidFields.length, true);
197
+
198
+ const invalidFieldsText = invalidFields.map(field => `"${field}"`).join(', ');
199
+ warnings.push(`${extTypeText} "${extName}" (package \`${pkgName}\`) has ${invalidFieldsEnumerationText} (${invalidFieldsText}) in \`extensions.yaml\`; this may cause upgrades done via the \`appium\` CLI tool to fail. Please reinstall with \`appium ${this.extensionType} uninstall ${extName}\` and \`appium ${this.extensionType} install ${extName}\` to attempt a fix.`);
200
+ }
201
+
202
+ const createPeerWarning = reason => `${extTypeText} "${extName}" (package \`${pkgName}\`) may be incompatible with the current version of Appium (v${_config.APPIUM_VER}) due to ${reason}`;
203
+
204
+ if (_lodash.default.isString(appiumVersion) && !(0, _semver.satisfies)(_config.APPIUM_VER, appiumVersion)) {
205
+ const listData = await this.getListData();
206
+ const extListData = listData[extName];
207
+
208
+ if (extListData !== null && extListData !== void 0 && extListData.installed) {
209
+ const {
210
+ updateVersion,
211
+ upToDate
212
+ } = extListData;
213
+
214
+ if (!upToDate) {
215
+ warnings.push(createPeerWarning(`its peer dependency on older Appium v${appiumVersion}. Please upgrade \`${pkgName}\` to v${updateVersion} or newer.`));
216
+ } else {
217
+ warnings.push(createPeerWarning(`its peer dependency on older Appium v${appiumVersion}. Please ask the developer of \`${pkgName}\` to update the peer dependency on Appium to v${_config.APPIUM_VER}.`));
218
+ }
219
+ }
220
+ } else if (!_lodash.default.isString(appiumVersion)) {
221
+ const listData = await this.getListData();
222
+ const extListData = listData[extName];
223
+
224
+ if (!(extListData !== null && extListData !== void 0 && extListData.upToDate) && extListData !== null && extListData !== void 0 && extListData.updateVersion) {
225
+ warnings.push(createPeerWarning(`an invalid or missing peer dependency on Appium. A newer version of \`${pkgName}\` is available; please attempt to upgrade "${extName}" to v${extListData.updateVersion} or newer.`));
226
+ } else {
227
+ warnings.push(createPeerWarning(`an invalid or missing peer dependency on Appium. Please ask the developer of \`${pkgName}\` to add a peer dependency on \`^appium@${_config.APPIUM_VER}\`.`));
228
+ }
229
+ }
230
+
231
+ return warnings;
232
+ }
233
+
234
+ getSchemaProblems(extManifest, extName) {
235
+ const problems = [];
236
+ const {
237
+ schema: argSchemaPath
238
+ } = extManifest;
239
+
240
+ if (ExtensionConfig.extDataHasSchema(extManifest)) {
241
+ if (_lodash.default.isString(argSchemaPath)) {
242
+ if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
243
+ try {
244
+ this.readExtensionSchema(extName, extManifest);
245
+ } catch (err) {
246
+ problems.push({
247
+ err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
248
+ val: argSchemaPath
249
+ });
250
+ }
251
+ } else {
252
+ problems.push({
253
+ err: `Schema file has unsupported extension. Allowed: ${[..._schema.ALLOWED_SCHEMA_EXTENSIONS].join(', ')}`,
254
+ val: argSchemaPath
255
+ });
256
+ }
257
+ } else if (_lodash.default.isPlainObject(argSchemaPath)) {
258
+ try {
259
+ this.readExtensionSchema(extName, extManifest);
260
+ } catch (err) {
261
+ problems.push({
262
+ err: `Unable to register embedded schema; ${err.message}`,
263
+ val: argSchemaPath
264
+ });
265
+ }
266
+ } else {
267
+ problems.push({
268
+ err: 'Incorrectly formatted schema field; must be a path to a schema file or a schema object.',
269
+ val: argSchemaPath
270
+ });
271
+ }
272
+ }
273
+
274
+ return problems;
275
+ }
276
+
277
+ getGenericConfigProblems(extManifest, extName) {
278
+ const {
279
+ version,
280
+ pkgName,
281
+ mainClass
282
+ } = extManifest;
283
+ const problems = [];
284
+
285
+ if (!_lodash.default.isString(version)) {
286
+ problems.push({
287
+ err: `Invalid or missing \`version\` field in my \`package.json\` and/or \`extensions.yaml\` (must be a string)`,
288
+ val: version
289
+ });
290
+ }
291
+
292
+ if (!_lodash.default.isString(pkgName)) {
293
+ problems.push({
294
+ err: `Invalid or missing \`name\` field in my \`package.json\` and/or \`extensions.yaml\` (must be a string)`,
295
+ val: pkgName
296
+ });
297
+ }
298
+
299
+ if (!_lodash.default.isString(mainClass)) {
300
+ problems.push({
301
+ err: `Invalid or missing \`appium.mainClass\` field in my \`package.json\` and/or \`mainClass\` field in \`extensions.yaml\` (must be a string)`,
302
+ val: mainClass
303
+ });
304
+ }
305
+
306
+ return problems;
307
+ }
308
+
309
+ getConfigProblems(extManifest, extName) {
310
+ return [];
311
+ }
312
+
313
+ async addExtension(extName, extManifest, {
314
+ write = true
315
+ } = {}) {
316
+ this.manifest.addExtension(this.extensionType, extName, extManifest);
317
+
318
+ if (write) {
319
+ await this.manifest.write();
320
+ }
321
+ }
322
+
323
+ async updateExtension(extName, extManifest, {
324
+ write = true
325
+ } = {}) {
326
+ this.installedExtensions[extName] = { ...this.installedExtensions[extName],
327
+ ...extManifest
328
+ };
329
+
330
+ if (write) {
331
+ await this.manifest.write();
332
+ }
333
+ }
334
+
335
+ async removeExtension(extName, {
336
+ write = true
337
+ } = {}) {
338
+ delete this.installedExtensions[extName];
339
+
340
+ if (write) {
341
+ await this.manifest.write();
342
+ }
343
+ }
344
+
345
+ print(activeNames) {
346
+ if (_lodash.default.isEmpty(this.installedExtensions)) {
347
+ _logger.default.info(`No ${this.configKey} have been installed in ${this.appiumHome}. Use the "appium ${this.extensionType}" ` + 'command to install the one(s) you want to use.');
348
+
349
+ return;
350
+ }
351
+
352
+ _logger.default.info(`Available ${this.configKey}:`);
353
+
354
+ for (const [extName, extManifest] of _lodash.default.toPairs(this.installedExtensions)) {
355
+ _logger.default.info(` - ${this.extensionDesc(extName, extManifest)}`);
356
+ }
357
+ }
358
+
359
+ extensionDesc(extName, extManifest) {
360
+ throw new Error('This must be implemented in a subclass');
361
+ }
362
+
363
+ getInstallPath(extName) {
364
+ return _path.default.join(this.appiumHome, 'node_modules', this.installedExtensions[extName].pkgName);
365
+ }
366
+
367
+ require(extName) {
368
+ const {
369
+ mainClass
370
+ } = this.installedExtensions[extName];
371
+ const reqPath = this.getInstallPath(extName);
372
+ let reqResolved;
373
+
374
+ try {
375
+ reqResolved = require.resolve(reqPath);
376
+ } catch (err) {
377
+ throw new ReferenceError(`Could not find a ${this.extensionType} installed at ${reqPath}`);
378
+ }
379
+
380
+ if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
381
+ _logger.default.debug(`Removing ${reqResolved} from require cache`);
382
+
383
+ delete require.cache[reqResolved];
384
+ }
385
+
386
+ _logger.default.debug(`Requiring ${this.extensionType} at ${reqPath}`);
387
+
388
+ const MainClass = require(reqPath)[mainClass];
389
+
390
+ if (!MainClass) {
391
+ throw new ReferenceError(`Could not find a class named "${mainClass}" exported by ${this.extensionType} "${extName}"`);
392
+ }
393
+
394
+ return MainClass;
395
+ }
396
+
397
+ isInstalled(extName) {
398
+ return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
399
+ }
400
+
401
+ static _readExtensionSchema(appiumHome, extType, extName, extManifest) {
402
+ const {
403
+ pkgName,
404
+ schema: argSchemaPath
405
+ } = extManifest;
406
+
407
+ if (!argSchemaPath) {
408
+ throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
409
+ }
410
+
411
+ let moduleObject;
412
+
413
+ if (_lodash.default.isString(argSchemaPath)) {
414
+ const schemaPath = (0, _resolveFrom.default)(appiumHome, _path.default.join(pkgName, argSchemaPath));
415
+ moduleObject = require(schemaPath);
416
+ } else {
417
+ moduleObject = argSchemaPath;
418
+ }
419
+
420
+ const schema = moduleObject.__esModule ? moduleObject.default : moduleObject;
421
+ (0, _schema.registerSchema)(extType, extName, schema);
422
+ return schema;
423
+ }
424
+
425
+ static extDataHasSchema(extManifest) {
426
+ return _lodash.default.isString(extManifest === null || extManifest === void 0 ? void 0 : extManifest.schema) || _lodash.default.isObject(extManifest === null || extManifest === void 0 ? void 0 : extManifest.schema);
427
+ }
428
+
429
+ readExtensionSchema(extName, extManifest) {
430
+ return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extManifest);
431
+ }
432
+
433
+ }
434
+
435
+ exports.ExtensionConfig = ExtensionConfig;
436
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTlNUQUxMX1RZUEVfTlBNIiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVTIiwiU2V0IiwiRXh0ZW5zaW9uQ29uZmlnIiwiZXh0ZW5zaW9uVHlwZSIsImNvbmZpZ0tleSIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJsb2ciLCJtYW5pZmVzdCIsIl9saXN0RGF0YUNhY2hlIiwiY29uc3RydWN0b3IiLCJnZXRFeHRlbnNpb25EYXRhIiwibWFuaWZlc3RQYXRoIiwiYXBwaXVtSG9tZSIsImdldFByb2JsZW1zIiwiZXh0TmFtZSIsImV4dE1hbmlmZXN0IiwiZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIiwiZ2V0Q29uZmlnUHJvYmxlbXMiLCJnZXRTY2hlbWFQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZ2VuZXJpY0NvbmZpZ1dhcm5pbmdzIiwiY29uZmlnV2FybmluZ3MiLCJCIiwiYWxsIiwiZ2V0R2VuZXJpY0NvbmZpZ1dhcm5pbmdzIiwiZ2V0Q29uZmlnV2FybmluZ3MiLCJnZXRWYWxpZGF0aW9uUmVzdWx0U3VtbWFyaWVzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJwcm9ibGVtcyIsImVudHJpZXMiLCJfIiwiaXNFbXB0eSIsInB1c2giLCJ1dGlsIiwicGx1cmFsaXplIiwibGVuZ3RoIiwicHJvYmxlbSIsImVyciIsIkpTT04iLCJzdHJpbmdpZnkiLCJ2YWwiLCJ3YXJuaW5nU3VtbWFyaWVzIiwid2FybmluZ3MiLCJleHRUeXBlVGV4dCIsImNhcGl0YWxpemUiLCJwcm9ibGVtRW51bWVyYXRpb25UZXh0Iiwid2FybmluZyIsIl92YWxpZGF0ZSIsImV4dHMiLCJ0b1BhaXJzIiwiZXJyb3JzIiwic2V0IiwiZXJyb3IiLCJzaXplIiwic3VtbWFyeSIsIndhcm4iLCJnZXRMaXN0RGF0YSIsIkNvbW1hbmRDbGFzcyIsImNvbW1hbmRDbGFzc2VzIiwiY21kIiwiY29uZmlnIiwianNvbiIsImxpc3REYXRhIiwibGlzdCIsInNob3dJbnN0YWxsZWQiLCJzaG93VXBkYXRlcyIsImFwcGl1bVZlcnNpb24iLCJpbnN0YWxsU3BlYyIsImluc3RhbGxUeXBlIiwicGtnTmFtZSIsImludmFsaWRGaWVsZHMiLCJpc1N0cmluZyIsImhhcyIsImludmFsaWRGaWVsZHNFbnVtZXJhdGlvblRleHQiLCJpbnZhbGlkRmllbGRzVGV4dCIsIm1hcCIsImZpZWxkIiwiam9pbiIsImNyZWF0ZVBlZXJXYXJuaW5nIiwicmVhc29uIiwiQVBQSVVNX1ZFUiIsInNhdGlzZmllcyIsImV4dExpc3REYXRhIiwiaW5zdGFsbGVkIiwidXBkYXRlVmVyc2lvbiIsInVwVG9EYXRlIiwic2NoZW1hIiwiYXJnU2NoZW1hUGF0aCIsImV4dERhdGFIYXNTY2hlbWEiLCJpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uIiwicmVhZEV4dGVuc2lvblNjaGVtYSIsIm1lc3NhZ2UiLCJBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TIiwiaXNQbGFpbk9iamVjdCIsInZlcnNpb24iLCJtYWluQ2xhc3MiLCJhZGRFeHRlbnNpb24iLCJ3cml0ZSIsInVwZGF0ZUV4dGVuc2lvbiIsInJlbW92ZUV4dGVuc2lvbiIsInByaW50IiwiYWN0aXZlTmFtZXMiLCJpbmZvIiwiZXh0ZW5zaW9uRGVzYyIsIkVycm9yIiwiZ2V0SW5zdGFsbFBhdGgiLCJwYXRoIiwicmVxdWlyZSIsInJlcVBhdGgiLCJyZXFSZXNvbHZlZCIsInJlc29sdmUiLCJSZWZlcmVuY2VFcnJvciIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUkVMT0FEX0VYVEVOU0lPTlMiLCJjYWNoZSIsImRlYnVnIiwiTWFpbkNsYXNzIiwiaXNJbnN0YWxsZWQiLCJpbmNsdWRlcyIsIk9iamVjdCIsImtleXMiLCJfcmVhZEV4dGVuc2lvblNjaGVtYSIsImV4dFR5cGUiLCJUeXBlRXJyb3IiLCJtb2R1bGVPYmplY3QiLCJzY2hlbWFQYXRoIiwicmVzb2x2ZUZyb20iLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsInJlZ2lzdGVyU2NoZW1hIiwiaXNPYmplY3QiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXh0ZW5zaW9uL2V4dGVuc2lvbi1jb25maWcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlc29sdmVGcm9tIGZyb20gJ3Jlc29sdmUtZnJvbSc7XG5pbXBvcnQge3NhdGlzZmllc30gZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7dXRpbH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7Y29tbWFuZENsYXNzZXN9IGZyb20gJy4uL2NsaS9leHRlbnNpb24nO1xuaW1wb3J0IHtBUFBJVU1fVkVSfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbixcbiAgcmVnaXN0ZXJTY2hlbWEsXG59IGZyb20gJy4uL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBJTlNUQUxMX1RZUEVfTlBNID0gJ25wbSc7XG5jb25zdCBJTlNUQUxMX1RZUEVfTE9DQUwgPSAnbG9jYWwnO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVEhVQiA9ICdnaXRodWInO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVCA9ICdnaXQnO1xuXG4vKiogQHR5cGUge1NldDxJbnN0YWxsVHlwZT59ICovXG5jb25zdCBJTlNUQUxMX1RZUEVTID0gbmV3IFNldChbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTSxcbl0pO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYWJzdHJhY3QuIEl0IHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuICpcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUgdGhlIGdlbmVyaWMgcGFyYW1ldGVyIHRvIGltcGxlbWVudC5cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqIEB0eXBlIHtFeHRUeXBlfSAqL1xuICBleHRlbnNpb25UeXBlO1xuXG4gIC8qKiBAdHlwZSB7YCR7RXh0VHlwZX1zYH0gKi9cbiAgY29uZmlnS2V5O1xuXG4gIC8qKiBAdHlwZSB7RXh0UmVjb3JkPEV4dFR5cGU+fSAqL1xuICBpbnN0YWxsZWRFeHRlbnNpb25zO1xuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtTG9nZ2VyfSAqL1xuICBsb2c7XG5cbiAgLyoqIEB0eXBlIHtNYW5pZmVzdH0gKi9cbiAgbWFuaWZlc3Q7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtFeHRlbnNpb25MaXN0RGF0YX1cbiAgICovXG4gIF9saXN0RGF0YUNhY2hlO1xuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB7RXh0VHlwZX0gZXh0ZW5zaW9uVHlwZSAtIFR5cGUgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7TWFuaWZlc3R9IG1hbmlmZXN0IC0gYE1hbmlmZXN0YCBpbnN0YW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZXh0ZW5zaW9uVHlwZSwgbWFuaWZlc3QpIHtcbiAgICB0aGlzLmV4dGVuc2lvblR5cGUgPSBleHRlbnNpb25UeXBlO1xuICAgIHRoaXMuY29uZmlnS2V5ID0gYCR7ZXh0ZW5zaW9uVHlwZX1zYDtcbiAgICB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMgPSBtYW5pZmVzdC5nZXRFeHRlbnNpb25EYXRhKGV4dGVuc2lvblR5cGUpO1xuICAgIHRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDtcbiAgfVxuXG4gIGdldCBtYW5pZmVzdFBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3QubWFuaWZlc3RQYXRoO1xuICB9XG5cbiAgZ2V0IGFwcGl1bUhvbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3QuYXBwaXVtSG9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlcnJvcnMgZm9yIGEgZ2l2ZW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHJldHVybnMge0V4dE1hbmlmZXN0UHJvYmxlbVtdfVxuICAgKi9cbiAgZ2V0UHJvYmxlbXMoZXh0TmFtZSwgZXh0TWFuaWZlc3QpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5nZXRHZW5lcmljQ29uZmlnUHJvYmxlbXMoZXh0TWFuaWZlc3QsIGV4dE5hbWUpLFxuICAgICAgLi4udGhpcy5nZXRDb25maWdQcm9ibGVtcyhleHRNYW5pZmVzdCwgZXh0TmFtZSksXG4gICAgICAuLi50aGlzLmdldFNjaGVtYVByb2JsZW1zKGV4dE1hbmlmZXN0LCBleHROYW1lKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHdhcm5pbmdzIGZvciBhIGdpdmVuIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSB7XG4gICAgY29uc3QgW2dlbmVyaWNDb25maWdXYXJuaW5ncywgY29uZmlnV2FybmluZ3NdID0gYXdhaXQgQi5hbGwoW1xuICAgICAgdGhpcy5nZXRHZW5lcmljQ29uZmlnV2FybmluZ3MoZXh0TWFuaWZlc3QsIGV4dE5hbWUpLFxuICAgICAgdGhpcy5nZXRDb25maWdXYXJuaW5ncyhleHRNYW5pZmVzdCwgZXh0TmFtZSksXG4gICAgXSk7XG5cbiAgICByZXR1cm4gWy4uLmdlbmVyaWNDb25maWdXYXJuaW5ncywgLi4uY29uZmlnV2FybmluZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGV4dGVuc2lvbi10eXBlLXNwZWNpZmljIGlzc3Vlcy4gVG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dE1hbmlmZXN0XG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMscmVxdWlyZS1hd2FpdFxuICBhc3luYyBnZXRDb25maWdXYXJuaW5ncyhleHRNYW5pZmVzdCwgZXh0TmFtZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge01hcDxFeHROYW1lPEV4dFR5cGU+LEV4dE1hbmlmZXN0UHJvYmxlbVtdPn0gW2Vycm9yTWFwXVxuICAgKiBAcGFyYW0ge01hcDxFeHROYW1lPEV4dFR5cGU+LHN0cmluZ1tdPn0gW3dhcm5pbmdNYXBdXG4gICAqL1xuICBnZXRWYWxpZGF0aW9uUmVzdWx0U3VtbWFyaWVzKGVycm9yTWFwID0gbmV3IE1hcCgpLCB3YXJuaW5nTWFwID0gbmV3IE1hcCgpKSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgY29tcHV0ZWQgc3RyaW5nc1xuICAgICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICAgKi9cbiAgICBjb25zdCBlcnJvclN1bW1hcmllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIHByb2JsZW1zXSBvZiBlcnJvck1hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChfLmlzRW1wdHkocHJvYmxlbXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRoaXMgZXh0ZW5zaW9uIGZyb20gdGhlIGxpc3Qgc2luY2UgaXQncyBub3QgdmFsaWRcbiAgICAgIGVycm9yU3VtbWFyaWVzLnB1c2goXG4gICAgICAgIGAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gXCIke2V4dE5hbWV9XCIgaGFkICR7dXRpbC5wbHVyYWxpemUoXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICBwcm9ibGVtcy5sZW5ndGhcbiAgICAgICAgKX0gYW5kIHdpbGwgbm90IGJlIGF2YWlsYWJsZTpgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHByb2JsZW1zKSB7XG4gICAgICAgIGVycm9yU3VtbWFyaWVzLnB1c2goXG4gICAgICAgICAgYCAgLSAke3Byb2JsZW0uZXJyfSAoQWN0dWFsIHZhbHVlOiBgICsgYCR7SlNPTi5zdHJpbmdpZnkocHJvYmxlbS52YWwpfSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3Qgd2FybmluZ1N1bW1hcmllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIHdhcm5pbmdzXSBvZiB3YXJuaW5nTWFwLmVudHJpZXMoKSkge1xuICAgICAgaWYgKF8uaXNFbXB0eSh3YXJuaW5ncykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRUeXBlVGV4dCA9IF8uY2FwaXRhbGl6ZSh0aGlzLmV4dGVuc2lvblR5cGUpO1xuICAgICAgY29uc3QgcHJvYmxlbUVudW1lcmF0aW9uVGV4dCA9IHV0aWwucGx1cmFsaXplKCdwb3RlbnRpYWwgcHJvYmxlbScsIHdhcm5pbmdzLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICB3YXJuaW5nU3VtbWFyaWVzLnB1c2goYCR7ZXh0VHlwZVRleHR9IFwiJHtleHROYW1lfVwiIGhhcyAke3Byb2JsZW1FbnVtZXJhdGlvblRleHR9OiBgKTtcbiAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiB3YXJuaW5ncykge1xuICAgICAgICB3YXJuaW5nU3VtbWFyaWVzLnB1c2goYCAgLSAke3dhcm5pbmd9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtlcnJvclN1bW1hcmllcywgd2FybmluZ1N1bW1hcmllc307XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGV4dGVuc2lvbnMgZm9yIHByb2JsZW1zLiAgVG8gYmUgY2FsbGVkIGJ5IHN1YmNsYXNzZXMnIGB2YWxpZGF0ZWAgbWV0aG9kLlxuICAgKlxuICAgKiBFcnJvcnMgYW5kIHdhcm5pbmdzIHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBleHRzYC5cbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0ge0V4dFJlY29yZDxFeHRUeXBlPn0gZXh0cyAtIExvb2t1cCBvZiBleHRlbnNpb24gbmFtZXMgdG8ge0BsaW5rY29kZSBFeHRNYW5pZmVzdH0gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxFeHRSZWNvcmQ8RXh0VHlwZT4+fSBUaGUgc2FtZSBsb29rdXAsIGJ1dCBwaWNraW5nIG9ubHkgZXJyb3ItZnJlZSBleHRlbnNpb25zXG4gICAqL1xuICBhc3luYyBfdmFsaWRhdGUoZXh0cykge1xuICAgIC8qKlxuICAgICAqIExvb2t1cCBvZiBleHRlbnNpb24gbmFtZXMgdG8ge0BsaW5rY29kZSBFeHRNYW5pZmVzdFByb2JsZW0gRXh0TWFuaWZlc3RQcm9ibGVtc31cbiAgICAgKiBAdHlwZSB7TWFwPEV4dE5hbWU8RXh0VHlwZT4sRXh0TWFuaWZlc3RQcm9ibGVtW10+fVxuICAgICAqL1xuICAgIGNvbnN0IGVycm9yTWFwID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIExvb2t1cCBvZiBleHRlbnNpb24gbmFtZXMgdG8gd2FybmluZ3MuXG4gICAgICogQHR5cGUge01hcDxFeHROYW1lPEV4dFR5cGU+LHN0cmluZ1tdPn1cbiAgICAgKi9cbiAgICBjb25zdCB3YXJuaW5nTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgZm9yIChjb25zdCBbZXh0TmFtZSwgZXh0TWFuaWZlc3RdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgY29uc3QgW2Vycm9ycywgd2FybmluZ3NdID0gYXdhaXQgQi5hbGwoW1xuICAgICAgICB0aGlzLmdldFByb2JsZW1zKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgICAgdGhpcy5nZXRXYXJuaW5ncyhleHROYW1lLCBleHRNYW5pZmVzdCksXG4gICAgICBdKTtcbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGRlbGV0ZSBleHRzW2V4dE5hbWVdO1xuICAgICAgfVxuICAgICAgZXJyb3JNYXAuc2V0KGV4dE5hbWUsIGVycm9ycyk7XG4gICAgICB3YXJuaW5nTWFwLnNldChleHROYW1lLCB3YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgY29uc3Qge2Vycm9yU3VtbWFyaWVzLCB3YXJuaW5nU3VtbWFyaWVzfSA9IHRoaXMuZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyhcbiAgICAgIGVycm9yTWFwLFxuICAgICAgd2FybmluZ01hcFxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlcnJvclN1bW1hcmllcykpIHtcbiAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgYEFwcGl1bSBlbmNvdW50ZXJlZCAke3V0aWwucGx1cmFsaXplKCdlcnJvcicsIGVycm9yTWFwLnNpemUsIHRydWUpfSB3aGlsZSB2YWxpZGF0aW5nICR7XG4gICAgICAgICAgdGhpcy5jb25maWdLZXlcbiAgICAgICAgfSBmb3VuZCBpbiBtYW5pZmVzdCAke3RoaXMubWFuaWZlc3RQYXRofWBcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgZXJyb3JTdW1tYXJpZXMpIHtcbiAgICAgICAgbG9nLmVycm9yKHN1bW1hcnkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IGRpc3BsYXkgd2FybmluZ3MgaWYgdGhlcmUgYXJlIG5vIGVycm9ycyFcblxuICAgICAgaWYgKCFfLmlzRW1wdHkod2FybmluZ1N1bW1hcmllcykpIHtcbiAgICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgYEFwcGl1bSBlbmNvdW50ZXJlZCAke3V0aWwucGx1cmFsaXplKFxuICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgd2FybmluZ01hcC5zaXplLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICl9IHdoaWxlIHZhbGlkYXRpbmcgJHt0aGlzLmNvbmZpZ0tleX0gZm91bmQgaW4gbWFuaWZlc3QgJHt0aGlzLm1hbmlmZXN0UGF0aH1gXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3Qgc3VtbWFyeSBvZiB3YXJuaW5nU3VtbWFyaWVzKSB7XG4gICAgICAgICAgbG9nLndhcm4oc3VtbWFyeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4dHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGxpc3RpbmcgZGF0YSBmb3IgZXh0ZW5zaW9ucyB2aWEgY29tbWFuZCBjbGFzcy5cbiAgICogQ2FjaGVzIHRoZSByZXN1bHQgaW4ge0BsaW5rY29kZSBFeHRlbnNpb25Db25maWcuX2xpc3REYXRhQ2FjaGV9XG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJldHVybnMge1Byb21pc2U8RXh0ZW5zaW9uTGlzdERhdGE+fVxuICAgKi9cbiAgYXN5bmMgZ2V0TGlzdERhdGEoKSB7XG4gICAgaWYgKHRoaXMuX2xpc3REYXRhQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0RGF0YUNhY2hlO1xuICAgIH1cbiAgICBjb25zdCBDb21tYW5kQ2xhc3MgPSAvKiogQHR5cGUge0V4dENvbW1hbmQ8RXh0VHlwZT59ICovIChjb21tYW5kQ2xhc3Nlc1t0aGlzLmV4dGVuc2lvblR5cGVdKTtcbiAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZENsYXNzKHtjb25maWc6IHRoaXMsIGpzb246IHRydWV9KTtcbiAgICBjb25zdCBsaXN0RGF0YSA9IGF3YWl0IGNtZC5saXN0KHtzaG93SW5zdGFsbGVkOiB0cnVlLCBzaG93VXBkYXRlczogdHJ1ZX0pO1xuICAgIHRoaXMuX2xpc3REYXRhQ2FjaGUgPSBsaXN0RGF0YTtcbiAgICByZXR1cm4gbGlzdERhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2Ygd2FybmluZ3MgZm9yIGEgcGFydGljdWxhciBleHRlbnNpb24uXG4gICAqXG4gICAqIEJ5IGRlZmluaXRpb24sIGEgbm9uLWVtcHR5IGxpc3Qgb2Ygd2FybmluZ3MgZG9lcyBfbm90XyBpbXBseSB0aGUgZXh0ZW5zaW9uIGNhbm5vdCBiZSBsb2FkZWQsXG4gICAqIGJ1dCBpdCBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQgb3Igb3RoZXJ3aXNlIHRocm93IGFuIGV4Y2VwdGlvbiBhdCBydW50aW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHRNYW5pZmVzdFxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0R2VuZXJpY0NvbmZpZ1dhcm5pbmdzKGV4dE1hbmlmZXN0LCBleHROYW1lKSB7XG4gICAgY29uc3Qge2FwcGl1bVZlcnNpb24sIGluc3RhbGxTcGVjLCBpbnN0YWxsVHlwZSwgcGtnTmFtZX0gPSBleHRNYW5pZmVzdDtcbiAgICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuXG4gICAgY29uc3QgaW52YWxpZEZpZWxkcyA9IFtdO1xuICAgIGlmICghXy5pc1N0cmluZyhpbnN0YWxsU3BlYykpIHtcbiAgICAgIGludmFsaWRGaWVsZHMucHVzaCgnaW5zdGFsbFNwZWMnKTtcbiAgICB9XG5cbiAgICBpZiAoIUlOU1RBTExfVFlQRVMuaGFzKGluc3RhbGxUeXBlKSkge1xuICAgICAgaW52YWxpZEZpZWxkcy5wdXNoKCdpbnN0YWxsVHlwZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFR5cGVUZXh0ID0gXy5jYXBpdGFsaXplKHRoaXMuZXh0ZW5zaW9uVHlwZSk7XG5cbiAgICBpZiAoaW52YWxpZEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRGaWVsZHNFbnVtZXJhdGlvblRleHQgPSB1dGlsLnBsdXJhbGl6ZShcbiAgICAgICAgJ2ludmFsaWQgb3IgbWlzc2luZyBmaWVsZCcsXG4gICAgICAgIGludmFsaWRGaWVsZHMubGVuZ3RoLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgY29uc3QgaW52YWxpZEZpZWxkc1RleHQgPSBpbnZhbGlkRmllbGRzLm1hcCgoZmllbGQpID0+IGBcIiR7ZmllbGR9XCJgKS5qb2luKCcsICcpO1xuXG4gICAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgICBgJHtleHRUeXBlVGV4dH0gXCIke2V4dE5hbWV9XCIgKHBhY2thZ2UgXFxgJHtwa2dOYW1lfVxcYCkgaGFzICR7aW52YWxpZEZpZWxkc0VudW1lcmF0aW9uVGV4dH0gKCR7aW52YWxpZEZpZWxkc1RleHR9KSBpbiBcXGBleHRlbnNpb25zLnlhbWxcXGA7IHRoaXMgbWF5IGNhdXNlIHVwZ3JhZGVzIGRvbmUgdmlhIHRoZSBcXGBhcHBpdW1cXGAgQ0xJIHRvb2wgdG8gZmFpbC4gUGxlYXNlIHJlaW5zdGFsbCB3aXRoIFxcYGFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gdW5pbnN0YWxsICR7ZXh0TmFtZX1cXGAgYW5kIFxcYGFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gaW5zdGFsbCAke2V4dE5hbWV9XFxgIHRvIGF0dGVtcHQgYSBmaXguYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwcyBjb25jYXRlbmF0ZSB3YXJuaW5nIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gcGVlciBkZXBlbmRlbmNpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uXG4gICAgICogQHJldHVybnMgc3RyaW5nXG4gICAgICovXG4gICAgY29uc3QgY3JlYXRlUGVlcldhcm5pbmcgPSAocmVhc29uKSA9PlxuICAgICAgYCR7ZXh0VHlwZVRleHR9IFwiJHtleHROYW1lfVwiIChwYWNrYWdlIFxcYCR7cGtnTmFtZX1cXGApIG1heSBiZSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEFwcGl1bSAodiR7QVBQSVVNX1ZFUn0pIGR1ZSB0byAke3JlYXNvbn1gO1xuXG4gICAgaWYgKF8uaXNTdHJpbmcoYXBwaXVtVmVyc2lvbikgJiYgIXNhdGlzZmllcyhBUFBJVU1fVkVSLCBhcHBpdW1WZXJzaW9uKSkge1xuICAgICAgY29uc3QgbGlzdERhdGEgPSBhd2FpdCB0aGlzLmdldExpc3REYXRhKCk7XG4gICAgICBjb25zdCBleHRMaXN0RGF0YSA9IC8qKiBAdHlwZSB7SW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9ICovIChsaXN0RGF0YVtleHROYW1lXSk7XG4gICAgICBpZiAoZXh0TGlzdERhdGE/Lmluc3RhbGxlZCkge1xuICAgICAgICBjb25zdCB7dXBkYXRlVmVyc2lvbiwgdXBUb0RhdGV9ID0gZXh0TGlzdERhdGE7XG4gICAgICAgIGlmICghdXBUb0RhdGUpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgICAgICAgY3JlYXRlUGVlcldhcm5pbmcoXG4gICAgICAgICAgICAgIGBpdHMgcGVlciBkZXBlbmRlbmN5IG9uIG9sZGVyIEFwcGl1bSB2JHthcHBpdW1WZXJzaW9ufS4gUGxlYXNlIHVwZ3JhZGUgXFxgJHtwa2dOYW1lfVxcYCB0byB2JHt1cGRhdGVWZXJzaW9ufSBvciBuZXdlci5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgICAgICAgY3JlYXRlUGVlcldhcm5pbmcoXG4gICAgICAgICAgICAgIGBpdHMgcGVlciBkZXBlbmRlbmN5IG9uIG9sZGVyIEFwcGl1bSB2JHthcHBpdW1WZXJzaW9ufS4gUGxlYXNlIGFzayB0aGUgZGV2ZWxvcGVyIG9mIFxcYCR7cGtnTmFtZX1cXGAgdG8gdXBkYXRlIHRoZSBwZWVyIGRlcGVuZGVuY3kgb24gQXBwaXVtIHRvIHYke0FQUElVTV9WRVJ9LmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghXy5pc1N0cmluZyhhcHBpdW1WZXJzaW9uKSkge1xuICAgICAgY29uc3QgbGlzdERhdGEgPSBhd2FpdCB0aGlzLmdldExpc3REYXRhKCk7XG4gICAgICBjb25zdCBleHRMaXN0RGF0YSA9IC8qKiBAdHlwZSB7SW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9ICovIChsaXN0RGF0YVtleHROYW1lXSk7XG4gICAgICBpZiAoIWV4dExpc3REYXRhPy51cFRvRGF0ZSAmJiBleHRMaXN0RGF0YT8udXBkYXRlVmVyc2lvbikge1xuICAgICAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgICAgIGNyZWF0ZVBlZXJXYXJuaW5nKFxuICAgICAgICAgICAgYGFuIGludmFsaWQgb3IgbWlzc2luZyBwZWVyIGRlcGVuZGVuY3kgb24gQXBwaXVtLiBBIG5ld2VyIHZlcnNpb24gb2YgXFxgJHtwa2dOYW1lfVxcYCBpcyBhdmFpbGFibGU7IHBsZWFzZSBhdHRlbXB0IHRvIHVwZ3JhZGUgXCIke2V4dE5hbWV9XCIgdG8gdiR7ZXh0TGlzdERhdGEudXBkYXRlVmVyc2lvbn0gb3IgbmV3ZXIuYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICAgICAgY3JlYXRlUGVlcldhcm5pbmcoXG4gICAgICAgICAgICBgYW4gaW52YWxpZCBvciBtaXNzaW5nIHBlZXIgZGVwZW5kZW5jeSBvbiBBcHBpdW0uIFBsZWFzZSBhc2sgdGhlIGRldmVsb3BlciBvZiBcXGAke3BrZ05hbWV9XFxgIHRvIGFkZCBhIHBlZXIgZGVwZW5kZW5jeSBvbiBcXGBeYXBwaXVtQCR7QVBQSVVNX1ZFUn1cXGAuYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHdhcm5pbmdzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGxpc3Qgb2YgdW5yZWNvdmVyYWJsZSBlcnJvcnMgKGlmIGFueSkgZm9yIHRoZSBnaXZlbiBleHRlbnNpb24gX2lmXyBpdCBoYXMgYSBgc2NoZW1hYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3QgLSBFeHRlbnNpb24gZGF0YSAoZnJvbSBtYW5pZmVzdClcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWUgKGZyb20gbWFuaWZlc3QpXG4gICAqIEByZXR1cm5zIHtFeHRNYW5pZmVzdFByb2JsZW1bXX1cbiAgICovXG4gIGdldFNjaGVtYVByb2JsZW1zKGV4dE1hbmlmZXN0LCBleHROYW1lKSB7XG4gICAgLyoqIEB0eXBlIHtFeHRNYW5pZmVzdFByb2JsZW1bXX0gKi9cbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuICAgIGNvbnN0IHtzY2hlbWE6IGFyZ1NjaGVtYVBhdGh9ID0gZXh0TWFuaWZlc3Q7XG4gICAgaWYgKEV4dGVuc2lvbkNvbmZpZy5leHREYXRhSGFzU2NoZW1hKGV4dE1hbmlmZXN0KSkge1xuICAgICAgaWYgKF8uaXNTdHJpbmcoYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgICAgaWYgKGlzQWxsb3dlZFNjaGVtYUZpbGVFeHRlbnNpb24oYXJnU2NoZW1hUGF0aCkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5yZWFkRXh0ZW5zaW9uU2NoZW1hKGV4dE5hbWUsIGV4dE1hbmlmZXN0KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgICBlcnI6IGBVbmFibGUgdG8gcmVnaXN0ZXIgc2NoZW1hIGF0IHBhdGggJHthcmdTY2hlbWFQYXRofTsgJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgICBlcnI6IGBTY2hlbWEgZmlsZSBoYXMgdW5zdXBwb3J0ZWQgZXh0ZW5zaW9uLiBBbGxvd2VkOiAke1tcbiAgICAgICAgICAgICAgLi4uQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHRNYW5pZmVzdCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgZXJyOiBgVW5hYmxlIHRvIHJlZ2lzdGVyIGVtYmVkZGVkIHNjaGVtYTsgJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgICBlcnI6ICdJbmNvcnJlY3RseSBmb3JtYXR0ZWQgc2NoZW1hIGZpZWxkOyBtdXN0IGJlIGEgcGF0aCB0byBhIHNjaGVtYSBmaWxlIG9yIGEgc2NoZW1hIG9iamVjdC4nLFxuICAgICAgICAgIHZhbDogYXJnU2NoZW1hUGF0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBsaXN0IG9mIGdlbmVyaWMgdW5yZWNvdmVyYWJsZSBlcnJvcnMgZm9yIHRoZSBnaXZlbiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3QgLSBFeHRlbnNpb24gZGF0YSAoZnJvbSBtYW5pZmVzdClcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWUgKGZyb20gbWFuaWZlc3QpXG4gICAqIEByZXR1cm5zIHtFeHRNYW5pZmVzdFByb2JsZW1bXX1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBnZXRHZW5lcmljQ29uZmlnUHJvYmxlbXMoZXh0TWFuaWZlc3QsIGV4dE5hbWUpIHtcbiAgICBjb25zdCB7dmVyc2lvbiwgcGtnTmFtZSwgbWFpbkNsYXNzfSA9IGV4dE1hbmlmZXN0O1xuICAgIGNvbnN0IHByb2JsZW1zID0gW107XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcodmVyc2lvbikpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBlcnI6IGBJbnZhbGlkIG9yIG1pc3NpbmcgXFxgdmVyc2lvblxcYCBmaWVsZCBpbiBteSBcXGBwYWNrYWdlLmpzb25cXGAgYW5kL29yIFxcYGV4dGVuc2lvbnMueWFtbFxcYCAobXVzdCBiZSBhIHN0cmluZylgLFxuICAgICAgICB2YWw6IHZlcnNpb24sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGtnTmFtZSkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBlcnI6IGBJbnZhbGlkIG9yIG1pc3NpbmcgXFxgbmFtZVxcYCBmaWVsZCBpbiBteSBcXGBwYWNrYWdlLmpzb25cXGAgYW5kL29yIFxcYGV4dGVuc2lvbnMueWFtbFxcYCAobXVzdCBiZSBhIHN0cmluZylgLFxuICAgICAgICB2YWw6IHBrZ05hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcobWFpbkNsYXNzKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgIGVycjogYEludmFsaWQgb3IgbWlzc2luZyBcXGBhcHBpdW0ubWFpbkNsYXNzXFxgIGZpZWxkIGluIG15IFxcYHBhY2thZ2UuanNvblxcYCBhbmQvb3IgXFxgbWFpbkNsYXNzXFxgIGZpZWxkIGluIFxcYGV4dGVuc2lvbnMueWFtbFxcYCAobXVzdCBiZSBhIHN0cmluZylgLFxuICAgICAgICB2YWw6IG1haW5DbGFzcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtFeHRNYW5pZmVzdFByb2JsZW1bXX1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBnZXRDb25maWdQcm9ibGVtcyhleHRNYW5pZmVzdCwgZXh0TmFtZSkge1xuICAgIC8vIHNob3VkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHNwZWNpYWwgdmFsaWRhdGlvbiBpcyBuZWNlc3NhcnkgZm9yIHRoaXMgZXh0ZW5zaW9uIHR5cGVcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db25maWdNdXRhdGlvbk9wdHN9IFtvcHRzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFkZEV4dGVuc2lvbihleHROYW1lLCBleHRNYW5pZmVzdCwge3dyaXRlID0gdHJ1ZX0gPSB7fSkge1xuICAgIHRoaXMubWFuaWZlc3QuYWRkRXh0ZW5zaW9uKHRoaXMuZXh0ZW5zaW9uVHlwZSwgZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPnxpbXBvcnQoJy4uL2NsaS9leHRlbnNpb24tY29tbWFuZCcpLkV4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gZXh0TWFuaWZlc3RcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db25maWdNdXRhdGlvbk9wdHN9IFtvcHRzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUV4dGVuc2lvbihleHROYW1lLCBleHRNYW5pZmVzdCwge3dyaXRlID0gdHJ1ZX0gPSB7fSkge1xuICAgIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXSA9IHtcbiAgICAgIC4uLnRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXSxcbiAgICAgIC4uLmV4dE1hbmlmZXN0LFxuICAgIH07XG4gICAgaWYgKHdyaXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hbmlmZXN0LndyaXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBleHRlbnNpb24gZnJvbSB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9ucywgYW5kIG9wdGlvbmFsbHkgYXZvaWQgYSB3cml0ZSB0byB0aGUgbWFuaWZlc3QgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZW1vdmVFeHRlbnNpb24oZXh0TmFtZSwge3dyaXRlID0gdHJ1ZX0gPSB7fSkge1xuICAgIGRlbGV0ZSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgaWYgKHdyaXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hbmlmZXN0LndyaXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPltdfSBbYWN0aXZlTmFtZXNdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHByaW50KGFjdGl2ZU5hbWVzKSB7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnMpKSB7XG4gICAgICBsb2cuaW5mbyhcbiAgICAgICAgYE5vICR7dGhpcy5jb25maWdLZXl9IGhhdmUgYmVlbiBpbnN0YWxsZWQgaW4gJHt0aGlzLmFwcGl1bUhvbWV9LiBVc2UgdGhlIFwiYXBwaXVtICR7dGhpcy5leHRlbnNpb25UeXBlfVwiIGAgK1xuICAgICAgICAgICdjb21tYW5kIHRvIGluc3RhbGwgdGhlIG9uZShzKSB5b3Ugd2FudCB0byB1c2UuJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2cuaW5mbyhgQXZhaWxhYmxlICR7dGhpcy5jb25maWdLZXl9OmApO1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIGV4dE1hbmlmZXN0XSBvZiAvKiogQHR5cGUge1tzdHJpbmcsIEV4dE1hbmlmZXN0PEV4dFR5cGU+XVtdfSAqLyAoXG4gICAgICBfLnRvUGFpcnModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKVxuICAgICkpIHtcbiAgICAgIGxvZy5pbmZvKGAgIC0gJHt0aGlzLmV4dGVuc2lvbkRlc2MoZXh0TmFtZSwgZXh0TWFuaWZlc3QpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGV4dGVuc2lvbi4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudC5cbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0TWFuaWZlc3QgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBleHRlbnNpb25EZXNjKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBzdWJjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRJbnN0YWxsUGF0aChleHROYW1lKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmFwcGl1bUhvbWUsICdub2RlX21vZHVsZXMnLCB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV0ucGtnTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgZXh0ZW5zaW9uIGFuZCByZXR1cm5zIGl0cyBtYWluIGNsYXNzIChjb25zdHJ1Y3RvcilcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtFeHRDbGFzczxFeHRUeXBlPn1cbiAgICovXG4gIHJlcXVpcmUoZXh0TmFtZSkge1xuICAgIGNvbnN0IHttYWluQ2xhc3N9ID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIGNvbnN0IHJlcVBhdGggPSB0aGlzLmdldEluc3RhbGxQYXRoKGV4dE5hbWUpO1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIGxldCByZXFSZXNvbHZlZDtcbiAgICB0cnkge1xuICAgICAgcmVxUmVzb2x2ZWQgPSByZXF1aXJlLnJlc29sdmUocmVxUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgJHt0aGlzLmV4dGVuc2lvblR5cGV9IGluc3RhbGxlZCBhdCAke3JlcVBhdGh9YCk7XG4gICAgfVxuICAgIC8vIG5vdGU6IHRoaXMgd2lsbCBvbmx5IHJlbG9hZCB0aGUgZW50cnkgcG9pbnRcbiAgICBpZiAocHJvY2Vzcy5lbnYuQVBQSVVNX1JFTE9BRF9FWFRFTlNJT05TICYmIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdKSB7XG4gICAgICBsb2cuZGVidWcoYFJlbW92aW5nICR7cmVxUmVzb2x2ZWR9IGZyb20gcmVxdWlyZSBjYWNoZWApO1xuICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFJlcXVpcmluZyAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gYXQgJHtyZXFQYXRofWApO1xuICAgIGNvbnN0IE1haW5DbGFzcyA9IHJlcXVpcmUocmVxUGF0aClbbWFpbkNsYXNzXTtcbiAgICBpZiAoIU1haW5DbGFzcykge1xuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGZpbmQgYSBjbGFzcyBuYW1lZCBcIiR7bWFpbkNsYXNzfVwiIGV4cG9ydGVkIGJ5ICR7dGhpcy5leHRlbnNpb25UeXBlfSBcIiR7ZXh0TmFtZX1cImBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBNYWluQ2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0luc3RhbGxlZChleHROYW1lKSB7XG4gICAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXModGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSwgZXh0TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZW5kZWQgdG8gYmUgY2FsbGVkIGJ5IGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UgbWV0aG9kcyBvZiBzdWJjbGFzcy5cbiAgICogQHByaXZhdGVcbiAgICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lXG4gICAqIEBwYXJhbSB7RXh0VHlwZX0gZXh0VHlwZVxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZSAodW5pcXVlIHRvIGl0cyB0eXBlKVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0V2l0aFNjaGVtYTxFeHRUeXBlPn0gZXh0TWFuaWZlc3QgLSBFeHRlbnNpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgX3JlYWRFeHRlbnNpb25TY2hlbWEoYXBwaXVtSG9tZSwgZXh0VHlwZSwgZXh0TmFtZSwgZXh0TWFuaWZlc3QpIHtcbiAgICBjb25zdCB7cGtnTmFtZSwgc2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dE1hbmlmZXN0O1xuICAgIGlmICghYXJnU2NoZW1hUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYE5vIFxcYHNjaGVtYVxcYCBwcm9wZXJ0eSBmb3VuZCBpbiBjb25maWcgZm9yICR7ZXh0VHlwZX0gJHtwa2dOYW1lfSAtLSB3aHkgaXMgdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQ/YFxuICAgICAgKTtcbiAgICB9XG4gICAgbGV0IG1vZHVsZU9iamVjdDtcbiAgICBpZiAoXy5pc1N0cmluZyhhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9IHJlc29sdmVGcm9tKGFwcGl1bUhvbWUsIHBhdGguam9pbihwa2dOYW1lLCBhcmdTY2hlbWFQYXRoKSk7XG4gICAgICBtb2R1bGVPYmplY3QgPSByZXF1aXJlKHNjaGVtYVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2R1bGVPYmplY3QgPSBhcmdTY2hlbWFQYXRoO1xuICAgIH1cbiAgICAvLyB0aGlzIHN1Y2tzLiBkZWZhdWx0IGV4cG9ydHMgc2hvdWxkIGJlIGRlc3Ryb3llZFxuICAgIGNvbnN0IHNjaGVtYSA9IG1vZHVsZU9iamVjdC5fX2VzTW9kdWxlID8gbW9kdWxlT2JqZWN0LmRlZmF1bHQgOiBtb2R1bGVPYmplY3Q7XG4gICAgcmVnaXN0ZXJTY2hlbWEoZXh0VHlwZSwgZXh0TmFtZSwgc2NoZW1hKTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGEgc3BlY2lmaWMge0BsaW5rIEV4dE1hbmlmZXN0fSBvYmplY3QgaGFzIGEgYHNjaGVtYWAgcHJvcC5cbiAgICogVGhlIHtAbGluayBFeHRNYW5pZmVzdH0gb2JqZWN0IGJlY29tZXMgYSB7QGxpbmsgRXh0TWFuaWZlc3RXaXRoU2NoZW1hfSBvYmplY3QuXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHRNYW5pZmVzdFxuICAgKiBAcmV0dXJucyB7ZXh0TWFuaWZlc3QgaXMgRXh0TWFuaWZlc3RXaXRoU2NoZW1hPEV4dFR5cGU+fVxuICAgKi9cbiAgc3RhdGljIGV4dERhdGFIYXNTY2hlbWEoZXh0TWFuaWZlc3QpIHtcbiAgICByZXR1cm4gXy5pc1N0cmluZyhleHRNYW5pZmVzdD8uc2NoZW1hKSB8fCBfLmlzT2JqZWN0KGV4dE1hbmlmZXN0Py5zY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGFuIGV4dGVuc2lvbiBwcm92aWRlcyBhIHNjaGVtYSwgdGhpcyB3aWxsIGxvYWQgdGhlIHNjaGVtYSBhbmQgYXR0ZW1wdCB0b1xuICAgKiByZWdpc3RlciBpdCB3aXRoIHRoZSBzY2hlbWEgcmVnaXN0cmFyLlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWUgLSBOYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0V2l0aFNjaGVtYTxFeHRUeXBlPn0gZXh0TWFuaWZlc3QgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R8dW5kZWZpbmVkfVxuICAgKi9cbiAgcmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHRNYW5pZmVzdCkge1xuICAgIHJldHVybiBFeHRlbnNpb25Db25maWcuX3JlYWRFeHRlbnNpb25TY2hlbWEoXG4gICAgICB0aGlzLmFwcGl1bUhvbWUsXG4gICAgICB0aGlzLmV4dGVuc2lvblR5cGUsXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0TWFuaWZlc3RcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7SU5TVEFMTF9UWVBFX05QTSwgSU5TVEFMTF9UWVBFX0dJVCwgSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfR0lUSFVCLCBJTlNUQUxMX1RZUEVTfTtcblxuLyoqXG4gKiBBbiBpc3N1ZSB3aXRoIHRoZSB7QGxpbmtjb2RlIEV4dE1hbmlmZXN0fSBmb3IgYSBwYXJ0aWN1bGFyIGV4dGVuc2lvbi5cbiAqXG4gKiBUaGUgZXhpc3RhbmNlIG9mIHN1Y2ggYW4gb2JqZWN0IGltcGxpZXMgdGhhdCB0aGUgZXh0ZW5zaW9uIGNhbm5vdCBiZSBsb2FkZWQuXG4gKiBAdHlwZWRlZiBFeHRNYW5pZmVzdFByb2JsZW1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlcnIgLSBFcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge2FueX0gdmFsIC0gQXNzb2NpYXRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogQW4gb3B0aW9uYWwgbG9nZ2luZyBmdW5jdGlvbiBwcm92aWRlZCB0byBhbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfSBzdWJjbGFzcy5cbiAqIEBjYWxsYmFjayBFeHRlbnNpb25Mb2dGblxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4vbWFuaWZlc3QnKS5NYW5pZmVzdH0gTWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRNYW5pZmVzdDxUPn0gRXh0TWFuaWZlc3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRNYW5pZmVzdFdpdGhTY2hlbWE8VD59IEV4dE1hbmlmZXN0V2l0aFNjaGVtYVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE5hbWU8VD59IEV4dE5hbWVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRDbGFzczxUPn0gRXh0Q2xhc3NcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRSZWNvcmQ8VD59IEV4dFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2NsaS9leHRlbnNpb24nKS5FeHRDb21tYW5kPFQ+fSBFeHRDb21tYW5kXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB2YXJpb3VzIG1ldGhvZHMgaW4ge0BsaW5rIEV4dGVuc2lvbkNvbmZpZ31cbiAqIEB0eXBlZGVmIEV4dGVuc2lvbkNvbmZpZ011dGF0aW9uT3B0c1xuICogQHByb3BlcnR5IHtib29sZWFufSBbd3JpdGU9dHJ1ZV0gV2hldGhlciBvciBub3QgdG8gd3JpdGUgdGhlIG1hbmlmZXN0IHRvIGRpc2sgYWZ0ZXIgYSBtdXRhdGlvbiBvcGVyYXRpb25cbiAqL1xuXG4vKipcbiAqIEEgdmFsaWQgaW5zdGFsbCB0eXBlXG4gKiBAdHlwZWRlZiB7dHlwZW9mIElOU1RBTExfVFlQRV9OUE0gfCB0eXBlb2YgSU5TVEFMTF9UWVBFX0dJVCB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfTE9DQUwgfCB0eXBlb2YgSU5TVEFMTF9UWVBFX0dJVEhVQn0gSW5zdGFsbFR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2NsaS9leHRlbnNpb24tY29tbWFuZCcpLkV4dGVuc2lvbkxpc3REYXRhfSBFeHRlbnNpb25MaXN0RGF0YVxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vY2xpL2V4dGVuc2lvbi1jb21tYW5kJykuSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQSxNQUFNQSxnQkFBZ0IsR0FBRyxLQUF6Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxPQUEzQjs7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxRQUE1Qjs7QUFDQSxNQUFN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
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Loads extensions and creates `ExtensionConfig` instances.
3
+ *
4
+ * - Reads the manifest file, creating if necessary
5
+ * - Using the parsed extension data, creates/gets the `ExtensionConfig` subclass instances
6
+ * - Returns these instances
7
+ *
8
+ * If `appiumHome` is needed, use `resolveAppiumHome` from the `env` module in `@appium/support`.
9
+ * @param {string} appiumHome
10
+ * @returns {Promise<ExtensionConfigs>}
11
+ */
12
+ export function loadExtensions(appiumHome: string): Promise<ExtensionConfigs>;
13
+ /**
14
+ * Find any plugin name which has been installed, and which has been requested for activation by
15
+ * using the --use-plugins flag, and turn each one into its class, so we can send them as objects
16
+ * to the server init. We also want to send/assign them to the umbrella driver so it can use them
17
+ * to wrap command execution
18
+ *
19
+ * @param {import('./plugin-config').PluginConfig} pluginConfig - a plugin extension config
20
+ * @param {string[]} usePlugins
21
+ * @returns {PluginNameMap} Mapping of PluginClass to name
22
+ */
23
+ export function getActivePlugins(pluginConfig: import('./plugin-config').PluginConfig, usePlugins?: string[]): PluginNameMap;
24
+ /**
25
+ * Find any driver name which has been installed, and turn each one into its class, so we can send
26
+ * them as objects to the server init in case they need to add methods/routes or update the server.
27
+ * If the --drivers flag was given, this method only loads the given drivers.
28
+ *
29
+ * @param {import('./driver-config').DriverConfig} driverConfig - a driver extension config
30
+ * @param {string[]} [useDrivers] - optional list of drivers to load
31
+ * @returns {DriverNameMap}
32
+ */
33
+ export function getActiveDrivers(driverConfig: import('./driver-config').DriverConfig, useDrivers?: string[] | undefined): DriverNameMap;
34
+ /**
35
+ * A mapping of {@linkcode PluginClass } classes to their names.
36
+ */
37
+ export type PluginNameMap = Map<PluginClass, string>;
38
+ /**
39
+ * A mapping of {@linkcode DriverClass } classes to their names.
40
+ */
41
+ export type DriverNameMap = Map<DriverClass, string>;
42
+ export type PluginClass = import('@appium/types').PluginClass;
43
+ export type DriverClass = import('@appium/types').DriverClass;
44
+ export type ExtensionConfigs = {
45
+ driverConfig: import('./driver-config').DriverConfig;
46
+ pluginConfig: import('./plugin-config').PluginConfig;
47
+ };
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/extension/index.js"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,2CAHW,MAAM,GACJ,QAAQ,gBAAgB,CAAC,CAUrC;AAED;;;;;;;;;GASG;AACH,+CAJW,OAAO,iBAAiB,EAAE,YAAY,eACtC,MAAM,EAAE,iBA2BlB;AAED;;;;;;;;GAQG;AACH,+CAJW,OAAO,iBAAiB,EAAE,YAAY,oDAwBhD;;;;4BAIY,IAAI,WAAW,EAAC,MAAM,CAAC;;;;4BAKvB,IAAI,WAAW,EAAC,MAAM,CAAC;0BAIvB,OAAO,eAAe,EAAE,WAAW;0BACnC,OAAO,eAAe,EAAE,WAAW;;kBAKlC,OAAO,iBAAiB,EAAE,YAAY;kBACtC,OAAO,iBAAiB,EAAE,YAAY"}