appium-android-driver 5.5.0 → 5.6.0
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.
|
@@ -110,6 +110,10 @@ commands.terminateApp = async function terminateApp(appId, options = {}) {
|
|
|
110
110
|
}
|
|
111
111
|
await this.adb.forceStop(appId);
|
|
112
112
|
const timeout = _support.util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;
|
|
113
|
+
if (timeout <= 0) {
|
|
114
|
+
this.log.info(`'${appId}' has been terminated. Skip checking the application process state ` + `since the timeout was set as ${timeout}ms`);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
113
117
|
try {
|
|
114
118
|
await (0, _asyncbox.waitForCondition)(async () => (await this.queryAppState(appId)) <= _androidHelpers.APP_STATE.NOT_RUNNING, {
|
|
115
119
|
waitMs: timeout,
|
|
@@ -152,4 +156,4 @@ commands.mobileClearApp = async function mobileClearApp(opts = {}) {
|
|
|
152
156
|
};
|
|
153
157
|
var _default = commands;
|
|
154
158
|
exports.default = _default;
|
|
155
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OUyIsIlJFU09MVkVSX0FDVElWSVRZX05BTUUiLCJjb21tYW5kcyIsImlzQXBwSW5zdGFsbGVkIiwiYXBwSWQiLCJhZGIiLCJtb2JpbGVJc0FwcEluc3RhbGxlZCIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInF1ZXJ5QXBwU3RhdGUiLCJsb2ciLCJpbmZvIiwiQVBQX1NUQVRFIiwiTk9UX0lOU1RBTExFRCIsInByb2Nlc3NFeGlzdHMiLCJOT1RfUlVOTklORyIsImFwcElkUmUiLCJSZWdFeHAiLCJfIiwiZXNjYXBlUmVnRXhwIiwibGluZSIsImR1bXBXaW5kb3dzIiwic3BsaXQiLCJ0ZXN0Iiwic29tZSIsIngiLCJpbmNsdWRlcyIsIlJVTk5JTkdfSU5fRk9SRUdST1VORCIsIlJVTk5JTkdfSU5fQkFDS0dST1VORCIsIm1vYmlsZVF1ZXJ5QXBwU3RhdGUiLCJhY3RpdmF0ZUFwcCIsImRlYnVnIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImNtZCIsIm91dHB1dCIsInNoZWxsIiwiZSIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwiYWN0aXZpdHlOYW1lIiwicmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSIsInByZWZlckNtZCIsInN0ZG91dCIsIkVycm9yIiwibW9iaWxlQWN0aXZhdGVBcHAiLCJyZW1vdmVBcHAiLCJvcHRpb25zIiwidW5pbnN0YWxsQXBrIiwibW9iaWxlUmVtb3ZlQXBwIiwidGVybWluYXRlQXBwIiwiZm9yY2VTdG9wIiwidGltZW91dCIsInV0aWwiLCJoYXNWYWx1ZSIsImlzTmFOIiwicGFyc2VJbnQiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsIm1vYmlsZVRlcm1pbmF0ZUFwcCIsImluc3RhbGxBcHAiLCJhcHBQYXRoIiwibG9jYWxQYXRoIiwiaGVscGVycyIsImNvbmZpZ3VyZUFwcCIsImluc3RhbGwiLCJtb2JpbGVJbnN0YWxsQXBwIiwibW9iaWxlQ2xlYXJBcHAiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImNsZWFyIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2FwcC1tYW5hZ2VtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IHJlcXVpcmVBcmdzIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OUyA9IFsnLmFwaycsICcuYXBrcyddO1xuY29uc3QgUkVTT0xWRVJfQUNUSVZJVFlfTkFNRSA9ICdhbmRyb2lkL2NvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SZXNvbHZlckFjdGl2aXR5JztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhbiBhcHBsaWNhdGlvbiBpcyBpbnN0YWxsZWQgb3Igbm90XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXBwIGlzIGluc3RhbGxlZFxuICovXG5jb21tYW5kcy5pc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzQXBwSW5zdGFsbGVkIChhcHBJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNb2JpbGVBcHBJbnN0YWxsZWRPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXIuIE11c3QgYmUgYWx3YXlzIHByb3ZpZGVkLlxuICovXG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYW4gYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIG9yIG5vdFxuICpcbiAqIEBwYXJhbSB7TW9iaWxlQXBwSW5zdGFsbGVkT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IFNhbWUgYXMgaW4gYGlzQXBwSW5zdGFsbGVkYFxuICovXG5jb21tYW5kcy5tb2JpbGVJc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUlzQXBwSW5zdGFsbGVkIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBJZCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcElkJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcbn07XG5cbi8qKlxuICogUXVlcmllcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHJldHVybnMge251bWJlcn0gVGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQsIHdoaWNoIGRlc2NyaWJlc1xuICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gc3RhdGU6XG4gKiAwIC0gaXMgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkXG4gKiAxIC0gaWYgdGhlIGFwcCBpcyBpbnN0YWxsZWQsIGJ1dCBpcyBub3QgcnVubmluZ1xuICogMyAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZFxuICogNCAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZFxuICovXG5jb21tYW5kcy5xdWVyeUFwcFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gcXVlcnlBcHBTdGF0ZSAoYXBwSWQpIHtcbiAgdGhpcy5sb2cuaW5mbyhgUXVlcnlpbmcgdGhlIHN0YXRlIG9mICcke2FwcElkfSdgKTtcbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCkpIHtcbiAgICByZXR1cm4gQVBQX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIH1cbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKGFwcElkKSkge1xuICAgIHJldHVybiBBUFBfU1RBVEUuTk9UX1JVTk5JTkc7XG4gIH1cbiAgY29uc3QgYXBwSWRSZSA9IG5ldyBSZWdFeHAoYFxcXFxiJHtfLmVzY2FwZVJlZ0V4cChhcHBJZCl9L2ApO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgKGF3YWl0IHRoaXMuYWRiLmR1bXBXaW5kb3dzKCkpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChhcHBJZFJlLnRlc3QobGluZSkgJiYgWydtQ3VycmVudEZvY3VzJywgJ21Gb2N1c2VkQXBwJ10uc29tZSgoeCkgPT4gbGluZS5pbmNsdWRlcyh4KSkpIHtcbiAgICAgIHJldHVybiBBUFBfU1RBVEUuUlVOTklOR19JTl9GT1JFR1JPVU5EO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlUXVlcnlBcHBTdGF0ZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBRdWVyaWVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHAuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVRdWVyeUFwcFN0YXRlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge251bWJlcn0gU2FtZSBhcyBpbiBgcXVlcnlBcHBTdGF0ZWBcbiAqL1xuY29tbWFuZHMubW9iaWxlUXVlcnlBcHBTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVF1ZXJ5QXBwU3RhdGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnlBcHBTdGF0ZShhcHBJZCk7XG59O1xuXG4vKipcbiAqIEFjdGl2YXRlcyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gb3IgbGF1bmNoZXMgaXQgaWYgbmVjZXNzYXJ5LlxuICogVGhlIGFjdGlvbiBsaXRlcmFsbHkgc2ltdWxhdGVzXG4gKiBjbGlja2luZyB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpY29uIG9uIHRoZSBkYXNoYm9hcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGFwcCBjYW5ub3QgYmUgYWN0aXZhdGVkXG4gKi9cbmNvbW1hbmRzLmFjdGl2YXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVBcHAgKGFwcElkKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nICcke2FwcElkfSdgKTtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAvLyBGYWxsYmFjayB0byBNb25rZXkgaW4gb2xkZXIgQVBJc1xuICBpZiAoYXBpTGV2ZWwgPCAyNCkge1xuICAgIC8vIFRoZSBtb25rZXkgY29tbWFuZCBjb3VsZCByYWlzZSBhbiBpc3N1ZSBhcyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NDg2MDQ3NS9ob3ctdG8tdXNlLXRoZS1tb25rZXktY29tbWFuZC13aXRoLWFuLWFuZHJvaWQtc3lzdGVtLXRoYXQtZG9lc250LWhhdmUtcGh5c2ljYWxcbiAgICAvLyBidXQgJy0tcGN0LXN5c2tleXMgMCcgY291bGQgY2F1c2UgYW5vdGhlciBiYWNrZ3JvdW5kIHByb2Nlc3MgaXNzdWUuIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNjk0MSNpc3N1ZWNvbW1lbnQtMTEyOTgzNzI4NVxuICAgIGNvbnN0IGNtZCA9IFsnbW9ua2V5JyxcbiAgICAgICctcCcsIGFwcElkLFxuICAgICAgJy1jJywgJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICAgICcxJ107XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENvbW1hbmQgc3Rkb3V0OiAke291dHB1dH1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LmluY2x1ZGVzKCdtb25rZXkgYWJvcnRlZCcpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gQXJlIHlvdSBzdXJlIGl0IGlzIGluc3RhbGxlZD9gKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGFjdGl2aXR5TmFtZSA9IGF3YWl0IHRoaXMuYWRiLnJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkoYXBwSWQpO1xuICBpZiAoYWN0aXZpdHlOYW1lID09PSBSRVNPTFZFUl9BQ1RJVklUWV9OQU1FKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE3MTI4XG4gICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICBgVGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgbmFtZSBvZiAnJHthcHBJZH0nIHdhcyByZXNvbHZlZCB0byAnJHthY3Rpdml0eU5hbWV9Jy4gYCArXG4gICAgICBgU3dpdGNoaW5nIHRoZSByZXNvbHZlciB0byBub3QgdXNlIGNtZGBcbiAgICApO1xuICAgIGFjdGl2aXR5TmFtZSA9IGF3YWl0IHRoaXMuYWRiLnJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkoYXBwSWQsIHtwcmVmZXJDbWQ6IGZhbHNlfSk7XG4gIH1cblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgJ2FtJywgKGFwaUxldmVsIDwgMjYpID8gJ3N0YXJ0JyA6ICdzdGFydC1hY3Rpdml0eScsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAnLWMnLCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQjRkxBR19BQ1RJVklUWV9ORVdfVEFTS1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50I0ZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERURcbiAgICAnLWYnLCAnMHgxMDIwMDAwMCcsXG4gICAgJy1uJywgYWN0aXZpdHlOYW1lLFxuICBdKTtcbiAgdGhpcy5sb2cuZGVidWcoc3Rkb3V0KTtcbiAgaWYgKC9eZXJyb3I6L21pLnRlc3Qoc3Rkb3V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFjdGl2YXRlICcke2FwcElkfScuIE9yaWdpbmFsIGVycm9yOiAke3N0ZG91dH1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNb2JpbGVBY3RpdmF0ZUFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBBY3RpdmF0ZXMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIG9yIGxhdW5jaGVzIGl0IGlmIG5lY2Vzc2FyeS5cbiAqIFRoZSBhY3Rpb24gbGl0ZXJhbGx5IHNpbXVsYXRlc1xuICogY2xpY2tpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWNvbiBvbiB0aGUgZGFzaGJvYXJkLlxuICpcbiAqIEBwYXJhbSB7TW9iaWxlQWN0aXZhdGVBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGFwcCBjYW5ub3QgYmUgYWN0aXZhdGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUFjdGl2YXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQWN0aXZhdGVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWN0aXZhdGVBcHAoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB1bmluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ga2VlcERhdGEgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGtlZXAgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkYXRhIGFuZCBjYWNoZSBmb2xkZXJzIGFmdGVyIHVuaW5zdGFsbC5cbiAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpZiBpcyBpbnN0YWxsZWQuXG4gKiBUaGUgY2FsbCBpcyBpZ25vcmVkIGlmIHRoZSBhcHAgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7P1VuaW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIHJlbW92YWwgb3B0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhY2thZ2Ugd2FzIGZvdW5kIG9uIHRoZSBkZXZpY2UgYW5kXG4gKiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLlxuICovXG5jb21tYW5kcy5yZW1vdmVBcHAgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBcHAgKGFwcElkLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhhcHBJZCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZVJlbW92ZUFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWYgaXMgaW5zdGFsbGVkLlxuICogVGhlIGNhbGwgaXMgaWdub3JlZCBpZiB0aGUgYXBwIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVSZW1vdmVBcHBPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gU2FtZSBhcyBpbiBgcmVtb3ZlQXBwYFxuICovXG5jb21tYW5kcy5tb2JpbGVSZW1vdmVBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZW1vdmVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucmVtb3ZlQXBwKGFwcElkLCBvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGVybWluYXRlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ8c3RyaW5nfSB0aW1lb3V0IFs1MDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHRlcm1pbmF0ZWQuXG4gKi9cblxuLyoqXG4gKiBUZXJtaW5hdGVzIHRoZSBhcHAgaWYgaXQgaXMgcnVubmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7P1Rlcm1pbmF0ZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGFwcGxpY2F0aW9uIHRlcm1pbmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcHAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGFwcCBoYXMgbm90IGJlZW4gdGVybWluYXRlZCB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXQuXG4gKi9cbmNvbW1hbmRzLnRlcm1pbmF0ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUFwcCAoYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmxvZy5pbmZvKGBUZXJtaW5hdGluZyAnJHthcHBJZH0nYCk7XG4gIGlmICghKGF3YWl0IHRoaXMuYWRiLnByb2Nlc3NFeGlzdHMoYXBwSWQpKSkge1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSBhcHAgJyR7YXBwSWR9JyBpcyBub3QgcnVubmluZ2ApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoYXBwSWQpO1xuICBjb25zdCB0aW1lb3V0ID0gdXRpbC5oYXNWYWx1ZShvcHRpb25zLnRpbWVvdXQpICYmICFpc05hTihvcHRpb25zLnRpbWVvdXQpID8gcGFyc2VJbnQob3B0aW9ucy50aW1lb3V0LCAxMCkgOiA1MDA7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoYXBwSWQpIDw9IEFQUF9TVEFURS5OT1RfUlVOTklORyxcbiAgICAgIHt3YWl0TXM6IHRpbWVvdXQsIGludGVydmFsTXM6IDEwMH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJyR7YXBwSWR9JyBpcyBzdGlsbCBydW5uaW5nIGFmdGVyICR7dGltZW91dH1tcyB0aW1lb3V0YCk7XG4gIH1cbiAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwSWR9JyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVybWluYXRlZGApO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlVGVybWluYXRlQXBwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyLiBNdXN0IGJlIGFsd2F5cyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gdGltZW91dCBbNTAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB0ZXJtaW5hdGVkLlxuICovXG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgYXBwIGlmIGl0IGlzIHJ1bm5pbmcuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVUZXJtaW5hdGVBcHBPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gU2FtZSBhcyBpbiBgdGVybWluYXRlQXBwYFxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBhcHAgaGFzIG5vdCBiZWVuIHRlcm1pbmF0ZWQgd2l0aGluIHRoZSBnaXZlbiB0aW1lb3V0LlxuICovXG5jb21tYW5kcy5tb2JpbGVUZXJtaW5hdGVBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVUZXJtaW5hdGVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMudGVybWluYXRlQXBwKGFwcElkLCBvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICovXG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGxvY2FsIGFwayBwYXRoIG9yIGEgcmVtb3RlIHVybFxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGluc3RhbGxhdGlvbiBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGdpdmVuIGFwayBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhY2hhYmxlXG4gKi9cbmNvbW1hbmRzLmluc3RhbGxBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQXBwIChhcHBQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHBQYXRoLCBBUFBfRVhURU5TSU9OUyk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwobG9jYWxQYXRoLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlSW5zdGFsbEFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGxvY2FsIGFwayBwYXRoIG9yIGEgcmVtb3RlIHVybC4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbNjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge01vYmlsZUluc3RhbGxBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGdpdmVuIGFwayBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhY2hhYmxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUluc3RhbGxBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVJbnN0YWxsQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBQYXRoIH0gPSByZXF1aXJlQXJncygnYXBwUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pbnN0YWxsQXBwKGFwcFBhdGgsIG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGVhckFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gYXBwSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gYmUgY2xlYXJlZFxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7Q2xlYXJBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2xlYW5pbmcgb2YgdGhlIGFwcCBkYXRhIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNsZWFyQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2xlYXJBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YXBwSWR9ID0gb3B0cztcbiAgaWYgKCFhcHBJZCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFRoZSAnYXBwSWQnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuY2xlYXIoYXBwSWQpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7QUFDeEMsTUFBTUMsc0JBQXNCLEdBQUcsbURBQW1EO0FBRWxGLE1BQU1DLFFBQVEsR0FBRyxDQUFDLENBQUM7O0FBQUM7QUFRcEJBLFFBQVEsQ0FBQ0MsY0FBYyxHQUFHLGVBQWVBLGNBQWMsQ0FBRUMsS0FBSyxFQUFFO0VBQzlELE9BQU8sTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0YsY0FBYyxDQUFDQyxLQUFLLENBQUM7QUFDN0MsQ0FBQzs7QUFhREYsUUFBUSxDQUFDSSxvQkFBb0IsR0FBRyxlQUFlQSxvQkFBb0IsQ0FBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQzlFLE1BQU07SUFBRUg7RUFBTSxDQUFDLEdBQUcsSUFBQUksa0JBQVcsRUFBQyxPQUFPLEVBQUVELElBQUksQ0FBQztFQUM1QyxPQUFPLE1BQU0sSUFBSSxDQUFDSixjQUFjLENBQUNDLEtBQUssQ0FBQztBQUN6QyxDQUFDOztBQWFERixRQUFRLENBQUNPLGFBQWEsR0FBRyxlQUFlQSxhQUFhLENBQUVMLEtBQUssRUFBRTtFQUM1RCxJQUFJLENBQUNNLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLDBCQUF5QlAsS0FBTSxHQUFFLENBQUM7RUFDakQsSUFBSSxFQUFDLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNGLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDLEdBQUU7SUFDekMsT0FBT1EseUJBQVMsQ0FBQ0MsYUFBYTtFQUNoQztFQUNBLElBQUksRUFBQyxNQUFNLElBQUksQ0FBQ1IsR0FBRyxDQUFDUyxhQUFhLENBQUNWLEtBQUssQ0FBQyxHQUFFO0lBQ3hDLE9BQU9RLHlCQUFTLENBQUNHLFdBQVc7RUFDOUI7RUFDQSxNQUFNQyxPQUFPLEdBQUcsSUFBSUMsTUFBTSxDQUFFLE1BQUtDLGVBQUMsQ0FBQ0MsWUFBWSxDQUFDZixLQUFLLENBQUUsR0FBRSxDQUFDO0VBQzFELEtBQUssTUFBTWdCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDZixHQUFHLENBQUNnQixXQUFXLEVBQUUsRUFBRUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQzdELElBQUlOLE9BQU8sQ0FBQ08sSUFBSSxDQUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQ0ksSUFBSSxDQUFFQyxDQUFDLElBQUtMLElBQUksQ0FBQ00sUUFBUSxDQUFDRCxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQ3hGLE9BQU9iLHlCQUFTLENBQUNlLHFCQUFxQjtJQUN4QztFQUNGO0VBQ0EsT0FBT2YseUJBQVMsQ0FBQ2dCLHFCQUFxQjtBQUN4QyxDQUFDOztBQWFEMUIsUUFBUSxDQUFDMkIsbUJBQW1CLEdBQUcsZUFBZUEsbUJBQW1CLENBQUV0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDNUUsTUFBTTtJQUFFSDtFQUFNLENBQUMsR0FBRyxJQUFBSSxrQkFBVyxFQUFDLE9BQU8sRUFBRUQsSUFBSSxDQUFDO0VBQzVDLE9BQU8sTUFBTSxJQUFJLENBQUNFLGFBQWEsQ0FBQ0wsS0FBSyxDQUFDO0FBQ3hDLENBQUM7O0FBVURGLFFBQVEsQ0FBQzRCLFdBQVcsR0FBRyxlQUFlQSxXQUFXLENBQUUxQixLQUFLLEVBQUU7RUFDeEQsSUFBSSxDQUFDTSxHQUFHLENBQUNxQixLQUFLLENBQUUsZUFBYzNCLEtBQU0sR0FBRSxDQUFDO0VBQ3ZDLE1BQU00QixRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMzQixHQUFHLENBQUM0QixXQUFXLEVBQUU7RUFFN0MsSUFBSUQsUUFBUSxHQUFHLEVBQUUsRUFBRTtJQUdqQixNQUFNRSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQ25CLElBQUksRUFBRTlCLEtBQUssRUFDWCxJQUFJLEVBQUUsa0NBQWtDLEVBQ3hDLEdBQUcsQ0FBQztJQUNOLElBQUkrQixNQUFNLEdBQUcsRUFBRTtJQUNmLElBQUk7TUFDRkEsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDOUIsR0FBRyxDQUFDK0IsS0FBSyxDQUFDRixHQUFHLENBQUM7TUFDbEMsSUFBSSxDQUFDeEIsR0FBRyxDQUFDcUIsS0FBSyxDQUFFLG1CQUFrQkksTUFBTyxFQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLE9BQU9FLENBQUMsRUFBRTtNQUNWLElBQUksQ0FBQzNCLEdBQUcsQ0FBQzRCLGFBQWEsQ0FBRSxvQkFBbUJsQyxLQUFNLHNCQUFxQmlDLENBQUMsQ0FBQ0UsT0FBUSxFQUFDLENBQUM7SUFDcEY7SUFDQSxJQUFJSixNQUFNLENBQUNULFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO01BQ3JDLElBQUksQ0FBQ2hCLEdBQUcsQ0FBQzRCLGFBQWEsQ0FBRSxvQkFBbUJsQyxLQUFNLGtDQUFpQyxDQUFDO0lBQ3JGO0lBQ0E7RUFDRjtFQUVBLElBQUlvQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUNuQyxHQUFHLENBQUNvQyx5QkFBeUIsQ0FBQ3JDLEtBQUssQ0FBQztFQUNsRSxJQUFJb0MsWUFBWSxLQUFLdkMsc0JBQXNCLEVBQUU7SUFFM0MsSUFBSSxDQUFDUyxHQUFHLENBQUNxQixLQUFLLENBQ1gsb0NBQW1DM0IsS0FBTSxzQkFBcUJvQyxZQUFhLEtBQUksR0FDL0UsdUNBQXNDLENBQ3hDO0lBQ0RBLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQ25DLEdBQUcsQ0FBQ29DLHlCQUF5QixDQUFDckMsS0FBSyxFQUFFO01BQUNzQyxTQUFTLEVBQUU7SUFBSyxDQUFDLENBQUM7RUFDcEY7RUFFQSxNQUFNQyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUN0QyxHQUFHLENBQUMrQixLQUFLLENBQUMsQ0FDbEMsSUFBSSxFQUFHSixRQUFRLEdBQUcsRUFBRSxHQUFJLE9BQU8sR0FBRyxnQkFBZ0IsRUFDbEQsSUFBSSxFQUFFLDRCQUE0QixFQUNsQyxJQUFJLEVBQUUsa0NBQWtDO0VBSXhDLElBQUksRUFBRSxZQUFZLEVBQ2xCLElBQUksRUFBRVEsWUFBWSxDQUNuQixDQUFDO0VBQ0YsSUFBSSxDQUFDOUIsR0FBRyxDQUFDcUIsS0FBSyxDQUFDWSxNQUFNLENBQUM7RUFDdEIsSUFBSSxXQUFXLENBQUNwQixJQUFJLENBQUNvQixNQUFNLENBQUMsRUFBRTtJQUM1QixNQUFNLElBQUlDLEtBQUssQ0FBRSxvQkFBbUJ4QyxLQUFNLHNCQUFxQnVDLE1BQU8sRUFBQyxDQUFDO0VBQzFFO0FBQ0YsQ0FBQzs7QUFlRHpDLFFBQVEsQ0FBQzJDLGlCQUFpQixHQUFHLGVBQWVBLGlCQUFpQixDQUFFdEMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3hFLE1BQU07SUFBRUg7RUFBTSxDQUFDLEdBQUcsSUFBQUksa0JBQVcsRUFBQyxPQUFPLEVBQUVELElBQUksQ0FBQztFQUM1QyxPQUFPLE1BQU0sSUFBSSxDQUFDdUIsV0FBVyxDQUFDMUIsS0FBSyxDQUFDO0FBQ3RDLENBQUM7O0FBbUJERixRQUFRLENBQUM0QyxTQUFTLEdBQUcsZUFBZUEsU0FBUyxDQUFFMUMsS0FBSyxFQUFFMkMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2xFLE9BQU8sTUFBTSxJQUFJLENBQUMxQyxHQUFHLENBQUMyQyxZQUFZLENBQUM1QyxLQUFLLEVBQUUyQyxPQUFPLENBQUM7QUFDcEQsQ0FBQzs7QUFjRDdDLFFBQVEsQ0FBQytDLGVBQWUsR0FBRyxlQUFlQSxlQUFlLENBQUUxQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDcEUsTUFBTTtJQUFFSDtFQUFNLENBQUMsR0FBRyxJQUFBSSxrQkFBVyxFQUFDLE9BQU8sRUFBRUQsSUFBSSxDQUFDO0VBQzVDLE9BQU8sTUFBTSxJQUFJLENBQUN1QyxTQUFTLENBQUMxQyxLQUFLLEVBQUVHLElBQUksQ0FBQztBQUMxQyxDQUFDOztBQWdCREwsUUFBUSxDQUFDZ0QsWUFBWSxHQUFHLGVBQWVBLFlBQVksQ0FBRTlDLEtBQUssRUFBRTJDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRTtFQUN4RSxJQUFJLENBQUNyQyxHQUFHLENBQUNDLElBQUksQ0FBRSxnQkFBZVAsS0FBTSxHQUFFLENBQUM7RUFDdkMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNTLGFBQWEsQ0FBQ1YsS0FBSyxDQUFDLENBQUMsRUFBRTtJQUMxQyxJQUFJLENBQUNNLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLFlBQVdQLEtBQU0sa0JBQWlCLENBQUM7SUFDbEQsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxNQUFNLElBQUksQ0FBQ0MsR0FBRyxDQUFDOEMsU0FBUyxDQUFDL0MsS0FBSyxDQUFDO0VBQy9CLE1BQU1nRCxPQUFPLEdBQUdDLGFBQUksQ0FBQ0MsUUFBUSxDQUFDUCxPQUFPLENBQUNLLE9BQU8sQ0FBQyxJQUFJLENBQUNHLEtBQUssQ0FBQ1IsT0FBTyxDQUFDSyxPQUFPLENBQUMsR0FBR0ksUUFBUSxDQUFDVCxPQUFPLENBQUNLLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHO0VBQy9HLElBQUk7SUFDRixNQUFNLElBQUFLLDBCQUFnQixFQUFDLFlBQVksT0FBTSxJQUFJLENBQUNoRCxhQUFhLENBQUNMLEtBQUssQ0FBQyxLQUFJUSx5QkFBUyxDQUFDRyxXQUFXLEVBQ3pGO01BQUMyQyxNQUFNLEVBQUVOLE9BQU87TUFBRU8sVUFBVSxFQUFFO0lBQUcsQ0FBQyxDQUFDO0VBQ3ZDLENBQUMsQ0FBQyxPQUFPdEIsQ0FBQyxFQUFFO0lBQ1YsSUFBSSxDQUFDM0IsR0FBRyxDQUFDNEIsYUFBYSxDQUFFLElBQUdsQyxLQUFNLDRCQUEyQmdELE9BQVEsWUFBVyxDQUFDO0VBQ2xGO0VBQ0EsSUFBSSxDQUFDMUMsR0FBRyxDQUFDQyxJQUFJLENBQUUsSUFBR1AsS0FBTSxvQ0FBbUMsQ0FBQztFQUM1RCxPQUFPLElBQUk7QUFDYixDQUFDOztBQWdCREYsUUFBUSxDQUFDMEQsa0JBQWtCLEdBQUcsZUFBZUEsa0JBQWtCLENBQUVyRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDMUUsTUFBTTtJQUFFSDtFQUFNLENBQUMsR0FBRyxJQUFBSSxrQkFBVyxFQUFDLE9BQU8sRUFBRUQsSUFBSSxDQUFDO0VBQzVDLE9BQU8sTUFBTSxJQUFJLENBQUMyQyxZQUFZLENBQUM5QyxLQUFLLEVBQUVHLElBQUksQ0FBQztBQUM3QyxDQUFDOztBQTBCREwsUUFBUSxDQUFDMkQsVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRUMsT0FBTyxFQUFFZixPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDdEUsTUFBTWdCLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQ0MsT0FBTyxDQUFDQyxZQUFZLENBQUNILE9BQU8sRUFBRTlELGNBQWMsQ0FBQztFQUMxRSxNQUFNLElBQUksQ0FBQ0ssR0FBRyxDQUFDNkQsT0FBTyxDQUFDSCxTQUFTLEVBQUVoQixPQUFPLENBQUM7QUFDNUMsQ0FBQzs7QUEwQkQ3QyxRQUFRLENBQUNpRSxnQkFBZ0IsR0FBRyxlQUFlQSxnQkFBZ0IsQ0FBRTVELElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUN0RSxNQUFNO0lBQUV1RDtFQUFRLENBQUMsR0FBRyxJQUFBdEQsa0JBQVcsRUFBQyxTQUFTLEVBQUVELElBQUksQ0FBQztFQUNoRCxPQUFPLE1BQU0sSUFBSSxDQUFDc0QsVUFBVSxDQUFDQyxPQUFPLEVBQUV2RCxJQUFJLENBQUM7QUFDN0MsQ0FBQzs7QUFhREwsUUFBUSxDQUFDa0UsY0FBYyxHQUFHLGVBQWVBLGNBQWMsQ0FBRTdELElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNsRSxNQUFNO0lBQUNIO0VBQUssQ0FBQyxHQUFHRyxJQUFJO0VBQ3BCLElBQUksQ0FBQ0gsS0FBSyxFQUFFO0lBQ1YsTUFBTSxJQUFJaUUsY0FBTSxDQUFDQyxvQkFBb0IsQ0FBRSxrQ0FBaUMsQ0FBQztFQUMzRTtFQUNBLE1BQU0sSUFBSSxDQUFDakUsR0FBRyxDQUFDa0UsS0FBSyxDQUFDbkUsS0FBSyxDQUFDO0FBQzdCLENBQUM7QUFBQyxlQUdhRixRQUFRO0FBQUEifQ==
|
|
159
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUFBfRVhURU5TSU9OUyIsIlJFU09MVkVSX0FDVElWSVRZX05BTUUiLCJjb21tYW5kcyIsImlzQXBwSW5zdGFsbGVkIiwiYXBwSWQiLCJhZGIiLCJtb2JpbGVJc0FwcEluc3RhbGxlZCIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInF1ZXJ5QXBwU3RhdGUiLCJsb2ciLCJpbmZvIiwiQVBQX1NUQVRFIiwiTk9UX0lOU1RBTExFRCIsInByb2Nlc3NFeGlzdHMiLCJOT1RfUlVOTklORyIsImFwcElkUmUiLCJSZWdFeHAiLCJfIiwiZXNjYXBlUmVnRXhwIiwibGluZSIsImR1bXBXaW5kb3dzIiwic3BsaXQiLCJ0ZXN0Iiwic29tZSIsIngiLCJpbmNsdWRlcyIsIlJVTk5JTkdfSU5fRk9SRUdST1VORCIsIlJVTk5JTkdfSU5fQkFDS0dST1VORCIsIm1vYmlsZVF1ZXJ5QXBwU3RhdGUiLCJhY3RpdmF0ZUFwcCIsImRlYnVnIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImNtZCIsIm91dHB1dCIsInNoZWxsIiwiZSIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwiYWN0aXZpdHlOYW1lIiwicmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSIsInByZWZlckNtZCIsInN0ZG91dCIsIkVycm9yIiwibW9iaWxlQWN0aXZhdGVBcHAiLCJyZW1vdmVBcHAiLCJvcHRpb25zIiwidW5pbnN0YWxsQXBrIiwibW9iaWxlUmVtb3ZlQXBwIiwidGVybWluYXRlQXBwIiwiZm9yY2VTdG9wIiwidGltZW91dCIsInV0aWwiLCJoYXNWYWx1ZSIsImlzTmFOIiwicGFyc2VJbnQiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsIm1vYmlsZVRlcm1pbmF0ZUFwcCIsImluc3RhbGxBcHAiLCJhcHBQYXRoIiwibG9jYWxQYXRoIiwiaGVscGVycyIsImNvbmZpZ3VyZUFwcCIsImluc3RhbGwiLCJtb2JpbGVJbnN0YWxsQXBwIiwibW9iaWxlQ2xlYXJBcHAiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImNsZWFyIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2FwcC1tYW5hZ2VtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7IHJlcXVpcmVBcmdzIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OUyA9IFsnLmFwaycsICcuYXBrcyddO1xuY29uc3QgUkVTT0xWRVJfQUNUSVZJVFlfTkFNRSA9ICdhbmRyb2lkL2NvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SZXNvbHZlckFjdGl2aXR5JztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhbiBhcHBsaWNhdGlvbiBpcyBpbnN0YWxsZWQgb3Igbm90XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXBwIGlzIGluc3RhbGxlZFxuICovXG5jb21tYW5kcy5pc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzQXBwSW5zdGFsbGVkIChhcHBJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNb2JpbGVBcHBJbnN0YWxsZWRPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXIuIE11c3QgYmUgYWx3YXlzIHByb3ZpZGVkLlxuICovXG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYW4gYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIG9yIG5vdFxuICpcbiAqIEBwYXJhbSB7TW9iaWxlQXBwSW5zdGFsbGVkT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IFNhbWUgYXMgaW4gYGlzQXBwSW5zdGFsbGVkYFxuICovXG5jb21tYW5kcy5tb2JpbGVJc0FwcEluc3RhbGxlZCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUlzQXBwSW5zdGFsbGVkIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBJZCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcElkJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcbn07XG5cbi8qKlxuICogUXVlcmllcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHJldHVybnMge251bWJlcn0gVGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQsIHdoaWNoIGRlc2NyaWJlc1xuICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gc3RhdGU6XG4gKiAwIC0gaXMgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkXG4gKiAxIC0gaWYgdGhlIGFwcCBpcyBpbnN0YWxsZWQsIGJ1dCBpcyBub3QgcnVubmluZ1xuICogMyAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZFxuICogNCAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZFxuICovXG5jb21tYW5kcy5xdWVyeUFwcFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gcXVlcnlBcHBTdGF0ZSAoYXBwSWQpIHtcbiAgdGhpcy5sb2cuaW5mbyhgUXVlcnlpbmcgdGhlIHN0YXRlIG9mICcke2FwcElkfSdgKTtcbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCkpIHtcbiAgICByZXR1cm4gQVBQX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIH1cbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKGFwcElkKSkge1xuICAgIHJldHVybiBBUFBfU1RBVEUuTk9UX1JVTk5JTkc7XG4gIH1cbiAgY29uc3QgYXBwSWRSZSA9IG5ldyBSZWdFeHAoYFxcXFxiJHtfLmVzY2FwZVJlZ0V4cChhcHBJZCl9L2ApO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgKGF3YWl0IHRoaXMuYWRiLmR1bXBXaW5kb3dzKCkpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChhcHBJZFJlLnRlc3QobGluZSkgJiYgWydtQ3VycmVudEZvY3VzJywgJ21Gb2N1c2VkQXBwJ10uc29tZSgoeCkgPT4gbGluZS5pbmNsdWRlcyh4KSkpIHtcbiAgICAgIHJldHVybiBBUFBfU1RBVEUuUlVOTklOR19JTl9GT1JFR1JPVU5EO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTW9iaWxlUXVlcnlBcHBTdGF0ZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBRdWVyaWVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHAuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVRdWVyeUFwcFN0YXRlT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge251bWJlcn0gU2FtZSBhcyBpbiBgcXVlcnlBcHBTdGF0ZWBcbiAqL1xuY29tbWFuZHMubW9iaWxlUXVlcnlBcHBTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVF1ZXJ5QXBwU3RhdGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucXVlcnlBcHBTdGF0ZShhcHBJZCk7XG59O1xuXG4vKipcbiAqIEFjdGl2YXRlcyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gb3IgbGF1bmNoZXMgaXQgaWYgbmVjZXNzYXJ5LlxuICogVGhlIGFjdGlvbiBsaXRlcmFsbHkgc2ltdWxhdGVzXG4gKiBjbGlja2luZyB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpY29uIG9uIHRoZSBkYXNoYm9hcmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGFwcCBjYW5ub3QgYmUgYWN0aXZhdGVkXG4gKi9cbmNvbW1hbmRzLmFjdGl2YXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gYWN0aXZhdGVBcHAgKGFwcElkKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nICcke2FwcElkfSdgKTtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmFkYi5nZXRBcGlMZXZlbCgpO1xuICAvLyBGYWxsYmFjayB0byBNb25rZXkgaW4gb2xkZXIgQVBJc1xuICBpZiAoYXBpTGV2ZWwgPCAyNCkge1xuICAgIC8vIFRoZSBtb25rZXkgY29tbWFuZCBjb3VsZCByYWlzZSBhbiBpc3N1ZSBhcyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NDg2MDQ3NS9ob3ctdG8tdXNlLXRoZS1tb25rZXktY29tbWFuZC13aXRoLWFuLWFuZHJvaWQtc3lzdGVtLXRoYXQtZG9lc250LWhhdmUtcGh5c2ljYWxcbiAgICAvLyBidXQgJy0tcGN0LXN5c2tleXMgMCcgY291bGQgY2F1c2UgYW5vdGhlciBiYWNrZ3JvdW5kIHByb2Nlc3MgaXNzdWUuIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNjk0MSNpc3N1ZWNvbW1lbnQtMTEyOTgzNzI4NVxuICAgIGNvbnN0IGNtZCA9IFsnbW9ua2V5JyxcbiAgICAgICctcCcsIGFwcElkLFxuICAgICAgJy1jJywgJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICAgICcxJ107XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENvbW1hbmQgc3Rkb3V0OiAke291dHB1dH1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBpZiAob3V0cHV0LmluY2x1ZGVzKCdtb25rZXkgYWJvcnRlZCcpKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gQXJlIHlvdSBzdXJlIGl0IGlzIGluc3RhbGxlZD9gKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGFjdGl2aXR5TmFtZSA9IGF3YWl0IHRoaXMuYWRiLnJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkoYXBwSWQpO1xuICBpZiAoYWN0aXZpdHlOYW1lID09PSBSRVNPTFZFUl9BQ1RJVklUWV9OQU1FKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE3MTI4XG4gICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICBgVGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgbmFtZSBvZiAnJHthcHBJZH0nIHdhcyByZXNvbHZlZCB0byAnJHthY3Rpdml0eU5hbWV9Jy4gYCArXG4gICAgICBgU3dpdGNoaW5nIHRoZSByZXNvbHZlciB0byBub3QgdXNlIGNtZGBcbiAgICApO1xuICAgIGFjdGl2aXR5TmFtZSA9IGF3YWl0IHRoaXMuYWRiLnJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkoYXBwSWQsIHtwcmVmZXJDbWQ6IGZhbHNlfSk7XG4gIH1cblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgJ2FtJywgKGFwaUxldmVsIDwgMjYpID8gJ3N0YXJ0JyA6ICdzdGFydC1hY3Rpdml0eScsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAnLWMnLCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQjRkxBR19BQ1RJVklUWV9ORVdfVEFTS1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50I0ZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERURcbiAgICAnLWYnLCAnMHgxMDIwMDAwMCcsXG4gICAgJy1uJywgYWN0aXZpdHlOYW1lLFxuICBdKTtcbiAgdGhpcy5sb2cuZGVidWcoc3Rkb3V0KTtcbiAgaWYgKC9eZXJyb3I6L21pLnRlc3Qoc3Rkb3V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFjdGl2YXRlICcke2FwcElkfScuIE9yaWdpbmFsIGVycm9yOiAke3N0ZG91dH1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNb2JpbGVBY3RpdmF0ZUFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBBY3RpdmF0ZXMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIG9yIGxhdW5jaGVzIGl0IGlmIG5lY2Vzc2FyeS5cbiAqIFRoZSBhY3Rpb24gbGl0ZXJhbGx5IHNpbXVsYXRlc1xuICogY2xpY2tpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWNvbiBvbiB0aGUgZGFzaGJvYXJkLlxuICpcbiAqIEBwYXJhbSB7TW9iaWxlQWN0aXZhdGVBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGFwcCBjYW5ub3QgYmUgYWN0aXZhdGVkXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUFjdGl2YXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQWN0aXZhdGVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWN0aXZhdGVBcHAoYXBwSWQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbMjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyB1bmluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ga2VlcERhdGEgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGtlZXAgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkYXRhIGFuZCBjYWNoZSBmb2xkZXJzIGFmdGVyIHVuaW5zdGFsbC5cbiAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBpZiBpcyBpbnN0YWxsZWQuXG4gKiBUaGUgY2FsbCBpcyBpZ25vcmVkIGlmIHRoZSBhcHAgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7P1VuaW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIHJlbW92YWwgb3B0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhY2thZ2Ugd2FzIGZvdW5kIG9uIHRoZSBkZXZpY2UgYW5kXG4gKiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLlxuICovXG5jb21tYW5kcy5yZW1vdmVBcHAgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBcHAgKGFwcElkLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLnVuaW5zdGFsbEFwayhhcHBJZCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZVJlbW92ZUFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKi9cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWYgaXMgaW5zdGFsbGVkLlxuICogVGhlIGNhbGwgaXMgaWdub3JlZCBpZiB0aGUgYXBwIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHtNb2JpbGVSZW1vdmVBcHBPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gU2FtZSBhcyBpbiBgcmVtb3ZlQXBwYFxuICovXG5jb21tYW5kcy5tb2JpbGVSZW1vdmVBcHAgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZW1vdmVBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IGFwcElkIH0gPSByZXF1aXJlQXJncygnYXBwSWQnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucmVtb3ZlQXBwKGFwcElkLCBvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGVybWluYXRlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ8c3RyaW5nfSB0aW1lb3V0IFs1MDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHRlcm1pbmF0ZWQuIFRoZSBtZXRob2Qgd2lsbCBza2lwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2luZyB0aGUgYXBwIHN0YXRlIGNoZWNrIGlmIHRoZSB0aW1lb3V0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgbG93ZXIgb3IgZXF1YWwgdG8gemVyby4gVGhlbiwgdGhlIHJldHVyblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgd2lsbCBiZSB0cnVlLlxuICovXG5cbi8qKlxuICogVGVybWluYXRlcyB0aGUgYXBwIGlmIGl0IGlzIHJ1bm5pbmcuIElmIHRoZSBnaXZlbiB0aW1lb3V0IHdhcyBsb3dlciBvciBlcXVhbCB0byB6ZXJvLFxuICogaXQgcmV0dXJucyB0cnVlIGFmdGVyIHRlcm1pbmF0aW5nIHRoZSBhcHAgd2l0aG91dCBjaGVja2luZyB0aGUgYXBwIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHBhcmFtIHs/VGVybWluYXRlT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgYXBwbGljYXRpb24gdGVybWluYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFwcCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVybWluYXRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgYXBwIGhhcyBub3QgYmVlbiB0ZXJtaW5hdGVkIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZW91dC5cbiAqL1xuY29tbWFuZHMudGVybWluYXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQXBwIChhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gIHRoaXMubG9nLmluZm8oYFRlcm1pbmF0aW5nICcke2FwcElkfSdgKTtcbiAgaWYgKCEoYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyhhcHBJZCkpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIGFwcCAnJHthcHBJZH0nIGlzIG5vdCBydW5uaW5nYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcChhcHBJZCk7XG4gIGNvbnN0IHRpbWVvdXQgPSB1dGlsLmhhc1ZhbHVlKG9wdGlvbnMudGltZW91dCkgJiYgIWlzTmFOKG9wdGlvbnMudGltZW91dCkgPyBwYXJzZUludChvcHRpb25zLnRpbWVvdXQsIDEwKSA6IDUwMDtcblxuICBpZiAodGltZW91dCA8PSAwKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwSWR9JyBoYXMgYmVlbiB0ZXJtaW5hdGVkLiBTa2lwIGNoZWNraW5nIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzIHN0YXRlIGAgK1xuICAgICAgYHNpbmNlIHRoZSB0aW1lb3V0IHdhcyBzZXQgYXMgJHt0aW1lb3V0fW1zYCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGFwcElkKSA8PSBBUFBfU1RBVEUuTk9UX1JVTk5JTkcsXG4gICAgICB7d2FpdE1zOiB0aW1lb3V0LCBpbnRlcnZhbE1zOiAxMDB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYCcke2FwcElkfScgaXMgc3RpbGwgcnVubmluZyBhZnRlciAke3RpbWVvdXR9bXMgdGltZW91dGApO1xuICB9XG4gIHRoaXMubG9nLmluZm8oYCcke2FwcElkfScgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWRgKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZVRlcm1pbmF0ZUFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllci4gTXVzdCBiZSBhbHdheXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzUwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdGVybWluYXRlZC5cbiAqL1xuXG4vKipcbiAqIFRlcm1pbmF0ZXMgdGhlIGFwcCBpZiBpdCBpcyBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB7TW9iaWxlVGVybWluYXRlQXBwT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge2Jvb2xlYW59IFNhbWUgYXMgaW4gYHRlcm1pbmF0ZUFwcGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgYXBwIGhhcyBub3QgYmVlbiB0ZXJtaW5hdGVkIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZW91dC5cbiAqL1xuY29tbWFuZHMubW9iaWxlVGVybWluYXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVGVybWluYXRlQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBhcHBJZCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcElkJywgb3B0cyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLnRlcm1pbmF0ZUFwcChhcHBJZCwgb3B0cyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dCBbNjAwMDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcCBpcyBpbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqL1xuXG4vKipcbiAqIEluc3RhbGxzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBsb2NhbCBhcGsgcGF0aCBvciBhIHJlbW90ZSB1cmxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIHNldCBvZiBpbnN0YWxsYXRpb24gb3B0aW9uc1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBnaXZlbiBhcGsgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWNoYWJsZVxuICovXG5jb21tYW5kcy5pbnN0YWxsQXBwID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwcCAoYXBwUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGxvY2FsUGF0aCA9IGF3YWl0IHRoaXMuaGVscGVycy5jb25maWd1cmVBcHAoYXBwUGF0aCwgQVBQX0VYVEVOU0lPTlMpO1xuICBhd2FpdCB0aGlzLmFkYi5pbnN0YWxsKGxvY2FsUGF0aCwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1vYmlsZUluc3RhbGxBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBsb2NhbCBhcGsgcGF0aCBvciBhIHJlbW90ZSB1cmwuIE11c3QgYmUgYWx3YXlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzYwMDAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtNb2JpbGVJbnN0YWxsQXBwT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBnaXZlbiBhcGsgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWNoYWJsZVxuICovXG5jb21tYW5kcy5tb2JpbGVJbnN0YWxsQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlSW5zdGFsbEFwcCAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgYXBwUGF0aCB9ID0gcmVxdWlyZUFyZ3MoJ2FwcFBhdGgnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuaW5zdGFsbEFwcChhcHBQYXRoLCBvcHRzKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2xlYXJBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGFwcElkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIGJlIGNsZWFyZWRcbiAqL1xuXG4vKipcbiAqIERlbGV0ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0NsZWFyQXBwT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIGNsZWFuaW5nIG9mIHRoZSBhcHAgZGF0YSBmYWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVDbGVhckFwcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNsZWFyQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2FwcElkfSA9IG9wdHM7XG4gIGlmICghYXBwSWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ2FwcElkJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmNsZWFyKGFwcElkKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxjQUFjLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO0FBQ3hDLE1BQU1DLHNCQUFzQixHQUFHLG1EQUFtRDtBQUVsRixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxDQUFDOztBQUFDO0FBUXBCQSxRQUFRLENBQUNDLGNBQWMsR0FBRyxlQUFlQSxjQUFjLENBQUVDLEtBQUssRUFBRTtFQUM5RCxPQUFPLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNGLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDO0FBQzdDLENBQUM7O0FBYURGLFFBQVEsQ0FBQ0ksb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CLENBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUM5RSxNQUFNO0lBQUVIO0VBQU0sQ0FBQyxHQUFHLElBQUFJLGtCQUFXLEVBQUMsT0FBTyxFQUFFRCxJQUFJLENBQUM7RUFDNUMsT0FBTyxNQUFNLElBQUksQ0FBQ0osY0FBYyxDQUFDQyxLQUFLLENBQUM7QUFDekMsQ0FBQzs7QUFhREYsUUFBUSxDQUFDTyxhQUFhLEdBQUcsZUFBZUEsYUFBYSxDQUFFTCxLQUFLLEVBQUU7RUFDNUQsSUFBSSxDQUFDTSxHQUFHLENBQUNDLElBQUksQ0FBRSwwQkFBeUJQLEtBQU0sR0FBRSxDQUFDO0VBQ2pELElBQUksRUFBQyxNQUFNLElBQUksQ0FBQ0MsR0FBRyxDQUFDRixjQUFjLENBQUNDLEtBQUssQ0FBQyxHQUFFO0lBQ3pDLE9BQU9RLHlCQUFTLENBQUNDLGFBQWE7RUFDaEM7RUFDQSxJQUFJLEVBQUMsTUFBTSxJQUFJLENBQUNSLEdBQUcsQ0FBQ1MsYUFBYSxDQUFDVixLQUFLLENBQUMsR0FBRTtJQUN4QyxPQUFPUSx5QkFBUyxDQUFDRyxXQUFXO0VBQzlCO0VBQ0EsTUFBTUMsT0FBTyxHQUFHLElBQUlDLE1BQU0sQ0FBRSxNQUFLQyxlQUFDLENBQUNDLFlBQVksQ0FBQ2YsS0FBSyxDQUFFLEdBQUUsQ0FBQztFQUMxRCxLQUFLLE1BQU1nQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQ2YsR0FBRyxDQUFDZ0IsV0FBVyxFQUFFLEVBQUVDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUM3RCxJQUFJTixPQUFPLENBQUNPLElBQUksQ0FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUNJLElBQUksQ0FBRUMsQ0FBQyxJQUFLTCxJQUFJLENBQUNNLFFBQVEsQ0FBQ0QsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUN4RixPQUFPYix5QkFBUyxDQUFDZSxxQkFBcUI7SUFDeEM7RUFDRjtFQUNBLE9BQU9mLHlCQUFTLENBQUNnQixxQkFBcUI7QUFDeEMsQ0FBQzs7QUFhRDFCLFFBQVEsQ0FBQzJCLG1CQUFtQixHQUFHLGVBQWVBLG1CQUFtQixDQUFFdEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQzVFLE1BQU07SUFBRUg7RUFBTSxDQUFDLEdBQUcsSUFBQUksa0JBQVcsRUFBQyxPQUFPLEVBQUVELElBQUksQ0FBQztFQUM1QyxPQUFPLE1BQU0sSUFBSSxDQUFDRSxhQUFhLENBQUNMLEtBQUssQ0FBQztBQUN4QyxDQUFDOztBQVVERixRQUFRLENBQUM0QixXQUFXLEdBQUcsZUFBZUEsV0FBVyxDQUFFMUIsS0FBSyxFQUFFO0VBQ3hELElBQUksQ0FBQ00sR0FBRyxDQUFDcUIsS0FBSyxDQUFFLGVBQWMzQixLQUFNLEdBQUUsQ0FBQztFQUN2QyxNQUFNNEIsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDM0IsR0FBRyxDQUFDNEIsV0FBVyxFQUFFO0VBRTdDLElBQUlELFFBQVEsR0FBRyxFQUFFLEVBQUU7SUFHakIsTUFBTUUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUNuQixJQUFJLEVBQUU5QixLQUFLLEVBQ1gsSUFBSSxFQUFFLGtDQUFrQyxFQUN4QyxHQUFHLENBQUM7SUFDTixJQUFJK0IsTUFBTSxHQUFHLEVBQUU7SUFDZixJQUFJO01BQ0ZBLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQzlCLEdBQUcsQ0FBQytCLEtBQUssQ0FBQ0YsR0FBRyxDQUFDO01BQ2xDLElBQUksQ0FBQ3hCLEdBQUcsQ0FBQ3FCLEtBQUssQ0FBRSxtQkFBa0JJLE1BQU8sRUFBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxPQUFPRSxDQUFDLEVBQUU7TUFDVixJQUFJLENBQUMzQixHQUFHLENBQUM0QixhQUFhLENBQUUsb0JBQW1CbEMsS0FBTSxzQkFBcUJpQyxDQUFDLENBQUNFLE9BQVEsRUFBQyxDQUFDO0lBQ3BGO0lBQ0EsSUFBSUosTUFBTSxDQUFDVCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtNQUNyQyxJQUFJLENBQUNoQixHQUFHLENBQUM0QixhQUFhLENBQUUsb0JBQW1CbEMsS0FBTSxrQ0FBaUMsQ0FBQztJQUNyRjtJQUNBO0VBQ0Y7RUFFQSxJQUFJb0MsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDbkMsR0FBRyxDQUFDb0MseUJBQXlCLENBQUNyQyxLQUFLLENBQUM7RUFDbEUsSUFBSW9DLFlBQVksS0FBS3ZDLHNCQUFzQixFQUFFO0lBRTNDLElBQUksQ0FBQ1MsR0FBRyxDQUFDcUIsS0FBSyxDQUNYLG9DQUFtQzNCLEtBQU0sc0JBQXFCb0MsWUFBYSxLQUFJLEdBQy9FLHVDQUFzQyxDQUN4QztJQUNEQSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUNuQyxHQUFHLENBQUNvQyx5QkFBeUIsQ0FBQ3JDLEtBQUssRUFBRTtNQUFDc0MsU0FBUyxFQUFFO0lBQUssQ0FBQyxDQUFDO0VBQ3BGO0VBRUEsTUFBTUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDdEMsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLENBQ2xDLElBQUksRUFBR0osUUFBUSxHQUFHLEVBQUUsR0FBSSxPQUFPLEdBQUcsZ0JBQWdCLEVBQ2xELElBQUksRUFBRSw0QkFBNEIsRUFDbEMsSUFBSSxFQUFFLGtDQUFrQztFQUl4QyxJQUFJLEVBQUUsWUFBWSxFQUNsQixJQUFJLEVBQUVRLFlBQVksQ0FDbkIsQ0FBQztFQUNGLElBQUksQ0FBQzlCLEdBQUcsQ0FBQ3FCLEtBQUssQ0FBQ1ksTUFBTSxDQUFDO0VBQ3RCLElBQUksV0FBVyxDQUFDcEIsSUFBSSxDQUFDb0IsTUFBTSxDQUFDLEVBQUU7SUFDNUIsTUFBTSxJQUFJQyxLQUFLLENBQUUsb0JBQW1CeEMsS0FBTSxzQkFBcUJ1QyxNQUFPLEVBQUMsQ0FBQztFQUMxRTtBQUNGLENBQUM7O0FBZUR6QyxRQUFRLENBQUMyQyxpQkFBaUIsR0FBRyxlQUFlQSxpQkFBaUIsQ0FBRXRDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUN4RSxNQUFNO0lBQUVIO0VBQU0sQ0FBQyxHQUFHLElBQUFJLGtCQUFXLEVBQUMsT0FBTyxFQUFFRCxJQUFJLENBQUM7RUFDNUMsT0FBTyxNQUFNLElBQUksQ0FBQ3VCLFdBQVcsQ0FBQzFCLEtBQUssQ0FBQztBQUN0QyxDQUFDOztBQW1CREYsUUFBUSxDQUFDNEMsU0FBUyxHQUFHLGVBQWVBLFNBQVMsQ0FBRTFDLEtBQUssRUFBRTJDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRTtFQUNsRSxPQUFPLE1BQU0sSUFBSSxDQUFDMUMsR0FBRyxDQUFDMkMsWUFBWSxDQUFDNUMsS0FBSyxFQUFFMkMsT0FBTyxDQUFDO0FBQ3BELENBQUM7O0FBY0Q3QyxRQUFRLENBQUMrQyxlQUFlLEdBQUcsZUFBZUEsZUFBZSxDQUFFMUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3BFLE1BQU07SUFBRUg7RUFBTSxDQUFDLEdBQUcsSUFBQUksa0JBQVcsRUFBQyxPQUFPLEVBQUVELElBQUksQ0FBQztFQUM1QyxPQUFPLE1BQU0sSUFBSSxDQUFDdUMsU0FBUyxDQUFDMUMsS0FBSyxFQUFFRyxJQUFJLENBQUM7QUFDMUMsQ0FBQzs7QUFvQkRMLFFBQVEsQ0FBQ2dELFlBQVksR0FBRyxlQUFlQSxZQUFZLENBQUU5QyxLQUFLLEVBQUUyQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDeEUsSUFBSSxDQUFDckMsR0FBRyxDQUFDQyxJQUFJLENBQUUsZ0JBQWVQLEtBQU0sR0FBRSxDQUFDO0VBQ3ZDLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQ0MsR0FBRyxDQUFDUyxhQUFhLENBQUNWLEtBQUssQ0FBQyxDQUFDLEVBQUU7SUFDMUMsSUFBSSxDQUFDTSxHQUFHLENBQUNDLElBQUksQ0FBRSxZQUFXUCxLQUFNLGtCQUFpQixDQUFDO0lBQ2xELE9BQU8sS0FBSztFQUNkO0VBQ0EsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQzhDLFNBQVMsQ0FBQy9DLEtBQUssQ0FBQztFQUMvQixNQUFNZ0QsT0FBTyxHQUFHQyxhQUFJLENBQUNDLFFBQVEsQ0FBQ1AsT0FBTyxDQUFDSyxPQUFPLENBQUMsSUFBSSxDQUFDRyxLQUFLLENBQUNSLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDLEdBQUdJLFFBQVEsQ0FBQ1QsT0FBTyxDQUFDSyxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRztFQUUvRyxJQUFJQSxPQUFPLElBQUksQ0FBQyxFQUFFO0lBQ2hCLElBQUksQ0FBQzFDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLElBQUdQLEtBQU0scUVBQW9FLEdBQ3pGLGdDQUErQmdELE9BQVEsSUFBRyxDQUFDO0lBQzlDLE9BQU8sSUFBSTtFQUNiO0VBRUEsSUFBSTtJQUNGLE1BQU0sSUFBQUssMEJBQWdCLEVBQUMsWUFBWSxPQUFNLElBQUksQ0FBQ2hELGFBQWEsQ0FBQ0wsS0FBSyxDQUFDLEtBQUlRLHlCQUFTLENBQUNHLFdBQVcsRUFDekY7TUFBQzJDLE1BQU0sRUFBRU4sT0FBTztNQUFFTyxVQUFVLEVBQUU7SUFBRyxDQUFDLENBQUM7RUFDdkMsQ0FBQyxDQUFDLE9BQU90QixDQUFDLEVBQUU7SUFDVixJQUFJLENBQUMzQixHQUFHLENBQUM0QixhQUFhLENBQUUsSUFBR2xDLEtBQU0sNEJBQTJCZ0QsT0FBUSxZQUFXLENBQUM7RUFDbEY7RUFDQSxJQUFJLENBQUMxQyxHQUFHLENBQUNDLElBQUksQ0FBRSxJQUFHUCxLQUFNLG9DQUFtQyxDQUFDO0VBQzVELE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBZ0JERixRQUFRLENBQUMwRCxrQkFBa0IsR0FBRyxlQUFlQSxrQkFBa0IsQ0FBRXJELElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUMxRSxNQUFNO0lBQUVIO0VBQU0sQ0FBQyxHQUFHLElBQUFJLGtCQUFXLEVBQUMsT0FBTyxFQUFFRCxJQUFJLENBQUM7RUFDNUMsT0FBTyxNQUFNLElBQUksQ0FBQzJDLFlBQVksQ0FBQzlDLEtBQUssRUFBRUcsSUFBSSxDQUFDO0FBQzdDLENBQUM7O0FBMEJETCxRQUFRLENBQUMyRCxVQUFVLEdBQUcsZUFBZUEsVUFBVSxDQUFFQyxPQUFPLEVBQUVmLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRTtFQUN0RSxNQUFNZ0IsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDQyxPQUFPLENBQUNDLFlBQVksQ0FBQ0gsT0FBTyxFQUFFOUQsY0FBYyxDQUFDO0VBQzFFLE1BQU0sSUFBSSxDQUFDSyxHQUFHLENBQUM2RCxPQUFPLENBQUNILFNBQVMsRUFBRWhCLE9BQU8sQ0FBQztBQUM1QyxDQUFDOztBQTBCRDdDLFFBQVEsQ0FBQ2lFLGdCQUFnQixHQUFHLGVBQWVBLGdCQUFnQixDQUFFNUQsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3RFLE1BQU07SUFBRXVEO0VBQVEsQ0FBQyxHQUFHLElBQUF0RCxrQkFBVyxFQUFDLFNBQVMsRUFBRUQsSUFBSSxDQUFDO0VBQ2hELE9BQU8sTUFBTSxJQUFJLENBQUNzRCxVQUFVLENBQUNDLE9BQU8sRUFBRXZELElBQUksQ0FBQztBQUM3QyxDQUFDOztBQWFETCxRQUFRLENBQUNrRSxjQUFjLEdBQUcsZUFBZUEsY0FBYyxDQUFFN0QsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2xFLE1BQU07SUFBQ0g7RUFBSyxDQUFDLEdBQUdHLElBQUk7RUFDcEIsSUFBSSxDQUFDSCxLQUFLLEVBQUU7SUFDVixNQUFNLElBQUlpRSxjQUFNLENBQUNDLG9CQUFvQixDQUFFLGtDQUFpQyxDQUFDO0VBQzNFO0VBQ0EsTUFBTSxJQUFJLENBQUNqRSxHQUFHLENBQUNrRSxLQUFLLENBQUNuRSxLQUFLLENBQUM7QUFDN0IsQ0FBQztBQUFDLGVBR2FGLFFBQVE7QUFBQSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-management.js","names":["APP_EXTENSIONS","RESOLVER_ACTIVITY_NAME","commands","isAppInstalled","appId","adb","mobileIsAppInstalled","opts","requireArgs","queryAppState","log","info","APP_STATE","NOT_INSTALLED","processExists","NOT_RUNNING","appIdRe","RegExp","_","escapeRegExp","line","dumpWindows","split","test","some","x","includes","RUNNING_IN_FOREGROUND","RUNNING_IN_BACKGROUND","mobileQueryAppState","activateApp","debug","apiLevel","getApiLevel","cmd","output","shell","e","errorAndThrow","message","activityName","resolveLaunchableActivity","preferCmd","stdout","Error","mobileActivateApp","removeApp","options","uninstallApk","mobileRemoveApp","terminateApp","forceStop","timeout","util","hasValue","isNaN","parseInt","waitForCondition","waitMs","intervalMs","mobileTerminateApp","installApp","appPath","localPath","helpers","configureApp","install","mobileInstallApp","mobileClearApp","errors","InvalidArgumentError","clear"],"sources":["../../../lib/commands/app-management.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util } from 'appium/support';\nimport { APP_STATE } from '../android-helpers';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\nconst APP_EXTENSIONS = ['.apk', '.apks'];\nconst RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';\n\nconst commands = {};\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {string} appId - Application package identifier\n * @returns {boolean} true if the app is installed\n */\ncommands.isAppInstalled = async function isAppInstalled (appId) {\n return await this.adb.isAppInstalled(appId);\n};\n\n/**\n * @typedef {Object} MobileAppInstalledOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {MobileAppInstalledOptions} opts\n * @returns {boolean} Same as in `isAppInstalled`\n */\ncommands.mobileIsAppInstalled = async function mobileIsAppInstalled (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.isAppInstalled(appId);\n};\n\n/**\n * Queries the current state of the app.\n *\n * @param {string} appId - Application package identifier\n * @returns {number} The corresponding constant, which describes\n * the current application state:\n * 0 - is the app is not installed\n * 1 - if the app is installed, but is not running\n * 3 - if the app is running in the background\n * 4 - if the app is running in the foreground\n */\ncommands.queryAppState = async function queryAppState (appId) {\n this.log.info(`Querying the state of '${appId}'`);\n if (!await this.adb.isAppInstalled(appId)) {\n return APP_STATE.NOT_INSTALLED;\n }\n if (!await this.adb.processExists(appId)) {\n return APP_STATE.NOT_RUNNING;\n }\n const appIdRe = new RegExp(`\\\\b${_.escapeRegExp(appId)}/`);\n for (const line of (await this.adb.dumpWindows()).split('\\n')) {\n if (appIdRe.test(line) && ['mCurrentFocus', 'mFocusedApp'].some((x) => line.includes(x))) {\n return APP_STATE.RUNNING_IN_FOREGROUND;\n }\n }\n return APP_STATE.RUNNING_IN_BACKGROUND;\n};\n\n/**\n * @typedef {Object} MobileQueryAppStateOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Queries the current state of the app.\n *\n * @param {MobileQueryAppStateOptions} opts\n * @returns {number} Same as in `queryAppState`\n */\ncommands.mobileQueryAppState = async function mobileQueryAppState (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.queryAppState(appId);\n};\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {string} appId - Application package identifier\n * @throws {Error} If the app cannot be activated\n */\ncommands.activateApp = async function activateApp (appId) {\n this.log.debug(`Activating '${appId}'`);\n const apiLevel = await this.adb.getApiLevel();\n // Fallback to Monkey in older APIs\n if (apiLevel < 24) {\n // The monkey command could raise an issue as https://stackoverflow.com/questions/44860475/how-to-use-the-monkey-command-with-an-android-system-that-doesnt-have-physical\n // but '--pct-syskeys 0' could cause another background process issue. https://github.com/appium/appium/issues/16941#issuecomment-1129837285\n const cmd = ['monkey',\n '-p', appId,\n '-c', 'android.intent.category.LAUNCHER',\n '1'];\n let output = '';\n try {\n output = await this.adb.shell(cmd);\n this.log.debug(`Command stdout: ${output}`);\n } catch (e) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);\n }\n if (output.includes('monkey aborted')) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);\n }\n return;\n }\n\n let activityName = await this.adb.resolveLaunchableActivity(appId);\n if (activityName === RESOLVER_ACTIVITY_NAME) {\n // https://github.com/appium/appium/issues/17128\n this.log.debug(\n `The launchable activity name of '${appId}' was resolved to '${activityName}'. ` +\n `Switching the resolver to not use cmd`\n );\n activityName = await this.adb.resolveLaunchableActivity(appId, {preferCmd: false});\n }\n\n const stdout = await this.adb.shell([\n 'am', (apiLevel < 26) ? 'start' : 'start-activity',\n '-a', 'android.intent.action.MAIN',\n '-c', 'android.intent.category.LAUNCHER',\n // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n '-f', '0x10200000',\n '-n', activityName,\n ]);\n this.log.debug(stdout);\n if (/^error:/mi.test(stdout)) {\n throw new Error(`Cannot activate '${appId}'. Original error: ${stdout}`);\n }\n};\n\n/**\n * @typedef {Object} MobileActivateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {MobileActivateAppOptions} opts\n * @throws {Error} If the app cannot be activated\n */\ncommands.mobileActivateApp = async function mobileActivateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.activateApp(appId);\n};\n\n/**\n * @typedef {Object} UninstallOptions\n * @property {number} timeout [20000] - The count of milliseconds to wait until the\n * app is uninstalled.\n * @property {boolean} keepData [false] - Set to true in order to keep the\n * application data and cache folders after uninstall.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {string} appId - Application package identifier\n * @param {?UninstallOptions} options - The set of removal options\n * @returns {boolean} True if the package was found on the device and\n * successfully uninstalled.\n */\ncommands.removeApp = async function removeApp (appId, options = {}) {\n return await this.adb.uninstallApk(appId, options);\n};\n\n/**\n * @typedef {Object} MobileRemoveAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {MobileRemoveAppOptions} opts\n * @returns {boolean} Same as in `removeApp`\n */\ncommands.mobileRemoveApp = async function mobileRemoveApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.removeApp(appId, opts);\n};\n\n/**\n * @typedef {Object} TerminateOptions\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated.\n */\n\n/**\n * Terminates the app if it is running.\n *\n * @param {string} appId - Application package identifier\n * @param {?TerminateOptions} options - The set of application termination options\n * @returns {boolean} True if the app has been successfully terminated.\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.terminateApp = async function terminateApp (appId, options = {}) {\n this.log.info(`Terminating '${appId}'`);\n if (!(await this.adb.processExists(appId))) {\n this.log.info(`The app '${appId}' is not running`);\n return false;\n }\n await this.adb.forceStop(appId);\n const timeout = util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;\n try {\n await waitForCondition(async () => await this.queryAppState(appId) <= APP_STATE.NOT_RUNNING,\n {waitMs: timeout, intervalMs: 100});\n } catch (e) {\n this.log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);\n }\n this.log.info(`'${appId}' has been successfully terminated`);\n return true;\n};\n\n/**\n * @typedef {Object} MobileTerminateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated.\n */\n\n/**\n * Terminates the app if it is running.\n *\n * @param {MobileTerminateAppOptions} opts\n * @returns {boolean} Same as in `terminateApp`\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.mobileTerminateApp = async function mobileTerminateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.terminateApp(appId, opts);\n};\n\n/**\n * @typedef {Object} InstallOptions\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {string} appPath - The local apk path or a remote url\n * @param {?InstallOptions} options - The set of installation options\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.installApp = async function installApp (appPath, options = {}) {\n const localPath = await this.helpers.configureApp(appPath, APP_EXTENSIONS);\n await this.adb.install(localPath, options);\n};\n\n/**\n * @typedef {Object} MobileInstallAppOptions\n * @property {string} appPath - The local apk path or a remote url. Must be always provided.\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {MobileInstallAppOptions} opts\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.mobileInstallApp = async function mobileInstallApp (opts = {}) {\n const { appPath } = requireArgs('appPath', opts);\n return await this.installApp(appPath, opts);\n};\n\n/**\n * @typedef {Object} ClearAppOptions\n * @property {!string} appId The identifier of the application package to be cleared\n */\n\n/**\n * Deletes all data associated with a package.\n *\n * @param {ClearAppOptions} opts\n * @throws {Error} If cleaning of the app data fails\n */\ncommands.mobileClearApp = async function mobileClearApp (opts = {}) {\n const {appId} = opts;\n if (!appId) {\n throw new errors.InvalidArgumentError(`The 'appId' argument is required`);\n }\n await this.adb.clear(appId);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-management.js","names":["APP_EXTENSIONS","RESOLVER_ACTIVITY_NAME","commands","isAppInstalled","appId","adb","mobileIsAppInstalled","opts","requireArgs","queryAppState","log","info","APP_STATE","NOT_INSTALLED","processExists","NOT_RUNNING","appIdRe","RegExp","_","escapeRegExp","line","dumpWindows","split","test","some","x","includes","RUNNING_IN_FOREGROUND","RUNNING_IN_BACKGROUND","mobileQueryAppState","activateApp","debug","apiLevel","getApiLevel","cmd","output","shell","e","errorAndThrow","message","activityName","resolveLaunchableActivity","preferCmd","stdout","Error","mobileActivateApp","removeApp","options","uninstallApk","mobileRemoveApp","terminateApp","forceStop","timeout","util","hasValue","isNaN","parseInt","waitForCondition","waitMs","intervalMs","mobileTerminateApp","installApp","appPath","localPath","helpers","configureApp","install","mobileInstallApp","mobileClearApp","errors","InvalidArgumentError","clear"],"sources":["../../../lib/commands/app-management.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util } from 'appium/support';\nimport { APP_STATE } from '../android-helpers';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\nconst APP_EXTENSIONS = ['.apk', '.apks'];\nconst RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';\n\nconst commands = {};\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {string} appId - Application package identifier\n * @returns {boolean} true if the app is installed\n */\ncommands.isAppInstalled = async function isAppInstalled (appId) {\n return await this.adb.isAppInstalled(appId);\n};\n\n/**\n * @typedef {Object} MobileAppInstalledOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {MobileAppInstalledOptions} opts\n * @returns {boolean} Same as in `isAppInstalled`\n */\ncommands.mobileIsAppInstalled = async function mobileIsAppInstalled (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.isAppInstalled(appId);\n};\n\n/**\n * Queries the current state of the app.\n *\n * @param {string} appId - Application package identifier\n * @returns {number} The corresponding constant, which describes\n * the current application state:\n * 0 - is the app is not installed\n * 1 - if the app is installed, but is not running\n * 3 - if the app is running in the background\n * 4 - if the app is running in the foreground\n */\ncommands.queryAppState = async function queryAppState (appId) {\n this.log.info(`Querying the state of '${appId}'`);\n if (!await this.adb.isAppInstalled(appId)) {\n return APP_STATE.NOT_INSTALLED;\n }\n if (!await this.adb.processExists(appId)) {\n return APP_STATE.NOT_RUNNING;\n }\n const appIdRe = new RegExp(`\\\\b${_.escapeRegExp(appId)}/`);\n for (const line of (await this.adb.dumpWindows()).split('\\n')) {\n if (appIdRe.test(line) && ['mCurrentFocus', 'mFocusedApp'].some((x) => line.includes(x))) {\n return APP_STATE.RUNNING_IN_FOREGROUND;\n }\n }\n return APP_STATE.RUNNING_IN_BACKGROUND;\n};\n\n/**\n * @typedef {Object} MobileQueryAppStateOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Queries the current state of the app.\n *\n * @param {MobileQueryAppStateOptions} opts\n * @returns {number} Same as in `queryAppState`\n */\ncommands.mobileQueryAppState = async function mobileQueryAppState (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.queryAppState(appId);\n};\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {string} appId - Application package identifier\n * @throws {Error} If the app cannot be activated\n */\ncommands.activateApp = async function activateApp (appId) {\n this.log.debug(`Activating '${appId}'`);\n const apiLevel = await this.adb.getApiLevel();\n // Fallback to Monkey in older APIs\n if (apiLevel < 24) {\n // The monkey command could raise an issue as https://stackoverflow.com/questions/44860475/how-to-use-the-monkey-command-with-an-android-system-that-doesnt-have-physical\n // but '--pct-syskeys 0' could cause another background process issue. https://github.com/appium/appium/issues/16941#issuecomment-1129837285\n const cmd = ['monkey',\n '-p', appId,\n '-c', 'android.intent.category.LAUNCHER',\n '1'];\n let output = '';\n try {\n output = await this.adb.shell(cmd);\n this.log.debug(`Command stdout: ${output}`);\n } catch (e) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);\n }\n if (output.includes('monkey aborted')) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);\n }\n return;\n }\n\n let activityName = await this.adb.resolveLaunchableActivity(appId);\n if (activityName === RESOLVER_ACTIVITY_NAME) {\n // https://github.com/appium/appium/issues/17128\n this.log.debug(\n `The launchable activity name of '${appId}' was resolved to '${activityName}'. ` +\n `Switching the resolver to not use cmd`\n );\n activityName = await this.adb.resolveLaunchableActivity(appId, {preferCmd: false});\n }\n\n const stdout = await this.adb.shell([\n 'am', (apiLevel < 26) ? 'start' : 'start-activity',\n '-a', 'android.intent.action.MAIN',\n '-c', 'android.intent.category.LAUNCHER',\n // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n '-f', '0x10200000',\n '-n', activityName,\n ]);\n this.log.debug(stdout);\n if (/^error:/mi.test(stdout)) {\n throw new Error(`Cannot activate '${appId}'. Original error: ${stdout}`);\n }\n};\n\n/**\n * @typedef {Object} MobileActivateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {MobileActivateAppOptions} opts\n * @throws {Error} If the app cannot be activated\n */\ncommands.mobileActivateApp = async function mobileActivateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.activateApp(appId);\n};\n\n/**\n * @typedef {Object} UninstallOptions\n * @property {number} timeout [20000] - The count of milliseconds to wait until the\n * app is uninstalled.\n * @property {boolean} keepData [false] - Set to true in order to keep the\n * application data and cache folders after uninstall.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {string} appId - Application package identifier\n * @param {?UninstallOptions} options - The set of removal options\n * @returns {boolean} True if the package was found on the device and\n * successfully uninstalled.\n */\ncommands.removeApp = async function removeApp (appId, options = {}) {\n return await this.adb.uninstallApk(appId, options);\n};\n\n/**\n * @typedef {Object} MobileRemoveAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {MobileRemoveAppOptions} opts\n * @returns {boolean} Same as in `removeApp`\n */\ncommands.mobileRemoveApp = async function mobileRemoveApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.removeApp(appId, opts);\n};\n\n/**\n * @typedef {Object} TerminateOptions\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated. The method will skip\n * checking the app state check if the timeout\n * was lower or equal to zero. Then, the return\n * value will be true.\n */\n\n/**\n * Terminates the app if it is running. If the given timeout was lower or equal to zero,\n * it returns true after terminating the app without checking the app state.\n *\n * @param {string} appId - Application package identifier\n * @param {?TerminateOptions} options - The set of application termination options\n * @returns {boolean} True if the app has been successfully terminated.\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.terminateApp = async function terminateApp (appId, options = {}) {\n this.log.info(`Terminating '${appId}'`);\n if (!(await this.adb.processExists(appId))) {\n this.log.info(`The app '${appId}' is not running`);\n return false;\n }\n await this.adb.forceStop(appId);\n const timeout = util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;\n\n if (timeout <= 0) {\n this.log.info(`'${appId}' has been terminated. Skip checking the application process state ` +\n `since the timeout was set as ${timeout}ms`);\n return true;\n }\n\n try {\n await waitForCondition(async () => await this.queryAppState(appId) <= APP_STATE.NOT_RUNNING,\n {waitMs: timeout, intervalMs: 100});\n } catch (e) {\n this.log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);\n }\n this.log.info(`'${appId}' has been successfully terminated`);\n return true;\n};\n\n/**\n * @typedef {Object} MobileTerminateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated.\n */\n\n/**\n * Terminates the app if it is running.\n *\n * @param {MobileTerminateAppOptions} opts\n * @returns {boolean} Same as in `terminateApp`\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.mobileTerminateApp = async function mobileTerminateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.terminateApp(appId, opts);\n};\n\n/**\n * @typedef {Object} InstallOptions\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {string} appPath - The local apk path or a remote url\n * @param {?InstallOptions} options - The set of installation options\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.installApp = async function installApp (appPath, options = {}) {\n const localPath = await this.helpers.configureApp(appPath, APP_EXTENSIONS);\n await this.adb.install(localPath, options);\n};\n\n/**\n * @typedef {Object} MobileInstallAppOptions\n * @property {string} appPath - The local apk path or a remote url. Must be always provided.\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {MobileInstallAppOptions} opts\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.mobileInstallApp = async function mobileInstallApp (opts = {}) {\n const { appPath } = requireArgs('appPath', opts);\n return await this.installApp(appPath, opts);\n};\n\n/**\n * @typedef {Object} ClearAppOptions\n * @property {!string} appId The identifier of the application package to be cleared\n */\n\n/**\n * Deletes all data associated with a package.\n *\n * @param {ClearAppOptions} opts\n * @throws {Error} If cleaning of the app data fails\n */\ncommands.mobileClearApp = async function mobileClearApp (opts = {}) {\n const {appId} = opts;\n if (!appId) {\n throw new errors.InvalidArgumentError(`The 'appId' argument is required`);\n }\n await this.adb.clear(appId);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
@@ -197,11 +197,15 @@ commands.mobileRemoveApp = async function mobileRemoveApp (opts = {}) {
|
|
|
197
197
|
/**
|
|
198
198
|
* @typedef {Object} TerminateOptions
|
|
199
199
|
* @property {number|string} timeout [500] - The count of milliseconds to wait until the
|
|
200
|
-
* app is terminated.
|
|
200
|
+
* app is terminated. The method will skip
|
|
201
|
+
* checking the app state check if the timeout
|
|
202
|
+
* was lower or equal to zero. Then, the return
|
|
203
|
+
* value will be true.
|
|
201
204
|
*/
|
|
202
205
|
|
|
203
206
|
/**
|
|
204
|
-
* Terminates the app if it is running.
|
|
207
|
+
* Terminates the app if it is running. If the given timeout was lower or equal to zero,
|
|
208
|
+
* it returns true after terminating the app without checking the app state.
|
|
205
209
|
*
|
|
206
210
|
* @param {string} appId - Application package identifier
|
|
207
211
|
* @param {?TerminateOptions} options - The set of application termination options
|
|
@@ -216,6 +220,13 @@ commands.terminateApp = async function terminateApp (appId, options = {}) {
|
|
|
216
220
|
}
|
|
217
221
|
await this.adb.forceStop(appId);
|
|
218
222
|
const timeout = util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;
|
|
223
|
+
|
|
224
|
+
if (timeout <= 0) {
|
|
225
|
+
this.log.info(`'${appId}' has been terminated. Skip checking the application process state ` +
|
|
226
|
+
`since the timeout was set as ${timeout}ms`);
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
|
|
219
230
|
try {
|
|
220
231
|
await waitForCondition(async () => await this.queryAppState(appId) <= APP_STATE.NOT_RUNNING,
|
|
221
232
|
{waitMs: timeout, intervalMs: 100});
|