appium-android-driver 5.7.3 → 5.8.1
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.
- package/CHANGELOG.md +14 -0
- package/build/lib/commands/general.js +1 -70
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/index.js +3 -2
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/permissions.js +116 -0
- package/build/lib/commands/permissions.js.map +1 -0
- package/build/lib/commands/shell.js +4 -4
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/utils.js +4 -1
- package/build/lib/utils.js.map +1 -1
- package/lib/commands/general.js +0 -112
- package/lib/commands/index.js +2 -0
- package/lib/commands/permissions.js +169 -0
- package/lib/commands/shell.js +2 -3
- package/lib/utils.js +2 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [5.8.1](https://github.com/appium/appium-android-driver/compare/v5.8.0...v5.8.1) (2022-12-01)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Miscellaneous Chores
|
|
5
|
+
|
|
6
|
+
* update releaserc ([#775](https://github.com/appium/appium-android-driver/issues/775)) ([2db920a](https://github.com/appium/appium-android-driver/commit/2db920a338f017440a4a9713ee6daa0902d71786))
|
|
7
|
+
|
|
8
|
+
# [5.8.0](https://github.com/appium/appium-android-driver/compare/v5.7.3...v5.8.0) (2022-11-29)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* Enable permissions changing via Appops ([#774](https://github.com/appium/appium-android-driver/issues/774)) ([1798e18](https://github.com/appium/appium-android-driver/commit/1798e180283439f98811cc4048a5e0e5081c4f6a))
|
|
14
|
+
|
|
1
15
|
## [5.7.3](https://github.com/appium/appium-android-driver/compare/v5.7.2...v5.7.3) (2022-11-29)
|
|
2
16
|
|
|
3
17
|
## [5.7.2](https://github.com/appium/appium-android-driver/compare/v5.7.1...v5.7.2) (2022-11-22)
|
|
@@ -12,9 +12,7 @@ var _support = require("@appium/support");
|
|
|
12
12
|
var _moment = _interopRequireDefault(require("moment"));
|
|
13
13
|
var _asyncbox = require("asyncbox");
|
|
14
14
|
var _driver = require("appium/driver");
|
|
15
|
-
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
16
15
|
const MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ';
|
|
17
|
-
const ALL_PERMISSIONS_MAGIC = 'all';
|
|
18
16
|
let commands = {},
|
|
19
17
|
helpers = {},
|
|
20
18
|
extensions = {};
|
|
@@ -255,73 +253,6 @@ commands.mobilePerformEditorAction = async function mobilePerformEditorAction(op
|
|
|
255
253
|
}
|
|
256
254
|
await this.adb.performEditorAction(action);
|
|
257
255
|
};
|
|
258
|
-
const PERMISSION_ACTION = {
|
|
259
|
-
GRANT: 'grant',
|
|
260
|
-
REVOKE: 'revoke'
|
|
261
|
-
};
|
|
262
|
-
commands.mobileChangePermissions = async function mobileChangePermissions(opts = {}) {
|
|
263
|
-
const {
|
|
264
|
-
permissions,
|
|
265
|
-
appPackage = this.opts.appPackage,
|
|
266
|
-
action = PERMISSION_ACTION.GRANT
|
|
267
|
-
} = opts;
|
|
268
|
-
if (_lodash.default.isNil(permissions)) {
|
|
269
|
-
throw new _driver.errors.InvalidArgumentError(`'permissions' argument is required`);
|
|
270
|
-
}
|
|
271
|
-
if (_lodash.default.isEmpty(permissions)) {
|
|
272
|
-
throw new _driver.errors.InvalidArgumentError(`'permissions' argument must not be empty`);
|
|
273
|
-
}
|
|
274
|
-
const lowerAction = _lodash.default.toLower(action);
|
|
275
|
-
if (![PERMISSION_ACTION.GRANT, PERMISSION_ACTION.REVOKE].includes(lowerAction)) {
|
|
276
|
-
throw new _driver.errors.InvalidArgumentError(`Unknown action '${action}'. ` + `Only ${JSON.stringify(_lodash.default.values(PERMISSION_ACTION))} actions are supported`);
|
|
277
|
-
}
|
|
278
|
-
let affectedPermissions = _lodash.default.isArray(permissions) ? permissions : [permissions];
|
|
279
|
-
if (_lodash.default.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {
|
|
280
|
-
const dumpsys = await this.adb.shell(['dumpsys', 'package', appPackage]);
|
|
281
|
-
const grantedPermissions = await this.adb.getGrantedPermissions(appPackage, dumpsys);
|
|
282
|
-
if (lowerAction === PERMISSION_ACTION.GRANT) {
|
|
283
|
-
const reqPermissons = await this.adb.getReqPermissions(appPackage, dumpsys);
|
|
284
|
-
affectedPermissions = _lodash.default.difference(reqPermissons, grantedPermissions);
|
|
285
|
-
} else {
|
|
286
|
-
affectedPermissions = grantedPermissions;
|
|
287
|
-
}
|
|
288
|
-
if (_lodash.default.isEmpty(affectedPermissions)) {
|
|
289
|
-
this.log.info(`'${appPackage}' contains no permissions to ${lowerAction}`);
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (lowerAction === PERMISSION_ACTION.GRANT) {
|
|
294
|
-
await this.adb.grantPermissions(appPackage, affectedPermissions);
|
|
295
|
-
} else {
|
|
296
|
-
await _bluebird.default.all(affectedPermissions.map(name => this.adb.revokePermission(appPackage, name)));
|
|
297
|
-
}
|
|
298
|
-
};
|
|
299
|
-
const PERMISSIONS_TYPE = {
|
|
300
|
-
DENIED: 'denied',
|
|
301
|
-
GRANTED: 'granted',
|
|
302
|
-
REQUESTED: 'requested'
|
|
303
|
-
};
|
|
304
|
-
commands.mobileGetPermissions = async function mobileGetPermissions(opts = {}) {
|
|
305
|
-
const {
|
|
306
|
-
type = PERMISSIONS_TYPE.REQUESTED,
|
|
307
|
-
appPackage = this.opts.appPackage
|
|
308
|
-
} = opts;
|
|
309
|
-
let actionFunc;
|
|
310
|
-
switch (_lodash.default.toLower(type)) {
|
|
311
|
-
case PERMISSIONS_TYPE.REQUESTED:
|
|
312
|
-
actionFunc = appPackage => this.adb.getReqPermissions(appPackage);
|
|
313
|
-
break;
|
|
314
|
-
case PERMISSIONS_TYPE.GRANTED:
|
|
315
|
-
actionFunc = appPackage => this.adb.getGrantedPermissions(appPackage);
|
|
316
|
-
break;
|
|
317
|
-
case PERMISSIONS_TYPE.DENIED:
|
|
318
|
-
actionFunc = appPackage => this.adb.getDeniedPermissions(appPackage);
|
|
319
|
-
break;
|
|
320
|
-
default:
|
|
321
|
-
throw new _driver.errors.InvalidArgumentError(`Unknown permissions type '${type}'. ` + `Only ${JSON.stringify(_lodash.default.values(PERMISSIONS_TYPE))} types are supported`);
|
|
322
|
-
}
|
|
323
|
-
return await actionFunc(appPackage);
|
|
324
|
-
};
|
|
325
256
|
commands.mobileGetNotifications = async function mobileGetNotifications() {
|
|
326
257
|
return await this.adb.getNotifications();
|
|
327
258
|
};
|
|
@@ -345,4 +276,4 @@ commands.mobileUnlock = async function mobileUnlock(opts = {}) {
|
|
|
345
276
|
Object.assign(extensions, commands, helpers);
|
|
346
277
|
var _default = extensions;
|
|
347
278
|
exports.default = _default;
|
|
348
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT01FTlRfRk9STUFUX0lTTzg2MDEiLCJBTExfUEVSTUlTU0lPTlNfTUFHSUMiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwia2V5cyIsIl8iLCJpc0FycmF5Iiwiam9pbiIsInBhcmFtcyIsInRleHQiLCJyZXBsYWNlIiwib3B0cyIsInVuaWNvZGVLZXlib2FyZCIsImRvU2VuZEtleXMiLCJib290c3RyYXAiLCJzZW5kQWN0aW9uIiwiZ2V0RGV2aWNlVGltZSIsImZvcm1hdCIsImxvZyIsImRlYnVnIiwiZGV2aWNlVGltZXN0YW1wIiwiYWRiIiwic2hlbGwiLCJ0cmltIiwicGFyc2VkVGltZXN0YW1wIiwibW9tZW50IiwidXRjIiwiaXNWYWxpZCIsIndhcm4iLCJ1dGNPZmZzZXQiLCJfdHptIiwibW9iaWxlR2V0RGV2aWNlVGltZSIsImdldFBhZ2VTb3VyY2UiLCJiYWNrIiwiaXNLZXlib2FyZFNob3duIiwiaXNTb2Z0S2V5Ym9hcmRQcmVzZW50IiwiaGlkZUtleWJvYXJkIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJzZXR0aW5nIiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImdldEN1cnJlbnRQYWNrYWdlIiwiYmFja2dyb3VuZCIsInNlY29uZHMiLCJnb1RvSG9tZSIsInNsZWVwTXMiLCJ0aHJlc2hvbGRNcyIsImludGVydmFsTXMiLCJtaW4iLCJwYXJzZUludCIsInByb2dyZXNzQ2IiLCJlbGFwc2VkTXMiLCJwcm9ncmVzcyIsIndhaXRTZWNzIiwidG9GaXhlZCIsInByb2dyZXNzUGN0IiwibG9uZ1NsZWVwIiwiYXJncyIsIl9jYWNoZWRBY3Rpdml0eUFyZ3MiLCJhY3RpdmF0ZUFwcCIsImlnbiIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5Iiwic3BsaXQiLCJpbmNsdWRlcyIsInBrZyIsImFjdGl2aXR5IiwiYWN0aW9uIiwiaW50ZW50QWN0aW9uIiwiY2F0ZWdvcnkiLCJpbnRlbnRDYXRlZ29yeSIsImZsYWdzIiwiaW50ZW50RmxhZ3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5Iiwid2FpdEZvckxhdW5jaCIsImFwcFdhaXRGb3JMYXVuY2giLCJ3YWl0RHVyYXRpb24iLCJhcHBXYWl0RHVyYXRpb24iLCJvcHRpb25hbEludGVudEFyZ3VtZW50cyIsInN0b3BBcHAiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJ1dGlsIiwiZmlsdGVyT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0QXBwIiwiZ2V0U3RyaW5ncyIsImxhbmd1YWdlIiwiZ2V0RGV2aWNlTGFuZ3VhZ2UiLCJpbmZvIiwicHJlcHJvY2Vzc1N0cmluZ3NNYXAiLCJtYXBwaW5nIiwicmVzdWx0Iiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJhcGtTdHJpbmdzIiwiYW5kcm9pZEhlbHBlcnMiLCJwdXNoU3RyaW5ncyIsImxhdW5jaEFwcCIsImluaXRBVVQiLCJzdGFydEFVVCIsInN0YXJ0QWN0aXZpdHkiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJoYXNWYWx1ZSIsInJlc2V0IiwicmVzZXRBcHAiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0UmVzZXQiLCJzZXRDb250ZXh0IiwiaXNDaHJvbWVTZXNzaW9uIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic2V0VXJsIiwidXJpIiwic3RhcnRVcmkiLCJjbG9zZUFwcCIsImZvcmNlU3RvcCIsImdldERpc3BsYXlEZW5zaXR5Iiwib3V0IiwidmFsIiwiaXNOYU4iLCJlcnJvckFuZFRocm93IiwibW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsIlBFUk1JU1NJT05fQUNUSU9OIiwiR1JBTlQiLCJSRVZPS0UiLCJtb2JpbGVDaGFuZ2VQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiaXNOaWwiLCJpc0VtcHR5IiwibG93ZXJBY3Rpb24iLCJ0b0xvd2VyIiwidmFsdWVzIiwiYWZmZWN0ZWRQZXJtaXNzaW9ucyIsImR1bXBzeXMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJyZXFQZXJtaXNzb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsIkIiLCJhbGwiLCJtYXAiLCJuYW1lIiwicmV2b2tlUGVybWlzc2lvbiIsIlBFUk1JU1NJT05TX1RZUEUiLCJERU5JRUQiLCJHUkFOVEVEIiwiUkVRVUVTVEVEIiwibW9iaWxlR2V0UGVybWlzc2lvbnMiLCJ0eXBlIiwiYWN0aW9uRnVuYyIsImdldERlbmllZFBlcm1pc3Npb25zIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInN0cmF0ZWd5IiwidGltZW91dE1zIiwidW5sb2NrIiwidW5sb2NrS2V5IiwidW5sb2NrVHlwZSIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZ2VuZXJhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFuZHJvaWRIZWxwZXJzIGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IGxvbmdTbGVlcCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNT01FTlRfRk9STUFUX0lTTzg2MDEgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuY29uc3QgQUxMX1BFUk1JU1NJT05TX01BR0lDID0gJ2FsbCc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMua2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGtleXMgKGtleXMpIHtcbiAgLy8gUHJvdG9jb2wgc2VuZHMgYW4gYXJyYXk7IHJldGhpbmsgYXBwcm9hY2hcbiAga2V5cyA9IF8uaXNBcnJheShrZXlzKSA/IGtleXMuam9pbignJykgOiBrZXlzO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIHRleHQ6IGtleXMsXG4gICAgcmVwbGFjZTogZmFsc2VcbiAgfTtcbiAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQpIHtcbiAgICBwYXJhbXMudW5pY29kZUtleWJvYXJkID0gdHJ1ZTtcbiAgfVxuICBhd2FpdCB0aGlzLmRvU2VuZEtleXMocGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmRvU2VuZEtleXMgPSBhc3luYyBmdW5jdGlvbiBkb1NlbmRLZXlzIChwYXJhbXMpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3NldFRleHQnLCBwYXJhbXMpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3MgdGltZXN0YW1wLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgc2V0IG9mIGZvcm1hdCBzcGVjaWZpZXJzLiBSZWFkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9tb21lbnRqcy5jb20vZG9jcy8gdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWUgZm9ybWF0IHNwZWNpZmllcnMuIFRoZSBkZWZhdWx0IGZvcm1hdCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAsIHdoaWNoIGNvbXBsaWVzIHRvIElTTy04NjAxXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLmdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VUaW1lIChmb3JtYXQgPSBNT01FTlRfRk9STUFUX0lTTzg2MDEpIHtcbiAgdGhpcy5sb2cuZGVidWcoJ0F0dGVtcHRpbmcgdG8gY2FwdHVyZSBhbmRyb2lkIGRldmljZSBkYXRlIGFuZCB0aW1lLiAnICtcbiAgICBgVGhlIGZvcm1hdCBzcGVjaWZpZXIgaXMgJyR7Zm9ybWF0fSdgKTtcbiAgY29uc3QgZGV2aWNlVGltZXN0YW1wID0gKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZGF0ZScsICcrJVktJW0tJWRUJVQleiddKSkudHJpbSgpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRldmljZSB0aW1lc3RhbXA6ICR7ZGV2aWNlVGltZXN0YW1wfWApO1xuICBjb25zdCBwYXJzZWRUaW1lc3RhbXAgPSBtb21lbnQudXRjKGRldmljZVRpbWVzdGFtcCwgJ1lZWVktTU0tRERUSEg6bW06c3NaWicpO1xuICBpZiAoIXBhcnNlZFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHtcbiAgICB0aGlzLmxvZy53YXJuKCdDYW5ub3QgcGFyc2UgdGhlIHJldHVybmVkIHRpbWVzdGFtcC4gUmV0dXJuaW5nIGFzIGlzJyk7XG4gICAgcmV0dXJuIGRldmljZVRpbWVzdGFtcDtcbiAgfVxuICByZXR1cm4gcGFyc2VkVGltZXN0YW1wLnV0Y09mZnNldChwYXJzZWRUaW1lc3RhbXAuX3R6bSB8fCAwKS5mb3JtYXQoZm9ybWF0KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlVGltZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtYXQgW1lZWVktTU0tRERUSEg6bW06c3NaXSAtIFNlZSBnZXREZXZpY2VUaW1lI2Zvcm1hdFxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGRldmljZSB0aW1lXG4gKlxuICogQHBhcmFtIHtEZXZpY2VUaW1lT3B0aW9uc30gb3B0c1xuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgZGF0ZXRpbWUgc3RyaW5nIG9yIHRoZSByYXcgY29tbWFuZCBvdXRwdXQgaWYgZm9ybWF0dGluZyBmYWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXREZXZpY2VUaW1lID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0RGV2aWNlVGltZSAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVRpbWUob3B0cy5mb3JtYXQpO1xufTtcblxuY29tbWFuZHMuZ2V0UGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VTb3VyY2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc291cmNlJyk7XG59O1xuXG5jb21tYW5kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwcmVzc0JhY2snKTtcbn07XG5cbmNvbW1hbmRzLmlzS2V5Ym9hcmRTaG93biA9IGFzeW5jIGZ1bmN0aW9uIGlzS2V5Ym9hcmRTaG93biAoKSB7XG4gIGNvbnN0IHtpc0tleWJvYXJkU2hvd259ID0gYXdhaXQgdGhpcy5hZGIuaXNTb2Z0S2V5Ym9hcmRQcmVzZW50KCk7XG4gIHJldHVybiBpc0tleWJvYXJkU2hvd247XG59O1xuXG5jb21tYW5kcy5oaWRlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBoaWRlS2V5Ym9hcmQgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaGlkZUtleWJvYXJkKCk7XG59O1xuXG5jb21tYW5kcy5vcGVuU2V0dGluZ3NBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc0FjdGl2aXR5IChzZXR0aW5nKSB7XG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2FtJywgJ3N0YXJ0JywgJy1hJywgYGFuZHJvaWQuc2V0dGluZ3MuJHtzZXR0aW5nfWBdKTtcbiAgYXdhaXQgdGhpcy5hZGIud2FpdEZvck5vdEFjdGl2aXR5KGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCA1MDAwKTtcbn07XG5cbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dTaXplICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2dldERldmljZVNpemUnKTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dSZWN0ICgpIHtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBhd2FpdCB0aGlzLmdldFdpbmRvd1NpemUoKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG59O1xuXG5jb21tYW5kcy5nZXRDdXJyZW50QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50QWN0aXZpdHkgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSkuYXBwQWN0aXZpdHk7XG59O1xuXG5jb21tYW5kcy5nZXRDdXJyZW50UGFja2FnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRQYWNrYWdlICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcFBhY2thZ2U7XG59O1xuXG5jb21tYW5kcy5iYWNrZ3JvdW5kID0gYXN5bmMgZnVuY3Rpb24gYmFja2dyb3VuZCAoc2Vjb25kcykge1xuICBpZiAoc2Vjb25kcyA8IDApIHtcbiAgICAvLyBpZiB1c2VyIHBhc3NlcyBpbiBhIG5lZ2F0aXZlIHNlY29uZHMgdmFsdWUsIGludGVycHJldCB0aGF0IGFzIHRoZSBpbnN0cnVjdGlvblxuICAgIC8vIHRvIG5vdCBicmluZyB0aGUgYXBwIGJhY2sgYXQgYWxsXG4gICAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcblxuICAvLyBwZW9wbGUgY2FuIHdhaXQgZm9yIGEgbG9uZyB0aW1lLCBzbyB0byBiZSBzYWZlIGxldCdzIHVzZSB0aGUgbG9uZ1NsZWVwIGZ1bmN0aW9uIGFuZCBsb2dcbiAgLy8gcHJvZ3Jlc3MgcGVyaW9kaWNhbGx5LlxuICBjb25zdCBzbGVlcE1zID0gc2Vjb25kcyAqIDEwMDA7XG4gIGNvbnN0IHRocmVzaG9sZE1zID0gMzAgKiAxMDAwOyAvLyB1c2UgdGhlIHNwaW4td2FpdCBmb3IgYW55dGhpbmcgb3ZlciB0aGlzIHRocmVzaG9sZFxuICAvLyBmb3Igb3VyIHNwaW4gaW50ZXJ2YWwsIHVzZSAxJSBvZiB0aGUgdG90YWwgd2FpdCB0aW1lLCBidXQgbm90aGluZyBiaWdnZXIgdGhhbiAzMHNcbiAgY29uc3QgaW50ZXJ2YWxNcyA9IF8ubWluKFszMCAqIDEwMDAsIHBhcnNlSW50KHNsZWVwTXMgLyAxMDAsIDEwKV0pO1xuICBjb25zdCBwcm9ncmVzc0NiID0gKHtlbGFwc2VkTXMsIHByb2dyZXNzfSkgPT4ge1xuICAgIGNvbnN0IHdhaXRTZWNzID0gKGVsYXBzZWRNcyAvIDEwMDApLnRvRml4ZWQoMCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NQY3QgPSAocHJvZ3Jlc3MgKiAxMDApLnRvRml4ZWQoMik7XG4gICAgdGhpcy5sb2cuZGVidWcoYFdhaXRlZCAke3dhaXRTZWNzfXMgc28gZmFyICgke3Byb2dyZXNzUGN0fSUpYCk7XG4gIH07XG4gIGF3YWl0IGxvbmdTbGVlcChzbGVlcE1zLCB7dGhyZXNob2xkTXMsIGludGVydmFsTXMsIHByb2dyZXNzQ2J9KTtcblxuICBsZXQgYXJncztcbiAgaWYgKHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyAmJiB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXBwUGFja2FnZX0vJHthcHBBY3Rpdml0eX1gXSkge1xuICAgIC8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCB3aXRoIGBzdGFydEFjdGl2aXR5YCwgc28gdXNlIHRob3NlIGFyZ3MgdG8gcmVzdGFydFxuICAgIGFyZ3MgPSB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXBwUGFja2FnZX0vJHthcHBBY3Rpdml0eX1gXTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEFjdGl2YXRpbmcgYXBwICcke2FwcFBhY2thZ2V9JyBpbiBvcmRlciB0byByZXN0b3JlIGl0YCk7XG4gICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlQXBwKGFwcFBhY2thZ2UpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGFyZ3MgPSAoKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBQYWNrYWdlICYmIGFwcEFjdGl2aXR5ID09PSB0aGlzLm9wdHMuYXBwQWN0aXZpdHkpIHx8XG4gICAgICAgICAgICAoYXBwUGFja2FnZSA9PT0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlICYmICh0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5IHx8ICcnKS5zcGxpdCgnLCcpLmluY2x1ZGVzKGFwcEFjdGl2aXR5KSkpXG4gICAgICA/IHsvLyB0aGUgYWN0aXZpdHkgaXMgdGhlIG9yaWdpbmFsIHNlc3Npb24gYWN0aXZpdHksIHNvIHVzZSB0aGUgb3JpZ2luYWwgYXJnc1xuICAgICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgICBhY3Rpb246IHRoaXMub3B0cy5pbnRlbnRBY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgICAgIGZsYWdzOiB0aGlzLm9wdHMuaW50ZW50RmxhZ3MsXG4gICAgICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICAgICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgICAgICBzdG9wQXBwOiBmYWxzZSxcbiAgICAgICAgdXNlcjogdGhpcy5vcHRzLnVzZXJQcm9maWxlfVxuICAgICAgOiB7Ly8gdGhlIGFjdGl2aXR5IHdhcyBzdGFydGVkIHNvbWUgb3RoZXIgd2F5LCBzbyB1c2UgZGVmYXVsdHNcbiAgICAgICAgcGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgICAgIHdhaXRQa2c6IGFwcFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgICAgIHN0b3BBcHA6IGZhbHNlfTtcbiAgfVxuICBhcmdzID0gYXdhaXQgdXRpbC5maWx0ZXJPYmplY3QoYXJncyk7XG4gIHRoaXMubG9nLmRlYnVnKGBCcmluZ2luZyBhcHBsaWNhdGlvbiBiYWNrIHRvIGZvcmVncm91bmQgd2l0aCBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcChhcmdzKTtcbn07XG5cbmNvbW1hbmRzLmdldFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBnZXRTdHJpbmdzIChsYW5ndWFnZSkge1xuICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgbGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLmFkYi5nZXREZXZpY2VMYW5ndWFnZSgpO1xuICAgIHRoaXMubG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gKG1hcHBpbmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhsYW5ndWFnZSwgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIGlmICh0aGlzLmJvb3RzdHJhcCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgbXV0YXRpbmcgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UsIGJ1dCBpdCdzIGhvdyBhcHBpdW0gY3VycmVudGx5IHdvcmtzXG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbigndXBkYXRlU3RyaW5ncycpO1xuICB9XG5cbiAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xufTtcblxuY29tbWFuZHMubGF1bmNoQXBwID0gYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG4gIGF3YWl0IHRoaXMuc3RhcnRBVVQoKTtcbn07XG5cbmNvbW1hbmRzLnN0YXJ0QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFjdGl2aXR5IChhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSxcbiAgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSwgaW50ZW50QWN0aW9uLCBpbnRlbnRDYXRlZ29yeSwgaW50ZW50RmxhZ3MsXG4gIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLCBkb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgdGhpcy5sb2cuZGVidWcoYFN0YXJ0aW5nIHBhY2thZ2UgJyR7YXBwUGFja2FnZX0nIGFuZCBhY3Rpdml0eSAnJHthcHBBY3Rpdml0eX0nYCk7XG5cbiAgLy8gZG9udFN0b3BBcHBPblJlc2V0IGlzIGJvdGggYW4gYXJndW1lbnQgaGVyZSwgYW5kIGEgZGVzaXJlZCBjYXBhYmlsaXR5XG4gIC8vIGlmIHRoZSBhcmd1bWVudCBpcyBzZXQsIHVzZSBpdCwgb3RoZXJ3aXNlIHVzZSB0aGUgY2FwXG4gIGlmICghdXRpbC5oYXNWYWx1ZShkb250U3RvcEFwcE9uUmVzZXQpKSB7XG4gICAgZG9udFN0b3BBcHBPblJlc2V0ID0gISF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0O1xuICB9XG5cbiAgbGV0IGFyZ3MgPSB7XG4gICAgcGtnOiBhcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICB3YWl0UGtnOiBhcHBXYWl0UGFja2FnZSB8fCBhcHBQYWNrYWdlLFxuICAgIHdhaXRBY3Rpdml0eTogYXBwV2FpdEFjdGl2aXR5IHx8IGFwcEFjdGl2aXR5LFxuICAgIGFjdGlvbjogaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiBpbnRlbnRDYXRlZ29yeSxcbiAgICBmbGFnczogaW50ZW50RmxhZ3MsXG4gICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgc3RvcEFwcDogIWRvbnRTdG9wQXBwT25SZXNldFxuICB9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgPSB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgfHwge307XG4gIHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJnc1tgJHthcmdzLndhaXRQa2d9LyR7YXJncy53YWl0QWN0aXZpdHl9YF0gPSBhcmdzO1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcChhcmdzKTtcbn07XG5cbmNvbW1hbmRzLnJlc2V0ID0gYXN5bmMgZnVuY3Rpb24gcmVzZXQgKCkge1xuICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCB7ZmFzdFJlc2V0OiB0cnVlfSkpO1xuICAvLyByZXNldCBjb250ZXh0IHNpbmNlIHdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9uIGNvbnRleHQgd2Ugd2lsbCBlbmQgdXAgYWZ0ZXIgYXBwIGxhdW5jaC5cbiAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmlzQ2hyb21lU2Vzc2lvbiA/IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCkgOiB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFVVCA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0QVVUICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoe1xuICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IHRoaXMub3B0cy5pbnRlbnRBY3Rpb24sXG4gICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSxcbiAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgdXNlcjogdGhpcy5vcHRzLnVzZXJQcm9maWxlLFxuICB9KTtcbn07XG5cbi8vIHdlIG92ZXJyaWRlIHNldFVybCB0byB0YWtlIGFuIGFuZHJvaWQgVVJJIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBkZWVwLWxpbmtpbmdcbi8vIGluc2lkZSBhbiBhcHAsIHNpbWlsYXIgdG8gc3RhcnRpbmcgYW4gaW50ZW50XG5jb21tYW5kcy5zZXRVcmwgPSBhc3luYyBmdW5jdGlvbiBzZXRVcmwgKHVyaSkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmksIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbi8vIGNsb3NpbmcgYXBwIHVzaW5nIGZvcmNlIHN0b3BcbmNvbW1hbmRzLmNsb3NlQXBwID0gYXN5bmMgZnVuY3Rpb24gY2xvc2VBcHAgKCkge1xuICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAvLyByZXNldCBjb250ZXh0IHNpbmNlIHdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9uIGNvbnRleHQgd2Ugd2lsbCBlbmQgdXAgYWZ0ZXIgYXBwIGxhdW5jaC5cbiAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KCk7XG59O1xuXG5jb21tYW5kcy5nZXREaXNwbGF5RGVuc2l0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERpc3BsYXlEZW5zaXR5ICgpIHtcbiAgLy8gZmlyc3QgdHJ5IHRoZSBwcm9wZXJ0eSBmb3IgZGV2aWNlc1xuICBsZXQgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3JvLnNmLmxjZF9kZW5zaXR5J10pO1xuICBpZiAob3V0KSB7XG4gICAgbGV0IHZhbCA9IHBhcnNlSW50KG91dCwgMTApO1xuICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBOYU4sIHRyeSBnZXR0aW5nIHRoZSBlbXVsYXRvciBwcm9wZXJ0eVxuICAgIGlmICghaXNOYU4odmFsKSkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBkZW5zaXR5IHZhbHVlIHdhcyBOYU46IFwiJHtvdXR9XCJgKTtcbiAgfVxuICAvLyBmYWxsYmFjayB0byB0cnlpbmcgcHJvcGVydHkgZm9yIGVtdWxhdG9yc1xuICBvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2dldHByb3AnLCAncWVtdS5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gY291bGRuJ3QgZ2V0IGFueXRoaW5nLCBzbyBlcnJvciBvdXRcbiAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnRmFpbGVkIHRvIGdldCBkaXNwbGF5IGRlbnNpdHkgcHJvcGVydHkuJyk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHthY3Rpb259ID0gb3B0cztcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKGFjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAnYWN0aW9uJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5hZGIucGVyZm9ybUVkaXRvckFjdGlvbihhY3Rpb24pO1xufTtcblxuY29uc3QgUEVSTUlTU0lPTl9BQ1RJT04gPSB7XG4gIEdSQU5UOiAnZ3JhbnQnLFxuICBSRVZPS0U6ICdyZXZva2UnLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ3xBcnJheTxzdHJpbmc+fSBwZXJtaXNzaW9ucyAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgY2hhbmdlZFxuICogb3IgYSBsaXN0IG9mIHBlcm1pc3Npb25zLiBDaGVjayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9NYW5pZmVzdC5wZXJtaXNzaW9uXG4gKiB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdGFuZGFyZCBBbmRyb2lkIHBlcm1zc2lvbiBuYW1lcy4gTWFuZGF0b3J5IGFyZ3VtZW50LlxuICogSWYgJ2FsbCcgbWFnaWMgc3RyaW5nIGlzIHBhc3NlZCB0aGVuIHRoZSBjaG9zZW4gYWN0aW9uIGlzIGdvaW5nIHRvIGJlIGFwcGxpZWQgdG8gYWxsXG4gKiBwZXJtaXNpc29ucyByZXF1ZXN0ZWQvZ3JhbnRlZCBieSAnYXBwUGFja2FnZScuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIC0gVGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gc2V0IGNoYW5nZVxuICogcGVybWlzc2lvbnMgb24uIERlZmF1bHRzIHRvIHRoZSBwYWNrYWdlIG5hbWUgdW5kZXIgdGVzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gW2dyYW50XSAtIE9uZSBvZiBgUEVSTUlTU0lPTl9BQ1RJT05gIHZhbHVlc1xuICovXG5cbi8qKlxuICogQ2hhbmdlcyBwYWNrYWdlIHBlcm1pc3Npb25zIGluIHJ1bnRpbWUuXG4gKlxuICogQHBhcmFtIHs/Q2hhbmdlUGVybWlzc2lvbnNPcHRpb25zfSBvcHRzIC0gQXZhaWxhYmxlIG9wdGlvbnMgbWFwcGluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNoYW5nZVBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgcGVybWlzc2lvbnMsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGlvbiA9IFBFUk1JU1NJT05fQUNUSU9OLkdSQU5ULFxuICB9ID0gb3B0cztcbiAgaWYgKF8uaXNOaWwocGVybWlzc2lvbnMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ3Blcm1pc3Npb25zJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGlmIChfLmlzRW1wdHkocGVybWlzc2lvbnMpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ3Blcm1pc3Npb25zJyBhcmd1bWVudCBtdXN0IG5vdCBiZSBlbXB0eWApO1xuICB9XG4gIGNvbnN0IGxvd2VyQWN0aW9uID0gXy50b0xvd2VyKGFjdGlvbik7XG4gIGlmICghW1BFUk1JU1NJT05fQUNUSU9OLkdSQU5ULCBQRVJNSVNTSU9OX0FDVElPTi5SRVZPS0VdLmluY2x1ZGVzKGxvd2VyQWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUEVSTUlTU0lPTl9BQ1RJT04pKX0gYWN0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBsZXQgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IF8uaXNBcnJheShwZXJtaXNzaW9ucykgPyBwZXJtaXNzaW9ucyA6IFtwZXJtaXNzaW9uc107XG4gIGlmIChfLnRvTG93ZXIocGVybWlzc2lvbnMpID09PSBBTExfUEVSTUlTU0lPTlNfTUFHSUMpIHtcbiAgICBjb25zdCBkdW1wc3lzID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBhcHBQYWNrYWdlXSk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5hZGIuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKGFwcFBhY2thZ2UsIGR1bXBzeXMpO1xuICAgIGlmIChsb3dlckFjdGlvbiA9PT0gUEVSTUlTU0lPTl9BQ1RJT04uR1JBTlQpIHtcbiAgICAgIGNvbnN0IHJlcVBlcm1pc3NvbnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRSZXFQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBkdW1wc3lzKTtcbiAgICAgIGFmZmVjdGVkUGVybWlzc2lvbnMgPSBfLmRpZmZlcmVuY2UocmVxUGVybWlzc29ucywgZ3JhbnRlZFBlcm1pc3Npb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IGdyYW50ZWRQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShhZmZlY3RlZFBlcm1pc3Npb25zKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwUGFja2FnZX0nIGNvbnRhaW5zIG5vIHBlcm1pc3Npb25zIHRvICR7bG93ZXJBY3Rpb259YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGxvd2VyQWN0aW9uID09PSBQRVJNSVNTSU9OX0FDVElPTi5HUkFOVCkge1xuICAgIGF3YWl0IHRoaXMuYWRiLmdyYW50UGVybWlzc2lvbnMoYXBwUGFja2FnZSwgYWZmZWN0ZWRQZXJtaXNzaW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgQi5hbGwoYWZmZWN0ZWRQZXJtaXNzaW9ucy5tYXAoKG5hbWUpID0+IHRoaXMuYWRiLnJldm9rZVBlcm1pc3Npb24oYXBwUGFja2FnZSwgbmFtZSkpKTtcbiAgfVxufTtcblxuY29uc3QgUEVSTUlTU0lPTlNfVFlQRSA9IHtcbiAgREVOSUVEOiAnZGVuaWVkJyxcbiAgR1JBTlRFRDogJ2dyYW50ZWQnLFxuICBSRVFVRVNURUQ6ICdyZXF1ZXN0ZWQnLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRQZXJtaXNzaW9uc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFtyZXF1ZXN0ZWRdIC0gT25lIG9mIHBvc3NpYmxlIHBlcm1pc3Npb24gdHlwZXMgdG8gZ2V0LlxuICogQ2FuIGJlIGFueSBvZiBgUEVSTUlTU0lPTlNfVFlQRWAgdmFsdWVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFBhY2thZ2UgW3RoaXMub3B0cy5hcHBQYWNrYWdlXSAtIFRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIHNldCBjaGFuZ2VcbiAqIHBlcm1pc3Npb25zIG9uLiBEZWZhdWx0cyB0byB0aGUgcGFja2FnZSBuYW1lIHVuZGVyIHRlc3QuXG4gKi9cblxuLyoqXG4gKiBHZXRzIHJ1bnRpbWUgcGVybWlzc2lvbnMgbGlzdCBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtHZXRQZXJtaXNzaW9uc09wdGlvbnN9IG9wdHMgLSBBdmFpbGFibGUgb3B0aW9ucyBtYXBwaW5nLlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIHJldHJpZXZlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIGdpdmVuIHR5cGVcbiAqIChjYW4gYWxzbyBiZSBlbXB0eSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgcGVybWlzc2lvbnMuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0UGVybWlzc2lvbnMgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgdHlwZSA9IFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVELFxuICAgIGFwcFBhY2thZ2UgPSB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgfSA9IG9wdHM7XG5cbiAgbGV0IGFjdGlvbkZ1bmM7XG4gIHN3aXRjaCAoXy50b0xvd2VyKHR5cGUpKSB7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLlJFUVVFU1RFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0UmVxUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuR1JBTlRFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKGFwcFBhY2thZ2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBQRVJNSVNTSU9OU19UWVBFLkRFTklFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAoYXBwUGFja2FnZSkgPT4gdGhpcy5hZGIuZ2V0RGVuaWVkUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVW5rbm93biBwZXJtaXNzaW9ucyB0eXBlICcke3R5cGV9Jy4gYCArXG4gICAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUEVSTUlTU0lPTlNfVFlQRSkpfSB0eXBlcyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IGFjdGlvbkZ1bmMoYXBwUGFja2FnZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgc3lzdGVtIG5vdGlmaWNhdGlvbnMuXG4gKlxuICogQHJldHVybnMge09iamVjdH0gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGBhZGIuZ2V0Tm90aWZpY2F0aW9uc2AgZm9yXG4gKiBtb3JlIGRldGFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Tm90aWZpY2F0aW9ucyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldE5vdGlmaWNhdGlvbnMgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuZ2V0Tm90aWZpY2F0aW9ucygpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTbXNMaXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heCBbMTAwXSAtIFRoZSBtYXhpbXVtIGNvdW50IG9mIHJlY2VudCBTTVMgbWVzc2FnZXNcbiAqIHRvIHJldHJpZXZlXG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcmVjZW50IFNNUyBtZXNzYWdlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtTbXNMaXN0T3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge09iamVjdH0gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIGBhZGIuZ2V0U21zTGlzdGAgZm9yXG4gKiBtb3JlIGRldGFpbHNcbiAqL1xuY29tbWFuZHMubW9iaWxlTGlzdFNtcyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUxpc3RTbXMgKG9wdHMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuZ2V0U21zTGlzdChvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVW5sb2NrT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleSBUaGUgdW5sb2NrIGtleS4gVGhlIHZhbHVlIG9mIHRoaXMga2V5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgdW5sb2NrIHR5cGUgYW5kIGNvdWxkIGJlIGEgcGluL3Bhc3N3b3JkL3BhdHRlcm4gdmFsdWUgb3JcbiAqIGEgYmlvbWV0cmljIGZpbmdlciBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSB1bmxvY2sgdHlwZS4gVGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXNcbiAqIGFyZSBzdXBwb3J0ZWQ6IGBwaW5gLCBgcGluV2l0aEtleUV2ZW50YCwgYHBhc3N3b3JkYCwgYHBhdHRlcm5gIGFuZCBgZmluZ2VycHJpbnRgLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBzdHJhdGVneSBFaXRoZXIgJ2xvY2tzZXR0aW5ncycgKGRlZmF1bHQpIG9yICd1aWF1dG9tYXRvcicuXG4gKiBTZXR0aW5nIGl0IHRvICd1aWF1dG9tYXRvcicgd2lsbCBlbmZvcmNlIHRoZSBkcml2ZXIgdG8gYXZvaWQgdXNpbmcgc3BlY2lhbFxuICogQURCIHNob3J0Y3V0cyBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgdW5sb2NrIHByb2NlZHVyZS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGltZW91dE1zIFsyMDAwXSBUaGUgbWF4aW11bSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICogdG8gd2FpdCB1bnRpbCB0aGUgc2NyZWVuIGdldHMgdW5sb2NrZWRcbiAqL1xuXG4vKipcbiAqIFVubG9ja3MgdGhlIGRldmljZSBpZiBpdCBpcyBsb2NrZWQuIE5vb3AgaWYgdGhlIGRldmljZSdzIHNjcmVlbiBpcyBub3QgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSB7P1VubG9ja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB1bmxvY2sgb3BlcmF0aW9uIGZhaWxzIG9yIHRoZSBwcm92aWRlZFxuICogYXJndW1lbnRzIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVW5sb2NrIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBrZXksIHR5cGUsIHN0cmF0ZWd5LCB0aW1lb3V0TXMgfSA9IG9wdHM7XG4gIGF3YWl0IGFuZHJvaWRIZWxwZXJzLnVubG9jayh0aGlzLCB0aGlzLmFkYiwge1xuICAgIHVubG9ja0tleToga2V5LFxuICAgIHVubG9ja1R5cGU6IHR5cGUsXG4gICAgdW5sb2NrU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0OiB0aW1lb3V0TXMsXG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLHFCQUFxQixHQUFHLHNCQUFzQjtBQUNwRCxNQUFNQyxxQkFBcUIsR0FBRyxLQUFLO0FBRW5DLElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUM7QUFBQTtBQUVqREYsUUFBUSxDQUFDRyxJQUFJLEdBQUcsZUFBZUEsSUFBSSxDQUFFQSxJQUFJLEVBQUU7RUFFekNBLElBQUksR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUNGLElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUNHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBR0gsSUFBSTtFQUM3QyxJQUFJSSxNQUFNLEdBQUc7SUFDWEMsSUFBSSxFQUFFTCxJ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
|
|
279
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT01FTlRfRk9STUFUX0lTTzg2MDEiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwia2V5cyIsIl8iLCJpc0FycmF5Iiwiam9pbiIsInBhcmFtcyIsInRleHQiLCJyZXBsYWNlIiwib3B0cyIsInVuaWNvZGVLZXlib2FyZCIsImRvU2VuZEtleXMiLCJib290c3RyYXAiLCJzZW5kQWN0aW9uIiwiZ2V0RGV2aWNlVGltZSIsImZvcm1hdCIsImxvZyIsImRlYnVnIiwiZGV2aWNlVGltZXN0YW1wIiwiYWRiIiwic2hlbGwiLCJ0cmltIiwicGFyc2VkVGltZXN0YW1wIiwibW9tZW50IiwidXRjIiwiaXNWYWxpZCIsIndhcm4iLCJ1dGNPZmZzZXQiLCJfdHptIiwibW9iaWxlR2V0RGV2aWNlVGltZSIsImdldFBhZ2VTb3VyY2UiLCJiYWNrIiwiaXNLZXlib2FyZFNob3duIiwiaXNTb2Z0S2V5Ym9hcmRQcmVzZW50IiwiaGlkZUtleWJvYXJkIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJzZXR0aW5nIiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImdldFdpbmRvd1NpemUiLCJnZXRXaW5kb3dSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJ4IiwieSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImdldEN1cnJlbnRQYWNrYWdlIiwiYmFja2dyb3VuZCIsInNlY29uZHMiLCJnb1RvSG9tZSIsInNsZWVwTXMiLCJ0aHJlc2hvbGRNcyIsImludGVydmFsTXMiLCJtaW4iLCJwYXJzZUludCIsInByb2dyZXNzQ2IiLCJlbGFwc2VkTXMiLCJwcm9ncmVzcyIsIndhaXRTZWNzIiwidG9GaXhlZCIsInByb2dyZXNzUGN0IiwibG9uZ1NsZWVwIiwiYXJncyIsIl9jYWNoZWRBY3Rpdml0eUFyZ3MiLCJhY3RpdmF0ZUFwcCIsImlnbiIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5Iiwic3BsaXQiLCJpbmNsdWRlcyIsInBrZyIsImFjdGl2aXR5IiwiYWN0aW9uIiwiaW50ZW50QWN0aW9uIiwiY2F0ZWdvcnkiLCJpbnRlbnRDYXRlZ29yeSIsImZsYWdzIiwiaW50ZW50RmxhZ3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5Iiwid2FpdEZvckxhdW5jaCIsImFwcFdhaXRGb3JMYXVuY2giLCJ3YWl0RHVyYXRpb24iLCJhcHBXYWl0RHVyYXRpb24iLCJvcHRpb25hbEludGVudEFyZ3VtZW50cyIsInN0b3BBcHAiLCJ1c2VyIiwidXNlclByb2ZpbGUiLCJ1dGlsIiwiZmlsdGVyT2JqZWN0IiwiSlNPTiIsInN0cmluZ2lmeSIsInN0YXJ0QXBwIiwiZ2V0U3RyaW5ncyIsImxhbmd1YWdlIiwiZ2V0RGV2aWNlTGFuZ3VhZ2UiLCJpbmZvIiwicHJlcHJvY2Vzc1N0cmluZ3NNYXAiLCJtYXBwaW5nIiwicmVzdWx0Iiwia2V5IiwidmFsdWUiLCJ0b1BhaXJzIiwiaXNTdHJpbmciLCJhcGtTdHJpbmdzIiwiYW5kcm9pZEhlbHBlcnMiLCJwdXNoU3RyaW5ncyIsImxhdW5jaEFwcCIsImluaXRBVVQiLCJzdGFydEFVVCIsInN0YXJ0QWN0aXZpdHkiLCJkb250U3RvcEFwcE9uUmVzZXQiLCJoYXNWYWx1ZSIsInJlc2V0IiwicmVzZXRBcHAiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0UmVzZXQiLCJzZXRDb250ZXh0IiwiaXNDaHJvbWVTZXNzaW9uIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwic2V0VXJsIiwidXJpIiwic3RhcnRVcmkiLCJjbG9zZUFwcCIsImZvcmNlU3RvcCIsImdldERpc3BsYXlEZW5zaXR5Iiwib3V0IiwidmFsIiwiaXNOYU4iLCJlcnJvckFuZFRocm93IiwibW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsIm1vYmlsZUdldE5vdGlmaWNhdGlvbnMiLCJnZXROb3RpZmljYXRpb25zIiwibW9iaWxlTGlzdFNtcyIsImdldFNtc0xpc3QiLCJtb2JpbGVVbmxvY2siLCJ0eXBlIiwic3RyYXRlZ3kiLCJ0aW1lb3V0TXMiLCJ1bmxvY2siLCJ1bmxvY2tLZXkiLCJ1bmxvY2tUeXBlIiwidW5sb2NrU3RyYXRlZ3kiLCJ1bmxvY2tTdWNjZXNzVGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9nZW5lcmFsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgbG9uZ1NsZWVwIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IE1PTUVOVF9GT1JNQVRfSVNPODYwMSA9ICdZWVlZLU1NLUREVEhIOm1tOnNzWic7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMua2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGtleXMgKGtleXMpIHtcbiAgLy8gUHJvdG9jb2wgc2VuZHMgYW4gYXJyYXk7IHJldGhpbmsgYXBwcm9hY2hcbiAga2V5cyA9IF8uaXNBcnJheShrZXlzKSA/IGtleXMuam9pbignJykgOiBrZXlzO1xuICBsZXQgcGFyYW1zID0ge1xuICAgIHRleHQ6IGtleXMsXG4gICAgcmVwbGFjZTogZmFsc2VcbiAgfTtcbiAgaWYgKHRoaXMub3B0cy51bmljb2RlS2V5Ym9hcmQpIHtcbiAgICBwYXJhbXMudW5pY29kZUtleWJvYXJkID0gdHJ1ZTtcbiAgfVxuICBhd2FpdCB0aGlzLmRvU2VuZEtleXMocGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmRvU2VuZEtleXMgPSBhc3luYyBmdW5jdGlvbiBkb1NlbmRLZXlzIChwYXJhbXMpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3NldFRleHQnLCBwYXJhbXMpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlJ3MgdGltZXN0YW1wLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBUaGUgc2V0IG9mIGZvcm1hdCBzcGVjaWZpZXJzLiBSZWFkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9tb21lbnRqcy5jb20vZG9jcy8gdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWUgZm9ybWF0IHNwZWNpZmllcnMuIFRoZSBkZWZhdWx0IGZvcm1hdCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAsIHdoaWNoIGNvbXBsaWVzIHRvIElTTy04NjAxXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLmdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VUaW1lIChmb3JtYXQgPSBNT01FTlRfRk9STUFUX0lTTzg2MDEpIHtcbiAgdGhpcy5sb2cuZGVidWcoJ0F0dGVtcHRpbmcgdG8gY2FwdHVyZSBhbmRyb2lkIGRldmljZSBkYXRlIGFuZCB0aW1lLiAnICtcbiAgICBgVGhlIGZvcm1hdCBzcGVjaWZpZXIgaXMgJyR7Zm9ybWF0fSdgKTtcbiAgY29uc3QgZGV2aWNlVGltZXN0YW1wID0gKGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZGF0ZScsICcrJVktJW0tJWRUJVQleiddKSkudHJpbSgpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRldmljZSB0aW1lc3RhbXA6ICR7ZGV2aWNlVGltZXN0YW1wfWApO1xuICBjb25zdCBwYXJzZWRUaW1lc3RhbXAgPSBtb21lbnQudXRjKGRldmljZVRpbWVzdGFtcCwgJ1lZWVktTU0tRERUSEg6bW06c3NaWicpO1xuICBpZiAoIXBhcnNlZFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHtcbiAgICB0aGlzLmxvZy53YXJuKCdDYW5ub3QgcGFyc2UgdGhlIHJldHVybmVkIHRpbWVzdGFtcC4gUmV0dXJuaW5nIGFzIGlzJyk7XG4gICAgcmV0dXJuIGRldmljZVRpbWVzdGFtcDtcbiAgfVxuICByZXR1cm4gcGFyc2VkVGltZXN0YW1wLnV0Y09mZnNldChwYXJzZWRUaW1lc3RhbXAuX3R6bSB8fCAwKS5mb3JtYXQoZm9ybWF0KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gRGV2aWNlVGltZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtYXQgW1lZWVktTU0tRERUSEg6bW06c3NaXSAtIFNlZSBnZXREZXZpY2VUaW1lI2Zvcm1hdFxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGRldmljZSB0aW1lXG4gKlxuICogQHBhcmFtIHtEZXZpY2VUaW1lT3B0aW9uc30gb3B0c1xuICogQHJldHVybiB7c3RyaW5nfSBGb3JtYXR0ZWQgZGF0ZXRpbWUgc3RyaW5nIG9yIHRoZSByYXcgY29tbWFuZCBvdXRwdXQgaWYgZm9ybWF0dGluZyBmYWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXREZXZpY2VUaW1lID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0RGV2aWNlVGltZSAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVRpbWUob3B0cy5mb3JtYXQpO1xufTtcblxuY29tbWFuZHMuZ2V0UGFnZVNvdXJjZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VTb3VyY2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc291cmNlJyk7XG59O1xuXG5jb21tYW5kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdwcmVzc0JhY2snKTtcbn07XG5cbmNvbW1hbmRzLmlzS2V5Ym9hcmRTaG93biA9IGFzeW5jIGZ1bmN0aW9uIGlzS2V5Ym9hcmRTaG93biAoKSB7XG4gIGNvbnN0IHtpc0tleWJvYXJkU2hvd259ID0gYXdhaXQgdGhpcy5hZGIuaXNTb2Z0S2V5Ym9hcmRQcmVzZW50KCk7XG4gIHJldHVybiBpc0tleWJvYXJkU2hvd247XG59O1xuXG5jb21tYW5kcy5oaWRlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBoaWRlS2V5Ym9hcmQgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaGlkZUtleWJvYXJkKCk7XG59O1xuXG5jb21tYW5kcy5vcGVuU2V0dGluZ3NBY3Rpdml0eSA9IGFzeW5jIGZ1bmN0aW9uIG9wZW5TZXR0aW5nc0FjdGl2aXR5IChzZXR0aW5nKSB7XG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2FtJywgJ3N0YXJ0JywgJy1hJywgYGFuZHJvaWQuc2V0dGluZ3MuJHtzZXR0aW5nfWBdKTtcbiAgYXdhaXQgdGhpcy5hZGIud2FpdEZvck5vdEFjdGl2aXR5KGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCA1MDAwKTtcbn07XG5cbmNvbW1hbmRzLmdldFdpbmRvd1NpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dTaXplICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2dldERldmljZVNpemUnKTtcbn07XG5cbi8vIEZvciBXM0NcbmNvbW1hbmRzLmdldFdpbmRvd1JlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRXaW5kb3dSZWN0ICgpIHtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBhd2FpdCB0aGlzLmdldFdpbmRvd1NpemUoKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG59O1xuXG5jb21tYW5kcy5nZXRDdXJyZW50QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50QWN0aXZpdHkgKCkge1xuICByZXR1cm4gKGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKSkuYXBwQWN0aXZpdHk7XG59O1xuXG5jb21tYW5kcy5nZXRDdXJyZW50UGFja2FnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRQYWNrYWdlICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcFBhY2thZ2U7XG59O1xuXG5jb21tYW5kcy5iYWNrZ3JvdW5kID0gYXN5bmMgZnVuY3Rpb24gYmFja2dyb3VuZCAoc2Vjb25kcykge1xuICBpZiAoc2Vjb25kcyA8IDApIHtcbiAgICAvLyBpZiB1c2VyIHBhc3NlcyBpbiBhIG5lZ2F0aXZlIHNlY29uZHMgdmFsdWUsIGludGVycHJldCB0aGF0IGFzIHRoZSBpbnN0cnVjdGlvblxuICAgIC8vIHRvIG5vdCBicmluZyB0aGUgYXBwIGJhY2sgYXQgYWxsXG4gICAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuZ29Ub0hvbWUoKTtcblxuICAvLyBwZW9wbGUgY2FuIHdhaXQgZm9yIGEgbG9uZyB0aW1lLCBzbyB0byBiZSBzYWZlIGxldCdzIHVzZSB0aGUgbG9uZ1NsZWVwIGZ1bmN0aW9uIGFuZCBsb2dcbiAgLy8gcHJvZ3Jlc3MgcGVyaW9kaWNhbGx5LlxuICBjb25zdCBzbGVlcE1zID0gc2Vjb25kcyAqIDEwMDA7XG4gIGNvbnN0IHRocmVzaG9sZE1zID0gMzAgKiAxMDAwOyAvLyB1c2UgdGhlIHNwaW4td2FpdCBmb3IgYW55dGhpbmcgb3ZlciB0aGlzIHRocmVzaG9sZFxuICAvLyBmb3Igb3VyIHNwaW4gaW50ZXJ2YWwsIHVzZSAxJSBvZiB0aGUgdG90YWwgd2FpdCB0aW1lLCBidXQgbm90aGluZyBiaWdnZXIgdGhhbiAzMHNcbiAgY29uc3QgaW50ZXJ2YWxNcyA9IF8ubWluKFszMCAqIDEwMDAsIHBhcnNlSW50KHNsZWVwTXMgLyAxMDAsIDEwKV0pO1xuICBjb25zdCBwcm9ncmVzc0NiID0gKHtlbGFwc2VkTXMsIHByb2dyZXNzfSkgPT4ge1xuICAgIGNvbnN0IHdhaXRTZWNzID0gKGVsYXBzZWRNcyAvIDEwMDApLnRvRml4ZWQoMCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NQY3QgPSAocHJvZ3Jlc3MgKiAxMDApLnRvRml4ZWQoMik7XG4gICAgdGhpcy5sb2cuZGVidWcoYFdhaXRlZCAke3dhaXRTZWNzfXMgc28gZmFyICgke3Byb2dyZXNzUGN0fSUpYCk7XG4gIH07XG4gIGF3YWl0IGxvbmdTbGVlcChzbGVlcE1zLCB7dGhyZXNob2xkTXMsIGludGVydmFsTXMsIHByb2dyZXNzQ2J9KTtcblxuICBsZXQgYXJncztcbiAgaWYgKHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJncyAmJiB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXBwUGFja2FnZX0vJHthcHBBY3Rpdml0eX1gXSkge1xuICAgIC8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCB3aXRoIGBzdGFydEFjdGl2aXR5YCwgc28gdXNlIHRob3NlIGFyZ3MgdG8gcmVzdGFydFxuICAgIGFyZ3MgPSB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXBwUGFja2FnZX0vJHthcHBBY3Rpdml0eX1gXTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEFjdGl2YXRpbmcgYXBwICcke2FwcFBhY2thZ2V9JyBpbiBvcmRlciB0byByZXN0b3JlIGl0YCk7XG4gICAgICBhd2FpdCB0aGlzLmFjdGl2YXRlQXBwKGFwcFBhY2thZ2UpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGFyZ3MgPSAoKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBQYWNrYWdlICYmIGFwcEFjdGl2aXR5ID09PSB0aGlzLm9wdHMuYXBwQWN0aXZpdHkpIHx8XG4gICAgICAgICAgICAoYXBwUGFja2FnZSA9PT0gdGhpcy5vcHRzLmFwcFdhaXRQYWNrYWdlICYmICh0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5IHx8ICcnKS5zcGxpdCgnLCcpLmluY2x1ZGVzKGFwcEFjdGl2aXR5KSkpXG4gICAgICA/IHsvLyB0aGUgYWN0aXZpdHkgaXMgdGhlIG9yaWdpbmFsIHNlc3Npb24gYWN0aXZpdHksIHNvIHVzZSB0aGUgb3JpZ2luYWwgYXJnc1xuICAgICAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgICAgICBhY3Rpdml0eTogdGhpcy5vcHRzLmFwcEFjdGl2aXR5LFxuICAgICAgICBhY3Rpb246IHRoaXMub3B0cy5pbnRlbnRBY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgICAgIGZsYWdzOiB0aGlzLm9wdHMuaW50ZW50RmxhZ3MsXG4gICAgICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICAgICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgICAgICB3YWl0Rm9yTGF1bmNoOiB0aGlzLm9wdHMuYXBwV2FpdEZvckxhdW5jaCxcbiAgICAgICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgICAgICBzdG9wQXBwOiBmYWxzZSxcbiAgICAgICAgdXNlcjogdGhpcy5vcHRzLnVzZXJQcm9maWxlfVxuICAgICAgOiB7Ly8gdGhlIGFjdGl2aXR5IHdhcyBzdGFydGVkIHNvbWUgb3RoZXIgd2F5LCBzbyB1c2UgZGVmYXVsdHNcbiAgICAgICAgcGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgICAgIHdhaXRQa2c6IGFwcFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgICAgIHN0b3BBcHA6IGZhbHNlfTtcbiAgfVxuICBhcmdzID0gYXdhaXQgdXRpbC5maWx0ZXJPYmplY3QoYXJncyk7XG4gIHRoaXMubG9nLmRlYnVnKGBCcmluZ2luZyBhcHBsaWNhdGlvbiBiYWNrIHRvIGZvcmVncm91bmQgd2l0aCBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcChhcmdzKTtcbn07XG5cbmNvbW1hbmRzLmdldFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBnZXRTdHJpbmdzIChsYW5ndWFnZSkge1xuICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgbGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLmFkYi5nZXREZXZpY2VMYW5ndWFnZSgpO1xuICAgIHRoaXMubG9nLmluZm8oYE5vIGxhbmd1YWdlIHNwZWNpZmllZCwgcmV0dXJuaW5nIHN0cmluZ3MgZm9yOiAke2xhbmd1YWdlfWApO1xuICB9XG5cbiAgLy8gQ2xpZW50cyByZXF1aXJlIHRoZSByZXN1bHRpbmcgbWFwcGluZyB0byBoYXZlIGJvdGgga2V5c1xuICAvLyBhbmQgdmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gIGNvbnN0IHByZXByb2Nlc3NTdHJpbmdzTWFwID0gKG1hcHBpbmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBfLnRvUGFpcnMobWFwcGluZykpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gXy5pc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBpZiAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgc3RyaW5nc1xuICAgIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbiAgfVxuXG4gIHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0gPSBhd2FpdCBhbmRyb2lkSGVscGVycy5wdXNoU3RyaW5ncyhsYW5ndWFnZSwgdGhpcy5hZGIsIHRoaXMub3B0cyk7XG4gIGlmICh0aGlzLmJvb3RzdHJhcCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgbXV0YXRpbmcgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UsIGJ1dCBpdCdzIGhvdyBhcHBpdW0gY3VycmVudGx5IHdvcmtzXG4gICAgYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbigndXBkYXRlU3RyaW5ncycpO1xuICB9XG5cbiAgcmV0dXJuIHByZXByb2Nlc3NTdHJpbmdzTWFwKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pO1xufTtcblxuY29tbWFuZHMubGF1bmNoQXBwID0gYXN5bmMgZnVuY3Rpb24gbGF1bmNoQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5pbml0QVVUKCk7XG4gIGF3YWl0IHRoaXMuc3RhcnRBVVQoKTtcbn07XG5cbmNvbW1hbmRzLnN0YXJ0QWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFjdGl2aXR5IChhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSxcbiAgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eSwgaW50ZW50QWN0aW9uLCBpbnRlbnRDYXRlZ29yeSwgaW50ZW50RmxhZ3MsXG4gIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLCBkb250U3RvcEFwcE9uUmVzZXQpIHtcbiAgdGhpcy5sb2cuZGVidWcoYFN0YXJ0aW5nIHBhY2thZ2UgJyR7YXBwUGFja2FnZX0nIGFuZCBhY3Rpdml0eSAnJHthcHBBY3Rpdml0eX0nYCk7XG5cbiAgLy8gZG9udFN0b3BBcHBPblJlc2V0IGlzIGJvdGggYW4gYXJndW1lbnQgaGVyZSwgYW5kIGEgZGVzaXJlZCBjYXBhYmlsaXR5XG4gIC8vIGlmIHRoZSBhcmd1bWVudCBpcyBzZXQsIHVzZSBpdCwgb3RoZXJ3aXNlIHVzZSB0aGUgY2FwXG4gIGlmICghdXRpbC5oYXNWYWx1ZShkb250U3RvcEFwcE9uUmVzZXQpKSB7XG4gICAgZG9udFN0b3BBcHBPblJlc2V0ID0gISF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0O1xuICB9XG5cbiAgbGV0IGFyZ3MgPSB7XG4gICAgcGtnOiBhcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiBhcHBBY3Rpdml0eSxcbiAgICB3YWl0UGtnOiBhcHBXYWl0UGFja2FnZSB8fCBhcHBQYWNrYWdlLFxuICAgIHdhaXRBY3Rpdml0eTogYXBwV2FpdEFjdGl2aXR5IHx8IGFwcEFjdGl2aXR5LFxuICAgIGFjdGlvbjogaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiBpbnRlbnRDYXRlZ29yeSxcbiAgICBmbGFnczogaW50ZW50RmxhZ3MsXG4gICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgc3RvcEFwcDogIWRvbnRTdG9wQXBwT25SZXNldFxuICB9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgPSB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgfHwge307XG4gIHRoaXMuX2NhY2hlZEFjdGl2aXR5QXJnc1tgJHthcmdzLndhaXRQa2d9LyR7YXJncy53YWl0QWN0aXZpdHl9YF0gPSBhcmdzO1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydEFwcChhcmdzKTtcbn07XG5cbmNvbW1hbmRzLnJlc2V0ID0gYXN5bmMgZnVuY3Rpb24gcmVzZXQgKCkge1xuICBhd2FpdCBhbmRyb2lkSGVscGVycy5yZXNldEFwcCh0aGlzLmFkYiwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCB7ZmFzdFJlc2V0OiB0cnVlfSkpO1xuICAvLyByZXNldCBjb250ZXh0IHNpbmNlIHdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9uIGNvbnRleHQgd2Ugd2lsbCBlbmQgdXAgYWZ0ZXIgYXBwIGxhdW5jaC5cbiAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KCk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmlzQ2hyb21lU2Vzc2lvbiA/IHRoaXMuc3RhcnRDaHJvbWVTZXNzaW9uKCkgOiB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFVVCA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0QVVUICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoe1xuICAgIHBrZzogdGhpcy5vcHRzLmFwcFBhY2thZ2UsXG4gICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IHRoaXMub3B0cy5pbnRlbnRBY3Rpb24sXG4gICAgY2F0ZWdvcnk6IHRoaXMub3B0cy5pbnRlbnRDYXRlZ29yeSxcbiAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgIHdhaXRQa2c6IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IHRoaXMub3B0cy5hcHBXYWl0QWN0aXZpdHksXG4gICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgd2FpdER1cmF0aW9uOiB0aGlzLm9wdHMuYXBwV2FpdER1cmF0aW9uLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB0aGlzLm9wdHMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHMsXG4gICAgc3RvcEFwcDogIXRoaXMub3B0cy5kb250U3RvcEFwcE9uUmVzZXQsXG4gICAgdXNlcjogdGhpcy5vcHRzLnVzZXJQcm9maWxlLFxuICB9KTtcbn07XG5cbi8vIHdlIG92ZXJyaWRlIHNldFVybCB0byB0YWtlIGFuIGFuZHJvaWQgVVJJIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBkZWVwLWxpbmtpbmdcbi8vIGluc2lkZSBhbiBhcHAsIHNpbWlsYXIgdG8gc3RhcnRpbmcgYW4gaW50ZW50XG5jb21tYW5kcy5zZXRVcmwgPSBhc3luYyBmdW5jdGlvbiBzZXRVcmwgKHVyaSkge1xuICBhd2FpdCB0aGlzLmFkYi5zdGFydFVyaSh1cmksIHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbi8vIGNsb3NpbmcgYXBwIHVzaW5nIGZvcmNlIHN0b3BcbmNvbW1hbmRzLmNsb3NlQXBwID0gYXN5bmMgZnVuY3Rpb24gY2xvc2VBcHAgKCkge1xuICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AodGhpcy5vcHRzLmFwcFBhY2thZ2UpO1xuICAvLyByZXNldCBjb250ZXh0IHNpbmNlIHdlIGRvbid0IGtub3cgd2hhdCBraW5kIG9uIGNvbnRleHQgd2Ugd2lsbCBlbmQgdXAgYWZ0ZXIgYXBwIGxhdW5jaC5cbiAgYXdhaXQgdGhpcy5zZXRDb250ZXh0KCk7XG59O1xuXG5jb21tYW5kcy5nZXREaXNwbGF5RGVuc2l0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERpc3BsYXlEZW5zaXR5ICgpIHtcbiAgLy8gZmlyc3QgdHJ5IHRoZSBwcm9wZXJ0eSBmb3IgZGV2aWNlc1xuICBsZXQgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3JvLnNmLmxjZF9kZW5zaXR5J10pO1xuICBpZiAob3V0KSB7XG4gICAgbGV0IHZhbCA9IHBhcnNlSW50KG91dCwgMTApO1xuICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBOYU4sIHRyeSBnZXR0aW5nIHRoZSBlbXVsYXRvciBwcm9wZXJ0eVxuICAgIGlmICghaXNOYU4odmFsKSkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBkZW5zaXR5IHZhbHVlIHdhcyBOYU46IFwiJHtvdXR9XCJgKTtcbiAgfVxuICAvLyBmYWxsYmFjayB0byB0cnlpbmcgcHJvcGVydHkgZm9yIGVtdWxhdG9yc1xuICBvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2dldHByb3AnLCAncWVtdS5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gY291bGRuJ3QgZ2V0IGFueXRoaW5nLCBzbyBlcnJvciBvdXRcbiAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdygnRmFpbGVkIHRvIGdldCBkaXNwbGF5IGRlbnNpdHkgcHJvcGVydHkuJyk7XG59O1xuXG5jb21tYW5kcy5tb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHthY3Rpb259ID0gb3B0cztcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKGFjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAnYWN0aW9uJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5hZGIucGVyZm9ybUVkaXRvckFjdGlvbihhY3Rpb24pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcmVjZW50IHN5c3RlbSBub3RpZmljYXRpb25zLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBgYWRiLmdldE5vdGlmaWNhdGlvbnNgIGZvclxuICogbW9yZSBkZXRhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldE5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXROb3RpZmljYXRpb25zICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmdldE5vdGlmaWNhdGlvbnMoKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU21zTGlzdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXggWzEwMF0gLSBUaGUgbWF4aW11bSBjb3VudCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzXG4gKiB0byByZXRyaWV2ZVxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBTTVMgbWVzc2FnZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7U21zTGlzdE9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtPYmplY3R9IFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBgYWRiLmdldFNtc0xpc3RgIGZvclxuICogbW9yZSBkZXRhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUxpc3RTbXMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVMaXN0U21zIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmdldFNtc0xpc3Qob3B0cyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFVubG9ja09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXkgVGhlIHVubG9jayBrZXkuIFRoZSB2YWx1ZSBvZiB0aGlzIGtleSBkZXBlbmRzXG4gKiBvbiB0aGUgYWN0dWFsIHVubG9jayB0eXBlIGFuZCBjb3VsZCBiZSBhIHBpbi9wYXNzd29yZC9wYXR0ZXJuIHZhbHVlIG9yXG4gKiBhIGJpb21ldHJpYyBmaW5nZXIgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBUaGUgdW5sb2NrIHR5cGUuIFRoZSBmb2xsb3dpbmcgdW5sb2NrIHR5cGVzXG4gKiBhcmUgc3VwcG9ydGVkOiBgcGluYCwgYHBpbldpdGhLZXlFdmVudGAsIGBwYXNzd29yZGAsIGBwYXR0ZXJuYCBhbmQgYGZpbmdlcnByaW50YC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gc3RyYXRlZ3kgRWl0aGVyICdsb2Nrc2V0dGluZ3MnIChkZWZhdWx0KSBvciAndWlhdXRvbWF0b3InLlxuICogU2V0dGluZyBpdCB0byAndWlhdXRvbWF0b3InIHdpbGwgZW5mb3JjZSB0aGUgZHJpdmVyIHRvIGF2b2lkIHVzaW5nIHNwZWNpYWxcbiAqIEFEQiBzaG9ydGN1dHMgaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhlIHVubG9jayBwcm9jZWR1cmUuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRpbWVvdXRNcyBbMjAwMF0gVGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIHRvIHdhaXQgdW50aWwgdGhlIHNjcmVlbiBnZXRzIHVubG9ja2VkXG4gKi9cblxuLyoqXG4gKiBVbmxvY2tzIHRoZSBkZXZpY2UgaWYgaXQgaXMgbG9ja2VkLiBOb29wIGlmIHRoZSBkZXZpY2UncyBzY3JlZW4gaXMgbm90IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0gez9VbmxvY2tPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdW5sb2NrIG9wZXJhdGlvbiBmYWlscyBvciB0aGUgcHJvdmlkZWRcbiAqIGFyZ3VtZW50cyBhcmUgbm90IHZhbGlkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVVubG9jayAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsga2V5LCB0eXBlLCBzdHJhdGVneSwgdGltZW91dE1zIH0gPSBvcHRzO1xuICBhd2FpdCBhbmRyb2lkSGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHtcbiAgICB1bmxvY2tLZXk6IGtleSxcbiAgICB1bmxvY2tUeXBlOiB0eXBlLFxuICAgIHVubG9ja1N0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dDogdGltZW91dE1zLFxuICB9KTtcbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEscUJBQXFCLEdBQUcsc0JBQXNCO0FBRXBELElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUM7QUFBQTtBQUVqREYsUUFBUSxDQUFDRyxJQUFJLEdBQUcsZUFBZUEsSUFBSSxDQUFFQSxJQUFJLEVBQUU7RUFFekNBLElBQUksR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUNGLElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUNHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBR0gsSUFBSTtFQUM3QyxJQUFJSSxNQUFNLEdBQUc7SUFDWEMsSUFBSSxFQUFFTCxJQUFJO0lBQ1ZNLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFDRCxJQUFJLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxlQUFlLEVBQUU7SUFDN0JKLE1BQU0sQ0FBQ0ksZUFBZSxHQUFHLElBQUk7RUFDL0I7RUFDQSxNQUFNLElBQUksQ0FBQ0MsVUFBVSxDQUFDTCxNQUFNLENBQUM7QUFDL0IsQ0FBQztBQUVEUCxRQUFRLENBQUNZLFVBQVUsR0FBRyxlQUFlQSxVQUFVLENBQUVMLE1BQU0sRUFBRTtFQUN2RCxPQUFPLE1BQU0sSUFBSSxDQUFDTSxTQUFTLENBQUNDLFVBQVUsQ0FBQyxTQUFTLEVBQUVQLE1BQU0sQ0FBQztBQUMzRCxDQUFDO0FBV0RQLFFBQVEsQ0FBQ2UsYUFBYSxHQUFHLGVBQWVBLGFBQWEsQ0FBRUMsTUFBTSxHQUFHakIscUJBQXFCLEVBQUU7RUFDckYsSUFBSSxDQUFDa0IsR0FBRyxDQUFDQyxLQUFLLENBQUMsc0RBQXNELEdB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"general.js","names":["MOMENT_FORMAT_ISO8601","ALL_PERMISSIONS_MAGIC","commands","helpers","extensions","keys","_","isArray","join","params","text","replace","opts","unicodeKeyboard","doSendKeys","bootstrap","sendAction","getDeviceTime","format","log","debug","deviceTimestamp","adb","shell","trim","parsedTimestamp","moment","utc","isValid","warn","utcOffset","_tzm","mobileGetDeviceTime","getPageSource","back","isKeyboardShown","isSoftKeyboardPresent","hideKeyboard","openSettingsActivity","setting","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","getWindowSize","getWindowRect","width","height","x","y","getCurrentActivity","getCurrentPackage","background","seconds","goToHome","sleepMs","thresholdMs","intervalMs","min","parseInt","progressCb","elapsedMs","progress","waitSecs","toFixed","progressPct","longSleep","args","_cachedActivityArgs","activateApp","ign","appWaitPackage","appWaitActivity","split","includes","pkg","activity","action","intentAction","category","intentCategory","flags","intentFlags","waitPkg","waitActivity","waitForLaunch","appWaitForLaunch","waitDuration","appWaitDuration","optionalIntentArguments","stopApp","user","userProfile","util","filterObject","JSON","stringify","startApp","getStrings","language","getDeviceLanguage","info","preprocessStringsMap","mapping","result","key","value","toPairs","isString","apkStrings","androidHelpers","pushStrings","launchApp","initAUT","startAUT","startActivity","dontStopAppOnReset","hasValue","reset","resetApp","Object","assign","fastReset","setContext","isChromeSession","startChromeSession","setUrl","uri","startUri","closeApp","forceStop","getDisplayDensity","out","val","isNaN","errorAndThrow","mobilePerformEditorAction","errors","InvalidArgumentError","performEditorAction","PERMISSION_ACTION","GRANT","REVOKE","mobileChangePermissions","permissions","isNil","isEmpty","lowerAction","toLower","values","affectedPermissions","dumpsys","grantedPermissions","getGrantedPermissions","reqPermissons","getReqPermissions","difference","grantPermissions","B","all","map","name","revokePermission","PERMISSIONS_TYPE","DENIED","GRANTED","REQUESTED","mobileGetPermissions","type","actionFunc","getDeniedPermissions","mobileGetNotifications","getNotifications","mobileListSms","getSmsList","mobileUnlock","strategy","timeoutMs","unlock","unlockKey","unlockType","unlockStrategy","unlockSuccessTimeout"],"sources":["../../../lib/commands/general.js"],"sourcesContent":["import _ from 'lodash';\nimport androidHelpers from '../android-helpers';\nimport { util } from '@appium/support';\nimport moment from 'moment';\nimport { longSleep } from 'asyncbox';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nconst MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ';\nconst ALL_PERMISSIONS_MAGIC = 'all';\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keys = async function keys (keys) {\n // Protocol sends an array; rethink approach\n keys = _.isArray(keys) ? keys.join('') : keys;\n let params = {\n text: keys,\n replace: false\n };\n if (this.opts.unicodeKeyboard) {\n params.unicodeKeyboard = true;\n }\n await this.doSendKeys(params);\n};\n\ncommands.doSendKeys = async function doSendKeys (params) {\n return await this.bootstrap.sendAction('setText', params);\n};\n\n/**\n * Retrieves the current device's timestamp.\n *\n * @param {string} format - The set of format specifiers. Read\n * https://momentjs.com/docs/ to get the full list of supported\n * datetime format specifiers. The default format is\n * `YYYY-MM-DDTHH:mm:ssZ`, which complies to ISO-8601\n * @return {string} Formatted datetime string or the raw command output if formatting fails\n */\ncommands.getDeviceTime = async function getDeviceTime (format = MOMENT_FORMAT_ISO8601) {\n this.log.debug('Attempting to capture android device date and time. ' +\n `The format specifier is '${format}'`);\n const deviceTimestamp = (await this.adb.shell(['date', '+%Y-%m-%dT%T%z'])).trim();\n this.log.debug(`Got device timestamp: ${deviceTimestamp}`);\n const parsedTimestamp = moment.utc(deviceTimestamp, 'YYYY-MM-DDTHH:mm:ssZZ');\n if (!parsedTimestamp.isValid()) {\n this.log.warn('Cannot parse the returned timestamp. Returning as is');\n return deviceTimestamp;\n }\n return parsedTimestamp.utcOffset(parsedTimestamp._tzm || 0).format(format);\n};\n\n/**\n * @typedef {Object} DeviceTimeOptions\n * @property {string} format [YYYY-MM-DDTHH:mm:ssZ] - See getDeviceTime#format\n */\n\n/**\n * Retrieves the current device time\n *\n * @param {DeviceTimeOptions} opts\n * @return {string} Formatted datetime string or the raw command output if formatting fails\n */\ncommands.mobileGetDeviceTime = async function mobileGetDeviceTime (opts = {}) {\n return await this.getDeviceTime(opts.format);\n};\n\ncommands.getPageSource = async function getPageSource () {\n return await this.bootstrap.sendAction('source');\n};\n\ncommands.back = async function back () {\n return await this.bootstrap.sendAction('pressBack');\n};\n\ncommands.isKeyboardShown = async function isKeyboardShown () {\n const {isKeyboardShown} = await this.adb.isSoftKeyboardPresent();\n return isKeyboardShown;\n};\n\ncommands.hideKeyboard = async function hideKeyboard () {\n return await this.adb.hideKeyboard();\n};\n\ncommands.openSettingsActivity = async function openSettingsActivity (setting) {\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n await this.adb.shell(['am', 'start', '-a', `android.settings.${setting}`]);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n};\n\ncommands.getWindowSize = async function getWindowSize () {\n return await this.bootstrap.sendAction('getDeviceSize');\n};\n\n// For W3C\ncommands.getWindowRect = async function getWindowRect () {\n const { width, height } = await this.getWindowSize();\n return {\n width,\n height,\n x: 0,\n y: 0\n };\n};\n\ncommands.getCurrentActivity = async function getCurrentActivity () {\n return (await this.adb.getFocusedPackageAndActivity()).appActivity;\n};\n\ncommands.getCurrentPackage = async function getCurrentPackage () {\n return (await this.adb.getFocusedPackageAndActivity()).appPackage;\n};\n\ncommands.background = async function background (seconds) {\n if (seconds < 0) {\n // if user passes in a negative seconds value, interpret that as the instruction\n // to not bring the app back at all\n await this.adb.goToHome();\n return true;\n }\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n await this.adb.goToHome();\n\n // people can wait for a long time, so to be safe let's use the longSleep function and log\n // progress periodically.\n const sleepMs = seconds * 1000;\n const thresholdMs = 30 * 1000; // use the spin-wait for anything over this threshold\n // for our spin interval, use 1% of the total wait time, but nothing bigger than 30s\n const intervalMs = _.min([30 * 1000, parseInt(sleepMs / 100, 10)]);\n const progressCb = ({elapsedMs, progress}) => {\n const waitSecs = (elapsedMs / 1000).toFixed(0);\n const progressPct = (progress * 100).toFixed(2);\n this.log.debug(`Waited ${waitSecs}s so far (${progressPct}%)`);\n };\n await longSleep(sleepMs, {thresholdMs, intervalMs, progressCb});\n\n let args;\n if (this._cachedActivityArgs && this._cachedActivityArgs[`${appPackage}/${appActivity}`]) {\n // the activity was started with `startActivity`, so use those args to restart\n args = this._cachedActivityArgs[`${appPackage}/${appActivity}`];\n } else {\n try {\n this.log.debug(`Activating app '${appPackage}' in order to restore it`);\n await this.activateApp(appPackage);\n return true;\n } catch (ign) {}\n args = ((appPackage === this.opts.appPackage && appActivity === this.opts.appActivity) ||\n (appPackage === this.opts.appWaitPackage && (this.opts.appWaitActivity || '').split(',').includes(appActivity)))\n ? {// the activity is the original session activity, so use the original args\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction,\n category: this.opts.intentCategory,\n flags: this.opts.intentFlags,\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: false,\n user: this.opts.userProfile}\n : {// the activity was started some other way, so use defaults\n pkg: appPackage,\n activity: appActivity,\n waitPkg: appPackage,\n waitActivity: appActivity,\n stopApp: false};\n }\n args = await util.filterObject(args);\n this.log.debug(`Bringing application back to foreground with arguments: ${JSON.stringify(args)}`);\n return await this.adb.startApp(args);\n};\n\ncommands.getStrings = async function getStrings (language) {\n if (!language) {\n language = await this.adb.getDeviceLanguage();\n this.log.info(`No language specified, returning strings for: ${language}`);\n }\n\n // Clients require the resulting mapping to have both keys\n // and values of type string\n const preprocessStringsMap = (mapping) => {\n const result = {};\n for (const [key, value] of _.toPairs(mapping)) {\n result[key] = _.isString(value) ? value : JSON.stringify(value);\n }\n return result;\n };\n\n if (this.apkStrings[language]) {\n // Return cached strings\n return preprocessStringsMap(this.apkStrings[language]);\n }\n\n this.apkStrings[language] = await androidHelpers.pushStrings(language, this.adb, this.opts);\n if (this.bootstrap) {\n // TODO: This is mutating the current language, but it's how appium currently works\n await this.bootstrap.sendAction('updateStrings');\n }\n\n return preprocessStringsMap(this.apkStrings[language]);\n};\n\ncommands.launchApp = async function launchApp () {\n await this.initAUT();\n await this.startAUT();\n};\n\ncommands.startActivity = async function startActivity (appPackage, appActivity,\n appWaitPackage, appWaitActivity, intentAction, intentCategory, intentFlags,\n optionalIntentArguments, dontStopAppOnReset) {\n this.log.debug(`Starting package '${appPackage}' and activity '${appActivity}'`);\n\n // dontStopAppOnReset is both an argument here, and a desired capability\n // if the argument is set, use it, otherwise use the cap\n if (!util.hasValue(dontStopAppOnReset)) {\n dontStopAppOnReset = !!this.opts.dontStopAppOnReset;\n }\n\n let args = {\n pkg: appPackage,\n activity: appActivity,\n waitPkg: appWaitPackage || appPackage,\n waitActivity: appWaitActivity || appActivity,\n action: intentAction,\n category: intentCategory,\n flags: intentFlags,\n optionalIntentArguments,\n stopApp: !dontStopAppOnReset\n };\n this._cachedActivityArgs = this._cachedActivityArgs || {};\n this._cachedActivityArgs[`${args.waitPkg}/${args.waitActivity}`] = args;\n await this.adb.startApp(args);\n};\n\ncommands.reset = async function reset () {\n await androidHelpers.resetApp(this.adb, Object.assign({}, this.opts, {fastReset: true}));\n // reset context since we don't know what kind on context we will end up after app launch.\n await this.setContext();\n return await this.isChromeSession ? this.startChromeSession() : this.startAUT();\n};\n\ncommands.startAUT = async function startAUT () {\n await this.adb.startApp({\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction,\n category: this.opts.intentCategory,\n flags: this.opts.intentFlags,\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: !this.opts.dontStopAppOnReset,\n user: this.opts.userProfile,\n });\n};\n\n// we override setUrl to take an android URI which can be used for deep-linking\n// inside an app, similar to starting an intent\ncommands.setUrl = async function setUrl (uri) {\n await this.adb.startUri(uri, this.opts.appPackage);\n};\n\n// closing app using force stop\ncommands.closeApp = async function closeApp () {\n await this.adb.forceStop(this.opts.appPackage);\n // reset context since we don't know what kind on context we will end up after app launch.\n await this.setContext();\n};\n\ncommands.getDisplayDensity = async function getDisplayDensity () {\n // first try the property for devices\n let out = await this.adb.shell(['getprop', 'ro.sf.lcd_density']);\n if (out) {\n let val = parseInt(out, 10);\n // if the value is NaN, try getting the emulator property\n if (!isNaN(val)) {\n return val;\n }\n this.log.debug(`Parsed density value was NaN: \"${out}\"`);\n }\n // fallback to trying property for emulators\n out = await this.adb.shell(['getprop', 'qemu.sf.lcd_density']);\n if (out) {\n let val = parseInt(out, 10);\n if (!isNaN(val)) {\n return val;\n }\n this.log.debug(`Parsed density value was NaN: \"${out}\"`);\n }\n // couldn't get anything, so error out\n this.log.errorAndThrow('Failed to get display density property.');\n};\n\ncommands.mobilePerformEditorAction = async function mobilePerformEditorAction (opts = {}) {\n const {action} = opts;\n if (!util.hasValue(action)) {\n throw new errors.InvalidArgumentError(`'action' argument is required`);\n }\n\n await this.adb.performEditorAction(action);\n};\n\nconst PERMISSION_ACTION = {\n GRANT: 'grant',\n REVOKE: 'revoke',\n};\n\n/**\n * @typedef {Object} ChangePermissionsOptions\n * @property {!string|Array<string>} permissions - The full name of the permission to be changed\n * or a list of permissions. Check https://developer.android.com/reference/android/Manifest.permission\n * to get the full list of standard Android permssion names. Mandatory argument.\n * If 'all' magic string is passed then the chosen action is going to be applied to all\n * permisisons requested/granted by 'appPackage'.\n * @property {string} appPackage [this.opts.appPackage] - The application package to set change\n * permissions on. Defaults to the package name under test.\n * @property {string} action [grant] - One of `PERMISSION_ACTION` values\n */\n\n/**\n * Changes package permissions in runtime.\n *\n * @param {?ChangePermissionsOptions} opts - Available options mapping.\n * @throws {Error} if there was a failure while changing permissions\n */\ncommands.mobileChangePermissions = async function mobileChangePermissions (opts = {}) {\n const {\n permissions,\n appPackage = this.opts.appPackage,\n action = PERMISSION_ACTION.GRANT,\n } = opts;\n if (_.isNil(permissions)) {\n throw new errors.InvalidArgumentError(`'permissions' argument is required`);\n }\n if (_.isEmpty(permissions)) {\n throw new errors.InvalidArgumentError(`'permissions' argument must not be empty`);\n }\n const lowerAction = _.toLower(action);\n if (![PERMISSION_ACTION.GRANT, PERMISSION_ACTION.REVOKE].includes(lowerAction)) {\n throw new errors.InvalidArgumentError(`Unknown action '${action}'. ` +\n `Only ${JSON.stringify(_.values(PERMISSION_ACTION))} actions are supported`);\n }\n\n let affectedPermissions = _.isArray(permissions) ? permissions : [permissions];\n if (_.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {\n const dumpsys = await this.adb.shell(['dumpsys', 'package', appPackage]);\n const grantedPermissions = await this.adb.getGrantedPermissions(appPackage, dumpsys);\n if (lowerAction === PERMISSION_ACTION.GRANT) {\n const reqPermissons = await this.adb.getReqPermissions(appPackage, dumpsys);\n affectedPermissions = _.difference(reqPermissons, grantedPermissions);\n } else {\n affectedPermissions = grantedPermissions;\n }\n if (_.isEmpty(affectedPermissions)) {\n this.log.info(`'${appPackage}' contains no permissions to ${lowerAction}`);\n return;\n }\n }\n\n if (lowerAction === PERMISSION_ACTION.GRANT) {\n await this.adb.grantPermissions(appPackage, affectedPermissions);\n } else {\n await B.all(affectedPermissions.map((name) => this.adb.revokePermission(appPackage, name)));\n }\n};\n\nconst PERMISSIONS_TYPE = {\n DENIED: 'denied',\n GRANTED: 'granted',\n REQUESTED: 'requested',\n};\n\n/**\n * @typedef {Object} GetPermissionsOptions\n * @property {string} type [requested] - One of possible permission types to get.\n * Can be any of `PERMISSIONS_TYPE` values.\n * @property {string} appPackage [this.opts.appPackage] - The application package to set change\n * permissions on. Defaults to the package name under test.\n */\n\n/**\n * Gets runtime permissions list for the given application package.\n *\n * @param {GetPermissionsOptions} opts - Available options mapping.\n * @returns {Array<string>} The list of retrieved permissions for the given type\n * (can also be empty).\n * @throws {Error} if there was an error while getting permissions.\n */\ncommands.mobileGetPermissions = async function mobileGetPermissions (opts = {}) {\n const {\n type = PERMISSIONS_TYPE.REQUESTED,\n appPackage = this.opts.appPackage,\n } = opts;\n\n let actionFunc;\n switch (_.toLower(type)) {\n case PERMISSIONS_TYPE.REQUESTED:\n actionFunc = (appPackage) => this.adb.getReqPermissions(appPackage);\n break;\n case PERMISSIONS_TYPE.GRANTED:\n actionFunc = (appPackage) => this.adb.getGrantedPermissions(appPackage);\n break;\n case PERMISSIONS_TYPE.DENIED:\n actionFunc = (appPackage) => this.adb.getDeniedPermissions(appPackage);\n break;\n default:\n throw new errors.InvalidArgumentError(`Unknown permissions type '${type}'. ` +\n `Only ${JSON.stringify(_.values(PERMISSIONS_TYPE))} types are supported`);\n }\n return await actionFunc(appPackage);\n};\n\n/**\n * Retrieves the list of recent system notifications.\n *\n * @returns {Object} See the documentation on `adb.getNotifications` for\n * more details\n */\ncommands.mobileGetNotifications = async function mobileGetNotifications () {\n return await this.adb.getNotifications();\n};\n\n/**\n * @typedef {Object} SmsListOptions\n * @property {number} max [100] - The maximum count of recent SMS messages\n * to retrieve\n */\n\n/**\n * Retrieves the list of recent SMS messages with their properties.\n *\n * @param {SmsListOptions} opts\n * @returns {Object} See the documentation on `adb.getSmsList` for\n * more details\n */\ncommands.mobileListSms = async function mobileListSms (opts = {}) {\n return await this.adb.getSmsList(opts);\n};\n\n/**\n * @typedef {Object} UnlockOptions\n * @property {string} key The unlock key. The value of this key depends\n * on the actual unlock type and could be a pin/password/pattern value or\n * a biometric finger id.\n * @property {string} type The unlock type. The following unlock types\n * are supported: `pin`, `pinWithKeyEvent`, `password`, `pattern` and `fingerprint`.\n * @property {?string} strategy Either 'locksettings' (default) or 'uiautomator'.\n * Setting it to 'uiautomator' will enforce the driver to avoid using special\n * ADB shortcuts in order to speed up the unlock procedure.\n * @property {?number} timeoutMs [2000] The maximum time in milliseconds\n * to wait until the screen gets unlocked\n */\n\n/**\n * Unlocks the device if it is locked. Noop if the device's screen is not locked.\n *\n * @param {?UnlockOptions} opts\n * @throws {Error} if unlock operation fails or the provided\n * arguments are not valid\n */\ncommands.mobileUnlock = async function mobileUnlock (opts = {}) {\n const { key, type, strategy, timeoutMs } = opts;\n await androidHelpers.unlock(this, this.adb, {\n unlockKey: key,\n unlockType: type,\n unlockStrategy: strategy,\n unlockSuccessTimeout: timeoutMs,\n });\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"general.js","names":["MOMENT_FORMAT_ISO8601","commands","helpers","extensions","keys","_","isArray","join","params","text","replace","opts","unicodeKeyboard","doSendKeys","bootstrap","sendAction","getDeviceTime","format","log","debug","deviceTimestamp","adb","shell","trim","parsedTimestamp","moment","utc","isValid","warn","utcOffset","_tzm","mobileGetDeviceTime","getPageSource","back","isKeyboardShown","isSoftKeyboardPresent","hideKeyboard","openSettingsActivity","setting","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","getWindowSize","getWindowRect","width","height","x","y","getCurrentActivity","getCurrentPackage","background","seconds","goToHome","sleepMs","thresholdMs","intervalMs","min","parseInt","progressCb","elapsedMs","progress","waitSecs","toFixed","progressPct","longSleep","args","_cachedActivityArgs","activateApp","ign","appWaitPackage","appWaitActivity","split","includes","pkg","activity","action","intentAction","category","intentCategory","flags","intentFlags","waitPkg","waitActivity","waitForLaunch","appWaitForLaunch","waitDuration","appWaitDuration","optionalIntentArguments","stopApp","user","userProfile","util","filterObject","JSON","stringify","startApp","getStrings","language","getDeviceLanguage","info","preprocessStringsMap","mapping","result","key","value","toPairs","isString","apkStrings","androidHelpers","pushStrings","launchApp","initAUT","startAUT","startActivity","dontStopAppOnReset","hasValue","reset","resetApp","Object","assign","fastReset","setContext","isChromeSession","startChromeSession","setUrl","uri","startUri","closeApp","forceStop","getDisplayDensity","out","val","isNaN","errorAndThrow","mobilePerformEditorAction","errors","InvalidArgumentError","performEditorAction","mobileGetNotifications","getNotifications","mobileListSms","getSmsList","mobileUnlock","type","strategy","timeoutMs","unlock","unlockKey","unlockType","unlockStrategy","unlockSuccessTimeout"],"sources":["../../../lib/commands/general.js"],"sourcesContent":["import _ from 'lodash';\nimport androidHelpers from '../android-helpers';\nimport { util } from '@appium/support';\nimport moment from 'moment';\nimport { longSleep } from 'asyncbox';\nimport { errors } from 'appium/driver';\n\nconst MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ';\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.keys = async function keys (keys) {\n // Protocol sends an array; rethink approach\n keys = _.isArray(keys) ? keys.join('') : keys;\n let params = {\n text: keys,\n replace: false\n };\n if (this.opts.unicodeKeyboard) {\n params.unicodeKeyboard = true;\n }\n await this.doSendKeys(params);\n};\n\ncommands.doSendKeys = async function doSendKeys (params) {\n return await this.bootstrap.sendAction('setText', params);\n};\n\n/**\n * Retrieves the current device's timestamp.\n *\n * @param {string} format - The set of format specifiers. Read\n * https://momentjs.com/docs/ to get the full list of supported\n * datetime format specifiers. The default format is\n * `YYYY-MM-DDTHH:mm:ssZ`, which complies to ISO-8601\n * @return {string} Formatted datetime string or the raw command output if formatting fails\n */\ncommands.getDeviceTime = async function getDeviceTime (format = MOMENT_FORMAT_ISO8601) {\n this.log.debug('Attempting to capture android device date and time. ' +\n `The format specifier is '${format}'`);\n const deviceTimestamp = (await this.adb.shell(['date', '+%Y-%m-%dT%T%z'])).trim();\n this.log.debug(`Got device timestamp: ${deviceTimestamp}`);\n const parsedTimestamp = moment.utc(deviceTimestamp, 'YYYY-MM-DDTHH:mm:ssZZ');\n if (!parsedTimestamp.isValid()) {\n this.log.warn('Cannot parse the returned timestamp. Returning as is');\n return deviceTimestamp;\n }\n return parsedTimestamp.utcOffset(parsedTimestamp._tzm || 0).format(format);\n};\n\n/**\n * @typedef {Object} DeviceTimeOptions\n * @property {string} format [YYYY-MM-DDTHH:mm:ssZ] - See getDeviceTime#format\n */\n\n/**\n * Retrieves the current device time\n *\n * @param {DeviceTimeOptions} opts\n * @return {string} Formatted datetime string or the raw command output if formatting fails\n */\ncommands.mobileGetDeviceTime = async function mobileGetDeviceTime (opts = {}) {\n return await this.getDeviceTime(opts.format);\n};\n\ncommands.getPageSource = async function getPageSource () {\n return await this.bootstrap.sendAction('source');\n};\n\ncommands.back = async function back () {\n return await this.bootstrap.sendAction('pressBack');\n};\n\ncommands.isKeyboardShown = async function isKeyboardShown () {\n const {isKeyboardShown} = await this.adb.isSoftKeyboardPresent();\n return isKeyboardShown;\n};\n\ncommands.hideKeyboard = async function hideKeyboard () {\n return await this.adb.hideKeyboard();\n};\n\ncommands.openSettingsActivity = async function openSettingsActivity (setting) {\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n await this.adb.shell(['am', 'start', '-a', `android.settings.${setting}`]);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n};\n\ncommands.getWindowSize = async function getWindowSize () {\n return await this.bootstrap.sendAction('getDeviceSize');\n};\n\n// For W3C\ncommands.getWindowRect = async function getWindowRect () {\n const { width, height } = await this.getWindowSize();\n return {\n width,\n height,\n x: 0,\n y: 0\n };\n};\n\ncommands.getCurrentActivity = async function getCurrentActivity () {\n return (await this.adb.getFocusedPackageAndActivity()).appActivity;\n};\n\ncommands.getCurrentPackage = async function getCurrentPackage () {\n return (await this.adb.getFocusedPackageAndActivity()).appPackage;\n};\n\ncommands.background = async function background (seconds) {\n if (seconds < 0) {\n // if user passes in a negative seconds value, interpret that as the instruction\n // to not bring the app back at all\n await this.adb.goToHome();\n return true;\n }\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n await this.adb.goToHome();\n\n // people can wait for a long time, so to be safe let's use the longSleep function and log\n // progress periodically.\n const sleepMs = seconds * 1000;\n const thresholdMs = 30 * 1000; // use the spin-wait for anything over this threshold\n // for our spin interval, use 1% of the total wait time, but nothing bigger than 30s\n const intervalMs = _.min([30 * 1000, parseInt(sleepMs / 100, 10)]);\n const progressCb = ({elapsedMs, progress}) => {\n const waitSecs = (elapsedMs / 1000).toFixed(0);\n const progressPct = (progress * 100).toFixed(2);\n this.log.debug(`Waited ${waitSecs}s so far (${progressPct}%)`);\n };\n await longSleep(sleepMs, {thresholdMs, intervalMs, progressCb});\n\n let args;\n if (this._cachedActivityArgs && this._cachedActivityArgs[`${appPackage}/${appActivity}`]) {\n // the activity was started with `startActivity`, so use those args to restart\n args = this._cachedActivityArgs[`${appPackage}/${appActivity}`];\n } else {\n try {\n this.log.debug(`Activating app '${appPackage}' in order to restore it`);\n await this.activateApp(appPackage);\n return true;\n } catch (ign) {}\n args = ((appPackage === this.opts.appPackage && appActivity === this.opts.appActivity) ||\n (appPackage === this.opts.appWaitPackage && (this.opts.appWaitActivity || '').split(',').includes(appActivity)))\n ? {// the activity is the original session activity, so use the original args\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction,\n category: this.opts.intentCategory,\n flags: this.opts.intentFlags,\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: false,\n user: this.opts.userProfile}\n : {// the activity was started some other way, so use defaults\n pkg: appPackage,\n activity: appActivity,\n waitPkg: appPackage,\n waitActivity: appActivity,\n stopApp: false};\n }\n args = await util.filterObject(args);\n this.log.debug(`Bringing application back to foreground with arguments: ${JSON.stringify(args)}`);\n return await this.adb.startApp(args);\n};\n\ncommands.getStrings = async function getStrings (language) {\n if (!language) {\n language = await this.adb.getDeviceLanguage();\n this.log.info(`No language specified, returning strings for: ${language}`);\n }\n\n // Clients require the resulting mapping to have both keys\n // and values of type string\n const preprocessStringsMap = (mapping) => {\n const result = {};\n for (const [key, value] of _.toPairs(mapping)) {\n result[key] = _.isString(value) ? value : JSON.stringify(value);\n }\n return result;\n };\n\n if (this.apkStrings[language]) {\n // Return cached strings\n return preprocessStringsMap(this.apkStrings[language]);\n }\n\n this.apkStrings[language] = await androidHelpers.pushStrings(language, this.adb, this.opts);\n if (this.bootstrap) {\n // TODO: This is mutating the current language, but it's how appium currently works\n await this.bootstrap.sendAction('updateStrings');\n }\n\n return preprocessStringsMap(this.apkStrings[language]);\n};\n\ncommands.launchApp = async function launchApp () {\n await this.initAUT();\n await this.startAUT();\n};\n\ncommands.startActivity = async function startActivity (appPackage, appActivity,\n appWaitPackage, appWaitActivity, intentAction, intentCategory, intentFlags,\n optionalIntentArguments, dontStopAppOnReset) {\n this.log.debug(`Starting package '${appPackage}' and activity '${appActivity}'`);\n\n // dontStopAppOnReset is both an argument here, and a desired capability\n // if the argument is set, use it, otherwise use the cap\n if (!util.hasValue(dontStopAppOnReset)) {\n dontStopAppOnReset = !!this.opts.dontStopAppOnReset;\n }\n\n let args = {\n pkg: appPackage,\n activity: appActivity,\n waitPkg: appWaitPackage || appPackage,\n waitActivity: appWaitActivity || appActivity,\n action: intentAction,\n category: intentCategory,\n flags: intentFlags,\n optionalIntentArguments,\n stopApp: !dontStopAppOnReset\n };\n this._cachedActivityArgs = this._cachedActivityArgs || {};\n this._cachedActivityArgs[`${args.waitPkg}/${args.waitActivity}`] = args;\n await this.adb.startApp(args);\n};\n\ncommands.reset = async function reset () {\n await androidHelpers.resetApp(this.adb, Object.assign({}, this.opts, {fastReset: true}));\n // reset context since we don't know what kind on context we will end up after app launch.\n await this.setContext();\n return await this.isChromeSession ? this.startChromeSession() : this.startAUT();\n};\n\ncommands.startAUT = async function startAUT () {\n await this.adb.startApp({\n pkg: this.opts.appPackage,\n activity: this.opts.appActivity,\n action: this.opts.intentAction,\n category: this.opts.intentCategory,\n flags: this.opts.intentFlags,\n waitPkg: this.opts.appWaitPackage,\n waitActivity: this.opts.appWaitActivity,\n waitForLaunch: this.opts.appWaitForLaunch,\n waitDuration: this.opts.appWaitDuration,\n optionalIntentArguments: this.opts.optionalIntentArguments,\n stopApp: !this.opts.dontStopAppOnReset,\n user: this.opts.userProfile,\n });\n};\n\n// we override setUrl to take an android URI which can be used for deep-linking\n// inside an app, similar to starting an intent\ncommands.setUrl = async function setUrl (uri) {\n await this.adb.startUri(uri, this.opts.appPackage);\n};\n\n// closing app using force stop\ncommands.closeApp = async function closeApp () {\n await this.adb.forceStop(this.opts.appPackage);\n // reset context since we don't know what kind on context we will end up after app launch.\n await this.setContext();\n};\n\ncommands.getDisplayDensity = async function getDisplayDensity () {\n // first try the property for devices\n let out = await this.adb.shell(['getprop', 'ro.sf.lcd_density']);\n if (out) {\n let val = parseInt(out, 10);\n // if the value is NaN, try getting the emulator property\n if (!isNaN(val)) {\n return val;\n }\n this.log.debug(`Parsed density value was NaN: \"${out}\"`);\n }\n // fallback to trying property for emulators\n out = await this.adb.shell(['getprop', 'qemu.sf.lcd_density']);\n if (out) {\n let val = parseInt(out, 10);\n if (!isNaN(val)) {\n return val;\n }\n this.log.debug(`Parsed density value was NaN: \"${out}\"`);\n }\n // couldn't get anything, so error out\n this.log.errorAndThrow('Failed to get display density property.');\n};\n\ncommands.mobilePerformEditorAction = async function mobilePerformEditorAction (opts = {}) {\n const {action} = opts;\n if (!util.hasValue(action)) {\n throw new errors.InvalidArgumentError(`'action' argument is required`);\n }\n\n await this.adb.performEditorAction(action);\n};\n\n/**\n * Retrieves the list of recent system notifications.\n *\n * @returns {Object} See the documentation on `adb.getNotifications` for\n * more details\n */\ncommands.mobileGetNotifications = async function mobileGetNotifications () {\n return await this.adb.getNotifications();\n};\n\n/**\n * @typedef {Object} SmsListOptions\n * @property {number} max [100] - The maximum count of recent SMS messages\n * to retrieve\n */\n\n/**\n * Retrieves the list of recent SMS messages with their properties.\n *\n * @param {SmsListOptions} opts\n * @returns {Object} See the documentation on `adb.getSmsList` for\n * more details\n */\ncommands.mobileListSms = async function mobileListSms (opts = {}) {\n return await this.adb.getSmsList(opts);\n};\n\n/**\n * @typedef {Object} UnlockOptions\n * @property {string} key The unlock key. The value of this key depends\n * on the actual unlock type and could be a pin/password/pattern value or\n * a biometric finger id.\n * @property {string} type The unlock type. The following unlock types\n * are supported: `pin`, `pinWithKeyEvent`, `password`, `pattern` and `fingerprint`.\n * @property {?string} strategy Either 'locksettings' (default) or 'uiautomator'.\n * Setting it to 'uiautomator' will enforce the driver to avoid using special\n * ADB shortcuts in order to speed up the unlock procedure.\n * @property {?number} timeoutMs [2000] The maximum time in milliseconds\n * to wait until the screen gets unlocked\n */\n\n/**\n * Unlocks the device if it is locked. Noop if the device's screen is not locked.\n *\n * @param {?UnlockOptions} opts\n * @throws {Error} if unlock operation fails or the provided\n * arguments are not valid\n */\ncommands.mobileUnlock = async function mobileUnlock (opts = {}) {\n const { key, type, strategy, timeoutMs } = opts;\n await androidHelpers.unlock(this, this.adb, {\n unlockKey: key,\n unlockType: type,\n unlockStrategy: strategy,\n unlockSuccessTimeout: timeoutMs,\n });\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
@@ -28,9 +28,10 @@ var _intent = _interopRequireDefault(require("./intent"));
|
|
|
28
28
|
var _systemBars = _interopRequireDefault(require("./system-bars"));
|
|
29
29
|
var _log = _interopRequireDefault(require("./log"));
|
|
30
30
|
var _mediaProjection = _interopRequireDefault(require("./media-projection"));
|
|
31
|
+
var _permissions = _interopRequireDefault(require("./permissions"));
|
|
31
32
|
let commands = {};
|
|
32
33
|
exports.commands = commands;
|
|
33
|
-
Object.assign(commands, _find.default, _general.default, _alert.default, _element.default, _context.default, _actions.default, _touch.default, _ime.default, _network.default, _coverage.default, _recordscreen.default, _intent.default, _streamscreen.default, _performance.default, _execute.default, _shell.default, _emuConsole.default, _systemBars.default, _appManagement.default, _fileActions.default, _log.default, _mediaProjection.default);
|
|
34
|
+
Object.assign(commands, _find.default, _general.default, _alert.default, _element.default, _context.default, _actions.default, _touch.default, _ime.default, _network.default, _coverage.default, _recordscreen.default, _intent.default, _streamscreen.default, _performance.default, _execute.default, _shell.default, _emuConsole.default, _systemBars.default, _appManagement.default, _fileActions.default, _log.default, _mediaProjection.default, _permissions.default);
|
|
34
35
|
var _default = commands;
|
|
35
36
|
exports.default = _default;
|
|
36
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIk9iamVjdCIsImFzc2lnbiIsImZpbmRDbWRzIiwiZ2VuZXJhbENtZHMiLCJhbGVydENtZHMiLCJlbGVtZW50Q21kcyIsImNvbnRleHRDbWRzIiwiYWN0aW9uQ21kcyIsInRvdWNoQ21kcyIsImltZUNtZHMiLCJuZXR3b3JrQ21kcyIsImNvdmVyYWdlQ21kcyIsInJlY29yZHNjcmVlbkNtZHMiLCJpbnRlbnRDbWRzIiwic2NyZWVuU3RyZWFtQ21kcyIsInBlcmZvcm1hbmNlQ21kcyIsImV4ZWN1dGVDbWRzIiwic2hlbGxDbWRzIiwiZW11Q29uc29sZUNtZHMiLCJzeXN0ZW1CYXJzQ21kcyIsImFwcE1hbmFnZW1lbnRDbWRzIiwiZmlsZUFjdGlvbnNDbWRzIiwibG9nQ21kcyIsIm1lZGlhUHJvamVjdGlvbkNtZHMiLCJwZXJtaXNzaW9uc0NvbW1hbmRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmaW5kQ21kcyBmcm9tICcuL2ZpbmQnO1xuaW1wb3J0IGdlbmVyYWxDbWRzIGZyb20gJy4vZ2VuZXJhbCc7XG5pbXBvcnQgYWxlcnRDbWRzIGZyb20gJy4vYWxlcnQnO1xuaW1wb3J0IGVsZW1lbnRDbWRzIGZyb20gJy4vZWxlbWVudCc7XG5pbXBvcnQgY29udGV4dENtZHMgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBhY3Rpb25DbWRzIGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQgdG91Y2hDbWRzIGZyb20gJy4vdG91Y2gnO1xuaW1wb3J0IGltZUNtZHMgZnJvbSAnLi9pbWUnO1xuaW1wb3J0IG5ldHdvcmtDbWRzIGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgY292ZXJhZ2VDbWRzIGZyb20gJy4vY292ZXJhZ2UnO1xuaW1wb3J0IHJlY29yZHNjcmVlbkNtZHMgZnJvbSAnLi9yZWNvcmRzY3JlZW4nO1xuaW1wb3J0IHNjcmVlblN0cmVhbUNtZHMgZnJvbSAnLi9zdHJlYW1zY3JlZW4nO1xuaW1wb3J0IHBlcmZvcm1hbmNlQ21kcyBmcm9tICcuL3BlcmZvcm1hbmNlJztcbmltcG9ydCBleGVjdXRlQ21kcyBmcm9tICcuL2V4ZWN1dGUnO1xuaW1wb3J0IHNoZWxsQ21kcyBmcm9tICcuL3NoZWxsJztcbmltcG9ydCBlbXVDb25zb2xlQ21kcyBmcm9tICcuL2VtdS1jb25zb2xlJztcbmltcG9ydCBmaWxlQWN0aW9uc0NtZHMgZnJvbSAnLi9maWxlLWFjdGlvbnMnO1xuaW1wb3J0IGFwcE1hbmFnZW1lbnRDbWRzIGZyb20gJy4vYXBwLW1hbmFnZW1lbnQnO1xuaW1wb3J0IGludGVudENtZHMgZnJvbSAnLi9pbnRlbnQnO1xuaW1wb3J0IHN5c3RlbUJhcnNDbWRzIGZyb20gJy4vc3lzdGVtLWJhcnMnO1xuaW1wb3J0IGxvZ0NtZHMgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IG1lZGlhUHJvamVjdGlvbkNtZHMgZnJvbSAnLi9tZWRpYS1wcm9qZWN0aW9uJztcbmltcG9ydCBwZXJtaXNzaW9uc0NvbW1hbmRzIGZyb20gJy4vcGVybWlzc2lvbnMnO1xuXG5cbmxldCBjb21tYW5kcyA9IHt9O1xuT2JqZWN0LmFzc2lnbihcbiAgY29tbWFuZHMsXG4gIGZpbmRDbWRzLFxuICBnZW5lcmFsQ21kcyxcbiAgYWxlcnRDbWRzLFxuICBlbGVtZW50Q21kcyxcbiAgY29udGV4dENtZHMsXG4gIGFjdGlvbkNtZHMsXG4gIHRvdWNoQ21kcyxcbiAgaW1lQ21kcyxcbiAgbmV0d29ya0NtZHMsXG4gIGNvdmVyYWdlQ21kcyxcbiAgcmVjb3Jkc2NyZWVuQ21kcyxcbiAgaW50ZW50Q21kcyxcbiAgc2NyZWVuU3RyZWFtQ21kcyxcbiAgcGVyZm9ybWFuY2VDbWRzLFxuICBleGVjdXRlQ21kcyxcbiAgc2hlbGxDbWRzLFxuICBlbXVDb25zb2xlQ21kcyxcbiAgc3lzdGVtQmFyc0NtZHMsXG4gIGFwcE1hbmFnZW1lbnRDbWRzLFxuICBmaWxlQWN0aW9uc0NtZHMsXG4gIGxvZ0NtZHMsXG4gIG1lZGlhUHJvamVjdGlvbkNtZHMsXG4gIHBlcm1pc3Npb25zQ29tbWFuZHMsXG4gIC8vIGFkZCBvdGhlciBjb21tYW5kIHR5cGVzIGhlcmVcbik7XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsSUFBSUEsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUFDO0FBQ2xCQyxNQUFNLENBQUNDLE1BQU0sQ0FDWEYsUUFBUSxFQUNSRyxhQUFRLEVBQ1JDLGdCQUFXLEVBQ1hDLGNBQVMsRUFDVEMsZ0JBQVcsRUFDWEMsZ0JBQVcsRUFDWEMsZ0JBQVUsRUFDVkMsY0FBUyxFQUNUQyxZQUFPLEVBQ1BDLGdCQUFXLEVBQ1hDLGlCQUFZLEVBQ1pDLHFCQUFnQixFQUNoQkMsZUFBVSxFQUNWQyxxQkFBZ0IsRUFDaEJDLG9CQUFlLEVBQ2ZDLGdCQUFXLEVBQ1hDLGNBQVMsRUFDVEMsbUJBQWMsRUFDZEMsbUJBQWMsRUFDZEMsc0JBQWlCLEVBQ2pCQyxvQkFBZSxFQUNmQyxZQUFPLEVBQ1BDLHdCQUFtQixFQUNuQkMsb0JBQW1CLENBRXBCO0FBQUMsZUFHYXpCLFFBQVE7QUFBQSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["commands","Object","assign","findCmds","generalCmds","alertCmds","elementCmds","contextCmds","actionCmds","touchCmds","imeCmds","networkCmds","coverageCmds","recordscreenCmds","intentCmds","screenStreamCmds","performanceCmds","executeCmds","shellCmds","emuConsoleCmds","systemBarsCmds","appManagementCmds","fileActionsCmds","logCmds","mediaProjectionCmds"],"sources":["../../../lib/commands/index.js"],"sourcesContent":["import findCmds from './find';\nimport generalCmds from './general';\nimport alertCmds from './alert';\nimport elementCmds from './element';\nimport contextCmds from './context';\nimport actionCmds from './actions';\nimport touchCmds from './touch';\nimport imeCmds from './ime';\nimport networkCmds from './network';\nimport coverageCmds from './coverage';\nimport recordscreenCmds from './recordscreen';\nimport screenStreamCmds from './streamscreen';\nimport performanceCmds from './performance';\nimport executeCmds from './execute';\nimport shellCmds from './shell';\nimport emuConsoleCmds from './emu-console';\nimport fileActionsCmds from './file-actions';\nimport appManagementCmds from './app-management';\nimport intentCmds from './intent';\nimport systemBarsCmds from './system-bars';\nimport logCmds from './log';\nimport mediaProjectionCmds from './media-projection';\n\n\nlet commands = {};\nObject.assign(\n commands,\n findCmds,\n generalCmds,\n alertCmds,\n elementCmds,\n contextCmds,\n actionCmds,\n touchCmds,\n imeCmds,\n networkCmds,\n coverageCmds,\n recordscreenCmds,\n intentCmds,\n screenStreamCmds,\n performanceCmds,\n executeCmds,\n shellCmds,\n emuConsoleCmds,\n systemBarsCmds,\n appManagementCmds,\n fileActionsCmds,\n logCmds,\n mediaProjectionCmds,\n // add other command types here\n);\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA,IAAIA,QAAQ,GAAG,CAAC,CAAC;AAAC;AAClBC,MAAM,CAACC,MAAM,CACXF,QAAQ,EACRG,aAAQ,EACRC,gBAAW,EACXC,cAAS,EACTC,gBAAW,EACXC,gBAAW,EACXC,gBAAU,EACVC,cAAS,EACTC,YAAO,EACPC,gBAAW,EACXC,iBAAY,EACZC,qBAAgB,EAChBC,eAAU,EACVC,qBAAgB,EAChBC,oBAAe,EACfC,gBAAW,EACXC,cAAS,EACTC,mBAAc,EACdC,mBAAc,EACdC,sBAAiB,EACjBC,oBAAe,EACfC,YAAO,EACPC,wBAAmB,CAEpB;AAAC,
|
|
1
|
+
{"version":3,"file":"index.js","names":["commands","Object","assign","findCmds","generalCmds","alertCmds","elementCmds","contextCmds","actionCmds","touchCmds","imeCmds","networkCmds","coverageCmds","recordscreenCmds","intentCmds","screenStreamCmds","performanceCmds","executeCmds","shellCmds","emuConsoleCmds","systemBarsCmds","appManagementCmds","fileActionsCmds","logCmds","mediaProjectionCmds","permissionsCommands"],"sources":["../../../lib/commands/index.js"],"sourcesContent":["import findCmds from './find';\nimport generalCmds from './general';\nimport alertCmds from './alert';\nimport elementCmds from './element';\nimport contextCmds from './context';\nimport actionCmds from './actions';\nimport touchCmds from './touch';\nimport imeCmds from './ime';\nimport networkCmds from './network';\nimport coverageCmds from './coverage';\nimport recordscreenCmds from './recordscreen';\nimport screenStreamCmds from './streamscreen';\nimport performanceCmds from './performance';\nimport executeCmds from './execute';\nimport shellCmds from './shell';\nimport emuConsoleCmds from './emu-console';\nimport fileActionsCmds from './file-actions';\nimport appManagementCmds from './app-management';\nimport intentCmds from './intent';\nimport systemBarsCmds from './system-bars';\nimport logCmds from './log';\nimport mediaProjectionCmds from './media-projection';\nimport permissionsCommands from './permissions';\n\n\nlet commands = {};\nObject.assign(\n commands,\n findCmds,\n generalCmds,\n alertCmds,\n elementCmds,\n contextCmds,\n actionCmds,\n touchCmds,\n imeCmds,\n networkCmds,\n coverageCmds,\n recordscreenCmds,\n intentCmds,\n screenStreamCmds,\n performanceCmds,\n executeCmds,\n shellCmds,\n emuConsoleCmds,\n systemBarsCmds,\n appManagementCmds,\n fileActionsCmds,\n logCmds,\n mediaProjectionCmds,\n permissionsCommands,\n // add other command types here\n);\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA,IAAIA,QAAQ,GAAG,CAAC,CAAC;AAAC;AAClBC,MAAM,CAACC,MAAM,CACXF,QAAQ,EACRG,aAAQ,EACRC,gBAAW,EACXC,cAAS,EACTC,gBAAW,EACXC,gBAAW,EACXC,gBAAU,EACVC,cAAS,EACTC,YAAO,EACPC,gBAAW,EACXC,iBAAY,EACZC,qBAAgB,EAChBC,eAAU,EACVC,qBAAgB,EAChBC,oBAAe,EACfC,gBAAW,EACXC,cAAS,EACTC,mBAAc,EACdC,mBAAc,EACdC,sBAAiB,EACjBC,oBAAe,EACfC,YAAO,EACPC,wBAAmB,EACnBC,oBAAmB,CAEpB;AAAC,eAGazB,QAAQ;AAAA"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = exports.commands = void 0;
|
|
8
|
+
require("source-map-support/register");
|
|
9
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
10
|
+
var _driver = require("appium/driver");
|
|
11
|
+
var _bluebird = _interopRequireDefault(require("bluebird"));
|
|
12
|
+
var _utils = require("../utils");
|
|
13
|
+
const commands = {};
|
|
14
|
+
exports.commands = commands;
|
|
15
|
+
const ALL_PERMISSIONS_MAGIC = 'all';
|
|
16
|
+
const PM_ACTION = Object.freeze({
|
|
17
|
+
GRANT: 'grant',
|
|
18
|
+
REVOKE: 'revoke'
|
|
19
|
+
});
|
|
20
|
+
const APPOPS_ACTION = Object.freeze({
|
|
21
|
+
ALLOW: 'allow',
|
|
22
|
+
DENY: 'deny',
|
|
23
|
+
IGNORE: 'ignore',
|
|
24
|
+
DEFAULT: 'default'
|
|
25
|
+
});
|
|
26
|
+
const PERMISSION_TARGET = Object.freeze({
|
|
27
|
+
PM: 'pm',
|
|
28
|
+
APPOPS: 'appops'
|
|
29
|
+
});
|
|
30
|
+
const PERMISSIONS_TYPE = Object.freeze({
|
|
31
|
+
DENIED: 'denied',
|
|
32
|
+
GRANTED: 'granted',
|
|
33
|
+
REQUESTED: 'requested'
|
|
34
|
+
});
|
|
35
|
+
async function changePermissionsViaPm(permissions, appPackage, action) {
|
|
36
|
+
if (!_lodash.default.values(PM_ACTION).includes(action)) {
|
|
37
|
+
throw new _driver.errors.InvalidArgumentError(`Unknown action '${action}'. ` + `Only ${JSON.stringify(_lodash.default.values(PM_ACTION))} actions are supported`);
|
|
38
|
+
}
|
|
39
|
+
let affectedPermissions = _lodash.default.isArray(permissions) ? permissions : [permissions];
|
|
40
|
+
if (_lodash.default.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {
|
|
41
|
+
const dumpsys = await this.adb.shell(['dumpsys', 'package', appPackage]);
|
|
42
|
+
const grantedPermissions = await this.adb.getGrantedPermissions(appPackage, dumpsys);
|
|
43
|
+
if (action === PM_ACTION.GRANT) {
|
|
44
|
+
const reqPermissons = await this.adb.getReqPermissions(appPackage, dumpsys);
|
|
45
|
+
affectedPermissions = _lodash.default.difference(reqPermissons, grantedPermissions);
|
|
46
|
+
} else {
|
|
47
|
+
affectedPermissions = grantedPermissions;
|
|
48
|
+
}
|
|
49
|
+
if (_lodash.default.isEmpty(affectedPermissions)) {
|
|
50
|
+
this.log.info(`'${appPackage}' contains no permissions to ${action}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (action === PM_ACTION.GRANT) {
|
|
55
|
+
await this.adb.grantPermissions(appPackage, affectedPermissions);
|
|
56
|
+
} else {
|
|
57
|
+
await _bluebird.default.all(affectedPermissions.map(name => this.adb.revokePermission(appPackage, name)));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function changePermissionsViaAppops(permissions, appPackage, action) {
|
|
61
|
+
if (!_lodash.default.values(APPOPS_ACTION).includes(action)) {
|
|
62
|
+
throw new _driver.errors.InvalidArgumentError(`Unknown action '${action}'. ` + `Only ${JSON.stringify(_lodash.default.values(APPOPS_ACTION))} actions are supported`);
|
|
63
|
+
}
|
|
64
|
+
if (_lodash.default.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {
|
|
65
|
+
throw new _driver.errors.InvalidArgumentError(`'${ALL_PERMISSIONS_MAGIC}' permission is only supported for ` + `'${PERMISSION_TARGET.PM}' target. ` + `Check AppOpsManager.java from Android platform sources to get the full list of supported AppOps permissions`);
|
|
66
|
+
}
|
|
67
|
+
const promises = (_lodash.default.isArray(permissions) ? permissions : [permissions]).map(permission => this.adb.shell(['appops', 'set', appPackage, permission, action]));
|
|
68
|
+
await _bluebird.default.all(promises);
|
|
69
|
+
}
|
|
70
|
+
commands.mobileChangePermissions = async function mobileChangePermissions(opts = {}) {
|
|
71
|
+
const {
|
|
72
|
+
permissions,
|
|
73
|
+
appPackage = this.opts.appPackage,
|
|
74
|
+
action = _lodash.default.toLower(opts.target) === PERMISSION_TARGET.APPOPS ? APPOPS_ACTION.ALLOW : PM_ACTION.GRANT,
|
|
75
|
+
target = PERMISSION_TARGET.PM
|
|
76
|
+
} = opts;
|
|
77
|
+
if (_lodash.default.isNil(permissions)) {
|
|
78
|
+
throw new _driver.errors.InvalidArgumentError(`'permissions' argument is required`);
|
|
79
|
+
}
|
|
80
|
+
if (_lodash.default.isEmpty(permissions)) {
|
|
81
|
+
throw new _driver.errors.InvalidArgumentError(`'permissions' argument must not be empty`);
|
|
82
|
+
}
|
|
83
|
+
switch (_lodash.default.toLower(target)) {
|
|
84
|
+
case PERMISSION_TARGET.PM:
|
|
85
|
+
return await changePermissionsViaPm.bind(this)(permissions, appPackage, _lodash.default.toLower(action));
|
|
86
|
+
case PERMISSION_TARGET.APPOPS:
|
|
87
|
+
this.ensureFeatureEnabled(_utils.ADB_SHELL_FEATURE);
|
|
88
|
+
return await changePermissionsViaAppops.bind(this)(permissions, appPackage, _lodash.default.toLower(action));
|
|
89
|
+
default:
|
|
90
|
+
throw new _driver.errors.InvalidArgumentError(`'target' argument must be one of: ${_lodash.default.values(PERMISSION_TARGET)}`);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
commands.mobileGetPermissions = async function mobileGetPermissions(opts = {}) {
|
|
94
|
+
const {
|
|
95
|
+
type = PERMISSIONS_TYPE.REQUESTED,
|
|
96
|
+
appPackage = this.opts.appPackage
|
|
97
|
+
} = opts;
|
|
98
|
+
let actionFunc;
|
|
99
|
+
switch (_lodash.default.toLower(type)) {
|
|
100
|
+
case PERMISSIONS_TYPE.REQUESTED:
|
|
101
|
+
actionFunc = pkg => this.adb.getReqPermissions(pkg);
|
|
102
|
+
break;
|
|
103
|
+
case PERMISSIONS_TYPE.GRANTED:
|
|
104
|
+
actionFunc = pkg => this.adb.getGrantedPermissions(pkg);
|
|
105
|
+
break;
|
|
106
|
+
case PERMISSIONS_TYPE.DENIED:
|
|
107
|
+
actionFunc = pkg => this.adb.getDeniedPermissions(pkg);
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
throw new _driver.errors.InvalidArgumentError(`Unknown permissions type '${type}'. ` + `Only ${JSON.stringify(_lodash.default.values(PERMISSIONS_TYPE))} types are supported`);
|
|
111
|
+
}
|
|
112
|
+
return await actionFunc(appPackage);
|
|
113
|
+
};
|
|
114
|
+
var _default = commands;
|
|
115
|
+
exports.default = _default;
|
|
116
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIkFMTF9QRVJNSVNTSU9OU19NQUdJQyIsIlBNX0FDVElPTiIsIk9iamVjdCIsImZyZWV6ZSIsIkdSQU5UIiwiUkVWT0tFIiwiQVBQT1BTX0FDVElPTiIsIkFMTE9XIiwiREVOWSIsIklHTk9SRSIsIkRFRkFVTFQiLCJQRVJNSVNTSU9OX1RBUkdFVCIsIlBNIiwiQVBQT1BTIiwiUEVSTUlTU0lPTlNfVFlQRSIsIkRFTklFRCIsIkdSQU5URUQiLCJSRVFVRVNURUQiLCJjaGFuZ2VQZXJtaXNzaW9uc1ZpYVBtIiwicGVybWlzc2lvbnMiLCJhcHBQYWNrYWdlIiwiYWN0aW9uIiwiXyIsInZhbHVlcyIsImluY2x1ZGVzIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiYWZmZWN0ZWRQZXJtaXNzaW9ucyIsImlzQXJyYXkiLCJ0b0xvd2VyIiwiZHVtcHN5cyIsImFkYiIsInNoZWxsIiwiZ3JhbnRlZFBlcm1pc3Npb25zIiwiZ2V0R3JhbnRlZFBlcm1pc3Npb25zIiwicmVxUGVybWlzc29ucyIsImdldFJlcVBlcm1pc3Npb25zIiwiZGlmZmVyZW5jZSIsImlzRW1wdHkiLCJsb2ciLCJpbmZvIiwiZ3JhbnRQZXJtaXNzaW9ucyIsIkIiLCJhbGwiLCJtYXAiLCJuYW1lIiwicmV2b2tlUGVybWlzc2lvbiIsImNoYW5nZVBlcm1pc3Npb25zVmlhQXBwb3BzIiwicHJvbWlzZXMiLCJwZXJtaXNzaW9uIiwibW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMiLCJvcHRzIiwidGFyZ2V0IiwiaXNOaWwiLCJiaW5kIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJBREJfU0hFTExfRkVBVFVSRSIsIm1vYmlsZUdldFBlcm1pc3Npb25zIiwidHlwZSIsImFjdGlvbkZ1bmMiLCJwa2ciLCJnZXREZW5pZWRQZXJtaXNzaW9ucyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJtaXNzaW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBBREJfU0hFTExfRkVBVFVSRSB9IGZyb20gJy4uL3V0aWxzJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuY29uc3QgQUxMX1BFUk1JU1NJT05TX01BR0lDID0gJ2FsbCc7XG5jb25zdCBQTV9BQ1RJT04gPSBPYmplY3QuZnJlZXplKHtcbiAgR1JBTlQ6ICdncmFudCcsXG4gIFJFVk9LRTogJ3Jldm9rZScsXG59KTtcbmNvbnN0IEFQUE9QU19BQ1RJT04gPSBPYmplY3QuZnJlZXplKHtcbiAgQUxMT1c6ICdhbGxvdycsXG4gIERFTlk6ICdkZW55JyxcbiAgSUdOT1JFOiAnaWdub3JlJyxcbiAgREVGQVVMVDogJ2RlZmF1bHQnLFxufSk7XG5jb25zdCBQRVJNSVNTSU9OX1RBUkdFVCA9IE9iamVjdC5mcmVlemUoe1xuICBQTTogJ3BtJyxcbiAgQVBQT1BTOiAnYXBwb3BzJyxcbn0pO1xuY29uc3QgUEVSTUlTU0lPTlNfVFlQRSA9IE9iamVjdC5mcmVlemUoe1xuICBERU5JRUQ6ICdkZW5pZWQnLFxuICBHUkFOVEVEOiAnZ3JhbnRlZCcsXG4gIFJFUVVFU1RFRDogJ3JlcXVlc3RlZCcsXG59KTtcblxuYXN5bmMgZnVuY3Rpb24gY2hhbmdlUGVybWlzc2lvbnNWaWFQbSAocGVybWlzc2lvbnMsIGFwcFBhY2thZ2UsIGFjdGlvbikge1xuICBpZiAoIV8udmFsdWVzKFBNX0FDVElPTikuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFVua25vd24gYWN0aW9uICcke2FjdGlvbn0nLiBgICtcbiAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoXy52YWx1ZXMoUE1fQUNUSU9OKSl9IGFjdGlvbnMgYXJlIHN1cHBvcnRlZGApO1xuICB9XG5cbiAgbGV0IGFmZmVjdGVkUGVybWlzc2lvbnMgPSBfLmlzQXJyYXkocGVybWlzc2lvbnMpID8gcGVybWlzc2lvbnMgOiBbcGVybWlzc2lvbnNdO1xuICBpZiAoXy50b0xvd2VyKHBlcm1pc3Npb25zKSA9PT0gQUxMX1BFUk1JU1NJT05TX01BR0lDKSB7XG4gICAgY29uc3QgZHVtcHN5cyA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgYXBwUGFja2FnZV0pO1xuICAgIGNvbnN0IGdyYW50ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuYWRiLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBkdW1wc3lzKTtcbiAgICBpZiAoYWN0aW9uID09PSBQTV9BQ1RJT04uR1JBTlQpIHtcbiAgICAgIGNvbnN0IHJlcVBlcm1pc3NvbnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRSZXFQZXJtaXNzaW9ucyhhcHBQYWNrYWdlLCBkdW1wc3lzKTtcbiAgICAgIGFmZmVjdGVkUGVybWlzc2lvbnMgPSBfLmRpZmZlcmVuY2UocmVxUGVybWlzc29ucywgZ3JhbnRlZFBlcm1pc3Npb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZmZWN0ZWRQZXJtaXNzaW9ucyA9IGdyYW50ZWRQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShhZmZlY3RlZFBlcm1pc3Npb25zKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwUGFja2FnZX0nIGNvbnRhaW5zIG5vIHBlcm1pc3Npb25zIHRvICR7YWN0aW9ufWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhY3Rpb24gPT09IFBNX0FDVElPTi5HUkFOVCkge1xuICAgIGF3YWl0IHRoaXMuYWRiLmdyYW50UGVybWlzc2lvbnMoYXBwUGFja2FnZSwgYWZmZWN0ZWRQZXJtaXNzaW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgQi5hbGwoYWZmZWN0ZWRQZXJtaXNzaW9ucy5tYXAoKG5hbWUpID0+IHRoaXMuYWRiLnJldm9rZVBlcm1pc3Npb24oYXBwUGFja2FnZSwgbmFtZSkpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjaGFuZ2VQZXJtaXNzaW9uc1ZpYUFwcG9wcyAocGVybWlzc2lvbnMsIGFwcFBhY2thZ2UsIGFjdGlvbikge1xuICBpZiAoIV8udmFsdWVzKEFQUE9QU19BQ1RJT04pLmluY2x1ZGVzKGFjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBVbmtub3duIGFjdGlvbiAnJHthY3Rpb259Jy4gYCArXG4gICAgICBgT25seSAke0pTT04uc3RyaW5naWZ5KF8udmFsdWVzKEFQUE9QU19BQ1RJT04pKX0gYWN0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cbiAgaWYgKF8udG9Mb3dlcihwZXJtaXNzaW9ucykgPT09IEFMTF9QRVJNSVNTSU9OU19NQUdJQykge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke0FMTF9QRVJNSVNTSU9OU19NQUdJQ30nIHBlcm1pc3Npb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIGAgK1xuICAgICAgYCcke1BFUk1JU1NJT05fVEFSR0VULlBNfScgdGFyZ2V0LiBgICtcbiAgICAgIGBDaGVjayBBcHBPcHNNYW5hZ2VyLmphdmEgZnJvbSBBbmRyb2lkIHBsYXRmb3JtIHNvdXJjZXMgdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIEFwcE9wcyBwZXJtaXNzaW9uc2ApO1xuICB9XG5cbiAgY29uc3QgcHJvbWlzZXMgPSAoXy5pc0FycmF5KHBlcm1pc3Npb25zKSA/IHBlcm1pc3Npb25zIDogW3Blcm1pc3Npb25zXSlcbiAgICAubWFwKChwZXJtaXNzaW9uKSA9PiB0aGlzLmFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBhcHBQYWNrYWdlLCBwZXJtaXNzaW9uLCBhY3Rpb25dKSk7XG4gIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDaGFuZ2VQZXJtaXNzaW9uc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ3xBcnJheTxzdHJpbmc+fSBwZXJtaXNzaW9uc1xuICogSWYgYHRhcmdldGAgaXMgc2V0IHRvICdwbSc6XG4gKiAgIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgY2hhbmdlZFxuICogb3IgYSBsaXN0IG9mIHBlcm1pc3Npb25zLiBDaGVjayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9NYW5pZmVzdC5wZXJtaXNzaW9uXG4gKiB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdGFuZGFyZCBBbmRyb2lkIHBlcm1zc2lvbiBuYW1lcy4gTWFuZGF0b3J5IGFyZ3VtZW50LlxuICogSWYgJ2FsbCcgbWFnaWMgc3RyaW5nIGlzIHBhc3NlZCB0aGVuIHRoZSBjaG9zZW4gYWN0aW9uIGlzIGdvaW5nIHRvIGJlIGFwcGxpZWQgdG8gYWxsXG4gKiBwZXJtaXNpc29ucyByZXF1ZXN0ZWQvZ3JhbnRlZCBieSAnYXBwUGFja2FnZScuXG4gKiBJZiBgdGFyZ2V0YCBpcyBzZXQgdG8gJ2FwcG9wcyc6XG4gKiAgIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGFwcG9wcyBwZXJtaXNzaW9uIHRvIGJlIGNoYW5nZWRcbiAqIG9yIGEgbGlzdCBvZiBwZXJtaXNzaW9ucy4gQ2hlY2sgQXBwT3BzTWFuYWdlci5qYXZhIHNvdXJjZXMgdG8gZ2V0IHRoZSBmdWxsIGxpc3Qgb2ZcbiAqIHN1cHBvcnRlZCBhcHBvcHMgcGVybWlzc2lvbiBuYW1lcyBmb3IgdGhlIGdpdmVuIEFuZHJvaWQgcGtsYXRmb3JtLlxuICogRXhhbXBsZXM6ICdBQ1RJVklUWV9SRUNPR05JVElPTicsICdTTVNfRklOQU5DSUFMX1RSQU5TQUNUSU9OUycsICdSRUFEX1NNUycsICdBQ0NFU1NfTk9USUZJQ0FUSU9OUycuXG4gKiBUaGUgJ2FsbCcgbWFnaWMgc3RyaW5nIGlzIHVuc3VwcG9ydGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcFBhY2thZ2UgW3RoaXMub3B0cy5hcHBQYWNrYWdlXSBUaGUgYXBwbGljYXRpb24gcGFja2FnZSB0byBzZXQgY2hhbmdlXG4gKiBwZXJtaXNzaW9ucyBvbi4gRGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UgbmFtZSB1bmRlciB0ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiBbZ3JhbnR8YWxsb3ddIE9uZSBvZiBgUE1fQUNUSU9OYCB2YWx1ZXMgaWYgYHRhcmdldGAgaXMgc2V0IHRvICdwbScsXG4gKiBvdGhlcndpc2Ugb25lIG9mIGBBUFBPUFNfQUNUSU9OYCB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgW3BtXSBFaXRoZXIgJ3BtJyBvciAnYXBwb3BzJy4gVGhlICdhcHBvcHMnIG9uZSByZXF1aXJlc1xuICogJ2FkYl9zaGVsbCcgc2VydmVyIHNlY3VyaXR5IG9wdGlvbiB0byBiZSBlbmFibGVkLlxuICovXG5cbi8qKlxuICogQ2hhbmdlcyBwYWNrYWdlIHBlcm1pc3Npb25zIGluIHJ1bnRpbWUuXG4gKlxuICogQHBhcmFtIHs/Q2hhbmdlUGVybWlzc2lvbnNPcHRpb25zfSBvcHRzIC0gQXZhaWxhYmxlIG9wdGlvbnMgbWFwcGluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNoYW5nZVBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgcGVybWlzc2lvbnMsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGlvbiA9IF8udG9Mb3dlcihvcHRzLnRhcmdldCkgPT09IFBFUk1JU1NJT05fVEFSR0VULkFQUE9QUyA/IEFQUE9QU19BQ1RJT04uQUxMT1cgOiBQTV9BQ1RJT04uR1JBTlQsXG4gICAgdGFyZ2V0ID0gUEVSTUlTU0lPTl9UQVJHRVQuUE0sXG4gIH0gPSBvcHRzO1xuICBpZiAoXy5pc05pbChwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9ucykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAncGVybWlzc2lvbnMnIGFyZ3VtZW50IG11c3Qgbm90IGJlIGVtcHR5YCk7XG4gIH1cblxuICBzd2l0Y2ggKF8udG9Mb3dlcih0YXJnZXQpKSB7XG4gICAgY2FzZSBQRVJNSVNTSU9OX1RBUkdFVC5QTTpcbiAgICAgIHJldHVybiBhd2FpdCBjaGFuZ2VQZXJtaXNzaW9uc1ZpYVBtLmJpbmQodGhpcykocGVybWlzc2lvbnMsIGFwcFBhY2thZ2UsIF8udG9Mb3dlcihhY3Rpb24pKTtcbiAgICBjYXNlIFBFUk1JU1NJT05fVEFSR0VULkFQUE9QUzpcbiAgICAgIHRoaXMuZW5zdXJlRmVhdHVyZUVuYWJsZWQoQURCX1NIRUxMX0ZFQVRVUkUpO1xuICAgICAgcmV0dXJuIGF3YWl0IGNoYW5nZVBlcm1pc3Npb25zVmlhQXBwb3BzLmJpbmQodGhpcykocGVybWlzc2lvbnMsIGFwcFBhY2thZ2UsIF8udG9Mb3dlcihhY3Rpb24pKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ3RhcmdldCcgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2Y6ICR7Xy52YWx1ZXMoUEVSTUlTU0lPTl9UQVJHRVQpfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdldFBlcm1pc3Npb25zT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgW3JlcXVlc3RlZF0gLSBPbmUgb2YgcG9zc2libGUgcGVybWlzc2lvbiB0eXBlcyB0byBnZXQuXG4gKiBDYW4gYmUgYW55IG9mIGBQRVJNSVNTSU9OU19UWVBFYCB2YWx1ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGFja2FnZSBbdGhpcy5vcHRzLmFwcFBhY2thZ2VdIC0gVGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gc2V0IGNoYW5nZVxuICogcGVybWlzc2lvbnMgb24uIERlZmF1bHRzIHRvIHRoZSBwYWNrYWdlIG5hbWUgdW5kZXIgdGVzdC5cbiAqL1xuXG4vKipcbiAqIEdldHMgcnVudGltZSBwZXJtaXNzaW9ucyBsaXN0IGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0dldFBlcm1pc3Npb25zT3B0aW9uc30gb3B0cyAtIEF2YWlsYWJsZSBvcHRpb25zIG1hcHBpbmcuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmV0cmlldmVkIHBlcm1pc3Npb25zIGZvciB0aGUgZ2l2ZW4gdHlwZVxuICogKGNhbiBhbHNvIGJlIGVtcHR5KS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyBwZXJtaXNzaW9ucy5cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRQZXJtaXNzaW9ucyAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlID0gUEVSTUlTU0lPTlNfVFlQRS5SRVFVRVNURUQsXG4gICAgYXBwUGFja2FnZSA9IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICB9ID0gb3B0cztcblxuICBsZXQgYWN0aW9uRnVuYztcbiAgc3dpdGNoIChfLnRvTG93ZXIodHlwZSkpIHtcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuUkVRVUVTVEVEOlxuICAgICAgYWN0aW9uRnVuYyA9IChwa2cpID0+IHRoaXMuYWRiLmdldFJlcVBlcm1pc3Npb25zKHBrZyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFBFUk1JU1NJT05TX1RZUEUuR1JBTlRFRDpcbiAgICAgIGFjdGlvbkZ1bmMgPSAocGtnKSA9PiB0aGlzLmFkYi5nZXRHcmFudGVkUGVybWlzc2lvbnMocGtnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUEVSTUlTU0lPTlNfVFlQRS5ERU5JRUQ6XG4gICAgICBhY3Rpb25GdW5jID0gKHBrZykgPT4gdGhpcy5hZGIuZ2V0RGVuaWVkUGVybWlzc2lvbnMocGtnKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBVbmtub3duIHBlcm1pc3Npb25zIHR5cGUgJyR7dHlwZX0nLiBgICtcbiAgICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShfLnZhbHVlcyhQRVJNSVNTSU9OU19UWVBFKSl9IHR5cGVzIGFyZSBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgYWN0aW9uRnVuYyhhcHBQYWNrYWdlKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFBQztBQUVwQixNQUFNQyxxQkFBcUIsR0FBRyxLQUFLO0FBQ25DLE1BQU1DLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDOUJDLEtBQUssRUFBRSxPQUFPO0VBQ2RDLE1BQU0sRUFBRTtBQUNWLENBQUMsQ0FBQztBQUNGLE1BQU1DLGFBQWEsR0FBR0osTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDbENJLEtBQUssRUFBRSxPQUFPO0VBQ2RDLElBQUksRUFBRSxNQUFNO0VBQ1pDLE1BQU0sRUFBRSxRQUFRO0VBQ2hCQyxPQUFPLEVBQUU7QUFDWCxDQUFDLENBQUM7QUFDRixNQUFN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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","names":["commands","ALL_PERMISSIONS_MAGIC","PM_ACTION","Object","freeze","GRANT","REVOKE","APPOPS_ACTION","ALLOW","DENY","IGNORE","DEFAULT","PERMISSION_TARGET","PM","APPOPS","PERMISSIONS_TYPE","DENIED","GRANTED","REQUESTED","changePermissionsViaPm","permissions","appPackage","action","_","values","includes","errors","InvalidArgumentError","JSON","stringify","affectedPermissions","isArray","toLower","dumpsys","adb","shell","grantedPermissions","getGrantedPermissions","reqPermissons","getReqPermissions","difference","isEmpty","log","info","grantPermissions","B","all","map","name","revokePermission","changePermissionsViaAppops","promises","permission","mobileChangePermissions","opts","target","isNil","bind","ensureFeatureEnabled","ADB_SHELL_FEATURE","mobileGetPermissions","type","actionFunc","pkg","getDeniedPermissions"],"sources":["../../../lib/commands/permissions.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\nimport { ADB_SHELL_FEATURE } from '../utils';\n\nconst commands = {};\n\nconst ALL_PERMISSIONS_MAGIC = 'all';\nconst PM_ACTION = Object.freeze({\n GRANT: 'grant',\n REVOKE: 'revoke',\n});\nconst APPOPS_ACTION = Object.freeze({\n ALLOW: 'allow',\n DENY: 'deny',\n IGNORE: 'ignore',\n DEFAULT: 'default',\n});\nconst PERMISSION_TARGET = Object.freeze({\n PM: 'pm',\n APPOPS: 'appops',\n});\nconst PERMISSIONS_TYPE = Object.freeze({\n DENIED: 'denied',\n GRANTED: 'granted',\n REQUESTED: 'requested',\n});\n\nasync function changePermissionsViaPm (permissions, appPackage, action) {\n if (!_.values(PM_ACTION).includes(action)) {\n throw new errors.InvalidArgumentError(`Unknown action '${action}'. ` +\n `Only ${JSON.stringify(_.values(PM_ACTION))} actions are supported`);\n }\n\n let affectedPermissions = _.isArray(permissions) ? permissions : [permissions];\n if (_.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {\n const dumpsys = await this.adb.shell(['dumpsys', 'package', appPackage]);\n const grantedPermissions = await this.adb.getGrantedPermissions(appPackage, dumpsys);\n if (action === PM_ACTION.GRANT) {\n const reqPermissons = await this.adb.getReqPermissions(appPackage, dumpsys);\n affectedPermissions = _.difference(reqPermissons, grantedPermissions);\n } else {\n affectedPermissions = grantedPermissions;\n }\n if (_.isEmpty(affectedPermissions)) {\n this.log.info(`'${appPackage}' contains no permissions to ${action}`);\n return;\n }\n }\n\n if (action === PM_ACTION.GRANT) {\n await this.adb.grantPermissions(appPackage, affectedPermissions);\n } else {\n await B.all(affectedPermissions.map((name) => this.adb.revokePermission(appPackage, name)));\n }\n}\n\nasync function changePermissionsViaAppops (permissions, appPackage, action) {\n if (!_.values(APPOPS_ACTION).includes(action)) {\n throw new errors.InvalidArgumentError(`Unknown action '${action}'. ` +\n `Only ${JSON.stringify(_.values(APPOPS_ACTION))} actions are supported`);\n }\n if (_.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {\n throw new errors.InvalidArgumentError(`'${ALL_PERMISSIONS_MAGIC}' permission is only supported for ` +\n `'${PERMISSION_TARGET.PM}' target. ` +\n `Check AppOpsManager.java from Android platform sources to get the full list of supported AppOps permissions`);\n }\n\n const promises = (_.isArray(permissions) ? permissions : [permissions])\n .map((permission) => this.adb.shell(['appops', 'set', appPackage, permission, action]));\n await B.all(promises);\n}\n\n/**\n * @typedef {Object} ChangePermissionsOptions\n * @property {!string|Array<string>} permissions\n * If `target` is set to 'pm':\n * The full name of the permission to be changed\n * or a list of permissions. Check https://developer.android.com/reference/android/Manifest.permission\n * to get the full list of standard Android permssion names. Mandatory argument.\n * If 'all' magic string is passed then the chosen action is going to be applied to all\n * permisisons requested/granted by 'appPackage'.\n * If `target` is set to 'appops':\n * The full name of the appops permission to be changed\n * or a list of permissions. Check AppOpsManager.java sources to get the full list of\n * supported appops permission names for the given Android pklatform.\n * Examples: 'ACTIVITY_RECOGNITION', 'SMS_FINANCIAL_TRANSACTIONS', 'READ_SMS', 'ACCESS_NOTIFICATIONS'.\n * The 'all' magic string is unsupported.\n * @property {string} appPackage [this.opts.appPackage] The application package to set change\n * permissions on. Defaults to the package name under test.\n * @property {string} action [grant|allow] One of `PM_ACTION` values if `target` is set to 'pm',\n * otherwise one of `APPOPS_ACTION` values\n * @property {string} target [pm] Either 'pm' or 'appops'. The 'appops' one requires\n * 'adb_shell' server security option to be enabled.\n */\n\n/**\n * Changes package permissions in runtime.\n *\n * @param {?ChangePermissionsOptions} opts - Available options mapping.\n * @throws {Error} if there was a failure while changing permissions\n */\ncommands.mobileChangePermissions = async function mobileChangePermissions (opts = {}) {\n const {\n permissions,\n appPackage = this.opts.appPackage,\n action = _.toLower(opts.target) === PERMISSION_TARGET.APPOPS ? APPOPS_ACTION.ALLOW : PM_ACTION.GRANT,\n target = PERMISSION_TARGET.PM,\n } = opts;\n if (_.isNil(permissions)) {\n throw new errors.InvalidArgumentError(`'permissions' argument is required`);\n }\n if (_.isEmpty(permissions)) {\n throw new errors.InvalidArgumentError(`'permissions' argument must not be empty`);\n }\n\n switch (_.toLower(target)) {\n case PERMISSION_TARGET.PM:\n return await changePermissionsViaPm.bind(this)(permissions, appPackage, _.toLower(action));\n case PERMISSION_TARGET.APPOPS:\n this.ensureFeatureEnabled(ADB_SHELL_FEATURE);\n return await changePermissionsViaAppops.bind(this)(permissions, appPackage, _.toLower(action));\n default:\n throw new errors.InvalidArgumentError(`'target' argument must be one of: ${_.values(PERMISSION_TARGET)}`);\n }\n};\n\n/**\n * @typedef {Object} GetPermissionsOptions\n * @property {string} type [requested] - One of possible permission types to get.\n * Can be any of `PERMISSIONS_TYPE` values.\n * @property {string} appPackage [this.opts.appPackage] - The application package to set change\n * permissions on. Defaults to the package name under test.\n */\n\n/**\n * Gets runtime permissions list for the given application package.\n *\n * @param {GetPermissionsOptions} opts - Available options mapping.\n * @returns {Array<string>} The list of retrieved permissions for the given type\n * (can also be empty).\n * @throws {Error} if there was an error while getting permissions.\n */\ncommands.mobileGetPermissions = async function mobileGetPermissions (opts = {}) {\n const {\n type = PERMISSIONS_TYPE.REQUESTED,\n appPackage = this.opts.appPackage,\n } = opts;\n\n let actionFunc;\n switch (_.toLower(type)) {\n case PERMISSIONS_TYPE.REQUESTED:\n actionFunc = (pkg) => this.adb.getReqPermissions(pkg);\n break;\n case PERMISSIONS_TYPE.GRANTED:\n actionFunc = (pkg) => this.adb.getGrantedPermissions(pkg);\n break;\n case PERMISSIONS_TYPE.DENIED:\n actionFunc = (pkg) => this.adb.getDeniedPermissions(pkg);\n break;\n default:\n throw new errors.InvalidArgumentError(`Unknown permissions type '${type}'. ` +\n `Only ${JSON.stringify(_.values(PERMISSIONS_TYPE))} types are supported`);\n }\n return await actionFunc(appPackage);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
@@ -10,11 +10,11 @@ var _lodash = _interopRequireDefault(require("lodash"));
|
|
|
10
10
|
var _teen_process = require("teen_process");
|
|
11
11
|
var _support = require("@appium/support");
|
|
12
12
|
var _driver = require("appium/driver");
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
var _utils = require("../utils");
|
|
14
|
+
const commands = {};
|
|
15
15
|
exports.commands = commands;
|
|
16
16
|
commands.mobileShell = async function mobileShell(opts = {}) {
|
|
17
|
-
this.ensureFeatureEnabled(ADB_SHELL_FEATURE);
|
|
17
|
+
this.ensureFeatureEnabled(_utils.ADB_SHELL_FEATURE);
|
|
18
18
|
const {
|
|
19
19
|
command,
|
|
20
20
|
args = [],
|
|
@@ -46,4 +46,4 @@ commands.mobileShell = async function mobileShell(opts = {}) {
|
|
|
46
46
|
};
|
|
47
47
|
var _default = commands;
|
|
48
48
|
exports.default = _default;
|
|
49
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIm1vYmlsZVNoZWxsIiwib3B0cyIsImVuc3VyZUZlYXR1cmVFbmFibGVkIiwiQURCX1NIRUxMX0ZFQVRVUkUiLCJjb21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJpbmNsdWRlU3RkZXJyIiwiXyIsImlzU3RyaW5nIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJhZGJBcmdzIiwiYWRiIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiaXNBcnJheSIsImxvZyIsImRlYnVnIiwicGF0aCIsInV0aWwiLCJxdW90ZSIsInN0ZG91dCIsInN0ZGVyciIsImV4ZWMiLCJlcnIiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zaGVsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgQURCX1NIRUxMX0ZFQVRVUkUgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbmNvbW1hbmRzLm1vYmlsZVNoZWxsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2hlbGwgKG9wdHMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TSEVMTF9GRUFUVVJFKTtcblxuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzID0gW10sXG4gICAgdGltZW91dCA9IDIwMDAwLFxuICAgIGluY2x1ZGVTdGRlcnIsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghXy5pc1N0cmluZyhjb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFRoZSAnY29tbWFuZCcgYXJndW1lbnQgaXMgbWFuZGF0b3J5YCk7XG4gIH1cblxuICBjb25zdCBhZGJBcmdzID0gW1xuICAgIC4uLnRoaXMuYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ3NoZWxsJyxcbiAgICBjb21tYW5kLFxuICAgIC4uLihfLmlzQXJyYXkoYXJncykgPyBhcmdzIDogW2FyZ3NdKVxuICBdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgUnVubmluZyAnJHt0aGlzLmFkYi5leGVjdXRhYmxlLnBhdGh9ICR7dXRpbC5xdW90ZShhZGJBcmdzKX0nYCk7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IGV4ZWModGhpcy5hZGIuZXhlY3V0YWJsZS5wYXRoLCBhZGJBcmdzLCB7dGltZW91dH0pO1xuICAgIGlmIChpbmNsdWRlU3RkZXJyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGRvdXQsXG4gICAgICAgIHN0ZGVyclxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZG91dDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGV4ZWN1dGUgdGhlICcke2NvbW1hbmR9JyBzaGVsbCBjb21tYW5kLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX0uIGAgK1xuICAgICAgYFN0ZE91dDogJHtlcnIuc3Rkb3V0fS4gU3RkRXJyOiAke2Vyci5zdGRlcnJ9YCk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUFDO0FBRXBCQSxRQUFRLENBQUNDLFdBQVcsR0FBRyxlQUFlQSxXQUFXLENBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUM1RCxJQUFJLENBQUNDLG9CQUFvQixDQUFDQyx3QkFBaUIsQ0FBQztFQUU1QyxNQUFNO0lBQ0pDLE9BQU87SUFDUEMsSUFBSSxHQUFHLEVBQUU7SUFDVEMsT0FBTyxHQUFHLEtBQUs7SUFDZkM7RUFDRixDQUFDLEdBQUdOLElBQUk7RUFFUixJQUFJLENBQUNPLGVBQUMsQ0FBQ0MsUUFBUSxDQUFDTCxPQUFPLENBQUMsRUFBRTtJQUN4QixNQUFNLElBQUlNLGNBQU0sQ0FBQ0Msb0JBQW9CLENBQUUscUNBQW9DLENBQUM7RUFDOUU7RUFFQSxNQUFNQyxPQUFPLEdBQUcsQ0FDZCxHQUFHLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxVQUFVLENBQUNDLFdBQVcsRUFDbEMsT0FBTyxFQUNQWCxPQUFPLEVBQ1AsSUFBSUksZUFBQyxDQUFDUSxPQUFPLENBQUNYLElBQUksQ0FBQyxHQUFHQSxJQUFJLEdBQUcsQ0FBQ0EsSUFBSSxDQUFDLENBQUMsQ0FDckM7RUFDRCxJQUFJLENBQUNZLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLFlBQVcsSUFBSSxDQUFDTCxHQUFHLENBQUNDLFVBQVUsQ0FBQ0ssSUFBSyxJQUFHQyxhQUFJLENBQUNDLEtBQUssQ0FBQ1QsT0FBTyxDQUFFLEdBQUUsQ0FBQztFQUM5RSxJQUFJO0lBQ0YsTUFBTTtNQUFDVSxNQUFNO01BQUVDO0lBQU0sQ0FBQyxHQUFHLE1BQU0sSUFBQUMsa0JBQUksRUFBQyxJQUFJLENBQUNYLEdBQUcsQ0FBQ0MsVUFBVSxDQUFDSyxJQUFJLEVBQUVQLE9BQU8sRUFBRTtNQUFDTjtJQUFPLENBQUMsQ0FBQztJQUNqRixJQUFJQyxhQUFhLEVBQUU7TUFDakIsT0FBTztRQUNMZSxNQUFNO1FBQ05DO01BQ0YsQ0FBQztJQUNIO0lBQ0EsT0FBT0QsTUFBTTtFQUNmLENBQUMsQ0FBQyxPQUFPRyxHQUFHLEVBQUU7SUFDWixJQUFJLENBQUNSLEdBQUcsQ0FBQ1MsYUFBYSxDQUFFLHVCQUFzQnRCLE9BQVEsbUJBQWtCLEdBQ3JFLG1CQUFrQnFCLEdBQUcsQ0FBQ0UsT0FBUSxJQUFHLEdBQ2pDLFdBQVVGLEdBQUcsQ0FBQ0gsTUFBTyxhQUFZRyxHQUFHLENBQUNGLE1BQU8sRUFBQyxDQUFDO0VBQ25EO0FBQ0YsQ0FBQztBQUFDLGVBR2F4QixRQUFRO0FBQUEifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","names":["
|
|
1
|
+
{"version":3,"file":"shell.js","names":["commands","mobileShell","opts","ensureFeatureEnabled","ADB_SHELL_FEATURE","command","args","timeout","includeStderr","_","isString","errors","InvalidArgumentError","adbArgs","adb","executable","defaultArgs","isArray","log","debug","path","util","quote","stdout","stderr","exec","err","errorAndThrow","message"],"sources":["../../../lib/commands/shell.js"],"sourcesContent":["import _ from 'lodash';\nimport { exec } from 'teen_process';\nimport { util } from '@appium/support';\nimport { errors } from 'appium/driver';\nimport { ADB_SHELL_FEATURE } from '../utils';\n\nconst commands = {};\n\ncommands.mobileShell = async function mobileShell (opts = {}) {\n this.ensureFeatureEnabled(ADB_SHELL_FEATURE);\n\n const {\n command,\n args = [],\n timeout = 20000,\n includeStderr,\n } = opts;\n\n if (!_.isString(command)) {\n throw new errors.InvalidArgumentError(`The 'command' argument is mandatory`);\n }\n\n const adbArgs = [\n ...this.adb.executable.defaultArgs,\n 'shell',\n command,\n ...(_.isArray(args) ? args : [args])\n ];\n this.log.debug(`Running '${this.adb.executable.path} ${util.quote(adbArgs)}'`);\n try {\n const {stdout, stderr} = await exec(this.adb.executable.path, adbArgs, {timeout});\n if (includeStderr) {\n return {\n stdout,\n stderr\n };\n }\n return stdout;\n } catch (err) {\n this.log.errorAndThrow(`Cannot execute the '${command}' shell command. ` +\n `Original error: ${err.message}. ` +\n `StdOut: ${err.stdout}. StdErr: ${err.stderr}`);\n }\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AAEA,MAAMA,QAAQ,GAAG,CAAC,CAAC;AAAC;AAEpBA,QAAQ,CAACC,WAAW,GAAG,eAAeA,WAAW,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAC5D,IAAI,CAACC,oBAAoB,CAACC,wBAAiB,CAAC;EAE5C,MAAM;IACJC,OAAO;IACPC,IAAI,GAAG,EAAE;IACTC,OAAO,GAAG,KAAK;IACfC;EACF,CAAC,GAAGN,IAAI;EAER,IAAI,CAACO,eAAC,CAACC,QAAQ,CAACL,OAAO,CAAC,EAAE;IACxB,MAAM,IAAIM,cAAM,CAACC,oBAAoB,CAAE,qCAAoC,CAAC;EAC9E;EAEA,MAAMC,OAAO,GAAG,CACd,GAAG,IAAI,CAACC,GAAG,CAACC,UAAU,CAACC,WAAW,EAClC,OAAO,EACPX,OAAO,EACP,IAAII,eAAC,CAACQ,OAAO,CAACX,IAAI,CAAC,GAAGA,IAAI,GAAG,CAACA,IAAI,CAAC,CAAC,CACrC;EACD,IAAI,CAACY,GAAG,CAACC,KAAK,CAAE,YAAW,IAAI,CAACL,GAAG,CAACC,UAAU,CAACK,IAAK,IAAGC,aAAI,CAACC,KAAK,CAACT,OAAO,CAAE,GAAE,CAAC;EAC9E,IAAI;IACF,MAAM;MAACU,MAAM;MAAEC;IAAM,CAAC,GAAG,MAAM,IAAAC,kBAAI,EAAC,IAAI,CAACX,GAAG,CAACC,UAAU,CAACK,IAAI,EAAEP,OAAO,EAAE;MAACN;IAAO,CAAC,CAAC;IACjF,IAAIC,aAAa,EAAE;MACjB,OAAO;QACLe,MAAM;QACNC;MACF,CAAC;IACH;IACA,OAAOD,MAAM;EACf,CAAC,CAAC,OAAOG,GAAG,EAAE;IACZ,IAAI,CAACR,GAAG,CAACS,aAAa,CAAE,uBAAsBtB,OAAQ,mBAAkB,GACrE,mBAAkBqB,GAAG,CAACE,OAAQ,IAAG,GACjC,WAAUF,GAAG,CAACH,MAAO,aAAYG,GAAG,CAACF,MAAO,EAAC,CAAC;EACnD;AACF,CAAC;AAAC,eAGaxB,QAAQ;AAAA"}
|
package/build/lib/utils.js
CHANGED
|
@@ -4,10 +4,13 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
+
exports.ADB_SHELL_FEATURE = void 0;
|
|
7
8
|
exports.requireArgs = requireArgs;
|
|
8
9
|
require("source-map-support/register");
|
|
9
10
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
10
11
|
var _driver = require("appium/driver");
|
|
12
|
+
const ADB_SHELL_FEATURE = 'adb_shell';
|
|
13
|
+
exports.ADB_SHELL_FEATURE = ADB_SHELL_FEATURE;
|
|
11
14
|
function requireArgs(argNames, opts = {}) {
|
|
12
15
|
for (const argName of _lodash.default.isArray(argNames) ? argNames : [argNames]) {
|
|
13
16
|
if (!_lodash.default.has(opts, argName)) {
|
|
@@ -16,4 +19,4 @@ function requireArgs(argNames, opts = {}) {
|
|
|
16
19
|
}
|
|
17
20
|
return opts;
|
|
18
21
|
}
|
|
19
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBREJfU0hFTExfRkVBVFVSRSIsInJlcXVpcmVBcmdzIiwiYXJnTmFtZXMiLCJvcHRzIiwiYXJnTmFtZSIsIl8iLCJpc0FycmF5IiwiaGFzIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5leHBvcnQgY29uc3QgQURCX1NIRUxMX0ZFQVRVUkUgPSAnYWRiX3NoZWxsJztcblxuLyoqXG4gKiBBc3NlcnQgdGhlIHByZXNlbmNlIG9mIHBhcnRpY3VsYXIga2V5cyBpbiB0aGUgZ2l2ZW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QXJyYXk8c3RyaW5nPn0gYXJnTmFtZXMgb25lIG9yIG1vcmUga2V5IG5hbWVzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyB0aGUgb2JqZWN0IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB0aGUgc2FtZSBnaXZlbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBcmdzIChhcmdOYW1lcywgb3B0cyA9IHt9KSB7XG4gIGZvciAoY29uc3QgYXJnTmFtZSBvZiAoXy5pc0FycmF5KGFyZ05hbWVzKSA/IGFyZ05hbWVzIDogW2FyZ05hbWVzXSkpIHtcbiAgICBpZiAoIV8uaGFzKG9wdHMsIGFyZ05hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGAnJHthcmdOYW1lfScgYXJndW1lbnQgbXVzdCBiZSBwcm92aWRlZGApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0cztcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFFTyxNQUFNQSxpQkFBaUIsR0FBRyxXQUFXO0FBQUM7QUFTdEMsU0FBU0MsV0FBVyxDQUFFQyxRQUFRLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNoRCxLQUFLLE1BQU1DLE9BQU8sSUFBS0MsZUFBQyxDQUFDQyxPQUFPLENBQUNKLFFBQVEsQ0FBQyxHQUFHQSxRQUFRLEdBQUcsQ0FBQ0EsUUFBUSxDQUFDLEVBQUc7SUFDbkUsSUFBSSxDQUFDRyxlQUFDLENBQUNFLEdBQUcsQ0FBQ0osSUFBSSxFQUFFQyxPQUFPLENBQUMsRUFBRTtNQUN6QixNQUFNLElBQUlJLGNBQU0sQ0FBQ0Msb0JBQW9CLENBQUUsSUFBR0wsT0FBUSw2QkFBNEIsQ0FBQztJQUNqRjtFQUNGO0VBQ0EsT0FBT0QsSUFBSTtBQUNiIn0=
|
package/build/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["ADB_SHELL_FEATURE","requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\nexport const ADB_SHELL_FEATURE = 'adb_shell';\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}"],"mappings":";;;;;;;;;AAAA;AACA;AAEO,MAAMA,iBAAiB,GAAG,WAAW;AAAC;AAStC,SAASC,WAAW,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
|
package/lib/commands/general.js
CHANGED
|
@@ -4,10 +4,8 @@ import { util } from '@appium/support';
|
|
|
4
4
|
import moment from 'moment';
|
|
5
5
|
import { longSleep } from 'asyncbox';
|
|
6
6
|
import { errors } from 'appium/driver';
|
|
7
|
-
import B from 'bluebird';
|
|
8
7
|
|
|
9
8
|
const MOMENT_FORMAT_ISO8601 = 'YYYY-MM-DDTHH:mm:ssZ';
|
|
10
|
-
const ALL_PERMISSIONS_MAGIC = 'all';
|
|
11
9
|
|
|
12
10
|
let commands = {}, helpers = {}, extensions = {};
|
|
13
11
|
|
|
@@ -303,116 +301,6 @@ commands.mobilePerformEditorAction = async function mobilePerformEditorAction (o
|
|
|
303
301
|
await this.adb.performEditorAction(action);
|
|
304
302
|
};
|
|
305
303
|
|
|
306
|
-
const PERMISSION_ACTION = {
|
|
307
|
-
GRANT: 'grant',
|
|
308
|
-
REVOKE: 'revoke',
|
|
309
|
-
};
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* @typedef {Object} ChangePermissionsOptions
|
|
313
|
-
* @property {!string|Array<string>} permissions - The full name of the permission to be changed
|
|
314
|
-
* or a list of permissions. Check https://developer.android.com/reference/android/Manifest.permission
|
|
315
|
-
* to get the full list of standard Android permssion names. Mandatory argument.
|
|
316
|
-
* If 'all' magic string is passed then the chosen action is going to be applied to all
|
|
317
|
-
* permisisons requested/granted by 'appPackage'.
|
|
318
|
-
* @property {string} appPackage [this.opts.appPackage] - The application package to set change
|
|
319
|
-
* permissions on. Defaults to the package name under test.
|
|
320
|
-
* @property {string} action [grant] - One of `PERMISSION_ACTION` values
|
|
321
|
-
*/
|
|
322
|
-
|
|
323
|
-
/**
|
|
324
|
-
* Changes package permissions in runtime.
|
|
325
|
-
*
|
|
326
|
-
* @param {?ChangePermissionsOptions} opts - Available options mapping.
|
|
327
|
-
* @throws {Error} if there was a failure while changing permissions
|
|
328
|
-
*/
|
|
329
|
-
commands.mobileChangePermissions = async function mobileChangePermissions (opts = {}) {
|
|
330
|
-
const {
|
|
331
|
-
permissions,
|
|
332
|
-
appPackage = this.opts.appPackage,
|
|
333
|
-
action = PERMISSION_ACTION.GRANT,
|
|
334
|
-
} = opts;
|
|
335
|
-
if (_.isNil(permissions)) {
|
|
336
|
-
throw new errors.InvalidArgumentError(`'permissions' argument is required`);
|
|
337
|
-
}
|
|
338
|
-
if (_.isEmpty(permissions)) {
|
|
339
|
-
throw new errors.InvalidArgumentError(`'permissions' argument must not be empty`);
|
|
340
|
-
}
|
|
341
|
-
const lowerAction = _.toLower(action);
|
|
342
|
-
if (![PERMISSION_ACTION.GRANT, PERMISSION_ACTION.REVOKE].includes(lowerAction)) {
|
|
343
|
-
throw new errors.InvalidArgumentError(`Unknown action '${action}'. ` +
|
|
344
|
-
`Only ${JSON.stringify(_.values(PERMISSION_ACTION))} actions are supported`);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
let affectedPermissions = _.isArray(permissions) ? permissions : [permissions];
|
|
348
|
-
if (_.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {
|
|
349
|
-
const dumpsys = await this.adb.shell(['dumpsys', 'package', appPackage]);
|
|
350
|
-
const grantedPermissions = await this.adb.getGrantedPermissions(appPackage, dumpsys);
|
|
351
|
-
if (lowerAction === PERMISSION_ACTION.GRANT) {
|
|
352
|
-
const reqPermissons = await this.adb.getReqPermissions(appPackage, dumpsys);
|
|
353
|
-
affectedPermissions = _.difference(reqPermissons, grantedPermissions);
|
|
354
|
-
} else {
|
|
355
|
-
affectedPermissions = grantedPermissions;
|
|
356
|
-
}
|
|
357
|
-
if (_.isEmpty(affectedPermissions)) {
|
|
358
|
-
this.log.info(`'${appPackage}' contains no permissions to ${lowerAction}`);
|
|
359
|
-
return;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
if (lowerAction === PERMISSION_ACTION.GRANT) {
|
|
364
|
-
await this.adb.grantPermissions(appPackage, affectedPermissions);
|
|
365
|
-
} else {
|
|
366
|
-
await B.all(affectedPermissions.map((name) => this.adb.revokePermission(appPackage, name)));
|
|
367
|
-
}
|
|
368
|
-
};
|
|
369
|
-
|
|
370
|
-
const PERMISSIONS_TYPE = {
|
|
371
|
-
DENIED: 'denied',
|
|
372
|
-
GRANTED: 'granted',
|
|
373
|
-
REQUESTED: 'requested',
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* @typedef {Object} GetPermissionsOptions
|
|
378
|
-
* @property {string} type [requested] - One of possible permission types to get.
|
|
379
|
-
* Can be any of `PERMISSIONS_TYPE` values.
|
|
380
|
-
* @property {string} appPackage [this.opts.appPackage] - The application package to set change
|
|
381
|
-
* permissions on. Defaults to the package name under test.
|
|
382
|
-
*/
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Gets runtime permissions list for the given application package.
|
|
386
|
-
*
|
|
387
|
-
* @param {GetPermissionsOptions} opts - Available options mapping.
|
|
388
|
-
* @returns {Array<string>} The list of retrieved permissions for the given type
|
|
389
|
-
* (can also be empty).
|
|
390
|
-
* @throws {Error} if there was an error while getting permissions.
|
|
391
|
-
*/
|
|
392
|
-
commands.mobileGetPermissions = async function mobileGetPermissions (opts = {}) {
|
|
393
|
-
const {
|
|
394
|
-
type = PERMISSIONS_TYPE.REQUESTED,
|
|
395
|
-
appPackage = this.opts.appPackage,
|
|
396
|
-
} = opts;
|
|
397
|
-
|
|
398
|
-
let actionFunc;
|
|
399
|
-
switch (_.toLower(type)) {
|
|
400
|
-
case PERMISSIONS_TYPE.REQUESTED:
|
|
401
|
-
actionFunc = (appPackage) => this.adb.getReqPermissions(appPackage);
|
|
402
|
-
break;
|
|
403
|
-
case PERMISSIONS_TYPE.GRANTED:
|
|
404
|
-
actionFunc = (appPackage) => this.adb.getGrantedPermissions(appPackage);
|
|
405
|
-
break;
|
|
406
|
-
case PERMISSIONS_TYPE.DENIED:
|
|
407
|
-
actionFunc = (appPackage) => this.adb.getDeniedPermissions(appPackage);
|
|
408
|
-
break;
|
|
409
|
-
default:
|
|
410
|
-
throw new errors.InvalidArgumentError(`Unknown permissions type '${type}'. ` +
|
|
411
|
-
`Only ${JSON.stringify(_.values(PERMISSIONS_TYPE))} types are supported`);
|
|
412
|
-
}
|
|
413
|
-
return await actionFunc(appPackage);
|
|
414
|
-
};
|
|
415
|
-
|
|
416
304
|
/**
|
|
417
305
|
* Retrieves the list of recent system notifications.
|
|
418
306
|
*
|
package/lib/commands/index.js
CHANGED
|
@@ -20,6 +20,7 @@ import intentCmds from './intent';
|
|
|
20
20
|
import systemBarsCmds from './system-bars';
|
|
21
21
|
import logCmds from './log';
|
|
22
22
|
import mediaProjectionCmds from './media-projection';
|
|
23
|
+
import permissionsCommands from './permissions';
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
let commands = {};
|
|
@@ -47,6 +48,7 @@ Object.assign(
|
|
|
47
48
|
fileActionsCmds,
|
|
48
49
|
logCmds,
|
|
49
50
|
mediaProjectionCmds,
|
|
51
|
+
permissionsCommands,
|
|
50
52
|
// add other command types here
|
|
51
53
|
);
|
|
52
54
|
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { errors } from 'appium/driver';
|
|
3
|
+
import B from 'bluebird';
|
|
4
|
+
import { ADB_SHELL_FEATURE } from '../utils';
|
|
5
|
+
|
|
6
|
+
const commands = {};
|
|
7
|
+
|
|
8
|
+
const ALL_PERMISSIONS_MAGIC = 'all';
|
|
9
|
+
const PM_ACTION = Object.freeze({
|
|
10
|
+
GRANT: 'grant',
|
|
11
|
+
REVOKE: 'revoke',
|
|
12
|
+
});
|
|
13
|
+
const APPOPS_ACTION = Object.freeze({
|
|
14
|
+
ALLOW: 'allow',
|
|
15
|
+
DENY: 'deny',
|
|
16
|
+
IGNORE: 'ignore',
|
|
17
|
+
DEFAULT: 'default',
|
|
18
|
+
});
|
|
19
|
+
const PERMISSION_TARGET = Object.freeze({
|
|
20
|
+
PM: 'pm',
|
|
21
|
+
APPOPS: 'appops',
|
|
22
|
+
});
|
|
23
|
+
const PERMISSIONS_TYPE = Object.freeze({
|
|
24
|
+
DENIED: 'denied',
|
|
25
|
+
GRANTED: 'granted',
|
|
26
|
+
REQUESTED: 'requested',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
async function changePermissionsViaPm (permissions, appPackage, action) {
|
|
30
|
+
if (!_.values(PM_ACTION).includes(action)) {
|
|
31
|
+
throw new errors.InvalidArgumentError(`Unknown action '${action}'. ` +
|
|
32
|
+
`Only ${JSON.stringify(_.values(PM_ACTION))} actions are supported`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let affectedPermissions = _.isArray(permissions) ? permissions : [permissions];
|
|
36
|
+
if (_.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {
|
|
37
|
+
const dumpsys = await this.adb.shell(['dumpsys', 'package', appPackage]);
|
|
38
|
+
const grantedPermissions = await this.adb.getGrantedPermissions(appPackage, dumpsys);
|
|
39
|
+
if (action === PM_ACTION.GRANT) {
|
|
40
|
+
const reqPermissons = await this.adb.getReqPermissions(appPackage, dumpsys);
|
|
41
|
+
affectedPermissions = _.difference(reqPermissons, grantedPermissions);
|
|
42
|
+
} else {
|
|
43
|
+
affectedPermissions = grantedPermissions;
|
|
44
|
+
}
|
|
45
|
+
if (_.isEmpty(affectedPermissions)) {
|
|
46
|
+
this.log.info(`'${appPackage}' contains no permissions to ${action}`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (action === PM_ACTION.GRANT) {
|
|
52
|
+
await this.adb.grantPermissions(appPackage, affectedPermissions);
|
|
53
|
+
} else {
|
|
54
|
+
await B.all(affectedPermissions.map((name) => this.adb.revokePermission(appPackage, name)));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function changePermissionsViaAppops (permissions, appPackage, action) {
|
|
59
|
+
if (!_.values(APPOPS_ACTION).includes(action)) {
|
|
60
|
+
throw new errors.InvalidArgumentError(`Unknown action '${action}'. ` +
|
|
61
|
+
`Only ${JSON.stringify(_.values(APPOPS_ACTION))} actions are supported`);
|
|
62
|
+
}
|
|
63
|
+
if (_.toLower(permissions) === ALL_PERMISSIONS_MAGIC) {
|
|
64
|
+
throw new errors.InvalidArgumentError(`'${ALL_PERMISSIONS_MAGIC}' permission is only supported for ` +
|
|
65
|
+
`'${PERMISSION_TARGET.PM}' target. ` +
|
|
66
|
+
`Check AppOpsManager.java from Android platform sources to get the full list of supported AppOps permissions`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const promises = (_.isArray(permissions) ? permissions : [permissions])
|
|
70
|
+
.map((permission) => this.adb.shell(['appops', 'set', appPackage, permission, action]));
|
|
71
|
+
await B.all(promises);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @typedef {Object} ChangePermissionsOptions
|
|
76
|
+
* @property {!string|Array<string>} permissions
|
|
77
|
+
* If `target` is set to 'pm':
|
|
78
|
+
* The full name of the permission to be changed
|
|
79
|
+
* or a list of permissions. Check https://developer.android.com/reference/android/Manifest.permission
|
|
80
|
+
* to get the full list of standard Android permssion names. Mandatory argument.
|
|
81
|
+
* If 'all' magic string is passed then the chosen action is going to be applied to all
|
|
82
|
+
* permisisons requested/granted by 'appPackage'.
|
|
83
|
+
* If `target` is set to 'appops':
|
|
84
|
+
* The full name of the appops permission to be changed
|
|
85
|
+
* or a list of permissions. Check AppOpsManager.java sources to get the full list of
|
|
86
|
+
* supported appops permission names for the given Android pklatform.
|
|
87
|
+
* Examples: 'ACTIVITY_RECOGNITION', 'SMS_FINANCIAL_TRANSACTIONS', 'READ_SMS', 'ACCESS_NOTIFICATIONS'.
|
|
88
|
+
* The 'all' magic string is unsupported.
|
|
89
|
+
* @property {string} appPackage [this.opts.appPackage] The application package to set change
|
|
90
|
+
* permissions on. Defaults to the package name under test.
|
|
91
|
+
* @property {string} action [grant|allow] One of `PM_ACTION` values if `target` is set to 'pm',
|
|
92
|
+
* otherwise one of `APPOPS_ACTION` values
|
|
93
|
+
* @property {string} target [pm] Either 'pm' or 'appops'. The 'appops' one requires
|
|
94
|
+
* 'adb_shell' server security option to be enabled.
|
|
95
|
+
*/
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Changes package permissions in runtime.
|
|
99
|
+
*
|
|
100
|
+
* @param {?ChangePermissionsOptions} opts - Available options mapping.
|
|
101
|
+
* @throws {Error} if there was a failure while changing permissions
|
|
102
|
+
*/
|
|
103
|
+
commands.mobileChangePermissions = async function mobileChangePermissions (opts = {}) {
|
|
104
|
+
const {
|
|
105
|
+
permissions,
|
|
106
|
+
appPackage = this.opts.appPackage,
|
|
107
|
+
action = _.toLower(opts.target) === PERMISSION_TARGET.APPOPS ? APPOPS_ACTION.ALLOW : PM_ACTION.GRANT,
|
|
108
|
+
target = PERMISSION_TARGET.PM,
|
|
109
|
+
} = opts;
|
|
110
|
+
if (_.isNil(permissions)) {
|
|
111
|
+
throw new errors.InvalidArgumentError(`'permissions' argument is required`);
|
|
112
|
+
}
|
|
113
|
+
if (_.isEmpty(permissions)) {
|
|
114
|
+
throw new errors.InvalidArgumentError(`'permissions' argument must not be empty`);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
switch (_.toLower(target)) {
|
|
118
|
+
case PERMISSION_TARGET.PM:
|
|
119
|
+
return await changePermissionsViaPm.bind(this)(permissions, appPackage, _.toLower(action));
|
|
120
|
+
case PERMISSION_TARGET.APPOPS:
|
|
121
|
+
this.ensureFeatureEnabled(ADB_SHELL_FEATURE);
|
|
122
|
+
return await changePermissionsViaAppops.bind(this)(permissions, appPackage, _.toLower(action));
|
|
123
|
+
default:
|
|
124
|
+
throw new errors.InvalidArgumentError(`'target' argument must be one of: ${_.values(PERMISSION_TARGET)}`);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @typedef {Object} GetPermissionsOptions
|
|
130
|
+
* @property {string} type [requested] - One of possible permission types to get.
|
|
131
|
+
* Can be any of `PERMISSIONS_TYPE` values.
|
|
132
|
+
* @property {string} appPackage [this.opts.appPackage] - The application package to set change
|
|
133
|
+
* permissions on. Defaults to the package name under test.
|
|
134
|
+
*/
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Gets runtime permissions list for the given application package.
|
|
138
|
+
*
|
|
139
|
+
* @param {GetPermissionsOptions} opts - Available options mapping.
|
|
140
|
+
* @returns {Array<string>} The list of retrieved permissions for the given type
|
|
141
|
+
* (can also be empty).
|
|
142
|
+
* @throws {Error} if there was an error while getting permissions.
|
|
143
|
+
*/
|
|
144
|
+
commands.mobileGetPermissions = async function mobileGetPermissions (opts = {}) {
|
|
145
|
+
const {
|
|
146
|
+
type = PERMISSIONS_TYPE.REQUESTED,
|
|
147
|
+
appPackage = this.opts.appPackage,
|
|
148
|
+
} = opts;
|
|
149
|
+
|
|
150
|
+
let actionFunc;
|
|
151
|
+
switch (_.toLower(type)) {
|
|
152
|
+
case PERMISSIONS_TYPE.REQUESTED:
|
|
153
|
+
actionFunc = (pkg) => this.adb.getReqPermissions(pkg);
|
|
154
|
+
break;
|
|
155
|
+
case PERMISSIONS_TYPE.GRANTED:
|
|
156
|
+
actionFunc = (pkg) => this.adb.getGrantedPermissions(pkg);
|
|
157
|
+
break;
|
|
158
|
+
case PERMISSIONS_TYPE.DENIED:
|
|
159
|
+
actionFunc = (pkg) => this.adb.getDeniedPermissions(pkg);
|
|
160
|
+
break;
|
|
161
|
+
default:
|
|
162
|
+
throw new errors.InvalidArgumentError(`Unknown permissions type '${type}'. ` +
|
|
163
|
+
`Only ${JSON.stringify(_.values(PERMISSIONS_TYPE))} types are supported`);
|
|
164
|
+
}
|
|
165
|
+
return await actionFunc(appPackage);
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export { commands };
|
|
169
|
+
export default commands;
|
package/lib/commands/shell.js
CHANGED
|
@@ -2,10 +2,9 @@ import _ from 'lodash';
|
|
|
2
2
|
import { exec } from 'teen_process';
|
|
3
3
|
import { util } from '@appium/support';
|
|
4
4
|
import { errors } from 'appium/driver';
|
|
5
|
+
import { ADB_SHELL_FEATURE } from '../utils';
|
|
5
6
|
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
let commands = {};
|
|
7
|
+
const commands = {};
|
|
9
8
|
|
|
10
9
|
commands.mobileShell = async function mobileShell (opts = {}) {
|
|
11
10
|
this.ensureFeatureEnabled(ADB_SHELL_FEATURE);
|
package/lib/utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
2
|
import { errors } from 'appium/driver';
|
|
3
3
|
|
|
4
|
+
export const ADB_SHELL_FEATURE = 'adb_shell';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Assert the presence of particular keys in the given object
|
|
@@ -16,4 +17,4 @@ export function requireArgs (argNames, opts = {}) {
|
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
19
|
return opts;
|
|
19
|
-
}
|
|
20
|
+
}
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"mobile",
|
|
10
10
|
"mobile testing"
|
|
11
11
|
],
|
|
12
|
-
"version": "5.
|
|
12
|
+
"version": "5.8.1",
|
|
13
13
|
"author": "Appium Contributors",
|
|
14
14
|
"license": "Apache-2.0",
|
|
15
15
|
"repository": {
|
|
@@ -105,6 +105,7 @@
|
|
|
105
105
|
"babel-plugin-source-map-support": "^2.2.0",
|
|
106
106
|
"chai": "^4.1.2",
|
|
107
107
|
"chai-as-promised": "^7.1.1",
|
|
108
|
+
"conventional-changelog-conventionalcommits": "^5.0.0",
|
|
108
109
|
"eslint": "^7.32.0",
|
|
109
110
|
"eslint-config-prettier": "^8.5.0",
|
|
110
111
|
"eslint-plugin-import": "^2.26.0",
|