verdaccio 5.3.2 → 5.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/CODE_OF_CONDUCT.md +10 -10
  3. package/CONTRIBUTING.md +28 -27
  4. package/README.md +6 -5
  5. package/SECURITY.md +8 -9
  6. package/build/api/debug/index.js +1 -1
  7. package/build/api/endpoint/api/dist-tags.js +4 -4
  8. package/build/api/endpoint/api/package.js +3 -3
  9. package/build/api/endpoint/api/ping.js +1 -1
  10. package/build/api/endpoint/api/publish.js +11 -11
  11. package/build/api/endpoint/api/star.js +5 -5
  12. package/build/api/endpoint/api/stars.js +1 -1
  13. package/build/api/endpoint/api/user.js +19 -9
  14. package/build/api/endpoint/api/v1/index.js +26 -0
  15. package/build/api/endpoint/api/v1/profile.js +13 -5
  16. package/build/api/endpoint/api/v1/search.js +4 -4
  17. package/build/api/endpoint/api/v1/token.js +20 -11
  18. package/build/api/endpoint/api/whoami.js +1 -1
  19. package/build/api/endpoint/index.js +11 -14
  20. package/build/api/index.js +23 -17
  21. package/build/api/middleware.js +6 -6
  22. package/build/api/rate-limiter.js +24 -0
  23. package/build/api/web/api.js +6 -18
  24. package/build/api/web/endpoint/index.js +51 -0
  25. package/build/api/web/endpoint/package.js +16 -11
  26. package/build/api/web/endpoint/search.js +9 -3
  27. package/build/api/web/endpoint/user.js +11 -5
  28. package/build/api/web/html/renderHTML.js +13 -9
  29. package/build/api/web/html/template.js +1 -1
  30. package/build/api/web/index.js +14 -11
  31. package/build/config/env.js +1 -1
  32. package/build/index.js +1 -1
  33. package/build/lib/auth-utils.js +15 -8
  34. package/build/lib/auth.js +7 -17
  35. package/build/lib/bootstrap.js +8 -8
  36. package/build/lib/cli/cli.js +3 -3
  37. package/build/lib/cli/commands/info.js +3 -3
  38. package/build/lib/cli/commands/init.js +3 -3
  39. package/build/lib/cli/commands/version.js +1 -1
  40. package/build/lib/cli/utils.js +3 -3
  41. package/build/lib/config-path.js +3 -3
  42. package/build/lib/config-utils.js +3 -3
  43. package/build/lib/config.js +16 -31
  44. package/build/lib/constants.js +5 -4
  45. package/build/lib/crypto-utils.js +3 -3
  46. package/build/lib/local-storage.js +7 -15
  47. package/build/lib/logger/formatter/index.js +1 -1
  48. package/build/lib/logger/formatter/prettifier.js +3 -3
  49. package/build/lib/logger/levels.js +1 -1
  50. package/build/lib/logger/logger.js +10 -6
  51. package/build/lib/logger/utils.js +1 -1
  52. package/build/lib/metadata-utils.js +3 -3
  53. package/build/lib/notify/index.js +3 -3
  54. package/build/lib/notify/notify-request.js +5 -5
  55. package/build/lib/plugin-loader.js +4 -4
  56. package/build/lib/search.js +2 -6
  57. package/build/lib/storage-utils.js +3 -3
  58. package/build/lib/storage.js +10 -22
  59. package/build/lib/up-storage.js +14 -45
  60. package/build/lib/uplink-util.js +1 -1
  61. package/build/lib/utils.js +32 -14
  62. package/build/utils/user.js +1 -1
  63. package/conf/README.md +3 -3
  64. package/conf/default.yaml +3 -1
  65. package/conf/docker.yaml +3 -1
  66. package/eslintrc.js +92 -92
  67. package/index.js +1 -1
  68. package/package.json +66 -59
  69. package/prettier.config.js +15 -0
  70. package/tsconfig.json +3 -10
  71. package/yarn-plugins/plugin-postinstall.js +10 -10
@@ -24,6 +24,7 @@ exports.getVersion = getVersion;
24
24
  exports.getVersionFromTarball = getVersionFromTarball;
25
25
  exports.getWebProtocol = getWebProtocol;
26
26
  exports.hasDiffOneKey = hasDiffOneKey;
27
+ exports.hasLogin = hasLogin;
27
28
  exports.isHTTPProtocol = isHTTPProtocol;
28
29
  exports.isHost = isHost;
29
30
  exports.isObject = isObject;
@@ -46,45 +47,45 @@ exports.validatePackage = validatePackage;
46
47
  exports.validateURL = validateURL;
47
48
  exports.wrapPrefix = wrapPrefix;
48
49
 
49
- var _fs = _interopRequireDefault(require("fs"));
50
-
51
50
  var _assert = _interopRequireDefault(require("assert"));
52
51
 
53
- var _url = _interopRequireWildcard(require("url"));
52
+ var _debug = _interopRequireDefault(require("debug"));
53
+
54
+ var _fs = _interopRequireDefault(require("fs"));
55
+
56
+ var _jsYaml = _interopRequireDefault(require("js-yaml"));
54
57
 
55
58
  var _lodash = _interopRequireDefault(require("lodash"));
56
59
 
57
- var _debug = _interopRequireDefault(require("debug"));
60
+ var _memoizee = _interopRequireDefault(require("memoizee"));
58
61
 
59
62
  var _semver = _interopRequireDefault(require("semver"));
60
63
 
61
- var _jsYaml = _interopRequireDefault(require("js-yaml"));
64
+ var _url = _interopRequireWildcard(require("url"));
62
65
 
63
66
  var _validator = _interopRequireDefault(require("validator"));
64
67
 
65
- var _memoizee = _interopRequireDefault(require("memoizee"));
68
+ var _commonsApi = require("@verdaccio/commons-api");
66
69
 
67
70
  var _readme = _interopRequireDefault(require("@verdaccio/readme"));
68
71
 
69
- var _commonsApi = require("@verdaccio/commons-api");
70
-
71
72
  var _user = require("../utils/user");
72
73
 
73
74
  var _constants = require("./constants");
74
75
 
75
- var _storageUtils = require("./storage-utils");
76
-
77
76
  var _logger = require("./logger");
78
77
 
78
+ var _storageUtils = require("./storage-utils");
79
+
79
80
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
80
81
 
81
82
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
82
83
 
83
84
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
84
85
 
85
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
86
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
86
87
 
87
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
88
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
88
89
 
89
90
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
90
91
 
@@ -97,9 +98,18 @@ const pkgVersion = module.exports.version;
97
98
  const pkgName = module.exports.name;
98
99
  const validProtocols = ['https', 'http'];
99
100
 
100
- function getUserAgent() {
101
+ function getUserAgent(customUserAgent) {
101
102
  (0, _assert.default)(_lodash.default.isString(pkgName));
102
103
  (0, _assert.default)(_lodash.default.isString(pkgVersion));
104
+
105
+ if (customUserAgent === true) {
106
+ return `${pkgName}/${pkgVersion}`;
107
+ } else if (_lodash.default.isString(customUserAgent) && _lodash.default.isEmpty(customUserAgent) === false) {
108
+ return customUserAgent;
109
+ } else if (customUserAgent === false) {
110
+ return '';
111
+ }
112
+
103
113
  return `${pkgName}/${pkgVersion}`;
104
114
  }
105
115
 
@@ -792,4 +802,12 @@ function wrapPrefix(prefix) {
792
802
  return prefix;
793
803
  }
794
804
  }
795
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOlsiZGVidWciLCJyZXF1aXJlIiwibW9kdWxlIiwicGtnVmVyc2lvbiIsImV4cG9ydHMiLCJ2ZXJzaW9uIiwicGtnTmFtZSIsIm5hbWUiLCJ2YWxpZFByb3RvY29scyIsImdldFVzZXJBZ2VudCIsIl8iLCJpc1N0cmluZyIsImNvbnZlcnRQYXlsb2FkVG9CYXNlNjQiLCJwYXlsb2FkIiwiQnVmZmVyIiwiZnJvbSIsInZhbGlkYXRlTmFtZSIsIm5vcm1hbGl6ZWROYW1lIiwidG9Mb3dlckNhc2UiLCJtYXRjaCIsInN0YXJ0c1dpdGgiLCJpbmNsdWRlcyIsInZhbGlkYXRlUGFja2FnZSIsIm5hbWVMaXN0Iiwic3BsaXQiLCJsZW5ndGgiLCJzbGljZSIsImlzT2JqZWN0Iiwib2JqIiwiaXNOdWxsIiwiaXNBcnJheSIsImlzT2JqZWN0T3JBcnJheSIsInZhbGlkYXRlTWV0YWRhdGEiLCJvYmplY3QiLCJhc3NlcnQiLCJzdHJpY3RFcXVhbCIsIkRJU1RfVEFHUyIsImV4dHJhY3RUYXJiYWxsRnJvbVVybCIsInVybCIsIkRlZmF1bHRVUkwiLCJwYXJzZSIsInBhdGhuYW1lIiwicmVwbGFjZSIsImNvbnZlcnREaXN0UmVtb3RlVG9Mb2NhbFRhcmJhbGxVcmxzIiwicGtnIiwicmVxIiwidXJsUHJlZml4IiwidmVyIiwidmVyc2lvbnMiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkaXN0TmFtZSIsImRpc3QiLCJ0YXJiYWxsIiwiZ2V0TG9jYWxSZWdpc3RyeVRhcmJhbGxVcmkiLCJtZW1vaXplZGdldFB1YmxpY1VybCIsImdldFB1YmxpY1VybCIsInVyaSIsImN1cnJlbnRIb3N0IiwiZ2V0IiwidGFyYmFsbE5hbWUiLCJkb21haW5SZWdpc3RyeSIsImVuY29kZVNjb3BlZFVyaSIsInRhZ1ZlcnNpb24iLCJkYXRhIiwidGFnIiwic2VtdmVyIiwiZ2V0VmVyc2lvbiIsImlzTmlsIiwidmVyc2lvbkl0ZW0iLCJjb21wYXJlIiwiZXJyIiwidW5kZWZpbmVkIiwicGFyc2VBZGRyZXNzIiwidXJsQWRkcmVzcyIsInVybFBhdHRlcm4iLCJleGVjIiwicHJvdG8iLCJERUZBVUxUX1BST1RPQ09MIiwiaG9zdCIsIkRFRkFVTFRfRE9NQUlOIiwicG9ydCIsIkRFRkFVTFRfUE9SVCIsInBhdGgiLCJzZW12ZXJTb3J0IiwibGlzdFZlcnNpb25zIiwiZmlsdGVyIiwieCIsImxvZ2dlciIsIndhcm4iLCJzb3J0IiwiY29tcGFyZUxvb3NlIiwibWFwIiwiU3RyaW5nIiwibm9ybWFsaXplRGlzdFRhZ3MiLCJzb3J0ZWQiLCJsYXRlc3QiLCJrZXlzIiwicG9wIiwicGFyc2VJbnRlcnZhbFRhYmxlIiwibXMiLCJzIiwibSIsImgiLCJkIiwidyIsIk0iLCJ5IiwicGFyc2VJbnRlcnZhbCIsImludGVydmFsIiwicmVzdWx0IiwibGFzdF9zdWZmaXgiLCJJbmZpbml0eSIsImZvckVhY2giLCJFcnJvciIsIk51bWJlciIsImdldFdlYlByb3RvY29sIiwiaGVhZGVyUHJvdG9jb2wiLCJwcm90b2NvbCIsInJldHVyblByb3RvY29sIiwiZGVmYXVsdFByb3RvY29sIiwiY29tbWFJbmRleCIsImluZGV4T2YiLCJzdWJzdHIiLCJnZXRMYXRlc3RWZXJzaW9uIiwicGtnSW5mbyIsIkVycm9yQ29kZSIsImdldENvbmZsaWN0IiwiZ2V0QmFkRGF0YSIsImdldEJhZFJlcXVlc3QiLCJnZXRJbnRlcm5hbEVycm9yIiwiZ2V0VW5hdXRob3JpemVkIiwiZ2V0Rm9yYmlkZGVuIiwiZ2V0U2VydmljZVVuYXZhaWxhYmxlIiwiZ2V0Tm90Rm91bmQiLCJnZXRDb2RlIiwicGFyc2VDb25maWdGaWxlIiwiY29uZmlnUGF0aCIsInRlc3QiLCJZQU1MIiwibG9hZCIsImZzIiwicmVhZEZpbGVTeW5jIiwiZSIsImNvZGUiLCJtZXNzYWdlIiwiQVBQX0VSUk9SIiwiQ09ORklHX05PVF9WQUxJRCIsImZvbGRlckV4aXN0cyIsInN0YXQiLCJzdGF0U3luYyIsImlzRGlyZWN0b3J5IiwiZmlsZUV4aXN0cyIsImlzRmlsZSIsInNvcnRCeU5hbWUiLCJwYWNrYWdlcyIsIm9yZGVyQXNjZW5kaW5nIiwiYSIsImIiLCJjb21wYXJhdG9yTmFtZXMiLCJhZGRTY29wZSIsInNjb3BlIiwicGFja2FnZU5hbWUiLCJkZWxldGVQcm9wZXJ0aWVzIiwicHJvcGVydGllc1RvRGVsZXRlIiwib2JqZWN0SXRlbSIsInByb3BlcnR5IiwiYWRkR3JhdmF0YXJTdXBwb3J0Iiwib25saW5lIiwicGtnSW5mb0NvcHkiLCJhdXRob3IiLCJjb250cmlidXRvcnMiLCJtYWludGFpbmVycyIsImVtYWlsIiwiYXZhdGFyIiwiR0VORVJJQ19BVkFUQVIiLCJpc0VtcHR5IiwiY29udHJpYnV0b3IiLCJtYWludGFpbmVyIiwicGFyc2VSZWFkbWUiLCJyZWFkbWUiLCJvcHRpb25zIiwiZXJyb3IiLCJidWlsZFRva2VuIiwidHlwZSIsInRva2VuIiwiY2FwaXRhbGl6ZSIsImdldFZlcnNpb25Gcm9tVGFyYmFsbCIsImZvcm1hdEF1dGhvciIsImF1dGhvckRldGFpbHMiLCJERUZBVUxUX1VTRVIiLCJpc0hUVFBQcm90b2NvbCIsInBhZCIsInN0ciIsIm1heCIsInJlcGVhdCIsIm1hc2siLCJjaGFyTnVtIiwiaGFzRGlmZk9uZUtleSIsImlzVmVyc2lvblZhbGlkIiwicGFja2FnZU1ldGEiLCJwYWNrYWdlVmVyc2lvbiIsImhhc1ZlcnNpb24iLCJoYXNNYXRjaFZlcnNpb24iLCJpc1JlbGF0ZWRUb0RlcHJlY2F0aW9uIiwidmFsaWRhdGVVUkwiLCJwdWJsaWNVcmwiLCJwYXJzZWQiLCJVUkwiLCJpc0hvc3QiLCJ2YWxpZGF0b3IiLCJpc1VSTCIsInJlcXVpcmVfaG9zdCIsImFsbG93X3RyYWlsaW5nX2RvdCIsInJlcXVpcmVfdmFsaWRfcHJvdG9jb2wiLCJyZXF1aXJlX3BvcnQiLCJyZXF1aXJlX3RsZCIsInVybF9wcmVmaXgiLCJwcm9jZXNzIiwiZW52IiwiVkVSREFDQ0lPX1BVQkxJQ19VUkwiLCJlbnZVUkwiLCJ3cmFwUHJlZml4IiwiaHJlZiIsInByb3RvSGVhZGVyIiwiVkVSREFDQ0lPX0ZPUldBUkRFRF9QUk9UTyIsIkhFQURFUlMiLCJGT1JXQVJERURfUFJPVE8iLCJjb21iaW5lZFVybCIsImNvbWJpbmVCYXNlVXJsIiwicHJlZml4IiwibmV3UHJlZml4IiwiZ3JvdXBlZFVSSSIsImVuZHNXaXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxNQUFNQSxLQUFLLEdBQUcsb0JBQVcsV0FBWCxDQUFkLEMsQ0FFQTtBQUNBOztBQUNBQyxPQUFPLENBQUMsU0FBRCxDQUFQLENBQW1CQyxNQUFuQjs7QUFDQSxNQUFNQyxVQUFVLEdBQUdELE1BQU0sQ0FBQ0UsT0FBUCxDQUFlQyxPQUFsQztBQUNBLE1BQU1DLE9BQU8sR0FBR0osTUFBTSxDQUFDRSxPQUFQLENBQWVHLElBQS9CO0FBQ0EsTUFBTUMsY0FBYyxHQUFHLENBQUMsT0FBRCxFQUFVLE1BQVYsQ0FBdkI7O0FBRU8sU0FBU0MsWUFBVCxHQUFnQztBQUNyQyx1QkFBT0MsZ0JBQUVDLFFBQUYsQ0FBV0wsT0FBWCxDQUFQO0FBQ0EsdUJBQU9JLGdCQUFFQyxRQUFGLENBQVdSLFVBQVgsQ0FBUDtBQUNBLFNBQVEsR0FBRUcsT0FBUSxJQUFHSCxVQUFXLEVBQWhDO0FBQ0Q7O0FBRU0sU0FBU1Msc0JBQVQsQ0FBZ0NDLE9BQWhDLEVBQXlEO0FBQzlELFNBQU9DLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZRixPQUFaLEVBQXFCLFFBQXJCLENBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNHLFlBQVQsQ0FBc0JULElBQXRCLEVBQTZDO0FBQ2xE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U0FBU2dILFVBQVQsQ0FBb0JRLE1BQXBCLEVBQW1EO0FBQ3hELE1BQUlBLE1BQU0sS0FBSyxFQUFYLElBQWlCLE9BQU9BLE1BQVAsS0FBa0IsV0FBbkMsSUFBa0RBLE1BQU0sS0FBSyxJQUFqRSxFQUF1RTtBQUNyRSxXQUFPLEVBQVA7QUFDRCxHQUZELE1BRU8sSUFBSSxDQUFDQSxNQUFNLENBQUNwTixVQUFQLENBQWtCLEdBQWxCLENBQUQsSUFBMkJvTixNQUFNLENBQUNHLFFBQVAsQ0FBZ0IsR0FBaEIsQ0FBL0IsRUFBcUQ7QUFDMUQsV0FBUSxJQUFHSCxNQUFPLEVBQWxCO0FBQ0QsR0FGTSxNQUVBLElBQUksQ0FBQ0EsTUFBTSxDQUFDcE4sVUFBUCxDQUFrQixHQUFsQixDQUFELElBQTJCLENBQUNvTixNQUFNLENBQUNHLFFBQVAsQ0FBZ0IsR0FBaEIsQ0FBaEMsRUFBc0Q7QUFDM0QsV0FBUSxJQUFHSCxNQUFPLEdBQWxCO0FBQ0QsR0FGTSxNQUVBLElBQUlBLE1BQU0sQ0FBQ3BOLFVBQVAsQ0FBa0IsR0FBbEIsS0FBMEIsQ0FBQ29OLE1BQU0sQ0FBQ0csUUFBUCxDQUFnQixHQUFoQixDQUEvQixFQUFxRDtBQUMxRCxXQUFRLEdBQUVILE1BQU8sR0FBakI7QUFDRCxHQUZNLE1BRUE7QUFDTCxXQUFPQSxNQUFQO0FBQ0Q7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgRGVmYXVsdFVSTCwgeyBVUkwgfSBmcm9tICd1cmwnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBidWlsZERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBZQU1MIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICd2YWxpZGF0b3InO1xuaW1wb3J0IG1lbW9pemVlIGZyb20gJ21lbW9pemVlJztcbmltcG9ydCBzYW5pdGl6eVJlYWRtZSBmcm9tICdAdmVyZGFjY2lvL3JlYWRtZSc7XG5cbmltcG9ydCB7IFBhY2thZ2UsIFZlcnNpb24sIEF1dGhvciB9IGZyb20gJ0B2ZXJkYWNjaW8vdHlwZXMnO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJ2V4cHJlc3MnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbmltcG9ydCB7IGdldENvbmZsaWN0LCBnZXRCYWREYXRhLCBnZXRCYWRSZXF1ZXN0LCBnZXRJbnRlcm5hbEVycm9yLCBnZXRVbmF1dGhvcml6ZWQsIGdldEZvcmJpZGRlbiwgZ2V0U2VydmljZVVuYXZhaWxhYmxlLCBnZXROb3RGb3VuZCwgZ2V0Q29kZSB9IGZyb20gJ0B2ZXJkYWNjaW8vY29tbW9ucy1hcGknO1xuaW1wb3J0IHsgZ2VuZXJhdGVHcmF2YXRhclVybCwgR0VORVJJQ19BVkFUQVIgfSBmcm9tICcuLi91dGlscy91c2VyJztcbmltcG9ydCB7IFN0cmluZ1ZhbHVlLCBBdXRob3JBdmF0YXIgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBUFBfRVJST1IsIERFRkFVTFRfUE9SVCwgREVGQVVMVF9ET01BSU4sIERFRkFVTFRfUFJPVE9DT0wsIEhFQURFUlMsIERJU1RfVEFHUywgREVGQVVMVF9VU0VSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb250cmlidXRvcnMgfSBmcm9tICcuL3N0b3JhZ2UtdXRpbHMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbmNvbnN0IGRlYnVnID0gYnVpbGREZWJ1ZygndmVyZGFjY2lvJyk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5yZXF1aXJlKCdwa2dpbmZvJykobW9kdWxlKTtcbmNvbnN0IHBrZ1ZlcnNpb24gPSBtb2R1bGUuZXhwb3J0cy52ZXJzaW9uO1xuY29uc3QgcGtnTmFtZSA9IG1vZHVsZS5leHBvcnRzLm5hbWU7XG5jb25zdCB2YWxpZFByb3RvY29scyA9IFsnaHR0cHMnLCAnaHR0cCddO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlckFnZW50KCk6IHN0cmluZyB7XG4gIGFzc2VydChfLmlzU3RyaW5nKHBrZ05hbWUpKTtcbiAgYXNzZXJ0KF8uaXNTdHJpbmcocGtnVmVyc2lvbikpO1xuICByZXR1cm4gYCR7cGtnTmFtZX0vJHtwa2dWZXJzaW9ufWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0UGF5bG9hZFRvQmFzZTY0KHBheWxvYWQ6IHN0cmluZyk6IEJ1ZmZlciB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShwYXlsb2FkLCAnYmFzZTY0Jyk7XG59XG5cbi8qKlxuICogRnJvbSBub3JtYWxpemUtcGFja2FnZS1kYXRhL2xpYi9maXhlci5qc1xuICogQHBhcmFtIHsqfSBuYW1lICB0aGUgcGFja2FnZSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufSB3aGV0aGVyIGlzIHZhbGlkIG9yIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoXy5pc1N0cmluZyhuYW1lKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkTmFtZTogc3RyaW5nID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8qKlxuICAgKiBTb21lIGNvbnRleHQgYWJvdXQgdGhlIGZpcnN0IHJlZ2V4XG4gICAqIC0gbnBtIHVzZWQgdG8gaGF2ZSBhIGRpZmZlcmVudCB0YXJiYWxsIG5hbWluZyBzeXN0ZW0uXG4gICAqIGVnOiBodHRwOi8vcmVnaXN0cnkubnBtanMuY29tL3RoaXJ0eS10d29cbiAgICogaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhpcnR5LXR3by8tL3RoaXJ0eS10d29AMC4wLjEudGd6XG4gICAqIFRoZSBmaWxlIG5hbWUgdGhpcnR5LXR3b0AwLjAuMS50Z3osIHRoZSB2ZXJzaW9uIGFuZCB0aGUgcGtnIG5hbWUgd2FzIHNlcGFyYXRlZCBieSBhbiBhdCAoQClcbiAgICogd2hpbGUgbm93YWRheXMgdGhlIG5hbWluZyBzeXN0ZW0gaXMgYmFzZWQgaW4gZGFzaGVzXG4gICAqIGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ZlcmRhY2Npby8tL3ZlcmRhY2Npby0xLjQuMC50Z3pcbiAgICpcbiAgICogbW9yZSBpbmZvIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ybGlkd2thL3Npbm9waWEvaXNzdWVzLzc1XG4gICAqL1xuICByZXR1cm4gIShcbiAgICAhbm9ybWFsaXplZE5hbWUubWF0Y2goL15bLWEtekEtWjAtOV8uIX4qJygpQF0rJC8pIHx8XG4gICAgbm9ybWFsaXplZE5hbWUuc3RhcnRzV2l0aCgnLicpIHx8IC8vIFwiLmJpblwiLCBldGMuXG4gICAgWydub2RlX21vZHVsZXMnLCAnX19wcm90b19fJywgJ2Zhdmljb24uaWNvJ10uaW5jbHVkZXMobm9ybWFsaXplZE5hbWUpXG4gICk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBwYWNrYWdlLlxuICogQHJldHVybiB7Qm9vbGVhbn0gd2hldGhlciB0aGUgcGFja2FnZSBpcyB2YWxpZCBvciBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbmFtZUxpc3QgPSBuYW1lLnNwbGl0KCcvJywgMik7XG4gIGlmIChuYW1lTGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBub3JtYWwgcGFja2FnZVxuICAgIHJldHVybiB2YWxpZGF0ZU5hbWUobmFtZUxpc3RbMF0pO1xuICB9XG4gIC8vIHNjb3BlZCBwYWNrYWdlXG4gIHJldHVybiBuYW1lTGlzdFswXVswXSA9PT0gJ0AnICYmIHZhbGlkYXRlTmFtZShuYW1lTGlzdFswXS5zbGljZSgxKSkgJiYgdmFsaWRhdGVOYW1lKG5hbWVMaXN0WzFdKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgYW4gT2JqZWN0XG4gKiBAcGFyYW0geyp9IG9iaiB0aGUgZWxlbWVudFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KG9iajogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBfLmlzT2JqZWN0KG9iaikgJiYgXy5pc051bGwob2JqKSA9PT0gZmFsc2UgJiYgXy5pc0FycmF5KG9iaikgPT09IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RPckFycmF5KG9iajogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBfLmlzT2JqZWN0KG9iaikgJiYgXy5pc051bGwob2JqKSA9PT0gZmFsc2U7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIHBhY2thZ2UgbWV0YWRhdGEsIGFkZCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgd2hldGhlciBhcmUgbWlzc2luZyB3aXRoaW5cbiAqIHRoZSBtZXRhZGF0YSBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHsqfSBvYmplY3RcbiAqIEBwYXJhbSB7Kn0gbmFtZVxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgb2JqZWN0IHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFzIGRpc3QtdGFncyBhZCB2ZXJzaW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNZXRhZGF0YShvYmplY3Q6IFBhY2thZ2UsIG5hbWU6IHN0cmluZyk6IFBhY2thZ2Uge1xuICBhc3NlcnQoaXNPYmplY3Qob2JqZWN0KSwgJ25vdCBhIGpzb24gb2JqZWN0Jyk7XG4gIGFzc2VydC5zdHJpY3RFcXVhbChvYmplY3QubmFtZSwgbmFtZSk7XG5cbiAgaWYgKCFpc09iamVjdChvYmplY3RbRElTVF9UQUdTXSkpIHtcbiAgICBvYmplY3RbRElTVF9UQUdTXSA9IHt9O1xuICB9XG5cbiAgaWYgKCFpc09iamVjdChvYmplY3RbJ3ZlcnNpb25zJ10pKSB7XG4gICAgb2JqZWN0Wyd2ZXJzaW9ucyddID0ge307XG4gIH1cblxuICBpZiAoIWlzT2JqZWN0KG9iamVjdFsndGltZSddKSkge1xuICAgIG9iamVjdFsndGltZSddID0ge307XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFRhcmJhbGxGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gRGVmYXVsdFVSTC5wYXJzZSh1cmwpLnBhdGhuYW1lLnJlcGxhY2UoL14uKlxcLy8sICcnKTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIGEgcGFja2FnZXMncyB2ZXJzaW9ucyBhbmQgZmlsdGVyIGVhY2ggb3JpZ2luYWwgdGFyYmFsbCB1cmwuXG4gKiBAcGFyYW0geyp9IHBrZ1xuICogQHBhcmFtIHsqfSByZXFcbiAqIEBwYXJhbSB7Kn0gY29uZmlnXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGEgZmlsdGVyZWQgcGFja2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERpc3RSZW1vdGVUb0xvY2FsVGFyYmFsbFVybHMocGtnOiBQYWNrYWdlLCByZXE6IFJlcXVlc3QsIHVybFByZWZpeDogc3RyaW5nIHwgdm9pZCk6IFBhY2thZ2Uge1xuICBmb3IgKGNvbnN0IHZlciBpbiBwa2cudmVyc2lvbnMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBrZy52ZXJzaW9ucywgdmVyKSkge1xuICAgICAgY29uc3QgZGlzdE5hbWUgPSBwa2cudmVyc2lvbnNbdmVyXS5kaXN0O1xuXG4gICAgICBpZiAoXy5pc051bGwoZGlzdE5hbWUpID09PSBmYWxzZSAmJiBfLmlzTnVsbChkaXN0TmFtZS50YXJiYWxsKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZGlzdE5hbWUudGFyYmFsbCA9IGdldExvY2FsUmVnaXN0cnlUYXJiYWxsVXJpKGRpc3ROYW1lLnRhcmJhbGwsIHBrZy5uYW1lLCByZXEsIHVybFByZWZpeCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwa2c7XG59XG5cbmNvbnN0IG1lbW9pemVkZ2V0UHVibGljVXJsID0gbWVtb2l6ZWUoZ2V0UHVibGljVXJsKTtcblxuLyoqXG4gKiBGaWx0ZXIgYSB0YXJiYWxsIHVybC5cbiAqIEBwYXJhbSB7Kn0gdXJpXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGEgcGFyc2VkIHVybFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxSZWdpc3RyeVRhcmJhbGxVcmkodXJpOiBzdHJpbmcsIHBrZ05hbWU6IHN0cmluZywgcmVxOiBSZXF1ZXN0LCB1cmxQcmVmaXg6IHN0cmluZyB8IHZvaWQpOiBzdHJpbmcge1xuICBjb25zdCBjdXJyZW50SG9zdCA9IHJlcS5nZXQoJ2hvc3QnKTtcblxuICBpZiAoIWN1cnJlbnRIb3N0KSB7XG4gICAgcmV0dXJuIHVyaTtcbiAgfVxuICBjb25zdCB0YXJiYWxsTmFtZSA9IGV4dHJhY3RUYXJiYWxsRnJvbVVybCh1cmkpO1xuICBjb25zdCBkb21haW5SZWdpc3RyeSA9IG1lbW9pemVkZ2V0UHVibGljVXJsKHVybFByZWZpeCB8fCAnJywgcmVxKTtcblxuICByZXR1cm4gYCR7ZG9tYWluUmVnaXN0cnl9JHtlbmNvZGVTY29wZWRVcmkocGtnTmFtZSl9Ly0vJHt0YXJiYWxsTmFtZX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnVmVyc2lvbihkYXRhOiBQYWNrYWdlLCB2ZXJzaW9uOiBzdHJpbmcsIHRhZzogU3RyaW5nVmFsdWUpOiBib29sZWFuIHtcbiAgaWYgKHRhZyAmJiBkYXRhW0RJU1RfVEFHU11bdGFnXSAhPT0gdmVyc2lvbiAmJiBzZW12ZXIucGFyc2UodmVyc2lvbiwgdHJ1ZSkpIHtcbiAgICAvLyB2YWxpZCB2ZXJzaW9uIC0gc3RvcmVcbiAgICBkYXRhW0RJU1RfVEFHU11bdGFnXSA9IHZlcnNpb247XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEdldHMgdmVyc2lvbiBmcm9tIGEgcGFja2FnZSBvYmplY3QgdGFraW5nIGludG8gYWNjb3VudCBzZW12ZXIgd2VpcmRuZXNzLlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm4gdGhlIHNlbWFudGljIHZlcnNpb24gb2YgYSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uKHBrZzogUGFja2FnZSwgdmVyc2lvbjogYW55KTogVmVyc2lvbiB8IHZvaWQge1xuICAvLyB0aGlzIGNvbmRpdGlvbiBtdXN0IGFsbG93IGNhc3RcbiAgaWYgKF8uaXNOaWwocGtnLnZlcnNpb25zW3ZlcnNpb25dKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gcGtnLnZlcnNpb25zW3ZlcnNpb25dO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB2ZXJzaW9uID0gc2VtdmVyLnBhcnNlKHZlcnNpb24sIHRydWUpO1xuICAgIGZvciAoY29uc3QgdmVyc2lvbkl0ZW0gaW4gcGtnLnZlcnNpb25zKSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICBpZiAodmVyc2lvbi5jb21wYXJlKHNlbXZlci5wYXJzZSh2ZXJzaW9uSXRlbSwgdHJ1ZSkpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBwa2cudmVyc2lvbnNbdmVyc2lvbkl0ZW1dO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGFuIGludGVybmV0IGFkZHJlc3NcbiAqIEFsbG93OlxuIC0gaHR0cHM6bG9jYWxob3N0OjEyMzQgICAgICAgIC0gcHJvdG9jb2wgKyBob3N0ICsgcG9ydFxuIC0gbG9jYWxob3N0OjEyMzQgICAgICAgICAgICAgIC0gaG9zdCArIHBvcnRcbiAtIDEyMzQgICAgICAgICAgICAgICAgICAgICAgICAtIHBvcnRcbiAtIGh0dHA6OjEyMzQgICAgICAgICAgICAgICAgICAtIHByb3RvY29sICsgcG9ydFxuIC0gaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzLyAgICAgIC0gZnVsbCB1cmwgKyBodHRwc1xuIC0gaHR0cDovL1s6OjFdOjQ0My8gICAgICAgICAgIC0gaXB2NlxuIC0gdW5peDovdG1wL2h0dHAuc29jayAgICAgICAgIC0gdW5peCBzb2NrZXRzXG4gLSBodHRwczovL3VuaXg6L3RtcC9odHRwLnNvY2sgLSB1bml4IHNvY2tldHMgKGh0dHBzKVxuICogQHBhcmFtIHsqfSB1cmxBZGRyZXNzIHRoZSBpbnRlcm5ldCBhZGRyZXNzIGRlZmluaXRpb25cbiAqIEByZXR1cm4ge09iamVjdHxOdWxsfSBsaXRlcmFsIG9iamVjdCB0aGF0IHJlcHJlc2VudCB0aGUgYWRkcmVzcyBwYXJzZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWRkcmVzcyh1cmxBZGRyZXNzOiBhbnkpOiBhbnkge1xuICAvL1xuICAvLyBUT0RPOiByZWZhY3RvciBpdCB0byBzb21ldGhpbmcgbW9yZSByZWFzb25hYmxlP1xuICAvL1xuICAvLyAgICAgICAgcHJvdG9jb2wgOiAgLy8gICAgICAoICBob3N0ICApfCggICAgaXB2NiAgICAgKTogIHBvcnQgIC9cbiAgbGV0IHVybFBhdHRlcm4gPSAvXigoaHR0cHM/KTooXFwvXFwvKT8pPygoKFteXFwvOl0qKXxcXFsoW15cXFtcXF1dKylcXF0pOik/KFxcZCspXFwvPyQvLmV4ZWModXJsQWRkcmVzcyk7XG5cbiAgaWYgKHVybFBhdHRlcm4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG86IHVybFBhdHRlcm5bMl0gfHwgREVGQVVMVF9QUk9UT0NPTCxcbiAgICAgIGhvc3Q6IHVybFBhdHRlcm5bNl0gfHwgdXJsUGF0dGVybls3XSB8fCBERUZBVUxUX0RPTUFJTixcbiAgICAgIHBvcnQ6IHVybFBhdHRlcm5bOF0gfHwgREVGQVVMVF9QT1JULFxuICAgIH07XG4gIH1cblxuICB1cmxQYXR0ZXJuID0gL14oKGh0dHBzPyk6KFxcL1xcLyk/KT91bml4OiguKikkLy5leGVjKHVybEFkZHJlc3MpO1xuXG4gIGlmICh1cmxQYXR0ZXJuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3RvOiB1cmxQYXR0ZXJuWzJdIHx8IERFRkFVTFRfUFJPVE9DT0wsXG4gICAgICBwYXRoOiB1cmxQYXR0ZXJuWzRdLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBmaWx0ZXJzIG91dCBiYWQgc2VtdmVyIHZlcnNpb25zIGFuZCBzb3J0cyB0aGUgYXJyYXkuXG4gKiBAcmV0dXJuIHtBcnJheX0gc29ydGVkIEFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW12ZXJTb3J0KGxpc3RWZXJzaW9uczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoXG4gICAgbGlzdFZlcnNpb25zXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uICh4KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghc2VtdmVyLnBhcnNlKHgsIHRydWUpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oeyB2ZXI6IHggfSwgJ2lnbm9yaW5nIGJhZCB2ZXJzaW9uIEB7dmVyfScpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAvLyBGSVhNRTogaXQgc2VlbXMgdGhlIEB0eXBlcy9zZW12ZXIgZG8gbm90IGhhbmRsZSBhIGxlZ2l0aW1hdGUgbWV0aG9kIG5hbWVkICdjb21wYXJlTG9vc2UnXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAuc29ydChzZW12ZXIuY29tcGFyZUxvb3NlKVxuICAgICAgLm1hcChTdHJpbmcpXG4gICk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhcnJheXMgb2YgdGFncy5cbiAqIEBwYXJhbSB7Kn0gZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRGlzdFRhZ3MocGtnOiBQYWNrYWdlKTogdm9pZCB7XG4gIGxldCBzb3J0ZWQ7XG4gIGlmICghcGtnW0RJU1RfVEFHU10ubGF0ZXN0KSB7XG4gICAgLy8gb3ZlcndyaXRlIGxhdGVzdCB3aXRoIGhpZ2hlc3Qga25vd24gdmVyc2lvbiBiYXNlZCBvbiBzZW12ZXIgc29ydFxuICAgIHNvcnRlZCA9IHNlbXZlclNvcnQoT2JqZWN0LmtleXMocGtnLnZlcnNpb25zKSk7XG4gICAgaWYgKHNvcnRlZCAmJiBzb3J0ZWQubGVuZ3RoKSB7XG4gICAgICBwa2dbRElTVF9UQUdTXS5sYXRlc3QgPSBzb3J0ZWQucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCB0YWcgaW4gcGtnW0RJU1RfVEFHU10pIHtcbiAgICBpZiAoXy5pc0FycmF5KHBrZ1tESVNUX1RBR1NdW3RhZ10pKSB7XG4gICAgICBpZiAocGtnW0RJU1RfVEFHU11bdGFnXS5sZW5ndGgpIHtcbiAgICAgICAgLy8gc29ydCBhcnJheVxuICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBjbGVhcmx5IHdyb25nLCB3ZSBuZWVkIHRvIHJlc2VhcmNoIHdoeSB0aGlzIGlzIGxpa2UgdGhpcy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzb3J0ZWQgPSBzZW12ZXJTb3J0KHBrZ1tESVNUX1RBR1NdW3RhZ10pO1xuICAgICAgICBpZiAoc29ydGVkLmxlbmd0aCkge1xuICAgICAgICAgIC8vIHVzZSBoaWdoZXN0IHZlcnNpb24gYmFzZWQgb24gc2VtdmVyIHNvcnRcbiAgICAgICAgICBwa2dbRElTVF9UQUdTXVt0YWddID0gc29ydGVkLnBvcCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgcGtnW0RJU1RfVEFHU11bdGFnXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcocGtnW0RJU1RfVEFHU11bdGFnXSkpIHtcbiAgICAgIGlmICghc2VtdmVyLnBhcnNlKHBrZ1tESVNUX1RBR1NdW3RhZ10sIHRydWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSB2ZXJzaW9uIGlzIGludmFsaWQsIGRlbGV0ZSB0aGUgZGlzdC10YWcgZW50cnlcbiAgICAgICAgZGVsZXRlIHBrZ1tESVNUX1RBR1NdW3RhZ107XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHBhcnNlSW50ZXJ2YWxUYWJsZSA9IHtcbiAgJyc6IDEwMDAsXG4gIG1zOiAxLFxuICBzOiAxMDAwLFxuICBtOiA2MCAqIDEwMDAsXG4gIGg6IDYwICogNjAgKiAxMDAwLFxuICBkOiA4NjQwMDAwMCxcbiAgdzogNyAqIDg2NDAwMDAwLFxuICBNOiAzMCAqIDg2NDAwMDAwLFxuICB5OiAzNjUgKiA4NjQwMDAwMCxcbn07XG5cbi8qKlxuICogUGFyc2UgYW4gaW50ZXJuYWwgc3RyaW5nIHRvIG51bWJlclxuICogQHBhcmFtIHsqfSBpbnRlcnZhbFxuICogQHJldHVybiB7TnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChpbnRlcnZhbDogYW55KTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiBpbnRlcnZhbCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gaW50ZXJ2YWwgKiAxMDAwO1xuICB9XG4gIGxldCByZXN1bHQgPSAwO1xuICBsZXQgbGFzdF9zdWZmaXggPSBJbmZpbml0eTtcbiAgaW50ZXJ2YWwuc3BsaXQoL1xccysvKS5mb3JFYWNoKGZ1bmN0aW9uICh4KTogdm9pZCB7XG4gICAgaWYgKCF4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG0gPSB4Lm1hdGNoKC9eKCgwfFsxLTldWzAtOV0qKShcXC5bMC05XSspPykobXN8c3xtfGh8ZHx3fE18eXwpJC8pO1xuICAgIGlmICghbSB8fCBwYXJzZUludGVydmFsVGFibGVbbVs0XV0gPj0gbGFzdF9zdWZmaXggfHwgKG1bNF0gPT09ICcnICYmIGxhc3Rfc3VmZml4ICE9PSBJbmZpbml0eSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdpbnZhbGlkIGludGVydmFsOiAnICsgaW50ZXJ2YWwpO1xuICAgIH1cbiAgICBsYXN0X3N1ZmZpeCA9IHBhcnNlSW50ZXJ2YWxUYWJsZVttWzRdXTtcbiAgICByZXN1bHQgKz0gTnVtYmVyKG1bMV0pICogcGFyc2VJbnRlcnZhbFRhYmxlW21bNF1dO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlY3QgcnVubmluZyBwcm90b2NvbCAoaHR0cCBvciBodHRwcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYlByb3RvY29sKGhlYWRlclByb3RvY29sOiBzdHJpbmcgfCB2b2lkLCBwcm90b2NvbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJldHVyblByb3RvY29sO1xuICBjb25zdCBbLCBkZWZhdWx0UHJvdG9jb2xdID0gdmFsaWRQcm90b2NvbHM7XG4gIC8vIEhBUHJveHkgdmFyaWFudCBtaWdodCByZXR1cm4gaHR0cCxodHRwIHdpdGggWC1Gb3J3YXJkZWQtUHJvdG9cbiAgaWYgKHR5cGVvZiBoZWFkZXJQcm90b2NvbCA9PT0gJ3N0cmluZycgJiYgaGVhZGVyUHJvdG9jb2wgIT09ICcnKSB7XG4gICAgZGVidWcoJ2hlYWRlciBwcm90b2NvbDogJW8nLCBwcm90b2NvbCk7XG4gICAgY29uc3QgY29tbWFJbmRleCA9IGhlYWRlclByb3RvY29sLmluZGV4T2YoJywnKTtcbiAgICByZXR1cm5Qcm90b2NvbCA9IGNvbW1hSW5kZXggPiAwID8gaGVhZGVyUHJvdG9jb2wuc3Vic3RyKDAsIGNvbW1hSW5kZXgpIDogaGVhZGVyUHJvdG9jb2w7XG4gIH0gZWxzZSB7XG4gICAgZGVidWcoJ3JlcSBwcm90b2NvbDogJW8nLCBoZWFkZXJQcm90b2NvbCk7XG4gICAgcmV0dXJuUHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgfVxuXG4gIHJldHVybiB2YWxpZFByb3RvY29scy5pbmNsdWRlcyhyZXR1cm5Qcm90b2NvbCkgPyByZXR1cm5Qcm90b2NvbCA6IGRlZmF1bHRQcm90b2NvbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGtnSW5mbzogUGFja2FnZSk6IHN0cmluZyB7XG4gIHJldHVybiBwa2dJbmZvW0RJU1RfVEFHU10ubGF0ZXN0O1xufVxuXG5leHBvcnQgY29uc3QgRXJyb3JDb2RlID0ge1xuICBnZXRDb25mbGljdCxcbiAgZ2V0QmFkRGF0YSxcbiAgZ2V0QmFkUmVxdWVzdCxcbiAgZ2V0SW50ZXJuYWxFcnJvcixcbiAgZ2V0VW5hdXRob3JpemVkLFxuICBnZXRGb3JiaWRkZW4sXG4gIGdldFNlcnZpY2VVbmF2YWlsYWJsZSxcbiAgZ2V0Tm90Rm91bmQsXG4gIGdldENvZGUsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb25maWdGaWxlKGNvbmZpZ1BhdGg6IHN0cmluZyk6IGFueSB7XG4gIHRyeSB7XG4gICAgaWYgKC9cXC55YT9tbCQvaS50ZXN0KGNvbmZpZ1BhdGgpKSB7XG4gICAgICByZXR1cm4gWUFNTC5sb2FkKGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKSk7XG4gICAgfVxuICAgIGRlYnVnKCd5YW1sIHBhcnNlZCcpO1xuICAgIHJldHVybiByZXF1aXJlKGNvbmZpZ1BhdGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGVidWcoJ3lhbWwgcGFyc2UgZmFpbGVkJyk7XG4gICAgaWYgKGUuY29kZSAhPT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICBlLm1lc3NhZ2UgPSBBUFBfRVJST1IuQ09ORklHX05PVF9WQUxJRDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBwYXRoIGFscmVhZHkgZXhpc3QuXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvbGRlckV4aXN0cyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMocGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNEaXJlY3RvcnkoKTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGZpbGUgYWxyZWFkeSBleGlzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMocGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRCeU5hbWUocGFja2FnZXM6IGFueVtdLCBvcmRlckFzY2VuZGluZzogYm9vbGVhbiB8IHZvaWQgPSB0cnVlKTogc3RyaW5nW10ge1xuICByZXR1cm4gcGFja2FnZXMuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uIChhLCBiKTogbnVtYmVyIHtcbiAgICBjb25zdCBjb21wYXJhdG9yTmFtZXMgPSBhLm5hbWUudG9Mb3dlckNhc2UoKSA8IGIubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIG9yZGVyQXNjZW5kaW5nID8gKGNvbXBhcmF0b3JOYW1lcyA/IC0xIDogMSkgOiBjb21wYXJhdG9yTmFtZXMgPyAxIDogLTE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkU2NvcGUoc2NvcGU6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgQCR7c2NvcGV9LyR7cGFja2FnZU5hbWV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnRpZXMocHJvcGVydGllc1RvRGVsZXRlOiBzdHJpbmdbXSwgb2JqZWN0SXRlbTogYW55KTogYW55IHtcbiAgXy5mb3JFYWNoKHByb3BlcnRpZXNUb0RlbGV0ZSwgKHByb3BlcnR5KTogYW55ID0+IHtcbiAgICBkZWxldGUgb2JqZWN0SXRlbVtwcm9wZXJ0eV07XG4gIH0pO1xuXG4gIHJldHVybiBvYmplY3RJdGVtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkR3JhdmF0YXJTdXBwb3J0KHBrZ0luZm86IFBhY2thZ2UsIG9ubGluZSA9IHRydWUpOiBBdXRob3JBdmF0YXIge1xuICBjb25zdCBwa2dJbmZvQ29weSA9IHsgLi4ucGtnSW5mbyB9IGFzIGFueTtcbiAgY29uc3QgYXV0aG9yOiBhbnkgPSBfLmdldChwa2dJbmZvLCAnbGF0ZXN0LmF1dGhvcicsIG51bGwpIGFzIGFueTtcbiAgY29uc3QgY29udHJpYnV0b3JzOiBBdXRob3JBdmF0YXJbXSA9IG5vcm1hbGl6ZUNvbnRyaWJ1dG9ycyhfLmdldChwa2dJbmZvLCAnbGF0ZXN0LmNvbnRyaWJ1dG9ycycsIFtdKSk7XG4gIGNvbnN0IG1haW50YWluZXJzID0gXy5nZXQocGtnSW5mbywgJ2xhdGVzdC5tYWludGFpbmVycycsIFtdKTtcblxuICAvLyBmb3IgYXV0aG9yLlxuICBpZiAoYXV0aG9yICYmIF8uaXNPYmplY3QoYXV0aG9yKSkge1xuICAgIGNvbnN0IHsgZW1haWwgfSA9IGF1dGhvciBhcyBBdXRob3I7XG4gICAgcGtnSW5mb0NvcHkubGF0ZXN0LmF1dGhvci5hdmF0YXIgPSBnZW5lcmF0ZUdyYXZhdGFyVXJsKGVtYWlsLCBvbmxpbmUpO1xuICB9XG5cbiAgaWYgKGF1dGhvciAmJiBfLmlzU3RyaW5nKGF1dGhvcikpIHtcbiAgICBwa2dJbmZvQ29weS5sYXRlc3QuYXV0aG9yID0ge1xuICAgICAgYXZhdGFyOiBHRU5FUklDX0FWQVRBUixcbiAgICAgIGVtYWlsOiAnJyxcbiAgICAgIGF1dGhvcixcbiAgICB9O1xuICB9XG5cbiAgLy8gZm9yIGNvbnRyaWJ1dG9yc1xuICBpZiAoXy5pc0VtcHR5KGNvbnRyaWJ1dG9ycykgPT09IGZhbHNlKSB7XG4gICAgcGtnSW5mb0NvcHkubGF0ZXN0LmNvbnRyaWJ1dG9ycyA9IGNvbnRyaWJ1dG9ycy5tYXAoXG4gICAgICAoY29udHJpYnV0b3IpOiBBdXRob3JBdmF0YXIgPT4ge1xuICAgICAgICBpZiAoaXNPYmplY3QoY29udHJpYnV0b3IpKSB7XG4gICAgICAgICAgY29udHJpYnV0b3IuYXZhdGFyID0gZ2VuZXJhdGVHcmF2YXRhclVybChjb250cmlidXRvci5lbWFpbCwgb25saW5lKTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzU3RyaW5nKGNvbnRyaWJ1dG9yKSkge1xuICAgICAgICAgIGNvbnRyaWJ1dG9yID0ge1xuICAgICAgICAgICAgYXZhdGFyOiBHRU5FUklDX0FWQVRBUixcbiAgICAgICAgICAgIGVtYWlsOiBjb250cmlidXRvcixcbiAgICAgICAgICAgIG5hbWU6IGNvbnRyaWJ1dG9yLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udHJpYnV0b3I7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIGZvciBtYWludGFpbmVyc1xuICBpZiAoXy5pc0VtcHR5KG1haW50YWluZXJzKSA9PT0gZmFsc2UpIHtcbiAgICBwa2dJbmZvQ29weS5sYXRlc3QubWFpbnRhaW5lcnMgPSBtYWludGFpbmVycy5tYXAoKG1haW50YWluZXIpOiB2b2lkID0+IHtcbiAgICAgIG1haW50YWluZXIuYXZhdGFyID0gZ2VuZXJhdGVHcmF2YXRhclVybChtYWludGFpbmVyLmVtYWlsLCBvbmxpbmUpO1xuICAgICAgcmV0dXJuIG1haW50YWluZXI7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcGtnSW5mb0NvcHk7XG59XG5cbi8qKlxuICogcGFyc2UgcGFja2FnZSByZWFkbWUgLSBtYXJrZG93bi9hc2NpaVxuICogQHBhcmFtIHtTdHJpbmd9IHBhY2thZ2VOYW1lIG5hbWUgb2YgcGFja2FnZVxuICogQHBhcmFtIHtTdHJpbmd9IHJlYWRtZSBwYWNrYWdlIHJlYWRtZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgc2FuaXRpenlSZWFkbWUgb3B0aW9uc1xuICogQHJldHVybiB7U3RyaW5nfSBjb252ZXJ0ZWQgaHRtbCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWFkbWUocGFja2FnZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7IHBhdGhuYW1lPzogc3RyaW5nIHwgdm9pZCB9ID0ge30pOiBzdHJpbmcgfCB2b2lkIHtcbiAgaWYgKF8uaXNFbXB0eShyZWFkbWUpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBzYW5pdGl6eVJlYWRtZShyZWFkbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gbG9ncyByZWFkbWUgbm90IGZvdW5kIGVycm9yXG4gIGxvZ2dlci5lcnJvcih7IHBhY2thZ2VOYW1lIH0sICdAe3BhY2thZ2VOYW1lfTogTm8gcmVhZG1lIGZvdW5kJyk7XG5cbiAgcmV0dXJuIHNhbml0aXp5UmVhZG1lKCdFUlJPUjogTm8gUkVBRE1FIGRhdGEgZm91bmQhJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRva2VuKHR5cGU6IHN0cmluZywgdG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtfLmNhcGl0YWxpemUodHlwZSl9ICR7dG9rZW59YDtcbn1cblxuLyoqXG4gKiByZXR1cm4gcGFja2FnZSB2ZXJzaW9uIGZyb20gdGFyYmFsbCBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge1N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25Gcm9tVGFyYmFsbChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB2b2lkIHtcbiAgLy8gRklYTUU6IHdlIGtub3cgdGhlIHJlZ2V4IGlzIHZhbGlkLCBidXQgd2Ugc2hvdWxkIGltcHJvdmUgdGhpcyBwYXJ0IGFzIHRzIHN1Z2dlc3RcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gLy4rLShcXGQuKylcXC50Z3ovLnRlc3QobmFtZSkgPyBuYW1lLm1hdGNoKC8uKy0oXFxkLispXFwudGd6LylbMV0gOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCB0eXBlIEF1dGhvckZvcm1hdCA9IEF1dGhvciB8IHN0cmluZyB8IG51bGwgfCBvYmplY3QgfCB2b2lkO1xuXG4vKipcbiAqIEZvcm1hdHMgYXV0aG9yIGZpZWxkIGZvciB3ZWJ1aS5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9maWxlcy9wYWNrYWdlLmpzb24jYXV0aG9yXG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R8dW5kZWZpbmVkfSBhdXRob3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEF1dGhvcihhdXRob3I6IEF1dGhvckZvcm1hdCk6IGFueSB7XG4gIGxldCBhdXRob3JEZXRhaWxzID0ge1xuICAgIG5hbWU6IERFRkFVTFRfVVNFUixcbiAgICBlbWFpbDogJycsXG4gICAgdXJsOiAnJyxcbiAgfTtcblxuICBpZiAoXy5pc05pbChhdXRob3IpKSB7XG4gICAgcmV0dXJuIGF1dGhvckRldGFpbHM7XG4gIH1cblxuICBpZiAoXy5pc1N0cmluZyhhdXRob3IpKSB7XG4gICAgYXV0aG9yRGV0YWlscyA9IHtcbiAgICAgIC4uLmF1dGhvckRldGFpbHMsXG4gICAgICBuYW1lOiBhdXRob3IgYXMgc3RyaW5nLFxuICAgIH07XG4gIH1cblxuICBpZiAoXy5pc09iamVjdChhdXRob3IpKSB7XG4gICAgYXV0aG9yRGV0YWlscyA9IHtcbiAgICAgIC4uLmF1dGhvckRldGFpbHMsXG4gICAgICAuLi4oYXV0aG9yIGFzIEF1dGhvciksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBhdXRob3JEZXRhaWxzO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIFVSSSBpcyBzdGFydGluZyB3aXRoIFwiaHR0cDovL1wiLCBcImh0dHBzOi8vXCIgb3IgXCIvL1wiXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0hUVFBQcm90b2NvbCh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL14oaHR0cHM/Oik/XFwvXFwvLy50ZXN0KHVyaSk7XG59XG5cbi8qKlxuICogQXBwbHkgd2hpdGVzcGFjZXMgYmFzZWQgb24gdGhlIGxlbmd0aFxuICogQHBhcmFtIHsqfSBzdHIgdGhlIGxvZyBtZXNzYWdlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWQoc3RyLCBtYXgpOiBzdHJpbmcge1xuICBpZiAoc3RyLmxlbmd0aCA8IG1heCkge1xuICAgIHJldHVybiBzdHIgKyAnICcucmVwZWF0KG1heCAtIHN0ci5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogcmV0dXJuIGEgbWFzcXVlcmFkZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgYW5kIGxhc3Qge2NoYXJOdW19IGFuZCB0aHJlZSBkb3RzIGluIGJldHdlZW4uXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge051bWJlcn0gY2hhck51bVxuICogQHJldHVybnMge1N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2soc3RyOiBzdHJpbmcsIGNoYXJOdW0gPSAzKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3N0ci5zdWJzdHIoMCwgY2hhck51bSl9Li4uJHtzdHIuc3Vic3RyKC1jaGFyTnVtKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU2NvcGVkVXJpKHBhY2thZ2VOYW1lKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL1xcLy9nLCAnJTJmJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNEaWZmT25lS2V5KHZlcnNpb25zKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3Qua2V5cyh2ZXJzaW9ucykubGVuZ3RoICE9PSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJzaW9uVmFsaWQocGFja2FnZU1ldGEsIHBhY2thZ2VWZXJzaW9uKTogYm9vbGVhbiB7XG4gIGNvbnN0IGhhc1ZlcnNpb24gPSB0eXBlb2YgcGFja2FnZVZlcnNpb24gIT09ICd1bmRlZmluZWQnO1xuICBpZiAoIWhhc1ZlcnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBoYXNNYXRjaFZlcnNpb24gPSBPYmplY3Qua2V5cyhwYWNrYWdlTWV0YS52ZXJzaW9ucykuaW5jbHVkZXMocGFja2FnZVZlcnNpb24pO1xuICByZXR1cm4gaGFzTWF0Y2hWZXJzaW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWxhdGVkVG9EZXByZWNhdGlvbihwa2dJbmZvOiBQYWNrYWdlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgdmVyc2lvbnMgfSA9IHBrZ0luZm87XG4gIGZvciAoY29uc3QgdmVyc2lvbiBpbiB2ZXJzaW9ucykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmVyc2lvbnNbdmVyc2lvbl0sICdkZXByZWNhdGVkJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVVSTChwdWJsaWNVcmw6IHN0cmluZyB8IHZvaWQpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHB1YmxpY1VybCBhcyBzdHJpbmcpO1xuICAgIGlmICghdmFsaWRQcm90b2NvbHMuaW5jbHVkZXMocGFyc2VkLnByb3RvY29sLnJlcGxhY2UoJzonLCAnJykpKSB7XG4gICAgICB0aHJvdyBFcnJvcignaW52YWxpZCBwcm90b2NvbCcpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gVE9ETzogYWRkIGVycm9yIGxvZ2dlciBoZXJlXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hvc3QodXJsOiBzdHJpbmcgPSAnJywgb3B0aW9ucyA9IHt9KTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWxpZGF0b3IuaXNVUkwodXJsLCB7XG4gICAgcmVxdWlyZV9ob3N0OiB0cnVlLFxuICAgIGFsbG93X3RyYWlsaW5nX2RvdDogZmFsc2UsXG4gICAgcmVxdWlyZV92YWxpZF9wcm90b2NvbDogZmFsc2UsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJlcXVpcmVfcG9ydDogZmFsc2UsXG4gICAgcmVxdWlyZV90bGQ6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHVibGljVXJsKHVybF9wcmVmaXg6IHN0cmluZyA9ICcnLCByZXEpOiBzdHJpbmcge1xuICBpZiAodmFsaWRhdGVVUkwocHJvY2Vzcy5lbnYuVkVSREFDQ0lPX1BVQkxJQ19VUkwgYXMgc3RyaW5nKSkge1xuICAgIGNvbnN0IGVudlVSTCA9IG5ldyBVUkwod3JhcFByZWZpeCh1cmxfcHJlZml4KSwgcHJvY2Vzcy5lbnYuVkVSREFDQ0lPX1BVQkxJQ19VUkwgYXMgc3RyaW5nKS5ocmVmO1xuICAgIGRlYnVnKCdwdWJsaWMgdXJsIGJ5IGVudiAlbycsIGVudlVSTCk7XG4gICAgcmV0dXJuIGVudlVSTDtcbiAgfSBlbHNlIGlmIChyZXEuZ2V0KCdob3N0JykpIHtcbiAgICBjb25zdCBob3N0ID0gcmVxLmdldCgnaG9zdCcpO1xuICAgIGlmICghaXNIb3N0KGhvc3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaG9zdCcpO1xuICAgIH1cbiAgICBjb25zdCBwcm90b0hlYWRlciA9IHByb2Nlc3MuZW52LlZFUkRBQ0NJT19GT1JXQVJERURfUFJPVE8gPz8gSEVBREVSUy5GT1JXQVJERURfUFJPVE87XG4gICAgY29uc3QgcHJvdG9jb2wgPSBnZXRXZWJQcm90b2NvbChyZXEuZ2V0KHByb3RvSGVhZGVyLnRvTG93ZXJDYXNlKCkpLCByZXEucHJvdG9jb2wpO1xuICAgIGNvbnN0IGNvbWJpbmVkVXJsID0gY29tYmluZUJhc2VVcmwocHJvdG9jb2wsIGhvc3QsIHVybF9wcmVmaXgpO1xuICAgIGRlYnVnKCdwdWJsaWMgdXJsIGJ5IHJlcXVlc3QgJW8nLCBjb21iaW5lZFVybCk7XG4gICAgcmV0dXJuIGNvbWJpbmVkVXJsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnLyc7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYmFzZSB1cmwgZm9yIHJlZ2lzdHJ5LlxuICogQHJldHVybiB7U3RyaW5nfSBiYXNlIHJlZ2lzdHJ5IHVybFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZUJhc2VVcmwocHJvdG9jb2w6IHN0cmluZywgaG9zdDogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgZGVidWcoJ2NvbWJpbmVkIHByb3RvY29sICVvJywgcHJvdG9jb2wpO1xuICBkZWJ1ZygnY29tYmluZWQgaG9zdCAlbycsIGhvc3QpO1xuICBjb25zdCBuZXdQcmVmaXggPSB3cmFwUHJlZml4KHByZWZpeCk7XG4gIGRlYnVnKCdjb21iaW5lZCBwcmVmaXggJW8nLCBuZXdQcmVmaXgpO1xuICBjb25zdCBncm91cGVkVVJJID0gbmV3IFVSTCh3cmFwUHJlZml4KHByZWZpeCksIGAke3Byb3RvY29sfTovLyR7aG9zdH1gKTtcbiAgY29uc3QgcmVzdWx0ID0gZ3JvdXBlZFVSSS5ocmVmO1xuICBkZWJ1ZygnY29tYmluZWQgdXJsICVvJywgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBQcmVmaXgocHJlZml4OiBzdHJpbmcgfCB2b2lkKTogc3RyaW5nIHtcbiAgaWYgKHByZWZpeCA9PT0gJycgfHwgdHlwZW9mIHByZWZpeCA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJlZml4ID09PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9IGVsc2UgaWYgKCFwcmVmaXguc3RhcnRzV2l0aCgnLycpICYmIHByZWZpeC5lbmRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGAvJHtwcmVmaXh9YDtcbiAgfSBlbHNlIGlmICghcHJlZml4LnN0YXJ0c1dpdGgoJy8nKSAmJiAhcHJlZml4LmVuZHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gYC8ke3ByZWZpeH0vYDtcbiAgfSBlbHNlIGlmIChwcmVmaXguc3RhcnRzV2l0aCgnLycpICYmICFwcmVmaXguZW5kc1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBgJHtwcmVmaXh9L2A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZWZpeDtcbiAgfVxufVxuIl19
805
+
806
+ function hasLogin(config) {
807
+ var _config$web, _config$web2;
808
+
809
+ // FIXME: types are not yet on the library verdaccio/monorepo
810
+ // @ts-ignore
811
+ return _lodash.default.isNil(config === null || config === void 0 ? void 0 : (_config$web = config.web) === null || _config$web === void 0 ? void 0 : _config$web.login) || (config === null || config === void 0 ? void 0 : (_config$web2 = config.web) === null || _config$web2 === void 0 ? void 0 : _config$web2.login) === true;
812
+ }
813
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMudHMiXSwibmFtZXMiOlsiZGVidWciLCJyZXF1aXJlIiwibW9kdWxlIiwicGtnVmVyc2lvbiIsImV4cG9ydHMiLCJ2ZXJzaW9uIiwicGtnTmFtZSIsIm5hbWUiLCJ2YWxpZFByb3RvY29scyIsImdldFVzZXJBZ2VudCIsImN1c3RvbVVzZXJBZ2VudCIsIl8iLCJpc1N0cmluZyIsImlzRW1wdHkiLCJjb252ZXJ0UGF5bG9hZFRvQmFzZTY0IiwicGF5bG9hZCIsIkJ1ZmZlciIsImZyb20iLCJ2YWxpZGF0ZU5hbWUiLCJub3JtYWxpemVkTmFtZSIsInRvTG93ZXJDYXNlIiwibWF0Y2giLCJzdGFydHNXaXRoIiwiaW5jbHVkZXMiLCJ2YWxpZGF0ZVBhY2thZ2UiLCJuYW1lTGlzdCIsInNwbGl0IiwibGVuZ3RoIiwic2xpY2UiLCJpc09iamVjdCIsIm9iaiIsImlzTnVsbCIsImlzQXJyYXkiLCJpc09iamVjdE9yQXJyYXkiLCJ2YWxpZGF0ZU1ldGFkYXRhIiwib2JqZWN0IiwiYXNzZXJ0Iiwic3RyaWN0RXF1YWwiLCJESVNUX1RBR1MiLCJleHRyYWN0VGFyYmFsbEZyb21VcmwiLCJ1cmwiLCJEZWZhdWx0VVJMIiwicGFyc2UiLCJwYXRobmFtZSIsInJlcGxhY2UiLCJjb252ZXJ0RGlzdFJlbW90ZVRvTG9jYWxUYXJiYWxsVXJscyIsInBrZyIsInJlcSIsInVybFByZWZpeCIsInZlciIsInZlcnNpb25zIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGlzdE5hbWUiLCJkaXN0IiwidGFyYmFsbCIsImdldExvY2FsUmVnaXN0cnlUYXJiYWxsVXJpIiwibWVtb2l6ZWRnZXRQdWJsaWNVcmwiLCJnZXRQdWJsaWNVcmwiLCJ1cmkiLCJjdXJyZW50SG9zdCIsImdldCIsInRhcmJhbGxOYW1lIiwiZG9tYWluUmVnaXN0cnkiLCJlbmNvZGVTY29wZWRVcmkiLCJ0YWdWZXJzaW9uIiwiZGF0YSIsInRhZyIsInNlbXZlciIsImdldFZlcnNpb24iLCJpc05pbCIsInZlcnNpb25JdGVtIiwiY29tcGFyZSIsImVyciIsInVuZGVmaW5lZCIsInBhcnNlQWRkcmVzcyIsInVybEFkZHJlc3MiLCJ1cmxQYXR0ZXJuIiwiZXhlYyIsInByb3RvIiwiREVGQVVMVF9QUk9UT0NPTCIsImhvc3QiLCJERUZBVUxUX0RPTUFJTiIsInBvcnQiLCJERUZBVUxUX1BPUlQiLCJwYXRoIiwic2VtdmVyU29ydCIsImxpc3RWZXJzaW9ucyIsImZpbHRlciIsIngiLCJsb2dnZXIiLCJ3YXJuIiwic29ydCIsImNvbXBhcmVMb29zZSIsIm1hcCIsIlN0cmluZyIsIm5vcm1hbGl6ZURpc3RUYWdzIiwic29ydGVkIiwibGF0ZXN0Iiwia2V5cyIsInBvcCIsInBhcnNlSW50ZXJ2YWxUYWJsZSIsIm1zIiwicyIsIm0iLCJoIiwiZCIsInciLCJNIiwieSIsInBhcnNlSW50ZXJ2YWwiLCJpbnRlcnZhbCIsInJlc3VsdCIsImxhc3Rfc3VmZml4IiwiSW5maW5pdHkiLCJmb3JFYWNoIiwiRXJyb3IiLCJOdW1iZXIiLCJnZXRXZWJQcm90b2NvbCIsImhlYWRlclByb3RvY29sIiwicHJvdG9jb2wiLCJyZXR1cm5Qcm90b2NvbCIsImRlZmF1bHRQcm90b2NvbCIsImNvbW1hSW5kZXgiLCJpbmRleE9mIiwic3Vic3RyIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsInBrZ0luZm8iLCJFcnJvckNvZGUiLCJnZXRDb25mbGljdCIsImdldEJhZERhdGEiLCJnZXRCYWRSZXF1ZXN0IiwiZ2V0SW50ZXJuYWxFcnJvciIsImdldFVuYXV0aG9yaXplZCIsImdldEZvcmJpZGRlbiIsImdldFNlcnZpY2VVbmF2YWlsYWJsZSIsImdldE5vdEZvdW5kIiwiZ2V0Q29kZSIsInBhcnNlQ29uZmlnRmlsZSIsImNvbmZpZ1BhdGgiLCJ0ZXN0IiwiWUFNTCIsImxvYWQiLCJmcyIsInJlYWRGaWxlU3luYyIsImUiLCJjb2RlIiwibWVzc2FnZSIsIkFQUF9FUlJPUiIsIkNPTkZJR19OT1RfVkFMSUQiLCJmb2xkZXJFeGlzdHMiLCJzdGF0Iiwic3RhdFN5bmMiLCJpc0RpcmVjdG9yeSIsImZpbGVFeGlzdHMiLCJpc0ZpbGUiLCJzb3J0QnlOYW1lIiwicGFja2FnZXMiLCJvcmRlckFzY2VuZGluZyIsImEiLCJiIiwiY29tcGFyYXRvck5hbWVzIiwiYWRkU2NvcGUiLCJzY29wZSIsInBhY2thZ2VOYW1lIiwiZGVsZXRlUHJvcGVydGllcyIsInByb3BlcnRpZXNUb0RlbGV0ZSIsIm9iamVjdEl0ZW0iLCJwcm9wZXJ0eSIsImFkZEdyYXZhdGFyU3VwcG9ydCIsIm9ubGluZSIsInBrZ0luZm9Db3B5IiwiYXV0aG9yIiwiY29udHJpYnV0b3JzIiwibWFpbnRhaW5lcnMiLCJlbWFpbCIsImF2YXRhciIsIkdFTkVSSUNfQVZBVEFSIiwiY29udHJpYnV0b3IiLCJtYWludGFpbmVyIiwicGFyc2VSZWFkbWUiLCJyZWFkbWUiLCJvcHRpb25zIiwiZXJyb3IiLCJidWlsZFRva2VuIiwidHlwZSIsInRva2VuIiwiY2FwaXRhbGl6ZSIsImdldFZlcnNpb25Gcm9tVGFyYmFsbCIsImZvcm1hdEF1dGhvciIsImF1dGhvckRldGFpbHMiLCJERUZBVUxUX1VTRVIiLCJpc0hUVFBQcm90b2NvbCIsInBhZCIsInN0ciIsIm1heCIsInJlcGVhdCIsIm1hc2siLCJjaGFyTnVtIiwiaGFzRGlmZk9uZUtleSIsImlzVmVyc2lvblZhbGlkIiwicGFja2FnZU1ldGEiLCJwYWNrYWdlVmVyc2lvbiIsImhhc1ZlcnNpb24iLCJoYXNNYXRjaFZlcnNpb24iLCJpc1JlbGF0ZWRUb0RlcHJlY2F0aW9uIiwidmFsaWRhdGVVUkwiLCJwdWJsaWNVcmwiLCJwYXJzZWQiLCJVUkwiLCJpc0hvc3QiLCJ2YWxpZGF0b3IiLCJpc1VSTCIsInJlcXVpcmVfaG9zdCIsImFsbG93X3RyYWlsaW5nX2RvdCIsInJlcXVpcmVfdmFsaWRfcHJvdG9jb2wiLCJyZXF1aXJlX3BvcnQiLCJyZXF1aXJlX3RsZCIsInVybF9wcmVmaXgiLCJwcm9jZXNzIiwiZW52IiwiVkVSREFDQ0lPX1BVQkxJQ19VUkwiLCJlbnZVUkwiLCJ3cmFwUHJlZml4IiwiaHJlZiIsInByb3RvSGVhZGVyIiwiVkVSREFDQ0lPX0ZPUldBUkRFRF9QUk9UTyIsIkhFQURFUlMiLCJGT1JXQVJERURfUFJPVE8iLCJjb21iaW5lZFVybCIsImNvbWJpbmVCYXNlVXJsIiwicHJlZml4IiwibmV3UHJlZml4IiwiZ3JvdXBlZFVSSSIsImVuZHNXaXRoIiwiaGFzTG9naW4iLCJjb25maWciLCJ3ZWIiLCJsb2dpbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBLE1BQU1BLEtBQUssR0FBRyxvQkFBVyxXQUFYLENBQWQsQyxDQUVBO0FBQ0E7O0FBQ0FDLE9BQU8sQ0FBQyxTQUFELENBQVAsQ0FBbUJDLE1BQW5COztBQUNBLE1BQU1DLFVBQVUsR0FBR0QsTUFBTSxDQUFDRSxPQUFQLENBQWVDLE9BQWxDO0FBQ0EsTUFBTUMsT0FBTyxHQUFHSixNQUFNLENBQUNFLE9BQVAsQ0FBZUcsSUFBL0I7QUFDQSxNQUFNQyxjQUFjLEdBQUcsQ0FBQyxPQUFELEVBQVUsTUFBVixDQUF2Qjs7QUFFTyxTQUFTQyxZQUFULENBQXNCQyxlQUF0QixFQUFrRTtBQUN2RSx1QkFBT0MsZ0JBQUVDLFFBQUYsQ0FBV04sT0FBWCxDQUFQO0FBQ0EsdUJBQU9LLGdCQUFFQyxRQUFGLENBQVdULFVBQVgsQ0FBUDs7QUFDQSxNQUFJTyxlQUFlLEtBQUssSUFBeEIsRUFBOEI7QUFDNUIsV0FBUSxHQUFFSixPQUFRLElBQUdILFVBQVcsRUFBaEM7QUFDRCxHQUZELE1BRU8sSUFBSVEsZ0JBQUVDLFFBQUYsQ0FBV0YsZUFBWCxLQUErQkMsZ0JBQUVFLE9BQUYsQ0FBVUgs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LFNBQVNJLFFBQVQsQ0FBa0JDLE1BQWxCLEVBQWtDO0FBQUE7O0FBQ3ZDO0FBQ0E7QUFDQSxTQUFPbk8sZ0JBQUU2RCxLQUFGLENBQVFzSyxNQUFSLGFBQVFBLE1BQVIsc0NBQVFBLE1BQU0sQ0FBRUMsR0FBaEIsZ0RBQVEsWUFBYUMsS0FBckIsS0FBK0IsQ0FBQUYsTUFBTSxTQUFOLElBQUFBLE1BQU0sV0FBTiw0QkFBQUEsTUFBTSxDQUFFQyxHQUFSLDhEQUFhQyxLQUFiLE1BQXVCLElBQTdEO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgYnVpbGREZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IFlBTUwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1lbW9pemVlIGZyb20gJ21lbW9pemVlJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBEZWZhdWx0VVJMLCB7IFVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgdmFsaWRhdG9yIGZyb20gJ3ZhbGlkYXRvcic7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG5pbXBvcnQgeyBnZXRCYWREYXRhLCBnZXRCYWRSZXF1ZXN0LCBnZXRDb2RlLCBnZXRDb25mbGljdCwgZ2V0Rm9yYmlkZGVuLCBnZXRJbnRlcm5hbEVycm9yLCBnZXROb3RGb3VuZCwgZ2V0U2VydmljZVVuYXZhaWxhYmxlLCBnZXRVbmF1dGhvcml6ZWQgfSBmcm9tICdAdmVyZGFjY2lvL2NvbW1vbnMtYXBpJztcbmltcG9ydCBzYW5pdGl6eVJlYWRtZSBmcm9tICdAdmVyZGFjY2lvL3JlYWRtZSc7XG5pbXBvcnQgeyBBdXRob3IsIENvbmZpZywgUGFja2FnZSwgVmVyc2lvbiB9IGZyb20gJ0B2ZXJkYWNjaW8vdHlwZXMnO1xuXG5pbXBvcnQgeyBBdXRob3JBdmF0YXIsIFN0cmluZ1ZhbHVlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgR0VORVJJQ19BVkFUQVIsIGdlbmVyYXRlR3JhdmF0YXJVcmwgfSBmcm9tICcuLi91dGlscy91c2VyJztcbmltcG9ydCB7IEFQUF9FUlJPUiwgREVGQVVMVF9ET01BSU4sIERFRkFVTFRfUE9SVCwgREVGQVVMVF9QUk9UT0NPTCwgREVGQVVMVF9VU0VSLCBESVNUX1RBR1MsIEhFQURFUlMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBub3JtYWxpemVDb250cmlidXRvcnMgfSBmcm9tICcuL3N0b3JhZ2UtdXRpbHMnO1xuXG5jb25zdCBkZWJ1ZyA9IGJ1aWxkRGVidWcoJ3ZlcmRhY2NpbycpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xucmVxdWlyZSgncGtnaW5mbycpKG1vZHVsZSk7XG5jb25zdCBwa2dWZXJzaW9uID0gbW9kdWxlLmV4cG9ydHMudmVyc2lvbjtcbmNvbnN0IHBrZ05hbWUgPSBtb2R1bGUuZXhwb3J0cy5uYW1lO1xuY29uc3QgdmFsaWRQcm90b2NvbHMgPSBbJ2h0dHBzJywgJ2h0dHAnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJBZ2VudChjdXN0b21Vc2VyQWdlbnQ/OiBib29sZWFuIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgYXNzZXJ0KF8uaXNTdHJpbmcocGtnTmFtZSkpO1xuICBhc3NlcnQoXy5pc1N0cmluZyhwa2dWZXJzaW9uKSk7XG4gIGlmIChjdXN0b21Vc2VyQWdlbnQgPT09IHRydWUpIHtcbiAgICByZXR1cm4gYCR7cGtnTmFtZX0vJHtwa2dWZXJzaW9ufWA7XG4gIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhjdXN0b21Vc2VyQWdlbnQpICYmIF8uaXNFbXB0eShjdXN0b21Vc2VyQWdlbnQpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBjdXN0b21Vc2VyQWdlbnQ7XG4gIH0gZWxzZSBpZiAoY3VzdG9tVXNlckFnZW50ID09PSBmYWxzZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBgJHtwa2dOYW1lfS8ke3BrZ1ZlcnNpb259YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRQYXlsb2FkVG9CYXNlNjQocGF5bG9hZDogc3RyaW5nKTogQnVmZmVyIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHBheWxvYWQsICdiYXNlNjQnKTtcbn1cblxuLyoqXG4gKiBGcm9tIG5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEvbGliL2ZpeGVyLmpzXG4gKiBAcGFyYW0geyp9IG5hbWUgIHRoZSBwYWNrYWdlIG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHdoZXRoZXIgaXMgdmFsaWQgb3Igbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChfLmlzU3RyaW5nKG5hbWUpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWROYW1lOiBzdHJpbmcgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgLyoqXG4gICAqIFNvbWUgY29udGV4dCBhYm91dCB0aGUgZmlyc3QgcmVnZXhcbiAgICogLSBucG0gdXNlZCB0byBoYXZlIGEgZGlmZmVyZW50IHRhcmJhbGwgbmFtaW5nIHN5c3RlbS5cbiAgICogZWc6IGh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5jb20vdGhpcnR5LXR3b1xuICAgKiBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90aGlydHktdHdvLy0vdGhpcnR5LXR3b0AwLjAuMS50Z3pcbiAgICogVGhlIGZpbGUgbmFtZSB0aGlydHktdHdvQDAuMC4xLnRneiwgdGhlIHZlcnNpb24gYW5kIHRoZSBwa2cgbmFtZSB3YXMgc2VwYXJhdGVkIGJ5IGFuIGF0IChAKVxuICAgKiB3aGlsZSBub3dhZGF5cyB0aGUgbmFtaW5nIHN5c3RlbSBpcyBiYXNlZCBpbiBkYXNoZXNcbiAgICogaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmVyZGFjY2lvLy0vdmVyZGFjY2lvLTEuNC4wLnRnelxuICAgKlxuICAgKiBtb3JlIGluZm8gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL3JsaWR3a2Evc2lub3BpYS9pc3N1ZXMvNzVcbiAgICovXG4gIHJldHVybiAhKFxuICAgICFub3JtYWxpemVkTmFtZS5tYXRjaCgvXlstYS16QS1aMC05Xy4hfionKClAXSskLykgfHxcbiAgICBub3JtYWxpemVkTmFtZS5zdGFydHNXaXRoKCcuJykgfHwgLy8gXCIuYmluXCIsIGV0Yy5cbiAgICBbJ25vZGVfbW9kdWxlcycsICdfX3Byb3RvX18nLCAnZmF2aWNvbi5pY28nXS5pbmNsdWRlcyhub3JtYWxpemVkTmFtZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHBhY2thZ2UuXG4gKiBAcmV0dXJuIHtCb29sZWFufSB3aGV0aGVyIHRoZSBwYWNrYWdlIGlzIHZhbGlkIG9yIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQYWNrYWdlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBuYW1lTGlzdCA9IG5hbWUuc3BsaXQoJy8nLCAyKTtcbiAgaWYgKG5hbWVMaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIG5vcm1hbCBwYWNrYWdlXG4gICAgcmV0dXJuIHZhbGlkYXRlTmFtZShuYW1lTGlzdFswXSk7XG4gIH1cbiAgLy8gc2NvcGVkIHBhY2thZ2VcbiAgcmV0dXJuIG5hbWVMaXN0WzBdWzBdID09PSAnQCcgJiYgdmFsaWRhdGVOYW1lKG5hbWVMaXN0WzBdLnNsaWNlKDEpKSAmJiB2YWxpZGF0ZU5hbWUobmFtZUxpc3RbMV0pO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBhbiBPYmplY3RcbiAqIEBwYXJhbSB7Kn0gb2JqIHRoZSBlbGVtZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3Qob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIF8uaXNPYmplY3Qob2JqKSAmJiBfLmlzTnVsbChvYmopID09PSBmYWxzZSAmJiBfLmlzQXJyYXkob2JqKSA9PT0gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdE9yQXJyYXkob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIF8uaXNPYmplY3Qob2JqKSAmJiBfLmlzTnVsbChvYmopID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGUgcGFja2FnZSBtZXRhZGF0YSwgYWRkIGFkZGl0aW9uYWwgcHJvcGVydGllcyB3aGV0aGVyIGFyZSBtaXNzaW5nIHdpdGhpblxuICogdGhlIG1ldGFkYXRhIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0geyp9IG9iamVjdFxuICogQHBhcmFtIHsqfSBuYW1lXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBvYmplY3Qgd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYXMgZGlzdC10YWdzIGFkIHZlcnNpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1ldGFkYXRhKG9iamVjdDogUGFja2FnZSwgbmFtZTogc3RyaW5nKTogUGFja2FnZSB7XG4gIGFzc2VydChpc09iamVjdChvYmplY3QpLCAnbm90IGEganNvbiBvYmplY3QnKTtcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKG9iamVjdC5uYW1lLCBuYW1lKTtcblxuICBpZiAoIWlzT2JqZWN0KG9iamVjdFtESVNUX1RBR1NdKSkge1xuICAgIG9iamVjdFtESVNUX1RBR1NdID0ge307XG4gIH1cblxuICBpZiAoIWlzT2JqZWN0KG9iamVjdFsndmVyc2lvbnMnXSkpIHtcbiAgICBvYmplY3RbJ3ZlcnNpb25zJ10gPSB7fTtcbiAgfVxuXG4gIGlmICghaXNPYmplY3Qob2JqZWN0Wyd0aW1lJ10pKSB7XG4gICAgb2JqZWN0Wyd0aW1lJ10gPSB7fTtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VGFyYmFsbEZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBEZWZhdWx0VVJMLnBhcnNlKHVybCkucGF0aG5hbWUucmVwbGFjZSgvXi4qXFwvLywgJycpO1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgYSBwYWNrYWdlcydzIHZlcnNpb25zIGFuZCBmaWx0ZXIgZWFjaCBvcmlnaW5hbCB0YXJiYWxsIHVybC5cbiAqIEBwYXJhbSB7Kn0gcGtnXG4gKiBAcGFyYW0geyp9IHJlcVxuICogQHBhcmFtIHsqfSBjb25maWdcbiAqIEByZXR1cm4ge1N0cmluZ30gYSBmaWx0ZXJlZCBwYWNrYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RGlzdFJlbW90ZVRvTG9jYWxUYXJiYWxsVXJscyhwa2c6IFBhY2thZ2UsIHJlcTogUmVxdWVzdCwgdXJsUHJlZml4OiBzdHJpbmcgfCB2b2lkKTogUGFja2FnZSB7XG4gIGZvciAoY29uc3QgdmVyIGluIHBrZy52ZXJzaW9ucykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGtnLnZlcnNpb25zLCB2ZXIpKSB7XG4gICAgICBjb25zdCBkaXN0TmFtZSA9IHBrZy52ZXJzaW9uc1t2ZXJdLmRpc3Q7XG5cbiAgICAgIGlmIChfLmlzTnVsbChkaXN0TmFtZSkgPT09IGZhbHNlICYmIF8uaXNOdWxsKGRpc3ROYW1lLnRhcmJhbGwpID09PSBmYWxzZSkge1xuICAgICAgICBkaXN0TmFtZS50YXJiYWxsID0gZ2V0TG9jYWxSZWdpc3RyeVRhcmJhbGxVcmkoZGlzdE5hbWUudGFyYmFsbCwgcGtnLm5hbWUsIHJlcSwgdXJsUHJlZml4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBrZztcbn1cblxuY29uc3QgbWVtb2l6ZWRnZXRQdWJsaWNVcmwgPSBtZW1vaXplZShnZXRQdWJsaWNVcmwpO1xuXG4vKipcbiAqIEZpbHRlciBhIHRhcmJhbGwgdXJsLlxuICogQHBhcmFtIHsqfSB1cmlcbiAqIEByZXR1cm4ge1N0cmluZ30gYSBwYXJzZWQgdXJsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbFJlZ2lzdHJ5VGFyYmFsbFVyaSh1cmk6IHN0cmluZywgcGtnTmFtZTogc3RyaW5nLCByZXE6IFJlcXVlc3QsIHVybFByZWZpeDogc3RyaW5nIHwgdm9pZCk6IHN0cmluZyB7XG4gIGNvbnN0IGN1cnJlbnRIb3N0ID0gcmVxLmdldCgnaG9zdCcpO1xuXG4gIGlmICghY3VycmVudEhvc3QpIHtcbiAgICByZXR1cm4gdXJpO1xuICB9XG4gIGNvbnN0IHRhcmJhbGxOYW1lID0gZXh0cmFjdFRhcmJhbGxGcm9tVXJsKHVyaSk7XG4gIGNvbnN0IGRvbWFpblJlZ2lzdHJ5ID0gbWVtb2l6ZWRnZXRQdWJsaWNVcmwodXJsUHJlZml4IHx8ICcnLCByZXEpO1xuXG4gIHJldHVybiBgJHtkb21haW5SZWdpc3RyeX0ke2VuY29kZVNjb3BlZFVyaShwa2dOYW1lKX0vLS8ke3RhcmJhbGxOYW1lfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdWZXJzaW9uKGRhdGE6IFBhY2thZ2UsIHZlcnNpb246IHN0cmluZywgdGFnOiBTdHJpbmdWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAodGFnICYmIGRhdGFbRElTVF9UQUdTXVt0YWddICE9PSB2ZXJzaW9uICYmIHNlbXZlci5wYXJzZSh2ZXJzaW9uLCB0cnVlKSkge1xuICAgIC8vIHZhbGlkIHZlcnNpb24gLSBzdG9yZVxuICAgIGRhdGFbRElTVF9UQUdTXVt0YWddID0gdmVyc2lvbjtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogR2V0cyB2ZXJzaW9uIGZyb20gYSBwYWNrYWdlIG9iamVjdCB0YWtpbmcgaW50byBhY2NvdW50IHNlbXZlciB3ZWlyZG5lc3MuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybiB0aGUgc2VtYW50aWMgdmVyc2lvbiBvZiBhIHBhY2thZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb24ocGtnOiBQYWNrYWdlLCB2ZXJzaW9uOiBhbnkpOiBWZXJzaW9uIHwgdm9pZCB7XG4gIC8vIHRoaXMgY29uZGl0aW9uIG11c3QgYWxsb3cgY2FzdFxuICBpZiAoXy5pc05pbChwa2cudmVyc2lvbnNbdmVyc2lvbl0pID09PSBmYWxzZSkge1xuICAgIHJldHVybiBwa2cudmVyc2lvbnNbdmVyc2lvbl07XG4gIH1cblxuICB0cnkge1xuICAgIHZlcnNpb24gPSBzZW12ZXIucGFyc2UodmVyc2lvbiwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCB2ZXJzaW9uSXRlbSBpbiBwa2cudmVyc2lvbnMpIHtcbiAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgIGlmICh2ZXJzaW9uLmNvbXBhcmUoc2VtdmVyLnBhcnNlKHZlcnNpb25JdGVtLCB0cnVlKSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHBrZy52ZXJzaW9uc1t2ZXJzaW9uSXRlbV07XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2UgYW4gaW50ZXJuZXQgYWRkcmVzc1xuICogQWxsb3c6XG4gLSBodHRwczpsb2NhbGhvc3Q6MTIzNCAgICAgICAgLSBwcm90b2NvbCArIGhvc3QgKyBwb3J0XG4gLSBsb2NhbGhvc3Q6MTIzNCAgICAgICAgICAgICAgLSBob3N0ICsgcG9ydFxuIC0gMTIzNCAgICAgICAgICAgICAgICAgICAgICAgIC0gcG9ydFxuIC0gaHR0cDo6MTIzNCAgICAgICAgICAgICAgICAgIC0gcHJvdG9jb2wgKyBwb3J0XG4gLSBodHRwczovL2xvY2FsaG9zdDo0NDMvICAgICAgLSBmdWxsIHVybCArIGh0dHBzXG4gLSBodHRwOi8vWzo6MV06NDQzLyAgICAgICAgICAgLSBpcHY2XG4gLSB1bml4Oi90bXAvaHR0cC5zb2NrICAgICAgICAgLSB1bml4IHNvY2tldHNcbiAtIGh0dHBzOi8vdW5peDovdG1wL2h0dHAuc29jayAtIHVuaXggc29ja2V0cyAoaHR0cHMpXG4gKiBAcGFyYW0geyp9IHVybEFkZHJlc3MgdGhlIGludGVybmV0IGFkZHJlc3MgZGVmaW5pdGlvblxuICogQHJldHVybiB7T2JqZWN0fE51bGx9IGxpdGVyYWwgb2JqZWN0IHRoYXQgcmVwcmVzZW50IHRoZSBhZGRyZXNzIHBhcnNlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBZGRyZXNzKHVybEFkZHJlc3M6IGFueSk6IGFueSB7XG4gIC8vXG4gIC8vIFRPRE86IHJlZmFjdG9yIGl0IHRvIHNvbWV0aGluZyBtb3JlIHJlYXNvbmFibGU/XG4gIC8vXG4gIC8vICAgICAgICBwcm90b2NvbCA6ICAvLyAgICAgICggIGhvc3QgICl8KCAgICBpcHY2ICAgICApOiAgcG9ydCAgL1xuICBsZXQgdXJsUGF0dGVybiA9IC9eKChodHRwcz8pOihcXC9cXC8pPyk/KCgoW15cXC86XSopfFxcWyhbXlxcW1xcXV0rKVxcXSk6KT8oXFxkKylcXC8/JC8uZXhlYyh1cmxBZGRyZXNzKTtcblxuICBpZiAodXJsUGF0dGVybikge1xuICAgIHJldHVybiB7XG4gICAgICBwcm90bzogdXJsUGF0dGVyblsyXSB8fCBERUZBVUxUX1BST1RPQ09MLFxuICAgICAgaG9zdDogdXJsUGF0dGVybls2XSB8fCB1cmxQYXR0ZXJuWzddIHx8IERFRkFVTFRfRE9NQUlOLFxuICAgICAgcG9ydDogdXJsUGF0dGVybls4XSB8fCBERUZBVUxUX1BPUlQsXG4gICAgfTtcbiAgfVxuXG4gIHVybFBhdHRlcm4gPSAvXigoaHR0cHM/KTooXFwvXFwvKT8pP3VuaXg6KC4qKSQvLmV4ZWModXJsQWRkcmVzcyk7XG5cbiAgaWYgKHVybFBhdHRlcm4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG86IHVybFBhdHRlcm5bMl0gfHwgREVGQVVMVF9QUk9UT0NPTCxcbiAgICAgIHBhdGg6IHVybFBhdHRlcm5bNF0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIGZpbHRlcnMgb3V0IGJhZCBzZW12ZXIgdmVyc2lvbnMgYW5kIHNvcnRzIHRoZSBhcnJheS5cbiAqIEByZXR1cm4ge0FycmF5fSBzb3J0ZWQgQXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbXZlclNvcnQobGlzdFZlcnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIChcbiAgICBsaXN0VmVyc2lvbnNcbiAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFzZW12ZXIucGFyc2UoeCwgdHJ1ZSkpIHtcbiAgICAgICAgICBsb2dnZXIud2Fybih7IHZlcjogeCB9LCAnaWdub3JpbmcgYmFkIHZlcnNpb24gQHt2ZXJ9Jyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSlcbiAgICAgIC8vIEZJWE1FOiBpdCBzZWVtcyB0aGUgQHR5cGVzL3NlbXZlciBkbyBub3QgaGFuZGxlIGEgbGVnaXRpbWF0ZSBtZXRob2QgbmFtZWQgJ2NvbXBhcmVMb29zZSdcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIC5zb3J0KHNlbXZlci5jb21wYXJlTG9vc2UpXG4gICAgICAubWFwKFN0cmluZylcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGFycmF5cyBvZiB0YWdzLlxuICogQHBhcmFtIHsqfSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEaXN0VGFncyhwa2c6IFBhY2thZ2UpOiB2b2lkIHtcbiAgbGV0IHNvcnRlZDtcbiAgaWYgKCFwa2dbRElTVF9UQUdTXS5sYXRlc3QpIHtcbiAgICAvLyBvdmVyd3JpdGUgbGF0ZXN0IHdpdGggaGlnaGVzdCBrbm93biB2ZXJzaW9uIGJhc2VkIG9uIHNlbXZlciBzb3J0XG4gICAgc29ydGVkID0gc2VtdmVyU29ydChPYmplY3Qua2V5cyhwa2cudmVyc2lvbnMpKTtcbiAgICBpZiAoc29ydGVkICYmIHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHBrZ1tESVNUX1RBR1NdLmxhdGVzdCA9IHNvcnRlZC5wb3AoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHRhZyBpbiBwa2dbRElTVF9UQUdTXSkge1xuICAgIGlmIChfLmlzQXJyYXkocGtnW0RJU1RfVEFHU11bdGFnXSkpIHtcbiAgICAgIGlmIChwa2dbRElTVF9UQUdTXVt0YWddLmxlbmd0aCkge1xuICAgICAgICAvLyBzb3J0IGFycmF5XG4gICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIGNsZWFybHkgd3JvbmcsIHdlIG5lZWQgdG8gcmVzZWFyY2ggd2h5IHRoaXMgaXMgbGlrZSB0aGlzLlxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHNvcnRlZCA9IHNlbXZlclNvcnQocGtnW0RJU1RfVEFHU11bdGFnXSk7XG4gICAgICAgIGlmIChzb3J0ZWQubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdXNlIGhpZ2hlc3QgdmVyc2lvbiBiYXNlZCBvbiBzZW12ZXIgc29ydFxuICAgICAgICAgIHBrZ1tESVNUX1RBR1NdW3RhZ10gPSBzb3J0ZWQucG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBwa2dbRElTVF9UQUdTXVt0YWddO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhwa2dbRElTVF9UQUdTXVt0YWddKSkge1xuICAgICAgaWYgKCFzZW12ZXIucGFyc2UocGtnW0RJU1RfVEFHU11bdGFnXSwgdHJ1ZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIHZlcnNpb24gaXMgaW52YWxpZCwgZGVsZXRlIHRoZSBkaXN0LXRhZyBlbnRyeVxuICAgICAgICBkZWxldGUgcGtnW0RJU1RfVEFHU11bdGFnXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcGFyc2VJbnRlcnZhbFRhYmxlID0ge1xuICAnJzogMTAwMCxcbiAgbXM6IDEsXG4gIHM6IDEwMDAsXG4gIG06IDYwICogMTAwMCxcbiAgaDogNjAgKiA2MCAqIDEwMDAsXG4gIGQ6IDg2NDAwMDAwLFxuICB3OiA3ICogODY0MDAwMDAsXG4gIE06IDMwICogODY0MDAwMDAsXG4gIHk6IDM2NSAqIDg2NDAwMDAwLFxufTtcblxuLyoqXG4gKiBQYXJzZSBhbiBpbnRlcm5hbCBzdHJpbmcgdG8gbnVtYmVyXG4gKiBAcGFyYW0geyp9IGludGVydmFsXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUludGVydmFsKGludGVydmFsOiBhbnkpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIGludGVydmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBpbnRlcnZhbCAqIDEwMDA7XG4gIH1cbiAgbGV0IHJlc3VsdCA9IDA7XG4gIGxldCBsYXN0X3N1ZmZpeCA9IEluZmluaXR5O1xuICBpbnRlcnZhbC5zcGxpdCgvXFxzKy8pLmZvckVhY2goZnVuY3Rpb24gKHgpOiB2b2lkIHtcbiAgICBpZiAoIXgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbSA9IHgubWF0Y2goL14oKDB8WzEtOV1bMC05XSopKFxcLlswLTldKyk/KShtc3xzfG18aHxkfHd8TXx5fCkkLyk7XG4gICAgaWYgKCFtIHx8IHBhcnNlSW50ZXJ2YWxUYWJsZVttWzRdXSA+PSBsYXN0X3N1ZmZpeCB8fCAobVs0XSA9PT0gJycgJiYgbGFzdF9zdWZmaXggIT09IEluZmluaXR5KSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ2ludmFsaWQgaW50ZXJ2YWw6ICcgKyBpbnRlcnZhbCk7XG4gICAgfVxuICAgIGxhc3Rfc3VmZml4ID0gcGFyc2VJbnRlcnZhbFRhYmxlW21bNF1dO1xuICAgIHJlc3VsdCArPSBOdW1iZXIobVsxXSkgKiBwYXJzZUludGVydmFsVGFibGVbbVs0XV07XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERldGVjdCBydW5uaW5nIHByb3RvY29sIChodHRwIG9yIGh0dHBzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViUHJvdG9jb2woaGVhZGVyUHJvdG9jb2w6IHN0cmluZyB8IHZvaWQsIHByb3RvY29sOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmV0dXJuUHJvdG9jb2w7XG4gIGNvbnN0IFssIGRlZmF1bHRQcm90b2NvbF0gPSB2YWxpZFByb3RvY29scztcbiAgLy8gSEFQcm94eSB2YXJpYW50IG1pZ2h0IHJldHVybiBodHRwLGh0dHAgd2l0aCBYLUZvcndhcmRlZC1Qcm90b1xuICBpZiAodHlwZW9mIGhlYWRlclByb3RvY29sID09PSAnc3RyaW5nJyAmJiBoZWFkZXJQcm90b2NvbCAhPT0gJycpIHtcbiAgICBkZWJ1ZygnaGVhZGVyIHByb3RvY29sOiAlbycsIHByb3RvY29sKTtcbiAgICBjb25zdCBjb21tYUluZGV4ID0gaGVhZGVyUHJvdG9jb2wuaW5kZXhPZignLCcpO1xuICAgIHJldHVyblByb3RvY29sID0gY29tbWFJbmRleCA+IDAgPyBoZWFkZXJQcm90b2NvbC5zdWJzdHIoMCwgY29tbWFJbmRleCkgOiBoZWFkZXJQcm90b2NvbDtcbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZygncmVxIHByb3RvY29sOiAlbycsIGhlYWRlclByb3RvY29sKTtcbiAgICByZXR1cm5Qcm90b2NvbCA9IHByb3RvY29sO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkUHJvdG9jb2xzLmluY2x1ZGVzKHJldHVyblByb3RvY29sKSA/IHJldHVyblByb3RvY29sIDogZGVmYXVsdFByb3RvY29sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwa2dJbmZvOiBQYWNrYWdlKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBrZ0luZm9bRElTVF9UQUdTXS5sYXRlc3Q7XG59XG5cbmV4cG9ydCBjb25zdCBFcnJvckNvZGUgPSB7XG4gIGdldENvbmZsaWN0LFxuICBnZXRCYWREYXRhLFxuICBnZXRCYWRSZXF1ZXN0LFxuICBnZXRJbnRlcm5hbEVycm9yLFxuICBnZXRVbmF1dGhvcml6ZWQsXG4gIGdldEZvcmJpZGRlbixcbiAgZ2V0U2VydmljZVVuYXZhaWxhYmxlLFxuICBnZXROb3RGb3VuZCxcbiAgZ2V0Q29kZSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbmZpZ0ZpbGUoY29uZmlnUGF0aDogc3RyaW5nKTogYW55IHtcbiAgdHJ5IHtcbiAgICBpZiAoL1xcLnlhP21sJC9pLnRlc3QoY29uZmlnUGF0aCkpIHtcbiAgICAgIHJldHVybiBZQU1MLmxvYWQoZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGYtOCcpKTtcbiAgICB9XG4gICAgZGVidWcoJ3lhbWwgcGFyc2VkJyk7XG4gICAgcmV0dXJuIHJlcXVpcmUoY29uZmlnUGF0aCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZygneWFtbCBwYXJzZSBmYWlsZWQnKTtcbiAgICBpZiAoZS5jb2RlICE9PSAnTU9EVUxFX05PVF9GT1VORCcpIHtcbiAgICAgIGUubWVzc2FnZSA9IEFQUF9FUlJPUi5DT05GSUdfTk9UX1ZBTElEO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihlKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIHBhdGggYWxyZWFkeSBleGlzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9sZGVyRXhpc3RzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhwYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0LlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlRXhpc3RzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhwYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0ZpbGUoKTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEJ5TmFtZShwYWNrYWdlczogYW55W10sIG9yZGVyQXNjZW5kaW5nOiBib29sZWFuIHwgdm9pZCA9IHRydWUpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwYWNrYWdlcy5zbGljZSgpLnNvcnQoZnVuY3Rpb24gKGEsIGIpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbXBhcmF0b3JOYW1lcyA9IGEubmFtZS50b0xvd2VyQ2FzZSgpIDwgYi5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICByZXR1cm4gb3JkZXJBc2NlbmRpbmcgPyAoY29tcGFyYXRvck5hbWVzID8gLTEgOiAxKSA6IGNvbXBhcmF0b3JOYW1lcyA/IDEgOiAtMTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRTY29wZShzY29wZTogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBAJHtzY29wZX0vJHtwYWNrYWdlTmFtZX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzVG9EZWxldGU6IHN0cmluZ1tdLCBvYmplY3RJdGVtOiBhbnkpOiBhbnkge1xuICBfLmZvckVhY2gocHJvcGVydGllc1RvRGVsZXRlLCAocHJvcGVydHkpOiBhbnkgPT4ge1xuICAgIGRlbGV0ZSBvYmplY3RJdGVtW3Byb3BlcnR5XTtcbiAgfSk7XG5cbiAgcmV0dXJuIG9iamVjdEl0ZW07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRHcmF2YXRhclN1cHBvcnQocGtnSW5mbzogUGFja2FnZSwgb25saW5lID0gdHJ1ZSk6IEF1dGhvckF2YXRhciB7XG4gIGNvbnN0IHBrZ0luZm9Db3B5ID0geyAuLi5wa2dJbmZvIH0gYXMgYW55O1xuICBjb25zdCBhdXRob3I6IGFueSA9IF8uZ2V0KHBrZ0luZm8sICdsYXRlc3QuYXV0aG9yJywgbnVsbCkgYXMgYW55O1xuICBjb25zdCBjb250cmlidXRvcnM6IEF1dGhvckF2YXRhcltdID0gbm9ybWFsaXplQ29udHJpYnV0b3JzKF8uZ2V0KHBrZ0luZm8sICdsYXRlc3QuY29udHJpYnV0b3JzJywgW10pKTtcbiAgY29uc3QgbWFpbnRhaW5lcnMgPSBfLmdldChwa2dJbmZvLCAnbGF0ZXN0Lm1haW50YWluZXJzJywgW10pO1xuXG4gIC8vIGZvciBhdXRob3IuXG4gIGlmIChhdXRob3IgJiYgXy5pc09iamVjdChhdXRob3IpKSB7XG4gICAgY29uc3QgeyBlbWFpbCB9ID0gYXV0aG9yIGFzIEF1dGhvcjtcbiAgICBwa2dJbmZvQ29weS5sYXRlc3QuYXV0aG9yLmF2YXRhciA9IGdlbmVyYXRlR3JhdmF0YXJVcmwoZW1haWwsIG9ubGluZSk7XG4gIH1cblxuICBpZiAoYXV0aG9yICYmIF8uaXNTdHJpbmcoYXV0aG9yKSkge1xuICAgIHBrZ0luZm9Db3B5LmxhdGVzdC5hdXRob3IgPSB7XG4gICAgICBhdmF0YXI6IEdFTkVSSUNfQVZBVEFSLFxuICAgICAgZW1haWw6ICcnLFxuICAgICAgYXV0aG9yLFxuICAgIH07XG4gIH1cblxuICAvLyBmb3IgY29udHJpYnV0b3JzXG4gIGlmIChfLmlzRW1wdHkoY29udHJpYnV0b3JzKSA9PT0gZmFsc2UpIHtcbiAgICBwa2dJbmZvQ29weS5sYXRlc3QuY29udHJpYnV0b3JzID0gY29udHJpYnV0b3JzLm1hcCgoY29udHJpYnV0b3IpOiBBdXRob3JBdmF0YXIgPT4ge1xuICAgICAgaWYgKGlzT2JqZWN0KGNvbnRyaWJ1dG9yKSkge1xuICAgICAgICBjb250cmlidXRvci5hdmF0YXIgPSBnZW5lcmF0ZUdyYXZhdGFyVXJsKGNvbnRyaWJ1dG9yLmVtYWlsLCBvbmxpbmUpO1xuICAgICAgfSBlbHNlIGlmIChfLmlzU3RyaW5nKGNvbnRyaWJ1dG9yKSkge1xuICAgICAgICBjb250cmlidXRvciA9IHtcbiAgICAgICAgICBhdmF0YXI6IEdFTkVSSUNfQVZBVEFSLFxuICAgICAgICAgIGVtYWlsOiBjb250cmlidXRvcixcbiAgICAgICAgICBuYW1lOiBjb250cmlidXRvcixcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRyaWJ1dG9yO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gZm9yIG1haW50YWluZXJzXG4gIGlmIChfLmlzRW1wdHkobWFpbnRhaW5lcnMpID09PSBmYWxzZSkge1xuICAgIHBrZ0luZm9Db3B5LmxhdGVzdC5tYWludGFpbmVycyA9IG1haW50YWluZXJzLm1hcCgobWFpbnRhaW5lcik6IHZvaWQgPT4ge1xuICAgICAgbWFpbnRhaW5lci5hdmF0YXIgPSBnZW5lcmF0ZUdyYXZhdGFyVXJsKG1haW50YWluZXIuZW1haWwsIG9ubGluZSk7XG4gICAgICByZXR1cm4gbWFpbnRhaW5lcjtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwa2dJbmZvQ29weTtcbn1cblxuLyoqXG4gKiBwYXJzZSBwYWNrYWdlIHJlYWRtZSAtIG1hcmtkb3duL2FzY2lpXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFja2FnZU5hbWUgbmFtZSBvZiBwYWNrYWdlXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVhZG1lIHBhY2thZ2UgcmVhZG1lXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBzYW5pdGl6eVJlYWRtZSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGNvbnZlcnRlZCBodG1sIHRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlYWRtZShwYWNrYWdlTmFtZTogc3RyaW5nLCByZWFkbWU6IHN0cmluZywgb3B0aW9uczogeyBwYXRobmFtZT86IHN0cmluZyB8IHZvaWQgfSA9IHt9KTogc3RyaW5nIHwgdm9pZCB7XG4gIGlmIChfLmlzRW1wdHkocmVhZG1lKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gc2FuaXRpenlSZWFkbWUocmVhZG1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIGxvZ3MgcmVhZG1lIG5vdCBmb3VuZCBlcnJvclxuICBsb2dnZXIuZXJyb3IoeyBwYWNrYWdlTmFtZSB9LCAnQHtwYWNrYWdlTmFtZX06IE5vIHJlYWRtZSBmb3VuZCcpO1xuXG4gIHJldHVybiBzYW5pdGl6eVJlYWRtZSgnRVJST1I6IE5vIFJFQURNRSBkYXRhIGZvdW5kIScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUb2tlbih0eXBlOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Xy5jYXBpdGFsaXplKHR5cGUpfSAke3Rva2VufWA7XG59XG5cbi8qKlxuICogcmV0dXJuIHBhY2thZ2UgdmVyc2lvbiBmcm9tIHRhcmJhbGwgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uRnJvbVRhcmJhbGwobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdm9pZCB7XG4gIC8vIEZJWE1FOiB3ZSBrbm93IHRoZSByZWdleCBpcyB2YWxpZCwgYnV0IHdlIHNob3VsZCBpbXByb3ZlIHRoaXMgcGFydCBhcyB0cyBzdWdnZXN0XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIC8uKy0oXFxkLispXFwudGd6Ly50ZXN0KG5hbWUpID8gbmFtZS5tYXRjaCgvListKFxcZC4rKVxcLnRnei8pWzFdIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBBdXRob3JGb3JtYXQgPSBBdXRob3IgfCBzdHJpbmcgfCBudWxsIHwgb2JqZWN0IHwgdm9pZDtcblxuLyoqXG4gKiBGb3JtYXRzIGF1dGhvciBmaWVsZCBmb3Igd2VidWkuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vZmlsZXMvcGFja2FnZS5qc29uI2F1dGhvclxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fHVuZGVmaW5lZH0gYXV0aG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBdXRob3IoYXV0aG9yOiBBdXRob3JGb3JtYXQpOiBhbnkge1xuICBsZXQgYXV0aG9yRGV0YWlscyA9IHtcbiAgICBuYW1lOiBERUZBVUxUX1VTRVIsXG4gICAgZW1haWw6ICcnLFxuICAgIHVybDogJycsXG4gIH07XG5cbiAgaWYgKF8uaXNOaWwoYXV0aG9yKSkge1xuICAgIHJldHVybiBhdXRob3JEZXRhaWxzO1xuICB9XG5cbiAgaWYgKF8uaXNTdHJpbmcoYXV0aG9yKSkge1xuICAgIGF1dGhvckRldGFpbHMgPSB7XG4gICAgICAuLi5hdXRob3JEZXRhaWxzLFxuICAgICAgbmFtZTogYXV0aG9yIGFzIHN0cmluZyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKF8uaXNPYmplY3QoYXV0aG9yKSkge1xuICAgIGF1dGhvckRldGFpbHMgPSB7XG4gICAgICAuLi5hdXRob3JEZXRhaWxzLFxuICAgICAgLi4uKGF1dGhvciBhcyBBdXRob3IpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gYXV0aG9yRGV0YWlscztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBVUkkgaXMgc3RhcnRpbmcgd2l0aCBcImh0dHA6Ly9cIiwgXCJodHRwczovL1wiIG9yIFwiLy9cIlxuICogQHBhcmFtIHtzdHJpbmd9IHVyaVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNIVFRQUHJvdG9jb2wodXJpOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eKGh0dHBzPzopP1xcL1xcLy8udGVzdCh1cmkpO1xufVxuXG4vKipcbiAqIEFwcGx5IHdoaXRlc3BhY2VzIGJhc2VkIG9uIHRoZSBsZW5ndGhcbiAqIEBwYXJhbSB7Kn0gc3RyIHRoZSBsb2cgbWVzc2FnZVxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkKHN0ciwgbWF4KTogc3RyaW5nIHtcbiAgaWYgKHN0ci5sZW5ndGggPCBtYXgpIHtcbiAgICByZXR1cm4gc3RyICsgJyAnLnJlcGVhdChtYXggLSBzdHIubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIHJldHVybiBhIG1hc3F1ZXJhZGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGFuZCBsYXN0IHtjaGFyTnVtfSBhbmQgdGhyZWUgZG90cyBpbiBiZXR3ZWVuLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtOdW1iZXJ9IGNoYXJOdW1cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrKHN0cjogc3RyaW5nLCBjaGFyTnVtID0gMyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzdHIuc3Vic3RyKDAsIGNoYXJOdW0pfS4uLiR7c3RyLnN1YnN0cigtY2hhck51bSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVNjb3BlZFVyaShwYWNrYWdlTmFtZSk6IHN0cmluZyB7XG4gIHJldHVybiBwYWNrYWdlTmFtZS5yZXBsYWNlKC9cXC8vZywgJyUyZicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzRGlmZk9uZUtleSh2ZXJzaW9ucyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmtleXModmVyc2lvbnMpLmxlbmd0aCAhPT0gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVyc2lvblZhbGlkKHBhY2thZ2VNZXRhLCBwYWNrYWdlVmVyc2lvbik6IGJvb2xlYW4ge1xuICBjb25zdCBoYXNWZXJzaW9uID0gdHlwZW9mIHBhY2thZ2VWZXJzaW9uICE9PSAndW5kZWZpbmVkJztcbiAgaWYgKCFoYXNWZXJzaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaGFzTWF0Y2hWZXJzaW9uID0gT2JqZWN0LmtleXMocGFja2FnZU1ldGEudmVyc2lvbnMpLmluY2x1ZGVzKHBhY2thZ2VWZXJzaW9uKTtcbiAgcmV0dXJuIGhhc01hdGNoVmVyc2lvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVsYXRlZFRvRGVwcmVjYXRpb24ocGtnSW5mbzogUGFja2FnZSk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHZlcnNpb25zIH0gPSBwa2dJbmZvO1xuICBmb3IgKGNvbnN0IHZlcnNpb24gaW4gdmVyc2lvbnMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZlcnNpb25zW3ZlcnNpb25dLCAnZGVwcmVjYXRlZCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVVUkwocHVibGljVXJsOiBzdHJpbmcgfCB2b2lkKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChwdWJsaWNVcmwgYXMgc3RyaW5nKTtcbiAgICBpZiAoIXZhbGlkUHJvdG9jb2xzLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbC5yZXBsYWNlKCc6JywgJycpKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ2ludmFsaWQgcHJvdG9jb2wnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFRPRE86IGFkZCBlcnJvciBsb2dnZXIgaGVyZVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNIb3N0KHVybDogc3RyaW5nID0gJycsIG9wdGlvbnMgPSB7fSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsaWRhdG9yLmlzVVJMKHVybCwge1xuICAgIHJlcXVpcmVfaG9zdDogdHJ1ZSxcbiAgICBhbGxvd190cmFpbGluZ19kb3Q6IGZhbHNlLFxuICAgIHJlcXVpcmVfdmFsaWRfcHJvdG9jb2w6IGZhbHNlLFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXF1aXJlX3BvcnQ6IGZhbHNlLFxuICAgIHJlcXVpcmVfdGxkOiBmYWxzZSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFB1YmxpY1VybCh1cmxfcHJlZml4OiBzdHJpbmcgPSAnJywgcmVxKTogc3RyaW5nIHtcbiAgaWYgKHZhbGlkYXRlVVJMKHByb2Nlc3MuZW52LlZFUkRBQ0NJT19QVUJMSUNfVVJMIGFzIHN0cmluZykpIHtcbiAgICBjb25zdCBlbnZVUkwgPSBuZXcgVVJMKHdyYXBQcmVmaXgodXJsX3ByZWZpeCksIHByb2Nlc3MuZW52LlZFUkRBQ0NJT19QVUJMSUNfVVJMIGFzIHN0cmluZykuaHJlZjtcbiAgICBkZWJ1ZygncHVibGljIHVybCBieSBlbnYgJW8nLCBlbnZVUkwpO1xuICAgIHJldHVybiBlbnZVUkw7XG4gIH0gZWxzZSBpZiAocmVxLmdldCgnaG9zdCcpKSB7XG4gICAgY29uc3QgaG9zdCA9IHJlcS5nZXQoJ2hvc3QnKTtcbiAgICBpZiAoIWlzSG9zdChob3N0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGhvc3QnKTtcbiAgICB9XG4gICAgY29uc3QgcHJvdG9IZWFkZXIgPSBwcm9jZXNzLmVudi5WRVJEQUNDSU9fRk9SV0FSREVEX1BST1RPID8/IEhFQURFUlMuRk9SV0FSREVEX1BST1RPO1xuICAgIGNvbnN0IHByb3RvY29sID0gZ2V0V2ViUHJvdG9jb2wocmVxLmdldChwcm90b0hlYWRlci50b0xvd2VyQ2FzZSgpKSwgcmVxLnByb3RvY29sKTtcbiAgICBjb25zdCBjb21iaW5lZFVybCA9IGNvbWJpbmVCYXNlVXJsKHByb3RvY29sLCBob3N0LCB1cmxfcHJlZml4KTtcbiAgICBkZWJ1ZygncHVibGljIHVybCBieSByZXF1ZXN0ICVvJywgY29tYmluZWRVcmwpO1xuICAgIHJldHVybiBjb21iaW5lZFVybDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJy8nO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGJhc2UgdXJsIGZvciByZWdpc3RyeS5cbiAqIEByZXR1cm4ge1N0cmluZ30gYmFzZSByZWdpc3RyeSB1cmxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVCYXNlVXJsKHByb3RvY29sOiBzdHJpbmcsIGhvc3Q6IHN0cmluZywgcHJlZml4OiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gIGRlYnVnKCdjb21iaW5lZCBwcm90b2NvbCAlbycsIHByb3RvY29sKTtcbiAgZGVidWcoJ2NvbWJpbmVkIGhvc3QgJW8nLCBob3N0KTtcbiAgY29uc3QgbmV3UHJlZml4ID0gd3JhcFByZWZpeChwcmVmaXgpO1xuICBkZWJ1ZygnY29tYmluZWQgcHJlZml4ICVvJywgbmV3UHJlZml4KTtcbiAgY29uc3QgZ3JvdXBlZFVSSSA9IG5ldyBVUkwod3JhcFByZWZpeChwcmVmaXgpLCBgJHtwcm90b2NvbH06Ly8ke2hvc3R9YCk7XG4gIGNvbnN0IHJlc3VsdCA9IGdyb3VwZWRVUkkuaHJlZjtcbiAgZGVidWcoJ2NvbWJpbmVkIHVybCAlbycsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwUHJlZml4KHByZWZpeDogc3RyaW5nIHwgdm9pZCk6IHN0cmluZyB7XG4gIGlmIChwcmVmaXggPT09ICcnIHx8IHR5cGVvZiBwcmVmaXggPT09ICd1bmRlZmluZWQnIHx8IHByZWZpeCA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfSBlbHNlIGlmICghcHJlZml4LnN0YXJ0c1dpdGgoJy8nKSAmJiBwcmVmaXguZW5kc1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBgLyR7cHJlZml4fWA7XG4gIH0gZWxzZSBpZiAoIXByZWZpeC5zdGFydHNXaXRoKCcvJykgJiYgIXByZWZpeC5lbmRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGAvJHtwcmVmaXh9L2A7XG4gIH0gZWxzZSBpZiAocHJlZml4LnN0YXJ0c1dpdGgoJy8nKSAmJiAhcHJlZml4LmVuZHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gYCR7cHJlZml4fS9gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcmVmaXg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0xvZ2luKGNvbmZpZzogQ29uZmlnKSB7XG4gIC8vIEZJWE1FOiB0eXBlcyBhcmUgbm90IHlldCBvbiB0aGUgbGlicmFyeSB2ZXJkYWNjaW8vbW9ub3JlcG9cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gXy5pc05pbChjb25maWc/LndlYj8ubG9naW4pIHx8IGNvbmZpZz8ud2ViPy5sb2dpbiA9PT0gdHJ1ZTtcbn1cbiJdfQ==
@@ -32,4 +32,4 @@ function generateGravatarUrl(email = '', online = true) {
32
32
 
33
33
  return GENERIC_AVATAR;
34
34
  }
35
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91c2VyLnRzIl0sIm5hbWVzIjpbIkdFTkVSSUNfQVZBVEFSIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZ2VuZXJhdGVHcmF2YXRhclVybCIsImVtYWlsIiwib25saW5lIiwiXyIsImlzU3RyaW5nIiwic2l6ZSIsInRyaW0iLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImVtYWlsTUQ1Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUNBOztBQUNBOzs7O0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDTyxNQUFNQSxjQUFjLEdBQ3pCLDZCQUNBQyxrQkFBa0IsQ0FDaEIscUZBQ0Usa0ZBREYsR0FFRSxrRkFGRixHQUdFLGtGQUhGLEdBSUUsa0ZBSkYsR0FLRSxrRkFMRixHQU1FLGtGQU5GLEdBT0Usa0ZBUEYsR0FRRSxrRkFSRixHQVNFLGtGQVRGLEdBVUUsa0ZBVkYsR0FXRSxrRkFYRixHQVlFLGtGQVpGLEdBYUUsaUZBZGMsQ0FGYjtBQW1CUDtBQUNBO0FBQ0E7Ozs7QUFDTyxTQUFTQyxtQkFBVCxDQUE2QkMsS0FBb0IsR0FBRyxFQUFwRCxFQUF3REMsTUFBZSxHQUFHLElBQTFFLEVBQXdGO0FBQzdGLE1BQUlBLE1BQU0sSUFBSUMsZ0JBQUVDLFFBQUYsQ0FBV0gsS0FBWCxDQUFWLElBQStCRSxnQkFBRUUsSUFBRixDQUFPSixLQUFQLElBQWdCLENBQW5ELEVBQXNEO0FBQ3BEQSxJQUFBQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ0ssSUFBTixHQUFhQyxpQkFBYixFQUFSO0FBQ0EsVUFBTUMsUUFBUSxHQUFHLDhCQUFZUCxLQUFaLENBQWpCO0FBQ0EsV0FBUSxtQ0FBa0NPLFFBQVMsRUFBbkQ7QUFDRDs7QUFDRCxTQUFPVixjQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHN0cmluZ1RvTUQ1IH0gZnJvbSAnLi4vbGliL2NyeXB0by11dGlscyc7XG5cbi8vIHRoaXMgaXMgYSBnZW5lcmljIGF2YXRhclxuLy8gaHR0cHM6Ly93d3cuaWNvbmZpbmRlci5jb20vaWNvbnMvNDAzMDE3L2Fub255bV9hdmF0YXJfZGVmYXVsdF9oZWFkX3BlcnNvbl91bmtub3duX3VzZXJfaWNvblxuLy8gbGljZW5zZTogZnJlZSBjb21tZXJjaWFsIHVzYWdlXG5leHBvcnQgY29uc3QgR0VORVJJQ19BVkFUQVIgPVxuICAnZGF0YTppbWFnZS9zdmcreG1sO3V0ZjgsJyArXG4gIGVuY29kZVVSSUNvbXBvbmVudChcbiAgICAnPHN2ZyBoZWlnaHQ9XCIxMDBcIiB2aWV3Qm94PVwiLTI3IDI0IDEwMCAxMDBcIiB3aWR0aD1cIjEwMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvJyArXG4gICAgICAnMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj48ZGVmcz48Y2lyY2xlIGN4PVwiMjNcIiBjeT1cIjcnICtcbiAgICAgICc0XCIgaWQ9XCJhXCIgcj1cIjUwXCIvPjwvZGVmcz48dXNlIGZpbGw9XCIjRjVFRUU1XCIgb3ZlcmZsb3c9XCJ2aXNpYmxlXCIgeGxpbms6aHJlZj1cIiNhXCIvJyArXG4gICAgICAnPjxjbGlwUGF0aCBpZD1cImJcIj48dXNlIG92ZXJmbG93PVwidmlzaWJsZVwiIHhsaW5rOmhyZWY9XCIjYVwiLz48L2NsaXBQYXRoPjxnIGNsaXAtcGEnICtcbiAgICAgICd0aD1cInVybCgjYilcIj48ZGVmcz48cGF0aCBkPVwiTTM2IDk1LjljMCA0IDQuNyA1LjIgNy4xIDUuOCA3LjYgMiAyMi44IDUuOSAyMi44IDUuOScgK1xuICAgICAgJyAzLjIgMS4xIDUuNyAzLjUgNy4xIDYuNnY5LjhILTI3di05LjhjMS4zLTMuMSAzLjktNS41IDcuMS02LjYgMCAwIDE1LjItMy45IDIyLjgtJyArXG4gICAgICAnNS45IDIuNC0uNiA3LjEtMS44IDcuMS01LjhWODVoMjZ2MTAuOXpcIiBpZD1cImNcIi8+PC9kZWZzPjx1c2UgZmlsbD1cIiNFNkMxOUNcIiBvdmVyZicgK1xuICAgICAgJ2xvdz1cInZpc2libGVcIiB4bGluazpocmVmPVwiI2NcIi8+PGNsaXBQYXRoIGlkPVwiZFwiPjx1c2Ugb3ZlcmZsb3c9XCJ2aXNpYmxlXCIgeGxpbms6aHInICtcbiAgICAgICdlZj1cIiNjXCIvPjwvY2xpcFBhdGg+PHBhdGggY2xpcC1wYXRoPVwidXJsKCNkKVwiIGQ9XCJNMjMuMiAzNWguMmMzLjMgMCA4LjIuMiAxMS40IDIgJyArXG4gICAgICAnMy4zIDEuOSA3LjMgNS42IDguNSAxMi4xIDIuNCAxMy43LTIuMSAzNS40LTYuMyA0Mi40LTQgNi43LTkuOCA5LjItMTMuNSA5LjRIMjNoLS4nICtcbiAgICAgICcxYy0zLjctLjItOS41LTIuNy0xMy41LTkuNC00LjItNy04LjctMjguNy02LjMtNDIuNCAxLjItNi41IDUuMi0xMC4yIDguNS0xMi4xIDMuMicgK1xuICAgICAgJy0xLjggOC4xLTIgMTEuNC0yaC4yelwiIGZpbGw9XCIjRDRCMDhDXCIvPjwvZz48cGF0aCBkPVwiTTIyLjYgNDBjMTkuMSAwIDIwLjcgMTMuOCAyMCcgK1xuICAgICAgJy44IDE1LjEgMS4xIDExLjktMyAyOC4xLTYuOCAzMy43LTQgNS45LTkuOCA4LjEtMTMuNSA4LjNoLS41Yy0zLjgtLjMtOS42LTIuNS0xMy42JyArXG4gICAgICAnLTguNC0zLjgtNS42LTcuOS0yMS44LTYuOC0zMy44QzIuMyA1My43IDMuNSA0MCAyMi42IDQwelwiIGZpbGw9XCIjRjJDRUE1XCIvPjwvc3ZnPidcbiAgKTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBncmF2YXRhciB1cmwgZnJvbSBlbWFpbCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUdyYXZhdGFyVXJsKGVtYWlsOiBzdHJpbmcgfCB2b2lkID0gJycsIG9ubGluZTogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICBpZiAob25saW5lICYmIF8uaXNTdHJpbmcoZW1haWwpICYmIF8uc2l6ZShlbWFpbCkgPiAwKSB7XG4gICAgZW1haWwgPSBlbWFpbC50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICBjb25zdCBlbWFpbE1ENSA9IHN0cmluZ1RvTUQ1KGVtYWlsKTtcbiAgICByZXR1cm4gYGh0dHBzOi8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvJHtlbWFpbE1ENX1gO1xuICB9XG4gIHJldHVybiBHRU5FUklDX0FWQVRBUjtcbn1cbiJdfQ==
35
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91c2VyLnRzIl0sIm5hbWVzIjpbIkdFTkVSSUNfQVZBVEFSIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZ2VuZXJhdGVHcmF2YXRhclVybCIsImVtYWlsIiwib25saW5lIiwiXyIsImlzU3RyaW5nIiwic2l6ZSIsInRyaW0iLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsImVtYWlsTUQ1Il0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUNBOztBQUVBOzs7O0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDTyxNQUFNQSxjQUFjLEdBQ3pCLDZCQUNBQyxrQkFBa0IsQ0FDaEIscUZBQ0Usa0ZBREYsR0FFRSxrRkFGRixHQUdFLGtGQUhGLEdBSUUsa0ZBSkYsR0FLRSxrRkFMRixHQU1FLGtGQU5GLEdBT0Usa0ZBUEYsR0FRRSxrRkFSRixHQVNFLGtGQVRGLEdBVUUsa0ZBVkYsR0FXRSxrRkFYRixHQVlFLGtGQVpGLEdBYUUsaUZBZGMsQ0FGYjtBQW1CUDtBQUNBO0FBQ0E7Ozs7QUFDTyxTQUFTQyxtQkFBVCxDQUE2QkMsS0FBb0IsR0FBRyxFQUFwRCxFQUF3REMsTUFBZSxHQUFHLElBQTFFLEVBQXdGO0FBQzdGLE1BQUlBLE1BQU0sSUFBSUMsZ0JBQUVDLFFBQUYsQ0FBV0gsS0FBWCxDQUFWLElBQStCRSxnQkFBRUUsSUFBRixDQUFPSixLQUFQLElBQWdCLENBQW5ELEVBQXNEO0FBQ3BEQSxJQUFBQSxLQUFLLEdBQUdBLEtBQUssQ0FBQ0ssSUFBTixHQUFhQyxpQkFBYixFQUFSO0FBQ0EsVUFBTUMsUUFBUSxHQUFHLDhCQUFZUCxLQUFaLENBQWpCO0FBQ0EsV0FBUSxtQ0FBa0NPLFFBQVMsRUFBbkQ7QUFDRDs7QUFDRCxTQUFPVixjQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgc3RyaW5nVG9NRDUgfSBmcm9tICcuLi9saWIvY3J5cHRvLXV0aWxzJztcblxuLy8gdGhpcyBpcyBhIGdlbmVyaWMgYXZhdGFyXG4vLyBodHRwczovL3d3dy5pY29uZmluZGVyLmNvbS9pY29ucy80MDMwMTcvYW5vbnltX2F2YXRhcl9kZWZhdWx0X2hlYWRfcGVyc29uX3Vua25vd25fdXNlcl9pY29uXG4vLyBsaWNlbnNlOiBmcmVlIGNvbW1lcmNpYWwgdXNhZ2VcbmV4cG9ydCBjb25zdCBHRU5FUklDX0FWQVRBUiA9XG4gICdkYXRhOmltYWdlL3N2Zyt4bWw7dXRmOCwnICtcbiAgZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICc8c3ZnIGhlaWdodD1cIjEwMFwiIHZpZXdCb3g9XCItMjcgMjQgMTAwIDEwMFwiIHdpZHRoPVwiMTAwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8nICtcbiAgICAgICcyMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiPjxkZWZzPjxjaXJjbGUgY3g9XCIyM1wiIGN5PVwiNycgK1xuICAgICAgJzRcIiBpZD1cImFcIiByPVwiNTBcIi8+PC9kZWZzPjx1c2UgZmlsbD1cIiNGNUVFRTVcIiBvdmVyZmxvdz1cInZpc2libGVcIiB4bGluazpocmVmPVwiI2FcIi8nICtcbiAgICAgICc+PGNsaXBQYXRoIGlkPVwiYlwiPjx1c2Ugb3ZlcmZsb3c9XCJ2aXNpYmxlXCIgeGxpbms6aHJlZj1cIiNhXCIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYScgK1xuICAgICAgJ3RoPVwidXJsKCNiKVwiPjxkZWZzPjxwYXRoIGQ9XCJNMzYgOTUuOWMwIDQgNC43IDUuMiA3LjEgNS44IDcuNiAyIDIyLjggNS45IDIyLjggNS45JyArXG4gICAgICAnIDMuMiAxLjEgNS43IDMuNSA3LjEgNi42djkuOEgtMjd2LTkuOGMxLjMtMy4xIDMuOS01LjUgNy4xLTYuNiAwIDAgMTUuMi0zLjkgMjIuOC0nICtcbiAgICAgICc1LjkgMi40LS42IDcuMS0xLjggNy4xLTUuOFY4NWgyNnYxMC45elwiIGlkPVwiY1wiLz48L2RlZnM+PHVzZSBmaWxsPVwiI0U2QzE5Q1wiIG92ZXJmJyArXG4gICAgICAnbG93PVwidmlzaWJsZVwiIHhsaW5rOmhyZWY9XCIjY1wiLz48Y2xpcFBhdGggaWQ9XCJkXCI+PHVzZSBvdmVyZmxvdz1cInZpc2libGVcIiB4bGluazpocicgK1xuICAgICAgJ2VmPVwiI2NcIi8+PC9jbGlwUGF0aD48cGF0aCBjbGlwLXBhdGg9XCJ1cmwoI2QpXCIgZD1cIk0yMy4yIDM1aC4yYzMuMyAwIDguMi4yIDExLjQgMiAnICtcbiAgICAgICczLjMgMS45IDcuMyA1LjYgOC41IDEyLjEgMi40IDEzLjctMi4xIDM1LjQtNi4zIDQyLjQtNCA2LjctOS44IDkuMi0xMy41IDkuNEgyM2gtLicgK1xuICAgICAgJzFjLTMuNy0uMi05LjUtMi43LTEzLjUtOS40LTQuMi03LTguNy0yOC43LTYuMy00Mi40IDEuMi02LjUgNS4yLTEwLjIgOC41LTEyLjEgMy4yJyArXG4gICAgICAnLTEuOCA4LjEtMiAxMS40LTJoLjJ6XCIgZmlsbD1cIiNENEIwOENcIi8+PC9nPjxwYXRoIGQ9XCJNMjIuNiA0MGMxOS4xIDAgMjAuNyAxMy44IDIwJyArXG4gICAgICAnLjggMTUuMSAxLjEgMTEuOS0zIDI4LjEtNi44IDMzLjctNCA1LjktOS44IDguMS0xMy41IDguM2gtLjVjLTMuOC0uMy05LjYtMi41LTEzLjYnICtcbiAgICAgICctOC40LTMuOC01LjYtNy45LTIxLjgtNi44LTMzLjhDMi4zIDUzLjcgMy41IDQwIDIyLjYgNDB6XCIgZmlsbD1cIiNGMkNFQTVcIi8+PC9zdmc+J1xuICApO1xuXG4vKipcbiAqIEdlbmVyYXRlIGdyYXZhdGFyIHVybCBmcm9tIGVtYWlsIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlR3JhdmF0YXJVcmwoZW1haWw6IHN0cmluZyB8IHZvaWQgPSAnJywgb25saW5lOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gIGlmIChvbmxpbmUgJiYgXy5pc1N0cmluZyhlbWFpbCkgJiYgXy5zaXplKGVtYWlsKSA+IDApIHtcbiAgICBlbWFpbCA9IGVtYWlsLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGVtYWlsTUQ1ID0gc3RyaW5nVG9NRDUoZW1haWwpO1xuICAgIHJldHVybiBgaHR0cHM6Ly93d3cuZ3JhdmF0YXIuY29tL2F2YXRhci8ke2VtYWlsTUQ1fWA7XG4gIH1cbiAgcmV0dXJuIEdFTkVSSUNfQVZBVEFSO1xufVxuIl19
package/conf/README.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  This directory host the default configuration file, but you can find more here:
4
4
 
5
- * [https://verdaccio.org/docs/en/installation](https://verdaccio.org/docs/en/installation)
6
- * [Chat with us](http://chat.verdaccio.org) <- You need a Discord account
7
- * [Follow us on Twitter](https://twitter.com/verdaccio_npm)
5
+ - [https://verdaccio.org/docs/en/installation](https://verdaccio.org/docs/en/installation)
6
+ - [Chat with us](http://chat.verdaccio.org) <- You need a Discord account
7
+ - [Follow us on Twitter](https://twitter.com/verdaccio_npm)
8
8
 
9
9
  Enjoy Verdaccio !
package/conf/default.yaml CHANGED
@@ -21,6 +21,9 @@ web:
21
21
  # darkMode: true
22
22
  # logo: http://somedomain/somelogo.png
23
23
  # favicon: http://somedomain/favicon.ico | /path/favicon.ico
24
+ # rateLimit:
25
+ # windowMs: 1000
26
+ # max: 10000
24
27
 
25
28
  # translate your registry, api i18n not available yet
26
29
  # i18n:
@@ -75,7 +78,6 @@ middlewares:
75
78
 
76
79
  # log settings
77
80
  logs: { type: stdout, format: pretty, level: http }
78
-
79
81
  #experiments:
80
82
  # # support for npm token command
81
83
  # token: false
package/conf/docker.yaml CHANGED
@@ -26,6 +26,9 @@ web:
26
26
  # darkMode: true
27
27
  # logo: http://somedomain/somelogo.png
28
28
  # favicon: http://somedomain/favicon.ico | /path/favicon.ico
29
+ # rateLimit:
30
+ # windowMs: 1000
31
+ # max: 10000
29
32
 
30
33
  # translate your registry, api i18n not available yet
31
34
  # i18n:
@@ -80,7 +83,6 @@ middlewares:
80
83
 
81
84
  # log settings
82
85
  logs: { type: stdout, format: pretty, level: http }
83
-
84
86
  #experiments:
85
87
  # # support for npm token command
86
88
  # token: false
package/eslintrc.js CHANGED
@@ -1,100 +1,100 @@
1
1
  module.exports = {
2
- "extends": [
3
- "eslint:recommended",
4
- "google",
5
- "plugin:jest/recommended",
6
- "plugin:@typescript-eslint/eslint-recommended",
7
- "plugin:@typescript-eslint/recommended",
8
- "plugin:import/typescript",
9
- "prettier"
2
+ extends: [
3
+ 'eslint:recommended',
4
+ 'google',
5
+ 'plugin:jest/recommended',
6
+ 'plugin:@typescript-eslint/eslint-recommended',
7
+ 'plugin:@typescript-eslint/recommended',
8
+ 'plugin:import/typescript',
9
+ 'prettier',
10
10
  ],
11
- "plugins": ["import", "jest"],
12
- "env": {
13
- "es6": true,
14
- "node": true,
15
- "jest": true
11
+ plugins: ['import', 'jest'],
12
+ env: {
13
+ es6: true,
14
+ node: true,
15
+ jest: true,
16
16
  },
17
- "globals": {
18
- "__APP_VERSION__": true
17
+ globals: {
18
+ __APP_VERSION__: true,
19
19
  },
20
- "parserOptions": {
21
- "allowImportExportEverywhere": true,
22
- "sourceType": "module",
23
- "ecmaVersion": 11,
24
- "ecmaFeatures": {
25
- "impliedStrict": true,
26
- "jsx": true
27
- }
20
+ parserOptions: {
21
+ allowImportExportEverywhere: true,
22
+ sourceType: 'module',
23
+ ecmaVersion: 11,
24
+ ecmaFeatures: {
25
+ impliedStrict: true,
26
+ jsx: true,
27
+ },
28
28
  },
29
- "settings": {
30
- "import/resolver": {
31
- "node": {
32
- "extensions": [".js", ".ts", ".tsx"]
33
- }
34
- }
29
+ settings: {
30
+ 'import/resolver': {
31
+ node: {
32
+ extensions: ['.js', '.ts', '.tsx'],
33
+ },
34
+ },
35
35
  },
36
- "parser": "@typescript-eslint/parser",
37
- "rules": {
38
- "curly": ["error", "all"],
39
- "react/prop-types": 0,
40
- "jest/no-export": 0,
41
- "jest/no-test-callback": 0,
42
- "jest/expect-expect": 0,
43
- "jest/no-try-expect": 0,
44
- "jest/no-done-callback": "off",
45
- "jest/no-conditional-expect": "off",
46
- "keyword-spacing": "off",
47
- "no-tabs": "off",
48
- "no-useless-escape": "off",
49
- "padded-blocks": "off",
50
- "require-jsdoc": "off",
51
- "valid-jsdoc": "off",
52
- "import/order": ["error"],
53
- "eol-last": "error",
54
- "no-irregular-whitespace": "error",
55
- "no-mixed-spaces-and-tabs": ["error", "smart-tabs"],
56
- "no-trailing-spaces": "error",
57
- "camelcase": "off",
58
- "guard-for-in": "error",
59
- "new-cap": "error",
60
- "max-len": ["error", 180],
61
- "no-console": ["error", { "allow": ["warn"] }],
62
- "no-constant-condition": "error",
63
- "no-debugger": "error",
64
- "no-empty": "error",
65
- "no-fallthrough": "error",
66
- "no-invalid-this": "error",
67
- "no-new-require": "error",
68
- "no-undef": "error",
69
- "no-unreachable": "error",
70
- "no-var": "error",
71
- "one-var": "error",
72
- "prefer-rest-params": "error",
73
- "prefer-spread": "error",
74
- "handle-callback-err": 0,
75
- "prefer-const": 0,
76
- "@typescript-eslint/camelcase": 0,
77
- "@typescript-eslint/ban-ts-ignore": 0,
78
- "@typescript-eslint/no-var-requires": 0,
79
- "@typescript-eslint/no-inferrable-types": 0,
80
- "@typescript-eslint/no-empty-function": 0,
81
- "@typescript-eslint/no-this-alias": 0,
82
- "@typescript-eslint/no-use-before-define": 0,
83
- "@typescript-eslint/array-type": ["error"],
84
- "@typescript-eslint/no-explicit-any": 0,
85
- "@typescript-eslint/indent": 0,
86
- "@typescript-eslint/ban-ts-comment": 0,
87
- "@typescript-eslint/ban-types": 0,
88
- "@typescript-eslint/explicit-module-boundary-types": 0,
36
+ parser: '@typescript-eslint/parser',
37
+ rules: {
38
+ curly: ['error', 'all'],
39
+ 'react/prop-types': 0,
40
+ 'jest/no-export': 0,
41
+ 'jest/no-test-callback': 0,
42
+ 'jest/expect-expect': 0,
43
+ 'jest/no-try-expect': 0,
44
+ 'jest/no-done-callback': 'off',
45
+ 'jest/no-conditional-expect': 'off',
46
+ 'keyword-spacing': 'off',
47
+ 'no-tabs': 'off',
48
+ 'no-useless-escape': 'off',
49
+ 'padded-blocks': 'off',
50
+ 'require-jsdoc': 'off',
51
+ 'valid-jsdoc': 'off',
52
+ 'import/order': ['warn'],
53
+ 'eol-last': 'error',
54
+ 'no-irregular-whitespace': 'error',
55
+ 'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'],
56
+ 'no-trailing-spaces': 'error',
57
+ camelcase: 'off',
58
+ 'guard-for-in': 'error',
59
+ 'new-cap': 'error',
60
+ 'max-len': ['error', 180],
61
+ 'no-console': ['error', { allow: ['warn'] }],
62
+ 'no-constant-condition': 'error',
63
+ 'no-debugger': 'error',
64
+ 'no-empty': 'error',
65
+ 'no-fallthrough': 'error',
66
+ 'no-invalid-this': 'error',
67
+ 'no-new-require': 'error',
68
+ 'no-undef': 'error',
69
+ 'no-unreachable': 'error',
70
+ 'no-var': 'error',
71
+ 'one-var': 'error',
72
+ 'prefer-rest-params': 'error',
73
+ 'prefer-spread': 'error',
74
+ 'handle-callback-err': 0,
75
+ 'prefer-const': 0,
76
+ '@typescript-eslint/camelcase': 0,
77
+ '@typescript-eslint/ban-ts-ignore': 0,
78
+ '@typescript-eslint/no-var-requires': 0,
79
+ '@typescript-eslint/no-inferrable-types': 0,
80
+ '@typescript-eslint/no-empty-function': 0,
81
+ '@typescript-eslint/no-this-alias': 0,
82
+ '@typescript-eslint/no-use-before-define': 0,
83
+ '@typescript-eslint/array-type': ['error'],
84
+ '@typescript-eslint/no-explicit-any': 0,
85
+ '@typescript-eslint/indent': 0,
86
+ '@typescript-eslint/ban-ts-comment': 0,
87
+ '@typescript-eslint/ban-types': 0,
88
+ '@typescript-eslint/explicit-module-boundary-types': 0,
89
89
 
90
90
  // rules to fix
91
- "no-unused-vars": ["warn", { "vars": "all", "args": "none" }],
92
- "jest/no-identical-title": ["warn"],
93
- "prefer-promise-reject-errors": ["warn"],
94
- "jest/no-disabled-tests": ["warn"],
95
- "jest/no-commented-out-tests": ["warn"],
96
- "@typescript-eslint/prefer-optional-chain": ["warn"],
97
- "@typescript-eslint/explicit-member-accessibility": ["warn"],
98
- "@typescript-eslint/no-unused-vars": ["warn"]
99
- }
100
- }
91
+ 'no-unused-vars': ['warn', { vars: 'all', args: 'none' }],
92
+ 'jest/no-identical-title': ['warn'],
93
+ 'prefer-promise-reject-errors': ['warn'],
94
+ 'jest/no-disabled-tests': ['warn'],
95
+ 'jest/no-commented-out-tests': ['warn'],
96
+ '@typescript-eslint/prefer-optional-chain': ['warn'],
97
+ '@typescript-eslint/explicit-member-accessibility': ['warn'],
98
+ '@typescript-eslint/no-unused-vars': ['warn'],
99
+ },
100
+ };