appium-android-driver 5.1.0 → 5.2.2

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.
@@ -598,7 +598,17 @@ helpers.pushSettingsApp = async function pushSettingsApp(adb, throwError = false
598
598
  return;
599
599
  }
600
600
 
601
- if ((await adb.getApiLevel()) <= 23) {
601
+ const apiLevel = await adb.getApiLevel();
602
+
603
+ if (apiLevel >= 29) {
604
+ try {
605
+ await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);
606
+ } catch (err) {
607
+ _logger.default.debug(err);
608
+ }
609
+ }
610
+
611
+ if (apiLevel <= 23) {
602
612
  const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];
603
613
 
604
614
  _logger.default.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);
@@ -901,4 +911,4 @@ var _default = helpers;
901
911
  exports.default = _default;require('source-map-support').install();
902
912
 
903
913
 
904
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2FuZHJvaWQtaGVscGVycy5qcyIsIm5hbWVzIjpbIlBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUIiwiQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSIsImNocm9tZSIsInBrZyIsImFjdGl2aXR5IiwiY2hyb21pdW0iLCJjaHJvbWViZXRhIiwiYnJvd3NlciIsImRlZmF1bHQiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWSIsIkVNVUxBVE9SX1BBVFRFUk4iLCJBUFBfU1RBVEUiLCJPYmplY3QiLCJmcmVlemUiLCJOT1RfSU5TVEFMTEVEIiwiTk9UX1JVTk5JTkciLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJhZGIiLCJuZXR3b3JrU3BlZWQiLCJfIiwidmFsdWVzIiwiTkVUV09SS19TUEVFRCIsImluY2x1ZGVzIiwibG9nZ2VyIiwid2FybiIsIkZVTEwiLCJwcmVwYXJlQXZkQXJncyIsIm9wdHMiLCJpc0hlYWRsZXNzIiwiYXZkQXJncyIsInJlc3VsdCIsImlzQXJyYXkiLCJwdXNoIiwidXRpbCIsInNoZWxsUGFyc2UiLCJ0b0NyZWRlbnRpYWxUeXBlIiwidW5sb2NrVHlwZSIsIlBJTl9VTkxPQ0siLCJQSU5fVU5MT0NLX0tFWV9FVkVOVCIsIlBBU1NXT1JEX1VOTE9DSyIsIlBBVFRFUk5fVU5MT0NLIiwiRXJyb3IiLCJoZWxwZXJzIiwiY3JlYXRlQmFzZUFEQiIsImFkYlBvcnQiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInJlbW90ZUFwcHNDYWNoZUxpbWl0IiwiYnVpbGRUb29sc1ZlcnNpb24iLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiYWxsb3dEZWxheUFkYiIsIkFEQiIsImNyZWF0ZUFEQiIsInByZXBhcmVFbXVsYXRvciIsImF2ZCIsImF2ZEVudiIsImVudiIsImxhbmd1YWdlIiwibG9jYWxlIiwiY291bnRyeSIsImF2ZExhdW5jaFRpbWVvdXQiLCJsYXVuY2hUaW1lb3V0IiwiYXZkUmVhZHlUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwiYXZkTmFtZSIsInJlcGxhY2UiLCJydW5uaW5nQVZEIiwiZ2V0UnVubmluZ0FWRCIsImFyZ3MiLCJkZWJ1ZyIsImtpbGxFbXVsYXRvciIsImxhdW5jaEFWRCIsImVuc3VyZURldmljZUxvY2FsZSIsInNjcmlwdCIsImlzU3RyaW5nIiwic2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IiwiZW5zdXJlQ3VycmVudExvY2FsZSIsIm1lc3NhZ2UiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJ1ZGlkIiwiZW1Qb3J0IiwiY3VyRGV2aWNlSWQiLCJlbXVsYXRvclBvcnQiLCJpbmZvIiwiZGV2aWNlcyIsImdldERldmljZXNXaXRoUmV0cnkiLCJtYXAiLCJlcnJvckFuZFRocm93IiwiZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyIsInBsYXRmb3JtVmVyc2lvbiIsInRyaW0iLCJzZW12ZXIiLCJjb2VyY2UiLCJhdmFpbERldmljZXMiLCJwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUiLCJkZXZpY2UiLCJzZXREZXZpY2VJZCIsInJhd0RldmljZU9TIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlT1MiLCJib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQiLCJ2YWxpZCIsImJvdGhWZXJzaW9uc0FyZVN0cmluZ3MiLCJ2ZXJzaW9uIiwidG9Mb3dlciIsIm1ham9yIiwibWlub3IiLCJndCIsImtleXMiLCJqb2luIiwic2V0RW11bGF0b3JQb3J0IiwidmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyIsImtleSIsIm5hbWUiLCJtYXRjaCIsImV4ZWMiLCJpbmRleCIsInN1YnN0cmluZyIsImdldExhdW5jaEluZm8iLCJhcHAiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXRBY3Rpdml0eSIsImFwa1BhY2thZ2UiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInJlc2V0QXBwIiwiZmFzdFJlc2V0IiwiZnVsbFJlc2V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiYXV0b0dyYW50UGVybWlzc2lvbnMiLCJhbGxvd1Rlc3RQYWNrYWdlcyIsImlzSW5zdGFsbGVkIiwiaXNBcHBJbnN0YWxsZWQiLCJmb3JjZVN0b3AiLCJpZ24iLCJvdXRwdXQiLCJjbGVhciIsInRvTG93ZXJDYXNlIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImVycm9yIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbCIsImdyYW50UGVybWlzc2lvbnMiLCJ0aW1lb3V0IiwiaW5zdGFsbEFwayIsImVuZm9yY2VBcHBJbnN0YWxsIiwiYXBwU3RhdGUiLCJ3YXNVbmluc3RhbGxlZCIsImluc3RhbGxPclVwZ3JhZGUiLCJlbmZvcmNlQ3VycmVudEJ1aWxkIiwiaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAiLCJBUFBfSU5TVEFMTF9TVEFURSIsImluc3RhbGxPdGhlckFwa3MiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwib3RoZXJBcHAiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYXBwUGFja2FnZXMiLCJmaWx0ZXJQYWNrYWdlcyIsImdldFRoaXJkUGFydHlQYWNrYWdlcyIsInBhY2thZ2VzU3RyaW5nIiwic2hlbGwiLCJhcHBQYWNrYWdlc0FycmF5Iiwic3BsaXQiLCJFT0wiLCJkaWZmZXJlbmNlIiwiZXJyIiwiaW5pdFVuaWNvZGVLZXlib2FyZCIsImRlZmF1bHRJTUUiLCJhcHBpdW1JTUUiLCJlbmFibGVJTUUiLCJzZXRJTUUiLCJzZXRNb2NrTG9jYXRpb25BcHAiLCJnZXRBcGlMZXZlbCIsImluc3RhbGxIZWxwZXJBcHAiLCJhcGtQYXRoIiwicGFja2FnZUlkIiwicmV0cnkiLCJyZXRyeUluc3RhbGxIZWxwZXJBcHAiLCJwdXNoU2V0dGluZ3NBcHAiLCJ0aHJvd0Vycm9yIiwic2V0dGluZ3NBcGtQYXRoIiwicHJvY2Vzc0V4aXN0cyIsInBlcm1zIiwieCIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJwdXNoU3RyaW5ncyIsInJlbW90ZURpciIsInN0cmluZ3NKc29uIiwicmVtb3RlRmlsZSIsInBhdGgiLCJwb3NpeCIsInJlc29sdmUiLCJyaW1yYWYiLCJwdWxsQXBrIiwidG1wRGlyIiwiaXNFbXB0eSIsImZzIiwiZXhpc3RzIiwic3RyaW5nc1RtcERpciIsImFwa1N0cmluZ3MiLCJsb2NhbFBhdGgiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJ1bmxvY2tXaXRoSGVscGVyQXBwIiwiZmlyc3RSdW4iLCJsYXVuY2hIZWxwZXIiLCJpc1NjcmVlbkxvY2tlZCIsImUiLCJkZWxheSIsInVubG9jayIsImRyaXZlciIsImNhcGFiaWxpdGllcyIsInVubG9ja0tleSIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiLCJ1bmxvY2tlciIsInZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIiwiRklOR0VSUFJJTlRfVU5MT0NLIiwiaXNOaWwiLCJpc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkIiwiZmFzdFVubG9jayIsImNyZWRlbnRpYWwiLCJjcmVkZW50aWFsVHlwZSIsInVubG9ja01ldGhvZCIsInBpblVubG9jayIsInBpblVubG9ja1dpdGhLZXlFdmVudCIsInBhc3N3b3JkVW5sb2NrIiwicGF0dGVyblVubG9jayIsImZpbmdlcnByaW50VW5sb2NrIiwidmVyaWZ5VW5sb2NrIiwidGltZW91dE1zIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJpbml0RGV2aWNlIiwic2tpcERldmljZUluaXRpYWxpemF0aW9uIiwibG9jYWxlU2NyaXB0IiwidW5pY29kZUtleWJvYXJkIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInNraXBVbmxvY2siLCJtb2NrTG9jYXRpb25BcHAiLCJza2lwTG9nY2F0Q2FwdHVyZSIsImxvZ2NhdEZvcm1hdCIsImxvZ2NhdEZpbHRlclNwZWNzIiwid2FpdEZvckRldmljZSIsInNob3VsZFRocm93RXJyb3IiLCJpc0VtdWxhdG9yIiwiaXNVbmRlZmluZWQiLCJzdGFydExvZ2NhdCIsImZvcm1hdCIsImZpbHRlclNwZWNzIiwicmVtb3ZlTnVsbFByb3BlcnRpZXMiLCJvYmoiLCJpc051bGwiLCJ0cnVuY2F0ZURlY2ltYWxzIiwibnVtYmVyIiwiZGlnaXRzIiwibXVsdGlwbGllciIsIk1hdGgiLCJwb3ciLCJhZGp1c3RlZE51bSIsInRydW5jYXRlZE51bSIsImlzQ2hyb21lQnJvd3NlciIsImdldENocm9tZVBrZyIsInJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyIsInNlcnZlciIsInNlc3Npb25JZCIsImlzRnVuY3Rpb24iLCJnZXRXZWJTb2NrZXRIYW5kbGVycyIsImFjdGl2ZUhhbmRsZXJzIiwicGF0aG5hbWUiLCJyZW1vdmVXZWJTb2NrZXRIYW5kbGVyIiwicGFyc2VBcnJheSIsImNhcCIsInBhcnNlZENhcHMiLCJKU09OIiwicGFyc2UiLCJ2YWxpZGF0ZURlc2lyZWRDYXBzIiwiY2FwcyIsImJyb3dzZXJOYW1lIiwiYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIiwic3RyaW5naWZ5IiwicG9zc2libGVOYW1lcyIsInNvbWUiLCJ0ZXN0IiwiYm9vdHN0cmFwIiwiQm9vdHN0cmFwIl0sInNvdXJjZVJvb3QiOiIuLi8uLiIsInNvdXJjZXMiOlsibGliL2FuZHJvaWQtaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeSwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBwYXRoIGFzIHNldHRpbmdzQXBrUGF0aCB9IGZyb20gJ2lvLmFwcGl1bS5zZXR0aW5ncyc7XG5pbXBvcnQgQm9vdHN0cmFwIGZyb20gJy4vYm9vdHN0cmFwJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBBREIgZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQge1xuICBkZWZhdWx0IGFzIHVubG9ja2VyLCBQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCxcbiAgUEFTU1dPUkRfVU5MT0NLLCBQQVRURVJOX1VOTE9DSywgRklOR0VSUFJJTlRfVU5MT0NLXG59IGZyb20gJy4vdW5sb2NrLWhlbHBlcnMnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5jb25zdCBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCA9IDkwMDAwOyAvLyBtaWxsaXNlY29uZHNcbi8vIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy9jaHJvbWUvYnJvd3Nlci9kZXZ0b29scy9kZXZpY2UvYW5kcm9pZF9kZXZpY2VfaW5mb19xdWVyeS5jY1xuY29uc3QgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSA9IHtcbiAgY2hyb21lOiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgY2hyb21pdW06IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lLnNoZWxsJyxcbiAgICBhY3Rpdml0eTogJy5DaHJvbWVTaGVsbEFjdGl2aXR5JyxcbiAgfSxcbiAgY2hyb21lYmV0YToge1xuICAgIHBrZzogJ2NvbS5jaHJvbWUuYmV0YScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gIGJyb3dzZXI6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5icm93c2VyJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5hbmRyb2lkLmJyb3dzZXIuQnJvd3NlckFjdGl2aXR5JyxcbiAgfSxcbiAgJ2Nocm9taXVtLWJyb3dzZXInOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gICdjaHJvbWl1bS13ZWJ2aWV3Jzoge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS53ZWJ2aWV3X3NoZWxsJyxcbiAgICBhY3Rpdml0eTogJ29yZy5jaHJvbWl1bS53ZWJ2aWV3X3NoZWxsLldlYlZpZXdCcm93c2VyQWN0aXZpdHknLFxuICB9LFxuICBkZWZhdWx0OiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbn07XG5jb25zdCBTRVRUSU5HU19IRUxQRVJfUEtHX0lEID0gJ2lvLmFwcGl1bS5zZXR0aW5ncyc7XG5jb25zdCBTRVRUSU5HU19IRUxQRVJfVU5MT0NLX0FDVElWSVRZID0gJy5VbmxvY2snO1xuY29uc3QgRU1VTEFUT1JfUEFUVEVSTiA9IC9cXGJlbXVsYXRvclxcYi9pO1xuLy8gVGhlc2UgY29uc3RhbnRzIGFyZSBpbiBzeW5jIHdpdGhcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpYXBwbGljYXRpb25zdGF0ZS94Y3VpYXBwbGljYXRpb25zdGF0ZXJ1bm5pbmdiYWNrZ3JvdW5kP2xhbmd1YWdlPW9iamNcbmNvbnN0IEFQUF9TVEFURSA9IE9iamVjdC5mcmVlemUoe1xuICBOT1RfSU5TVEFMTEVEOiAwLFxuICBOT1RfUlVOTklORzogMSxcbiAgUlVOTklOR19JTl9CQUNLR1JPVU5EOiAzLFxuICBSVU5OSU5HX0lOX0ZPUkVHUk9VTkQ6IDRcbn0pO1xuXG5cbmZ1bmN0aW9uIGVuc3VyZU5ldHdvcmtTcGVlZCAoYWRiLCBuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKF8udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKS5pbmNsdWRlcyhuZXR3b3JrU3BlZWQpKSB7XG4gICAgcmV0dXJuIG5ldHdvcmtTcGVlZDtcbiAgfVxuICBsb2dnZXIud2FybihgV3JvbmcgbmV0d29yayBzcGVlZCBwYXJhbSAnJHtuZXR3b3JrU3BlZWR9JywgdXNpbmcgZGVmYXVsdDogJHthZGIuTkVUV09SS19TUEVFRC5GVUxMfS4gYCArXG4gICAgYFN1cHBvcnRlZCB2YWx1ZXM6ICR7Xy52YWx1ZXMoYWRiLk5FVFdPUktfU1BFRUQpfWApO1xuICByZXR1cm4gYWRiLk5FVFdPUktfU1BFRUQuRlVMTDtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUF2ZEFyZ3MgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgbmV0d29ya1NwZWVkLFxuICAgIGlzSGVhZGxlc3MsXG4gICAgYXZkQXJncyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAoYXZkQXJncykge1xuICAgIGlmIChfLmlzQXJyYXkoYXZkQXJncykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmF2ZEFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCguLi4odXRpbC5zaGVsbFBhcnNlKGAke2F2ZEFyZ3N9YCkpKTtcbiAgICB9XG4gIH1cbiAgaWYgKG5ldHdvcmtTcGVlZCkge1xuICAgIHJlc3VsdC5wdXNoKCctbmV0c3BlZWQnLCBlbnN1cmVOZXR3b3JrU3BlZWQoYWRiLCBuZXR3b3JrU3BlZWQpKTtcbiAgfVxuICBpZiAoaXNIZWFkbGVzcykge1xuICAgIHJlc3VsdC5wdXNoKCctbm8td2luZG93Jyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gdG9DcmVkZW50aWFsVHlwZSAodW5sb2NrVHlwZSkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgW1BJTl9VTkxPQ0tdOiAncGluJyxcbiAgICBbUElOX1VOTE9DS19LRVlfRVZFTlRdOiAncGluJyxcbiAgICBbUEFTU1dPUkRfVU5MT0NLXTogJ3Bhc3N3b3JkJyxcbiAgICBbUEFUVEVSTl9VTkxPQ0tdOiAncGF0dGVybicsXG4gIH1bdW5sb2NrVHlwZV07XG4gIGlmIChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIHR5cGUgJyR7dW5sb2NrVHlwZX0nIGlzIG5vdCBrbm93bmApO1xufVxuXG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy5jcmVhdGVCYXNlQURCID0gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQmFzZUFEQiAob3B0cyA9IHt9KSB7XG4gIC8vIGZpbHRlciBvdXQgYW55IHVud2FudGVkIG9wdGlvbnMgc2VudCBpblxuICAvLyB0aGlzIGxpc3Qgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgQURCIHRha2VzIG1vcmUgYXJndW1lbnRzXG4gIGNvbnN0IHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IEFEQi5jcmVhdGVBREIoe1xuICAgIGFkYlBvcnQsXG4gICAgc3VwcHJlc3NLaWxsU2VydmVyLFxuICAgIHJlbW90ZUFkYkhvc3QsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICBhZGJFeGVjVGltZW91dCxcbiAgICB1c2VLZXlzdG9yZSxcbiAgICBrZXlzdG9yZVBhdGgsXG4gICAga2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZCxcbiAgICByZW1vdGVBcHBzQ2FjaGVMaW1pdCxcbiAgICBidWlsZFRvb2xzVmVyc2lvbixcbiAgICBhbGxvd09mZmxpbmVEZXZpY2VzLFxuICAgIGFsbG93RGVsYXlBZGIsXG4gIH0pO1xufTtcblxuaGVscGVycy5wcmVwYXJlRW11bGF0b3IgPSBhc3luYyBmdW5jdGlvbiBwcmVwYXJlRW11bGF0b3IgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgYXZkLFxuICAgIGF2ZEVudjogZW52LFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZTogY291bnRyeSxcbiAgICBhdmRMYXVuY2hUaW1lb3V0OiBsYXVuY2hUaW1lb3V0LFxuICAgIGF2ZFJlYWR5VGltZW91dDogcmVhZHlUaW1lb3V0LFxuICB9ID0gb3B0cztcbiAgaWYgKCFhdmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBsYXVuY2ggQVZEIHdpdGhvdXQgQVZEIG5hbWUnKTtcbiAgfVxuXG4gIGNvbnN0IGF2ZE5hbWUgPSBhdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgY29uc3QgcnVubmluZ0FWRCA9IGF3YWl0IGFkYi5nZXRSdW5uaW5nQVZEKGF2ZE5hbWUpO1xuICBjb25zdCBhcmdzID0gcHJlcGFyZUF2ZEFyZ3MoYWRiLCBvcHRzKTtcbiAgaWYgKHJ1bm5pbmdBVkQpIHtcbiAgICBpZiAoYXJncy5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEtpbGxpbmcgJyR7YXZkTmFtZX0nIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgd2lwZWQgYXQgc3RhcnQuYCk7XG4gICAgICBhd2FpdCBhZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vdCBsYXVuY2hpbmcgQVZEIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBydW5uaW5nLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBhd2FpdCBhZGIubGF1bmNoQVZEKGF2ZCwge1xuICAgIGFyZ3MsXG4gICAgZW52LFxuICAgIGxhbmd1YWdlLFxuICAgIGNvdW50cnksXG4gICAgbGF1bmNoVGltZW91dCxcbiAgICByZWFkeVRpbWVvdXQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBTZXQgYW5kIGVuc3VyZSB0aGUgbG9jYWxlIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXsyLDh9LiBlLmcuIGVuLCBqYSA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb3VudHJ5IC0gQ291bnRyeS4gVGhlIGNvdW50cnkgKHJlZ2lvbikgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byB1cHBlciBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXsyfSB8IFswLTldezN9LiBlLmcuIFVTLCBKUCA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEBwYXJhbSB7P3N0cmluZ30gc2NyaXB0IC0gU2NyaXB0LiBUaGUgc2NyaXB0IGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byB0aXRsZSBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXs0fS4gZS5nLiBIYW5zIGluIHpoLUhhbnMtQ04gOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbGVkIHRvIHNldCBsb2NhbGUgcHJvcGVybHlcbiAqL1xuaGVscGVycy5lbnN1cmVEZXZpY2VMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBlbnN1cmVEZXZpY2VMb2NhbGUgKGFkYiwgbGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCA9IG51bGwpIHtcbiAgaWYgKCFfLmlzU3RyaW5nKGxhbmd1YWdlKSAmJiAhXy5pc1N0cmluZyhjb3VudHJ5KSkge1xuICAgIGxvZ2dlci53YXJuKGBzZXREZXZpY2VMYW5ndWFnZUNvdW50cnkgcmVxdWlyZXMgbGFuZ3VhZ2Ugb3IgY291bnRyeS5gKTtcbiAgICBsb2dnZXIud2FybihgR290IGxhbmd1YWdlOiAnJHtsYW5ndWFnZX0nIGFuZCBjb3VudHJ5OiAnJHtjb3VudHJ5fSdgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBhZGIuc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5KGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpO1xuXG4gIGlmICghYXdhaXQgYWRiLmVuc3VyZUN1cnJlbnRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCkpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gc2NyaXB0ID8gYGxhbmd1YWdlOiAke2xhbmd1YWdlfSwgY291bnRyeTogJHtjb3VudHJ5fSBhbmQgc2NyaXB0OiAke3NjcmlwdH1gIDogYGxhbmd1YWdlOiAke2xhbmd1YWdlfSBhbmQgY291bnRyeTogJHtjb3VudHJ5fWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0ICR7bWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHMgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJbmZvRnJvbUNhcHMgKG9wdHMgPSB7fSkge1xuICAvLyB3ZSBjYW4gY3JlYXRlIGEgdGhyb3dhd2F5IEFEQiBpbnN0YW5jZSBoZXJlLCBzbyB0aGVyZSBpcyBubyBkZXBlbmRlbmN5XG4gIC8vIG9uIGluc3RhbnRpYXRpbmcgb24gZWFybGllciAoYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBubyB1ZGlkKVxuICAvLyB3ZSBjYW4gb25seSB1c2UgdGhpcyBBREIgb2JqZWN0IGZvciBjb21tYW5kcyB0aGF0IHdvdWxkIG5vdCBiZSBjb25mdXNlZFxuICAvLyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBjb25uZWN0ZWRcbiAgY29uc3QgYWRiID0gYXdhaXQgaGVscGVycy5jcmVhdGVCYXNlQURCKG9wdHMpO1xuICBsZXQgdWRpZCA9IG9wdHMudWRpZDtcbiAgbGV0IGVtUG9ydCA9IG51bGw7XG5cbiAgLy8gYSBzcGVjaWZpYyBhdmQgbmFtZSB3YXMgZ2l2ZW4uIHRyeSB0byBpbml0aWFsaXplIHdpdGggdGhhdFxuICBpZiAob3B0cy5hdmQpIHtcbiAgICBhd2FpdCBoZWxwZXJzLnByZXBhcmVFbXVsYXRvcihhZGIsIG9wdHMpO1xuICAgIHVkaWQgPSBhZGIuY3VyRGV2aWNlSWQ7XG4gICAgZW1Qb3J0ID0gYWRiLmVtdWxhdG9yUG9ydDtcbiAgfSBlbHNlIHtcbiAgICAvLyBubyBhdmQgZ2l2ZW4uIGxldHMgdHJ5IHdoYXRldmVyJ3MgcGx1Z2dlZCBpbiBkZXZpY2VzL2VtdWxhdG9yc1xuICAgIGxvZ2dlci5pbmZvKCdSZXRyaWV2aW5nIGRldmljZSBsaXN0Jyk7XG4gICAgbGV0IGRldmljZXMgPSBhd2FpdCBhZGIuZ2V0RGV2aWNlc1dpdGhSZXRyeSgpO1xuXG4gICAgLy8gdWRpZCB3YXMgZ2l2ZW4sIGxldHMgdHJ5IHRvIGluaXQgd2l0aCB0aGF0IGRldmljZVxuICAgIGlmICh1ZGlkKSB7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoXy5tYXAoZGV2aWNlcywgJ3VkaWQnKSwgdWRpZCkpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYERldmljZSAke3VkaWR9IHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgY29ubmVjdGVkIGRldmljZXNgKTtcbiAgICAgIH1cbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH0gZWxzZSBpZiAob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgIG9wdHMucGxhdGZvcm1WZXJzaW9uID0gYCR7b3B0cy5wbGF0Zm9ybVZlcnNpb259YC50cmltKCk7XG5cbiAgICAgIC8vIGEgcGxhdGZvcm0gdmVyc2lvbiB3YXMgZ2l2ZW4uIGxldHMgdHJ5IHRvIGZpbmQgYSBkZXZpY2Ugd2l0aCB0aGUgc2FtZSBvc1xuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gc2VtdmVyLmNvZXJjZShvcHRzLnBsYXRmb3JtVmVyc2lvbikgfHwgb3B0cy5wbGF0Zm9ybVZlcnNpb247XG4gICAgICBsb2dnZXIuaW5mbyhgTG9va2luZyBmb3IgYSBkZXZpY2Ugd2l0aCBBbmRyb2lkICcke3BsYXRmb3JtVmVyc2lvbn0nYCk7XG5cbiAgICAgIC8vIGluIGNhc2Ugd2UgZmFpbCB0byBmaW5kIHNvbWV0aGluZywgZ2l2ZSB0aGUgdXNlciBhIHVzZWZ1bCBsb2cgdGhhdCBoYXNcbiAgICAgIC8vIHRoZSBkZXZpY2UgdWRpZHMgYW5kIG9zIHZlcnNpb25zIHNvIHRoZXkga25vdyB3aGF0J3MgYXZhaWxhYmxlXG4gICAgICBjb25zdCBhdmFpbERldmljZXMgPSBbXTtcbiAgICAgIGxldCBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgPSBudWxsO1xuICAgICAgLy8gZmlyc3QgdHJ5IHN0YXJ0ZWQgZGV2aWNlcy9lbXVsYXRvcnNcbiAgICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgICAgLy8gZGlyZWN0IGFkYiBjYWxscyB0byB0aGUgc3BlY2lmaWMgZGV2aWNlXG4gICAgICAgIGF3YWl0IGFkYi5zZXREZXZpY2VJZChkZXZpY2UudWRpZCk7XG4gICAgICAgIGNvbnN0IHJhd0RldmljZU9TID0gYXdhaXQgYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgICAgICAvLyBUaGUgZGV2aWNlIE9TIGNvdWxkIGVpdGhlciBiZSBhIG51bWJlciwgbGlrZSBgNi4wYFxuICAgICAgICAvLyBvciBhbiBhYmJyZXZpYXRpb24sIGxpa2UgYFJgXG4gICAgICAgIGF2YWlsRGV2aWNlcy5wdXNoKGAke2RldmljZS51ZGlkfSAoJHtyYXdEZXZpY2VPU30pYCk7XG4gICAgICAgIGNvbnN0IGRldmljZU9TID0gc2VtdmVyLmNvZXJjZShyYXdEZXZpY2VPUykgfHwgcmF3RGV2aWNlT1M7XG4gICAgICAgIGlmICghZGV2aWNlT1MpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCA9IHNlbXZlci52YWxpZChkZXZpY2VPUykgJiYgc2VtdmVyLnZhbGlkKHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICAgIGNvbnN0IGJvdGhWZXJzaW9uc0FyZVN0cmluZ3MgPSBfLmlzU3RyaW5nKGRldmljZU9TKSAmJiBfLmlzU3RyaW5nKHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICAgIGlmIChib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgJiYgZGV2aWNlT1MudmVyc2lvbiA9PT0gcGxhdGZvcm1WZXJzaW9uLnZlcnNpb25cbiAgICAgICAgICAgIHx8IGJvdGhWZXJzaW9uc0FyZVN0cmluZ3MgJiYgXy50b0xvd2VyKGRldmljZU9TKSA9PT0gXy50b0xvd2VyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgICAvLyBHb3QgYW4gZXhhY3QgbWF0Y2ggLSBwcm9jZWVkIGltbWVkaWF0ZWx5XG4gICAgICAgICAgdWRpZCA9IGRldmljZS51ZGlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKCFib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQpIHtcbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCB0byBjaGVjayBmb3IgcGFydGlhbCBtYXRjaCBpZiBlaXRoZXIgb2YgdmVyc2lvbiBudW1iZXJzIGlzIG5vdCBjb2VyY2libGVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIV8uaW5jbHVkZXMob3B0cy5wbGF0Zm9ybVZlcnNpb24sICcuJykgJiYgcGxhdGZvcm1WZXJzaW9uLm1ham9yID09PSBkZXZpY2VPUy5tYWpvclxuICAgICAgICAgICAgfHwgcGxhdGZvcm1WZXJzaW9uLm1ham9yID09PSBkZXZpY2VPUy5tYWpvciAmJiBwbGF0Zm9ybVZlcnNpb24ubWlub3IgPT09IGRldmljZU9TLm1pbm9yKVxuICAgICAgICAgICAgLy8gR290IGEgcGFydGlhbCBtYXRjaCAtIG1ha2Ugc3VyZSB3ZSBjb25zaWRlciB0aGUgbW9zdCByZWNlbnRcbiAgICAgICAgICAgIC8vIGRldmljZSB2ZXJzaW9uIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBzeXN0ZW1cbiAgICAgICAgICAgICYmIChwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgJiYgc2VtdmVyLmd0KGRldmljZU9TLCBfLnZhbHVlcyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdKVxuICAgICAgICAgICAgICAgIHx8ICFwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpKSB7XG4gICAgICAgICAgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0ge1tkZXZpY2UudWRpZF06IGRldmljZU9TfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF1ZGlkICYmIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSkge1xuICAgICAgICB1ZGlkID0gXy5rZXlzKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSlbMF07XG4gICAgICAgIGF3YWl0IGFkYi5zZXREZXZpY2VJZCh1ZGlkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1ZGlkKSB7XG4gICAgICAgIC8vIHdlIGNvdWxkbid0IGZpbmQgYW55dGhpbmchIHF1aXRcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFVuYWJsZSB0byBmaW5kIGFuIGFjdGl2ZSBkZXZpY2Ugb3IgZW11bGF0b3IgYCArXG4gICAgICAgICAgYHdpdGggT1MgJHtvcHRzLnBsYXRmb3JtVmVyc2lvbn0uIFRoZSBmb2xsb3dpbmcgYXJlIGF2YWlsYWJsZTogYCArXG4gICAgICAgICAgYXZhaWxEZXZpY2VzLmpvaW4oJywgJykpO1xuICAgICAgfVxuXG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYSB1ZGlkIHdhcyBub3QgZ2l2ZW4sIGdyYWIgdGhlIGZpcnN0IGRldmljZSB3ZSBzZWVcbiAgICAgIHVkaWQgPSBkZXZpY2VzWzBdLnVkaWQ7XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbyhgVXNpbmcgZGV2aWNlOiAke3VkaWR9YCk7XG4gIHJldHVybiB7dWRpZCwgZW1Qb3J0fTtcbn07XG5cbi8vIHJldHVybnMgYSBuZXcgYWRiIGluc3RhbmNlIHdpdGggZGV2aWNlSWQgc2V0XG5oZWxwZXJzLmNyZWF0ZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFEQiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gb3B0cztcbiAgY29uc3QgYWRiID0gYXdhaXQgaGVscGVycy5jcmVhdGVCYXNlQURCKG9wdHMpO1xuICBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gIGlmIChlbVBvcnQpIHtcbiAgICBhZGIuc2V0RW11bGF0b3JQb3J0KGVtUG9ydCk7XG4gIH1cblxuICByZXR1cm4gYWRiO1xufTtcblxuaGVscGVycy52YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzID0gZnVuY3Rpb24gdmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyAob3B0cykge1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2FwcFBhY2thZ2UnLCAnYXBwQWN0aXZpdHknLCAnYXBwV2FpdFBhY2thZ2UnLCAnYXBwV2FpdEFjdGl2aXR5J10pIHtcbiAgICBjb25zdCBuYW1lID0gb3B0c1trZXldO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSAvKFteXFx3LiosXSkrLy5leGVjKG5hbWUpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGBDYXBhYmlsaXR5ICcke2tleX0nIGlzIGV4cGVjdGVkIHRvIG9ubHkgaW5jbHVkZSBsYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmUsIGRvdCwgY29tbWEgYW5kIGFzdGVyaXNrIGNoYXJhY3RlcnMuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEN1cnJlbnQgdmFsdWUgJyR7bmFtZX0nIGhhcyBub24tbWF0Y2hpbmcgY2hhcmFjdGVyIGF0IGluZGV4ICR7bWF0Y2guaW5kZXh9OiAnJHtuYW1lLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCArIDEpfSdgKTtcbiAgfVxufTtcblxuaGVscGVycy5nZXRMYXVuY2hJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TGF1bmNoSW5mbyAoYWRiLCBvcHRzKSB7XG4gIGxldCB7YXBwLCBhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eX0gPSBvcHRzO1xuICBpZiAoIWFwcCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBhcHAgc2VudCBpbiwgbm90IHBhcnNpbmcgcGFja2FnZS9hY3Rpdml0eScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyhvcHRzKTtcblxuICBpZiAoYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZygnUGFyc2luZyBwYWNrYWdlIGFuZCBhY3Rpdml0eSBmcm9tIGFwcCBtYW5pZmVzdCcpO1xuICBsZXQge2Fwa1BhY2thZ2UsIGFwa0FjdGl2aXR5fSA9XG4gICAgYXdhaXQgYWRiLnBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdChhcHApO1xuICBpZiAoYXBrUGFja2FnZSAmJiAhYXBwUGFja2FnZSkge1xuICAgIGFwcFBhY2thZ2UgPSBhcGtQYWNrYWdlO1xuICB9XG4gIGlmICghYXBwV2FpdFBhY2thZ2UpIHtcbiAgICBhcHBXYWl0UGFja2FnZSA9IGFwcFBhY2thZ2U7XG4gIH1cbiAgaWYgKGFwa0FjdGl2aXR5ICYmICFhcHBBY3Rpdml0eSkge1xuICAgIGFwcEFjdGl2aXR5ID0gYXBrQWN0aXZpdHk7XG4gIH1cbiAgaWYgKCFhcHBXYWl0QWN0aXZpdHkpIHtcbiAgICBhcHBXYWl0QWN0aXZpdHkgPSBhcHBBY3Rpdml0eTtcbiAgfVxuICBsb2dnZXIuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmU6ICR7YXBrUGFja2FnZX0vJHthcGtBY3Rpdml0eX1gKTtcbiAgcmV0dXJuIHthcHBQYWNrYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRBY3Rpdml0eX07XG59O1xuXG5oZWxwZXJzLnJlc2V0QXBwID0gYXN5bmMgZnVuY3Rpb24gcmVzZXRBcHAgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHBQYWNrYWdlJyBvcHRpb24gaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBjb25zdCBpc0luc3RhbGxlZCA9IGF3YWl0IGFkYi5pc0FwcEluc3RhbGxlZChhcHBQYWNrYWdlKTtcblxuICBpZiAoaXNJbnN0YWxsZWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLmZvcmNlU3RvcChhcHBQYWNrYWdlKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgLy8gZnVsbFJlc2V0IGhhcyBwcmlvcml0eSBvdmVyIGZhc3RSZXNldFxuICAgIGlmICghZnVsbFJlc2V0ICYmIGZhc3RSZXNldCkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYWRiLmNsZWFyKGFwcFBhY2thZ2UpO1xuICAgICAgaWYgKF8uaXNTdHJpbmcob3V0cHV0KSAmJiBvdXRwdXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZmFpbGVkJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgdGhlIGFwcGxpY2F0aW9uIGRhdGEgb2YgJyR7YXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtvdXRwdXR9YCk7XG4gICAgICB9XG4gICAgICAvLyBleGVjdXRpbmcgYHNoZWxsIHBtIGNsZWFyYCByZXNldHMgcHJldmlvdXNseSBhc3NpZ25lZCBhcHBsaWNhdGlvbiBwZXJtaXNzaW9ucyBhcyB3ZWxsXG4gICAgICBpZiAoYXV0b0dyYW50UGVybWlzc2lvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhZGIuZ3JhbnRBbGxQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFVuYWJsZSB0byBncmFudCBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQuIE9yaWdpbmFsIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgUGVyZm9ybWVkIGZhc3QgcmVzZXQgb24gdGhlIGluc3RhbGxlZCAnJHthcHBQYWNrYWdlfScgYXBwbGljYXRpb24gKHN0b3AgYW5kIGNsZWFyKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmICghYXBwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcCcgb3B0aW9uIGlzIHJlcXVpcmVkIGZvciByZWluc3RhbGxcIik7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFJ1bm5pbmcgZnVsbCByZXNldCBvbiAnJHthcHBQYWNrYWdlfScgKHJlaW5zdGFsbClgKTtcbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgYXdhaXQgYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKTtcbiAgfVxuICBhd2FpdCBhZGIuaW5zdGFsbChhcHAsIHtcbiAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gIH0pO1xufTtcblxuaGVscGVycy5pbnN0YWxsQXBrID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwayAoYWRiLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhcHBQYWNrYWdlLFxuICAgIGZhc3RSZXNldCxcbiAgICBmdWxsUmVzZXQsXG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgZW5mb3JjZUFwcEluc3RhbGwsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghYXBwIHx8ICFhcHBQYWNrYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcCcgYW5kICdhcHBQYWNrYWdlJyBvcHRpb25zIGFyZSByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGlmIChmdWxsUmVzZXQpIHtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGFwcFN0YXRlLFxuICAgIHdhc1VuaW5zdGFsbGVkXG4gIH0gPSBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcHAsIGFwcFBhY2thZ2UsIHtcbiAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgZW5mb3JjZUN1cnJlbnRCdWlsZDogZW5mb3JjZUFwcEluc3RhbGwsXG4gIH0pO1xuXG4gIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgdGhlIG5ld2x5IGluc3RhbGxlZCBhcHBcbiAgY29uc3QgaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAgPSAhd2FzVW5pbnN0YWxsZWRcbiAgICAmJiBhcHBTdGF0ZSAhPT0gYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIGlmIChmYXN0UmVzZXQgJiYgaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHApIHtcbiAgICBsb2dnZXIuaW5mbyhgUGVyZm9ybWluZyBmYXN0IHJlc2V0IG9uICcke2FwcFBhY2thZ2V9J2ApO1xuICAgIGF3YWl0IHRoaXMucmVzZXRBcHAoYWRiLCBvcHRzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0YWxscyBhbiBhcnJheSBvZiBhcGtzXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRzIGRlZmluZWQgaW4gZHJpdmVyLmpzXG4gKi9cbmhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxPdGhlckFwa3MgKG90aGVyQXBwcywgYWRiLCBvcHRzKSB7XG4gIGxldCB7XG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXNcbiAgfSA9IG9wdHM7XG5cbiAgLy8gSW5zdGFsbCBhbGwgb2YgdGhlIEFQSydzIGFzeW5jaHJvbm91c2x5XG4gIGF3YWl0IEIuYWxsKG90aGVyQXBwcy5tYXAoKG90aGVyQXBwKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBJbnN0YWxsaW5nIGFwcDogJHtvdGhlckFwcH1gKTtcbiAgICByZXR1cm4gYWRiLmluc3RhbGxPclVwZ3JhZGUob3RoZXJBcHAsIG51bGwsIHtcbiAgICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgfSk7XG4gIH0pKTtcbn07XG5cbi8qKlxuICogVW5pbnN0YWxsIGFuIGFycmF5IG9mIHBhY2thZ2VzXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFwcFBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2UgbmFtZXMgdG8gdW5pbnN0YWxsLiBJZiB0aGlzIGluY2x1ZGVzIGAnKidgLCB1bmluc3RhbGwgYWxsIG9mIDNyZCBwYXJ0eSBhcHBzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKi9cbmhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyA9IGFzeW5jIGZ1bmN0aW9uIHVuaW5zdGFsbE90aGVyUGFja2FnZXMgKGFkYiwgYXBwUGFja2FnZXMsIGZpbHRlclBhY2thZ2VzID0gW10pIHtcbiAgaWYgKGFwcFBhY2thZ2VzLmluY2x1ZGVzKCcqJykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1VuaW5zdGFsbCB0aGlyZCBwYXJ0eSBwYWNrYWdlcycpO1xuICAgIGFwcFBhY2thZ2VzID0gYXdhaXQgdGhpcy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiLCBmaWx0ZXJQYWNrYWdlcyk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFVuaW5zdGFsbGluZyBwYWNrYWdlczogJHthcHBQYWNrYWdlc31gKTtcbiAgYXdhaXQgQi5hbGwoYXBwUGFja2FnZXMubWFwKChhcHBQYWNrYWdlKSA9PiBhZGIudW5pbnN0YWxsQXBrKGFwcFBhY2thZ2UpKSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGlyZCBwYXJ0eSBwYWNrYWdlcyBmaWx0ZXJlZCB3aXRoIGBmaWx0ZXJQYWNrYWdlc2BcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZXMgZG9lcyBub3QgdW5pbnN0YWxsIHdoZW4gYCpgIGlzIHByb3ZpZGVkIGFzIGBhcHBQYWNrYWdlc2BcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSBvZiBpbnN0YWxsZWQgdGhpcmQgcGFyeSBwYWNrYWdlc1xuICovXG5oZWxwZXJzLmdldFRoaXJkUGFydHlQYWNrYWdlcyA9IGFzeW5jIGZ1bmN0aW9uIGdldFRoaXJkUGFydHlQYWNrYWdlcyAoYWRiLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZXNTdHJpbmcgPSBhd2FpdCBhZGIuc2hlbGwoWydwbScsICdsaXN0JywgJ3BhY2thZ2VzJywgJy0zJ10pO1xuICAgIGNvbnN0IGFwcFBhY2thZ2VzQXJyYXkgPSBwYWNrYWdlc1N0cmluZy50cmltKCkucmVwbGFjZSgvcGFja2FnZTovZywgJycpLnNwbGl0KEVPTCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAnJHthcHBQYWNrYWdlc0FycmF5fScgZmlsdGVyZWQgd2l0aCAnJHtmaWx0ZXJQYWNrYWdlc30nYCk7XG4gICAgcmV0dXJuIF8uZGlmZmVyZW5jZShhcHBQYWNrYWdlc0FycmF5LCBmaWx0ZXJQYWNrYWdlcyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gZ2V0IHBhY2thZ2VzIHdpdGggJ2FkYiBzaGVsbCBwbSBsaXN0IHBhY2thZ2VzIC0zJzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmhlbHBlcnMuaW5pdFVuaWNvZGVLZXlib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRVbmljb2RlS2V5Ym9hcmQgKGFkYikge1xuICBsb2dnZXIuZGVidWcoJ0VuYWJsaW5nIFVuaWNvZGUga2V5Ym9hcmQgc3VwcG9ydCcpO1xuXG4gIC8vIGdldCB0aGUgZGVmYXVsdCBJTUUgc28gd2UgY2FuIHJldHVybiBiYWNrIHRvIGl0IGxhdGVyIGlmIHdlIHdhbnRcbiAgbGV0IGRlZmF1bHRJTUUgPSBhd2FpdCBhZGIuZGVmYXVsdElNRSgpO1xuXG4gIGxvZ2dlci5kZWJ1ZyhgVW5zZXR0aW5nIHByZXZpb3VzIElNRSAke2RlZmF1bHRJTUV9YCk7XG4gIGNvbnN0IGFwcGl1bUlNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9Ly5Vbmljb2RlSU1FYDtcbiAgbG9nZ2VyLmRlYnVnKGBTZXR0aW5nIElNRSB0byAnJHthcHBpdW1JTUV9J2ApO1xuICBhd2FpdCBhZGIuZW5hYmxlSU1FKGFwcGl1bUlNRSk7XG4gIGF3YWl0IGFkYi5zZXRJTUUoYXBwaXVtSU1FKTtcbiAgcmV0dXJuIGRlZmF1bHRJTUU7XG59O1xuXG5oZWxwZXJzLnNldE1vY2tMb2NhdGlvbkFwcCA9IGFzeW5jIGZ1bmN0aW9uIHNldE1vY2tMb2NhdGlvbkFwcCAoYWRiLCBhcHApIHtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgJ3NlY3VyZScsICdtb2NrX2xvY2F0aW9uJywgJzEnXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBhcHAsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnYWxsb3cnXSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHNldCBtb2NrIGxvY2F0aW9uIGZvciBhcHAgJyR7YXBwfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuaW5zdGFsbEhlbHBlckFwcCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxIZWxwZXJBcHAgKGFkYiwgYXBrUGF0aCwgcGFja2FnZUlkKSB7XG4gIC8vIFNvbWV0aW1lcyBhZGIgcHVzaCBvciBhZGIgaW5zdGFsIHRha2UgbW9yZSB0aW1lIHRoYW4gZXhwZWN0ZWQgdG8gaW5zdGFsbCBhbiBhcHBcbiAgLy8gZS5nLiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2lvLmFwcGl1bS5zZXR0aW5ncy9pc3N1ZXMvNDAjaXNzdWVjb21tZW50LTQ3NjU5MzE3NFxuICBhd2FpdCByZXRyeSgyLCBhc3luYyBmdW5jdGlvbiByZXRyeUluc3RhbGxIZWxwZXJBcHAgKCkge1xuICAgIGF3YWl0IGFkYi5pbnN0YWxsT3JVcGdyYWRlKGFwa1BhdGgsIHBhY2thZ2VJZCwge2dyYW50UGVybWlzc2lvbnM6IHRydWV9KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFB1c2hlcyBhbmQgaW5zdGFsbHMgaW8uYXBwaXVtLnNldHRpbmdzIGFwcC5cbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2V0dGluZyBhcHAgaXMgcmVxdWlyZWRcbiAqXG4gKiBAcGFyYW0ge0FkYn0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHRocm93RXJyb3JbZmFsc2VdIC0gV2hldGhlciB0aHJvdyBlcnJvciBvciBub3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aHJvd0Vycm9yIGlzIHRydWUgYW5kIHNvbWV0aGluZyBoYXBwZW5zIGluIGluc3RhbGxhdGlvbiBzdGVwXG4gKi9cbmhlbHBlcnMucHVzaFNldHRpbmdzQXBwID0gYXN5bmMgZnVuY3Rpb24gcHVzaFNldHRpbmdzQXBwIChhZGIsIHRocm93RXJyb3IgPSBmYWxzZSkge1xuICBsb2dnZXIuZGVidWcoJ1B1c2hpbmcgc2V0dGluZ3MgYXBrIHRvIGRldmljZS4uLicpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgaGVscGVycy5pbnN0YWxsSGVscGVyQXBwKGFkYiwgc2V0dGluZ3NBcGtQYXRoLCBTRVRUSU5HU19IRUxQRVJfUEtHX0lELCB0aHJvd0Vycm9yKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybihgSWdub3JlZCBlcnJvciB3aGlsZSBpbnN0YWxsaW5nICcke3NldHRpbmdzQXBrUGF0aH0nOiBgICtcbiAgICAgICAgICAgICAgICBgJyR7ZXJyLm1lc3NhZ2V9Jy4gRmVhdHVyZXMgdGhhdCByZWx5IG9uIHRoaXMgaGVscGVyIGAgK1xuICAgICAgICAgICAgICAgICdyZXF1aXJlIHRoZSBhcGsgc3VjaCBhcyB0b2dnbGUgV2lGaSBhbmQgZ2V0dGluZyBsb2NhdGlvbiAnICtcbiAgICAgICAgICAgICAgICAnd2lsbCByYWlzZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIHVzZSB0aGVtLicpO1xuICB9XG5cbiAgLy8gUmVpbnN0YWxsIHdpbGwgc3RvcCB0aGUgc2V0dGluZ3MgaGVscGVyIHByb2Nlc3MgYW55d2F5LCBzb1xuICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBzdGlsbCBydW5uaW5nXG4gIGlmIChhd2FpdCBhZGIucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfUEtHX0lEKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfSBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRzIHBlcm1pc3Npb25zLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8PSAyMykgeyAvLyBBbmRyb2lkIDYtIGRldmljZXMgc2hvdWxkIGhhdmUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3B1bGwvMTE2NDAjaXNzdWVjb21tZW50LTQzODI2MDQ3N1xuICAgIGNvbnN0IHBlcm1zID0gWydTRVRfQU5JTUFUSU9OX1NDQUxFJywgJ0NIQU5HRV9DT05GSUdVUkFUSU9OJywgJ0FDQ0VTU19GSU5FX0xPQ0FUSU9OJ107XG4gICAgbG9nZ2VyLmluZm8oYEdyYW50aW5nIHBlcm1pc3Npb25zICR7cGVybXN9IHRvICcke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9J2ApO1xuICAgIGF3YWl0IGFkYi5ncmFudFBlcm1pc3Npb25zKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHBlcm1zLm1hcCgoeCkgPT4gYGFuZHJvaWQucGVybWlzc2lvbi4ke3h9YCkpO1xuICB9XG5cbiAgLy8gbGF1bmNoIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAgZHVlIHRvIHNldHRpbmdzIGZhaWxpbmcgdG8gYmUgc2V0XG4gIC8vIGlmIHRoZSBhcHAgaXMgbm90IGxhdW5jaGVkIHByaW9yIHRvIHN0YXJ0IHRoZSBzZXNzaW9uIG9uIGFuZHJvaWQgNytcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy84OTU3XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLnJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgc3RyaW5nLnhtbCBhbmQgY29udmVydHMgaXQgdG8gc3RyaW5nLmpzb24gYW5kIHB1c2hlc1xuICogaXQgdG8gL2RhdGEvbG9jYWwvdG1wL3N0cmluZy5qc29uIG9uIGZvciB1c2Ugb2YgYm9vdHN0cmFwXG4gKiBJZiBhcHAgaXMgbm90IHByZXNlbnQgdG8gZXh0cmFjdCBzdHJpbmcueG1sIGl0IGRlbGV0ZXMgcmVtb3RlIHN0cmluZ3MuanNvblxuICogSWYgYXBwIGRvZXMgbm90IGhhdmUgc3RyaW5ncy54bWwgd2UgcHVzaCBhbiBlbXB0eSBqc29uIG9iamVjdCB0byByZW1vdGVcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UgYWJicmV2aWF0aW9uLCBmb3IgZXhhbXBsZSAnZnInLiBUaGUgZGVmYXVsdCBsYW5ndWFnZVxuICogaXMgdXNlZCBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkLlxuICogQHBhcmFtIHtPYmplY3R9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHJldHVybnMge09iamVjdH0gVGhlIGRpY3Rpb25hcnksIHdoZXJlIHN0cmluZyByZXNvdXJjZSBpZGVudGlmaWVycyBhcmUga2V5c1xuICogYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIG9yIGFuIGVtcHR5IG9iamVjdFxuICogaWYgbm8gbWF0Y2hpbmcgcmVzb3VyY2VzIHdlcmUgZXh0cmFjdGVkLlxuICovXG5oZWxwZXJzLnB1c2hTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gcHVzaFN0cmluZ3MgKGxhbmd1YWdlLCBhZGIsIG9wdHMpIHtcbiAgY29uc3QgcmVtb3RlRGlyID0gJy9kYXRhL2xvY2FsL3RtcCc7XG4gIGNvbnN0IHN0cmluZ3NKc29uID0gJ3N0cmluZ3MuanNvbic7XG4gIGNvbnN0IHJlbW90ZUZpbGUgPSBwYXRoLnBvc2l4LnJlc29sdmUocmVtb3RlRGlyLCBzdHJpbmdzSnNvbik7XG5cbiAgLy8gY2xlYW4gdXAgcmVtb3RlIHN0cmluZy5qc29uIGlmIHByZXNlbnRcbiAgYXdhaXQgYWRiLnJpbXJhZihyZW1vdGVGaWxlKTtcblxuICBsZXQgYXBwO1xuICB0cnkge1xuICAgIGFwcCA9IG9wdHMuYXBwIHx8IGF3YWl0IGFkYi5wdWxsQXBrKG9wdHMuYXBwUGFja2FnZSwgb3B0cy50bXBEaXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuaW5mbyhgRmFpbGVkIHRvIHB1bGwgYW4gYXBrIGZyb20gJyR7b3B0cy5hcHBQYWNrYWdlfScgdG8gJyR7b3B0cy50bXBEaXJ9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KG9wdHMuYXBwUGFja2FnZSkgfHwgIShhd2FpdCBmcy5leGlzdHMoYXBwKSkpIHtcbiAgICBsb2dnZXIuZGVidWcoYE5vIGFwcCBvciBwYWNrYWdlIHNwZWNpZmllZC4gUmV0dXJuaW5nIGVtcHR5IHN0cmluZ3NgKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBzdHJpbmdzVG1wRGlyID0gcGF0aC5yZXNvbHZlKG9wdHMudG1wRGlyLCBvcHRzLmFwcFBhY2thZ2UpO1xuICB0cnkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRXh0cmFjdGluZyBzdHJpbmdzIGZyb20gYXBrJywgYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgY29uc3Qge2Fwa1N0cmluZ3MsIGxvY2FsUGF0aH0gPSBhd2FpdCBhZGIuZXh0cmFjdFN0cmluZ3NGcm9tQXBrKGFwcCwgbGFuZ3VhZ2UsIHN0cmluZ3NUbXBEaXIpO1xuICAgIGF3YWl0IGFkYi5wdXNoKGxvY2FsUGF0aCwgcmVtb3RlRGlyKTtcbiAgICByZXR1cm4gYXBrU3RyaW5ncztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYENvdWxkIG5vdCBnZXQgc3RyaW5ncywgY29udGludWluZyBhbnl3YXkuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGF3YWl0IGFkYi5zaGVsbCgnZWNobycsIFtgJ3t9JyA+ICR7cmVtb3RlRmlsZX1gXSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHN0cmluZ3NUbXBEaXIpO1xuICB9XG4gIHJldHVybiB7fTtcbn07XG5cbmhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcCA9IGFzeW5jIGZ1bmN0aW9uIHVubG9ja1dpdGhIZWxwZXJBcHAgKGFkYikge1xuICBsb2dnZXIuaW5mbygnVW5sb2NraW5nIHNjcmVlbicpO1xuXG4gIC8vIFVubG9jayBzdWNjZWVkIHdpdGggYSBjb3VwbGUgb2YgcmV0cmllcy5cbiAgbGV0IGZpcnN0UnVuID0gdHJ1ZTtcbiAgYXdhaXQgcmV0cnkoMywgYXN5bmMgZnVuY3Rpb24gbGF1bmNoSGVscGVyICgpIHtcbiAgICAvLyBUbyByZWR1Y2UgYSB0aW1lIHRvIGNhbGwgYWRiLmlzU2NyZWVuTG9ja2VkKCkgc2luY2UgYGFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd2AgaXMgZWFzeSB0byBoYW5nIGFkYiBjb21tYW5kc1xuICAgIGlmIChmaXJzdFJ1bikge1xuICAgICAgZmlyc3RSdW4gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFcnJvciBpbiBpc1NjcmVlbkxvY2tlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdcImFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd1wiIGNvbW1hbmQgaGFzIHRpbWVkIG91dC4nKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1RoZSByZWFzb24gb2YgdGhpcyB0aW1lb3V0IGlzIHRoZSBkZWxheWVkIGFkYiByZXNwb25zZS4gUmVzZXR0aW5nIGFkYiBzZXJ2ZXIgY2FuIGltcHJvdmUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYExhdW5jaGluZyAke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8ke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCxcbiAgICAgICctYycsICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgJy1mJywgJzB4MTAyMDAwMDAnLFxuICAgIF0pO1xuICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gIH0pO1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZygnU2NyZWVuIGlzIGxvY2tlZCwgdHJ5aW5nIHRvIHVubG9jaycpO1xuXG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIud2FybignVXNpbmcgYXBwIHVubG9jaywgdGhpcyBpcyBnb2luZyB0byBiZSBkZXByZWNhdGVkIScpO1xuICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcChhZGIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLndhaXRGb3JEZXZpY2UoKTtcbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvcik7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpICYmIChtb2NrTG9jYXRpb25BcHAgfHwgXy5pc1VuZGVmaW5lZChtb2NrTG9jYXRpb25BcHApKSkge1xuICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7Ozs7O0FBRUEsTUFBTUEsdUJBQXVCLEdBQUcsS0FBaEM7QUFFQSxNQUFNQywrQkFBK0IsR0FBRztFQUN0Q0MsTUFBTSxFQUFFO0lBQ05DLEdBQUcsRUFBRSxvQkFEQztJQUVOQyxRQUFRLEVBQUU7RUFGSixDQUQ4QjtFQUt0Q0MsUUFBUSxFQUFFO0lBQ1JGLEdBQUcsRUFBRSwyQkFERztJQUVSQyxRQUFRLEVBQUU7RUFGRixDQUw0QjtFQVN0Q0UsVUFBVSxFQUFFO0lBQ1ZILEdBQUcsRUFBRSxpQkFESztJQUVWQyxRQUFRLEVBQUU7RUFGQSxDQVQwQjtFQWF0Q0csT0FBTyxFQUFFO0lBQ1BKLEdBQUcsRUFBRSxxQkFERTtJQUVQQyxRQUFRLEVBQUU7RUFGSCxDQWI2QjtFQWlCdEMsb0JBQW9CO0lBQ2xCRCxHQUFHLEVBQUUscUJBRGE7SUFFbEJDLFFBQVEsRUFBRTtFQUZRLENBakJrQjtFQXFCdEMsb0JBQW9CO0lBQ2xCRCxHQUFHLEVBQUUsNEJBRGE7SUFFbEJDLFFBQVEsRUFBRTtFQUZRLENBckJrQjtFQXlCdENJLE9BQU8sRUFBRTtJQUNQTCxHQUFHLEVBQUUsb0JBREU7SUFFUEMsUUFBUSxFQUFFO0VBRkg7QUF6QjZCLENBQXhDO0FBOEJBLE1BQU1LLHNCQUFzQixHQUFHLG9CQUEvQjs7QUFDQSxNQUFNQywrQkFBK0IsR0FBRyxTQUF4QztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLGVBQXpCO0FBR0EsTUFBTUMsU0FBUyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztFQUM5QkMsYUFBYSxFQUFFLENBRGU7RUFFOUJDLFdBQVcsRUFBRSxDQUZpQjtFQUc5QkMscUJBQXFCLEVBQUUsQ0FITztFQUk5QkMscUJBQXFCLEVBQUU7QUFKTyxDQUFkLENBQWxCOzs7QUFRQSxTQUFTQyxrQkFBVCxDQUE2QkMsR0FBN0IsRUFBa0NDLFlBQWxDLEVBQWdEO0VBQzlDLElBQUlDLGVBQUEsQ0FBRUMsTUFBRixDQUFTSCxHQUFHLENBQUNJLGFBQWIsRUFBNEJDLFFBQTVCLENBQXFDSixZQUFyQyxDQUFKLEVBQXdEO0lBQ3RELE9BQU9BLFlBQVA7RUFDRDs7RUFDREssZUFBQSxDQUFPQyxJQUFQLENBQWEsOEJBQTZCTixZQUFhLHFCQUFvQkQsR0FBRyxDQUFDSSxhQUFKLENBQWtCSSxJQUFLLElBQXRGLEdBQ1QscUJBQW9CTixlQUFBLENBQUVDLE1BQUYsQ0FBU0gsR0FBRyxDQUFDSSxhQUFiLENBQTRCLEVBRG5EOztFQUVBLE9BQU9KLEdBQUcsQ0FBQ0ksYUFBSixDQUFrQkksSUFBekI7QUFDRDs7QUFFRCxTQUFTQyxjQUFULENBQXlCVCxHQUF6QixFQUE4QlUsSUFBOUIsRUFBb0M7RUFDbEMsTUFBTTtJQUNKVCxZQURJO0lBRUpVLFVBRkk7SUFHSkM7RUFISSxJQUlGRixJQUpKO0VBS0EsTUFBTUcsTUFBTSxHQUFHLEVBQWY7O0VBQ0EsSUFBSUQsT0FBSixFQUFhO0lBQ1gsSUFBSVYsZUFBQSxDQUFFWSxPQUFGLENBQVVGLE9BQVYsQ0FBSixFQUF3QjtNQUN0QkMsTUFBTSxDQUFDRSxJQUFQLENBQVksR0FBR0gsT0FBZjtJQUNELENBRkQsTUFFTztNQUNMQyxNQUFNLENBQUNFLElBQVAsQ0FBWSxHQUFJQyxhQUFBLENBQUtDLFVBQUwsQ0FBaUIsR0FBRUwsT0FBUSxFQUEzQixDQUFoQjtJQUNEO0VBQ0Y7O0VBQ0QsSUFBSVgsWUFBSixFQUFrQjtJQUNoQlksTUFBTSxDQUFDRSxJQUFQLENBQVksV0FBWixFQUF5QmhCLGtCQUFrQixDQUFDQyxHQUFELEVBQU1DLFlBQU4sQ0FBM0M7RUFDRDs7RUFDRCxJQUFJVSxVQUFKLEVBQWdCO0lBQ2RFLE1BQU0sQ0FBQ0UsSUFBUCxDQUFZLFlBQVo7RUFDRDs7RUFDRCxPQUFPRixNQUFQO0FBQ0Q7O0FBRUQsU0FBU0ssZ0JBQVQsQ0FBMkJDLFVBQTNCLEVBQXVDO0VBQ3JDLE1BQU1OLE1BQU0sR0FBRztJQUNiLENBQUNPLHlCQUFELEdBQWMsS0FERDtJQUViLENBQUNDLG1DQUFELEdBQXdCLEtBRlg7SUFHYixDQUFDQyw4QkFBRCxHQUFtQixVQUhOO0lBSWIsQ0FBQ0MsNkJBQUQsR0FBa0I7RUFKTCxFQUtiSixVQUxhLENBQWY7O0VBTUEsSUFBSU4sTUFBSixFQUFZO0lBQ1YsT0FBT0EsTUFBUDtFQUNEOztFQUNELE1BQU0sSUFBSVcsS0FBSixDQUFXLGdCQUFlTCxVQUFXLGdCQUFyQyxDQUFOO0FBQ0Q7O0FBR0QsTUFBTU0sT0FBTyxHQUFHLEVBQWhCOzs7QUFFQUEsT0FBTyxDQUFDQyxhQUFSLEdBQXdCLGVBQWVBLGFBQWYsQ0FBOEJoQixJQUFJLEdBQUcsRUFBckMsRUFBeUM7RUFHL0QsTUFBTTtJQUNKaUIsT0FESTtJQUVKQyxrQkFGSTtJQUdKQyxhQUhJO0lBSUpDLHNCQUpJO0lBS0pDLGNBTEk7SUFNSkMsV0FOSTtJQU9KQyxZQVBJO0lBUUpDLGdCQVJJO0lBU0pDLFFBVEk7SUFVSkMsV0FWSTtJQVdKQyxvQkFYSTtJQVlKQyxpQkFaSTtJQWFKQyxtQkFiSTtJQWNKQztFQWRJLElBZUY5QixJQWZKO0VBZ0JBLE9BQU8sTUFBTStCLGtCQUFBLENBQUlDLFNBQUosQ0FBYztJQUN6QmYsT0FEeUI7SUFFekJDLGtCQUZ5QjtJQUd6QkMsYUFIeUI7SUFJekJDLHNCQUp5QjtJQUt6QkMsY0FMeUI7SUFNekJDLFdBTnlCO0lBT3pCQyxZQVB5QjtJQVF6QkMsZ0JBUnlCO0lBU3pCQyxRQVR5QjtJQVV6QkMsV0FWeUI7SUFXekJDLG9CQVh5QjtJQVl6QkMsaUJBWnlCO0lBYXpCQyxtQkFieUI7SUFjekJDO0VBZHlCLENBQWQsQ0FBYjtBQWdCRCxDQW5DRDs7QUFxQ0FmLE9BQU8sQ0FBQ2tCLGVBQVIsR0FBMEIsZUFBZUEsZUFBZixDQUFnQzNDLEdBQWhDLEVBQXFDVSxJQUFyQyxFQUEyQztFQUNuRSxNQUFNO0lBQ0prQyxHQURJO0lBRUpDLE1BQU0sRUFBRUMsR0FGSjtJQUdKQyxRQUhJO0lBSUpDLE1BQU0sRUFBRUMsT0FKSjtJQUtKQyxnQkFBZ0IsRUFBRUMsYUFMZDtJQU1KQyxlQUFlLEVBQUVDO0VBTmIsSUFPRjNDLElBUEo7O0VBUUEsSUFBSSxDQUFDa0MsR0FBTCxFQUFVO0lBQ1IsTUFBTSxJQUFJcEIsS0FBSixDQUFVLG9DQUFWLENBQU47RUFDRDs7RUFFRCxNQUFNOEIsT0FBTyxHQUFHVixHQUFHLENBQUNXLE9BQUosQ0FBWSxHQUFaLEVBQWlCLEVBQWpCLENBQWhCO0VBQ0EsTUFBTUMsVUFBVSxHQUFHLE1BQU14RCxHQUFHLENBQUN5RCxhQUFKLENBQWtCSCxPQUFsQixDQUF6QjtFQUNBLE1BQU1JLElBQUksR0FBR2pELGNBQWMsQ0FBQ1QsR0FBRCxFQUFNVSxJQUFOLENBQTNCOztFQUNBLElBQUk4QyxVQUFKLEVBQWdCO0lBQ2QsSUFBSUUsSUFBSSxDQUFDckQsUUFBTCxDQUFjLFlBQWQsQ0FBSixFQUFpQztNQUMvQkMsZUFBQSxDQUFPcUQsS0FBUCxDQUFjLFlBQVdMLE9BQVEsMENBQWpDOztNQUNBLE1BQU10RCxHQUFHLENBQUM0RCxZQUFKLENBQWlCTixPQUFqQixDQUFOO0lBQ0QsQ0FIRCxNQUdPO01BQ0xoRCxlQUFBLENBQU9xRCxLQUFQLENBQWEsa0RBQWI7O01BQ0E7SUFDRDtFQUNGOztFQUNELE1BQU0zRCxHQUFHLENBQUM2RCxTQUFKLENBQWNqQixHQUFkLEVBQW1CO0lBQ3ZCYyxJQUR1QjtJQUV2QlosR0FGdUI7SUFHdkJDLFFBSHVCO0lBSXZCRSxPQUp1QjtJQUt2QkUsYUFMdUI7SUFNdkJFO0VBTnVCLENBQW5CLENBQU47QUFRRCxDQWpDRDs7QUErQ0E1QixPQUFPLENBQUNxQyxrQkFBUixHQUE2QixlQUFlQSxrQkFBZixDQUFtQzlELEdBQW5DLEVBQXdDK0MsUUFBeEMsRUFBa0RFLE9BQWxELEVBQTJEYyxNQUFNLEdBQUcsSUFBcEUsRUFBMEU7RUFDckcsSUFBSSxDQUFDN0QsZUFBQSxDQUFFOEQsUUFBRixDQUFXakIsUUFBWCxDQUFELElBQXlCLENBQUM3QyxlQUFBLENBQUU4RCxRQUFGLENBQVdmLE9BQVgsQ0FBOUIsRUFBbUQ7SUFDakQzQyxlQUFBLENBQU9DLElBQVAsQ0FBYSx3REFBYjs7SUFDQUQsZUFBQSxDQUFPQyxJQUFQLENBQWEsa0JBQWlCd0MsUUFBUyxtQkFBa0JFLE9BQVEsR0FBakU7O0lBQ0E7RUFDRDs7RUFFRCxNQUFNakQsR0FBRyxDQUFDaUUsd0JBQUosQ0FBNkJsQixRQUE3QixFQUF1Q0UsT0FBdkMsRUFBZ0RjLE1BQWhELENBQU47O0VBRUEsSUFBSSxFQUFDLE1BQU0vRCxHQUFHLENBQUNrRSxtQkFBSixDQUF3Qm5CLFFBQXhCLEVBQWtDRSxPQUFsQyxFQUEyQ2MsTUFBM0MsQ0FBUCxDQUFKLEVBQStEO0lBQzdELE1BQU1JLE9BQU8sR0FBR0osTUFBTSxHQUFJLGFBQVloQixRQUFTLGNBQWFFLE9BQVEsZ0JBQWVjLE1BQU8sRUFBcEUsR0FBeUUsYUFBWWhCLFFBQVMsaUJBQWdCRSxPQUFRLEVBQTVJO0lBQ0EsTUFBTSxJQUFJekIsS0FBSixDQUFXLGlCQUFnQjJDLE9BQVEsRUFBbkMsQ0FBTjtFQUNEO0FBQ0YsQ0FiRDs7QUFlQTFDLE9BQU8sQ0FBQzJDLHFCQUFSLEdBQWdDLGVBQWVBLHFCQUFmLENBQXNDMUQsSUFBSSxHQUFHLEVBQTdDLEVBQWlEO0VBSy9FLE1BQU1WLEdBQUcsR0FBRyxNQUFNeUIsT0FBTyxDQUFDQyxhQUFSLENBQXNCaEIsSUFBdEIsQ0FBbEI7RUFDQSxJQUFJMkQsSUFBSSxHQUFHM0QsSUFBSSxDQUFDMkQsSUFBaEI7RUFDQSxJQUFJQyxNQUFNLEdBQUcsSUFBYjs7RUFHQSxJQUFJNUQsSUFBSSxDQUFDa0MsR0FBVCxFQUFjO0lBQ1osTUFBTW5CLE9BQU8sQ0FBQ2tCLGVBQVIsQ0FBd0IzQyxHQUF4QixFQUE2QlUsSUFBN0IsQ0FBTjtJQUNBMkQsSUFBSSxHQUFHckUsR0FBRyxDQUFDdUUsV0FBWDtJQUNBRCxNQUFNLEdBQUd0RSxHQUFHLENBQUN3RSxZQUFiO0VBQ0QsQ0FKRCxNQUlPO0lBRUxsRSxlQUFBLENBQU9tRSxJQUFQLENBQVksd0JBQVo7O0lBQ0EsSUFBSUMsT0FBTyxHQUFHLE1BQU0xRSxHQUFHLENBQUMyRSxtQkFBSixFQUFwQjs7SUFHQSxJQUFJTixJQUFKLEVBQVU7TUFDUixJQUFJLENBQUNuRSxlQUFBLENBQUVHLFFBQUYsQ0FBV0gsZUFBQSxDQUFFMEUsR0FBRixDQUFNRixPQUFOLEVBQWUsTUFBZixDQUFYLEVBQW1DTCxJQUFuQyxDQUFMLEVBQStDO1FBQzdDL0QsZUFBQSxDQUFPdUUsYUFBUCxDQUFzQixVQUFTUixJQUFLLDJDQUFwQztNQUNEOztNQUNEQyxNQUFNLEdBQUd0RSxHQUFHLENBQUM4RSx5QkFBSixDQUE4QlQsSUFBOUIsQ0FBVDtJQUNELENBTEQsTUFLTyxJQUFJM0QsSUFBSSxDQUFDcUUsZUFBVCxFQUEwQjtNQUMvQnJFLElBQUksQ0FBQ3FFLGVBQUwsR0FBd0IsR0FBRXJFLElBQUksQ0FBQ3FFLGVBQWdCLEVBQXhCLENBQTBCQyxJQUExQixFQUF2QjtNQUdBLE1BQU1ELGVBQWUsR0FBR0UsZUFBQSxDQUFPQyxNQUFQLENBQWN4RSxJQUFJLENBQUNxRSxlQUFuQixLQUF1Q3JFLElBQUksQ0FBQ3FFLGVBQXBFOztNQUNBekUsZUFBQSxDQUFPbUUsSUFBUCxDQUFhLHNDQUFxQ00sZUFBZ0IsR0FBbEU7O01BSUEsTUFBTUksWUFBWSxHQUFHLEVBQXJCO01BQ0EsSUFBSUMscUJBQXFCLEdBQUcsSUFBNUI7O01BRUEsS0FBSyxNQUFNQyxNQUFYLElBQXFCWCxPQUFyQixFQUE4QjtRQUU1QixNQUFNMUUsR0FBRyxDQUFDc0YsV0FBSixDQUFnQkQsTUFBTSxDQUFDaEIsSUFBdkIsQ0FBTjtRQUNBLE1BQU1rQixXQUFXLEdBQUcsTUFBTXZGLEdBQUcsQ0FBQ3dGLGtCQUFKLEVBQTFCO1FBR0FMLFlBQVksQ0FBQ3BFLElBQWIsQ0FBbUIsR0FBRXNFLE1BQU0sQ0FBQ2hCLElBQUssS0FBSWtCLFdBQVksR0FBakQ7UUFDQSxNQUFNRSxRQUFRLEdBQUdSLGVBQUEsQ0FBT0MsTUFBUCxDQUFjSyxXQUFkLEtBQThCQSxXQUEvQzs7UUFDQSxJQUFJLENBQUNFLFFBQUwsRUFBZTtVQUNiO1FBQ0Q7O1FBRUQsTUFBTUMsd0JBQXdCLEdBQUdULGVBQUEsQ0FBT1UsS0FBUCxDQUFhRixRQUFiLEtBQTBCUixlQUFBLENBQU9VLEtBQVAsQ0FBYVosZUFBYixDQUEzRDs7UUFDQSxNQUFNYSxzQkFBc0IsR0FBRzFGLGVBQUEsQ0FBRThELFFBQUYsQ0FBV3lCLFFBQVgsS0FBd0J2RixlQUFBLENBQUU4RCxRQUFGLENBQVdlLGVBQVgsQ0FBdkQ7O1FBQ0EsSUFBSVcsd0JBQXdCLElBQUlELFFBQVEsQ0FBQ0ksT0FBVCxLQUFxQmQsZUFBZSxDQUFDYyxPQUFqRSxJQUNHRCxzQkFBc0IsSUFBSTFGLGVBQUEsQ0FBRTRGLE9BQUYsQ0FBVUwsUUFBVixNQUF3QnZGLGVBQUEsQ0FBRTRGLE9BQUYsQ0FBVWYsZUFBVixDQUR6RCxFQUNxRjtVQUVuRlYsSUFBSSxHQUFHZ0IsTUFBTSxDQUFDaEIsSUFBZDtVQUNBO1FBQ0QsQ0FMRCxNQUtPLElBQUksQ0FBQ3FCLHdCQUFMLEVBQStCO1VBRXBDO1FBQ0Q7O1FBRUQsSUFBSSxDQUFDLENBQUN4RixlQUFBLENBQUVHLFFBQUYsQ0FBV0ssSUFBSSxDQUFDcUUsZUFBaEIsRUFBaUMsR0FBakMsQ0FBRCxJQUEwQ0EsZUFBZSxDQUFDZ0IsS0FBaEIsS0FBMEJOLFFBQVEsQ0FBQ00sS0FBN0UsSUFDRWhCLGVBQWUsQ0FBQ2dCLEtBQWhCLEtBQTBCTixRQUFRLENBQUNNLEtBQW5DLElBQTRDaEIsZUFBZSxDQUFDaUIsS0FBaEIsS0FBMEJQLFFBQVEsQ0FBQ08sS0FEbEYsTUFJSVoscUJBQXFCLElBQUlILGVBQUEsQ0FBT2dCLEVBQVAsQ0FBVVIsUUFBVixFQUFvQnZGLGVBQUEsQ0FBRUMsTUFBRixDQUFTaUYscUJBQVQsRUFBZ0MsQ0FBaEMsQ0FBcEIsQ0FBekIsSUFDRyxDQUFDQSxxQkFMUixDQUFKLEVBS29DO1VBQ2xDQSxxQkFBcUIsR0FBRztZQUFDLENBQUNDLE1BQU0sQ0FBQ2hCLElBQVIsR0FBZW9CO1VBQWhCLENBQXhCO1FBQ0Q7TUFDRjs7TUFDRCxJQUFJLENBQUNwQixJQUFELElBQVNlLHFCQUFiLEVBQW9DO1FBQ2xDZixJQUFJLEdBQUduRSxlQUFBLENBQUVnRyxJQUFGLENBQU9kLHFCQUFQLEVBQThCLENBQTlCLENBQVA7UUFDQSxNQUFNcEYsR0FBRyxDQUFDc0YsV0FBSixDQUFnQmpCLElBQWhCLENBQU47TUFDRDs7TUFFRCxJQUFJLENBQUNBLElBQUwsRUFBVztRQUVUL0QsZUFBQSxDQUFPdUUsYUFBUCxDQUFzQiw4Q0FBRCxHQUNsQixXQUFVbkUsSUFBSSxDQUFDcUUsZUFBZ0IsaUNBRGIsR0FFbkJJLFlBQVksQ0FBQ2dCLElBQWIsQ0FBa0IsSUFBbEIsQ0FGRjtNQUdEOztNQUVEN0IsTUFBTSxHQUFHdEUsR0FBRyxDQUFDOEUseUJBQUosQ0FBOEJULElBQTlCLENBQVQ7SUFDRCxDQTFETSxNQTBEQTtNQUVMQSxJQUFJLEdBQUdLLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBV0wsSUFBbEI7TUFDQUMsTUFBTSxHQUFHdEUsR0FBRyxDQUFDOEUseUJBQUosQ0FBOEJULElBQTlCLENBQVQ7SUFDRDtFQUNGOztFQUVEL0QsZUFBQSxDQUFPbUUsSUFBUCxDQUFhLGlCQUFnQkosSUFBSyxFQUFsQzs7RUFDQSxPQUFPO0lBQUNBLElBQUQ7SUFBT0M7RUFBUCxDQUFQO0FBQ0QsQ0E1RkQ7O0FBK0ZBN0MsT0FBTyxDQUFDaUIsU0FBUixHQUFvQixlQUFlQSxTQUFmLENBQTBCaEMsSUFBSSxHQUFHLEVBQWpDLEVBQXFDO0VBQ3ZELE1BQU07SUFBQzJELElBQUQ7SUFBT0M7RUFBUCxJQUFpQjVELElBQXZCO0VBQ0EsTUFBTVYsR0FBRyxHQUFHLE1BQU15QixPQUFPLENBQUNDLGFBQVIsQ0FBc0JoQixJQUF0QixDQUFsQjtFQUNBVixHQUFHLENBQUNzRixXQUFKLENBQWdCakIsSUFBaEI7O0VBQ0EsSUFBSUMsTUFBSixFQUFZO0lBQ1Z0RSxHQUFHLENBQUNvRyxlQUFKLENBQW9COUIsTUFBcEI7RUFDRDs7RUFFRCxPQUFPdEUsR0FBUDtBQUNELENBVEQ7O0FBV0F5QixPQUFPLENBQUM0RSw0QkFBUixHQUF1QyxTQUFTQSw0QkFBVCxDQUF1QzNGLElBQXZDLEVBQTZDO0VBQ2xGLEtBQUssTUFBTTRGLEdBQVgsSUFBa0IsQ0FBQyxZQUFELEVBQWUsYUFBZixFQUE4QixnQkFBOUIsRUFBZ0QsaUJBQWhELENBQWxCLEVBQXNGO0lBQ3BGLE1BQU1DLElBQUksR0FBRzdGLElBQUksQ0FBQzRGLEdBQUQsQ0FBakI7O0lBQ0EsSUFBSSxDQUFDQyxJQUFMLEVBQVc7TUFDVDtJQUNEOztJQUVELE1BQU1DLEtBQUssR0FBRyxjQUFjQyxJQUFkLENBQW1CRixJQUFuQixDQUFkOztJQUNBLElBQUksQ0FBQ0MsS0FBTCxFQUFZO01BQ1Y7SUFDRDs7SUFFRGxHLGVBQUEsQ0FBT0MsSUFBUCxDQUFhLGVBQWMrRixHQUFJLHNHQUEvQjs7SUFDQWhHLGVBQUEsQ0FBT0MsSUFBUCxDQUFhLGtCQUFpQmdHLElBQUsseUNBQXdDQyxLQUFLLENBQUNFLEtBQU0sTUFBS0gsSUFBSSxDQUFDSSxTQUFMLENBQWUsQ0FBZixFQUFrQkgsS0FBSyxDQUFDRSxLQUFOLEdBQWMsQ0FBaEMsQ0FBbUMsR0FBL0g7RUFDRDtBQUNGLENBZkQ7O0FBaUJBakYsT0FBTyxDQUFDbUYsYUFBUixHQUF3QixlQUFlQSxhQUFmLENBQThCNUcsR0FBOUIsRUFBbUNVLElBQW5DLEVBQXlDO0VBQy9ELElBQUk7SUFBQ21HLEdBQUQ7SUFBTUMsVUFBTjtJQUFrQkMsV0FBbEI7SUFBK0JDLGNBQS9CO0lBQStDQztFQUEvQyxJQUFrRXZHLElBQXRFOztFQUNBLElBQUksQ0FBQ21HLEdBQUwsRUFBVTtJQUNSdkcsZUFBQSxDQUFPQyxJQUFQLENBQVksOENBQVo7O0lBQ0E7RUFDRDs7RUFFRCxLQUFLOEYsNEJBQUwsQ0FBa0MzRixJQUFsQzs7RUFFQSxJQUFJb0csVUFBVSxJQUFJQyxXQUFsQixFQUErQjtJQUM3QjtFQUNEOztFQUVEekcsZUFBQSxDQUFPcUQsS0FBUCxDQUFhLGdEQUFiOztFQUNBLElBQUk7SUFBQ3VELFVBQUQ7SUFBYUM7RUFBYixJQUNGLE1BQU1uSCxHQUFHLENBQUNvSCxvQ0FBSixDQUF5Q1AsR0FBekMsQ0FEUjs7RUFFQSxJQUFJSyxVQUFVLElBQUksQ0FBQ0osVUFBbkIsRUFBK0I7SUFDN0JBLFVBQVUsR0FBR0ksVUFBYjtFQUNEOztFQUNELElBQUksQ0FBQ0YsY0FBTCxFQUFxQjtJQUNuQkEsY0FBYyxHQUFHRixVQUFqQjtFQUNEOztFQUNELElBQUlLLFdBQVcsSUFBSSxDQUFDSixXQUFwQixFQUFpQztJQUMvQkEsV0FBVyxHQUFHSSxXQUFkO0VBQ0Q7O0VBQ0QsSUFBSSxDQUFDRixlQUFMLEVBQXNCO0lBQ3BCQSxlQUFlLEdBQUdGLFdBQWxCO0VBQ0Q7O0VBQ0R6RyxlQUFBLENBQU9xRCxLQUFQLENBQWMsb0NBQW1DdUQsVUFBVyxJQUFHQyxXQUFZLEVBQTNFOztFQUNBLE9BQU87SUFBQ0wsVUFBRDtJQUFhRSxjQUFiO0lBQTZCRCxXQUE3QjtJQUEwQ0U7RUFBMUMsQ0FBUDtBQUNELENBOUJEOztBQWdDQXhGLE9BQU8sQ0FBQzRGLFFBQVIsR0FBbUIsZUFBZUEsUUFBZixDQUF5QnJILEdBQXpCLEVBQThCVSxJQUFJLEdBQUcsRUFBckMsRUFBeUM7RUFDMUQsTUFBTTtJQUNKbUcsR0FESTtJQUVKQyxVQUZJO0lBR0pRLFNBSEk7SUFJSkMsU0FKSTtJQUtKQyxxQkFBcUIsR0FBRzVJLHVCQUxwQjtJQU1KNkksb0JBTkk7SUFPSkM7RUFQSSxJQVFGaEgsSUFSSjs7RUFVQSxJQUFJLENBQUNvRyxVQUFMLEVBQWlCO0lBQ2YsTUFBTSxJQUFJdEYsS0FBSixDQUFVLGlDQUFWLENBQU47RUFDRDs7RUFFRCxNQUFNbUcsV0FBVyxHQUFHLE1BQU0zSCxHQUFHLENBQUM0SCxjQUFKLENBQW1CZCxVQUFuQixDQUExQjs7RUFFQSxJQUFJYSxXQUFKLEVBQWlCO0lBQ2YsSUFBSTtNQUNGLE1BQU0zSCxHQUFHLENBQUM2SCxTQUFKLENBQWNmLFVBQWQsQ0FBTjtJQUNELENBRkQsQ0FFRSxPQUFPZ0IsR0FBUCxFQUFZLENBQUU7O0lBRWhCLElBQUksQ0FBQ1AsU0FBRCxJQUFjRCxTQUFsQixFQUE2QjtNQUMzQixNQUFNUyxNQUFNLEdBQUcsTUFBTS9ILEdBQUcsQ0FBQ2dJLEtBQUosQ0FBVWxCLFVBQVYsQ0FBckI7O01BQ0EsSUFBSTVHLGVBQUEsQ0FBRThELFFBQUYsQ0FBVytELE1BQVgsS0FBc0JBLE1BQU0sQ0FBQ0UsV0FBUCxHQUFxQjVILFFBQXJCLENBQThCLFFBQTlCLENBQTFCLEVBQW1FO1FBQ2pFLE1BQU0sSUFBSW1CLEtBQUosQ0FBVyx5Q0FBd0NzRixVQUFXLHNCQUFxQmlCLE1BQU8sRUFBMUYsQ0FBTjtNQUNEOztNQUVELElBQUlOLG9CQUFKLEVBQTBCO1FBQ3hCLElBQUk7VUFDRixNQUFNekgsR0FBRyxDQUFDa0ksbUJBQUosQ0FBd0JwQixVQUF4QixDQUFOO1FBQ0QsQ0FGRCxDQUVFLE9BQU9xQixLQUFQLEVBQWM7VUFDZDdILGVBQUEsQ0FBTzZILEtBQVAsQ0FBYywwREFBeURBLEtBQUssQ0FBQ2hFLE9BQVEsRUFBckY7UUFDRDtNQUNGOztNQUNEN0QsZUFBQSxDQUFPcUQsS0FBUCxDQUFjLDBDQUF5Q21ELFVBQVcsZ0NBQWxFOztNQUNBO0lBQ0Q7RUFDRjs7RUFFRCxJQUFJLENBQUNELEdBQUwsRUFBVTtJQUNSLE1BQU0sSUFBSXJGLEtBQUosQ0FBVSx3Q0FBVixDQUFOO0VBQ0Q7O0VBRURsQixlQUFBLENBQU9xRCxLQUFQLENBQWMsMEJBQXlCbUQsVUFBVyxlQUFsRDs7RUFDQSxJQUFJYSxXQUFKLEVBQWlCO0lBQ2YsTUFBTTNILEdBQUcsQ0FBQ29JLFlBQUosQ0FBaUJ0QixVQUFqQixDQUFOO0VBQ0Q7O0VBQ0QsTUFBTTlHLEdBQUcsQ0FBQ3FJLE9BQUosQ0FBWXhCLEdBQVosRUFBaUI7SUFDckJ5QixnQkFBZ0IsRUFBRWIsb0JBREc7SUFFckJjLE9BQU8sRUFBRWYscUJBRlk7SUFHckJFO0VBSHFCLENBQWpCLENBQU47QUFLRCxDQXJERDs7QUF1REFqRyxPQUFPLENBQUMrRyxVQUFSLEdBQXFCLGVBQWVBLFVBQWYsQ0FBMkJ4SSxHQUEzQixFQUFnQ1UsSUFBSSxHQUFHLEVBQXZDLEVBQTJDO0VBQzlELE1BQU07SUFDSm1HLEdBREk7SUFFSkMsVUFGSTtJQUdKUSxTQUhJO0lBSUpDLFNBSkk7SUFLSkMscUJBQXFCLEdBQUc1SSx1QkFMcEI7SUFNSjZJLG9CQU5JO0lBT0pDLGlCQVBJO0lBUUplO0VBUkksSUFTRi9ILElBVEo7O0VBV0EsSUFBSSxDQUFDbUcsR0FBRCxJQUFRLENBQUNDLFVBQWIsRUFBeUI7SUFDdkIsTUFBTSxJQUFJdEYsS0FBSixDQUFVLDZDQUFWLENBQU47RUFDRDs7RUFFRCxJQUFJK0YsU0FBSixFQUFlO0lBQ2IsTUFBTSxLQUFLRixRQUFMLENBQWNySCxHQUFkLEVBQW1CVSxJQUFuQixDQUFOO0lBQ0E7RUFDRDs7RUFFRCxNQUFNO0lBQ0pnSSxRQURJO0lBRUpDO0VBRkksSUFHRixNQUFNM0ksR0FBRyxDQUFDNEksZ0JBQUosQ0FBcUIvQixHQUFyQixFQUEwQkMsVUFBMUIsRUFBc0M7SUFDOUN3QixnQkFBZ0IsRUFBRWIsb0JBRDRCO0lBRTlDYyxPQUFPLEVBQUVmLHFCQUZxQztJQUc5Q0UsaUJBSDhDO0lBSTlDbUIsbUJBQW1CLEVBQUVKO0VBSnlCLENBQXRDLENBSFY7RUFXQSxNQUFNSywwQkFBMEIsR0FBRyxDQUFDSCxjQUFELElBQzlCRCxRQUFRLEtBQUsxSSxHQUFHLENBQUMrSSxpQkFBSixDQUFzQnBKLGFBRHhDOztFQUVBLElBQUkySCxTQUFTLElBQUl3QiwwQkFBakIsRUFBNkM7SUFDM0N4SSxlQUFBLENBQU9tRSxJQUFQLENBQWEsNkJBQTRCcUMsVUFBVyxHQUFwRDs7SUFDQSxNQUFNLEtBQUtPLFFBQUwsQ0FBY3JILEdBQWQsRUFBbUJVLElBQW5CLENBQU47RUFDRDtBQUNGLENBdENEOztBQTZDQWUsT0FBTyxDQUFDdUgsZ0JBQVIsR0FBMkIsZUFBZUEsZ0JBQWYsQ0FBaUNDLFNBQWpDLEVBQTRDakosR0FBNUMsRUFBaURVLElBQWpELEVBQXVEO0VBQ2hGLElBQUk7SUFDRjhHLHFCQUFxQixHQUFHNUksdUJBRHRCO0lBRUY2SSxvQkFGRTtJQUdGQztFQUhFLElBSUFoSCxJQUpKO0VBT0EsTUFBTXdJLGlCQUFBLENBQUVDLEdBQUYsQ0FBTUYsU0FBUyxDQUFDckUsR0FBVixDQUFld0UsUUFBRCxJQUFjO0lBQ3RDOUksZUFBQSxDQUFPcUQsS0FBUCxDQUFjLG1CQUFrQnlGLFFBQVMsRUFBekM7O0lBQ0EsT0FBT3BKLEdBQUcsQ0FBQzRJLGdCQUFKLENBQXFCUSxRQUFyQixFQUErQixJQUEvQixFQUFxQztNQUMxQ2QsZ0JBQWdCLEVBQUViLG9CQUR3QjtNQUUxQ2MsT0FBTyxFQUFFZixxQkFGaUM7TUFHMUNFO0lBSDBDLENBQXJDLENBQVA7RUFLRCxDQVBXLENBQU4sQ0FBTjtBQVFELENBaEJEOztBQXdCQWpHLE9BQU8sQ0FBQzRILHNCQUFSLEdBQWlDLGVBQWVBLHNCQUFmLENBQXVDckosR0FBdkMsRUFBNENzSixXQUE1QyxFQUF5REMsY0FBYyxHQUFHLEVBQTFFLEVBQThFO0VBQzdHLElBQUlELFdBQVcsQ0FBQ2pKLFFBQVosQ0FBcUIsR0FBckIsQ0FBSixFQUErQjtJQUM3QkMsZUFBQSxDQUFPcUQsS0FBUCxDQUFhLGdDQUFiOztJQUNBMkYsV0FBVyxHQUFHLE1BQU0sS0FBS0UscUJBQUwsQ0FBMkJ4SixHQUEzQixFQUFnQ3VKLGNBQWhDLENBQXBCO0VBQ0Q7O0VBRURqSixlQUFBLENBQU9xRCxLQUFQLENBQWMsMEJBQXlCMkYsV0FBWSxFQUFuRDs7RUFDQSxNQUFNSixpQkFBQSxDQUFFQyxHQUFGLENBQU1HLFdBQVcsQ0FBQzFFLEdBQVosQ0FBaUJrQyxVQUFELElBQWdCOUcsR0FBRyxDQUFDb0ksWUFBSixDQUFpQnRCLFVBQWpCLENBQWhDLENBQU4sQ0FBTjtBQUNELENBUkQ7O0FBZ0JBckYsT0FBTyxDQUFDK0gscUJBQVIsR0FBZ0MsZUFBZUEscUJBQWYsQ0FBc0N4SixHQUF0QyxFQUEyQ3VKLGNBQWMsR0FBRyxFQUE1RCxFQUFnRTtFQUM5RixJQUFJO0lBQ0YsTUFBTUUsY0FBYyxHQUFHLE1BQU16SixHQUFHLENBQUMwSixLQUFKLENBQVUsQ0FBQyxJQUFELEVBQU8sTUFBUCxFQUFlLFVBQWYsRUFBMkIsSUFBM0IsQ0FBVixDQUE3QjtJQUNBLE1BQU1DLGdCQUFnQixHQUFHRixjQUFjLENBQUN6RSxJQUFmLEdBQXNCekIsT0FBdEIsQ0FBOEIsV0FBOUIsRUFBMkMsRUFBM0MsRUFBK0NxRyxLQUEvQyxDQUFxREMsT0FBckQsQ0FBekI7O0lBQ0F2SixlQUFBLENBQU9xRCxLQUFQLENBQWMsSUFBR2dHLGdCQUFpQixvQkFBbUJKLGNBQWUsR0FBcEU7O0lBQ0EsT0FBT3JKLGVBQUEsQ0FBRTRKLFVBQUYsQ0FBYUgsZ0JBQWIsRUFBK0JKLGNBQS9CLENBQVA7RUFDRCxDQUxELENBS0UsT0FBT1EsR0FBUCxFQUFZO0lBQ1p6SixlQUFBLENBQU9DLElBQVAsQ0FBYSxnRUFBK0R3SixHQUFHLENBQUM1RixPQUFRLEVBQXhGOztJQUNBLE9BQU8sRUFBUDtFQUNEO0FBQ0YsQ0FWRDs7QUFZQTFDLE9BQU8sQ0FBQ3VJLG1CQUFSLEdBQThCLGVBQWVBLG1CQUFmLENBQW9DaEssR0FBcEMsRUFBeUM7RUFDckVNLGVBQUEsQ0FBT3FELEtBQVAsQ0FBYSxtQ0FBYjs7RUFHQSxJQUFJc0csVUFBVSxHQUFHLE1BQU1qSyxHQUFHLENBQUNpSyxVQUFKLEVBQXZCOztFQUVBM0osZUFBQSxDQUFPcUQsS0FBUCxDQUFjLDBCQUF5QnNHLFVBQVcsRUFBbEQ7O0VBQ0EsTUFBTUMsU0FBUyxHQUFJLEdBQUU3SyxzQkFBdUIsY0FBNUM7O0VBQ0FpQixlQUFBLENBQU9xRCxLQUFQLENBQWMsbUJBQWtCdUcsU0FBVSxHQUExQzs7RUFDQSxNQUFNbEssR0FBRyxDQUFDbUssU0FBSixDQUFjRCxTQUFkLENBQU47RUFDQSxNQUFNbEssR0FBRyxDQUFDb0ssTUFBSixDQUFXRixTQUFYLENBQU47RUFDQSxPQUFPRCxVQUFQO0FBQ0QsQ0FaRDs7QUFjQXhJLE9BQU8sQ0FBQzRJLGtCQUFSLEdBQTZCLGVBQWVBLGtCQUFmLENBQW1DckssR0FBbkMsRUFBd0M2RyxHQUF4QyxFQUE2QztFQUN4RSxJQUFJO0lBQ0YsSUFBSSxPQUFNN0csR0FBRyxDQUFDc0ssV0FBSixFQUFOLElBQTBCLEVBQTlCLEVBQWtDO01BQ2hDLE1BQU10SyxHQUFHLENBQUMwSixLQUFKLENBQVUsQ0FBQyxVQUFELEVBQWEsS0FBYixFQUFvQixRQUFwQixFQUE4QixlQUE5QixFQUErQyxHQUEvQyxDQUFWLENBQU47SUFDRCxDQUZELE1BRU87TUFDTCxNQUFNMUosR0FBRyxDQUFDMEosS0FBSixDQUFVLENBQUMsUUFBRCxFQUFXLEtBQVgsRUFBa0I3QyxHQUFsQixFQUF1Qix1QkFBdkIsRUFBZ0QsT0FBaEQsQ0FBVixDQUFOO0lBQ0Q7RUFDRixDQU5ELENBTUUsT0FBT2tELEdBQVAsRUFBWTtJQUNaekosZUFBQSxDQUFPQyxJQUFQLENBQWEsd0NBQXVDc0csR0FBSSxNQUFLa0QsR0FBRyxDQUFDNUYsT0FBUSxFQUF6RTtFQUNEO0FBQ0YsQ0FWRDs7QUFZQTFDLE9BQU8sQ0FBQzhJLGdCQUFSLEdBQTJCLGVBQWVBLGdCQUFmLENBQWlDdkssR0FBakMsRUFBc0N3SyxPQUF0QyxFQUErQ0MsU0FBL0MsRUFBMEQ7RUFHbkYsTUFBTSxJQUFBQyxlQUFBLEVBQU0sQ0FBTixFQUFTLGVBQWVDLHFCQUFmLEdBQXdDO0lBQ3JELE1BQU0zSyxHQUFHLENBQUM0SSxnQkFBSixDQUFxQjRCLE9BQXJCLEVBQThCQyxTQUE5QixFQUF5QztNQUFDbkMsZ0JBQWdCLEVBQUU7SUFBbkIsQ0FBekMsQ0FBTjtFQUNELENBRkssQ0FBTjtBQUdELENBTkQ7O0FBZ0JBN0csT0FBTyxDQUFDbUosZUFBUixHQUEwQixlQUFlQSxlQUFmLENBQWdDNUssR0FBaEMsRUFBcUM2SyxVQUFVLEdBQUcsS0FBbEQsRUFBeUQ7RUFDakZ2SyxlQUFBLENBQU9xRCxLQUFQLENBQWEsbUNBQWI7O0VBRUEsSUFBSTtJQUNGLE1BQU1sQyxPQUFPLENBQUM4SSxnQkFBUixDQUF5QnZLLEdBQXpCLEVBQThCOEssY0FBOUIsRUFBK0N6TCxzQkFBL0MsRUFBdUV3TCxVQUF2RSxDQUFOO0VBQ0QsQ0FGRCxDQUVFLE9BQU9kLEdBQVAsRUFBWTtJQUNaLElBQUljLFVBQUosRUFBZ0I7TUFDZCxNQUFNZCxHQUFOO0lBQ0Q7O0lBRUR6SixlQUFBLENBQU9DLElBQVAsQ0FBYSxtQ0FBa0N1SyxjQUFnQixLQUFuRCxHQUNDLElBQUdmLEdBQUcsQ0FBQzVGLE9BQVEsdUNBRGhCLEdBRUEsMkRBRkEsR0FHQSw2Q0FIWjtFQUlEOztFQUlELElBQUksTUFBTW5FLEdBQUcsQ0FBQytLLGFBQUosQ0FBa0IxTCxzQkFBbEIsQ0FBVixFQUFxRDtJQUNuRGlCLGVBQUEsQ0FBT3FELEtBQVAsQ0FBYyxHQUFFdEUsc0JBQXVCLHVCQUExQixHQUNWLDRDQURIOztJQUVBO0VBQ0Q7O0VBRUQsSUFBSSxPQUFNVyxHQUFHLENBQUNzSyxXQUFKLEVBQU4sS0FBMkIsRUFBL0IsRUFBbUM7SUFFakMsTUFBTVUsS0FBSyxHQUFHLENBQUMscUJBQUQsRUFBd0Isc0JBQXhCLEVBQWdELHNCQUFoRCxDQUFkOztJQUNBMUssZUFBQSxDQUFPbUUsSUFBUCxDQUFhLHdCQUF1QnVHLEtBQU0sUUFBTzNMLHNCQUF1QixHQUF4RTs7SUFDQSxNQUFNVyxHQUFHLENBQUNzSSxnQkFBSixDQUFxQmpKLHNCQUFyQixFQUE2QzJMLEtBQUssQ0FBQ3BHLEdBQU4sQ0FBV3FHLENBQUQsSUFBUSxzQkFBcUJBLENBQUUsRUFBekMsQ0FBN0MsQ0FBTjtFQUNEOztFQUtELElBQUk7SUFDRixNQUFNakwsR0FBRyxDQUFDa0wseUJBQUosRUFBTjtFQUNELENBRkQsQ0FFRSxPQUFPbkIsR0FBUCxFQUFZO0lBQ1p6SixlQUFBLENBQU9xRCxLQUFQLENBQWFvRyxHQUFiOztJQUNBLElBQUljLFVBQUosRUFBZ0I7TUFDZCxNQUFNZCxHQUFOO0lBQ0Q7RUFDRjtBQUNGLENBMUNEOztBQTBEQXRJLE9BQU8sQ0FBQzBKLFdBQVIsR0FBc0IsZUFBZUEsV0FBZixDQUE0QnBJLFFBQTVCLEVBQXNDL0MsR0FBdEMsRUFBMkNVLElBQTNDLEVBQWlEO0VBQ3JFLE1BQU0wSyxTQUFTLEdBQUcsaUJBQWxCO0VBQ0EsTUFBTUMsV0FBVyxHQUFHLGNBQXBCOztFQUNBLE1BQU1DLFVBQVUsR0FBR0MsYUFBQSxDQUFLQyxLQUFMLENBQVdDLE9BQVgsQ0FBbUJMLFNBQW5CLEVBQThCQyxXQUE5QixDQUFuQjs7RUFHQSxNQUFNckwsR0FBRyxDQUFDMEwsTUFBSixDQUFXSixVQUFYLENBQU47RUFFQSxJQUFJekUsR0FBSjs7RUFDQSxJQUFJO0lBQ0ZBLEdBQUcsR0FBR25HLElBQUksQ0FBQ21HLEdBQUwsS0FBWSxNQUFNN0csR0FBRyxDQUFDMkwsT0FBSixDQUFZakwsSUFBSSxDQUFDb0csVUFBakIsRUFBNkJwRyxJQUFJLENBQUNrTCxNQUFsQyxDQUFsQixDQUFOO0VBQ0QsQ0FGRCxDQUVFLE9BQU83QixHQUFQLEVBQVk7SUFDWnpKLGVBQUEsQ0FBT21FLElBQVAsQ0FBYSwrQkFBOEIvRCxJQUFJLENBQUNvRyxVQUFXLFNBQVFwRyxJQUFJLENBQUNrTCxNQUFPLHNCQUFxQjdCLEdBQUcsQ0FBQzVGLE9BQVEsRUFBaEg7RUFDRDs7RUFFRCxJQUFJakUsZUFBQSxDQUFFMkwsT0FBRixDQUFVbkwsSUFBSSxDQUFDb0csVUFBZixLQUE4QixFQUFFLE1BQU1nRixXQUFBLENBQUdDLE1BQUgsQ0FBVWxGLEdBQVYsQ0FBUixDQUFsQyxFQUEyRDtJQUN6RHZHLGVBQUEsQ0FBT3FELEtBQVAsQ0FBYyxzREFBZDs7SUFDQSxPQUFPLEVBQVA7RUFDRDs7RUFFRCxNQUFNcUksYUFBYSxHQUFHVCxhQUFBLENBQUtFLE9BQUwsQ0FBYS9LLElBQUksQ0FBQ2tMLE1BQWxCLEVBQTBCbEwsSUFBSSxDQUFDb0csVUFBL0IsQ0FBdEI7O0VBQ0EsSUFBSTtJQUNGeEcsZUFBQSxDQUFPcUQsS0FBUCxDQUFhLDZCQUFiLEVBQTRDa0QsR0FBNUMsRUFBaUQ5RCxRQUFqRCxFQUEyRGlKLGFBQTNEOztJQUNBLE1BQU07TUFBQ0MsVUFBRDtNQUFhQztJQUFiLElBQTBCLE1BQU1sTSxHQUFHLENBQUNtTSxxQkFBSixDQUEwQnRGLEdBQTFCLEVBQStCOUQsUUFBL0IsRUFBeUNpSixhQUF6QyxDQUF0QztJQUNBLE1BQU1oTSxHQUFHLENBQUNlLElBQUosQ0FBU21MLFNBQVQsRUFBb0JkLFNBQXBCLENBQU47SUFDQSxPQUFPYSxVQUFQO0VBQ0QsQ0FMRCxDQUtFLE9BQU9sQyxHQUFQLEVBQVk7SUFDWnpKLGVBQUEsQ0FBT0MsSUFBUCxDQUFhLDZEQUE0RHdKLEdBQUcsQ0FBQzVGLE9BQVEsRUFBckY7O0lBQ0EsTUFBTW5FLEdBQUcsQ0FBQzBKLEtBQUosQ0FBVSxNQUFWLEVBQWtCLENBQUUsVUFBUzRCLFVBQVcsRUFBdEIsQ0FBbEIsQ0FBTjtFQUNELENBUkQsU0FRVTtJQUNSLE1BQU1RLFdBQUEsQ0FBR0osTUFBSCxDQUFVTSxhQUFWLENBQU47RUFDRDs7RUFDRCxPQUFPLEVBQVA7QUFDRCxDQWpDRDs7QUFtQ0F2SyxPQUFPLENBQUMySyxtQkFBUixHQUE4QixlQUFlQSxtQkFBZixDQUFvQ3BNLEdBQXBDLEVBQXlDO0VBQ3JFTSxlQUFBLENBQU9tRSxJQUFQLENBQVksa0JBQVo7O0VBR0EsSUFBSTRILFFBQVEsR0FBRyxJQUFmO0VBQ0EsTUFBTSxJQUFBM0IsZUFBQSxFQUFNLENBQU4sRUFBUyxlQUFlNEIsWUFBZixHQUErQjtJQUU1QyxJQUFJRCxRQUFKLEVBQWM7TUFDWkEsUUFBUSxHQUFHLEtBQVg7SUFDRCxDQUZELE1BRU87TUFDTCxJQUFJO1FBQ0YsSUFBSSxFQUFFLE1BQU1yTSxHQUFHLENBQUN1TSxjQUFKLEVBQVIsQ0FBSixFQUFtQztVQUNqQztRQUNEO01BQ0YsQ0FKRCxDQUlFLE9BQU9DLENBQVAsRUFBVTtRQUNWbE0sZUFBQSxDQUFPQyxJQUFQLENBQWEsNEJBQTJCaU0sQ0FBQyxDQUFDckksT0FBUSxFQUFsRDs7UUFDQTdELGVBQUEsQ0FBT0MsSUFBUCxDQUFZLG1EQUFaOztRQUNBRCxlQUFBLENBQU9DLElBQVAsQ0FBWSw4RkFBWjtNQUNEO0lBQ0Y7O0lBRURELGVBQUEsQ0FBT21FLElBQVAsQ0FBYSxhQUFZbkYsK0JBQWdDLEVBQXpEOztJQUNBLE1BQU1VLEdBQUcsQ0FBQzBKLEtBQUosQ0FBVSxDQUNkLElBRGMsRUFDUixPQURRLEVBRWQsSUFGYyxFQUVQLEdBQUVySyxzQkFBdUIsSUFBR0MsK0JBQWdDLEVBRnJELEVBR2QsSUFIYyxFQUdSLGtDQUhRLEVBSWQsSUFKYyxFQUlSLDRCQUpRLEVBS2QsSUFMYyxFQUtSLFlBTFEsQ0FBVixDQUFOO0lBT0EsTUFBTTRKLGlCQUFBLENBQUV1RCxLQUFGLENBQVEsSUFBUixDQUFOO0VBQ0QsQ0F6QkssQ0FBTjtBQTBCRCxDQS9CRDs7QUFpQ0FoTCxPQUFPLENBQUNpTCxNQUFSLEdBQWlCLGVBQWVBLE1BQWYsQ0FBdUJDLE1BQXZCLEVBQStCM00sR0FBL0IsRUFBb0M0TSxZQUFwQyxFQUFrRDtFQUNqRSxJQUFJLEVBQUUsTUFBTTVNLEdBQUcsQ0FBQ3VNLGNBQUosRUFBUixDQUFKLEVBQW1DO0lBQ2pDak0sZUFBQSxDQUFPbUUsSUFBUCxDQUFZLHdDQUFaOztJQUNBO0VBQ0Q7O0VBQ0RuRSxlQUFBLENBQU9xRCxLQUFQLENBQWEsb0NBQWI7O0VBRUEsSUFBSSxDQUFDaUosWUFBWSxDQUFDekwsVUFBZCxJQUE0QixDQUFDeUwsWUFBWSxDQUFDQyxTQUE5QyxFQUF5RDtJQUN2RHZNLGVBQUEsQ0FBT0MsSUFBUCxDQUFZLG1EQUFaOztJQUNBLE1BQU1rQixPQUFPLENBQUMySyxtQkFBUixDQUE0QnBNLEdBQTVCLENBQU47SUFDQTtFQUNEOztFQUVELE1BQU07SUFDSm1CLFVBREk7SUFFSjBMLFNBRkk7SUFHSkMsY0FISTtJQUlKQztFQUpJLElBS0ZDLHNCQUFBLENBQVNDLDBCQUFULENBQW9DTCxZQUFwQyxDQUxKOztFQU1BLElBQUlDLFNBQVMsSUFBSTFMLFVBQVUsS0FBSytMLGlDQUE1QixLQUNJaE4sZUFBQSxDQUFFaU4sS0FBRixDQUFRTCxjQUFSLEtBQTJCNU0sZUFBQSxDQUFFNEYsT0FBRixDQUFVZ0gsY0FBVixNQUE4QixjQUQ3RCxNQUVHLE1BQU05TSxHQUFHLENBQUNvTix5QkFBSixFQUZULENBQUosRUFFOEM7SUFDNUMsTUFBTUosc0JBQUEsQ0FBU0ssVUFBVCxDQUFvQnJOLEdBQXBCLEVBQXlCO01BQzdCc04sVUFBVSxFQUFFVCxTQURpQjtNQUU3QlUsY0FBYyxFQUFFck0sZ0JBQWdCLENBQUNDLFVBQUQ7SUFGSCxDQUF6QixDQUFOO0VBSUQsQ0FQRCxNQU9PO0lBQ0wsTUFBTXFNLFlBQVksR0FBRztNQUNuQixDQUFDcE0seUJBQUQsR0FBYzRMLHNCQUFBLENBQVNTLFNBREo7TUFFbkIsQ0FBQ3BNLG1DQUFELEdBQXdCMkwsc0JBQUEsQ0FBU1UscUJBRmQ7TUFHbkIsQ0FBQ3BNLDhCQUFELEdBQW1CMEwsc0JBQUEsQ0FBU1csY0FIVDtNQUluQixDQUFDcE0sNkJBQUQsR0FBa0J5TCxzQkFBQSxDQUFTWSxhQUpSO01BS25CLENBQUNWLGlDQUFELEdBQXNCRixzQkFBQSxDQUFTYTtJQUxaLEVBTW5CMU0sVUFObUIsQ0FBckI7SUFPQSxNQUFNcU0sWUFBWSxDQUFDeE4sR0FBRCxFQUFNMk0sTUFBTixFQUFjQyxZQUFkLENBQWxCO0VBQ0Q7O0VBQ0QsTUFBTW5MLE9BQU8sQ0FBQ3FNLFlBQVIsQ0FBcUI5TixHQUFyQixFQUEwQitNLG9CQUExQixDQUFOO0FBQ0QsQ0FyQ0Q7O0FBdUNBdEwsT0FBTyxDQUFDcU0sWUFBUixHQUF1QixlQUFlQSxZQUFmLENBQTZCOU4sR0FBN0IsRUFBa0MrTixTQUFTLEdBQUcsSUFBOUMsRUFBb0Q7RUFDekUsSUFBSTtJQUNGLE1BQU0sSUFBQUMsMEJBQUEsRUFBaUIsWUFBWSxFQUFFLE1BQU1oTyxHQUFHLENBQUN1TSxjQUFKLEVBQVIsQ0FBN0IsRUFBNEQ7TUFDaEUwQixNQUFNLEVBQUVGLFNBQUYsYUFBRUEsU0FBRixjQUFFQSxTQUFGLEdBQWUsSUFEMkM7TUFFaEVHLFVBQVUsRUFBRTtJQUZvRCxDQUE1RCxDQUFOO0VBSUQsQ0FMRCxDQUtFLE9BQU9wRyxHQUFQLEVBQVk7SUFDWixNQUFNLElBQUl0RyxLQUFKLENBQVUsc0NBQVYsQ0FBTjtFQUNEOztFQUNEbEIsZUFBQSxDQUFPbUUsSUFBUCxDQUFZLDJDQUFaO0FBQ0QsQ0FWRDs7QUFZQWhELE9BQU8sQ0FBQzBNLFVBQVIsR0FBcUIsZUFBZUEsVUFBZixDQUEyQm5PLEdBQTNCLEVBQWdDVSxJQUFoQyxFQUFzQztFQUN6RCxNQUFNO0lBQ0owTix3QkFESTtJQUVKcEwsTUFGSTtJQUdKRCxRQUhJO0lBSUpzTCxZQUpJO0lBS0pDLGVBTEk7SUFNSkMsc0JBTkk7SUFPSkMsVUFQSTtJQVFKQyxlQVJJO0lBU0pDLGlCQVRJO0lBVUpDLFlBVkk7SUFXSkM7RUFYSSxJQVlGbE8sSUFaSjs7RUFjQSxJQUFJME4sd0JBQUosRUFBOEI7SUFDNUI5TixlQUFBLENBQU9tRSxJQUFQLENBQWEsb0VBQWI7RUFDRCxDQUZELE1BRU87SUFDTCxNQUFNekUsR0FBRyxDQUFDNk8sYUFBSixFQUFOO0lBTUEsTUFBTUMsZ0JBQWdCLEdBQUcvTCxRQUFRLElBQzVCQyxNQURvQixJQUVwQnFMLFlBRm9CLElBR3BCQyxlQUhvQixJQUlwQkMsc0JBSm9CLElBS3BCLENBQUNDLFVBTE47SUFNQSxNQUFNL00sT0FBTyxDQUFDbUosZUFBUixDQUF3QjVLLEdBQXhCLEVBQTZCOE8sZ0JBQTdCLENBQU47RUFDRDs7RUFFRCxJQUFJLENBQUNyTixPQUFPLENBQUNzTixVQUFSLENBQW1CL08sR0FBbkIsRUFBd0JVLElBQXhCLENBQUQsS0FBbUMrTixlQUFlLElBQUl2TyxlQUFBLENBQUU4TyxXQUFGLENBQWNQLGVBQWQsQ0FBdEQsQ0FBSixFQUEyRjtJQUN6RixNQUFNaE4sT0FBTyxDQUFDNEksa0JBQVIsQ0FBMkJySyxHQUEzQixFQUFnQ3lPLGVBQWUsSUFBSXBQLHNCQUFuRCxDQUFOO0VBQ0Q7O0VBRUQsSUFBSTBELFFBQVEsSUFBSUMsTUFBaEIsRUFBd0I7SUFDdEIsTUFBTXZCLE9BQU8sQ0FBQ3FDLGtCQUFSLENBQTJCOUQsR0FBM0IsRUFBZ0MrQyxRQUFoQyxFQUEwQ0MsTUFBMUMsRUFBa0RxTCxZQUFsRCxDQUFOO0VBQ0Q7O0VBRUQsSUFBSUssaUJBQUosRUFBdUI7SUFDckJwTyxlQUFBLENBQU9tRSxJQUFQLENBQWEsK0RBQWI7RUFDRCxDQUZELE1BRU87SUFDTCxNQUFNekUsR0FBRyxDQUFDaVAsV0FBSixDQUFnQjtNQUNwQkMsTUFBTSxFQUFFUCxZQURZO01BRXBCUSxXQUFXLEVBQUVQO0lBRk8sQ0FBaEIsQ0FBTjtFQUlEOztFQUVELElBQUlOLGVBQUosRUFBcUI7SUFDbkIsT0FBTyxNQUFNN00sT0FBTyxDQUFDdUksbUJBQVIsQ0FBNEJoSyxHQUE1QixDQUFiO0VBQ0Q7QUFDRixDQXJERDs7QUF1REF5QixPQUFPLENBQUMyTixvQkFBUixHQUErQixTQUFTQSxvQkFBVCxDQUErQkMsR0FBL0IsRUFBb0M7RUFDakUsS0FBSyxJQUFJL0ksR0FBVCxJQUFnQnBHLGVBQUEsQ0FBRWdHLElBQUYsQ0FBT21KLEdBQVAsQ0FBaEIsRUFBNkI7SUFDM0IsSUFBSW5QLGVBQUEsQ0FBRW9QLE1BQUYsQ0FBU0QsR0FBRyxDQUFDL0ksR0FBRCxDQUFaLEtBQXNCcEcsZUFBQSxDQUFFOE8sV0FBRixDQUFjSyxHQUFHLENBQUMvSSxHQUFELENBQWpCLENBQTFCLEVBQW1EO01BQ2pELE9BQU8rSSxHQUFHLENBQUMvSSxHQUFELENBQVY7SUFDRDtFQUNGO0FBQ0YsQ0FORDs7QUFRQTdFLE9BQU8sQ0FBQzhOLGdCQUFSLEdBQTJCLFNBQVNBLGdCQUFULENBQTJCQyxNQUEzQixFQUFtQ0MsTUFBbkMsRUFBMkM7RUFDcEUsSUFBSUMsVUFBVSxHQUFHQyxJQUFJLENBQUNDLEdBQUwsQ0FBUyxFQUFULEVBQWFILE1BQWIsQ0FBakI7RUFBQSxJQUNJSSxXQUFXLEdBQUdMLE1BQU0sR0FBR0UsVUFEM0I7RUFBQSxJQUVJSSxZQUFZLEdBQUdILElBQUksQ0FBQ0UsV0FBVyxHQUFHLENBQWQsR0FBa0IsTUFBbEIsR0FBMkIsT0FBNUIsQ0FBSixDQUF5Q0EsV0FBekMsQ0FGbkI7RUFJQSxPQUFPQyxZQUFZLEdBQUdKLFVBQXRCO0FBQ0QsQ0FORDs7QUFRQWpPLE9BQU8sQ0FBQ3NPLGVBQVIsR0FBMEIsU0FBU0EsZUFBVCxDQUEwQjVRLE9BQTFCLEVBQW1DO0VBQzNELE9BQU9lLGVBQUEsQ0FBRUcsUUFBRixDQUFXWixNQUFNLENBQUN5RyxJQUFQLENBQVlySCwrQkFBWixDQUFYLEVBQXlELENBQUNNLE9BQU8sSUFBSSxFQUFaLEVBQWdCOEksV0FBaEIsRUFBekQsQ0FBUDtBQUNELENBRkQ7O0FBSUF4RyxPQUFPLENBQUN1TyxZQUFSLEdBQXVCLFNBQVNBLFlBQVQsQ0FBdUI3USxPQUF2QixFQUFnQztFQUNyRCxPQUFPTiwrQkFBK0IsQ0FBQ00sT0FBTyxDQUFDOEksV0FBUixFQUFELENBQS9CLElBQTBEcEosK0JBQStCLENBQUNPLE9BQWpHO0FBQ0QsQ0FGRDs7QUFJQXFDLE9BQU8sQ0FBQ3dPLGlDQUFSLEdBQTRDLGVBQWVBLGlDQUFmLENBQWtEQyxNQUFsRCxFQUEwREMsU0FBMUQsRUFBcUU7RUFDL0csSUFBSSxDQUFDRCxNQUFELElBQVcsQ0FBQ2hRLGVBQUEsQ0FBRWtRLFVBQUYsQ0FBYUYsTUFBTSxDQUFDRyxvQkFBcEIsQ0FBaEIsRUFBMkQ7SUFDekQ7RUFDRDs7RUFFRCxNQUFNQyxjQUFjLEdBQUcsTUFBTUosTUFBTSxDQUFDRyxvQkFBUCxDQUE0QkYsU0FBNUIsQ0FBN0I7O0VBQ0EsS0FBSyxNQUFNSSxRQUFYLElBQXVCclEsZUFBQSxDQUFFZ0csSUFBRixDQUFPb0ssY0FBUCxDQUF2QixFQUErQztJQUM3QyxNQUFNSixNQUFNLENBQUNNLHNCQUFQLENBQThCRCxRQUE5QixDQUFOO0VBQ0Q7QUFDRixDQVREOztBQWlCQTlPLE9BQU8sQ0FBQ2dQLFVBQVIsR0FBcUIsU0FBU0EsVUFBVCxDQUFxQkMsR0FBckIsRUFBMEI7RUFDN0MsSUFBSUMsVUFBSjs7RUFDQSxJQUFJO0lBQ0ZBLFVBQVUsR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdILEdBQVgsQ0FBYjtFQUNELENBRkQsQ0FFRSxPQUFPNUksR0FBUCxFQUFZLENBQUc7O0VBRWpCLElBQUk1SCxlQUFBLENBQUVZLE9BQUYsQ0FBVTZQLFVBQVYsQ0FBSixFQUEyQjtJQUN6QixPQUFPQSxVQUFQO0VBQ0QsQ0FGRCxNQUVPLElBQUl6USxlQUFBLENBQUU4RCxRQUFGLENBQVcwTSxHQUFYLENBQUosRUFBcUI7SUFDMUIsT0FBTyxDQUFDQSxHQUFELENBQVA7RUFDRDs7RUFFRCxNQUFNLElBQUlsUCxLQUFKLENBQVcsaURBQWdEa1AsR0FBSSxFQUEvRCxDQUFOO0FBQ0QsQ0FiRDs7QUFzQkFqUCxPQUFPLENBQUNxUCxtQkFBUixHQUE4QixTQUFTQSxtQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0M7RUFDaEUsSUFBSUEsSUFBSSxDQUFDQyxXQUFULEVBQXNCO0lBQ3BCLElBQUlELElBQUksQ0FBQ2xLLEdBQVQsRUFBYztNQUVadkcsZUFBQSxDQUFPQyxJQUFQLENBQWEseUZBQWI7SUFDRDs7SUFDRCxJQUFJd1EsSUFBSSxDQUFDakssVUFBVCxFQUFxQjtNQUNuQnhHLGVBQUEsQ0FBT3VFLGFBQVAsQ0FBc0IsNEVBQXRCO0lBQ0Q7RUFDRjs7RUFFRCxJQUFJa00sSUFBSSxDQUFDMUgsc0JBQVQsRUFBaUM7SUFDL0IsSUFBSTtNQUNGLEtBQUtvSCxVQUFMLENBQWdCTSxJQUFJLENBQUMxSCxzQkFBckI7SUFDRCxDQUZELENBRUUsT0FBT21ELENBQVAsRUFBVTtNQUNWbE0sZUFBQSxDQUFPdUUsYUFBUCxDQUFzQix3REFBdUQySCxDQUFDLENBQUNySSxPQUFRLEVBQXZGO0lBQ0Q7RUFDRjs7RUFFRCxPQUFPLElBQVA7QUFDRCxDQXBCRDs7QUErQkExQyxPQUFPLENBQUN3UCx3QkFBUixHQUFtQyxTQUFTQSx3QkFBVCxDQUFtQ0YsSUFBSSxHQUFHLEVBQTFDLEVBQThDO0VBQy9FLE1BQU07SUFBRUM7RUFBRixJQUFrQkQsSUFBeEI7O0VBQ0F6USxlQUFBLENBQU9tRSxJQUFQLENBQWEsaURBQWI7O0VBQ0FuRSxlQUFBLENBQU9tRSxJQUFQLENBQWEsNEJBQTJCbU0sSUFBSSxDQUFDTSxTQUFMLENBQWVoUixlQUFBLENBQUVnRyxJQUFGLENBQU9ySCwrQkFBUCxDQUFmLENBQXdELEVBQWhHOztFQUNBLElBQUlrUyxJQUFJLENBQUNqSyxVQUFMLElBQW1CaUssSUFBSSxDQUFDaEssV0FBNUIsRUFBeUM7SUFDdkN6RyxlQUFBLENBQU9tRSxJQUFQLENBQWEsZ0VBQStEdU0sV0FBWSxJQUE1RSxHQUNWLGlEQURGOztJQUVBLE9BQU9ELElBQVA7RUFDRDs7RUFFRCxNQUFNO0lBQUNoUyxHQUFEO0lBQU1DO0VBQU4sSUFBa0IsS0FBS2dSLFlBQUwsQ0FBa0JnQixXQUFsQixDQUF4QjtFQUNBRCxJQUFJLENBQUNqSyxVQUFMLEdBQWtCL0gsR0FBbEI7RUFDQWdTLElBQUksQ0FBQ2hLLFdBQUwsR0FBbUIvSCxRQUFuQjs7RUFDQXNCLGVBQUEsQ0FBT21FLElBQVAsQ0FBYSxzRUFBcUUxRixHQUFJLElBQUdDLFFBQVMsR0FBdEYsR0FDVCxRQUFPZ1MsV0FBWSxHQUR0Qjs7RUFFQTFRLGVBQUEsQ0FBT21FLElBQVAsQ0FBYSx3RkFBRCxHQUNULG1HQURTLEdBRVQsZ0JBRkg7O0VBR0EsT0FBT3NNLElBQVA7QUFDRCxDQW5CRDs7QUE0QkF0UCxPQUFPLENBQUNzTixVQUFSLEdBQXFCLFNBQVNBLFVBQVQsQ0FBcUIvTyxHQUFyQixFQUEwQlUsSUFBMUIsRUFBZ0M7RUFDbkQsTUFBTXlRLGFBQWEsR0FBRyxDQUFDelEsSUFBSSxDQUFDMkQsSUFBTixFQUFZckUsR0FBWixhQUFZQSxHQUFaLHVCQUFZQSxHQUFHLENBQUV1RSxXQUFqQixDQUF0QjtFQUNBLE9BQU8sQ0FBQyxDQUFDN0QsSUFBSSxDQUFDa0MsR0FBUCxJQUFjdU8sYUFBYSxDQUFDQyxJQUFkLENBQW9CbkcsQ0FBRCxJQUFPMUwsZ0JBQWdCLENBQUM4UixJQUFqQixDQUFzQnBHLENBQXRCLENBQTFCLENBQXJCO0FBQ0QsQ0FIRDs7QUFLQXhKLE9BQU8sQ0FBQzZQLFNBQVIsR0FBb0JDLGtCQUFwQjtBQUNBOVAsT0FBTyxDQUFDdUwsUUFBUixHQUFtQkEsc0JBQW5CO2VBR2V2TCxPIn0=
914
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2FuZHJvaWQtaGVscGVycy5qcyIsIm5hbWVzIjpbIlBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUIiwiQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSIsImNocm9tZSIsInBrZyIsImFjdGl2aXR5IiwiY2hyb21pdW0iLCJjaHJvbWViZXRhIiwiYnJvd3NlciIsImRlZmF1bHQiLCJTRVRUSU5HU19IRUxQRVJfUEtHX0lEIiwiU0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWSIsIkVNVUxBVE9SX1BBVFRFUk4iLCJBUFBfU1RBVEUiLCJPYmplY3QiLCJmcmVlemUiLCJOT1RfSU5TVEFMTEVEIiwiTk9UX1JVTk5JTkciLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJhZGIiLCJuZXR3b3JrU3BlZWQiLCJfIiwidmFsdWVzIiwiTkVUV09SS19TUEVFRCIsImluY2x1ZGVzIiwibG9nZ2VyIiwid2FybiIsIkZVTEwiLCJwcmVwYXJlQXZkQXJncyIsIm9wdHMiLCJpc0hlYWRsZXNzIiwiYXZkQXJncyIsInJlc3VsdCIsImlzQXJyYXkiLCJwdXNoIiwidXRpbCIsInNoZWxsUGFyc2UiLCJ0b0NyZWRlbnRpYWxUeXBlIiwidW5sb2NrVHlwZSIsIlBJTl9VTkxPQ0siLCJQSU5fVU5MT0NLX0tFWV9FVkVOVCIsIlBBU1NXT1JEX1VOTE9DSyIsIlBBVFRFUk5fVU5MT0NLIiwiRXJyb3IiLCJoZWxwZXJzIiwiY3JlYXRlQmFzZUFEQiIsImFkYlBvcnQiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInJlbW90ZUFwcHNDYWNoZUxpbWl0IiwiYnVpbGRUb29sc1ZlcnNpb24iLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiYWxsb3dEZWxheUFkYiIsIkFEQiIsImNyZWF0ZUFEQiIsInByZXBhcmVFbXVsYXRvciIsImF2ZCIsImF2ZEVudiIsImVudiIsImxhbmd1YWdlIiwibG9jYWxlIiwiY291bnRyeSIsImF2ZExhdW5jaFRpbWVvdXQiLCJsYXVuY2hUaW1lb3V0IiwiYXZkUmVhZHlUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwiYXZkTmFtZSIsInJlcGxhY2UiLCJydW5uaW5nQVZEIiwiZ2V0UnVubmluZ0FWRCIsImFyZ3MiLCJkZWJ1ZyIsImtpbGxFbXVsYXRvciIsImxhdW5jaEFWRCIsImVuc3VyZURldmljZUxvY2FsZSIsInNjcmlwdCIsImlzU3RyaW5nIiwic2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IiwiZW5zdXJlQ3VycmVudExvY2FsZSIsIm1lc3NhZ2UiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJ1ZGlkIiwiZW1Qb3J0IiwiY3VyRGV2aWNlSWQiLCJlbXVsYXRvclBvcnQiLCJpbmZvIiwiZGV2aWNlcyIsImdldERldmljZXNXaXRoUmV0cnkiLCJtYXAiLCJlcnJvckFuZFRocm93IiwiZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyIsInBsYXRmb3JtVmVyc2lvbiIsInRyaW0iLCJzZW12ZXIiLCJjb2VyY2UiLCJhdmFpbERldmljZXMiLCJwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUiLCJkZXZpY2UiLCJzZXREZXZpY2VJZCIsInJhd0RldmljZU9TIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlT1MiLCJib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQiLCJ2YWxpZCIsImJvdGhWZXJzaW9uc0FyZVN0cmluZ3MiLCJ2ZXJzaW9uIiwidG9Mb3dlciIsIm1ham9yIiwibWlub3IiLCJndCIsImtleXMiLCJqb2luIiwic2V0RW11bGF0b3JQb3J0IiwidmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyIsImtleSIsIm5hbWUiLCJtYXRjaCIsImV4ZWMiLCJpbmRleCIsInN1YnN0cmluZyIsImdldExhdW5jaEluZm8iLCJhcHAiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXRBY3Rpdml0eSIsImFwa1BhY2thZ2UiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInJlc2V0QXBwIiwiZmFzdFJlc2V0IiwiZnVsbFJlc2V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiYXV0b0dyYW50UGVybWlzc2lvbnMiLCJhbGxvd1Rlc3RQYWNrYWdlcyIsImlzSW5zdGFsbGVkIiwiaXNBcHBJbnN0YWxsZWQiLCJmb3JjZVN0b3AiLCJpZ24iLCJvdXRwdXQiLCJjbGVhciIsInRvTG93ZXJDYXNlIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImVycm9yIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbCIsImdyYW50UGVybWlzc2lvbnMiLCJ0aW1lb3V0IiwiaW5zdGFsbEFwayIsImVuZm9yY2VBcHBJbnN0YWxsIiwiYXBwU3RhdGUiLCJ3YXNVbmluc3RhbGxlZCIsImluc3RhbGxPclVwZ3JhZGUiLCJlbmZvcmNlQ3VycmVudEJ1aWxkIiwiaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAiLCJBUFBfSU5TVEFMTF9TVEFURSIsImluc3RhbGxPdGhlckFwa3MiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwib3RoZXJBcHAiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYXBwUGFja2FnZXMiLCJmaWx0ZXJQYWNrYWdlcyIsImdldFRoaXJkUGFydHlQYWNrYWdlcyIsInBhY2thZ2VzU3RyaW5nIiwic2hlbGwiLCJhcHBQYWNrYWdlc0FycmF5Iiwic3BsaXQiLCJFT0wiLCJkaWZmZXJlbmNlIiwiZXJyIiwiaW5pdFVuaWNvZGVLZXlib2FyZCIsImRlZmF1bHRJTUUiLCJhcHBpdW1JTUUiLCJlbmFibGVJTUUiLCJzZXRJTUUiLCJzZXRNb2NrTG9jYXRpb25BcHAiLCJnZXRBcGlMZXZlbCIsImluc3RhbGxIZWxwZXJBcHAiLCJhcGtQYXRoIiwicGFja2FnZUlkIiwicmV0cnkiLCJyZXRyeUluc3RhbGxIZWxwZXJBcHAiLCJwdXNoU2V0dGluZ3NBcHAiLCJ0aHJvd0Vycm9yIiwic2V0dGluZ3NBcGtQYXRoIiwicHJvY2Vzc0V4aXN0cyIsImFwaUxldmVsIiwicGVybXMiLCJ4IiwicmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCIsInB1c2hTdHJpbmdzIiwicmVtb3RlRGlyIiwic3RyaW5nc0pzb24iLCJyZW1vdGVGaWxlIiwicGF0aCIsInBvc2l4IiwicmVzb2x2ZSIsInJpbXJhZiIsInB1bGxBcGsiLCJ0bXBEaXIiLCJpc0VtcHR5IiwiZnMiLCJleGlzdHMiLCJzdHJpbmdzVG1wRGlyIiwiYXBrU3RyaW5ncyIsImxvY2FsUGF0aCIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsInVubG9ja1dpdGhIZWxwZXJBcHAiLCJmaXJzdFJ1biIsImxhdW5jaEhlbHBlciIsImlzU2NyZWVuTG9ja2VkIiwiZSIsImRlbGF5IiwidW5sb2NrIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwidW5sb2NrS2V5IiwidW5sb2NrU3RyYXRlZ3kiLCJ1bmxvY2tTdWNjZXNzVGltZW91dCIsInVubG9ja2VyIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJpc05pbCIsImlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQiLCJmYXN0VW5sb2NrIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwidW5sb2NrTWV0aG9kIiwicGluVW5sb2NrIiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGFzc3dvcmRVbmxvY2siLCJwYXR0ZXJuVW5sb2NrIiwiZmluZ2VycHJpbnRVbmxvY2siLCJ2ZXJpZnlVbmxvY2siLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluaXREZXZpY2UiLCJza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24iLCJsb2NhbGVTY3JpcHQiLCJ1bmljb2RlS2V5Ym9hcmQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic2tpcFVubG9jayIsIm1vY2tMb2NhdGlvbkFwcCIsInNraXBMb2djYXRDYXB0dXJlIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJ3YWl0Rm9yRGV2aWNlIiwic2hvdWxkVGhyb3dFcnJvciIsImlzRW11bGF0b3IiLCJpc1VuZGVmaW5lZCIsInN0YXJ0TG9nY2F0IiwiZm9ybWF0IiwiZmlsdGVyU3BlY3MiLCJyZW1vdmVOdWxsUHJvcGVydGllcyIsIm9iaiIsImlzTnVsbCIsInRydW5jYXRlRGVjaW1hbHMiLCJudW1iZXIiLCJkaWdpdHMiLCJtdWx0aXBsaWVyIiwiTWF0aCIsInBvdyIsImFkanVzdGVkTnVtIiwidHJ1bmNhdGVkTnVtIiwiaXNDaHJvbWVCcm93c2VyIiwiZ2V0Q2hyb21lUGtnIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwic2Vzc2lvbklkIiwiaXNGdW5jdGlvbiIsImdldFdlYlNvY2tldEhhbmRsZXJzIiwiYWN0aXZlSGFuZGxlcnMiLCJwYXRobmFtZSIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJwYXJzZUFycmF5IiwiY2FwIiwicGFyc2VkQ2FwcyIsIkpTT04iLCJwYXJzZSIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiYnJvd3Nlck5hbWUiLCJhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMiLCJzdHJpbmdpZnkiLCJwb3NzaWJsZU5hbWVzIiwic29tZSIsInRlc3QiLCJib290c3RyYXAiLCJCb290c3RyYXAiXSwic291cmNlUm9vdCI6Ii4uLy4uIiwic291cmNlcyI6WyJsaWIvYW5kcm9pZC1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJldHJ5LCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmcywgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHBhdGggYXMgc2V0dGluZ3NBcGtQYXRoIH0gZnJvbSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmltcG9ydCBCb290c3RyYXAgZnJvbSAnLi9ib290c3RyYXAnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IEFEQiBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgdW5sb2NrZXIsIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULFxuICBQQVNTV09SRF9VTkxPQ0ssIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbn0gZnJvbSAnLi91bmxvY2staGVscGVycyc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmNvbnN0IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUID0gOTAwMDA7IC8vIG1pbGxpc2Vjb25kc1xuLy8gaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG5jb25zdCBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZID0ge1xuICBjaHJvbWU6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBjaHJvbWl1bToge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnLkNocm9tZVNoZWxsQWN0aXZpdHknLFxuICB9LFxuICBjaHJvbWViZXRhOiB7XG4gICAgcGtnOiAnY29tLmNocm9tZS5iZXRhJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgYnJvd3Nlcjoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmJyb3dzZXInLFxuICAgIGFjdGl2aXR5OiAnY29tLmFuZHJvaWQuYnJvd3Nlci5Ccm93c2VyQWN0aXZpdHknLFxuICB9LFxuICAnY2hyb21pdW0tYnJvd3Nlcic6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgJ2Nocm9taXVtLXdlYnZpZXcnOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwuV2ViVmlld0Jyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gIGRlZmF1bHQ6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxufTtcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgPSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFkgPSAnLlVubG9jayc7XG5jb25zdCBFTVVMQVRPUl9QQVRURVJOID0gL1xcYmVtdWxhdG9yXFxiL2k7XG4vLyBUaGVzZSBjb25zdGFudHMgYXJlIGluIHN5bmMgd2l0aFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWlhcHBsaWNhdGlvbnN0YXRlL3hjdWlhcHBsaWNhdGlvbnN0YXRlcnVubmluZ2JhY2tncm91bmQ/bGFuZ3VhZ2U9b2JqY1xuY29uc3QgQVBQX1NUQVRFID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5PVF9JTlNUQUxMRUQ6IDAsXG4gIE5PVF9SVU5OSU5HOiAxLFxuICBSVU5OSU5HX0lOX0JBQ0tHUk9VTkQ6IDMsXG4gIFJVTk5JTkdfSU5fRk9SRUdST1VORDogNFxufSk7XG5cblxuZnVuY3Rpb24gZW5zdXJlTmV0d29ya1NwZWVkIChhZGIsIG5ldHdvcmtTcGVlZCkge1xuICBpZiAoXy52YWx1ZXMoYWRiLk5FVFdPUktfU1BFRUQpLmluY2x1ZGVzKG5ldHdvcmtTcGVlZCkpIHtcbiAgICByZXR1cm4gbmV0d29ya1NwZWVkO1xuICB9XG4gIGxvZ2dlci53YXJuKGBXcm9uZyBuZXR3b3JrIHNwZWVkIHBhcmFtICcke25ldHdvcmtTcGVlZH0nLCB1c2luZyBkZWZhdWx0OiAke2FkYi5ORVRXT1JLX1NQRUVELkZVTEx9LiBgICtcbiAgICBgU3VwcG9ydGVkIHZhbHVlczogJHtfLnZhbHVlcyhhZGIuTkVUV09SS19TUEVFRCl9YCk7XG4gIHJldHVybiBhZGIuTkVUV09SS19TUEVFRC5GVUxMO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlQXZkQXJncyAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBuZXR3b3JrU3BlZWQsXG4gICAgaXNIZWFkbGVzcyxcbiAgICBhdmRBcmdzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGlmIChhdmRBcmdzKSB7XG4gICAgaWYgKF8uaXNBcnJheShhdmRBcmdzKSkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uYXZkQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLih1dGlsLnNoZWxsUGFyc2UoYCR7YXZkQXJnc31gKSkpO1xuICAgIH1cbiAgfVxuICBpZiAobmV0d29ya1NwZWVkKSB7XG4gICAgcmVzdWx0LnB1c2goJy1uZXRzcGVlZCcsIGVuc3VyZU5ldHdvcmtTcGVlZChhZGIsIG5ldHdvcmtTcGVlZCkpO1xuICB9XG4gIGlmIChpc0hlYWRsZXNzKSB7XG4gICAgcmVzdWx0LnB1c2goJy1uby13aW5kb3cnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB0b0NyZWRlbnRpYWxUeXBlICh1bmxvY2tUeXBlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBbUElOX1VOTE9DS106ICdwaW4nLFxuICAgIFtQSU5fVU5MT0NLX0tFWV9FVkVOVF06ICdwaW4nLFxuICAgIFtQQVNTV09SRF9VTkxPQ0tdOiAncGFzc3dvcmQnLFxuICAgIFtQQVRURVJOX1VOTE9DS106ICdwYXR0ZXJuJyxcbiAgfVt1bmxvY2tUeXBlXTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScgaXMgbm90IGtub3duYCk7XG59XG5cblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5oZWxwZXJzLmNyZWF0ZUJhc2VBREIgPSBhc3luYyBmdW5jdGlvbiBjcmVhdGVCYXNlQURCIChvcHRzID0ge30pIHtcbiAgLy8gZmlsdGVyIG91dCBhbnkgdW53YW50ZWQgb3B0aW9ucyBzZW50IGluXG4gIC8vIHRoaXMgbGlzdCBzaG91bGQgYmUgdXBkYXRlZCBhcyBBREIgdGFrZXMgbW9yZSBhcmd1bWVudHNcbiAgY29uc3Qge1xuICAgIGFkYlBvcnQsXG4gICAgc3VwcHJlc3NLaWxsU2VydmVyLFxuICAgIHJlbW90ZUFkYkhvc3QsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICBhZGJFeGVjVGltZW91dCxcbiAgICB1c2VLZXlzdG9yZSxcbiAgICBrZXlzdG9yZVBhdGgsXG4gICAga2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZCxcbiAgICByZW1vdGVBcHBzQ2FjaGVMaW1pdCxcbiAgICBidWlsZFRvb2xzVmVyc2lvbixcbiAgICBhbGxvd09mZmxpbmVEZXZpY2VzLFxuICAgIGFsbG93RGVsYXlBZGIsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgQURCLmNyZWF0ZUFEQih7XG4gICAgYWRiUG9ydCxcbiAgICBzdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgcmVtb3RlQWRiSG9zdCxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgIGFkYkV4ZWNUaW1lb3V0LFxuICAgIHVzZUtleXN0b3JlLFxuICAgIGtleXN0b3JlUGF0aCxcbiAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkLFxuICAgIHJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIGJ1aWxkVG9vbHNWZXJzaW9uLFxuICAgIGFsbG93T2ZmbGluZURldmljZXMsXG4gICAgYWxsb3dEZWxheUFkYixcbiAgfSk7XG59O1xuXG5oZWxwZXJzLnByZXBhcmVFbXVsYXRvciA9IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBhdmQsXG4gICAgYXZkRW52OiBlbnYsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbG9jYWxlOiBjb3VudHJ5LFxuICAgIGF2ZExhdW5jaFRpbWVvdXQ6IGxhdW5jaFRpbWVvdXQsXG4gICAgYXZkUmVhZHlUaW1lb3V0OiByZWFkeVRpbWVvdXQsXG4gIH0gPSBvcHRzO1xuICBpZiAoIWF2ZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxhdW5jaCBBVkQgd2l0aG91dCBBVkQgbmFtZScpO1xuICB9XG5cbiAgY29uc3QgYXZkTmFtZSA9IGF2ZC5yZXBsYWNlKCdAJywgJycpO1xuICBjb25zdCBydW5uaW5nQVZEID0gYXdhaXQgYWRiLmdldFJ1bm5pbmdBVkQoYXZkTmFtZSk7XG4gIGNvbnN0IGFyZ3MgPSBwcmVwYXJlQXZkQXJncyhhZGIsIG9wdHMpO1xuICBpZiAocnVubmluZ0FWRCkge1xuICAgIGlmIChhcmdzLmluY2x1ZGVzKCctd2lwZS1kYXRhJykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgS2lsbGluZyAnJHthdmROYW1lfScgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSB3aXBlZCBhdCBzdGFydC5gKTtcbiAgICAgIGF3YWl0IGFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTm90IGxhdW5jaGluZyBBVkQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGF3YWl0IGFkYi5sYXVuY2hBVkQoYXZkLCB7XG4gICAgYXJncyxcbiAgICBlbnYsXG4gICAgbGFuZ3VhZ2UsXG4gICAgY291bnRyeSxcbiAgICBsYXVuY2hUaW1lb3V0LFxuICAgIHJlYWR5VGltZW91dCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFNldCBhbmQgZW5zdXJlIHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UuIFRoZSBsYW5ndWFnZSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIGxvd2VyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezIsOH0uIGUuZy4gZW4sIGphIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgY291bnRyeSAocmVnaW9uKSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHVwcGVyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezJ9IHwgWzAtOV17M30uIGUuZy4gVVMsIEpQIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezR9LiBlLmcuIEhhbnMgaW4gemgtSGFucy1DTiA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gc2V0IGxvY2FsZSBwcm9wZXJseVxuICovXG5oZWxwZXJzLmVuc3VyZURldmljZUxvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUxvY2FsZSAoYWRiLCBsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0ID0gbnVsbCkge1xuICBpZiAoIV8uaXNTdHJpbmcobGFuZ3VhZ2UpICYmICFfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgbG9nZ2VyLndhcm4oYHNldERldmljZUxhbmd1YWdlQ291bnRyeSByZXF1aXJlcyBsYW5ndWFnZSBvciBjb3VudHJ5LmApO1xuICAgIGxvZ2dlci53YXJuKGBHb3QgbGFuZ3VhZ2U6ICcke2xhbmd1YWdlfScgYW5kIGNvdW50cnk6ICcke2NvdW50cnl9J2ApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5zZXREZXZpY2VMYW5ndWFnZUNvdW50cnkobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCk7XG5cbiAgaWYgKCFhd2FpdCBhZGIuZW5zdXJlQ3VycmVudExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBzY3JpcHQgPyBgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2V9LCBjb3VudHJ5OiAke2NvdW50cnl9IGFuZCBzY3JpcHQ6ICR7c2NyaXB0fWAgOiBgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2V9IGFuZCBjb3VudHJ5OiAke2NvdW50cnl9YDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzZXQgJHttZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2FwcyA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUluZm9Gcm9tQ2FwcyAob3B0cyA9IHt9KSB7XG4gIC8vIHdlIGNhbiBjcmVhdGUgYSB0aHJvd2F3YXkgQURCIGluc3RhbmNlIGhlcmUsIHNvIHRoZXJlIGlzIG5vIGRlcGVuZGVuY3lcbiAgLy8gb24gaW5zdGFudGlhdGluZyBvbiBlYXJsaWVyIChhdCB0aGlzIHBvaW50LCB3ZSBoYXZlIG5vIHVkaWQpXG4gIC8vIHdlIGNhbiBvbmx5IHVzZSB0aGlzIEFEQiBvYmplY3QgZm9yIGNvbW1hbmRzIHRoYXQgd291bGQgbm90IGJlIGNvbmZ1c2VkXG4gIC8vIGlmIG11bHRpcGxlIGRldmljZXMgYXJlIGNvbm5lY3RlZFxuICBjb25zdCBhZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUJhc2VBREIob3B0cyk7XG4gIGxldCB1ZGlkID0gb3B0cy51ZGlkO1xuICBsZXQgZW1Qb3J0ID0gbnVsbDtcblxuICAvLyBhIHNwZWNpZmljIGF2ZCBuYW1lIHdhcyBnaXZlbi4gdHJ5IHRvIGluaXRpYWxpemUgd2l0aCB0aGF0XG4gIGlmIChvcHRzLmF2ZCkge1xuICAgIGF3YWl0IGhlbHBlcnMucHJlcGFyZUVtdWxhdG9yKGFkYiwgb3B0cyk7XG4gICAgdWRpZCA9IGFkYi5jdXJEZXZpY2VJZDtcbiAgICBlbVBvcnQgPSBhZGIuZW11bGF0b3JQb3J0O1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIGF2ZCBnaXZlbi4gbGV0cyB0cnkgd2hhdGV2ZXIncyBwbHVnZ2VkIGluIGRldmljZXMvZW11bGF0b3JzXG4gICAgbG9nZ2VyLmluZm8oJ1JldHJpZXZpbmcgZGV2aWNlIGxpc3QnKTtcbiAgICBsZXQgZGV2aWNlcyA9IGF3YWl0IGFkYi5nZXREZXZpY2VzV2l0aFJldHJ5KCk7XG5cbiAgICAvLyB1ZGlkIHdhcyBnaXZlbiwgbGV0cyB0cnkgdG8gaW5pdCB3aXRoIHRoYXQgZGV2aWNlXG4gICAgaWYgKHVkaWQpIHtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhfLm1hcChkZXZpY2VzLCAndWRpZCcpLCB1ZGlkKSkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgRGV2aWNlICR7dWRpZH0gd2FzIG5vdCBpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgZGV2aWNlc2ApO1xuICAgICAgfVxuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfSBlbHNlIGlmIChvcHRzLnBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgb3B0cy5wbGF0Zm9ybVZlcnNpb24gPSBgJHtvcHRzLnBsYXRmb3JtVmVyc2lvbn1gLnRyaW0oKTtcblxuICAgICAgLy8gYSBwbGF0Zm9ybSB2ZXJzaW9uIHdhcyBnaXZlbi4gbGV0cyB0cnkgdG8gZmluZCBhIGRldmljZSB3aXRoIHRoZSBzYW1lIG9zXG4gICAgICBjb25zdCBwbGF0Zm9ybVZlcnNpb24gPSBzZW12ZXIuY29lcmNlKG9wdHMucGxhdGZvcm1WZXJzaW9uKSB8fCBvcHRzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICAgIGxvZ2dlci5pbmZvKGBMb29raW5nIGZvciBhIGRldmljZSB3aXRoIEFuZHJvaWQgJyR7cGxhdGZvcm1WZXJzaW9ufSdgKTtcblxuICAgICAgLy8gaW4gY2FzZSB3ZSBmYWlsIHRvIGZpbmQgc29tZXRoaW5nLCBnaXZlIHRoZSB1c2VyIGEgdXNlZnVsIGxvZyB0aGF0IGhhc1xuICAgICAgLy8gdGhlIGRldmljZSB1ZGlkcyBhbmQgb3MgdmVyc2lvbnMgc28gdGhleSBrbm93IHdoYXQncyBhdmFpbGFibGVcbiAgICAgIGNvbnN0IGF2YWlsRGV2aWNlcyA9IFtdO1xuICAgICAgbGV0IHBhcnRpYWxNYXRjaENhbmRpZGF0ZSA9IG51bGw7XG4gICAgICAvLyBmaXJzdCB0cnkgc3RhcnRlZCBkZXZpY2VzL2VtdWxhdG9yc1xuICAgICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgZGV2aWNlcykge1xuICAgICAgICAvLyBkaXJlY3QgYWRiIGNhbGxzIHRvIHRoZSBzcGVjaWZpYyBkZXZpY2VcbiAgICAgICAgYXdhaXQgYWRiLnNldERldmljZUlkKGRldmljZS51ZGlkKTtcbiAgICAgICAgY29uc3QgcmF3RGV2aWNlT1MgPSBhd2FpdCBhZGIuZ2V0UGxhdGZvcm1WZXJzaW9uKCk7XG4gICAgICAgIC8vIFRoZSBkZXZpY2UgT1MgY291bGQgZWl0aGVyIGJlIGEgbnVtYmVyLCBsaWtlIGA2LjBgXG4gICAgICAgIC8vIG9yIGFuIGFiYnJldmlhdGlvbiwgbGlrZSBgUmBcbiAgICAgICAgYXZhaWxEZXZpY2VzLnB1c2goYCR7ZGV2aWNlLnVkaWR9ICgke3Jhd0RldmljZU9TfSlgKTtcbiAgICAgICAgY29uc3QgZGV2aWNlT1MgPSBzZW12ZXIuY29lcmNlKHJhd0RldmljZU9TKSB8fCByYXdEZXZpY2VPUztcbiAgICAgICAgaWYgKCFkZXZpY2VPUykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkID0gc2VtdmVyLnZhbGlkKGRldmljZU9TKSAmJiBzZW12ZXIudmFsaWQocGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgICAgY29uc3QgYm90aFZlcnNpb25zQXJlU3RyaW5ncyA9IF8uaXNTdHJpbmcoZGV2aWNlT1MpICYmIF8uaXNTdHJpbmcocGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgICAgaWYgKGJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCAmJiBkZXZpY2VPUy52ZXJzaW9uID09PSBwbGF0Zm9ybVZlcnNpb24udmVyc2lvblxuICAgICAgICAgICAgfHwgYm90aFZlcnNpb25zQXJlU3RyaW5ncyAmJiBfLnRvTG93ZXIoZGV2aWNlT1MpID09PSBfLnRvTG93ZXIocGxhdGZvcm1WZXJzaW9uKSkge1xuICAgICAgICAgIC8vIEdvdCBhbiBleGFjdCBtYXRjaCAtIHByb2NlZWQgaW1tZWRpYXRlbHlcbiAgICAgICAgICB1ZGlkID0gZGV2aWNlLnVkaWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoIWJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCkge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGNoZWNrIGZvciBwYXJ0aWFsIG1hdGNoIGlmIGVpdGhlciBvZiB2ZXJzaW9uIG51bWJlcnMgaXMgbm90IGNvZXJjaWJsZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCghXy5pbmNsdWRlcyhvcHRzLnBsYXRmb3JtVmVyc2lvbiwgJy4nKSAmJiBwbGF0Zm9ybVZlcnNpb24ubWFqb3IgPT09IGRldmljZU9TLm1ham9yXG4gICAgICAgICAgICB8fCBwbGF0Zm9ybVZlcnNpb24ubWFqb3IgPT09IGRldmljZU9TLm1ham9yICYmIHBsYXRmb3JtVmVyc2lvbi5taW5vciA9PT0gZGV2aWNlT1MubWlub3IpXG4gICAgICAgICAgICAvLyBHb3QgYSBwYXJ0aWFsIG1hdGNoIC0gbWFrZSBzdXJlIHdlIGNvbnNpZGVyIHRoZSBtb3N0IHJlY2VudFxuICAgICAgICAgICAgLy8gZGV2aWNlIHZlcnNpb24gYXZhaWxhYmxlIG9uIHRoZSBob3N0IHN5c3RlbVxuICAgICAgICAgICAgJiYgKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSAmJiBzZW12ZXIuZ3QoZGV2aWNlT1MsIF8udmFsdWVzKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSlbMF0pXG4gICAgICAgICAgICAgICAgfHwgIXBhcnRpYWxNYXRjaENhbmRpZGF0ZSkpIHtcbiAgICAgICAgICBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgPSB7W2RldmljZS51ZGlkXTogZGV2aWNlT1N9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXVkaWQgJiYgcGFydGlhbE1hdGNoQ2FuZGlkYXRlKSB7XG4gICAgICAgIHVkaWQgPSBfLmtleXMocGFydGlhbE1hdGNoQ2FuZGlkYXRlKVswXTtcbiAgICAgICAgYXdhaXQgYWRiLnNldERldmljZUlkKHVkaWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVkaWQpIHtcbiAgICAgICAgLy8gd2UgY291bGRuJ3QgZmluZCBhbnl0aGluZyEgcXVpdFxuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgVW5hYmxlIHRvIGZpbmQgYW4gYWN0aXZlIGRldmljZSBvciBlbXVsYXRvciBgICtcbiAgICAgICAgICBgd2l0aCBPUyAke29wdHMucGxhdGZvcm1WZXJzaW9ufS4gVGhlIGZvbGxvd2luZyBhcmUgYXZhaWxhYmxlOiBgICtcbiAgICAgICAgICBhdmFpbERldmljZXMuam9pbignLCAnKSk7XG4gICAgICB9XG5cbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhIHVkaWQgd2FzIG5vdCBnaXZlbiwgZ3JhYiB0aGUgZmlyc3QgZGV2aWNlIHdlIHNlZVxuICAgICAgdWRpZCA9IGRldmljZXNbMF0udWRpZDtcbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGBVc2luZyBkZXZpY2U6ICR7dWRpZH1gKTtcbiAgcmV0dXJuIHt1ZGlkLCBlbVBvcnR9O1xufTtcblxuLy8gcmV0dXJucyBhIG5ldyBhZGIgaW5zdGFuY2Ugd2l0aCBkZXZpY2VJZCBzZXRcbmhlbHBlcnMuY3JlYXRlQURCID0gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQURCIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3VkaWQsIGVtUG9ydH0gPSBvcHRzO1xuICBjb25zdCBhZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUJhc2VBREIob3B0cyk7XG4gIGFkYi5zZXREZXZpY2VJZCh1ZGlkKTtcbiAgaWYgKGVtUG9ydCkge1xuICAgIGFkYi5zZXRFbXVsYXRvclBvcnQoZW1Qb3J0KTtcbiAgfVxuXG4gIHJldHVybiBhZGI7XG59O1xuXG5oZWxwZXJzLnZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzIChvcHRzKSB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnYXBwUGFja2FnZScsICdhcHBBY3Rpdml0eScsICdhcHBXYWl0UGFja2FnZScsICdhcHBXYWl0QWN0aXZpdHknXSkge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRzW2tleV07XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IC8oW15cXHcuKixdKSsvLmV4ZWMobmFtZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYENhcGFiaWxpdHkgJyR7a2V5fScgaXMgZXhwZWN0ZWQgdG8gb25seSBpbmNsdWRlIGxhdGluIGxldHRlcnMsIGRpZ2l0cywgdW5kZXJzY29yZSwgZG90LCBjb21tYSBhbmQgYXN0ZXJpc2sgY2hhcmFjdGVycy5gKTtcbiAgICBsb2dnZXIud2FybihgQ3VycmVudCB2YWx1ZSAnJHtuYW1lfScgaGFzIG5vbi1tYXRjaGluZyBjaGFyYWN0ZXIgYXQgaW5kZXggJHttYXRjaC5pbmRleH06ICcke25hbWUuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4ICsgMSl9J2ApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldExhdW5jaEluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRMYXVuY2hJbmZvIChhZGIsIG9wdHMpIHtcbiAgbGV0IHthcHAsIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5fSA9IG9wdHM7XG4gIGlmICghYXBwKSB7XG4gICAgbG9nZ2VyLndhcm4oJ05vIGFwcCBzZW50IGluLCBub3QgcGFyc2luZyBwYWNrYWdlL2FjdGl2aXR5Jyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy52YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzKG9wdHMpO1xuXG4gIGlmIChhcHBQYWNrYWdlICYmIGFwcEFjdGl2aXR5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQYXJzaW5nIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGZyb20gYXBwIG1hbmlmZXN0Jyk7XG4gIGxldCB7YXBrUGFja2FnZSwgYXBrQWN0aXZpdHl9ID1cbiAgICBhd2FpdCBhZGIucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0KGFwcCk7XG4gIGlmIChhcGtQYWNrYWdlICYmICFhcHBQYWNrYWdlKSB7XG4gICAgYXBwUGFja2FnZSA9IGFwa1BhY2thZ2U7XG4gIH1cbiAgaWYgKCFhcHBXYWl0UGFja2FnZSkge1xuICAgIGFwcFdhaXRQYWNrYWdlID0gYXBwUGFja2FnZTtcbiAgfVxuICBpZiAoYXBrQWN0aXZpdHkgJiYgIWFwcEFjdGl2aXR5KSB7XG4gICAgYXBwQWN0aXZpdHkgPSBhcGtBY3Rpdml0eTtcbiAgfVxuICBpZiAoIWFwcFdhaXRBY3Rpdml0eSkge1xuICAgIGFwcFdhaXRBY3Rpdml0eSA9IGFwcEFjdGl2aXR5O1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGFyZTogJHthcGtQYWNrYWdlfS8ke2Fwa0FjdGl2aXR5fWApO1xuICByZXR1cm4ge2FwcFBhY2thZ2UsIGFwcFdhaXRQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdEFjdGl2aXR5fTtcbn07XG5cbmhlbHBlcnMucmVzZXRBcHAgPSBhc3luYyBmdW5jdGlvbiByZXNldEFwcCAoYWRiLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhcHBQYWNrYWdlLFxuICAgIGZhc3RSZXNldCxcbiAgICBmdWxsUmVzZXQsXG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXNcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFhcHBQYWNrYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcFBhY2thZ2UnIG9wdGlvbiBpcyByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IGlzSW5zdGFsbGVkID0gYXdhaXQgYWRiLmlzQXBwSW5zdGFsbGVkKGFwcFBhY2thZ2UpO1xuXG4gIGlmIChpc0luc3RhbGxlZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuZm9yY2VTdG9wKGFwcFBhY2thZ2UpO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAvLyBmdWxsUmVzZXQgaGFzIHByaW9yaXR5IG92ZXIgZmFzdFJlc2V0XG4gICAgaWYgKCFmdWxsUmVzZXQgJiYgZmFzdFJlc2V0KSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBhZGIuY2xlYXIoYXBwUGFja2FnZSk7XG4gICAgICBpZiAoXy5pc1N0cmluZyhvdXRwdXQpICYmIG91dHB1dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmYWlsZWQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciB0aGUgYXBwbGljYXRpb24gZGF0YSBvZiAnJHthcHBQYWNrYWdlfScuIE9yaWdpbmFsIGVycm9yOiAke291dHB1dH1gKTtcbiAgICAgIH1cbiAgICAgIC8vIGV4ZWN1dGluZyBgc2hlbGwgcG0gY2xlYXJgIHJlc2V0cyBwcmV2aW91c2x5IGFzc2lnbmVkIGFwcGxpY2F0aW9uIHBlcm1pc3Npb25zIGFzIHdlbGxcbiAgICAgIGlmIChhdXRvR3JhbnRQZXJtaXNzaW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFkYi5ncmFudEFsbFBlcm1pc3Npb25zKGFwcFBhY2thZ2UpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgVW5hYmxlIHRvIGdyYW50IHBlcm1pc3Npb25zIHJlcXVlc3RlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nZ2VyLmRlYnVnKGBQZXJmb3JtZWQgZmFzdCByZXNldCBvbiB0aGUgaW5zdGFsbGVkICcke2FwcFBhY2thZ2V9JyBhcHBsaWNhdGlvbiAoc3RvcCBhbmQgY2xlYXIpYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFhcHApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwJyBvcHRpb24gaXMgcmVxdWlyZWQgZm9yIHJlaW5zdGFsbFwiKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhgUnVubmluZyBmdWxsIHJlc2V0IG9uICcke2FwcFBhY2thZ2V9JyAocmVpbnN0YWxsKWApO1xuICBpZiAoaXNJbnN0YWxsZWQpIHtcbiAgICBhd2FpdCBhZGIudW5pbnN0YWxsQXBrKGFwcFBhY2thZ2UpO1xuICB9XG4gIGF3YWl0IGFkYi5pbnN0YWxsKGFwcCwge1xuICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmluc3RhbGxBcGsgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQXBrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGFwcFBhY2thZ2UsXG4gICAgZmFzdFJlc2V0LFxuICAgIGZ1bGxSZXNldCxcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICBlbmZvcmNlQXBwSW5zdGFsbCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFhcHAgfHwgIWFwcFBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwJyBhbmQgJ2FwcFBhY2thZ2UnIG9wdGlvbnMgYXJlIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKGZ1bGxSZXNldCkge1xuICAgIGF3YWl0IHRoaXMucmVzZXRBcHAoYWRiLCBvcHRzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgYXBwU3RhdGUsXG4gICAgd2FzVW5pbnN0YWxsZWRcbiAgfSA9IGF3YWl0IGFkYi5pbnN0YWxsT3JVcGdyYWRlKGFwcCwgYXBwUGFja2FnZSwge1xuICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICBlbmZvcmNlQ3VycmVudEJ1aWxkOiBlbmZvcmNlQXBwSW5zdGFsbCxcbiAgfSk7XG5cbiAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCB0aGUgbmV3bHkgaW5zdGFsbGVkIGFwcFxuICBjb25zdCBpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCA9ICF3YXNVbmluc3RhbGxlZFxuICAgICYmIGFwcFN0YXRlICE9PSBhZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRDtcbiAgaWYgKGZhc3RSZXNldCAmJiBpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCkge1xuICAgIGxvZ2dlci5pbmZvKGBQZXJmb3JtaW5nIGZhc3QgcmVzZXQgb24gJyR7YXBwUGFja2FnZX0nYCk7XG4gICAgYXdhaXQgdGhpcy5yZXNldEFwcChhZGIsIG9wdHMpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RhbGxzIGFuIGFycmF5IG9mIGFwa3NcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdHMgZGVmaW5lZCBpbiBkcml2ZXIuanNcbiAqL1xuaGVscGVycy5pbnN0YWxsT3RoZXJBcGtzID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE90aGVyQXBrcyAob3RoZXJBcHBzLCBhZGIsIG9wdHMpIHtcbiAgbGV0IHtcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlc1xuICB9ID0gb3B0cztcblxuICAvLyBJbnN0YWxsIGFsbCBvZiB0aGUgQVBLJ3MgYXN5bmNocm9ub3VzbHlcbiAgYXdhaXQgQi5hbGwob3RoZXJBcHBzLm1hcCgob3RoZXJBcHApID0+IHtcbiAgICBsb2dnZXIuZGVidWcoYEluc3RhbGxpbmcgYXBwOiAke290aGVyQXBwfWApO1xuICAgIHJldHVybiBhZGIuaW5zdGFsbE9yVXBncmFkZShvdGhlckFwcCwgbnVsbCwge1xuICAgICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICB9KTtcbiAgfSkpO1xufTtcblxuLyoqXG4gKiBVbmluc3RhbGwgYW4gYXJyYXkgb2YgcGFja2FnZXNcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYXBwUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZSBuYW1lcyB0byB1bmluc3RhbGwuIElmIHRoaXMgaW5jbHVkZXMgYCcqJ2AsIHVuaW5zdGFsbCBhbGwgb2YgM3JkIHBhcnR5IGFwcHNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZXMgZG9lcyBub3QgdW5pbnN0YWxsIHdoZW4gYCpgIGlzIHByb3ZpZGVkIGFzIGBhcHBQYWNrYWdlc2BcbiAqL1xuaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzID0gYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyAoYWRiLCBhcHBQYWNrYWdlcywgZmlsdGVyUGFja2FnZXMgPSBbXSkge1xuICBpZiAoYXBwUGFja2FnZXMuaW5jbHVkZXMoJyonKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnVW5pbnN0YWxsIHRoaXJkIHBhcnR5IHBhY2thZ2VzJyk7XG4gICAgYXBwUGFja2FnZXMgPSBhd2FpdCB0aGlzLmdldFRoaXJkUGFydHlQYWNrYWdlcyhhZGIsIGZpbHRlclBhY2thZ2VzKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhgVW5pbnN0YWxsaW5nIHBhY2thZ2VzOiAke2FwcFBhY2thZ2VzfWApO1xuICBhd2FpdCBCLmFsbChhcHBQYWNrYWdlcy5tYXAoKGFwcFBhY2thZ2UpID0+IGFkYi51bmluc3RhbGxBcGsoYXBwUGFja2FnZSkpKTtcbn07XG5cbi8qKlxuICogR2V0IHRoaXJkIHBhcnR5IHBhY2thZ2VzIGZpbHRlcmVkIHdpdGggYGZpbHRlclBhY2thZ2VzYFxuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlcyBkb2VzIG5vdCB1bmluc3RhbGwgd2hlbiBgKmAgaXMgcHJvdmlkZWQgYXMgYGFwcFBhY2thZ2VzYFxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IEFuIGFycmF5IG9mIGluc3RhbGxlZCB0aGlyZCBwYXJ5IHBhY2thZ2VzXG4gKi9cbmhlbHBlcnMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzIChhZGIsIGZpbHRlclBhY2thZ2VzID0gW10pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlc1N0cmluZyA9IGF3YWl0IGFkYi5zaGVsbChbJ3BtJywgJ2xpc3QnLCAncGFja2FnZXMnLCAnLTMnXSk7XG4gICAgY29uc3QgYXBwUGFja2FnZXNBcnJheSA9IHBhY2thZ2VzU3RyaW5nLnRyaW0oKS5yZXBsYWNlKC9wYWNrYWdlOi9nLCAnJykuc3BsaXQoRU9MKTtcbiAgICBsb2dnZXIuZGVidWcoYCcke2FwcFBhY2thZ2VzQXJyYXl9JyBmaWx0ZXJlZCB3aXRoICcke2ZpbHRlclBhY2thZ2VzfSdgKTtcbiAgICByZXR1cm4gXy5kaWZmZXJlbmNlKGFwcFBhY2thZ2VzQXJyYXksIGZpbHRlclBhY2thZ2VzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBnZXQgcGFja2FnZXMgd2l0aCAnYWRiIHNoZWxsIHBtIGxpc3QgcGFja2FnZXMgLTMnOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuaGVscGVycy5pbml0VW5pY29kZUtleWJvYXJkID0gYXN5bmMgZnVuY3Rpb24gaW5pdFVuaWNvZGVLZXlib2FyZCAoYWRiKSB7XG4gIGxvZ2dlci5kZWJ1ZygnRW5hYmxpbmcgVW5pY29kZSBrZXlib2FyZCBzdXBwb3J0Jyk7XG5cbiAgLy8gZ2V0IHRoZSBkZWZhdWx0IElNRSBzbyB3ZSBjYW4gcmV0dXJuIGJhY2sgdG8gaXQgbGF0ZXIgaWYgd2Ugd2FudFxuICBsZXQgZGVmYXVsdElNRSA9IGF3YWl0IGFkYi5kZWZhdWx0SU1FKCk7XG5cbiAgbG9nZ2VyLmRlYnVnKGBVbnNldHRpbmcgcHJldmlvdXMgSU1FICR7ZGVmYXVsdElNRX1gKTtcbiAgY29uc3QgYXBwaXVtSU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vLlVuaWNvZGVJTUVgO1xuICBsb2dnZXIuZGVidWcoYFNldHRpbmcgSU1FIHRvICcke2FwcGl1bUlNRX0nYCk7XG4gIGF3YWl0IGFkYi5lbmFibGVJTUUoYXBwaXVtSU1FKTtcbiAgYXdhaXQgYWRiLnNldElNRShhcHBpdW1JTUUpO1xuICByZXR1cm4gZGVmYXVsdElNRTtcbn07XG5cbmhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwID0gYXN5bmMgZnVuY3Rpb24gc2V0TW9ja0xvY2F0aW9uQXBwIChhZGIsIGFwcCkge1xuICB0cnkge1xuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCAnc2VjdXJlJywgJ21vY2tfbG9jYXRpb24nLCAnMSddKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIGFwcCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdhbGxvdyddKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gc2V0IG1vY2sgbG9jYXRpb24gZm9yIGFwcCAnJHthcHB9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5pbnN0YWxsSGVscGVyQXBwID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEhlbHBlckFwcCAoYWRiLCBhcGtQYXRoLCBwYWNrYWdlSWQpIHtcbiAgLy8gU29tZXRpbWVzIGFkYiBwdXNoIG9yIGFkYiBpbnN0YWwgdGFrZSBtb3JlIHRpbWUgdGhhbiBleHBlY3RlZCB0byBpbnN0YWxsIGFuIGFwcFxuICAvLyBlLmcuIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vaW8uYXBwaXVtLnNldHRpbmdzL2lzc3Vlcy80MCNpc3N1ZWNvbW1lbnQtNDc2NTkzMTc0XG4gIGF3YWl0IHJldHJ5KDIsIGFzeW5jIGZ1bmN0aW9uIHJldHJ5SW5zdGFsbEhlbHBlckFwcCAoKSB7XG4gICAgYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBrUGF0aCwgcGFja2FnZUlkLCB7Z3JhbnRQZXJtaXNzaW9uczogdHJ1ZX0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogUHVzaGVzIGFuZCBpbnN0YWxscyBpby5hcHBpdW0uc2V0dGluZ3MgYXBwLlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzZXR0aW5nIGFwcCBpcyByZXF1aXJlZFxuICpcbiAqIEBwYXJhbSB7QWRifSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdGhyb3dFcnJvcltmYWxzZV0gLSBXaGV0aGVyIHRocm93IGVycm9yIG9yIG5vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRocm93RXJyb3IgaXMgdHJ1ZSBhbmQgc29tZXRoaW5nIGhhcHBlbnMgaW4gaW5zdGFsbGF0aW9uIHN0ZXBcbiAqL1xuaGVscGVycy5wdXNoU2V0dGluZ3NBcHAgPSBhc3luYyBmdW5jdGlvbiBwdXNoU2V0dGluZ3NBcHAgKGFkYiwgdGhyb3dFcnJvciA9IGZhbHNlKSB7XG4gIGxvZ2dlci5kZWJ1ZygnUHVzaGluZyBzZXR0aW5ncyBhcGsgdG8gZGV2aWNlLi4uJyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAoYWRiLCBzZXR0aW5nc0Fwa1BhdGgsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHRocm93RXJyb3IpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGBJZ25vcmVkIGVycm9yIHdoaWxlIGluc3RhbGxpbmcgJyR7c2V0dGluZ3NBcGtQYXRofSc6IGAgK1xuICAgICAgICAgICAgICAgIGAnJHtlcnIubWVzc2FnZX0nLiBGZWF0dXJlcyB0aGF0IHJlbHkgb24gdGhpcyBoZWxwZXIgYCArXG4gICAgICAgICAgICAgICAgJ3JlcXVpcmUgdGhlIGFwayBzdWNoIGFzIHRvZ2dsZSBXaUZpIGFuZCBnZXR0aW5nIGxvY2F0aW9uICcgK1xuICAgICAgICAgICAgICAgICd3aWxsIHJhaXNlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gdXNlIHRoZW0uJyk7XG4gIH1cblxuICAvLyBSZWluc3RhbGwgd291bGQgc3RvcCB0aGUgc2V0dGluZ3MgaGVscGVyIHByb2Nlc3MgYW55d2F5LCBzb1xuICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBzdGlsbCBydW5uaW5nXG4gIGlmIChhd2FpdCBhZGIucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfUEtHX0lEKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfSBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRzIHBlcm1pc3Npb25zLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmIChhcGlMZXZlbCA+PSAyOSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vaW8uYXBwaXVtLnNldHRpbmdzI2ludGVybmFsLWF1ZGlvLS12aWRlby1yZWNvcmRpbmdcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdQUk9KRUNUX01FRElBJywgJ2FsbG93J10pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgfVxuICB9XG4gIGlmIChhcGlMZXZlbCA8PSAyMykgeyAvLyBBbmRyb2lkIDYtIGRldmljZXMgc2hvdWxkIGhhdmUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3B1bGwvMTE2NDAjaXNzdWVjb21tZW50LTQzODI2MDQ3N1xuICAgIGNvbnN0IHBlcm1zID0gWydTRVRfQU5JTUFUSU9OX1NDQUxFJywgJ0NIQU5HRV9DT05GSUdVUkFUSU9OJywgJ0FDQ0VTU19GSU5FX0xPQ0FUSU9OJ107XG4gICAgbG9nZ2VyLmluZm8oYEdyYW50aW5nIHBlcm1pc3Npb25zICR7cGVybXN9IHRvICcke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9J2ApO1xuICAgIGF3YWl0IGFkYi5ncmFudFBlcm1pc3Npb25zKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHBlcm1zLm1hcCgoeCkgPT4gYGFuZHJvaWQucGVybWlzc2lvbi4ke3h9YCkpO1xuICB9XG5cbiAgLy8gbGF1bmNoIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAgZHVlIHRvIHNldHRpbmdzIGZhaWxpbmcgdG8gYmUgc2V0XG4gIC8vIGlmIHRoZSBhcHAgaXMgbm90IGxhdW5jaGVkIHByaW9yIHRvIHN0YXJ0IHRoZSBzZXNzaW9uIG9uIGFuZHJvaWQgNytcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy84OTU3XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLnJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgc3RyaW5nLnhtbCBhbmQgY29udmVydHMgaXQgdG8gc3RyaW5nLmpzb24gYW5kIHB1c2hlc1xuICogaXQgdG8gL2RhdGEvbG9jYWwvdG1wL3N0cmluZy5qc29uIG9uIGZvciB1c2Ugb2YgYm9vdHN0cmFwXG4gKiBJZiBhcHAgaXMgbm90IHByZXNlbnQgdG8gZXh0cmFjdCBzdHJpbmcueG1sIGl0IGRlbGV0ZXMgcmVtb3RlIHN0cmluZ3MuanNvblxuICogSWYgYXBwIGRvZXMgbm90IGhhdmUgc3RyaW5ncy54bWwgd2UgcHVzaCBhbiBlbXB0eSBqc29uIG9iamVjdCB0byByZW1vdGVcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UgYWJicmV2aWF0aW9uLCBmb3IgZXhhbXBsZSAnZnInLiBUaGUgZGVmYXVsdCBsYW5ndWFnZVxuICogaXMgdXNlZCBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkLlxuICogQHBhcmFtIHtPYmplY3R9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHJldHVybnMge09iamVjdH0gVGhlIGRpY3Rpb25hcnksIHdoZXJlIHN0cmluZyByZXNvdXJjZSBpZGVudGlmaWVycyBhcmUga2V5c1xuICogYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIG9yIGFuIGVtcHR5IG9iamVjdFxuICogaWYgbm8gbWF0Y2hpbmcgcmVzb3VyY2VzIHdlcmUgZXh0cmFjdGVkLlxuICovXG5oZWxwZXJzLnB1c2hTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gcHVzaFN0cmluZ3MgKGxhbmd1YWdlLCBhZGIsIG9wdHMpIHtcbiAgY29uc3QgcmVtb3RlRGlyID0gJy9kYXRhL2xvY2FsL3RtcCc7XG4gIGNvbnN0IHN0cmluZ3NKc29uID0gJ3N0cmluZ3MuanNvbic7XG4gIGNvbnN0IHJlbW90ZUZpbGUgPSBwYXRoLnBvc2l4LnJlc29sdmUocmVtb3RlRGlyLCBzdHJpbmdzSnNvbik7XG5cbiAgLy8gY2xlYW4gdXAgcmVtb3RlIHN0cmluZy5qc29uIGlmIHByZXNlbnRcbiAgYXdhaXQgYWRiLnJpbXJhZihyZW1vdGVGaWxlKTtcblxuICBsZXQgYXBwO1xuICB0cnkge1xuICAgIGFwcCA9IG9wdHMuYXBwIHx8IGF3YWl0IGFkYi5wdWxsQXBrKG9wdHMuYXBwUGFja2FnZSwgb3B0cy50bXBEaXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuaW5mbyhgRmFpbGVkIHRvIHB1bGwgYW4gYXBrIGZyb20gJyR7b3B0cy5hcHBQYWNrYWdlfScgdG8gJyR7b3B0cy50bXBEaXJ9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KG9wdHMuYXBwUGFja2FnZSkgfHwgIShhd2FpdCBmcy5leGlzdHMoYXBwKSkpIHtcbiAgICBsb2dnZXIuZGVidWcoYE5vIGFwcCBvciBwYWNrYWdlIHNwZWNpZmllZC4gUmV0dXJuaW5nIGVtcHR5IHN0cmluZ3NgKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBzdHJpbmdzVG1wRGlyID0gcGF0aC5yZXNvbHZlKG9wdHMudG1wRGlyLCBvcHRzLmFwcFBhY2thZ2UpO1xuICB0cnkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRXh0cmFjdGluZyBzdHJpbmdzIGZyb20gYXBrJywgYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgY29uc3Qge2Fwa1N0cmluZ3MsIGxvY2FsUGF0aH0gPSBhd2FpdCBhZGIuZXh0cmFjdFN0cmluZ3NGcm9tQXBrKGFwcCwgbGFuZ3VhZ2UsIHN0cmluZ3NUbXBEaXIpO1xuICAgIGF3YWl0IGFkYi5wdXNoKGxvY2FsUGF0aCwgcmVtb3RlRGlyKTtcbiAgICByZXR1cm4gYXBrU3RyaW5ncztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYENvdWxkIG5vdCBnZXQgc3RyaW5ncywgY29udGludWluZyBhbnl3YXkuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGF3YWl0IGFkYi5zaGVsbCgnZWNobycsIFtgJ3t9JyA+ICR7cmVtb3RlRmlsZX1gXSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHN0cmluZ3NUbXBEaXIpO1xuICB9XG4gIHJldHVybiB7fTtcbn07XG5cbmhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcCA9IGFzeW5jIGZ1bmN0aW9uIHVubG9ja1dpdGhIZWxwZXJBcHAgKGFkYikge1xuICBsb2dnZXIuaW5mbygnVW5sb2NraW5nIHNjcmVlbicpO1xuXG4gIC8vIFVubG9jayBzdWNjZWVkIHdpdGggYSBjb3VwbGUgb2YgcmV0cmllcy5cbiAgbGV0IGZpcnN0UnVuID0gdHJ1ZTtcbiAgYXdhaXQgcmV0cnkoMywgYXN5bmMgZnVuY3Rpb24gbGF1bmNoSGVscGVyICgpIHtcbiAgICAvLyBUbyByZWR1Y2UgYSB0aW1lIHRvIGNhbGwgYWRiLmlzU2NyZWVuTG9ja2VkKCkgc2luY2UgYGFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd2AgaXMgZWFzeSB0byBoYW5nIGFkYiBjb21tYW5kc1xuICAgIGlmIChmaXJzdFJ1bikge1xuICAgICAgZmlyc3RSdW4gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFcnJvciBpbiBpc1NjcmVlbkxvY2tlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdcImFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd1wiIGNvbW1hbmQgaGFzIHRpbWVkIG91dC4nKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1RoZSByZWFzb24gb2YgdGhpcyB0aW1lb3V0IGlzIHRoZSBkZWxheWVkIGFkYiByZXNwb25zZS4gUmVzZXR0aW5nIGFkYiBzZXJ2ZXIgY2FuIGltcHJvdmUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYExhdW5jaGluZyAke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8ke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCxcbiAgICAgICctYycsICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgJy1mJywgJzB4MTAyMDAwMDAnLFxuICAgIF0pO1xuICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gIH0pO1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZygnU2NyZWVuIGlzIGxvY2tlZCwgdHJ5aW5nIHRvIHVubG9jaycpO1xuXG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIud2FybignVXNpbmcgYXBwIHVubG9jaywgdGhpcyBpcyBnb2luZyB0byBiZSBkZXByZWNhdGVkIScpO1xuICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcChhZGIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLndhaXRGb3JEZXZpY2UoKTtcbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvcik7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpICYmIChtb2NrTG9jYXRpb25BcHAgfHwgXy5pc1VuZGVmaW5lZChtb2NrTG9jYXRpb25BcHApKSkge1xuICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7Ozs7O0FBRUEsTUFBTUEsdUJBQXVCLEdBQUcsS0FBaEM7QUFFQSxNQUFNQywrQkFBK0IsR0FBRztFQUN0Q0MsTUFBTSxFQUFFO0lBQ05DLEdBQUcsRUFBRSxvQkFEQztJQUVOQyxRQUFRLEVBQUU7RUFGSixDQUQ4QjtFQUt0Q0MsUUFBUSxFQUFFO0lBQ1JGLEdBQUcsRUFBRSwyQkFERztJQUVSQyxRQUFRLEVBQUU7RUFGRixDQUw0QjtFQVN0Q0UsVUFBVSxFQUFFO0lBQ1ZILEdBQUcsRUFBRSxpQkFESztJQUVWQyxRQUFRLEVBQUU7RUFGQSxDQVQwQjtFQWF0Q0csT0FBTyxFQUFFO0lBQ1BKLEdBQUcsRUFBRSxxQkFERTtJQUVQQyxRQUFRLEVBQUU7RUFGSCxDQWI2QjtFQWlCdEMsb0JBQW9CO0lBQ2xCRCxHQUFHLEVBQUUscUJBRGE7SUFFbEJDLFFBQVEsRUFBRTtFQUZRLENBakJrQjtFQXFCdEMsb0JBQW9CO0lBQ2xCRCxHQUFHLEVBQUUsNEJBRGE7SUFFbEJDLFFBQVEsRUFBRTtFQUZRLENBckJrQjtFQXlCdENJLE9BQU8sRUFBRTtJQUNQTCxHQUFHLEVBQUUsb0JBREU7SUFFUEMsUUFBUSxFQUFFO0VBRkg7QUF6QjZCLENBQXhDO0FBOEJBLE1BQU1LLHNCQUFzQixHQUFHLG9CQUEvQjs7QUFDQSxNQUFNQywrQkFBK0IsR0FBRyxTQUF4QztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLGVBQXpCO0FBR0EsTUFBTUMsU0FBUyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FBYztF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
@@ -20,6 +20,7 @@ var _androidHelpers = require("../android-helpers");
20
20
  var _driver = require("appium/driver");
21
21
 
22
22
  const APP_EXTENSIONS = ['.apk', '.apks'];
23
+ const RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';
23
24
  let commands = {};
24
25
  exports.commands = commands;
25
26
 
@@ -71,7 +72,16 @@ commands.activateApp = async function activateApp(appId) {
71
72
  return;
72
73
  }
73
74
 
74
- const stdout = await this.adb.shell(['am', apiLevel < 26 ? 'start' : 'start-activity', '-a', 'android.intent.action.MAIN', '-c', 'android.intent.category.LAUNCHER', '-f', '0x10200000', '-n', await this.adb.resolveLaunchableActivity(appId)]);
75
+ let activityName = await this.adb.resolveLaunchableActivity(appId);
76
+
77
+ if (activityName === RESOLVER_ACTIVITY_NAME) {
78
+ this.log.debug(`The launchable activity name of '${appId}' was resolved to '${activityName}'. ` + `Switching the resolver to not use cmd`);
79
+ activityName = await this.adb.resolveLaunchableActivity(appId, {
80
+ preferCmd: false
81
+ });
82
+ }
83
+
84
+ const stdout = await this.adb.shell(['am', apiLevel < 26 ? 'start' : 'start-activity', '-a', 'android.intent.action.MAIN', '-c', 'android.intent.category.LAUNCHER', '-f', '0x10200000', '-n', activityName]);
75
85
  this.log.debug(stdout);
76
86
 
77
87
  if (/^error:/mi.test(stdout)) {
@@ -128,4 +138,4 @@ var _default = commands;
128
138
  exports.default = _default;require('source-map-support').install();
129
139
 
130
140
 
131
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL2FwcC1tYW5hZ2VtZW50LmpzIiwibmFtZXMiOlsiQVBQX0VYVEVOU0lPTlMiLCJjb21tYW5kcyIsImlzQXBwSW5zdGFsbGVkIiwiYXBwSWQiLCJhZGIiLCJxdWVyeUFwcFN0YXRlIiwibG9nIiwiaW5mbyIsIkFQUF9TVEFURSIsIk5PVF9JTlNUQUxMRUQiLCJwcm9jZXNzRXhpc3RzIiwiTk9UX1JVTk5JTkciLCJhcHBJZFJlIiwiUmVnRXhwIiwiXyIsImVzY2FwZVJlZ0V4cCIsImxpbmUiLCJkdW1wV2luZG93cyIsInNwbGl0IiwidGVzdCIsInNvbWUiLCJ4IiwiaW5jbHVkZXMiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJhY3RpdmF0ZUFwcCIsImRlYnVnIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImNtZCIsIm91dHB1dCIsInNoZWxsIiwiZSIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwic3Rkb3V0IiwicmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSIsIkVycm9yIiwicmVtb3ZlQXBwIiwib3B0aW9ucyIsInVuaW5zdGFsbEFwayIsInRlcm1pbmF0ZUFwcCIsImZvcmNlU3RvcCIsInRpbWVvdXQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJpc05hTiIsInBhcnNlSW50Iiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJpbnN0YWxsQXBwIiwiYXBwUGF0aCIsImxvY2FsUGF0aCIsImhlbHBlcnMiLCJjb25maWd1cmVBcHAiLCJpbnN0YWxsIiwibW9iaWxlQ2xlYXJBcHAiLCJvcHRzIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJjbGVhciJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9hcHAtbWFuYWdlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBBUFBfU1RBVEUgfSBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cbmNvbnN0IEFQUF9FWFRFTlNJT05TID0gWycuYXBrJywgJy5hcGtzJ107XG5cbmxldCBjb21tYW5kcyA9IHt9O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIGFuIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBvciBub3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBhcHAgaXMgaW5zdGFsbGVkXG4gKi9cbmNvbW1hbmRzLmlzQXBwSW5zdGFsbGVkID0gYXN5bmMgZnVuY3Rpb24gaXNBcHBJbnN0YWxsZWQgKGFwcElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCk7XG59O1xuXG4vKipcbiAqIFF1ZXJpZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBjb3JyZXNwb25kaW5nIGNvbnN0YW50LCB3aGljaCBkZXNjcmliZXNcbiAqICAgICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIHN0YXRlOlxuICogMCAtIGlzIHRoZSBhcHAgaXMgbm90IGluc3RhbGxlZFxuICogMSAtIGlmIHRoZSBhcHAgaXMgaW5zdGFsbGVkLCBidXQgaXMgbm90IHJ1bm5pbmdcbiAqIDMgLSBpZiB0aGUgYXBwIGlzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmRcbiAqIDQgLSBpZiB0aGUgYXBwIGlzIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmRcbiAqL1xuY29tbWFuZHMucXVlcnlBcHBTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5QXBwU3RhdGUgKGFwcElkKSB7XG4gIHRoaXMubG9nLmluZm8oYFF1ZXJ5aW5nIHRoZSBzdGF0ZSBvZiAnJHthcHBJZH0nYCk7XG4gIGlmICghYXdhaXQgdGhpcy5hZGIuaXNBcHBJbnN0YWxsZWQoYXBwSWQpKSB7XG4gICAgcmV0dXJuIEFQUF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICB9XG4gIGlmICghYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyhhcHBJZCkpIHtcbiAgICByZXR1cm4gQVBQX1NUQVRFLk5PVF9SVU5OSU5HO1xuICB9XG4gIGNvbnN0IGFwcElkUmUgPSBuZXcgUmVnRXhwKGBcXFxcYiR7Xy5lc2NhcGVSZWdFeHAoYXBwSWQpfS9gKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIChhd2FpdCB0aGlzLmFkYi5kdW1wV2luZG93cygpKS5zcGxpdCgnXFxuJykpIHtcbiAgICBpZiAoYXBwSWRSZS50ZXN0KGxpbmUpICYmIFsnbUN1cnJlbnRGb2N1cycsICdtRm9jdXNlZEFwcCddLnNvbWUoKHgpID0+IGxpbmUuaW5jbHVkZXMoeCkpKSB7XG4gICAgICByZXR1cm4gQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFQUF9TVEFURS5SVU5OSU5HX0lOX0JBQ0tHUk9VTkQ7XG59O1xuXG4vKipcbiAqIEFjdGl2YXRlcyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gb3IgbGF1bmNoZXMgaXQgaWYgbmVjZXNzYXJ5LlxuICogVGhlIGFjdGlvbiBpcyBkb25lIHdpdGggbW9ua2V5IHRvb2wgYW5kIGxpdGVyYWxseSBzaW11bGF0ZXNcbiAqIGNsaWNraW5nIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGljb24gb24gdGhlIGRhc2hib2FyZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqL1xuY29tbWFuZHMuYWN0aXZhdGVBcHAgPSBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUFwcCAoYXBwSWQpIHtcbiAgdGhpcy5sb2cuZGVidWcoYEFjdGl2YXRpbmcgJyR7YXBwSWR9J2ApO1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIC8vIEZhbGxiYWNrIHRvIE1vbmtleSBpbiBvbGRlciBBUElzXG4gIGlmIChhcGlMZXZlbCA8IDI0KSB7XG4gICAgLy8gVGhlIG1vbmtleSBjb21tYW5kIGNvdWxkIHJhaXNlIGFuIGlzc3VlIGFzIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ0ODYwNDc1L2hvdy10by11c2UtdGhlLW1vbmtleS1jb21tYW5kLXdpdGgtYW4tYW5kcm9pZC1zeXN0ZW0tdGhhdC1kb2VzbnQtaGF2ZS1waHlzaWNhbFxuICAgIC8vIGJ1dCAnLS1wY3Qtc3lza2V5cyAwJyBjb3VsZCBjYXVzZSBhbm90aGVyIGJhY2tncm91bmQgcHJvY2VzcyBpc3N1ZS4gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE2OTQxI2lzc3VlY29tbWVudC0xMTI5ODM3Mjg1XG4gICAgY29uc3QgY21kID0gWydtb25rZXknLFxuICAgICAgJy1wJywgYXBwSWQsXG4gICAgICAnLWMnLCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgJzEnXTtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIG91dHB1dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQ29tbWFuZCBzdGRvdXQ6ICR7b3V0cHV0fWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY3RpdmF0ZSAnJHthcHBJZH0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuaW5jbHVkZXMoJ21vbmtleSBhYm9ydGVkJykpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY3RpdmF0ZSAnJHthcHBJZH0nLiBBcmUgeW91IHN1cmUgaXQgaXMgaW5zdGFsbGVkP2ApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgJ2FtJywgKGFwaUxldmVsIDwgMjYpID8gJ3N0YXJ0JyA6ICdzdGFydC1hY3Rpdml0eScsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAnLWMnLCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgIC8vIEZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfCBGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9JbnRlbnQjRkxBR19BQ1RJVklUWV9ORVdfVEFTS1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50I0ZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERURcbiAgICAnLWYnLCAnMHgxMDIwMDAwMCcsXG4gICAgJy1uJywgYXdhaXQgdGhpcy5hZGIucmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eShhcHBJZCksXG4gIF0pO1xuICB0aGlzLmxvZy5kZWJ1ZyhzdGRvdXQpO1xuICBpZiAoL15lcnJvcjovbWkudGVzdChzdGRvdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWN0aXZhdGUgJyR7YXBwSWR9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7c3Rkb3V0fWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFVuaW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFsyMDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHVuaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBrZWVwRGF0YSBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8ga2VlcCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRhdGEgYW5kIGNhY2hlIGZvbGRlcnMgYWZ0ZXIgdW5pbnN0YWxsLlxuICovXG5cbi8qKlxuICogUmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGlmIGlzIGluc3RhbGxlZC5cbiAqIFRoZSBjYWxsIGlzIGlnbm9yZWQgaWYgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHBhcmFtIHs/VW5pbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgcmVtb3ZhbCBvcHRpb25zXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGFja2FnZSB3YXMgZm91bmQgb24gdGhlIGRldmljZSBhbmRcbiAqICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQuXG4gKi9cbmNvbW1hbmRzLnJlbW92ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUFwcCAoYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIudW5pbnN0YWxsQXBrKGFwcElkLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVGVybWluYXRlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ8c3RyaW5nfSB0aW1lb3V0IFs1MDBdIC0gVGhlIGNvdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IHVudGlsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIHRlcm1pbmF0ZWQuXG4gKi9cblxuLyoqXG4gKiBUZXJtaW5hdGVzIHRoZSBhcHAgaWYgaXQgaXMgcnVubmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwSWQgLSBBcHBsaWNhdGlvbiBwYWNrYWdlIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7P1Rlcm1pbmF0ZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGFwcGxpY2F0aW9uIHRlcm1pbmF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcHAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGFwcCBoYXMgbm90IGJlZW4gdGVybWluYXRlZCB3aXRoaW4gdGhlIGdpdmVuIHRpbWVvdXQuXG4gKi9cbmNvbW1hbmRzLnRlcm1pbmF0ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUFwcCAoYXBwSWQsIG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmxvZy5pbmZvKGBUZXJtaW5hdGluZyAnJHthcHBJZH0nYCk7XG4gIGlmICghKGF3YWl0IHRoaXMuYWRiLnByb2Nlc3NFeGlzdHMoYXBwSWQpKSkge1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSBhcHAgJyR7YXBwSWR9JyBpcyBub3QgcnVubmluZ2ApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBhd2FpdCB0aGlzLmFkYi5mb3JjZVN0b3AoYXBwSWQpO1xuICBjb25zdCB0aW1lb3V0ID0gdXRpbC5oYXNWYWx1ZShvcHRpb25zLnRpbWVvdXQpICYmICFpc05hTihvcHRpb25zLnRpbWVvdXQpID8gcGFyc2VJbnQob3B0aW9ucy50aW1lb3V0LCAxMCkgOiA1MDA7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoYXBwSWQpIDw9IEFQUF9TVEFURS5OT1RfUlVOTklORyxcbiAgICAgIHt3YWl0TXM6IHRpbWVvdXQsIGludGVydmFsTXM6IDEwMH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgJyR7YXBwSWR9JyBpcyBzdGlsbCBydW5uaW5nIGFmdGVyICR7dGltZW91dH1tcyB0aW1lb3V0YCk7XG4gIH1cbiAgdGhpcy5sb2cuaW5mbyhgJyR7YXBwSWR9JyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVybWluYXRlZGApO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5zdGFsbE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IFs2MDAwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwIGlzIGluc3RhbGxlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYWxsb3dUZXN0UGFja2FnZXMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGFsbG93IHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIGluc3RhbGxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlU2RjYXJkIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSB0byBpbnN0YWxsIHRoZSBhcHAgb24gc2RjYXJkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIG1lbW9yeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ3JhbnRQZXJtaXNzaW9ucyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gZ3JhbnQgYWxsIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlciBBbmRyb2lkIDYrLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZXBsYWNlIFt0cnVlXSAtIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB0byBiZSB1cGdyYWRlZC9yZWluc3RhbGxlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgZGV2aWNlLlxuICovXG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGxvY2FsIGFwayBwYXRoIG9yIGEgcmVtb3RlIHVybFxuICogQHBhcmFtIHs/SW5zdGFsbE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc2V0IG9mIGluc3RhbGxhdGlvbiBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGdpdmVuIGFwayBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhY2hhYmxlXG4gKi9cbmNvbW1hbmRzLmluc3RhbGxBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQXBwIChhcHBQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gYXdhaXQgdGhpcy5oZWxwZXJzLmNvbmZpZ3VyZUFwcChhcHBQYXRoLCBBUFBfRVhURU5TSU9OUyk7XG4gIGF3YWl0IHRoaXMuYWRiLmluc3RhbGwobG9jYWxQYXRoLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2xlYXJBcHBPcHRpb25zXG4gKiBAcHJvcGVydHkgeyFzdHJpbmd9IGFwcElkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlIHRvIGJlIGNsZWFyZWRcbiAqL1xuXG4vKipcbiAqIERlbGV0ZXMgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge0NsZWFyQXBwT3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIGNsZWFuaW5nIG9mIHRoZSBhcHAgZGF0YSBmYWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVDbGVhckFwcCA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUNsZWFyQXBwIChvcHRzID0ge30pIHtcbiAgY29uc3Qge2FwcElkfSA9IG9wdHM7XG4gIGlmICghYXBwSWQpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBUaGUgJ2FwcElkJyBhcmd1bWVudCBpcyByZXF1aXJlZGApO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmNsZWFyKGFwcElkKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxjQUFjLEdBQUcsQ0FBQyxNQUFELEVBQVMsT0FBVCxDQUF2QjtBQUVBLElBQUlDLFFBQVEsR0FBRyxF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
141
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL2FwcC1tYW5hZ2VtZW50LmpzIiwibmFtZXMiOlsiQVBQX0VYVEVOU0lPTlMiLCJSRVNPTFZFUl9BQ1RJVklUWV9OQU1FIiwiY29tbWFuZHMiLCJpc0FwcEluc3RhbGxlZCIsImFwcElkIiwiYWRiIiwicXVlcnlBcHBTdGF0ZSIsImxvZyIsImluZm8iLCJBUFBfU1RBVEUiLCJOT1RfSU5TVEFMTEVEIiwicHJvY2Vzc0V4aXN0cyIsIk5PVF9SVU5OSU5HIiwiYXBwSWRSZSIsIlJlZ0V4cCIsIl8iLCJlc2NhcGVSZWdFeHAiLCJsaW5lIiwiZHVtcFdpbmRvd3MiLCJzcGxpdCIsInRlc3QiLCJzb21lIiwieCIsImluY2x1ZGVzIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiYWN0aXZhdGVBcHAiLCJkZWJ1ZyIsImFwaUxldmVsIiwiZ2V0QXBpTGV2ZWwiLCJjbWQiLCJvdXRwdXQiLCJzaGVsbCIsImUiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSIsImFjdGl2aXR5TmFtZSIsInJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkiLCJwcmVmZXJDbWQiLCJzdGRvdXQiLCJFcnJvciIsInJlbW92ZUFwcCIsIm9wdGlvbnMiLCJ1bmluc3RhbGxBcGsiLCJ0ZXJtaW5hdGVBcHAiLCJmb3JjZVN0b3AiLCJ0aW1lb3V0IiwidXRpbCIsImhhc1ZhbHVlIiwiaXNOYU4iLCJwYXJzZUludCIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiaW5zdGFsbEFwcCIsImFwcFBhdGgiLCJsb2NhbFBhdGgiLCJoZWxwZXJzIiwiY29uZmlndXJlQXBwIiwiaW5zdGFsbCIsIm1vYmlsZUNsZWFyQXBwIiwib3B0cyIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwiY2xlYXIiXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uIiwic291cmNlcyI6WyJsaWIvY29tbWFuZHMvYXBwLW1hbmFnZW1lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgQVBQX1NUQVRFIH0gZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBBUFBfRVhURU5TSU9OUyA9IFsnLmFwaycsICcuYXBrcyddO1xuY29uc3QgUkVTT0xWRVJfQUNUSVZJVFlfTkFNRSA9ICdhbmRyb2lkL2NvbS5hbmRyb2lkLmludGVybmFsLmFwcC5SZXNvbHZlckFjdGl2aXR5JztcblxubGV0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYW4gYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIG9yIG5vdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGFwcCBpcyBpbnN0YWxsZWRcbiAqL1xuY29tbWFuZHMuaXNBcHBJbnN0YWxsZWQgPSBhc3luYyBmdW5jdGlvbiBpc0FwcEluc3RhbGxlZCAoYXBwSWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzQXBwSW5zdGFsbGVkKGFwcElkKTtcbn07XG5cbi8qKlxuICogUXVlcmllcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHJldHVybnMge251bWJlcn0gVGhlIGNvcnJlc3BvbmRpbmcgY29uc3RhbnQsIHdoaWNoIGRlc2NyaWJlc1xuICogICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gc3RhdGU6XG4gKiAwIC0gaXMgdGhlIGFwcCBpcyBub3QgaW5zdGFsbGVkXG4gKiAxIC0gaWYgdGhlIGFwcCBpcyBpbnN0YWxsZWQsIGJ1dCBpcyBub3QgcnVubmluZ1xuICogMyAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZFxuICogNCAtIGlmIHRoZSBhcHAgaXMgcnVubmluZyBpbiB0aGUgZm9yZWdyb3VuZFxuICovXG5jb21tYW5kcy5xdWVyeUFwcFN0YXRlID0gYXN5bmMgZnVuY3Rpb24gcXVlcnlBcHBTdGF0ZSAoYXBwSWQpIHtcbiAgdGhpcy5sb2cuaW5mbyhgUXVlcnlpbmcgdGhlIHN0YXRlIG9mICcke2FwcElkfSdgKTtcbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5pc0FwcEluc3RhbGxlZChhcHBJZCkpIHtcbiAgICByZXR1cm4gQVBQX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIH1cbiAgaWYgKCFhd2FpdCB0aGlzLmFkYi5wcm9jZXNzRXhpc3RzKGFwcElkKSkge1xuICAgIHJldHVybiBBUFBfU1RBVEUuTk9UX1JVTk5JTkc7XG4gIH1cbiAgY29uc3QgYXBwSWRSZSA9IG5ldyBSZWdFeHAoYFxcXFxiJHtfLmVzY2FwZVJlZ0V4cChhcHBJZCl9L2ApO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgKGF3YWl0IHRoaXMuYWRiLmR1bXBXaW5kb3dzKCkpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChhcHBJZFJlLnRlc3QobGluZSkgJiYgWydtQ3VycmVudEZvY3VzJywgJ21Gb2N1c2VkQXBwJ10uc29tZSgoeCkgPT4gbGluZS5pbmNsdWRlcyh4KSkpIHtcbiAgICAgIHJldHVybiBBUFBfU1RBVEUuUlVOTklOR19JTl9GT1JFR1JPVU5EO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORDtcbn07XG5cbi8qKlxuICogQWN0aXZhdGVzIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBvciBsYXVuY2hlcyBpdCBpZiBuZWNlc3NhcnkuXG4gKiBUaGUgYWN0aW9uIGlzIGRvbmUgd2l0aCBtb25rZXkgdG9vbCBhbmQgbGl0ZXJhbGx5IHNpbXVsYXRlc1xuICogY2xpY2tpbmcgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWNvbiBvbiB0aGUgZGFzaGJvYXJkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICovXG5jb21tYW5kcy5hY3RpdmF0ZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlQXBwIChhcHBJZCkge1xuICB0aGlzLmxvZy5kZWJ1ZyhgQWN0aXZhdGluZyAnJHthcHBJZH0nYCk7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgLy8gRmFsbGJhY2sgdG8gTW9ua2V5IGluIG9sZGVyIEFQSXNcbiAgaWYgKGFwaUxldmVsIDwgMjQpIHtcbiAgICAvLyBUaGUgbW9ua2V5IGNvbW1hbmQgY291bGQgcmFpc2UgYW4gaXNzdWUgYXMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDQ4NjA0NzUvaG93LXRvLXVzZS10aGUtbW9ua2V5LWNvbW1hbmQtd2l0aC1hbi1hbmRyb2lkLXN5c3RlbS10aGF0LWRvZXNudC1oYXZlLXBoeXNpY2FsXG4gICAgLy8gYnV0ICctLXBjdC1zeXNrZXlzIDAnIGNvdWxkIGNhdXNlIGFub3RoZXIgYmFja2dyb3VuZCBwcm9jZXNzIGlzc3VlLiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTY5NDEjaXNzdWVjb21tZW50LTExMjk4MzcyODVcbiAgICBjb25zdCBjbWQgPSBbJ21vbmtleScsXG4gICAgICAnLXAnLCBhcHBJZCxcbiAgICAgICctYycsICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAnMSddO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICB0cnkge1xuICAgICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDb21tYW5kIHN0ZG91dDogJHtvdXRwdXR9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjdGl2YXRlICcke2FwcElkfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgaWYgKG91dHB1dC5pbmNsdWRlcygnbW9ua2V5IGFib3J0ZWQnKSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGFjdGl2YXRlICcke2FwcElkfScuIEFyZSB5b3Ugc3VyZSBpdCBpcyBpbnN0YWxsZWQ/YCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBhY3Rpdml0eU5hbWUgPSBhd2FpdCB0aGlzLmFkYi5yZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5KGFwcElkKTtcbiAgaWYgKGFjdGl2aXR5TmFtZSA9PT0gUkVTT0xWRVJfQUNUSVZJVFlfTkFNRSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNzEyOFxuICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgYFRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG5hbWUgb2YgJyR7YXBwSWR9JyB3YXMgcmVzb2x2ZWQgdG8gJyR7YWN0aXZpdHlOYW1lfScuIGAgK1xuICAgICAgYFN3aXRjaGluZyB0aGUgcmVzb2x2ZXIgdG8gbm90IHVzZSBjbWRgXG4gICAgKTtcbiAgICBhY3Rpdml0eU5hbWUgPSBhd2FpdCB0aGlzLmFkYi5yZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5KGFwcElkLCB7cHJlZmVyQ21kOiBmYWxzZX0pO1xuICB9XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICdhbScsIChhcGlMZXZlbCA8IDI2KSA/ICdzdGFydCcgOiAnc3RhcnQtYWN0aXZpdHknLFxuICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgJy1jJywgJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICAvLyBGTEFHX0FDVElWSVRZX05FV19UQVNLIHwgRkxBR19BQ1RJVklUWV9SRVNFVF9UQVNLX0lGX05FRURFRFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50I0ZMQUdfQUNUSVZJVFlfTkVXX1RBU0tcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9jb250ZW50L0ludGVudCNGTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEXG4gICAgJy1mJywgJzB4MTAyMDAwMDAnLFxuICAgICctbicsIGFjdGl2aXR5TmFtZSxcbiAgXSk7XG4gIHRoaXMubG9nLmRlYnVnKHN0ZG91dCk7XG4gIGlmICgvXmVycm9yOi9taS50ZXN0KHN0ZG91dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhY3RpdmF0ZSAnJHthcHBJZH0nLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRvdXR9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVW5pbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzIwMDAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdW5pbnN0YWxsZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGtlZXBEYXRhIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBrZWVwIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZGF0YSBhbmQgY2FjaGUgZm9sZGVycyBhZnRlciB1bmluc3RhbGwuXG4gKi9cblxuLyoqXG4gKiBSZW1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gaWYgaXMgaW5zdGFsbGVkLlxuICogVGhlIGNhbGwgaXMgaWdub3JlZCBpZiB0aGUgYXBwIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcElkIC0gQXBwbGljYXRpb24gcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcGFyYW0gez9Vbmluc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIHNldCBvZiByZW1vdmFsIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYWNrYWdlIHdhcyBmb3VuZCBvbiB0aGUgZGV2aWNlIGFuZFxuICogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZC5cbiAqL1xuY29tbWFuZHMucmVtb3ZlQXBwID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQXBwIChhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi51bmluc3RhbGxBcGsoYXBwSWQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBUZXJtaW5hdGVPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcnxzdHJpbmd9IHRpbWVvdXQgWzUwMF0gLSBUaGUgY291bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgdW50aWwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgdGVybWluYXRlZC5cbiAqL1xuXG4vKipcbiAqIFRlcm1pbmF0ZXMgdGhlIGFwcCBpZiBpdCBpcyBydW5uaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBJZCAtIEFwcGxpY2F0aW9uIHBhY2thZ2UgaWRlbnRpZmllclxuICogQHBhcmFtIHs/VGVybWluYXRlT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgYXBwbGljYXRpb24gdGVybWluYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFwcCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVybWluYXRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgYXBwIGhhcyBub3QgYmVlbiB0ZXJtaW5hdGVkIHdpdGhpbiB0aGUgZ2l2ZW4gdGltZW91dC5cbiAqL1xuY29tbWFuZHMudGVybWluYXRlQXBwID0gYXN5bmMgZnVuY3Rpb24gdGVybWluYXRlQXBwIChhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gIHRoaXMubG9nLmluZm8oYFRlcm1pbmF0aW5nICcke2FwcElkfSdgKTtcbiAgaWYgKCEoYXdhaXQgdGhpcy5hZGIucHJvY2Vzc0V4aXN0cyhhcHBJZCkpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIGFwcCAnJHthcHBJZH0nIGlzIG5vdCBydW5uaW5nYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGF3YWl0IHRoaXMuYWRiLmZvcmNlU3RvcChhcHBJZCk7XG4gIGNvbnN0IHRpbWVvdXQgPSB1dGlsLmhhc1ZhbHVlKG9wdGlvbnMudGltZW91dCkgJiYgIWlzTmFOKG9wdGlvbnMudGltZW91dCkgPyBwYXJzZUludChvcHRpb25zLnRpbWVvdXQsIDEwKSA6IDUwMDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMucXVlcnlBcHBTdGF0ZShhcHBJZCkgPD0gQVBQX1NUQVRFLk5PVF9SVU5OSU5HLFxuICAgICAge3dhaXRNczogdGltZW91dCwgaW50ZXJ2YWxNczogMTAwfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGAnJHthcHBJZH0nIGlzIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgJHt0aW1lb3V0fW1zIHRpbWVvdXRgKTtcbiAgfVxuICB0aGlzLmxvZy5pbmZvKGAnJHthcHBJZH0nIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkYCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbnN0YWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzYwMDAwXSAtIFRoZSBjb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCB1bnRpbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHAgaXMgaW5zdGFsbGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBhbGxvd1Rlc3RQYWNrYWdlcyBbZmFsc2VdIC0gU2V0IHRvIHRydWUgaW4gb3JkZXIgdG8gYWxsb3cgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgaW5zdGFsbGF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VTZGNhcmQgW2ZhbHNlXSAtIFNldCB0byB0cnVlIHRvIGluc3RhbGwgdGhlIGFwcCBvbiBzZGNhcmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgbWVtb3J5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBncmFudFBlcm1pc3Npb25zIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBncmFudCBhbGwgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYW5pZmVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIEFuZHJvaWQgNisuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGxhY2UgW3RydWVdIC0gU2V0IGl0IHRvIGZhbHNlIGlmIHlvdSBkb24ndCB3YW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBkZXZpY2UuXG4gKi9cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgbG9jYWwgYXBrIHBhdGggb3IgYSByZW1vdGUgdXJsXG4gKiBAcGFyYW0gez9JbnN0YWxsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXQgb2YgaW5zdGFsbGF0aW9uIG9wdGlvbnNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgZ2l2ZW4gYXBrIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCByZWFjaGFibGVcbiAqL1xuY29tbWFuZHMuaW5zdGFsbEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcHAgKGFwcFBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBsb2NhbFBhdGggPSBhd2FpdCB0aGlzLmhlbHBlcnMuY29uZmlndXJlQXBwKGFwcFBhdGgsIEFQUF9FWFRFTlNJT05TKTtcbiAgYXdhaXQgdGhpcy5hZGIuaW5zdGFsbChsb2NhbFBhdGgsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDbGVhckFwcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7IXN0cmluZ30gYXBwSWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UgdG8gYmUgY2xlYXJlZFxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7Q2xlYXJBcHBPcHRpb25zfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgY2xlYW5pbmcgb2YgdGhlIGFwcCBkYXRhIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUNsZWFyQXBwID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlQ2xlYXJBcHAgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YXBwSWR9ID0gb3B0cztcbiAgaWYgKCFhcHBJZCkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYFRoZSAnYXBwSWQnIGFyZ3VtZW50IGlzIHJlcXVpcmVkYCk7XG4gIH1cbiAgYXdhaXQgdGhpcy5hZGIuY2xlYXIoYXBwSWQpO1xufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLGNBQWMsR0FBRyxDQUFDLE1BQUQsRUFBUyxPQUFULENBQXZCO0FBQ0EsTUFBTUMsc0JBQXNCLEdBQUcsbURBQS9CO0FBRUEsSUFBSUMsUUFBUSxHQUFHLEVBQWY7OztBQVFBQSxRQUFRLENBQUNDLGNBQVQsR0FBMEIsZUFBZUEsY0FBZixDQUErQkMsS0FBL0IsRUFBc0M7RUFDOUQsT0FBTyxNQUFNLEtBQUtDLEdBQUwsQ0FBU0YsY0FBVCxDQUF3QkMsS0FBeEIsQ0FBYjtBQUNELENBRkQ7O0FBZUFGLFFBQVEsQ0FBQ0ksYUFBVCxHQUF5QixlQUFlQSxhQUFmLENBQThCRixLQUE5QixFQUFxQztFQUM1RCxLQUFLRyxHQUFMLENBQVNDLElBQVQsQ0FBZSwwQkFBeUJKLEtBQU0sR0FBOUM7O0VBQ0EsSUFBSSxFQUFDLE1BQU0sS0FBS0MsR0FBTCxDQUFTRixjQUFULENBQXdCQyxLQUF4QixDQUFQLENBQUosRUFBMkM7SUFDekMsT0FBT0sseUJBQUEs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
@@ -56,7 +56,10 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
56
56
  broadcast: 'mobileBroadcast',
57
57
  getContexts: 'mobileGetContexts',
58
58
  unlock: 'mobileUnlock',
59
- refreshGpsCache: 'mobileRefreshGpsCache'
59
+ refreshGpsCache: 'mobileRefreshGpsCache',
60
+ startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',
61
+ isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',
62
+ stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording'
60
63
  };
61
64
 
62
65
  if (!_lodash.default.has(mobileCommandsMapping, mobileCommand)) {
@@ -70,4 +73,4 @@ var _default = extensions;
70
73
  exports.default = _default;require('source-map-support').install();
71
74
 
72
75
 
73
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL2V4ZWN1dGUuanMiLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiZXhlY3V0ZSIsInNjcmlwdCIsImFyZ3MiLCJtYXRjaCIsImxvZyIsImluZm8iLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJfIiwiaXNBcnJheSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJlbmRwb2ludCIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiY29tbWFuZCIsIm1vYmlsZUNvbW1hbmQiLCJvcHRzIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic2Vuc29yU2V0IiwiZ2V0RGV2aWNlVGltZSIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwiZGVsZXRlRmlsZSIsImNsZWFyQXBwIiwic3RhcnRTZXJ2aWNlIiwic3RvcFNlcnZpY2UiLCJzdGFydEFjdGl2aXR5IiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJ1bmxvY2siLCJyZWZyZXNoR3BzQ2FjaGUiLCJoYXMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9leGVjdXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMsIFBST1RPQ09MUyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBleHRlbnNpb25zID0ge307XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGUgKHNjcmlwdCwgYXJncykge1xuICBpZiAoc2NyaXB0Lm1hdGNoKC9ebW9iaWxlOi8pKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgRXhlY3V0aW5nIG5hdGl2ZSBjb21tYW5kICcke3NjcmlwdH0nYCk7XG4gICAgc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoL15tb2JpbGU6LywgJycpLnRyaW0oKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTW9iaWxlKHNjcmlwdCwgXy5pc0FycmF5KGFyZ3MpID8gYXJnc1swXSA6IGFyZ3MpO1xuICB9XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG4gIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5kb3duc3RyZWFtUHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQXG4gICAgPyAnL2V4ZWN1dGUnXG4gICAgOiAnL2V4ZWN1dGUvc3luYyc7XG4gIHJldHVybiBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoZW5kcG9pbnQsICdQT1NUJywge1xuICAgIHNjcmlwdCxcbiAgICBhcmdzLFxuICB9KTtcbn07XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZU1vYmlsZSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVNb2JpbGUgKG1vYmlsZUNvbW1hbmQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBtb2JpbGVDb21tYW5kc01hcHBpbmcgPSB7XG4gICAgc2hlbGw6ICdtb2JpbGVTaGVsbCcsXG5cbiAgICBleGVjRW11Q29uc29sZUNvbW1hbmQ6ICdtb2JpbGVFeGVjRW11Q29uc29sZUNvbW1hbmQnLFxuXG4gICAgc3RhcnRMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0JyxcbiAgICBzdG9wTG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0b3BMb2dzQnJvYWRjYXN0JyxcblxuICAgIGNoYW5nZVBlcm1pc3Npb25zOiAnbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMnLFxuICAgIGdldFBlcm1pc3Npb25zOiAnbW9iaWxlR2V0UGVybWlzc2lvbnMnLFxuXG4gICAgcGVyZm9ybUVkaXRvckFjdGlvbjogJ21vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24nLFxuXG4gICAgc2Vuc29yU2V0OiAnc2Vuc29yU2V0JyxcblxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcblxuICAgIGNsZWFyQXBwOiAnbW9iaWxlQ2xlYXJBcHAnLFxuXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgYnJvYWRjYXN0OiAnbW9iaWxlQnJvYWRjYXN0JyxcblxuICAgIGdldENvbnRleHRzOiAnbW9iaWxlR2V0Q29udGV4dHMnLFxuXG4gICAgdW5sb2NrOiAnbW9iaWxlVW5sb2NrJyxcblxuICAgIHJlZnJlc2hHcHNDYWNoZTogJ21vYmlsZVJlZnJlc2hHcHNDYWNoZScsXG4gIH07XG5cbiAgaWYgKCFfLmhhcyhtb2JpbGVDb21tYW5kc01hcHBpbmcsIG1vYmlsZUNvbW1hbmQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Vbmtub3duQ29tbWFuZEVycm9yKGBVbmtub3duIG1vYmlsZSBjb21tYW5kIFwiJHttb2JpbGVDb21tYW5kfVwiLiBgICtcbiAgICAgIGBPbmx5ICR7Xy5rZXlzKG1vYmlsZUNvbW1hbmRzTWFwcGluZyl9IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXNbbW9iaWxlQ29tbWFuZHNNYXBwaW5nW21vYmlsZUNvbW1hbmRdXShvcHRzKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLEVBQW5COztBQUVBQSxVQUFVLENBQUNDLE9BQVgsR0FBcUIsZUFBZUEsT0FBZixDQUF3QkMsTUFBeEIsRUFBZ0NDLElBQWhDLEVBQXNDO0VBQ3pELElBQUlELE1BQU0sQ0FBQ0UsS0FBUCxDQUFhLFVBQWIsQ0FBSixFQUE4QjtJQUM1QixLQUFLQyxHQUFMLENBQVNDLElBQVQsQ0FBZSw2QkFBNEJKLE1BQU8sR0FBbEQ7SUFDQUEsTUFBTSxHQUFHQSxNQUFNLENBQUNLLE9BQVAsQ0FBZSxVQUFmLEVBQTJCLEVBQTNCLEVBQStCQyxJQUEvQixFQUFUO0lBQ0EsT0FBTyxNQUFNLEtBQUtDLGFBQUwsQ0FBbUJQLE1BQW5CLEVBQTJCUSxlQUFBLENBQUVDLE9BQUYsQ0FBVVIsSUFBVixJQUFrQkEsSUFBSSxDQUFDLENBQUQsQ0FBdEIsR0FBNEJBLElBQXZELENBQWI7RUFDRDs7RUFDRCxJQUFJLENBQUMsS0FBS1MsWUFBTCxFQUFMLEVBQTBCO0lBQ3hCLE1BQU0sSUFBSUMsY0FBQSxDQUFPQyxtQkFBWCxFQUFOO0VBQ0Q7O0VBQ0QsTUFBTUMsUUFBUSxHQUFHLEtBQUtDLFlBQUwsQ0FBa0JDLE9BQWxCLENBQTBCQyxrQkFBMUIsS0FBaURDLGlCQUFBLENBQVVDLE9BQTNELEdBQ2IsVUFEYSxHQUViLGVBRko7RUFHQSxPQUFPLE1BQU0sS0FBS0osWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJJLE9BQTFCLENBQWtDTixRQUFsQyxFQUE0QyxNQUE1QyxFQUFvRDtJQUMvRGIsTUFEK0Q7SUFFL0RDO0VBRitELENBQXBELENBQWI7QUFJRCxDQWhCRDs7QUFrQkFILFVBQVUsQ0FBQ1MsYUFBWCxHQUEyQixlQUFlQSxhQUFmLENBQThCYSxhQUE5QixFQUE2Q0MsSUFBSSxHQUFHLEVBQXBELEVBQXdEO0VBQ2pGLE1BQU1DLHFCQUFxQixHQUFHO0lBQzVCQyxLQUFLLEVBQUUsYUFEcUI7SUFHNUJDLHFCQUFxQixFQUFFLDZCQUhLO0lBSzVCQyxrQkFBa0IsRUFBRSwwQkFMUTtJQU01QkMsaUJBQWlCLEVBQUUseUJBTlM7SUFRNUJDLGlCQUFpQixFQUFFLHlCQVJTO0lBUzVCQyxjQUFjLEVBQUUsc0JBVFk7SUFXNUJDLG1CQUFtQixFQUFFLDJCQVhPO0lBYTVCQyxTQUFTLEVBQUUsV0FiaUI7SUFlNUJDLGFBQWEsRUFBRSxxQkFmYTtJQWlCNUJDLG9CQUFvQixFQUFFLDRCQWpCTTtJQWtCNUJDLG1CQUFtQixFQUFFLDJCQWxCTztJQW9CNUJDLGdCQUFnQixFQUFFLHdCQXBCVTtJQXNCNUJDLE9BQU8sRUFBRSxlQXRCbUI7SUF3QjVCQyxVQUFVLEVBQUUsa0JBeEJnQjtJQTBCNUJDLFFBQVEsRUFBRSxnQkExQmtCO0lBNEI1QkMsWUFBWSxFQUFFLG9CQTVCYztJQTZCNUJDLFdBQVcsRUFBRSxtQkE3QmU7SUE4QjVCQyxhQUFhLEVBQUUscUJBOUJhO0lBK0I1QkMsU0FBUyxFQUFFLGlCQS9CaUI7SUFpQzVCQyxXQUFXLEVBQUUsbUJBakNlO0lBbUM1QkMsTUFBTSxFQUFFLGNBbkNvQjtJQXFDNUJDLGVBQWUsRUFBRTtFQXJDVyxDQUE5Qjs7RUF3Q0EsSUFBSSxDQUFDcEMsZUFBQSxDQUFFcUMsR0FBRixDQUFNdkIscUJBQU4sRUFBNkJGLGFBQTdCLENBQUwsRUFBa0Q7SUFDaEQsTUFBTSxJQUFJVCxjQUFBLENBQU9tQyxtQkFBWCxDQUFnQywyQkFBMEIxQixhQUFjLEtBQXpDLEdBQ2xDLFFBQU9aLGVBQUEsQ0FBRXVDLElBQUYsQ0FBT3pCLHFCQUFQLENBQThCLDBCQURsQyxDQUFOO0VBRUQ7O0VBQ0QsT0FBTyxNQUFNLEtBQUtBLHFCQUFxQixDQUFDRixhQUFELENBQTFCLEVBQTJDQyxJQUEzQyxDQUFiO0FBQ0QsQ0E5Q0Q7O2VBZ0RldkIsVSJ9
76
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL2V4ZWN1dGUuanMiLCJuYW1lcyI6WyJleHRlbnNpb25zIiwiZXhlY3V0ZSIsInNjcmlwdCIsImFyZ3MiLCJtYXRjaCIsImxvZyIsImluZm8iLCJyZXBsYWNlIiwidHJpbSIsImV4ZWN1dGVNb2JpbGUiLCJfIiwiaXNBcnJheSIsImlzV2ViQ29udGV4dCIsImVycm9ycyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJlbmRwb2ludCIsImNocm9tZWRyaXZlciIsImp3cHJveHkiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJQUk9UT0NPTFMiLCJNSlNPTldQIiwiY29tbWFuZCIsIm1vYmlsZUNvbW1hbmQiLCJvcHRzIiwibW9iaWxlQ29tbWFuZHNNYXBwaW5nIiwic2hlbGwiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJzdGFydExvZ3NCcm9hZGNhc3QiLCJzdG9wTG9nc0Jyb2FkY2FzdCIsImNoYW5nZVBlcm1pc3Npb25zIiwiZ2V0UGVybWlzc2lvbnMiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwic2Vuc29yU2V0IiwiZ2V0RGV2aWNlVGltZSIsInN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwic3RvcFNjcmVlblN0cmVhbWluZyIsImdldE5vdGlmaWNhdGlvbnMiLCJsaXN0U21zIiwiZGVsZXRlRmlsZSIsImNsZWFyQXBwIiwic3RhcnRTZXJ2aWNlIiwic3RvcFNlcnZpY2UiLCJzdGFydEFjdGl2aXR5IiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJ1bmxvY2siLCJyZWZyZXNoR3BzQ2FjaGUiLCJzdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsImlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZyIsInN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJoYXMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9leGVjdXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMsIFBST1RPQ09MUyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuXG5jb25zdCBleHRlbnNpb25zID0ge307XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGUgKHNjcmlwdCwgYXJncykge1xuICBpZiAoc2NyaXB0Lm1hdGNoKC9ebW9iaWxlOi8pKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgRXhlY3V0aW5nIG5hdGl2ZSBjb21tYW5kICcke3NjcmlwdH0nYCk7XG4gICAgc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoL15tb2JpbGU6LywgJycpLnRyaW0oKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlTW9iaWxlKHNjcmlwdCwgXy5pc0FycmF5KGFyZ3MpID8gYXJnc1swXSA6IGFyZ3MpO1xuICB9XG4gIGlmICghdGhpcy5pc1dlYkNvbnRleHQoKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG4gIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5kb3duc3RyZWFtUHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQXG4gICAgPyAnL2V4ZWN1dGUnXG4gICAgOiAnL2V4ZWN1dGUvc3luYyc7XG4gIHJldHVybiBhd2FpdCB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQoZW5kcG9pbnQsICdQT1NUJywge1xuICAgIHNjcmlwdCxcbiAgICBhcmdzLFxuICB9KTtcbn07XG5cbmV4dGVuc2lvbnMuZXhlY3V0ZU1vYmlsZSA9IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVNb2JpbGUgKG1vYmlsZUNvbW1hbmQsIG9wdHMgPSB7fSkge1xuICBjb25zdCBtb2JpbGVDb21tYW5kc01hcHBpbmcgPSB7XG4gICAgc2hlbGw6ICdtb2JpbGVTaGVsbCcsXG5cbiAgICBleGVjRW11Q29uc29sZUNvbW1hbmQ6ICdtb2JpbGVFeGVjRW11Q29uc29sZUNvbW1hbmQnLFxuXG4gICAgc3RhcnRMb2dzQnJvYWRjYXN0OiAnbW9iaWxlU3RhcnRMb2dzQnJvYWRjYXN0JyxcbiAgICBzdG9wTG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0b3BMb2dzQnJvYWRjYXN0JyxcblxuICAgIGNoYW5nZVBlcm1pc3Npb25zOiAnbW9iaWxlQ2hhbmdlUGVybWlzc2lvbnMnLFxuICAgIGdldFBlcm1pc3Npb25zOiAnbW9iaWxlR2V0UGVybWlzc2lvbnMnLFxuXG4gICAgcGVyZm9ybUVkaXRvckFjdGlvbjogJ21vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24nLFxuXG4gICAgc2Vuc29yU2V0OiAnc2Vuc29yU2V0JyxcblxuICAgIGdldERldmljZVRpbWU6ICdtb2JpbGVHZXREZXZpY2VUaW1lJyxcblxuICAgIHN0YXJ0U2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcnLFxuICAgIHN0b3BTY3JlZW5TdHJlYW1pbmc6ICdtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nJyxcblxuICAgIGdldE5vdGlmaWNhdGlvbnM6ICdtb2JpbGVHZXROb3RpZmljYXRpb25zJyxcblxuICAgIGxpc3RTbXM6ICdtb2JpbGVMaXN0U21zJyxcblxuICAgIGRlbGV0ZUZpbGU6ICdtb2JpbGVEZWxldGVGaWxlJyxcblxuICAgIGNsZWFyQXBwOiAnbW9iaWxlQ2xlYXJBcHAnLFxuXG4gICAgc3RhcnRTZXJ2aWNlOiAnbW9iaWxlU3RhcnRTZXJ2aWNlJyxcbiAgICBzdG9wU2VydmljZTogJ21vYmlsZVN0b3BTZXJ2aWNlJyxcbiAgICBzdGFydEFjdGl2aXR5OiAnbW9iaWxlU3RhcnRBY3Rpdml0eScsXG4gICAgYnJvYWRjYXN0OiAnbW9iaWxlQnJvYWRjYXN0JyxcblxuICAgIGdldENvbnRleHRzOiAnbW9iaWxlR2V0Q29udGV4dHMnLFxuXG4gICAgdW5sb2NrOiAnbW9iaWxlVW5sb2NrJyxcblxuICAgIHJlZnJlc2hHcHNDYWNoZTogJ21vYmlsZVJlZnJlc2hHcHNDYWNoZScsXG5cbiAgICBzdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZzogJ21vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nJyxcbiAgICBpc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmc6ICdtb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmcnLFxuICAgIHN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmc6ICdtb2JpbGVTdG9wTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nJyxcbiAgfTtcblxuICBpZiAoIV8uaGFzKG1vYmlsZUNvbW1hbmRzTWFwcGluZywgbW9iaWxlQ29tbWFuZCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLlVua25vd25Db21tYW5kRXJyb3IoYFVua25vd24gbW9iaWxlIGNvbW1hbmQgXCIke21vYmlsZUNvbW1hbmR9XCIuIGAgK1xuICAgICAgYE9ubHkgJHtfLmtleXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nKX0gY29tbWFuZHMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpc1ttb2JpbGVDb21tYW5kc01hcHBpbmdbbW9iaWxlQ29tbWFuZF1dKG9wdHMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQSxNQUFNQSxVQUFVLEdBQUcsRUFBbkI7O0FBRUFBLFVBQVUsQ0FBQ0MsT0FBWCxHQUFxQixlQUFlQSxPQUFmLENBQXdCQyxNQUF4QixFQUFnQ0MsSUFBaEMsRUFBc0M7RUFDekQsSUFBSUQsTUFBTSxDQUFDRSxLQUFQLENBQWEsVUFBYixDQUFKLEVBQThCO0lBQzVCLEtBQUtDLEdBQUwsQ0FBU0MsSUFBVCxDQUFlLDZCQUE0QkosTUFBTyxHQUFsRDtJQUNBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQ0ssT0FBUCxDQUFlLFVBQWYsRUFBMkIsRUFBM0IsRUFBK0JDLElBQS9CLEVBQVQ7SUFDQSxPQUFPLE1BQU0sS0FBS0MsYUFBTCxDQUFtQlAsTUFBbkIsRUFBMkJRLGVBQUEsQ0FBRUMsT0FBRixDQUFVUixJQUFWLElBQWtCQSxJQUFJLENBQUMsQ0FBRCxDQUF0QixHQUE0QkEsSUFBdkQsQ0FBYjtFQUNEOztFQUNELElBQUksQ0FBQyxLQUFLUyxZQUFMLEVBQUwsRUFBMEI7SUFDeEIsTUFBTSxJQUFJQyxjQUFBLENBQU9DLG1CQUFYLEVBQU47RUFDRDs7RUFDRCxNQUFNQyxRQUFRLEdBQUcsS0FBS0MsWUFBTCxDQUFrQkMsT0FBbEIsQ0FBMEJDLGtCQUExQixLQUFpREMsaUJBQUEsQ0FBVUMsT0FBM0QsR0FDYixVQURhLEdBRWIsZUFGSjtFQUdBLE9BQU8sTUFBTSxLQUFLSixZQUFMLENBQWtCQyxPQUFsQixDQUEwQkksT0FBMUIsQ0FBa0NOLFFBQWxDLEVBQTRDLE1BQTVDLEVBQW9EO0lBQy9EYixNQUQrRDtJQUUvREM7RUFGK0QsQ0FBcEQsQ0FBYjtBQUlELENBaEJEOztBQWtCQUgsVUFBVSxDQUFDUyxhQUFYLEdBQTJCLGVBQWVBLGFBQWYsQ0FBOEJhLGFBQTlCLEVBQTZDQyxJQUFJLEdBQUcsRUFBcEQsRUFBd0Q7RUFDakYsTUFBTUMscUJBQXFCLEdBQUc7SUFDNUJDLEtBQUssRUFBRSxhQURxQjtJQUc1QkMscUJBQXFCLEVBQUUsNkJBSEs7SUFLNUJDLGtCQUFrQixFQUFFLDBCQUxRO0lBTTVCQyxpQkFBaUIsRUFBRSx5QkFOUztJQVE1QkMsaUJBQWlCLEVBQUUseUJBUlM7SUFTNUJDLGNBQWMsRUFBRSxzQkFUWTtJQVc1QkMsbUJBQW1CLEVBQUUsMkJBWE87SUFhNUJDLFNBQVMsRUFBRSxXQWJpQjtJQWU1QkMsYUFBYSxFQUFFLHFCQWZhO0lBaUI1QkMsb0JBQW9CLEVBQUUsNEJBakJNO0lBa0I1QkMsbUJBQW1CLEVBQUUsMkJBbEJPO0lBb0I1QkMsZ0JBQWdCLEVBQUUsd0JBcEJVO0lBc0I1QkMsT0FBTyxFQUFFLGVBdEJtQjtJQXdCNUJDLFVBQVUsRUFBRSxrQkF4QmdCO0lBMEI1QkMsUUFBUSxFQUFFLGdCQTFCa0I7SUE0QjVCQyxZQUFZLEVBQUUsb0JBNUJjO0lBNkI1QkMsV0FBVyxFQUFFLG1CQTdCZTtJQThCNUJDLGFBQWEsRUFBRSxxQkE5QmE7SUErQjVCQyxTQUFTLEVBQUUsaUJBL0JpQjtJQWlDNUJDLFdBQVcsRUFBRSxtQkFqQ2U7SUFtQzVCQyxNQUFNLEVBQUUsY0FuQ29CO0lBcUM1QkMsZUFBZSxFQUFFLHVCQXJDVztJQXVDNUJDLDZCQUE2QixFQUFFLHFDQXZDSDtJQXdDNUJDLGlDQUFpQyxFQUFFLHlDQXhDUDtJQXlDNUJDLDRCQUE0QixFQUFFO0VBekNGLENBQTlCOztFQTRDQSxJQUFJLENBQUN2QyxlQUFBLENBQUV3QyxHQUFGLENBQU0xQixxQkFBTixFQUE2QkYsYUFBN0IsQ0FBTCxFQUFrRDtJQUNoRCxNQUFNLElBQUlULGNBQUEsQ0FBT3NDLG1CQUFYLENBQWdDLDJCQUEwQjdCLGFBQWMsS0FBekMsR0FDbEMsUUFBT1osZUFBQSxDQUFFMEMsSUFBRixDQUFPNUIscUJBQVAsQ0FBOEIsMEJBRGxDLENBQU47RUFFRDs7RUFDRCxPQUFPLE1BQU0sS0FBS0EscUJBQXFCLENBQUNGLGFBQUQsQ0FBMUIsRUFBMkNDLElBQTNDLENBQWI7QUFDRCxDQWxERDs7ZUFvRGV2QixVIn0=
@@ -51,11 +51,13 @@ var _systemBars = _interopRequireDefault(require("./system-bars"));
51
51
 
52
52
  var _log = _interopRequireDefault(require("./log"));
53
53
 
54
+ var _mediaProjection = _interopRequireDefault(require("./media-projection"));
55
+
54
56
  let commands = {};
55
57
  exports.commands = commands;
56
- Object.assign(commands, _find.default, _general.default, _alert.default, _element.default, _context.default, _actions.default, _touch.default, _ime.default, _network.default, _coverage.default, _recordscreen.default, _intent.default, _streamscreen.default, _performance.default, _execute.default, _shell.default, _emuConsole.default, _systemBars.default, _appManagement.default, _fileActions.default, _log.default);
58
+ Object.assign(commands, _find.default, _general.default, _alert.default, _element.default, _context.default, _actions.default, _touch.default, _ime.default, _network.default, _coverage.default, _recordscreen.default, _intent.default, _streamscreen.default, _performance.default, _execute.default, _shell.default, _emuConsole.default, _systemBars.default, _appManagement.default, _fileActions.default, _log.default, _mediaProjection.default);
57
59
  var _default = commands;
58
60
  exports.default = _default;require('source-map-support').install();
59
61
 
60
62
 
61
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL2luZGV4LmpzIiwibmFtZXMiOlsiY29tbWFuZHMiLCJPYmplY3QiLCJhc3NpZ24iLCJmaW5kQ21kcyIsImdlbmVyYWxDbWRzIiwiYWxlcnRDbWRzIiwiZWxlbWVudENtZHMiLCJjb250ZXh0Q21kcyIsImFjdGlvbkNtZHMiLCJ0b3VjaENtZHMiLCJpbWVDbWRzIiwibmV0d29ya0NtZHMiLCJjb3ZlcmFnZUNtZHMiLCJyZWNvcmRzY3JlZW5DbWRzIiwiaW50ZW50Q21kcyIsInNjcmVlblN0cmVhbUNtZHMiLCJwZXJmb3JtYW5jZUNtZHMiLCJleGVjdXRlQ21kcyIsInNoZWxsQ21kcyIsImVtdUNvbnNvbGVDbWRzIiwic3lzdGVtQmFyc0NtZHMiLCJhcHBNYW5hZ2VtZW50Q21kcyIsImZpbGVBY3Rpb25zQ21kcyIsImxvZ0NtZHMiXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uIiwic291cmNlcyI6WyJsaWIvY29tbWFuZHMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZpbmRDbWRzIGZyb20gJy4vZmluZCc7XG5pbXBvcnQgZ2VuZXJhbENtZHMgZnJvbSAnLi9nZW5lcmFsJztcbmltcG9ydCBhbGVydENtZHMgZnJvbSAnLi9hbGVydCc7XG5pbXBvcnQgZWxlbWVudENtZHMgZnJvbSAnLi9lbGVtZW50JztcbmltcG9ydCBjb250ZXh0Q21kcyBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IGFjdGlvbkNtZHMgZnJvbSAnLi9hY3Rpb25zJztcbmltcG9ydCB0b3VjaENtZHMgZnJvbSAnLi90b3VjaCc7XG5pbXBvcnQgaW1lQ21kcyBmcm9tICcuL2ltZSc7XG5pbXBvcnQgbmV0d29ya0NtZHMgZnJvbSAnLi9uZXR3b3JrJztcbmltcG9ydCBjb3ZlcmFnZUNtZHMgZnJvbSAnLi9jb3ZlcmFnZSc7XG5pbXBvcnQgcmVjb3Jkc2NyZWVuQ21kcyBmcm9tICcuL3JlY29yZHNjcmVlbic7XG5pbXBvcnQgc2NyZWVuU3RyZWFtQ21kcyBmcm9tICcuL3N0cmVhbXNjcmVlbic7XG5pbXBvcnQgcGVyZm9ybWFuY2VDbWRzIGZyb20gJy4vcGVyZm9ybWFuY2UnO1xuaW1wb3J0IGV4ZWN1dGVDbWRzIGZyb20gJy4vZXhlY3V0ZSc7XG5pbXBvcnQgc2hlbGxDbWRzIGZyb20gJy4vc2hlbGwnO1xuaW1wb3J0IGVtdUNvbnNvbGVDbWRzIGZyb20gJy4vZW11LWNvbnNvbGUnO1xuaW1wb3J0IGZpbGVBY3Rpb25zQ21kcyBmcm9tICcuL2ZpbGUtYWN0aW9ucyc7XG5pbXBvcnQgYXBwTWFuYWdlbWVudENtZHMgZnJvbSAnLi9hcHAtbWFuYWdlbWVudCc7XG5pbXBvcnQgaW50ZW50Q21kcyBmcm9tICcuL2ludGVudCc7XG5pbXBvcnQgc3lzdGVtQmFyc0NtZHMgZnJvbSAnLi9zeXN0ZW0tYmFycyc7XG5pbXBvcnQgbG9nQ21kcyBmcm9tICcuL2xvZyc7XG5cblxubGV0IGNvbW1hbmRzID0ge307XG5PYmplY3QuYXNzaWduKFxuICBjb21tYW5kcyxcbiAgZmluZENtZHMsXG4gIGdlbmVyYWxDbWRzLFxuICBhbGVydENtZHMsXG4gIGVsZW1lbnRDbWRzLFxuICBjb250ZXh0Q21kcyxcbiAgYWN0aW9uQ21kcyxcbiAgdG91Y2hDbWRzLFxuICBpbWVDbWRzLFxuICBuZXR3b3JrQ21kcyxcbiAgY292ZXJhZ2VDbWRzLFxuICByZWNvcmRzY3JlZW5DbWRzLFxuICBpbnRlbnRDbWRzLFxuICBzY3JlZW5TdHJlYW1DbWRzLFxuICBwZXJmb3JtYW5jZUNtZHMsXG4gIGV4ZWN1dGVDbWRzLFxuICBzaGVsbENtZHMsXG4gIGVtdUNvbnNvbGVDbWRzLFxuICBzeXN0ZW1CYXJzQ21kcyxcbiAgYXBwTWFuYWdlbWVudENtZHMsXG4gIGZpbGVBY3Rpb25zQ21kcyxcbiAgbG9nQ21kcyxcbiAgLy8gYWRkIG90aGVyIGNvbW1hbmQgdHlwZXMgaGVyZVxuKTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLElBQUlBLFFBQVEsR0FBRyxFQUFmOztBQUNBQyxNQUFNLENBQUNDLE1BQVAsQ0FDRUYsUUFERixFQUVFRyxhQUZGLEVBR0VDLGdCQUhGLEVBSUVDLGNBSkYsRUFLRUMsZ0JBTEYsRUFNRUMsZ0JBTkYsRUFPRUMsZ0JBUEYsRUFRRUMsY0FSRixFQVNFQyxZQVRGLEVBVUVDLGdCQVZGLEVBV0VDLGlCQVhGLEVBWUVDLHFCQVpGLEVBYUVDLGVBYkYsRUFjRUMscUJBZEYsRUFlRUMsb0JBZkYsRUFnQkVDLGdCQWhCRixFQWlCRUMsY0FqQkYsRUFrQkVDLG1CQWxCRixFQW1CRUMsbUJBbkJGLEVBb0JFQyxzQkFwQkYsRUFxQkVDLG9CQXJCRixFQXNCRUMsWUF0QkY7ZUEyQmV2QixRIn0=
63
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL2luZGV4LmpzIiwibmFtZXMiOlsiY29tbWFuZHMiLCJPYmplY3QiLCJhc3NpZ24iLCJmaW5kQ21kcyIsImdlbmVyYWxDbWRzIiwiYWxlcnRDbWRzIiwiZWxlbWVudENtZHMiLCJjb250ZXh0Q21kcyIsImFjdGlvbkNtZHMiLCJ0b3VjaENtZHMiLCJpbWVDbWRzIiwibmV0d29ya0NtZHMiLCJjb3ZlcmFnZUNtZHMiLCJyZWNvcmRzY3JlZW5DbWRzIiwiaW50ZW50Q21kcyIsInNjcmVlblN0cmVhbUNtZHMiLCJwZXJmb3JtYW5jZUNtZHMiLCJleGVjdXRlQ21kcyIsInNoZWxsQ21kcyIsImVtdUNvbnNvbGVDbWRzIiwic3lzdGVtQmFyc0NtZHMiLCJhcHBNYW5hZ2VtZW50Q21kcyIsImZpbGVBY3Rpb25zQ21kcyIsImxvZ0NtZHMiLCJtZWRpYVByb2plY3Rpb25DbWRzIl0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLiIsInNvdXJjZXMiOlsibGliL2NvbW1hbmRzL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmaW5kQ21kcyBmcm9tICcuL2ZpbmQnO1xuaW1wb3J0IGdlbmVyYWxDbWRzIGZyb20gJy4vZ2VuZXJhbCc7XG5pbXBvcnQgYWxlcnRDbWRzIGZyb20gJy4vYWxlcnQnO1xuaW1wb3J0IGVsZW1lbnRDbWRzIGZyb20gJy4vZWxlbWVudCc7XG5pbXBvcnQgY29udGV4dENtZHMgZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCBhY3Rpb25DbWRzIGZyb20gJy4vYWN0aW9ucyc7XG5pbXBvcnQgdG91Y2hDbWRzIGZyb20gJy4vdG91Y2gnO1xuaW1wb3J0IGltZUNtZHMgZnJvbSAnLi9pbWUnO1xuaW1wb3J0IG5ldHdvcmtDbWRzIGZyb20gJy4vbmV0d29yayc7XG5pbXBvcnQgY292ZXJhZ2VDbWRzIGZyb20gJy4vY292ZXJhZ2UnO1xuaW1wb3J0IHJlY29yZHNjcmVlbkNtZHMgZnJvbSAnLi9yZWNvcmRzY3JlZW4nO1xuaW1wb3J0IHNjcmVlblN0cmVhbUNtZHMgZnJvbSAnLi9zdHJlYW1zY3JlZW4nO1xuaW1wb3J0IHBlcmZvcm1hbmNlQ21kcyBmcm9tICcuL3BlcmZvcm1hbmNlJztcbmltcG9ydCBleGVjdXRlQ21kcyBmcm9tICcuL2V4ZWN1dGUnO1xuaW1wb3J0IHNoZWxsQ21kcyBmcm9tICcuL3NoZWxsJztcbmltcG9ydCBlbXVDb25zb2xlQ21kcyBmcm9tICcuL2VtdS1jb25zb2xlJztcbmltcG9ydCBmaWxlQWN0aW9uc0NtZHMgZnJvbSAnLi9maWxlLWFjdGlvbnMnO1xuaW1wb3J0IGFwcE1hbmFnZW1lbnRDbWRzIGZyb20gJy4vYXBwLW1hbmFnZW1lbnQnO1xuaW1wb3J0IGludGVudENtZHMgZnJvbSAnLi9pbnRlbnQnO1xuaW1wb3J0IHN5c3RlbUJhcnNDbWRzIGZyb20gJy4vc3lzdGVtLWJhcnMnO1xuaW1wb3J0IGxvZ0NtZHMgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IG1lZGlhUHJvamVjdGlvbkNtZHMgZnJvbSAnLi9tZWRpYS1wcm9qZWN0aW9uJztcblxuXG5sZXQgY29tbWFuZHMgPSB7fTtcbk9iamVjdC5hc3NpZ24oXG4gIGNvbW1hbmRzLFxuICBmaW5kQ21kcyxcbiAgZ2VuZXJhbENtZHMsXG4gIGFsZXJ0Q21kcyxcbiAgZWxlbWVudENtZHMsXG4gIGNvbnRleHRDbWRzLFxuICBhY3Rpb25DbWRzLFxuICB0b3VjaENtZHMsXG4gIGltZUNtZHMsXG4gIG5ldHdvcmtDbWRzLFxuICBjb3ZlcmFnZUNtZHMsXG4gIHJlY29yZHNjcmVlbkNtZHMsXG4gIGludGVudENtZHMsXG4gIHNjcmVlblN0cmVhbUNtZHMsXG4gIHBlcmZvcm1hbmNlQ21kcyxcbiAgZXhlY3V0ZUNtZHMsXG4gIHNoZWxsQ21kcyxcbiAgZW11Q29uc29sZUNtZHMsXG4gIHN5c3RlbUJhcnNDbWRzLFxuICBhcHBNYW5hZ2VtZW50Q21kcyxcbiAgZmlsZUFjdGlvbnNDbWRzLFxuICBsb2dDbWRzLFxuICBtZWRpYVByb2plY3Rpb25DbWRzLFxuICAvLyBhZGQgb3RoZXIgY29tbWFuZCB0eXBlcyBoZXJlXG4pO1xuXG5leHBvcnQgeyBjb21tYW5kcyB9O1xuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsSUFBSUEsUUFBUSxHQUFHLEVBQWY7O0FBQ0FDLE1BQU0sQ0FBQ0MsTUFBUCxDQUNFRixRQURGLEVBRUVHLGFBRkYsRUFHRUMsZ0JBSEYsRUFJRUMsY0FKRixFQUtFQyxnQkFMRixFQU1FQyxnQkFORixFQU9FQyxnQkFQRixFQVFFQyxjQVJGLEVBU0VDLFlBVEYsRUFVRUMsZ0JBVkYsRUFXRUMsaUJBWEYsRUFZRUMscUJBWkYsRUFhRUMsZUFiRixFQWNFQyxxQkFkRixFQWVFQyxvQkFmRixFQWdCRUMsZ0JBaEJGLEVBaUJFQyxjQWpCRixFQWtCRUMsbUJBbEJGLEVBbUJFQyxtQkFuQkYsRUFvQkVDLHNCQXBCRixFQXFCRUMsb0JBckJGLEVBc0JFQyxZQXRCRixFQXVCRUMsd0JBdkJGO2VBNEJleEIsUSJ9
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = exports.commands = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ var _asyncbox = require("asyncbox");
15
+
16
+ var _support = require("appium/support");
17
+
18
+ var _path = _interopRequireDefault(require("path"));
19
+
20
+ var _bluebird = _interopRequireDefault(require("bluebird"));
21
+
22
+ var _androidHelpers = require("../android-helpers");
23
+
24
+ var _moment = _interopRequireDefault(require("moment"));
25
+
26
+ const commands = {};
27
+ exports.commands = commands;
28
+ const DEFAULT_EXT = '.mp4';
29
+ const RECORDING_STARTUP_TIMEOUT_MS = 3 * 1000;
30
+ const RECORDING_STOP_TIMEOUT_MS = 3 * 1000;
31
+ const MIN_API_LEVEL = 29;
32
+ const RECORDING_SERVICE_NAME = `${_androidHelpers.SETTINGS_HELPER_PKG_ID}/.recorder.RecorderService`;
33
+ const RECORDING_ACTIVITY_NAME = `${_androidHelpers.SETTINGS_HELPER_PKG_ID}/io.appium.settings.Settings`;
34
+ const RECORDING_ACTION_START = `${_androidHelpers.SETTINGS_HELPER_PKG_ID}.recording.ACTION_START`;
35
+ const RECORDING_ACTION_STOP = `${_androidHelpers.SETTINGS_HELPER_PKG_ID}.recording.ACTION_STOP`;
36
+ const RECORDINGS_ROOT = `/storage/emulated/0/Android/data/${_androidHelpers.SETTINGS_HELPER_PKG_ID}/files`;
37
+ const DEFAULT_FILENAME_FORMAT = 'YYYY-MM-DDTHH-mm-ss';
38
+
39
+ async function uploadRecordedMedia(localFile, remotePath = null, uploadOptions = {}) {
40
+ if (_lodash.default.isEmpty(remotePath)) {
41
+ return (await _support.util.toInMemoryBase64(localFile)).toString();
42
+ }
43
+
44
+ const {
45
+ user,
46
+ pass,
47
+ method,
48
+ headers,
49
+ fileFieldName,
50
+ formFields
51
+ } = uploadOptions;
52
+ const options = {
53
+ method: method || 'PUT',
54
+ headers,
55
+ fileFieldName,
56
+ formFields
57
+ };
58
+
59
+ if (user && pass) {
60
+ options.auth = {
61
+ user,
62
+ pass
63
+ };
64
+ }
65
+
66
+ await _support.net.uploadFile(localFile, remotePath, options);
67
+ return '';
68
+ }
69
+
70
+ function adjustMediaExtension(name) {
71
+ return _lodash.default.toLower(name).endsWith(DEFAULT_EXT) ? name : `${name}${DEFAULT_EXT}`;
72
+ }
73
+
74
+ async function verifyMediaProjectionRecordingIsSupported(adb) {
75
+ const apiLevel = await adb.getApiLevel();
76
+
77
+ if (apiLevel < MIN_API_LEVEL) {
78
+ throw new Error(`Media projection-based recording is not available on API Level ${apiLevel}. ` + `Minimum required API Level is ${MIN_API_LEVEL}.`);
79
+ }
80
+ }
81
+
82
+ class MediaProjectionRecorder {
83
+ constructor(adb) {
84
+ this.adb = adb;
85
+ }
86
+
87
+ async isRunning() {
88
+ const stdout = await this.adb.shell(['dumpsys', 'activity', 'services', RECORDING_SERVICE_NAME]);
89
+ return stdout.includes(RECORDING_SERVICE_NAME);
90
+ }
91
+
92
+ async start(opts = {}) {
93
+ if (await this.isRunning()) {
94
+ return false;
95
+ }
96
+
97
+ await this.cleanup();
98
+ const {
99
+ filename,
100
+ maxDurationSec,
101
+ priority,
102
+ resolution
103
+ } = opts;
104
+ const args = ['am', 'start', '-n', RECORDING_ACTIVITY_NAME, '-a', RECORDING_ACTION_START];
105
+
106
+ if (filename) {
107
+ args.push('--es', 'filename', filename);
108
+ }
109
+
110
+ if (maxDurationSec) {
111
+ args.push('--es', 'max_duration_sec', `${maxDurationSec}`);
112
+ }
113
+
114
+ if (priority) {
115
+ args.push('--es', 'priority', priority);
116
+ }
117
+
118
+ if (resolution) {
119
+ args.push('--es', 'resolution', resolution);
120
+ }
121
+
122
+ await this.adb.shell(args);
123
+ await new _bluebird.default((resolve, reject) => {
124
+ setTimeout(async () => {
125
+ if (!(await this.isRunning())) {
126
+ return reject(new Error(`The media projection recording is not running after ${RECORDING_STARTUP_TIMEOUT_MS}ms. ` + `Please check the logcat output for more details.`));
127
+ }
128
+
129
+ resolve();
130
+ }, RECORDING_STARTUP_TIMEOUT_MS);
131
+ });
132
+ return true;
133
+ }
134
+
135
+ async cleanup() {
136
+ await this.adb.shell([`rm -f ${RECORDINGS_ROOT}/*`]);
137
+ }
138
+
139
+ async pullRecent() {
140
+ const recordings = await this.adb.ls(RECORDINGS_ROOT, ['-tr']);
141
+
142
+ if (_lodash.default.isEmpty(recordings)) {
143
+ return null;
144
+ }
145
+
146
+ const dstPath = _path.default.join(await _support.tempDir.openDir(), recordings[0]);
147
+
148
+ await this.adb.pull(`${RECORDINGS_ROOT}/${recordings[0]}`, dstPath);
149
+ return dstPath;
150
+ }
151
+
152
+ async stop() {
153
+ if (!(await this.isRunning())) {
154
+ return false;
155
+ }
156
+
157
+ await this.adb.shell(['am', 'start', '-n', RECORDING_ACTIVITY_NAME, '-a', RECORDING_ACTION_STOP]);
158
+
159
+ try {
160
+ await (0, _asyncbox.waitForCondition)(async () => !(await this.isRunning()), {
161
+ waitMs: RECORDING_STOP_TIMEOUT_MS,
162
+ intervalMs: 500
163
+ });
164
+ } catch (e) {
165
+ throw new Error(`The attempt to stop the current media projection recording timed out after ` + `${RECORDING_STOP_TIMEOUT_MS}ms`);
166
+ }
167
+
168
+ return true;
169
+ }
170
+
171
+ }
172
+
173
+ commands.mobileStartMediaProjectionRecording = async function mobileStartMediaProjectionRecording(options = {}) {
174
+ await verifyMediaProjectionRecordingIsSupported(this.adb);
175
+ const {
176
+ resolution,
177
+ priority,
178
+ maxDurationSec,
179
+ filename
180
+ } = options;
181
+ const recorder = new MediaProjectionRecorder(this.adb);
182
+ const fname = adjustMediaExtension(filename || (0, _moment.default)().format(DEFAULT_FILENAME_FORMAT));
183
+ const didStart = await recorder.start({
184
+ resolution,
185
+ priority,
186
+ maxDurationSec,
187
+ filename: fname
188
+ });
189
+
190
+ if (didStart) {
191
+ this.log.info(`A new media projection recording '${fname}' has been successfully started`);
192
+ } else {
193
+ this.log.info('Another media projection recording is already in progress. There is nothing to start');
194
+ }
195
+
196
+ return didStart;
197
+ };
198
+
199
+ commands.mobileIsMediaProjectionRecordingRunning = async function mobileIsMediaProjectionRecordingRunning() {
200
+ await verifyMediaProjectionRecordingIsSupported(this.adb);
201
+ const recorder = new MediaProjectionRecorder(this.adb);
202
+ return await recorder.isRunning();
203
+ };
204
+
205
+ commands.mobileStopMediaProjectionRecording = async function mobileStopMediaProjectionRecording(options = {}) {
206
+ await verifyMediaProjectionRecordingIsSupported(this.adb);
207
+ const recorder = new MediaProjectionRecorder(this.adb);
208
+
209
+ if (await recorder.stop()) {
210
+ this.log.info('Successfully stopped a media projection recording. Pulling the recorded media');
211
+ } else {
212
+ this.log.info('Media projection recording is not running. There is nothing to stop');
213
+ }
214
+
215
+ const recentRecordingPath = await recorder.pullRecent();
216
+
217
+ if (!recentRecordingPath) {
218
+ throw new Error(`No recent media projection recording have been found. Did you start any?`);
219
+ }
220
+
221
+ const {
222
+ remotePath
223
+ } = options;
224
+
225
+ if (_lodash.default.isEmpty(remotePath)) {
226
+ const {
227
+ size
228
+ } = await _support.fs.stat(recentRecordingPath);
229
+ this.log.debug(`The size of the resulting media projection recording is ${_support.util.toReadableSizeString(size)}`);
230
+ }
231
+
232
+ try {
233
+ return await uploadRecordedMedia(recentRecordingPath, remotePath, options);
234
+ } finally {
235
+ await _support.fs.rimraf(_path.default.dirname(recentRecordingPath));
236
+ }
237
+ };
238
+
239
+ var _default = commands;
240
+ exports.default = _default;require('source-map-support').install();
241
+
242
+
243
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL2NvbW1hbmRzL21lZGlhLXByb2plY3Rpb24uanMiLCJuYW1lcyI6WyJjb21tYW5kcyIsIkRFRkFVTFRfRVhUIiwiUkVDT1JESU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIlJFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMiLCJNSU5fQVBJX0xFVkVMIiwiUkVDT1JESU5HX1NFUlZJQ0VfTkFNRSIsIlNFVFRJTkdTX0hFTFBFUl9QS0dfSUQiLCJSRUNPUkRJTkdfQUNUSVZJVFlfTkFNRSIsIlJFQ09SRElOR19BQ1RJT05fU1RBUlQiLCJSRUNPUkRJTkdfQUNUSU9OX1NUT1AiLCJSRUNPUkRJTkdTX1JPT1QiLCJERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5IiwidXRpbCIsInRvSW5NZW1vcnlCYXNlNjQiLCJ0b1N0cmluZyIsInVzZXIiLCJwYXNzIiwibWV0aG9kIiwiaGVhZGVycyIsImZpbGVGaWVsZE5hbWUiLCJmb3JtRmllbGRzIiwib3B0aW9ucyIsImF1dGgiLCJuZXQiLCJ1cGxvYWRGaWxlIiwiYWRqdXN0TWVkaWFFeHRlbnNpb24iLCJuYW1lIiwidG9Mb3dlciIsImVuZHNXaXRoIiwidmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQiLCJhZGIiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiRXJyb3IiLCJNZWRpYVByb2plY3Rpb25SZWNvcmRlciIsImNvbnN0cnVjdG9yIiwiaXNSdW5uaW5nIiwic3Rkb3V0Iiwic2hlbGwiLCJpbmNsdWRlcyIsInN0YXJ0Iiwib3B0cyIsImNsZWFudXAiLCJmaWxlbmFtZSIsIm1heER1cmF0aW9uU2VjIiwicHJpb3JpdHkiLCJyZXNvbHV0aW9uIiwiYXJncyIsInB1c2giLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsInNldFRpbWVvdXQiLCJwdWxsUmVjZW50IiwicmVjb3JkaW5ncyIsImxzIiwiZHN0UGF0aCIsInBhdGgiLCJqb2luIiwidGVtcERpciIsIm9wZW5EaXIiLCJwdWxsIiwic3RvcCIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiZSIsIm1vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nIiwicmVjb3JkZXIiLCJmbmFtZSIsIm1vbWVudCIsImZvcm1hdCIsImRpZFN0YXJ0IiwibG9nIiwiaW5mbyIsIm1vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZyIsIm1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJyZWNlbnRSZWNvcmRpbmdQYXRoIiwic2l6ZSIsImZzIiwic3RhdCIsImRlYnVnIiwidG9SZWFkYWJsZVNpemVTdHJpbmciLCJyaW1yYWYiLCJkaXJuYW1lIl0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLiIsInNvdXJjZXMiOlsibGliL2NvbW1hbmRzL21lZGlhLXByb2plY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsLCBmcywgbmV0LCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBTRVRUSU5HU19IRUxQRVJfUEtHX0lEIH0gZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2lvLmFwcGl1bS5zZXR0aW5ncyNpbnRlcm5hbC1hdWRpby0tdmlkZW8tcmVjb3JkaW5nXG5jb25zdCBERUZBVUxUX0VYVCA9ICcubXA0JztcbmNvbnN0IFJFQ09SRElOR19TVEFSVFVQX1RJTUVPVVRfTVMgPSAzICogMTAwMDtcbmNvbnN0IFJFQ09SRElOR19TVE9QX1RJTUVPVVRfTVMgPSAzICogMTAwMDtcbmNvbnN0IE1JTl9BUElfTEVWRUwgPSAyOTtcbmNvbnN0IFJFQ09SRElOR19TRVJWSUNFX05BTUUgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8ucmVjb3JkZXIuUmVjb3JkZXJTZXJ2aWNlYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJVklUWV9OQU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vaW8uYXBwaXVtLnNldHRpbmdzLlNldHRpbmdzYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJT05fU1RBUlQgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS5yZWNvcmRpbmcuQUNUSU9OX1NUQVJUYDtcbmNvbnN0IFJFQ09SRElOR19BQ1RJT05fU1RPUCA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9LnJlY29yZGluZy5BQ1RJT05fU1RPUGA7XG5jb25zdCBSRUNPUkRJTkdTX1JPT1QgPSBgL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS9maWxlc2A7XG5jb25zdCBERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCA9ICdZWVlZLU1NLUREVEhILW1tLXNzJztcblxuXG5hc3luYyBmdW5jdGlvbiB1cGxvYWRSZWNvcmRlZE1lZGlhIChsb2NhbEZpbGUsIHJlbW90ZVBhdGggPSBudWxsLCB1cGxvYWRPcHRpb25zID0ge30pIHtcbiAgaWYgKF8uaXNFbXB0eShyZW1vdGVQYXRoKSkge1xuICAgIHJldHVybiAoYXdhaXQgdXRpbC50b0luTWVtb3J5QmFzZTY0KGxvY2FsRmlsZSkpLnRvU3RyaW5nKCk7XG4gIH1cblxuICBjb25zdCB7dXNlciwgcGFzcywgbWV0aG9kLCBoZWFkZXJzLCBmaWxlRmllbGROYW1lLCBmb3JtRmllbGRzfSA9IHVwbG9hZE9wdGlvbnM7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgbWV0aG9kOiBtZXRob2QgfHwgJ1BVVCcsXG4gICAgaGVhZGVycyxcbiAgICBmaWxlRmllbGROYW1lLFxuICAgIGZvcm1GaWVsZHMsXG4gIH07XG4gIGlmICh1c2VyICYmIHBhc3MpIHtcbiAgICBvcHRpb25zLmF1dGggPSB7dXNlciwgcGFzc307XG4gIH1cbiAgYXdhaXQgbmV0LnVwbG9hZEZpbGUobG9jYWxGaWxlLCByZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RNZWRpYUV4dGVuc2lvbiAobmFtZSkge1xuICByZXR1cm4gXy50b0xvd2VyKG5hbWUpLmVuZHNXaXRoKERFRkFVTFRfRVhUKSA/IG5hbWUgOiBgJHtuYW1lfSR7REVGQVVMVF9FWFR9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nSXNTdXBwb3J0ZWQgKGFkYikge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpO1xuICBpZiAoYXBpTGV2ZWwgPCBNSU5fQVBJX0xFVkVMKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNZWRpYSBwcm9qZWN0aW9uLWJhc2VkIHJlY29yZGluZyBpcyBub3QgYXZhaWxhYmxlIG9uIEFQSSBMZXZlbCAke2FwaUxldmVsfS4gYCArXG4gICAgICBgTWluaW11bSByZXF1aXJlZCBBUEkgTGV2ZWwgaXMgJHtNSU5fQVBJX0xFVkVMfS5gKTtcbiAgfVxufVxuXG5cbmNsYXNzIE1lZGlhUHJvamVjdGlvblJlY29yZGVyIHtcbiAgY29uc3RydWN0b3IgKGFkYikge1xuICAgIHRoaXMuYWRiID0gYWRiO1xuICB9XG5cbiAgYXN5bmMgaXNSdW5uaW5nICgpIHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAnZHVtcHN5cycsICdhY3Rpdml0eScsICdzZXJ2aWNlcycsIFJFQ09SRElOR19TRVJWSUNFX05BTUVcbiAgICBdKTtcbiAgICByZXR1cm4gc3Rkb3V0LmluY2x1ZGVzKFJFQ09SRElOR19TRVJWSUNFX05BTUUpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKG9wdHMgPSB7fSkge1xuICAgIGlmIChhd2FpdCB0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwKCk7XG4gICAgY29uc3Qge1xuICAgICAgZmlsZW5hbWUsXG4gICAgICBtYXhEdXJhdGlvblNlYyxcbiAgICAgIHByaW9yaXR5LFxuICAgICAgcmVzb2x1dGlvbixcbiAgICB9ID0gb3B0cztcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgJ2FtJywgJ3N0YXJ0JyxcbiAgICAgICctbicsIFJFQ09SRElOR19BQ1RJVklUWV9OQU1FLFxuICAgICAgJy1hJywgUkVDT1JESU5HX0FDVElPTl9TVEFSVCxcbiAgICBdO1xuICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgYXJncy5wdXNoKCctLWVzJywgJ2ZpbGVuYW1lJywgZmlsZW5hbWUpO1xuICAgIH1cbiAgICBpZiAobWF4RHVyYXRpb25TZWMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1lcycsICdtYXhfZHVyYXRpb25fc2VjJywgYCR7bWF4RHVyYXRpb25TZWN9YCk7XG4gICAgfVxuICAgIGlmIChwcmlvcml0eSkge1xuICAgICAgYXJncy5wdXNoKCctLWVzJywgJ3ByaW9yaXR5JywgcHJpb3JpdHkpO1xuICAgIH1cbiAgICBpZiAocmVzb2x1dGlvbikge1xuICAgICAgYXJncy5wdXNoKCctLWVzJywgJ3Jlc29sdXRpb24nLCByZXNvbHV0aW9uKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoYXJncyk7XG4gICAgYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyBub3QgcnVubmluZyBhZnRlciAke1JFQ09SRElOR19TVEFSVFVQX1RJTUVPVVRfTVN9bXMuIGAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgbG9nY2F0IG91dHB1dCBmb3IgbW9yZSBkZXRhaWxzLmBcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCBSRUNPUkRJTkdfU1RBUlRVUF9USU1FT1VUX01TKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXAgKCkge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFtgcm0gLWYgJHtSRUNPUkRJTkdTX1JPT1R9LypgXSk7XG4gIH1cblxuICBhc3luYyBwdWxsUmVjZW50ICgpIHtcbiAgICBjb25zdCByZWNvcmRpbmdzID0gYXdhaXQgdGhpcy5hZGIubHMoUkVDT1JESU5HU19ST09ULCBbJy10ciddKTtcbiAgICBpZiAoXy5pc0VtcHR5KHJlY29yZGluZ3MpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKGF3YWl0IHRlbXBEaXIub3BlbkRpcigpLCByZWNvcmRpbmdzWzBdKTtcbiAgICBhd2FpdCB0aGlzLmFkYi5wdWxsKGAke1JFQ09SRElOR1NfUk9PVH0vJHtyZWNvcmRpbmdzWzBdfWAsIGRzdFBhdGgpO1xuICAgIHJldHVybiBkc3RQYXRoO1xuICB9XG5cbiAgYXN5bmMgc3RvcCAoKSB7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgJ2FtJywgJ3N0YXJ0JyxcbiAgICAgICctbicsIFJFQ09SRElOR19BQ1RJVklUWV9OQU1FLFxuICAgICAgJy1hJywgUkVDT1JESU5HX0FDVElPTl9TVE9QLFxuICAgIF0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgdGhpcy5pc1J1bm5pbmcoKSksIHtcbiAgICAgICAgd2FpdE1zOiBSRUNPUkRJTkdfU1RPUF9USU1FT1VUX01TLFxuICAgICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgYXR0ZW1wdCB0byBzdG9wIHRoZSBjdXJyZW50IG1lZGlhIHByb2plY3Rpb24gcmVjb3JkaW5nIHRpbWVkIG91dCBhZnRlciBgICtcbiAgICAgICAgYCR7UkVDT1JESU5HX1NUT1BfVElNRU9VVF9NU31tc2BcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFJlY29yZGluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHJlc29sdXRpb24gTWF4aW11bSBzdXBwb3J0ZWQgcmVzb2x1dGlvbiBvbi1kZXZpY2UgKERldGVjdGVkXG4gKiBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBhcHAgaXRzZWxmKSwgd2hpY2ggdXN1YWxseSBlcXVhbHMgdG8gRnVsbCBIRCAxOTIweDEwODAgb24gbW9zdFxuICogcGhvbmVzIGhvd2V2ZXIgeW91IGNhbiBjaGFuZ2UgaXQgdG8gZm9sbG93aW5nIHN1cHBvcnRlZCByZXNvbHV0aW9uc1xuICogYXMgd2VsbDogXCIxOTIweDEwODBcIiwgXCIxMjgweDcyMFwiLCBcIjcyMHg0ODBcIiwgXCIzMjB4MjQwXCIsIFwiMTc2eDE0NFwiLlxuICogQHByb3BlcnR5IHtudW1iZXI/fSBtYXhEdXJhdGlvblNlYyBbOTAwXSBEZWZhdWx0IHZhbHVlOiA5MDAgc2Vjb25kcyB3aGljaCBtZWFuc1xuICogbWF4aW11bSBhbGxvd2VkIGR1cmF0aW9uIGlzIDE1IG1pbnV0ZSwgeW91IGNhbiBpbmNyZWFzZSBpdCBpZiB5b3VyIHRlc3QgdGFrZXNcbiAqIGxvbmdlciB0aGFuIHRoYXQuXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHByaW9yaXR5IFtoaWdoXSBNZWFucyByZWNvcmRpbmcgdGhyZWFkIHByaW9yaXR5IGlzIG1heGltdW1cbiAqIGhvd2V2ZXIgaWYgeW91IGZhY2UgcGVyZm9ybWFuY2UgZHJvcHMgZHVyaW5nIHRlc3Rpbmcgd2l0aCByZWNvcmRpbmcgZW5hYmxlZCwgeW91XG4gKiBjYW4gcmVkdWNlIHJlY29yZGluZyBwcmlvcml0eSB0byBcIm5vcm1hbFwiIG9yIFwibG93XCIuXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGZpbGVuYW1lIFlvdSBjYW4gdHlwZSByZWNvcmRpbmcgdmlkZW8gZmlsZSBuYW1lIGFzIHlvdSB3YW50LFxuICogYnV0IHJlY29yZGluZyBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBcIm1wNFwiIGZvcm1hdCBzbyB5b3VyIGZpbGVuYW1lIG11c3QgZW5kIHdpdGggXCIubXA0XCIuXG4gKiBBbiBpbnZhbGlkIGZpbGUgbmFtZSB3aWxsIGZhaWwgdG8gc3RhcnQgdGhlIHJlY29yZGluZy5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjdXJyZW50IHRpbWVzdGFtcCB3aWxsIGJlIHVzZWQgYXMgZmlsZSBuYW1lLlxuICovXG5cbi8qKlxuICogUmVjb3JkIHRoZSBkaXNwbGF5IG9mIGEgcmVhbCBkZXZpY2VzIHJ1bm5pbmcgQW5kcm9pZCAxMCAoQVBJIGxldmVsIDI5KSBhbmQgaGlnaGVyLlxuICogVGhlIHNjcmVlbiBhY3Rpdml0eSBpcyByZWNvcmRlZCB0byBhIE1QRUctNCBmaWxlLiBBdWRpbyBpcyBhbHNvIHJlY29yZGVkIGJ5IGRlZmF1bHRcbiAqIChvbmx5IGZvciBhcHBzIHRoYXQgYWxsb3cgaXQgaW4gdGhlaXIgbWFuaWZlc3RzKS5cbiAqIElmIGFub3RoZXIgcmVjb3JkaW5nIGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZCB0aGVuIHRoZSBjb21tYW5kIHdpbGwgZXhpdCBzaWxlbnRseS5cbiAqIFRoZSBwcmV2aW91c2x5IHJlY29yZGVkIHZpZGVvIGZpbGUgaXMgZGVsZXRlZCB3aGVuIGEgbmV3IHJlY29yZGluZyBzZXNzaW9uIGlzIHN0YXJ0ZWQuXG4gKiBSZWNvcmRpbmcgY29udGludWVzIGl0IGlzIHN0b3BwZWQgZXhwbGljaXRseSBvciB1bnRpbCB0aGUgdGltZW91dCBoYXBwZW5zLlxuICpcbiAqIEBwYXJhbSB7P1N0YXJ0UmVjb3JkaW5nT3B0aW9uc30gb3B0aW9ucyBBdmFpbGFibGUgb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGEgbmV3IHJlY29yZGluZyBoYXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgcmVjb3JkaW5nIGhhcyBmYWlsZWQgdG8gc3RhcnQgb3IgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcgKG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCB2ZXJpZnlNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdJc1N1cHBvcnRlZCh0aGlzLmFkYik7XG5cbiAgY29uc3Qge3Jlc29sdXRpb24sIHByaW9yaXR5LCBtYXhEdXJhdGlvblNlYywgZmlsZW5hbWV9ID0gb3B0aW9ucztcbiAgY29uc3QgcmVjb3JkZXIgPSBuZXcgTWVkaWFQcm9qZWN0aW9uUmVjb3JkZXIodGhpcy5hZGIpO1xuICBjb25zdCBmbmFtZSA9IGFkanVzdE1lZGlhRXh0ZW5zaW9uKGZpbGVuYW1lIHx8IG1vbWVudCgpLmZvcm1hdChERUZBVUxUX0ZJTEVOQU1FX0ZPUk1BVCkpO1xuICBjb25zdCBkaWRTdGFydCA9IGF3YWl0IHJlY29yZGVyLnN0YXJ0KHtcbiAgICByZXNvbHV0aW9uLFxuICAgIHByaW9yaXR5LFxuICAgIG1heER1cmF0aW9uU2VjLFxuICAgIGZpbGVuYW1lOiBmbmFtZSxcbiAgfSk7XG4gIGlmIChkaWRTdGFydCkge1xuICAgIHRoaXMubG9nLmluZm8oYEEgbmV3IG1lZGlhIHByb2plY3Rpb24gcmVjb3JkaW5nICcke2ZuYW1lfScgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWRgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdBbm90aGVyIG1lZGlhIHByb2plY3Rpb24gcmVjb3JkaW5nIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RhcnQnKTtcbiAgfVxuICByZXR1cm4gZGlkU3RhcnQ7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1lZGlhIHByb2plY3Rpb24tYmFzZWQgcmVjb3JkaW5nIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGEgcmVjb3JkaW5nIGlzIGluIHByb2dyZXNzLlxuICogQHRocm93cyB7RXJyb3J9IElmIGEgcmVjb3JkaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5jb21tYW5kcy5tb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVJc01lZGlhUHJvamVjdGlvblJlY29yZGluZ1J1bm5pbmcgKCkge1xuICBhd2FpdCB2ZXJpZnlNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdJc1N1cHBvcnRlZCh0aGlzLmFkYik7XG5cbiAgY29uc3QgcmVjb3JkZXIgPSBuZXcgTWVkaWFQcm9qZWN0aW9uUmVjb3JkZXIodGhpcy5hZGIpO1xuICByZXR1cm4gYXdhaXQgcmVjb3JkZXIuaXNSdW5uaW5nKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0b3BSZWNvcmRpbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSByZW1vdGVQYXRoIFRoZSBwYXRoIHRvIHRoZSByZW1vdGUgbG9jYXRpb24sIHdoZXJlIHRoZSByZXN1bHRpbmcgdmlkZW8gc2hvdWxkIGJlIHVwbG9hZGVkLlxuICogVGhlIGZvbGxvd2luZyBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZDogaHR0cC9odHRwcywgZnRwLlxuICogTnVsbCBvciBlbXB0eSBzdHJpbmcgdmFsdWUgKHRoZSBkZWZhdWx0IHNldHRpbmcpIG1lYW5zIHRoZSBjb250ZW50IG9mIHJlc3VsdGluZ1xuICogZmlsZSBzaG91bGQgYmUgZW5jb2RlZCBhcyBCYXNlNjQgYW5kIHBhc3NlZCBhcyB0aGUgZW5kcG9vbnQgcmVzcG9uc2UgdmFsdWUuXG4gKiBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGdlbmVyYXRlZCBtZWRpYSBmaWxlIGlzIHRvbyBiaWcgdG9cbiAqIGZpdCBpbnRvIHRoZSBhdmFpbGFibGUgcHJvY2VzcyBtZW1vcnkuXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVzZXIgVGhlIG5hbWUgb2YgdGhlIHVzZXIgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHBhc3MgVGhlIHBhc3N3b3JkIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmc/fSBtZXRob2QgVGhlIGh0dHAgbXVsdGlwYXJ0IHVwbG9hZCBtZXRob2QgbmFtZS4gVGhlICdQVVQnIG9uZSBpcyB1c2VkIGJ5IGRlZmF1bHQuXG4gKiBAcHJvcGVydHkge09iamVjdD99IGhlYWRlcnMgQWRkaXRpb25hbCBoZWFkZXJzIG1hcHBpbmcgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gZmlsZUZpZWxkTmFtZSBbZmlsZV0gVGhlIG5hbWUgb2YgdGhlIGZvcm0gZmllbGQsIHdoZXJlIHRoZSBmaWxlIGNvbnRlbnQgQkxPQiBzaG91bGQgYmUgc3RvcmVkIGZvclxuICogaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkge09iamVjdHxBcnJheTxQYWlyPj99IGZvcm1GaWVsZHMgQWRkaXRpb25hbCBmb3JtIGZpZWxkcyBmb3IgbXVsdGlwYXJ0IGh0dHAocykgdXBsb2Fkc1xuICovXG5cbi8qKlxuICogU3RvcCBhIG1lZGlhIHByb2plY3Rpb24tYmFzZWQgcmVjb3JkaW5nLlxuICogSWYgbm8gcmVjb3JkaW5nIGhhcyBiZWVuIHN0YXJ0ZWQgYmVmb3JlIHRoZW4gYW4gZXJyb3IgaXMgdGhyb3duLlxuICogSWYgdGhlIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IGZpbmlzaGVkIGJlZm9yZSB0aGlzIEFQSSBoYXMgYmVlbiBjYWxsZWRcbiAqIHRoZW4gdGhlIG1vc3QgcmVjZW50IHJlY29yZGVkIGZpbGUgaXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHs/U3RvcFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgQXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSByZWNvcmRlZCBtZWRpYSBmaWxlIGlmICdyZW1vdGVQYXRoJ1xuICogcGFyYW1ldGVyIGlzIGZhbHN5IG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgc3RvcHBpbmcgYSByZWNvcmRpbmcsXG4gKiBmZXRjaGluZyB0aGUgY29udGVudCBvZiB0aGUgcmVtb3RlIG1lZGlhIGZpbGUsXG4gKiBvciBpZiBhIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcgKG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCB2ZXJpZnlNZWRpYVByb2plY3Rpb25SZWNvcmRpbmdJc1N1cHBvcnRlZCh0aGlzLmFkYik7XG5cbiAgY29uc3QgcmVjb3JkZXIgPSBuZXcgTWVkaWFQcm9qZWN0aW9uUmVjb3JkZXIodGhpcy5hZGIpO1xuICBpZiAoYXdhaXQgcmVjb3JkZXIuc3RvcCgpKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnU3VjY2Vzc2Z1bGx5IHN0b3BwZWQgYSBtZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZy4gUHVsbGluZyB0aGUgcmVjb3JkZWQgbWVkaWEnKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdNZWRpYSBwcm9qZWN0aW9uIHJlY29yZGluZyBpcyBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBzdG9wJyk7XG4gIH1cbiAgY29uc3QgcmVjZW50UmVjb3JkaW5nUGF0aCA9IGF3YWl0IHJlY29yZGVyLnB1bGxSZWNlbnQoKTtcbiAgaWYgKCFyZWNlbnRSZWNvcmRpbmdQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWNlbnQgbWVkaWEgcHJvamVjdGlvbiByZWNvcmRpbmcgaGF2ZSBiZWVuIGZvdW5kLiBEaWQgeW91IHN0YXJ0IGFueT9gKTtcbiAgfVxuXG4gIGNvbnN0IHtyZW1vdGVQYXRofSA9IG9wdGlvbnM7XG4gIGlmIChfLmlzRW1wdHkocmVtb3RlUGF0aCkpIHtcbiAgICBjb25zdCB7c2l6ZX0gPSBhd2FpdCBmcy5zdGF0KHJlY2VudFJlY29yZGluZ1BhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBUaGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIG1lZGlhIHByb2plY3Rpb24gcmVjb3JkaW5nIGlzICR7dXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZyhzaXplKX1gKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1cGxvYWRSZWNvcmRlZE1lZGlhKHJlY2VudFJlY29yZGluZ1BhdGgsIHJlbW90ZVBhdGgsIG9wdGlvbnMpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZihwYXRoLmRpcm5hbWUocmVjZW50UmVjb3JkaW5nUGF0aCkpO1xuICB9XG59O1xuXG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxRQUFRLEdBQUcsRUFBakI7O0FBR0EsTUFBTUMsV0FBVyxHQUFHLE1BQXBCO0FBQ0EsTUFBTUMsNEJBQTRCLEdBQUcsSUFBSSxJQUF6QztBQUNBLE1BQU1DLHlCQUF5QixHQUFHLElBQUksSUFBdEM7QUFDQSxNQUFNQyxhQUFhLEdBQUcsRUFBdEI7QUFDQSxNQUFNQyxzQkFBc0IsR0FBSSxHQUFFQyxzQ0FBdUIsNEJBQXpEO0FBQ0EsTUFBTUMsdUJBQXVCLEdBQUksR0FBRUQsc0NBQXVCLDhCQUExRDtBQUNBLE1BQU1FLHNCQUFzQixHQUFJLEdBQUVGLHNDQUF1Qix5QkFBekQ7QUFDQSxNQUFNRyxxQkFBcUIsR0FBSSxHQUFFSCxzQ0FBdUIsd0JBQXhEO0FBQ0EsTUFBTUksZUFBZSxHQUFJLG9DQUFtQ0osc0NBQXVCLFFBQW5GO0FBQ0EsTUFBTUssdUJBQXVCLEdBQUcscUJBQWhDOztBQUdBLGVBQWVDLG1CQUFmLENBQW9DQyxTQUFwQyxFQUErQ0MsVUFBVSxHQUFHLElBQTVELEVBQWtFQyxhQUFhLEdBQUcsRUFBbEYsRUFBc0Y7RUFDcEYsSUFBSUMsZUFBQSxDQUFFQyxPQUFGLENBQVVILFVBQVYsQ0FBSixFQUEyQjtJQUN6QixPQUFPLENBQUMsTUFBTUksYUFBQSxDQUFLQyxnQkFBTCxDQUFzQk4sU0FBdEIsQ0FBUCxFQUF5Q08sUUFBekMsRUFBUDtFQUNEOztFQUVELE1BQU07SUFBQ0MsSUFBRDtJQUFPQyxJQUFQO0lBQWFDLE1BQWI7SUFBcUJDLE9BQXJCO0lBQThC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
@@ -571,7 +571,7 @@ helpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = fals
571
571
  'will raise an error if you try to use them.');
572
572
  }
573
573
 
574
- // Reinstall will stop the settings helper process anyway, so
574
+ // Reinstall would stop the settings helper process anyway, so
575
575
  // there is no need to continue if the application is still running
576
576
  if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {
577
577
  logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +
@@ -579,7 +579,16 @@ helpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = fals
579
579
  return;
580
580
  }
581
581
 
582
- if (await adb.getApiLevel() <= 23) { // Android 6- devices should have granted permissions
582
+ const apiLevel = await adb.getApiLevel();
583
+ if (apiLevel >= 29) {
584
+ // https://github.com/appium/io.appium.settings#internal-audio--video-recording
585
+ try {
586
+ await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);
587
+ } catch (err) {
588
+ logger.debug(err);
589
+ }
590
+ }
591
+ if (apiLevel <= 23) { // Android 6- devices should have granted permissions
583
592
  // https://github.com/appium/appium/pull/11640#issuecomment-438260477
584
593
  const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];
585
594
  logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);
@@ -5,6 +5,7 @@ import { APP_STATE } from '../android-helpers';
5
5
  import { errors } from 'appium/driver';
6
6
 
7
7
  const APP_EXTENSIONS = ['.apk', '.apks'];
8
+ const RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';
8
9
 
9
10
  let commands = {};
10
11
 
@@ -77,6 +78,16 @@ commands.activateApp = async function activateApp (appId) {
77
78
  return;
78
79
  }
79
80
 
81
+ let activityName = await this.adb.resolveLaunchableActivity(appId);
82
+ if (activityName === RESOLVER_ACTIVITY_NAME) {
83
+ // https://github.com/appium/appium/issues/17128
84
+ this.log.debug(
85
+ `The launchable activity name of '${appId}' was resolved to '${activityName}'. ` +
86
+ `Switching the resolver to not use cmd`
87
+ );
88
+ activityName = await this.adb.resolveLaunchableActivity(appId, {preferCmd: false});
89
+ }
90
+
80
91
  const stdout = await this.adb.shell([
81
92
  'am', (apiLevel < 26) ? 'start' : 'start-activity',
82
93
  '-a', 'android.intent.action.MAIN',
@@ -85,7 +96,7 @@ commands.activateApp = async function activateApp (appId) {
85
96
  // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK
86
97
  // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
87
98
  '-f', '0x10200000',
88
- '-n', await this.adb.resolveLaunchableActivity(appId),
99
+ '-n', activityName,
89
100
  ]);
90
101
  this.log.debug(stdout);
91
102
  if (/^error:/mi.test(stdout)) {
@@ -60,6 +60,10 @@ extensions.executeMobile = async function executeMobile (mobileCommand, opts = {
60
60
  unlock: 'mobileUnlock',
61
61
 
62
62
  refreshGpsCache: 'mobileRefreshGpsCache',
63
+
64
+ startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',
65
+ isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',
66
+ stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',
63
67
  };
64
68
 
65
69
  if (!_.has(mobileCommandsMapping, mobileCommand)) {
@@ -19,6 +19,7 @@ import appManagementCmds from './app-management';
19
19
  import intentCmds from './intent';
20
20
  import systemBarsCmds from './system-bars';
21
21
  import logCmds from './log';
22
+ import mediaProjectionCmds from './media-projection';
22
23
 
23
24
 
24
25
  let commands = {};
@@ -45,6 +46,7 @@ Object.assign(
45
46
  appManagementCmds,
46
47
  fileActionsCmds,
47
48
  logCmds,
49
+ mediaProjectionCmds,
48
50
  // add other command types here
49
51
  );
50
52
 
@@ -0,0 +1,277 @@
1
+ import _ from 'lodash';
2
+ import { waitForCondition } from 'asyncbox';
3
+ import { util, fs, net, tempDir } from 'appium/support';
4
+ import path from 'path';
5
+ import B from 'bluebird';
6
+ import { SETTINGS_HELPER_PKG_ID } from '../android-helpers';
7
+ import moment from 'moment';
8
+
9
+
10
+ const commands = {};
11
+
12
+ // https://github.com/appium/io.appium.settings#internal-audio--video-recording
13
+ const DEFAULT_EXT = '.mp4';
14
+ const RECORDING_STARTUP_TIMEOUT_MS = 3 * 1000;
15
+ const RECORDING_STOP_TIMEOUT_MS = 3 * 1000;
16
+ const MIN_API_LEVEL = 29;
17
+ const RECORDING_SERVICE_NAME = `${SETTINGS_HELPER_PKG_ID}/.recorder.RecorderService`;
18
+ const RECORDING_ACTIVITY_NAME = `${SETTINGS_HELPER_PKG_ID}/io.appium.settings.Settings`;
19
+ const RECORDING_ACTION_START = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_START`;
20
+ const RECORDING_ACTION_STOP = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_STOP`;
21
+ const RECORDINGS_ROOT = `/storage/emulated/0/Android/data/${SETTINGS_HELPER_PKG_ID}/files`;
22
+ const DEFAULT_FILENAME_FORMAT = 'YYYY-MM-DDTHH-mm-ss';
23
+
24
+
25
+ async function uploadRecordedMedia (localFile, remotePath = null, uploadOptions = {}) {
26
+ if (_.isEmpty(remotePath)) {
27
+ return (await util.toInMemoryBase64(localFile)).toString();
28
+ }
29
+
30
+ const {user, pass, method, headers, fileFieldName, formFields} = uploadOptions;
31
+ const options = {
32
+ method: method || 'PUT',
33
+ headers,
34
+ fileFieldName,
35
+ formFields,
36
+ };
37
+ if (user && pass) {
38
+ options.auth = {user, pass};
39
+ }
40
+ await net.uploadFile(localFile, remotePath, options);
41
+ return '';
42
+ }
43
+
44
+ function adjustMediaExtension (name) {
45
+ return _.toLower(name).endsWith(DEFAULT_EXT) ? name : `${name}${DEFAULT_EXT}`;
46
+ }
47
+
48
+ async function verifyMediaProjectionRecordingIsSupported (adb) {
49
+ const apiLevel = await adb.getApiLevel();
50
+ if (apiLevel < MIN_API_LEVEL) {
51
+ throw new Error(`Media projection-based recording is not available on API Level ${apiLevel}. ` +
52
+ `Minimum required API Level is ${MIN_API_LEVEL}.`);
53
+ }
54
+ }
55
+
56
+
57
+ class MediaProjectionRecorder {
58
+ constructor (adb) {
59
+ this.adb = adb;
60
+ }
61
+
62
+ async isRunning () {
63
+ const stdout = await this.adb.shell([
64
+ 'dumpsys', 'activity', 'services', RECORDING_SERVICE_NAME
65
+ ]);
66
+ return stdout.includes(RECORDING_SERVICE_NAME);
67
+ }
68
+
69
+ async start (opts = {}) {
70
+ if (await this.isRunning()) {
71
+ return false;
72
+ }
73
+
74
+ await this.cleanup();
75
+ const {
76
+ filename,
77
+ maxDurationSec,
78
+ priority,
79
+ resolution,
80
+ } = opts;
81
+ const args = [
82
+ 'am', 'start',
83
+ '-n', RECORDING_ACTIVITY_NAME,
84
+ '-a', RECORDING_ACTION_START,
85
+ ];
86
+ if (filename) {
87
+ args.push('--es', 'filename', filename);
88
+ }
89
+ if (maxDurationSec) {
90
+ args.push('--es', 'max_duration_sec', `${maxDurationSec}`);
91
+ }
92
+ if (priority) {
93
+ args.push('--es', 'priority', priority);
94
+ }
95
+ if (resolution) {
96
+ args.push('--es', 'resolution', resolution);
97
+ }
98
+ await this.adb.shell(args);
99
+ await new B((resolve, reject) => {
100
+ setTimeout(async () => {
101
+ if (!await this.isRunning()) {
102
+ return reject(new Error(
103
+ `The media projection recording is not running after ${RECORDING_STARTUP_TIMEOUT_MS}ms. ` +
104
+ `Please check the logcat output for more details.`
105
+ ));
106
+ }
107
+ resolve();
108
+ }, RECORDING_STARTUP_TIMEOUT_MS);
109
+ });
110
+ return true;
111
+ }
112
+
113
+ async cleanup () {
114
+ await this.adb.shell([`rm -f ${RECORDINGS_ROOT}/*`]);
115
+ }
116
+
117
+ async pullRecent () {
118
+ const recordings = await this.adb.ls(RECORDINGS_ROOT, ['-tr']);
119
+ if (_.isEmpty(recordings)) {
120
+ return null;
121
+ }
122
+
123
+ const dstPath = path.join(await tempDir.openDir(), recordings[0]);
124
+ await this.adb.pull(`${RECORDINGS_ROOT}/${recordings[0]}`, dstPath);
125
+ return dstPath;
126
+ }
127
+
128
+ async stop () {
129
+ if (!await this.isRunning()) {
130
+ return false;
131
+ }
132
+
133
+ await this.adb.shell([
134
+ 'am', 'start',
135
+ '-n', RECORDING_ACTIVITY_NAME,
136
+ '-a', RECORDING_ACTION_STOP,
137
+ ]);
138
+ try {
139
+ await waitForCondition(async () => !(await this.isRunning()), {
140
+ waitMs: RECORDING_STOP_TIMEOUT_MS,
141
+ intervalMs: 500,
142
+ });
143
+ } catch (e) {
144
+ throw new Error(
145
+ `The attempt to stop the current media projection recording timed out after ` +
146
+ `${RECORDING_STOP_TIMEOUT_MS}ms`
147
+ );
148
+ }
149
+ return true;
150
+ }
151
+ }
152
+
153
+
154
+ /**
155
+ * @typedef {Object} StartRecordingOptions
156
+ *
157
+ * @property {string?} resolution Maximum supported resolution on-device (Detected
158
+ * automatically by the app itself), which usually equals to Full HD 1920x1080 on most
159
+ * phones however you can change it to following supported resolutions
160
+ * as well: "1920x1080", "1280x720", "720x480", "320x240", "176x144".
161
+ * @property {number?} maxDurationSec [900] Default value: 900 seconds which means
162
+ * maximum allowed duration is 15 minute, you can increase it if your test takes
163
+ * longer than that.
164
+ * @property {string?} priority [high] Means recording thread priority is maximum
165
+ * however if you face performance drops during testing with recording enabled, you
166
+ * can reduce recording priority to "normal" or "low".
167
+ * @property {string?} filename You can type recording video file name as you want,
168
+ * but recording currently supports only "mp4" format so your filename must end with ".mp4".
169
+ * An invalid file name will fail to start the recording.
170
+ * If not provided then the current timestamp will be used as file name.
171
+ */
172
+
173
+ /**
174
+ * Record the display of a real devices running Android 10 (API level 29) and higher.
175
+ * The screen activity is recorded to a MPEG-4 file. Audio is also recorded by default
176
+ * (only for apps that allow it in their manifests).
177
+ * If another recording has been already started then the command will exit silently.
178
+ * The previously recorded video file is deleted when a new recording session is started.
179
+ * Recording continues it is stopped explicitly or until the timeout happens.
180
+ *
181
+ * @param {?StartRecordingOptions} options Available options.
182
+ * @returns {boolean} True if a new recording has successfully started.
183
+ * @throws {Error} If recording has failed to start or is not supported on the device under test.
184
+ */
185
+ commands.mobileStartMediaProjectionRecording = async function mobileStartMediaProjectionRecording (options = {}) {
186
+ await verifyMediaProjectionRecordingIsSupported(this.adb);
187
+
188
+ const {resolution, priority, maxDurationSec, filename} = options;
189
+ const recorder = new MediaProjectionRecorder(this.adb);
190
+ const fname = adjustMediaExtension(filename || moment().format(DEFAULT_FILENAME_FORMAT));
191
+ const didStart = await recorder.start({
192
+ resolution,
193
+ priority,
194
+ maxDurationSec,
195
+ filename: fname,
196
+ });
197
+ if (didStart) {
198
+ this.log.info(`A new media projection recording '${fname}' has been successfully started`);
199
+ } else {
200
+ this.log.info('Another media projection recording is already in progress. There is nothing to start');
201
+ }
202
+ return didStart;
203
+ };
204
+
205
+ /**
206
+ * Checks if a media projection-based recording is currently running.
207
+ *
208
+ * @returns {boolean} True if a recording is in progress.
209
+ * @throws {Error} If a recording is not supported on the device under test.
210
+ */
211
+ commands.mobileIsMediaProjectionRecordingRunning = async function mobileIsMediaProjectionRecordingRunning () {
212
+ await verifyMediaProjectionRecordingIsSupported(this.adb);
213
+
214
+ const recorder = new MediaProjectionRecorder(this.adb);
215
+ return await recorder.isRunning();
216
+ };
217
+
218
+ /**
219
+ * @typedef {Object} StopRecordingOptions
220
+ *
221
+ * @property {string?} remotePath The path to the remote location, where the resulting video should be uploaded.
222
+ * The following protocols are supported: http/https, ftp.
223
+ * Null or empty string value (the default setting) means the content of resulting
224
+ * file should be encoded as Base64 and passed as the endpoont response value.
225
+ * An exception will be thrown if the generated media file is too big to
226
+ * fit into the available process memory.
227
+ * @property {string?} user The name of the user for the remote authentication.
228
+ * @property {string?} pass The password for the remote authentication.
229
+ * @property {string?} method The http multipart upload method name. The 'PUT' one is used by default.
230
+ * @property {Object?} headers Additional headers mapping for multipart http(s) uploads
231
+ * @property {string?} fileFieldName [file] The name of the form field, where the file content BLOB should be stored for
232
+ * http(s) uploads
233
+ * @property {Object|Array<Pair>?} formFields Additional form fields for multipart http(s) uploads
234
+ */
235
+
236
+ /**
237
+ * Stop a media projection-based recording.
238
+ * If no recording has been started before then an error is thrown.
239
+ * If the recording has been already finished before this API has been called
240
+ * then the most recent recorded file is returned.
241
+ *
242
+ * @param {?StopRecordingOptions} options Available options.
243
+ * @returns {string} Base64-encoded content of the recorded media file if 'remotePath'
244
+ * parameter is falsy or an empty string.
245
+ * @throws {Error} If there was an error while stopping a recording,
246
+ * fetching the content of the remote media file,
247
+ * or if a recording is not supported on the device under test.
248
+ */
249
+ commands.mobileStopMediaProjectionRecording = async function mobileStopMediaProjectionRecording (options = {}) {
250
+ await verifyMediaProjectionRecordingIsSupported(this.adb);
251
+
252
+ const recorder = new MediaProjectionRecorder(this.adb);
253
+ if (await recorder.stop()) {
254
+ this.log.info('Successfully stopped a media projection recording. Pulling the recorded media');
255
+ } else {
256
+ this.log.info('Media projection recording is not running. There is nothing to stop');
257
+ }
258
+ const recentRecordingPath = await recorder.pullRecent();
259
+ if (!recentRecordingPath) {
260
+ throw new Error(`No recent media projection recording have been found. Did you start any?`);
261
+ }
262
+
263
+ const {remotePath} = options;
264
+ if (_.isEmpty(remotePath)) {
265
+ const {size} = await fs.stat(recentRecordingPath);
266
+ this.log.debug(`The size of the resulting media projection recording is ${util.toReadableSizeString(size)}`);
267
+ }
268
+ try {
269
+ return await uploadRecordedMedia(recentRecordingPath, remotePath, options);
270
+ } finally {
271
+ await fs.rimraf(path.dirname(recentRecordingPath));
272
+ }
273
+ };
274
+
275
+
276
+ export { commands };
277
+ export default commands;
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "5.1.0",
12
+ "version": "5.2.2",
13
13
  "author": "appium",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {
@@ -36,12 +36,12 @@
36
36
  ],
37
37
  "dependencies": {
38
38
  "@babel/runtime": "^7.0.0",
39
- "appium-adb": "^9.6.0",
39
+ "appium-adb": "^9.9.0",
40
40
  "appium-chromedriver": "^5.0.1",
41
41
  "asyncbox": "^2.8.0",
42
42
  "axios": "^0.x",
43
43
  "bluebird": "^3.4.7",
44
- "io.appium.settings": "^4.0.0",
44
+ "io.appium.settings": "^4.1.0",
45
45
  "jimp": "^0.x",
46
46
  "lodash": "^4.17.4",
47
47
  "lru-cache": "^7.3.0",
@@ -85,7 +85,6 @@
85
85
  "@babel/eslint-parser": "^7.16.3",
86
86
  "@semantic-release/git": "^10.0.1",
87
87
  "@xmldom/xmldom": "^0.x",
88
- "appium": "^2.0.0-beta.40",
89
88
  "android-apidemos": "^4.0.0",
90
89
  "chai": "^4.1.2",
91
90
  "chai-as-promised": "^7.1.1",