appium-android-driver 5.7.1 → 5.7.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/lib/android-helpers.js +2 -2
  3. package/build/lib/android-helpers.js.map +1 -1
  4. package/build/lib/bootstrap.js +2 -2
  5. package/build/lib/bootstrap.js.map +1 -1
  6. package/build/lib/commands/actions.js +2 -2
  7. package/build/lib/commands/actions.js.map +1 -1
  8. package/build/lib/commands/app-management.js +2 -2
  9. package/build/lib/commands/app-management.js.map +1 -1
  10. package/build/lib/commands/context.js +2 -2
  11. package/build/lib/commands/context.js.map +1 -1
  12. package/build/lib/commands/element.js +2 -2
  13. package/build/lib/commands/element.js.map +1 -1
  14. package/build/lib/commands/file-actions.js +2 -2
  15. package/build/lib/commands/file-actions.js.map +1 -1
  16. package/build/lib/commands/general.js +2 -2
  17. package/build/lib/commands/general.js.map +1 -1
  18. package/build/lib/commands/media-projection.js +2 -2
  19. package/build/lib/commands/media-projection.js.map +1 -1
  20. package/build/lib/commands/recordscreen.js +2 -2
  21. package/build/lib/commands/recordscreen.js.map +1 -1
  22. package/build/lib/commands/shell.js +2 -2
  23. package/build/lib/commands/shell.js.map +1 -1
  24. package/build/lib/commands/streamscreen.js +2 -2
  25. package/build/lib/commands/streamscreen.js.map +1 -1
  26. package/build/lib/commands/touch.js +2 -2
  27. package/build/lib/commands/touch.js.map +1 -1
  28. package/build/lib/desired-caps.js +2 -1
  29. package/build/lib/desired-caps.js.map +1 -1
  30. package/build/lib/driver.js +2 -2
  31. package/build/lib/driver.js.map +1 -1
  32. package/build/lib/logger.js +2 -2
  33. package/build/lib/logger.js.map +1 -1
  34. package/build/lib/uiautomator.js +2 -2
  35. package/build/lib/uiautomator.js.map +1 -1
  36. package/build/lib/unlock-helpers.js +2 -2
  37. package/build/lib/unlock-helpers.js.map +1 -1
  38. package/build/lib/webview-helpers.js +2 -2
  39. package/build/lib/webview-helpers.js.map +1 -1
  40. package/lib/android-helpers.js +1 -1
  41. package/lib/bootstrap.js +1 -1
  42. package/lib/commands/actions.js +1 -1
  43. package/lib/commands/app-management.js +1 -1
  44. package/lib/commands/context.js +1 -1
  45. package/lib/commands/element.js +1 -1
  46. package/lib/commands/file-actions.js +1 -1
  47. package/lib/commands/general.js +1 -1
  48. package/lib/commands/media-projection.js +1 -1
  49. package/lib/commands/recordscreen.js +1 -1
  50. package/lib/commands/shell.js +1 -1
  51. package/lib/commands/streamscreen.js +1 -1
  52. package/lib/commands/touch.js +1 -1
  53. package/lib/driver.js +1 -1
  54. package/lib/logger.js +1 -1
  55. package/lib/uiautomator.js +1 -1
  56. package/lib/unlock-helpers.js +1 -1
  57. package/lib/webview-helpers.js +1 -1
  58. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1 +1,3 @@
1
+ ## [5.7.2](https://github.com/appium/appium-android-driver/compare/v5.7.1...v5.7.2) (2022-11-22)
2
+
1
3
  ## [5.7.1](https://github.com/appium/appium-android-driver/compare/v5.7.0...v5.7.1) (2022-11-06)
@@ -13,7 +13,7 @@ var _lodash = _interopRequireDefault(require("lodash"));
13
13
  var _path = _interopRequireDefault(require("path"));
14
14
  var _asyncbox = require("asyncbox");
15
15
  var _logger = _interopRequireDefault(require("./logger"));
16
- var _support = require("appium/support");
16
+ var _support = require("@appium/support");
17
17
  var _ioAppium = require("io.appium.settings");
18
18
  var _bootstrap = _interopRequireDefault(require("./bootstrap"));
19
19
  var _bluebird = _interopRequireDefault(require("bluebird"));
@@ -808,4 +808,4 @@ helpers.bootstrap = _bootstrap.default;
808
808
  helpers.unlocker = _unlockHelpers.default;
809
809
  var _default = helpers;
810
810
  exports.default = _default;
811
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0NLX0FQUF9JRFNfU1RPUkUiLCJQQUNLQUdFX0lOU1RBTExfVElNRU9VVCIsIkNIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkiLCJjaHJvbWUiLCJwa2ciLCJhY3Rpdml0eSIsImNocm9taXVtIiwiY2hyb21lYmV0YSIsImJyb3dzZXIiLCJkZWZhdWx0IiwiU0VUVElOR1NfSEVMUEVSX1BLR19JRCIsIlNFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFkiLCJFTVVMQVRPUl9QQVRURVJOIiwiQVBQX1NUQVRFIiwiT2JqZWN0IiwiZnJlZXplIiwiTk9UX0lOU1RBTExFRCIsIk5PVF9SVU5OSU5HIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiZW5zdXJlTmV0d29ya1NwZWVkIiwiYWRiIiwibmV0d29ya1NwZWVkIiwiXyIsInZhbHVlcyIsIk5FVFdPUktfU1BFRUQiLCJpbmNsdWRlcyIsImxvZ2dlciIsIndhcm4iLCJGVUxMIiwicHJlcGFyZUF2ZEFyZ3MiLCJvcHRzIiwiaXNIZWFkbGVzcyIsImF2ZEFyZ3MiLCJyZXN1bHQiLCJpc0FycmF5IiwicHVzaCIsInV0aWwiLCJzaGVsbFBhcnNlIiwidG9DcmVkZW50aWFsVHlwZSIsInVubG9ja1R5cGUiLCJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkVycm9yIiwiaGVscGVycyIsImNyZWF0ZUJhc2VBREIiLCJhZGJQb3J0Iiwic3VwcHJlc3NLaWxsU2VydmVyIiwicmVtb3RlQWRiSG9zdCIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJhZGJFeGVjVGltZW91dCIsInVzZUtleXN0b3JlIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJyZW1vdGVBcHBzQ2FjaGVMaW1pdCIsImJ1aWxkVG9vbHNWZXJzaW9uIiwiYWxsb3dPZmZsaW5lRGV2aWNlcyIsImFsbG93RGVsYXlBZGIiLCJBREIiLCJjcmVhdGVBREIiLCJwcmVwYXJlRW11bGF0b3IiLCJhdmQiLCJhdmRFbnYiLCJlbnYiLCJsYW5ndWFnZSIsImxvY2FsZSIsImNvdW50cnkiLCJhdmRMYXVuY2hUaW1lb3V0IiwibGF1bmNoVGltZW91dCIsImF2ZFJlYWR5VGltZW91dCIsInJlYWR5VGltZW91dCIsImF2ZE5hbWUiLCJyZXBsYWNlIiwiaXNFbXVsYXRvclJ1bm5pbmciLCJnZXRSdW5uaW5nQVZEV2l0aFJldHJ5IiwiZSIsImRlYnVnIiwibWVzc2FnZSIsImFyZ3MiLCJraWxsRW11bGF0b3IiLCJsYXVuY2hBVkQiLCJlbnN1cmVEZXZpY2VMb2NhbGUiLCJzY3JpcHQiLCJpc1N0cmluZyIsInNldERldmljZUxhbmd1YWdlQ291bnRyeSIsImVuc3VyZUN1cnJlbnRMb2NhbGUiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJ1ZGlkIiwiZW1Qb3J0IiwiY3VyRGV2aWNlSWQiLCJlbXVsYXRvclBvcnQiLCJpbmZvIiwiZGV2aWNlcyIsImdldERldmljZXNXaXRoUmV0cnkiLCJtYXAiLCJlcnJvckFuZFRocm93IiwiZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyIsInBsYXRmb3JtVmVyc2lvbiIsInRyaW0iLCJzZW12ZXIiLCJjb2VyY2UiLCJhdmFpbERldmljZXMiLCJwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUiLCJkZXZpY2UiLCJzZXREZXZpY2VJZCIsInJhd0RldmljZU9TIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlT1MiLCJib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQiLCJ2YWxpZCIsImJvdGhWZXJzaW9uc0FyZVN0cmluZ3MiLCJ2ZXJzaW9uIiwidG9Mb3dlciIsIm1ham9yIiwibWlub3IiLCJndCIsImtleXMiLCJqb2luIiwic2V0RW11bGF0b3JQb3J0IiwidmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyIsImtleSIsIm5hbWUiLCJtYXRjaCIsImV4ZWMiLCJpbmRleCIsInN1YnN0cmluZyIsImdldExhdW5jaEluZm8iLCJhcHAiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXRBY3Rpdml0eSIsImFwa1BhY2thZ2UiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInJlc2V0QXBwIiwiZmFzdFJlc2V0IiwiZnVsbFJlc2V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiYXV0b0dyYW50UGVybWlzc2lvbnMiLCJhbGxvd1Rlc3RQYWNrYWdlcyIsImlzSW5zdGFsbGVkIiwiaXNBcHBJbnN0YWxsZWQiLCJmb3JjZVN0b3AiLCJpZ24iLCJvdXRwdXQiLCJjbGVhciIsInRvTG93ZXJDYXNlIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImVycm9yIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbCIsImdyYW50UGVybWlzc2lvbnMiLCJ0aW1lb3V0IiwiaW5zdGFsbEFwayIsImVuZm9yY2VBcHBJbnN0YWxsIiwiYXBwU3RhdGUiLCJ3YXNVbmluc3RhbGxlZCIsImluc3RhbGxPclVwZ3JhZGUiLCJlbmZvcmNlQ3VycmVudEJ1aWxkIiwiaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAiLCJBUFBfSU5TVEFMTF9TVEFURSIsImluc3RhbGxPdGhlckFwa3MiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwib3RoZXJBcHAiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYXBwUGFja2FnZXMiLCJmaWx0ZXJQYWNrYWdlcyIsImdldFRoaXJkUGFydHlQYWNrYWdlcyIsInBhY2thZ2VzU3RyaW5nIiwic2hlbGwiLCJhcHBQYWNrYWdlc0FycmF5Iiwic3BsaXQiLCJFT0wiLCJkaWZmZXJlbmNlIiwiZXJyIiwiaW5pdFVuaWNvZGVLZXlib2FyZCIsImRlZmF1bHRJTUUiLCJhcHBpdW1JTUUiLCJlbmFibGVJTUUiLCJzZXRJTUUiLCJzZXRNb2NrTG9jYXRpb25BcHAiLCJnZXRBcGlMZXZlbCIsInBrZ0lkcyIsImZpbGVFeGlzdHMiLCJKU09OIiwicGFyc2UiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJzcmNQYXRoIiwicGF0aCIsInBvc2l4IiwiYmFzZW5hbWUiLCJmcyIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsInB1c2hGaWxlIiwicmltcmFmIiwicmVzZXRNb2NrTG9jYXRpb24iLCJ0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZSIsInRoaXJkUGFydHlQa2dJZHMiLCJyZXN1bHRQa2dzIiwiaW50ZXJzZWN0aW9uIiwic2l6ZSIsInBrZ0lkIiwiaW5zdGFsbEhlbHBlckFwcCIsImFwa1BhdGgiLCJwYWNrYWdlSWQiLCJyZXRyeSIsInJldHJ5SW5zdGFsbEhlbHBlckFwcCIsInB1c2hTZXR0aW5nc0FwcCIsInRocm93RXJyb3IiLCJzZXR0aW5nc0Fwa1BhdGgiLCJwcm9jZXNzRXhpc3RzIiwiYXBpTGV2ZWwiLCJwZXJtcyIsIngiLCJyZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwIiwiaXNFbXVsYXRvciIsInB1c2hTdHJpbmdzIiwicmVtb3RlRGlyIiwic3RyaW5nc0pzb24iLCJyZW1vdGVGaWxlIiwicmVzb2x2ZSIsInB1bGxBcGsiLCJ0bXBEaXIiLCJpc0VtcHR5IiwiZXhpc3RzIiwic3RyaW5nc1RtcERpciIsImFwa1N0cmluZ3MiLCJsb2NhbFBhdGgiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJ1bmxvY2tXaXRoSGVscGVyQXBwIiwiZmlyc3RSdW4iLCJsYXVuY2hIZWxwZXIiLCJpc1NjcmVlbkxvY2tlZCIsImRlbGF5IiwidW5sb2NrIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwidW5sb2NrS2V5IiwidW5sb2NrU3RyYXRlZ3kiLCJ1bmxvY2tTdWNjZXNzVGltZW91dCIsInVubG9ja2VyIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJpc05pbCIsImlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQiLCJmYXN0VW5sb2NrIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwidW5sb2NrTWV0aG9kIiwicGluVW5sb2NrIiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGFzc3dvcmRVbmxvY2siLCJwYXR0ZXJuVW5sb2NrIiwiZmluZ2VycHJpbnRVbmxvY2siLCJ2ZXJpZnlVbmxvY2siLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluaXREZXZpY2UiLCJza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24iLCJsb2NhbGVTY3JpcHQiLCJ1bmljb2RlS2V5Ym9hcmQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic2tpcFVubG9jayIsIm1vY2tMb2NhdGlvbkFwcCIsInNraXBMb2djYXRDYXB0dXJlIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJ3YWl0Rm9yRGV2aWNlIiwic2hvdWxkVGhyb3dFcnJvciIsImlzVW5kZWZpbmVkIiwic3RhcnRMb2djYXQiLCJmb3JtYXQiLCJmaWx0ZXJTcGVjcyIsInJlbW92ZU51bGxQcm9wZXJ0aWVzIiwib2JqIiwiaXNOdWxsIiwidHJ1bmNhdGVEZWNpbWFscyIsIm51bWJlciIsImRpZ2l0cyIsIm11bHRpcGxpZXIiLCJNYXRoIiwicG93IiwiYWRqdXN0ZWROdW0iLCJ0cnVuY2F0ZWROdW0iLCJpc0Nocm9tZUJyb3dzZXIiLCJnZXRDaHJvbWVQa2ciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzZXNzaW9uSWQiLCJpc0Z1bmN0aW9uIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJhY3RpdmVIYW5kbGVycyIsInBhdGhuYW1lIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsInBhcnNlQXJyYXkiLCJjYXAiLCJwYXJzZWRDYXBzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJicm93c2VyTmFtZSIsImFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyIsInBvc3NpYmxlTmFtZXMiLCJzb21lIiwidGVzdCIsImJvb3RzdHJhcCIsIkJvb3RzdHJhcCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hbmRyb2lkLWhlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmV0cnksIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgcGF0aCBhcyBzZXR0aW5nc0Fwa1BhdGggfSBmcm9tICdpby5hcHBpdW0uc2V0dGluZ3MnO1xuaW1wb3J0IEJvb3RzdHJhcCBmcm9tICcuL2Jvb3RzdHJhcCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgQURCIGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHtcbiAgZGVmYXVsdCBhcyB1bmxvY2tlciwgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsXG4gIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssIEZJTkdFUlBSSU5UX1VOTE9DS1xufSBmcm9tICcuL3VubG9jay1oZWxwZXJzJztcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuY29uc3QgTU9DS19BUFBfSURTX1NUT1JFID0gJy9kYXRhL2xvY2FsL3RtcC9tb2NrX2FwcHMuanNvbic7XG5jb25zdCBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCA9IDkwMDAwOyAvLyBtaWxsaXNlY29uZHNcbi8vIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy9jaHJvbWUvYnJvd3Nlci9kZXZ0b29scy9kZXZpY2UvYW5kcm9pZF9kZXZpY2VfaW5mb19xdWVyeS5jY1xuY29uc3QgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSA9IHtcbiAgY2hyb21lOiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgY2hyb21pdW06IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lLnNoZWxsJyxcbiAgICBhY3Rpdml0eTogJy5DaHJvbWVTaGVsbEFjdGl2aXR5JyxcbiAgfSxcbiAgY2hyb21lYmV0YToge1xuICAgIHBrZzogJ2NvbS5jaHJvbWUuYmV0YScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gIGJyb3dzZXI6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5icm93c2VyJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5hbmRyb2lkLmJyb3dzZXIuQnJvd3NlckFjdGl2aXR5JyxcbiAgfSxcbiAgJ2Nocm9taXVtLWJyb3dzZXInOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gICdjaHJvbWl1bS13ZWJ2aWV3Jzoge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS53ZWJ2aWV3X3NoZWxsJyxcbiAgICBhY3Rpdml0eTogJ29yZy5jaHJvbWl1bS53ZWJ2aWV3X3NoZWxsLldlYlZpZXdCcm93c2VyQWN0aXZpdHknLFxuICB9LFxuICBkZWZhdWx0OiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbn07XG5jb25zdCBTRVRUSU5HU19IRUxQRVJfUEtHX0lEID0gJ2lvLmFwcGl1bS5zZXR0aW5ncyc7XG5jb25zdCBTRVRUSU5HU19IRUxQRVJfVU5MT0NLX0FDVElWSVRZID0gJy5VbmxvY2snO1xuY29uc3QgRU1VTEFUT1JfUEFUVEVSTiA9IC9cXGJlbXVsYXRvclxcYi9pO1xuLy8gVGhlc2UgY29uc3RhbnRzIGFyZSBpbiBzeW5jIHdpdGhcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpYXBwbGljYXRpb25zdGF0ZS94Y3VpYXBwbGljYXRpb25zdGF0ZXJ1bm5pbmdiYWNrZ3JvdW5kP2xhbmd1YWdlPW9iamNcbmNvbnN0IEFQUF9TVEFURSA9IE9iamVjdC5mcmVlemUoe1xuICBOT1RfSU5TVEFMTEVEOiAwLFxuICBOT1RfUlVOTklORzogMSxcbiAgUlVOTklOR19JTl9CQUNLR1JPVU5EOiAzLFxuICBSVU5OSU5HX0lOX0ZPUkVHUk9VTkQ6IDRcbn0pO1xuXG5cbmZ1bmN0aW9uIGVuc3VyZU5ldHdvcmtTcGVlZCAoYWRiLCBuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKF8udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKS5pbmNsdWRlcyhuZXR3b3JrU3BlZWQpKSB7XG4gICAgcmV0dXJuIG5ldHdvcmtTcGVlZDtcbiAgfVxuICBsb2dnZXIud2FybihgV3JvbmcgbmV0d29yayBzcGVlZCBwYXJhbSAnJHtuZXR3b3JrU3BlZWR9JywgdXNpbmcgZGVmYXVsdDogJHthZGIuTkVUV09SS19TUEVFRC5GVUxMfS4gYCArXG4gICAgYFN1cHBvcnRlZCB2YWx1ZXM6ICR7Xy52YWx1ZXMoYWRiLk5FVFdPUktfU1BFRUQpfWApO1xuICByZXR1cm4gYWRiLk5FVFdPUktfU1BFRUQuRlVMTDtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUF2ZEFyZ3MgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgbmV0d29ya1NwZWVkLFxuICAgIGlzSGVhZGxlc3MsXG4gICAgYXZkQXJncyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAoYXZkQXJncykge1xuICAgIGlmIChfLmlzQXJyYXkoYXZkQXJncykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmF2ZEFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCguLi4odXRpbC5zaGVsbFBhcnNlKGAke2F2ZEFyZ3N9YCkpKTtcbiAgICB9XG4gIH1cbiAgaWYgKG5ldHdvcmtTcGVlZCkge1xuICAgIHJlc3VsdC5wdXNoKCctbmV0c3BlZWQnLCBlbnN1cmVOZXR3b3JrU3BlZWQoYWRiLCBuZXR3b3JrU3BlZWQpKTtcbiAgfVxuICBpZiAoaXNIZWFkbGVzcykge1xuICAgIHJlc3VsdC5wdXNoKCctbm8td2luZG93Jyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gdG9DcmVkZW50aWFsVHlwZSAodW5sb2NrVHlwZSkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgW1BJTl9VTkxPQ0tdOiAncGluJyxcbiAgICBbUElOX1VOTE9DS19LRVlfRVZFTlRdOiAncGluJyxcbiAgICBbUEFTU1dPUkRfVU5MT0NLXTogJ3Bhc3N3b3JkJyxcbiAgICBbUEFUVEVSTl9VTkxPQ0tdOiAncGF0dGVybicsXG4gIH1bdW5sb2NrVHlwZV07XG4gIGlmIChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIHR5cGUgJyR7dW5sb2NrVHlwZX0nIGlzIG5vdCBrbm93bmApO1xufVxuXG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy5jcmVhdGVCYXNlQURCID0gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQmFzZUFEQiAob3B0cyA9IHt9KSB7XG4gIC8vIGZpbHRlciBvdXQgYW55IHVud2FudGVkIG9wdGlvbnMgc2VudCBpblxuICAvLyB0aGlzIGxpc3Qgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgQURCIHRha2VzIG1vcmUgYXJndW1lbnRzXG4gIGNvbnN0IHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IEFEQi5jcmVhdGVBREIoe1xuICAgIGFkYlBvcnQsXG4gICAgc3VwcHJlc3NLaWxsU2VydmVyLFxuICAgIHJlbW90ZUFkYkhvc3QsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICBhZGJFeGVjVGltZW91dCxcbiAgICB1c2VLZXlzdG9yZSxcbiAgICBrZXlzdG9yZVBhdGgsXG4gICAga2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZCxcbiAgICByZW1vdGVBcHBzQ2FjaGVMaW1pdCxcbiAgICBidWlsZFRvb2xzVmVyc2lvbixcbiAgICBhbGxvd09mZmxpbmVEZXZpY2VzLFxuICAgIGFsbG93RGVsYXlBZGIsXG4gIH0pO1xufTtcblxuaGVscGVycy5wcmVwYXJlRW11bGF0b3IgPSBhc3luYyBmdW5jdGlvbiBwcmVwYXJlRW11bGF0b3IgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgYXZkLFxuICAgIGF2ZEVudjogZW52LFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZTogY291bnRyeSxcbiAgICBhdmRMYXVuY2hUaW1lb3V0OiBsYXVuY2hUaW1lb3V0LFxuICAgIGF2ZFJlYWR5VGltZW91dDogcmVhZHlUaW1lb3V0LFxuICB9ID0gb3B0cztcbiAgaWYgKCFhdmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBsYXVuY2ggQVZEIHdpdGhvdXQgQVZEIG5hbWUnKTtcbiAgfVxuXG4gIGNvbnN0IGF2ZE5hbWUgPSBhdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgbGV0IGlzRW11bGF0b3JSdW5uaW5nID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIuZ2V0UnVubmluZ0FWRFdpdGhSZXRyeShhdmROYW1lLCA1MDAwKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRW11bGF0b3IgJyR7YXZkTmFtZX0nIGlzIG5vdCBydW5uaW5nOiAke2UubWVzc2FnZX1gKTtcbiAgICBpc0VtdWxhdG9yUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBwcmVwYXJlQXZkQXJncyhhZGIsIG9wdHMpO1xuICBpZiAoaXNFbXVsYXRvclJ1bm5pbmcpIHtcbiAgICBpZiAoYXJncy5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEtpbGxpbmcgJyR7YXZkTmFtZX0nIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgd2lwZWQgYXQgc3RhcnQuYCk7XG4gICAgICBhd2FpdCBhZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vdCBsYXVuY2hpbmcgQVZEIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBydW5uaW5nLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBhd2FpdCBhZGIubGF1bmNoQVZEKGF2ZCwge1xuICAgIGFyZ3MsXG4gICAgZW52LFxuICAgIGxhbmd1YWdlLFxuICAgIGNvdW50cnksXG4gICAgbGF1bmNoVGltZW91dCxcbiAgICByZWFkeVRpbWVvdXQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBTZXQgYW5kIGVuc3VyZSB0aGUgbG9jYWxlIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXsyLDh9LiBlLmcuIGVuLCBqYSA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb3VudHJ5IC0gQ291bnRyeS4gVGhlIGNvdW50cnkgKHJlZ2lvbikgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byB1cHBlciBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXsyfSB8IFswLTldezN9LiBlLmcuIFVTLCBKUCA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEBwYXJhbSB7P3N0cmluZ30gc2NyaXB0IC0gU2NyaXB0LiBUaGUgc2NyaXB0IGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byB0aXRsZSBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXs0fS4gZS5nLiBIYW5zIGluIHpoLUhhbnMtQ04gOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbGVkIHRvIHNldCBsb2NhbGUgcHJvcGVybHlcbiAqL1xuaGVscGVycy5lbnN1cmVEZXZpY2VMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBlbnN1cmVEZXZpY2VMb2NhbGUgKGFkYiwgbGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCA9IG51bGwpIHtcbiAgaWYgKCFfLmlzU3RyaW5nKGxhbmd1YWdlKSAmJiAhXy5pc1N0cmluZyhjb3VudHJ5KSkge1xuICAgIGxvZ2dlci53YXJuKGBzZXREZXZpY2VMYW5ndWFnZUNvdW50cnkgcmVxdWlyZXMgbGFuZ3VhZ2Ugb3IgY291bnRyeS5gKTtcbiAgICBsb2dnZXIud2FybihgR290IGxhbmd1YWdlOiAnJHtsYW5ndWFnZX0nIGFuZCBjb3VudHJ5OiAnJHtjb3VudHJ5fSdgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBhZGIuc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5KGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpO1xuXG4gIGlmICghYXdhaXQgYWRiLmVuc3VyZUN1cnJlbnRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCkpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gc2NyaXB0ID8gYGxhbmd1YWdlOiAke2xhbmd1YWdlfSwgY291bnRyeTogJHtjb3VudHJ5fSBhbmQgc2NyaXB0OiAke3NjcmlwdH1gIDogYGxhbmd1YWdlOiAke2xhbmd1YWdlfSBhbmQgY291bnRyeTogJHtjb3VudHJ5fWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0ICR7bWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHMgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJbmZvRnJvbUNhcHMgKG9wdHMgPSB7fSkge1xuICAvLyB3ZSBjYW4gY3JlYXRlIGEgdGhyb3dhd2F5IEFEQiBpbnN0YW5jZSBoZXJlLCBzbyB0aGVyZSBpcyBubyBkZXBlbmRlbmN5XG4gIC8vIG9uIGluc3RhbnRpYXRpbmcgb24gZWFybGllciAoYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBubyB1ZGlkKVxuICAvLyB3ZSBjYW4gb25seSB1c2UgdGhpcyBBREIgb2JqZWN0IGZvciBjb21tYW5kcyB0aGF0IHdvdWxkIG5vdCBiZSBjb25mdXNlZFxuICAvLyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBjb25uZWN0ZWRcbiAgY29uc3QgYWRiID0gYXdhaXQgaGVscGVycy5jcmVhdGVCYXNlQURCKG9wdHMpO1xuICBsZXQgdWRpZCA9IG9wdHMudWRpZDtcbiAgbGV0IGVtUG9ydCA9IG51bGw7XG5cbiAgLy8gYSBzcGVjaWZpYyBhdmQgbmFtZSB3YXMgZ2l2ZW4uIHRyeSB0byBpbml0aWFsaXplIHdpdGggdGhhdFxuICBpZiAob3B0cy5hdmQpIHtcbiAgICBhd2FpdCBoZWxwZXJzLnByZXBhcmVFbXVsYXRvcihhZGIsIG9wdHMpO1xuICAgIHVkaWQgPSBhZGIuY3VyRGV2aWNlSWQ7XG4gICAgZW1Qb3J0ID0gYWRiLmVtdWxhdG9yUG9ydDtcbiAgfSBlbHNlIHtcbiAgICAvLyBubyBhdmQgZ2l2ZW4uIGxldHMgdHJ5IHdoYXRldmVyJ3MgcGx1Z2dlZCBpbiBkZXZpY2VzL2VtdWxhdG9yc1xuICAgIGxvZ2dlci5pbmZvKCdSZXRyaWV2aW5nIGRldmljZSBsaXN0Jyk7XG4gICAgbGV0IGRldmljZXMgPSBhd2FpdCBhZGIuZ2V0RGV2aWNlc1dpdGhSZXRyeSgpO1xuXG4gICAgLy8gdWRpZCB3YXMgZ2l2ZW4sIGxldHMgdHJ5IHRvIGluaXQgd2l0aCB0aGF0IGRldmljZVxuICAgIGlmICh1ZGlkKSB7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoXy5tYXAoZGV2aWNlcywgJ3VkaWQnKSwgdWRpZCkpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYERldmljZSAke3VkaWR9IHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgY29ubmVjdGVkIGRldmljZXNgKTtcbiAgICAgIH1cbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH0gZWxzZSBpZiAob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgIG9wdHMucGxhdGZvcm1WZXJzaW9uID0gYCR7b3B0cy5wbGF0Zm9ybVZlcnNpb259YC50cmltKCk7XG5cbiAgICAgIC8vIGEgcGxhdGZvcm0gdmVyc2lvbiB3YXMgZ2l2ZW4uIGxldHMgdHJ5IHRvIGZpbmQgYSBkZXZpY2Ugd2l0aCB0aGUgc2FtZSBvc1xuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gc2VtdmVyLmNvZXJjZShvcHRzLnBsYXRmb3JtVmVyc2lvbikgfHwgb3B0cy5wbGF0Zm9ybVZlcnNpb247XG4gICAgICBsb2dnZXIuaW5mbyhgTG9va2luZyBmb3IgYSBkZXZpY2Ugd2l0aCBBbmRyb2lkICcke3BsYXRmb3JtVmVyc2lvbn0nYCk7XG5cbiAgICAgIC8vIGluIGNhc2Ugd2UgZmFpbCB0byBmaW5kIHNvbWV0aGluZywgZ2l2ZSB0aGUgdXNlciBhIHVzZWZ1bCBsb2cgdGhhdCBoYXNcbiAgICAgIC8vIHRoZSBkZXZpY2UgdWRpZHMgYW5kIG9zIHZlcnNpb25zIHNvIHRoZXkga25vdyB3aGF0J3MgYXZhaWxhYmxlXG4gICAgICBjb25zdCBhdmFpbERldmljZXMgPSBbXTtcbiAgICAgIGxldCBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgPSBudWxsO1xuICAgICAgLy8gZmlyc3QgdHJ5IHN0YXJ0ZWQgZGV2aWNlcy9lbXVsYXRvcnNcbiAgICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgICAgLy8gZGlyZWN0IGFkYiBjYWxscyB0byB0aGUgc3BlY2lmaWMgZGV2aWNlXG4gICAgICAgIGF3YWl0IGFkYi5zZXREZXZpY2VJZChkZXZpY2UudWRpZCk7XG4gICAgICAgIGNvbnN0IHJhd0RldmljZU9TID0gYXdhaXQgYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgICAgICAvLyBUaGUgZGV2aWNlIE9TIGNvdWxkIGVpdGhlciBiZSBhIG51bWJlciwgbGlrZSBgNi4wYFxuICAgICAgICAvLyBvciBhbiBhYmJyZXZpYXRpb24sIGxpa2UgYFJgXG4gICAgICAgIGF2YWlsRGV2aWNlcy5wdXNoKGAke2RldmljZS51ZGlkfSAoJHtyYXdEZXZpY2VPU30pYCk7XG4gICAgICAgIGNvbnN0IGRldmljZU9TID0gc2VtdmVyLmNvZXJjZShyYXdEZXZpY2VPUykgfHwgcmF3RGV2aWNlT1M7XG4gICAgICAgIGlmICghZGV2aWNlT1MpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCA9IHNlbXZlci52YWxpZChkZXZpY2VPUykgJiYgc2VtdmVyLnZhbGlkKHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICAgIGNvbnN0IGJvdGhWZXJzaW9uc0FyZVN0cmluZ3MgPSBfLmlzU3RyaW5nKGRldmljZU9TKSAmJiBfLmlzU3RyaW5nKHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICAgIGlmIChib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgJiYgZGV2aWNlT1MudmVyc2lvbiA9PT0gcGxhdGZvcm1WZXJzaW9uLnZlcnNpb25cbiAgICAgICAgICAgIHx8IGJvdGhWZXJzaW9uc0FyZVN0cmluZ3MgJiYgXy50b0xvd2VyKGRldmljZU9TKSA9PT0gXy50b0xvd2VyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgICAvLyBHb3QgYW4gZXhhY3QgbWF0Y2ggLSBwcm9jZWVkIGltbWVkaWF0ZWx5XG4gICAgICAgICAgdWRpZCA9IGRldmljZS51ZGlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKCFib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQpIHtcbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCB0byBjaGVjayBmb3IgcGFydGlhbCBtYXRjaCBpZiBlaXRoZXIgb2YgdmVyc2lvbiBudW1iZXJzIGlzIG5vdCBjb2VyY2libGVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIV8uaW5jbHVkZXMob3B0cy5wbGF0Zm9ybVZlcnNpb24sICcuJykgJiYgcGxhdGZvcm1WZXJzaW9uLm1ham9yID09PSBkZXZpY2VPUy5tYWpvclxuICAgICAgICAgICAgfHwgcGxhdGZvcm1WZXJzaW9uLm1ham9yID09PSBkZXZpY2VPUy5tYWpvciAmJiBwbGF0Zm9ybVZlcnNpb24ubWlub3IgPT09IGRldmljZU9TLm1pbm9yKVxuICAgICAgICAgICAgLy8gR290IGEgcGFydGlhbCBtYXRjaCAtIG1ha2Ugc3VyZSB3ZSBjb25zaWRlciB0aGUgbW9zdCByZWNlbnRcbiAgICAgICAgICAgIC8vIGRldmljZSB2ZXJzaW9uIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBzeXN0ZW1cbiAgICAgICAgICAgICYmIChwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgJiYgc2VtdmVyLmd0KGRldmljZU9TLCBfLnZhbHVlcyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdKVxuICAgICAgICAgICAgICAgIHx8ICFwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpKSB7XG4gICAgICAgICAgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0ge1tkZXZpY2UudWRpZF06IGRldmljZU9TfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF1ZGlkICYmIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSkge1xuICAgICAgICB1ZGlkID0gXy5rZXlzKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSlbMF07XG4gICAgICAgIGF3YWl0IGFkYi5zZXREZXZpY2VJZCh1ZGlkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1ZGlkKSB7XG4gICAgICAgIC8vIHdlIGNvdWxkbid0IGZpbmQgYW55dGhpbmchIHF1aXRcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFVuYWJsZSB0byBmaW5kIGFuIGFjdGl2ZSBkZXZpY2Ugb3IgZW11bGF0b3IgYCArXG4gICAgICAgICAgYHdpdGggT1MgJHtvcHRzLnBsYXRmb3JtVmVyc2lvbn0uIFRoZSBmb2xsb3dpbmcgYXJlIGF2YWlsYWJsZTogYCArXG4gICAgICAgICAgYXZhaWxEZXZpY2VzLmpvaW4oJywgJykpO1xuICAgICAgfVxuXG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYSB1ZGlkIHdhcyBub3QgZ2l2ZW4sIGdyYWIgdGhlIGZpcnN0IGRldmljZSB3ZSBzZWVcbiAgICAgIHVkaWQgPSBkZXZpY2VzWzBdLnVkaWQ7XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbyhgVXNpbmcgZGV2aWNlOiAke3VkaWR9YCk7XG4gIHJldHVybiB7dWRpZCwgZW1Qb3J0fTtcbn07XG5cbi8vIHJldHVybnMgYSBuZXcgYWRiIGluc3RhbmNlIHdpdGggZGV2aWNlSWQgc2V0XG5oZWxwZXJzLmNyZWF0ZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFEQiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gb3B0cztcbiAgY29uc3QgYWRiID0gYXdhaXQgaGVscGVycy5jcmVhdGVCYXNlQURCKG9wdHMpO1xuICBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gIGlmIChlbVBvcnQpIHtcbiAgICBhZGIuc2V0RW11bGF0b3JQb3J0KGVtUG9ydCk7XG4gIH1cblxuICByZXR1cm4gYWRiO1xufTtcblxuaGVscGVycy52YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzID0gZnVuY3Rpb24gdmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyAob3B0cykge1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2FwcFBhY2thZ2UnLCAnYXBwQWN0aXZpdHknLCAnYXBwV2FpdFBhY2thZ2UnLCAnYXBwV2FpdEFjdGl2aXR5J10pIHtcbiAgICBjb25zdCBuYW1lID0gb3B0c1trZXldO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSAvKFteXFx3LiosXSkrLy5leGVjKG5hbWUpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGBDYXBhYmlsaXR5ICcke2tleX0nIGlzIGV4cGVjdGVkIHRvIG9ubHkgaW5jbHVkZSBsYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmUsIGRvdCwgY29tbWEgYW5kIGFzdGVyaXNrIGNoYXJhY3RlcnMuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEN1cnJlbnQgdmFsdWUgJyR7bmFtZX0nIGhhcyBub24tbWF0Y2hpbmcgY2hhcmFjdGVyIGF0IGluZGV4ICR7bWF0Y2guaW5kZXh9OiAnJHtuYW1lLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCArIDEpfSdgKTtcbiAgfVxufTtcblxuaGVscGVycy5nZXRMYXVuY2hJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TGF1bmNoSW5mbyAoYWRiLCBvcHRzKSB7XG4gIGxldCB7YXBwLCBhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eX0gPSBvcHRzO1xuICBpZiAoIWFwcCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBhcHAgc2VudCBpbiwgbm90IHBhcnNpbmcgcGFja2FnZS9hY3Rpdml0eScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyhvcHRzKTtcblxuICBpZiAoYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZygnUGFyc2luZyBwYWNrYWdlIGFuZCBhY3Rpdml0eSBmcm9tIGFwcCBtYW5pZmVzdCcpO1xuICBsZXQge2Fwa1BhY2thZ2UsIGFwa0FjdGl2aXR5fSA9XG4gICAgYXdhaXQgYWRiLnBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdChhcHApO1xuICBpZiAoYXBrUGFja2FnZSAmJiAhYXBwUGFja2FnZSkge1xuICAgIGFwcFBhY2thZ2UgPSBhcGtQYWNrYWdlO1xuICB9XG4gIGlmICghYXBwV2FpdFBhY2thZ2UpIHtcbiAgICBhcHBXYWl0UGFja2FnZSA9IGFwcFBhY2thZ2U7XG4gIH1cbiAgaWYgKGFwa0FjdGl2aXR5ICYmICFhcHBBY3Rpdml0eSkge1xuICAgIGFwcEFjdGl2aXR5ID0gYXBrQWN0aXZpdHk7XG4gIH1cbiAgaWYgKCFhcHBXYWl0QWN0aXZpdHkpIHtcbiAgICBhcHBXYWl0QWN0aXZpdHkgPSBhcHBBY3Rpdml0eTtcbiAgfVxuICBsb2dnZXIuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmU6ICR7YXBrUGFja2FnZX0vJHthcGtBY3Rpdml0eX1gKTtcbiAgcmV0dXJuIHthcHBQYWNrYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRBY3Rpdml0eX07XG59O1xuXG5oZWxwZXJzLnJlc2V0QXBwID0gYXN5bmMgZnVuY3Rpb24gcmVzZXRBcHAgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHBQYWNrYWdlJyBvcHRpb24gaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBjb25zdCBpc0luc3RhbGxlZCA9IGF3YWl0IGFkYi5pc0FwcEluc3RhbGxlZChhcHBQYWNrYWdlKTtcblxuICBpZiAoaXNJbnN0YWxsZWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLmZvcmNlU3RvcChhcHBQYWNrYWdlKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgLy8gZnVsbFJlc2V0IGhhcyBwcmlvcml0eSBvdmVyIGZhc3RSZXNldFxuICAgIGlmICghZnVsbFJlc2V0ICYmIGZhc3RSZXNldCkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYWRiLmNsZWFyKGFwcFBhY2thZ2UpO1xuICAgICAgaWYgKF8uaXNTdHJpbmcob3V0cHV0KSAmJiBvdXRwdXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZmFpbGVkJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgdGhlIGFwcGxpY2F0aW9uIGRhdGEgb2YgJyR7YXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtvdXRwdXR9YCk7XG4gICAgICB9XG4gICAgICAvLyBleGVjdXRpbmcgYHNoZWxsIHBtIGNsZWFyYCByZXNldHMgcHJldmlvdXNseSBhc3NpZ25lZCBhcHBsaWNhdGlvbiBwZXJtaXNzaW9ucyBhcyB3ZWxsXG4gICAgICBpZiAoYXV0b0dyYW50UGVybWlzc2lvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhZGIuZ3JhbnRBbGxQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFVuYWJsZSB0byBncmFudCBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQuIE9yaWdpbmFsIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgUGVyZm9ybWVkIGZhc3QgcmVzZXQgb24gdGhlIGluc3RhbGxlZCAnJHthcHBQYWNrYWdlfScgYXBwbGljYXRpb24gKHN0b3AgYW5kIGNsZWFyKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmICghYXBwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFaXRoZXIgcHJvdmlkZSAnYXBwJyBvcHRpb24gdG8gaW5zdGFsbCAnJHthcHBQYWNrYWdlfScgb3IgYCArXG4gICAgICBgY29uc2lkZXIgc2V0dGluZyAnbm9SZXNldCcgdG8gJ3RydWUnIGlmICcke2FwcFBhY2thZ2V9JyBpcyBzdXBwb3NlZCB0byBiZSBwcmVpbnN0YWxsZWQuYCk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFJ1bm5pbmcgZnVsbCByZXNldCBvbiAnJHthcHBQYWNrYWdlfScgKHJlaW5zdGFsbClgKTtcbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgYXdhaXQgYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKTtcbiAgfVxuICBhd2FpdCBhZGIuaW5zdGFsbChhcHAsIHtcbiAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gIH0pO1xufTtcblxuaGVscGVycy5pbnN0YWxsQXBrID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwayAoYWRiLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhcHBQYWNrYWdlLFxuICAgIGZhc3RSZXNldCxcbiAgICBmdWxsUmVzZXQsXG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgZW5mb3JjZUFwcEluc3RhbGwsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghYXBwIHx8ICFhcHBQYWNrYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcCcgYW5kICdhcHBQYWNrYWdlJyBvcHRpb25zIGFyZSByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGlmIChmdWxsUmVzZXQpIHtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGFwcFN0YXRlLFxuICAgIHdhc1VuaW5zdGFsbGVkXG4gIH0gPSBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcHAsIGFwcFBhY2thZ2UsIHtcbiAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgZW5mb3JjZUN1cnJlbnRCdWlsZDogZW5mb3JjZUFwcEluc3RhbGwsXG4gIH0pO1xuXG4gIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgdGhlIG5ld2x5IGluc3RhbGxlZCBhcHBcbiAgY29uc3QgaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAgPSAhd2FzVW5pbnN0YWxsZWRcbiAgICAmJiBhcHBTdGF0ZSAhPT0gYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIGlmIChmYXN0UmVzZXQgJiYgaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHApIHtcbiAgICBsb2dnZXIuaW5mbyhgUGVyZm9ybWluZyBmYXN0IHJlc2V0IG9uICcke2FwcFBhY2thZ2V9J2ApO1xuICAgIGF3YWl0IHRoaXMucmVzZXRBcHAoYWRiLCBvcHRzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0YWxscyBhbiBhcnJheSBvZiBhcGtzXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRzIGRlZmluZWQgaW4gZHJpdmVyLmpzXG4gKi9cbmhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxPdGhlckFwa3MgKG90aGVyQXBwcywgYWRiLCBvcHRzKSB7XG4gIGxldCB7XG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXNcbiAgfSA9IG9wdHM7XG5cbiAgLy8gSW5zdGFsbCBhbGwgb2YgdGhlIEFQSydzIGFzeW5jaHJvbm91c2x5XG4gIGF3YWl0IEIuYWxsKG90aGVyQXBwcy5tYXAoKG90aGVyQXBwKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBJbnN0YWxsaW5nIGFwcDogJHtvdGhlckFwcH1gKTtcbiAgICByZXR1cm4gYWRiLmluc3RhbGxPclVwZ3JhZGUob3RoZXJBcHAsIG51bGwsIHtcbiAgICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgfSk7XG4gIH0pKTtcbn07XG5cbi8qKlxuICogVW5pbnN0YWxsIGFuIGFycmF5IG9mIHBhY2thZ2VzXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFwcFBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2UgbmFtZXMgdG8gdW5pbnN0YWxsLiBJZiB0aGlzIGluY2x1ZGVzIGAnKidgLCB1bmluc3RhbGwgYWxsIG9mIDNyZCBwYXJ0eSBhcHBzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKi9cbmhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyA9IGFzeW5jIGZ1bmN0aW9uIHVuaW5zdGFsbE90aGVyUGFja2FnZXMgKGFkYiwgYXBwUGFja2FnZXMsIGZpbHRlclBhY2thZ2VzID0gW10pIHtcbiAgaWYgKGFwcFBhY2thZ2VzLmluY2x1ZGVzKCcqJykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1VuaW5zdGFsbCB0aGlyZCBwYXJ0eSBwYWNrYWdlcycpO1xuICAgIGFwcFBhY2thZ2VzID0gYXdhaXQgdGhpcy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiLCBmaWx0ZXJQYWNrYWdlcyk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFVuaW5zdGFsbGluZyBwYWNrYWdlczogJHthcHBQYWNrYWdlc31gKTtcbiAgYXdhaXQgQi5hbGwoYXBwUGFja2FnZXMubWFwKChhcHBQYWNrYWdlKSA9PiBhZGIudW5pbnN0YWxsQXBrKGFwcFBhY2thZ2UpKSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGlyZCBwYXJ0eSBwYWNrYWdlcyBmaWx0ZXJlZCB3aXRoIGBmaWx0ZXJQYWNrYWdlc2BcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZXMgZG9lcyBub3QgdW5pbnN0YWxsIHdoZW4gYCpgIGlzIHByb3ZpZGVkIGFzIGBhcHBQYWNrYWdlc2BcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSBvZiBpbnN0YWxsZWQgdGhpcmQgcGFyeSBwYWNrYWdlc1xuICovXG5oZWxwZXJzLmdldFRoaXJkUGFydHlQYWNrYWdlcyA9IGFzeW5jIGZ1bmN0aW9uIGdldFRoaXJkUGFydHlQYWNrYWdlcyAoYWRiLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZXNTdHJpbmcgPSBhd2FpdCBhZGIuc2hlbGwoWydwbScsICdsaXN0JywgJ3BhY2thZ2VzJywgJy0zJ10pO1xuICAgIGNvbnN0IGFwcFBhY2thZ2VzQXJyYXkgPSBwYWNrYWdlc1N0cmluZy50cmltKCkucmVwbGFjZSgvcGFja2FnZTovZywgJycpLnNwbGl0KEVPTCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAnJHthcHBQYWNrYWdlc0FycmF5fScgZmlsdGVyZWQgd2l0aCAnJHtmaWx0ZXJQYWNrYWdlc30nYCk7XG4gICAgcmV0dXJuIF8uZGlmZmVyZW5jZShhcHBQYWNrYWdlc0FycmF5LCBmaWx0ZXJQYWNrYWdlcyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gZ2V0IHBhY2thZ2VzIHdpdGggJ2FkYiBzaGVsbCBwbSBsaXN0IHBhY2thZ2VzIC0zJzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmhlbHBlcnMuaW5pdFVuaWNvZGVLZXlib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRVbmljb2RlS2V5Ym9hcmQgKGFkYikge1xuICBsb2dnZXIuZGVidWcoJ0VuYWJsaW5nIFVuaWNvZGUga2V5Ym9hcmQgc3VwcG9ydCcpO1xuXG4gIC8vIGdldCB0aGUgZGVmYXVsdCBJTUUgc28gd2UgY2FuIHJldHVybiBiYWNrIHRvIGl0IGxhdGVyIGlmIHdlIHdhbnRcbiAgbGV0IGRlZmF1bHRJTUUgPSBhd2FpdCBhZGIuZGVmYXVsdElNRSgpO1xuXG4gIGxvZ2dlci5kZWJ1ZyhgVW5zZXR0aW5nIHByZXZpb3VzIElNRSAke2RlZmF1bHRJTUV9YCk7XG4gIGNvbnN0IGFwcGl1bUlNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9Ly5Vbmljb2RlSU1FYDtcbiAgbG9nZ2VyLmRlYnVnKGBTZXR0aW5nIElNRSB0byAnJHthcHBpdW1JTUV9J2ApO1xuICBhd2FpdCBhZGIuZW5hYmxlSU1FKGFwcGl1bUlNRSk7XG4gIGF3YWl0IGFkYi5zZXRJTUUoYXBwaXVtSU1FKTtcbiAgcmV0dXJuIGRlZmF1bHRJTUU7XG59O1xuXG5oZWxwZXJzLnNldE1vY2tMb2NhdGlvbkFwcCA9IGFzeW5jIGZ1bmN0aW9uIHNldE1vY2tMb2NhdGlvbkFwcCAoYWRiLCBhcHApIHtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgJ3NlY3VyZScsICdtb2NrX2xvY2F0aW9uJywgJzEnXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBhcHAsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnYWxsb3cnXSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHNldCBtb2NrIGxvY2F0aW9uIGZvciBhcHAgJyR7YXBwfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IHBrZ0lkcyA9IFtdO1xuICAgIGlmIChhd2FpdCBhZGIuZmlsZUV4aXN0cyhNT0NLX0FQUF9JRFNfU1RPUkUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwa2dJZHMgPSBKU09OLnBhcnNlKGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsIE1PQ0tfQVBQX0lEU19TVE9SRV0pKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgaWYgKHBrZ0lkcy5pbmNsdWRlcyhhcHApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBrZ0lkcy5wdXNoKGFwcCk7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLnBvc2l4LmpvaW4odG1wUm9vdCwgcGF0aC5wb3NpeC5iYXNlbmFtZShNT0NLX0FQUF9JRFNfU1RPUkUpKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHNyY1BhdGgsIEpTT04uc3RyaW5naWZ5KHBrZ0lkcyksICd1dGY4Jyk7XG4gICAgICBhd2FpdCBhZGIucHVzaEZpbGUoc3JjUGF0aCwgTU9DS19BUFBfSURTX1NUT1JFKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcGVyc2lzdCBtb2NrIGxvY2F0aW9uIGFwcCBpZCAnJHthcHB9JzogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMucmVzZXRNb2NrTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiByZXNldE1vY2tMb2NhdGlvbiAoYWRiKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcwJ10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRoaXJkUGFydHlQa2dJZHNQcm9taXNlID0gaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiKTtcbiAgICBsZXQgcGtnSWRzID0gW107XG4gICAgaWYgKGF3YWl0IGFkYi5maWxlRXhpc3RzKE1PQ0tfQVBQX0lEU19TVE9SRSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBrZ0lkcyA9IEpTT04ucGFyc2UoYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgTU9DS19BUFBfSURTX1NUT1JFXSkpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICBjb25zdCB0aGlyZFBhcnR5UGtnSWRzID0gYXdhaXQgdGhpcmRQYXJ0eVBrZ0lkc1Byb21pc2U7XG4gICAgLy8gT25seSBpbmNsdWRlIGN1cnJlbnRseSBpbnN0YWxsZWQgcGFja2FnZXNcbiAgICBjb25zdCByZXN1bHRQa2dzID0gXy5pbnRlcnNlY3Rpb24ocGtnSWRzLCB0aGlyZFBhcnR5UGtnSWRzKTtcbiAgICBpZiAoXy5zaXplKHJlc3VsdFBrZ3MpIDw9IDEpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCByZXN1bHRQa2dzWzBdID8/IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnZGVueSddKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFJlc2V0dGluZyBtb2NrX2xvY2F0aW9uIHBlcm1pc3Npb24gZm9yIHRoZSBmb2xsb3dpbmcgYXBwczogJHtyZXN1bHRQa2dzfWApO1xuICAgIGF3YWl0IEIuYWxsKHJlc3VsdFBrZ3MubWFwKChwa2dJZCkgPT4gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBwa2dJZCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdkZW55J10pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH0pKCkpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZXNldCBtb2NrIGxvY2F0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSGVscGVyQXBwIChhZGIsIGFwa1BhdGgsIHBhY2thZ2VJZCkge1xuICAvLyBTb21ldGltZXMgYWRiIHB1c2ggb3IgYWRiIGluc3RhbCB0YWtlIG1vcmUgdGltZSB0aGFuIGV4cGVjdGVkIHRvIGluc3RhbGwgYW4gYXBwXG4gIC8vIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MvaXNzdWVzLzQwI2lzc3VlY29tbWVudC00NzY1OTMxNzRcbiAgYXdhaXQgcmV0cnkoMiwgYXN5bmMgZnVuY3Rpb24gcmV0cnlJbnN0YWxsSGVscGVyQXBwICgpIHtcbiAgICBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcGtQYXRoLCBwYWNrYWdlSWQsIHtncmFudFBlcm1pc3Npb25zOiB0cnVlfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBQdXNoZXMgYW5kIGluc3RhbGxzIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNldHRpbmcgYXBwIGlzIHJlcXVpcmVkXG4gKlxuICogQHBhcmFtIHtBZGJ9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHBhcmFtIHtib29sZWFufSB0aHJvd0Vycm9yIFtmYWxzZV0gLSBXaGV0aGVyIHRocm93IGFuIGVycm9yIGlmIFNldHRpbmdzIGFwcCBmYWlscyB0byBzdGFydFxuICogQHRocm93cyB7RXJyb3J9IElmIHRocm93RXJyb3IgaXMgdHJ1ZSBhbmQgc29tZXRoaW5nIGhhcHBlbnMgaW4gaW5zdGFsbGF0aW9uIHN0ZXBcbiAqL1xuaGVscGVycy5wdXNoU2V0dGluZ3NBcHAgPSBhc3luYyBmdW5jdGlvbiBwdXNoU2V0dGluZ3NBcHAgKGFkYiwgdGhyb3dFcnJvciA9IGZhbHNlLCBvcHRzID0ge30pIHtcbiAgbG9nZ2VyLmRlYnVnKCdQdXNoaW5nIHNldHRpbmdzIGFwayB0byBkZXZpY2UuLi4nKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEhlbHBlckFwcChhZGIsIHNldHRpbmdzQXBrUGF0aCwgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgdGhyb3dFcnJvcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0aHJvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYElnbm9yZWQgZXJyb3Igd2hpbGUgaW5zdGFsbGluZyAnJHtzZXR0aW5nc0Fwa1BhdGh9JzogYCArXG4gICAgICAgICAgICAgICAgYCcke2Vyci5tZXNzYWdlfScuIEZlYXR1cmVzIHRoYXQgcmVseSBvbiB0aGlzIGhlbHBlciBgICtcbiAgICAgICAgICAgICAgICAncmVxdWlyZSB0aGUgYXBrIHN1Y2ggYXMgdG9nZ2xlIFdpRmkgYW5kIGdldHRpbmcgbG9jYXRpb24gJyArXG4gICAgICAgICAgICAgICAgJ3dpbGwgcmFpc2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byB1c2UgdGhlbS4nKTtcbiAgfVxuXG4gIC8vIFJlaW5zdGFsbCB3b3VsZCBzdG9wIHRoZSBzZXR0aW5ncyBoZWxwZXIgcHJvY2VzcyBhbnl3YXksIHNvXG4gIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHJ1bm5pbmdcbiAgaWYgKGF3YWl0IGFkYi5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9IGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdHMgcGVybWlzc2lvbnMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsID49IDI5KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MjaW50ZXJuYWwtYXVkaW8tLXZpZGVvLXJlY29yZGluZ1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgJ1BST0pFQ1RfTUVESUEnLCAnYWxsb3cnXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDw9IDIzKSB7IC8vIEFuZHJvaWQgNi0gZGV2aWNlcyBzaG91bGQgaGF2ZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgY29uc3QgcGVybXMgPSBbJ1NFVF9BTklNQVRJT05fU0NBTEUnLCAnQ0hBTkdFX0NPTkZJR1VSQVRJT04nLCAnQUNDRVNTX0ZJTkVfTE9DQVRJT04nXTtcbiAgICBsb2dnZXIuaW5mbyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtwZXJtc30gdG8gJyR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0nYCk7XG4gICAgYXdhaXQgYWRiLmdyYW50UGVybWlzc2lvbnMoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgcGVybXMubWFwKCh4KSA9PiBgYW5kcm9pZC5wZXJtaXNzaW9uLiR7eH1gKSk7XG4gIH1cblxuICAvLyBsYXVuY2ggaW8uYXBwaXVtLnNldHRpbmdzIGFwcCBkdWUgdG8gc2V0dGluZ3MgZmFpbGluZyB0byBiZSBzZXRcbiAgLy8gaWYgdGhlIGFwcCBpcyBub3QgbGF1bmNoZWQgcHJpb3IgdG8gc3RhcnQgdGhlIHNlc3Npb24gb24gYW5kcm9pZCA3K1xuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzg5NTdcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCh7XG4gICAgICB0aW1lb3V0OiBoZWxwZXJzLmlzRW11bGF0b3IoYWRiLCBvcHRzKSA/IDMwMDAwIDogNTAwMFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBzdHJpbmcueG1sIGFuZCBjb252ZXJ0cyBpdCB0byBzdHJpbmcuanNvbiBhbmQgcHVzaGVzXG4gKiBpdCB0byAvZGF0YS9sb2NhbC90bXAvc3RyaW5nLmpzb24gb24gZm9yIHVzZSBvZiBib290c3RyYXBcbiAqIElmIGFwcCBpcyBub3QgcHJlc2VudCB0byBleHRyYWN0IHN0cmluZy54bWwgaXQgZGVsZXRlcyByZW1vdGUgc3RyaW5ncy5qc29uXG4gKiBJZiBhcHAgZG9lcyBub3QgaGF2ZSBzdHJpbmdzLnhtbCB3ZSBwdXNoIGFuIGVtcHR5IGpzb24gb2JqZWN0IHRvIHJlbW90ZVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZSBhYmJyZXZpYXRpb24sIGZvciBleGFtcGxlICdmcicuIFRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gKiBpcyB1c2VkIGlmIHRoaXMgYXJndW1lbnQgaXMgbm90IGRlZmluZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIERyaXZlciBvcHRpb25zIGRpY3Rpb25hcnkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGljdGlvbmFyeSwgd2hlcmUgc3RyaW5nIHJlc291cmNlIGlkZW50aWZpZXJzIGFyZSBrZXlzXG4gKiBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2Ugb3IgYW4gZW1wdHkgb2JqZWN0XG4gKiBpZiBubyBtYXRjaGluZyByZXNvdXJjZXMgd2VyZSBleHRyYWN0ZWQuXG4gKi9cbmhlbHBlcnMucHVzaFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBwdXNoU3RyaW5ncyAobGFuZ3VhZ2UsIGFkYiwgb3B0cykge1xuICBjb25zdCByZW1vdGVEaXIgPSAnL2RhdGEvbG9jYWwvdG1wJztcbiAgY29uc3Qgc3RyaW5nc0pzb24gPSAnc3RyaW5ncy5qc29uJztcbiAgY29uc3QgcmVtb3RlRmlsZSA9IHBhdGgucG9zaXgucmVzb2x2ZShyZW1vdGVEaXIsIHN0cmluZ3NKc29uKTtcblxuICAvLyBjbGVhbiB1cCByZW1vdGUgc3RyaW5nLmpzb24gaWYgcHJlc2VudFxuICBhd2FpdCBhZGIucmltcmFmKHJlbW90ZUZpbGUpO1xuXG4gIGxldCBhcHA7XG4gIHRyeSB7XG4gICAgYXBwID0gb3B0cy5hcHAgfHwgYXdhaXQgYWRiLnB1bGxBcGsob3B0cy5hcHBQYWNrYWdlLCBvcHRzLnRtcERpcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5pbmZvKGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHtvcHRzLmFwcFBhY2thZ2V9JyB0byAnJHtvcHRzLnRtcERpcn0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkob3B0cy5hcHBQYWNrYWdlKSB8fCAhKGF3YWl0IGZzLmV4aXN0cyhhcHApKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgTm8gYXBwIG9yIHBhY2thZ2Ugc3BlY2lmaWVkLiBSZXR1cm5pbmcgZW1wdHkgc3RyaW5nc2ApO1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ3NUbXBEaXIgPSBwYXRoLnJlc29sdmUob3B0cy50bXBEaXIsIG9wdHMuYXBwUGFja2FnZSk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBhcGsnLCBhcHAsIGxhbmd1YWdlLCBzdHJpbmdzVG1wRGlyKTtcbiAgICBjb25zdCB7YXBrU3RyaW5ncywgbG9jYWxQYXRofSA9IGF3YWl0IGFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgYXdhaXQgYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVEaXIpO1xuICAgIHJldHVybiBhcGtTdHJpbmdzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgQ291bGQgbm90IGdldCBzdHJpbmdzLCBjb250aW51aW5nIGFueXdheS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKCdlY2hvJywgW2Ane30nID4gJHtyZW1vdGVGaWxlfWBdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoc3RyaW5nc1RtcERpcik7XG4gIH1cbiAgcmV0dXJuIHt9O1xufTtcblxuaGVscGVycy51bmxvY2tXaXRoSGVscGVyQXBwID0gYXN5bmMgZnVuY3Rpb24gdW5sb2NrV2l0aEhlbHBlckFwcCAoYWRiKSB7XG4gIGxvZ2dlci5pbmZvKCdVbmxvY2tpbmcgc2NyZWVuJyk7XG5cbiAgLy8gVW5sb2NrIHN1Y2NlZWQgd2l0aCBhIGNvdXBsZSBvZiByZXRyaWVzLlxuICBsZXQgZmlyc3RSdW4gPSB0cnVlO1xuICBhd2FpdCByZXRyeSgzLCBhc3luYyBmdW5jdGlvbiBsYXVuY2hIZWxwZXIgKCkge1xuICAgIC8vIFRvIHJlZHVjZSBhIHRpbWUgdG8gY2FsbCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSBzaW5jZSBgYWRiIHNoZWxsIGR1bXBzeXMgd2luZG93YCBpcyBlYXN5IHRvIGhhbmcgYWRiIGNvbW1hbmRzXG4gICAgaWYgKGZpcnN0UnVuKSB7XG4gICAgICBmaXJzdFJ1biA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIShhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVycm9yIGluIGlzU2NyZWVuTG9ja2VkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1wiYWRiIHNoZWxsIGR1bXBzeXMgd2luZG93XCIgY29tbWFuZCBoYXMgdGltZWQgb3V0LicpO1xuICAgICAgICBsb2dnZXIud2FybignVGhlIHJlYXNvbiBvZiB0aGlzIHRpbWVvdXQgaXMgdGhlIGRlbGF5ZWQgYWRiIHJlc3BvbnNlLiBSZXNldHRpbmcgYWRiIHNlcnZlciBjYW4gaW1wcm92ZSBpdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhgTGF1bmNoaW5nICR7U0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWX1gKTtcbiAgICBhd2FpdCBhZGIuc2hlbGwoW1xuICAgICAgJ2FtJywgJ3N0YXJ0JyxcbiAgICAgICctbicsIGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9LyR7U0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWX1gLFxuICAgICAgJy1jJywgJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgICAnLWYnLCAnMHgxMDIwMDAwMCcsXG4gICAgXSk7XG4gICAgYXdhaXQgQi5kZWxheSgxMDAwKTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLnVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHVubG9jayAoZHJpdmVyLCBhZGIsIGNhcGFiaWxpdGllcykge1xuICBpZiAoIShhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkpIHtcbiAgICBsb2dnZXIuaW5mbygnU2NyZWVuIGFscmVhZHkgdW5sb2NrZWQsIGRvaW5nIG5vdGhpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKCdTY3JlZW4gaXMgbG9ja2VkLCB0cnlpbmcgdG8gdW5sb2NrJyk7XG5cbiAgaWYgKCFjYXBhYmlsaXRpZXMudW5sb2NrVHlwZSAmJiAhY2FwYWJpbGl0aWVzLnVubG9ja0tleSkge1xuICAgIGxvZ2dlci53YXJuKCdVc2luZyBhcHAgdW5sb2NrLCB0aGlzIGlzIGdvaW5nIHRvIGJlIGRlcHJlY2F0ZWQhJyk7XG4gICAgYXdhaXQgaGVscGVycy51bmxvY2tXaXRoSGVscGVyQXBwKGFkYik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHVubG9ja1R5cGUsXG4gICAgdW5sb2NrS2V5LFxuICAgIHVubG9ja1N0cmF0ZWd5LFxuICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0LFxuICB9ID0gdW5sb2NrZXIudmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKTtcbiAgaWYgKHVubG9ja0tleSAmJiB1bmxvY2tUeXBlICE9PSBGSU5HRVJQUklOVF9VTkxPQ0tcbiAgICAgICYmIChfLmlzTmlsKHVubG9ja1N0cmF0ZWd5KSB8fCBfLnRvTG93ZXIodW5sb2NrU3RyYXRlZ3kpID09PSAnbG9ja3NldHRpbmdzJylcbiAgICAgICYmIGF3YWl0IGFkYi5pc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkKCkpIHtcbiAgICBhd2FpdCB1bmxvY2tlci5mYXN0VW5sb2NrKGFkYiwge1xuICAgICAgY3JlZGVudGlhbDogdW5sb2NrS2V5LFxuICAgICAgY3JlZGVudGlhbFR5cGU6IHRvQ3JlZGVudGlhbFR5cGUodW5sb2NrVHlwZSksXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdW5sb2NrTWV0aG9kID0ge1xuICAgICAgW1BJTl9VTkxPQ0tdOiB1bmxvY2tlci5waW5VbmxvY2ssXG4gICAgICBbUElOX1VOTE9DS19LRVlfRVZFTlRdOiB1bmxvY2tlci5waW5VbmxvY2tXaXRoS2V5RXZlbnQsXG4gICAgICBbUEFTU1dPUkRfVU5MT0NLXTogdW5sb2NrZXIucGFzc3dvcmRVbmxvY2ssXG4gICAgICBbUEFUVEVSTl9VTkxPQ0tdOiB1bmxvY2tlci5wYXR0ZXJuVW5sb2NrLFxuICAgICAgW0ZJTkdFUlBSSU5UX1VOTE9DS106IHVubG9ja2VyLmZpbmdlcnByaW50VW5sb2NrLFxuICAgIH1bdW5sb2NrVHlwZV07XG4gICAgYXdhaXQgdW5sb2NrTWV0aG9kKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpO1xuICB9XG4gIGF3YWl0IGhlbHBlcnMudmVyaWZ5VW5sb2NrKGFkYiwgdW5sb2NrU3VjY2Vzc1RpbWVvdXQpO1xufTtcblxuaGVscGVycy52ZXJpZnlVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiB2ZXJpZnlVbmxvY2sgKGFkYiwgdGltZW91dE1zID0gbnVsbCkge1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gIShhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSksIHtcbiAgICAgIHdhaXRNczogdGltZW91dE1zID8/IDIwMDAsXG4gICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGlnbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRldmljZSBoYXMgZmFpbGVkIHRvIGJlIHVubG9ja2VkJyk7XG4gIH1cbiAgbG9nZ2VyLmluZm8oJ1RoZSBkZXZpY2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHVubG9ja2VkJyk7XG59O1xuXG5oZWxwZXJzLmluaXREZXZpY2UgPSBhc3luYyBmdW5jdGlvbiBpbml0RGV2aWNlIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIHNraXBEZXZpY2VJbml0aWFsaXphdGlvbixcbiAgICBsb2NhbGUsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbG9jYWxlU2NyaXB0LFxuICAgIHVuaWNvZGVLZXlib2FyZCxcbiAgICBkaXNhYmxlV2luZG93QW5pbWF0aW9uLFxuICAgIHNraXBVbmxvY2ssXG4gICAgbW9ja0xvY2F0aW9uQXBwLFxuICAgIHNraXBMb2djYXRDYXB0dXJlLFxuICAgIGxvZ2NhdEZvcm1hdCxcbiAgICBsb2djYXRGaWx0ZXJTcGVjcyxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKHNraXBEZXZpY2VJbml0aWFsaXphdGlvbikge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcERldmljZUluaXRpYWxpemF0aW9uJyBpcyBzZXQuIFNraXBwaW5nIGRldmljZSBpbml0aWFsaXphdGlvbi5gKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIud2FpdEZvckRldmljZSgpO1xuICAgIC8vIHB1c2hTZXR0aW5nc0FwcCByZXF1aXJlZCBiZWZvcmUgY2FsbGluZyBlbnN1cmVEZXZpY2VMb2NhbGUgZm9yIEFQSSBMZXZlbCAyNCtcblxuICAgIC8vIFNvbWUgZmVhdHVyZSBzdWNoIGFzIGxvY2F0aW9uL3dpZmkgYXJlIG5vdCBuZWNlc3NhcnkgZm9yIGFsbCB1c2VycyxcbiAgICAvLyBidXQgdGhleSByZXF1aXJlIHRoZSBzZXR0aW5ncyBhcHAuIFNvLCB0cnkgdG8gY29uZmlndXJlIGl0IHdoaWxlIEFwcGl1bVxuICAgIC8vIGRvZXMgbm90IHRocm93IGVycm9yIGV2ZW4gaWYgdGhleSBmYWlsLlxuICAgIGNvbnN0IHNob3VsZFRocm93RXJyb3IgPSBsYW5ndWFnZVxuICAgICAgfHwgbG9jYWxlXG4gICAgICB8fCBsb2NhbGVTY3JpcHRcbiAgICAgIHx8IHVuaWNvZGVLZXlib2FyZFxuICAgICAgfHwgZGlzYWJsZVdpbmRvd0FuaW1hdGlvblxuICAgICAgfHwgIXNraXBVbmxvY2s7XG4gICAgYXdhaXQgaGVscGVycy5wdXNoU2V0dGluZ3NBcHAoYWRiLCBzaG91bGRUaHJvd0Vycm9yLCBvcHRzKTtcbiAgfVxuXG4gIGlmICghaGVscGVycy5pc0VtdWxhdG9yKGFkYiwgb3B0cykpIHtcbiAgICBpZiAobW9ja0xvY2F0aW9uQXBwIHx8IF8uaXNVbmRlZmluZWQobW9ja0xvY2F0aW9uQXBwKSkge1xuICAgICAgYXdhaXQgaGVscGVycy5zZXRNb2NrTG9jYXRpb25BcHAoYWRiLCBtb2NrTG9jYXRpb25BcHAgfHwgU0VUVElOR1NfSEVMUEVSX1BLR19JRCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRNb2NrTG9jYXRpb24oYWRiKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGFuZ3VhZ2UgfHwgbG9jYWxlKSB7XG4gICAgYXdhaXQgaGVscGVycy5lbnN1cmVEZXZpY2VMb2NhbGUoYWRiLCBsYW5ndWFnZSwgbG9jYWxlLCBsb2NhbGVTY3JpcHQpO1xuICB9XG5cbiAgaWYgKHNraXBMb2djYXRDYXB0dXJlKSB7XG4gICAgbG9nZ2VyLmluZm8oYCdza2lwTG9nY2F0Q2FwdHVyZScgaXMgc2V0LiBTa2lwcGluZyBzdGFydGluZyBsb2djYXQgY2FwdHVyZS5gKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIuc3RhcnRMb2djYXQoe1xuICAgICAgZm9ybWF0OiBsb2djYXRGb3JtYXQsXG4gICAgICBmaWx0ZXJTcGVjczogbG9nY2F0RmlsdGVyU3BlY3MsXG4gICAgfSk7XG4gIH1cblxuICBpZiAodW5pY29kZUtleWJvYXJkKSB7XG4gICAgcmV0dXJuIGF3YWl0IGhlbHBlcnMuaW5pdFVuaWNvZGVLZXlib2FyZChhZGIpO1xuICB9XG59O1xuXG5oZWxwZXJzLnJlbW92ZU51bGxQcm9wZXJ0aWVzID0gZnVuY3Rpb24gcmVtb3ZlTnVsbFByb3BlcnRpZXMgKG9iaikge1xuICBmb3IgKGxldCBrZXkgb2YgXy5rZXlzKG9iaikpIHtcbiAgICBpZiAoXy5pc051bGwob2JqW2tleV0pIHx8IF8uaXNVbmRlZmluZWQob2JqW2tleV0pKSB7XG4gICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLnRydW5jYXRlRGVjaW1hbHMgPSBmdW5jdGlvbiB0cnVuY2F0ZURlY2ltYWxzIChudW1iZXIsIGRpZ2l0cykge1xuICBsZXQgbXVsdGlwbGllciA9IE1hdGgucG93KDEwLCBkaWdpdHMpLFxuICAgICAgYWRqdXN0ZWROdW0gPSBudW1iZXIgKiBtdWx0aXBsaWVyLFxuICAgICAgdHJ1bmNhdGVkTnVtID0gTWF0aFthZGp1c3RlZE51bSA8IDAgPyAnY2VpbCcgOiAnZmxvb3InXShhZGp1c3RlZE51bSk7XG5cbiAgcmV0dXJuIHRydW5jYXRlZE51bSAvIG11bHRpcGxpZXI7XG59O1xuXG5oZWxwZXJzLmlzQ2hyb21lQnJvd3NlciA9IGZ1bmN0aW9uIGlzQ2hyb21lQnJvd3NlciAoYnJvd3Nlcikge1xuICByZXR1cm4gXy5pbmNsdWRlcyhPYmplY3Qua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSwgKGJyb3dzZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkpO1xufTtcblxuaGVscGVycy5nZXRDaHJvbWVQa2cgPSBmdW5jdGlvbiBnZXRDaHJvbWVQa2cgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFlbYnJvd3Nlci50b0xvd2VyQ2FzZSgpXSB8fCBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZLmRlZmF1bHQ7XG59O1xuXG5oZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyAoc2VydmVyLCBzZXNzaW9uSWQpIHtcbiAgaWYgKCFzZXJ2ZXIgfHwgIV8uaXNGdW5jdGlvbihzZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWN0aXZlSGFuZGxlcnMgPSBhd2FpdCBzZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMoc2Vzc2lvbklkKTtcbiAgZm9yIChjb25zdCBwYXRobmFtZSBvZiBfLmtleXMoYWN0aXZlSGFuZGxlcnMpKSB7XG4gICAgYXdhaXQgc2VydmVyLnJlbW92ZVdlYlNvY2tldEhhbmRsZXIocGF0aG5hbWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFRha2VzIGEgZGVzaXJlZCBjYXBhYmlsaXR5IGFuZCB0cmllcyB0byBKU09OLnBhcnNlIGl0IGFzIGFuIGFycmF5LFxuICogYW5kIGVpdGhlciByZXR1cm5zIHRoZSBwYXJzZWQgYXJyYXkgb3IgYSBzaW5nbGV0b24gYXJyYXkuXG4gKlxuICogQHBhcmFtIHthbnl9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnBhcnNlQXJyYXkgPSBmdW5jdGlvbiBwYXJzZUFycmF5IChjYXApIHtcbiAgbGV0IHBhcnNlZENhcHM7XG4gIHRyeSB7XG4gICAgcGFyc2VkQ2FwcyA9IEpTT04ucGFyc2UoY2FwKTtcbiAgfSBjYXRjaCAoaWduKSB7IH1cblxuICBpZiAoXy5pc0FycmF5KHBhcnNlZENhcHMpKSB7XG4gICAgcmV0dXJuIHBhcnNlZENhcHM7XG4gIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhjYXApKSB7XG4gICAgcmV0dXJuIFtjYXBdO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgYSBzdHJpbmcgb3IgSlNPTiBBcnJheTsgcmVjZWl2ZWQgJHtjYXB9YCk7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlIGRlc2lyZWQgY2FwYWJpbGl0aWVzLiBSZXR1cm5zIHRydWUgaWYgY2FwYWJpbGl0eSBpcyB2YWxpZFxuICpcbiAqIEBwYXJhbSB7Kn0gY2FwIEEgZGVzaXJlZCBjYXBhYmlsaXR5XG4gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY2FwcyBoYXMgaW52YWxpZCBjYXBhYmlsaXR5XG4gKi9cbmhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyA9IGZ1bmN0aW9uIHZhbGlkYXRlRGVzaXJlZENhcHMgKGNhcHMpIHtcbiAgaWYgKGNhcHMuYnJvd3Nlck5hbWUpIHtcbiAgICBpZiAoY2Fwcy5hcHApIHtcbiAgICAgIC8vIHdhcm4gaWYgdGhlIGNhcGFiaWxpdGllcyBoYXZlIGJvdGggYGFwcGAgYW5kIGBicm93c2VyLCBhbHRob3VnaCB0aGlzIGlzIGNvbW1vbiB3aXRoIHNlbGVuaXVtIGdyaWRcbiAgICAgIGxvZ2dlci53YXJuKGBUaGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMgc2hvdWxkIGdlbmVyYWxseSBub3QgaW5jbHVkZSBib3RoIGFuICdhcHAnIGFuZCBhICdicm93c2VyTmFtZSdgKTtcbiAgICB9XG4gICAgaWYgKGNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFRoZSBkZXNpcmVkIHNob3VsZCBub3QgaW5jbHVkZSBib3RoIG9mIGFuICdhcHBQYWNrYWdlJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnBhcnNlQXJyYXkoY2Fwcy51bmluc3RhbGxPdGhlclBhY2thZ2VzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IHBhcnNlIFwidW5pbnN0YWxsT3RoZXJQYWNrYWdlc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBBZGp1c3QgdGhlIGNhcGFiaWxpdGllcyBmb3IgYSBicm93c2VyIHNlc3Npb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY2FwcyAtIEN1cnJlbnQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICogISEhIFRoZSBvYmplY3QgaXMgbXV0YXRlZCBieSB0aGlzIG1ldGhvZCBjYWxsICEhIVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHNhbWUgcG9zc2libHkgbXV0YXRlZCBgb3B0c2AgaW5zdGFuY2UuXG4gKiBObyBtdXRhdGlvbiBpcyBoYXBwZW5pbmcgaXMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZlxuICogYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBzIGhhdmUgYWxyZWFkeSBiZWVuIHByb3ZpZGVkLlxuICovXG5oZWxwZXJzLmFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyA9IGZ1bmN0aW9uIGFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyAoY2FwcyA9IHt9KSB7XG4gIGNvbnN0IHsgYnJvd3Nlck5hbWUgfSA9IGNhcHM7XG4gIGxvZ2dlci5pbmZvKGBUaGUgY3VycmVudCBzZXNzaW9uIGlzIGNvbnNpZGVyZWQgYnJvd3Nlci1iYXNlZGApO1xuICBsb2dnZXIuaW5mbyhgU3VwcG9ydGVkIGJyb3dzZXIgbmFtZXM6ICR7SlNPTi5zdHJpbmdpZnkoXy5rZXlzKENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkpKX1gKTtcbiAgaWYgKGNhcHMuYXBwUGFja2FnZSB8fCBjYXBzLmFwcEFjdGl2aXR5KSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBvdmVycmlkaW5nIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgZm9yICcke2Jyb3dzZXJOYW1lfScgYCArXG4gICAgICAnYmVjYXVzZSBzb21lIG9mIHRoZW0gaGF2ZSBiZWVuIGFscmVhZHkgcHJvdmlkZWQnKTtcbiAgICByZXR1cm4gY2FwcztcbiAgfVxuXG4gIGNvbnN0IHtwa2csIGFjdGl2aXR5fSA9IHRoaXMuZ2V0Q2hyb21lUGtnKGJyb3dzZXJOYW1lKTtcbiAgY2Fwcy5hcHBQYWNrYWdlID0gcGtnO1xuICBjYXBzLmFwcEFjdGl2aXR5ID0gYWN0aXZpdHk7XG4gIGxvZ2dlci5pbmZvKGBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdGllcyBoYXZlIGJlZW4gYXV0b21hdGljYWxseSBzZXQgdG8gJHtwa2d9LyR7YWN0aXZpdHl9IGAgK1xuICAgIGBmb3IgJyR7YnJvd3Nlck5hbWV9J2ApO1xuICBsb2dnZXIuaW5mbyhgQ29uc2lkZXIgY2hhbmdpbmcgdGhlIGJyb3dzZXJOYW1lIHRvIHRoZSBvbmUgZnJvbSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYnJvd3NlciBuYW1lcyBgICtcbiAgICBgb3IgcHJvdmlkZSBjdXN0b20gYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXR5IHZhbHVlcyBpZiB0aGUgYXV0b21hdGljYWxseSBhc3NpZ25lZCBvbmVzIGRvIGAgK1xuICAgIGBub3QgbWFrZSBzZW5zZWApO1xuICByZXR1cm4gY2Fwcztcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgZGV2aWNlIHVuZGVyIHRlc3QgaXMgYW4gZW11bGF0b3JcbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIC0gYXBwaXVtLWFkYiBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBkcml2ZXIgb3B0aW9ucyBtYXBwaW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgYW4gQW5kcm9pZCBlbXVsYXRvclxuICovXG5oZWxwZXJzLmlzRW11bGF0b3IgPSBmdW5jdGlvbiBpc0VtdWxhdG9yIChhZGIsIG9wdHMpIHtcbiAgY29uc3QgcG9zc2libGVOYW1lcyA9IFtvcHRzLnVkaWQsIGFkYj8uY3VyRGV2aWNlSWRdO1xuICByZXR1cm4gISFvcHRzLmF2ZCB8fCBwb3NzaWJsZU5hbWVzLnNvbWUoKHgpID0+IEVNVUxBVE9SX1BBVFRFUk4udGVzdCh4KSk7XG59O1xuXG5oZWxwZXJzLmJvb3RzdHJhcCA9IEJvb3RzdHJhcDtcbmhlbHBlcnMudW5sb2NrZXIgPSB1bmxvY2tlcjtcblxuZXhwb3J0IHsgaGVscGVycywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgQVBQX1NUQVRFLCBwcmVwYXJlQXZkQXJncywgZW5zdXJlTmV0d29ya1NwZWVkIH07XG5leHBvcnQgZGVmYXVsdCBoZWxwZXJzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUE0QjtBQUFBO0FBRTVCLE1BQU1BLGtCQUFrQixHQUFHLGdDQUFnQztBQUMzRCxNQUFNQyx1QkFBdUIsR0FBRyxLQUFLO0FBRXJDLE1BQU1DLCtCQUErQixHQUFHO0VBQ3RDQyxNQUFNLEVBQUU7SUFDTkMsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QkMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEQyxRQUFRLEVBQUU7SUFDUkYsR0FBRyxFQUFFLDJCQUEyQjtJQUNoQ0MsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNERSxVQUFVLEVBQUU7SUFDVkgsR0FBRyxFQUFFLGlCQUFpQjtJQUN0QkMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNERyxPQUFPLEVBQUU7SUFDUEosR0FBRyxFQUFFLHFCQUFxQjtJQUMxQkMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNELGtCQUFrQixFQUFFO0lBQ2xCRCxHQUFHLEVBQUUscUJBQXFCO0lBQzFCQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0Qsa0JBQWtCLEVBQUU7SUFDbEJELEdBQUcsRUFBRSw0QkFBNEI7SUFDakNDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREksT0FBTyxFQUFFO0lBQ1BMLEdBQUcsRUFBRSxvQkFBb0I7SUFDekJDLFFBQVEsRUFBRTtFQUNaO0FBQ0YsQ0FBQztBQUNELE1BQU1LLHNCQUFzQixHQUFHLG9CQUFvQjtBQUFDO0FBQ3BELE1BQU1DLCtCQUErQixH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
811
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0NLX0FQUF9JRFNfU1RPUkUiLCJQQUNLQUdFX0lOU1RBTExfVElNRU9VVCIsIkNIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkiLCJjaHJvbWUiLCJwa2ciLCJhY3Rpdml0eSIsImNocm9taXVtIiwiY2hyb21lYmV0YSIsImJyb3dzZXIiLCJkZWZhdWx0IiwiU0VUVElOR1NfSEVMUEVSX1BLR19JRCIsIlNFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFkiLCJFTVVMQVRPUl9QQVRURVJOIiwiQVBQX1NUQVRFIiwiT2JqZWN0IiwiZnJlZXplIiwiTk9UX0lOU1RBTExFRCIsIk5PVF9SVU5OSU5HIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiZW5zdXJlTmV0d29ya1NwZWVkIiwiYWRiIiwibmV0d29ya1NwZWVkIiwiXyIsInZhbHVlcyIsIk5FVFdPUktfU1BFRUQiLCJpbmNsdWRlcyIsImxvZ2dlciIsIndhcm4iLCJGVUxMIiwicHJlcGFyZUF2ZEFyZ3MiLCJvcHRzIiwiaXNIZWFkbGVzcyIsImF2ZEFyZ3MiLCJyZXN1bHQiLCJpc0FycmF5IiwicHVzaCIsInV0aWwiLCJzaGVsbFBhcnNlIiwidG9DcmVkZW50aWFsVHlwZSIsInVubG9ja1R5cGUiLCJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkVycm9yIiwiaGVscGVycyIsImNyZWF0ZUJhc2VBREIiLCJhZGJQb3J0Iiwic3VwcHJlc3NLaWxsU2VydmVyIiwicmVtb3RlQWRiSG9zdCIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJhZGJFeGVjVGltZW91dCIsInVzZUtleXN0b3JlIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJyZW1vdGVBcHBzQ2FjaGVMaW1pdCIsImJ1aWxkVG9vbHNWZXJzaW9uIiwiYWxsb3dPZmZsaW5lRGV2aWNlcyIsImFsbG93RGVsYXlBZGIiLCJBREIiLCJjcmVhdGVBREIiLCJwcmVwYXJlRW11bGF0b3IiLCJhdmQiLCJhdmRFbnYiLCJlbnYiLCJsYW5ndWFnZSIsImxvY2FsZSIsImNvdW50cnkiLCJhdmRMYXVuY2hUaW1lb3V0IiwibGF1bmNoVGltZW91dCIsImF2ZFJlYWR5VGltZW91dCIsInJlYWR5VGltZW91dCIsImF2ZE5hbWUiLCJyZXBsYWNlIiwiaXNFbXVsYXRvclJ1bm5pbmciLCJnZXRSdW5uaW5nQVZEV2l0aFJldHJ5IiwiZSIsImRlYnVnIiwibWVzc2FnZSIsImFyZ3MiLCJraWxsRW11bGF0b3IiLCJsYXVuY2hBVkQiLCJlbnN1cmVEZXZpY2VMb2NhbGUiLCJzY3JpcHQiLCJpc1N0cmluZyIsInNldERldmljZUxhbmd1YWdlQ291bnRyeSIsImVuc3VyZUN1cnJlbnRMb2NhbGUiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJ1ZGlkIiwiZW1Qb3J0IiwiY3VyRGV2aWNlSWQiLCJlbXVsYXRvclBvcnQiLCJpbmZvIiwiZGV2aWNlcyIsImdldERldmljZXNXaXRoUmV0cnkiLCJtYXAiLCJlcnJvckFuZFRocm93IiwiZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyIsInBsYXRmb3JtVmVyc2lvbiIsInRyaW0iLCJzZW12ZXIiLCJjb2VyY2UiLCJhdmFpbERldmljZXMiLCJwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUiLCJkZXZpY2UiLCJzZXREZXZpY2VJZCIsInJhd0RldmljZU9TIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlT1MiLCJib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQiLCJ2YWxpZCIsImJvdGhWZXJzaW9uc0FyZVN0cmluZ3MiLCJ2ZXJzaW9uIiwidG9Mb3dlciIsIm1ham9yIiwibWlub3IiLCJndCIsImtleXMiLCJqb2luIiwic2V0RW11bGF0b3JQb3J0IiwidmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyIsImtleSIsIm5hbWUiLCJtYXRjaCIsImV4ZWMiLCJpbmRleCIsInN1YnN0cmluZyIsImdldExhdW5jaEluZm8iLCJhcHAiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXRBY3Rpdml0eSIsImFwa1BhY2thZ2UiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInJlc2V0QXBwIiwiZmFzdFJlc2V0IiwiZnVsbFJlc2V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiYXV0b0dyYW50UGVybWlzc2lvbnMiLCJhbGxvd1Rlc3RQYWNrYWdlcyIsImlzSW5zdGFsbGVkIiwiaXNBcHBJbnN0YWxsZWQiLCJmb3JjZVN0b3AiLCJpZ24iLCJvdXRwdXQiLCJjbGVhciIsInRvTG93ZXJDYXNlIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImVycm9yIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbCIsImdyYW50UGVybWlzc2lvbnMiLCJ0aW1lb3V0IiwiaW5zdGFsbEFwayIsImVuZm9yY2VBcHBJbnN0YWxsIiwiYXBwU3RhdGUiLCJ3YXNVbmluc3RhbGxlZCIsImluc3RhbGxPclVwZ3JhZGUiLCJlbmZvcmNlQ3VycmVudEJ1aWxkIiwiaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAiLCJBUFBfSU5TVEFMTF9TVEFURSIsImluc3RhbGxPdGhlckFwa3MiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwib3RoZXJBcHAiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYXBwUGFja2FnZXMiLCJmaWx0ZXJQYWNrYWdlcyIsImdldFRoaXJkUGFydHlQYWNrYWdlcyIsInBhY2thZ2VzU3RyaW5nIiwic2hlbGwiLCJhcHBQYWNrYWdlc0FycmF5Iiwic3BsaXQiLCJFT0wiLCJkaWZmZXJlbmNlIiwiZXJyIiwiaW5pdFVuaWNvZGVLZXlib2FyZCIsImRlZmF1bHRJTUUiLCJhcHBpdW1JTUUiLCJlbmFibGVJTUUiLCJzZXRJTUUiLCJzZXRNb2NrTG9jYXRpb25BcHAiLCJnZXRBcGlMZXZlbCIsInBrZ0lkcyIsImZpbGVFeGlzdHMiLCJKU09OIiwicGFyc2UiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJzcmNQYXRoIiwicGF0aCIsInBvc2l4IiwiYmFzZW5hbWUiLCJmcyIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsInB1c2hGaWxlIiwicmltcmFmIiwicmVzZXRNb2NrTG9jYXRpb24iLCJ0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZSIsInRoaXJkUGFydHlQa2dJZHMiLCJyZXN1bHRQa2dzIiwiaW50ZXJzZWN0aW9uIiwic2l6ZSIsInBrZ0lkIiwiaW5zdGFsbEhlbHBlckFwcCIsImFwa1BhdGgiLCJwYWNrYWdlSWQiLCJyZXRyeSIsInJldHJ5SW5zdGFsbEhlbHBlckFwcCIsInB1c2hTZXR0aW5nc0FwcCIsInRocm93RXJyb3IiLCJzZXR0aW5nc0Fwa1BhdGgiLCJwcm9jZXNzRXhpc3RzIiwiYXBpTGV2ZWwiLCJwZXJtcyIsIngiLCJyZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwIiwiaXNFbXVsYXRvciIsInB1c2hTdHJpbmdzIiwicmVtb3RlRGlyIiwic3RyaW5nc0pzb24iLCJyZW1vdGVGaWxlIiwicmVzb2x2ZSIsInB1bGxBcGsiLCJ0bXBEaXIiLCJpc0VtcHR5IiwiZXhpc3RzIiwic3RyaW5nc1RtcERpciIsImFwa1N0cmluZ3MiLCJsb2NhbFBhdGgiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJ1bmxvY2tXaXRoSGVscGVyQXBwIiwiZmlyc3RSdW4iLCJsYXVuY2hIZWxwZXIiLCJpc1NjcmVlbkxvY2tlZCIsImRlbGF5IiwidW5sb2NrIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwidW5sb2NrS2V5IiwidW5sb2NrU3RyYXRlZ3kiLCJ1bmxvY2tTdWNjZXNzVGltZW91dCIsInVubG9ja2VyIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJpc05pbCIsImlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQiLCJmYXN0VW5sb2NrIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwidW5sb2NrTWV0aG9kIiwicGluVW5sb2NrIiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGFzc3dvcmRVbmxvY2siLCJwYXR0ZXJuVW5sb2NrIiwiZmluZ2VycHJpbnRVbmxvY2siLCJ2ZXJpZnlVbmxvY2siLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluaXREZXZpY2UiLCJza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24iLCJsb2NhbGVTY3JpcHQiLCJ1bmljb2RlS2V5Ym9hcmQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic2tpcFVubG9jayIsIm1vY2tMb2NhdGlvbkFwcCIsInNraXBMb2djYXRDYXB0dXJlIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJ3YWl0Rm9yRGV2aWNlIiwic2hvdWxkVGhyb3dFcnJvciIsImlzVW5kZWZpbmVkIiwic3RhcnRMb2djYXQiLCJmb3JtYXQiLCJmaWx0ZXJTcGVjcyIsInJlbW92ZU51bGxQcm9wZXJ0aWVzIiwib2JqIiwiaXNOdWxsIiwidHJ1bmNhdGVEZWNpbWFscyIsIm51bWJlciIsImRpZ2l0cyIsIm11bHRpcGxpZXIiLCJNYXRoIiwicG93IiwiYWRqdXN0ZWROdW0iLCJ0cnVuY2F0ZWROdW0iLCJpc0Nocm9tZUJyb3dzZXIiLCJnZXRDaHJvbWVQa2ciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzZXNzaW9uSWQiLCJpc0Z1bmN0aW9uIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJhY3RpdmVIYW5kbGVycyIsInBhdGhuYW1lIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsInBhcnNlQXJyYXkiLCJjYXAiLCJwYXJzZWRDYXBzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJicm93c2VyTmFtZSIsImFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyIsInBvc3NpYmxlTmFtZXMiLCJzb21lIiwidGVzdCIsImJvb3RzdHJhcCIsIkJvb3RzdHJhcCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hbmRyb2lkLWhlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmV0cnksIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHBhdGggYXMgc2V0dGluZ3NBcGtQYXRoIH0gZnJvbSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmltcG9ydCBCb290c3RyYXAgZnJvbSAnLi9ib290c3RyYXAnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IEFEQiBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgdW5sb2NrZXIsIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULFxuICBQQVNTV09SRF9VTkxPQ0ssIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbn0gZnJvbSAnLi91bmxvY2staGVscGVycyc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmNvbnN0IE1PQ0tfQVBQX0lEU19TVE9SRSA9ICcvZGF0YS9sb2NhbC90bXAvbW9ja19hcHBzLmpzb24nO1xuY29uc3QgUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQgPSA5MDAwMDsgLy8gbWlsbGlzZWNvbmRzXG4vLyBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2aWNlL2FuZHJvaWRfZGV2aWNlX2luZm9fcXVlcnkuY2NcbmNvbnN0IENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkgPSB7XG4gIGNocm9tZToge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gIGNocm9taXVtOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLmNocm9tZS5zaGVsbCcsXG4gICAgYWN0aXZpdHk6ICcuQ2hyb21lU2hlbGxBY3Rpdml0eScsXG4gIH0sXG4gIGNocm9tZWJldGE6IHtcbiAgICBwa2c6ICdjb20uY2hyb21lLmJldGEnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBicm93c2VyOiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuYnJvd3NlcicsXG4gICAgYWN0aXZpdHk6ICdjb20uYW5kcm9pZC5icm93c2VyLkJyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gICdjaHJvbWl1bS1icm93c2VyJzoge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICAnY2hyb21pdW0td2Vidmlldyc6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbCcsXG4gICAgYWN0aXZpdHk6ICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbC5XZWJWaWV3QnJvd3NlckFjdGl2aXR5JyxcbiAgfSxcbiAgZGVmYXVsdDoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG59O1xuY29uc3QgU0VUVElOR1NfSEVMUEVSX1BLR19JRCA9ICdpby5hcHBpdW0uc2V0dGluZ3MnO1xuY29uc3QgU0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWSA9ICcuVW5sb2NrJztcbmNvbnN0IEVNVUxBVE9SX1BBVFRFUk4gPSAvXFxiZW11bGF0b3JcXGIvaTtcbi8vIFRoZXNlIGNvbnN0YW50cyBhcmUgaW4gc3luYyB3aXRoXG4vLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWFwcGxpY2F0aW9uc3RhdGUveGN1aWFwcGxpY2F0aW9uc3RhdGVydW5uaW5nYmFja2dyb3VuZD9sYW5ndWFnZT1vYmpjXG5jb25zdCBBUFBfU1RBVEUgPSBPYmplY3QuZnJlZXplKHtcbiAgTk9UX0lOU1RBTExFRDogMCxcbiAgTk9UX1JVTk5JTkc6IDEsXG4gIFJVTk5JTkdfSU5fQkFDS0dST1VORDogMyxcbiAgUlVOTklOR19JTl9GT1JFR1JPVU5EOiA0XG59KTtcblxuXG5mdW5jdGlvbiBlbnN1cmVOZXR3b3JrU3BlZWQgKGFkYiwgbmV0d29ya1NwZWVkKSB7XG4gIGlmIChfLnZhbHVlcyhhZGIuTkVUV09SS19TUEVFRCkuaW5jbHVkZXMobmV0d29ya1NwZWVkKSkge1xuICAgIHJldHVybiBuZXR3b3JrU3BlZWQ7XG4gIH1cbiAgbG9nZ2VyLndhcm4oYFdyb25nIG5ldHdvcmsgc3BlZWQgcGFyYW0gJyR7bmV0d29ya1NwZWVkfScsIHVzaW5nIGRlZmF1bHQ6ICR7YWRiLk5FVFdPUktfU1BFRUQuRlVMTH0uIGAgK1xuICAgIGBTdXBwb3J0ZWQgdmFsdWVzOiAke18udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKX1gKTtcbiAgcmV0dXJuIGFkYi5ORVRXT1JLX1NQRUVELkZVTEw7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBdmRBcmdzIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIG5ldHdvcmtTcGVlZCxcbiAgICBpc0hlYWRsZXNzLFxuICAgIGF2ZEFyZ3MsXG4gIH0gPSBvcHRzO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaWYgKGF2ZEFyZ3MpIHtcbiAgICBpZiAoXy5pc0FycmF5KGF2ZEFyZ3MpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5hdmRBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goLi4uKHV0aWwuc2hlbGxQYXJzZShgJHthdmRBcmdzfWApKSk7XG4gICAgfVxuICB9XG4gIGlmIChuZXR3b3JrU3BlZWQpIHtcbiAgICByZXN1bHQucHVzaCgnLW5ldHNwZWVkJywgZW5zdXJlTmV0d29ya1NwZWVkKGFkYiwgbmV0d29ya1NwZWVkKSk7XG4gIH1cbiAgaWYgKGlzSGVhZGxlc3MpIHtcbiAgICByZXN1bHQucHVzaCgnLW5vLXdpbmRvdycpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRvQ3JlZGVudGlhbFR5cGUgKHVubG9ja1R5cGUpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIFtQSU5fVU5MT0NLXTogJ3BpbicsXG4gICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogJ3BpbicsXG4gICAgW1BBU1NXT1JEX1VOTE9DS106ICdwYXNzd29yZCcsXG4gICAgW1BBVFRFUk5fVU5MT0NLXTogJ3BhdHRlcm4nLFxuICB9W3VubG9ja1R5cGVdO1xuICBpZiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayB0eXBlICcke3VubG9ja1R5cGV9JyBpcyBub3Qga25vd25gKTtcbn1cblxuXG5jb25zdCBoZWxwZXJzID0ge307XG5cbmhlbHBlcnMuY3JlYXRlQmFzZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJhc2VBREIgKG9wdHMgPSB7fSkge1xuICAvLyBmaWx0ZXIgb3V0IGFueSB1bndhbnRlZCBvcHRpb25zIHNlbnQgaW5cbiAgLy8gdGhpcyBsaXN0IHNob3VsZCBiZSB1cGRhdGVkIGFzIEFEQiB0YWtlcyBtb3JlIGFyZ3VtZW50c1xuICBjb25zdCB7XG4gICAgYWRiUG9ydCxcbiAgICBzdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgcmVtb3RlQWRiSG9zdCxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgIGFkYkV4ZWNUaW1lb3V0LFxuICAgIHVzZUtleXN0b3JlLFxuICAgIGtleXN0b3JlUGF0aCxcbiAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkLFxuICAgIHJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIGJ1aWxkVG9vbHNWZXJzaW9uLFxuICAgIGFsbG93T2ZmbGluZURldmljZXMsXG4gICAgYWxsb3dEZWxheUFkYixcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCBBREIuY3JlYXRlQURCKHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9KTtcbn07XG5cbmhlbHBlcnMucHJlcGFyZUVtdWxhdG9yID0gYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUVtdWxhdG9yIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIGF2ZCxcbiAgICBhdmRFbnY6IGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBsb2NhbGU6IGNvdW50cnksXG4gICAgYXZkTGF1bmNoVGltZW91dDogbGF1bmNoVGltZW91dCxcbiAgICBhdmRSZWFkeVRpbWVvdXQ6IHJlYWR5VGltZW91dCxcbiAgfSA9IG9wdHM7XG4gIGlmICghYXZkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbGF1bmNoIEFWRCB3aXRob3V0IEFWRCBuYW1lJyk7XG4gIH1cblxuICBjb25zdCBhdmROYW1lID0gYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gIGxldCBpc0VtdWxhdG9yUnVubmluZyA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLmdldFJ1bm5pbmdBVkRXaXRoUmV0cnkoYXZkTmFtZSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZGVidWcoYEVtdWxhdG9yICcke2F2ZE5hbWV9JyBpcyBub3QgcnVubmluZzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgaXNFbXVsYXRvclJ1bm5pbmcgPSBmYWxzZTtcbiAgfVxuICBjb25zdCBhcmdzID0gcHJlcGFyZUF2ZEFyZ3MoYWRiLCBvcHRzKTtcbiAgaWYgKGlzRW11bGF0b3JSdW5uaW5nKSB7XG4gICAgaWYgKGFyZ3MuaW5jbHVkZXMoJy13aXBlLWRhdGEnKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBLaWxsaW5nICcke2F2ZE5hbWV9JyBiZWNhdXNlIGl0IG5lZWRzIHRvIGJlIHdpcGVkIGF0IHN0YXJ0LmApO1xuICAgICAgYXdhaXQgYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOb3QgbGF1bmNoaW5nIEFWRCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgYXdhaXQgYWRiLmxhdW5jaEFWRChhdmQsIHtcbiAgICBhcmdzLFxuICAgIGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBjb3VudHJ5LFxuICAgIGxhdW5jaFRpbWVvdXQsXG4gICAgcmVhZHlUaW1lb3V0LFxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IGFuZCBlbnN1cmUgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZS4gVGhlIGxhbmd1YWdlIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gbG93ZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Miw4fS4gZS5nLiBlbiwgamEgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeSAtIENvdW50cnkuIFRoZSBjb3VudHJ5IChyZWdpb24pIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdXBwZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Mn0gfCBbMC05XXszfS4gZS5nLiBVUywgSlAgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0gez9zdHJpbmd9IHNjcmlwdCAtIFNjcmlwdC4gVGhlIHNjcmlwdCBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdGl0bGUgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17NH0uIGUuZy4gSGFucyBpbiB6aC1IYW5zLUNOIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxlZCB0byBzZXQgbG9jYWxlIHByb3Blcmx5XG4gKi9cbmhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGV2aWNlTG9jYWxlIChhZGIsIGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGlmICghXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgIV8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICBsb2dnZXIud2Fybihgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IHJlcXVpcmVzIGxhbmd1YWdlIG9yIGNvdW50cnkuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEdvdCBsYW5ndWFnZTogJyR7bGFuZ3VhZ2V9JyBhbmQgY291bnRyeTogJyR7Y291bnRyeX0nYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgYWRiLnNldERldmljZUxhbmd1YWdlQ291bnRyeShsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KTtcblxuICBpZiAoIWF3YWl0IGFkYi5lbnN1cmVDdXJyZW50TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHNjcmlwdCA/IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0sIGNvdW50cnk6ICR7Y291bnRyeX0gYW5kIHNjcmlwdDogJHtzY3JpcHR9YCA6IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0gYW5kIGNvdW50cnk6ICR7Y291bnRyeX1gO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNldCAke21lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIChvcHRzID0ge30pIHtcbiAgLy8gd2UgY2FuIGNyZWF0ZSBhIHRocm93YXdheSBBREIgaW5zdGFuY2UgaGVyZSwgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jeVxuICAvLyBvbiBpbnN0YW50aWF0aW5nIG9uIGVhcmxpZXIgKGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbm8gdWRpZClcbiAgLy8gd2UgY2FuIG9ubHkgdXNlIHRoaXMgQURCIG9iamVjdCBmb3IgY29tbWFuZHMgdGhhdCB3b3VsZCBub3QgYmUgY29uZnVzZWRcbiAgLy8gaWYgbXVsdGlwbGUgZGV2aWNlcyBhcmUgY29ubmVjdGVkXG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgbGV0IHVkaWQgPSBvcHRzLnVkaWQ7XG4gIGxldCBlbVBvcnQgPSBudWxsO1xuXG4gIC8vIGEgc3BlY2lmaWMgYXZkIG5hbWUgd2FzIGdpdmVuLiB0cnkgdG8gaW5pdGlhbGl6ZSB3aXRoIHRoYXRcbiAgaWYgKG9wdHMuYXZkKSB7XG4gICAgYXdhaXQgaGVscGVycy5wcmVwYXJlRW11bGF0b3IoYWRiLCBvcHRzKTtcbiAgICB1ZGlkID0gYWRiLmN1ckRldmljZUlkO1xuICAgIGVtUG9ydCA9IGFkYi5lbXVsYXRvclBvcnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gYXZkIGdpdmVuLiBsZXRzIHRyeSB3aGF0ZXZlcidzIHBsdWdnZWQgaW4gZGV2aWNlcy9lbXVsYXRvcnNcbiAgICBsb2dnZXIuaW5mbygnUmV0cmlldmluZyBkZXZpY2UgbGlzdCcpO1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgYWRiLmdldERldmljZXNXaXRoUmV0cnkoKTtcblxuICAgIC8vIHVkaWQgd2FzIGdpdmVuLCBsZXRzIHRyeSB0byBpbml0IHdpdGggdGhhdCBkZXZpY2VcbiAgICBpZiAodWRpZCkge1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKF8ubWFwKGRldmljZXMsICd1ZGlkJyksIHVkaWQpKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBEZXZpY2UgJHt1ZGlkfSB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBkZXZpY2VzYCk7XG4gICAgICB9XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2UgaWYgKG9wdHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICBvcHRzLnBsYXRmb3JtVmVyc2lvbiA9IGAke29wdHMucGxhdGZvcm1WZXJzaW9ufWAudHJpbSgpO1xuXG4gICAgICAvLyBhIHBsYXRmb3JtIHZlcnNpb24gd2FzIGdpdmVuLiBsZXRzIHRyeSB0byBmaW5kIGEgZGV2aWNlIHdpdGggdGhlIHNhbWUgb3NcbiAgICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbiA9IHNlbXZlci5jb2VyY2Uob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHx8IG9wdHMucGxhdGZvcm1WZXJzaW9uO1xuICAgICAgbG9nZ2VyLmluZm8oYExvb2tpbmcgZm9yIGEgZGV2aWNlIHdpdGggQW5kcm9pZCAnJHtwbGF0Zm9ybVZlcnNpb259J2ApO1xuXG4gICAgICAvLyBpbiBjYXNlIHdlIGZhaWwgdG8gZmluZCBzb21ldGhpbmcsIGdpdmUgdGhlIHVzZXIgYSB1c2VmdWwgbG9nIHRoYXQgaGFzXG4gICAgICAvLyB0aGUgZGV2aWNlIHVkaWRzIGFuZCBvcyB2ZXJzaW9ucyBzbyB0aGV5IGtub3cgd2hhdCdzIGF2YWlsYWJsZVxuICAgICAgY29uc3QgYXZhaWxEZXZpY2VzID0gW107XG4gICAgICBsZXQgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0gbnVsbDtcbiAgICAgIC8vIGZpcnN0IHRyeSBzdGFydGVkIGRldmljZXMvZW11bGF0b3JzXG4gICAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICAgIC8vIGRpcmVjdCBhZGIgY2FsbHMgdG8gdGhlIHNwZWNpZmljIGRldmljZVxuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQoZGV2aWNlLnVkaWQpO1xuICAgICAgICBjb25zdCByYXdEZXZpY2VPUyA9IGF3YWl0IGFkYi5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICAgICAgLy8gVGhlIGRldmljZSBPUyBjb3VsZCBlaXRoZXIgYmUgYSBudW1iZXIsIGxpa2UgYDYuMGBcbiAgICAgICAgLy8gb3IgYW4gYWJicmV2aWF0aW9uLCBsaWtlIGBSYFxuICAgICAgICBhdmFpbERldmljZXMucHVzaChgJHtkZXZpY2UudWRpZH0gKCR7cmF3RGV2aWNlT1N9KWApO1xuICAgICAgICBjb25zdCBkZXZpY2VPUyA9IHNlbXZlci5jb2VyY2UocmF3RGV2aWNlT1MpIHx8IHJhd0RldmljZU9TO1xuICAgICAgICBpZiAoIWRldmljZU9TKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgPSBzZW12ZXIudmFsaWQoZGV2aWNlT1MpICYmIHNlbXZlci52YWxpZChwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzID0gXy5pc1N0cmluZyhkZXZpY2VPUykgJiYgXy5pc1N0cmluZyhwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBpZiAoYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkICYmIGRldmljZU9TLnZlcnNpb24gPT09IHBsYXRmb3JtVmVyc2lvbi52ZXJzaW9uXG4gICAgICAgICAgICB8fCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzICYmIF8udG9Mb3dlcihkZXZpY2VPUykgPT09IF8udG9Mb3dlcihwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgICAgICAgLy8gR290IGFuIGV4YWN0IG1hdGNoIC0gcHJvY2VlZCBpbW1lZGlhdGVseVxuICAgICAgICAgIHVkaWQgPSBkZXZpY2UudWRpZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICghYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8gY2hlY2sgZm9yIHBhcnRpYWwgbWF0Y2ggaWYgZWl0aGVyIG9mIHZlcnNpb24gbnVtYmVycyBpcyBub3QgY29lcmNpYmxlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCFfLmluY2x1ZGVzKG9wdHMucGxhdGZvcm1WZXJzaW9uLCAnLicpICYmIHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3JcbiAgICAgICAgICAgIHx8IHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3IgJiYgcGxhdGZvcm1WZXJzaW9uLm1pbm9yID09PSBkZXZpY2VPUy5taW5vcilcbiAgICAgICAgICAgIC8vIEdvdCBhIHBhcnRpYWwgbWF0Y2ggLSBtYWtlIHN1cmUgd2UgY29uc2lkZXIgdGhlIG1vc3QgcmVjZW50XG4gICAgICAgICAgICAvLyBkZXZpY2UgdmVyc2lvbiBhdmFpbGFibGUgb24gdGhlIGhvc3Qgc3lzdGVtXG4gICAgICAgICAgICAmJiAocGFydGlhbE1hdGNoQ2FuZGlkYXRlICYmIHNlbXZlci5ndChkZXZpY2VPUywgXy52YWx1ZXMocGFydGlhbE1hdGNoQ2FuZGlkYXRlKVswXSlcbiAgICAgICAgICAgICAgICB8fCAhcGFydGlhbE1hdGNoQ2FuZGlkYXRlKSkge1xuICAgICAgICAgIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSA9IHtbZGV2aWNlLnVkaWRdOiBkZXZpY2VPU307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdWRpZCAmJiBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpIHtcbiAgICAgICAgdWRpZCA9IF8ua2V5cyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdO1xuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdWRpZCkge1xuICAgICAgICAvLyB3ZSBjb3VsZG4ndCBmaW5kIGFueXRoaW5nISBxdWl0XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBVbmFibGUgdG8gZmluZCBhbiBhY3RpdmUgZGV2aWNlIG9yIGVtdWxhdG9yIGAgK1xuICAgICAgICAgIGB3aXRoIE9TICR7b3B0cy5wbGF0Zm9ybVZlcnNpb259LiBUaGUgZm9sbG93aW5nIGFyZSBhdmFpbGFibGU6IGAgK1xuICAgICAgICAgIGF2YWlsRGV2aWNlcy5qb2luKCcsICcpKTtcbiAgICAgIH1cblxuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGEgdWRpZCB3YXMgbm90IGdpdmVuLCBncmFiIHRoZSBmaXJzdCBkZXZpY2Ugd2Ugc2VlXG4gICAgICB1ZGlkID0gZGV2aWNlc1swXS51ZGlkO1xuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmluZm8oYFVzaW5nIGRldmljZTogJHt1ZGlkfWApO1xuICByZXR1cm4ge3VkaWQsIGVtUG9ydH07XG59O1xuXG4vLyByZXR1cm5zIGEgbmV3IGFkYiBpbnN0YW5jZSB3aXRoIGRldmljZUlkIHNldFxuaGVscGVycy5jcmVhdGVBREIgPSBhc3luYyBmdW5jdGlvbiBjcmVhdGVBREIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7dWRpZCwgZW1Qb3J0fSA9IG9wdHM7XG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgYWRiLnNldERldmljZUlkKHVkaWQpO1xuICBpZiAoZW1Qb3J0KSB7XG4gICAgYWRiLnNldEVtdWxhdG9yUG9ydChlbVBvcnQpO1xuICB9XG5cbiAgcmV0dXJuIGFkYjtcbn07XG5cbmhlbHBlcnMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMgKG9wdHMpIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydhcHBQYWNrYWdlJywgJ2FwcEFjdGl2aXR5JywgJ2FwcFdhaXRQYWNrYWdlJywgJ2FwcFdhaXRBY3Rpdml0eSddKSB7XG4gICAgY29uc3QgbmFtZSA9IG9wdHNba2V5XTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gLyhbXlxcdy4qLF0pKy8uZXhlYyhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybihgQ2FwYWJpbGl0eSAnJHtrZXl9JyBpcyBleHBlY3RlZCB0byBvbmx5IGluY2x1ZGUgbGF0aW4gbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlLCBkb3QsIGNvbW1hIGFuZCBhc3RlcmlzayBjaGFyYWN0ZXJzLmApO1xuICAgIGxvZ2dlci53YXJuKGBDdXJyZW50IHZhbHVlICcke25hbWV9JyBoYXMgbm9uLW1hdGNoaW5nIGNoYXJhY3RlciBhdCBpbmRleCAke21hdGNoLmluZGV4fTogJyR7bmFtZS5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXggKyAxKX0nYCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0TGF1bmNoSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldExhdW5jaEluZm8gKGFkYiwgb3B0cykge1xuICBsZXQge2FwcCwgYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHl9ID0gb3B0cztcbiAgaWYgKCFhcHApIHtcbiAgICBsb2dnZXIud2FybignTm8gYXBwIHNlbnQgaW4sIG5vdCBwYXJzaW5nIHBhY2thZ2UvYWN0aXZpdHknKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMob3B0cyk7XG5cbiAgaWYgKGFwcFBhY2thZ2UgJiYgYXBwQWN0aXZpdHkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1BhcnNpbmcgcGFja2FnZSBhbmQgYWN0aXZpdHkgZnJvbSBhcHAgbWFuaWZlc3QnKTtcbiAgbGV0IHthcGtQYWNrYWdlLCBhcGtBY3Rpdml0eX0gPVxuICAgIGF3YWl0IGFkYi5wYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QoYXBwKTtcbiAgaWYgKGFwa1BhY2thZ2UgJiYgIWFwcFBhY2thZ2UpIHtcbiAgICBhcHBQYWNrYWdlID0gYXBrUGFja2FnZTtcbiAgfVxuICBpZiAoIWFwcFdhaXRQYWNrYWdlKSB7XG4gICAgYXBwV2FpdFBhY2thZ2UgPSBhcHBQYWNrYWdlO1xuICB9XG4gIGlmIChhcGtBY3Rpdml0eSAmJiAhYXBwQWN0aXZpdHkpIHtcbiAgICBhcHBBY3Rpdml0eSA9IGFwa0FjdGl2aXR5O1xuICB9XG4gIGlmICghYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgYXBwV2FpdEFjdGl2aXR5ID0gYXBwQWN0aXZpdHk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlOiAke2Fwa1BhY2thZ2V9LyR7YXBrQWN0aXZpdHl9YCk7XG4gIHJldHVybiB7YXBwUGFja2FnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0QWN0aXZpdHl9O1xufTtcblxuaGVscGVycy5yZXNldEFwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0QXBwIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGFwcFBhY2thZ2UsXG4gICAgZmFzdFJlc2V0LFxuICAgIGZ1bGxSZXNldCxcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlc1xuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcFBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwUGFja2FnZScgb3B0aW9uIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgY29uc3QgaXNJbnN0YWxsZWQgPSBhd2FpdCBhZGIuaXNBcHBJbnN0YWxsZWQoYXBwUGFja2FnZSk7XG5cbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFkYi5mb3JjZVN0b3AoYXBwUGFja2FnZSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIC8vIGZ1bGxSZXNldCBoYXMgcHJpb3JpdHkgb3ZlciBmYXN0UmVzZXRcbiAgICBpZiAoIWZ1bGxSZXNldCAmJiBmYXN0UmVzZXQpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5jbGVhcihhcHBQYWNrYWdlKTtcbiAgICAgIGlmIChfLmlzU3RyaW5nKG91dHB1dCkgJiYgb3V0cHV0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZhaWxlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNsZWFyIHRoZSBhcHBsaWNhdGlvbiBkYXRhIG9mICcke2FwcFBhY2thZ2V9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7b3V0cHV0fWApO1xuICAgICAgfVxuICAgICAgLy8gZXhlY3V0aW5nIGBzaGVsbCBwbSBjbGVhcmAgcmVzZXRzIHByZXZpb3VzbHkgYXNzaWduZWQgYXBwbGljYXRpb24gcGVybWlzc2lvbnMgYXMgd2VsbFxuICAgICAgaWYgKGF1dG9HcmFudFBlcm1pc3Npb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYWRiLmdyYW50QWxsUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBVbmFibGUgdG8gZ3JhbnQgcGVybWlzc2lvbnMgcmVxdWVzdGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoYFBlcmZvcm1lZCBmYXN0IHJlc2V0IG9uIHRoZSBpbnN0YWxsZWQgJyR7YXBwUGFja2FnZX0nIGFwcGxpY2F0aW9uIChzdG9wIGFuZCBjbGVhcilgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWFwcCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWl0aGVyIHByb3ZpZGUgJ2FwcCcgb3B0aW9uIHRvIGluc3RhbGwgJyR7YXBwUGFja2FnZX0nIG9yIGAgK1xuICAgICAgYGNvbnNpZGVyIHNldHRpbmcgJ25vUmVzZXQnIHRvICd0cnVlJyBpZiAnJHthcHBQYWNrYWdlfScgaXMgc3VwcG9zZWQgdG8gYmUgcHJlaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBSdW5uaW5nIGZ1bGwgcmVzZXQgb24gJyR7YXBwUGFja2FnZX0nIChyZWluc3RhbGwpYCk7XG4gIGlmIChpc0luc3RhbGxlZCkge1xuICAgIGF3YWl0IGFkYi51bmluc3RhbGxBcGsoYXBwUGFja2FnZSk7XG4gIH1cbiAgYXdhaXQgYWRiLmluc3RhbGwoYXBwLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICB9KTtcbn07XG5cbmhlbHBlcnMuaW5zdGFsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGsgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcCB8fCAhYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHAnIGFuZCAnYXBwUGFja2FnZScgb3B0aW9ucyBhcmUgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoZnVsbFJlc2V0KSB7XG4gICAgYXdhaXQgdGhpcy5yZXNldEFwcChhZGIsIG9wdHMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBhcHBTdGF0ZSxcbiAgICB3YXNVbmluc3RhbGxlZFxuICB9ID0gYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBwLCBhcHBQYWNrYWdlLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VDdXJyZW50QnVpbGQ6IGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9KTtcblxuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IHRoZSBuZXdseSBpbnN0YWxsZWQgYXBwXG4gIGNvbnN0IGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwID0gIXdhc1VuaW5zdGFsbGVkXG4gICAgJiYgYXBwU3RhdGUgIT09IGFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICBpZiAoZmFzdFJlc2V0ICYmIGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwKSB7XG4gICAgbG9nZ2VyLmluZm8oYFBlcmZvcm1pbmcgZmFzdCByZXNldCBvbiAnJHthcHBQYWNrYWdlfSdgKTtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdGFsbHMgYW4gYXJyYXkgb2YgYXBrc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0cyBkZWZpbmVkIGluIGRyaXZlci5qc1xuICovXG5oZWxwZXJzLmluc3RhbGxPdGhlckFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsT3RoZXJBcGtzIChvdGhlckFwcHMsIGFkYiwgb3B0cykge1xuICBsZXQge1xuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIC8vIEluc3RhbGwgYWxsIG9mIHRoZSBBUEsncyBhc3luY2hyb25vdXNseVxuICBhd2FpdCBCLmFsbChvdGhlckFwcHMubWFwKChvdGhlckFwcCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgSW5zdGFsbGluZyBhcHA6ICR7b3RoZXJBcHB9YCk7XG4gICAgcmV0dXJuIGFkYi5pbnN0YWxsT3JVcGdyYWRlKG90aGVyQXBwLCBudWxsLCB7XG4gICAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIH0pO1xuICB9KSk7XG59O1xuXG4vKipcbiAqIFVuaW5zdGFsbCBhbiBhcnJheSBvZiBwYWNrYWdlc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcHBQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlIG5hbWVzIHRvIHVuaW5zdGFsbC4gSWYgdGhpcyBpbmNsdWRlcyBgJyonYCwgdW5pbnN0YWxsIGFsbCBvZiAzcmQgcGFydHkgYXBwc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlcyBkb2VzIG5vdCB1bmluc3RhbGwgd2hlbiBgKmAgaXMgcHJvdmlkZWQgYXMgYGFwcFBhY2thZ2VzYFxuICovXG5oZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGxPdGhlclBhY2thZ2VzIChhZGIsIGFwcFBhY2thZ2VzLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIGlmIChhcHBQYWNrYWdlcy5pbmNsdWRlcygnKicpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdVbmluc3RhbGwgdGhpcmQgcGFydHkgcGFja2FnZXMnKTtcbiAgICBhcHBQYWNrYWdlcyA9IGF3YWl0IHRoaXMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzKGFkYiwgZmlsdGVyUGFja2FnZXMpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBVbmluc3RhbGxpbmcgcGFja2FnZXM6ICR7YXBwUGFja2FnZXN9YCk7XG4gIGF3YWl0IEIuYWxsKGFwcFBhY2thZ2VzLm1hcCgoYXBwUGFja2FnZSkgPT4gYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKSkpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhpcmQgcGFydHkgcGFja2FnZXMgZmlsdGVyZWQgd2l0aCBgZmlsdGVyUGFja2FnZXNgXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXkgb2YgaW5zdGFsbGVkIHRoaXJkIHBhcnkgcGFja2FnZXNcbiAqL1xuaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRUaGlyZFBhcnR5UGFja2FnZXMgKGFkYiwgZmlsdGVyUGFja2FnZXMgPSBbXSkge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VzU3RyaW5nID0gYXdhaXQgYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsICctMyddKTtcbiAgICBjb25zdCBhcHBQYWNrYWdlc0FycmF5ID0gcGFja2FnZXNTdHJpbmcudHJpbSgpLnJlcGxhY2UoL3BhY2thZ2U6L2csICcnKS5zcGxpdChFT0wpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJyR7YXBwUGFja2FnZXNBcnJheX0nIGZpbHRlcmVkIHdpdGggJyR7ZmlsdGVyUGFja2FnZXN9J2ApO1xuICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXBwUGFja2FnZXNBcnJheSwgZmlsdGVyUGFja2FnZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIGdldCBwYWNrYWdlcyB3aXRoICdhZGIgc2hlbGwgcG0gbGlzdCBwYWNrYWdlcyAtMyc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5oZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBpbml0VW5pY29kZUtleWJvYXJkIChhZGIpIHtcbiAgbG9nZ2VyLmRlYnVnKCdFbmFibGluZyBVbmljb2RlIGtleWJvYXJkIHN1cHBvcnQnKTtcblxuICAvLyBnZXQgdGhlIGRlZmF1bHQgSU1FIHNvIHdlIGNhbiByZXR1cm4gYmFjayB0byBpdCBsYXRlciBpZiB3ZSB3YW50XG4gIGxldCBkZWZhdWx0SU1FID0gYXdhaXQgYWRiLmRlZmF1bHRJTUUoKTtcblxuICBsb2dnZXIuZGVidWcoYFVuc2V0dGluZyBwcmV2aW91cyBJTUUgJHtkZWZhdWx0SU1FfWApO1xuICBjb25zdCBhcHBpdW1JTUUgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8uVW5pY29kZUlNRWA7XG4gIGxvZ2dlci5kZWJ1ZyhgU2V0dGluZyBJTUUgdG8gJyR7YXBwaXVtSU1FfSdgKTtcbiAgYXdhaXQgYWRiLmVuYWJsZUlNRShhcHBpdW1JTUUpO1xuICBhd2FpdCBhZGIuc2V0SU1FKGFwcGl1bUlNRSk7XG4gIHJldHVybiBkZWZhdWx0SU1FO1xufTtcblxuaGVscGVycy5zZXRNb2NrTG9jYXRpb25BcHAgPSBhc3luYyBmdW5jdGlvbiBzZXRNb2NrTG9jYXRpb25BcHAgKGFkYiwgYXBwKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcxJ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgYXBwLCAnYW5kcm9pZDptb2NrX2xvY2F0aW9uJywgJ2FsbG93J10pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzZXQgbW9jayBsb2NhdGlvbiBmb3IgYXBwICcke2FwcH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGxldCBwa2dJZHMgPSBbXTtcbiAgICBpZiAoYXdhaXQgYWRiLmZpbGVFeGlzdHMoTU9DS19BUFBfSURTX1NUT1JFKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGtnSWRzID0gSlNPTi5wYXJzZShhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCBNT0NLX0FQUF9JRFNfU1RPUkVdKSk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIGlmIChwa2dJZHMuaW5jbHVkZXMoYXBwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwa2dJZHMucHVzaChhcHApO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5wb3NpeC5qb2luKHRtcFJvb3QsIHBhdGgucG9zaXguYmFzZW5hbWUoTU9DS19BUFBfSURTX1NUT1JFKSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShzcmNQYXRoLCBKU09OLnN0cmluZ2lmeShwa2dJZHMpLCAndXRmOCcpO1xuICAgICAgYXdhaXQgYWRiLnB1c2hGaWxlKHNyY1BhdGgsIE1PQ0tfQVBQX0lEU19TVE9SRSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHBlcnNpc3QgbW9jayBsb2NhdGlvbiBhcHAgaWQgJyR7YXBwfSc6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLnJlc2V0TW9ja0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gcmVzZXRNb2NrTG9jYXRpb24gKGFkYikge1xuICB0cnkge1xuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCAnc2VjdXJlJywgJ21vY2tfbG9jYXRpb24nLCAnMCddKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZSA9IGhlbHBlcnMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzKGFkYik7XG4gICAgbGV0IHBrZ0lkcyA9IFtdO1xuICAgIGlmIChhd2FpdCBhZGIuZmlsZUV4aXN0cyhNT0NLX0FQUF9JRFNfU1RPUkUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwa2dJZHMgPSBKU09OLnBhcnNlKGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsIE1PQ0tfQVBQX0lEU19TVE9SRV0pKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgY29uc3QgdGhpcmRQYXJ0eVBrZ0lkcyA9IGF3YWl0IHRoaXJkUGFydHlQa2dJZHNQcm9taXNlO1xuICAgIC8vIE9ubHkgaW5jbHVkZSBjdXJyZW50bHkgaW5zdGFsbGVkIHBhY2thZ2VzXG4gICAgY29uc3QgcmVzdWx0UGtncyA9IF8uaW50ZXJzZWN0aW9uKHBrZ0lkcywgdGhpcmRQYXJ0eVBrZ0lkcyk7XG4gICAgaWYgKF8uc2l6ZShyZXN1bHRQa2dzKSA8PSAxKSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgcmVzdWx0UGtnc1swXSA/PyBTRVRUSU5HU19IRUxQRVJfUEtHX0lELCAnYW5kcm9pZDptb2NrX2xvY2F0aW9uJywgJ2RlbnknXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKGBSZXNldHRpbmcgbW9ja19sb2NhdGlvbiBwZXJtaXNzaW9uIGZvciB0aGUgZm9sbG93aW5nIGFwcHM6ICR7cmVzdWx0UGtnc31gKTtcbiAgICBhd2FpdCBCLmFsbChyZXN1bHRQa2dzLm1hcCgocGtnSWQpID0+IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgcGtnSWQsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnZGVueSddKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9KSgpKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcmVzZXQgbW9jayBsb2NhdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5pbnN0YWxsSGVscGVyQXBwID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEhlbHBlckFwcCAoYWRiLCBhcGtQYXRoLCBwYWNrYWdlSWQpIHtcbiAgLy8gU29tZXRpbWVzIGFkYiBwdXNoIG9yIGFkYiBpbnN0YWwgdGFrZSBtb3JlIHRpbWUgdGhhbiBleHBlY3RlZCB0byBpbnN0YWxsIGFuIGFwcFxuICAvLyBlLmcuIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vaW8uYXBwaXVtLnNldHRpbmdzL2lzc3Vlcy80MCNpc3N1ZWNvbW1lbnQtNDc2NTkzMTc0XG4gIGF3YWl0IHJldHJ5KDIsIGFzeW5jIGZ1bmN0aW9uIHJldHJ5SW5zdGFsbEhlbHBlckFwcCAoKSB7XG4gICAgYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBrUGF0aCwgcGFja2FnZUlkLCB7Z3JhbnRQZXJtaXNzaW9uczogdHJ1ZX0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogUHVzaGVzIGFuZCBpbnN0YWxscyBpby5hcHBpdW0uc2V0dGluZ3MgYXBwLlxuICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzZXR0aW5nIGFwcCBpcyByZXF1aXJlZFxuICpcbiAqIEBwYXJhbSB7QWRifSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gRHJpdmVyIG9wdGlvbnMgZGljdGlvbmFyeS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdGhyb3dFcnJvciBbZmFsc2VdIC0gV2hldGhlciB0aHJvdyBhbiBlcnJvciBpZiBTZXR0aW5ncyBhcHAgZmFpbHMgdG8gc3RhcnRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aHJvd0Vycm9yIGlzIHRydWUgYW5kIHNvbWV0aGluZyBoYXBwZW5zIGluIGluc3RhbGxhdGlvbiBzdGVwXG4gKi9cbmhlbHBlcnMucHVzaFNldHRpbmdzQXBwID0gYXN5bmMgZnVuY3Rpb24gcHVzaFNldHRpbmdzQXBwIChhZGIsIHRocm93RXJyb3IgPSBmYWxzZSwgb3B0cyA9IHt9KSB7XG4gIGxvZ2dlci5kZWJ1ZygnUHVzaGluZyBzZXR0aW5ncyBhcGsgdG8gZGV2aWNlLi4uJyk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBoZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAoYWRiLCBzZXR0aW5nc0Fwa1BhdGgsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHRocm93RXJyb3IpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGBJZ25vcmVkIGVycm9yIHdoaWxlIGluc3RhbGxpbmcgJyR7c2V0dGluZ3NBcGtQYXRofSc6IGAgK1xuICAgICAgICAgICAgICAgIGAnJHtlcnIubWVzc2FnZX0nLiBGZWF0dXJlcyB0aGF0IHJlbHkgb24gdGhpcyBoZWxwZXIgYCArXG4gICAgICAgICAgICAgICAgJ3JlcXVpcmUgdGhlIGFwayBzdWNoIGFzIHRvZ2dsZSBXaUZpIGFuZCBnZXR0aW5nIGxvY2F0aW9uICcgK1xuICAgICAgICAgICAgICAgICd3aWxsIHJhaXNlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gdXNlIHRoZW0uJyk7XG4gIH1cblxuICAvLyBSZWluc3RhbGwgd291bGQgc3RvcCB0aGUgc2V0dGluZ3MgaGVscGVyIHByb2Nlc3MgYW55d2F5LCBzb1xuICAvLyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBzdGlsbCBydW5uaW5nXG4gIGlmIChhd2FpdCBhZGIucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfUEtHX0lEKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfSBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRzIHBlcm1pc3Npb25zLmApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmIChhcGlMZXZlbCA+PSAyOSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vaW8uYXBwaXVtLnNldHRpbmdzI2ludGVybmFsLWF1ZGlvLS12aWRlby1yZWNvcmRpbmdcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdQUk9KRUNUX01FRElBJywgJ2FsbG93J10pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgfVxuICB9XG4gIGlmIChhcGlMZXZlbCA8PSAyMykgeyAvLyBBbmRyb2lkIDYtIGRldmljZXMgc2hvdWxkIGhhdmUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3B1bGwvMTE2NDAjaXNzdWVjb21tZW50LTQzODI2MDQ3N1xuICAgIGNvbnN0IHBlcm1zID0gWydTRVRfQU5JTUFUSU9OX1NDQUxFJywgJ0NIQU5HRV9DT05GSUdVUkFUSU9OJywgJ0FDQ0VTU19GSU5FX0xPQ0FUSU9OJ107XG4gICAgbG9nZ2VyLmluZm8oYEdyYW50aW5nIHBlcm1pc3Npb25zICR7cGVybXN9IHRvICcke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9J2ApO1xuICAgIGF3YWl0IGFkYi5ncmFudFBlcm1pc3Npb25zKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIHBlcm1zLm1hcCgoeCkgPT4gYGFuZHJvaWQucGVybWlzc2lvbi4ke3h9YCkpO1xuICB9XG5cbiAgLy8gbGF1bmNoIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAgZHVlIHRvIHNldHRpbmdzIGZhaWxpbmcgdG8gYmUgc2V0XG4gIC8vIGlmIHRoZSBhcHAgaXMgbm90IGxhdW5jaGVkIHByaW9yIHRvIHN0YXJ0IHRoZSBzZXNzaW9uIG9uIGFuZHJvaWQgNytcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy84OTU3XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLnJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAoe1xuICAgICAgdGltZW91dDogaGVscGVycy5pc0VtdWxhdG9yKGFkYiwgb3B0cykgPyAzMDAwMCA6IDUwMDBcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGVycik7XG4gICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogRXh0cmFjdHMgc3RyaW5nLnhtbCBhbmQgY29udmVydHMgaXQgdG8gc3RyaW5nLmpzb24gYW5kIHB1c2hlc1xuICogaXQgdG8gL2RhdGEvbG9jYWwvdG1wL3N0cmluZy5qc29uIG9uIGZvciB1c2Ugb2YgYm9vdHN0cmFwXG4gKiBJZiBhcHAgaXMgbm90IHByZXNlbnQgdG8gZXh0cmFjdCBzdHJpbmcueG1sIGl0IGRlbGV0ZXMgcmVtb3RlIHN0cmluZ3MuanNvblxuICogSWYgYXBwIGRvZXMgbm90IGhhdmUgc3RyaW5ncy54bWwgd2UgcHVzaCBhbiBlbXB0eSBqc29uIG9iamVjdCB0byByZW1vdGVcbiAqXG4gKiBAcGFyYW0gez9zdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UgYWJicmV2aWF0aW9uLCBmb3IgZXhhbXBsZSAnZnInLiBUaGUgZGVmYXVsdCBsYW5ndWFnZVxuICogaXMgdXNlZCBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBkZWZpbmVkLlxuICogQHBhcmFtIHtPYmplY3R9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHJldHVybnMge09iamVjdH0gVGhlIGRpY3Rpb25hcnksIHdoZXJlIHN0cmluZyByZXNvdXJjZSBpZGVudGlmaWVycyBhcmUga2V5c1xuICogYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlIG9yIGFuIGVtcHR5IG9iamVjdFxuICogaWYgbm8gbWF0Y2hpbmcgcmVzb3VyY2VzIHdlcmUgZXh0cmFjdGVkLlxuICovXG5oZWxwZXJzLnB1c2hTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gcHVzaFN0cmluZ3MgKGxhbmd1YWdlLCBhZGIsIG9wdHMpIHtcbiAgY29uc3QgcmVtb3RlRGlyID0gJy9kYXRhL2xvY2FsL3RtcCc7XG4gIGNvbnN0IHN0cmluZ3NKc29uID0gJ3N0cmluZ3MuanNvbic7XG4gIGNvbnN0IHJlbW90ZUZpbGUgPSBwYXRoLnBvc2l4LnJlc29sdmUocmVtb3RlRGlyLCBzdHJpbmdzSnNvbik7XG5cbiAgLy8gY2xlYW4gdXAgcmVtb3RlIHN0cmluZy5qc29uIGlmIHByZXNlbnRcbiAgYXdhaXQgYWRiLnJpbXJhZihyZW1vdGVGaWxlKTtcblxuICBsZXQgYXBwO1xuICB0cnkge1xuICAgIGFwcCA9IG9wdHMuYXBwIHx8IGF3YWl0IGFkYi5wdWxsQXBrKG9wdHMuYXBwUGFja2FnZSwgb3B0cy50bXBEaXIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuaW5mbyhgRmFpbGVkIHRvIHB1bGwgYW4gYXBrIGZyb20gJyR7b3B0cy5hcHBQYWNrYWdlfScgdG8gJyR7b3B0cy50bXBEaXJ9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KG9wdHMuYXBwUGFja2FnZSkgfHwgIShhd2FpdCBmcy5leGlzdHMoYXBwKSkpIHtcbiAgICBsb2dnZXIuZGVidWcoYE5vIGFwcCBvciBwYWNrYWdlIHNwZWNpZmllZC4gUmV0dXJuaW5nIGVtcHR5IHN0cmluZ3NgKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBzdHJpbmdzVG1wRGlyID0gcGF0aC5yZXNvbHZlKG9wdHMudG1wRGlyLCBvcHRzLmFwcFBhY2thZ2UpO1xuICB0cnkge1xuICAgIGxvZ2dlci5kZWJ1ZygnRXh0cmFjdGluZyBzdHJpbmdzIGZyb20gYXBrJywgYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgY29uc3Qge2Fwa1N0cmluZ3MsIGxvY2FsUGF0aH0gPSBhd2FpdCBhZGIuZXh0cmFjdFN0cmluZ3NGcm9tQXBrKGFwcCwgbGFuZ3VhZ2UsIHN0cmluZ3NUbXBEaXIpO1xuICAgIGF3YWl0IGFkYi5wdXNoKGxvY2FsUGF0aCwgcmVtb3RlRGlyKTtcbiAgICByZXR1cm4gYXBrU3RyaW5ncztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYENvdWxkIG5vdCBnZXQgc3RyaW5ncywgY29udGludWluZyBhbnl3YXkuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGF3YWl0IGFkYi5zaGVsbCgnZWNobycsIFtgJ3t9JyA+ICR7cmVtb3RlRmlsZX1gXSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHN0cmluZ3NUbXBEaXIpO1xuICB9XG4gIHJldHVybiB7fTtcbn07XG5cbmhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcCA9IGFzeW5jIGZ1bmN0aW9uIHVubG9ja1dpdGhIZWxwZXJBcHAgKGFkYikge1xuICBsb2dnZXIuaW5mbygnVW5sb2NraW5nIHNjcmVlbicpO1xuXG4gIC8vIFVubG9jayBzdWNjZWVkIHdpdGggYSBjb3VwbGUgb2YgcmV0cmllcy5cbiAgbGV0IGZpcnN0UnVuID0gdHJ1ZTtcbiAgYXdhaXQgcmV0cnkoMywgYXN5bmMgZnVuY3Rpb24gbGF1bmNoSGVscGVyICgpIHtcbiAgICAvLyBUbyByZWR1Y2UgYSB0aW1lIHRvIGNhbGwgYWRiLmlzU2NyZWVuTG9ja2VkKCkgc2luY2UgYGFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd2AgaXMgZWFzeSB0byBoYW5nIGFkYiBjb21tYW5kc1xuICAgIGlmIChmaXJzdFJ1bikge1xuICAgICAgZmlyc3RSdW4gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBFcnJvciBpbiBpc1NjcmVlbkxvY2tlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdcImFkYiBzaGVsbCBkdW1wc3lzIHdpbmRvd1wiIGNvbW1hbmQgaGFzIHRpbWVkIG91dC4nKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1RoZSByZWFzb24gb2YgdGhpcyB0aW1lb3V0IGlzIHRoZSBkZWxheWVkIGFkYiByZXNwb25zZS4gUmVzZXR0aW5nIGFkYiBzZXJ2ZXIgY2FuIGltcHJvdmUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYExhdW5jaGluZyAke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFtcbiAgICAgICdhbScsICdzdGFydCcsXG4gICAgICAnLW4nLCBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8ke1NFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFl9YCxcbiAgICAgICctYycsICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUicsXG4gICAgICAnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgICAgJy1mJywgJzB4MTAyMDAwMDAnLFxuICAgIF0pO1xuICAgIGF3YWl0IEIuZGVsYXkoMTAwMCk7XG4gIH0pO1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZygnU2NyZWVuIGlzIGxvY2tlZCwgdHJ5aW5nIHRvIHVubG9jaycpO1xuXG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIud2FybignVXNpbmcgYXBwIHVubG9jaywgdGhpcyBpcyBnb2luZyB0byBiZSBkZXByZWNhdGVkIScpO1xuICAgIGF3YWl0IGhlbHBlcnMudW5sb2NrV2l0aEhlbHBlckFwcChhZGIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLndhaXRGb3JEZXZpY2UoKTtcbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvciwgb3B0cyk7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpKSB7XG4gICAgaWYgKG1vY2tMb2NhdGlvbkFwcCB8fCBfLmlzVW5kZWZpbmVkKG1vY2tMb2NhdGlvbkFwcCkpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0TW9ja0xvY2F0aW9uKGFkYik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBNEI7QUFBQTtBQUU1QixNQUFNQSxrQkFBa0IsR0FBRyxnQ0FBZ0M7QUFDM0QsTUFBTUMsdUJBQXVCLEdBQUcsS0FBSztBQUVyQyxNQUFNQywrQkFBK0IsR0FBRztFQUN0Q0MsTUFBTSxFQUFFO0lBQ05DLEdBQUcsRUFBRSxvQkFBb0I7SUFDekJDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREMsUUFBUSxFQUFFO0lBQ1JGLEdBQUcsRUFBRSwyQkFBMkI7SUFDaENDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREUsVUFBVSxFQUFFO0lBQ1ZILEdBQUcsRUFBRSxpQkFBaUI7SUFDdEJDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREcsT0FBTyxFQUFFO0lBQ1BKLEdBQUcsRUFBRSxxQkFBcUI7SUFDMUJDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRCxrQkFBa0IsRUFBRTtJQUNsQkQsR0FBRyxFQUFFLHFCQUFxQjtJQUMxQkMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNELGtCQUFrQixFQUFFO0lBQ2xCRCxHQUFHLEVBQUUsNEJBQTRCO0lBQ2pDQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RJLE9BQU8sRUFBRTtJQUNQTCxHQUFHLEVBQUUsb0JBQW9CO0lBQ3pCQyxRQUFRLEVBQUU7RUFDWjtBQUNGLENBQUM7QUFDRCxNQUFNSyxzQkFBc0IsR0FBRyxvQkFBb0I7QUFBQztBQUNwRCxNQUFNQywrQkFBK0Is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