appium 2.0.0-beta.3 → 2.0.0-beta.30

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 (139) hide show
  1. package/README.md +10 -11
  2. package/build/lib/appium.d.ts +215 -0
  3. package/build/lib/appium.d.ts.map +1 -0
  4. package/build/lib/appium.js +238 -132
  5. package/build/lib/cli/args.d.ts +20 -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 +36 -0
  9. package/build/lib/cli/driver-command.d.ts.map +1 -0
  10. package/build/lib/cli/driver-command.js +19 -12
  11. package/build/lib/cli/extension-command.d.ts +345 -0
  12. package/build/lib/cli/extension-command.d.ts.map +1 -0
  13. package/build/lib/cli/extension-command.js +171 -96
  14. package/build/lib/cli/extension.d.ts +14 -0
  15. package/build/lib/cli/extension.d.ts.map +1 -0
  16. package/build/lib/cli/extension.js +31 -16
  17. package/build/lib/cli/parser.d.ts +79 -0
  18. package/build/lib/cli/parser.d.ts.map +1 -0
  19. package/build/lib/cli/parser.js +152 -95
  20. package/build/lib/cli/plugin-command.d.ts +39 -0
  21. package/build/lib/cli/plugin-command.d.ts.map +1 -0
  22. package/build/lib/cli/plugin-command.js +18 -13
  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 +40 -0
  30. package/build/lib/config.d.ts.map +1 -0
  31. package/build/lib/config.js +92 -67
  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 +84 -0
  36. package/build/lib/extension/driver-config.d.ts.map +1 -0
  37. package/build/lib/extension/driver-config.js +190 -0
  38. package/build/lib/extension/extension-config.d.ts +170 -0
  39. package/build/lib/extension/extension-config.d.ts.map +1 -0
  40. package/build/lib/extension/extension-config.js +297 -0
  41. package/build/lib/extension/index.d.ts +39 -0
  42. package/build/lib/extension/index.d.ts.map +1 -0
  43. package/build/lib/extension/index.js +77 -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 +246 -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 +68 -0
  50. package/build/lib/extension/plugin-config.d.ts +62 -0
  51. package/build/lib/extension/plugin-config.d.ts.map +1 -0
  52. package/build/lib/extension/plugin-config.js +87 -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 +12 -16
  62. package/build/lib/main.d.ts +51 -0
  63. package/build/lib/main.d.ts.map +1 -0
  64. package/build/lib/main.js +174 -82
  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 +180 -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 +452 -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/index.js +11 -0
  88. package/lib/appium-config.schema.json +278 -0
  89. package/lib/appium.js +398 -155
  90. package/lib/cli/args.js +174 -377
  91. package/lib/cli/driver-command.js +22 -7
  92. package/lib/cli/extension-command.js +372 -177
  93. package/lib/cli/extension.js +32 -10
  94. package/lib/cli/parser.js +252 -83
  95. package/lib/cli/plugin-command.js +19 -6
  96. package/lib/cli/utils.js +22 -2
  97. package/lib/config-file.js +223 -0
  98. package/lib/config.js +169 -69
  99. package/lib/constants.js +78 -0
  100. package/lib/extension/driver-config.js +249 -0
  101. package/lib/extension/extension-config.js +458 -0
  102. package/lib/extension/index.js +102 -0
  103. package/lib/extension/manifest.js +486 -0
  104. package/lib/extension/package-changed.js +63 -0
  105. package/lib/extension/plugin-config.js +113 -0
  106. package/lib/grid-register.js +25 -22
  107. package/lib/logger.js +1 -1
  108. package/lib/logsink.js +14 -7
  109. package/lib/main.js +233 -83
  110. package/lib/schema/arg-spec.js +232 -0
  111. package/lib/schema/cli-args.js +261 -0
  112. package/lib/schema/cli-transformers.js +122 -0
  113. package/lib/schema/index.js +2 -0
  114. package/lib/schema/keywords.js +134 -0
  115. package/lib/schema/schema.js +734 -0
  116. package/lib/utils.js +85 -129
  117. package/package.json +62 -85
  118. package/scripts/postinstall.js +71 -0
  119. package/types/appium-manifest.d.ts +61 -0
  120. package/types/cli.d.ts +134 -0
  121. package/types/extension.d.ts +56 -0
  122. package/types/external-manifest.d.ts +58 -0
  123. package/types/index.d.ts +7 -0
  124. package/CHANGELOG.md +0 -3515
  125. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  126. package/build/lib/cli/npm.js +0 -206
  127. package/build/lib/cli/parser-helpers.js +0 -82
  128. package/build/lib/driver-config.js +0 -77
  129. package/build/lib/drivers.js +0 -96
  130. package/build/lib/extension-config.js +0 -251
  131. package/build/lib/plugin-config.js +0 -59
  132. package/build/lib/plugins.js +0 -14
  133. package/lib/cli/npm.js +0 -183
  134. package/lib/cli/parser-helpers.js +0 -79
  135. package/lib/driver-config.js +0 -46
  136. package/lib/drivers.js +0 -81
  137. package/lib/extension-config.js +0 -208
  138. package/lib/plugin-config.js +0 -34
  139. package/lib/plugins.js +0 -10
@@ -0,0 +1,297 @@
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 _path = _interopRequireDefault(require("path"));
15
+
16
+ var _resolveFrom = _interopRequireDefault(require("resolve-from"));
17
+
18
+ var _logger = _interopRequireDefault(require("../logger"));
19
+
20
+ var _schema = require("../schema/schema");
21
+
22
+ const INSTALL_TYPE_NPM = 'npm';
23
+ exports.INSTALL_TYPE_NPM = INSTALL_TYPE_NPM;
24
+ const INSTALL_TYPE_LOCAL = 'local';
25
+ exports.INSTALL_TYPE_LOCAL = INSTALL_TYPE_LOCAL;
26
+ const INSTALL_TYPE_GITHUB = 'github';
27
+ exports.INSTALL_TYPE_GITHUB = INSTALL_TYPE_GITHUB;
28
+ const INSTALL_TYPE_GIT = 'git';
29
+ exports.INSTALL_TYPE_GIT = INSTALL_TYPE_GIT;
30
+ const INSTALL_TYPES = new Set([INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB, INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM]);
31
+ exports.INSTALL_TYPES = INSTALL_TYPES;
32
+
33
+ class ExtensionConfig {
34
+ extensionType;
35
+ configKey;
36
+ installedExtensions;
37
+ log;
38
+ manifest;
39
+
40
+ constructor(extensionType, manifest, logFn) {
41
+ const logger = _lodash.default.isFunction(logFn) ? logFn : _logger.default.error.bind(_logger.default);
42
+ this.extensionType = extensionType;
43
+ this.configKey = `${extensionType}s`;
44
+ this.installedExtensions = manifest.getExtensionData(extensionType);
45
+ this.log = logger;
46
+ this.manifest = manifest;
47
+ }
48
+
49
+ get manifestPath() {
50
+ return this.manifest.manifestPath;
51
+ }
52
+
53
+ get appiumHome() {
54
+ return this.manifest.appiumHome;
55
+ }
56
+
57
+ validate(exts) {
58
+ const foundProblems = {};
59
+
60
+ for (const [extName, extData] of _lodash.default.toPairs(exts)) {
61
+ foundProblems[extName] = [...this.getGenericConfigProblems(extData, extName), ...this.getConfigProblems(extData), ...this.getSchemaProblems(extData, extName)];
62
+ }
63
+
64
+ const problemSummaries = [];
65
+
66
+ for (const [extName, problems] of _lodash.default.toPairs(foundProblems)) {
67
+ if (_lodash.default.isEmpty(problems)) {
68
+ continue;
69
+ }
70
+
71
+ delete exts[extName];
72
+ problemSummaries.push(`${this.extensionType} ${extName} had errors and will not ` + `be available. Errors:`);
73
+
74
+ for (const problem of problems) {
75
+ problemSummaries.push(` - ${problem.err} (Actual value: ` + `${JSON.stringify(problem.val)})`);
76
+ }
77
+ }
78
+
79
+ if (!_lodash.default.isEmpty(problemSummaries)) {
80
+ this.log(`Appium encountered one or more errors while validating ` + `the ${this.configKey} extension file (${this.manifestPath}):`);
81
+
82
+ for (const summary of problemSummaries) {
83
+ this.log(summary);
84
+ }
85
+ }
86
+
87
+ return exts;
88
+ }
89
+
90
+ getSchemaProblems(extData, extName) {
91
+ const problems = [];
92
+ const {
93
+ schema: argSchemaPath
94
+ } = extData;
95
+
96
+ if (ExtensionConfig.extDataHasSchema(extData)) {
97
+ if (_lodash.default.isString(argSchemaPath)) {
98
+ if ((0, _schema.isAllowedSchemaFileExtension)(argSchemaPath)) {
99
+ try {
100
+ this.readExtensionSchema(extName, extData);
101
+ } catch (err) {
102
+ problems.push({
103
+ err: `Unable to register schema at path ${argSchemaPath}; ${err.message}`,
104
+ val: argSchemaPath
105
+ });
106
+ }
107
+ } else {
108
+ problems.push({
109
+ err: `Schema file has unsupported extension. Allowed: ${[..._schema.ALLOWED_SCHEMA_EXTENSIONS].join(', ')}`,
110
+ val: argSchemaPath
111
+ });
112
+ }
113
+ } else if (_lodash.default.isPlainObject(argSchemaPath)) {
114
+ try {
115
+ this.readExtensionSchema(extName, extData);
116
+ } catch (err) {
117
+ problems.push({
118
+ err: `Unable to register embedded schema; ${err.message}`,
119
+ val: argSchemaPath
120
+ });
121
+ }
122
+ } else {
123
+ problems.push({
124
+ err: 'Incorrectly formatted schema field; must be a path to a schema file or a schema object.',
125
+ val: argSchemaPath
126
+ });
127
+ }
128
+ }
129
+
130
+ return problems;
131
+ }
132
+
133
+ getGenericConfigProblems(extData, extName) {
134
+ const {
135
+ version,
136
+ pkgName,
137
+ installSpec,
138
+ installType,
139
+ mainClass
140
+ } = extData;
141
+ const problems = [];
142
+
143
+ if (!_lodash.default.isString(version)) {
144
+ problems.push({
145
+ err: 'Missing or incorrect version',
146
+ val: version
147
+ });
148
+ }
149
+
150
+ if (!_lodash.default.isString(pkgName)) {
151
+ problems.push({
152
+ err: 'Missing or incorrect NPM package name',
153
+ val: pkgName
154
+ });
155
+ }
156
+
157
+ if (!_lodash.default.isString(installSpec)) {
158
+ problems.push({
159
+ err: 'Missing or incorrect installation spec',
160
+ val: installSpec
161
+ });
162
+ }
163
+
164
+ if (!INSTALL_TYPES.has(installType)) {
165
+ problems.push({
166
+ err: 'Missing or incorrect install type',
167
+ val: installType
168
+ });
169
+ }
170
+
171
+ if (!_lodash.default.isString(mainClass)) {
172
+ problems.push({
173
+ err: 'Missing or incorrect driver class name',
174
+ val: mainClass
175
+ });
176
+ }
177
+
178
+ return problems;
179
+ }
180
+
181
+ getConfigProblems(extData) {
182
+ return [];
183
+ }
184
+
185
+ async addExtension(extName, extData, {
186
+ write = true
187
+ } = {}) {
188
+ this.manifest.addExtension(this.extensionType, extName, extData);
189
+
190
+ if (write) {
191
+ await this.manifest.write();
192
+ }
193
+ }
194
+
195
+ async updateExtension(extName, extData, {
196
+ write = true
197
+ } = {}) {
198
+ this.installedExtensions[extName] = { ...this.installedExtensions[extName],
199
+ ...extData
200
+ };
201
+
202
+ if (write) {
203
+ await this.manifest.write();
204
+ }
205
+ }
206
+
207
+ async removeExtension(extName, {
208
+ write = true
209
+ } = {}) {
210
+ delete this.installedExtensions[extName];
211
+
212
+ if (write) {
213
+ await this.manifest.write();
214
+ }
215
+ }
216
+
217
+ print(activeNames) {
218
+ if (_lodash.default.isEmpty(this.installedExtensions)) {
219
+ _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.');
220
+
221
+ return;
222
+ }
223
+
224
+ _logger.default.info(`Available ${this.configKey}:`);
225
+
226
+ for (const [extName, extData] of _lodash.default.toPairs(this.installedExtensions)) {
227
+ _logger.default.info(` - ${this.extensionDesc(extName, extData)}`);
228
+ }
229
+ }
230
+
231
+ extensionDesc(extName, extData) {
232
+ throw new Error('This must be implemented in a subclass');
233
+ }
234
+
235
+ getInstallPath(extName) {
236
+ return _path.default.join(this.appiumHome, 'node_modules', this.installedExtensions[extName].pkgName);
237
+ }
238
+
239
+ require(extName) {
240
+ const {
241
+ mainClass
242
+ } = this.installedExtensions[extName];
243
+ const reqPath = this.getInstallPath(extName);
244
+
245
+ const reqResolved = require.resolve(reqPath);
246
+
247
+ if (process.env.APPIUM_RELOAD_EXTENSIONS && require.cache[reqResolved]) {
248
+ _logger.default.debug(`Removing ${reqResolved} from require cache`);
249
+
250
+ delete require.cache[reqResolved];
251
+ }
252
+
253
+ _logger.default.debug(`Requiring ${this.extensionType} at ${reqPath}`);
254
+
255
+ return require(reqPath)[mainClass];
256
+ }
257
+
258
+ isInstalled(extName) {
259
+ return _lodash.default.includes(Object.keys(this.installedExtensions), extName);
260
+ }
261
+
262
+ static _readExtensionSchema(appiumHome, extType, extName, extData) {
263
+ const {
264
+ pkgName,
265
+ schema: argSchemaPath
266
+ } = extData;
267
+
268
+ if (!argSchemaPath) {
269
+ throw new TypeError(`No \`schema\` property found in config for ${extType} ${pkgName} -- why is this function being called?`);
270
+ }
271
+
272
+ let moduleObject;
273
+
274
+ if (_lodash.default.isString(argSchemaPath)) {
275
+ const schemaPath = (0, _resolveFrom.default)(appiumHome, _path.default.join(pkgName, argSchemaPath));
276
+ moduleObject = require(schemaPath);
277
+ } else {
278
+ moduleObject = argSchemaPath;
279
+ }
280
+
281
+ const schema = moduleObject.__esModule ? moduleObject.default : moduleObject;
282
+ (0, _schema.registerSchema)(extType, extName, schema);
283
+ return schema;
284
+ }
285
+
286
+ static extDataHasSchema(extData) {
287
+ return _lodash.default.isString(extData === null || extData === void 0 ? void 0 : extData.schema) || _lodash.default.isObject(extData === null || extData === void 0 ? void 0 : extData.schema);
288
+ }
289
+
290
+ readExtensionSchema(extName, extData) {
291
+ return ExtensionConfig._readExtensionSchema(this.appiumHome, this.extensionType, extName, extData);
292
+ }
293
+
294
+ }
295
+
296
+ exports.ExtensionConfig = ExtensionConfig;
297
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZy5qcyJdLCJuYW1lcyI6WyJJTlNUQUxMX1RZUEVfTlBNIiwiSU5TVEFMTF9UWVBFX0xPQ0FMIiwiSU5TVEFMTF9UWVBFX0dJVEhVQiIsIklOU1RBTExfVFlQRV9HSVQiLCJJTlNUQUxMX1RZUEVTIiwiU2V0IiwiRXh0ZW5zaW9uQ29uZmlnIiwiZXh0ZW5zaW9uVHlwZSIsImNvbmZpZ0tleSIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJsb2ciLCJtYW5pZmVzdCIsImNvbnN0cnVjdG9yIiwibG9nRm4iLCJsb2dnZXIiLCJfIiwiaXNGdW5jdGlvbiIsImVycm9yIiwiYmluZCIsImdldEV4dGVuc2lvbkRhdGEiLCJtYW5pZmVzdFBhdGgiLCJhcHBpdW1Ib21lIiwidmFsaWRhdGUiLCJleHRzIiwiZm91bmRQcm9ibGVtcyIsImV4dE5hbWUiLCJleHREYXRhIiwidG9QYWlycyIsImdldEdlbmVyaWNDb25maWdQcm9ibGVtcyIsImdldENvbmZpZ1Byb2JsZW1zIiwiZ2V0U2NoZW1hUHJvYmxlbXMiLCJwcm9ibGVtU3VtbWFyaWVzIiwicHJvYmxlbXMiLCJpc0VtcHR5IiwicHVzaCIsInByb2JsZW0iLCJlcnIiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsIiwic3VtbWFyeSIsInNjaGVtYSIsImFyZ1NjaGVtYVBhdGgiLCJleHREYXRhSGFzU2NoZW1hIiwiaXNTdHJpbmciLCJyZWFkRXh0ZW5zaW9uU2NoZW1hIiwibWVzc2FnZSIsIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJqb2luIiwiaXNQbGFpbk9iamVjdCIsInZlcnNpb24iLCJwa2dOYW1lIiwiaW5zdGFsbFNwZWMiLCJpbnN0YWxsVHlwZSIsIm1haW5DbGFzcyIsImhhcyIsImFkZEV4dGVuc2lvbiIsIndyaXRlIiwidXBkYXRlRXh0ZW5zaW9uIiwicmVtb3ZlRXh0ZW5zaW9uIiwicHJpbnQiLCJhY3RpdmVOYW1lcyIsImluZm8iLCJleHRlbnNpb25EZXNjIiwiRXJyb3IiLCJnZXRJbnN0YWxsUGF0aCIsInBhdGgiLCJyZXF1aXJlIiwicmVxUGF0aCIsInJlcVJlc29sdmVkIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJBUFBJVU1fUkVMT0FEX0VYVEVOU0lPTlMiLCJjYWNoZSIsImRlYnVnIiwiaXNJbnN0YWxsZWQiLCJpbmNsdWRlcyIsIk9iamVjdCIsImtleXMiLCJfcmVhZEV4dGVuc2lvblNjaGVtYSIsImV4dFR5cGUiLCJUeXBlRXJyb3IiLCJtb2R1bGVPYmplY3QiLCJzY2hlbWFQYXRoIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJpc09iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQSxNQUFNQSxnQkFBZ0IsR0FBRyxLQUF6Qjs7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxPQUEzQjs7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxRQUE1Qjs7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxLQUF6Qjs7QUFHQSxNQUFNQyxhQUFhLEdBQUcsSUFBSUMsR0FBSixDQUFRLENBQzVCRixnQkFENEIsRUFFNUJELG1CQUY0QixFQUc1QkQsa0JBSDRCLEVBSTVCRCxnQkFKNEIsQ0FBUixDQUF0Qjs7O0FBYU8sTUFBTU0sZUFBTixDQUFzQjtBQUUzQkMsRUFBQUEsYUFBYTtBQUdiQyxFQUFBQSxTQUFTO0FBR1RDLEVBQUFBLG1CQUFtQjtBQUduQkMsRUFBQUEsR0FBRztBQUdIQyxFQUFBQSxRQUFROztBQVFSQyxFQUFBQSxXQUFXLENBQUVMLGFBQUYsRUFBaUJJLFFBQWpCLEVBQTJCRSxLQUEzQixFQUFrQztBQUMzQyxVQUFNQyxNQUFNLEdBQUdDLGdCQUFFQyxVQUFGLENBQWFILEtBQWIsSUFBc0JBLEtBQXRCLEdBQThCSCxnQkFBSU8sS0FBSixDQUFVQyxJQUFWLENBQWVSLGVBQWYsQ0FBN0M7QUFDQSxTQUFLSCxhQUFMLEdBQXFCQSxhQUFyQjtBQUNBLFNBQUtDLFNBQUwsR0FBa0IsR0FBRUQsYUFBYyxHQUFsQztBQUNBLFNBQUtFLG1CQUFMLEdBQTJCRSxRQUFRLENBQUNRLGdCQUFULENBQTBCWixhQUExQixDQUEzQjtBQUNBLFNBQUtHLEdBQUwsR0FBV0ksTUFBWDtBQUNBLFNBQUtILFFBQUwsR0FBZ0JBLFFBQWhCO0FBQ0Q7O0FBRWUsTUFBWlMsWUFBWSxHQUFJO0FBQ2xCLFdBQU8sS0FBS1QsUUFBTCxDQUFjUyxZQUFyQjtBQUNEOztBQUVhLE1BQVZDLFVBQVUsR0FBSTtBQUNoQixXQUFPLEtBQUtWLFFBQUwsQ0FBY1UsVUFBckI7QUFDRDs7QUFNREMsRUFBQUEsUUFBUSxDQUFFQyxJQUFGLEVBQVE7QUFDZCxVQUFNQyxhQUFhLEdBQ2tDLEVBRHJEOztBQUVBLFNBQUssTUFBTSxDQUNUQyxPQURTLEVBRVRDLE9BRlMsQ0FBWCxJQUlJWCxnQkFBRVksT0FBRixDQUFVSixJQUFWLENBSkosRUFLSztBQUNIQyxNQUFBQSxhQUFhLENBQUNDLE9BQUQsQ0FBYixHQUF5QixDQUN2QixHQUFHLEtBQUtHLHdCQUFMLENBQThCRixPQUE5QixFQUF1Q0QsT0FBdkMsQ0FEb0IsRUFFdkIsR0FBRyxLQUFLSSxpQkFBTCxDQUF1QkgsT0FBdkIsQ0FGb0IsRUFHdkIsR0FBRyxLQUFLSSxpQkFBTCxDQUF1QkosT0FBdkIsRUFBZ0NELE9BQWhDLENBSG9CLENBQXpCO0FBS0Q7O0FBRUQsVUFBTU0sZ0JBQWdCLEdBQUcsRUFBekI7O0FBQ0EsU0FBSyxNQUFNLENBQUNOLE9BQUQsRUFBVU8sUUFBVixDQUFYLElBQWtDakIsZ0JBQUVZLE9BQUYsQ0FBVUgsYUFBVixDQUFsQyxFQUE0RDtBQUMxRCxVQUFJVCxnQkFBRWtCLE9BQUYsQ0FBVUQsUUFBVixDQUFKLEVBQXlCO0FBQ3ZCO0FBQ0Q7O0FBRUQsYUFBT1QsSUFBSSxDQUFDRSxPQUFELENBQVg7QUFDQU0sTUFBQUEsZ0JBQWdCLENBQUNHLElBQWpCLENBQ0csR0FBRSxLQUFLM0IsYUFBYyxJQUFHa0IsT0FBUSwyQkFBakMsR0FDRyx1QkFGTDs7QUFJQSxXQUFLLE1BQU1VLE9BQVgsSUFBc0JILFFBQXRCLEVBQWdDO0FBQzlCRCxRQUFBQSxnQkFBZ0IsQ0FBQ0csSUFBakIsQ0FDRyxPQUFNQyxPQUFPLENBQUNDLEdBQUksa0JBQW5CLEdBQ0csR0FBRUMsSUFBSSxDQUFDQyxTQUFMLENBQWVILE9BQU8sQ0FBQ0ksR0FBdkIsQ0FBNEIsR0FGbkM7QUFJRDtBQUNGOztBQUVELFFBQUksQ0FBQ3hCLGdCQUFFa0IsT0FBRixDQUFVRixnQkFBVixDQUFMLEVBQWtDO0FBQ2hDLFdBQUtyQixHQUFMLENBQ0cseURBQUQsR0FDRyxPQUFNLEtBQUtGLFNBQVUsb0JBQW1CLEtBQUtZLFlBQWEsSUFGL0Q7O0FBSUEsV0FBSyxNQUFNb0IsT0FBWCxJQUFzQlQsZ0JBQXRCLEVBQXdDO0FBQ3RDLGFBQUtyQixHQUFMLENBQVM4QixPQUFUO0FBQ0Q7QUFDRjs7QUFFRCxXQUFPakIsSUFBUDtBQUNEOztBQU9ETyxFQUFBQSxpQkFBaUIsQ0FBRUosT0FBRixFQUFXRCxPQUFYLEVBQW9CO0FBQ25DLFVBQU1PLFFBQVEsR0FBRyxFQUFqQjtBQUNBLFVBQU07QUFBQ1MsTUFBQUEsTUFBTSxFQUFFQztBQUFULFFBQTBCaEIsT0FBaEM7O0FBQ0EsUUFBSXBCLGVBQWUsQ0FBQ3FDLGdCQUFoQixDQUFpQ2pCLE9BQWpDLENBQUosRUFBK0M7QUFDN0MsVUFBSVgsZ0JBQUU2QixRQUFGLENBQVdGLGFBQVgsQ0FBSixFQUErQjtBQUM3QixZQUFJLDBDQUE2QkEsYUFBN0IsQ0FBSixFQUFpRDtBQUMvQyxjQUFJO0FBQ0YsaUJBQUtHLG1CQUFMLENBQXlCcEIsT0FBekIsRUFBa0NDLE9BQWxDO0FBQ0QsV0FGRCxDQUVFLE9BQU9VLEdBQVAsRUFBWTtBQUNaSixZQUFBQSxRQUFRLENBQUNFLElBQVQsQ0FBYztBQUNaRSxjQUFBQSxHQUFHLEVBQUcscUNBQW9DTSxhQUFjLEtBQUlOLEdBQUcsQ0FBQ1UsT0FBUSxFQUQ1RDtBQUVaUCxjQUFBQSxHQUFHLEVBQUVHO0FBRk8sYUFBZDtBQUlEO0FBQ0YsU0FURCxNQVNPO0FBQ0xWLFVBQUFBLFFBQVEsQ0FBQ0UsSUFBVCxDQUFjO0FBQ1pFLFlBQUFBLEdBQUcsRUFBRyxtREFBa0QsQ0FDdEQsR0FBR1csaUNBRG1ELEVBRXREQyxJQUZzRCxDQUVqRCxJQUZpRCxDQUUzQyxFQUhEO0FBSVpULFlBQUFBLEdBQUcsRUFBRUc7QUFKTyxXQUFkO0FBTUQ7QUFDRixPQWxCRCxNQWtCTyxJQUFJM0IsZ0JBQUVrQyxhQUFGLENBQWdCUCxhQUFoQixDQUFKLEVBQW9DO0FBQ3pDLFlBQUk7QUFDRixlQUFLRyxtQkFBTCxDQUF5QnBCLE9BQXpCLEVBQWtDQyxPQUFsQztBQUNELFNBRkQsQ0FFRSxPQUFPVSxHQUFQLEVBQVk7QUFDWkosVUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFDWkUsWUFBQUEsR0FBRyxFQUFHLHVDQUFzQ0EsR0FBRyxDQUFDVSxPQUFRLEVBRDVDO0FBRVpQLFlBQUFBLEdBQUcsRUFBRUc7QUFGTyxXQUFkO0FBSUQ7QUFDRixPQVRNLE1BU0E7QUFDTFYsUUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFDWkUsVUFBQUEsR0FBRyxFQUFFLHlGQURPO0FBRVpHLFVBQUFBLEdBQUcsRUFBRUc7QUFGTyxTQUFkO0FBSUQ7QUFDRjs7QUFDRCxXQUFPVixRQUFQO0FBQ0Q7O0FBUURKLEVBQUFBLHdCQUF3QixDQUFFRixPQUFGLEVBQVdELE9BQVgsRUFBb0I7QUFDMUMsVUFBTTtBQUFDeUIsTUFBQUEsT0FBRDtBQUFVQyxNQUFBQSxPQUFWO0FBQW1CQyxNQUFBQSxXQUFuQjtBQUFnQ0MsTUFBQUEsV0FBaEM7QUFBNkNDLE1BQUFBO0FBQTdDLFFBQ0o1QixPQURGO0FBRUEsVUFBTU0sUUFBUSxHQUFHLEVBQWpCOztBQUVBLFFBQUksQ0FBQ2pCLGdCQUFFNkIsUUFBRixDQUFXTSxPQUFYLENBQUwsRUFBMEI7QUFDeEJsQixNQUFBQSxRQUFRLENBQUNFLElBQVQsQ0FBYztBQUFDRSxRQUFBQSxHQUFHLEVBQUUsOEJBQU47QUFBc0NHLFFBQUFBLEdBQUcsRUFBRVc7QUFBM0MsT0FBZDtBQUNEOztBQUVELFFBQUksQ0FBQ25DLGdCQUFFNkIsUUFBRixDQUFXTyxPQUFYLENBQUwsRUFBMEI7QUFDeEJuQixNQUFBQSxRQUFRLENBQUNFLElBQVQsQ0FBYztBQUNaRSxRQUFBQSxHQUFHLEVBQUUsdUNBRE87QUFFWkcsUUFBQUEsR0FBRyxFQUFFWTtBQUZPLE9BQWQ7QUFJRDs7QUFFRCxRQUFJLENBQUNwQyxnQkFBRTZCLFFBQUYsQ0FBV1EsV0FBWCxDQUFMLEVBQThCO0FBQzVCcEIsTUFBQUEsUUFBUSxDQUFDRSxJQUFULENBQWM7QUFDWkUsUUFBQUEsR0FBRyxFQUFFLHdDQURPO0FBRVpHLFFBQUFBLEdBQUcsRUFBRWE7QUFGTyxPQUFkO0FBSUQ7O0FBRUQsUUFBSSxDQUFDaEQsYUFBYSxDQUFDbUQsR0FBZCxDQUFrQkYsV0FBbEIsQ0FBTCxFQUFxQztBQUNuQ3JCLE1BQUFBLFFBQVEsQ0FBQ0UsSUFBVCxDQUFjO0FBQ1pFLFFBQUFBLEdBQUcsRUFBRSxtQ0FETztBQUVaRyxRQUFBQSxHQUFHLEVBQUVjO0FBRk8sT0FBZDtBQUlEOztBQUVELFFBQUksQ0FBQ3RDLGdCQUFFNkIsUUFBRixDQUFXVSxTQUFYLENBQUwsRUFBNEI7QUFDMUJ0QixNQUFBQSxRQUFRLENBQUNFLElBQVQsQ0FBYztBQUNaRSxRQUFBQSxHQUFHLEVBQUUsd0NBRE87QUFFWkcsUUFBQUEsR0FBRyxFQUFFZTtBQUZPLE9BQWQ7QUFJRDs7QUFFRCxXQUFPdEIsUUFBUDtBQUNEOztBQVFESCxFQUFBQSxpQkFBaUIsQ0FBRUgsT0FBRixFQUFXO0FBRTFCLFdBQU8sRUFBUDtBQUNEOztBQVFpQixRQUFaOEIsWUFBWSxDQUFFL0IsT0FBRixFQUFXQyxPQUFYLEVBQW9CO0FBQUMrQixJQUFBQSxLQUFLLEdBQUc7QUFBVCxNQUFpQixFQUFyQyxFQUF5QztBQUN6RCxTQUFLOUMsUUFBTCxDQUFjNkMsWUFBZCxDQUEyQixLQUFLakQsYUFBaEMsRUFBK0NrQixPQUEvQyxFQUF3REMsT0FBeEQ7O0FBQ0EsUUFBSStCLEtBQUosRUFBVztBQUNULFlBQU0sS0FBSzlDLFFBQUwsQ0FBYzhDLEtBQWQsRUFBTjtBQUNEO0FBQ0Y7O0FBUW9CLFFBQWZDLGVBQWUsQ0FBRWpDLE9BQUYsRUFBV0MsT0FBWCxFQUFvQjtBQUFDK0IsSUFBQUEsS0FBSyxHQUFHO0FBQVQsTUFBaUIsRUFBckMsRUFBeUM7QUFDNUQsU0FBS2hELG1CQUFMLENBQXlCZ0IsT0FBekIsSUFBb0MsRUFDbEMsR0FBRyxLQUFLaEIsbUJBQUwsQ0FBeUJnQixPQUF6QixDQUQrQjtBQUVsQyxTQUFHQztBQUYrQixLQUFwQzs7QUFJQSxRQUFJK0IsS0FBSixFQUFXO0FBQ1QsWUFBTSxLQUFLOUMsUUFBTCxDQUFjOEMsS0FBZCxFQUFOO0FBQ0Q7QUFDRjs7QUFPb0IsUUFBZkUsZUFBZSxDQUFFbEMsT0FBRixFQUFXO0FBQUNnQyxJQUFBQSxLQUFLLEdBQUc7QUFBVCxNQUFpQixFQUE1QixFQUFnQztBQUNuRCxXQUFPLEtBQUtoRCxtQkFBTCxDQUF5QmdCLE9BQXpCLENBQVA7O0FBQ0EsUUFBSWdDLEtBQUosRUFBVztBQUNULFlBQU0sS0FBSzlDLFFBQUwsQ0FBYzhDLEtBQWQsRUFBTjtBQUNEO0FBQ0Y7O0FBT0RHLEVBQUFBLEtBQUssQ0FBRUMsV0FBRixFQUFlO0FBQ2xCLFFBQUk5QyxnQkFBRWtCLE9BQUYsQ0FBVSxLQUFLeEIsbUJBQWYsQ0FBSixFQUF5QztBQUN2Q0Msc0JBQUlvRCxJQUFKLENBQ0csTUFBSyxLQUFLdEQsU0FBVSwyQkFBMEIsS0FBS2EsVUFBVyxxQkFBb0IsS0FBS2QsYUFBYyxJQUF0RyxHQUNFLGdEQUZKOztBQUlBO0FBQ0Q7O0FBRURHLG9CQUFJb0QsSUFBSixDQUFVLGFBQVksS0FBS3RELFNBQVUsR0FBckM7O0FBQ0EsU0FBSyxNQUFNLENBQ1RpQixPQURTLEVBRVRDLE9BRlMsQ0FBWCxJQUlJWCxnQkFBRVksT0FBRixDQUFVLEtBQUtsQixtQkFBZixDQUpKLEVBS0s7QUFDSEMsc0JBQUlvRCxJQUFKLENBQVUsT0FBTSxLQUFLQyxhQUFMLENBQW1CdEMsT0FBbkIsRUFBNEJDLE9BQTVCLENBQXFDLEVBQXJEO0FBQ0Q7QUFDRjs7QUFVRHFDLEVBQUFBLGFBQWEsQ0FBRXRDLE9BQUYsRUFBV0MsT0FBWCxFQUFvQjtBQUMvQixVQUFNLElBQUlzQyxLQUFKLENBQVUsd0NBQVYsQ0FBTjtBQUNEOztBQU1EQyxFQUFBQSxjQUFjLENBQUV4QyxPQUFGLEVBQVc7QUFDdkIsV0FBT3lDLGNBQUtsQixJQUFMLENBQVUsS0FBSzNCLFVBQWYsRUFBMkIsY0FBM0IsRUFBMkMsS0FBS1osbUJBQUwsQ0FBeUJnQixPQUF6QixFQUFrQzBCLE9BQTdFLENBQVA7QUFDRDs7QUFPRGdCLEVBQUFBLE9BQU8sQ0FBRTFDLE9BQUYsRUFBVztBQUNoQixVQUFNO0FBQUM2QixNQUFBQTtBQUFELFFBQWMsS0FBSzdDLG1CQUFMLENBQXlCZ0IsT0FBekIsQ0FBcEI7QUFDQSxVQUFNMkMsT0FBTyxHQUFHLEtBQUtILGNBQUwsQ0FBb0J4QyxPQUFwQixDQUFoQjs7QUFDQSxVQUFNNEMsV0FBVyxHQUFHRixPQUFPLENBQUNHLE9BQVIsQ0FBZ0JGLE9BQWhCLENBQXBCOztBQUVBLFFBQUlHLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyx3QkFBWixJQUF3Q04sT0FBTyxDQUFDTyxLQUFSLENBQWNMLFdBQWQsQ0FBNUMsRUFBd0U7QUFDdEUzRCxzQkFBSWlFLEtBQUosQ0FBVyxZQUFXTixXQUFZLHFCQUFsQzs7QUFDQSxhQUFPRixPQUFPLENBQUNPLEtBQVIsQ0FBY0wsV0FBZCxDQUFQO0FBQ0Q7O0FBQ0QzRCxvQkFBSWlFLEtBQUosQ0FBVyxhQUFZLEtBQUtwRSxhQUFjLE9BQU02RCxPQUFRLEVBQXhEOztBQUNBLFdBQU9ELE9BQU8sQ0FBQ0MsT0FBRCxDQUFQLENBQWlCZCxTQUFqQixDQUFQO0FBQ0Q7O0FBTURzQixFQUFBQSxXQUFXLENBQUVuRCxPQUFGLEVBQVc7QUFDcEIsV0FBT1YsZ0JBQUU4RCxRQUFGLENBQVdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUt0RSxtQkFBakIsQ0FBWCxFQUFrRGdCLE9BQWxELENBQVA7QUFDRDs7QUFZMEIsU0FBcEJ1RCxvQkFBb0IsQ0FBRTNELFVBQUYsRUFBYzRELE9BQWQsRUFBdUJ4RCxPQUF2QixFQUFnQ0MsT0FBaEMsRUFBeUM7QUFDbEUsVUFBTTtBQUFDeUIsTUFBQUEsT0FBRDtBQUFVVixNQUFBQSxNQUFNLEVBQUVDO0FBQWxCLFFBQW1DaEIsT0FBekM7O0FBQ0EsUUFBSSxDQUFDZ0IsYUFBTCxFQUFvQjtBQUNsQixZQUFNLElBQUl3QyxTQUFKLENBQ0gsOENBQTZDRCxPQUFRLElBQUc5QixPQUFRLHdDQUQ3RCxDQUFOO0FBR0Q7O0FBQ0QsUUFBSWdDLFlBQUo7O0FBQ0EsUUFBSXBFLGdCQUFFNkIsUUFBRixDQUFXRixhQUFYLENBQUosRUFBK0I7QUFDN0IsWUFBTTBDLFVBQVUsR0FBRywwQkFBWS9ELFVBQVosRUFBd0I2QyxjQUFLbEIsSUFBTCxDQUFVRyxPQUFWLEVBQW1CVCxhQUFuQixDQUF4QixDQUFuQjtBQUNBeUMsTUFBQUEsWUFBWSxHQUFHaEIsT0FBTyxDQUFDaUIsVUFBRCxDQUF0QjtBQUNELEtBSEQsTUFHTztBQUNMRCxNQUFBQSxZQUFZLEdBQUd6QyxhQUFmO0FBQ0Q7O0FBRUQsVUFBTUQsTUFBTSxHQUFHMEMsWUFBWSxDQUFDRSxVQUFiLEdBQ1hGLFlBQVksQ0FBQ0csT0FERixHQUVYSCxZQUZKO0FBR0EsZ0NBQWVGLE9BQWYsRUFBd0J4RCxPQUF4QixFQUFpQ2dCLE1BQWpDO0FBQ0EsV0FBT0EsTUFBUDtBQUNEOztBQVNzQixTQUFoQkUsZ0JBQWdCLENBQUVqQixPQUFGLEVBQVc7QUFDaEMsV0FBT1gsZ0JBQUU2QixRQUFGLENBQVdsQixPQUFYLGFBQVdBLE9BQVgsdUJBQVdBLE9BQU8sQ0FBRWUsTUFBcEIsS0FBK0IxQixnQkFBRXdFLFFBQUYsQ0FBVzdELE9BQVgsYUFBV0EsT0FBWCx1QkFBV0EsT0FBTyxDQUFFZSxNQUFwQixDQUF0QztBQUNEOztBQVNESSxFQUFBQSxtQkFBbUIsQ0FBRXBCLE9BQUYsRUFBV0MsT0FBWCxFQUFvQjtBQUNyQyxXQUFPcEIsZUFBZSxDQUFDMEUsb0JBQWhCLENBQ0wsS0FBSzNELFVBREEsRUFFTCxLQUFLZCxhQUZBLEVBR0xrQixPQUhLLEVBSUxDLE9BSkssQ0FBUDtBQU1EOztBQTNXMEIiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCByZXNvbHZlRnJvbSBmcm9tICdyZXNvbHZlLWZyb20nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbixcbiAgcmVnaXN0ZXJTY2hlbWEsXG59IGZyb20gJy4uL3NjaGVtYS9zY2hlbWEnO1xuXG5jb25zdCBJTlNUQUxMX1RZUEVfTlBNID0gJ25wbSc7XG5jb25zdCBJTlNUQUxMX1RZUEVfTE9DQUwgPSAnbG9jYWwnO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVEhVQiA9ICdnaXRodWInO1xuY29uc3QgSU5TVEFMTF9UWVBFX0dJVCA9ICdnaXQnO1xuXG4vKiogQHR5cGUge1NldDxJbnN0YWxsVHlwZT59ICovXG5jb25zdCBJTlNUQUxMX1RZUEVTID0gbmV3IFNldChbXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9HSVRIVUIsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX05QTSxcbl0pO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgYWJzdHJhY3QuIEl0IHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuICpcbiAqIFN1YmNsYXNzZXMgc2hvdWxkIHByb3ZpZGUgdGhlIGdlbmVyaWMgcGFyYW1ldGVyIHRvIGltcGxlbWVudC5cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uQ29uZmlnIHtcbiAgLyoqIEB0eXBlIHtFeHRUeXBlfSAqL1xuICBleHRlbnNpb25UeXBlO1xuXG4gIC8qKiBAdHlwZSB7YCR7RXh0VHlwZX1zYH0gKi9cbiAgY29uZmlnS2V5O1xuXG4gIC8qKiBAdHlwZSB7RXh0UmVjb3JkPEV4dFR5cGU+fSAqL1xuICBpbnN0YWxsZWRFeHRlbnNpb25zO1xuXG4gIC8qKiBAdHlwZSB7RXh0ZW5zaW9uTG9nRm59ICovXG4gIGxvZztcblxuICAvKiogQHR5cGUge01hbmlmZXN0fSAqL1xuICBtYW5pZmVzdDtcblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dGVuc2lvblR5cGUgLSBUeXBlIG9mIGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge01hbmlmZXN0fSBtYW5pZmVzdCAtIGBNYW5pZmVzdGAgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Mb2dGbn0gW2xvZ0ZuXVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dGVuc2lvblR5cGUsIG1hbmlmZXN0LCBsb2dGbikge1xuICAgIGNvbnN0IGxvZ2dlciA9IF8uaXNGdW5jdGlvbihsb2dGbikgPyBsb2dGbiA6IGxvZy5lcnJvci5iaW5kKGxvZyk7XG4gICAgdGhpcy5leHRlbnNpb25UeXBlID0gZXh0ZW5zaW9uVHlwZTtcbiAgICB0aGlzLmNvbmZpZ0tleSA9IGAke2V4dGVuc2lvblR5cGV9c2A7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zID0gbWFuaWZlc3QuZ2V0RXh0ZW5zaW9uRGF0YShleHRlbnNpb25UeXBlKTtcbiAgICB0aGlzLmxvZyA9IGxvZ2dlcjtcbiAgICB0aGlzLm1hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gIH1cblxuICBnZXQgbWFuaWZlc3RQYXRoICgpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5pZmVzdC5tYW5pZmVzdFBhdGg7XG4gIH1cblxuICBnZXQgYXBwaXVtSG9tZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuaWZlc3QuYXBwaXVtSG9tZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZXh0ZW5zaW9ucyBmb3IgcHJvYmxlbXNcbiAgICogQHBhcmFtIHtFeHRSZWNvcmQ8RXh0VHlwZT59IGV4dHMgLSBFeHRlbnNpb24gZGF0YVxuICAgKi9cbiAgdmFsaWRhdGUgKGV4dHMpIHtcbiAgICBjb25zdCBmb3VuZFByb2JsZW1zID1cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPEV4dE5hbWU8RXh0VHlwZT4sUHJvYmxlbVtdPn0gKi8gKHt9KTtcbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIGV4dE5hbWUsXG4gICAgICBleHREYXRhLFxuICAgIF0gb2YgLyoqIEB0eXBlIHtbRXh0TmFtZTxFeHRUeXBlPiwgRXh0TWFuaWZlc3Q8RXh0VHlwZT5dW119ICovIChcbiAgICAgICAgXy50b1BhaXJzKGV4dHMpXG4gICAgICApKSB7XG4gICAgICBmb3VuZFByb2JsZW1zW2V4dE5hbWVdID0gW1xuICAgICAgICAuLi50aGlzLmdldEdlbmVyaWNDb25maWdQcm9ibGVtcyhleHREYXRhLCBleHROYW1lKSxcbiAgICAgICAgLi4udGhpcy5nZXRDb25maWdQcm9ibGVtcyhleHREYXRhKSxcbiAgICAgICAgLi4udGhpcy5nZXRTY2hlbWFQcm9ibGVtcyhleHREYXRhLCBleHROYW1lKSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY29uc3QgcHJvYmxlbVN1bW1hcmllcyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2V4dE5hbWUsIHByb2JsZW1zXSBvZiBfLnRvUGFpcnMoZm91bmRQcm9ibGVtcykpIHtcbiAgICAgIGlmIChfLmlzRW1wdHkocHJvYmxlbXMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRoaXMgZXh0ZW5zaW9uIGZyb20gdGhlIGxpc3Qgc2luY2UgaXQncyBub3QgdmFsaWRcbiAgICAgIGRlbGV0ZSBleHRzW2V4dE5hbWVdO1xuICAgICAgcHJvYmxlbVN1bW1hcmllcy5wdXNoKFxuICAgICAgICBgJHt0aGlzLmV4dGVuc2lvblR5cGV9ICR7ZXh0TmFtZX0gaGFkIGVycm9ycyBhbmQgd2lsbCBub3QgYCArXG4gICAgICAgICAgYGJlIGF2YWlsYWJsZS4gRXJyb3JzOmAsXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwcm9ibGVtIG9mIHByb2JsZW1zKSB7XG4gICAgICAgIHByb2JsZW1TdW1tYXJpZXMucHVzaChcbiAgICAgICAgICBgICAtICR7cHJvYmxlbS5lcnJ9IChBY3R1YWwgdmFsdWU6IGAgK1xuICAgICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkocHJvYmxlbS52YWwpfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KHByb2JsZW1TdW1tYXJpZXMpKSB7XG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYEFwcGl1bSBlbmNvdW50ZXJlZCBvbmUgb3IgbW9yZSBlcnJvcnMgd2hpbGUgdmFsaWRhdGluZyBgICtcbiAgICAgICAgICBgdGhlICR7dGhpcy5jb25maWdLZXl9IGV4dGVuc2lvbiBmaWxlICgke3RoaXMubWFuaWZlc3RQYXRofSk6YCxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHN1bW1hcnkgb2YgcHJvYmxlbVN1bW1hcmllcykge1xuICAgICAgICB0aGlzLmxvZyhzdW1tYXJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXh0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPn0gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgZ2V0U2NoZW1hUHJvYmxlbXMgKGV4dERhdGEsIGV4dE5hbWUpIHtcbiAgICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuICAgIGNvbnN0IHtzY2hlbWE6IGFyZ1NjaGVtYVBhdGh9ID0gZXh0RGF0YTtcbiAgICBpZiAoRXh0ZW5zaW9uQ29uZmlnLmV4dERhdGFIYXNTY2hlbWEoZXh0RGF0YSkpIHtcbiAgICAgIGlmIChfLmlzU3RyaW5nKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgIGlmIChpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uKGFyZ1NjaGVtYVBhdGgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgICAgICBlcnI6IGBVbmFibGUgdG8gcmVnaXN0ZXIgc2NoZW1hIGF0IHBhdGggJHthcmdTY2hlbWFQYXRofTsgJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgICBlcnI6IGBTY2hlbWEgZmlsZSBoYXMgdW5zdXBwb3J0ZWQgZXh0ZW5zaW9uLiBBbGxvd2VkOiAke1tcbiAgICAgICAgICAgICAgLi4uQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyxcbiAgICAgICAgICAgIF0uam9pbignLCAnKX1gLFxuICAgICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVhZEV4dGVuc2lvblNjaGVtYShleHROYW1lLCBleHREYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgICAgICBlcnI6IGBVbmFibGUgdG8gcmVnaXN0ZXIgZW1iZWRkZWQgc2NoZW1hOyAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICB2YWw6IGFyZ1NjaGVtYVBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICAgIGVycjogJ0luY29ycmVjdGx5IGZvcm1hdHRlZCBzY2hlbWEgZmllbGQ7IG11c3QgYmUgYSBwYXRoIHRvIGEgc2NoZW1hIGZpbGUgb3IgYSBzY2hlbWEgb2JqZWN0LicsXG4gICAgICAgICAgdmFsOiBhcmdTY2hlbWFQYXRoLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb2JsZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dERhdGFcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9ibGVtW119XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZ2V0R2VuZXJpY0NvbmZpZ1Byb2JsZW1zIChleHREYXRhLCBleHROYW1lKSB7XG4gICAgY29uc3Qge3ZlcnNpb24sIHBrZ05hbWUsIGluc3RhbGxTcGVjLCBpbnN0YWxsVHlwZSwgbWFpbkNsYXNzfSA9XG4gICAgICBleHREYXRhO1xuICAgIGNvbnN0IHByb2JsZW1zID0gW107XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcodmVyc2lvbikpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe2VycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IHZlcnNpb24nLCB2YWw6IHZlcnNpb259KTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGtnTmFtZSkpIHtcbiAgICAgIHByb2JsZW1zLnB1c2goe1xuICAgICAgICBlcnI6ICdNaXNzaW5nIG9yIGluY29ycmVjdCBOUE0gcGFja2FnZSBuYW1lJyxcbiAgICAgICAgdmFsOiBwa2dOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKGluc3RhbGxTcGVjKSkge1xuICAgICAgcHJvYmxlbXMucHVzaCh7XG4gICAgICAgIGVycjogJ01pc3Npbmcgb3IgaW5jb3JyZWN0IGluc3RhbGxhdGlvbiBzcGVjJyxcbiAgICAgICAgdmFsOiBpbnN0YWxsU3BlYyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghSU5TVEFMTF9UWVBFUy5oYXMoaW5zdGFsbFR5cGUpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgaW5zdGFsbCB0eXBlJyxcbiAgICAgICAgdmFsOiBpbnN0YWxsVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghXy5pc1N0cmluZyhtYWluQ2xhc3MpKSB7XG4gICAgICBwcm9ibGVtcy5wdXNoKHtcbiAgICAgICAgZXJyOiAnTWlzc2luZyBvciBpbmNvcnJlY3QgZHJpdmVyIGNsYXNzIG5hbWUnLFxuICAgICAgICB2YWw6IG1haW5DbGFzcyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9ibGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcmV0dXJucyB7UHJvYmxlbVtdfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldENvbmZpZ1Byb2JsZW1zIChleHREYXRhKSB7XG4gICAgLy8gc2hvdWQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgc3BlY2lhbCB2YWxpZGF0aW9uIGlzIG5lY2Vzc2FyeSBmb3IgdGhpcyBleHRlbnNpb24gdHlwZVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzfSBbb3B0c11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZGRFeHRlbnNpb24gKGV4dE5hbWUsIGV4dERhdGEsIHt3cml0ZSA9IHRydWV9ID0ge30pIHtcbiAgICB0aGlzLm1hbmlmZXN0LmFkZEV4dGVuc2lvbih0aGlzLmV4dGVuc2lvblR5cGUsIGV4dE5hbWUsIGV4dERhdGEpO1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdDxFeHRUeXBlPnxpbXBvcnQoJy4uL2NsaS9leHRlbnNpb24tY29tbWFuZCcpLkV4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gZXh0RGF0YVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvbkNvbmZpZ011dGF0aW9uT3B0c30gW29wdHNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRXh0ZW5zaW9uIChleHROYW1lLCBleHREYXRhLCB7d3JpdGUgPSB0cnVlfSA9IHt9KSB7XG4gICAgdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdID0ge1xuICAgICAgLi4udGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdLFxuICAgICAgLi4uZXh0RGF0YSxcbiAgICB9O1xuICAgIGlmICh3cml0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5tYW5pZmVzdC53cml0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db25maWdNdXRhdGlvbk9wdHN9IFtvcHRzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZUV4dGVuc2lvbiAoZXh0TmFtZSwge3dyaXRlID0gdHJ1ZX0gPSB7fSkge1xuICAgIGRlbGV0ZSB0aGlzLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0TmFtZV07XG4gICAgaWYgKHdyaXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hbmlmZXN0LndyaXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0TmFtZTxFeHRUeXBlPltdfSBbYWN0aXZlTmFtZXNdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHByaW50IChhY3RpdmVOYW1lcykge1xuICAgIGlmIChfLmlzRW1wdHkodGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zKSkge1xuICAgICAgbG9nLmluZm8oXG4gICAgICAgIGBObyAke3RoaXMuY29uZmlnS2V5fSBoYXZlIGJlZW4gaW5zdGFsbGVkIGluICR7dGhpcy5hcHBpdW1Ib21lfS4gVXNlIHRoZSBcImFwcGl1bSAke3RoaXMuZXh0ZW5zaW9uVHlwZX1cIiBgICtcbiAgICAgICAgICAnY29tbWFuZCB0byBpbnN0YWxsIHRoZSBvbmUocykgeW91IHdhbnQgdG8gdXNlLicsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5pbmZvKGBBdmFpbGFibGUgJHt0aGlzLmNvbmZpZ0tleX06YCk7XG4gICAgZm9yIChjb25zdCBbXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0RGF0YSxcbiAgICBdIG9mIC8qKiBAdHlwZSB7W3N0cmluZywgRXh0TWFuaWZlc3Q8RXh0VHlwZT5dW119ICovIChcbiAgICAgICAgXy50b1BhaXJzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgICkpIHtcbiAgICAgIGxvZy5pbmZvKGAgIC0gJHt0aGlzLmV4dGVuc2lvbkRlc2MoZXh0TmFtZSwgZXh0RGF0YSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXh0ZW5zaW9uLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50LlxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0V4dE1hbmlmZXN0PEV4dFR5cGU+fSBleHREYXRhIC0gRXh0ZW5zaW9uIGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZXh0ZW5zaW9uRGVzYyAoZXh0TmFtZSwgZXh0RGF0YSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgc3ViY2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0SW5zdGFsbFBhdGggKGV4dE5hbWUpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuYXBwaXVtSG9tZSwgJ25vZGVfbW9kdWxlcycsIHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9uc1tleHROYW1lXS5wa2dOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBleHRlbnNpb24gYW5kIHJldHVybnMgaXRzIG1haW4gY2xhc3MgKGNvbnN0cnVjdG9yKVxuICAgKiBAcGFyYW0ge0V4dE5hbWU8RXh0VHlwZT59IGV4dE5hbWVcbiAgICogQHJldHVybnMge0V4dENsYXNzPEV4dFR5cGU+fVxuICAgKi9cbiAgcmVxdWlyZSAoZXh0TmFtZSkge1xuICAgIGNvbnN0IHttYWluQ2xhc3N9ID0gdGhpcy5pbnN0YWxsZWRFeHRlbnNpb25zW2V4dE5hbWVdO1xuICAgIGNvbnN0IHJlcVBhdGggPSB0aGlzLmdldEluc3RhbGxQYXRoKGV4dE5hbWUpO1xuICAgIGNvbnN0IHJlcVJlc29sdmVkID0gcmVxdWlyZS5yZXNvbHZlKHJlcVBhdGgpO1xuICAgIC8vIG5vdGU6IHRoaXMgd2lsbCBvbmx5IHJlbG9hZCB0aGUgZW50cnkgcG9pbnRcbiAgICBpZiAocHJvY2Vzcy5lbnYuQVBQSVVNX1JFTE9BRF9FWFRFTlNJT05TICYmIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdKSB7XG4gICAgICBsb2cuZGVidWcoYFJlbW92aW5nICR7cmVxUmVzb2x2ZWR9IGZyb20gcmVxdWlyZSBjYWNoZWApO1xuICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxUmVzb2x2ZWRdO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYFJlcXVpcmluZyAke3RoaXMuZXh0ZW5zaW9uVHlwZX0gYXQgJHtyZXFQYXRofWApO1xuICAgIHJldHVybiByZXF1aXJlKHJlcVBhdGgpW21haW5DbGFzc107XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0luc3RhbGxlZCAoZXh0TmFtZSkge1xuICAgIHJldHVybiBfLmluY2x1ZGVzKE9iamVjdC5rZXlzKHRoaXMuaW5zdGFsbGVkRXh0ZW5zaW9ucyksIGV4dE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIG1ldGhvZHMgb2Ygc3ViY2xhc3MuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICAgKiBAcGFyYW0ge0V4dFR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWUgKHVuaXF1ZSB0byBpdHMgdHlwZSlcbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlNjaGVtYU9iamVjdHx1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgX3JlYWRFeHRlbnNpb25TY2hlbWEgKGFwcGl1bUhvbWUsIGV4dFR5cGUsIGV4dE5hbWUsIGV4dERhdGEpIHtcbiAgICBjb25zdCB7cGtnTmFtZSwgc2NoZW1hOiBhcmdTY2hlbWFQYXRofSA9IGV4dERhdGE7XG4gICAgaWYgKCFhcmdTY2hlbWFQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgTm8gXFxgc2NoZW1hXFxgIHByb3BlcnR5IGZvdW5kIGluIGNvbmZpZyBmb3IgJHtleHRUeXBlfSAke3BrZ05hbWV9IC0tIHdoeSBpcyB0aGlzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZD9gLFxuICAgICAgKTtcbiAgICB9XG4gICAgbGV0IG1vZHVsZU9iamVjdDtcbiAgICBpZiAoXy5pc1N0cmluZyhhcmdTY2hlbWFQYXRoKSkge1xuICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9IHJlc29sdmVGcm9tKGFwcGl1bUhvbWUsIHBhdGguam9pbihwa2dOYW1lLCBhcmdTY2hlbWFQYXRoKSk7XG4gICAgICBtb2R1bGVPYmplY3QgPSByZXF1aXJlKHNjaGVtYVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb2R1bGVPYmplY3QgPSBhcmdTY2hlbWFQYXRoO1xuICAgIH1cbiAgICAvLyB0aGlzIHN1Y2tzLiBkZWZhdWx0IGV4cG9ydHMgc2hvdWxkIGJlIGRlc3Ryb3llZFxuICAgIGNvbnN0IHNjaGVtYSA9IG1vZHVsZU9iamVjdC5fX2VzTW9kdWxlXG4gICAgICA/IG1vZHVsZU9iamVjdC5kZWZhdWx0XG4gICAgICA6IG1vZHVsZU9iamVjdDtcbiAgICByZWdpc3RlclNjaGVtYShleHRUeXBlLCBleHROYW1lLCBzY2hlbWEpO1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBzcGVjaWZpYyB7QGxpbmsgRXh0TWFuaWZlc3R9IG9iamVjdCBoYXMgYSBgc2NoZW1hYCBwcm9wLlxuICAgKiBUaGUge0BsaW5rIEV4dE1hbmlmZXN0fSBvYmplY3QgYmVjb21lcyBhIHtAbGluayBFeHRNYW5pZmVzdFdpdGhTY2hlbWF9IG9iamVjdC5cbiAgICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gICAqIEBwYXJhbSB7RXh0TWFuaWZlc3Q8RXh0VHlwZT59IGV4dERhdGFcbiAgICogQHJldHVybnMge2V4dERhdGEgaXMgRXh0TWFuaWZlc3RXaXRoU2NoZW1hPEV4dFR5cGU+fVxuICAgKi9cbiAgc3RhdGljIGV4dERhdGFIYXNTY2hlbWEgKGV4dERhdGEpIHtcbiAgICByZXR1cm4gXy5pc1N0cmluZyhleHREYXRhPy5zY2hlbWEpIHx8IF8uaXNPYmplY3QoZXh0RGF0YT8uc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhbiBleHRlbnNpb24gcHJvdmlkZXMgYSBzY2hlbWEsIHRoaXMgd2lsbCBsb2FkIHRoZSBzY2hlbWEgYW5kIGF0dGVtcHQgdG9cbiAgICogcmVnaXN0ZXIgaXQgd2l0aCB0aGUgc2NoZW1hIHJlZ2lzdHJhci5cbiAgICogQHBhcmFtIHtFeHROYW1lPEV4dFR5cGU+fSBleHROYW1lIC0gTmFtZSBvZiBleHRlbnNpb25cbiAgICogQHBhcmFtIHtFeHRNYW5pZmVzdFdpdGhTY2hlbWE8RXh0VHlwZT59IGV4dERhdGEgLSBFeHRlbnNpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3R8dW5kZWZpbmVkfVxuICAgKi9cbiAgcmVhZEV4dGVuc2lvblNjaGVtYSAoZXh0TmFtZSwgZXh0RGF0YSkge1xuICAgIHJldHVybiBFeHRlbnNpb25Db25maWcuX3JlYWRFeHRlbnNpb25TY2hlbWEoXG4gICAgICB0aGlzLmFwcGl1bUhvbWUsXG4gICAgICB0aGlzLmV4dGVuc2lvblR5cGUsXG4gICAgICBleHROYW1lLFxuICAgICAgZXh0RGF0YSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIElOU1RBTExfVFlQRV9OUE0sXG4gIElOU1RBTExfVFlQRV9HSVQsXG4gIElOU1RBTExfVFlQRV9MT0NBTCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFUyxcbn07XG5cbi8qKlxuICogQ29uZmlnIHByb2JsZW1cbiAqIEB0eXBlZGVmIFByb2JsZW1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlcnIgLSBFcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge2FueX0gdmFsIC0gQXNzb2NpYXRlZCB2YWx1ZVxuICovXG5cbi8qKlxuICogQW4gb3B0aW9uYWwgbG9nZ2luZyBmdW5jdGlvbiBwcm92aWRlZCB0byBhbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfSBzdWJjbGFzcy5cbiAqIEBjYWxsYmFjayBFeHRlbnNpb25Mb2dGblxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuL21hbmlmZXN0JykuTWFuaWZlc3R9IE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3Q8VD59IEV4dE1hbmlmZXN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0TWFuaWZlc3RXaXRoU2NoZW1hPFQ+fSBFeHRNYW5pZmVzdFdpdGhTY2hlbWFcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi8uLi90eXBlcy9hcHBpdW0tbWFuaWZlc3QnKS5FeHROYW1lPFQ+fSBFeHROYW1lXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvZXh0ZW5zaW9uJykuRXh0Q2xhc3M8VD59IEV4dENsYXNzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vLi4vdHlwZXMvYXBwaXVtLW1hbmlmZXN0JykuRXh0UmVjb3JkPFQ+fSBFeHRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHZhcmlvdXMgbWV0aG9kcyBpbiB7QGxpbmsgRXh0ZW5zaW9uQ29uZmlnfVxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29uZmlnTXV0YXRpb25PcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt3cml0ZT10cnVlXSBXaGV0aGVyIG9yIG5vdCB0byB3cml0ZSB0aGUgbWFuaWZlc3QgdG8gZGlzayBhZnRlciBhIG11dGF0aW9uIG9wZXJhdGlvblxuICovXG5cbi8qKlxuICogQSB2YWxpZCBpbnN0YWxsIHR5cGVcbiAqIEB0eXBlZGVmIHt0eXBlb2YgSU5TVEFMTF9UWVBFX05QTSB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfR0lUIHwgdHlwZW9mIElOU1RBTExfVFlQRV9MT0NBTCB8IHR5cGVvZiBJTlNUQUxMX1RZUEVfR0lUSFVCfSBJbnN0YWxsVHlwZVxuICovXG4iXX0=
@@ -0,0 +1,39 @@
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 {import('../../types').PluginClass[]}
22
+ */
23
+ export function getActivePlugins(pluginConfig: import('./plugin-config').PluginConfig, usePlugins?: string[]): import('../../types').PluginClass[];
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
+ */
32
+ export function getActiveDrivers(driverConfig: import('./driver-config').DriverConfig, useDrivers?: string[] | undefined): any[];
33
+ export type ExtensionConfigs = {
34
+ driverConfig: DriverConfig;
35
+ pluginConfig: PluginConfig;
36
+ };
37
+ import { DriverConfig } from "./driver-config";
38
+ import { PluginConfig } from "./plugin-config";
39
+ //# 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,CAYrC;AAED;;;;;;;;;GASG;AACH,+CAJW,OAAO,iBAAiB,EAAE,YAAY,eACtC,MAAM,EAAE,GACN,OAAO,aAAa,EAAE,WAAW,EAAE,CA0B/C;AAED;;;;;;;GAOG;AACH,+CAHW,OAAO,iBAAiB,EAAE,YAAY,4CAuBhD;;kBAIa,YAAY;kBACZ,YAAY"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.getActiveDrivers = getActiveDrivers;
9
+ exports.getActivePlugins = getActivePlugins;
10
+ exports.loadExtensions = loadExtensions;
11
+
12
+ require("source-map-support/register");
13
+
14
+ var _lodash = _interopRequireDefault(require("lodash"));
15
+
16
+ var _constants = require("../constants");
17
+
18
+ var _logger = _interopRequireDefault(require("../logger"));
19
+
20
+ var _driverConfig = require("./driver-config");
21
+
22
+ var _manifest = require("./manifest");
23
+
24
+ var _pluginConfig = require("./plugin-config");
25
+
26
+ async function loadExtensions(appiumHome) {
27
+ var _DriverConfig$getInst, _PluginConfig$getInst;
28
+
29
+ const manifest = _manifest.Manifest.getInstance(appiumHome);
30
+
31
+ const {
32
+ drivers,
33
+ plugins
34
+ } = await manifest.read();
35
+ const driverConfig = (_DriverConfig$getInst = _driverConfig.DriverConfig.getInstance(manifest)) !== null && _DriverConfig$getInst !== void 0 ? _DriverConfig$getInst : _driverConfig.DriverConfig.create(manifest, {
36
+ extData: drivers
37
+ });
38
+ const pluginConfig = (_PluginConfig$getInst = _pluginConfig.PluginConfig.getInstance(manifest)) !== null && _PluginConfig$getInst !== void 0 ? _PluginConfig$getInst : _pluginConfig.PluginConfig.create(manifest, {
39
+ extData: plugins
40
+ });
41
+ return {
42
+ driverConfig,
43
+ pluginConfig
44
+ };
45
+ }
46
+
47
+ function getActivePlugins(pluginConfig, usePlugins = []) {
48
+ return _lodash.default.compact(Object.keys(pluginConfig.installedExtensions).filter(pluginName => _lodash.default.includes(usePlugins, pluginName) || usePlugins.length === 1 && usePlugins[0] === _constants.USE_ALL_PLUGINS).map(pluginName => {
49
+ try {
50
+ _logger.default.info(`Attempting to load plugin ${pluginName}...`);
51
+
52
+ const PluginClass = pluginConfig.require(pluginName);
53
+
54
+ PluginClass.pluginName = pluginName;
55
+ return PluginClass;
56
+ } catch (err) {
57
+ _logger.default.error(`Could not load plugin '${pluginName}', so it will not be available. Error ` + `in loading the plugin was: ${err.message}`);
58
+
59
+ _logger.default.debug(err.stack);
60
+ }
61
+ }));
62
+ }
63
+
64
+ function getActiveDrivers(driverConfig, useDrivers = []) {
65
+ return _lodash.default.compact(Object.keys(driverConfig.installedExtensions).filter(driverName => _lodash.default.includes(useDrivers, driverName) || useDrivers.length === 0).map(driverName => {
66
+ try {
67
+ _logger.default.info(`Attempting to load driver ${driverName}...`);
68
+
69
+ return driverConfig.require(driverName);
70
+ } catch (err) {
71
+ _logger.default.error(`Could not load driver '${driverName}', so it will not be available. Error ` + `in loading the driver was: ${err.message}`);
72
+
73
+ _logger.default.debug(err.stack);
74
+ }
75
+ }));
76
+ }
77
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9leHRlbnNpb24vaW5kZXguanMiXSwibmFtZXMiOlsibG9hZEV4dGVuc2lvbnMiLCJhcHBpdW1Ib21lIiwibWFuaWZlc3QiLCJNYW5pZmVzdCIsImdldEluc3RhbmNlIiwiZHJpdmVycyIsInBsdWdpbnMiLCJyZWFkIiwiZHJpdmVyQ29uZmlnIiwiRHJpdmVyQ29uZmlnIiwiY3JlYXRlIiwiZXh0RGF0YSIsInBsdWdpbkNvbmZpZyIsIlBsdWdpbkNvbmZpZyIsImdldEFjdGl2ZVBsdWdpbnMiLCJ1c2VQbHVnaW5zIiwiXyIsImNvbXBhY3QiLCJPYmplY3QiLCJrZXlzIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsImZpbHRlciIsInBsdWdpbk5hbWUiLCJpbmNsdWRlcyIsImxlbmd0aCIsIlVTRV9BTExfUExVR0lOUyIsIm1hcCIsImxvZyIsImluZm8iLCJQbHVnaW5DbGFzcyIsInJlcXVpcmUiLCJlcnIiLCJlcnJvciIsIm1lc3NhZ2UiLCJkZWJ1ZyIsInN0YWNrIiwiZ2V0QWN0aXZlRHJpdmVycyIsInVzZURyaXZlcnMiLCJkcml2ZXJOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBYU8sZUFBZUEsY0FBZixDQUErQkMsVUFBL0IsRUFBMkM7QUFBQTs7QUFDaEQsUUFBTUMsUUFBUSxHQUFHQyxtQkFBU0MsV0FBVCxDQUFxQkgsVUFBckIsQ0FBakI7O0FBQ0EsUUFBTTtBQUFDSSxJQUFBQSxPQUFEO0FBQVVDLElBQUFBO0FBQVYsTUFBcUIsTUFBTUosUUFBUSxDQUFDSyxJQUFULEVBQWpDO0FBQ0EsUUFBTUMsWUFBWSw0QkFDaEJDLDJCQUFhTCxXQUFiLENBQXlCRixRQUF6QixDQURnQix5RUFFaEJPLDJCQUFhQyxNQUFiLENBQW9CUixRQUFwQixFQUE4QjtBQUFDUyxJQUFBQSxPQUFPLEVBQUVOO0FBQVYsR0FBOUIsQ0FGRjtBQUdBLFFBQU1PLFlBQVksNEJBQ2hCQywyQkFBYVQsV0FBYixDQUF5QkYsUUFBekIsQ0FEZ0IseUVBRWhCVywyQkFBYUgsTUFBYixDQUFvQlIsUUFBcEIsRUFBOEI7QUFBQ1MsSUFBQUEsT0FBTyxFQUFFTDtBQUFWLEdBQTlCLENBRkY7QUFHQSxTQUFPO0FBQUNFLElBQUFBLFlBQUQ7QUFBZUksSUFBQUE7QUFBZixHQUFQO0FBQ0Q7O0FBWU0sU0FBU0UsZ0JBQVQsQ0FBMkJGLFlBQTNCLEVBQXlDRyxVQUFVLEdBQUcsRUFBdEQsRUFBMEQ7QUFDL0QsU0FBT0MsZ0JBQUVDLE9BQUYsQ0FDTEMsTUFBTSxDQUFDQyxJQUFQLENBQVlQLFlBQVksQ0FBQ1EsbUJBQXpCLEVBQ0dDLE1BREgsQ0FFS0MsVUFBRCxJQUNFTixnQkFBRU8sUUFBRixDQUFXUixVQUFYLEVBQXVCTyxVQUF2QixLQUNDUCxVQUFVLENBQUNTLE1BQVgsS0FBc0IsQ0FBdEIsSUFBMkJULFVBQVUsQ0FBQyxDQUFELENBQVYsS0FBa0JVLDBCQUpwRCxFQU1HQyxHQU5ILENBTVFKLFVBQUQsSUFBZ0I7QUFDbkIsUUFBSTtBQUNGSyxzQkFBSUMsSUFBSixDQUFVLDZCQUE0Qk4sVUFBVyxLQUFqRDs7QUFDQSxZQUFNTyxXQUFXLEdBQUdqQixZQUFZLENBQUNrQixPQUFiLENBQXFCUixVQUFyQixDQUFwQjs7QUFFQU8sTUFBQUEsV0FBVyxDQUFDUCxVQUFaLEdBQXlCQSxVQUF6QjtBQUNBLGFBQU9PLFdBQVA7QUFDRCxLQU5ELENBTUUsT0FBT0UsR0FBUCxFQUFZO0FBQ1pKLHNCQUFJSyxLQUFKLENBQ0csMEJBQXlCVixVQUFXLHdDQUFyQyxHQUNHLDhCQUE2QlMsR0FBRyxDQUFDRSxPQUFRLEVBRjlDOztBQUlBTixzQkFBSU8sS0FBSixDQUFVSCxHQUFHLENBQUNJLEtBQWQ7QUFDRDtBQUNGLEdBcEJILENBREssQ0FBUDtBQXVCRDs7QUFVTSxTQUFTQyxnQkFBVCxDQUEyQjVCLFlBQTNCLEVBQXlDNkIsVUFBVSxHQUFHLEVBQXRELEVBQTBEO0FBQy9ELFNBQU9yQixnQkFBRUMsT0FBRixDQUNMQyxNQUFNLENBQUNDLElBQVAsQ0FBWVgsWUFBWSxDQUFDWSxtQkFBekIsRUFDR0MsTUFESCxDQUVLaUIsVUFBRCxJQUNFdEIsZ0JBQUVPLFFBQUYsQ0FBV2MsVUFBWCxFQUF1QkMsVUFBdkIsS0FBc0NELFVBQVUsQ0FBQ2IsTUFBWCxLQUFzQixDQUhsRSxFQUtHRSxHQUxILENBS1FZLFVBQUQsSUFBZ0I7QUFDbkIsUUFBSTtBQUNGWCxzQkFBSUMsSUFBSixDQUFVLDZCQUE0QlUsVUFBVyxLQUFqRDs7QUFDQSxhQUFPOUIsWUFBWSxDQUFDc0IsT0FBYixDQUFxQlEsVUFBckIsQ0FBUDtBQUNELEtBSEQsQ0FHRSxPQUFPUCxHQUFQLEVBQVk7QUFDWkosc0JBQUlLLEtBQUosQ0FDRywwQkFBeUJNLFVBQVcsd0NBQXJDLEdBQ0csOEJBQTZCUCxHQUFHLENBQUNFLE9BQVEsRUFGOUM7O0FBSUFOLHNCQUFJTyxLQUFKLENBQVVILEdBQUcsQ0FBQ0ksS0FBZDtBQUNEO0FBQ0YsR0FoQkgsQ0FESyxDQUFQO0FBbUJEIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVVNFX0FMTF9QTFVHSU5TIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IERyaXZlckNvbmZpZyB9IGZyb20gJy4vZHJpdmVyLWNvbmZpZyc7XG5pbXBvcnQgeyBNYW5pZmVzdCB9IGZyb20gJy4vbWFuaWZlc3QnO1xuaW1wb3J0IHsgUGx1Z2luQ29uZmlnIH0gZnJvbSAnLi9wbHVnaW4tY29uZmlnJztcblxuLyoqXG4gKiBMb2FkcyBleHRlbnNpb25zIGFuZCBjcmVhdGVzIGBFeHRlbnNpb25Db25maWdgIGluc3RhbmNlcy5cbiAqXG4gKiAtIFJlYWRzIHRoZSBtYW5pZmVzdCBmaWxlLCBjcmVhdGluZyBpZiBuZWNlc3NhcnlcbiAqIC0gVXNpbmcgdGhlIHBhcnNlZCBleHRlbnNpb24gZGF0YSwgY3JlYXRlcy9nZXRzIHRoZSBgRXh0ZW5zaW9uQ29uZmlnYCBzdWJjbGFzcyBpbnN0YW5jZXNcbiAqIC0gUmV0dXJucyB0aGVzZSBpbnN0YW5jZXNcbiAqXG4gKiBJZiBgYXBwaXVtSG9tZWAgaXMgbmVlZGVkLCB1c2UgYHJlc29sdmVBcHBpdW1Ib21lYCBmcm9tIHRoZSBgZW52YCBtb2R1bGUgaW4gYEBhcHBpdW0vc3VwcG9ydGAuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZVxuICogQHJldHVybnMge1Byb21pc2U8RXh0ZW5zaW9uQ29uZmlncz59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRXh0ZW5zaW9ucyAoYXBwaXVtSG9tZSkge1xuICBjb25zdCBtYW5pZmVzdCA9IE1hbmlmZXN0LmdldEluc3RhbmNlKGFwcGl1bUhvbWUpO1xuICBjb25zdCB7ZHJpdmVycywgcGx1Z2luc30gPSBhd2FpdCBtYW5pZmVzdC5yZWFkKCk7XG4gIGNvbnN0IGRyaXZlckNvbmZpZyA9XG4gICAgRHJpdmVyQ29uZmlnLmdldEluc3RhbmNlKG1hbmlmZXN0KSA/P1xuICAgIERyaXZlckNvbmZpZy5jcmVhdGUobWFuaWZlc3QsIHtleHREYXRhOiBkcml2ZXJzfSk7XG4gIGNvbnN0IHBsdWdpbkNvbmZpZyA9XG4gICAgUGx1Z2luQ29uZmlnLmdldEluc3RhbmNlKG1hbmlmZXN0KSA/P1xuICAgIFBsdWdpbkNvbmZpZy5jcmVhdGUobWFuaWZlc3QsIHtleHREYXRhOiBwbHVnaW5zfSk7XG4gIHJldHVybiB7ZHJpdmVyQ29uZmlnLCBwbHVnaW5Db25maWd9O1xufVxuXG4vKipcbiAqIEZpbmQgYW55IHBsdWdpbiBuYW1lIHdoaWNoIGhhcyBiZWVuIGluc3RhbGxlZCwgYW5kIHdoaWNoIGhhcyBiZWVuIHJlcXVlc3RlZCBmb3IgYWN0aXZhdGlvbiBieVxuICogdXNpbmcgdGhlIC0tdXNlLXBsdWdpbnMgZmxhZywgYW5kIHR1cm4gZWFjaCBvbmUgaW50byBpdHMgY2xhc3MsIHNvIHdlIGNhbiBzZW5kIHRoZW0gYXMgb2JqZWN0c1xuICogdG8gdGhlIHNlcnZlciBpbml0LiBXZSBhbHNvIHdhbnQgdG8gc2VuZC9hc3NpZ24gdGhlbSB0byB0aGUgdW1icmVsbGEgZHJpdmVyIHNvIGl0IGNhbiB1c2UgdGhlbVxuICogdG8gd3JhcCBjb21tYW5kIGV4ZWN1dGlvblxuICpcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3BsdWdpbi1jb25maWcnKS5QbHVnaW5Db25maWd9IHBsdWdpbkNvbmZpZyAtIGEgcGx1Z2luIGV4dGVuc2lvbiBjb25maWdcbiAqIEBwYXJhbSB7c3RyaW5nW119IHVzZVBsdWdpbnNcbiAqIEByZXR1cm5zIHtpbXBvcnQoJy4uLy4uL3R5cGVzJykuUGx1Z2luQ2xhc3NbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVBsdWdpbnMgKHBsdWdpbkNvbmZpZywgdXNlUGx1Z2lucyA9IFtdKSB7XG4gIHJldHVybiBfLmNvbXBhY3QoXG4gICAgT2JqZWN0LmtleXMocGx1Z2luQ29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocGx1Z2luTmFtZSkgPT5cbiAgICAgICAgICBfLmluY2x1ZGVzKHVzZVBsdWdpbnMsIHBsdWdpbk5hbWUpIHx8XG4gICAgICAgICAgKHVzZVBsdWdpbnMubGVuZ3RoID09PSAxICYmIHVzZVBsdWdpbnNbMF0gPT09IFVTRV9BTExfUExVR0lOUyksXG4gICAgICApXG4gICAgICAubWFwKChwbHVnaW5OYW1lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmluZm8oYEF0dGVtcHRpbmcgdG8gbG9hZCBwbHVnaW4gJHtwbHVnaW5OYW1lfS4uLmApO1xuICAgICAgICAgIGNvbnN0IFBsdWdpbkNsYXNzID0gcGx1Z2luQ29uZmlnLnJlcXVpcmUocGx1Z2luTmFtZSk7XG5cbiAgICAgICAgICBQbHVnaW5DbGFzcy5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTsgLy8gc3RvcmUgdGhlIHBsdWdpbiBuYW1lIG9uIHRoZSBjbGFzcyBzbyBpdCBjYW4gYmUgdXNlZCBsYXRlclxuICAgICAgICAgIHJldHVybiBQbHVnaW5DbGFzcztcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYENvdWxkIG5vdCBsb2FkIHBsdWdpbiAnJHtwbHVnaW5OYW1lfScsIHNvIGl0IHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gRXJyb3IgYCArXG4gICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBwbHVnaW4gd2FzOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2cuZGVidWcoZXJyLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogRmluZCBhbnkgZHJpdmVyIG5hbWUgd2hpY2ggaGFzIGJlZW4gaW5zdGFsbGVkLCBhbmQgdHVybiBlYWNoIG9uZSBpbnRvIGl0cyBjbGFzcywgc28gd2UgY2FuIHNlbmRcbiAqIHRoZW0gYXMgb2JqZWN0cyB0byB0aGUgc2VydmVyIGluaXQgaW4gY2FzZSB0aGV5IG5lZWQgdG8gYWRkIG1ldGhvZHMvcm91dGVzIG9yIHVwZGF0ZSB0aGUgc2VydmVyLlxuICogSWYgdGhlIC0tZHJpdmVycyBmbGFnIHdhcyBnaXZlbiwgdGhpcyBtZXRob2Qgb25seSBsb2FkcyB0aGUgZ2l2ZW4gZHJpdmVycy5cbiAqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9kcml2ZXItY29uZmlnJykuRHJpdmVyQ29uZmlnfSBkcml2ZXJDb25maWcgLSBhIGRyaXZlciBleHRlbnNpb24gY29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbdXNlRHJpdmVyc10gLSBvcHRpb25hbCBsaXN0IG9mIGRyaXZlcnMgdG8gbG9hZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlRHJpdmVycyAoZHJpdmVyQ29uZmlnLCB1c2VEcml2ZXJzID0gW10pIHtcbiAgcmV0dXJuIF8uY29tcGFjdChcbiAgICBPYmplY3Qua2V5cyhkcml2ZXJDb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChkcml2ZXJOYW1lKSA9PlxuICAgICAgICAgIF8uaW5jbHVkZXModXNlRHJpdmVycywgZHJpdmVyTmFtZSkgfHwgdXNlRHJpdmVycy5sZW5ndGggPT09IDAsXG4gICAgICApXG4gICAgICAubWFwKChkcml2ZXJOYW1lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nLmluZm8oYEF0dGVtcHRpbmcgdG8gbG9hZCBkcml2ZXIgJHtkcml2ZXJOYW1lfS4uLmApO1xuICAgICAgICAgIHJldHVybiBkcml2ZXJDb25maWcucmVxdWlyZShkcml2ZXJOYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYENvdWxkIG5vdCBsb2FkIGRyaXZlciAnJHtkcml2ZXJOYW1lfScsIHNvIGl0IHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gRXJyb3IgYCArXG4gICAgICAgICAgICAgIGBpbiBsb2FkaW5nIHRoZSBkcml2ZXIgd2FzOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2cuZGVidWcoZXJyLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgRXh0ZW5zaW9uQ29uZmlnc1xuICogQHByb3BlcnR5IHtEcml2ZXJDb25maWd9IGRyaXZlckNvbmZpZ1xuICogQHByb3BlcnR5IHtQbHVnaW5Db25maWd9IHBsdWdpbkNvbmZpZ1xuICovXG4iXX0=
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Handles reading & writing of extension config files.
3
+ *
4
+ * Only one instance of this class exists per value of `APPIUM_HOME`.
5
+ */
6
+ export class Manifest {
7
+ /**
8
+ * Returns a new or existing {@link Manifest} instance, based on the value of `appiumHome`.
9
+ *
10
+ * Maintains one instance per value of `appiumHome`.
11
+ * @param {string} appiumHome - Path to `APPIUM_HOME`
12
+ * @returns {Manifest}
13
+ */
14
+ static getInstance: ((appiumHome: any) => Manifest) & _.MemoizedFunction;
15
+ /**
16
+ * Sets internal data to a fresh clone of {@link INITIAL_MANIFEST_DATA}
17
+ *
18
+ * Use {@link Manifest.getInstance} instead.
19
+ * @param {string} appiumHome
20
+ * @private
21
+ */
22
+ private constructor();
23
+ /**
24
+ * The entire contents of a parsed YAML extension config file.
25
+ *
26
+ * Contains proxies for automatic persistence on disk
27
+ * @type {ManifestData}
28
+ * @private
29
+ */
30
+ private _data;
31
+ /**
32
+ * Path to `APPIUM_HOME`.
33
+ * @private
34
+ * @type {Readonly<string>}
35
+ */
36
+ private _appiumHome;
37
+ /**
38
+ * Path to `extensions.yaml`
39
+ * @type {string}
40
+ * Not set until {@link Manifest.read} is called.
41
+ */
42
+ _manifestPath: string;
43
+ /**
44
+ * Helps avoid writing multiple times.
45
+ *
46
+ * If this is `undefined`, calling {@link Manifest.write} will cause it to be
47
+ * set to a `Promise`. When the call to `write()` is complete, the `Promise`
48
+ * will resolve and then this value will be set to `undefined`. Concurrent calls
49
+ * made while this value is a `Promise` will return the `Promise` itself.
50
+ * @private
51
+ * @type {Promise<boolean>|undefined}
52
+ */
53
+ private _writing;
54
+ /**
55
+ * Helps avoid reading multiple times.
56
+ *
57
+ * If this is `undefined`, calling {@link Manifest.read} will cause it to be
58
+ * set to a `Promise`. When the call to `read()` is complete, the `Promise`
59
+ * will resolve and then this value will be set to `undefined`. Concurrent calls
60
+ * made while this value is a `Promise` will return the `Promise` itself.
61
+ * @private
62
+ * @type {Promise<void>|undefined}
63
+ */
64
+ private _reading;
65
+ /**
66
+ * Searches `APPIUM_HOME` for installed extensions and adds them to the manifest.
67
+ * @param {SyncWithInstalledExtensionsOpts} opts
68
+ * @returns {Promise<boolean>} `true` if any extensions were added, `false` otherwise.
69
+ */
70
+ syncWithInstalledExtensions({ depthLimit }?: SyncWithInstalledExtensionsOpts): Promise<boolean>;
71
+ /**
72
+ * Returns `true` if driver with name `name` is registered.
73
+ * @param {string} name - Driver name
74
+ * @returns {boolean}
75
+ */
76
+ hasDriver(name: string): boolean;
77
+ /**
78
+ * Returns `true` if plugin with name `name` is registered.
79
+ * @param {string} name - Plugin name
80
+ * @returns {boolean}
81
+ */
82
+ hasPlugin(name: string): boolean;
83
+ /**
84
+ * Given a path to a `package.json`, add it as either a driver or plugin to the manifest.
85
+ *
86
+ * Will _not_ overwrite existing entries.
87
+ * @template {ExtensionType} ExtType
88
+ * @param {ExtPackageJson<ExtType>} pkgJson
89
+ * @param {string} pkgPath
90
+ * @returns {boolean} - `true` upon success, `false` if the extension is already registered.
91
+ */
92
+ addExtensionFromPackage<ExtType extends import("../../types").ExtensionType>(pkgJson: ExtPackageJson<ExtType>, pkgPath: string): boolean;
93
+ /**
94
+ * Adds an extension to the manifest as was installed by the `appium` CLI. The
95
+ * `extData`, `extType`, and `extName` have already been determined.
96
+ *
97
+ * See {@link Manifest.addExtensionFromPackage} for adding an extension from an on-disk package.
98
+ * @template {ExtensionType} ExtType
99
+ * @param {ExtType} extType - `driver` or `plugin`
100
+ * @param {string} extName - Name of extension
101
+ * @param {ExtManifest<ExtType>} extData - Extension metadata
102
+ * @returns {void}
103
+ */
104
+ addExtension<ExtType_1 extends import("../../types").ExtensionType>(extType: ExtType_1, extName: string, extData: ExtManifest<ExtType_1>): void;
105
+ /**
106
+ * Returns the APPIUM_HOME path
107
+ */
108
+ get appiumHome(): string;
109
+ /**
110
+ * Returns the path to the manifest file
111
+ */
112
+ get manifestPath(): string;
113
+ /**
114
+ * Returns extension data for a particular type.
115
+ *
116
+ * @template {ExtensionType} ExtType
117
+ * @param {ExtType} extType
118
+ * @returns {ExtRecord<ExtType>}
119
+ */
120
+ getExtensionData<ExtType_2 extends import("../../types").ExtensionType>(extType: ExtType_2): ExtRecord<ExtType_2>;
121
+ /**
122
+ * Reads manifest from disk and _overwrites_ the internal data.
123
+ *
124
+ * If the manifest does not exist on disk, an {@link INITIAL_MANIFEST_DATA "empty"} manifest file will be created.
125
+ *
126
+ * If `APPIUM_HOME` contains a `package.json` with an `appium` dependency, then a hash of the `package.json` will be taken. If this hash differs from the last hash, the contents of `APPIUM_HOME/node_modules` will be scanned for extensions that may have been installed outside of the `appium` CLI. Any found extensions will be added to the manifest file, and if so, the manifest file will be written to disk.
127
+ *
128
+ * Only one read operation should happen at a time. This is controlled via the {@link Manifest._reading} property.
129
+ * @returns {Promise<ManifestData>} The data
130
+ */
131
+ read(): Promise<ManifestData>;
132
+ /**
133
+ * Ensures {@link Manifest._manifestPath} is set.
134
+ *
135
+ * Creates the directory if necessary.
136
+ * @private
137
+ * @returns {Promise<string>}
138
+ */
139
+ private _setManifestPath;
140
+ /**
141
+ * Writes the data if it need s writing.
142
+ *
143
+ * If the `schemaRev` prop needs updating, the file will be written.
144
+ *
145
+ * @todo If this becomes too much of a bottleneck, throttle it.
146
+ * @returns {Promise<boolean>} Whether the data was written
147
+ */
148
+ write(): Promise<boolean>;
149
+ }
150
+ /**
151
+ * Type of the string referring to a driver (typically as a key or type string)
152
+ */
153
+ export type DriverType = import('../../types').DriverType;
154
+ /**
155
+ * Type of the string referring to a plugin (typically as a key or type string)
156
+ */
157
+ export type PluginType = import('../../types').PluginType;
158
+ export type SyncWithInstalledExtensionsOpts = {
159
+ /**
160
+ * - Maximum depth to recurse into subdirectories
161
+ */
162
+ depthLimit?: number | undefined;
163
+ };
164
+ export type ManifestData = import('../../types/appium-manifest').ManifestData;
165
+ export type InternalMetadata = import('../../types/appium-manifest').InternalMetadata;
166
+ export type ExtPackageJson<T> = import('../../types/external-manifest').ExtPackageJson<T>;
167
+ export type ExtManifest<T> = import('../../types/appium-manifest').ExtManifest<T>;
168
+ export type ExtRecord<T> = import('../../types/appium-manifest').ExtRecord<T>;
169
+ /**
170
+ * Either `driver` or `plugin` rn
171
+ */
172
+ export type ExtensionType = import('../../types').ExtensionType;
173
+ import _ from "lodash";
174
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../lib/extension/manifest.js"],"names":[],"mappings":"AAqGA;;;;GAIG;AACH;IA4DE;;;;;;OAMG;IACH,yEAIG;IAvBH;;;;;;OAMG;IACH,sBAGC;IAzDD;;;;;;OAMG;IACH,cAAM;IAEN;;;;OAIG;IACH,oBAAY;IAEZ;;;;OAIG;IACH,eAHU,MAAM,CAGF;IAEd;;;;;;;;;OASG;IACH,iBAAS;IAET;;;;;;;;;OASG;IACH,iBAAS;IA2BT;;;;OAIG;IACH,6CAHW,+BAA+B,GAC7B,QAAQ,OAAO,CAAC,CA0B5B;IAED;;;;OAIG;IACH,gBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;OAIG;IACH,gBAHW,MAAM,GACJ,OAAO,CAInB;IAED;;;;;;;;OAQG;IACH,wHAHW,MAAM,GACJ,OAAO,CAsCnB;IAED;;;;;;;;;;OAUG;IACH,iGAJW,MAAM,oCAEJ,IAAI,CAIhB;IAED;;OAEG;IACH,yBAEC;IAED;;OAEG;IACH,2BAEC;IAED;;;;;;OAMG;IACH,kHAEC;IAED;;;;;;;;;OASG;IACH,QAFa,QAAQ,YAAY,CAAC,CAsDjC;IAED;;;;;;OAMG;IACH,yBAaC;IAED;;;;;;;OAOG;IACH,SAFa,QAAQ,OAAO,CAAC,CAoC5B;CACF;;;;yBAIY,OAAO,aAAa,EAAE,UAAU;;;;yBAKhC,OAAO,aAAa,EAAE,UAAU;;;;;;;2BAShC,OAAO,6BAA6B,EAAE,YAAY;+BAClD,OAAO,6BAA6B,EAAE,gBAAgB;gCAKtD,OAAO,+BAA+B,EAAE,cAAc,CAAC,CAAC,CAAC;6BAKzD,OAAO,6BAA6B,EAAE,WAAW,CAAC,CAAC,CAAC;2BAKpD,OAAO,6BAA6B,EAAE,SAAS,CAAC,CAAC,CAAC;;;;4BAKlD,OAAO,aAAa,EAAE,aAAa"}