appium 2.0.0-beta.44 → 2.0.0-beta.45

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 (70) hide show
  1. package/build/lib/appium.d.ts +137 -14
  2. package/build/lib/appium.d.ts.map +1 -1
  3. package/build/lib/appium.js +5 -5
  4. package/build/lib/appium.js.map +1 -0
  5. package/build/lib/cli/args.js +3 -3
  6. package/build/lib/cli/args.js.map +1 -0
  7. package/build/lib/cli/driver-command.js +3 -3
  8. package/build/lib/cli/driver-command.js.map +1 -0
  9. package/build/lib/cli/extension-command.js +3 -3
  10. package/build/lib/cli/extension-command.js.map +1 -0
  11. package/build/lib/cli/extension.js +3 -3
  12. package/build/lib/cli/extension.js.map +1 -0
  13. package/build/lib/cli/parser.js +3 -3
  14. package/build/lib/cli/parser.js.map +1 -0
  15. package/build/lib/cli/plugin-command.js +3 -3
  16. package/build/lib/cli/plugin-command.js.map +1 -0
  17. package/build/lib/cli/utils.js +3 -3
  18. package/build/lib/cli/utils.js.map +1 -0
  19. package/build/lib/config-file.js +3 -3
  20. package/build/lib/config-file.js.map +1 -0
  21. package/build/lib/config.js +3 -3
  22. package/build/lib/config.js.map +1 -0
  23. package/build/lib/constants.js +3 -3
  24. package/build/lib/constants.js.map +1 -0
  25. package/build/lib/extension/driver-config.d.ts +3 -2
  26. package/build/lib/extension/driver-config.d.ts.map +1 -1
  27. package/build/lib/extension/driver-config.js +3 -3
  28. package/build/lib/extension/driver-config.js.map +1 -0
  29. package/build/lib/extension/extension-config.js +3 -3
  30. package/build/lib/extension/extension-config.js.map +1 -0
  31. package/build/lib/extension/index.js +3 -3
  32. package/build/lib/extension/index.js.map +1 -0
  33. package/build/lib/extension/manifest.d.ts +1 -2
  34. package/build/lib/extension/manifest.d.ts.map +1 -1
  35. package/build/lib/extension/manifest.js +35 -30
  36. package/build/lib/extension/manifest.js.map +1 -0
  37. package/build/lib/extension/package-changed.js +3 -3
  38. package/build/lib/extension/package-changed.js.map +1 -0
  39. package/build/lib/extension/plugin-config.js +3 -3
  40. package/build/lib/extension/plugin-config.js.map +1 -0
  41. package/build/lib/grid-register.js +3 -3
  42. package/build/lib/grid-register.js.map +1 -0
  43. package/build/lib/logger.js.map +1 -0
  44. package/build/lib/logsink.js +3 -3
  45. package/build/lib/logsink.js.map +1 -0
  46. package/build/lib/main.js +3 -3
  47. package/build/lib/main.js.map +1 -0
  48. package/build/lib/schema/arg-spec.js +3 -3
  49. package/build/lib/schema/arg-spec.js.map +1 -0
  50. package/build/lib/schema/cli-args.js +3 -3
  51. package/build/lib/schema/cli-args.js.map +1 -0
  52. package/build/lib/schema/cli-transformers.d.ts +1 -1
  53. package/build/lib/schema/cli-transformers.d.ts.map +1 -1
  54. package/build/lib/schema/cli-transformers.js +23 -18
  55. package/build/lib/schema/cli-transformers.js.map +1 -0
  56. package/build/lib/schema/index.js.map +1 -0
  57. package/build/lib/schema/keywords.js.map +1 -0
  58. package/build/lib/schema/schema.js +3 -3
  59. package/build/lib/schema/schema.js.map +1 -0
  60. package/build/lib/utils.d.ts +288 -27
  61. package/build/lib/utils.d.ts.map +1 -1
  62. package/build/lib/utils.js +7 -35
  63. package/build/lib/utils.js.map +1 -0
  64. package/build/tsconfig.tsbuildinfo +1 -1
  65. package/lib/appium.js +27 -18
  66. package/lib/extension/driver-config.js +2 -1
  67. package/lib/extension/manifest.js +49 -32
  68. package/lib/schema/cli-transformers.js +27 -24
  69. package/lib/utils.js +87 -66
  70. package/package.json +16 -15
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -25,6 +23,8 @@ var _extensionConfig = require("../extension/extension-config");
25
23
 
26
24
  var _packageChanged = require("../extension/package-changed");
27
25
 
26
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
+
28
28
  const UPDATE_ALL = 'installed';
29
29
 
30
30
  class NotUpdatableError extends Error {}
@@ -532,4 +532,4 @@ class ExtensionCommand {
532
532
  exports.ExtensionCommand = ExtensionCommand;
533
533
  var _default = ExtensionCommand;
534
534
  exports.default = _default;
535
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUERBVEVfQUxMIiwiTm90VXBkYXRhYmxlRXJyb3IiLCJFcnJvciIsIk5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIiwiRXh0ZW5zaW9uQ29tbWFuZCIsImNvbmZpZyIsImtub3duRXh0ZW5zaW9ucyIsImlzSnNvbk91dHB1dCIsImNvbnN0cnVjdG9yIiwianNvbiIsImxvZyIsImNvbnNvbGUiLCJDbGlDb25zb2xlIiwianNvbk1vZGUiLCJCb29sZWFuIiwidHlwZSIsImV4dGVuc2lvblR5cGUiLCJfY3JlYXRlRmF0YWxFcnJvciIsIm1lc3NhZ2UiLCJkZWNvcmF0ZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJzcGluV2l0aCIsImV4dCIsImRhdGEiLCJ0b1BhaXJzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwidXBkYXRlcyIsImNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIiwidXBkYXRlVmVyc2lvbiIsInNhZmVVcGRhdGUiLCJ1bnNhZmVVcGRhdGVWZXJzaW9uIiwidW5zYWZlVXBkYXRlIiwidXBUb0RhdGUiLCJsaXN0RGF0YSIsImluc3RhbGxUeHQiLCJncmV5IiwidXBkYXRlVHh0IiwidXBUb0RhdGVUeHQiLCJ1bnNhZmVVcGRhdGVUeHQiLCJpbnN0YWxsU3BlYyIsInZlcnNpb24iLCJ0eXBlVHh0IiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJ5ZWxsb3ciLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJtYWdlbnRhIiwiZ3JlZW4iLCJjeWFuIiwiX2luc3RhbGwiLCJwYWNrYWdlTmFtZSIsImV4dERhdGEiLCJpbnN0YWxsT3B0cyIsInByb2JhYmxlRXh0TmFtZSIsInNwbGl0IiwibGVuZ3RoIiwicmVwbGFjZSIsInBrZ1ZlciIsInBhdGgiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInNwbGl0cyIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0luc3RhbGxlZCIsImluc3RhbGxWaWFOcG0iLCJleHROYW1lIiwiZXh0TWFuaWZlc3QiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsIkIiLCJhbGwiLCJnZXRQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJ3YXJuaW5nU3VtbWFyaWVzIiwiZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyIsImlzRW1wdHkiLCJqb2luIiwid2FybiIsImFkZEV4dGVuc2lvbiIsImVudiIsImhhc0FwcGl1bURlcGVuZGVuY3kiLCJhcHBpdW1Ib21lIiwicGFja2FnZURpZENoYW5nZSIsImluZm8iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJucG1TcGVjIiwic3BlY01zZyIsInBrZ0pzb25EYXRhIiwibnBtIiwiaW5zdGFsbFBhY2thZ2UiLCJ2YWxpZGF0ZVBhY2thZ2VKc29uIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwiZXJyIiwicGtnSnNvbiIsImFwcGl1bSIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZXN1bHQiLCJhcHBpdW1WZXJzaW9uIiwiY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IiLCJmaWVsZCIsIlJlZmVyZW5jZUVycm9yIiwidmFsaWRhdGVFeHRlbnNpb25GaWVsZHMiLCJleHRNZXRhZGF0YSIsIl91bmluc3RhbGwiLCJ1bmluc3RhbGxQYWNrYWdlIiwicmVtb3ZlRXh0ZW5zaW9uIiwib2siLCJfdXBkYXRlIiwidW5zYWZlIiwic2hvdWxkVXBkYXRlQWxsIiwiZXh0c1RvVXBkYXRlIiwiZSIsInVwZGF0ZSIsImN1cnJlbnQiLCJ1cGRhdGVWZXIiLCJ1cGRhdGVFeHRlbnNpb24iLCJmcm9tIiwidG8iLCJlcnJvciIsInJlZCIsImdldExhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24iLCJ1dGlsIiwiY29tcGFyZVZlcnNpb25zIiwiX3J1biIsInNjcmlwdE5hbWUiLCJleHRyYUFyZ3MiLCJleHRDb25maWciLCJzY3JpcHRzIiwiZXh0U2NyaXB0cyIsImlzUGxhaW5PYmplY3QiLCJoYXMiLCJydW5uZXIiLCJTdWJQcm9jZXNzIiwicHJvY2VzcyIsImV4ZWNQYXRoIiwiY3dkIiwiZ2V0SW5zdGFsbFBhdGgiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0IiwiZ2V0QnVmZiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtucG0sIHV0aWwsIGVudiwgY29uc29sZX0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7c3BpbldpdGgsIFJpbmdCdWZmZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgSU5TVEFMTF9UWVBFX05QTSxcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxufSBmcm9tICcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge3BhY2thZ2VEaWRDaGFuZ2V9IGZyb20gJy4uL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0tub3duRXh0ZW5zaW9uczxFeHRUeXBlPn1cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZywganNvbn0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmxvZyA9IG5ldyBjb25zb2xlLkNsaUNvbnNvbGUoe2pzb25Nb2RlOiBqc29ufSk7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBCb29sZWFuKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmV4dGVuc2lvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIG1lc3NhZ2UgYW5kIHJldHVybnMgYW4ge0BsaW5rY29kZSBFcnJvcn0gdG8gdGhyb3cuXG4gICAqXG4gICAqIEZvciBUUyB0byB1bmRlcnN0YW5kIHRoYXQgYSBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBtdXN0IGFjdHVhbGx5IHRocm93IGFuIGV4Y2VwdGlvbi0tXG4gICAqIGluIG90aGVyIHdvcmRzLCBfY2FsbGluZ18gYSBmdW5jdGlvbiB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpcyBub3QgZW5vdWdoLS1cbiAgICogbm9yIGlzIHNvbWV0aGluZyBsaWtlIGBAcmV0dXJucyB7bmV2ZXJ9YCB3aGljaCBkb2VzIG5vdCBpbXBseSBhIHRocm93biBleGNlcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJldHVybnMge0Vycm9yfVxuICAgKi9cbiAgX2NyZWF0ZUZhdGFsRXJyb3IobWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IodGhpcy5sb2cuZGVjb3JhdGUobWVzc2FnZSwgJ2Vycm9yJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXNbY21kXSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKFxuICAgICAgKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgYWNjW25hbWVdID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLFxuICAgICAgICAgICAgICBpbnN0YWxsZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGFjY3VtdWxhdG9yIGNvbnRhaW5zIGVpdGhlciB7QGxpbmtjb2RlIFVuaW5zdGFsbGVkRXh0ZW5zaW9uTElzdERhdGF9IF9vcl9cbiAgICAgICAqIHtAbGlua2NvZGUgSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IHdpdGhvdXQgdXBncmFkZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgYWRkZWQgYnkgdGhlIGJlbG93IGNvZGUgYmxvY2spXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQYXJ0aWFsPEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPnxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICAgICAqLyAoe30pXG4gICAgKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaXN0RGF0YSA9IC8qKiBAdHlwZSB7RXh0ZW5zaW9uTGlzdERhdGF9ICovIChleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9ID1cbiAgICAgICAgICBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfaW5zdGFsbCh7aW5zdGFsbFNwZWMsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi9cbiAgICBsZXQgZXh0RGF0YTtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIG11c3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0luc3RhbGxWaWFOcG1BcmdzfVxuICAgICAqL1xuICAgIGxldCBpbnN0YWxsT3B0cztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9iYWJsZSAoPykgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGRlcml2ZWQgZnJvbSB0aGUgaW5zdGFsbCBzcGVjLlxuICAgICAqXG4gICAgICogSWYgdXNpbmcgYSBsb2NhbCBpbnN0YWxsIHR5cGUsIHRoaXMgd2lsbCByZW1haW4gZW1wdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgcHJvYmFibGVFeHROYW1lID0gJyc7XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gYGluc3RhbGxUeXBlYCwgYnVpbGQgdGhlIG9wdGlvbnMgdG8gcGFzcyBpbnRvIGBpbnN0YWxsVmlhTnBtYFxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+J1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaW5zdGFsbE9wdHMgPSB7XG4gICAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgICBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhY2thZ2VOYW1lKSxcbiAgICAgIH07XG4gICAgICBwcm9iYWJsZUV4dE5hbWUgPSBpbnN0YWxsU3BlYztcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBpbnN0YWxsT3B0cyA9IHtcbiAgICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICAgIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFja2FnZU5hbWUpLFxuICAgICAgfTtcbiAgICAgIHByb2JhYmxlRXh0TmFtZSA9IGluc3RhbGxTcGVjO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGtnTmFtZSwgcGtnVmVyO1xuICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTE9DQUwpIHtcbiAgICAgICAgcGtnTmFtZSA9IHBhdGguaXNBYnNvbHV0ZShpbnN0YWxsU3BlYykgPyBpbnN0YWxsU3BlYyA6IHBhdGgucmVzb2x2ZShpbnN0YWxsU3BlYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgICAgLy8gbmFtZSBvciBhIGxvY2FsIHBhdGguIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvYmFibGVFeHROYW1lID0gbmFtZTtcbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbnN0YWxsT3B0cyA9IHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfTtcbiAgICB9XG5cbiAgICAvLyBmYWlsIGZhc3QgaGVyZSBpZiB3ZSBjYW5cbiAgICBpZiAocHJvYmFibGVFeHROYW1lICYmIHRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKHByb2JhYmxlRXh0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBBICR7dGhpcy50eXBlfSBuYW1lZCBcIiR7cHJvYmFibGVFeHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKGluc3RhbGxPcHRzKTtcblxuICAgIC8vIHRoaXMgX3Nob3VsZF8gYmUgdGhlIHNhbWUgYXMgYHByb2JhYmx5RXh0TmFtZWAgYXMgdGhlIG9uZSBkZXJpdmVkIGFib3ZlIHVubGVzc1xuICAgIC8vIGluc3RhbGwgdHlwZSBpcyBsb2NhbC5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLy8gY2hlY2sgX2Egc2Vjb25kIHRpbWVfIHdpdGggdGhlIG1vcmUtYWNjdXJhdGUgZXh0TmFtZVxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYEEgJHt0aGlzLnR5cGV9IG5hbWVkIFwiJHtleHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZpZWxkIGRvZXMgbm90IGV4aXN0IGFzIHN1Y2ggaW4gdGhlIG1hbmlmZXN0IChpdCdzIHVzZWQgYXMgYSBwcm9wZXJ0eSBuYW1lIGluc3RlYWQpXG4gICAgLy8gc28gdGhhdCdzIHdoeSBpdCdzIGJlaW5nIHJlbW92ZWQgaGVyZS5cbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLyoqIEB0eXBlIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gKi9cbiAgICBjb25zdCBleHRNYW5pZmVzdCA9IHsuLi5leHREYXRhLCBpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWN9O1xuICAgIGNvbnN0IFtlcnJvcnMsIHdhcm5pbmdzXSA9IGF3YWl0IEIuYWxsKFtcbiAgICAgIHRoaXMuY29uZmlnLmdldFByb2JsZW1zKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgIHRoaXMuY29uZmlnLmdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICBdKTtcbiAgICBjb25zdCBlcnJvck1hcCA9IG5ldyBNYXAoW1tleHROYW1lLCBlcnJvcnNdXSk7XG4gICAgY29uc3Qgd2FybmluZ01hcCA9IG5ldyBNYXAoW1tleHROYW1lLCB3YXJuaW5nc11dKTtcbiAgICBjb25zdCB7ZXJyb3JTdW1tYXJpZXMsIHdhcm5pbmdTdW1tYXJpZXN9ID0gdGhpcy5jb25maWcuZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyhcbiAgICAgIGVycm9yTWFwLFxuICAgICAgd2FybmluZ01hcFxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlcnJvclN1bW1hcmllcykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoZXJyb3JTdW1tYXJpZXMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIG5vdGUgdGhhdCB3ZSB3b24ndCBzaG93IGFueSB3YXJuaW5ncyBpZiB0aGVyZSB3ZXJlIGVycm9ycy5cbiAgICBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2cud2Fybih3YXJuaW5nU3VtbWFyaWVzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBsb2NhbCBgcGFja2FnZS5qc29uYFxuICAgIGlmIChhd2FpdCBlbnYuaGFzQXBwaXVtRGVwZW5kZW5jeSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKSkge1xuICAgICAgYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB9XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICB0aGlzLmxvZy5pbmZvKHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtKHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gaW5zdGFsbFNwZWMgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2luc3RhbGxTcGVjfScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgbnBtLmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHtcbiAgICAgICAgICBwa2dWZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbkRhdGEsIGluc3RhbGxTcGVjKTtcbiAgICAgICAgcmV0dXJuIHBrZ0pzb25EYXRhO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldFBvc3RJbnN0YWxsVGV4dChhcmdzKSB7XG4gICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvbiAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlbiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqIEByZXR1cm5zIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59XG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbikge1xuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb24sIHBlZXJEZXBlbmRlbmNpZXN9ID0gcGtnSnNvbjtcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5hcHBpdW0sXG4gICAgICBwa2dOYW1lOiBuYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGFwcGl1bVZlcnNpb246IHBlZXJEZXBlbmRlbmNpZXM/LmFwcGl1bSxcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi8gKHJlc3VsdCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBfcmVxdWlyZWRfIHJvb3QgZmllbGRzIG9mIGFuIGV4dGVuc2lvbidzIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gICAqXG4gICAqIFRoZXNlIHJlcXVpcmVkIGZpZWxkcyBhcmU6XG4gICAqIC0gYG5hbWVgXG4gICAqIC0gYHZlcnNpb25gXG4gICAqIC0gYGFwcGl1bWBcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlBhY2thZ2VKc29ufSBwa2dKc29uIC0gYHBhY2thZ2UuanNvbmAgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICogQHRocm93cyB7UmVmZXJlbmNlRXJyb3J9IElmIGBwYWNrYWdlLmpzb25gIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7cGtnSnNvbiBpcyBFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn1cbiAgICovXG4gIHZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbiwgaW5zdGFsbFNwZWMpIHtcbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IC8qKiBAdHlwZSB7RXh0UGFja2FnZUpzb248RXh0VHlwZT59ICovIChwa2dKc29uKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkXG4gICAgICogQHJldHVybnMge1JlZmVyZW5jZUVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yID0gKGZpZWxkKSA9PlxuICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICBgJHt0aGlzLnR5cGV9IFwiJHtpbnN0YWxsU3BlY31cIiBpbnZhbGlkOyBtaXNzaW5nIGEgXFxgJHtmaWVsZH1cXGAgZmllbGQgb2YgaXRzIFxcYHBhY2thZ2UuanNvblxcYGBcbiAgICAgICk7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCduYW1lJyk7XG4gICAgfVxuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IoJ3ZlcnNpb24nKTtcbiAgICB9XG4gICAgaWYgKCFhcHBpdW0pIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCdhcHBpdW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSwgaW5zdGFsbFNwZWMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBgcGFja2FnZS5qc29uYCBmaWVsZHMgd2hpY2ggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZXh0ZW5zaW9uIHJlcXVpcmVzLCB2YWxpZGF0ZSB0aGVcbiAgICogcHJlc2VuY2UgYW5kIGZvcm0gb2YgdGhvc2UgZmllbGRzIG9uIHRoZSBgcGFja2FnZS5qc29uYCBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNZXRhZGF0YTxFeHRUeXBlPn0gZXh0TWV0YWRhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBgcGFja2FnZS5qc29uYCBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhleHRNZXRhZGF0YSwgaW5zdGFsbFNwZWMpIHtcbiAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvbi5cbiAgICpcbiAgICogRmlyc3QgdHJpZXMgdG8gZG8gdGhpcyB2aWEgYG5wbSB1bmluc3RhbGxgLCBidXQgaWYgdGhhdCBmYWlscywganVzdCBgcm0gLXJmYCdzIHRoZSBleHRlbnNpb24gZGlyLlxuICAgKlxuICAgKiBXaWxsIG9ubHkgcmVtb3ZlIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgbWFuaWZlc3QgaWYgaXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YSAod2l0aG91dCB0aGUgZXh0ZW5zaW9uIGp1c3QgdW5pbnN0YWxsZWQpXG4gICAqL1xuICBhc3luYyBfdW5pbnN0YWxsKHtpbnN0YWxsU3BlY30pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGluc3RhbGxTcGVjKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYENhbid0IHVuaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9JzsgaXQgaXMgbm90IGluc3RhbGxlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBrZ05hbWUgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXS5wa2dOYW1lO1xuICAgIGF3YWl0IG5wbS51bmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihpbnN0YWxsU3BlYyk7XG4gICAgdGhpcy5sb2cub2soYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9J2AuZ3JlZW4pO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvblVwZGF0ZVJlc3VsdD59XG4gICAqL1xuICBhc3luYyBfdXBkYXRlKHtpbnN0YWxsU3BlYywgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGluc3RhbGxTcGVjID09PSBVUERBVEVfQUxMO1xuICAgIC8vIGlmIHdlJ3JlIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIGFuIHVwZGF0ZSBmb3IgYW4gZXh0ZW5zaW9uLCBtYWtlIHN1cmUgaXQncyBpbnN0YWxsZWRcbiAgICBpZiAoIXNob3VsZFVwZGF0ZUFsbCAmJiAhdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBcIiR7aW5zdGFsbFNwZWN9XCIgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGxcbiAgICAgID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIDogW2luc3RhbGxTcGVjXTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgICBgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKCdVcGRhdGUgcmVwb3J0OicpO1xuXG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIHRoaXMubG9nLm9rKGAgIC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgICAgYCAgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgKyBgZm9yIHVwZGF0ZXNgLnllbGxvd1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGAgIC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIHRoaXMubG9nLmVycm9yKGAgIC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGV4dGVuc2lvbiBuYW1lLCBmaWd1cmUgb3V0IHdoYXQgaXRzIGhpZ2hlc3QgcG9zc2libGUgdmVyc2lvbiB1cGdyYWRlIGlzLCBhbmQgYWxzbyB0aGVcbiAgICogaGlnaGVzdCBwb3NzaWJsZSBzYWZlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvc3NpYmxlVXBkYXRlcz59XG4gICAqL1xuICBhc3luYyBjaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICAvKiogQHR5cGUge3N0cmluZz99ICovXG4gICAgbGV0IHVuc2FmZVVwZGF0ZSA9IGF3YWl0IG5wbS5nZXRMYXRlc3RWZXJzaW9uKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGxldCBzYWZlVXBkYXRlID0gYXdhaXQgbnBtLmdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbihcbiAgICAgIHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsXG4gICAgICBwa2dOYW1lLFxuICAgICAgdmVyc2lvblxuICAgICk7XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAhPT0gbnVsbCAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnModW5zYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyB0aGVyZSdzIG5vIHBvc3NpYmxlIHVwZGF0ZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodW5zYWZlVXBkYXRlICYmIHVuc2FmZVVwZGF0ZSA9PT0gc2FmZVVwZGF0ZSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB1cGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHNhZmUgdXBkYXRlLCB3aGljaCBtZWFucyBpdCdzIG5vdCBhY3R1YWxseSB1bnNhZmVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzYWZlVXBkYXRlICYmICF1dGlsLmNvbXBhcmVWZXJzaW9ucyhzYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyBldmVuIHRoZSBzYWZlIHVwZGF0ZSBpcyBub3QgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCwgc28gaXQgaXMgbm90IGFjdHVhbGx5IGFuIHVwZGF0ZVxuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7Y3VycmVudDogdmVyc2lvbiwgc2FmZVVwZGF0ZSwgdW5zYWZlVXBkYXRlfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSB1cGRhdGUgYW4gZXh0ZW5zaW9uIGluc3RhbGxlZCBieSBOUE0sIHVzaW5nIHRoZSBOUE0gY2xpLiBBbmQgdXBkYXRlIHRoZSBpbnN0YWxsYXRpb25cbiAgICogbWFuaWZlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIG5hbWUgb2YgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIHZlcnNpb24gc3RyaW5nIGlkZW50aWZpZXIgdG8gdXBkYXRlIGV4dGVuc2lvbiB0b1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUV4dGVuc2lvbihpbnN0YWxsU3BlYywgdmVyc2lvbikge1xuICAgIGNvbnN0IHtwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbaW5zdGFsbFNwZWNdO1xuICAgIGNvbnN0IGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe1xuICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICBwa2dOYW1lLFxuICAgICAgcGtnVmVyOiB2ZXJzaW9uLFxuICAgIH0pO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYCR7dGhpcy50eXBlfU5hbWVgKV07XG4gICAgYXdhaXQgdGhpcy5jb25maWcudXBkYXRlRXh0ZW5zaW9uKGluc3RhbGxTcGVjLCBleHREYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc2NyaXB0IGNhY2hlZCBpbnNpZGUgdGhlIFwic2NyaXB0c1wiIGZpZWxkIHVuZGVyIFwiYXBwaXVtXCJcbiAgICogaW5zaWRlIG9mIHRoZSBkcml2ZXIvcGx1Z2lucyBcInBhY2thZ2UuanNvblwiIGZpbGUuIFdpbGwgdGhyb3dcbiAgICogYW4gZXJyb3IgaWYgdGhlIGRyaXZlci9wbHVnaW4gZG9lcyBub3QgY29udGFpbiBhIFwic2NyaXB0c1wiIGZpZWxkXG4gICAqIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbiwgaWYgdGhlXG4gICAqIFwic2NyaXB0c1wiIGZpZWxkIGlzIG5vdCBhIHBsYWluIG9iamVjdCwgb3IgaWYgdGhlIHNjcmlwdE5hbWUgaXNcbiAgICogbm90IGZvdW5kIHdpdGhpbiBcInNjcmlwdHNcIiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7UnVuT3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJ1bk91dHB1dD59XG4gICAqL1xuICBhc3luYyBfcnVuKHtpbnN0YWxsU3BlYywgc2NyaXB0TmFtZSwgZXh0cmFBcmdzID0gW119KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChpbnN0YWxsU3BlYykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gXCIke2luc3RhbGxTcGVjfVwiIGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRDb25maWcgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGAgK1xuICAgICAgICAgIGBcInNjcmlwdHNcIiBmaWVsZCB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb25gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIFwic2NyaXB0c1wiIGZpZWxkIG11c3QgYmUgYSBwbGFpbiBvYmplY3RgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2luc3RhbGxTcGVjfScgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2NyaXB0OiAnJHtzY3JpcHROYW1lfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtleHRTY3JpcHRzW3NjcmlwdE5hbWVdLCAuLi5leHRyYUFyZ3NdLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGluc3RhbGxTcGVjKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICB0aGlzLmxvZy5sb2cobGluZSk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBydW5uZXIuc3RhcnQoMCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVubmVyLmpvaW4oKTtcbiAgICAgIHRoaXMubG9nLm9rKGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIHJ1bm5pbmcgJyR7c2NyaXB0TmFtZX0nOiAke2Vyci5tZXNzYWdlfWAucmVkKTtcbiAgICAgIHJldHVybiB7ZXJyb3I6IGVyci5tZXNzYWdlLCBvdXRwdXQ6IG91dHB1dC5nZXRCdWZmKCl9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHRlbnNpb25Db21tYW5kO1xuZXhwb3J0IHtFeHRlbnNpb25Db21tYW5kfTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kfSBjb25zdHJ1Y3RvclxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25Db21tYW5kT3B0aW9uc1xuICogQHByb3BlcnR5IHtFeHRlbnNpb25Db25maWc8RXh0VHlwZT59IGNvbmZpZyAtIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCBpbnN0YW5jZSB1c2VkIGZvciB0aGlzIGNvbW1hbmRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ganNvbiAtIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgc2hvdWxkIGJlIEpTT04gb3IgdGV4dFxuICovXG5cbi8qKlxuICogRXh0cmEgc3R1ZmYgYWJvdXQgZXh0ZW5zaW9uczsgdXNlZCBpbmRpcmVjdGx5IGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25NZXRhZGF0YVxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnN0YWxsZWQgLSBJZiBgdHJ1ZWAsIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVwZGF0ZVZlcnNpb24gLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCwgdGhlIHZlcnNpb24gaXQgY2FuIGJlIHVwZGF0ZWQgdG9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlVmVyc2lvbiAtIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIG1ham9yIHZlcnNpb24gYnVtcFxuICogQHByb3BlcnR5IHtib29sZWFufSB1cFRvRGF0ZSAtIElmIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkIGFuZCB0aGUgbGF0ZXN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlclR5cGV9IERyaXZlclR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5QbHVnaW5UeXBlfSBQbHVnaW5UeXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dFJlY29yZDxFeHRUeXBlPn0gRXh0UmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9leHRlbnNpb24tY29uZmlnJykuRXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fSBFeHRlbnNpb25Db25maWdcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWV0YWRhdGE8RXh0VHlwZT59IEV4dE1ldGFkYXRhXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE1hbmlmZXN0PEV4dFR5cGU+fSBFeHRNYW5pZmVzdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gRXh0UGFja2FnZUpzb25cbiAqL1xuXG4vKipcbiAqIFBvc3NpYmxlIHJldHVybiB2YWx1ZSBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9XG4gKiBAdHlwZWRlZiBVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZVxuICogQHByb3BlcnR5IHtmYWxzZX0gaW5zdGFsbGVkXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuSW50ZXJuYWxNZXRhZGF0YSAmIEV4dGVuc2lvbk1ldGFkYXRhfSBJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfFVuaW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGE+fSBFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59LlxuICogQHR5cGVkZWYgUnVuT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHJ1biBhIHNjcmlwdCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2NyaXB0TmFtZSAtIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtleHRyYUFyZ3NdIC0gYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNjcmlwdFxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fcnVufVxuICpcbiAqIEB0eXBlZGVmIFJ1bk91dHB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlcnJvcl0gLSBlcnJvciBtZXNzYWdlIGlmIHNjcmlwdCByYW4gdW5zdWNjZXNzZnVsbHksIG90aGVyd2lzZSB1bmRlZmluZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG91dHB1dCAtIHNjcmlwdCBvdXRwdXRcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZU9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gdXBkYXRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2FmZSAtIGlmIHRydWUsIHdpbGwgcGVyZm9ybSB1bnNhZmUgdXBkYXRlcyBwYXN0IG1ham9yIHJldmlzaW9uIGJvdW5kYXJpZXNcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxFcnJvcj59IGVycm9ycyAtIG1hcCBvZiBleHQgbmFtZXMgdG8gZXJyb3Igb2JqZWN0c1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGlua2NvZGUgVXBkYXRlUmVwb3J0fXNcbiAqL1xuXG4vKipcbiAqIFBhcnQgb2YgcmVzdWx0IG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIFVwZGF0ZVJlcG9ydFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZyb20gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRvIC0gdmVyc2lvbiB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkIHRvXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VuaW5zdGFsbH0uXG4gKiBAdHlwZWRlZiBVbmluc3RhbGxPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byB1bmluc3RhbGxcbiAqL1xuXG4vKipcbiAqIFVzZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldFBvc3RJbnN0YWxsVGV4dH1cbiAqIEB0eXBlZGVmIEV4dGVuc2lvbkFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHROYW1lIC0gdGhlIG5hbWUgb2YgYW4gZXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkge29iamVjdH0gZXh0RGF0YSAtIHRoZSBkYXRhIGZvciBhbiBpbnN0YWxsZWQgZXh0ZW5zaW9uXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuaW5zdGFsbFZpYU5wbX1cbiAqIEB0eXBlZGVmIEluc3RhbGxWaWFOcG1BcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZSAtIHRoZSBOUE0gcGFja2FnZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGtnVmVyXSAtIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBOUE0gcGFja2FnZVxuICovXG5cbi8qKlxuICogT2JqZWN0IHJldHVybmVkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZX1cbiAqIEB0eXBlZGVmIFBvc3NpYmxlVXBkYXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnQgLSBjdXJyZW50IHZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHVuc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5faW5zdGFsbH1cbiAqIEB0eXBlZGVmIEluc3RhbGxBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuSW5zdGFsbFR5cGV9IGluc3RhbGxUeXBlIC0gaG93IHRvIGluc3RhbGwgdGhpcyBleHRlbnNpb24uIE9uZSBvZiB0aGUgSU5TVEFMTF9UWVBFU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBmb3IgZ2l0L2dpdGh1YiBpbnN0YWxscywgdGhlIGV4dGVuc2lvbiBub2RlIHBhY2thZ2UgbmFtZVxuICovXG5cbi8qKlxuICogUmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldEV4dGVuc2lvbkZpZWxkc31cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dE1ldGFkYXRhPEV4dFR5cGU+ICYgeyBwa2dOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgYXBwaXVtVmVyc2lvbjogc3RyaW5nIH0gJiBpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkNvbW1vbkV4dE1ldGFkYXRhfSBFeHRlbnNpb25GaWVsZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBEcml2ZXJUeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fRFJJVkVSUyA6IEV4dFR5cGUgZXh0ZW5kcyBQbHVnaW5UeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fUExVR0lOUyA6IG5ldmVyfSBLbm93bkV4dGVuc2lvbnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dJbnN0YWxsZWQgLSB3aGV0aGVyIHNob3VsZCBzaG93IG9ubHkgaW5zdGFsbGVkIGV4dGVuc2lvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1VwZGF0ZXMgLSB3aGV0aGVyIHNob3VsZCBzaG93IGF2YWlsYWJsZSB1cGRhdGVzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQTs7QUFFQSxNQUFN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
535
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJVUERBVEVfQUxMIiwiTm90VXBkYXRhYmxlRXJyb3IiLCJFcnJvciIsIk5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIiwiRXh0ZW5zaW9uQ29tbWFuZCIsImNvbmZpZyIsImtub3duRXh0ZW5zaW9ucyIsImlzSnNvbk91dHB1dCIsImNvbnN0cnVjdG9yIiwianNvbiIsImxvZyIsImNvbnNvbGUiLCJDbGlDb25zb2xlIiwianNvbk1vZGUiLCJCb29sZWFuIiwidHlwZSIsImV4dGVuc2lvblR5cGUiLCJfY3JlYXRlRmF0YWxFcnJvciIsIm1lc3NhZ2UiLCJkZWNvcmF0ZSIsImV4ZWN1dGUiLCJhcmdzIiwiY21kIiwiXyIsImlzRnVuY3Rpb24iLCJleGVjdXRlQ21kIiwiYmluZCIsImxpc3QiLCJzaG93SW5zdGFsbGVkIiwic2hvd1VwZGF0ZXMiLCJsc01zZyIsImluc3RhbGxlZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImluc3RhbGxlZEV4dGVuc2lvbnMiLCJrbm93bk5hbWVzIiwiZXh0cyIsInJlZHVjZSIsImFjYyIsIm5hbWUiLCJpbmNsdWRlcyIsImluc3RhbGxlZCIsInBrZ05hbWUiLCJzcGluV2l0aCIsImV4dCIsImRhdGEiLCJ0b1BhaXJzIiwiaW5zdGFsbFR5cGUiLCJJTlNUQUxMX1RZUEVfTlBNIiwidXBkYXRlcyIsImNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlIiwidXBkYXRlVmVyc2lvbiIsInNhZmVVcGRhdGUiLCJ1bnNhZmVVcGRhdGVWZXJzaW9uIiwidW5zYWZlVXBkYXRlIiwidXBUb0RhdGUiLCJsaXN0RGF0YSIsImluc3RhbGxUeHQiLCJncmV5IiwidXBkYXRlVHh0IiwidXBUb0RhdGVUeHQiLCJ1bnNhZmVVcGRhdGVUeHQiLCJpbnN0YWxsU3BlYyIsInZlcnNpb24iLCJ0eXBlVHh0IiwiSU5TVEFMTF9UWVBFX0dJVCIsIklOU1RBTExfVFlQRV9HSVRIVUIiLCJ5ZWxsb3ciLCJJTlNUQUxMX1RZUEVfTE9DQUwiLCJtYWdlbnRhIiwiZ3JlZW4iLCJjeWFuIiwiX2luc3RhbGwiLCJwYWNrYWdlTmFtZSIsImV4dERhdGEiLCJpbnN0YWxsT3B0cyIsInByb2JhYmxlRXh0TmFtZSIsInNwbGl0IiwibGVuZ3RoIiwicmVwbGFjZSIsInBrZ1ZlciIsInBhdGgiLCJpc0Fic29sdXRlIiwicmVzb2x2ZSIsInNwbGl0cyIsIm1zZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0luc3RhbGxlZCIsImluc3RhbGxWaWFOcG0iLCJleHROYW1lIiwiZXh0TWFuaWZlc3QiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsIkIiLCJhbGwiLCJnZXRQcm9ibGVtcyIsImdldFdhcm5pbmdzIiwiZXJyb3JNYXAiLCJNYXAiLCJ3YXJuaW5nTWFwIiwiZXJyb3JTdW1tYXJpZXMiLCJ3YXJuaW5nU3VtbWFyaWVzIiwiZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyIsImlzRW1wdHkiLCJqb2luIiwid2FybiIsImFkZEV4dGVuc2lvbiIsImVudiIsImhhc0FwcGl1bURlcGVuZGVuY3kiLCJhcHBpdW1Ib21lIiwicGFja2FnZURpZENoYW5nZSIsImluZm8iLCJnZXRQb3N0SW5zdGFsbFRleHQiLCJucG1TcGVjIiwic3BlY01zZyIsInBrZ0pzb25EYXRhIiwibnBtIiwiaW5zdGFsbFBhY2thZ2UiLCJ2YWxpZGF0ZVBhY2thZ2VKc29uIiwiZ2V0RXh0ZW5zaW9uRmllbGRzIiwiZXJyIiwicGtnSnNvbiIsImFwcGl1bSIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZXN1bHQiLCJhcHBpdW1WZXJzaW9uIiwiY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IiLCJmaWVsZCIsIlJlZmVyZW5jZUVycm9yIiwidmFsaWRhdGVFeHRlbnNpb25GaWVsZHMiLCJleHRNZXRhZGF0YSIsIl91bmluc3RhbGwiLCJ1bmluc3RhbGxQYWNrYWdlIiwicmVtb3ZlRXh0ZW5zaW9uIiwib2siLCJfdXBkYXRlIiwidW5zYWZlIiwic2hvdWxkVXBkYXRlQWxsIiwiZXh0c1RvVXBkYXRlIiwiZSIsInVwZGF0ZSIsImN1cnJlbnQiLCJ1cGRhdGVWZXIiLCJ1cGRhdGVFeHRlbnNpb24iLCJmcm9tIiwidG8iLCJlcnJvciIsInJlZCIsImdldExhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RTYWZlVXBncmFkZVZlcnNpb24iLCJ1dGlsIiwiY29tcGFyZVZlcnNpb25zIiwiX3J1biIsInNjcmlwdE5hbWUiLCJleHRyYUFyZ3MiLCJleHRDb25maWciLCJzY3JpcHRzIiwiZXh0U2NyaXB0cyIsImlzUGxhaW5PYmplY3QiLCJoYXMiLCJydW5uZXIiLCJTdWJQcm9jZXNzIiwicHJvY2VzcyIsImV4ZWNQYXRoIiwiY3dkIiwiZ2V0SW5zdGFsbFBhdGgiLCJvdXRwdXQiLCJSaW5nQnVmZmVyIiwib24iLCJsaW5lIiwiZW5xdWV1ZSIsInN0YXJ0IiwiZ2V0QnVmZiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLWNvbW1hbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtucG0sIHV0aWwsIGVudiwgY29uc29sZX0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7c3BpbldpdGgsIFJpbmdCdWZmZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtTdWJQcm9jZXNzfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgSU5TVEFMTF9UWVBFX05QTSxcbiAgSU5TVEFMTF9UWVBFX0dJVCxcbiAgSU5TVEFMTF9UWVBFX0dJVEhVQixcbiAgSU5TVEFMTF9UWVBFX0xPQ0FMLFxufSBmcm9tICcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge3BhY2thZ2VEaWRDaGFuZ2V9IGZyb20gJy4uL2V4dGVuc2lvbi9wYWNrYWdlLWNoYW5nZWQnO1xuXG5jb25zdCBVUERBVEVfQUxMID0gJ2luc3RhbGxlZCc7XG5cbmNsYXNzIE5vdFVwZGF0YWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cbmNsYXNzIE5vVXBkYXRlc0F2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqL1xuY2xhc3MgRXh0ZW5zaW9uQ29tbWFuZCB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCwgZGVwZW5kaW5nIG9uIGBFeHRUeXBlYC5cbiAgICogQHR5cGUge0V4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn1cbiAgICovXG4gIGNvbmZpZztcblxuICAvKipcbiAgICoge0BsaW5rY29kZSBSZWNvcmR9IG9mIG9mZmljaWFsIHBsdWdpbnMgb3IgZHJpdmVycy5cbiAgICogQHR5cGUge0tub3duRXh0ZW5zaW9uczxFeHRUeXBlPn1cbiAgICovXG4gIGtub3duRXh0ZW5zaW9ucztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBjb21tYW5kIG91dHB1dCBoYXMgYmVlbiByZXF1ZXN0ZWQgYXMgSlNPTi5cbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqL1xuICBpc0pzb25PdXRwdXQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIEV4dGVuc2lvbkNvbW1hbmRcbiAgICogQHBhcmFtIHtFeHRlbnNpb25Db21tYW5kT3B0aW9uczxFeHRUeXBlPn0gb3B0c1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZywganNvbn0pIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmxvZyA9IG5ldyBjb25zb2xlLkNsaUNvbnNvbGUoe2pzb25Nb2RlOiBqc29ufSk7XG4gICAgdGhpcy5pc0pzb25PdXRwdXQgPSBCb29sZWFuKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBkcml2ZXJgIG9yIGBwbHVnaW5gLCBkZXBlbmRpbmcgb24gdGhlIGBFeHRlbnNpb25Db25maWdgLlxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmV4dGVuc2lvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhIG1lc3NhZ2UgYW5kIHJldHVybnMgYW4ge0BsaW5rY29kZSBFcnJvcn0gdG8gdGhyb3cuXG4gICAqXG4gICAqIEZvciBUUyB0byB1bmRlcnN0YW5kIHRoYXQgYSBmdW5jdGlvbiB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCBtdXN0IGFjdHVhbGx5IHRocm93IGFuIGV4Y2VwdGlvbi0tXG4gICAqIGluIG90aGVyIHdvcmRzLCBfY2FsbGluZ18gYSBmdW5jdGlvbiB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBpcyBub3QgZW5vdWdoLS1cbiAgICogbm9yIGlzIHNvbWV0aGluZyBsaWtlIGBAcmV0dXJucyB7bmV2ZXJ9YCB3aGljaCBkb2VzIG5vdCBpbXBseSBhIHRocm93biBleGNlcHRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJldHVybnMge0Vycm9yfVxuICAgKi9cbiAgX2NyZWF0ZUZhdGFsRXJyb3IobWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IodGhpcy5sb2cuZGVjb3JhdGUobWVzc2FnZSwgJ2Vycm9yJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYSBDTEkgcGFyc2UgYW5kIHJ1biBhbiBleHRlbnNpb24gY29tbWFuZCBiYXNlZCBvbiBpdHMgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGEga2V5L3ZhbHVlIG9iamVjdCB3aXRoIENMSSBmbGFncyBhbmQgdmFsdWVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8b2JqZWN0Pn0gdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY29tbWFuZCB3aGljaCBpcyBleGVjdXRlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShhcmdzKSB7XG4gICAgY29uc3QgY21kID0gYXJnc1tgJHt0aGlzLnR5cGV9Q29tbWFuZGBdO1xuICAgIGlmICghXy5pc0Z1bmN0aW9uKHRoaXNbY21kXSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYENhbm5vdCBoYW5kbGUgJHt0aGlzLnR5cGV9IGNvbW1hbmQgJHtjbWR9YCk7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWN1dGVDbWQgPSB0aGlzW2NtZF0uYmluZCh0aGlzKTtcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUNtZChhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGV4dGVuc2lvbnNcbiAgICpcbiAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvbkxpc3REYXRhPn0gbWFwIG9mIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YVxuICAgKi9cbiAgYXN5bmMgbGlzdCh7c2hvd0luc3RhbGxlZCwgc2hvd1VwZGF0ZXN9KSB7XG4gICAgY29uc3QgbHNNc2cgPSBgTGlzdGluZyAke3Nob3dJbnN0YWxsZWQgPyAnaW5zdGFsbGVkJyA6ICdhdmFpbGFibGUnfSAke3RoaXMudHlwZX1zYDtcbiAgICBjb25zdCBpbnN0YWxsZWROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMpO1xuICAgIGNvbnN0IGtub3duTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmtub3duRXh0ZW5zaW9ucyk7XG4gICAgY29uc3QgZXh0cyA9IFsuLi5pbnN0YWxsZWROYW1lcywgLi4ua25vd25OYW1lc10ucmVkdWNlKFxuICAgICAgKGFjYywgbmFtZSkgPT4ge1xuICAgICAgICBpZiAoIWFjY1tuYW1lXSkge1xuICAgICAgICAgIGlmIChpbnN0YWxsZWROYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgYWNjW25hbWVdID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW25hbWVdLFxuICAgICAgICAgICAgICBpbnN0YWxsZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXNob3dJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgIGFjY1tuYW1lXSA9IHtwa2dOYW1lOiB0aGlzLmtub3duRXh0ZW5zaW9uc1tuYW1lXSwgaW5zdGFsbGVkOiBmYWxzZX07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBUaGlzIGFjY3VtdWxhdG9yIGNvbnRhaW5zIGVpdGhlciB7QGxpbmtjb2RlIFVuaW5zdGFsbGVkRXh0ZW5zaW9uTElzdERhdGF9IF9vcl9cbiAgICAgICAqIHtAbGlua2NvZGUgSW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGF9IHdpdGhvdXQgdXBncmFkZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgYWRkZWQgYnkgdGhlIGJlbG93IGNvZGUgYmxvY2spXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxQYXJ0aWFsPEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPnxVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhPn1cbiAgICAgICAqLyAoe30pXG4gICAgKTtcblxuICAgIC8vIGlmIHdlIHdhbnQgdG8gc2hvdyB3aGV0aGVyIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgcHV0IHRoYXQgYmVoaW5kIGEgc3Bpbm5lclxuICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBsc01zZywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzaG93VXBkYXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtleHQsIGRhdGFdIG9mIF8udG9QYWlycyhleHRzKSkge1xuICAgICAgICBpZiAoIWRhdGEuaW5zdGFsbGVkIHx8IGRhdGEuaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAvLyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIGV4dHMgdGhhdCBhcmVuJ3QgaW5zdGFsbGVkXG4gICAgICAgICAgLy8gYWxzbyBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciB1cGRhdGVzIG9uIG5vbi1ucG0gZXh0c1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZXMgPSBhd2FpdCB0aGlzLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKGV4dCk7XG4gICAgICAgIGRhdGEudXBkYXRlVmVyc2lvbiA9IHVwZGF0ZXMuc2FmZVVwZGF0ZTtcbiAgICAgICAgZGF0YS51bnNhZmVVcGRhdGVWZXJzaW9uID0gdXBkYXRlcy51bnNhZmVVcGRhdGU7XG4gICAgICAgIGRhdGEudXBUb0RhdGUgPSB1cGRhdGVzLnNhZmVVcGRhdGUgPT09IG51bGwgJiYgdXBkYXRlcy51bnNhZmVVcGRhdGUgPT09IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaXN0RGF0YSA9IC8qKiBAdHlwZSB7RXh0ZW5zaW9uTGlzdERhdGF9ICovIChleHRzKTtcblxuICAgIC8vIGlmIHdlJ3JlIGp1c3QgZ2V0dGluZyB0aGUgZGF0YSwgc2hvcnQgY2lyY3VpdCByZXR1cm4gaGVyZSBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueVxuICAgIC8vIGZvcm1hdHRpbmcgbG9naWNcbiAgICBpZiAodGhpcy5pc0pzb25PdXRwdXQpIHtcbiAgICAgIHJldHVybiBsaXN0RGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBfLnRvUGFpcnMobGlzdERhdGEpKSB7XG4gICAgICBsZXQgaW5zdGFsbFR4dCA9ICcgW25vdCBpbnN0YWxsZWRdJy5ncmV5O1xuICAgICAgbGV0IHVwZGF0ZVR4dCA9ICcnO1xuICAgICAgbGV0IHVwVG9EYXRlVHh0ID0gJyc7XG4gICAgICBsZXQgdW5zYWZlVXBkYXRlVHh0ID0gJyc7XG4gICAgICBpZiAoZGF0YS5pbnN0YWxsZWQpIHtcbiAgICAgICAgY29uc3Qge2luc3RhbGxUeXBlLCBpbnN0YWxsU3BlYywgdXBkYXRlVmVyc2lvbiwgdW5zYWZlVXBkYXRlVmVyc2lvbiwgdmVyc2lvbiwgdXBUb0RhdGV9ID1cbiAgICAgICAgICBkYXRhO1xuICAgICAgICBsZXQgdHlwZVR4dDtcbiAgICAgICAgc3dpdGNoIChpbnN0YWxsVHlwZSkge1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0dJVDpcbiAgICAgICAgICBjYXNlIElOU1RBTExfVFlQRV9HSVRIVUI6XG4gICAgICAgICAgICB0eXBlVHh0ID0gYChjbG9uZWQgZnJvbSAke2luc3RhbGxTcGVjfSlgLnllbGxvdztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSU5TVEFMTF9UWVBFX0xPQ0FMOlxuICAgICAgICAgICAgdHlwZVR4dCA9IGAobGlua2VkIGZyb20gJHtpbnN0YWxsU3BlY30pYC5tYWdlbnRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHR5cGVUeHQgPSAnKE5QTSknO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbGxUeHQgPSBgQCR7dmVyc2lvbi55ZWxsb3d9ICR7KCdbaW5zdGFsbGVkICcgKyB0eXBlVHh0ICsgJ10nKS5ncmVlbn1gO1xuXG4gICAgICAgIGlmIChzaG93VXBkYXRlcykge1xuICAgICAgICAgIGlmICh1cGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1cGRhdGVUeHQgPSBgIFske3VwZGF0ZVZlcnNpb259IGF2YWlsYWJsZV1gLm1hZ2VudGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cFRvRGF0ZSkge1xuICAgICAgICAgICAgdXBUb0RhdGVUeHQgPSBgIFtVcCB0byBkYXRlXWAuZ3JlZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1bnNhZmVVcGRhdGVWZXJzaW9uKSB7XG4gICAgICAgICAgICB1bnNhZmVVcGRhdGVUeHQgPSBgIFske3Vuc2FmZVVwZGF0ZVZlcnNpb259IGF2YWlsYWJsZSAocG90ZW50aWFsbHkgdW5zYWZlKV1gLmN5YW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmxvZyhgLSAke25hbWUueWVsbG93fSR7aW5zdGFsbFR4dH0ke3VwZGF0ZVR4dH0ke3VwVG9EYXRlVHh0fSR7dW5zYWZlVXBkYXRlVHh0fWApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGFuIGV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxBcmdzfSBhcmdzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RXh0UmVjb3JkPEV4dFR5cGU+Pn0gbWFwIG9mIGFsbCBpbnN0YWxsZWQgZXh0ZW5zaW9uIG5hbWVzIHRvIGV4dGVuc2lvbiBkYXRhXG4gICAqL1xuICBhc3luYyBfaW5zdGFsbCh7aW5zdGFsbFNwZWMsIGluc3RhbGxUeXBlLCBwYWNrYWdlTmFtZX0pIHtcbiAgICAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi9cbiAgICBsZXQgZXh0RGF0YTtcblxuICAgIGlmIChwYWNrYWdlTmFtZSAmJiBbSU5TVEFMTF9UWVBFX0xPQ0FMLCBJTlNUQUxMX1RZUEVfTlBNXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIGNhbm5vdCBhbHNvIHVzZSAtLXBhY2thZ2VgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhY2thZ2VOYW1lICYmIFtJTlNUQUxMX1RZUEVfR0lULCBJTlNUQUxMX1RZUEVfR0lUSFVCXS5pbmNsdWRlcyhpbnN0YWxsVHlwZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFdoZW4gdXNpbmcgLS1zb3VyY2U9JHtpbnN0YWxsVHlwZX0sIG11c3QgYWxzbyB1c2UgLS1wYWNrYWdlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge0luc3RhbGxWaWFOcG1BcmdzfVxuICAgICAqL1xuICAgIGxldCBpbnN0YWxsT3B0cztcblxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9iYWJsZSAoPykgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGRlcml2ZWQgZnJvbSB0aGUgaW5zdGFsbCBzcGVjLlxuICAgICAqXG4gICAgICogSWYgdXNpbmcgYSBsb2NhbCBpbnN0YWxsIHR5cGUsIHRoaXMgd2lsbCByZW1haW4gZW1wdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgcHJvYmFibGVFeHROYW1lID0gJyc7XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gYGluc3RhbGxUeXBlYCwgYnVpbGQgdGhlIG9wdGlvbnMgdG8gcGFzcyBpbnRvIGBpbnN0YWxsVmlhTnBtYFxuICAgIGlmIChpbnN0YWxsVHlwZSA9PT0gSU5TVEFMTF9UWVBFX0dJVEhVQikge1xuICAgICAgaWYgKGluc3RhbGxTcGVjLnNwbGl0KCcvJykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgYEdpdGh1YiAke3RoaXMudHlwZX0gc3BlYyAke2luc3RhbGxTcGVjfSBhcHBlYXJlZCB0byBiZSBpbnZhbGlkOyBgICtcbiAgICAgICAgICAgICdpdCBzaG91bGQgYmUgb2YgdGhlIGZvcm0gPG9yZz4vPHJlcG8+J1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaW5zdGFsbE9wdHMgPSB7XG4gICAgICAgIGluc3RhbGxTcGVjLFxuICAgICAgICBwa2dOYW1lOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhY2thZ2VOYW1lKSxcbiAgICAgIH07XG4gICAgICBwcm9iYWJsZUV4dE5hbWUgPSBpbnN0YWxsU3BlYztcbiAgICB9IGVsc2UgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfR0lUKSB7XG4gICAgICAvLyBnaXQgdXJscyBjYW4gaGF2ZSAnLmdpdCcgYXQgdGhlIGVuZCwgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBhbmQgd291bGQgY29tcGxpY2F0ZSB0aGVcbiAgICAgIC8vIHdheSB3ZSBkb3dubG9hZCBhbmQgbmFtZSBkaXJlY3Rvcmllcywgc28gd2UgY2FuIGp1c3QgcmVtb3ZlIGl0XG4gICAgICBpbnN0YWxsU3BlYyA9IGluc3RhbGxTcGVjLnJlcGxhY2UoL1xcLmdpdCQvLCAnJyk7XG4gICAgICBpbnN0YWxsT3B0cyA9IHtcbiAgICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICAgIHBrZ05hbWU6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFja2FnZU5hbWUpLFxuICAgICAgfTtcbiAgICAgIHByb2JhYmxlRXh0TmFtZSA9IGluc3RhbGxTcGVjO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGtnTmFtZSwgcGtnVmVyO1xuICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTE9DQUwpIHtcbiAgICAgICAgcGtnTmFtZSA9IHBhdGguaXNBYnNvbHV0ZShpbnN0YWxsU3BlYykgPyBpbnN0YWxsU3BlYyA6IHBhdGgucmVzb2x2ZShpbnN0YWxsU3BlYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgZWl0aGVyIGFuIG5wbSBwYWNrYWdlIG9yIGFuIGFwcGl1bSB2ZXJpZmllZCBleHRlbnNpb25cbiAgICAgICAgLy8gbmFtZSBvciBhIGxvY2FsIHBhdGguIGJvdGggb2Ygd2hpY2ggd2lsbCBiZSBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAgICAgLy8gZXh0ZW5zaW9ucyBpbnN0YWxsZWQgdmlhIG5wbSBjYW4gaW5jbHVkZSB2ZXJzaW9ucyBvciB0YWdzIGFmdGVyIHRoZSAnQCdcbiAgICAgICAgLy8gc2lnbiwgc28gY2hlY2sgZm9yIHRoYXQuIFdlIGFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgcGFja2FnZSBuYW1lcyB0aGVtc2VsdmVzIGNhblxuICAgICAgICAvLyBjb250YWluIHRoZSAnQCcgc3ltYm9sLCBhcyBpbiBgbnBtIGluc3RhbGwgQGFwcGl1bS9mYWtlLWRyaXZlckAxLjIuMGBcbiAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgIGNvbnN0IHNwbGl0cyA9IGluc3RhbGxTcGVjLnNwbGl0KCdAJyk7XG4gICAgICAgIGlmIChpbnN0YWxsU3BlY1swXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGFuIG5wbSBvcmcgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gW2BAJHtzcGxpdHNbMV19YCwgc3BsaXRzWzJdXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBjYXNlIHdpdGhvdXQgYW4gbnBtIG9yZ1xuICAgICAgICAgIFtuYW1lLCBwa2dWZXJdID0gc3BsaXRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc3RhbGxUeXBlID09PSBJTlNUQUxMX1RZUEVfTlBNKSB7XG4gICAgICAgICAgLy8gaWYgd2UncmUgaW5zdGFsbGluZyBhIG5hbWVkIHBhY2thZ2UgZnJvbSBucG0sIHdlIGRvbid0IG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAvLyBhZ2FpbnN0IHRoZSBhcHBpdW0gZXh0ZW5zaW9uIGxpc3Q7IGp1c3QgdXNlIHRoZSBpbnN0YWxsU3BlYyBhcyBpc1xuICAgICAgICAgIHBrZ05hbWUgPSBuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGlmIHdlJ3JlIGluc3RhbGxpbmcgYSBuYW1lZCBhcHBpdW0gZHJpdmVyIChsaWtlICd4Y3VpdGVzdCcpIHdlIG5lZWQgdG9cbiAgICAgICAgICAvLyBkZXJlZmVyZW5jZSB0aGUgYWN0dWFsIG5wbSBwYWNrYWdlICgnYXBwaXVwbS14Y3VpdGVzdC1kcml2ZXInKSwgc29cbiAgICAgICAgICAvLyBjaGVjayBpdCBleGlzdHMgYW5kIGdldCB0aGUgY29ycmVjdCBwYWNrYWdlXG4gICAgICAgICAgY29uc3Qga25vd25OYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMua25vd25FeHRlbnNpb25zKTtcbiAgICAgICAgICBpZiAoIV8uaW5jbHVkZXMoa25vd25OYW1lcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgcmVzb2x2ZSAke3RoaXMudHlwZX07IGFyZSB5b3Ugc3VyZSBpdCdzIGluIHRoZSBsaXN0IGAgK1xuICAgICAgICAgICAgICBgb2Ygc3VwcG9ydGVkICR7dGhpcy50eXBlfXM/ICR7SlNPTi5zdHJpbmdpZnkoa25vd25OYW1lcyl9YDtcbiAgICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvYmFibGVFeHROYW1lID0gbmFtZTtcbiAgICAgICAgICBwa2dOYW1lID0gdGhpcy5rbm93bkV4dGVuc2lvbnNbbmFtZV07XG4gICAgICAgICAgLy8gZ2l2ZW4gdGhhdCB3ZSdsbCB1c2UgdGhlIGluc3RhbGwgdHlwZSBpbiB0aGUgZHJpdmVyIGpzb24sIHN0b3JlIGl0IGFzXG4gICAgICAgICAgLy8gJ25wbScgbm93XG4gICAgICAgICAgaW5zdGFsbFR5cGUgPSBJTlNUQUxMX1RZUEVfTlBNO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbnN0YWxsT3B0cyA9IHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfTtcbiAgICB9XG5cbiAgICAvLyBmYWlsIGZhc3QgaGVyZSBpZiB3ZSBjYW5cbiAgICBpZiAocHJvYmFibGVFeHROYW1lICYmIHRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKHByb2JhYmxlRXh0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBBICR7dGhpcy50eXBlfSBuYW1lZCBcIiR7cHJvYmFibGVFeHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBleHREYXRhID0gYXdhaXQgdGhpcy5pbnN0YWxsVmlhTnBtKGluc3RhbGxPcHRzKTtcblxuICAgIC8vIHRoaXMgX3Nob3VsZF8gYmUgdGhlIHNhbWUgYXMgYHByb2JhYmx5RXh0TmFtZWAgYXMgdGhlIG9uZSBkZXJpdmVkIGFib3ZlIHVubGVzc1xuICAgIC8vIGluc3RhbGwgdHlwZSBpcyBsb2NhbC5cbiAgICBjb25zdCBleHROYW1lID0gZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLy8gY2hlY2sgX2Egc2Vjb25kIHRpbWVfIHdpdGggdGhlIG1vcmUtYWNjdXJhdGUgZXh0TmFtZVxuICAgIGlmICh0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChleHROYW1lKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYEEgJHt0aGlzLnR5cGV9IG5hbWVkIFwiJHtleHROYW1lfVwiIGlzIGFscmVhZHkgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgRGlkIHlvdSBtZWFuIHRvIHVwZGF0ZT8gUnVuIFwiYXBwaXVtICR7dGhpcy50eXBlfSB1cGRhdGVcIi4gU2VlIGAgK1xuICAgICAgICAgIGBpbnN0YWxsZWQgJHt0aGlzLnR5cGV9cyB3aXRoIFwiYXBwaXVtICR7dGhpcy50eXBlfSBsaXN0IC0taW5zdGFsbGVkXCIuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGZpZWxkIGRvZXMgbm90IGV4aXN0IGFzIHN1Y2ggaW4gdGhlIG1hbmlmZXN0IChpdCdzIHVzZWQgYXMgYSBwcm9wZXJ0eSBuYW1lIGluc3RlYWQpXG4gICAgLy8gc28gdGhhdCdzIHdoeSBpdCdzIGJlaW5nIHJlbW92ZWQgaGVyZS5cbiAgICBkZWxldGUgZXh0RGF0YVsvKiogQHR5cGUge3N0cmluZ30gKi8gKGAke3RoaXMudHlwZX1OYW1lYCldO1xuXG4gICAgLyoqIEB0eXBlIHtFeHRNYW5pZmVzdDxFeHRUeXBlPn0gKi9cbiAgICBjb25zdCBleHRNYW5pZmVzdCA9IHsuLi5leHREYXRhLCBpbnN0YWxsVHlwZSwgaW5zdGFsbFNwZWN9O1xuICAgIGNvbnN0IFtlcnJvcnMsIHdhcm5pbmdzXSA9IGF3YWl0IEIuYWxsKFtcbiAgICAgIHRoaXMuY29uZmlnLmdldFByb2JsZW1zKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICAgIHRoaXMuY29uZmlnLmdldFdhcm5pbmdzKGV4dE5hbWUsIGV4dE1hbmlmZXN0KSxcbiAgICBdKTtcbiAgICBjb25zdCBlcnJvck1hcCA9IG5ldyBNYXAoW1tleHROYW1lLCBlcnJvcnNdXSk7XG4gICAgY29uc3Qgd2FybmluZ01hcCA9IG5ldyBNYXAoW1tleHROYW1lLCB3YXJuaW5nc11dKTtcbiAgICBjb25zdCB7ZXJyb3JTdW1tYXJpZXMsIHdhcm5pbmdTdW1tYXJpZXN9ID0gdGhpcy5jb25maWcuZ2V0VmFsaWRhdGlvblJlc3VsdFN1bW1hcmllcyhcbiAgICAgIGVycm9yTWFwLFxuICAgICAgd2FybmluZ01hcFxuICAgICk7XG5cbiAgICBpZiAoIV8uaXNFbXB0eShlcnJvclN1bW1hcmllcykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoZXJyb3JTdW1tYXJpZXMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIG5vdGUgdGhhdCB3ZSB3b24ndCBzaG93IGFueSB3YXJuaW5ncyBpZiB0aGVyZSB3ZXJlIGVycm9ycy5cbiAgICBpZiAoIV8uaXNFbXB0eSh3YXJuaW5nU3VtbWFyaWVzKSkge1xuICAgICAgdGhpcy5sb2cud2Fybih3YXJuaW5nU3VtbWFyaWVzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5hZGRFeHRlbnNpb24oZXh0TmFtZSwgZXh0TWFuaWZlc3QpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBpZiB3ZSd2ZSBjaGFuZ2VkIHRoZSBsb2NhbCBgcGFja2FnZS5qc29uYFxuICAgIGlmIChhd2FpdCBlbnYuaGFzQXBwaXVtRGVwZW5kZW5jeSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKSkge1xuICAgICAgYXdhaXQgcGFja2FnZURpZENoYW5nZSh0aGlzLmNvbmZpZy5hcHBpdW1Ib21lKTtcbiAgICB9XG5cbiAgICAvLyBsb2cgaW5mbyBmb3IgdGhlIHVzZXJcbiAgICB0aGlzLmxvZy5pbmZvKHRoaXMuZ2V0UG9zdEluc3RhbGxUZXh0KHtleHROYW1lLCBleHREYXRhfSkpO1xuXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhbiBleHRlbnNpb24gdmlhIE5QTVxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RhbGxWaWFOcG1BcmdzfSBhcmdzXG4gICAqL1xuICBhc3luYyBpbnN0YWxsVmlhTnBtKHtpbnN0YWxsU3BlYywgcGtnTmFtZSwgcGtnVmVyfSkge1xuICAgIGNvbnN0IG5wbVNwZWMgPSBgJHtwa2dOYW1lfSR7cGtnVmVyID8gJ0AnICsgcGtnVmVyIDogJyd9YDtcbiAgICBjb25zdCBzcGVjTXNnID0gbnBtU3BlYyA9PT0gaW5zdGFsbFNwZWMgPyAnJyA6IGAgdXNpbmcgTlBNIGluc3RhbGwgc3BlYyAnJHtucG1TcGVjfSdgO1xuICAgIGNvbnN0IG1zZyA9IGBJbnN0YWxsaW5nICcke2luc3RhbGxTcGVjfScke3NwZWNNc2d9YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnSnNvbkRhdGEgPSBhd2FpdCBzcGluV2l0aCh0aGlzLmlzSnNvbk91dHB1dCwgbXNnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBrZ0pzb25EYXRhID0gYXdhaXQgbnBtLmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUsIHtcbiAgICAgICAgICBwa2dWZXIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbkRhdGEsIGluc3RhbGxTcGVjKTtcbiAgICAgICAgcmV0dXJuIHBrZ0pzb25EYXRhO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmdldEV4dGVuc2lvbkZpZWxkcyhwa2dKc29uRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIGluc3RhbGxpbmcgcGFja2FnZTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0ZXh0IHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYWZ0ZXIgYW4gZXh0ZW5zaW9uIGhhcyBiZWVuIGluc3RhbGxlZC4gVGhpc1xuICAgKiBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IGRyaXZlcnMvcGx1Z2lucyB3aXRoIHRoZWlyIG93biBwYXJ0aWN1bGFyIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uQXJnc30gYXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGdldFBvc3RJbnN0YWxsVGV4dChhcmdzKSB7XG4gICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcignTXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBmaW5hbCBjbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgYW4gTlBNIG1vZHVsZSdzIHBhY2thZ2UuanNvbiBhbmQgZXh0cmFjdCBBcHBpdW0gZHJpdmVyIGluZm9ybWF0aW9uIGZyb20gYSBzcGVjaWFsXG4gICAqICdhcHBpdW0nIGZpZWxkIGluIHRoZSBKU09OIGRhdGEuIFdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBlLmcuIGRldGVybWluZSB3aGljaCBjbGFzcyB0b1xuICAgKiBsb2FkIGFzIHRoZSBtYWluIGRyaXZlciBjbGFzcywgb3IgdG8gYmUgYWJsZSB0byBkZXRlY3QgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBkcml2ZXIgYW5kXG4gICAqIGFwcGl1bSB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gcGtnSnNvbiAtIHRoZSBwYWNrYWdlLmpzb24gZGF0YSBmb3IgYSBkcml2ZXIgbW9kdWxlLCBhcyBpZiBpdCBoYWQgYmVlbiBzdHJhaWdodGZvcndhcmRseSAncmVxdWlyZSdkXG4gICAqIEByZXR1cm5zIHtFeHRlbnNpb25GaWVsZHM8RXh0VHlwZT59XG4gICAqL1xuICBnZXRFeHRlbnNpb25GaWVsZHMocGtnSnNvbikge1xuICAgIGNvbnN0IHthcHBpdW0sIG5hbWUsIHZlcnNpb24sIHBlZXJEZXBlbmRlbmNpZXN9ID0gcGtnSnNvbjtcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5hcHBpdW0sXG4gICAgICBwa2dOYW1lOiBuYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGFwcGl1bVZlcnNpb246IHBlZXJEZXBlbmRlbmNpZXM/LmFwcGl1bSxcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4dGVuc2lvbkZpZWxkczxFeHRUeXBlPn0gKi8gKHJlc3VsdCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBfcmVxdWlyZWRfIHJvb3QgZmllbGRzIG9mIGFuIGV4dGVuc2lvbidzIGBwYWNrYWdlLmpzb25gIGZpbGUuXG4gICAqXG4gICAqIFRoZXNlIHJlcXVpcmVkIGZpZWxkcyBhcmU6XG4gICAqIC0gYG5hbWVgXG4gICAqIC0gYHZlcnNpb25gXG4gICAqIC0gYGFwcGl1bWBcbiAgICogQHBhcmFtIHtpbXBvcnQoJ3R5cGUtZmVzdCcpLlBhY2thZ2VKc29ufSBwa2dKc29uIC0gYHBhY2thZ2UuanNvbmAgb2YgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICogQHRocm93cyB7UmVmZXJlbmNlRXJyb3J9IElmIGBwYWNrYWdlLmpzb25gIGhhcyBhIG1pc3Npbmcgb3IgaW52YWxpZCBmaWVsZFxuICAgKiBAcmV0dXJucyB7cGtnSnNvbiBpcyBFeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn1cbiAgICovXG4gIHZhbGlkYXRlUGFja2FnZUpzb24ocGtnSnNvbiwgaW5zdGFsbFNwZWMpIHtcbiAgICBjb25zdCB7YXBwaXVtLCBuYW1lLCB2ZXJzaW9ufSA9IC8qKiBAdHlwZSB7RXh0UGFja2FnZUpzb248RXh0VHlwZT59ICovIChwa2dKc29uKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkXG4gICAgICogQHJldHVybnMge1JlZmVyZW5jZUVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yID0gKGZpZWxkKSA9PlxuICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICBgJHt0aGlzLnR5cGV9IFwiJHtpbnN0YWxsU3BlY31cIiBpbnZhbGlkOyBtaXNzaW5nIGEgXFxgJHtmaWVsZH1cXGAgZmllbGQgb2YgaXRzIFxcYHBhY2thZ2UuanNvblxcYGBcbiAgICAgICk7XG5cbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCduYW1lJyk7XG4gICAgfVxuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0ZpZWxkRXJyb3IoJ3ZlcnNpb24nKTtcbiAgICB9XG4gICAgaWYgKCFhcHBpdW0pIHtcbiAgICAgIHRocm93IGNyZWF0ZU1pc3NpbmdGaWVsZEVycm9yKCdhcHBpdW0nKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRlRXh0ZW5zaW9uRmllbGRzKGFwcGl1bSwgaW5zdGFsbFNwZWMpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRm9yIGFueSBgcGFja2FnZS5qc29uYCBmaWVsZHMgd2hpY2ggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZXh0ZW5zaW9uIHJlcXVpcmVzLCB2YWxpZGF0ZSB0aGVcbiAgICogcHJlc2VuY2UgYW5kIGZvcm0gb2YgdGhvc2UgZmllbGRzIG9uIHRoZSBgcGFja2FnZS5qc29uYCBkYXRhLCB0aHJvd2luZyBhbiBlcnJvciBpZiBhbnl0aGluZyBpc1xuICAgKiBhbWlzcy5cbiAgICpcbiAgICogQHBhcmFtIHtFeHRNZXRhZGF0YTxFeHRUeXBlPn0gZXh0TWV0YWRhdGEgLSB0aGUgZGF0YSBpbiB0aGUgXCJhcHBpdW1cIiBmaWVsZCBvZiBgcGFja2FnZS5qc29uYCBmb3IgYW4gZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIEV4dGVuc2lvbiBuYW1lL3NwZWNcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YWxpZGF0ZUV4dGVuc2lvbkZpZWxkcyhleHRNZXRhZGF0YSwgaW5zdGFsbFNwZWMpIHtcbiAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKCdNdXN0IGJlIGltcGxlbWVudGVkIGluIGZpbmFsIGNsYXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogVW5pbnN0YWxsIGFuIGV4dGVuc2lvbi5cbiAgICpcbiAgICogRmlyc3QgdHJpZXMgdG8gZG8gdGhpcyB2aWEgYG5wbSB1bmluc3RhbGxgLCBidXQgaWYgdGhhdCBmYWlscywganVzdCBgcm0gLXJmYCdzIHRoZSBleHRlbnNpb24gZGlyLlxuICAgKlxuICAgKiBXaWxsIG9ubHkgcmVtb3ZlIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgbWFuaWZlc3QgaWYgaXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VW5pbnN0YWxsT3B0c30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dFJlY29yZDxFeHRUeXBlPj59IG1hcCBvZiBhbGwgaW5zdGFsbGVkIGV4dGVuc2lvbiBuYW1lcyB0byBleHRlbnNpb24gZGF0YSAod2l0aG91dCB0aGUgZXh0ZW5zaW9uIGp1c3QgdW5pbnN0YWxsZWQpXG4gICAqL1xuICBhc3luYyBfdW5pbnN0YWxsKHtpbnN0YWxsU3BlY30pIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmlzSW5zdGFsbGVkKGluc3RhbGxTcGVjKSkge1xuICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRmF0YWxFcnJvcihcbiAgICAgICAgYENhbid0IHVuaW5zdGFsbCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9JzsgaXQgaXMgbm90IGluc3RhbGxlZGBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBrZ05hbWUgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXS5wa2dOYW1lO1xuICAgIGF3YWl0IG5wbS51bmluc3RhbGxQYWNrYWdlKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlbW92ZUV4dGVuc2lvbihpbnN0YWxsU3BlYyk7XG4gICAgdGhpcy5sb2cub2soYFN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCAke3RoaXMudHlwZX0gJyR7aW5zdGFsbFNwZWN9J2AuZ3JlZW4pO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gdXBkYXRlIG9uZSBvciBtb3JlIGRyaXZlcnMgdXNpbmcgTlBNXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVXBkYXRlT3B0c30gdXBkYXRlU3BlY1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEV4dGVuc2lvblVwZGF0ZVJlc3VsdD59XG4gICAqL1xuICBhc3luYyBfdXBkYXRlKHtpbnN0YWxsU3BlYywgdW5zYWZlfSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFsbCA9IGluc3RhbGxTcGVjID09PSBVUERBVEVfQUxMO1xuICAgIC8vIGlmIHdlJ3JlIHNwZWNpZmljYWxseSByZXF1ZXN0aW5nIGFuIHVwZGF0ZSBmb3IgYW4gZXh0ZW5zaW9uLCBtYWtlIHN1cmUgaXQncyBpbnN0YWxsZWRcbiAgICBpZiAoIXNob3VsZFVwZGF0ZUFsbCAmJiAhdGhpcy5jb25maWcuaXNJbnN0YWxsZWQoaW5zdGFsbFNwZWMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBcIiR7aW5zdGFsbFNwZWN9XCIgd2FzIG5vdCBpbnN0YWxsZWQsIHNvIGNhbid0IGJlIHVwZGF0ZWRgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleHRzVG9VcGRhdGUgPSBzaG91bGRVcGRhdGVBbGxcbiAgICAgID8gT2JqZWN0LmtleXModGhpcy5jb25maWcuaW5zdGFsbGVkRXh0ZW5zaW9ucylcbiAgICAgIDogW2luc3RhbGxTcGVjXTtcblxuICAgIC8vICdlcnJvcnMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgZXJyb3Igb2JqZWN0cyBhcyB2YWx1ZXNcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsRXJyb3I+fSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuXG4gICAgLy8gJ3VwZGF0ZXMnIHdpbGwgaGF2ZSBleHQgbmFtZXMgYXMga2V5cyBhbmQgdXBkYXRlIG9iamVjdHMgYXMgdmFsdWVzLCB3aGVyZSBhbiB1cGRhdGVcbiAgICAvLyBvYmplY3QgaXMgb2YgdGhlIGZvcm0ge2Zyb206IHZlcnNpb25TdHJpbmcsIHRvOiB2ZXJzaW9uU3RyaW5nfVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxVcGRhdGVSZXBvcnQ+fSAqL1xuICAgIGNvbnN0IHVwZGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgZSBvZiBleHRzVG9VcGRhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKHRoaXMuaXNKc29uT3V0cHV0LCBgQ2hlY2tpbmcgaWYgJHt0aGlzLnR5cGV9ICcke2V9JyBpcyB1cGRhdGFibGVgLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZV0uaW5zdGFsbFR5cGUgIT09IElOU1RBTExfVFlQRV9OUE0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RVcGRhdGFibGVFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBDaGVja2luZyBpZiAke3RoaXMudHlwZX0gJyR7ZX0nIG5lZWRzIGFuIHVwZGF0ZWAsXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gYXdhaXQgdGhpcy5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZShlKTtcbiAgICAgICAgICAgIGlmICghKHVwZGF0ZS5zYWZlVXBkYXRlIHx8IHVwZGF0ZS51bnNhZmVVcGRhdGUpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGlmICghdW5zYWZlICYmICF1cGRhdGUuc2FmZVVwZGF0ZSkge1xuICAgICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgICAgICBgVGhlICR7dGhpcy50eXBlfSAnJHtlfScgaGFzIGEgbWFqb3IgcmV2aXNpb24gdXBkYXRlIGAgK1xuICAgICAgICAgICAgICBgKCR7dXBkYXRlLmN1cnJlbnR9ID0+ICR7dXBkYXRlLnVuc2FmZVVwZGF0ZX0pLCB3aGljaCBjb3VsZCBpbmNsdWRlIGAgK1xuICAgICAgICAgICAgICBgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IHdhbnQgdG8gYXBwbHkgdGhpcyB1cGRhdGUsIHJlLXJ1biB3aXRoIC0tdW5zYWZlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmVyID0gdW5zYWZlICYmIHVwZGF0ZS51bnNhZmVVcGRhdGUgPyB1cGRhdGUudW5zYWZlVXBkYXRlIDogdXBkYXRlLnNhZmVVcGRhdGU7XG4gICAgICAgIGF3YWl0IHNwaW5XaXRoKFxuICAgICAgICAgIHRoaXMuaXNKc29uT3V0cHV0LFxuICAgICAgICAgIGBVcGRhdGluZyBkcml2ZXIgJyR7ZX0nIGZyb20gJHt1cGRhdGUuY3VycmVudH0gdG8gJHt1cGRhdGVWZXJ9YCxcbiAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnVwZGF0ZUV4dGVuc2lvbihlLCB1cGRhdGVWZXIpXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZXNbZV0gPSB7ZnJvbTogdXBkYXRlLmN1cnJlbnQsIHRvOiB1cGRhdGVWZXJ9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVycm9yc1tlXSA9IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKCdVcGRhdGUgcmVwb3J0OicpO1xuXG4gICAgZm9yIChjb25zdCBbZSwgdXBkYXRlXSBvZiBfLnRvUGFpcnModXBkYXRlcykpIHtcbiAgICAgIHRoaXMubG9nLm9rKGAgIC0gJHt0aGlzLnR5cGV9ICR7ZX0gdXBkYXRlZDogJHt1cGRhdGUuZnJvbX0gPT4gJHt1cGRhdGUudG99YC5ncmVlbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZSwgZXJyXSBvZiBfLnRvUGFpcnMoZXJyb3JzKSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdFVwZGF0YWJsZUVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oXG4gICAgICAgICAgYCAgLSAnJHtlfScgd2FzIG5vdCBpbnN0YWxsZWQgdmlhIG5wbSwgc28gd2UgY291bGQgbm90IGNoZWNrIGAgKyBgZm9yIHVwZGF0ZXNgLnllbGxvd1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb1VwZGF0ZXNBdmFpbGFibGVFcnJvcikge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGAgIC0gJyR7ZX0nIGhhZCBubyB1cGRhdGVzIGF2YWlsYWJsZWAueWVsbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSwgbWFrZSBpdCBwb3Agd2l0aCByZWQhXG4gICAgICAgIHRoaXMubG9nLmVycm9yKGAgIC0gJyR7ZX0nIGZhaWxlZCB0byB1cGRhdGU6ICR7ZXJyfWAucmVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt1cGRhdGVzLCBlcnJvcnN9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGV4dGVuc2lvbiBuYW1lLCBmaWd1cmUgb3V0IHdoYXQgaXRzIGhpZ2hlc3QgcG9zc2libGUgdmVyc2lvbiB1cGdyYWRlIGlzLCBhbmQgYWxzbyB0aGVcbiAgICogaGlnaGVzdCBwb3NzaWJsZSBzYWZlIHVwZ3JhZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHQgLSBuYW1lIG9mIGV4dGVuc2lvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBvc3NpYmxlVXBkYXRlcz59XG4gICAqL1xuICBhc3luYyBjaGVja0ZvckV4dGVuc2lvblVwZGF0ZShleHQpIHtcbiAgICAvLyBUT0RPIGRlY2lkZSBob3cgd2Ugd2FudCB0byBoYW5kbGUgYmV0YSB2ZXJzaW9ucz9cbiAgICAvLyB0aGlzIGlzIGEgaGVscGVyIG1ldGhvZCwgJ2V4dCcgaXMgYXNzdW1lZCB0byBhbHJlYWR5IGJlIGluc3RhbGxlZCBoZXJlLCBhbmQgb2YgdGhlIG5wbVxuICAgIC8vIGluc3RhbGwgdHlwZVxuICAgIGNvbnN0IHt2ZXJzaW9uLCBwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbZXh0XTtcbiAgICAvKiogQHR5cGUge3N0cmluZz99ICovXG4gICAgbGV0IHVuc2FmZVVwZGF0ZSA9IGF3YWl0IG5wbS5nZXRMYXRlc3RWZXJzaW9uKHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsIHBrZ05hbWUpO1xuICAgIGxldCBzYWZlVXBkYXRlID0gYXdhaXQgbnBtLmdldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbihcbiAgICAgIHRoaXMuY29uZmlnLmFwcGl1bUhvbWUsXG4gICAgICBwa2dOYW1lLFxuICAgICAgdmVyc2lvblxuICAgICk7XG4gICAgaWYgKHVuc2FmZVVwZGF0ZSAhPT0gbnVsbCAmJiAhdXRpbC5jb21wYXJlVmVyc2lvbnModW5zYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyB0aGUgbGF0ZXN0IHZlcnNpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyB0aGVyZSdzIG5vIHBvc3NpYmxlIHVwZGF0ZVxuICAgICAgdW5zYWZlVXBkYXRlID0gbnVsbDtcbiAgICAgIHNhZmVVcGRhdGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodW5zYWZlVXBkYXRlICYmIHVuc2FmZVVwZGF0ZSA9PT0gc2FmZVVwZGF0ZSkge1xuICAgICAgLy8gdGhlIGxhdGVzdCB1cGRhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIHNhZmUgdXBkYXRlLCB3aGljaCBtZWFucyBpdCdzIG5vdCBhY3R1YWxseSB1bnNhZmVcbiAgICAgIHVuc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChzYWZlVXBkYXRlICYmICF1dGlsLmNvbXBhcmVWZXJzaW9ucyhzYWZlVXBkYXRlLCAnPicsIHZlcnNpb24pKSB7XG4gICAgICAvLyBldmVuIHRoZSBzYWZlIHVwZGF0ZSBpcyBub3QgbGF0ZXIgdGhhbiB0aGUgY3VycmVudCwgc28gaXQgaXMgbm90IGFjdHVhbGx5IGFuIHVwZGF0ZVxuICAgICAgc2FmZVVwZGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7Y3VycmVudDogdmVyc2lvbiwgc2FmZVVwZGF0ZSwgdW5zYWZlVXBkYXRlfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSB1cGRhdGUgYW4gZXh0ZW5zaW9uIGluc3RhbGxlZCBieSBOUE0sIHVzaW5nIHRoZSBOUE0gY2xpLiBBbmQgdXBkYXRlIHRoZSBpbnN0YWxsYXRpb25cbiAgICogbWFuaWZlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIG5hbWUgb2YgZXh0ZW5zaW9uIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIHZlcnNpb24gc3RyaW5nIGlkZW50aWZpZXIgdG8gdXBkYXRlIGV4dGVuc2lvbiB0b1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUV4dGVuc2lvbihpbnN0YWxsU3BlYywgdmVyc2lvbikge1xuICAgIGNvbnN0IHtwa2dOYW1lfSA9IHRoaXMuY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnNbaW5zdGFsbFNwZWNdO1xuICAgIGNvbnN0IGV4dERhdGEgPSBhd2FpdCB0aGlzLmluc3RhbGxWaWFOcG0oe1xuICAgICAgaW5zdGFsbFNwZWMsXG4gICAgICBwa2dOYW1lLFxuICAgICAgcGtnVmVyOiB2ZXJzaW9uLFxuICAgIH0pO1xuICAgIGRlbGV0ZSBleHREYXRhWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYCR7dGhpcy50eXBlfU5hbWVgKV07XG4gICAgYXdhaXQgdGhpcy5jb25maWcudXBkYXRlRXh0ZW5zaW9uKGluc3RhbGxTcGVjLCBleHREYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc2NyaXB0IGNhY2hlZCBpbnNpZGUgdGhlIFwic2NyaXB0c1wiIGZpZWxkIHVuZGVyIFwiYXBwaXVtXCJcbiAgICogaW5zaWRlIG9mIHRoZSBkcml2ZXIvcGx1Z2lucyBcInBhY2thZ2UuanNvblwiIGZpbGUuIFdpbGwgdGhyb3dcbiAgICogYW4gZXJyb3IgaWYgdGhlIGRyaXZlci9wbHVnaW4gZG9lcyBub3QgY29udGFpbiBhIFwic2NyaXB0c1wiIGZpZWxkXG4gICAqIHVuZGVybmVhdGggdGhlIFwiYXBwaXVtXCIgZmllbGQgaW4gaXRzIHBhY2thZ2UuanNvbiwgaWYgdGhlXG4gICAqIFwic2NyaXB0c1wiIGZpZWxkIGlzIG5vdCBhIHBsYWluIG9iamVjdCwgb3IgaWYgdGhlIHNjcmlwdE5hbWUgaXNcbiAgICogbm90IGZvdW5kIHdpdGhpbiBcInNjcmlwdHNcIiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7UnVuT3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJ1bk91dHB1dD59XG4gICAqL1xuICBhc3luYyBfcnVuKHtpbnN0YWxsU3BlYywgc2NyaXB0TmFtZSwgZXh0cmFBcmdzID0gW119KSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5pc0luc3RhbGxlZChpbnN0YWxsU3BlYykpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoYFRoZSAke3RoaXMudHlwZX0gXCIke2luc3RhbGxTcGVjfVwiIGlzIG5vdCBpbnN0YWxsZWRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRDb25maWcgPSB0aGlzLmNvbmZpZy5pbnN0YWxsZWRFeHRlbnNpb25zW2luc3RhbGxTcGVjXTtcblxuICAgIC8vIG5vdGU6IFRTIGNhbm5vdCB1bmRlcnN0YW5kIHRoYXQgXy5oYXMoKSBpcyBhIHR5cGUgZ3VhcmRcbiAgICBpZiAoIWV4dENvbmZpZy5zY3JpcHRzKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIGRvZXMgbm90IGNvbnRhaW4gdGhlIGAgK1xuICAgICAgICAgIGBcInNjcmlwdHNcIiBmaWVsZCB1bmRlcm5lYXRoIHRoZSBcImFwcGl1bVwiIGZpZWxkIGluIGl0cyBwYWNrYWdlLmpzb25gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dFNjcmlwdHMgPSBleHRDb25maWcuc2NyaXB0cztcblxuICAgIGlmICghXy5pc1BsYWluT2JqZWN0KGV4dFNjcmlwdHMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVGYXRhbEVycm9yKFxuICAgICAgICBgVGhlICR7dGhpcy50eXBlfSBuYW1lZCAnJHtpbnN0YWxsU3BlY30nIFwic2NyaXB0c1wiIGZpZWxkIG11c3QgYmUgYSBwbGFpbiBvYmplY3RgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghXy5oYXMoZXh0U2NyaXB0cywgc2NyaXB0TmFtZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUZhdGFsRXJyb3IoXG4gICAgICAgIGBUaGUgJHt0aGlzLnR5cGV9IG5hbWVkICcke2luc3RhbGxTcGVjfScgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc2NyaXB0OiAnJHtzY3JpcHROYW1lfSdgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBTdWJQcm9jZXNzKHByb2Nlc3MuZXhlY1BhdGgsIFtleHRTY3JpcHRzW3NjcmlwdE5hbWVdLCAuLi5leHRyYUFyZ3NdLCB7XG4gICAgICBjd2Q6IHRoaXMuY29uZmlnLmdldEluc3RhbGxQYXRoKGluc3RhbGxTcGVjKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBSaW5nQnVmZmVyKDUwKTtcblxuICAgIHJ1bm5lci5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgb3V0cHV0LmVucXVldWUobGluZSk7XG4gICAgICB0aGlzLmxvZy5sb2cobGluZSk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBydW5uZXIuc3RhcnQoMCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVubmVyLmpvaW4oKTtcbiAgICAgIHRoaXMubG9nLm9rKGAke3NjcmlwdE5hbWV9IHN1Y2Nlc3NmdWxseSByYW5gLmdyZWVuKTtcbiAgICAgIHJldHVybiB7b3V0cHV0OiBvdXRwdXQuZ2V0QnVmZigpfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGVuIHJ1bm5pbmcgJyR7c2NyaXB0TmFtZX0nOiAke2Vyci5tZXNzYWdlfWAucmVkKTtcbiAgICAgIHJldHVybiB7ZXJyb3I6IGVyci5tZXNzYWdlLCBvdXRwdXQ6IG91dHB1dC5nZXRCdWZmKCl9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHRlbnNpb25Db21tYW5kO1xuZXhwb3J0IHtFeHRlbnNpb25Db21tYW5kfTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kfSBjb25zdHJ1Y3RvclxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25Db21tYW5kT3B0aW9uc1xuICogQHByb3BlcnR5IHtFeHRlbnNpb25Db25maWc8RXh0VHlwZT59IGNvbmZpZyAtIHRoZSBgRHJpdmVyQ29uZmlnYCBvciBgUGx1Z2luQ29uZmlnYCBpbnN0YW5jZSB1c2VkIGZvciB0aGlzIGNvbW1hbmRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0ganNvbiAtIHdoZXRoZXIgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgc2hvdWxkIGJlIEpTT04gb3IgdGV4dFxuICovXG5cbi8qKlxuICogRXh0cmEgc3R1ZmYgYWJvdXQgZXh0ZW5zaW9uczsgdXNlZCBpbmRpcmVjdGx5IGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25NZXRhZGF0YVxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnN0YWxsZWQgLSBJZiBgdHJ1ZWAsIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVwZGF0ZVZlcnNpb24gLSBJZiB0aGUgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCwgdGhlIHZlcnNpb24gaXQgY2FuIGJlIHVwZGF0ZWQgdG9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdW5zYWZlVXBkYXRlVmVyc2lvbiAtIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIG1ham9yIHZlcnNpb24gYnVtcFxuICogQHByb3BlcnR5IHtib29sZWFufSB1cFRvRGF0ZSAtIElmIHRoZSBleHRlbnNpb24gaXMgaW5zdGFsbGVkIGFuZCB0aGUgbGF0ZXN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLkRyaXZlclR5cGV9IERyaXZlclR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5QbHVnaW5UeXBlfSBQbHVnaW5UeXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dFJlY29yZDxFeHRUeXBlPn0gRXh0UmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9leHRlbnNpb24tY29uZmlnJykuRXh0ZW5zaW9uQ29uZmlnPEV4dFR5cGU+fSBFeHRlbnNpb25Db25maWdcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuRXh0TWV0YWRhdGE8RXh0VHlwZT59IEV4dE1ldGFkYXRhXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkV4dE1hbmlmZXN0PEV4dFR5cGU+fSBFeHRNYW5pZmVzdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtFeHRlbnNpb25UeXBlfSBFeHRUeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5FeHRQYWNrYWdlSnNvbjxFeHRUeXBlPn0gRXh0UGFja2FnZUpzb25cbiAqL1xuXG4vKipcbiAqIFBvc3NpYmxlIHJldHVybiB2YWx1ZSBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmxpc3R9XG4gKiBAdHlwZWRlZiBVbmluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZVxuICogQHByb3BlcnR5IHtmYWxzZX0gaW5zdGFsbGVkXG4gKi9cblxuLyoqXG4gKiBQb3NzaWJsZSByZXR1cm4gdmFsdWUgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fVxuICogQHR5cGVkZWYge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuSW50ZXJuYWxNZXRhZGF0YSAmIEV4dGVuc2lvbk1ldGFkYXRhfSBJbnN0YWxsZWRFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5saXN0fS5cbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEluc3RhbGxlZEV4dGVuc2lvbkxpc3REYXRhfFVuaW5zdGFsbGVkRXh0ZW5zaW9uTGlzdERhdGE+fSBFeHRlbnNpb25MaXN0RGF0YVxuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLl9ydW59LlxuICogQHR5cGVkZWYgUnVuT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbGxTcGVjIC0gbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRvIHJ1biBhIHNjcmlwdCBmcm9tXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2NyaXB0TmFtZSAtIG5hbWUgb2YgdGhlIHNjcmlwdCB0byBydW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtleHRyYUFyZ3NdIC0gYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHNjcmlwdFxuICovXG5cbi8qKlxuICogUmV0dXJuIHZhbHVlIG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fcnVufVxuICpcbiAqIEB0eXBlZGVmIFJ1bk91dHB1dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlcnJvcl0gLSBlcnJvciBtZXNzYWdlIGlmIHNjcmlwdCByYW4gdW5zdWNjZXNzZnVsbHksIG90aGVyd2lzZSB1bmRlZmluZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG91dHB1dCAtIHNjcmlwdCBvdXRwdXRcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIEV4dGVuc2lvblVwZGF0ZU9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbnN0YWxsU3BlYyAtIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdG8gdXBkYXRlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVuc2FmZSAtIGlmIHRydWUsIHdpbGwgcGVyZm9ybSB1bnNhZmUgdXBkYXRlcyBwYXN0IG1ham9yIHJldmlzaW9uIGJvdW5kYXJpZXNcbiAqL1xuXG4vKipcbiAqIFJldHVybiB2YWx1ZSBvZiB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VwZGF0ZX0uXG4gKiBAdHlwZWRlZiBFeHRlbnNpb25VcGRhdGVSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxFcnJvcj59IGVycm9ycyAtIG1hcCBvZiBleHQgbmFtZXMgdG8gZXJyb3Igb2JqZWN0c1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLFVwZGF0ZVJlcG9ydD59IHVwZGF0ZXMgLSBtYXAgb2YgZXh0IG5hbWVzIHRvIHtAbGlua2NvZGUgVXBkYXRlUmVwb3J0fXNcbiAqL1xuXG4vKipcbiAqIFBhcnQgb2YgcmVzdWx0IG9mIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5fdXBkYXRlfS5cbiAqIEB0eXBlZGVmIFVwZGF0ZVJlcG9ydFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZyb20gLSB2ZXJzaW9uIHRoZSBleHRlbnNpb24gd2FzIHVwZGF0ZWQgZnJvbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRvIC0gdmVyc2lvbiB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkIHRvXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuX3VuaW5zdGFsbH0uXG4gKiBAdHlwZWRlZiBVbmluc3RhbGxPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byB1bmluc3RhbGxcbiAqL1xuXG4vKipcbiAqIFVzZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldFBvc3RJbnN0YWxsVGV4dH1cbiAqIEB0eXBlZGVmIEV4dGVuc2lvbkFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHROYW1lIC0gdGhlIG5hbWUgb2YgYW4gZXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkge29iamVjdH0gZXh0RGF0YSAtIHRoZSBkYXRhIGZvciBhbiBpbnN0YWxsZWQgZXh0ZW5zaW9uXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmtjb2RlIEV4dGVuc2lvbkNvbW1hbmQuaW5zdGFsbFZpYU5wbX1cbiAqIEB0eXBlZGVmIEluc3RhbGxWaWFOcG1BcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGtnTmFtZSAtIHRoZSBOUE0gcGFja2FnZSBuYW1lIG9mIHRoZSBleHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGtnVmVyXSAtIHRoZSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBOUE0gcGFja2FnZVxuICovXG5cbi8qKlxuICogT2JqZWN0IHJldHVybmVkIGJ5IHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5jaGVja0ZvckV4dGVuc2lvblVwZGF0ZX1cbiAqIEB0eXBlZGVmIFBvc3NpYmxlVXBkYXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnQgLSBjdXJyZW50IHZlcnNpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHNhZmVseSB1cGRhdGUgdG8gaWYgaXQgZXhpc3RzLCBvciBudWxsXG4gKiBAcHJvcGVydHkge3N0cmluZz99IHVuc2FmZVVwZGF0ZSAtIHZlcnNpb24gd2UgY2FuIHVuc2FmZWx5IHVwZGF0ZSB0byBpZiBpdCBleGlzdHMsIG9yIG51bGxcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGlua2NvZGUgRXh0ZW5zaW9uQ29tbWFuZC5faW5zdGFsbH1cbiAqIEB0eXBlZGVmIEluc3RhbGxBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaW5zdGFsbFNwZWMgLSB0aGUgbmFtZSBvciBzcGVjIG9mIGFuIGV4dGVuc2lvbiB0byBpbnN0YWxsXG4gKiBAcHJvcGVydHkge2ltcG9ydCgnYXBwaXVtL3R5cGVzJykuSW5zdGFsbFR5cGV9IGluc3RhbGxUeXBlIC0gaG93IHRvIGluc3RhbGwgdGhpcyBleHRlbnNpb24uIE9uZSBvZiB0aGUgSU5TVEFMTF9UWVBFU1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYWNrYWdlTmFtZV0gLSBmb3IgZ2l0L2dpdGh1YiBpbnN0YWxscywgdGhlIGV4dGVuc2lvbiBub2RlIHBhY2thZ2UgbmFtZVxuICovXG5cbi8qKlxuICogUmV0dXJuZWQgYnkge0BsaW5rY29kZSBFeHRlbnNpb25Db21tYW5kLmdldEV4dGVuc2lvbkZpZWxkc31cbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dE1ldGFkYXRhPEV4dFR5cGU+ICYgeyBwa2dOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgYXBwaXVtVmVyc2lvbjogc3RyaW5nIH0gJiBpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkNvbW1vbkV4dE1ldGFkYXRhfSBFeHRlbnNpb25GaWVsZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBEcml2ZXJUeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fRFJJVkVSUyA6IEV4dFR5cGUgZXh0ZW5kcyBQbHVnaW5UeXBlID8gdHlwZW9mIGltcG9ydCgnLi4vY29uc3RhbnRzJykuS05PV05fUExVR0lOUyA6IG5ldmVyfSBLbm93bkV4dGVuc2lvbnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNob3dJbnN0YWxsZWQgLSB3aGV0aGVyIHNob3VsZCBzaG93IG9ubHkgaW5zdGFsbGVkIGV4dGVuc2lvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1VwZGF0ZXMgLSB3aGV0aGVyIHNob3VsZCBzaG93IGF2YWlsYWJsZSB1cGRhdGVzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBTUE7Ozs7QUFFQSxNQUFN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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-command.js","names":["UPDATE_ALL","NotUpdatableError","Error","NoUpdatesAvailableError","ExtensionCommand","config","knownExtensions","isJsonOutput","constructor","json","log","console","CliConsole","jsonMode","Boolean","type","extensionType","_createFatalError","message","decorate","execute","args","cmd","_","isFunction","executeCmd","bind","list","showInstalled","showUpdates","lsMsg","installedNames","Object","keys","installedExtensions","knownNames","exts","reduce","acc","name","includes","installed","pkgName","spinWith","ext","data","toPairs","installType","INSTALL_TYPE_NPM","updates","checkForExtensionUpdate","updateVersion","safeUpdate","unsafeUpdateVersion","unsafeUpdate","upToDate","listData","installTxt","grey","updateTxt","upToDateTxt","unsafeUpdateTxt","installSpec","version","typeTxt","INSTALL_TYPE_GIT","INSTALL_TYPE_GITHUB","yellow","INSTALL_TYPE_LOCAL","magenta","green","cyan","_install","packageName","extData","installOpts","probableExtName","split","length","replace","pkgVer","path","isAbsolute","resolve","splits","msg","JSON","stringify","isInstalled","installViaNpm","extName","extManifest","errors","warnings","B","all","getProblems","getWarnings","errorMap","Map","warningMap","errorSummaries","warningSummaries","getValidationResultSummaries","isEmpty","join","warn","addExtension","env","hasAppiumDependency","appiumHome","packageDidChange","info","getPostInstallText","npmSpec","specMsg","pkgJsonData","npm","installPackage","validatePackageJson","getExtensionFields","err","pkgJson","appium","peerDependencies","result","appiumVersion","createMissingFieldError","field","ReferenceError","validateExtensionFields","extMetadata","_uninstall","uninstallPackage","removeExtension","ok","_update","unsafe","shouldUpdateAll","extsToUpdate","e","update","current","updateVer","updateExtension","from","to","error","red","getLatestVersion","getLatestSafeUpgradeVersion","util","compareVersions","_run","scriptName","extraArgs","extConfig","scripts","extScripts","isPlainObject","has","runner","SubProcess","process","execPath","cwd","getInstallPath","output","RingBuffer","on","line","enqueue","start","getBuff"],"sources":["../../../lib/cli/extension-command.js"],"sourcesContent":["/* eslint-disable no-console */\nimport B from 'bluebird';\nimport _ from 'lodash';\nimport path from 'path';\nimport {npm, util, env, console} from '@appium/support';\nimport {spinWith, RingBuffer} from './utils';\nimport {SubProcess} from 'teen_process';\nimport {\n INSTALL_TYPE_NPM,\n INSTALL_TYPE_GIT,\n INSTALL_TYPE_GITHUB,\n INSTALL_TYPE_LOCAL,\n} from '../extension/extension-config';\nimport {packageDidChange} from '../extension/package-changed';\n\nconst UPDATE_ALL = 'installed';\n\nclass NotUpdatableError extends Error {}\nclass NoUpdatesAvailableError extends Error {}\n\n/**\n * @template {ExtensionType} ExtType\n */\nclass ExtensionCommand {\n /**\n * This is the `DriverConfig` or `PluginConfig`, depending on `ExtType`.\n * @type {ExtensionConfig<ExtType>}\n */\n config;\n\n /**\n * {@linkcode Record} of official plugins or drivers.\n * @type {KnownExtensions<ExtType>}\n */\n knownExtensions;\n\n /**\n * If `true`, command output has been requested as JSON.\n * @type {boolean}\n */\n isJsonOutput;\n\n /**\n * Build an ExtensionCommand\n * @param {ExtensionCommandOptions<ExtType>} opts\n */\n constructor({config, json}) {\n this.config = config;\n this.log = new console.CliConsole({jsonMode: json});\n this.isJsonOutput = Boolean(json);\n }\n\n /**\n * `driver` or `plugin`, depending on the `ExtensionConfig`.\n */\n get type() {\n return this.config.extensionType;\n }\n\n /**\n * Logs a message and returns an {@linkcode Error} to throw.\n *\n * For TS to understand that a function throws an exception, it must actually throw an exception--\n * in other words, _calling_ a function which is guaranteed to throw an exception is not enough--\n * nor is something like `@returns {never}` which does not imply a thrown exception.\n * @param {string} message\n * @protected\n * @returns {Error}\n */\n _createFatalError(message) {\n return new Error(this.log.decorate(message, 'error'));\n }\n\n /**\n * Take a CLI parse and run an extension command based on its type\n *\n * @param {object} args - a key/value object with CLI flags and values\n * @return {Promise<object>} the result of the specific command which is executed\n */\n async execute(args) {\n const cmd = args[`${this.type}Command`];\n if (!_.isFunction(this[cmd])) {\n throw this._createFatalError(`Cannot handle ${this.type} command ${cmd}`);\n }\n const executeCmd = this[cmd].bind(this);\n return await executeCmd(args);\n }\n\n /**\n * List extensions\n *\n * @param {ListOptions} opts\n * @return {Promise<ExtensionListData>} map of extension names to extension data\n */\n async list({showInstalled, showUpdates}) {\n const lsMsg = `Listing ${showInstalled ? 'installed' : 'available'} ${this.type}s`;\n const installedNames = Object.keys(this.config.installedExtensions);\n const knownNames = Object.keys(this.knownExtensions);\n const exts = [...installedNames, ...knownNames].reduce(\n (acc, name) => {\n if (!acc[name]) {\n if (installedNames.includes(name)) {\n acc[name] = {\n ...this.config.installedExtensions[name],\n installed: true,\n };\n } else if (!showInstalled) {\n acc[name] = {pkgName: this.knownExtensions[name], installed: false};\n }\n }\n return acc;\n },\n /**\n * This accumulator contains either {@linkcode UninstalledExtensionLIstData} _or_\n * {@linkcode InstalledExtensionListData} without upgrade information (which is added by the below code block)\n * @type {Record<string,Partial<InstalledExtensionListData>|UninstalledExtensionListData>}\n */ ({})\n );\n\n // if we want to show whether updates are available, put that behind a spinner\n await spinWith(this.isJsonOutput, lsMsg, async () => {\n if (!showUpdates) {\n return;\n }\n for (const [ext, data] of _.toPairs(exts)) {\n if (!data.installed || data.installType !== INSTALL_TYPE_NPM) {\n // don't need to check for updates on exts that aren't installed\n // also don't need to check for updates on non-npm exts\n continue;\n }\n const updates = await this.checkForExtensionUpdate(ext);\n data.updateVersion = updates.safeUpdate;\n data.unsafeUpdateVersion = updates.unsafeUpdate;\n data.upToDate = updates.safeUpdate === null && updates.unsafeUpdate === null;\n }\n });\n\n const listData = /** @type {ExtensionListData} */ (exts);\n\n // if we're just getting the data, short circuit return here since we don't need to do any\n // formatting logic\n if (this.isJsonOutput) {\n return listData;\n }\n\n for (const [name, data] of _.toPairs(listData)) {\n let installTxt = ' [not installed]'.grey;\n let updateTxt = '';\n let upToDateTxt = '';\n let unsafeUpdateTxt = '';\n if (data.installed) {\n const {installType, installSpec, updateVersion, unsafeUpdateVersion, version, upToDate} =\n data;\n let typeTxt;\n switch (installType) {\n case INSTALL_TYPE_GIT:\n case INSTALL_TYPE_GITHUB:\n typeTxt = `(cloned from ${installSpec})`.yellow;\n break;\n case INSTALL_TYPE_LOCAL:\n typeTxt = `(linked from ${installSpec})`.magenta;\n break;\n default:\n typeTxt = '(NPM)';\n }\n installTxt = `@${version.yellow} ${('[installed ' + typeTxt + ']').green}`;\n\n if (showUpdates) {\n if (updateVersion) {\n updateTxt = ` [${updateVersion} available]`.magenta;\n }\n if (upToDate) {\n upToDateTxt = ` [Up to date]`.green;\n }\n if (unsafeUpdateVersion) {\n unsafeUpdateTxt = ` [${unsafeUpdateVersion} available (potentially unsafe)]`.cyan;\n }\n }\n }\n\n this.log.log(`- ${name.yellow}${installTxt}${updateTxt}${upToDateTxt}${unsafeUpdateTxt}`);\n }\n\n return listData;\n }\n\n /**\n * Install an extension\n *\n * @param {InstallArgs} args\n * @return {Promise<ExtRecord<ExtType>>} map of all installed extension names to extension data\n */\n async _install({installSpec, installType, packageName}) {\n /** @type {ExtensionFields<ExtType>} */\n let extData;\n\n if (packageName && [INSTALL_TYPE_LOCAL, INSTALL_TYPE_NPM].includes(installType)) {\n throw this._createFatalError(`When using --source=${installType}, cannot also use --package`);\n }\n\n if (!packageName && [INSTALL_TYPE_GIT, INSTALL_TYPE_GITHUB].includes(installType)) {\n throw this._createFatalError(`When using --source=${installType}, must also use --package`);\n }\n\n /**\n * @type {InstallViaNpmArgs}\n */\n let installOpts;\n\n /**\n * The probable (?) name of the extension derived from the install spec.\n *\n * If using a local install type, this will remain empty.\n * @type {string}\n */\n let probableExtName = '';\n\n // depending on `installType`, build the options to pass into `installViaNpm`\n if (installType === INSTALL_TYPE_GITHUB) {\n if (installSpec.split('/').length !== 2) {\n throw this._createFatalError(\n `Github ${this.type} spec ${installSpec} appeared to be invalid; ` +\n 'it should be of the form <org>/<repo>'\n );\n }\n installOpts = {\n installSpec,\n pkgName: /** @type {string} */ (packageName),\n };\n probableExtName = installSpec;\n } else if (installType === INSTALL_TYPE_GIT) {\n // git urls can have '.git' at the end, but this is not necessary and would complicate the\n // way we download and name directories, so we can just remove it\n installSpec = installSpec.replace(/\\.git$/, '');\n installOpts = {\n installSpec,\n pkgName: /** @type {string} */ (packageName),\n };\n probableExtName = installSpec;\n } else {\n let pkgName, pkgVer;\n if (installType === INSTALL_TYPE_LOCAL) {\n pkgName = path.isAbsolute(installSpec) ? installSpec : path.resolve(installSpec);\n } else {\n // at this point we have either an npm package or an appium verified extension\n // name or a local path. both of which will be installed via npm.\n // extensions installed via npm can include versions or tags after the '@'\n // sign, so check for that. We also need to be careful that package names themselves can\n // contain the '@' symbol, as in `npm install @appium/fake-driver@1.2.0`\n let name;\n const splits = installSpec.split('@');\n if (installSpec[0] === '@') {\n // this is the case where we have an npm org included in the package name\n [name, pkgVer] = [`@${splits[1]}`, splits[2]];\n } else {\n // this is the case without an npm org\n [name, pkgVer] = splits;\n }\n\n if (installType === INSTALL_TYPE_NPM) {\n // if we're installing a named package from npm, we don't need to check\n // against the appium extension list; just use the installSpec as is\n pkgName = name;\n } else {\n // if we're installing a named appium driver (like 'xcuitest') we need to\n // dereference the actual npm package ('appiupm-xcuitest-driver'), so\n // check it exists and get the correct package\n const knownNames = Object.keys(this.knownExtensions);\n if (!_.includes(knownNames, name)) {\n const msg =\n `Could not resolve ${this.type}; are you sure it's in the list ` +\n `of supported ${this.type}s? ${JSON.stringify(knownNames)}`;\n throw this._createFatalError(msg);\n }\n probableExtName = name;\n pkgName = this.knownExtensions[name];\n // given that we'll use the install type in the driver json, store it as\n // 'npm' now\n installType = INSTALL_TYPE_NPM;\n }\n }\n installOpts = {installSpec, pkgName, pkgVer};\n }\n\n // fail fast here if we can\n if (probableExtName && this.config.isInstalled(probableExtName)) {\n throw this._createFatalError(\n `A ${this.type} named \"${probableExtName}\" is already installed. ` +\n `Did you mean to update? Run \"appium ${this.type} update\". See ` +\n `installed ${this.type}s with \"appium ${this.type} list --installed\".`\n );\n }\n\n extData = await this.installViaNpm(installOpts);\n\n // this _should_ be the same as `probablyExtName` as the one derived above unless\n // install type is local.\n const extName = extData[/** @type {string} */ (`${this.type}Name`)];\n\n // check _a second time_ with the more-accurate extName\n if (this.config.isInstalled(extName)) {\n throw this._createFatalError(\n `A ${this.type} named \"${extName}\" is already installed. ` +\n `Did you mean to update? Run \"appium ${this.type} update\". See ` +\n `installed ${this.type}s with \"appium ${this.type} list --installed\".`\n );\n }\n\n // this field does not exist as such in the manifest (it's used as a property name instead)\n // so that's why it's being removed here.\n delete extData[/** @type {string} */ (`${this.type}Name`)];\n\n /** @type {ExtManifest<ExtType>} */\n const extManifest = {...extData, installType, installSpec};\n const [errors, warnings] = await B.all([\n this.config.getProblems(extName, extManifest),\n this.config.getWarnings(extName, extManifest),\n ]);\n const errorMap = new Map([[extName, errors]]);\n const warningMap = new Map([[extName, warnings]]);\n const {errorSummaries, warningSummaries} = this.config.getValidationResultSummaries(\n errorMap,\n warningMap\n );\n\n if (!_.isEmpty(errorSummaries)) {\n throw this._createFatalError(errorSummaries.join('\\n'));\n }\n\n // note that we won't show any warnings if there were errors.\n if (!_.isEmpty(warningSummaries)) {\n this.log.warn(warningSummaries.join('\\n'));\n }\n\n await this.config.addExtension(extName, extManifest);\n\n // update the if we've changed the local `package.json`\n if (await env.hasAppiumDependency(this.config.appiumHome)) {\n await packageDidChange(this.config.appiumHome);\n }\n\n // log info for the user\n this.log.info(this.getPostInstallText({extName, extData}));\n\n return this.config.installedExtensions;\n }\n\n /**\n * Install an extension via NPM\n *\n * @param {InstallViaNpmArgs} args\n */\n async installViaNpm({installSpec, pkgName, pkgVer}) {\n const npmSpec = `${pkgName}${pkgVer ? '@' + pkgVer : ''}`;\n const specMsg = npmSpec === installSpec ? '' : ` using NPM install spec '${npmSpec}'`;\n const msg = `Installing '${installSpec}'${specMsg}`;\n try {\n const pkgJsonData = await spinWith(this.isJsonOutput, msg, async () => {\n const pkgJsonData = await npm.installPackage(this.config.appiumHome, pkgName, {\n pkgVer,\n });\n this.validatePackageJson(pkgJsonData, installSpec);\n return pkgJsonData;\n });\n\n return this.getExtensionFields(pkgJsonData);\n } catch (err) {\n throw this._createFatalError(`Encountered an error when installing package: ${err.message}`);\n }\n }\n\n /**\n * Get the text which should be displayed to the user after an extension has been installed. This\n * is designed to be overridden by drivers/plugins with their own particular text.\n *\n * @param {ExtensionArgs} args\n * @returns {string}\n */\n // eslint-disable-next-line no-unused-vars\n getPostInstallText(args) {\n throw this._createFatalError('Must be implemented in final class');\n }\n\n /**\n * Take an NPM module's package.json and extract Appium driver information from a special\n * 'appium' field in the JSON data. We need this information to e.g. determine which class to\n * load as the main driver class, or to be able to detect incompatibilities between driver and\n * appium versions.\n *\n * @param {ExtPackageJson<ExtType>} pkgJson - the package.json data for a driver module, as if it had been straightforwardly 'require'd\n * @returns {ExtensionFields<ExtType>}\n */\n getExtensionFields(pkgJson) {\n const {appium, name, version, peerDependencies} = pkgJson;\n\n /** @type {unknown} */\n const result = {\n ...appium,\n pkgName: name,\n version,\n appiumVersion: peerDependencies?.appium,\n };\n return /** @type {ExtensionFields<ExtType>} */ (result);\n }\n\n /**\n * Validates the _required_ root fields of an extension's `package.json` file.\n *\n * These required fields are:\n * - `name`\n * - `version`\n * - `appium`\n * @param {import('type-fest').PackageJson} pkgJson - `package.json` of extension\n * @param {string} installSpec - Extension name/spec\n * @throws {ReferenceError} If `package.json` has a missing or invalid field\n * @returns {pkgJson is ExtPackageJson<ExtType>}\n */\n validatePackageJson(pkgJson, installSpec) {\n const {appium, name, version} = /** @type {ExtPackageJson<ExtType>} */ (pkgJson);\n\n /**\n *\n * @param {string} field\n * @returns {ReferenceError}\n */\n const createMissingFieldError = (field) =>\n new ReferenceError(\n `${this.type} \"${installSpec}\" invalid; missing a \\`${field}\\` field of its \\`package.json\\``\n );\n\n if (!name) {\n throw createMissingFieldError('name');\n }\n if (!version) {\n throw createMissingFieldError('version');\n }\n if (!appium) {\n throw createMissingFieldError('appium');\n }\n\n this.validateExtensionFields(appium, installSpec);\n\n return true;\n }\n\n /**\n * For any `package.json` fields which a particular type of extension requires, validate the\n * presence and form of those fields on the `package.json` data, throwing an error if anything is\n * amiss.\n *\n * @param {ExtMetadata<ExtType>} extMetadata - the data in the \"appium\" field of `package.json` for an extension\n * @param {string} installSpec - Extension name/spec\n */\n // eslint-disable-next-line no-unused-vars\n validateExtensionFields(extMetadata, installSpec) {\n throw this._createFatalError('Must be implemented in final class');\n }\n\n /**\n * Uninstall an extension.\n *\n * First tries to do this via `npm uninstall`, but if that fails, just `rm -rf`'s the extension dir.\n *\n * Will only remove the extension from the manifest if it has been successfully removed.\n *\n * @param {UninstallOpts} opts\n * @return {Promise<ExtRecord<ExtType>>} map of all installed extension names to extension data (without the extension just uninstalled)\n */\n async _uninstall({installSpec}) {\n if (!this.config.isInstalled(installSpec)) {\n throw this._createFatalError(\n `Can't uninstall ${this.type} '${installSpec}'; it is not installed`\n );\n }\n const pkgName = this.config.installedExtensions[installSpec].pkgName;\n await npm.uninstallPackage(this.config.appiumHome, pkgName);\n await this.config.removeExtension(installSpec);\n this.log.ok(`Successfully uninstalled ${this.type} '${installSpec}'`.green);\n return this.config.installedExtensions;\n }\n\n /**\n * Attempt to update one or more drivers using NPM\n *\n * @param {ExtensionUpdateOpts} updateSpec\n * @return {Promise<ExtensionUpdateResult>}\n */\n async _update({installSpec, unsafe}) {\n const shouldUpdateAll = installSpec === UPDATE_ALL;\n // if we're specifically requesting an update for an extension, make sure it's installed\n if (!shouldUpdateAll && !this.config.isInstalled(installSpec)) {\n throw this._createFatalError(\n `The ${this.type} \"${installSpec}\" was not installed, so can't be updated`\n );\n }\n const extsToUpdate = shouldUpdateAll\n ? Object.keys(this.config.installedExtensions)\n : [installSpec];\n\n // 'errors' will have ext names as keys and error objects as values\n /** @type {Record<string,Error>} */\n const errors = {};\n\n // 'updates' will have ext names as keys and update objects as values, where an update\n // object is of the form {from: versionString, to: versionString}\n /** @type {Record<string,UpdateReport>} */\n const updates = {};\n\n for (const e of extsToUpdate) {\n try {\n await spinWith(this.isJsonOutput, `Checking if ${this.type} '${e}' is updatable`, () => {\n if (this.config.installedExtensions[e].installType !== INSTALL_TYPE_NPM) {\n throw new NotUpdatableError();\n }\n });\n const update = await spinWith(\n this.isJsonOutput,\n `Checking if ${this.type} '${e}' needs an update`,\n async () => {\n const update = await this.checkForExtensionUpdate(e);\n if (!(update.safeUpdate || update.unsafeUpdate)) {\n throw new NoUpdatesAvailableError();\n }\n return update;\n }\n );\n if (!unsafe && !update.safeUpdate) {\n throw this._createFatalError(\n `The ${this.type} '${e}' has a major revision update ` +\n `(${update.current} => ${update.unsafeUpdate}), which could include ` +\n `breaking changes. If you want to apply this update, re-run with --unsafe`\n );\n }\n const updateVer = unsafe && update.unsafeUpdate ? update.unsafeUpdate : update.safeUpdate;\n await spinWith(\n this.isJsonOutput,\n `Updating driver '${e}' from ${update.current} to ${updateVer}`,\n async () => await this.updateExtension(e, updateVer)\n );\n updates[e] = {from: update.current, to: updateVer};\n } catch (err) {\n errors[e] = err;\n }\n }\n\n this.log.info('Update report:');\n\n for (const [e, update] of _.toPairs(updates)) {\n this.log.ok(` - ${this.type} ${e} updated: ${update.from} => ${update.to}`.green);\n }\n\n for (const [e, err] of _.toPairs(errors)) {\n if (err instanceof NotUpdatableError) {\n this.log.warn(\n ` - '${e}' was not installed via npm, so we could not check ` + `for updates`.yellow\n );\n } else if (err instanceof NoUpdatesAvailableError) {\n this.log.info(` - '${e}' had no updates available`.yellow);\n } else {\n // otherwise, make it pop with red!\n this.log.error(` - '${e}' failed to update: ${err}`.red);\n }\n }\n return {updates, errors};\n }\n\n /**\n * Given an extension name, figure out what its highest possible version upgrade is, and also the\n * highest possible safe upgrade.\n *\n * @param {string} ext - name of extension\n * @return {Promise<PossibleUpdates>}\n */\n async checkForExtensionUpdate(ext) {\n // TODO decide how we want to handle beta versions?\n // this is a helper method, 'ext' is assumed to already be installed here, and of the npm\n // install type\n const {version, pkgName} = this.config.installedExtensions[ext];\n /** @type {string?} */\n let unsafeUpdate = await npm.getLatestVersion(this.config.appiumHome, pkgName);\n let safeUpdate = await npm.getLatestSafeUpgradeVersion(\n this.config.appiumHome,\n pkgName,\n version\n );\n if (unsafeUpdate !== null && !util.compareVersions(unsafeUpdate, '>', version)) {\n // the latest version is not greater than the current version, so there's no possible update\n unsafeUpdate = null;\n safeUpdate = null;\n }\n if (unsafeUpdate && unsafeUpdate === safeUpdate) {\n // the latest update is the same as the safe update, which means it's not actually unsafe\n unsafeUpdate = null;\n }\n if (safeUpdate && !util.compareVersions(safeUpdate, '>', version)) {\n // even the safe update is not later than the current, so it is not actually an update\n safeUpdate = null;\n }\n return {current: version, safeUpdate, unsafeUpdate};\n }\n\n /**\n * Actually update an extension installed by NPM, using the NPM cli. And update the installation\n * manifest.\n *\n * @param {string} installSpec - name of extension to update\n * @param {string} version - version string identifier to update extension to\n * @returns {Promise<void>}\n */\n async updateExtension(installSpec, version) {\n const {pkgName} = this.config.installedExtensions[installSpec];\n const extData = await this.installViaNpm({\n installSpec,\n pkgName,\n pkgVer: version,\n });\n delete extData[/** @type {string} */ (`${this.type}Name`)];\n await this.config.updateExtension(installSpec, extData);\n }\n\n /**\n * Runs a script cached inside the \"scripts\" field under \"appium\"\n * inside of the driver/plugins \"package.json\" file. Will throw\n * an error if the driver/plugin does not contain a \"scripts\" field\n * underneath the \"appium\" field in its package.json, if the\n * \"scripts\" field is not a plain object, or if the scriptName is\n * not found within \"scripts\" object.\n *\n * @param {RunOptions} opts\n * @return {Promise<RunOutput>}\n */\n async _run({installSpec, scriptName, extraArgs = []}) {\n if (!this.config.isInstalled(installSpec)) {\n throw this._createFatalError(`The ${this.type} \"${installSpec}\" is not installed`);\n }\n\n const extConfig = this.config.installedExtensions[installSpec];\n\n // note: TS cannot understand that _.has() is a type guard\n if (!extConfig.scripts) {\n throw this._createFatalError(\n `The ${this.type} named '${installSpec}' does not contain the ` +\n `\"scripts\" field underneath the \"appium\" field in its package.json`\n );\n }\n\n const extScripts = extConfig.scripts;\n\n if (!_.isPlainObject(extScripts)) {\n throw this._createFatalError(\n `The ${this.type} named '${installSpec}' \"scripts\" field must be a plain object`\n );\n }\n\n if (!_.has(extScripts, scriptName)) {\n throw this._createFatalError(\n `The ${this.type} named '${installSpec}' does not support the script: '${scriptName}'`\n );\n }\n\n const runner = new SubProcess(process.execPath, [extScripts[scriptName], ...extraArgs], {\n cwd: this.config.getInstallPath(installSpec),\n });\n\n const output = new RingBuffer(50);\n\n runner.on('stream-line', (line) => {\n output.enqueue(line);\n this.log.log(line);\n });\n\n await runner.start(0);\n\n try {\n await runner.join();\n this.log.ok(`${scriptName} successfully ran`.green);\n return {output: output.getBuff()};\n } catch (err) {\n this.log.error(`Encountered an error when running '${scriptName}': ${err.message}`.red);\n return {error: err.message, output: output.getBuff()};\n }\n }\n}\n\nexport default ExtensionCommand;\nexport {ExtensionCommand};\n\n/**\n * Options for the {@linkcode ExtensionCommand} constructor\n * @template {ExtensionType} ExtType\n * @typedef ExtensionCommandOptions\n * @property {ExtensionConfig<ExtType>} config - the `DriverConfig` or `PluginConfig` instance used for this command\n * @property {boolean} json - whether the output of this command should be JSON or text\n */\n\n/**\n * Extra stuff about extensions; used indirectly by {@linkcode ExtensionCommand.list}.\n *\n * @typedef ExtensionMetadata\n * @property {boolean} installed - If `true`, the extension is installed\n * @property {string?} updateVersion - If the extension is installed, the version it can be updated to\n * @property {string?} unsafeUpdateVersion - Same as above, but a major version bump\n * @property {boolean} upToDate - If the extension is installed and the latest\n */\n\n/**\n * @typedef {import('@appium/types').ExtensionType} ExtensionType\n * @typedef {import('@appium/types').DriverType} DriverType\n * @typedef {import('@appium/types').PluginType} PluginType\n */\n\n/**\n * @template {ExtensionType} ExtType\n * @typedef {import('appium/types').ExtRecord<ExtType>} ExtRecord\n */\n\n/**\n * @template {ExtensionType} ExtType\n * @typedef {import('../extension/extension-config').ExtensionConfig<ExtType>} ExtensionConfig\n */\n\n/**\n * @template {ExtensionType} ExtType\n * @typedef {import('appium/types').ExtMetadata<ExtType>} ExtMetadata\n */\n\n/**\n * @template {ExtensionType} ExtType\n * @typedef {import('appium/types').ExtManifest<ExtType>} ExtManifest\n */\n\n/**\n * @template {ExtensionType} ExtType\n * @typedef {import('appium/types').ExtPackageJson<ExtType>} ExtPackageJson\n */\n\n/**\n * Possible return value for {@linkcode ExtensionCommand.list}\n * @typedef UninstalledExtensionListData\n * @property {string} pkgName\n * @property {false} installed\n */\n\n/**\n * Possible return value for {@linkcode ExtensionCommand.list}\n * @typedef {import('appium/types').InternalMetadata & ExtensionMetadata} InstalledExtensionListData\n */\n\n/**\n * Return value of {@linkcode ExtensionCommand.list}.\n * @typedef {Record<string,InstalledExtensionListData|UninstalledExtensionListData>} ExtensionListData\n */\n\n/**\n * Options for {@linkcode ExtensionCommand._run}.\n * @typedef RunOptions\n * @property {string} installSpec - name of the extension to run a script from\n * @property {string} scriptName - name of the script to run\n * @property {string[]} [extraArgs] - arguments to pass to the script\n */\n\n/**\n * Return value of {@linkcode ExtensionCommand._run}\n *\n * @typedef RunOutput\n * @property {string} [error] - error message if script ran unsuccessfully, otherwise undefined\n * @property {string[]} output - script output\n */\n\n/**\n * Options for {@linkcode ExtensionCommand._update}.\n * @typedef ExtensionUpdateOpts\n * @property {string} installSpec - the name of the extension to update\n * @property {boolean} unsafe - if true, will perform unsafe updates past major revision boundaries\n */\n\n/**\n * Return value of {@linkcode ExtensionCommand._update}.\n * @typedef ExtensionUpdateResult\n * @property {Record<string,Error>} errors - map of ext names to error objects\n * @property {Record<string,UpdateReport>} updates - map of ext names to {@linkcode UpdateReport}s\n */\n\n/**\n * Part of result of {@linkcode ExtensionCommand._update}.\n * @typedef UpdateReport\n * @property {string} from - version the extension was updated from\n * @property {string} to - version the extension was updated to\n */\n\n/**\n * Options for {@linkcode ExtensionCommand._uninstall}.\n * @typedef UninstallOpts\n * @property {string} installSpec - the name or spec of an extension to uninstall\n */\n\n/**\n * Used by {@linkcode ExtensionCommand.getPostInstallText}\n * @typedef ExtensionArgs\n * @property {string} extName - the name of an extension\n * @property {object} extData - the data for an installed extension\n */\n\n/**\n * Options for {@linkcode ExtensionCommand.installViaNpm}\n * @typedef InstallViaNpmArgs\n * @property {string} installSpec - the name or spec of an extension to install\n * @property {string} pkgName - the NPM package name of the extension\n * @property {string} [pkgVer] - the specific version of the NPM package\n */\n\n/**\n * Object returned by {@linkcode ExtensionCommand.checkForExtensionUpdate}\n * @typedef PossibleUpdates\n * @property {string} current - current version\n * @property {string?} safeUpdate - version we can safely update to if it exists, or null\n * @property {string?} unsafeUpdate - version we can unsafely update to if it exists, or null\n */\n\n/**\n * Options for {@linkcode ExtensionCommand._install}\n * @typedef InstallArgs\n * @property {string} installSpec - the name or spec of an extension to install\n * @property {import('appium/types').InstallType} installType - how to install this extension. One of the INSTALL_TYPES\n * @property {string} [packageName] - for git/github installs, the extension node package name\n */\n\n/**\n * Returned by {@linkcode ExtensionCommand.getExtensionFields}\n * @template {ExtensionType} ExtType\n * @typedef {ExtMetadata<ExtType> & { pkgName: string, version: string, appiumVersion: string } & import('appium/types').CommonExtMetadata} ExtensionFields\n */\n\n/**\n * @template {ExtensionType} ExtType\n * @typedef {ExtType extends DriverType ? typeof import('../constants').KNOWN_DRIVERS : ExtType extends PluginType ? typeof import('../constants').KNOWN_PLUGINS : never} KnownExtensions\n */\n\n/**\n * @typedef ListOptions\n * @property {boolean} showInstalled - whether should show only installed extensions\n * @property {boolean} showUpdates - whether should show available updates\n */\n"],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -18,6 +16,8 @@ var _constants = require("../constants");
18
16
 
19
17
  var _utils = require("./utils");
20
18
 
19
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
+
21
21
  const commandClasses = Object.freeze({
22
22
  [_constants.DRIVER_TYPE]: _driverCommand.default,
23
23
  [_constants.PLUGIN_TYPE]: _pluginCommand.default
@@ -67,4 +67,4 @@ async function runExtensionCommand(args, config) {
67
67
 
68
68
  return jsonResult;
69
69
  }
70
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kQ2xhc3NlcyIsIk9iamVjdCIsImZyZWV6ZSIsIkRSSVZFUl9UWVBFIiwiRHJpdmVyQ29tbWFuZCIsIlBMVUdJTl9UWVBFIiwiUGx1Z2luQ29tbWFuZCIsInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwiY29uZmlnIiwianNvblJlc3VsdCIsImV4dGVuc2lvblR5cGUiLCJ0eXBlIiwiZXh0Q21kIiwiVHlwZUVycm9yIiwianNvbiIsInN1cHByZXNzT3V0cHV0IiwiQm9vbGVhbiIsIkNvbW1hbmRDbGFzcyIsImNtZCIsImV4ZWN1dGUiLCJlcnIiLCJlcnJBbmRRdWl0IiwiY29uc29sZSIsImxvZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJKU09OX1NQQUNFUyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCBEcml2ZXJDb21tYW5kIGZyb20gJy4vZHJpdmVyLWNvbW1hbmQnO1xuaW1wb3J0IFBsdWdpbkNvbW1hbmQgZnJvbSAnLi9wbHVnaW4tY29tbWFuZCc7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRX0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7ZXJyQW5kUXVpdCwgSlNPTl9TUEFDRVN9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgY29tbWFuZENsYXNzZXMgPSBPYmplY3QuZnJlZXplKFxuICAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICAgIFtEUklWRVJfVFlQRV06IERyaXZlckNvbW1hbmQsXG4gICAgW1BMVUdJTl9UWVBFXTogUGx1Z2luQ29tbWFuZCxcbiAgfSlcbik7XG5cbi8qKlxuICogUnVuIGEgc3ViY29tbWFuZCBvZiB0aGUgJ2FwcGl1bSBkcml2ZXInIHR5cGUuIEVhY2ggc3ViY29tbWFuZCBoYXMgaXRzIG93biBzZXQgb2YgYXJndW1lbnRzIHdoaWNoXG4gKiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkFyZ3M8aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5XaXRoRXh0U3ViY29tbWFuZD59IGFyZ3MgLSBKUyBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgKGFzIGRlZmluZWQgaW5cbiAqIGRyaXZlci1wYXJzZXIuanMpXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gY29uZmlnIC0gRXh0ZW5zaW9uIGNvbmZpZyBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuRXh0ZW5zaW9uQ29tbWFuZChhcmdzLCBjb25maWcpIHtcbiAgLy8gVE9ETyBkcml2ZXIgY29uZmlnIGZpbGUgc2hvdWxkIGJlIGxvY2tlZCB3aGlsZSBhbnkgb2YgdGhlc2UgY29tbWFuZHMgYXJlXG4gIC8vIHJ1bm5pbmcgdG8gcHJldmVudCB3ZWlyZCBzaXR1YXRpb25zXG4gIGxldCBqc29uUmVzdWx0ID0gbnVsbDtcbiAgY29uc3Qge2V4dGVuc2lvblR5cGU6IHR5cGV9ID0gY29uZmlnO1xuICBjb25zdCBleHRDbWQgPSBhcmdzW2Ake3R5cGV9Q29tbWFuZGBdO1xuICBpZiAoIWV4dENtZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsICR7dHlwZX0gY29tbWFuZCB3aXRob3V0IGEgc3ViY29tbWFuZCBsaWtlICdpbnN0YWxsJ2ApO1xuICB9XG4gIGxldCB7anNvbiwgc3VwcHJlc3NPdXRwdXR9ID0gYXJncztcbiAganNvbiA9IEJvb2xlYW4oanNvbik7XG4gIGlmIChzdXBwcmVzc091dHB1dCkge1xuICAgIGpzb24gPSB0cnVlO1xuICB9XG4gIGNvbnN0IENvbW1hbmRDbGFzcyA9IC8qKiBAdHlwZSB7RXh0Q29tbWFuZDxFeHRUeXBlPn0gKi8gKGNvbW1hbmRDbGFzc2VzW3R5cGVdKTtcbiAgY29uc3QgY21kID0gbmV3IENvbW1hbmRDbGFzcyh7Y29uZmlnLCBqc29ufSk7XG4gIHRyeSB7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge3J1bkV4dGVuc2lvbkNvbW1hbmR9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBEcml2ZXJUeXBlID8gQ2xhc3M8RHJpdmVyQ29tbWFuZD4gOiBFeHRUeXBlIGV4dGVuZHMgUGx1Z2luVHlwZSA/IENsYXNzPFBsdWdpbkNvbW1hbmQ+IDogbmV2ZXJ9IEV4dENvbW1hbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyVHlwZX0gRHJpdmVyVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8VD59IENsYXNzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRU8sTUFBTUEsY0FBYyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FDTjtFQUNwQixDQUFDQyxzQkFBRCxHQUFlQyxzQkFESztFQUVwQixDQUFDQyxzQkFBRCxHQUFlQztBQUZLLENBRE0sQ0FBdkI7OztBQWdCUCxlQUFlQyxtQkFBZixDQUFtQ0MsSUFBbkMsRUFBeUNDLE1BQXpDLEVBQWlEO0VBRy9DLElBQUlDLFVBQVUsR0FBRyxJQUFqQjtFQUNBLE1BQU07SUFBQ0MsYUFBYSxFQUFFQztFQUFoQixJQUF3QkgsTUFBOUI7RUFDQSxNQUFNSSxNQUFNLEdBQUdMLElBQUksQ0FBRSxHQUFFSSxJQUFLLFNBQVQsQ0FBbkI7O0VBQ0EsSUFBSSxDQUFDQyxNQUFMLEVBQWE7SUFDWCxNQUFNLElBQUlDLFNBQUosQ0FBZSxlQUFjRixJQUFLLDhDQUFsQyxDQUFOO0VBQ0Q7O0VBQ0QsSUFBSTtJQUFDRyxJQUFEO0lBQU9DO0VBQVAsSUFBeUJSLElBQTdCO0VBQ0FPLElBQUksR0FBR0UsT0FBTyxDQUFDRixJQUFELENBQWQ7O0VBQ0EsSUFBSUMsY0FBSixFQUFvQjtJQUNsQkQsSUFBSSxHQUFHLElBQVA7RUFDRDs7RUFDRCxNQUFNRyxZQUFZLEdBQXVDbEIsY0FBYyxDQUFDWSxJQUFELENBQXZFO0VBQ0EsTUFBTU8sR0FBRyxHQUFHLElBQUlELFlBQUosQ0FBaUI7SUFBQ1QsTUFBRDtJQUFTTTtFQUFULENBQWpCLENBQVo7O0VBQ0EsSUFBSTtJQUNGTCxVQUFVLEdBQUcsTUFBTVMsR0FBRyxDQUFDQyxPQUFKLENBQVlaLElBQVosQ0FBbkI7RUFDRCxDQUZELENBRUUsT0FBT2EsR0FBUCxFQUFZO0lBR1osSUFBSUwsY0FBSixFQUFvQjtNQUNsQixNQUFNSyxHQUFOO0lBQ0Q7O0lBQ0QsSUFBQUMsaUJBQUEsRUFBV1AsSUFBWCxFQUFpQk0sR0FBakI7RUFDRDs7RUFFRCxJQUFJTixJQUFJLElBQUksQ0FBQ0MsY0FBYixFQUE2QjtJQUMzQk8sT0FBTyxDQUFDQyxHQUFSLENBQVlDLElBQUksQ0FBQ0MsU0FBTCxDQUFlaEIsVUFBZixFQUEyQixJQUEzQixFQUFpQ2lCLGtCQUFqQyxDQUFaO0VBQ0Q7O0VBRUQsT0FBT2pCLFVBQVA7QUFDRCJ9
70
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kQ2xhc3NlcyIsIk9iamVjdCIsImZyZWV6ZSIsIkRSSVZFUl9UWVBFIiwiRHJpdmVyQ29tbWFuZCIsIlBMVUdJTl9UWVBFIiwiUGx1Z2luQ29tbWFuZCIsInJ1bkV4dGVuc2lvbkNvbW1hbmQiLCJhcmdzIiwiY29uZmlnIiwianNvblJlc3VsdCIsImV4dGVuc2lvblR5cGUiLCJ0eXBlIiwiZXh0Q21kIiwiVHlwZUVycm9yIiwianNvbiIsInN1cHByZXNzT3V0cHV0IiwiQm9vbGVhbiIsIkNvbW1hbmRDbGFzcyIsImNtZCIsImV4ZWN1dGUiLCJlcnIiLCJlcnJBbmRRdWl0IiwiY29uc29sZSIsImxvZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJKU09OX1NQQUNFUyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jbGkvZXh0ZW5zaW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCBEcml2ZXJDb21tYW5kIGZyb20gJy4vZHJpdmVyLWNvbW1hbmQnO1xuaW1wb3J0IFBsdWdpbkNvbW1hbmQgZnJvbSAnLi9wbHVnaW4tY29tbWFuZCc7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRX0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7ZXJyQW5kUXVpdCwgSlNPTl9TUEFDRVN9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgY29tbWFuZENsYXNzZXMgPSBPYmplY3QuZnJlZXplKFxuICAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICAgIFtEUklWRVJfVFlQRV06IERyaXZlckNvbW1hbmQsXG4gICAgW1BMVUdJTl9UWVBFXTogUGx1Z2luQ29tbWFuZCxcbiAgfSlcbik7XG5cbi8qKlxuICogUnVuIGEgc3ViY29tbWFuZCBvZiB0aGUgJ2FwcGl1bSBkcml2ZXInIHR5cGUuIEVhY2ggc3ViY29tbWFuZCBoYXMgaXRzIG93biBzZXQgb2YgYXJndW1lbnRzIHdoaWNoXG4gKiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtpbXBvcnQoJ2FwcGl1bS90eXBlcycpLkFyZ3M8aW1wb3J0KCdhcHBpdW0vdHlwZXMnKS5XaXRoRXh0U3ViY29tbWFuZD59IGFyZ3MgLSBKUyBvYmplY3Qgd2hlcmUgdGhlIGtleSBpcyB0aGUgcGFyYW1ldGVyIG5hbWUgKGFzIGRlZmluZWQgaW5cbiAqIGRyaXZlci1wYXJzZXIuanMpXG4gKiBAdGVtcGxhdGUge0V4dGVuc2lvblR5cGV9IEV4dFR5cGVcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9leHRlbnNpb24vZXh0ZW5zaW9uLWNvbmZpZycpLkV4dGVuc2lvbkNvbmZpZzxFeHRUeXBlPn0gY29uZmlnIC0gRXh0ZW5zaW9uIGNvbmZpZyBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuRXh0ZW5zaW9uQ29tbWFuZChhcmdzLCBjb25maWcpIHtcbiAgLy8gVE9ETyBkcml2ZXIgY29uZmlnIGZpbGUgc2hvdWxkIGJlIGxvY2tlZCB3aGlsZSBhbnkgb2YgdGhlc2UgY29tbWFuZHMgYXJlXG4gIC8vIHJ1bm5pbmcgdG8gcHJldmVudCB3ZWlyZCBzaXR1YXRpb25zXG4gIGxldCBqc29uUmVzdWx0ID0gbnVsbDtcbiAgY29uc3Qge2V4dGVuc2lvblR5cGU6IHR5cGV9ID0gY29uZmlnO1xuICBjb25zdCBleHRDbWQgPSBhcmdzW2Ake3R5cGV9Q29tbWFuZGBdO1xuICBpZiAoIWV4dENtZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCBjYWxsICR7dHlwZX0gY29tbWFuZCB3aXRob3V0IGEgc3ViY29tbWFuZCBsaWtlICdpbnN0YWxsJ2ApO1xuICB9XG4gIGxldCB7anNvbiwgc3VwcHJlc3NPdXRwdXR9ID0gYXJncztcbiAganNvbiA9IEJvb2xlYW4oanNvbik7XG4gIGlmIChzdXBwcmVzc091dHB1dCkge1xuICAgIGpzb24gPSB0cnVlO1xuICB9XG4gIGNvbnN0IENvbW1hbmRDbGFzcyA9IC8qKiBAdHlwZSB7RXh0Q29tbWFuZDxFeHRUeXBlPn0gKi8gKGNvbW1hbmRDbGFzc2VzW3R5cGVdKTtcbiAgY29uc3QgY21kID0gbmV3IENvbW1hbmRDbGFzcyh7Y29uZmlnLCBqc29ufSk7XG4gIHRyeSB7XG4gICAganNvblJlc3VsdCA9IGF3YWl0IGNtZC5leGVjdXRlKGFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpbiB0aGUgc3VwcHJlc3Mgb3V0cHV0IGNhc2UsIHdlIGFyZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW50ZXJuYWxseSBhbmQgc2hvdWxkXG4gICAgLy8ganVzdCB0aHJvdyBpbnN0ZWFkIG9mIHByaW50aW5nIGFuIGVycm9yIGFuZCBlbmRpbmcgdGhlIHByb2Nlc3NcbiAgICBpZiAoc3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgZXJyQW5kUXVpdChqc29uLCBlcnIpO1xuICB9XG5cbiAgaWYgKGpzb24gJiYgIXN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoanNvblJlc3VsdCwgbnVsbCwgSlNPTl9TUEFDRVMpKTtcbiAgfVxuXG4gIHJldHVybiBqc29uUmVzdWx0O1xufVxuXG5leHBvcnQge3J1bkV4dGVuc2lvbkNvbW1hbmR9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7RXh0ZW5zaW9uVHlwZX0gRXh0VHlwZVxuICogQHR5cGVkZWYge0V4dFR5cGUgZXh0ZW5kcyBEcml2ZXJUeXBlID8gQ2xhc3M8RHJpdmVyQ29tbWFuZD4gOiBFeHRUeXBlIGV4dGVuZHMgUGx1Z2luVHlwZSA/IENsYXNzPFBsdWdpbkNvbW1hbmQ+IDogbmV2ZXJ9IEV4dENvbW1hbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJ0BhcHBpdW0vdHlwZXMnKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRHJpdmVyVHlwZX0gRHJpdmVyVHlwZVxuICogQHR5cGVkZWYge2ltcG9ydCgnQGFwcGl1bS90eXBlcycpLlBsdWdpblR5cGV9IFBsdWdpblR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuQ2xhc3M8VD59IENsYXNzXG4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRU8sTUFBTUEsY0FBYyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FDTjtFQUNwQixDQUFDQyxzQkFBRCxHQUFlQyxzQkFESztFQUVwQixDQUFDQyxzQkFBRCxHQUFlQztBQUZLLENBRE0sQ0FBdkI7OztBQWdCUCxlQUFlQyxtQkFBZixDQUFtQ0MsSUFBbkMsRUFBeUNDLE1BQXpDLEVBQWlEO0VBRy9DLElBQUlDLFVBQVUsR0FBRyxJQUFqQjtFQUNBLE1BQU07SUFBQ0MsYUFBYSxFQUFFQztFQUFoQixJQUF3QkgsTUFBOUI7RUFDQSxNQUFNSSxNQUFNLEdBQUdMLElBQUksQ0FBRSxHQUFFSSxJQUFLLFNBQVQsQ0FBbkI7O0VBQ0EsSUFBSSxDQUFDQyxNQUFMLEVBQWE7SUFDWCxNQUFNLElBQUlDLFNBQUosQ0FBZSxlQUFjRixJQUFLLDhDQUFsQyxDQUFOO0VBQ0Q7O0VBQ0QsSUFBSTtJQUFDRyxJQUFEO0lBQU9DO0VBQVAsSUFBeUJSLElBQTdCO0VBQ0FPLElBQUksR0FBR0UsT0FBTyxDQUFDRixJQUFELENBQWQ7O0VBQ0EsSUFBSUMsY0FBSixFQUFvQjtJQUNsQkQsSUFBSSxHQUFHLElBQVA7RUFDRDs7RUFDRCxNQUFNRyxZQUFZLEdBQXVDbEIsY0FBYyxDQUFDWSxJQUFELENBQXZFO0VBQ0EsTUFBTU8sR0FBRyxHQUFHLElBQUlELFlBQUosQ0FBaUI7SUFBQ1QsTUFBRDtJQUFTTTtFQUFULENBQWpCLENBQVo7O0VBQ0EsSUFBSTtJQUNGTCxVQUFVLEdBQUcsTUFBTVMsR0FBRyxDQUFDQyxPQUFKLENBQVlaLElBQVosQ0FBbkI7RUFDRCxDQUZELENBRUUsT0FBT2EsR0FBUCxFQUFZO0lBR1osSUFBSUwsY0FBSixFQUFvQjtNQUNsQixNQUFNSyxHQUFOO0lBQ0Q7O0lBQ0QsSUFBQUMsaUJBQUEsRUFBV1AsSUFBWCxFQUFpQk0sR0FBakI7RUFDRDs7RUFFRCxJQUFJTixJQUFJLElBQUksQ0FBQ0MsY0FBYixFQUE2QjtJQUMzQk8sT0FBTyxDQUFDQyxHQUFSLENBQVlDLElBQUksQ0FBQ0MsU0FBTCxDQUFlaEIsVUFBZixFQUEyQixJQUEzQixFQUFpQ2lCLGtCQUFqQyxDQUFaO0VBQ0Q7O0VBRUQsT0FBT2pCLFVBQVA7QUFDRCJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","names":["commandClasses","Object","freeze","DRIVER_TYPE","DriverCommand","PLUGIN_TYPE","PluginCommand","runExtensionCommand","args","config","jsonResult","extensionType","type","extCmd","TypeError","json","suppressOutput","Boolean","CommandClass","cmd","execute","err","errAndQuit","console","log","JSON","stringify","JSON_SPACES"],"sources":["../../../lib/cli/extension.js"],"sourcesContent":["/* eslint-disable no-console */\nimport DriverCommand from './driver-command';\nimport PluginCommand from './plugin-command';\nimport {DRIVER_TYPE, PLUGIN_TYPE} from '../constants';\nimport {errAndQuit, JSON_SPACES} from './utils';\n\nexport const commandClasses = Object.freeze(\n /** @type {const} */ ({\n [DRIVER_TYPE]: DriverCommand,\n [PLUGIN_TYPE]: PluginCommand,\n })\n);\n\n/**\n * Run a subcommand of the 'appium driver' type. Each subcommand has its own set of arguments which\n * can be represented as a JS object.\n *\n * @param {import('appium/types').Args<import('appium/types').WithExtSubcommand>} args - JS object where the key is the parameter name (as defined in\n * driver-parser.js)\n * @template {ExtensionType} ExtType\n * @param {import('../extension/extension-config').ExtensionConfig<ExtType>} config - Extension config object\n */\nasync function runExtensionCommand(args, config) {\n // TODO driver config file should be locked while any of these commands are\n // running to prevent weird situations\n let jsonResult = null;\n const {extensionType: type} = config;\n const extCmd = args[`${type}Command`];\n if (!extCmd) {\n throw new TypeError(`Cannot call ${type} command without a subcommand like 'install'`);\n }\n let {json, suppressOutput} = args;\n json = Boolean(json);\n if (suppressOutput) {\n json = true;\n }\n const CommandClass = /** @type {ExtCommand<ExtType>} */ (commandClasses[type]);\n const cmd = new CommandClass({config, json});\n try {\n jsonResult = await cmd.execute(args);\n } catch (err) {\n // in the suppress output case, we are calling this function internally and should\n // just throw instead of printing an error and ending the process\n if (suppressOutput) {\n throw err;\n }\n errAndQuit(json, err);\n }\n\n if (json && !suppressOutput) {\n console.log(JSON.stringify(jsonResult, null, JSON_SPACES));\n }\n\n return jsonResult;\n}\n\nexport {runExtensionCommand};\n\n/**\n * @template {ExtensionType} ExtType\n * @typedef {ExtType extends DriverType ? Class<DriverCommand> : ExtType extends PluginType ? Class<PluginCommand> : never} ExtCommand\n */\n\n/**\n * @typedef {import('@appium/types').ExtensionType} ExtensionType\n * @typedef {import('@appium/types').DriverType} DriverType\n * @typedef {import('@appium/types').PluginType} PluginType\n */\n\n/**\n * @template T\n * @typedef {import('@appium/types').Class<T>} Class\n */\n"],"mappings":";;;;;;;;;;AACA;;AACA;;AACA;;AACA;;;;AAEO,MAAMA,cAAc,GAAGC,MAAM,CAACC,MAAP,CACN;EACpB,CAACC,sBAAD,GAAeC,sBADK;EAEpB,CAACC,sBAAD,GAAeC;AAFK,CADM,CAAvB;;;AAgBP,eAAeC,mBAAf,CAAmCC,IAAnC,EAAyCC,MAAzC,EAAiD;EAG/C,IAAIC,UAAU,GAAG,IAAjB;EACA,MAAM;IAACC,aAAa,EAAEC;EAAhB,IAAwBH,MAA9B;EACA,MAAMI,MAAM,GAAGL,IAAI,CAAE,GAAEI,IAAK,SAAT,CAAnB;;EACA,IAAI,CAACC,MAAL,EAAa;IACX,MAAM,IAAIC,SAAJ,CAAe,eAAcF,IAAK,8CAAlC,CAAN;EACD;;EACD,IAAI;IAACG,IAAD;IAAOC;EAAP,IAAyBR,IAA7B;EACAO,IAAI,GAAGE,OAAO,CAACF,IAAD,CAAd;;EACA,IAAIC,cAAJ,EAAoB;IAClBD,IAAI,GAAG,IAAP;EACD;;EACD,MAAMG,YAAY,GAAuClB,cAAc,CAACY,IAAD,CAAvE;EACA,MAAMO,GAAG,GAAG,IAAID,YAAJ,CAAiB;IAACT,MAAD;IAASM;EAAT,CAAjB,CAAZ;;EACA,IAAI;IACFL,UAAU,GAAG,MAAMS,GAAG,CAACC,OAAJ,CAAYZ,IAAZ,CAAnB;EACD,CAFD,CAEE,OAAOa,GAAP,EAAY;IAGZ,IAAIL,cAAJ,EAAoB;MAClB,MAAMK,GAAN;IACD;;IACD,IAAAC,iBAAA,EAAWP,IAAX,EAAiBM,GAAjB;EACD;;EAED,IAAIN,IAAI,IAAI,CAACC,cAAb,EAA6B;IAC3BO,OAAO,CAACC,GAAR,CAAYC,IAAI,CAACC,SAAL,CAAehB,UAAf,EAA2B,IAA3B,EAAiCiB,kBAAjC,CAAZ;EACD;;EAED,OAAOjB,UAAP;AACD"}