appium-android-driver 4.52.1 → 4.53.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.
@@ -33,6 +33,20 @@ function parseContainerPath(remotePath) {
33
33
  return [match[1], _path.default.posix.resolve(`/data/data/${match[1]}`, match[2])];
34
34
  }
35
35
 
36
+ async function scanMedia(adb, remotePath) {
37
+ _logger.default.debug(`Performing media scan of '${remotePath}'`);
38
+
39
+ try {
40
+ if ((await adb.getApiLevel()) >= 29) {
41
+ await adb.scanMedia(remotePath);
42
+ } else {
43
+ await adb.shell(['am', 'broadcast', '-a', ANDROID_MEDIA_RESCAN_INTENT, '-d', `file://${remotePath}`]);
44
+ }
45
+ } catch (e) {
46
+ _logger.default.warn(`Ignoring an unexpected error upon media scanning of '${remotePath}': ${e.stderr || e.message}`);
47
+ }
48
+ }
49
+
36
50
  function escapePath(p) {
37
51
  return p.replace(/'/g, `\\'`);
38
52
  }
@@ -116,14 +130,7 @@ commands.pushFile = async function pushFile(remotePath, base64Data) {
116
130
  }
117
131
  } else {
118
132
  await this.adb.push(localFile, remotePath);
119
-
120
- _logger.default.info('After pushing media file, broadcasting media scan intent');
121
-
122
- try {
123
- await this.adb.shell(['am', 'broadcast', '-a', ANDROID_MEDIA_RESCAN_INTENT, '-d', `file://${remotePath}`]);
124
- } catch (e) {
125
- _logger.default.warn(`Got error broadcasting media scan intent: ${e.message}; ignoring`);
126
- }
133
+ await scanMedia(this.adb, remotePath);
127
134
  }
128
135
  } finally {
129
136
  if (await _appiumSupport.fs.exists(localFile)) {
@@ -232,4 +239,4 @@ var _default = commands;
232
239
  exports.default = _default;require('source-map-support').install();
233
240
 
234
241
 
235
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9maWxlLWFjdGlvbnMuanMiXSwibmFtZXMiOlsiQ09OVEFJTkVSX1BBVEhfTUFSS0VSIiwiQ09OVEFJTkVSX1BBVEhfUEFUVEVSTiIsIlJlZ0V4cCIsIkFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCIsImNvbW1hbmRzIiwicGFyc2VDb250YWluZXJQYXRoIiwicmVtb3RlUGF0aCIsIm1hdGNoIiwiZXhlYyIsImxvZyIsImVycm9yQW5kVGhyb3ciLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsInRtcERlc3RpbmF0aW9uIiwic3RhcnRzV2l0aCIsInBhY2thZ2VJZCIsInBhdGhJbkNvbnRhaW5lciIsImRlYnVnIiwiYmFzZW5hbWUiLCJhZGIiLCJzaGVsbCIsImUiLCJtZXNzYWdlIiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJwdXNoRmlsZSIsImJhc2U2NERhdGEiLCJfIiwiaXNBcnJheSIsIkJ1ZmZlciIsImZyb20iLCJjb250ZW50Iiwid3JpdGVGaWxlIiwiZGlybmFtZSIsInB1c2giLCJpbmZvIiwid2FybiIsInB1bGxGb2xkZXIiLCJsb2NhbEZvbGRlciIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsImRlbGV0ZUZpbGVPckZvbGRlciIsInBlcmZvcm1SZW1vdGVGc0NoZWNrIiwib3AiLCJydW5BcyIsInBhc3NGbGFnIiwiY2hlY2tDbWQiLCJmdWxsQ21kIiwiaW5jbHVkZXMiLCJpZ24iLCJpc0ZpbGUiLCJpc0RpciIsImlzUHJlc2VudCIsImRzdFBhdGgiLCJwa2dJZCIsImV4cGVjdHNGaWxlIiwibW9iaWxlRGVsZXRlRmlsZSIsIm9wdHMiXSwibWFwcGluZ3Mi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ZTJELE9BQVEsbUJBQTFDO0FBQ0Q7O0FBRUQsTUFBSUMsS0FBSixFQUFXO0FBQ1QsVUFBTTdDLEdBQUcsQ0FBQ0MsS0FBSixDQUNKLENBQUMsUUFBRCxFQUFXNEMsS0FBWCxFQUFtQixRQUFPQyxXQUFXLEdBQUcsRUFBSCxHQUFRLEdBQUksS0FBSXpELFVBQVUsQ0FBQ3VELE9BQUQsQ0FBVSxHQUF6RSxDQURJLENBQU47QUFFRCxHQUhELE1BR087QUFDTCxVQUFNNUMsR0FBRyxDQUFDQyxLQUFKLENBQVUsQ0FBQyxJQUFELEVBQVEsS0FBSTZDLFdBQVcsR0FBRyxFQUFILEdBQVEsR0FBSSxFQUFuQyxFQUFzQ0YsT0FBdEMsQ0FBVixDQUFOO0FBQ0Q7O0FBQ0QsTUFBSSxNQUFNRCxTQUFTLENBQUNDLE9BQUQsRUFBVUMsS0FBVixDQUFuQixFQUFxQztBQUNuQzdELG9CQUFJQyxhQUFKLENBQW1CLGdCQUFlMkQsT0FBUSxzQ0FBeEIsR0FDZixpQkFESDtBQUVEOztBQUNELFNBQU8sSUFBUDtBQUNEOztBQWtCRGpFLFFBQVEsQ0FBQ29FLGdCQUFULEdBQTRCLGVBQWVBLGdCQUFmLENBQWlDQyxJQUFJLEdBQUcsRUFBeEMsRUFBNEM7QUFDdEUsUUFBTTtBQUFDbkUsSUFBQUE7QUFBRCxNQUFlbUUsSUFBckI7O0FBQ0EsTUFBSSxDQUFDbkUsVUFBTCxFQUFpQjtBQUNmRyxvQkFBSUMsYUFBSixDQUFtQix3Q0FBbkI7QUFDRDs7QUFDRCxNQUFJSixVQUFVLENBQUNZLFFBQVgsQ0FBb0IsR0FBcEIsQ0FBSixFQUE4QjtBQUM1QlQsb0JBQUlDLGFBQUosQ0FBbUIsd0VBQUQsR0FDQyxJQUFHSixVQUFXLG9CQURqQztBQUVEOztBQUNELFNBQU8sTUFBTW1ELGtCQUFrQixDQUFDLEtBQUtoQyxHQUFOLEVBQVduQixVQUFYLENBQS9CO0FBQ0QsQ0FWRDs7ZUFhZUYsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgemlwLCB0ZW1wRGlyfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuXG5jb25zdCBDT05UQUlORVJfUEFUSF9NQVJLRVIgPSAnQCc7XG4vLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL1BMZEIwRy8yXG5jb25zdCBDT05UQUlORVJfUEFUSF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7Q09OVEFJTkVSX1BBVEhfTUFSS0VSfShbXi9dKykvKC4rKWApO1xuY29uc3QgQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UID0gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9TQ0FOTkVSX1NDQU5fRklMRSc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBQYXJzZXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGZyb20gdGhlIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIHByZWZvcm1hdHRlZCByZW1vdGUgcGF0aCwgd2hpY2ggbG9va3MgbGlrZVxuICogYEBteS5hcHAuaWQvbXkvcGF0aGBcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSwgd2hlcmUgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHBhcnNlZCBwYWNrYWdlXG4gKiBpZGVudGlmaWVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uIHBhdGggaW5zaWRlIHRoZSBwYWNrYWdlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRhaW5lclBhdGggKHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgbWF0Y2ggPSBDT05UQUlORVJfUEFUSF9QQVRURVJOLmV4ZWMocmVtb3RlUGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgSXQgaXMgZXhwZWN0ZWQgdGhhdCBwYWNrYWdlIGlkZW50aWZpZXIgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHJlbGF0aXZlIHBhdGggd2l0aCBhIHNpbmdsZSBzbGFzaC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIFttYXRjaFsxXSwgcGF0aC5wb3NpeC5yZXNvbHZlKGAvZGF0YS9kYXRhLyR7bWF0Y2hbMV19YCwgbWF0Y2hbMl0pXTtcbn1cblxuLyoqXG4gKiBBIHNtYWxsIGhlbHBlciwgd2hpY2ggZXNjYXBlcyBzaW5nbGUgcXVvdGVzIGluIHBhdGhzLFxuICogc28gdGhleSBhcmUgc2FmZSB0byBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIG9mIHNoZWxsIGNvbW1hbmRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgVGhlIGluaXRpYWwgcmVtb3RlIHBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlc2NhcGVkIHBhdGggdmFsdWVcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUGF0aCAocCkge1xuICByZXR1cm4gcC5yZXBsYWNlKC8nL2csIGBcXFxcJ2ApO1xufVxuXG4vKipcbiAqIFB1bGxzIGEgcmVtb3RlIGZpbGUgZnJvbSB0aGUgZGV2aWNlLlxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGFuIGl0ZW0gaW5zaWRlIGFwcCBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHB1bGxlZCBmaWxlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHB1bGwgb3BlcmF0aW9uIGZhaWxlZFxuICovXG5jb21tYW5kcy5wdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxGaWxlIChyZW1vdGVQYXRoKSB7XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgSXQgaXMgZXhwZWN0ZWQgdGhhdCByZW1vdGUgcGF0aCBwb2ludHMgdG8gYSBmaWxlIGFuZCBub3QgdG8gYSBmb2xkZXIuIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIGlmIChyZW1vdGVQYXRoLnN0YXJ0c1dpdGgoQ09OVEFJTkVSX1BBVEhfTUFSS0VSKSkge1xuICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgbG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBXaWxsIGdldCB0aGUgZGF0YSBmcm9tICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgdG1wRGVzdGluYXRpb24gPSBgL2RhdGEvbG9jYWwvdG1wLyR7cGF0aC5wb3NpeC5iYXNlbmFtZShwYXRoSW5Db250YWluZXIpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfScgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9J2BcbiAgICAgIF0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWNjZXNzIHRoZSBjb250YWluZXIgb2YgJyR7cGFja2FnZUlkfScgYXBwbGljYXRpb24uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGxvY2FsRmlsZSA9IGF3YWl0IHRlbXBEaXIucGF0aCh7cHJlZml4OiAnYXBwaXVtJywgc3VmZml4OiAnLnRtcCd9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKHRtcERlc3RpbmF0aW9uIHx8IHJlbW90ZVBhdGgsIGxvY2FsRmlsZSk7XG4gICAgcmV0dXJuIChhd2FpdCB1dGlsLnRvSW5NZW1vcnlCYXNlNjQobG9jYWxGaWxlKSkudG9TdHJpbmcoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgICBpZiAodG1wRGVzdGluYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncm0nLCAnLWYnLCB0bXBEZXN0aW5hdGlvbl0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQdXNoZWQgdGhlIGdpdmVuIGRhdGEgdG8gYSBmaWxlIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKiBJdCBpcyByZXF1aXJlZCwgdGhhdCBhIHBhY2thZ2UgaGFzIGRlYnVnZ2luZyBmbGFnIGVuYWJsZWRcbiAqIGluIG9yZGVyIHRvIGFjY2VzcyBpdHMgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGUgb3JcbiAqIGEgZmlsZSBpbnNpZGUgYSBwYWNrYWdlIGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgQmFzZTY0IGVuY29kZWQgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZVxuICogcmVtb3RlIGZpbGUuIFRoZSByZW1vdGUgZmlsZSB3aWxsIGJlIHNpbGVudGx5IG92ZXJyaWRkZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHB1c2hpbmcgdGhlIGRhdGFcbiAqL1xuY29tbWFuZHMucHVzaEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdXNoRmlsZSAocmVtb3RlUGF0aCwgYmFzZTY0RGF0YSkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIGlmIChfLmlzQXJyYXkoYmFzZTY0RGF0YSkpIHtcbiAgICAvLyBzb21lIGNsaWVudHMgKGFoZW0pIGphdmEsIHNlbmQgYSBieXRlIGFycmF5IGVuY29kaW5nIHV0ZjggY2hhcmFjdGVyc1xuICAgIC8vIGluc3RlYWQgb2YgYSBzdHJpbmcsIHdoaWNoIHdvdWxkIGJlIGluZmluaXRlbHkgYmV0dGVyIVxuICAgIGJhc2U2NERhdGEgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhKS50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhLCAnYmFzZTY0Jyk7XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvY2FsRmlsZSwgY29udGVudC50b1N0cmluZygnYmluYXJ5JyksICdiaW5hcnknKTtcbiAgICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgICBsb2cuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGlkZW50aWZpZXIgJyR7cGFja2FnZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofScuIFdpbGwgcHV0IHRoZSBkYXRhIGludG8gJyR7cGF0aEluQ29udGFpbmVyfSdgKTtcbiAgICAgIHRtcERlc3RpbmF0aW9uID0gYC9kYXRhL2xvY2FsL3RtcC8ke3BhdGgucG9zaXguYmFzZW5hbWUocGF0aEluQ29udGFpbmVyKX1gO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoXG4gICAgICAgICAgWydydW4tYXMnLCBwYWNrYWdlSWQsIGBta2RpciAtcCAnJHtlc2NhcGVQYXRoKHBhdGgucG9zaXguZGlybmFtZShwYXRoSW5Db250YWluZXIpKX0nYF1cbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGB0b3VjaCAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BdKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydydW4tYXMnLCBwYWNrYWdlSWQsIGBjaG1vZCA3NzcgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCB0bXBEZXN0aW5hdGlvbik7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICAgIGBjcCAtZiAnJHtlc2NhcGVQYXRoKHRtcERlc3RpbmF0aW9uKX0nICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYFxuICAgICAgICBdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwYWNrYWdlSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkYiBwdXNoIGNyZWF0ZXMgZm9sZGVycyBhbmQgb3ZlcndyaXRlcyBleGlzdGluZyBmaWxlcy5cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCByZW1vdGVQYXRoKTtcblxuICAgICAgLy8gaWYgd2UgaGF2ZSBwdXNoZWQgYSBmaWxlLCBpdCBtaWdodCBiZSBhIG1lZGlhIGZpbGUsIHNvIGVuc3VyZSB0aGF0XG4gICAgICAvLyBhcHBzIGtub3cgYWJvdXQgaXRcbiAgICAgIGxvZy5pbmZvKCdBZnRlciBwdXNoaW5nIG1lZGlhIGZpbGUsIGJyb2FkY2FzdGluZyBtZWRpYSBzY2FuIGludGVudCcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydhbScsICdicm9hZGNhc3QnLCAnLWEnLFxuICAgICAgICAgIEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCwgJy1kJywgYGZpbGU6Ly8ke3JlbW90ZVBhdGh9YF0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cud2FybihgR290IGVycm9yIGJyb2FkY2FzdGluZyBtZWRpYSBzY2FuIGludGVudDogJHtlLm1lc3NhZ2V9OyBpZ25vcmluZ2ApO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgICBpZiAodG1wRGVzdGluYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncm0nLCAnLWYnLCB0bXBEZXN0aW5hdGlvbl0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQdWxscyB0aGUgd2hvbGUgZm9sZGVyIGZyb20gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIGEgZm9sZGVyIG9uIHRoZVxuICogcmVtb3RlIGRldmljZSBvciBhIGZvbGRlciBpbnNpZGUgYW4gYXBwbGljYXRpb24gYnVuZGxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBhbmQgemlwcGVkIGNvbnRlbnQgb2YgdGhlIGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgZ2V0dGluZyB0aGUgZm9sZGVyIGNvbnRlbnRcbiAqL1xuY29tbWFuZHMucHVsbEZvbGRlciA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxGb2xkZXIgKHJlbW90ZVBhdGgpIHtcbiAgbGV0IGxvY2FsRm9sZGVyID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nfSk7XG4gIGF3YWl0IHRoaXMuYWRiLnB1bGwocmVtb3RlUGF0aCwgbG9jYWxGb2xkZXIpO1xuICByZXR1cm4gKGF3YWl0IHppcC50b0luTWVtb3J5WmlwKGxvY2FsRm9sZGVyLCB7XG4gICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gIH0pKS50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBEZWxldGVzIHRoZSBnaXZlbiBmb2xkZXIgb3IgZmlsZSBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlclxuICogb3IgZmlsZSAoZm9sZGVyIG5hbWVzIG11c3QgZW5kIHdpdGggYSBzaW5nbGUgc2xhc2gpXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIHJlbW90ZSBwYXRoIGlzIGludmFsaWQgb3JcbiAqIHRoZSBwYWNrYWdlIGNvbnRlbnQgY2Fubm90IGJlIGFjY2Vzc2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgaXRlbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSByZW1vdGUgcGF0aCBpcyB2YWxpZCwgYnV0IHRoZSByZW1vdGUgcGF0aCBkb2VzIG5vdCBleGlzdFxuICogdGhpcyBmdW5jdGlvbiByZXR1cm4gYGZhbHNlYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRmlsZU9yRm9sZGVyIChhZGIsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgcGVyZm9ybVJlbW90ZUZzQ2hlY2sgPSBhc3luYyAocCwgb3AsIHJ1bkFzID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhc3NGbGFnID0gJ19fUEFTU19fJztcbiAgICBjb25zdCBjaGVja0NtZCA9IGBbIC0ke29wfSAnJHtlc2NhcGVQYXRoKHApfScgXSAmJiBlY2hvICR7cGFzc0ZsYWd9YDtcbiAgICBjb25zdCBmdWxsQ21kID0gcnVuQXMgPyBgcnVuLWFzICR7cnVuQXN9ICR7Y2hlY2tDbWR9YCA6IGNoZWNrQ21kO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlcyhhd2FpdCBhZGIuc2hlbGwoW2Z1bGxDbWRdKSwgcGFzc0ZsYWcpO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNGaWxlID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2YnLCBydW5Bcyk7XG4gIGNvbnN0IGlzRGlyID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2QnLCBydW5Bcyk7XG4gIGNvbnN0IGlzUHJlc2VudCA9IGFzeW5jIChwLCBydW5BcyA9IG51bGwpID0+IGF3YWl0IHBlcmZvcm1SZW1vdGVGc0NoZWNrKHAsICdlJywgcnVuQXMpO1xuXG4gIGxldCBkc3RQYXRoID0gcmVtb3RlUGF0aDtcbiAgbGV0IHBrZ0lkID0gbnVsbDtcbiAgaWYgKHJlbW90ZVBhdGguc3RhcnRzV2l0aChDT05UQUlORVJfUEFUSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGlkZW50aWZpZXIgJyR7cGFja2FnZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofSdgKTtcbiAgICBkc3RQYXRoID0gcGF0aEluQ29udGFpbmVyO1xuICAgIHBrZ0lkID0gcGFja2FnZUlkO1xuICB9XG5cbiAgaWYgKHBrZ0lkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3J1bi1hcycsIHBrZ0lkLCAnbHMnXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwa2dJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGRvZXMgbm90IGV4aXN0LiBQZXJoYXBzLCBhbHJlYWR5IGRlbGV0ZWQ/YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXhwZWN0c0ZpbGUgPSAhcmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpO1xuICBpZiAoZXhwZWN0c0ZpbGUgJiYgIWF3YWl0IGlzRmlsZShkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGlzIG5vdCBhIGZpbGVgKTtcbiAgfSBlbHNlIGlmICghZXhwZWN0c0ZpbGUgJiYgIWF3YWl0IGlzRGlyKGRzdFBhdGgsIHBrZ0lkKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZm9sZGVyYCk7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoXG4gICAgICBbJ3J1bi1hcycsIHBrZ0lkLCBgcm0gLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9ICcke2VzY2FwZVBhdGgoZHN0UGF0aCl9J2BdKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoWydybScsIGAtZiR7ZXhwZWN0c0ZpbGUgPyAnJyA6ICdyJ31gLCBkc3RQYXRoXSk7XG4gIH1cbiAgaWYgKGF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIHN0aWxsIGV4aXN0cyBhZnRlciBiZWluZyBkZWxldGVkLiBgICtcbiAgICAgIGBJcyBpdCB3cml0YWJsZT9gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWxldGVGaWxlT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIGZpbGUgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZSAoZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvcGF0aC9pbi9idW5kbGVgKVxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0RlbGV0ZUZpbGVPcHRzfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgZmlsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSBwYXRoIHRvIGEgcmVtb3RlIGZpbGUgaXMgdmFsaWQsIGJ1dCB0aGUgZmlsZSBpdHNlbGYgZG9lcyBub3QgZXhpc3RcbiAqIHRoZW4gYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXJndW1lbnQgaXMgaW52YWxpZCBvciB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGVcbiAqIGRlbGV0aW5nIHRoZSBmaWxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlbGV0ZUZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEZWxldGVGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3JlbW90ZVBhdGh9ID0gb3B0cztcbiAgaWYgKCFyZW1vdGVQYXRoKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSAncmVtb3RlUGF0aCcgYXJndW1lbnQgaXMgbWFuZGF0b3J5YCk7XG4gIH1cbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZvbGRlciBhbmQgbm90IHRvIGEgZmlsZS4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IGRlbGV0ZUZpbGVPckZvbGRlcih0aGlzLmFkYiwgcmVtb3RlUGF0aCk7XG59O1xuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9maWxlLWFjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
242
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9maWxlLWFjdGlvbnMuanMiXSwibmFtZXMiOlsiQ09OVEFJTkVSX1BBVEhfTUFSS0VSIiwiQ09OVEFJTkVSX1BBVEhfUEFUVEVSTiIsIlJlZ0V4cCIsIkFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCIsImNvbW1hbmRzIiwicGFyc2VDb250YWluZXJQYXRoIiwicmVtb3RlUGF0aCIsIm1hdGNoIiwiZXhlYyIsImxvZyIsImVycm9yQW5kVGhyb3ciLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsInRtcERlc3RpbmF0aW9uIiwic3RhcnRzV2l0aCIsInBhY2thZ2VJZCIsInBhdGhJbkNvbnRhaW5lciIsImJhc2VuYW1lIiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJwdXNoRmlsZSIsImJhc2U2NERhdGEiLCJfIiwiaXNBcnJheSIsIkJ1ZmZlciIsImZyb20iLCJjb250ZW50Iiwid3JpdGVGaWxlIiwiZGlybmFtZSIsInB1c2giLCJwdWxsRm9sZGVyIiwibG9jYWxGb2xkZXIiLCJ6aXAiLCJ0b0luTWVtb3J5WmlwIiwiZW5jb2RlVG9CYXNlNjQiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJt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LEVBQWlCO0FBQ2ZHLG9CQUFJQyxhQUFKLENBQW1CLHdDQUFuQjtBQUNEOztBQUNELE1BQUlKLFVBQVUsQ0FBQ3FCLFFBQVgsQ0FBb0IsR0FBcEIsQ0FBSixFQUE4QjtBQUM1QmxCLG9CQUFJQyxhQUFKLENBQW1CLHdFQUFELEdBQ0MsSUFBR0osVUFBVyxvQkFEakM7QUFFRDs7QUFDRCxTQUFPLE1BQU1xRCxrQkFBa0IsQ0FBQyxLQUFLNUMsR0FBTixFQUFXVCxVQUFYLENBQS9CO0FBQ0QsQ0FWRDs7ZUFhZUYsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgemlwLCB0ZW1wRGlyfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuXG5jb25zdCBDT05UQUlORVJfUEFUSF9NQVJLRVIgPSAnQCc7XG4vLyBodHRwczovL3JlZ2V4MTAxLmNvbS9yL1BMZEIwRy8yXG5jb25zdCBDT05UQUlORVJfUEFUSF9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiR7Q09OVEFJTkVSX1BBVEhfTUFSS0VSfShbXi9dKykvKC4rKWApO1xuY29uc3QgQU5EUk9JRF9NRURJQV9SRVNDQU5fSU5URU5UID0gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NRURJQV9TQ0FOTkVSX1NDQU5fRklMRSc7XG5cblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBQYXJzZXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGZyb20gdGhlIGdpdmVuIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIHByZWZvcm1hdHRlZCByZW1vdGUgcGF0aCwgd2hpY2ggbG9va3MgbGlrZVxuICogYEBteS5hcHAuaWQvbXkvcGF0aGBcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSwgd2hlcmUgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHBhcnNlZCBwYWNrYWdlXG4gKiBpZGVudGlmaWVyIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uIHBhdGggaW5zaWRlIHRoZSBwYWNrYWdlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRhaW5lclBhdGggKHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgbWF0Y2ggPSBDT05UQUlORVJfUEFUSF9QQVRURVJOLmV4ZWMocmVtb3RlUGF0aCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgSXQgaXMgZXhwZWN0ZWQgdGhhdCBwYWNrYWdlIGlkZW50aWZpZXIgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHJlbGF0aXZlIHBhdGggd2l0aCBhIHNpbmdsZSBzbGFzaC4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIFttYXRjaFsxXSwgcGF0aC5wb3NpeC5yZXNvbHZlKGAvZGF0YS9kYXRhLyR7bWF0Y2hbMV19YCwgbWF0Y2hbMl0pXTtcbn1cblxuLyoqXG4gKiBTY2FucyB0aGUgZ2l2ZW4gZmlsZS9mb2xkZXIgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqIGFuZCBhZGRzIG1hdGNoaW5nIGl0ZW1zIHRvIHRoZSBkZXZpY2UncyBtZWRpYSBsaWJyYXJ5LlxuICogRXhjZXB0aW9ucyBhcmUgaWdub3JlZCBhbmQgd3JpdHRlbiBpbnRvIHRoZSBsb2cuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBBREIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmaWxlL2ZvbGRlciBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5NZWRpYSAoYWRiLCByZW1vdGVQYXRoKSB7XG4gIGxvZy5kZWJ1ZyhgUGVyZm9ybWluZyBtZWRpYSBzY2FuIG9mICcke3JlbW90ZVBhdGh9J2ApO1xuICB0cnkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNjE4NFxuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA+PSAyOSkge1xuICAgICAgYXdhaXQgYWRiLnNjYW5NZWRpYShyZW1vdGVQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAgICctYScsIEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCxcbiAgICAgICAgJy1kJywgYGZpbGU6Ly8ke3JlbW90ZVBhdGh9YFxuICAgICAgXSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLndhcm4oYElnbm9yaW5nIGFuIHVuZXhwZWN0ZWQgZXJyb3IgdXBvbiBtZWRpYSBzY2FubmluZyBvZiAnJHtyZW1vdGVQYXRofSc6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogQSBzbWFsbCBoZWxwZXIsIHdoaWNoIGVzY2FwZXMgc2luZ2xlIHF1b3RlcyBpbiBwYXRocyxcbiAqIHNvIHRoZXkgYXJlIHNhZmUgdG8gYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyBvZiBzaGVsbCBjb21tYW5kc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwIFRoZSBpbml0aWFsIHJlbW90ZSBwYXRoXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZXNjYXBlZCBwYXRoIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVBhdGggKHApIHtcbiAgcmV0dXJuIHAucmVwbGFjZSgvJy9nLCBgXFxcXCdgKTtcbn1cblxuLyoqXG4gKiBQdWxscyBhIHJlbW90ZSBmaWxlIGZyb20gdGhlIGRldmljZS5cbiAqIEl0IGlzIHJlcXVpcmVkLCB0aGF0IGEgcGFja2FnZSBoYXMgZGVidWdnaW5nIGZsYWcgZW5hYmxlZFxuICogaW4gb3JkZXIgdG8gYWNjZXNzIGl0cyBmaWxlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIHRoZSByZW1vdGUgZmlsZVxuICogb3IgYSBzcGVjaWFsbHkgZm9ybWF0dGVkIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhbiBpdGVtIGluc2lkZSBhcHAgYnVuZGxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgZW5jb2RlZCBjb250ZW50IG9mIHRoZSBwdWxsZWQgZmlsZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwdWxsIG9wZXJhdGlvbiBmYWlsZWRcbiAqL1xuY29tbWFuZHMucHVsbEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdWxsRmlsZSAocmVtb3RlUGF0aCkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYEl0IGlzIGV4cGVjdGVkIHRoYXQgcmVtb3RlIHBhdGggcG9pbnRzIHRvIGEgZmlsZSBhbmQgbm90IHRvIGEgZm9sZGVyLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBsZXQgdG1wRGVzdGluYXRpb24gPSBudWxsO1xuICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIGxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9Jy4gV2lsbCBnZXQgdGhlIGRhdGEgZnJvbSAnJHtwYXRoSW5Db250YWluZXJ9J2ApO1xuICAgIHRtcERlc3RpbmF0aW9uID0gYC9kYXRhL2xvY2FsL3RtcC8ke3BhdGgucG9zaXguYmFzZW5hbWUocGF0aEluQ29udGFpbmVyKX1gO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3J1bi1hcycsIHBhY2thZ2VJZCwgYGNobW9kIDc3NyAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BdKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtcbiAgICAgICAgJ3J1bi1hcycsIHBhY2thZ2VJZCxcbiAgICAgICAgYGNwIC1mICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nICcke2VzY2FwZVBhdGgodG1wRGVzdGluYXRpb24pfSdgXG4gICAgICBdKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjY2VzcyB0aGUgY29udGFpbmVyIG9mICcke3BhY2thZ2VJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbCh0bXBEZXN0aW5hdGlvbiB8fCByZW1vdGVQYXRoLCBsb2NhbEZpbGUpO1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsRmlsZSkpLnRvU3RyaW5nKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKGF3YWl0IGZzLmV4aXN0cyhsb2NhbEZpbGUpKSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobG9jYWxGaWxlKTtcbiAgICB9XG4gICAgaWYgKHRtcERlc3RpbmF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ3JtJywgJy1mJywgdG1wRGVzdGluYXRpb25dKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUHVzaGVkIHRoZSBnaXZlbiBkYXRhIHRvIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZVxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlIG9yXG4gKiBhIGZpbGUgaW5zaWRlIGEgcGFja2FnZSBidW5kbGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjREYXRhIEJhc2U2NCBlbmNvZGVkIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGVcbiAqIHJlbW90ZSBmaWxlLiBUaGUgcmVtb3RlIGZpbGUgd2lsbCBiZSBzaWxlbnRseSBvdmVycmlkZGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBwdXNoaW5nIHRoZSBkYXRhXG4gKi9cbmNvbW1hbmRzLnB1c2hGaWxlID0gYXN5bmMgZnVuY3Rpb24gcHVzaEZpbGUgKHJlbW90ZVBhdGgsIGJhc2U2NERhdGEpIHtcbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZpbGUgYW5kIG5vdCB0byBhIGZvbGRlci4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgY29uc3QgbG9jYWxGaWxlID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nLCBzdWZmaXg6ICcudG1wJ30pO1xuICBpZiAoXy5pc0FycmF5KGJhc2U2NERhdGEpKSB7XG4gICAgLy8gc29tZSBjbGllbnRzIChhaGVtKSBqYXZhLCBzZW5kIGEgYnl0ZSBhcnJheSBlbmNvZGluZyB1dGY4IGNoYXJhY3RlcnNcbiAgICAvLyBpbnN0ZWFkIG9mIGEgc3RyaW5nLCB3aGljaCB3b3VsZCBiZSBpbmZpbml0ZWx5IGJldHRlciFcbiAgICBiYXNlNjREYXRhID0gQnVmZmVyLmZyb20oYmFzZTY0RGF0YSkudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuICBjb25zdCBjb250ZW50ID0gQnVmZmVyLmZyb20oYmFzZTY0RGF0YSwgJ2Jhc2U2NCcpO1xuICBsZXQgdG1wRGVzdGluYXRpb24gPSBudWxsO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShsb2NhbEZpbGUsIGNvbnRlbnQudG9TdHJpbmcoJ2JpbmFyeScpLCAnYmluYXJ5Jyk7XG4gICAgaWYgKHJlbW90ZVBhdGguc3RhcnRzV2l0aChDT05UQUlORVJfUEFUSF9NQVJLRVIpKSB7XG4gICAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgICAgbG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBXaWxsIHB1dCB0aGUgZGF0YSBpbnRvICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFxuICAgICAgICAgIFsncnVuLWFzJywgcGFja2FnZUlkLCBgbWtkaXIgLXAgJyR7ZXNjYXBlUGF0aChwYXRoLnBvc2l4LmRpcm5hbWUocGF0aEluQ29udGFpbmVyKSl9J2BdXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgdG91Y2ggJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5wdXNoKGxvY2FsRmlsZSwgdG1wRGVzdGluYXRpb24pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICAgJ3J1bi1hcycsIHBhY2thZ2VJZCxcbiAgICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9JyAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BcbiAgICAgICAgXSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWNjZXNzIHRoZSBjb250YWluZXIgb2YgJyR7cGFja2FnZUlkfScgYXBwbGljYXRpb24uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgSXMgdGhlIGFwcGxpY2F0aW9uIGluc3RhbGxlZCBhbmQgaGFzICdkZWJ1Z2dhYmxlJyBidWlsZCBvcHRpb24gc2V0IHRvIHRydWU/IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhZGIgcHVzaCBjcmVhdGVzIGZvbGRlcnMgYW5kIG92ZXJ3cml0ZXMgZXhpc3RpbmcgZmlsZXMuXG4gICAgICBhd2FpdCB0aGlzLmFkYi5wdXNoKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCk7XG5cbiAgICAgIC8vIGlmIHdlIGhhdmUgcHVzaGVkIGEgZmlsZSwgaXQgbWlnaHQgYmUgYSBtZWRpYSBmaWxlLCBzbyBlbnN1cmUgdGhhdFxuICAgICAgLy8gYXBwcyBrbm93IGFib3V0IGl0XG4gICAgICBhd2FpdCBzY2FuTWVkaWEodGhpcy5hZGIsIHJlbW90ZVBhdGgpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgICBpZiAodG1wRGVzdGluYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncm0nLCAnLWYnLCB0bXBEZXN0aW5hdGlvbl0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQdWxscyB0aGUgd2hvbGUgZm9sZGVyIGZyb20gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCBUaGUgZnVsbCBwYXRoIHRvIGEgZm9sZGVyIG9uIHRoZVxuICogcmVtb3RlIGRldmljZSBvciBhIGZvbGRlciBpbnNpZGUgYW4gYXBwbGljYXRpb24gYnVuZGxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBhbmQgemlwcGVkIGNvbnRlbnQgb2YgdGhlIGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgZ2V0dGluZyB0aGUgZm9sZGVyIGNvbnRlbnRcbiAqL1xuY29tbWFuZHMucHVsbEZvbGRlciA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxGb2xkZXIgKHJlbW90ZVBhdGgpIHtcbiAgbGV0IGxvY2FsRm9sZGVyID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nfSk7XG4gIGF3YWl0IHRoaXMuYWRiLnB1bGwocmVtb3RlUGF0aCwgbG9jYWxGb2xkZXIpO1xuICByZXR1cm4gKGF3YWl0IHppcC50b0luTWVtb3J5WmlwKGxvY2FsRm9sZGVyLCB7XG4gICAgZW5jb2RlVG9CYXNlNjQ6IHRydWUsXG4gIH0pKS50b1N0cmluZygpO1xufTtcblxuLyoqXG4gKiBEZWxldGVzIHRoZSBnaXZlbiBmb2xkZXIgb3IgZmlsZSBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlclxuICogb3IgZmlsZSAoZm9sZGVyIG5hbWVzIG11c3QgZW5kIHdpdGggYSBzaW5nbGUgc2xhc2gpXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIHJlbW90ZSBwYXRoIGlzIGludmFsaWQgb3JcbiAqIHRoZSBwYWNrYWdlIGNvbnRlbnQgY2Fubm90IGJlIGFjY2Vzc2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgaXRlbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSByZW1vdGUgcGF0aCBpcyB2YWxpZCwgYnV0IHRoZSByZW1vdGUgcGF0aCBkb2VzIG5vdCBleGlzdFxuICogdGhpcyBmdW5jdGlvbiByZXR1cm4gYGZhbHNlYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRmlsZU9yRm9sZGVyIChhZGIsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgcGVyZm9ybVJlbW90ZUZzQ2hlY2sgPSBhc3luYyAocCwgb3AsIHJ1bkFzID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhc3NGbGFnID0gJ19fUEFTU19fJztcbiAgICBjb25zdCBjaGVja0NtZCA9IGBbIC0ke29wfSAnJHtlc2NhcGVQYXRoKHApfScgXSAmJiBlY2hvICR7cGFzc0ZsYWd9YDtcbiAgICBjb25zdCBmdWxsQ21kID0gcnVuQXMgPyBgcnVuLWFzICR7cnVuQXN9ICR7Y2hlY2tDbWR9YCA6IGNoZWNrQ21kO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlcyhhd2FpdCBhZGIuc2hlbGwoW2Z1bGxDbWRdKSwgcGFzc0ZsYWcpO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNGaWxlID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2YnLCBydW5Bcyk7XG4gIGNvbnN0IGlzRGlyID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2QnLCBydW5Bcyk7XG4gIGNvbnN0IGlzUHJlc2VudCA9IGFzeW5jIChwLCBydW5BcyA9IG51bGwpID0+IGF3YWl0IHBlcmZvcm1SZW1vdGVGc0NoZWNrKHAsICdlJywgcnVuQXMpO1xuXG4gIGxldCBkc3RQYXRoID0gcmVtb3RlUGF0aDtcbiAgbGV0IHBrZ0lkID0gbnVsbDtcbiAgaWYgKHJlbW90ZVBhdGguc3RhcnRzV2l0aChDT05UQUlORVJfUEFUSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGlkZW50aWZpZXIgJyR7cGFja2FnZUlkfScgZnJvbSAnJHtyZW1vdGVQYXRofSdgKTtcbiAgICBkc3RQYXRoID0gcGF0aEluQ29udGFpbmVyO1xuICAgIHBrZ0lkID0gcGFja2FnZUlkO1xuICB9XG5cbiAgaWYgKHBrZ0lkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3J1bi1hcycsIHBrZ0lkLCAnbHMnXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwa2dJZH0nIGFwcGxpY2F0aW9uLiBgICtcbiAgICAgICAgYElzIHRoZSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgYW5kIGhhcyAnZGVidWdnYWJsZScgYnVpbGQgb3B0aW9uIHNldCB0byB0cnVlPyBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICBsb2cuaW5mbyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGRvZXMgbm90IGV4aXN0LiBQZXJoYXBzLCBhbHJlYWR5IGRlbGV0ZWQ/YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXhwZWN0c0ZpbGUgPSAhcmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpO1xuICBpZiAoZXhwZWN0c0ZpbGUgJiYgIWF3YWl0IGlzRmlsZShkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGlzIG5vdCBhIGZpbGVgKTtcbiAgfSBlbHNlIGlmICghZXhwZWN0c0ZpbGUgJiYgIWF3YWl0IGlzRGlyKGRzdFBhdGgsIHBrZ0lkKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZm9sZGVyYCk7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoXG4gICAgICBbJ3J1bi1hcycsIHBrZ0lkLCBgcm0gLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9ICcke2VzY2FwZVBhdGgoZHN0UGF0aCl9J2BdKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIuc2hlbGwoWydybScsIGAtZiR7ZXhwZWN0c0ZpbGUgPyAnJyA6ICdyJ31gLCBkc3RQYXRoXSk7XG4gIH1cbiAgaWYgKGF3YWl0IGlzUHJlc2VudChkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIHN0aWxsIGV4aXN0cyBhZnRlciBiZWluZyBkZWxldGVkLiBgICtcbiAgICAgIGBJcyBpdCB3cml0YWJsZT9gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWxldGVGaWxlT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIGZpbGUgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZSAoZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvcGF0aC9pbi9idW5kbGVgKVxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0RlbGV0ZUZpbGVPcHRzfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgZmlsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSBwYXRoIHRvIGEgcmVtb3RlIGZpbGUgaXMgdmFsaWQsIGJ1dCB0aGUgZmlsZSBpdHNlbGYgZG9lcyBub3QgZXhpc3RcbiAqIHRoZW4gYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXJndW1lbnQgaXMgaW52YWxpZCBvciB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGVcbiAqIGRlbGV0aW5nIHRoZSBmaWxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlbGV0ZUZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEZWxldGVGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3JlbW90ZVBhdGh9ID0gb3B0cztcbiAgaWYgKCFyZW1vdGVQYXRoKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSAncmVtb3RlUGF0aCcgYXJndW1lbnQgaXMgbWFuZGF0b3J5YCk7XG4gIH1cbiAgaWYgKHJlbW90ZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZvbGRlciBhbmQgbm90IHRvIGEgZmlsZS4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgYCcke3JlbW90ZVBhdGh9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IGRlbGV0ZUZpbGVPckZvbGRlcih0aGlzLmFkYiwgcmVtb3RlUGF0aCk7XG59O1xuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9maWxlLWFjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -30,6 +30,32 @@ function parseContainerPath (remotePath) {
30
30
  return [match[1], path.posix.resolve(`/data/data/${match[1]}`, match[2])];
31
31
  }
32
32
 
33
+ /**
34
+ * Scans the given file/folder on the remote device
35
+ * and adds matching items to the device's media library.
36
+ * Exceptions are ignored and written into the log.
37
+ *
38
+ * @param {ADB} adb ADB instance
39
+ * @param {string} remotePath The file/folder path on the remote device
40
+ */
41
+ async function scanMedia (adb, remotePath) {
42
+ log.debug(`Performing media scan of '${remotePath}'`);
43
+ try {
44
+ // https://github.com/appium/appium/issues/16184
45
+ if (await adb.getApiLevel() >= 29) {
46
+ await adb.scanMedia(remotePath);
47
+ } else {
48
+ await adb.shell([
49
+ 'am', 'broadcast',
50
+ '-a', ANDROID_MEDIA_RESCAN_INTENT,
51
+ '-d', `file://${remotePath}`
52
+ ]);
53
+ }
54
+ } catch (e) {
55
+ log.warn(`Ignoring an unexpected error upon media scanning of '${remotePath}': ${e.stderr || e.message}`);
56
+ }
57
+ }
58
+
33
59
  /**
34
60
  * A small helper, which escapes single quotes in paths,
35
61
  * so they are safe to be passed as arguments of shell commands
@@ -139,13 +165,7 @@ commands.pushFile = async function pushFile (remotePath, base64Data) {
139
165
 
140
166
  // if we have pushed a file, it might be a media file, so ensure that
141
167
  // apps know about it
142
- log.info('After pushing media file, broadcasting media scan intent');
143
- try {
144
- await this.adb.shell(['am', 'broadcast', '-a',
145
- ANDROID_MEDIA_RESCAN_INTENT, '-d', `file://${remotePath}`]);
146
- } catch (e) {
147
- log.warn(`Got error broadcasting media scan intent: ${e.message}; ignoring`);
148
- }
168
+ await scanMedia(this.adb, remotePath);
149
169
  }
150
170
  } finally {
151
171
  if (await fs.exists(localFile)) {
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "4.52.1",
12
+ "version": "4.53.0",
13
13
  "author": "appium",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {
@@ -36,14 +36,14 @@
36
36
  ],
37
37
  "dependencies": {
38
38
  "@babel/runtime": "^7.0.0",
39
- "appium-adb": "^8.16.0",
39
+ "appium-adb": "^8.17.0",
40
40
  "appium-base-driver": "^7.0.0",
41
41
  "appium-chromedriver": "^4.13.0",
42
42
  "appium-support": "^2.47.1",
43
43
  "asyncbox": "^2.8.0",
44
44
  "axios": "^0.x",
45
45
  "bluebird": "^3.4.7",
46
- "io.appium.settings": "^3.3.0",
46
+ "io.appium.settings": "^3.5.0",
47
47
  "jimp": "^0.16.1",
48
48
  "lodash": "^4.17.4",
49
49
  "lru-cache": "^6.0.0",