@kontur.candy/tools 2.109.0 → 2.113.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +5 -1
  3. package/distr/Common/CandyApiClient/CandyApiClient.js +10 -30
  4. package/distr/Common/CandyApiClient/CandyApiClientContext.js +26 -0
  5. package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithCache.js +60 -0
  6. package/distr/Common/CandyApiClient/DigestApiClient/Decorators/DigestApiClientWithDebouncedBatching.js +51 -0
  7. package/distr/Common/CandyApiClient/DigestApiClient/DigestApiClient.js +50 -0
  8. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/Data/TaxRebate1152026.js +90 -0
  9. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakeDigestApiClient.js +56 -0
  10. package/distr/Common/CandyApiClient/DigestApiClient/Fakes/FakePicklists.js +12 -0
  11. package/distr/Common/CandyApiClient/{Types/CandyApiAuthentication.js → DigestApiClient/IDigestApiClient.js} +0 -0
  12. package/distr/Common/CandyApiClient/DigestApiClient/React/DigestApiClientContext.js +26 -0
  13. package/distr/Common/CandyApiClient/DigestApiClient/TestDigestApiClient.js +25 -0
  14. package/distr/Common/CandyApiClient/DigestApiClient/Types/DigestQueryFilter.js +24 -0
  15. package/distr/Common/CandyApiClient/{Types/Picklist → DigestApiClient/Types}/DigestRequest.js +0 -0
  16. package/distr/Common/CandyApiClient/{Types/Picklist/PicklistServerResponses.js → DigestApiClient/Types/DigestResponse.js} +0 -0
  17. package/distr/Common/CandyApiClient/FakeCandyApiClient.js +8 -50
  18. package/distr/Common/EndPoints.js +20 -0
  19. package/distr/Common/FormActionHandlers/ContextualActionNames.js +16 -0
  20. package/distr/Common/FormActionHandlers/ControlNamedContextualAction.js +6 -0
  21. package/distr/Common/HttpClient/AuthenticationMode.js +35 -0
  22. package/distr/Common/HttpClient/FetchImplementation/NodeFetch.js +27 -3
  23. package/distr/Common/HttpClient/HttpClient.js +66 -9
  24. package/distr/Common/HttpClient/HttpClientAuthenticationProvider.js +6 -0
  25. package/distr/Common/IntRangeUtils.js +3 -12
  26. package/distr/Common/IterableUtils.js +17 -11
  27. package/distr/Common/ModelPath/ModelPath.js +16 -1
  28. package/distr/Common/NidusClient/ContextualNidusClient/ContextualNidusClient.js +41 -0
  29. package/distr/Common/NidusClient/ContextualNidusClient/IContextualNidusClient.js +6 -0
  30. package/distr/Common/NidusClient/Fakes/CreateUniqueNidusEntryId.js +13 -0
  31. package/distr/Common/NidusClient/Fakes/FakeNidusClient.js +82 -0
  32. package/distr/Common/NidusClient/Fakes/LocalStorageBasedNidusClient.js +137 -0
  33. package/distr/Common/NidusClient/INidusClient.js +16 -0
  34. package/distr/Common/NidusClient/NidusClientContext.js +47 -0
  35. package/distr/Common/NidusClient/NidusClientImpl.js +72 -0
  36. package/distr/Common/TypingUtils.js +24 -2
  37. package/distr/Tools/src/BuildTasks/EngineVersionUtils.js +4 -4
  38. package/distr/Tools/src/BuildTasks/ResolveFormInfo.js +15 -4
  39. package/distr/Tools/src/CLICommands/BuildServer/BuildServerServerOptions.js +12 -6
  40. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBackendResourcesUpdatesController.js +2 -20
  41. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerBuildFormsController.js +19 -49
  42. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/BuildServerFormInfoController.js +29 -45
  43. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/DevServers/BuildFormDevServer.js +11 -12
  44. package/distr/Tools/src/CLICommands/BuildServer/RunBuildServer.js +7 -7
  45. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js +20 -2
  46. package/distr/Tools/src/LocalServerFrontEndDist/enhancedClient.js.map +1 -1
  47. package/distr/Tools/src/LocalServerFrontEndDist/index.js +3093 -387
  48. package/distr/Tools/src/LocalServerFrontEndDist/index.js.map +1 -1
  49. package/package.json +1 -1
  50. package/distr/Common/CandyApiClient/Types/Picklist/PicklistQueryFilter.js +0 -24
  51. package/distr/Tools/src/CLICommands/BuildServer/ResourcesControllers/Directories/ResourcesDirectory.js +0 -66
@@ -5,11 +5,35 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.nodeFetch = void 0;
7
7
 
8
+ var _https = require("https");
9
+
8
10
  var _nodeFetch = _interopRequireDefault(require("node-fetch"));
9
11
 
12
+ var _Errors = require("../../Errors");
13
+
10
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
15
 
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- const nodeFetch = _nodeFetch.default;
16
+ const agent = new _https.Agent({
17
+ rejectUnauthorized: false
18
+ });
19
+ /* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-return */
20
+
21
+ const nodeFetch = (input, init) => {
22
+ if (typeof input === "string") {
23
+ if (input.startsWith("https")) {
24
+ return (0, _nodeFetch.default)(input, { ...init,
25
+ agent: agent
26
+ });
27
+ } else {
28
+ return (0, _nodeFetch.default)(input, { ...init
29
+ });
30
+ }
31
+ } else {
32
+ throw new _Errors.NotSupportedError();
33
+ }
34
+ };
35
+ /* eslint-enable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-return */
36
+
37
+
14
38
  exports.nodeFetch = nodeFetch;
15
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL0NvbW1vbi9IdHRwQ2xpZW50L0ZldGNoSW1wbGVtZW50YXRpb24vTm9kZUZldGNoLnRzIl0sIm5hbWVzIjpbIm5vZGVGZXRjaCIsImZldGNoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7QUFJQTtBQUNPLE1BQU1BLFNBQWdCLEdBQUdDLGtCQUF6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuXG5pbXBvcnQgeyBGZXRjaCB9IGZyb20gXCIuL0ZldGNoXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3Qgbm9kZUZldGNoOiBGZXRjaCA9IGZldGNoIGFzIGFueTtcbiJdfQ==
39
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL0NvbW1vbi9IdHRwQ2xpZW50L0ZldGNoSW1wbGVtZW50YXRpb24vTm9kZUZldGNoLnRzIl0sIm5hbWVzIjpbImFnZW50IiwiQWdlbnQiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJub2RlRmV0Y2giLCJpbnB1dCIsImluaXQiLCJzdGFydHNXaXRoIiwiTm90U3VwcG9ydGVkRXJyb3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQTs7QUFFQTs7OztBQUlBLE1BQU1BLEtBQUssR0FBRyxJQUFJQyxZQUFKLENBQVU7QUFBRUMsRUFBQUEsa0JBQWtCLEVBQUU7QUFBdEIsQ0FBVixDQUFkO0FBRUE7O0FBQ08sTUFBTUMsU0FBZ0IsR0FBRyxDQUFDQyxLQUFELEVBQXFCQyxJQUFyQixLQUErRDtBQUMzRixNQUFJLE9BQU9ELEtBQVAsS0FBaUIsUUFBckIsRUFBK0I7QUFDM0IsUUFBSUEsS0FBSyxDQUFDRSxVQUFOLENBQWlCLE9BQWpCLENBQUosRUFBK0I7QUFDM0IsYUFBTyx3QkFBTUYsS0FBTixFQUFhLEVBQUUsR0FBR0MsSUFBTDtBQUFXTCxRQUFBQSxLQUFLLEVBQUVBO0FBQWxCLE9BQWIsQ0FBUDtBQUNILEtBRkQsTUFFTztBQUNILGFBQU8sd0JBQU1JLEtBQU4sRUFBYSxFQUFFLEdBQUdDO0FBQUwsT0FBYixDQUFQO0FBQ0g7QUFDSixHQU5ELE1BTU87QUFDSCxVQUFNLElBQUlFLHlCQUFKLEVBQU47QUFDSDtBQUNKLENBVk07QUFXUCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFnZW50IH0gZnJvbSBcImh0dHBzXCI7XG5cbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuXG5pbXBvcnQgeyBOb3RTdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuLi8uLi9FcnJvcnNcIjtcblxuaW1wb3J0IHsgRmV0Y2ggfSBmcm9tIFwiLi9GZXRjaFwiO1xuXG5jb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7IHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UgfSk7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm4gKi9cbmV4cG9ydCBjb25zdCBub2RlRmV0Y2g6IEZldGNoID0gKGlucHV0OiBSZXF1ZXN0SW5mbywgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoXCJodHRwc1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoKGlucHV0LCB7IC4uLmluaXQsIGFnZW50OiBhZ2VudCB9IGFzIGFueSkgYXMgYW55O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoKGlucHV0LCB7IC4uLmluaXQgfSBhcyBhbnkpIGFzIGFueTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgIH1cbn07XG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm4gKi9cbiJdfQ==
@@ -7,7 +7,13 @@ exports.HttpClient = exports.HttpClientRequestWrapper = exports.HttpClientRespon
7
7
 
8
8
  var _Errors = require("../Errors");
9
9
 
10
- var _TypingUtils = require("../TypingUtils");
10
+ function trimTrailingSlash(url) {
11
+ return url.slice(-1) === "/" ? url.slice(0, -1) : url;
12
+ }
13
+
14
+ function trimLeadingSlash(url) {
15
+ return url[0] === "/" ? url.slice(1) : url;
16
+ }
11
17
 
12
18
  class HttpClientResponse {
13
19
  constructor(fetchResponse) {
@@ -136,7 +142,7 @@ class HttpClient {
136
142
  this.authenticationProvider = void 0;
137
143
  this.defaultParams = {};
138
144
  this.fetchImpl = fetchImpl;
139
- this.baseUrl = (0, _TypingUtils.trimLastSlash)(baseUrl);
145
+ this.baseUrl = baseUrl == undefined ? baseUrl : trimTrailingSlash(baseUrl);
140
146
  this.defaultParams = defaultQueryParams;
141
147
  this.authenticationProvider = authenticationProvider;
142
148
  }
@@ -163,10 +169,7 @@ class HttpClient {
163
169
  let request = this.appendDefaultRequestHeaders({
164
170
  method: method
165
171
  }, config.contentType);
166
-
167
- if (this.authenticationProvider != undefined) {
168
- request = this.authenticationProvider(request);
169
- }
172
+ request = this.authenticationProvider(request);
170
173
 
171
174
  if (config.signal) {
172
175
  request.signal = config.signal;
@@ -198,9 +201,22 @@ class HttpClient {
198
201
  }
199
202
 
200
203
  url(path, params) {
201
- return this.baseUrl + "/" + path + this.createQueryString({ ...this.defaultParams,
204
+ let result = path;
205
+
206
+ if (this.baseUrl != undefined) {
207
+ result = this.baseUrl + "/" + trimLeadingSlash(result);
208
+ }
209
+
210
+ const resultParams = { ...this.defaultParams,
202
211
  ...params
203
- });
212
+ };
213
+
214
+ if (path.includes("?") && params != undefined && Object.keys(resultParams).length > 0) {
215
+ throw new _Errors.NotSupportedError(`Passing search params in url and via params object is not supported`);
216
+ }
217
+
218
+ result = result + this.createQueryString(resultParams);
219
+ return result;
204
220
  }
205
221
 
206
222
  async checkStatus(response, acceptCodes) {
@@ -275,6 +291,47 @@ class HttpClient {
275
291
  return result;
276
292
  }
277
293
 
294
+ createFetchImpl() {
295
+ const fetchWithOptions = (input, init) => {
296
+ if (typeof input === "string") {
297
+ var _init, _init$headers;
298
+
299
+ const fetchUrl = this.url(input, undefined);
300
+ init = (_init = init) !== null && _init !== void 0 ? _init : {};
301
+ init.headers = (_init$headers = init.headers) !== null && _init$headers !== void 0 ? _init$headers : {};
302
+ init.headers["Cache-Control"] = "no-cache, no-store";
303
+ init.headers["Pragma"] = "no-cache";
304
+ init.headers["Expires"] = "0";
305
+ init = this.authenticationProvider(init);
306
+ return this.fetchImpl(fetchUrl, init);
307
+ } else {
308
+ const fetchUrl = this.url(input.url, undefined);
309
+ let requestInit = {
310
+ headers: {
311
+ ["Cache-Control"]: "no-cache, no-store",
312
+ ["Pragma"]: "no-cache",
313
+ ["Expires"]: "0",
314
+ ...input.headers
315
+ },
316
+ signal: input.signal,
317
+ cache: input.cache,
318
+ credentials: input.credentials,
319
+ integrity: input.integrity,
320
+ keepalive: input.keepalive,
321
+ method: input.method,
322
+ mode: input.mode,
323
+ redirect: input.redirect,
324
+ referrer: input.referrer,
325
+ referrerPolicy: input.referrerPolicy
326
+ };
327
+ requestInit = this.authenticationProvider(requestInit);
328
+ return this.fetchImpl(fetchUrl, requestInit);
329
+ }
330
+ };
331
+
332
+ return fetchWithOptions;
333
+ }
334
+
278
335
  }
279
336
 
280
337
  exports.HttpClient = HttpClient;
@@ -288,4 +345,4 @@ class HttpError extends Error {
288
345
  }
289
346
 
290
347
  }
291
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9IdHRwQ2xpZW50L0h0dHBDbGllbnQudHMiXSwibmFtZXMiOlsiSHR0cENsaWVudFJlc3BvbnNlIiwiY29uc3RydWN0b3IiLCJmZXRjaFJlc3BvbnNlIiwic3RhdHVzIiwianNvbiIsInJlc3BvbnNlRGF0YSIsIkh0dHBDbGllbnRSZXF1ZXN0V3JhcHBlciIsImV4ZWN1dGUiLCJleGVjdXRlUmVxdWVzdCIsImFjY2VwdENvZGVzIiwicXVlcnlQYXJhbXMiLCJzaWduYWwiLCJib2R5RmFjdG9yeSIsImNvbnRlbnRUeXBlIiwidGhlbiIsImFyZ3MiLCJyZXN1bHRQcm9taXNlIiwicmVzdWx0IiwiY3JlYXRlQ29uZmlnIiwid2l0aEFib3J0U2lnbmFsIiwid2l0aENvbnRlbnRUeXBlIiwid2l0aEJvZHlGcm9tQnVmZmVyIiwiYm9keSIsInVuZGVmaW5lZCIsIndpdGhKc29uQm9keSIsInNlcmlhbGl6YWJsZUJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwid2l0aFF1ZXJ5UGFyYW1zIiwid2l0aFJhd0JvZHkiLCJhY2NlcHRDb2RlIiwiY29kZSIsInB1c2giLCJjcmVhdGUiLCJmbiIsIkh0dHBDbGllbnQiLCJmZXRjaEltcGwiLCJiYXNlVXJsIiwiYXV0aGVudGljYXRpb25Qcm92aWRlciIsImRlZmF1bHRRdWVyeVBhcmFtcyIsImRlZmF1bHRQYXJhbXMiLCJnZXQiLCJ1cmwiLCJtZXRob2QiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb25maWciLCJmZXRjaFVybCIsInJlcXVlc3QiLCJhcHBlbmREZWZhdWx0UmVxdWVzdEhlYWRlcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsInJlc3BvbnNlIiwiY2hlY2tTdGF0dXMiLCJvcHRpb25zIiwiaGVhZGVycyIsInBhdGgiLCJwYXJhbXMiLCJjcmVhdGVRdWVyeVN0cmluZyIsImluY2x1ZGVzIiwiZXJyb3JUZXh0IiwidGV4dCIsInNlcnZlclJlc3BvbnNlIiwicGFyc2UiLCJlIiwiSHR0cEVycm9yIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJFcnJvciIsInBvc3RTeW5jIiwiZGF0YSIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIndpdGhDcmVkZW50aWFscyIsInNldFJlcXVlc3RIZWFkZXIiLCJzZW5kIiwibWFrZVBhcmFtVmFsdWVTdHJpbmciLCJwYXJhbSIsInZhbHVlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicGFyYW1zMiIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJrZXkiLCJ0b1N0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsIml0ZW0iLCJmaWx0ZXIiLCJ4Iiwiam9pbiIsInN0YXR1c0NvZGUiLCJuYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBcUJPLE1BQU1BLGtCQUFOLENBQXdEO0FBR3BEQyxFQUFBQSxXQUFXLENBQUNDLGFBQUQsRUFBMEI7QUFBQSxTQUYzQkEsYUFFMkI7QUFDeEMsU0FBS0EsYUFBTCxHQUFxQkEsYUFBckI7QUFDSDs7QUFFZ0IsTUFBTkMsTUFBTSxHQUFtQjtBQUNoQyxXQUFPLEtBQUtELGFBQUwsQ0FBbUJDLE1BQTFCO0FBQ0g7O0FBRWdCLFFBQUpDLElBQUksR0FBa0I7QUFDL0IsVUFBTUMsWUFBWSxHQUFHLE1BQU0sS0FBS0gsYUFBTCxDQUFtQkUsSUFBbkIsRUFBM0IsQ0FEK0IsQ0FFL0I7O0FBQ0EsV0FBT0MsWUFBUDtBQUNIOztBQWYwRDs7OztBQW9CeEQsTUFBTUMsd0JBQU4sQ0FBb0U7QUFRaEVMLEVBQUFBLFdBQVcsQ0FBQ00sT0FBRCxFQUFvQztBQUFBLFNBUHJDQyxjQU9xQztBQUFBLFNBTnJDQyxXQU1xQyxHQU5MLEVBTUs7QUFBQSxTQUw5Q0MsV0FLOEMsR0FMYixFQUthO0FBQUEsU0FKOUNDLE1BSThDO0FBQUEsU0FIOUNDLFdBRzhDO0FBQUEsU0FGOUNDLFdBRThDOztBQUFBLFNBd0R0Q0MsSUF4RHNDLEdBd0RNLENBQUMsR0FBR0MsSUFBSixLQUFhO0FBQ3JFLFlBQU1DLGFBQWEsR0FBRyxDQUFDLFlBQVk7QUFDL0IsY0FBTUMsTUFBTSxHQUFHLE1BQU0sS0FBS1QsY0FBTCxDQUFvQixLQUFLVSxZQUFMLEVBQXBCLENBQXJCOztBQUNBLFlBQUlELE1BQU0sWUFBWWpCLGtCQUF0QixFQUEwQztBQUN0QyxpQkFBT2lCLE1BQVA7QUFDSCxTQUZELE1BRU87QUFDSCxpQkFBTyxJQUFJakIsa0JBQUosQ0FBdUJpQixNQUF2QixDQUFQO0FBQ0g7QUFDSixPQVBxQixHQUF0Qjs7QUFRQSxhQUFPRCxhQUFhLENBQUNGLElBQWQsQ0FBbUIsR0FBR0MsSUFBdEIsQ0FBUDtBQUNILEtBbEVxRDs7QUFDbEQsU0FBS1AsY0FBTCxHQUFzQkQsT0FBdEI7QUFDSDs7QUFFTVksRUFBQUEsZUFBZSxDQUFDUixNQUFELEVBQXdDO0FBQzFELFNBQUtBLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFdBQU8sSUFBUDtBQUNIOztBQUVNUyxFQUFBQSxlQUFlLENBQUNQLFdBQUQsRUFBNEI7QUFDOUMsU0FBS0EsV0FBTCxHQUFtQkEsV0FBbkI7QUFDQSxXQUFPLElBQVA7QUFDSDs7QUFFTVEsRUFBQUEsa0JBQWtCLENBQUNDLElBQUQsRUFBeUM7QUFDOUQsUUFBSUEsSUFBSSxLQUFLLEtBQVQsSUFBa0JBLElBQUksSUFBSUMsU0FBOUIsRUFBeUM7QUFDckMsYUFBTyxJQUFQO0FBQ0g7O0FBQ0QsU0FBS1gsV0FBTCxHQUFtQixNQUFNVSxJQUF6Qjs7QUFDQSxXQUFPLElBQVA7QUFDSDs7QUFFTUUsRUFBQUEsWUFBWSxDQUFDQyxnQkFBRCxFQUErRDtBQUM5RSxRQUFJQSxnQkFBZ0IsS0FBSyxLQUFyQixJQUE4QkEsZ0JBQWdCLElBQUlGLFNBQXRELEVBQWlFO0FBQzdELFdBQUtYLFdBQUwsR0FBbUIsTUFBTWMsSUFBSSxDQUFDQyxTQUFMLENBQWVGLGdCQUFmLENBQXpCO0FBQ0g7O0FBQ0QsV0FBTyxJQUFQO0FBQ0g7O0FBRU1HLEVBQUFBLGVBQWUsQ0FBQ2xCLFdBQUQsRUFBMkQ7QUFDN0UsUUFBSUEsV0FBSixFQUFpQjtBQUNiLFdBQUtBLFdBQUwsR0FBbUIsRUFDZixHQUFHLEtBQUtBLFdBRE87QUFFZixXQUFHQTtBQUZZLE9BQW5CO0FBSUg7O0FBQ0QsV0FBTyxJQUFQO0FBQ0g7O0FBRU1tQixFQUFBQSxXQUFXLENBQUNQLElBQUQsRUFBa0Q7QUFDaEUsUUFBSUEsSUFBSSxLQUFLLEtBQVQsSUFBa0JBLElBQUksSUFBSUMsU0FBOUIsRUFBeUM7QUFDckMsV0FBS1gsV0FBTCxHQUFtQixNQUFNVSxJQUF6QjtBQUNIOztBQUNELFdBQU8sSUFBUDtBQUNIOztBQUVnQixRQUFKbEIsSUFBSSxHQUFrQjtBQUMvQixVQUFNYSxNQUFNLEdBQUcsTUFBTSxJQUFyQjtBQUNBLFdBQU9BLE1BQU0sQ0FBQ2IsSUFBUCxFQUFQO0FBQ0g7O0FBRU0wQixFQUFBQSxVQUFVLENBQUNDLElBQUQsRUFBNkI7QUFDMUMsU0FBS3RCLFdBQUwsQ0FBaUJ1QixJQUFqQixDQUFzQkQsSUFBdEI7QUFDQSxXQUFPLElBQVA7QUFDSDs7QUFjT2IsRUFBQUEsWUFBWSxHQUE2QjtBQUM3QyxXQUFPO0FBQ0hQLE1BQUFBLE1BQU0sRUFBRSxLQUFLQSxNQURWO0FBRUhDLE1BQUFBLFdBQVcsRUFBRSxLQUFLQSxXQUZmO0FBR0hILE1BQUFBLFdBQVcsRUFBRSxLQUFLQSxXQUhmO0FBSUhDLE1BQUFBLFdBQVcsRUFBRSxLQUFLQSxXQUpmO0FBS0hHLE1BQUFBLFdBQVcsRUFBRSxLQUFLQTtBQUxmLEtBQVA7QUFPSDs7QUFFbUIsU0FBTm9CLE1BQU0sQ0FBQ0MsRUFBRCxFQUF5RDtBQUN6RSxXQUFPLElBQUk1Qix3QkFBSixDQUE2QjRCLEVBQTdCLENBQVA7QUFDSDs7QUF4RnNFOzs7O0FBMkZwRSxNQUFNQyxVQUFOLENBQXdDO0FBTXBDbEMsRUFBQUEsV0FBVyxDQUNkbUMsU0FEYyxFQUVkQyxPQUZjLEVBR2RDLHNCQUhjLEVBSWRDLGtCQUpjLEVBS2hCO0FBQUEsU0FWZUgsU0FVZjtBQUFBLFNBVGVDLE9BU2Y7QUFBQSxTQVJlQyxzQkFRZjtBQUFBLFNBUGVFLGFBT2YsR0FQbUQsRUFPbkQ7QUFDRSxTQUFLSixTQUFMLEdBQWlCQSxTQUFqQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxnQ0FBY0EsT0FBZCxDQUFmO0FBQ0EsU0FBS0csYUFBTCxHQUFxQkQsa0JBQXJCO0FBQ0EsU0FBS0Qsc0JBQUwsR0FBOEJBLHNCQUE5QjtBQUNIOztBQUVNRyxFQUFBQSxHQUFHLENBQUNDLEdBQUQsRUFBeUM7QUFDL0MsV0FBTyxLQUFLQyxNQUFMLENBQVksS0FBWixFQUFtQkQsR0FBbkIsQ0FBUDtBQUNIOztBQUVNRSxFQUFBQSxJQUFJLENBQUNGLEdBQUQsRUFBeUM7QUFDaEQsV0FBTyxLQUFLQyxNQUFMLENBQVksTUFBWixFQUFvQkQsR0FBcEIsQ0FBUDtBQUNIOztBQUVNRyxFQUFBQSxHQUFHLENBQUNILEdBQUQsRUFBeUM7QUFDL0MsV0FBTyxLQUFLQyxNQUFMLENBQVksS0FBWixFQUFtQkQsR0FBbkIsQ0FBUDtBQUNIOztBQUVNSSxFQUFBQSxLQUFLLENBQUNKLEdBQUQsRUFBeUM7QUFDakQsV0FBTyxLQUFLQyxNQUFMLENBQVksT0FBWixFQUFxQkQsR0FBckIsQ0FBUDtBQUNIOztBQUVPQyxFQUFBQSxNQUFNLENBQUNBLE1BQUQsRUFBdUY7QUFDakcsV0FBUUQsR0FBRCxJQUNIcEMsd0JBQXdCLENBQUMyQixNQUF6QixDQUFnQyxNQUFNYyxNQUFOLElBQWdCO0FBQzVDLFlBQU1DLFFBQVEsR0FBRyxLQUFLTixHQUFMLENBQVNBLEdBQVQsRUFBY0ssTUFBTSxDQUFDckMsV0FBckIsQ0FBakI7QUFDQSxVQUFJdUMsT0FBTyxHQUFHLEtBQUtDLDJCQUFMLENBQWlDO0FBQUVQLFFBQUFBLE1BQU0sRUFBRUE7QUFBVixPQUFqQyxFQUFxREksTUFBTSxDQUFDbEMsV0FBNUQsQ0FBZDs7QUFDQSxVQUFJLEtBQUt5QixzQkFBTCxJQUErQmYsU0FBbkMsRUFBOEM7QUFDMUMwQixRQUFBQSxPQUFPLEdBQUcsS0FBS1gsc0JBQUwsQ0FBNEJXLE9BQTVCLENBQVY7QUFDSDs7QUFDRCxVQUFJRixNQUFNLENBQUNwQyxNQUFYLEVBQW1CO0FBQ2ZzQyxRQUFBQSxPQUFPLENBQUN0QyxNQUFSLEdBQWlCb0MsTUFBTSxDQUFDcEMsTUFBeEI7QUFDSDs7QUFDRCxVQUFJb0MsTUFBTSxDQUFDbkMsV0FBWCxFQUF3QjtBQUNwQixZQUFJK0IsTUFBTSxLQUFLLEtBQWYsRUFBc0I7QUFDbEIsZ0JBQU0sSUFBSVEsNEJBQUosQ0FBeUIsUUFBekIsRUFBbUMsc0NBQW5DLENBQU47QUFDSDs7QUFDREYsUUFBQUEsT0FBTyxDQUFDM0IsSUFBUixHQUFleUIsTUFBTSxDQUFDbkMsV0FBUCxFQUFmO0FBQ0g7O0FBQ0QsWUFBTXdDLFFBQVEsR0FBRyxNQUFNLEtBQUtoQixTQUFMLENBQWVZLFFBQWYsRUFBeUJDLE9BQXpCLENBQXZCO0FBQ0EsWUFBTSxLQUFLSSxXQUFMLENBQWlCRCxRQUFqQixFQUEyQkwsTUFBTSxDQUFDdEMsV0FBbEMsQ0FBTjtBQUNBLGFBQU8yQyxRQUFQO0FBQ0gsS0FsQkQsQ0FESjtBQW9CSDs7QUFFT0YsRUFBQUEsMkJBQTJCLENBQUNJLE9BQUQsRUFBdUJ6QyxXQUF2QixFQUFzRTtBQUFBOztBQUNyR3lDLElBQUFBLE9BQU8sQ0FBQ0MsT0FBUix1QkFBa0JELE9BQU8sQ0FBQ0MsT0FBMUIsK0RBQXFDLEVBQXJDO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixjQUFoQixJQUFrQzFDLFdBQWxDLGFBQWtDQSxXQUFsQyxjQUFrQ0EsV0FBbEMsR0FBaUQsa0JBQWpEO0FBQ0F5QyxJQUFBQSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsZUFBaEIsSUFBbUMsb0JBQW5DO0FBQ0FELElBQUFBLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQixRQUFoQixJQUE0QixVQUE1QjtBQUNBRCxJQUFBQSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsU0FBaEIsSUFBNkIsR0FBN0I7QUFDQSxXQUFPRCxPQUFQO0FBQ0g7O0FBRU1aLEVBQUFBLEdBQUcsQ0FBQ2MsSUFBRCxFQUFlQyxNQUFmLEVBQThEO0FBQ3BFLFdBQU8sS0FBS3BCLE9BQUwsR0FBZSxHQUFmLEdBQXFCbUIsSUFBckIsR0FBNEIsS0FBS0UsaUJBQUwsQ0FBdUIsRUFBRSxHQUFHLEtBQUtsQixhQUFWO0FBQXlCLFNBQUdpQjtBQUE1QixLQUF2QixDQUFuQztBQUNIOztBQUV3QixRQUFYSixXQUFXLENBQUNELFFBQUQsRUFBcUIzQyxXQUFyQixFQUFvRTtBQUN6RixRQUFJLEVBQUUyQyxRQUFRLENBQUNqRCxNQUFULElBQW1CLEdBQW5CLElBQTBCaUQsUUFBUSxDQUFDakQsTUFBVCxHQUFrQixHQUE5QyxLQUFzRCxDQUFDTSxXQUFELGFBQUNBLFdBQUQsY0FBQ0EsV0FBRCxHQUFnQixFQUFoQixFQUFvQmtELFFBQXBCLENBQTZCUCxRQUFRLENBQUNqRCxNQUF0QyxDQUExRCxFQUF5RztBQUNyRyxZQUFNeUQsU0FBUyxHQUFHLE1BQU1SLFFBQVEsQ0FBQ1MsSUFBVCxFQUF4QjtBQUNBLFVBQUlDLGNBQUo7O0FBQ0EsVUFBSTtBQUNBQSxRQUFBQSxjQUFjLEdBQUdwQyxJQUFJLENBQUNxQyxLQUFMLENBQVdILFNBQVgsQ0FBakI7QUFDSCxPQUZELENBRUUsT0FBT0ksQ0FBUCxFQUFVO0FBQ1JGLFFBQUFBLGNBQWMsR0FBR3ZDLFNBQWpCO0FBQ0g7O0FBQ0QsVUFBSXVDLGNBQWMsSUFBSXZDLFNBQXRCLEVBQWlDO0FBQUE7O0FBQzdCO0FBQ0EsY0FBTSxJQUFJMEMsU0FBSixrQ0FDRkgsY0FBYyxDQUFDSSxPQURiLHlFQUN3QkosY0FBYyxDQUFDSyxPQUR2Qyx1Q0FDa0RMLGNBQWMsQ0FBQ00sS0FEakUsRUFFRmhCLFFBQVEsQ0FBQ2pELE1BRlAsQ0FBTjtBQUlIOztBQUNELFlBQU0sSUFBSThELFNBQUosQ0FBY0wsU0FBZCxFQUF5QlIsUUFBUSxDQUFDakQsTUFBbEMsQ0FBTjtBQUNIO0FBQ0o7O0FBRU1rRSxFQUFBQSxRQUFRLENBQUMzQixHQUFELEVBQWNlLE1BQWQsRUFBcURhLElBQXJELEVBQStFO0FBQzFGLFVBQU1yQixPQUFPLEdBQUcsSUFBSXNCLGNBQUosRUFBaEI7QUFDQXRCLElBQUFBLE9BQU8sQ0FBQ3VCLElBQVIsQ0FBYSxNQUFiLEVBQXFCLEtBQUs5QixHQUFMLENBQVNBLEdBQVQsRUFBY2UsTUFBZCxDQUFyQixFQUE0QyxLQUE1QztBQUNBUixJQUFBQSxPQUFPLENBQUN3QixlQUFSLEdBQTBCLElBQTFCO0FBQ0F4QixJQUFBQSxPQUFPLENBQUN5QixnQkFBUixDQUF5QixjQUF6QixFQUF5QyxpQ0FBekM7QUFDQXpCLElBQUFBLE9BQU8sQ0FBQzBCLElBQVIsQ0FBYWpELElBQUksQ0FBQ0MsU0FBTCxDQUFlMkMsSUFBZixDQUFiO0FBQ0EsV0FBT3JCLE9BQU8sQ0FBQzlDLE1BQWY7QUFDSDs7QUFFT3lFLEVBQUFBLG9CQUFvQixDQUFDQyxLQUFELEVBQWdCQyxLQUFoQixFQUF1QztBQUMvRCxXQUFRLEdBQUVDLGtCQUFrQixDQUFDRixLQUFELENBQVEsSUFBR0Usa0JBQWtCLENBQUNELEtBQUQsQ0FBUSxFQUFqRTtBQUNIOztBQUVPcEIsRUFBQUEsaUJBQWlCLENBQUNELE1BQUQsRUFBcUM7QUFDMUQsUUFBSUEsTUFBTSxJQUFJbEMsU0FBZCxFQUF5QjtBQUNyQixhQUFPLEVBQVA7QUFDSDs7QUFDRCxVQUFNeUQsT0FBTyxHQUFHdkIsTUFBaEI7QUFDQSxRQUFJeEMsTUFBTSxHQUFHZ0UsTUFBTSxDQUFDQyxJQUFQLENBQVl6QixNQUFaLEVBQ1IwQixHQURRLENBQ0pDLEdBQUcsSUFBSTtBQUNSLFlBQU1OLEtBQUssR0FBR0UsT0FBTyxDQUFDSSxHQUFELENBQXJCOztBQUNBLFVBQUksT0FBT04sS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUMzQixlQUFPLEtBQUtGLG9CQUFMLENBQTBCUSxHQUExQixFQUErQk4sS0FBL0IsQ0FBUDtBQUNIOztBQUNELFVBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFqQixJQUE2QixPQUFPQSxLQUFQLEtBQWlCLFNBQWxELEVBQTZEO0FBQ3pELGVBQU8sS0FBS0Ysb0JBQUwsQ0FBMEJRLEdBQTFCLEVBQStCTixLQUFLLENBQUNPLFFBQU4sRUFBL0IsQ0FBUDtBQUNIOztBQUNELFVBQUlDLEtBQUssQ0FBQ0MsT0FBTixDQUFjVCxLQUFkLENBQUosRUFBMEI7QUFDdEIsZUFBT0EsS0FBSyxDQUNQSyxHQURFLENBQ0VLLElBQUksSUFBSTtBQUNULGNBQUksT0FBT0EsSUFBUCxLQUFnQixRQUFwQixFQUE4QjtBQUMxQixtQkFBTyxLQUFLWixvQkFBTCxDQUEwQlEsR0FBMUIsRUFBK0JJLElBQS9CLENBQVA7QUFDSDs7QUFDRCxjQUFJLE9BQU9BLElBQVAsS0FBZ0IsUUFBcEIsRUFBOEI7QUFDMUIsbUJBQU8sS0FBS1osb0JBQUwsQ0FBMEJRLEdBQTFCLEVBQStCSSxJQUFJLENBQUNILFFBQUwsRUFBL0IsQ0FBUDtBQUNIOztBQUNELGlCQUFPOUQsU0FBUDtBQUNILFNBVEUsRUFVRmtFLE1BVkUsQ0FVS0MsQ0FBQyxJQUFJQSxDQUFDLElBQUluRSxTQVZmLEVBV0ZvRSxJQVhFLENBV0csR0FYSCxDQUFQO0FBWUg7O0FBQ0QsYUFBT3BFLFNBQVA7QUFDSCxLQXhCUSxFQXlCUmtFLE1BekJRLENBeUJEQyxDQUFDLElBQUlBLENBQUMsSUFBSW5FLFNBekJULEVBMEJSb0UsSUExQlEsQ0EwQkgsR0ExQkcsQ0FBYjtBQTJCQTFFLElBQUFBLE1BQU0sR0FBR0EsTUFBTSxHQUFHLE1BQU1BLE1BQVQsR0FBa0IsRUFBakM7QUFDQSxXQUFPQSxNQUFQO0FBQ0g7O0FBekkwQzs7OztBQTRJL0MsTUFBTWdELFNBQU4sU0FBd0JHLEtBQXhCLENBQThCO0FBR25CbkUsRUFBQUEsV0FBVyxDQUFDa0UsT0FBRCxFQUFrQnlCLFVBQWxCLEVBQXNDO0FBQ3BELFVBQU16QixPQUFOO0FBRG9ELFNBRnhDeUIsVUFFd0M7QUFFcEQsU0FBS0MsSUFBTCxHQUFZLFdBQVo7QUFDQSxTQUFLRCxVQUFMLEdBQWtCQSxVQUFsQjtBQUNIOztBQVB5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gZnJvbSBcIi4uL0Vycm9yc1wiO1xuaW1wb3J0IHsgdHJpbUxhc3RTbGFzaCB9IGZyb20gXCIuLi9UeXBpbmdVdGlsc1wiO1xuXG5pbXBvcnQgeyBGZXRjaCB9IGZyb20gXCIuL0ZldGNoSW1wbGVtZW50YXRpb24vRmV0Y2hcIjtcbmltcG9ydCB7XG4gICAgSHR0cFN0YXR1c0NvZGUsXG4gICAgSUh0dHBDbGllbnQsXG4gICAgSUh0dHBDbGllbnRSZXF1ZXN0V3JhcHBlcixcbiAgICBJSHR0cENsaWVudFJlc3BvbnNlLFxuICAgIFF1ZXJ5UGFyYW1zT2JqZWN0LFxufSBmcm9tIFwiLi9JSHR0cENsaWVudFwiO1xuXG50eXBlIEJvZHlGYWN0b3J5ID0gKCkgPT4gQm9keUluaXQgfCBudWxsO1xuXG5pbnRlcmZhY2UgSUh0dHBDbGllbnRSZXF1ZXN0Q29uZmlnIHtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgICBib2R5RmFjdG9yeT86IEJvZHlGYWN0b3J5O1xuICAgIGFjY2VwdENvZGVzOiBIdHRwU3RhdHVzQ29kZVtdO1xuICAgIHF1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtc09iamVjdDtcbiAgICBjb250ZW50VHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnRSZXNwb25zZSBpbXBsZW1lbnRzIElIdHRwQ2xpZW50UmVzcG9uc2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZmV0Y2hSZXNwb25zZTogUmVzcG9uc2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZmV0Y2hSZXNwb25zZTogUmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5mZXRjaFJlc3BvbnNlID0gZmV0Y2hSZXNwb25zZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN0YXR1cygpOiBIdHRwU3RhdHVzQ29kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoUmVzcG9uc2Uuc3RhdHVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBqc29uPFQ+KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmZldGNoUmVzcG9uc2UuanNvbigpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlRGF0YTtcbiAgICB9XG59XG5cbnR5cGUgUmVxdWVzdEV4ZWN1dGlvbkZ1bmN0aW9uID0gKGNvbmZpZzogSUh0dHBDbGllbnRSZXF1ZXN0Q29uZmlnKSA9PiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZSB8IFJlc3BvbnNlPjtcblxuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnRSZXF1ZXN0V3JhcHBlciBpbXBsZW1lbnRzIElIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0ZVJlcXVlc3Q6IFJlcXVlc3RFeGVjdXRpb25GdW5jdGlvbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjY2VwdENvZGVzOiBIdHRwU3RhdHVzQ29kZVtdID0gW107XG4gICAgcHJpdmF0ZSBxdWVyeVBhcmFtczogUXVlcnlQYXJhbXNPYmplY3QgPSB7fTtcbiAgICBwcml2YXRlIHNpZ25hbDogdW5kZWZpbmVkIHwgQWJvcnRTaWduYWw7XG4gICAgcHJpdmF0ZSBib2R5RmFjdG9yeT86IEJvZHlGYWN0b3J5O1xuICAgIHByaXZhdGUgY29udGVudFR5cGU/OiBzdHJpbmc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZXhlY3V0ZTogUmVxdWVzdEV4ZWN1dGlvbkZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuZXhlY3V0ZVJlcXVlc3QgPSBleGVjdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQWJvcnRTaWduYWwoc2lnbmFsOiB1bmRlZmluZWQgfCBBYm9ydFNpZ25hbCk6IHRoaXMge1xuICAgICAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhDb250ZW50VHlwZShjb250ZW50VHlwZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhCb2R5RnJvbUJ1ZmZlcihib2R5OiBmYWxzZSB8IEJ1ZmZlciB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgICAgICBpZiAoYm9keSA9PT0gZmFsc2UgfHwgYm9keSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm9keUZhY3RvcnkgPSAoKSA9PiBib2R5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEpzb25Cb2R5KHNlcmlhbGl6YWJsZUJvZHk6IHVua25vd24gfCB7fSB8IHVua25vd25bXSB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgICAgICBpZiAoc2VyaWFsaXphYmxlQm9keSAhPT0gZmFsc2UgJiYgc2VyaWFsaXphYmxlQm9keSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYm9keUZhY3RvcnkgPSAoKSA9PiBKU09OLnN0cmluZ2lmeShzZXJpYWxpemFibGVCb2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtc09iamVjdCB8IGZhbHNlIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgICAgIGlmIChxdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgICAgIC4uLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFJhd0JvZHkoYm9keTogQnVmZmVyIHwgc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICAgICAgaWYgKGJvZHkgIT09IGZhbHNlICYmIGJvZHkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmJvZHlGYWN0b3J5ID0gKCkgPT4gYm9keTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMganNvbjxUPigpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcztcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qc29uPFQ+KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjY2VwdENvZGUoY29kZTogSHR0cFN0YXR1c0NvZGUpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hY2NlcHRDb2Rlcy5wdXNoKGNvZGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgdGhlbjogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U+W1widGhlblwiXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdCh0aGlzLmNyZWF0ZUNvbmZpZygpKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBIdHRwQ2xpZW50UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBDbGllbnRSZXNwb25zZShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZS50aGVuKC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNvbmZpZygpOiBJSHR0cENsaWVudFJlcXVlc3RDb25maWcge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2lnbmFsOiB0aGlzLnNpZ25hbCxcbiAgICAgICAgICAgIGJvZHlGYWN0b3J5OiB0aGlzLmJvZHlGYWN0b3J5LFxuICAgICAgICAgICAgYWNjZXB0Q29kZXM6IHRoaXMuYWNjZXB0Q29kZXMsXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmNvbnRlbnRUeXBlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGZuOiBSZXF1ZXN0RXhlY3V0aW9uRnVuY3Rpb24pOiBIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIge1xuICAgICAgICByZXR1cm4gbmV3IEh0dHBDbGllbnRSZXF1ZXN0V3JhcHBlcihmbik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSHR0cENsaWVudCBpbXBsZW1lbnRzIElIdHRwQ2xpZW50IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZldGNoSW1wbDogRmV0Y2g7XG4gICAgcHJpdmF0ZSByZWFkb25seSBiYXNlVXJsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoZW50aWNhdGlvblByb3ZpZGVyOiAocmVxdWVzdDogUmVxdWVzdEluaXQpID0+IFJlcXVlc3RJbml0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBhcmFtcz86IFF1ZXJ5UGFyYW1zT2JqZWN0ID0ge307XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIGZldGNoSW1wbDogRmV0Y2gsXG4gICAgICAgIGJhc2VVcmw6IHN0cmluZyxcbiAgICAgICAgYXV0aGVudGljYXRpb25Qcm92aWRlcjogKHJlcXVlc3Q6IFJlcXVlc3RJbml0KSA9PiBSZXF1ZXN0SW5pdCxcbiAgICAgICAgZGVmYXVsdFF1ZXJ5UGFyYW1zPzogUXVlcnlQYXJhbXNPYmplY3RcbiAgICApIHtcbiAgICAgICAgdGhpcy5mZXRjaEltcGwgPSBmZXRjaEltcGw7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IHRyaW1MYXN0U2xhc2goYmFzZVVybCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFBhcmFtcyA9IGRlZmF1bHRRdWVyeVBhcmFtcztcbiAgICAgICAgdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyID0gYXV0aGVudGljYXRpb25Qcm92aWRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHVybDogc3RyaW5nKTogSUh0dHBDbGllbnRSZXF1ZXN0V3JhcHBlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZChcIkdFVFwiKSh1cmwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwb3N0KHVybDogc3RyaW5nKTogSUh0dHBDbGllbnRSZXF1ZXN0V3JhcHBlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZChcIlBPU1RcIikodXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHV0KHVybDogc3RyaW5nKTogSUh0dHBDbGllbnRSZXF1ZXN0V3JhcHBlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGhvZChcIlBVVFwiKSh1cmwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaCh1cmw6IHN0cmluZyk6IElIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QoXCJQQVRDSFwiKSh1cmwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWV0aG9kKG1ldGhvZDogXCJHRVRcIiB8IFwiUE9TVFwiIHwgXCJQVVRcIiB8IFwiUEFUQ0hcIik6ICh1cmw6IHN0cmluZykgPT4gSUh0dHBDbGllbnRSZXF1ZXN0V3JhcHBlciB7XG4gICAgICAgIHJldHVybiAodXJsOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIuY3JlYXRlKGFzeW5jIGNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hVcmwgPSB0aGlzLnVybCh1cmwsIGNvbmZpZy5xdWVyeVBhcmFtcyk7XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLmFwcGVuZERlZmF1bHRSZXF1ZXN0SGVhZGVycyh7IG1ldGhvZDogbWV0aG9kIH0sIGNvbmZpZy5jb250ZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlciAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zaWduYWwgPSBjb25maWcuc2lnbmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmJvZHlGYWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm1ldGhvZFwiLCBcIkJvZHkgaXMgbm90IGFsbG93ZWQgZm9yIEdFVCByZXF1ZXN0c1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBjb25maWcuYm9keUZhY3RvcnkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoSW1wbChmZXRjaFVybCwgcmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1N0YXR1cyhyZXNwb25zZSwgY29uZmlnLmFjY2VwdENvZGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGVuZERlZmF1bHRSZXF1ZXN0SGVhZGVycyhvcHRpb25zOiBSZXF1ZXN0SW5pdCwgY29udGVudFR5cGU/OiB1bmRlZmluZWQgfCBzdHJpbmcpOiBSZXF1ZXN0SW5pdCB7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyA/PyB7fTtcbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1tcIkNhY2hlLUNvbnRyb2xcIl0gPSBcIm5vLWNhY2hlLCBuby1zdG9yZVwiO1xuICAgICAgICBvcHRpb25zLmhlYWRlcnNbXCJQcmFnbWFcIl0gPSBcIm5vLWNhY2hlXCI7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1tcIkV4cGlyZXNcIl0gPSBcIjBcIjtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHVybChwYXRoOiBzdHJpbmcsIHBhcmFtczogdW5kZWZpbmVkIHwgUXVlcnlQYXJhbXNPYmplY3QpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlVXJsICsgXCIvXCIgKyBwYXRoICsgdGhpcy5jcmVhdGVRdWVyeVN0cmluZyh7IC4uLnRoaXMuZGVmYXVsdFBhcmFtcywgLi4ucGFyYW1zIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hlY2tTdGF0dXMocmVzcG9uc2U6IFJlc3BvbnNlLCBhY2NlcHRDb2Rlcz86IEh0dHBTdGF0dXNDb2RlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCEocmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDApIHx8IChhY2NlcHRDb2RlcyA/PyBbXSkuaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgbGV0IHNlcnZlclJlc3BvbnNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IEpTT04ucGFyc2UoZXJyb3JUZXh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXJ2ZXJSZXNwb25zZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5zYWZlLWFueVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlLk1lc3NhZ2UgPz8gc2VydmVyUmVzcG9uc2UubWVzc2FnZSA/PyBzZXJ2ZXJSZXNwb25zZS5FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXJyb3IoZXJyb3JUZXh0LCByZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBvc3RTeW5jKHVybDogc3RyaW5nLCBwYXJhbXM6IHVuZGVmaW5lZCB8IFF1ZXJ5UGFyYW1zT2JqZWN0LCBkYXRhOiB7fSk6IEh0dHBTdGF0dXNDb2RlIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICByZXF1ZXN0Lm9wZW4oXCJQT1NUXCIsIHRoaXMudXJsKHVybCwgcGFyYW1zKSwgZmFsc2UpO1xuICAgICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLThcIik7XG4gICAgICAgIHJlcXVlc3Quc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIHJldHVybiByZXF1ZXN0LnN0YXR1cztcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VQYXJhbVZhbHVlU3RyaW5nKHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtKX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsdWUpfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVRdWVyeVN0cmluZyhwYXJhbXM/OiBRdWVyeVBhcmFtc09iamVjdCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChwYXJhbXMgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJhbXMyID0gcGFyYW1zO1xuICAgICAgICBsZXQgcmVzdWx0ID0gT2JqZWN0LmtleXMocGFyYW1zKVxuICAgICAgICAgICAgLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zMltrZXldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFrZVBhcmFtVmFsdWVTdHJpbmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlUGFyYW1WYWx1ZVN0cmluZyhrZXksIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlUGFyYW1WYWx1ZVN0cmluZyhrZXksIGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFrZVBhcmFtVmFsdWVTdHJpbmcoa2V5LCBpdGVtLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4ICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiJlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geCAhPSB1bmRlZmluZWQpXG4gICAgICAgICAgICAuam9pbihcIiZcIik7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCA/IFwiP1wiICsgcmVzdWx0IDogXCJcIjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZTogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkh0dHBFcnJvclwiO1xuICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgIH1cbn1cbiJdfQ==
348
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL0NvbW1vbi9IdHRwQ2xpZW50L0h0dHBDbGllbnQudHMiXSwibmFtZXMiOlsidHJpbVRyYWlsaW5nU2xhc2giLCJ1cmwiLCJzbGljZSIsInRyaW1MZWFkaW5nU2xhc2giLCJIdHRwQ2xpZW50UmVzcG9uc2UiLCJjb25zdHJ1Y3RvciIsImZldGNoUmVzcG9uc2UiLCJzdGF0dXMiLCJqc29uIiwicmVzcG9uc2VEYXRhIiwiSHR0cENsaWVudFJlcXVlc3RXcmFwcGVyIiwiZXhlY3V0ZSIsImV4ZWN1dGVSZXF1ZXN0IiwiYWNjZXB0Q29kZXMiLCJxdWVyeVBhcmFtcyIsInNpZ25hbCIsImJvZHlGYWN0b3J5IiwiY29udGVudFR5cGUiLCJ0aGVuIiwiYXJncyIsInJlc3VsdFByb21pc2UiLCJyZXN1bHQiLCJjcmVhdGVDb25maWciLCJ3aXRoQWJvcnRTaWduYWwiLCJ3aXRoQ29udGVudFR5cGUiLCJ3aXRoQm9keUZyb21CdWZmZXIiLCJib2R5IiwidW5kZWZpbmVkIiwid2l0aEpzb25Cb2R5Iiwic2VyaWFsaXphYmxlQm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3aXRoUXVlcnlQYXJhbXMiLCJ3aXRoUmF3Qm9keSIsImFjY2VwdENvZGUiLCJjb2RlIiwicHVzaCIsImNyZWF0ZSIsImZuIiwiSHR0cENsaWVudCIsImZldGNoSW1wbCIsImJhc2VVcmwiLCJhdXRoZW50aWNhdGlvblByb3ZpZGVyIiwiZGVmYXVsdFF1ZXJ5UGFyYW1zIiwiZGVmYXVsdFBhcmFtcyIsImdldCIsIm1ldGhvZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbmZpZyIsImZldGNoVXJsIiwicmVxdWVzdCIsImFwcGVuZERlZmF1bHRSZXF1ZXN0SGVhZGVycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwicmVzcG9uc2UiLCJjaGVja1N0YXR1cyIsIm9wdGlvbnMiLCJoZWFkZXJzIiwicGF0aCIsInBhcmFtcyIsInJlc3VsdFBhcmFtcyIsImluY2x1ZGVzIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsIk5vdFN1cHBvcnRlZEVycm9yIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJlcnJvclRleHQiLCJ0ZXh0Iiwic2VydmVyUmVzcG9uc2UiLCJwYXJzZSIsImUiLCJIdHRwRXJyb3IiLCJNZXNzYWdlIiwibWVzc2FnZSIsIkVycm9yIiwicG9zdFN5bmMiLCJkYXRhIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwid2l0aENyZWRlbnRpYWxzIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJtYWtlUGFyYW1WYWx1ZVN0cmluZyIsInBhcmFtIiwidmFsdWUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJwYXJhbXMyIiwibWFwIiwia2V5IiwidG9TdHJpbmciLCJBcnJheSIsImlzQXJyYXkiLCJpdGVtIiwiZmlsdGVyIiwieCIsImpvaW4iLCJjcmVhdGVGZXRjaEltcGwiLCJmZXRjaFdpdGhPcHRpb25zIiwiaW5wdXQiLCJpbml0IiwicmVxdWVzdEluaXQiLCJjYWNoZSIsImNyZWRlbnRpYWxzIiwiaW50ZWdyaXR5Iiwia2VlcGFsaXZlIiwibW9kZSIsInJlZGlyZWN0IiwicmVmZXJyZXIiLCJyZWZlcnJlclBvbGljeSIsInN0YXR1c0NvZGUiLCJuYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBWUEsU0FBU0EsaUJBQVQsQ0FBMkJDLEdBQTNCLEVBQWdEO0FBQzVDLFNBQU9BLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLENBQUMsQ0FBWCxNQUFrQixHQUFsQixHQUF3QkQsR0FBRyxDQUFDQyxLQUFKLENBQVUsQ0FBVixFQUFhLENBQUMsQ0FBZCxDQUF4QixHQUEyQ0QsR0FBbEQ7QUFDSDs7QUFFRCxTQUFTRSxnQkFBVCxDQUEwQkYsR0FBMUIsRUFBK0M7QUFDM0MsU0FBT0EsR0FBRyxDQUFDLENBQUQsQ0FBSCxLQUFXLEdBQVgsR0FBaUJBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLENBQVYsQ0FBakIsR0FBZ0NELEdBQXZDO0FBQ0g7O0FBWU0sTUFBTUcsa0JBQU4sQ0FBd0Q7QUFH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M0JDLFVBQUFBLFFBQVEsRUFBRVQsS0FBSyxDQUFDUyxRQWZXO0FBZ0IzQkMsVUFBQUEsY0FBYyxFQUFFVixLQUFLLENBQUNVO0FBaEJLLFNBQS9CO0FBa0JBUixRQUFBQSxXQUFXLEdBQUcsS0FBSzVELHNCQUFMLENBQTRCNEQsV0FBNUIsQ0FBZDtBQUNBLGVBQU8sS0FBSzlELFNBQUwsQ0FBZVcsUUFBZixFQUF5Qm1ELFdBQXpCLENBQVA7QUFDSDtBQUNKLEtBakNEOztBQWtDQSxXQUFPSCxnQkFBUDtBQUNIOztBQXRMMEM7Ozs7QUF5TC9DLE1BQU0xQixTQUFOLFNBQXdCRyxLQUF4QixDQUE4QjtBQUduQnZFLEVBQUFBLFdBQVcsQ0FBQ3NFLE9BQUQsRUFBa0JvQyxVQUFsQixFQUFzQztBQUNwRCxVQUFNcEMsT0FBTjtBQURvRCxTQUZ4Q29DLFVBRXdDO0FBRXBELFNBQUtDLElBQUwsR0FBWSxXQUFaO0FBQ0EsU0FBS0QsVUFBTCxHQUFrQkEsVUFBbEI7QUFDSDs7QUFQeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgTm90U3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiLi4vRXJyb3JzXCI7XG5cbmltcG9ydCB7IEZldGNoIH0gZnJvbSBcIi4vRmV0Y2hJbXBsZW1lbnRhdGlvbi9GZXRjaFwiO1xuaW1wb3J0IHtcbiAgICBIdHRwU3RhdHVzQ29kZSxcbiAgICBJSHR0cENsaWVudCxcbiAgICBJSHR0cENsaWVudFJlcXVlc3RXcmFwcGVyLFxuICAgIElIdHRwQ2xpZW50UmVzcG9uc2UsXG4gICAgUXVlcnlQYXJhbXNPYmplY3QsXG59IGZyb20gXCIuL0lIdHRwQ2xpZW50XCI7XG5pbXBvcnQgeyBIdHRwQ2xpZW50QXV0aGVudGljYXRpb25Qcm92aWRlciB9IGZyb20gXCIuL0h0dHBDbGllbnRBdXRoZW50aWNhdGlvblByb3ZpZGVyXCI7XG5cbmZ1bmN0aW9uIHRyaW1UcmFpbGluZ1NsYXNoKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsLnNsaWNlKC0xKSA9PT0gXCIvXCIgPyB1cmwuc2xpY2UoMCwgLTEpIDogdXJsO1xufVxuXG5mdW5jdGlvbiB0cmltTGVhZGluZ1NsYXNoKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsWzBdID09PSBcIi9cIiA/IHVybC5zbGljZSgxKSA6IHVybDtcbn1cblxudHlwZSBCb2R5RmFjdG9yeSA9ICgpID0+IEJvZHlJbml0IHwgbnVsbDtcblxuaW50ZXJmYWNlIElIdHRwQ2xpZW50UmVxdWVzdENvbmZpZyB7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgYm9keUZhY3Rvcnk/OiBCb2R5RmFjdG9yeTtcbiAgICBhY2NlcHRDb2RlczogSHR0cFN0YXR1c0NvZGVbXTtcbiAgICBxdWVyeVBhcmFtczogUXVlcnlQYXJhbXNPYmplY3Q7XG4gICAgY29udGVudFR5cGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBIdHRwQ2xpZW50UmVzcG9uc2UgaW1wbGVtZW50cyBJSHR0cENsaWVudFJlc3BvbnNlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZldGNoUmVzcG9uc2U6IFJlc3BvbnNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGZldGNoUmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hSZXNwb25zZSA9IGZldGNoUmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzdGF0dXMoKTogSHR0cFN0YXR1c0NvZGUge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFJlc3BvbnNlLnN0YXR1cztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMganNvbjxUPigpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5mZXRjaFJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtcmV0dXJuXG4gICAgICAgIHJldHVybiByZXNwb25zZURhdGE7XG4gICAgfVxufVxuXG50eXBlIFJlcXVlc3RFeGVjdXRpb25GdW5jdGlvbiA9IChjb25maWc6IElIdHRwQ2xpZW50UmVxdWVzdENvbmZpZykgPT4gUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2UgfCBSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIgaW1wbGVtZW50cyBJSHR0cENsaWVudFJlcXVlc3RXcmFwcGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGVSZXF1ZXN0OiBSZXF1ZXN0RXhlY3V0aW9uRnVuY3Rpb247XG4gICAgcHJpdmF0ZSByZWFkb25seSBhY2NlcHRDb2RlczogSHR0cFN0YXR1c0NvZGVbXSA9IFtdO1xuICAgIHByaXZhdGUgcXVlcnlQYXJhbXM6IFF1ZXJ5UGFyYW1zT2JqZWN0ID0ge307XG4gICAgcHJpdmF0ZSBzaWduYWw6IHVuZGVmaW5lZCB8IEFib3J0U2lnbmFsO1xuICAgIHByaXZhdGUgYm9keUZhY3Rvcnk/OiBCb2R5RmFjdG9yeTtcbiAgICBwcml2YXRlIGNvbnRlbnRUeXBlPzogc3RyaW5nO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGV4ZWN1dGU6IFJlcXVlc3RFeGVjdXRpb25GdW5jdGlvbikge1xuICAgICAgICB0aGlzLmV4ZWN1dGVSZXF1ZXN0ID0gZXhlY3V0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aEFib3J0U2lnbmFsKHNpZ25hbDogdW5kZWZpbmVkIHwgQWJvcnRTaWduYWwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQ29udGVudFR5cGUoY29udGVudFR5cGU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoQm9keUZyb21CdWZmZXIoYm9keTogZmFsc2UgfCBCdWZmZXIgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICAgICAgaWYgKGJvZHkgPT09IGZhbHNlIHx8IGJvZHkgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvZHlGYWN0b3J5ID0gKCkgPT4gYm9keTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhKc29uQm9keShzZXJpYWxpemFibGVCb2R5OiB1bmtub3duIHwge30gfCB1bmtub3duW10gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICAgICAgaWYgKHNlcmlhbGl6YWJsZUJvZHkgIT09IGZhbHNlICYmIHNlcmlhbGl6YWJsZUJvZHkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmJvZHlGYWN0b3J5ID0gKCkgPT4gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXphYmxlQm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhRdWVyeVBhcmFtcyhxdWVyeVBhcmFtczogUXVlcnlQYXJhbXNPYmplY3QgfCBmYWxzZSB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgICAgICBpZiAocXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgICAgICAuLi5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdpdGhSYXdCb2R5KGJvZHk6IEJ1ZmZlciB8IHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgICAgIGlmIChib2R5ICE9PSBmYWxzZSAmJiBib2R5ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5ib2R5RmFjdG9yeSA9ICgpID0+IGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGpzb248VD4oKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXM7XG4gICAgICAgIHJldHVybiByZXN1bHQuanNvbjxUPigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY2NlcHRDb2RlKGNvZGU6IEh0dHBTdGF0dXNDb2RlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWNjZXB0Q29kZXMucHVzaChjb2RlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRvbmx5IHRoZW46IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPltcInRoZW5cIl0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3QodGhpcy5jcmVhdGVDb25maWcoKSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgSHR0cENsaWVudFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50UmVzcG9uc2UocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2UudGhlbiguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb25maWcoKTogSUh0dHBDbGllbnRSZXF1ZXN0Q29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNpZ25hbDogdGhpcy5zaWduYWwsXG4gICAgICAgICAgICBib2R5RmFjdG9yeTogdGhpcy5ib2R5RmFjdG9yeSxcbiAgICAgICAgICAgIGFjY2VwdENvZGVzOiB0aGlzLmFjY2VwdENvZGVzLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5jb250ZW50VHlwZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShmbjogUmVxdWVzdEV4ZWN1dGlvbkZ1bmN0aW9uKTogSHR0cENsaWVudFJlcXVlc3RXcmFwcGVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIoZm4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEh0dHBDbGllbnQgaW1wbGVtZW50cyBJSHR0cENsaWVudCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmZXRjaEltcGw6IEZldGNoO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aGVudGljYXRpb25Qcm92aWRlcjogSHR0cENsaWVudEF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UGFyYW1zPzogUXVlcnlQYXJhbXNPYmplY3QgPSB7fTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgZmV0Y2hJbXBsOiBGZXRjaCxcbiAgICAgICAgYmFzZVVybDogdW5kZWZpbmVkIHwgc3RyaW5nLFxuICAgICAgICBhdXRoZW50aWNhdGlvblByb3ZpZGVyOiBIdHRwQ2xpZW50QXV0aGVudGljYXRpb25Qcm92aWRlcixcbiAgICAgICAgZGVmYXVsdFF1ZXJ5UGFyYW1zPzogUXVlcnlQYXJhbXNPYmplY3RcbiAgICApIHtcbiAgICAgICAgdGhpcy5mZXRjaEltcGwgPSBmZXRjaEltcGw7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmwgPT0gdW5kZWZpbmVkID8gYmFzZVVybCA6IHRyaW1UcmFpbGluZ1NsYXNoKGJhc2VVcmwpO1xuICAgICAgICB0aGlzLmRlZmF1bHRQYXJhbXMgPSBkZWZhdWx0UXVlcnlQYXJhbXM7XG4gICAgICAgIHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlciA9IGF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCh1cmw6IHN0cmluZyk6IElIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QoXCJHRVRcIikodXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9zdCh1cmw6IHN0cmluZyk6IElIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QoXCJQT1NUXCIpKHVybCk7XG4gICAgfVxuXG4gICAgcHVibGljIHB1dCh1cmw6IHN0cmluZyk6IElIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QoXCJQVVRcIikodXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2godXJsOiBzdHJpbmcpOiBJSHR0cENsaWVudFJlcXVlc3RXcmFwcGVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0aG9kKFwiUEFUQ0hcIikodXJsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ldGhvZChtZXRob2Q6IFwiR0VUXCIgfCBcIlBPU1RcIiB8IFwiUFVUXCIgfCBcIlBBVENIXCIpOiAodXJsOiBzdHJpbmcpID0+IElIdHRwQ2xpZW50UmVxdWVzdFdyYXBwZXIge1xuICAgICAgICByZXR1cm4gKHVybDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgSHR0cENsaWVudFJlcXVlc3RXcmFwcGVyLmNyZWF0ZShhc3luYyBjb25maWcgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoVXJsID0gdGhpcy51cmwodXJsLCBjb25maWcucXVlcnlQYXJhbXMpO1xuICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy5hcHBlbmREZWZhdWx0UmVxdWVzdEhlYWRlcnMoeyBtZXRob2Q6IG1ldGhvZCB9LCBjb25maWcuY29udGVudFR5cGUpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0aGlzLmF1dGhlbnRpY2F0aW9uUHJvdmlkZXIocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zaWduYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zaWduYWwgPSBjb25maWcuc2lnbmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmJvZHlGYWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm1ldGhvZFwiLCBcIkJvZHkgaXMgbm90IGFsbG93ZWQgZm9yIEdFVCByZXF1ZXN0c1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBjb25maWcuYm9keUZhY3RvcnkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoSW1wbChmZXRjaFVybCwgcmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1N0YXR1cyhyZXNwb25zZSwgY29uZmlnLmFjY2VwdENvZGVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGVuZERlZmF1bHRSZXF1ZXN0SGVhZGVycyhvcHRpb25zOiBSZXF1ZXN0SW5pdCwgY29udGVudFR5cGU/OiB1bmRlZmluZWQgfCBzdHJpbmcpOiBSZXF1ZXN0SW5pdCB7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyA/PyB7fTtcbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1tcIkNhY2hlLUNvbnRyb2xcIl0gPSBcIm5vLWNhY2hlLCBuby1zdG9yZVwiO1xuICAgICAgICBvcHRpb25zLmhlYWRlcnNbXCJQcmFnbWFcIl0gPSBcIm5vLWNhY2hlXCI7XG4gICAgICAgIG9wdGlvbnMuaGVhZGVyc1tcIkV4cGlyZXNcIl0gPSBcIjBcIjtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHVybChwYXRoOiBzdHJpbmcsIHBhcmFtczogdW5kZWZpbmVkIHwgUXVlcnlQYXJhbXNPYmplY3QpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0aDtcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYmFzZVVybCArIFwiL1wiICsgdHJpbUxlYWRpbmdTbGFzaChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdFBhcmFtcyA9IHsgLi4udGhpcy5kZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoXCI/XCIpICYmIHBhcmFtcyAhPSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMocmVzdWx0UGFyYW1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoYFBhc3Npbmcgc2VhcmNoIHBhcmFtcyBpbiB1cmwgYW5kIHZpYSBwYXJhbXMgb2JqZWN0IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSByZXN1bHQgKyB0aGlzLmNyZWF0ZVF1ZXJ5U3RyaW5nKHJlc3VsdFBhcmFtcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja1N0YXR1cyhyZXNwb25zZTogUmVzcG9uc2UsIGFjY2VwdENvZGVzPzogSHR0cFN0YXR1c0NvZGVbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIShyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkgfHwgKGFjY2VwdENvZGVzID8/IFtdKS5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICBsZXQgc2VydmVyUmVzcG9uc2U7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlID0gSlNPTi5wYXJzZShlcnJvclRleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHNlcnZlclJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlcnZlclJlc3BvbnNlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby11bnNhZmUtYW55XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyUmVzcG9uc2UuTWVzc2FnZSA/PyBzZXJ2ZXJSZXNwb25zZS5tZXNzYWdlID8/IHNlcnZlclJlc3BvbnNlLkVycm9yLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcihlcnJvclRleHQsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcG9zdFN5bmModXJsOiBzdHJpbmcsIHBhcmFtczogdW5kZWZpbmVkIHwgUXVlcnlQYXJhbXNPYmplY3QsIGRhdGE6IHt9KTogSHR0cFN0YXR1c0NvZGUge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHJlcXVlc3Qub3BlbihcIlBPU1RcIiwgdGhpcy51cmwodXJsLCBwYXJhbXMpLCBmYWxzZSk7XG4gICAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOFwiKTtcbiAgICAgICAgcmVxdWVzdC5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3Quc3RhdHVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZVBhcmFtVmFsdWVTdHJpbmcocGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtlbmNvZGVVUklDb21wb25lbnQocGFyYW0pfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVF1ZXJ5U3RyaW5nKHBhcmFtcz86IFF1ZXJ5UGFyYW1zT2JqZWN0KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHBhcmFtcyA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFtczIgPSBwYXJhbXM7XG4gICAgICAgIGxldCByZXN1bHQgPSBPYmplY3Qua2V5cyhwYXJhbXMpXG4gICAgICAgICAgICAubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbXMyW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlUGFyYW1WYWx1ZVN0cmluZyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VQYXJhbVZhbHVlU3RyaW5nKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VQYXJhbVZhbHVlU3RyaW5nKGtleSwgaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlUGFyYW1WYWx1ZVN0cmluZyhrZXksIGl0ZW0udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih4ID0+IHggIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCImXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4ICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5qb2luKFwiJlwiKTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID8gXCI/XCIgKyByZXN1bHQgOiBcIlwiO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVGZXRjaEltcGwoKTogRmV0Y2gge1xuICAgICAgICBjb25zdCBmZXRjaFdpdGhPcHRpb25zID0gKGlucHV0OiBSZXF1ZXN0SW5mbywgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoVXJsID0gdGhpcy51cmwoaW5wdXQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgaW5pdCA9IGluaXQgPz8ge307XG4gICAgICAgICAgICAgICAgaW5pdC5oZWFkZXJzID0gaW5pdC5oZWFkZXJzID8/IHt9O1xuICAgICAgICAgICAgICAgIGluaXQuaGVhZGVyc1tcIkNhY2hlLUNvbnRyb2xcIl0gPSBcIm5vLWNhY2hlLCBuby1zdG9yZVwiO1xuICAgICAgICAgICAgICAgIGluaXQuaGVhZGVyc1tcIlByYWdtYVwiXSA9IFwibm8tY2FjaGVcIjtcbiAgICAgICAgICAgICAgICBpbml0LmhlYWRlcnNbXCJFeHBpcmVzXCJdID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlcihpbml0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEltcGwoZmV0Y2hVcmwsIGluaXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZXRjaFVybCA9IHRoaXMudXJsKGlucHV0LnVybCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdEluaXQ6IFJlcXVlc3RJbml0ID0ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbXCJDYWNoZS1Db250cm9sXCJdOiBcIm5vLWNhY2hlLCBuby1zdG9yZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgW1wiUHJhZ21hXCJdOiBcIm5vLWNhY2hlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBbXCJFeHBpcmVzXCJdOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmlucHV0LmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbDogaW5wdXQuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZTogaW5wdXQuY2FjaGUsXG4gICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBpbnB1dC5jcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICAgICAgaW50ZWdyaXR5OiBpbnB1dC5pbnRlZ3JpdHksXG4gICAgICAgICAgICAgICAgICAgIGtlZXBhbGl2ZTogaW5wdXQua2VlcGFsaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IGlucHV0Lm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogaW5wdXQubW9kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6IGlucHV0LnJlZGlyZWN0LFxuICAgICAgICAgICAgICAgICAgICByZWZlcnJlcjogaW5wdXQucmVmZXJyZXIsXG4gICAgICAgICAgICAgICAgICAgIHJlZmVycmVyUG9saWN5OiBpbnB1dC5yZWZlcnJlclBvbGljeSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJbml0ID0gdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyKHJlcXVlc3RJbml0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaEltcGwoZmV0Y2hVcmwsIHJlcXVlc3RJbml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZldGNoV2l0aE9wdGlvbnM7XG4gICAgfVxufVxuXG5jbGFzcyBIdHRwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlcikge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJIdHRwRXJyb3JcIjtcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbXX0=
@@ -20,18 +20,9 @@ function clamp(value, min, max) {
20
20
  }
21
21
 
22
22
  function clampUInt(value, min, max) {
23
- if (value > max) {
24
- // @ts-ignore
25
- return max;
26
- }
27
-
28
- if (value < min) {
29
- // @ts-ignore
30
- return min;
31
- } // @ts-ignore
23
+ const result = clamp(value, min, max); // @ts-ignore
32
24
 
33
-
34
- return value;
25
+ return result;
35
26
  }
36
27
 
37
28
  function sign(value) {
@@ -45,4 +36,4 @@ function sign(value) {
45
36
 
46
37
  return 0;
47
38
  }
48
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9JbnRSYW5nZVV0aWxzLnRzIl0sIm5hbWVzIjpbImNsYW1wIiwidmFsdWUiLCJtaW4iLCJtYXgiLCJjbGFtcFVJbnQiLCJzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZTyxTQUFTQSxLQUFULENBQWVDLEtBQWYsRUFBOEJDLEdBQTlCLEVBQTJDQyxHQUEzQyxFQUFnRTtBQUNuRSxNQUFJRixLQUFLLEdBQUdFLEdBQVosRUFBaUI7QUFDYixXQUFPQSxHQUFQO0FBQ0g7O0FBQ0QsTUFBSUYsS0FBSyxHQUFHQyxHQUFaLEVBQWlCO0FBQ2IsV0FBT0EsR0FBUDtBQUNIOztBQUNELFNBQU9ELEtBQVA7QUFDSDs7QUFFTSxTQUFTRyxTQUFULENBQ0hILEtBREcsRUFFSEMsR0FGRyxFQUdIQyxHQUhHLEVBSW9CO0FBQ3ZCLE1BQUlGLEtBQUssR0FBR0UsR0FBWixFQUFpQjtBQUNiO0FBQ0EsV0FBT0EsR0FBUDtBQUNIOztBQUNELE1BQUlGLEtBQUssR0FBR0MsR0FBWixFQUFpQjtBQUNiO0FBQ0EsV0FBT0EsR0FBUDtBQUNILEdBUnNCLENBU3ZCOzs7QUFDQSxTQUFPRCxLQUFQO0FBQ0g7O0FBRU0sU0FBU0ksSUFBVCxDQUFjSixLQUFkLEVBQXlDO0FBQzVDLE1BQUlBLEtBQUssR0FBRyxDQUFaLEVBQWU7QUFDWCxXQUFPLENBQUMsQ0FBUjtBQUNIOztBQUNELE1BQUlBLEtBQUssR0FBRyxDQUFaLEVBQWU7QUFDWCxXQUFPLENBQVA7QUFDSDs7QUFDRCxTQUFPLENBQVA7QUFDSCIsInNvdXJjZXNDb250ZW50IjpbInR5cGUgTGVuZ3RoPFQgZXh0ZW5kcyB1bmtub3duW10+ID0gVCBleHRlbmRzIHsgbGVuZ3RoOiBpbmZlciBMIH0gPyAoTCBleHRlbmRzIG51bWJlciA/IEwgOiBuZXZlcikgOiBuZXZlcjtcblxudHlwZSBCdWlsZFR1cGxlPEwgZXh0ZW5kcyBudW1iZXIsIFQgZXh0ZW5kcyB1bmtub3duW10gPSBbXT4gPSBUIGV4dGVuZHMgeyBsZW5ndGg6IEwgfVxuICAgID8gVFxuICAgIDogQnVpbGRUdXBsZTxMLCBbLi4uVCwgdW5rbm93bl0+O1xuXG50eXBlIEFkZDxBIGV4dGVuZHMgbnVtYmVyLCBCIGV4dGVuZHMgbnVtYmVyPiA9IExlbmd0aDxbLi4uQnVpbGRUdXBsZTxBPiwgLi4uQnVpbGRUdXBsZTxCPl0+O1xuXG50eXBlIEludFJhbmdlPFRNaW4gZXh0ZW5kcyBudW1iZXIsIFRNYXggZXh0ZW5kcyBudW1iZXI+ID0gVE1pbiBleHRlbmRzIFRNYXhcbiAgICA/IFRNaW5cbiAgICA6IFRNaW4gfCBJbnRSYW5nZTxBZGQ8VE1pbiwgMT4sIFRNYXg+O1xuXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gICAgaWYgKHZhbHVlIDwgbWluKSB7XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wVUludDxUTGVmdCBleHRlbmRzIG51bWJlciwgVFJpZ2h0IGV4dGVuZHMgbnVtYmVyPihcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIG1pbjogVExlZnQsXG4gICAgbWF4OiBUUmlnaHRcbik6IEludFJhbmdlPFRMZWZ0LCBUUmlnaHQ+IHtcbiAgICBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbiAgICBpZiAodmFsdWUgPCBtaW4pIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbih2YWx1ZTogbnVtYmVyKTogLTEgfCAwIHwgMSB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuIl19
39
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9JbnRSYW5nZVV0aWxzLnRzIl0sIm5hbWVzIjpbImNsYW1wIiwidmFsdWUiLCJtaW4iLCJtYXgiLCJjbGFtcFVJbnQiLCJyZXN1bHQiLCJzaWduIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZTyxTQUFTQSxLQUFULENBQWVDLEtBQWYsRUFBOEJDLEdBQTlCLEVBQTJDQyxHQUEzQyxFQUFnRTtBQUNuRSxNQUFJRixLQUFLLEdBQUdFLEdBQVosRUFBaUI7QUFDYixXQUFPQSxHQUFQO0FBQ0g7O0FBQ0QsTUFBSUYsS0FBSyxHQUFHQyxHQUFaLEVBQWlCO0FBQ2IsV0FBT0EsR0FBUDtBQUNIOztBQUNELFNBQU9ELEtBQVA7QUFDSDs7QUFFTSxTQUFTRyxTQUFULENBQ0hILEtBREcsRUFFSEMsR0FGRyxFQUdIQyxHQUhHLEVBSW9CO0FBQ3ZCLFFBQU1FLE1BQWMsR0FBR0wsS0FBSyxDQUFDQyxLQUFELEVBQVFDLEdBQVIsRUFBYUMsR0FBYixDQUE1QixDQUR1QixDQUV2Qjs7QUFDQSxTQUFPRSxNQUFQO0FBQ0g7O0FBRU0sU0FBU0MsSUFBVCxDQUFjTCxLQUFkLEVBQXlDO0FBQzVDLE1BQUlBLEtBQUssR0FBRyxDQUFaLEVBQWU7QUFDWCxXQUFPLENBQUMsQ0FBUjtBQUNIOztBQUNELE1BQUlBLEtBQUssR0FBRyxDQUFaLEVBQWU7QUFDWCxXQUFPLENBQVA7QUFDSDs7QUFDRCxTQUFPLENBQVA7QUFDSCIsInNvdXJjZXNDb250ZW50IjpbInR5cGUgTGVuZ3RoPFQgZXh0ZW5kcyB1bmtub3duW10+ID0gVCBleHRlbmRzIHsgbGVuZ3RoOiBpbmZlciBMIH0gPyAoTCBleHRlbmRzIG51bWJlciA/IEwgOiBuZXZlcikgOiBuZXZlcjtcblxudHlwZSBCdWlsZFR1cGxlPEwgZXh0ZW5kcyBudW1iZXIsIFQgZXh0ZW5kcyB1bmtub3duW10gPSBbXT4gPSBUIGV4dGVuZHMgeyBsZW5ndGg6IEwgfVxuICAgID8gVFxuICAgIDogQnVpbGRUdXBsZTxMLCBbLi4uVCwgdW5rbm93bl0+O1xuXG50eXBlIEFkZDxBIGV4dGVuZHMgbnVtYmVyLCBCIGV4dGVuZHMgbnVtYmVyPiA9IExlbmd0aDxbLi4uQnVpbGRUdXBsZTxBPiwgLi4uQnVpbGRUdXBsZTxCPl0+O1xuXG5leHBvcnQgdHlwZSBJbnRSYW5nZTxUTWluIGV4dGVuZHMgbnVtYmVyLCBUTWF4IGV4dGVuZHMgbnVtYmVyPiA9IFRNaW4gZXh0ZW5kcyBUTWF4XG4gICAgPyBUTWluXG4gICAgOiBUTWluIHwgSW50UmFuZ2U8QWRkPFRNaW4sIDE+LCBUTWF4PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHZhbHVlID4gbWF4KSB7XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA8IG1pbikge1xuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcFVJbnQ8VExlZnQgZXh0ZW5kcyBudW1iZXIsIFRSaWdodCBleHRlbmRzIG51bWJlcj4oXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBtaW46IFRMZWZ0LFxuICAgIG1heDogVFJpZ2h0XG4pOiBJbnRSYW5nZTxUTGVmdCwgVFJpZ2h0PiB7XG4gICAgY29uc3QgcmVzdWx0OiBudW1iZXIgPSBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2lnbih2YWx1ZTogbnVtYmVyKTogLTEgfCAwIHwgMSB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA+IDApIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuIl19
@@ -144,7 +144,7 @@ class IterUtils {
144
144
  var _items$;
145
145
 
146
146
  if (items.length !== 1) {
147
- throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : "Sequence must contain exactly single element");
147
+ throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : `Sequence must contain exactly single element, but got ${items.length}`);
148
148
  }
149
149
 
150
150
  return (_items$ = items[0]) !== null && _items$ !== void 0 ? _items$ : (0, _TypingUtils.reject)();
@@ -153,14 +153,14 @@ class IterUtils {
153
153
 
154
154
  for (const item of items) {
155
155
  if (singleElement !== EmptySingleElement) {
156
- throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : "Sequence must contain exactly single element");
156
+ throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : `Sequence must contain exactly single element, but got at least 2`);
157
157
  }
158
158
 
159
159
  singleElement = item;
160
160
  }
161
161
 
162
162
  if (singleElement === EmptySingleElement) {
163
- throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : "Sequence must contain exactly single element");
163
+ throw new Error(singleAssertMessage !== null && singleAssertMessage !== void 0 ? singleAssertMessage : "Sequence must contain exactly single element, but got 0");
164
164
  }
165
165
 
166
166
  return singleElement;
@@ -234,12 +234,15 @@ class IterUtils {
234
234
  return minValue;
235
235
  }
236
236
 
237
- static *range(itemCount) {
237
+ static *range(inStartOrCount, inItemCount) {
238
+ const start = inItemCount === undefined ? 0 : inStartOrCount;
239
+ const itemCount = inItemCount === undefined ? inStartOrCount : inItemCount;
240
+
238
241
  if (itemCount < 0) {
239
242
  throw new _Errors.InvalidArgumentError("itemCount", "itemCount must be a non negative number");
240
243
  }
241
244
 
242
- for (let i = 0; i < itemCount; i++) {
245
+ for (let i = start; i < start + itemCount; i++) {
243
246
  yield i;
244
247
  }
245
248
  }
@@ -290,14 +293,17 @@ class IterUtils {
290
293
  }
291
294
  }
292
295
 
293
- static distinctBy(items, idSelector) {
294
- const map = {};
296
+ static *distinctBy(items, idSelector) {
297
+ const set = new Set();
295
298
 
296
299
  for (const item of items) {
297
- map[idSelector(item)] = item;
298
- }
300
+ const id = idSelector(item);
299
301
 
300
- return [...iterateValues(map)];
302
+ if (!set.has(id)) {
303
+ set.add(id);
304
+ yield item;
305
+ }
306
+ }
301
307
  }
302
308
 
303
309
  }
@@ -305,4 +311,4 @@ class IterUtils {
305
311
  exports.IterUtils = IterUtils;
306
312
  IterUtils.count = count;
307
313
  IterUtils.concat = concat;
308
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9JdGVyYWJsZVV0aWxzLnRzIl0sIm5hbWVzIjpbInJldmVyc2VBcnJheSIsImFycmF5IiwiaSIsImxlbmd0aCIsInRvQXN5bmNJdGVyYXRvciIsImdlbmVyYXRvciIsIkFzeW5jSXRlcmF0b3IiLCJmcm9tIiwiZmluZExhc3QiLCJpdGVtcyIsImNvbmRpdGlvbiIsInJlc3VsdCIsIml0ZW0iLCJjb25jYXQiLCJpdGVyYWJsZXMiLCJpdGVyYWJsZUl0ZW0iLCJpdGVyYXRlVmFsdWVzIiwib2JqIiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXRlcmF0ZUtleXMiLCJpdGVyYXRlRW50cmllcyIsImNvdW50IiwiX2l0ZW0iLCJFbXB0eVNpbmdsZUVsZW1lbnQiLCJTeW1ib2wiLCJmb3IiLCJOb1ZhbHVlTWFya2VyIiwiSXRlclV0aWxzIiwiaXNFbXB0eSIsIml0ZXJhYmxlIiwic29ydEJ5Iiwic2VsZWN0b3IiLCJzb3J0IiwiYUl0ZW0iLCJiSXRlbSIsImxlZnRWYWx1ZSIsInJpZ2h0VmFsdWUiLCJsYXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibGFzdEl0ZW0iLCJmaXJzdCIsImZpcnN0SXRlbSIsInNpbmdsZSIsInNpbmdsZUFzc2VydE1lc3NhZ2UiLCJFcnJvciIsInNpbmdsZUVsZW1lbnQiLCJpbmRleCIsInNraXBMYXN0Iiwic2tpcENvdW50IiwicHJldkl0ZW1zIiwiZmlsbCIsInJlc3VsdEl0ZW0iLCJjdXJyZW50SW5kZXgiLCJtaW5CeSIsImNvbXBhcmVGdW5jIiwibWluVmFsdWUiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1pbkJ5T3JVbmRlZmluZWQiLCJ1bmRlZmluZWQiLCJyYW5nZSIsIml0ZW1Db3VudCIsImludGVyc3BlcnNlIiwiaW50ZXJzcGVyc2VGbiIsImZsYXRNYXAiLCJ4IiwiemlwIiwiaXRlcmF0b3JzIiwibWFwIiwiaXQiLCJJdGVyYXRvciIsImhhc1VuZG9uZUl0ZXJhdG9ycyIsInJlc3VsdEVudHJ5IiwiaXRlcmF0b3IiLCJwdXNoIiwicmVzdWx0VmFsdWUiLCJuZXh0IiwiZG9uZSIsInZhbHVlIiwiZGlzdGluY3RCeSIsImlkU2VsZWN0b3IiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztBQUVPLFVBQVVBLFlBQVYsQ0FBMEJDLEtBQTFCLEVBQW9FO0FBQ3ZFLE9BQUssSUFBSUMsQ0FBQyxHQUFHRCxLQUFLLENBQUNFLE1BQU4sR0FBZSxDQUE1QixFQUErQkQsQ0FBQyxJQUFJLENBQXBDLEVBQXVDQSxDQUFDLEVBQXhDLEVBQTRDO0FBQ3hDO0FBQ0EsVUFBTUQsS0FBSyxDQUFDQyxDQUFELENBQVg7QUFDSDtBQUNKOztBQUVNLFNBQVNFLGVBQVQsQ0FBNEJDLFNBQTVCLEVBQTBGO0FBQzdGLFNBQU9DLGFBQWEsQ0FBQ0MsSUFBZCxDQUFtQkYsU0FBUyxFQUE1QixDQUFQO0FBQ0g7O0FBRU0sU0FBU0csUUFBVCxDQUFxQkMsS0FBckIsRUFBeUNDLFNBQXpDLEVBQXlGO0FBQzVGLE1BQUlDLE1BQUo7O0FBQ0EsT0FBSyxNQUFNQyxJQUFYLElBQW1CSCxLQUFuQixFQUEwQjtBQUN0QixRQUFJQyxTQUFTLENBQUNFLElBQUQsQ0FBYixFQUFxQjtBQUNqQkQsTUFBQUEsTUFBTSxHQUFHQyxJQUFUO0FBQ0g7QUFDSjs7QUFDRCxTQUFPRCxNQUFQO0FBQ0g7O0FBRU0sVUFBVUUsTUFBVixDQUFvQixHQUFHQyxTQUF2QixFQUEyRTtBQUM5RSxPQUFLLE1BQU1DLFlBQVgsSUFBMkJELFNBQTNCLEVBQXNDO0FBQ2xDLFdBQU9DLFlBQVA7QUFDSDtBQUNKOztBQUVNLFVBQVVDLGFBQVYsQ0FBaUVDLEdBQWpFLEVBQXlHO0FBQzVHLE9BQUssTUFBTUMsR0FBWCxJQUFrQkQsR0FBbEIsRUFBdUI7QUFDbkIsUUFBSUUsTUFBTSxDQUFDQyxTQUFQLENBQWlCQyxjQUFqQixDQUFnQ0MsSUFBaEMsQ0FBcUNMLEdBQXJDLEVBQTBDQyxHQUExQyxD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Y0FBTUMsV0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUFFdUIsU0FBVk8sVUFBVSxDQUFJMUUsS0FBSixFQUF3QjJFLFVBQXhCLEVBQThEO0FBQ2xGLFVBQU1aLEdBQTBCLEdBQUcsRUFBbkM7O0FBQ0EsU0FBSyxNQUFNNUQsSUFBWCxJQUFtQkgsS0FBbkIsRUFBMEI7QUFDdEIrRCxNQUFBQSxHQUFHLENBQUNZLFVBQVUsQ0FBQ3hFLElBQUQsQ0FBWCxDQUFILEdBQXdCQSxJQUF4QjtBQUNIOztBQUNELFdBQU8sQ0FBQyxHQUFHSSxhQUFhLENBQUN3RCxHQUFELENBQWpCLENBQVA7QUFDSDs7QUEvTGtCOzs7QUFBVnpDLFMsQ0FDS04sSyxHQUFRQSxLO0FBRGJNLFMsQ0FFS2xCLE0sR0FBU0EsTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pbkxlbmd0aEFycmF5LCByZWplY3QgfSBmcm9tIFwiLi9UeXBpbmdVdGlsc1wiO1xuaW1wb3J0IHsgQ29tcGFyZUZ1bmMgfSBmcm9tIFwiLi9Db21wYXJlcnNcIjtcbmltcG9ydCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gZnJvbSBcIi4vRXJyb3JzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiogcmV2ZXJzZUFycmF5PFQ+KGFycmF5OiByZWFkb25seSBUW10pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgeWllbGQgYXJyYXlbaV0hO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQXN5bmNJdGVyYXRvcjxUPihnZW5lcmF0b3I6ICgpID0+IEFzeW5jR2VuZXJhdG9yPFQ+KTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gQXN5bmNJdGVyYXRvci5mcm9tKGdlbmVyYXRvcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgY29uZGl0aW9uOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIGxldCByZXN1bHQ6IFQgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24oaXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBjb25jYXQ8VD4oLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTxUPj4pOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICBmb3IgKGNvbnN0IGl0ZXJhYmxlSXRlbSBvZiBpdGVyYWJsZXMpIHtcbiAgICAgICAgeWllbGQqIGl0ZXJhYmxlSXRlbTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZVZhbHVlczxUSyBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCB8IG51bWJlciwgVFY+KG9iajogeyBba2V5IGluIFRLXTogVFYgfSk6IEl0ZXJhYmxlPFRWPiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICB5aWVsZCBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPEV4dHJhY3Q8a2V5b2YgVE8sIHN0cmluZz4+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzPFRWPihvYmo6IFJlYWRvbmx5PHsgW2tleTogc3RyaW5nXTogVFYgfT4pOiBJdGVyYWJsZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVLZXlzKG9iajogUmVhZG9ubHk8e30+KTogSXRlcmFibGU8c3RyaW5nPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUtleXM8VEsgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgfCBudW1iZXI+KG9iajogeyBba2V5IGluIFRLXTogdW5rbm93biB9KTogSXRlcmFibGU8VEs+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIHlpZWxkIGtleTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVFbnRyaWVzPFRPPihvYmo6IFJlYWRvbmx5PFRPPik6IEl0ZXJhYmxlPFtFeHRyYWN0PGtleW9mIFRPLCBzdHJpbmc+LCBUT1trZXlvZiBUT11dPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllczxUVj4ob2JqOiBSZWFkb25seTx7IFtrZXk6IHN0cmluZ106IFRWIH0+KTogSXRlcmFibGU8W3N0cmluZywgVFZdPjtcbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRW50cmllcyhvYmo6IFJlYWRvbmx5PHt9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIHVua25vd25dPjtcbmV4cG9ydCBmdW5jdGlvbiogaXRlcmF0ZUVudHJpZXM8VFY+KG9iajogUmVhZG9ubHk8eyBba2V5OiBzdHJpbmddOiBUViB9Pik6IEl0ZXJhYmxlPFtzdHJpbmcsIFRWXT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgIHlpZWxkIFtrZXksIG9ialtrZXldIV07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3VudDxUPihpdGVtczogSXRlcmFibGU8VD4pOiBudW1iZXIge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAoY29uc3QgX2l0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgcmVzdWx0Kys7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IEVtcHR5U2luZ2xlRWxlbWVudCA9IFN5bWJvbC5mb3IoXCJFbXB0eVNpbmdsZUVsZW1lbnRcIik7XG5jb25zdCBOb1ZhbHVlTWFya2VyID0gU3ltYm9sLmZvcihcIk5vVmFsdWVNYXJrZXJcIik7XG5cbmV4cG9ydCBjbGFzcyBJdGVyVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgY291bnQgPSBjb3VudDtcbiAgICBwdWJsaWMgc3RhdGljIGNvbmNhdCA9IGNvbmNhdDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNFbXB0eTxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBfaXRlbSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc29ydEJ5PFQ+KGl0ZW1zOiByZWFkb25seSBUW10sIHNlbGVjdG9yOiAoaXRlbTogVCkgPT4gc3RyaW5nKTogVFtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLml0ZW1zXTtcbiAgICAgICAgcmVzdWx0LnNvcnQoKGFJdGVtLCBiSXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGVmdFZhbHVlID0gc2VsZWN0b3IoYUl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRWYWx1ZSA9IHNlbGVjdG9yKGJJdGVtKTtcbiAgICAgICAgICAgIGlmIChsZWZ0VmFsdWUgPT09IHJpZ2h0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdFZhbHVlIDwgcmlnaHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbGFzdDxUPihpdGVtczogTWluTGVuZ3RoQXJyYXk8VCwgMT4pOiBUO1xuICAgIHB1YmxpYyBzdGF0aWMgbGFzdDxUPihpdGVtczogSXRlcmFibGU8VD4gfCByZWFkb25seSBUW10pOiB1bmRlZmluZWQgfCBUO1xuICAgIHB1YmxpYyBzdGF0aWMgbGFzdDxUPihpdGVtczogSXRlcmFibGU8VD4gfCByZWFkb25seSBUW10pOiB1bmRlZmluZWQgfCBUIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhc3RJdGVtOiBUIHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGxhc3RJdGVtID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFzdEl0ZW07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmaXJzdDxUPihpdGVtczogTWluTGVuZ3RoQXJyYXk8VCwgMT4pOiBUO1xuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVDtcbiAgICBwdWJsaWMgc3RhdGljIGZpcnN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiB8IHJlYWRvbmx5IFRbXSk6IHVuZGVmaW5lZCB8IFQge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtc1swXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlyc3RJdGVtOiBUIHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGZpcnN0SXRlbSA9IGl0ZW07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlyc3RJdGVtO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2luZ2xlPFQ+KGl0ZW1zOiByZWFkb25seSBUW10gfCBJdGVyYWJsZTxUPiwgc2luZ2xlQXNzZXJ0TWVzc2FnZT86IHN0cmluZyk6IFQge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2luZ2xlQXNzZXJ0TWVzc2FnZSA/PyBcIlNlcXVlbmNlIG11c3QgY29udGFpbiBleGFjdGx5IHNpbmdsZSBlbGVtZW50XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zWzBdID8/IHJlamVjdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHNpbmdsZUVsZW1lbnQ6IFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50ID0gRW1wdHlTaW5nbGVFbGVtZW50O1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNpbmdsZUVsZW1lbnQgIT09IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2luZ2xlQXNzZXJ0TWVzc2FnZSA/PyBcIlNlcXVlbmNlIG11c3QgY29udGFpbiBleGFjdGx5IHNpbmdsZSBlbGVtZW50XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaW5nbGVFbGVtZW50ID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaW5nbGVFbGVtZW50ID09PSBFbXB0eVNpbmdsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2luZ2xlQXNzZXJ0TWVzc2FnZSA/PyBcIlNlcXVlbmNlIG11c3QgY29udGFpbiBleGFjdGx5IHNpbmdsZSBlbGVtZW50XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNpbmdsZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICppdGVyYXRlRW50cmllczxUPihpdGVtczogcmVhZG9ubHkgVFtdIHwgVFtdIHwgSXRlcmFibGU8VD4pOiBJdGVyYWJsZTxbbnVtYmVyLCBUXT4ge1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIHlpZWxkIFtpbmRleCwgaXRlbV07XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqc2tpcExhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBza2lwQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPFQ+IHtcbiAgICAgICAgaWYgKHNraXBDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW1zO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZJdGVtczogQXJyYXk8VCB8IHR5cGVvZiBFbXB0eVNpbmdsZUVsZW1lbnQ+ID0gbmV3IEFycmF5KHNraXBDb3VudCkuZmlsbChFbXB0eVNpbmdsZUVsZW1lbnQpO1xuICAgICAgICBsZXQgcmVzdWx0SXRlbTogVCB8IHR5cGVvZiBFbXB0eVNpbmdsZUVsZW1lbnQgPSBFbXB0eVNpbmdsZUVsZW1lbnQ7XG4gICAgICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Ig0JIg0L7QsdGJ0LXQvCwg0YHRgtGA0L7QutCwINCy0YvRiNC1INCz0LDRgNCw0L3RgtC40YDRg9C10YIg0LTQu9C40L3RgyDQvNCw0YHRgdC40LLQsFxuICAgICAgICAgICAgcmVzdWx0SXRlbSA9IHByZXZJdGVtc1tjdXJyZW50SW5kZXhdO1xuICAgICAgICAgICAgcHJldkl0ZW1zW2N1cnJlbnRJbmRleF0gPSBpdGVtO1xuICAgICAgICAgICAgY3VycmVudEluZGV4ID0gKGN1cnJlbnRJbmRleCArIDEpICUgc2tpcENvdW50O1xuICAgICAgICAgICAgaWYgKHJlc3VsdEl0ZW0gIT0gRW1wdHlTaW5nbGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgeWllbGQgcmVzdWx0SXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbWluQnk8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IFRbXSB8IEl0ZXJhYmxlPFQ+LCBjb21wYXJlRnVuYzogQ29tcGFyZUZ1bmM8VD4pOiBUIHtcbiAgICAgICAgbGV0IG1pblZhbHVlOiB0eXBlb2YgTm9WYWx1ZU1hcmtlciB8IFQgPSBOb1ZhbHVlTWFya2VyO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChtaW5WYWx1ZSA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgICAgIG1pblZhbHVlID0gaXRlbTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcGFyZUZ1bmMoaXRlbSwgbWluVmFsdWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG1pblZhbHVlID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWluVmFsdWUgPT09IE5vVmFsdWVNYXJrZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIml0ZW1zXCIsIFwiSXRlbXMgc2hvdWxkIGJlIG5vdCBlbXB0eSBsaXN0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5WYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1pbkJ5T3JVbmRlZmluZWQ8VD4oXG4gICAgICAgIGl0ZW1zOiByZWFkb25seSBUW10gfCBUW10gfCBJdGVyYWJsZTxUPixcbiAgICAgICAgY29tcGFyZUZ1bmM6IENvbXBhcmVGdW5jPFQ+XG4gICAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBtaW5WYWx1ZTogdHlwZW9mIE5vVmFsdWVNYXJrZXIgfCBUID0gTm9WYWx1ZU1hcmtlcjtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWluVmFsdWUgPT09IE5vVmFsdWVNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVGdW5jKGl0ZW0sIG1pblZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5WYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljICpyYW5nZShpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj4ge1xuICAgICAgICBpZiAoaXRlbUNvdW50IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiaXRlbUNvdW50XCIsIFwiaXRlbUNvdW50IG11c3QgYmUgYSBub24gbmVnYXRpdmUgbnVtYmVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHlpZWxkIGk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSDQktGB0YLQsNCy0LvRj9C10YIg0LzQtdC20LTRgyDRjdC70LXQvNC10L3RgtCw0LzQuCDQvNCw0YHRgdC40LLQsCDQt9Cw0LTQsNC90L3Ri9C5INGN0LvQtdC80LXQvdGCINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90L7QstGL0Lkg0LzQsNGB0YHQuNCyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbnRlcnNwZXJzZTxUSSwgVFM+KGl0ZW1zOiBUSVtdLCBpdGVtOiBUUyk6IEFycmF5PFRJIHwgVFM+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJzcGVyc2VGbihpdGVtcywgKCkgPT4gaXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkg0JLRgdGC0LDQstC70Y/QtdGCINC80LXQttC00YMg0Y3Qu9C10LzQtdC90YLQsNC80Lgg0LzQsNGB0YHQuNCy0LAg0Y3Qu9C10LzQtdC90YIsINGB0L7Qt9C00LDQstCw0LXQvNGL0Lkg0YTRg9C90LrRhtC40LXQuSwg0Lgg0LLQvtC30LLRgNCw0YnQsNC10YIg0L3QvtCy0YvQuSDQvNCw0YHRgdC40LJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGludGVyc3BlcnNlRm48VEksIFRTPihpdGVtczogVElbXSwgaXRlbTogKG5leHRJdGVtOiBUSSwgaW5kZXg6IG51bWJlcikgPT4gVFMpOiBBcnJheTxUSSB8IFRTPiB7XG4gICAgICAgIHJldHVybiBpdGVtcy5mbGF0TWFwKCh4LCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gW3hdIDogW2l0ZW0oeCwgaW5kZXgpLCB4XSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgemlwPFQxLCBUMj4oaXRlbXMxOiBJdGVyYWJsZTxUMT4sIGl0ZW1zMjogSXRlcmFibGU8VDI+KTogSXRlcmFibGU8W1QxIHwgdW5kZWZpbmVkLCBUMiB8IHVuZGVmaW5lZF0+O1xuICAgIHB1YmxpYyBzdGF0aWMgKnppcCguLi5pdGVyYWJsZXM6IEFycmF5PEl0ZXJhYmxlPHVua25vd24+Pik6IEl0ZXJhYmxlPHVua25vd25bXT4ge1xuICAgICAgICBjb25zdCBpdGVyYXRvcnM6IEFycmF5PEl0ZXJhdG9yPHVua25vd24+IHwgdHlwZW9mIE5vVmFsdWVNYXJrZXI+ID0gaXRlcmFibGVzLm1hcChpdCA9PiBJdGVyYXRvci5mcm9tKGl0KSk7XG4gICAgICAgIGxldCBoYXNVbmRvbmVJdGVyYXRvcnMgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoaGFzVW5kb25lSXRlcmF0b3JzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRFbnRyeSA9IFtdO1xuICAgICAgICAgICAgaGFzVW5kb25lSXRlcmF0b3JzID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpLCBpdGVyYXRvcl0gb2YgdGhpcy5pdGVyYXRlRW50cmllcyhpdGVyYXRvcnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdEVudHJ5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFZhbHVlLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEVudHJ5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yc1tpXSA9IE5vVmFsdWVNYXJrZXI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHJlc3VsdFZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1VuZG9uZUl0ZXJhdG9ycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzVW5kb25lSXRlcmF0b3JzKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgcmVzdWx0RW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRpc3RpbmN0Qnk8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBpZFNlbGVjdG9yOiAoaXRlbTogVCkgPT4gc3RyaW5nKTogVFtdIHtcbiAgICAgICAgY29uc3QgbWFwOiB7IFtoYXNoOiBzdHJpbmddOiBUIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBtYXBbaWRTZWxlY3RvcihpdGVtKV0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbLi4uaXRlcmF0ZVZhbHVlcyhtYXApXTtcbiAgICB9XG59XG4iXX0=
314
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9JdGVyYWJsZVV0aWxzLnRzIl0sIm5hbWVzIjpbInJldmVyc2VBcnJheSIsImFycmF5IiwiaSIsImxlbmd0aCIsInRvQXN5bmNJdGVyYXRvciIsImdlbmVyYXRvciIsIkFzeW5jSXRlcmF0b3IiLCJmcm9tIiwiZmluZExhc3QiLCJpdGVtcyIsImNvbmRpdGlvbiIsInJlc3VsdCIsIml0ZW0iLCJjb25jYXQiLCJpdGVyYWJsZXMiLCJpdGVyYWJsZUl0ZW0iLCJpdGVyYXRlVmFsdWVzIiwib2JqIiwia2V5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaXRlcmF0ZUtleXMiLCJpdGVyYXRlRW50cmllcyIsImNvdW50IiwiX2l0ZW0iLCJFbXB0eVNpbmdsZUVsZW1lbnQiLCJTeW1ib2wiLCJmb3IiLCJOb1ZhbHVlTWFya2VyIiwiSXRlclV0aWxzIiwiaXNFbXB0eSIsIml0ZXJhYmxlIiwic29ydEJ5Iiwic2VsZWN0b3IiLCJzb3J0IiwiYUl0ZW0iLCJiSXRlbSIsImxlZnRWYWx1ZSIsInJpZ2h0VmFsdWUiLCJsYXN0IiwiQXJyYXkiLCJpc0FycmF5IiwibGFzdEl0ZW0iLCJmaXJzdCIsImZpcnN0SXRlbSIsInNpbmdsZSIsInNpbmdsZUFzc2VydE1lc3NhZ2UiLCJFcnJvciIsInNpbmdsZUVsZW1lbnQiLCJpbmRleCIsInNraXBMYXN0Iiwic2tpcENvdW50IiwicHJldkl0ZW1zIiwiZmlsbCIsInJlc3VsdEl0ZW0iLCJjdXJyZW50SW5kZXgiLCJtaW5CeSIsImNvbXBhcmVGdW5jIiwibWluVmFsdWUiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsIm1pbkJ5T3JVbmRlZmluZWQiLCJ1bmRlZmluZWQiLCJyYW5nZSIsImluU3RhcnRPckNvdW50IiwiaW5JdGVtQ291bnQiLCJzdGFydCIsIml0ZW1Db3VudCIsImludGVyc3BlcnNlIiwiaW50ZXJzcGVyc2VGbiIsImZsYXRNYXAiLCJ4IiwiemlwIiwiaXRlcmF0b3JzIiwibWFwIiwiaXQiLCJJdGVyYXRvciIsImhhc1VuZG9uZUl0ZXJhdG9ycyIsInJlc3VsdEVudHJ5IiwiaXRlcmF0b3IiLCJwdXNoIiwicmVzdWx0VmFsdWUiLCJuZXh0IiwiZG9uZSIsInZhbHVlIiwiZGlzdGluY3RCeSIsImlkU2VsZWN0b3IiLCJzZXQiLCJTZXQiLCJpZCIsImhhcyIsImFkZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7O0FBRU8sVUFBVUEsWUFBVixDQUEwQkMsS0FBMUIsRUFBb0U7QUFDdkUsT0FBSyxJQUFJQyxDQUFDLEdBQUdELEtBQUssQ0FBQ0UsTUFBTixHQUFlLENBQTVCLEVBQStCRCxDQUFDLElBQUksQ0FBcEMsRUFBdUNBLENBQUMsRUFBeEMsRUFBNEM7QUFDeEM7QUFDQSxVQUFNRCxLQUFLLENBQUNDLENBQUQsQ0FBWDtBQUNIO0FBQ0o7O0FBRU0sU0FBU0UsZUFBVCxDQUE0QkMsU0FBNUIsRUFBMEY7QUFDN0YsU0FBT0MsYUFBYSxDQUFDQyxJQUFkLENBQW1CRixTQUFTLEVBQTVCLENBQVA7QUFDSDs7QUFFTSxTQUFTRyxRQUFULENBQXFCQyxLQUFyQixFQUF5Q0MsU0FBekMsRUFBeUY7QUFDNUYsTUFBSUMsTUFBSjs7QUFDQSxPQUFLLE1BQU1DLElBQVgsSUFBbUJILEtBQW5CLEVBQTBCO0FBQ3RCLFFBQUlDLFNBQVMsQ0FBQ0UsSUFBRCxDQUFiLEVBQXFCO0FBQ2pCRCxNQUFBQSxNQUFNLEdBQUdDLElBQVQ7QUFDSDtBQUNKOztBQUNELFNBQU9ELE1BQVA7QUFDSDs7QUFFTSxVQUFVRSxNQUFWLENBQW9CLEdBQUdDLFNBQXZCLEVBQTJFO0FBQzlFLE9BQUssTUFBTUMsWUFBWCxJQUEyQkQsU0FBM0IsRUFBc0M7QUFDbEMsV0FBT0MsWUFBUDtBQUNIO0FBQ0o7O0FBRU0sVUFBVUMsYUFBVixDQUFpRUMsR0FBakUsRUFBeUc7QUFDNUcsT0FBSyxNQUFNQyxHQUFYLElBQWtCRCxHQUFsQixFQUF1QjtBQUNuQixRQUFJRSxN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Q0FBQ0UsSUFBaEIsRUFBc0I7QUFDbEJMLFlBQUFBLFdBQVcsQ0FBQ0UsSUFBWixDQUFpQmxCLFNBQWpCO0FBQ0FXLFlBQUFBLFNBQVMsQ0FBQ3hFLENBQUQsQ0FBVCxHQUFlNEIsYUFBZjtBQUNILFdBSEQsTUFHTztBQUNIaUQsWUFBQUEsV0FBVyxDQUFDRSxJQUFaLENBQWlCQyxXQUFXLENBQUNHLEtBQTdCO0FBQ0FQLFlBQUFBLGtCQUFrQixHQUFHLElBQXJCO0FBQ0g7QUFDSjtBQUNKOztBQUNELFVBQUlBLGtCQUFKLEVBQXdCO0FBQ3BCLGNBQU1DLFdBQU47QUFDSDtBQUNKO0FBQ0o7O0FBRXdCLFVBQVZPLFVBQVUsQ0FBSTdFLEtBQUosRUFBd0I4RSxVQUF4QixFQUFzRTtBQUMzRixVQUFNQyxHQUFHLEdBQUcsSUFBSUMsR0FBSixFQUFaOztBQUNBLFNBQUssTUFBTTdFLElBQVgsSUFBbUJILEtBQW5CLEVBQTBCO0FBQ3RCLFlBQU1pRixFQUFFLEdBQUdILFVBQVUsQ0FBQzNFLElBQUQsQ0FBckI7O0FBQ0EsVUFBSSxDQUFDNEUsR0FBRyxDQUFDRyxHQUFKLENBQVFELEVBQVIsQ0FBTCxFQUFrQjtBQUNkRixRQUFBQSxHQUFHLENBQUNJLEdBQUosQ0FBUUYsRUFBUjtBQUNBLGNBQU05RSxJQUFOO0FBQ0g7QUFDSjtBQUNKOztBQTFNa0I7OztBQUFWbUIsUyxDQUNLTixLLEdBQVFBLEs7QUFEYk0sUyxDQUVLbEIsTSxHQUFTQSxNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWluTGVuZ3RoQXJyYXksIHJlamVjdCB9IGZyb20gXCIuL1R5cGluZ1V0aWxzXCI7XG5pbXBvcnQgeyBDb21wYXJlRnVuYyB9IGZyb20gXCIuL0NvbXBhcmVyc1wiO1xuaW1wb3J0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSBmcm9tIFwiLi9FcnJvcnNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uKiByZXZlcnNlQXJyYXk8VD4oYXJyYXk6IHJlYWRvbmx5IFRbXSk6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICB5aWVsZCBhcnJheVtpXSE7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Bc3luY0l0ZXJhdG9yPFQ+KGdlbmVyYXRvcjogKCkgPT4gQXN5bmNHZW5lcmF0b3I8VD4pOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBBc3luY0l0ZXJhdG9yLmZyb20oZ2VuZXJhdG9yKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+LCBjb25kaXRpb246IChpdGVtOiBUKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlc3VsdDogVCB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbihpdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaXRlbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24qIGNvbmNhdDxUPiguLi5pdGVyYWJsZXM6IEFycmF5PEl0ZXJhYmxlPFQ+Pik6IEl0ZXJhYmxlSXRlcmF0b3I8VD4ge1xuICAgIGZvciAoY29uc3QgaXRlcmFibGVJdGVtIG9mIGl0ZXJhYmxlcykge1xuICAgICAgICB5aWVsZCogaXRlcmFibGVJdGVtO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyYXRlVmFsdWVzPFRLIGV4dGVuZHMgc3RyaW5nIHwgc3ltYm9sIHwgbnVtYmVyLCBUVj4ob2JqOiB7IFtrZXkgaW4gVEtdOiBUViB9KTogSXRlcmFibGU8VFY+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIHlpZWxkIG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZUtleXM8VE8+KG9iajogUmVhZG9ubHk8VE8+KTogSXRlcmFibGU8RXh0cmFjdDxrZXlvZiBUTywgc3RyaW5nPj47XG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZUtleXM8VFY+KG9iajogUmVhZG9ubHk8eyBba2V5OiBzdHJpbmddOiBUViB9Pik6IEl0ZXJhYmxlPHN0cmluZz47XG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZUtleXMob2JqOiBSZWFkb25seTx7fT4pOiBJdGVyYWJsZTxzdHJpbmc+O1xuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyYXRlS2V5czxUSyBleHRlbmRzIHN0cmluZyB8IHN5bWJvbCB8IG51bWJlcj4ob2JqOiB7IFtrZXkgaW4gVEtdOiB1bmtub3duIH0pOiBJdGVyYWJsZTxUSz4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAgeWllbGQga2V5O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZUVudHJpZXM8VE8+KG9iajogUmVhZG9ubHk8VE8+KTogSXRlcmFibGU8W0V4dHJhY3Q8a2V5b2YgVE8sIHN0cmluZz4sIFRPW2tleW9mIFRPXV0+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVFbnRyaWVzPFRWPihvYmo6IFJlYWRvbmx5PHsgW2tleTogc3RyaW5nXTogVFYgfT4pOiBJdGVyYWJsZTxbc3RyaW5nLCBUVl0+O1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVFbnRyaWVzKG9iajogUmVhZG9ubHk8e30+KTogSXRlcmFibGU8W3N0cmluZywgdW5rbm93bl0+O1xuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyYXRlRW50cmllczxUVj4ob2JqOiBSZWFkb25seTx7IFtrZXk6IHN0cmluZ106IFRWIH0+KTogSXRlcmFibGU8W3N0cmluZywgVFZdPiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgeWllbGQgW2tleSwgb2JqW2tleV0hXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvdW50PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPik6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChjb25zdCBfaXRlbSBvZiBpdGVtcykge1xuICAgICAgICByZXN1bHQrKztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgRW1wdHlTaW5nbGVFbGVtZW50ID0gU3ltYm9sLmZvcihcIkVtcHR5U2luZ2xlRWxlbWVudFwiKTtcbmNvbnN0IE5vVmFsdWVNYXJrZXIgPSBTeW1ib2wuZm9yKFwiTm9WYWx1ZU1hcmtlclwiKTtcblxuZXhwb3J0IGNsYXNzIEl0ZXJVdGlscyB7XG4gICAgcHVibGljIHN0YXRpYyBjb3VudCA9IGNvdW50O1xuICAgIHB1YmxpYyBzdGF0aWMgY29uY2F0ID0gY29uY2F0O1xuXG4gICAgcHVibGljIHN0YXRpYyBpc0VtcHR5PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IF9pdGVtIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzb3J0Qnk8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSwgc2VsZWN0b3I6IChpdGVtOiBUKSA9PiBzdHJpbmcpOiBUW10ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbLi4uaXRlbXNdO1xuICAgICAgICByZXN1bHQuc29ydCgoYUl0ZW0sIGJJdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0VmFsdWUgPSBzZWxlY3RvcihhSXRlbSk7XG4gICAgICAgICAgICBjb25zdCByaWdodFZhbHVlID0gc2VsZWN0b3IoYkl0ZW0pO1xuICAgICAgICAgICAgaWYgKGxlZnRWYWx1ZSA9PT0gcmlnaHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0VmFsdWUgPCByaWdodFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBsYXN0PFQ+KGl0ZW1zOiBNaW5MZW5ndGhBcnJheTxULCAxPik6IFQ7XG4gICAgcHVibGljIHN0YXRpYyBsYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiB8IHJlYWRvbmx5IFRbXSk6IHVuZGVmaW5lZCB8IFQ7XG4gICAgcHVibGljIHN0YXRpYyBsYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiB8IHJlYWRvbmx5IFRbXSk6IHVuZGVmaW5lZCB8IFQge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGFzdEl0ZW06IFQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgbGFzdEl0ZW0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXN0SXRlbTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpcnN0PFQ+KGl0ZW1zOiBNaW5MZW5ndGhBcnJheTxULCAxPik6IFQ7XG4gICAgcHVibGljIHN0YXRpYyBmaXJzdDxUPihpdGVtczogSXRlcmFibGU8VD4gfCByZWFkb25seSBUW10pOiB1bmRlZmluZWQgfCBUO1xuICAgIHB1YmxpYyBzdGF0aWMgZmlyc3Q8VD4oaXRlbXM6IEl0ZXJhYmxlPFQ+IHwgcmVhZG9ubHkgVFtdKTogdW5kZWZpbmVkIHwgVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zWzBdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaXJzdEl0ZW06IFQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgZmlyc3RJdGVtID0gaXRlbTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdEl0ZW07XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzaW5nbGU8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IEl0ZXJhYmxlPFQ+LCBzaW5nbGVBc3NlcnRNZXNzYWdlPzogc3RyaW5nKTogVCB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgc2luZ2xlQXNzZXJ0TWVzc2FnZSA/PyBgU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgJHtpdGVtcy5sZW5ndGh9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbXNbMF0gPz8gcmVqZWN0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgc2luZ2xlRWxlbWVudDogVCB8IHR5cGVvZiBFbXB0eVNpbmdsZUVsZW1lbnQgPSBFbXB0eVNpbmdsZUVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlRWxlbWVudCAhPT0gRW1wdHlTaW5nbGVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUFzc2VydE1lc3NhZ2UgPz8gYFNlcXVlbmNlIG11c3QgY29udGFpbiBleGFjdGx5IHNpbmdsZSBlbGVtZW50LCBidXQgZ290IGF0IGxlYXN0IDJgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpbmdsZUVsZW1lbnQgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNpbmdsZUVsZW1lbnQgPT09IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzaW5nbGVBc3NlcnRNZXNzYWdlID8/IFwiU2VxdWVuY2UgbXVzdCBjb250YWluIGV4YWN0bHkgc2luZ2xlIGVsZW1lbnQsIGJ1dCBnb3QgMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaW5nbGVFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqaXRlcmF0ZUVudHJpZXM8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSB8IFRbXSB8IEl0ZXJhYmxlPFQ+KTogSXRlcmFibGU8W251bWJlciwgVF0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICB5aWVsZCBbaW5kZXgsIGl0ZW1dO1xuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgKnNraXBMYXN0PFQ+KGl0ZW1zOiBJdGVyYWJsZTxUPiwgc2tpcENvdW50OiBudW1iZXIpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGlmIChza2lwQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2SXRlbXM6IEFycmF5PFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50PiA9IG5ldyBBcnJheShza2lwQ291bnQpLmZpbGwoRW1wdHlTaW5nbGVFbGVtZW50KTtcbiAgICAgICAgbGV0IHJlc3VsdEl0ZW06IFQgfCB0eXBlb2YgRW1wdHlTaW5nbGVFbGVtZW50ID0gRW1wdHlTaW5nbGVFbGVtZW50O1xuICAgICAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yINCSINC+0LHRidC10LwsINGB0YLRgNC+0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCINC00LvQuNC90YMg0LzQsNGB0YHQuNCy0LBcbiAgICAgICAgICAgIHJlc3VsdEl0ZW0gPSBwcmV2SXRlbXNbY3VycmVudEluZGV4XTtcbiAgICAgICAgICAgIHByZXZJdGVtc1tjdXJyZW50SW5kZXhdID0gaXRlbTtcbiAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIHNraXBDb3VudDtcbiAgICAgICAgICAgIGlmIChyZXN1bHRJdGVtICE9IEVtcHR5U2luZ2xlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG1pbkJ5PFQ+KGl0ZW1zOiByZWFkb25seSBUW10gfCBUW10gfCBJdGVyYWJsZTxUPiwgY29tcGFyZUZ1bmM6IENvbXBhcmVGdW5jPFQ+KTogVCB7XG4gICAgICAgIGxldCBtaW5WYWx1ZTogdHlwZW9mIE5vVmFsdWVNYXJrZXIgfCBUID0gTm9WYWx1ZU1hcmtlcjtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWluVmFsdWUgPT09IE5vVmFsdWVNYXJrZXIpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVGdW5jKGl0ZW0sIG1pblZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJpdGVtc1wiLCBcIkl0ZW1zIHNob3VsZCBiZSBub3QgZW1wdHkgbGlzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtaW5CeU9yVW5kZWZpbmVkPFQ+KFxuICAgICAgICBpdGVtczogcmVhZG9ubHkgVFtdIHwgVFtdIHwgSXRlcmFibGU8VD4sXG4gICAgICAgIGNvbXBhcmVGdW5jOiBDb21wYXJlRnVuYzxUPlxuICAgICk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBsZXQgbWluVmFsdWU6IHR5cGVvZiBOb1ZhbHVlTWFya2VyIHwgVCA9IE5vVmFsdWVNYXJrZXI7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgaWYgKG1pblZhbHVlID09PSBOb1ZhbHVlTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlRnVuYyhpdGVtLCBtaW5WYWx1ZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5WYWx1ZSA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByYW5nZShpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogbnVtYmVyLCBpdGVtQ291bnQ6IG51bWJlcik6IEl0ZXJhYmxlPG51bWJlcj47XG4gICAgcHVibGljIHN0YXRpYyAqcmFuZ2UoaW5TdGFydE9yQ291bnQ6IG51bWJlciwgaW5JdGVtQ291bnQ/OiBudW1iZXIpOiBJdGVyYWJsZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gMCA6IGluU3RhcnRPckNvdW50O1xuICAgICAgICBjb25zdCBpdGVtQ291bnQgPSBpbkl0ZW1Db3VudCA9PT0gdW5kZWZpbmVkID8gaW5TdGFydE9yQ291bnQgOiBpbkl0ZW1Db3VudDtcbiAgICAgICAgaWYgKGl0ZW1Db3VudCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIml0ZW1Db3VudFwiLCBcIml0ZW1Db3VudCBtdXN0IGJlIGEgbm9uIG5lZ2F0aXZlIG51bWJlclwiKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGl0ZW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHN1bW1hcnkg0JLRgdGC0LDQstC70Y/QtdGCINC80LXQttC00YMg0Y3Qu9C10LzQtdC90YLQsNC80Lgg0LzQsNGB0YHQuNCy0LAg0LfQsNC00LDQvdC90YvQuSDRjdC70LXQvNC10L3RgiDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQvdC+0LLRi9C5INC80LDRgdGB0LjQslxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJzcGVyc2U8VEksIFRTPihpdGVtczogVElbXSwgaXRlbTogVFMpOiBBcnJheTxUSSB8IFRTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyc3BlcnNlRm4oaXRlbXMsICgpID0+IGl0ZW0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCS0YHRgtCw0LLQu9GP0LXRgiDQvNC10LbQtNGDINGN0LvQtdC80LXQvdGC0LDQvNC4INC80LDRgdGB0LjQstCwINGN0LvQtdC80LXQvdGCLCDRgdC+0LfQtNCw0LLQsNC10LzRi9C5INGE0YPQvdC60YbQuNC10LksINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINC90L7QstGL0Lkg0LzQsNGB0YHQuNCyXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpbnRlcnNwZXJzZUZuPFRJLCBUUz4oaXRlbXM6IFRJW10sIGl0ZW06IChuZXh0SXRlbTogVEksIGluZGV4OiBudW1iZXIpID0+IFRTKTogQXJyYXk8VEkgfCBUUz4ge1xuICAgICAgICByZXR1cm4gaXRlbXMuZmxhdE1hcCgoeCwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IFt4XSA6IFtpdGVtKHgsIGluZGV4KSwgeF0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHppcDxUMSwgVDI+KGl0ZW1zMTogSXRlcmFibGU8VDE+LCBpdGVtczI6IEl0ZXJhYmxlPFQyPik6IEl0ZXJhYmxlPFtUMSB8IHVuZGVmaW5lZCwgVDIgfCB1bmRlZmluZWRdPjtcbiAgICBwdWJsaWMgc3RhdGljICp6aXAoLi4uaXRlcmFibGVzOiBBcnJheTxJdGVyYWJsZTx1bmtub3duPj4pOiBJdGVyYWJsZTx1bmtub3duW10+IHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3JzOiBBcnJheTxJdGVyYXRvcjx1bmtub3duPiB8IHR5cGVvZiBOb1ZhbHVlTWFya2VyPiA9IGl0ZXJhYmxlcy5tYXAoaXQgPT4gSXRlcmF0b3IuZnJvbShpdCkpO1xuICAgICAgICBsZXQgaGFzVW5kb25lSXRlcmF0b3JzID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RW50cnkgPSBbXTtcbiAgICAgICAgICAgIGhhc1VuZG9uZUl0ZXJhdG9ycyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaSwgaXRlcmF0b3JdIG9mIHRoaXMuaXRlcmF0ZUVudHJpZXMoaXRlcmF0b3JzKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciA9PT0gTm9WYWx1ZU1hcmtlcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRWYWx1ZS5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFbnRyeS5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcnNbaV0gPSBOb1ZhbHVlTWFya2VyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RW50cnkucHVzaChyZXN1bHRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmRvbmVJdGVyYXRvcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc1VuZG9uZUl0ZXJhdG9ycykge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdEVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyAqZGlzdGluY3RCeTxUPihpdGVtczogSXRlcmFibGU8VD4sIGlkU2VsZWN0b3I6IChpdGVtOiBUKSA9PiBzdHJpbmcpOiBJdGVyYWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gaWRTZWxlY3RvcihpdGVtKTtcbiAgICAgICAgICAgIGlmICghc2V0LmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICBzZXQuYWRkKGlkKTtcbiAgICAgICAgICAgICAgICB5aWVsZCBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19