appium 2.0.0-beta.45 → 2.0.0-beta.47

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 (138) hide show
  1. package/README.md +145 -44
  2. package/build/lib/appium.d.ts +3 -103
  3. package/build/lib/appium.d.ts.map +1 -1
  4. package/build/lib/appium.js +679 -549
  5. package/build/lib/appium.js.map +1 -1
  6. package/build/lib/cli/args.js +247 -127
  7. package/build/lib/cli/args.js.map +1 -1
  8. package/build/lib/cli/driver-command.js +63 -88
  9. package/build/lib/cli/driver-command.js.map +1 -1
  10. package/build/lib/cli/extension-command.d.ts +32 -23
  11. package/build/lib/cli/extension-command.d.ts.map +1 -1
  12. package/build/lib/cli/extension-command.js +730 -512
  13. package/build/lib/cli/extension-command.js.map +1 -1
  14. package/build/lib/cli/extension.d.ts +5 -4
  15. package/build/lib/cli/extension.d.ts.map +1 -1
  16. package/build/lib/cli/extension.js +68 -65
  17. package/build/lib/cli/extension.js.map +1 -1
  18. package/build/lib/cli/parser.d.ts +3 -3
  19. package/build/lib/cli/parser.d.ts.map +1 -1
  20. package/build/lib/cli/parser.js +234 -192
  21. package/build/lib/cli/parser.js.map +1 -1
  22. package/build/lib/cli/plugin-command.js +58 -87
  23. package/build/lib/cli/plugin-command.js.map +1 -1
  24. package/build/lib/cli/utils.js +66 -69
  25. package/build/lib/cli/utils.js.map +1 -1
  26. package/build/lib/config-file.d.ts.map +1 -1
  27. package/build/lib/config-file.js +189 -120
  28. package/build/lib/config-file.js.map +1 -1
  29. package/build/lib/config.d.ts.map +1 -1
  30. package/build/lib/config.js +254 -213
  31. package/build/lib/config.js.map +1 -1
  32. package/build/lib/constants.d.ts +5 -5
  33. package/build/lib/constants.d.ts.map +1 -1
  34. package/build/lib/constants.js +64 -59
  35. package/build/lib/constants.js.map +1 -1
  36. package/build/lib/extension/driver-config.js +199 -164
  37. package/build/lib/extension/driver-config.js.map +1 -1
  38. package/build/lib/extension/extension-config.d.ts +18 -16
  39. package/build/lib/extension/extension-config.d.ts.map +1 -1
  40. package/build/lib/extension/extension-config.js +523 -396
  41. package/build/lib/extension/extension-config.js.map +1 -1
  42. package/build/lib/extension/index.js +98 -68
  43. package/build/lib/extension/index.js.map +1 -1
  44. package/build/lib/extension/manifest-migrations.d.ts +27 -0
  45. package/build/lib/extension/manifest-migrations.d.ts.map +1 -0
  46. package/build/lib/extension/manifest-migrations.js +99 -0
  47. package/build/lib/extension/manifest-migrations.js.map +1 -0
  48. package/build/lib/extension/manifest.d.ts +7 -56
  49. package/build/lib/extension/manifest.d.ts.map +1 -1
  50. package/build/lib/extension/manifest.js +432 -240
  51. package/build/lib/extension/manifest.js.map +1 -1
  52. package/build/lib/extension/package-changed.js +57 -61
  53. package/build/lib/extension/package-changed.js.map +1 -1
  54. package/build/lib/extension/plugin-config.d.ts +2 -3
  55. package/build/lib/extension/plugin-config.d.ts.map +1 -1
  56. package/build/lib/extension/plugin-config.js +94 -70
  57. package/build/lib/extension/plugin-config.js.map +1 -1
  58. package/build/lib/grid-register.js +119 -137
  59. package/build/lib/grid-register.js.map +1 -1
  60. package/build/lib/logger.d.ts +1 -1
  61. package/build/lib/logger.d.ts.map +1 -1
  62. package/build/lib/logger.js +5 -15
  63. package/build/lib/logger.js.map +1 -1
  64. package/build/lib/logsink.d.ts.map +1 -1
  65. package/build/lib/logsink.js +189 -183
  66. package/build/lib/logsink.js.map +1 -1
  67. package/build/lib/main.d.ts +19 -12
  68. package/build/lib/main.d.ts.map +1 -1
  69. package/build/lib/main.js +330 -304
  70. package/build/lib/main.js.map +1 -1
  71. package/build/lib/schema/arg-spec.js +153 -108
  72. package/build/lib/schema/arg-spec.js.map +1 -1
  73. package/build/lib/schema/cli-args.js +203 -164
  74. package/build/lib/schema/cli-args.js.map +1 -1
  75. package/build/lib/schema/cli-transformers.js +117 -72
  76. package/build/lib/schema/cli-transformers.js.map +1 -1
  77. package/build/lib/schema/index.js +17 -32
  78. package/build/lib/schema/index.js.map +1 -1
  79. package/build/lib/schema/keywords.js +125 -67
  80. package/build/lib/schema/keywords.js.map +1 -1
  81. package/build/lib/schema/schema.d.ts.map +1 -1
  82. package/build/lib/schema/schema.js +582 -417
  83. package/build/lib/schema/schema.js.map +1 -1
  84. package/build/lib/utils.d.ts +41 -255
  85. package/build/lib/utils.d.ts.map +1 -1
  86. package/build/lib/utils.js +342 -193
  87. package/build/lib/utils.js.map +1 -1
  88. package/build/tsconfig.tsbuildinfo +1 -1
  89. package/build/types/cli.d.ts +45 -34
  90. package/build/types/cli.d.ts.map +1 -1
  91. package/build/types/cli.js +3 -0
  92. package/build/types/cli.js.map +1 -0
  93. package/build/types/index.d.ts +1 -2
  94. package/build/types/index.d.ts.map +1 -1
  95. package/build/types/index.js +19 -0
  96. package/build/types/index.js.map +1 -0
  97. package/build/types/manifest/base.d.ts +135 -0
  98. package/build/types/manifest/base.d.ts.map +1 -0
  99. package/build/types/manifest/base.js +3 -0
  100. package/build/types/manifest/base.js.map +1 -0
  101. package/build/types/manifest/index.d.ts +19 -0
  102. package/build/types/manifest/index.d.ts.map +1 -0
  103. package/build/types/manifest/index.js +40 -0
  104. package/build/types/manifest/index.js.map +1 -0
  105. package/build/types/manifest/v3.d.ts +139 -0
  106. package/build/types/manifest/v3.d.ts.map +1 -0
  107. package/build/types/manifest/v3.js +3 -0
  108. package/build/types/manifest/v3.js.map +1 -0
  109. package/lib/appium.js +1 -1
  110. package/lib/cli/args.js +1 -1
  111. package/lib/cli/extension-command.js +116 -61
  112. package/lib/cli/extension.js +9 -8
  113. package/lib/cli/parser.js +2 -2
  114. package/lib/config-file.js +2 -3
  115. package/lib/config.js +3 -2
  116. package/lib/constants.js +6 -5
  117. package/lib/extension/extension-config.js +24 -25
  118. package/lib/extension/manifest-migrations.js +99 -0
  119. package/lib/extension/manifest.js +79 -72
  120. package/lib/extension/plugin-config.js +1 -2
  121. package/lib/logsink.js +26 -5
  122. package/lib/main.js +58 -50
  123. package/lib/schema/schema.js +6 -1
  124. package/lib/utils.js +62 -0
  125. package/package.json +23 -24
  126. package/scripts/autoinstall-extensions.js +78 -26
  127. package/types/cli.ts +81 -42
  128. package/types/index.ts +1 -2
  129. package/types/manifest/README.md +30 -0
  130. package/types/manifest/base.ts +158 -0
  131. package/types/manifest/index.ts +27 -0
  132. package/types/manifest/v3.ts +161 -0
  133. package/build/types/appium-manifest.d.ts +0 -59
  134. package/build/types/appium-manifest.d.ts.map +0 -1
  135. package/build/types/extension-manifest.d.ts +0 -55
  136. package/build/types/extension-manifest.d.ts.map +0 -1
  137. package/types/appium-manifest.ts +0 -73
  138. package/types/extension-manifest.ts +0 -64
package/build/lib/main.js CHANGED
@@ -1,336 +1,362 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
-
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- Object.defineProperty(exports, "finalizeSchema", {
8
- enumerable: true,
9
- get: function () {
10
- return _schema.finalizeSchema;
11
- }
12
- });
13
- Object.defineProperty(exports, "getSchema", {
14
- enumerable: true,
15
- get: function () {
16
- return _schema.getSchema;
17
- }
18
- });
19
- exports.init = init;
20
- exports.main = main;
21
- Object.defineProperty(exports, "readConfigFile", {
22
- enumerable: true,
23
- get: function () {
24
- return _configFile.readConfigFile;
25
- }
26
- });
27
- exports.resolveAppiumHome = void 0;
28
- Object.defineProperty(exports, "validate", {
29
- enumerable: true,
30
- get: function () {
31
- return _schema.validate;
32
- }
33
- });
34
-
35
- require("source-map-support/register");
36
-
37
- var _logsink = require("./logsink");
38
-
39
- var _logger = _interopRequireDefault(require("./logger"));
40
-
41
- var _baseDriver = require("@appium/base-driver");
42
-
43
- var _support = require("@appium/support");
44
-
45
- var _asyncbox = require("asyncbox");
46
-
47
- var _lodash = _interopRequireDefault(require("lodash"));
48
-
49
- var _appium = require("./appium");
50
-
51
- var _extension = require("./cli/extension");
52
-
53
- var _parser = require("./cli/parser");
54
-
55
- var _config = require("./config");
56
-
57
- var _configFile = require("./config-file");
58
-
59
- var _extension2 = require("./extension");
60
-
61
- var _constants = require("./constants");
62
-
63
- var _gridRegister = _interopRequireDefault(require("./grid-register"));
64
-
65
- var _schema = require("./schema/schema");
66
-
67
- var _utils = require("./utils");
68
-
69
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
70
-
71
- const {
72
- resolveAppiumHome
73
- } = _support.env;
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.resolveAppiumHome = exports.init = exports.main = exports.validate = exports.getSchema = exports.finalizeSchema = exports.readConfigFile = void 0;
8
+ const logsink_1 = require("./logsink"); // this import needs to come first since it sets up global npmlog
9
+ const logger_1 = __importDefault(require("./logger")); // logger needs to remain second
10
+ // @ts-ignore
11
+ const base_driver_1 = require("@appium/base-driver");
12
+ const support_1 = require("@appium/support");
13
+ const asyncbox_1 = require("asyncbox");
14
+ const lodash_1 = __importDefault(require("lodash"));
15
+ const appium_1 = require("./appium");
16
+ const extension_1 = require("./cli/extension");
17
+ const parser_1 = require("./cli/parser");
18
+ const config_1 = require("./config");
19
+ const config_file_1 = require("./config-file");
20
+ const extension_2 = require("./extension");
21
+ const constants_1 = require("./constants");
22
+ const grid_register_1 = __importDefault(require("./grid-register"));
23
+ const schema_1 = require("./schema/schema");
24
+ const utils_1 = require("./utils");
25
+ const { resolveAppiumHome } = support_1.env;
74
26
  exports.resolveAppiumHome = resolveAppiumHome;
75
-
27
+ /**
28
+ *
29
+ * @param {ParsedArgs} args
30
+ * @param {boolean} [throwInsteadOfExit]
31
+ */
76
32
  async function preflightChecks(args, throwInsteadOfExit = false) {
77
- try {
78
- (0, _config.checkNodeOk)();
79
- await (0, _config.checkNpmOk)();
80
-
81
- if (args.longStacktrace) {
82
- require('longjohn').async_trace_limit = -1;
83
- }
84
-
85
- if (args.showBuildInfo) {
86
- await (0, _config.showBuildInfo)();
87
- process.exit(0);
88
- }
89
-
90
- (0, _config.warnNodeDeprecations)();
91
- (0, _schema.validate)(args);
92
-
93
- if (args.tmpDir) {
94
- await (0, _config.validateTmpDir)(args.tmpDir);
33
+ try {
34
+ (0, config_1.checkNodeOk)();
35
+ await (0, config_1.checkNpmOk)();
36
+ if (args.longStacktrace) {
37
+ require('longjohn').async_trace_limit = -1;
38
+ }
39
+ if (args.showBuildInfo) {
40
+ await (0, config_1.showBuildInfo)();
41
+ process.exit(0);
42
+ }
43
+ (0, config_1.warnNodeDeprecations)();
44
+ (0, schema_1.validate)(args);
45
+ if (args.tmpDir) {
46
+ await (0, config_1.validateTmpDir)(args.tmpDir);
47
+ }
95
48
  }
96
- } catch (err) {
97
- _logger.default.error(err.message.red);
98
-
99
- if (throwInsteadOfExit) {
100
- throw err;
49
+ catch (err) {
50
+ logger_1.default.error(err.message.red);
51
+ if (throwInsteadOfExit) {
52
+ throw err;
53
+ }
54
+ process.exit(1);
101
55
  }
102
-
103
- process.exit(1);
104
- }
105
56
  }
106
-
57
+ /**
58
+ * @param {Args} args
59
+ */
107
60
  function logNonDefaultArgsWarning(args) {
108
- _logger.default.info('Non-default server args:');
109
-
110
- (0, _utils.inspect)(args);
61
+ logger_1.default.info('Non-default server args:');
62
+ (0, utils_1.inspect)(args);
111
63
  }
112
-
64
+ /**
65
+ * @param {Args['defaultCapabilities']} caps
66
+ */
113
67
  function logDefaultCapabilitiesWarning(caps) {
114
- _logger.default.info('Default capabilities, which will be added to each request ' + 'unless overridden by desired capabilities:');
115
-
116
- (0, _utils.inspect)(caps);
68
+ logger_1.default.info('Default capabilities, which will be added to each request ' +
69
+ 'unless overridden by desired capabilities:');
70
+ (0, utils_1.inspect)(caps);
117
71
  }
118
-
72
+ /**
73
+ * @param {ParsedArgs} args
74
+ */
119
75
  async function logStartupInfo(args) {
120
- let welcome = `Welcome to Appium v${_config.APPIUM_VER}`;
121
- let appiumRev = await (0, _config.getGitRev)();
122
-
123
- if (appiumRev) {
124
- welcome += ` (REV ${appiumRev})`;
125
- }
126
-
127
- _logger.default.info(welcome);
128
-
129
- let showArgs = (0, _config.getNonDefaultServerArgs)(args);
130
-
131
- if (_lodash.default.size(showArgs)) {
132
- logNonDefaultArgsWarning(showArgs);
133
- }
134
-
135
- if (!_lodash.default.isEmpty(args.defaultCapabilities)) {
136
- logDefaultCapabilitiesWarning(args.defaultCapabilities);
137
- }
76
+ let welcome = `Welcome to Appium v${config_1.APPIUM_VER}`;
77
+ let appiumRev = await (0, config_1.getGitRev)();
78
+ if (appiumRev) {
79
+ welcome += ` (REV ${appiumRev})`;
80
+ }
81
+ logger_1.default.info(welcome);
82
+ let showArgs = (0, config_1.getNonDefaultServerArgs)(args);
83
+ if (lodash_1.default.size(showArgs)) {
84
+ logNonDefaultArgsWarning(showArgs);
85
+ }
86
+ if (!lodash_1.default.isEmpty(args.defaultCapabilities)) {
87
+ logDefaultCapabilitiesWarning(args.defaultCapabilities);
88
+ }
89
+ // TODO: bring back loglevel reporting below once logger is flushed out
90
+ // logger.info('Console LogLevel: ' + logger.transports.console.level);
91
+ // if (logger.transports.file) {
92
+ // logger.info('File LogLevel: ' + logger.transports.file.level);
93
+ // }
138
94
  }
139
-
95
+ /**
96
+ * Logs the address and port the server is listening on
97
+ * @param {string} address - Address
98
+ * @param {number} port - Port
99
+ * @returns {void}
100
+ */
140
101
  function logServerPort(address, port) {
141
- let logMessage = `Appium REST http interface listener started on ` + `${address}:${port}`;
142
-
143
- _logger.default.info(logMessage);
102
+ let logMessage = `Appium REST http interface listener started on ` + `${address}:${port}`;
103
+ logger_1.default.info(logMessage);
144
104
  }
145
-
105
+ /**
106
+ * Gets a list of `updateServer` functions from all extensions
107
+ * @param {DriverNameMap} driverClasses
108
+ * @param {PluginNameMap} pluginClasses
109
+ * @returns {import('@appium/types').UpdateServerCallback[]}
110
+ */
146
111
  function getServerUpdaters(driverClasses, pluginClasses) {
147
- return _lodash.default.compact(_lodash.default.map([...driverClasses.keys(), ...pluginClasses.keys()], 'updateServer'));
112
+ return lodash_1.default.compact(lodash_1.default.map([...driverClasses.keys(), ...pluginClasses.keys()], 'updateServer'));
148
113
  }
149
-
114
+ /**
115
+ * Makes a big `MethodMap` from all the little `MethodMap`s in the extensions
116
+ * @param {DriverNameMap} driverClasses
117
+ * @param {PluginNameMap} pluginClasses
118
+ * @returns {import('@appium/types').MethodMap}
119
+ */
150
120
  function getExtraMethodMap(driverClasses, pluginClasses) {
151
- return [...driverClasses.keys(), ...pluginClasses.keys()].reduce((map, klass) => ({ ...map,
152
- ...(klass.newMethodMap ?? {})
153
- }), {});
154
- }
155
-
156
- function areServerCommandArgs(args) {
157
- return args.subcommand === _constants.SERVER_SUBCOMMAND;
121
+ return [...driverClasses.keys(), ...pluginClasses.keys()].reduce((map, klass) => ({
122
+ ...map,
123
+ ...(klass.newMethodMap ?? {}),
124
+ }), {});
158
125
  }
159
-
126
+ /**
127
+ * Initializes Appium, but does not start the server.
128
+ *
129
+ * Use this to get at the configuration schema.
130
+ *
131
+ * If `args` contains a non-empty `subcommand` which is not `server`, this function will return an empty object.
132
+ *
133
+ * @template {CliCommand} [Cmd=ServerCommand]
134
+ * @template {CliExtensionSubcommand|void} [SubCmd=void]
135
+ * @param {Args<Cmd, SubCmd>} [args] - Partial args (progammatic usage only)
136
+ * @returns {Promise<InitResult<Cmd>>}
137
+ * @example
138
+ * import {init, getSchema} from 'appium';
139
+ * const options = {}; // config object
140
+ * await init(options);
141
+ * const schema = getSchema(); // entire config schema including plugins and drivers
142
+ */
160
143
  async function init(args) {
161
- const appiumHome = (args === null || args === void 0 ? void 0 : args.appiumHome) ?? (await resolveAppiumHome());
162
- (0, _utils.adjustNodePath)();
163
- const {
164
- driverConfig,
165
- pluginConfig
166
- } = await (0, _extension2.loadExtensions)(appiumHome);
167
- const parser = (0, _parser.getParser)();
168
- let throwInsteadOfExit = false;
169
- let preConfigArgs;
170
-
171
- if (args) {
172
- if (args.throwInsteadOfExit) {
173
- throwInsteadOfExit = true;
174
- delete args.throwInsteadOfExit;
144
+ const appiumHome = args?.appiumHome ?? (await resolveAppiumHome());
145
+ (0, utils_1.adjustNodePath)();
146
+ const { driverConfig, pluginConfig } = await (0, extension_2.loadExtensions)(appiumHome);
147
+ const parser = (0, parser_1.getParser)();
148
+ let throwInsteadOfExit = false;
149
+ /** @type {Args<Cmd, SubCmd>} */
150
+ let preConfigArgs;
151
+ if (args) {
152
+ // if we have a containing package instead of running as a CLI process,
153
+ // that package might not appreciate us calling 'process.exit' willy-
154
+ // nilly, so give it the option to have us throw instead of exit
155
+ if (args.throwInsteadOfExit) {
156
+ throwInsteadOfExit = true;
157
+ // but remove it since it's not a real server arg per se
158
+ delete args.throwInsteadOfExit;
159
+ }
160
+ preConfigArgs = { ...args, subcommand: args.subcommand ?? constants_1.SERVER_SUBCOMMAND };
175
161
  }
176
-
177
- preConfigArgs = { ...args,
178
- subcommand: args.subcommand ?? _constants.SERVER_SUBCOMMAND
179
- };
180
- } else {
181
- preConfigArgs = parser.parseArgs();
182
- }
183
-
184
- const configResult = await (0, _configFile.readConfigFile)(preConfigArgs.configFile);
185
-
186
- if (!_lodash.default.isEmpty(configResult.errors)) {
187
- throw new Error(`Errors in config file ${configResult.filepath}:\n ${configResult.reason ?? configResult.errors}`);
188
- }
189
-
190
- if (areServerCommandArgs(preConfigArgs)) {
191
- var _configResult$config;
192
-
193
- const defaults = (0, _schema.getDefaultsForSchema)(false);
194
-
195
- const serverArgs = _lodash.default.defaultsDeep(preConfigArgs, (_configResult$config = configResult.config) === null || _configResult$config === void 0 ? void 0 : _configResult$config.server, defaults);
196
-
197
- if (preConfigArgs.showConfig) {
198
- (0, _config.showConfig)((0, _config.getNonDefaultServerArgs)(preConfigArgs), configResult, defaults, serverArgs);
199
- return {};
162
+ else {
163
+ // otherwise parse from CLI
164
+ preConfigArgs = /** @type {Args<Cmd, SubCmd>} */ (parser.parseArgs());
200
165
  }
201
-
202
- await (0, _logsink.init)(serverArgs);
203
-
204
- if (serverArgs.logFilters) {
205
- const {
206
- issues,
207
- rules
208
- } = await _support.logger.loadSecureValuesPreprocessingRules(serverArgs.logFilters);
209
-
210
- if (!_lodash.default.isEmpty(issues)) {
211
- throw new Error(`The log filtering rules config '${serverArgs.logFilters}' has issues: ` + JSON.stringify(issues, null, 2));
212
- }
213
-
214
- if (_lodash.default.isEmpty(rules)) {
215
- _logger.default.warn(`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`);
216
- } else {
217
- _logger.default.info(`Loaded ${_support.util.pluralize('filtering rule', rules.length, true)} from '${serverArgs.logFilters}'`);
218
- }
166
+ const configResult = await (0, config_file_1.readConfigFile)(preConfigArgs.configFile);
167
+ if (!lodash_1.default.isEmpty(configResult.errors)) {
168
+ throw new Error(`Errors in config file ${configResult.filepath}:\n ${configResult.reason ?? configResult.errors}`);
219
169
  }
220
-
221
- const appiumDriver = new _appium.AppiumDriver(serverArgs);
222
- appiumDriver.driverConfig = driverConfig;
223
- await preflightChecks(serverArgs, throwInsteadOfExit);
224
- return {
225
- appiumDriver,
226
- parsedArgs: serverArgs,
227
- driverConfig,
228
- pluginConfig
229
- };
230
- } else {
231
- const extensionCommandArgs = preConfigArgs;
232
-
233
- if (preConfigArgs.subcommand === _constants.DRIVER_TYPE) {
234
- await (0, _extension.runExtensionCommand)(extensionCommandArgs, driverConfig);
235
- return {};
170
+ // merge config and apply defaults.
171
+ // the order of precendece is:
172
+ // 1. command line args
173
+ // 2. config file
174
+ // 3. defaults from config file.
175
+ if ((0, utils_1.isServerCommandArgs)(preConfigArgs)) {
176
+ const defaults = (0, schema_1.getDefaultsForSchema)(false);
177
+ /** @type {ParsedArgs} */
178
+ const serverArgs = lodash_1.default.defaultsDeep({}, preConfigArgs, configResult.config?.server, defaults);
179
+ if (preConfigArgs.showConfig) {
180
+ (0, config_1.showConfig)((0, config_1.getNonDefaultServerArgs)(preConfigArgs), configResult, defaults, serverArgs);
181
+ return /** @type {InitResult<Cmd>} */ ({});
182
+ }
183
+ await (0, logsink_1.init)(serverArgs);
184
+ if (serverArgs.logFilters) {
185
+ const { issues, rules } = await support_1.logger.loadSecureValuesPreprocessingRules(serverArgs.logFilters);
186
+ if (!lodash_1.default.isEmpty(issues)) {
187
+ throw new Error(`The log filtering rules config '${serverArgs.logFilters}' has issues: ` +
188
+ JSON.stringify(issues, null, 2));
189
+ }
190
+ if (lodash_1.default.isEmpty(rules)) {
191
+ logger_1.default.warn(`Found no log filtering rules in '${serverArgs.logFilters}'. Is that expected?`);
192
+ }
193
+ else {
194
+ logger_1.default.info(`Loaded ${support_1.util.pluralize('filtering rule', rules.length, true)} from '${serverArgs.logFilters}'`);
195
+ }
196
+ }
197
+ const appiumDriver = new appium_1.AppiumDriver(serverArgs);
198
+ // set the config on the umbrella driver so it can match drivers to caps
199
+ appiumDriver.driverConfig = driverConfig;
200
+ await preflightChecks(serverArgs, throwInsteadOfExit);
201
+ return /** @type {InitResult<Cmd>} */ ({
202
+ appiumDriver,
203
+ parsedArgs: serverArgs,
204
+ driverConfig,
205
+ pluginConfig,
206
+ });
236
207
  }
237
-
238
- if (preConfigArgs.subcommand === _constants.PLUGIN_TYPE) {
239
- await (0, _extension.runExtensionCommand)(extensionCommandArgs, pluginConfig);
240
- return {};
208
+ else {
209
+ if ((0, utils_1.isExtensionCommandArgs)(preConfigArgs)) {
210
+ // if the user has requested the 'driver' CLI, don't run the normal server,
211
+ // but instead pass control to the driver CLI
212
+ if ((0, utils_1.isDriverCommandArgs)(preConfigArgs)) {
213
+ await (0, extension_1.runExtensionCommand)(preConfigArgs, driverConfig);
214
+ }
215
+ if ((0, utils_1.isPluginCommandArgs)(preConfigArgs)) {
216
+ await (0, extension_1.runExtensionCommand)(preConfigArgs, pluginConfig);
217
+ }
218
+ }
219
+ return /** @type {InitResult<Cmd>} */ ({});
241
220
  }
242
-
243
- return {};
244
- }
245
221
  }
246
-
222
+ exports.init = init;
223
+ /**
224
+ * Initializes Appium's config. Starts server if appropriate and resolves the
225
+ * server instance if so; otherwise resolves w/ `undefined`.
226
+ * @template {CliCommand} [Cmd=ServerCommand]
227
+ * @template {CliExtensionSubcommand|void} [SubCmd=void]
228
+ * @param {Args<Cmd, SubCmd>} [args] - Arguments from CLI or otherwise
229
+ * @returns {Promise<Cmd extends ServerCommand ? import('@appium/types').AppiumServer : void>}
230
+ */
247
231
  async function main(args) {
248
- const {
249
- appiumDriver,
250
- parsedArgs,
251
- pluginConfig,
252
- driverConfig
253
- } = await init(args);
254
-
255
- if (!appiumDriver || !parsedArgs || !pluginConfig || !driverConfig) {
256
- return;
257
- }
258
-
259
- const pluginClasses = (0, _extension2.getActivePlugins)(pluginConfig, parsedArgs.usePlugins);
260
- appiumDriver.pluginClasses = pluginClasses;
261
- await logStartupInfo(parsedArgs);
262
- let routeConfiguringFunction = (0, _baseDriver.routeConfiguringFunction)(appiumDriver);
263
- const driverClasses = (0, _extension2.getActiveDrivers)(driverConfig, parsedArgs.useDrivers);
264
- const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
265
- const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
266
- const serverOpts = {
267
- routeConfiguringFunction,
268
- port: parsedArgs.port,
269
- hostname: parsedArgs.address,
270
- allowCors: parsedArgs.allowCors,
271
- basePath: parsedArgs.basePath,
272
- serverUpdaters,
273
- extraMethodMap,
274
- cliArgs: parsedArgs
275
- };
276
-
277
- if (parsedArgs.keepAliveTimeout) {
278
- serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
279
- }
280
-
281
- let server;
282
-
283
- try {
284
- server = await (0, _baseDriver.server)(serverOpts);
285
- } catch (err) {
286
- _logger.default.error(`Could not configure Appium server. It's possible that a driver or plugin tried ` + `to update the server and failed. Original error: ${err.message}`);
287
-
288
- _logger.default.debug(err.stack);
289
-
290
- return process.exit(1);
291
- }
292
-
293
- if (parsedArgs.allowCors) {
294
- _logger.default.warn('You have enabled CORS requests from any host. Be careful not ' + 'to visit sites which could maliciously try to start Appium ' + 'sessions on your machine');
295
- }
296
-
297
- appiumDriver.server = server;
298
-
299
- try {
300
- if (parsedArgs.nodeconfig) {
301
- await (0, _gridRegister.default)(parsedArgs.nodeconfig, parsedArgs.address, parsedArgs.port, parsedArgs.basePath);
232
+ const initResult = await init(args);
233
+ if (lodash_1.default.isEmpty(initResult)) {
234
+ // if this branch is taken, we've run a different subcommand, so there's nothing
235
+ // left to do here.
236
+ return /** @type {Cmd extends ServerCommand ? import('@appium/types').AppiumServer : void} */ (undefined);
302
237
  }
303
- } catch (err) {
304
- await server.close();
305
- throw err;
306
- }
307
-
308
- for (const signal of ['SIGINT', 'SIGTERM']) {
309
- process.once(signal, async function onSignal() {
310
- _logger.default.info(`Received ${signal} - shutting down`);
311
-
312
- try {
313
- await appiumDriver.deleteAllSessions({
314
- force: true,
315
- reason: `The process has received ${signal} signal`
316
- });
238
+ const { appiumDriver, pluginConfig, driverConfig, parsedArgs } =
239
+ /** @type {InitResult<ServerCommand>} */ (initResult);
240
+ const pluginClasses = (0, extension_2.getActivePlugins)(pluginConfig, parsedArgs.usePlugins);
241
+ // set the active plugins on the umbrella driver so it can use them for commands
242
+ appiumDriver.pluginClasses = pluginClasses;
243
+ await logStartupInfo(parsedArgs);
244
+ let routeConfiguringFunction = (0, base_driver_1.routeConfiguringFunction)(appiumDriver);
245
+ const driverClasses = (0, extension_2.getActiveDrivers)(driverConfig, parsedArgs.useDrivers);
246
+ const serverUpdaters = getServerUpdaters(driverClasses, pluginClasses);
247
+ const extraMethodMap = getExtraMethodMap(driverClasses, pluginClasses);
248
+ /** @type {import('@appium/base-driver').ServerOpts} */
249
+ const serverOpts = {
250
+ routeConfiguringFunction,
251
+ port: parsedArgs.port,
252
+ hostname: parsedArgs.address,
253
+ allowCors: parsedArgs.allowCors,
254
+ basePath: parsedArgs.basePath,
255
+ serverUpdaters,
256
+ extraMethodMap,
257
+ cliArgs: parsedArgs,
258
+ };
259
+ if (parsedArgs.keepAliveTimeout) {
260
+ serverOpts.keepAliveTimeout = parsedArgs.keepAliveTimeout * 1000;
261
+ }
262
+ let server;
263
+ try {
264
+ server = await (0, base_driver_1.server)(serverOpts);
265
+ }
266
+ catch (err) {
267
+ logger_1.default.error(`Could not configure Appium server. It's possible that a driver or plugin tried ` +
268
+ `to update the server and failed. Original error: ${err.message}`);
269
+ logger_1.default.debug(err.stack);
270
+ return process.exit(1);
271
+ }
272
+ if (parsedArgs.allowCors) {
273
+ logger_1.default.warn('You have enabled CORS requests from any host. Be careful not ' +
274
+ 'to visit sites which could maliciously try to start Appium ' +
275
+ 'sessions on your machine');
276
+ }
277
+ appiumDriver.server = server;
278
+ try {
279
+ // configure as node on grid, if necessary
280
+ // falsy values should not cause this to run
281
+ if (parsedArgs.nodeconfig) {
282
+ await (0, grid_register_1.default)(parsedArgs.nodeconfig, parsedArgs.address, parsedArgs.port, parsedArgs.basePath);
283
+ }
284
+ }
285
+ catch (err) {
317
286
  await server.close();
318
- process.exit(0);
319
- } catch (e) {
320
- _logger.default.warn(e);
321
-
322
- process.exit(1);
323
- }
324
- });
325
- }
326
-
327
- logServerPort(parsedArgs.address, parsedArgs.port);
328
- driverConfig.print();
329
- pluginConfig.print([...pluginClasses.values()]);
330
- return server;
287
+ throw err;
288
+ }
289
+ for (const signal of ['SIGINT', 'SIGTERM']) {
290
+ process.once(signal, async function onSignal() {
291
+ logger_1.default.info(`Received ${signal} - shutting down`);
292
+ try {
293
+ await appiumDriver.deleteAllSessions({
294
+ force: true,
295
+ reason: `The process has received ${signal} signal`,
296
+ });
297
+ await server.close();
298
+ process.exit(0);
299
+ }
300
+ catch (e) {
301
+ logger_1.default.warn(e);
302
+ process.exit(1);
303
+ }
304
+ });
305
+ }
306
+ logServerPort(parsedArgs.address, parsedArgs.port);
307
+ driverConfig.print();
308
+ pluginConfig.print([...pluginClasses.values()]);
309
+ return /** @type {Cmd extends ServerCommand ? import('@appium/types').AppiumServer : void} */ (server);
331
310
  }
332
-
311
+ exports.main = main;
312
+ // NOTE: this is here for backwards compat for any scripts referencing `main.js` directly
313
+ // (more specifically, `build/lib/main.js`)
314
+ // the executable is now `../index.js`, so that module will typically be `require.main`.
333
315
  if (require.main === module) {
334
- (0, _asyncbox.asyncify)(main);
316
+ (0, asyncbox_1.asyncify)(main);
335
317
  }
336
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXNvbHZlQXBwaXVtSG9tZSIsImVudiIsInByZWZsaWdodENoZWNrcyIsImFyZ3MiLCJ0aHJvd0luc3RlYWRPZkV4aXQiLCJjaGVja05vZGVPayIsImNoZWNrTnBtT2siLCJsb25nU3RhY2t0cmFjZSIsInJlcXVpcmUiLCJhc3luY190cmFjZV9saW1pdCIsInNob3dCdWlsZEluZm8iLCJwcm9jZXNzIiwiZXhpdCIsIndhcm5Ob2RlRGVwcmVjYXRpb25zIiwidmFsaWRhdGUiLCJ0bXBEaXIiLCJ2YWxpZGF0ZVRtcERpciIsImVyciIsImxvZ2dlciIsImVycm9yIiwibWVzc2FnZSIsInJlZCIsImxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyIsImluZm8iLCJpbnNwZWN0IiwibG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmciLCJjYXBzIiwibG9nU3RhcnR1cEluZm8iLCJ3ZWxjb21lIiwiQVBQSVVNX1ZFUiIsImFwcGl1bVJldiIsImdldEdpdFJldiIsInNob3dBcmdzIiwiZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MiLCJfIiwic2l6ZSIsImlzRW1wdHkiLCJkZWZhdWx0Q2FwYWJpbGl0aWVzIiwibG9nU2VydmVyUG9ydCIsImFkZHJlc3MiLCJwb3J0IiwibG9nTWVzc2FnZSIsImdldFNlcnZlclVwZGF0ZXJzIiwiZHJpdmVyQ2xhc3NlcyIsInBsdWdpbkNsYXNzZXMiLCJjb21wYWN0IiwibWFwIiwia2V5cyIsImdldEV4dHJhTWV0aG9kTWFwIiwicmVkdWNlIiwia2xhc3MiLCJuZXdNZXRob2RNYXAiLCJhcmVTZXJ2ZXJDb21tYW5kQXJncyIsInN1YmNvbW1hbmQiLCJTRVJWRVJfU1VCQ09NTUFORCIsImluaXQiLCJhcHBpdW1Ib21lIiwiYWRqdXN0Tm9kZVBhdGgiLCJkcml2ZXJDb25maWciLCJwbHVnaW5Db25maWciLCJsb2FkRXh0ZW5zaW9ucyIsInBhcnNlciIsImdldFBhcnNlciIsInByZUNvbmZpZ0FyZ3MiLCJwYXJzZUFyZ3MiLCJjb25maWdSZXN1bHQiLCJyZWFkQ29uZmlnRmlsZSIsImNvbmZpZ0ZpbGUiLCJlcnJvcnMiLCJFcnJvciIsImZpbGVwYXRoIiwicmVhc29uIiwiZGVmYXVsdHMiLCJnZXREZWZhdWx0c0ZvclNjaGVtYSIsInNlcnZlckFyZ3MiLCJkZWZhdWx0c0RlZXAiLCJjb25maWciLCJzZXJ2ZXIiLCJzaG93Q29uZmlnIiwibG9nc2lua0luaXQiLCJsb2dGaWx0ZXJzIiwiaXNzdWVzIiwicnVsZXMiLCJsb2dGYWN0b3J5IiwibG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3YXJuIiwidXRpbCIsInBsdXJhbGl6ZSIsImxlbmd0aCIsImFwcGl1bURyaXZlciIsIkFwcGl1bURyaXZlciIsInBhcnNlZEFyZ3MiLCJleHRlbnNpb25Db21tYW5kQXJncyIsIkRSSVZFUl9UWVBFIiwicnVuRXh0ZW5zaW9uQ29tbWFuZCIsIlBMVUdJTl9UWVBFIiwibWFpbiIsImdldEFjdGl2ZVBsdWdpbnMiLCJ1c2VQbHVnaW5zIiwicm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIiwibWFrZVJvdXRlciIsImdldEFjdGl2ZURyaXZlcnMiLCJ1c2VEcml2ZXJzIiwic2VydmVyVXBkYXRlcnMiLCJleHRyYU1ldGhvZE1hcCIsInNlcnZlck9wdHMiLCJob3N0bmFtZSIsImFsbG93Q29ycyIsImJhc2VQYXRoIiwiY2xpQXJncyIsImtlZXBBbGl2ZVRpbWVvdXQiLCJiYXNlU2VydmVyIiwiZGVidWciLCJzdGFjayIsIm5vZGVjb25maWciLCJyZWdpc3Rlck5vZGUiLCJjbG9zZSIsInNpZ25hbCIsIm9uY2UiLCJvblNpZ25hbCIsImRlbGV0ZUFsbFNlc3Npb25zIiwiZm9yY2UiLCJlIiwicHJpbnQiLCJ2YWx1ZXMiLCJtb2R1bGUiLCJhc3luY2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHtpbml0IGFzIGxvZ3NpbmtJbml0fSBmcm9tICcuL2xvZ3NpbmsnOyAvLyB0aGlzIGltcG9ydCBuZWVkcyB0byBjb21lIGZpcnN0IHNpbmNlIGl0IHNldHMgdXAgZ2xvYmFsIG5wbWxvZ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7IC8vIGxvZ2dlciBuZWVkcyB0byByZW1haW4gc2Vjb25kXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQge3JvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiBhcyBtYWtlUm91dGVyLCBzZXJ2ZXIgYXMgYmFzZVNlcnZlcn0gZnJvbSAnQGFwcGl1bS9iYXNlLWRyaXZlcic7XG5pbXBvcnQge2xvZ2dlciBhcyBsb2dGYWN0b3J5LCB1dGlsLCBlbnZ9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQge2FzeW5jaWZ5fSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtBcHBpdW1Ecml2ZXJ9IGZyb20gJy4vYXBwaXVtJztcbmltcG9ydCB7cnVuRXh0ZW5zaW9uQ29tbWFuZH0gZnJvbSAnLi9jbGkvZXh0ZW5zaW9uJztcbmltcG9ydCB7Z2V0UGFyc2VyfSBmcm9tICcuL2NsaS9wYXJzZXInO1xuaW1wb3J0IHtcbiAgQVBQSVVNX1ZFUixcbiAgY2hlY2tOb2RlT2ssXG4gIGdldEdpdFJldixcbiAgZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MsXG4gIHNob3dDb25maWcsXG4gIHNob3dCdWlsZEluZm8sXG4gIHZhbGlkYXRlVG1wRGlyLFxuICB3YXJuTm9kZURlcHJlY2F0aW9ucyxcbiAgY2hlY2tOcG1Payxcbn0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtyZWFkQ29uZmlnRmlsZX0gZnJvbSAnLi9jb25maWctZmlsZSc7XG5pbXBvcnQge2xvYWRFeHRlbnNpb25zLCBnZXRBY3RpdmVQbHVnaW5zLCBnZXRBY3RpdmVEcml2ZXJzfSBmcm9tICcuL2V4dGVuc2lvbic7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRSwgU0VSVkVSX1NVQkNPTU1BTkR9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCByZWdpc3Rlck5vZGUgZnJvbSAnLi9ncmlkLXJlZ2lzdGVyJztcbmltcG9ydCB7Z2V0RGVmYXVsdHNGb3JTY2hlbWEsIHZhbGlkYXRlfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IHtpbnNwZWN0LCBhZGp1c3ROb2RlUGF0aH0gZnJvbSAnLi91dGlscyc7XG5cbmNvbnN0IHtyZXNvbHZlQXBwaXVtSG9tZX0gPSBlbnY7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7UGFyc2VkQXJnc30gYXJnc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhyb3dJbnN0ZWFkT2ZFeGl0XVxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVmbGlnaHRDaGVja3MoYXJncywgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBjaGVja05vZGVPaygpO1xuICAgIGF3YWl0IGNoZWNrTnBtT2soKTtcbiAgICBpZiAoYXJncy5sb25nU3RhY2t0cmFjZSkge1xuICAgICAgcmVxdWlyZSgnbG9uZ2pvaG4nKS5hc3luY190cmFjZV9saW1pdCA9IC0xO1xuICAgIH1cbiAgICBpZiAoYXJncy5zaG93QnVpbGRJbmZvKSB7XG4gICAgICBhd2FpdCBzaG93QnVpbGRJbmZvKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICAgIHdhcm5Ob2RlRGVwcmVjYXRpb25zKCk7XG5cbiAgICB2YWxpZGF0ZShhcmdzKTtcblxuICAgIGlmIChhcmdzLnRtcERpcikge1xuICAgICAgYXdhaXQgdmFsaWRhdGVUbXBEaXIoYXJncy50bXBEaXIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlLnJlZCk7XG4gICAgaWYgKHRocm93SW5zdGVhZE9mRXhpdCkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJnc30gYXJnc1xuICovXG5mdW5jdGlvbiBsb2dOb25EZWZhdWx0QXJnc1dhcm5pbmcoYXJncykge1xuICBsb2dnZXIuaW5mbygnTm9uLWRlZmF1bHQgc2VydmVyIGFyZ3M6Jyk7XG4gIGluc3BlY3QoYXJncyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcmdzWydkZWZhdWx0Q2FwYWJpbGl0aWVzJ119IGNhcHNcbiAqL1xuZnVuY3Rpb24gbG9nRGVmYXVsdENhcGFiaWxpdGllc1dhcm5pbmcoY2Fwcykge1xuICBsb2dnZXIuaW5mbyhcbiAgICAnRGVmYXVsdCBjYXBhYmlsaXRpZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gZWFjaCByZXF1ZXN0ICcgK1xuICAgICAgJ3VubGVzcyBvdmVycmlkZGVuIGJ5IGRlc2lyZWQgY2FwYWJpbGl0aWVzOidcbiAgKTtcbiAgaW5zcGVjdChjYXBzKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1BhcnNlZEFyZ3N9IGFyZ3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9nU3RhcnR1cEluZm8oYXJncykge1xuICBsZXQgd2VsY29tZSA9IGBXZWxjb21lIHRvIEFwcGl1bSB2JHtBUFBJVU1fVkVSfWA7XG4gIGxldCBhcHBpdW1SZXYgPSBhd2FpdCBnZXRHaXRSZXYoKTtcbiAgaWYgKGFwcGl1bVJldikge1xuICAgIHdlbGNvbWUgKz0gYCAoUkVWICR7YXBwaXVtUmV2fSlgO1xuICB9XG4gIGxvZ2dlci5pbmZvKHdlbGNvbWUpO1xuXG4gIGxldCBzaG93QXJncyA9IGdldE5vbkRlZmF1bHRTZXJ2ZXJBcmdzKGFyZ3MpO1xuICBpZiAoXy5zaXplKHNob3dBcmdzKSkge1xuICAgIGxvZ05vbkRlZmF1bHRBcmdzV2FybmluZyhzaG93QXJncyk7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoYXJncy5kZWZhdWx0Q2FwYWJpbGl0aWVzKSkge1xuICAgIGxvZ0RlZmF1bHRDYXBhYmlsaXRpZXNXYXJuaW5nKGFyZ3MuZGVmYXVsdENhcGFiaWxpdGllcyk7XG4gIH1cbiAgLy8gVE9ETzogYnJpbmcgYmFjayBsb2dsZXZlbCByZXBvcnRpbmcgYmVsb3cgb25jZSBsb2dnZXIgaXMgZmx1c2hlZCBvdXRcbiAgLy8gbG9nZ2VyLmluZm8oJ0NvbnNvbGUgTG9nTGV2ZWw6ICcgKyBsb2dnZXIudHJhbnNwb3J0cy5jb25zb2xlLmxldmVsKTtcbiAgLy8gaWYgKGxvZ2dlci50cmFuc3BvcnRzLmZpbGUpIHtcbiAgLy8gICBsb2dnZXIuaW5mbygnRmlsZSBMb2dMZXZlbDogJyArIGxvZ2dlci50cmFuc3BvcnRzLmZpbGUubGV2ZWwpO1xuICAvLyB9XG59XG5cbi8qKlxuICogTG9ncyB0aGUgYWRkcmVzcyBhbmQgcG9ydCB0aGUgc2VydmVyIGlzIGxpc3RlbmluZyBvblxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBBZGRyZXNzXG4gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFBvcnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBsb2dTZXJ2ZXJQb3J0KGFkZHJlc3MsIHBvcnQpIHtcbiAgbGV0IGxvZ01lc3NhZ2UgPSBgQXBwaXVtIFJFU1QgaHR0cCBpbnRlcmZhY2UgbGlzdGVuZXIgc3RhcnRlZCBvbiBgICsgYCR7YWRkcmVzc306JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGxvZ01lc3NhZ2UpO1xufVxuXG4vKipcbiAqIEdldHMgYSBsaXN0IG9mIGB1cGRhdGVTZXJ2ZXJgIGZ1bmN0aW9ucyBmcm9tIGFsbCBleHRlbnNpb25zXG4gKiBAcGFyYW0ge0RyaXZlck5hbWVNYXB9IGRyaXZlckNsYXNzZXNcbiAqIEBwYXJhbSB7UGx1Z2luTmFtZU1hcH0gcGx1Z2luQ2xhc3Nlc1xuICogQHJldHVybnMge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlVwZGF0ZVNlcnZlckNhbGxiYWNrW119XG4gKi9cbmZ1bmN0aW9uIGdldFNlcnZlclVwZGF0ZXJzKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpIHtcbiAgcmV0dXJuIF8uY29tcGFjdChfLm1hcChbLi4uZHJpdmVyQ2xhc3Nlcy5rZXlzKCksIC4uLnBsdWdpbkNsYXNzZXMua2V5cygpXSwgJ3VwZGF0ZVNlcnZlcicpKTtcbn1cblxuLyoqXG4gKiBNYWtlcyBhIGJpZyBgTWV0aG9kTWFwYCBmcm9tIGFsbCB0aGUgbGl0dGxlIGBNZXRob2RNYXBgcyBpbiB0aGUgZXh0ZW5zaW9uc1xuICogQHBhcmFtIHtEcml2ZXJOYW1lTWFwfSBkcml2ZXJDbGFzc2VzXG4gKiBAcGFyYW0ge1BsdWdpbk5hbWVNYXB9IHBsdWdpbkNsYXNzZXNcbiAqIEByZXR1cm5zIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5NZXRob2RNYXB9XG4gKi9cbmZ1bmN0aW9uIGdldEV4dHJhTWV0aG9kTWFwKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpIHtcbiAgcmV0dXJuIFsuLi5kcml2ZXJDbGFzc2VzLmtleXMoKSwgLi4ucGx1Z2luQ2xhc3Nlcy5rZXlzKCldLnJlZHVjZShcbiAgICAobWFwLCBrbGFzcykgPT4gKHtcbiAgICAgIC4uLm1hcCxcbiAgICAgIC4uLihrbGFzcy5uZXdNZXRob2RNYXAgPz8ge30pLFxuICAgIH0pLFxuICAgIHt9XG4gICk7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPVdpdGhTZXJ2ZXJTdWJjb21tYW5kXVxuICogQHBhcmFtIHtBcmdzPFQ+fSBhcmdzXG4gKiBAcmV0dXJucyB7YXJncyBpcyBBcmdzPFdpdGhTZXJ2ZXJTdWJjb21tYW5kPn1cbiAqL1xuZnVuY3Rpb24gYXJlU2VydmVyQ29tbWFuZEFyZ3MoYXJncykge1xuICByZXR1cm4gYXJncy5zdWJjb21tYW5kID09PSBTRVJWRVJfU1VCQ09NTUFORDtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBBcHBpdW0sIGJ1dCBkb2VzIG5vdCBzdGFydCB0aGUgc2VydmVyLlxuICpcbiAqIFVzZSB0aGlzIHRvIGdldCBhdCB0aGUgY29uZmlndXJhdGlvbiBzY2hlbWEuXG4gKlxuICogSWYgYGFyZ3NgIGNvbnRhaW5zIGEgbm9uLWVtcHR5IGBzdWJjb21tYW5kYCB3aGljaCBpcyBub3QgYHNlcnZlcmAsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEBwYXJhbSB7QXJnczxUPn0gW2FyZ3NdIC0gUGFydGlhbCBhcmdzIChwcm9nYW1tYXRpYyB1c2FnZSBvbmx5KVxuICogQHJldHVybnMge1Byb21pc2U8U2VydmVySW5pdFJlc3VsdCB8IEV4dENvbW1hbmRJbml0UmVzdWx0Pn1cbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQge2luaXQsIGdldFNjaGVtYX0gZnJvbSAnYXBwaXVtJztcbiAqIGNvbnN0IG9wdGlvbnMgPSB7fTsgLy8gY29uZmlnIG9iamVjdFxuICogYXdhaXQgaW5pdChvcHRpb25zKTtcbiAqIGNvbnN0IHNjaGVtYSA9IGdldFNjaGVtYSgpOyAvLyBlbnRpcmUgY29uZmlnIHNjaGVtYSBpbmNsdWRpbmcgcGx1Z2lucyBhbmQgZHJpdmVyc1xuICovXG5hc3luYyBmdW5jdGlvbiBpbml0KGFyZ3MpIHtcbiAgY29uc3QgYXBwaXVtSG9tZSA9IGFyZ3M/LmFwcGl1bUhvbWUgPz8gKGF3YWl0IHJlc29sdmVBcHBpdW1Ib21lKCkpO1xuXG4gIGFkanVzdE5vZGVQYXRoKCk7XG5cbiAgY29uc3Qge2RyaXZlckNvbmZpZywgcGx1Z2luQ29uZmlnfSA9IGF3YWl0IGxvYWRFeHRlbnNpb25zKGFwcGl1bUhvbWUpO1xuXG4gIGNvbnN0IHBhcnNlciA9IGdldFBhcnNlcigpO1xuICBsZXQgdGhyb3dJbnN0ZWFkT2ZFeGl0ID0gZmFsc2U7XG4gIC8qKiBAdHlwZSB7QXJnczxUPn0gKi9cbiAgbGV0IHByZUNvbmZpZ0FyZ3M7XG5cbiAgaWYgKGFyZ3MpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGEgY29udGFpbmluZyBwYWNrYWdlIGluc3RlYWQgb2YgcnVubmluZyBhcyBhIENMSSBwcm9jZXNzLFxuICAgIC8vIHRoYXQgcGFja2FnZSBtaWdodCBub3QgYXBwcmVjaWF0ZSB1cyBjYWxsaW5nICdwcm9jZXNzLmV4aXQnIHdpbGx5LVxuICAgIC8vIG5pbGx5LCBzbyBnaXZlIGl0IHRoZSBvcHRpb24gdG8gaGF2ZSB1cyB0aHJvdyBpbnN0ZWFkIG9mIGV4aXRcbiAgICBpZiAoYXJncy50aHJvd0luc3RlYWRPZkV4aXQpIHtcbiAgICAgIHRocm93SW5zdGVhZE9mRXhpdCA9IHRydWU7XG4gICAgICAvLyBidXQgcmVtb3ZlIGl0IHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBzZXJ2ZXIgYXJnIHBlciBzZVxuICAgICAgZGVsZXRlIGFyZ3MudGhyb3dJbnN0ZWFkT2ZFeGl0O1xuICAgIH1cbiAgICBwcmVDb25maWdBcmdzID0gey4uLmFyZ3MsIHN1YmNvbW1hbmQ6IGFyZ3Muc3ViY29tbWFuZCA/PyBTRVJWRVJfU1VCQ09NTUFORH07XG4gIH0gZWxzZSB7XG4gICAgLy8gb3RoZXJ3aXNlIHBhcnNlIGZyb20gQ0xJXG4gICAgcHJlQ29uZmlnQXJncyA9IC8qKiBAdHlwZSB7QXJnczxUPn0gKi8gKHBhcnNlci5wYXJzZUFyZ3MoKSk7XG4gIH1cblxuICBjb25zdCBjb25maWdSZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShwcmVDb25maWdBcmdzLmNvbmZpZ0ZpbGUpO1xuXG4gIGlmICghXy5pc0VtcHR5KGNvbmZpZ1Jlc3VsdC5lcnJvcnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9ycyBpbiBjb25maWcgZmlsZSAke2NvbmZpZ1Jlc3VsdC5maWxlcGF0aH06XFxuICR7XG4gICAgICAgIGNvbmZpZ1Jlc3VsdC5yZWFzb24gPz8gY29uZmlnUmVzdWx0LmVycm9yc1xuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgLy8gbWVyZ2UgY29uZmlnIGFuZCBhcHBseSBkZWZhdWx0cy5cbiAgLy8gdGhlIG9yZGVyIG9mIHByZWNlbmRlY2UgaXM6XG4gIC8vIDEuIGNvbW1hbmQgbGluZSBhcmdzXG4gIC8vIDIuIGNvbmZpZyBmaWxlXG4gIC8vIDMuIGRlZmF1bHRzIGZyb20gY29uZmlnIGZpbGUuXG4gIGlmIChhcmVTZXJ2ZXJDb21tYW5kQXJncyhwcmVDb25maWdBcmdzKSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZ2V0RGVmYXVsdHNGb3JTY2hlbWEoZmFsc2UpO1xuXG4gICAgLyoqIEB0eXBlIHtQYXJzZWRBcmdzfSAqL1xuICAgIGNvbnN0IHNlcnZlckFyZ3MgPSBfLmRlZmF1bHRzRGVlcChwcmVDb25maWdBcmdzLCBjb25maWdSZXN1bHQuY29uZmlnPy5zZXJ2ZXIsIGRlZmF1bHRzKTtcblxuICAgIGlmIChwcmVDb25maWdBcmdzLnNob3dDb25maWcpIHtcbiAgICAgIHNob3dDb25maWcoZ2V0Tm9uRGVmYXVsdFNlcnZlckFyZ3MocHJlQ29uZmlnQXJncyksIGNvbmZpZ1Jlc3VsdCwgZGVmYXVsdHMsIHNlcnZlckFyZ3MpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGF3YWl0IGxvZ3NpbmtJbml0KHNlcnZlckFyZ3MpO1xuXG4gICAgaWYgKHNlcnZlckFyZ3MubG9nRmlsdGVycykge1xuICAgICAgY29uc3Qge2lzc3VlcywgcnVsZXN9ID0gYXdhaXQgbG9nRmFjdG9yeS5sb2FkU2VjdXJlVmFsdWVzUHJlcHJvY2Vzc2luZ1J1bGVzKFxuICAgICAgICBzZXJ2ZXJBcmdzLmxvZ0ZpbHRlcnNcbiAgICAgICk7XG4gICAgICBpZiAoIV8uaXNFbXB0eShpc3N1ZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIGxvZyBmaWx0ZXJpbmcgcnVsZXMgY29uZmlnICcke3NlcnZlckFyZ3MubG9nRmlsdGVyc30nIGhhcyBpc3N1ZXM6IGAgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaXNzdWVzLCBudWxsLCAyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eShydWxlcykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYEZvdW5kIG5vIGxvZyBmaWx0ZXJpbmcgcnVsZXMgaW4gJyR7c2VydmVyQXJncy5sb2dGaWx0ZXJzfScuIElzIHRoYXQgZXhwZWN0ZWQ/YFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYExvYWRlZCAke3V0aWwucGx1cmFsaXplKCdmaWx0ZXJpbmcgcnVsZScsIHJ1bGVzLmxlbmd0aCwgdHJ1ZSl9IGZyb20gJyR7XG4gICAgICAgICAgICBzZXJ2ZXJBcmdzLmxvZ0ZpbHRlcnNcbiAgICAgICAgICB9J2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcHBpdW1Ecml2ZXIgPSBuZXcgQXBwaXVtRHJpdmVyKHNlcnZlckFyZ3MpO1xuICAgIC8vIHNldCB0aGUgY29uZmlnIG9uIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIG1hdGNoIGRyaXZlcnMgdG8gY2Fwc1xuICAgIGFwcGl1bURyaXZlci5kcml2ZXJDb25maWcgPSBkcml2ZXJDb25maWc7XG4gICAgYXdhaXQgcHJlZmxpZ2h0Q2hlY2tzKHNlcnZlckFyZ3MsIHRocm93SW5zdGVhZE9mRXhpdCk7XG5cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTZXJ2ZXJJbml0UmVzdWx0fSAqLyAoe1xuICAgICAgYXBwaXVtRHJpdmVyLFxuICAgICAgcGFyc2VkQXJnczogc2VydmVyQXJncyxcbiAgICAgIGRyaXZlckNvbmZpZyxcbiAgICAgIHBsdWdpbkNvbmZpZyxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb25Db21tYW5kQXJncyA9IC8qKiBAdHlwZSB7QXJnczxpbXBvcnQoJ2FwcGl1bS90eXBlcycpLldpdGhFeHRTdWJjb21tYW5kPn0gKi8gKFxuICAgICAgcHJlQ29uZmlnQXJnc1xuICAgICk7XG4gICAgLy8gaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCB0aGUgJ2RyaXZlcicgQ0xJLCBkb24ndCBydW4gdGhlIG5vcm1hbCBzZXJ2ZXIsXG4gICAgLy8gYnV0IGluc3RlYWQgcGFzcyBjb250cm9sIHRvIHRoZSBkcml2ZXIgQ0xJXG4gICAgaWYgKHByZUNvbmZpZ0FyZ3Muc3ViY29tbWFuZCA9PT0gRFJJVkVSX1RZUEUpIHtcbiAgICAgIGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQoZXh0ZW5zaW9uQ29tbWFuZEFyZ3MsIGRyaXZlckNvbmZpZyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGlmIChwcmVDb25maWdBcmdzLnN1YmNvbW1hbmQgPT09IFBMVUdJTl9UWVBFKSB7XG4gICAgICBhd2FpdCBydW5FeHRlbnNpb25Db21tYW5kKGV4dGVuc2lvbkNvbW1hbmRBcmdzLCBwbHVnaW5Db25maWcpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB7fTsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlblxuICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgQXBwaXVtJ3MgY29uZmlnLiAgU3RhcnRzIHNlcnZlciBpZiBhcHByb3ByaWF0ZSBhbmQgcmVzb2x2ZXMgdGhlXG4gKiBzZXJ2ZXIgaW5zdGFuY2UgaWYgc287IG90aGVyd2lzZSByZXNvbHZlcyB3LyBgdW5kZWZpbmVkYC5cbiAqIEB0ZW1wbGF0ZSBbVD1XaXRoU2VydmVyU3ViY29tbWFuZF1cbiAqIEBwYXJhbSB7QXJnczxUPn0gW2FyZ3NdIC0gQXJndW1lbnRzIGZyb20gQ0xJIG9yIG90aGVyd2lzZVxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQXBwaXVtU2VydmVyfHVuZGVmaW5lZD59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1haW4oYXJncykge1xuICBjb25zdCB7YXBwaXVtRHJpdmVyLCBwYXJzZWRBcmdzLCBwbHVnaW5Db25maWcsIGRyaXZlckNvbmZpZ30gPSAvKiogQHR5cGUge1NlcnZlckluaXRSZXN1bHR9ICovIChcbiAgICBhd2FpdCBpbml0KGFyZ3MpXG4gICk7XG5cbiAgaWYgKCFhcHBpdW1Ecml2ZXIgfHwgIXBhcnNlZEFyZ3MgfHwgIXBsdWdpbkNvbmZpZyB8fCAhZHJpdmVyQ29uZmlnKSB7XG4gICAgLy8gaWYgdGhpcyBicmFuY2ggaXMgdGFrZW4sIHdlJ3ZlIHJ1biBhIGRpZmZlcmVudCBzdWJjb21tYW5kLCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAvLyBsZWZ0IHRvIGRvIGhlcmUuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGx1Z2luQ2xhc3NlcyA9IGdldEFjdGl2ZVBsdWdpbnMocGx1Z2luQ29uZmlnLCBwYXJzZWRBcmdzLnVzZVBsdWdpbnMpO1xuICAvLyBzZXQgdGhlIGFjdGl2ZSBwbHVnaW5zIG9uIHRoZSB1bWJyZWxsYSBkcml2ZXIgc28gaXQgY2FuIHVzZSB0aGVtIGZvciBjb21tYW5kc1xuICBhcHBpdW1Ecml2ZXIucGx1Z2luQ2xhc3NlcyA9IHBsdWdpbkNsYXNzZXM7XG5cbiAgYXdhaXQgbG9nU3RhcnR1cEluZm8ocGFyc2VkQXJncyk7XG4gIGxldCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gPSBtYWtlUm91dGVyKGFwcGl1bURyaXZlcik7XG5cbiAgY29uc3QgZHJpdmVyQ2xhc3NlcyA9IGdldEFjdGl2ZURyaXZlcnMoZHJpdmVyQ29uZmlnLCBwYXJzZWRBcmdzLnVzZURyaXZlcnMpO1xuICBjb25zdCBzZXJ2ZXJVcGRhdGVycyA9IGdldFNlcnZlclVwZGF0ZXJzKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuICBjb25zdCBleHRyYU1ldGhvZE1hcCA9IGdldEV4dHJhTWV0aG9kTWFwKGRyaXZlckNsYXNzZXMsIHBsdWdpbkNsYXNzZXMpO1xuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdAYXBwaXVtL2Jhc2UtZHJpdmVyJykuU2VydmVyT3B0c30gKi9cbiAgY29uc3Qgc2VydmVyT3B0cyA9IHtcbiAgICByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sXG4gICAgcG9ydDogcGFyc2VkQXJncy5wb3J0LFxuICAgIGhvc3RuYW1lOiBwYXJzZWRBcmdzLmFkZHJlc3MsXG4gICAgYWxsb3dDb3JzOiBwYXJzZWRBcmdzLmFsbG93Q29ycyxcbiAgICBiYXNlUGF0aDogcGFyc2VkQXJncy5iYXNlUGF0aCxcbiAgICBzZXJ2ZXJVcGRhdGVycyxcbiAgICBleHRyYU1ldGhvZE1hcCxcbiAgICBjbGlBcmdzOiBwYXJzZWRBcmdzLFxuICB9O1xuICBpZiAocGFyc2VkQXJncy5rZWVwQWxpdmVUaW1lb3V0KSB7XG4gICAgc2VydmVyT3B0cy5rZWVwQWxpdmVUaW1lb3V0ID0gcGFyc2VkQXJncy5rZWVwQWxpdmVUaW1lb3V0ICogMTAwMDtcbiAgfVxuICBsZXQgc2VydmVyO1xuICB0cnkge1xuICAgIHNlcnZlciA9IGF3YWl0IGJhc2VTZXJ2ZXIoc2VydmVyT3B0cyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgIGBDb3VsZCBub3QgY29uZmlndXJlIEFwcGl1bSBzZXJ2ZXIuIEl0J3MgcG9zc2libGUgdGhhdCBhIGRyaXZlciBvciBwbHVnaW4gdHJpZWQgYCArXG4gICAgICAgIGB0byB1cGRhdGUgdGhlIHNlcnZlciBhbmQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoZXJyLnN0YWNrKTtcbiAgICByZXR1cm4gcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKHBhcnNlZEFyZ3MuYWxsb3dDb3JzKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICAnWW91IGhhdmUgZW5hYmxlZCBDT1JTIHJlcXVlc3RzIGZyb20gYW55IGhvc3QuIEJlIGNhcmVmdWwgbm90ICcgK1xuICAgICAgICAndG8gdmlzaXQgc2l0ZXMgd2hpY2ggY291bGQgbWFsaWNpb3VzbHkgdHJ5IHRvIHN0YXJ0IEFwcGl1bSAnICtcbiAgICAgICAgJ3Nlc3Npb25zIG9uIHlvdXIgbWFjaGluZSdcbiAgICApO1xuICB9XG4gIGFwcGl1bURyaXZlci5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gIHRyeSB7XG4gICAgLy8gY29uZmlndXJlIGFzIG5vZGUgb24gZ3JpZCwgaWYgbmVjZXNzYXJ5XG4gICAgLy8gZmFsc3kgdmFsdWVzIHNob3VsZCBub3QgY2F1c2UgdGhpcyB0byBydW5cbiAgICBpZiAocGFyc2VkQXJncy5ub2RlY29uZmlnKSB7XG4gICAgICBhd2FpdCByZWdpc3Rlck5vZGUoXG4gICAgICAgIHBhcnNlZEFyZ3Mubm9kZWNvbmZpZyxcbiAgICAgICAgcGFyc2VkQXJncy5hZGRyZXNzLFxuICAgICAgICBwYXJzZWRBcmdzLnBvcnQsXG4gICAgICAgIHBhcnNlZEFyZ3MuYmFzZVBhdGhcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJ10pIHtcbiAgICBwcm9jZXNzLm9uY2Uoc2lnbmFsLCBhc3luYyBmdW5jdGlvbiBvblNpZ25hbCgpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZWNlaXZlZCAke3NpZ25hbH0gLSBzaHV0dGluZyBkb3duYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhcHBpdW1Ecml2ZXIuZGVsZXRlQWxsU2Vzc2lvbnMoe1xuICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgIHJlYXNvbjogYFRoZSBwcm9jZXNzIGhhcyByZWNlaXZlZCAke3NpZ25hbH0gc2lnbmFsYCxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGUpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2dTZXJ2ZXJQb3J0KHBhcnNlZEFyZ3MuYWRkcmVzcywgcGFyc2VkQXJncy5wb3J0KTtcbiAgZHJpdmVyQ29uZmlnLnByaW50KCk7XG4gIHBsdWdpbkNvbmZpZy5wcmludChbLi4ucGx1Z2luQ2xhc3Nlcy52YWx1ZXMoKV0pO1xuXG4gIHJldHVybiBzZXJ2ZXI7XG59XG5cbi8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdCBmb3IgYW55IHNjcmlwdHMgcmVmZXJlbmNpbmcgYG1haW4uanNgIGRpcmVjdGx5XG4vLyAobW9yZSBzcGVjaWZpY2FsbHksIGBidWlsZC9saWIvbWFpbi5qc2ApXG4vLyB0aGUgZXhlY3V0YWJsZSBpcyBub3cgYC4uL2luZGV4LmpzYCwgc28gdGhhdCBtb2R1bGUgd2lsbCB0eXBpY2FsbHkgYmUgYHJlcXVpcmUubWFpbmAuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgYXN5bmNpZnkobWFpbik7XG59XG5cbi8vIGV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSBpcyBpbnRlbmRlZCB0byBiZSBhIHB1YmxpYyBBUEkuXG5leHBvcnQge3JlYWRDb25maWdGaWxlfSBmcm9tICcuL2NvbmZpZy1maWxlJztcbmV4cG9ydCB7ZmluYWxpemVTY2hlbWEsIGdldFNjaGVtYSwgdmFsaWRhdGV9IGZyb20gJy4vc2NoZW1hL3NjaGVtYSc7XG5leHBvcnQge21haW4sIGluaXQsIHJlc29sdmVBcHBpdW1Ib21lfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyVHlwZX0gRHJpdmVyVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5Ecml2ZXJDbGFzc30gRHJpdmVyQ2xhc3NcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5QbHVnaW5DbGFzc30gUGx1Z2luQ2xhc3NcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLldpdGhTZXJ2ZXJTdWJjb21tYW5kfSBXaXRoU2VydmVyU3ViY29tbWFuZFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi9leHRlbnNpb24nKS5Ecml2ZXJOYW1lTWFwfSBEcml2ZXJOYW1lTWFwXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2V4dGVuc2lvbicpLlBsdWdpbk5hbWVNYXB9IFBsdWdpbk5hbWVNYXBcbiAqL1xuXG4vKipcbiAqIExpdGVyYWxseSBhbiBlbXB0eSBvYmplY3RcbiAqIEB0eXBlZGVmIHsge30gfSBFeHRDb21tYW5kSW5pdFJlc3VsdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VydmVySW5pdERhdGFcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCcuL2FwcGl1bScpLkFwcGl1bURyaXZlcn0gYXBwaXVtRHJpdmVyIC0gVGhlIEFwcGl1bSBkcml2ZXJcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5QYXJzZWRBcmdzfSBwYXJzZWRBcmdzIC0gVGhlIHBhcnNlZCBhcmd1bWVudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtTZXJ2ZXJJbml0RGF0YSAmIGltcG9ydCgnLi9leHRlbnNpb24nKS5FeHRlbnNpb25Db25maWdzfSBTZXJ2ZXJJbml0UmVzdWx0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9V2l0aFNlcnZlclN1YmNvbW1hbmRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5BcmdzPFQ+fSBBcmdzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9V2l0aFNlcnZlclN1YmNvbW1hbmRdXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5QYXJzZWRBcmdzPFQ+fSBQYXJzZWRBcmdzXG4gKi9cbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQVdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTTtFQUFDQTtBQUFELElBQXNCQyxZQUE1Qjs7O0FBT0EsZUFBZUMsZUFBZixDQUErQkMsSUFBL0IsRUFBcUNDLGtCQUFrQixHQUFHLEtBQTFELEVBQWlFO0VBQy9ELElBQUk7SUFDRixJQUFBQyxtQkFBQTtJQUNBLE1BQU0sSUFBQUMsa0JBQUEsR0FBTjs7SUFDQSxJQUFJSCxJQUFJLENBQUNJLGNBQVQsRUFBeUI7TUFDdkJDLE9BQU8sQ0FBQyxVQUFELENBQVAsQ0FBb0JDLGlCQUFwQixHQUF3QyxDQUFDLENBQXpDO0lBQ0Q7O0lBQ0QsSUFBSU4sSUFBSSxDQUFDTyxhQUFULEVBQXdCO01BQ3RCLE1BQU0sSUFBQUEscUJBQUEsR0FBTjtNQUNBQyxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO0lBQ0Q7O0lBQ0QsSUFBQUMsNEJBQUE7SUFFQSxJQUFBQyxnQkFBQSxFQUFTWCxJQUFUOztJQUVBLElBQUlBLElBQUksQ0FBQ1ksTUFBVCxFQUFpQjtNQUNmLE1BQU0sSUFBQUMsc0JBQUEsRUFBZWIsSUFBSSxDQUFDWSxNQUFwQixDQUFOO0lBQ0Q7RUFDRixDQWpCRCxDQWlCRSxPQUFPRSxHQUFQLEVBQVk7SUFDWkMsZUFBQSxDQUFPQyxLQUFQLENBQWFGLEdBQUcsQ0FBQ0csT0FBSixDQUFZQyxHQUF6Qjs7SUFDQSxJQUFJakIsa0JBQUosRUFBd0I7TUFDdEIsTUFBTWEsR0FBTjtJQUNEOztJQUVETixPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO0VBQ0Q7QUFDRjs7QUFLRCxTQUFTVSx3QkFBVCxDQUFrQ25CLElBQWxDLEVBQXdDO0VBQ3RDZSxlQUFBLENBQU9LLElBQVAsQ0FBWSwwQkFBWjs7RUFDQSxJQUFBQyxjQUFBLEVBQVFyQixJQUFSO0FBQ0Q7O0FBS0QsU0FBU3NCLDZCQUFULENBQXVDQyxJQUF2QyxFQUE2QztFQUMzQ1IsZUFBQSxDQUFPSyxJQUFQLENBQ0UsK0RBQ0UsNENBRko7O0VBSUEsSUFBQUMsY0FBQSxFQUFRRSxJQUFSO0FBQ0Q7O0FBS0QsZUFBZUMsY0FBZixDQUE4QnhCLElBQTlCLEVBQW9DO0VBQ2xDLElBQUl5QixPQUFPLEdBQUksc0JBQXFCQyxrQkFBVyxFQUEvQztFQUNBLElBQUlDLFNBQVMsR0FBRyxNQUFNLElBQUFDLGlCQUFBLEdBQXRCOztFQUNBLElBQUlELFNBQUosRUFBZTtJQUNiRixPQUFPLElBQUssU0FBUUUsU0FBVSxHQUE5QjtFQUNEOztFQUNEWixlQUFBLENBQU9LLElBQVAsQ0FBWUssT0FBWjs7RUFFQSxJQUFJSSxRQUFRLEdBQUcsSUFBQUMsK0JBQUEsRUFBd0I5QixJQUF4QixDQUFmOztFQUNBLElBQUkrQixlQUFBLENBQUVDLElBQUYsQ0FBT0gsUUFBUCxDQUFKLEVBQXNCO0lBQ3BCVix3QkFBd0IsQ0FBQ1UsUUFBRCxDQUF4QjtFQUNEOztFQUNELElBQUksQ0FBQ0UsZUFBQSxDQUFFRSxPQUFGLENBQVVqQyxJQUFJLENBQUNrQyxtQkFBZixDQUFMLEVBQTBDO0lBQ3hDWiw2QkFBNkIsQ0FBQ3RCLElBQUksQ0FBQ2tDLG1CQUFOLENBQTdCO0VBQ0Q7QUFNRjs7QUFRRCxTQUFTQyxhQUFULENBQXVCQyxPQUF2QixFQUFnQ0MsSUFBaEMsRUFBc0M7RUFDcEMsSUFBSUMsVUFBVSxHQUFJLGlEQUFELEdBQXFELEdBQUVGLE9BQVEsSUFBR0MsSUFBSyxFQUF4Rjs7RUFDQXRCLGVBQUEsQ0FBT0ssSUFBUCxDQUFZa0IsVUFBWjtBQUNEOztBQVFELFNBQVNDLGlCQUFULENBQTJCQyxhQUEzQixFQUEwQ0MsYUFBMUMsRUFBeUQ7RUFDdkQsT0FBT1YsZUFBQSxDQUFFVyxPQUFGLENBQVVYLGVBQUEsQ0FBRVksR0FBRixDQUFNLENBQUMsR0FBR0gsYUFBYSxDQUFDSSxJQUFkLEVBQUosRUFBMEIsR0FBR0gsYUFBYSxDQUFDRyxJQUFkLEVBQTdCLENBQU4sRUFBMEQsY0FBMUQsQ0FBVixDQUFQO0FBQ0Q7O0FBUUQsU0FBU0MsaUJBQVQsQ0FBMkJMLGFBQTNCLEVBQTBDQyxhQUExQyxFQUF5RDtFQUN2RCxPQUFPLENBQUMsR0FBR0QsYUFBYSxDQUFDSSxJQUFkLEVBQUosRUFBMEIsR0FBR0gsYUFBYSxDQUFDRyxJQUFkLEVBQTdCLEVBQW1ERSxNQUFuRCxDQUNMLENBQUNILEdBQUQsRUFBTUksS0FBTixNQUFpQixFQUNmLEdBQUdKLEdBRFk7SUFFZixJQUFJSSxLQUFLLENBQUNDLFlBQU4sSUFBc0IsRUFBMUI7RUFGZSxDQUFqQixDQURLLEVBS0wsRUFMSyxDQUFQO0FBT0Q7O0FBT0QsU0FBU0Msb0JBQVQsQ0FBOEJqRCxJQUE5QixFQUFvQztFQUNsQyxPQUFPQSxJQUFJLENBQUNrRCxVQUFMLEtBQW9CQyw0QkFBM0I7QUFDRDs7QUFrQkQsZUFBZUMsSUFBZixDQUFvQnBELElBQXBCLEVBQTBCO0VBQ3hCLE1BQU1xRCxVQUFVLEdBQUcsQ0FBQXJELElBQUksU0FBSixJQUFBQSxJQUFJLFdBQUosWUFBQUEsSUFBSSxDQUFFcUQsVUFBTixNQUFxQixNQUFNeEQsaUJBQWlCLEVBQTVDLENBQW5CO0VBRUEsSUFBQXlELHFCQUFBO0VBRUEsTUFBTTtJQUFDQyxZQUFEO0lBQWVDO0VBQWYsSUFBK0IsTUFBTSxJQUFBQywwQkFBQSxFQUFlSixVQUFmLENBQTNDO0VBRUEsTUFBTUssTUFBTSxHQUFHLElBQUFDLGlCQUFBLEdBQWY7RUFDQSxJQUFJMUQsa0JBQWtCLEdBQUcsS0FBekI7RUFFQSxJQUFJMkQsYUFBSjs7RUFFQSxJQUFJNUQsSUFBSixFQUFVO0lBSVIsSUFBSUEsSUFBSSxDQUFDQyxrQkFBVCxFQUE2QjtNQUMzQkEsa0JBQWtCLEdBQUcsSUFBckI7TUFFQSxPQUFPRCxJQUFJLENBQUNDLGtCQUFaO0lBQ0Q7O0lBQ0QyRCxhQUFhLEdBQUcsRUFBQyxHQUFHNUQsSUFBSjtNQUFVa0QsVUFBVSxFQUFFbEQsSUFBSSxDQUFDa0QsVUFBTCxJQUFtQkM7SUFBekMsQ0FBaEI7RUFDRCxDQVZELE1BVU87SUFFTFMsYUFBYSxHQUEyQkYsTUFBTSxDQUFDRyxTQUFQLEVBQXhDO0VBQ0Q7O0VBRUQsTUFBTUMsWUFBWSxHQUFHLE1BQU0sSUFBQUMsMEJBQUEsRUFBZUgsYUFBYSxDQUFDSSxVQUE3QixDQUEzQjs7RUFFQSxJQUFJLENBQUNqQyxlQUFBLENBQUVFLE9BQUYsQ0FBVTZCLFlBQVksQ0FBQ0csTUFBdkIsQ0FBTCxFQUFxQztJQUNuQyxNQUFNLElBQUlDLEtBQUosQ0FDSCx5QkFBd0JKLFlBQVksQ0FBQ0ssUUFBUyxPQUM3Q0wsWUFBWSxDQUFDTSxNQUFiLElBQXVCTixZQUFZLENBQUNHLE1BQ3JDLEVBSEcsQ0FBTjtFQUtEOztFQU9ELElBQUloQixvQkFBb0IsQ0FBQ1csYUFBRCxDQUF4QixFQUF5QztJQUFBOztJQUN2QyxNQUFNUyxRQUFRLEdBQUcsSUFBQUMsNEJBQUEsRUFBcUIsS0FBckIsQ0FBakI7O0lBR0EsTUFBTUMsVUFBVSxHQUFHeEMsZUFBQSxDQUFFeUMsWUFBRixDQUFlWixhQUFmLDBCQUE4QkUsWUFBWSxDQUFDVyxNQUEzQyx5REFBOEIscUJBQXFCQyxNQUFuRCxFQUEyREwsUUFBM0QsQ0FBbkI7O0lBRUEsSUFBSVQsYUFBYSxDQUFDZSxVQUFsQixFQUE4QjtNQUM1QixJQUFBQSxrQkFBQSxFQUFXLElBQUE3QywrQkFBQSxFQUF3QjhCLGFBQXhCLENBQVgsRUFBbURFLFlBQW5ELEVBQWlFTyxRQUFqRSxFQUEyRUUsVUFBM0U7TUFDQSxPQUFPLEVBQVA7SUFDRDs7SUFFRCxNQUFNLElBQUFLLGFBQUEsRUFBWUwsVUFBWixDQUFOOztJQUVBLElBQUlBLFVBQVUsQ0FBQ00sVUFBZixFQUEyQjtNQUN6QixNQUFNO1FBQUNDLE1BQUQ7UUFBU0M7TUFBVCxJQUFrQixNQUFNQyxlQUFBLENBQVdDLGtDQUFYLENBQzVCVixVQUFVLENBQUNNLFVBRGlCLENBQTlCOztNQUdBLElBQUksQ0FBQzlDLGVBQUEsQ0FBRUUsT0FBRixDQUFVNkMsTUFBVixDQUFMLEVBQXdCO1FBQ3RCLE1BQU0sSUFBSVosS0FBSixDQUNILG1DQUFrQ0ssVUFBVSxDQUFDTSxVQUFXLGdCQUF6RCxHQUNFSyxJQUFJLENBQUNDLFNBQUwsQ0FBZUwsTUFBZixFQUF1QixJQUF2QixFQUE2QixDQUE3QixDQUZFLENBQU47TUFJRDs7TUFDRCxJQUFJL0MsZUFBQSxDQUFFRSxPQUFGLENBQVU4QyxLQUFWLENBQUosRUFBc0I7UUFDcEJoRSxlQUFBLENBQU9xRSxJQUFQLENBQ0csb0NBQW1DYixVQUFVLENBQUNNLFVBQVcsc0JBRDVEO01BR0QsQ0FKRCxNQUlPO1FBQ0w5RCxlQUFBLENBQU9LLElBQVAsQ0FDRyxVQUFTaUUsYUFBQSxDQUFLQyxTQUFMLENBQWUsZ0JBQWYsRUFBaUNQLEtBQUssQ0FBQ1EsTUFBdkMsRUFBK0MsSUFBL0MsQ0FBcUQsVUFDN0RoQixVQUFVLENBQUNNLFVBQ1osR0FISDtNQUtEO0lBQ0Y7O0lBRUQsTUFBTVcsWUFBWSxHQUFHLElBQUlDLG9CQUFKLENBQWlCbEIsVUFBakIsQ0FBckI7SUFFQWlCLFlBQVksQ0FBQ2pDLFlBQWIsR0FBNEJBLFlBQTVCO0lBQ0EsTUFBTXhELGVBQWUsQ0FBQ3dFLFVBQUQsRUFBYXRFLGtCQUFiLENBQXJCO0lBRUEsT0FBd0M7TUFDdEN1RixZQURzQztNQUV0Q0UsVUFBVSxFQUFFbkIsVUFGMEI7TUFHdENoQixZQUhzQztNQUl0Q0M7SUFKc0MsQ0FBeEM7RUFNRCxDQS9DRCxNQStDTztJQUNMLE1BQU1tQyxvQkFBb0IsR0FDeEIvQixhQURGOztJQUtBLElBQUlBLGFBQWEsQ0FBQ1YsVUFBZCxLQUE2QjBDLHNCQUFqQyxFQUE4QztNQUM1QyxNQUFNLElBQUFDLDhCQUFBLEVBQW9CRixvQkFBcEIsRUFBMENwQyxZQUExQyxDQUFOO01BQ0EsT0FBTyxFQUFQO0lBQ0Q7O0lBQ0QsSUFBSUssYUFBYSxDQUFDVixVQUFkLEtBQTZCNEMsc0JBQWpDLEVBQThDO01BQzVDLE1BQU0sSUFBQUQsOEJBQUEsRUFBb0JGLG9CQUFwQixFQUEwQ25DLFlBQTFDLENBQU47TUFDQSxPQUFPLEVBQVA7SUFDRDs7SUFFRCxPQUFPLEVBQVA7RUFDRDtBQUNGOztBQVNELGVBQWV1QyxJQUFmLENBQW9CL0YsSUFBcEIsRUFBMEI7RUFDeEIsTUFBTTtJQUFDd0YsWUFBRDtJQUFlRSxVQUFmO0lBQTJCbEMsWUFBM0I7SUFBeUNEO0VBQXpDLElBQ0osTUFBTUgsSUFBSSxDQUFDcEQsSUFBRCxDQURaOztFQUlBLElBQUksQ0FBQ3dGLFlBQUQsSUFBaUIsQ0FBQ0UsVUFBbEIsSUFBZ0MsQ0FBQ2xDLFlBQWpDLElBQWlELENBQUNELFlBQXRELEVBQW9FO0lBR2xFO0VBQ0Q7O0VBRUQsTUFBTWQsYUFBYSxHQUFHLElBQUF1RCw0QkFBQSxFQUFpQnhDLFlBQWpCLEVBQStCa0MsVUFBVSxDQUFDTyxVQUExQyxDQUF0QjtFQUVBVCxZQUFZLENBQUMvQyxhQUFiLEdBQTZCQSxhQUE3QjtFQUVBLE1BQU1qQixjQUFjLENBQUNrRSxVQUFELENBQXBCO0VBQ0EsSUFBSVEsd0JBQXdCLEdBQUcsSUFBQUMsb0NBQUEsRUFBV1gsWUFBWCxDQUEvQjtFQUVBLE1BQU1oRCxhQUFhLEdBQUcsSUFBQTRELDRCQUFBLEVBQWlCN0MsWUFBakIsRUFBK0JtQyxVQUFVLENBQUNXLFVBQTFDLENBQXRCO0VBQ0EsTUFBTUMsY0FBYyxHQUFHL0QsaUJBQWlCLENBQUNDLGFBQUQsRUFBZ0JDLGFBQWhCLENBQXhDO0VBQ0EsTUFBTThELGNBQWMsR0FBRzFELGlCQUFpQixDQUFDTCxhQUFELEVBQWdCQyxhQUFoQixDQUF4QztFQUdBLE1BQU0rRCxVQUFVLEdBQUc7SUFDakJOLHdCQURpQjtJQUVqQjdELElBQUksRUFBRXFELFVBQVUsQ0FBQ3JELElBRkE7SUFHakJvRSxRQUFRLEVBQUVmLFVBQVUsQ0FBQ3RELE9BSEo7SUFJakJzRSxTQUFTLEVBQUVoQixVQUFVLENBQUNnQixTQUpMO0lBS2pCQyxRQUFRLEVBQUVqQixVQUFVLENBQUNpQixRQUxKO0lBTWpCTCxjQU5pQjtJQU9qQkMsY0FQaUI7SUFRakJLLE9BQU8sRUFBRWxCO0VBUlEsQ0FBbkI7O0VBVUEsSUFBSUEsVUFBVSxDQUFDbUIsZ0JBQWYsRUFBaUM7SUFDL0JMLFVBQVUsQ0FBQ0ssZ0JBQVgsR0FBOEJuQixVQUFVLENBQUNtQixnQkFBWCxHQUE4QixJQUE1RDtFQUNEOztFQUNELElBQUluQyxNQUFKOztFQUNBLElBQUk7SUFDRkEsTUFBTSxHQUFHLE1BQU0sSUFBQW9DLGtCQUFBLEVBQVdOLFVBQVgsQ0FBZjtFQUNELENBRkQsQ0FFRSxPQUFPMUYsR0FBUCxFQUFZO0lBQ1pDLGVBQUEsQ0FBT0MsS0FBUCxDQUNHLGlGQUFELEdBQ0csb0RBQW1ERixHQUFHLENBQUNHLE9BQVEsRUFGcEU7O0lBSUFGLGVBQUEsQ0FBT2dHLEtBQVAsQ0FBYWpHLEdBQUcsQ0FBQ2tHLEtBQWpCOztJQUNBLE9BQU94RyxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiLENBQVA7RUFDRDs7RUFFRCxJQUFJaUYsVUFBVSxDQUFDZ0IsU0FBZixFQUEwQjtJQUN4QjNGLGVBQUEsQ0FBT3FFLElBQVAsQ0FDRSxrRUFDRSw2REFERixHQUVFLDBCQUhKO0VBS0Q7O0VBQ0RJLFlBQVksQ0FBQ2QsTUFBYixHQUFzQkEsTUFBdEI7O0VBQ0EsSUFBSTtJQUdGLElBQUlnQixVQUFVLENBQUN1QixVQUFmLEVBQTJCO01BQ3pCLE1BQU0sSUFBQUMscUJBQUEsRUFDSnhCLFVBQVUsQ0FBQ3VCLFVBRFAsRUFFSnZCLFVBQVUsQ0FBQ3RELE9BRlAsRUFHSnNELFVBQVUsQ0FBQ3JELElBSFAsRUFJSnFELFVBQVUsQ0FBQ2lCLFFBSlAsQ0FBTjtJQU1EO0VBQ0YsQ0FYRCxDQVdFLE9BQU83RixHQUFQLEVBQVk7SUFDWixNQUFNNEQsTUFBTSxDQUFDeUMsS0FBUCxFQUFOO0lBQ0EsTUFBTXJHLEdBQU47RUFDRDs7RUFFRCxLQUFLLE1BQU1zRyxNQUFYLElBQXFCLENBQUMsUUFBRCxFQUFXLFNBQVgsQ0FBckIsRUFBNEM7SUFDMUM1RyxPQUFPLENBQUM2RyxJQUFSLENBQWFELE1BQWIsRUFBcUIsZUFBZUUsUUFBZixHQUEwQjtNQUM3Q3ZHLGVBQUEsQ0FBT0ssSUFBUCxDQUFhLFlBQVdnRyxNQUFPLGtCQUEvQjs7TUFDQSxJQUFJO1FBQ0YsTUFBTTVCLFlBQVksQ0FBQytCLGlCQUFiLENBQStCO1VBQ25DQyxLQUFLLEVBQUUsSUFENEI7VUFFbkNwRCxNQUFNLEVBQUcsNEJBQTJCZ0QsTUFBTztRQUZSLENBQS9CLENBQU47UUFJQSxNQUFNMUMsTUFBTSxDQUFDeUMsS0FBUCxFQUFOO1FBQ0EzRyxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO01BQ0QsQ0FQRCxDQU9FLE9BQU9nSCxDQUFQLEVBQVU7UUFDVjFHLGVBQUEsQ0FBT3FFLElBQVAsQ0FBWXFDLENBQVo7O1FBQ0FqSCxPQUFPLENBQUNDLElBQVIsQ0FBYSxDQUFiO01BQ0Q7SUFDRixDQWJEO0VBY0Q7O0VBRUQwQixhQUFhLENBQUN1RCxVQUFVLENBQUN0RCxPQUFaLEVBQXFCc0QsVUFBVSxDQUFDckQsSUFBaEMsQ0FBYjtFQUNBa0IsWUFBWSxDQUFDbUUsS0FBYjtFQUNBbEUsWUFBWSxDQUFDa0UsS0FBYixDQUFtQixDQUFDLEdBQUdqRixhQUFhLENBQUNrRixNQUFkLEVBQUosQ0FBbkI7RUFFQSxPQUFPakQsTUFBUDtBQUNEOztBQUtELElBQUlyRSxPQUFPLENBQUMwRixJQUFSLEtBQWlCNkIsTUFBckIsRUFBNkI7RUFDM0IsSUFBQUMsa0JBQUEsRUFBUzlCLElBQVQ7QUFDRCJ9
318
+ // everything below here is intended to be a public API.
319
+ var config_file_2 = require("./config-file");
320
+ Object.defineProperty(exports, "readConfigFile", { enumerable: true, get: function () { return config_file_2.readConfigFile; } });
321
+ var schema_2 = require("./schema/schema");
322
+ Object.defineProperty(exports, "finalizeSchema", { enumerable: true, get: function () { return schema_2.finalizeSchema; } });
323
+ Object.defineProperty(exports, "getSchema", { enumerable: true, get: function () { return schema_2.getSchema; } });
324
+ Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return schema_2.validate; } });
325
+ /**
326
+ * @typedef {import('@appium/types').DriverType} DriverType
327
+ * @typedef {import('@appium/types').PluginType} PluginType
328
+ * @typedef {import('@appium/types').DriverClass} DriverClass
329
+ * @typedef {import('@appium/types').PluginClass} PluginClass
330
+ * @typedef {import('appium/types').CliCommand} CliCommand
331
+ * @typedef {import('appium/types').CliExtensionSubcommand} CliExtensionSubcommand
332
+ * @typedef {import('appium/types').CliExtensionCommand} CliExtensionCommand
333
+ * @typedef {import('appium/types').ServerCommand} ServerCommand
334
+ * @typedef {import('appium/types').DriverCommand} DriverCommand
335
+ * @typedef {import('appium/types').PluginCommand} PluginCommand
336
+ * @typedef {import('./extension').DriverNameMap} DriverNameMap
337
+ * @typedef {import('./extension').PluginNameMap} PluginNameMap
338
+ */
339
+ /**
340
+ * Literally an empty object
341
+ * @typedef { {} } ExtCommandInitResult
342
+ */
343
+ /**
344
+ * @typedef ServerInitData
345
+ * @property {import('./appium').AppiumDriver} appiumDriver - The Appium driver
346
+ * @property {import('appium/types').ParsedArgs} parsedArgs - The parsed arguments
347
+ */
348
+ /**
349
+ * @template {CliCommand} Cmd
350
+ * @typedef {Cmd extends ServerCommand ? ServerInitData & import('./extension').ExtensionConfigs : ExtCommandInitResult} InitResult
351
+ */
352
+ /**
353
+ * @template {CliCommand} [Cmd=ServerCommand]
354
+ * @template {CliExtensionSubcommand|void} [SubCmd=void]
355
+ * @typedef {import('appium/types').Args<Cmd, SubCmd>} Args
356
+ */
357
+ /**
358
+ * @template {CliCommand} [Cmd=ServerCommand]
359
+ * @template {CliExtensionSubcommand|void} [SubCmd=void]
360
+ * @typedef {import('appium/types').ParsedArgs<Cmd, SubCmd>} ParsedArgs
361
+ */
362
+ //# sourceMappingURL=main.js.map