velocious 1.0.660 → 1.0.662

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 (45) hide show
  1. package/README.md +19 -2
  2. package/build/application.js +1 -1
  3. package/build/background-jobs/client.js +48 -25
  4. package/build/configuration-types.js +3 -1
  5. package/build/configuration.js +33 -0
  6. package/build/http-server/client/errors.js +27 -0
  7. package/build/http-server/client/index.js +26 -1
  8. package/build/http-server/client/request-buffer/index.js +38 -6
  9. package/build/http-server/client/request-runner.js +8 -1
  10. package/build/http-server/client/response.js +11 -0
  11. package/build/routes/resolver.js +1 -1
  12. package/build/src/application.js +2 -2
  13. package/build/src/background-jobs/client.d.ts.map +1 -1
  14. package/build/src/background-jobs/client.js +50 -26
  15. package/build/src/configuration-types.d.ts +13 -3
  16. package/build/src/configuration-types.d.ts.map +1 -1
  17. package/build/src/configuration-types.js +4 -2
  18. package/build/src/configuration.d.ts +14 -2
  19. package/build/src/configuration.d.ts.map +1 -1
  20. package/build/src/configuration.js +31 -1
  21. package/build/src/http-server/client/errors.d.ts +25 -0
  22. package/build/src/http-server/client/errors.d.ts.map +1 -0
  23. package/build/src/http-server/client/errors.js +26 -0
  24. package/build/src/http-server/client/index.d.ts +5 -0
  25. package/build/src/http-server/client/index.d.ts.map +1 -1
  26. package/build/src/http-server/client/index.js +26 -2
  27. package/build/src/http-server/client/request-buffer/index.d.ts +13 -0
  28. package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
  29. package/build/src/http-server/client/request-buffer/index.js +34 -8
  30. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  31. package/build/src/http-server/client/request-runner.js +10 -2
  32. package/build/src/http-server/client/response.d.ts.map +1 -1
  33. package/build/src/http-server/client/response.js +8 -1
  34. package/build/src/routes/resolver.js +2 -2
  35. package/package.json +1 -1
  36. package/src/application.js +1 -1
  37. package/src/background-jobs/client.js +48 -25
  38. package/src/configuration-types.js +3 -1
  39. package/src/configuration.js +33 -0
  40. package/src/http-server/client/errors.js +27 -0
  41. package/src/http-server/client/index.js +26 -1
  42. package/src/http-server/client/request-buffer/index.js +38 -6
  43. package/src/http-server/client/request-runner.js +8 -1
  44. package/src/http-server/client/response.js +11 -0
  45. package/src/routes/resolver.js +1 -1
@@ -2,6 +2,7 @@
2
2
  import EventEmitter from "../../../utils/event-emitter.js";
3
3
  import FormDataPart from "./form-data-part.js";
4
4
  import Header from "./header.js";
5
+ import { HttpRequestBodyTooLargeError } from "../errors.js";
5
6
  import { incorporate } from "incorporator";
6
7
  import Logger from "../../../logger.js";
7
8
  import ParamsToObject from "../params-to-object.js";
@@ -55,6 +56,28 @@ export default class RequestBuffer {
55
56
  this.configuration = configuration;
56
57
  this.logger = new Logger(this, { debug: false });
57
58
  }
59
+ /**
60
+ * Raises before buffering a request body beyond the configured bound.
61
+ * @param {number} actualBytes - Declared or accumulated decoded body bytes.
62
+ * @returns {void}
63
+ */
64
+ assertRequestBodySize(actualBytes) {
65
+ const maxBytes = this.configuration.getHttpServerMaxRequestBodyBytes();
66
+ if (maxBytes !== undefined && actualBytes > maxBytes) {
67
+ throw new HttpRequestBodyTooLargeError({ actualBytes, maxBytes });
68
+ }
69
+ }
70
+ /**
71
+ * Records bytes consumed after request headers. Multipart parsing can accept
72
+ * an unframed body, so enforce its configured bound during accumulation.
73
+ * @param {number} bytes - Newly consumed body bytes.
74
+ * @returns {void}
75
+ */
76
+ recordBodyBytes(bytes) {
77
+ this.bodyLength += bytes;
78
+ if (this.multiPartyFormData)
79
+ this.assertRequestBodySize(this.bodyLength);
80
+ }
58
81
  destroy() {
59
82
  // Do nothing for now...
60
83
  }
@@ -97,14 +120,14 @@ export default class RequestBuffer {
97
120
  const newlineIndex = data.indexOf(10, index);
98
121
  if (newlineIndex === -1) {
99
122
  if (this.readingBody)
100
- this.bodyLength += data.length - index;
123
+ this.recordBodyBytes(data.length - index);
101
124
  for (let dataIndex = index; dataIndex < data.length; dataIndex += 1) {
102
125
  this.data.push(data[dataIndex]);
103
126
  }
104
127
  return data.length;
105
128
  }
106
129
  if (this.readingBody)
107
- this.bodyLength += newlineIndex + 1 - index;
130
+ this.recordBodyBytes(newlineIndex + 1 - index);
108
131
  let line;
109
132
  if (this.data.length == 0) {
110
133
  line = data.toString("latin1", index, newlineIndex + 1);
@@ -134,7 +157,7 @@ export default class RequestBuffer {
134
157
  const remainingBodyBytes = Math.max(1, this.contentLength - this.bodyLength);
135
158
  const endIndex = Math.min(data.length, index + remainingBodyBytes);
136
159
  this.postBodyBuffers.push(data.subarray(index, endIndex));
137
- this.bodyLength += endIndex - index;
160
+ this.recordBodyBytes(endIndex - index);
138
161
  if (this.contentLength && this.bodyLength >= this.contentLength) {
139
162
  this.postRequestDone();
140
163
  }
@@ -149,7 +172,7 @@ export default class RequestBuffer {
149
172
  feedByte(data, index) {
150
173
  const char = data[index];
151
174
  if (this.readingBody)
152
- this.bodyLength += 1;
175
+ this.recordBodyBytes(1);
153
176
  switch (this.state) {
154
177
  case "chunked-data": {
155
178
  const chunkedBodyChars = this.chunkedBodyChars;
@@ -370,6 +393,11 @@ export default class RequestBuffer {
370
393
  else {
371
394
  this.readingBody = true;
372
395
  this.bodyLength = 0;
396
+ if (this.contentLength !== undefined) {
397
+ if (Number.isNaN(this.contentLength))
398
+ throw new Error("Content length is invalid");
399
+ this.assertRequestBodySize(this.contentLength);
400
+ }
373
401
  const match = this.getHeader("content-type")?.value?.match(/^multipart\/form-data;\s*boundary=(.+)$/i);
374
402
  if (match) {
375
403
  this.boundary = match[1];
@@ -382,9 +410,6 @@ export default class RequestBuffer {
382
410
  else if (this.contentLength === 0 || this.contentLength === undefined) {
383
411
  this.completeRequest();
384
412
  }
385
- else if (Number.isNaN(this.contentLength)) {
386
- throw new Error("Content length is invalid");
387
- }
388
413
  else {
389
414
  /**
390
415
  * Narrows the runtime value to the documented type.
@@ -463,6 +488,7 @@ export default class RequestBuffer {
463
488
  this.setState("chunked-trailer");
464
489
  return;
465
490
  }
491
+ this.assertRequestBodySize((this.chunkedBodyChars?.length || 0) + size);
466
492
  this.currentChunkSize = size;
467
493
  this.currentChunkBytesRead = 0;
468
494
  this.setState("chunked-data");
@@ -541,4 +567,4 @@ export default class RequestBuffer {
541
567
  }
542
568
  }
543
569
  }
544
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtYnVmZmVyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSxpQ0FBaUMsQ0FBQTtBQUMxRCxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUN4QyxPQUFPLE1BQU0sTUFBTSxvQkFBb0IsQ0FBQTtBQUN2QyxPQUFPLGNBQWMsTUFBTSx3QkFBd0IsQ0FBQTtBQUNuRCxPQUFPLFdBQVcsTUFBTSxhQUFhLENBQUE7QUFFckM7Ozt5QkFHeUI7QUFDekIsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtBQUU1RDs7Ozs7R0FLRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsR0FBRztJQUN6QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUMvQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRXZDLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFBO0FBQ3RDLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLGFBQWE7SUFDaEMsVUFBVSxHQUFHLENBQUMsQ0FBQTtJQUVkLG1DQUFtQztJQUNuQyxlQUFlLEdBQUcsU0FBUyxDQUFBO0lBRTNCOzswQkFFc0I7SUFDdEIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUVULE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBRTNCOzt3Q0FFb0M7SUFD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QztnQkFDSCxDQUFDO2dCQUVELE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFBO2dCQUN6RCxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUE7Z0JBRTNDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3JDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sWUFBWSxHQUFHLHlGQUF5RixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBRXRILFlBQVksQ0FBQyxnQkFBZ0IsR0FBRztvQkFDOUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7b0JBQ3hDLGNBQWMsRUFBRTt3QkFDZCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLO3dCQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7d0JBQzNCLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM1RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsZUFBZSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3dCQUMvQyxLQUFLLEVBQUUsMEJBQTBCO3FCQUNsQztpQkFDRixDQUFBO2dCQUVELE1BQU0sWUFBWSxDQUFBO1lBQ3BCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IEZvcm1EYXRhUGFydCBmcm9tIFwiLi9mb3JtLWRhdGEtcGFydC5qc1wiXG5pbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlci5qc1wiXG5pbXBvcnQge2luY29ycG9yYXRlfSBmcm9tIFwiaW5jb3Jwb3JhdG9yXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uLy4uLy4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUGFyYW1zVG9PYmplY3QgZnJvbSBcIi4uL3BhcmFtcy10by1vYmplY3QuanNcIlxuaW1wb3J0IHF1ZXJ5c3RyaW5nIGZyb20gXCJxdWVyeXN0cmluZ1wiXG5cbi8qKlxuICogUmVxdWVzdCBoZWFkZXIgZmllbGRzIHdob3NlIHJlcGVhdGVkIHdpcmUgZmllbGRzIGNvbWJpbmUgaW50byBvbmUgdmFsdWVcbiAqIChSRkMgOTExMCDCpzUuMykgYmVmb3JlIHRoZSBzZXJ2ZXIgY29uc3VtZXMgdGhlbS5cbiAqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbmNvbnN0IENPTUJJTklOR19IRUFERVJfRklFTERTID0gbmV3IFNldChbXCJhY2NlcHQtZW5jb2RpbmdcIl0pXG5cbi8qKlxuICogUnVucyB0cnVuY2F0ZSBwcmV2aWV3LlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGlucHV0IC0gSW5wdXQgc3RyaW5nLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gLSBNYXggcHJldmlldyBsZW5ndGguXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRydW5jYXRlZCBwcmV2aWV3LlxuICovXG5mdW5jdGlvbiB0cnVuY2F0ZVByZXZpZXcoaW5wdXQsIGxpbWl0ID0gMzAwKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKGlucHV0Lmxlbmd0aCA8PSBsaW1pdCkgcmV0dXJuIGlucHV0XG5cbiAgcmV0dXJuIGAke2lucHV0LnNsaWNlKDAsIGxpbWl0KX0uLi5gXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcXVlc3RCdWZmZXIge1xuICBib2R5TGVuZ3RoID0gMFxuXG4gIC8qKiBAdHlwZSB7QnVmZmVyW10gfCB1bmRlZmluZWR9ICovXG4gIHBvc3RCb2R5QnVmZmVycyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEYXRhLlxuICAgKiBAdHlwZSB7bnVtYmVyW119ICovXG4gIGRhdGEgPSBbXVxuXG4gIGV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIC8qKlxuICAgKiBIZWFkZXJzIGJ5IG5hbWUuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBIZWFkZXI+fSAqL1xuICBoZWFkZXJzQnlOYW1lID0ge31cbiAgLyoqXG4gICAqIENodW5rZWQgYm9keSBjaGFycy5cbiAgICogQHR5cGUge251bWJlcltdIHwgdW5kZWZpbmVkfSAqL1xuICBjaHVua2VkQm9keUNoYXJzID0gdW5kZWZpbmVkXG5cbiAgbXVsdGlQYXJ0eUZvcm1EYXRhID0gZmFsc2VcblxuICBjb21wbGV0ZWQgPSBmYWxzZVxuICBwYXJhbXMgPSB7fVxuICByZWFkaW5nQm9keSA9IGZhbHNlXG4gIHN0YXRlID0gXCJzdGF0dXNcIlxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9ufSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcywge2RlYnVnOiBmYWxzZX0pXG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIC8vIERvIG5vdGhpbmcgZm9yIG5vdy4uLlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmVlZC5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtCdWZmZXIgfCB1bmRlZmluZWR9IC0gUmVtYWluaW5nIGRhdGEsIGlmIGFueS5cbiAgICovXG4gIGZlZWQoZGF0YSkge1xuICAgIGxldCBpbmRleCA9IDBcblxuICAgIHdoaWxlIChpbmRleCA8IGRhdGEubGVuZ3RoKSB7XG4gICAgICBzd2l0Y2godGhpcy5zdGF0ZSkge1xuICAgICAgICBjYXNlIFwic3RhdHVzXCI6XG4gICAgICAgIGNhc2UgXCJoZWFkZXJzXCI6XG4gICAgICAgIGNhc2UgXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YVwiOlxuICAgICAgICBjYXNlIFwibXVsdGktcGFydC1mb3JtLWRhdGEtaGVhZGVyXCI6XG4gICAgICAgIGNhc2UgXCJjaHVua2VkLXNpemVcIjpcbiAgICAgICAgY2FzZSBcImNodW5rZWQtdHJhaWxlclwiOlxuICAgICAgICAgIGluZGV4ID0gdGhpcy5mZWVkTGluZShkYXRhLCBpbmRleClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIFwicG9zdC1ib2R5XCI6XG4gICAgICAgICAgaW5kZXggPSB0aGlzLmZlZWRQb3N0Qm9keShkYXRhLCBpbmRleClcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGluZGV4ID0gdGhpcy5mZWVkQnl0ZShkYXRhLCBpbmRleClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnN1YmFycmF5KGluZGV4KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBieXRlcyBmb3IgdGhlIGxpbmUtYmFzZWQgc3RhdGVzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIG5leHQgbmV3bGluZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBEYXRhIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFJlYWQgcG9zaXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gTmV3IHJlYWQgcG9zaXRpb24uXG4gICAqL1xuICBmZWVkTGluZShkYXRhLCBpbmRleCkge1xuICAgIGNvbnN0IG5ld2xpbmVJbmRleCA9IGRhdGEuaW5kZXhPZigxMCwgaW5kZXgpXG5cbiAgICBpZiAobmV3bGluZUluZGV4ID09PSAtMSkge1xuICAgICAgaWYgKHRoaXMucmVhZGluZ0JvZHkpIHRoaXMuYm9keUxlbmd0aCArPSBkYXRhLmxlbmd0aCAtIGluZGV4XG5cbiAgICAgIGZvciAobGV0IGRhdGFJbmRleCA9IGluZGV4OyBkYXRhSW5kZXggPCBkYXRhLmxlbmd0aDsgZGF0YUluZGV4ICs9IDEpIHtcbiAgICAgICAgdGhpcy5kYXRhLnB1c2goZGF0YVtkYXRhSW5kZXhdKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YS5sZW5ndGhcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWFkaW5nQm9keSkgdGhpcy5ib2R5TGVuZ3RoICs9IG5ld2xpbmVJbmRleCArIDEgLSBpbmRleFxuXG4gICAgbGV0IGxpbmVcblxuICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID09IDApIHtcbiAgICAgIGxpbmUgPSBkYXRhLnRvU3RyaW5nKFwibGF0aW4xXCIsIGluZGV4LCBuZXdsaW5lSW5kZXggKyAxKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcmVzdCBvZiBhIGxpbmUgdGhhdCBzdGFydGVkIGluIGEgcHJldmlvdXMgY2h1bmsuXG4gICAgICBmb3IgKGxldCBkYXRhSW5kZXggPSBpbmRleDsgZGF0YUluZGV4IDw9IG5ld2xpbmVJbmRleDsgZGF0YUluZGV4ICs9IDEpIHtcbiAgICAgICAgdGhpcy5kYXRhLnB1c2goZGF0YVtkYXRhSW5kZXhdKVxuICAgICAgfVxuXG4gICAgICBsaW5lID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0aGlzLmRhdGEpXG4gICAgICB0aGlzLmRhdGEgPSBbXVxuICAgIH1cblxuICAgIHRoaXMucGFyc2UobGluZSlcblxuICAgIHJldHVybiBuZXdsaW5lSW5kZXggKyAxXG4gIH1cblxuICAvKipcbiAgICogQ29uc3VtZXMgZml4ZWQtbGVuZ3RoIHJlcXVlc3QgYm9keSBieXRlcyBpbiBidWxrLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gUmVhZCBwb3NpdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBOZXcgcmVhZCBwb3NpdGlvbi5cbiAgICovXG4gIGZlZWRQb3N0Qm9keShkYXRhLCBpbmRleCkge1xuICAgIGlmICghdGhpcy5wb3N0Qm9keUJ1ZmZlcnMpIHRocm93IG5ldyBFcnJvcihcInBvc3RCb2R5QnVmZmVycyBub3QgaW5pdGlhbGl6ZWRcIilcbiAgICBpZiAodGhpcy5jb250ZW50TGVuZ3RoID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIkNvbnRlbnQgbGVuZ3RoIG5vdCBzZXRcIilcblxuICAgIGNvbnN0IHJlbWFpbmluZ0JvZHlCeXRlcyA9IE1hdGgubWF4KDEsIHRoaXMuY29udGVudExlbmd0aCAtIHRoaXMuYm9keUxlbmd0aClcbiAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGRhdGEubGVuZ3RoLCBpbmRleCArIHJlbWFpbmluZ0JvZHlCeXRlcylcblxuICAgIHRoaXMucG9zdEJvZHlCdWZmZXJzLnB1c2goZGF0YS5zdWJhcnJheShpbmRleCwgZW5kSW5kZXgpKVxuICAgIHRoaXMuYm9keUxlbmd0aCArPSBlbmRJbmRleCAtIGluZGV4XG5cbiAgICBpZiAodGhpcy5jb250ZW50TGVuZ3RoICYmIHRoaXMuYm9keUxlbmd0aCA+PSB0aGlzLmNvbnRlbnRMZW5ndGgpIHtcbiAgICAgIHRoaXMucG9zdFJlcXVlc3REb25lKClcbiAgICB9XG5cbiAgICByZXR1cm4gZW5kSW5kZXhcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBhIHNpbmdsZSBieXRlIGZvciB0aGUgYnl0ZS1iYXNlZCBwYXJzZXIgc3RhdGVzLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gUmVhZCBwb3NpdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBOZXcgcmVhZCBwb3NpdGlvbi5cbiAgICovXG4gIGZlZWRCeXRlKGRhdGEsIGluZGV4KSB7XG4gICAgY29uc3QgY2hhciA9IGRhdGFbaW5kZXhdXG5cbiAgICBpZiAodGhpcy5yZWFkaW5nQm9keSkgdGhpcy5ib2R5TGVuZ3RoICs9IDFcblxuICAgIHN3aXRjaCh0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlIFwiY2h1bmtlZC1kYXRhXCI6IHtcbiAgICAgICAgY29uc3QgY2h1bmtlZEJvZHlDaGFycyA9IHRoaXMuY2h1bmtlZEJvZHlDaGFyc1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaHVua1NpemUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiQ2h1bmsgc2l6ZSBub3QgaW5pdGlhbGl6ZWRcIilcbiAgICAgICAgaWYgKCFjaHVua2VkQm9keUNoYXJzKSB0aHJvdyBuZXcgRXJyb3IoXCJDaHVua2VkIGJvZHkgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgICAgY2h1bmtlZEJvZHlDaGFycy5wdXNoKGNoYXIpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDdXJyZW50IGNodW5rIGJ5dGVzIHJlYWQuXG4gICAgICAgICAqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDaHVua0J5dGVzUmVhZCA9ICh0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCB8fCAwKSArIDFcblxuICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IGN1cnJlbnRDaHVua0J5dGVzUmVhZFxuXG4gICAgICAgIGlmIChjdXJyZW50Q2h1bmtCeXRlc1JlYWQgPj0gdGhpcy5jdXJyZW50Q2h1bmtTaXplKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmtDcmxmUmVhZCA9IDBcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1kYXRhLWNybGZcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIFwiY2h1bmtlZC1kYXRhLWNybGZcIjpcbiAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmtDcmxmUmVhZCA9ICh0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkIHx8IDApICsgMVxuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkID49IDIpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1zaXplXCIpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWJvZHlcIjoge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybURhdGFQYXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJGb3JtRGF0YSBwYXJ0IG5vdCBpbml0aWFsaXplZFwiKVxuICAgICAgICBpZiAoIXRoaXMuYm91bmRhcnlMaW5lRW5kKSB0aHJvdyBuZXcgRXJyb3IoXCJCb3VuZGFyeSBsaW5lIGVuZCBub3QgaW5pdGlhbGl6ZWRcIilcbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kYXJ5TGluZU5leHQpIHRocm93IG5ldyBFcnJvcihcIkJvdW5kYXJ5IGxpbmUgbmV4dCBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5mb3JtRGF0YVBhcnQuYm9keVxuXG4gICAgICAgIGJvZHkucHVzaChjaGFyKVxuXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlFbmRQb3NpdGlvbiA9IGJvZHkubGVuZ3RoIC0gdGhpcy5ib3VuZGFyeUxpbmVFbmQubGVuZ3RoXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlFbmRDaGFycyA9IGJvZHkuc2xpY2UocG9zc2libGVCb3VuZGFyeUVuZFBvc2l0aW9uLCBib2R5Lmxlbmd0aClcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeUVuZCA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgcG9zc2libGVCb3VuZGFyeUVuZENoYXJzKVxuXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlOZXh0UG9zaXRpb24gPSBib2R5Lmxlbmd0aCAtIHRoaXMuYm91bmRhcnlMaW5lTmV4dC5sZW5ndGhcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeU5leHRDaGFycyA9IGJvZHkuc2xpY2UocG9zc2libGVCb3VuZGFyeU5leHRQb3NpdGlvbiwgYm9keS5sZW5ndGgpXG4gICAgICAgIGNvbnN0IHBvc3NpYmxlQm91bmRhcnlOZXh0ID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBwb3NzaWJsZUJvdW5kYXJ5TmV4dENoYXJzKVxuXG4gICAgICAgIGlmIChwb3NzaWJsZUJvdW5kYXJ5RW5kID09IHRoaXMuYm91bmRhcnlMaW5lRW5kKSB7XG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnQucmVtb3ZlRnJvbUJvZHkocG9zc2libGVCb3VuZGFyeUVuZClcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuICAgICAgICAgIHRoaXMuY29tcGxldGVSZXF1ZXN0KClcbiAgICAgICAgfSBlbHNlIGlmIChwb3NzaWJsZUJvdW5kYXJ5TmV4dCA9PSB0aGlzLmJvdW5kYXJ5TGluZU5leHQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydC5yZW1vdmVGcm9tQm9keShwb3NzaWJsZUJvdW5kYXJ5TmV4dClcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuICAgICAgICAgIHRoaXMubmV3Rm9ybURhdGFQYXJ0KClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggJiYgdGhpcy5ib2R5TGVuZ3RoID49IHRoaXMuY29udGVudExlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybURhdGFQYXJ0LmNvbnRlbnRMZW5ndGggJiYgdGhpcy5ib2R5TGVuZ3RoID49IHRoaXMuZm9ybURhdGFQYXJ0LmNvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydERvbmUoKVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3R1YlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IFtgVW5rbm93biBzdGF0ZSBmb3IgcmVxdWVzdCBidWZmZXJgLCB7c3RhdGU6IHRoaXMuc3RhdGV9XSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXggKyAxXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIE5hbWUuXG4gICAqIEByZXR1cm5zIHtIZWFkZXJ9IC0gVGhlIGhlYWRlci5cbiAgICovXG4gIGdldEhlYWRlcihuYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oZWFkZXJzQnlOYW1lW25hbWUudG9Mb3dlckNhc2UoKS50cmltKCldXG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IFtgZ2V0SGVhZGVyICR7bmFtZX1gLCB7cmVzdWx0OiByZXN1bHQ/LnRvU3RyaW5nKCl9XSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBoZWFkZXJzIGhhc2guXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIFRoZSBoZWFkZXJzIGhhc2guXG4gICAqL1xuICBnZXRIZWFkZXJzSGFzaCgpIHtcbiAgICAvKipcbiAgICAgKiBSZXN1bHQuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgcmVzdWx0ID0ge31cblxuICAgIGZvciAoY29uc3QgaGVhZGVyRm9ybWF0dGVkTmFtZSBpbiB0aGlzLmhlYWRlcnNCeU5hbWUpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuaGVhZGVyc0J5TmFtZVtoZWFkZXJGb3JtYXR0ZWROYW1lXVxuXG4gICAgICByZXN1bHRbaGVhZGVyLmdldE5hbWUoKV0gPSBoZWFkZXIuZ2V0VmFsdWUoKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZvcm0gZGF0YSBwYXJ0IGRvbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGZvcm1EYXRhUGFydERvbmUoKSB7XG4gICAgY29uc3QgZm9ybURhdGFQYXJ0ID0gdGhpcy5mb3JtRGF0YVBhcnRcblxuICAgIGlmICghZm9ybURhdGFQYXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJmb3JtRGF0YVBhcnQgd2FzbnQgc2V0XCIpXG5cbiAgICB0aGlzLmZvcm1EYXRhUGFydCA9IHVuZGVmaW5lZFxuICAgIGZvcm1EYXRhUGFydC5maW5pc2goKVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImZvcm0tZGF0YS1wYXJ0XCIsIGZvcm1EYXRhUGFydClcbiAgfVxuXG4gIGlzTXVsdGlQYXJ0eUZvcm1EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm11bHRpUGFydHlGb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbmV3IGZvcm0gZGF0YSBwYXJ0LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBuZXdGb3JtRGF0YVBhcnQoKSB7XG4gICAgdGhpcy5mb3JtRGF0YVBhcnQgPSBuZXcgRm9ybURhdGFQYXJ0KClcbiAgICB0aGlzLnNldFN0YXRlKFwibXVsdGktcGFydC1mb3JtLWRhdGEtaGVhZGVyXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBMaW5lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwYXJzZShsaW5lKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT0gXCJzdGF0dXNcIikge1xuICAgICAgdGhpcy5wYXJzZVN0YXR1c0xpbmUobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJoZWFkZXJzXCIpIHtcbiAgICAgIHRoaXMucGFyc2VIZWFkZXIobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJjaHVua2VkLXNpemVcIikge1xuICAgICAgdGhpcy5wYXJzZUNodW5rU2l6ZUxpbmUobGluZSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT0gXCJjaHVua2VkLXRyYWlsZXJcIikge1xuICAgICAgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgICB0aGlzLmZpbmlzaENodW5rZWRCb2R5KClcbiAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhXCIpIHtcbiAgICAgIGlmIChsaW5lID09IHRoaXMuYm91bmRhcnlMaW5lKSB7XG4gICAgICAgIHRoaXMubmV3Rm9ybURhdGFQYXJ0KClcbiAgICAgIH0gZWxzZSBpZiAobGluZSA9PSBcIlxcclxcblwiKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXCJkb25lXCIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJvdW5kYXJ5IGxpbmUgYnV0IGRpZG4ndCBnZXQgaXQ6ICR7bGluZX1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWhlYWRlclwiKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnJlYWRIZWFkZXJGcm9tTGluZShsaW5lKVxuXG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtRGF0YVBhcnQpIHRocm93IG5ldyBFcnJvcihcImZvcm1EYXRhUGFydCBub3Qgc2V0XCIpXG5cbiAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnQuYWRkSGVhZGVyKGhlYWRlcilcbiAgICAgICAgLy90aGlzLnN0YXRlID09IFwibXVsdGktcGFydC1mb3JtLWRhdGFcIlxuICAgICAgfSBlbHNlIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcIm11bHRpLXBhcnQtZm9ybS1kYXRhLWJvZHlcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXRlIHBhcnNpbmcgbGluZTogJHt0aGlzLnN0YXRlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVhZCBoZWFkZXIgZnJvbSBsaW5lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHtIZWFkZXIgfCB1bmRlZmluZWR9IC0gVGhlIGhlYWRlciBmcm9tIGxpbmUuXG4gICAqL1xuICByZWFkSGVhZGVyRnJvbUxpbmUobGluZSkge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXiguKyk6ICguKylcXHJcXG4vKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBuZXcgSGVhZGVyKG1hdGNoWzFdLCBtYXRjaFsyXSlcblxuICAgICAgcmV0dXJuIGhlYWRlclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7SGVhZGVyfSBoZWFkZXIgLSBIZWFkZXIgdmFsdWUuXG4gICAqL1xuICBhZGRIZWFkZXIoaGVhZGVyKSB7XG4gICAgY29uc3QgZm9ybWF0dGVkTmFtZSA9IGhlYWRlci5nZXRGb3JtYXR0ZWROYW1lKClcbiAgICBjb25zdCBleGlzdGluZ0hlYWRlciA9IHRoaXMuaGVhZGVyc0J5TmFtZVtmb3JtYXR0ZWROYW1lXVxuXG4gICAgLy8gUkZDIDkxMTAgwqc1LjM6IGEgZmllbGQgbWF5IGJlIHJlcGVhdGVkOyBpdHMgdmFsdWUgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2ZcbiAgICAvLyBhbGwgZmllbGQgdmFsdWVzIHNlcGFyYXRlZCBieSBjb21tYXMsIGluIHdpcmUgb3JkZXIuIE9ubHkgQWNjZXB0LUVuY29kaW5nXG4gICAgLy8gaXMgY29uc3VtZWQgYXMgYSBjb21iaW5lZCBmaWVsZCBieSB0aGUgc2VydmVyLlxuICAgIGlmIChleGlzdGluZ0hlYWRlciAmJiBDT01CSU5JTkdfSEVBREVSX0ZJRUxEUy5oYXMoZm9ybWF0dGVkTmFtZSkpIHtcbiAgICAgIGV4aXN0aW5nSGVhZGVyLnZhbHVlICs9IGAsICR7aGVhZGVyLmdldFZhbHVlKCl9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNCeU5hbWVbZm9ybWF0dGVkTmFtZV0gPSBoZWFkZXJcbiAgICB9XG5cbiAgICBpZiAoZm9ybWF0dGVkTmFtZSA9PSBcImNvbnRlbnQtbGVuZ3RoXCIpIHRoaXMuY29udGVudExlbmd0aCA9IHBhcnNlSW50KGhlYWRlci5nZXRWYWx1ZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGFyc2UgaGVhZGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHBhcnNlSGVhZGVyKGxpbmUpIHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnJlYWRIZWFkZXJGcm9tTGluZShsaW5lKVxuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgUGFyc2VkIGhlYWRlcjogJHtoZWFkZXIudG9TdHJpbmcoKX1gKVxuICAgICAgdGhpcy5hZGRIZWFkZXIoaGVhZGVyKVxuICAgICAgdGhpcy5ldmVudHMuZW1pdChcImhlYWRlclwiLCBoZWFkZXIpXG4gICAgfSBlbHNlIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgIGNvbnN0IGh0dHBNZXRob2QgPSB0aGlzLmh0dHBNZXRob2Q/LnRvVXBwZXJDYXNlKClcblxuICAgICAgaWYgKCFodHRwTWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoXCJIVFRQIG1ldGhvZCBub3Qgc2V0XCIpXG5cbiAgICAgIGlmICghdGhpcy5leHBlY3RzUmVxdWVzdEJvZHkoaHR0cE1ldGhvZCkpIHtcbiAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ2h1bmtlZEVuY29kaW5nKCkpIHtcbiAgICAgICAgdGhpcy5yZWFkaW5nQm9keSA9IHRydWVcbiAgICAgICAgdGhpcy5ib2R5TGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluaXRpYWxpemVDaHVua2VkQm9keSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlYWRpbmdCb2R5ID0gdHJ1ZVxuICAgICAgICB0aGlzLmJvZHlMZW5ndGggPSAwXG5cbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmdldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiKT8udmFsdWU/Lm1hdGNoKC9ebXVsdGlwYXJ0XFwvZm9ybS1kYXRhO1xccypib3VuZGFyeT0oLispJC9pKVxuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHRoaXMuYm91bmRhcnkgPSBtYXRjaFsxXVxuICAgICAgICAgIHRoaXMuYm91bmRhcnlMaW5lID0gYC0tJHt0aGlzLmJvdW5kYXJ5fVxcclxcbmBcbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5TGluZU5leHQgPSBgXFxyXFxuLS0ke3RoaXMuYm91bmRhcnl9XFxyXFxuYFxuICAgICAgICAgIHRoaXMuYm91bmRhcnlMaW5lRW5kID0gYFxcclxcbi0tJHt0aGlzLmJvdW5kYXJ5fS0tYFxuICAgICAgICAgIHRoaXMubXVsdGlQYXJ0eUZvcm1EYXRhID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YVwiKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudExlbmd0aCA9PT0gMCB8fCB0aGlzLmNvbnRlbnRMZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuY29tcGxldGVSZXF1ZXN0KClcbiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNOYU4odGhpcy5jb250ZW50TGVuZ3RoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRlbnQgbGVuZ3RoIGlzIGludmFsaWRcIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAgICAgICAgICogQHR5cGUge0J1ZmZlcltdfSAqL1xuICAgICAgICAgIHRoaXMucG9zdEJvZHlCdWZmZXJzID0gW11cblxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJwb3N0LWJvZHlcIilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBhcnNlIHN0YXR1cyBsaW5lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHBhcnNlU3RhdHVzTGluZShsaW5lKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKFtBLVotXSspICguKz8pIEhUVFBcXC8oLispXFxyXFxuLylcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgbWF0Y2ggc3RhdHVzIGxpbmUgZnJvbTogJHtsaW5lfWApXG4gICAgfVxuXG4gICAgdGhpcy5odHRwTWV0aG9kID0gbWF0Y2hbMV1cbiAgICB0aGlzLmh0dHBWZXJzaW9uID0gbWF0Y2hbM11cbiAgICB0aGlzLnBhdGggPSBtYXRjaFsyXVxuICAgIHRoaXMuc2V0U3RhdGUoXCJoZWFkZXJzXCIpXG4gICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBbXCJQYXJzZWQgc3RhdHVzIGxpbmVcIiwge2h0dHBNZXRob2Q6IHRoaXMuaHR0cE1ldGhvZCwgaHR0cFZlcnNpb246IHRoaXMuaHR0cFZlcnNpb24sIHBhdGg6IHRoaXMucGF0aH1dKVxuICB9XG5cbiAgcG9zdFJlcXVlc3REb25lKCkge1xuICAgIGlmICh0aGlzLnBvc3RCb2R5QnVmZmVycykge1xuICAgICAgdGhpcy5wb3N0Qm9keSA9IEJ1ZmZlci5jb25jYXQodGhpcy5wb3N0Qm9keUJ1ZmZlcnMpLnRvU3RyaW5nKFwidXRmOFwiKVxuICAgIH1cblxuICAgIHRoaXMucG9zdEJvZHlCdWZmZXJzID0gdW5kZWZpbmVkXG5cbiAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleHBlY3RzIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGh0dHBNZXRob2QgLSBIVFRQIG1ldGhvZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcmVxdWVzdCBleHBlY3RzIGEgYm9keS5cbiAgICovXG4gIGV4cGVjdHNSZXF1ZXN0Qm9keShodHRwTWV0aG9kKSB7XG4gICAgcmV0dXJuICFbXCJHRVRcIiwgXCJPUFRJT05TXCIsIFwiSEVBRFwiXS5pbmNsdWRlcyhodHRwTWV0aG9kKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaXMgY2h1bmtlZCBlbmNvZGluZy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgcmVxdWVzdCB1c2VzIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcuXG4gICAqL1xuICBpc0NodW5rZWRFbmNvZGluZygpIHtcbiAgICBjb25zdCB0cmFuc2ZlckVuY29kaW5nID0gdGhpcy5nZXRIZWFkZXIoXCJ0cmFuc2Zlci1lbmNvZGluZ1wiKT8udmFsdWU/LnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiBCb29sZWFuKHRyYW5zZmVyRW5jb2Rpbmc/LmluY2x1ZGVzKFwiY2h1bmtlZFwiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGluaXRpYWxpemUgY2h1bmtlZCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBpbml0aWFsaXplQ2h1bmtlZEJvZHkoKSB7XG4gICAgdGhpcy5jaHVua2VkQm9keUNoYXJzID0gW11cbiAgICB0aGlzLmN1cnJlbnRDaHVua1NpemUgPSB1bmRlZmluZWRcbiAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1zaXplXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZSBjaHVuayBzaXplIGxpbmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gQ2h1bmsgc2l6ZSBsaW5lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwYXJzZUNodW5rU2l6ZUxpbmUobGluZSkge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKVxuXG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm5cblxuICAgIGNvbnN0IHNpemVUb2tlbiA9IHRyaW1tZWQuc3BsaXQoXCI7XCIpWzBdPy50cmltKClcblxuICAgIGlmICghc2l6ZVRva2VuKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2h1bmsgc2l6ZSBsaW5lOiAke2xpbmV9YClcblxuICAgIGNvbnN0IHNpemUgPSBOdW1iZXIucGFyc2VJbnQoc2l6ZVRva2VuLCAxNilcblxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHNpemUpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2h1bmsgc2l6ZTogJHtzaXplVG9rZW59YClcblxuICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC10cmFpbGVyXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRDaHVua1NpemUgPSBzaXplXG4gICAgdGhpcy5jdXJyZW50Q2h1bmtCeXRlc1JlYWQgPSAwXG4gICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtZGF0YVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZmluaXNoIGNodW5rZWQgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZmluaXNoQ2h1bmtlZEJvZHkoKSB7XG4gICAgaWYgKHRoaXMuY2h1bmtlZEJvZHlDaGFycykge1xuICAgICAgdGhpcy5wb3N0Qm9keSA9IEJ1ZmZlci5mcm9tKHRoaXMuY2h1bmtlZEJvZHlDaGFycykudG9TdHJpbmcoXCJ1dGY4XCIpXG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMuY2h1bmtlZEJvZHlDaGFyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3U3RhdGUgLSBOZXcgc3RhdGUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWdMb3dMZXZlbCgoKSA9PiBgQ2hhbmdpbmcgc3RhdGUgZnJvbSAke3RoaXMuc3RhdGV9IHRvICR7bmV3U3RhdGV9YClcbiAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGVcbiAgfVxuXG4gIGNvbXBsZXRlUmVxdWVzdCA9ICgpID0+IHtcbiAgICB0aGlzLnN0YXRlID0gXCJzdGF0dXNcIiAvLyBSZXNldCBzdGF0ZSB0byBuZXcgcmVxdWVzdFxuICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZVxuXG4gICAgaWYgKHRoaXMuZ2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIpPy52YWx1ZT8uc3RhcnRzV2l0aChcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICAgIHRoaXMucGFyc2VBcHBsaWNhdGlvbkpzb25QYXJhbXMoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5tdWx0aVBhcnR5Rm9ybURhdGEpIHtcbiAgICAgIC8vIERvbmUgYWZ0ZXIgZWFjaCBuZXcgZm9ybSBkYXRhIHBhcnRcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYXJzZVF1ZXJ5U3RyaW5nUG9zdFBhcmFtcygpXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMuZW1pdChcImNvbXBsZXRlZFwiKVxuICB9XG5cbiAgcGFyc2VBcHBsaWNhdGlvbkpzb25QYXJhbXMoKSB7XG4gICAgaWYgKHRoaXMucG9zdEJvZHkpIHtcbiAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IEpTT04ucGFyc2UodGhpcy5wb3N0Qm9keSlcblxuICAgICAgaW5jb3Jwb3JhdGUodGhpcy5wYXJhbXMsIG5ld1BhcmFtcylcbiAgICB9XG4gIH1cblxuICBwYXJzZVF1ZXJ5U3RyaW5nUG9zdFBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnBvc3RCb2R5KVxuICAgICAgICAvKipcbiAgICAgICAgICogVW5wYXJzZWQgcGFyYW1zLlxuICAgICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+fSAqL1xuICAgICAgICBjb25zdCB1bnBhcnNlZFBhcmFtcyA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkUXVlcnkpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdW5wYXJzZWRQYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zVG9PYmplY3QgPSBuZXcgUGFyYW1zVG9PYmplY3QodW5wYXJzZWRQYXJhbXMpXG4gICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IHBhcmFtc1RvT2JqZWN0LnRvT2JqZWN0KClcblxuICAgICAgICBpbmNvcnBvcmF0ZSh0aGlzLnBhcmFtcywgbmV3UGFyYW1zKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZW5zdXJlZEVycm9yID0gLyoqIEB0eXBlIHtFcnJvciAmIHt2ZWxvY2lvdXNDb250ZXh0PzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0gKi8gKGVycm9yKVxuXG4gICAgICAgIGVuc3VyZWRFcnJvci52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAgIC4uLihlbnN1cmVkRXJyb3IudmVsb2Npb3VzQ29udGV4dCB8fCB7fSksXG4gICAgICAgICAgcmVxdWVzdFBhcnNpbmc6IHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmdldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiKT8udmFsdWUsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiB0aGlzLmh0dHBNZXRob2QsXG4gICAgICAgICAgICBwYXJhbWV0ZXJLZXlzOiBPYmplY3Qua2V5cyhxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnBvc3RCb2R5KSksXG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgICAgICBwb3N0Qm9keVByZXZpZXc6IHRydW5jYXRlUHJldmlldyh0aGlzLnBvc3RCb2R5KSxcbiAgICAgICAgICAgIHN0YWdlOiBcInF1ZXJ5LXN0cmluZy1wb3N0LXBhcmFtc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZW5zdXJlZEVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
570
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtYnVmZmVyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFlBQVksTUFBTSxpQ0FBaUMsQ0FBQTtBQUMxRCxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUM5QyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ3pELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sb0JBQW9CLENBQUE7QUFDdkMsT0FBTyxjQUFjLE1BQU0sd0JBQXdCLENBQUE7QUFDbkQsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFBO0FBRXJDOzs7eUJBR3lCO0FBQ3pCLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7QUFFNUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLEdBQUc7SUFDekMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV2QyxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQTtBQUN0QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxhQUFhO0lBQ2hDLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFFZCxtQ0FBbUM7SUFDbkMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtJQUUzQjs7MEJBRXNCO0lBQ3RCLElBQUksR0FBRyxFQUFFLENBQUE7SUFFVCxNQUFN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LFlBQVksQ0FBQyxnQkFBZ0IsR0FBRztvQkFDOUIsR0FBRyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7b0JBQ3hDLGNBQWMsRUFBRTt3QkFDZCxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLO3dCQUNsRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7d0JBQzNCLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM1RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsZUFBZSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO3dCQUMvQyxLQUFLLEVBQUUsMEJBQTBCO3FCQUNsQztpQkFDRixDQUFBO2dCQUVELE1BQU0sWUFBWSxDQUFBO1lBQ3BCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXIuanNcIlxuaW1wb3J0IEZvcm1EYXRhUGFydCBmcm9tIFwiLi9mb3JtLWRhdGEtcGFydC5qc1wiXG5pbXBvcnQgSGVhZGVyIGZyb20gXCIuL2hlYWRlci5qc1wiXG5pbXBvcnQge0h0dHBSZXF1ZXN0Qm9keVRvb0xhcmdlRXJyb3J9IGZyb20gXCIuLi9lcnJvcnMuanNcIlxuaW1wb3J0IHtpbmNvcnBvcmF0ZX0gZnJvbSBcImluY29ycG9yYXRvclwiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFBhcmFtc1RvT2JqZWN0IGZyb20gXCIuLi9wYXJhbXMtdG8tb2JqZWN0LmpzXCJcbmltcG9ydCBxdWVyeXN0cmluZyBmcm9tIFwicXVlcnlzdHJpbmdcIlxuXG4vKipcbiAqIFJlcXVlc3QgaGVhZGVyIGZpZWxkcyB3aG9zZSByZXBlYXRlZCB3aXJlIGZpZWxkcyBjb21iaW5lIGludG8gb25lIHZhbHVlXG4gKiAoUkZDIDkxMTAgwqc1LjMpIGJlZm9yZSB0aGUgc2VydmVyIGNvbnN1bWVzIHRoZW0uXG4gKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG5jb25zdCBDT01CSU5JTkdfSEVBREVSX0ZJRUxEUyA9IG5ldyBTZXQoW1wiYWNjZXB0LWVuY29kaW5nXCJdKVxuXG4vKipcbiAqIFJ1bnMgdHJ1bmNhdGUgcHJldmlldy5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBpbnB1dCAtIElucHV0IHN0cmluZy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIC0gTWF4IHByZXZpZXcgbGVuZ3RoLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUcnVuY2F0ZWQgcHJldmlldy5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVQcmV2aWV3KGlucHV0LCBsaW1pdCA9IDMwMCkge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkXG4gIGlmIChpbnB1dC5sZW5ndGggPD0gbGltaXQpIHJldHVybiBpbnB1dFxuXG4gIHJldHVybiBgJHtpbnB1dC5zbGljZSgwLCBsaW1pdCl9Li4uYFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXF1ZXN0QnVmZmVyIHtcbiAgYm9keUxlbmd0aCA9IDBcblxuICAvKiogQHR5cGUge0J1ZmZlcltdIHwgdW5kZWZpbmVkfSAqL1xuICBwb3N0Qm9keUJ1ZmZlcnMgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGF0YS5cbiAgICogQHR5cGUge251bWJlcltdfSAqL1xuICBkYXRhID0gW11cblxuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAvKipcbiAgICogSGVhZGVycyBieSBuYW1lLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgSGVhZGVyPn0gKi9cbiAgaGVhZGVyc0J5TmFtZSA9IHt9XG4gIC8qKlxuICAgKiBDaHVua2VkIGJvZHkgY2hhcnMuXG4gICAqIEB0eXBlIHtudW1iZXJbXSB8IHVuZGVmaW5lZH0gKi9cbiAgY2h1bmtlZEJvZHlDaGFycyA9IHVuZGVmaW5lZFxuXG4gIG11bHRpUGFydHlGb3JtRGF0YSA9IGZhbHNlXG5cbiAgY29tcGxldGVkID0gZmFsc2VcbiAgcGFyYW1zID0ge31cbiAgcmVhZGluZ0JvZHkgPSBmYWxzZVxuICBzdGF0ZSA9IFwic3RhdHVzXCJcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbn0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMsIHtkZWJ1ZzogZmFsc2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJhaXNlcyBiZWZvcmUgYnVmZmVyaW5nIGEgcmVxdWVzdCBib2R5IGJleW9uZCB0aGUgY29uZmlndXJlZCBib3VuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFjdHVhbEJ5dGVzIC0gRGVjbGFyZWQgb3IgYWNjdW11bGF0ZWQgZGVjb2RlZCBib2R5IGJ5dGVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2VydFJlcXVlc3RCb2R5U2l6ZShhY3R1YWxCeXRlcykge1xuICAgIGNvbnN0IG1heEJ5dGVzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEh0dHBTZXJ2ZXJNYXhSZXF1ZXN0Qm9keUJ5dGVzKClcblxuICAgIGlmIChtYXhCeXRlcyAhPT0gdW5kZWZpbmVkICYmIGFjdHVhbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBIdHRwUmVxdWVzdEJvZHlUb29MYXJnZUVycm9yKHthY3R1YWxCeXRlcywgbWF4Qnl0ZXN9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGJ5dGVzIGNvbnN1bWVkIGFmdGVyIHJlcXVlc3QgaGVhZGVycy4gTXVsdGlwYXJ0IHBhcnNpbmcgY2FuIGFjY2VwdFxuICAgKiBhbiB1bmZyYW1lZCBib2R5LCBzbyBlbmZvcmNlIGl0cyBjb25maWd1cmVkIGJvdW5kIGR1cmluZyBhY2N1bXVsYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBieXRlcyAtIE5ld2x5IGNvbnN1bWVkIGJvZHkgYnl0ZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVjb3JkQm9keUJ5dGVzKGJ5dGVzKSB7XG4gICAgdGhpcy5ib2R5TGVuZ3RoICs9IGJ5dGVzXG5cbiAgICBpZiAodGhpcy5tdWx0aVBhcnR5Rm9ybURhdGEpIHRoaXMuYXNzZXJ0UmVxdWVzdEJvZHlTaXplKHRoaXMuYm9keUxlbmd0aClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgLy8gRG8gbm90aGluZyBmb3Igbm93Li4uXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmZWVkLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0J1ZmZlciB8IHVuZGVmaW5lZH0gLSBSZW1haW5pbmcgZGF0YSwgaWYgYW55LlxuICAgKi9cbiAgZmVlZChkYXRhKSB7XG4gICAgbGV0IGluZGV4ID0gMFxuXG4gICAgd2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgIHN3aXRjaCh0aGlzLnN0YXRlKSB7XG4gICAgICAgIGNhc2UgXCJzdGF0dXNcIjpcbiAgICAgICAgY2FzZSBcImhlYWRlcnNcIjpcbiAgICAgICAgY2FzZSBcIm11bHRpLXBhcnQtZm9ybS1kYXRhXCI6XG4gICAgICAgIGNhc2UgXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YS1oZWFkZXJcIjpcbiAgICAgICAgY2FzZSBcImNodW5rZWQtc2l6ZVwiOlxuICAgICAgICBjYXNlIFwiY2h1bmtlZC10cmFpbGVyXCI6XG4gICAgICAgICAgaW5kZXggPSB0aGlzLmZlZWRMaW5lKGRhdGEsIGluZGV4KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgXCJwb3N0LWJvZHlcIjpcbiAgICAgICAgICBpbmRleCA9IHRoaXMuZmVlZFBvc3RCb2R5KGRhdGEsIGluZGV4KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaW5kZXggPSB0aGlzLmZlZWRCeXRlKGRhdGEsIGluZGV4KVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoaW5kZXgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGJ5dGVzIGZvciB0aGUgbGluZS1iYXNlZCBzdGF0ZXMgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgbmV4dCBuZXdsaW5lLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIERhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gUmVhZCBwb3NpdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gLSBOZXcgcmVhZCBwb3NpdGlvbi5cbiAgICovXG4gIGZlZWRMaW5lKGRhdGEsIGluZGV4KSB7XG4gICAgY29uc3QgbmV3bGluZUluZGV4ID0gZGF0YS5pbmRleE9mKDEwLCBpbmRleClcblxuICAgIGlmIChuZXdsaW5lSW5kZXggPT09IC0xKSB7XG4gICAgICBpZiAodGhpcy5yZWFkaW5nQm9keSkgdGhpcy5yZWNvcmRCb2R5Qnl0ZXMoZGF0YS5sZW5ndGggLSBpbmRleClcblxuICAgICAgZm9yIChsZXQgZGF0YUluZGV4ID0gaW5kZXg7IGRhdGFJbmRleCA8IGRhdGEubGVuZ3RoOyBkYXRhSW5kZXggKz0gMSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaChkYXRhW2RhdGFJbmRleF0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhLmxlbmd0aFxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRpbmdCb2R5KSB0aGlzLnJlY29yZEJvZHlCeXRlcyhuZXdsaW5lSW5kZXggKyAxIC0gaW5kZXgpXG5cbiAgICBsZXQgbGluZVxuXG4gICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPT0gMCkge1xuICAgICAgbGluZSA9IGRhdGEudG9TdHJpbmcoXCJsYXRpbjFcIiwgaW5kZXgsIG5ld2xpbmVJbmRleCArIDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXN0IG9mIGEgbGluZSB0aGF0IHN0YXJ0ZWQgaW4gYSBwcmV2aW91cyBjaHVuay5cbiAgICAgIGZvciAobGV0IGRhdGFJbmRleCA9IGluZGV4OyBkYXRhSW5kZXggPD0gbmV3bGluZUluZGV4OyBkYXRhSW5kZXggKz0gMSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaChkYXRhW2RhdGFJbmRleF0pXG4gICAgICB9XG5cbiAgICAgIGxpbmUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHRoaXMuZGF0YSlcbiAgICAgIHRoaXMuZGF0YSA9IFtdXG4gICAgfVxuXG4gICAgdGhpcy5wYXJzZShsaW5lKVxuXG4gICAgcmV0dXJuIG5ld2xpbmVJbmRleCArIDFcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBmaXhlZC1sZW5ndGggcmVxdWVzdCBib2R5IGJ5dGVzIGluIGJ1bGsuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBSZWFkIHBvc2l0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIE5ldyByZWFkIHBvc2l0aW9uLlxuICAgKi9cbiAgZmVlZFBvc3RCb2R5KGRhdGEsIGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLnBvc3RCb2R5QnVmZmVycykgdGhyb3cgbmV3IEVycm9yKFwicG9zdEJvZHlCdWZmZXJzIG5vdCBpbml0aWFsaXplZFwiKVxuICAgIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiQ29udGVudCBsZW5ndGggbm90IHNldFwiKVxuXG4gICAgY29uc3QgcmVtYWluaW5nQm9keUJ5dGVzID0gTWF0aC5tYXgoMSwgdGhpcy5jb250ZW50TGVuZ3RoIC0gdGhpcy5ib2R5TGVuZ3RoKVxuICAgIGNvbnN0IGVuZEluZGV4ID0gTWF0aC5taW4oZGF0YS5sZW5ndGgsIGluZGV4ICsgcmVtYWluaW5nQm9keUJ5dGVzKVxuXG4gICAgdGhpcy5wb3N0Qm9keUJ1ZmZlcnMucHVzaChkYXRhLnN1YmFycmF5KGluZGV4LCBlbmRJbmRleCkpXG4gICAgdGhpcy5yZWNvcmRCb2R5Qnl0ZXMoZW5kSW5kZXggLSBpbmRleClcblxuICAgIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggJiYgdGhpcy5ib2R5TGVuZ3RoID49IHRoaXMuY29udGVudExlbmd0aCkge1xuICAgICAgdGhpcy5wb3N0UmVxdWVzdERvbmUoKVxuICAgIH1cblxuICAgIHJldHVybiBlbmRJbmRleFxuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGEgc2luZ2xlIGJ5dGUgZm9yIHRoZSBieXRlLWJhc2VkIHBhcnNlciBzdGF0ZXMuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gRGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBSZWFkIHBvc2l0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIE5ldyByZWFkIHBvc2l0aW9uLlxuICAgKi9cbiAgZmVlZEJ5dGUoZGF0YSwgaW5kZXgpIHtcbiAgICBjb25zdCBjaGFyID0gZGF0YVtpbmRleF1cblxuICAgIGlmICh0aGlzLnJlYWRpbmdCb2R5KSB0aGlzLnJlY29yZEJvZHlCeXRlcygxKVxuXG4gICAgc3dpdGNoKHRoaXMuc3RhdGUpIHtcbiAgICAgIGNhc2UgXCJjaHVua2VkLWRhdGFcIjoge1xuICAgICAgICBjb25zdCBjaHVua2VkQm9keUNoYXJzID0gdGhpcy5jaHVua2VkQm9keUNoYXJzXG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENodW5rU2l6ZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoXCJDaHVuayBzaXplIG5vdCBpbml0aWFsaXplZFwiKVxuICAgICAgICBpZiAoIWNodW5rZWRCb2R5Q2hhcnMpIHRocm93IG5ldyBFcnJvcihcIkNodW5rZWQgYm9keSBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgICBjaHVua2VkQm9keUNoYXJzLnB1c2goY2hhcilcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnQgY2h1bmsgYnl0ZXMgcmVhZC5cbiAgICAgICAgICogQHR5cGUge251bWJlcn0gKi9cbiAgICAgICAgY29uc3QgY3VycmVudENodW5rQnl0ZXNSZWFkID0gKHRoaXMuY3VycmVudENodW5rQnl0ZXNSZWFkIHx8IDApICsgMVxuXG4gICAgICAgIHRoaXMuY3VycmVudENodW5rQnl0ZXNSZWFkID0gY3VycmVudENodW5rQnl0ZXNSZWFkXG5cbiAgICAgICAgaWYgKGN1cnJlbnRDaHVua0J5dGVzUmVhZCA+PSB0aGlzLmN1cnJlbnRDaHVua1NpemUpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkID0gMFxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJjaHVua2VkLWRhdGEtY3JsZlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJjaHVua2VkLWRhdGEtY3JsZlwiOlxuICAgICAgICB0aGlzLmN1cnJlbnRDaHVua0NybGZSZWFkID0gKHRoaXMuY3VycmVudENodW5rQ3JsZlJlYWQgfHwgMCkgKyAxXG5cbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENodW5rQ3JsZlJlYWQgPj0gMikge1xuICAgICAgICAgIHRoaXMuY3VycmVudENodW5rQnl0ZXNSZWFkID0gMFxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXCJjaHVua2VkLXNpemVcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibXVsdGktcGFydC1mb3JtLWRhdGEtYm9keVwiOiB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtRGF0YVBhcnQpIHRocm93IG5ldyBFcnJvcihcIkZvcm1EYXRhIHBhcnQgbm90IGluaXRpYWxpemVkXCIpXG4gICAgICAgIGlmICghdGhpcy5ib3VuZGFyeUxpbmVFbmQpIHRocm93IG5ldyBFcnJvcihcIkJvdW5kYXJ5IGxpbmUgZW5kIG5vdCBpbml0aWFsaXplZFwiKVxuICAgICAgICBpZiAoIXRoaXMuYm91bmRhcnlMaW5lTmV4dCkgdGhyb3cgbmV3IEVycm9yKFwiQm91bmRhcnkgbGluZSBuZXh0IG5vdCBpbml0aWFsaXplZFwiKVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZvcm1EYXRhUGFydC5ib2R5XG5cbiAgICAgICAgYm9keS5wdXNoKGNoYXIpXG5cbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeUVuZFBvc2l0aW9uID0gYm9keS5sZW5ndGggLSB0aGlzLmJvdW5kYXJ5TGluZUVuZC5sZW5ndGhcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeUVuZENoYXJzID0gYm9keS5zbGljZShwb3NzaWJsZUJvdW5kYXJ5RW5kUG9zaXRpb24sIGJvZHkubGVuZ3RoKVxuICAgICAgICBjb25zdCBwb3NzaWJsZUJvdW5kYXJ5RW5kID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBwb3NzaWJsZUJvdW5kYXJ5RW5kQ2hhcnMpXG5cbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeU5leHRQb3NpdGlvbiA9IGJvZHkubGVuZ3RoIC0gdGhpcy5ib3VuZGFyeUxpbmVOZXh0Lmxlbmd0aFxuICAgICAgICBjb25zdCBwb3NzaWJsZUJvdW5kYXJ5TmV4dENoYXJzID0gYm9keS5zbGljZShwb3NzaWJsZUJvdW5kYXJ5TmV4dFBvc2l0aW9uLCBib2R5Lmxlbmd0aClcbiAgICAgICAgY29uc3QgcG9zc2libGVCb3VuZGFyeU5leHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHBvc3NpYmxlQm91bmRhcnlOZXh0Q2hhcnMpXG5cbiAgICAgICAgaWYgKHBvc3NpYmxlQm91bmRhcnlFbmQgPT0gdGhpcy5ib3VuZGFyeUxpbmVFbmQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1EYXRhUGFydC5yZW1vdmVGcm9tQm9keShwb3NzaWJsZUJvdW5kYXJ5RW5kKVxuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICAgICAgICB9IGVsc2UgaWYgKHBvc3NpYmxlQm91bmRhcnlOZXh0ID09IHRoaXMuYm91bmRhcnlMaW5lTmV4dCkge1xuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0LnJlbW92ZUZyb21Cb2R5KHBvc3NpYmxlQm91bmRhcnlOZXh0KVxuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG4gICAgICAgICAgdGhpcy5uZXdGb3JtRGF0YVBhcnQoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudExlbmd0aCAmJiB0aGlzLmJvZHlMZW5ndGggPj0gdGhpcy5jb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mb3JtRGF0YVBhcnREb25lKClcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtRGF0YVBhcnQuY29udGVudExlbmd0aCAmJiB0aGlzLmJvZHlMZW5ndGggPj0gdGhpcy5mb3JtRGF0YVBhcnQuY29udGVudExlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZm9ybURhdGFQYXJ0RG9uZSgpXG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHViXCIpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKCkgPT4gW2BVbmtub3duIHN0YXRlIGZvciByZXF1ZXN0IGJ1ZmZlcmAsIHtzdGF0ZTogdGhpcy5zdGF0ZX1dKVxuICAgIH1cblxuICAgIHJldHVybiBpbmRleCArIDFcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTmFtZS5cbiAgICogQHJldHVybnMge0hlYWRlcn0gLSBUaGUgaGVhZGVyLlxuICAgKi9cbiAgZ2V0SGVhZGVyKG5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhlYWRlcnNCeU5hbWVbbmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKV1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gW2BnZXRIZWFkZXIgJHtuYW1lfWAsIHtyZXN1bHQ6IHJlc3VsdD8udG9TdHJpbmcoKX1dKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGhlYWRlcnMgaGFzaC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gVGhlIGhlYWRlcnMgaGFzaC5cbiAgICovXG4gIGdldEhlYWRlcnNIYXNoKCkge1xuICAgIC8qKlxuICAgICAqIFJlc3VsdC5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJGb3JtYXR0ZWROYW1lIGluIHRoaXMuaGVhZGVyc0J5TmFtZSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5oZWFkZXJzQnlOYW1lW2hlYWRlckZvcm1hdHRlZE5hbWVdXG5cbiAgICAgIHJlc3VsdFtoZWFkZXIuZ2V0TmFtZSgpXSA9IGhlYWRlci5nZXRWYWx1ZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZm9ybSBkYXRhIHBhcnQgZG9uZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZm9ybURhdGFQYXJ0RG9uZSgpIHtcbiAgICBjb25zdCBmb3JtRGF0YVBhcnQgPSB0aGlzLmZvcm1EYXRhUGFydFxuXG4gICAgaWYgKCFmb3JtRGF0YVBhcnQpIHRocm93IG5ldyBFcnJvcihcImZvcm1EYXRhUGFydCB3YXNudCBzZXRcIilcblxuICAgIHRoaXMuZm9ybURhdGFQYXJ0ID0gdW5kZWZpbmVkXG4gICAgZm9ybURhdGFQYXJ0LmZpbmlzaCgpXG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiZm9ybS1kYXRhLXBhcnRcIiwgZm9ybURhdGFQYXJ0KVxuICB9XG5cbiAgaXNNdWx0aVBhcnR5Rm9ybURhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlQYXJ0eUZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogUnVucyBuZXcgZm9ybSBkYXRhIHBhcnQuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG5ld0Zvcm1EYXRhUGFydCgpIHtcbiAgICB0aGlzLmZvcm1EYXRhUGFydCA9IG5ldyBGb3JtRGF0YVBhcnQoKVxuICAgIHRoaXMuc2V0U3RhdGUoXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YS1oZWFkZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBhcnNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIExpbmUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHBhcnNlKGxpbmUpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PSBcInN0YXR1c1wiKSB7XG4gICAgICB0aGlzLnBhcnNlU3RhdHVzTGluZShsaW5lKVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcImhlYWRlcnNcIikge1xuICAgICAgdGhpcy5wYXJzZUhlYWRlcihsaW5lKVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcImNodW5rZWQtc2l6ZVwiKSB7XG4gICAgICB0aGlzLnBhcnNlQ2h1bmtTaXplTGluZShsaW5lKVxuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PSBcImNodW5rZWQtdHJhaWxlclwiKSB7XG4gICAgICBpZiAobGluZSA9PSBcIlxcclxcblwiKSB7XG4gICAgICAgIHRoaXMuZmluaXNoQ2h1bmtlZEJvZHkoKVxuICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwibXVsdGktcGFydC1mb3JtLWRhdGFcIikge1xuICAgICAgaWYgKGxpbmUgPT0gdGhpcy5ib3VuZGFyeUxpbmUpIHtcbiAgICAgICAgdGhpcy5uZXdGb3JtRGF0YVBhcnQoKVxuICAgICAgfSBlbHNlIGlmIChsaW5lID09IFwiXFxyXFxuXCIpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShcImRvbmVcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYm91bmRhcnkgbGluZSBidXQgZGlkbid0IGdldCBpdDogJHtsaW5lfWApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09IFwibXVsdGktcGFydC1mb3JtLWRhdGEtaGVhZGVyXCIpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMucmVhZEhlYWRlckZyb21MaW5lKGxpbmUpXG5cbiAgICAgIGlmIChoZWFkZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1EYXRhUGFydCkgdGhyb3cgbmV3IEVycm9yKFwiZm9ybURhdGFQYXJ0IG5vdCBzZXRcIilcblxuICAgICAgICB0aGlzLmZvcm1EYXRhUGFydC5hZGRIZWFkZXIoaGVhZGVyKVxuICAgICAgICAvL3RoaXMuc3RhdGUgPT0gXCJtdWx0aS1wYXJ0LWZvcm0tZGF0YVwiXG4gICAgICB9IGVsc2UgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFwibXVsdGktcGFydC1mb3JtLWRhdGEtYm9keVwiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhdGUgcGFyc2luZyBsaW5lOiAke3RoaXMuc3RhdGV9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZWFkIGhlYWRlciBmcm9tIGxpbmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gTGluZS5cbiAgICogQHJldHVybnMge0hlYWRlciB8IHVuZGVmaW5lZH0gLSBUaGUgaGVhZGVyIGZyb20gbGluZS5cbiAgICovXG4gIHJlYWRIZWFkZXJGcm9tTGluZShsaW5lKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eKC4rKTogKC4rKVxcclxcbi8pXG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IG5ldyBIZWFkZXIobWF0Y2hbMV0sIG1hdGNoWzJdKVxuXG4gICAgICByZXR1cm4gaGVhZGVyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGhlYWRlci5cbiAgICogQHBhcmFtIHtIZWFkZXJ9IGhlYWRlciAtIEhlYWRlciB2YWx1ZS5cbiAgICovXG4gIGFkZEhlYWRlcihoZWFkZXIpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWROYW1lID0gaGVhZGVyLmdldEZvcm1hdHRlZE5hbWUoKVxuICAgIGNvbnN0IGV4aXN0aW5nSGVhZGVyID0gdGhpcy5oZWFkZXJzQnlOYW1lW2Zvcm1hdHRlZE5hbWVdXG5cbiAgICAvLyBSRkMgOTExMCDCpzUuMzogYSBmaWVsZCBtYXkgYmUgcmVwZWF0ZWQ7IGl0cyB2YWx1ZSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZlxuICAgIC8vIGFsbCBmaWVsZCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgaW4gd2lyZSBvcmRlci4gT25seSBBY2NlcHQtRW5jb2RpbmdcbiAgICAvLyBpcyBjb25zdW1lZCBhcyBhIGNvbWJpbmVkIGZpZWxkIGJ5IHRoZSBzZXJ2ZXIuXG4gICAgaWYgKGV4aXN0aW5nSGVhZGVyICYmIENPTUJJTklOR19IRUFERVJfRklFTERTLmhhcyhmb3JtYXR0ZWROYW1lKSkge1xuICAgICAgZXhpc3RpbmdIZWFkZXIudmFsdWUgKz0gYCwgJHtoZWFkZXIuZ2V0VmFsdWUoKX1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyc0J5TmFtZVtmb3JtYXR0ZWROYW1lXSA9IGhlYWRlclxuICAgIH1cblxuICAgIGlmIChmb3JtYXR0ZWROYW1lID09IFwiY29udGVudC1sZW5ndGhcIikgdGhpcy5jb250ZW50TGVuZ3RoID0gcGFyc2VJbnQoaGVhZGVyLmdldFZhbHVlKCkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZSBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaW5lIC0gTGluZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcGFyc2VIZWFkZXIobGluZSkge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMucmVhZEhlYWRlckZyb21MaW5lKGxpbmUpXG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBQYXJzZWQgaGVhZGVyOiAke2hlYWRlci50b1N0cmluZygpfWApXG4gICAgICB0aGlzLmFkZEhlYWRlcihoZWFkZXIpXG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiaGVhZGVyXCIsIGhlYWRlcilcbiAgICB9IGVsc2UgaWYgKGxpbmUgPT0gXCJcXHJcXG5cIikge1xuICAgICAgY29uc3QgaHR0cE1ldGhvZCA9IHRoaXMuaHR0cE1ldGhvZD8udG9VcHBlckNhc2UoKVxuXG4gICAgICBpZiAoIWh0dHBNZXRob2QpIHRocm93IG5ldyBFcnJvcihcIkhUVFAgbWV0aG9kIG5vdCBzZXRcIilcblxuICAgICAgaWYgKCF0aGlzLmV4cGVjdHNSZXF1ZXN0Qm9keShodHRwTWV0aG9kKSkge1xuICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaHVua2VkRW5jb2RpbmcoKSkge1xuICAgICAgICB0aGlzLnJlYWRpbmdCb2R5ID0gdHJ1ZVxuICAgICAgICB0aGlzLmJvZHlMZW5ndGggPSAwXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNodW5rZWRCb2R5KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVhZGluZ0JvZHkgPSB0cnVlXG4gICAgICAgIHRoaXMuYm9keUxlbmd0aCA9IDBcblxuICAgICAgICBpZiAodGhpcy5jb250ZW50TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHRoaXMuY29udGVudExlbmd0aCkpIHRocm93IG5ldyBFcnJvcihcIkNvbnRlbnQgbGVuZ3RoIGlzIGludmFsaWRcIilcblxuICAgICAgICAgIHRoaXMuYXNzZXJ0UmVxdWVzdEJvZHlTaXplKHRoaXMuY29udGVudExlbmd0aClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5nZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIik/LnZhbHVlPy5tYXRjaCgvXm11bHRpcGFydFxcL2Zvcm0tZGF0YTtcXHMqYm91bmRhcnk9KC4rKSQvaSlcblxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5ID0gbWF0Y2hbMV1cbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5TGluZSA9IGAtLSR7dGhpcy5ib3VuZGFyeX1cXHJcXG5gXG4gICAgICAgICAgdGhpcy5ib3VuZGFyeUxpbmVOZXh0ID0gYFxcclxcbi0tJHt0aGlzLmJvdW5kYXJ5fVxcclxcbmBcbiAgICAgICAgICB0aGlzLmJvdW5kYXJ5TGluZUVuZCA9IGBcXHJcXG4tLSR7dGhpcy5ib3VuZGFyeX0tLWBcbiAgICAgICAgICB0aGlzLm11bHRpUGFydHlGb3JtRGF0YSA9IHRydWVcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwibXVsdGktcGFydC1mb3JtLWRhdGFcIilcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnRMZW5ndGggPT09IDAgfHwgdGhpcy5jb250ZW50TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlUmVxdWVzdCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAqIEB0eXBlIHtCdWZmZXJbXX0gKi9cbiAgICAgICAgICB0aGlzLnBvc3RCb2R5QnVmZmVycyA9IFtdXG5cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKFwicG9zdC1ib2R5XCIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBwYXJzZSBzdGF0dXMgbGluZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBMaW5lLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBwYXJzZVN0YXR1c0xpbmUobGluZSkge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXihbQS1aLV0rKSAoLis/KSBIVFRQXFwvKC4rKVxcclxcbi8pXG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IG1hdGNoIHN0YXR1cyBsaW5lIGZyb206ICR7bGluZX1gKVxuICAgIH1cblxuICAgIHRoaXMuaHR0cE1ldGhvZCA9IG1hdGNoWzFdXG4gICAgdGhpcy5odHRwVmVyc2lvbiA9IG1hdGNoWzNdXG4gICAgdGhpcy5wYXRoID0gbWF0Y2hbMl1cbiAgICB0aGlzLnNldFN0YXRlKFwiaGVhZGVyc1wiKVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnTG93TGV2ZWwoKCkgPT4gW1wiUGFyc2VkIHN0YXR1cyBsaW5lXCIsIHtodHRwTWV0aG9kOiB0aGlzLmh0dHBNZXRob2QsIGh0dHBWZXJzaW9uOiB0aGlzLmh0dHBWZXJzaW9uLCBwYXRoOiB0aGlzLnBhdGh9XSlcbiAgfVxuXG4gIHBvc3RSZXF1ZXN0RG9uZSgpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keUJ1ZmZlcnMpIHtcbiAgICAgIHRoaXMucG9zdEJvZHkgPSBCdWZmZXIuY29uY2F0KHRoaXMucG9zdEJvZHlCdWZmZXJzKS50b1N0cmluZyhcInV0ZjhcIilcbiAgICB9XG5cbiAgICB0aGlzLnBvc3RCb2R5QnVmZmVycyA9IHVuZGVmaW5lZFxuXG4gICAgdGhpcy5jb21wbGV0ZVJlcXVlc3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhwZWN0cyByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodHRwTWV0aG9kIC0gSFRUUCBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlcXVlc3QgZXhwZWN0cyBhIGJvZHkuXG4gICAqL1xuICBleHBlY3RzUmVxdWVzdEJvZHkoaHR0cE1ldGhvZCkge1xuICAgIHJldHVybiAhW1wiR0VUXCIsIFwiT1BUSU9OU1wiLCBcIkhFQURcIl0uaW5jbHVkZXMoaHR0cE1ldGhvZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGNodW5rZWQgZW5jb2RpbmcuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIHJlcXVlc3QgdXNlcyBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLlxuICAgKi9cbiAgaXNDaHVua2VkRW5jb2RpbmcoKSB7XG4gICAgY29uc3QgdHJhbnNmZXJFbmNvZGluZyA9IHRoaXMuZ2V0SGVhZGVyKFwidHJhbnNmZXItZW5jb2RpbmdcIik/LnZhbHVlPy50b0xvd2VyQ2FzZSgpXG5cbiAgICByZXR1cm4gQm9vbGVhbih0cmFuc2ZlckVuY29kaW5nPy5pbmNsdWRlcyhcImNodW5rZWRcIikpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbml0aWFsaXplIGNodW5rZWQgYm9keS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgaW5pdGlhbGl6ZUNodW5rZWRCb2R5KCkge1xuICAgIHRoaXMuY2h1bmtlZEJvZHlDaGFycyA9IFtdXG4gICAgdGhpcy5jdXJyZW50Q2h1bmtTaXplID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50Q2h1bmtCeXRlc1JlYWQgPSAwXG4gICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtc2l6ZVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGFyc2UgY2h1bmsgc2l6ZSBsaW5lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIENodW5rIHNpemUgbGluZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgcGFyc2VDaHVua1NpemVMaW5lKGxpbmUpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKClcblxuICAgIGlmICghdHJpbW1lZCkgcmV0dXJuXG5cbiAgICBjb25zdCBzaXplVG9rZW4gPSB0cmltbWVkLnNwbGl0KFwiO1wiKVswXT8udHJpbSgpXG5cbiAgICBpZiAoIXNpemVUb2tlbikgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNodW5rIHNpemUgbGluZTogJHtsaW5lfWApXG5cbiAgICBjb25zdCBzaXplID0gTnVtYmVyLnBhcnNlSW50KHNpemVUb2tlbiwgMTYpXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzaXplKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNodW5rIHNpemU6ICR7c2l6ZVRva2VufWApXG5cbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZShcImNodW5rZWQtdHJhaWxlclwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnRSZXF1ZXN0Qm9keVNpemUoKHRoaXMuY2h1bmtlZEJvZHlDaGFycz8ubGVuZ3RoIHx8IDApICsgc2l6ZSlcblxuICAgIHRoaXMuY3VycmVudENodW5rU2l6ZSA9IHNpemVcbiAgICB0aGlzLmN1cnJlbnRDaHVua0J5dGVzUmVhZCA9IDBcbiAgICB0aGlzLnNldFN0YXRlKFwiY2h1bmtlZC1kYXRhXCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmaW5pc2ggY2h1bmtlZCBib2R5LlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBmaW5pc2hDaHVua2VkQm9keSgpIHtcbiAgICBpZiAodGhpcy5jaHVua2VkQm9keUNoYXJzKSB7XG4gICAgICB0aGlzLnBvc3RCb2R5ID0gQnVmZmVyLmZyb20odGhpcy5jaHVua2VkQm9keUNoYXJzKS50b1N0cmluZyhcInV0ZjhcIilcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5jaHVua2VkQm9keUNoYXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgc3RhdGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdTdGF0ZSAtIE5ldyBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Z0xvd0xldmVsKCgpID0+IGBDaGFuZ2luZyBzdGF0ZSBmcm9tICR7dGhpcy5zdGF0ZX0gdG8gJHtuZXdTdGF0ZX1gKVxuICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZVxuICB9XG5cbiAgY29tcGxldGVSZXF1ZXN0ID0gKCkgPT4ge1xuICAgIHRoaXMuc3RhdGUgPSBcInN0YXR1c1wiIC8vIFJlc2V0IHN0YXRlIHRvIG5ldyByZXF1ZXN0XG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlXG5cbiAgICBpZiAodGhpcy5nZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIik/LnZhbHVlPy5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgdGhpcy5wYXJzZUFwcGxpY2F0aW9uSnNvblBhcmFtcygpXG4gICAgfSBlbHNlIGlmICh0aGlzLm11bHRpUGFydHlGb3JtRGF0YSkge1xuICAgICAgLy8gRG9uZSBhZnRlciBlYWNoIG5ldyBmb3JtIGRhdGEgcGFydFxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnNlUXVlcnlTdHJpbmdQb3N0UGFyYW1zKClcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiY29tcGxldGVkXCIpXG4gIH1cblxuICBwYXJzZUFwcGxpY2F0aW9uSnNvblBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5wb3N0Qm9keSkge1xuICAgICAgY29uc3QgbmV3UGFyYW1zID0gSlNPTi5wYXJzZSh0aGlzLnBvc3RCb2R5KVxuXG4gICAgICBpbmNvcnBvcmF0ZSh0aGlzLnBhcmFtcywgbmV3UGFyYW1zKVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlUXVlcnlTdHJpbmdQb3N0UGFyYW1zKCkge1xuICAgIGlmICh0aGlzLnBvc3RCb2R5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucG9zdEJvZHkpXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbnBhcnNlZCBwYXJhbXMuXG4gICAgICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT59ICovXG4gICAgICAgIGNvbnN0IHVucGFyc2VkUGFyYW1zID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWRRdWVyeSkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB1bnBhcnNlZFBhcmFtc1trZXldID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJhbXNUb09iamVjdCA9IG5ldyBQYXJhbXNUb09iamVjdCh1bnBhcnNlZFBhcmFtcylcbiAgICAgICAgY29uc3QgbmV3UGFyYW1zID0gcGFyYW1zVG9PYmplY3QudG9PYmplY3QoKVxuXG4gICAgICAgIGluY29ycG9yYXRlKHRoaXMucGFyYW1zLCBuZXdQYXJhbXMpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSAvKiogQHR5cGUge0Vycm9yICYge3ZlbG9jaW91c0NvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSAqLyAoZXJyb3IpXG5cbiAgICAgICAgZW5zdXJlZEVycm9yLnZlbG9jaW91c0NvbnRleHQgPSB7XG4gICAgICAgICAgLi4uKGVuc3VyZWRFcnJvci52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgICByZXF1ZXN0UGFyc2luZzoge1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHRoaXMuZ2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIpPy52YWx1ZSxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IHRoaXMuaHR0cE1ldGhvZCxcbiAgICAgICAgICAgIHBhcmFtZXRlcktleXM6IE9iamVjdC5rZXlzKHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucG9zdEJvZHkpKSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aCxcbiAgICAgICAgICAgIHBvc3RCb2R5UHJldmlldzogdHJ1bmNhdGVQcmV2aWV3KHRoaXMucG9zdEJvZHkpLFxuICAgICAgICAgICAgc3RhZ2U6IFwicXVlcnktc3RyaW5nLXBvc3QtcGFyYW1zXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlbnN1cmVkRXJyb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"request-runner.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/request-runner.js"],"names":[],"mappings":"AAKA,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAC/C,OAAO,QAAQ,MAAM,eAAe,CAAA;AAqGpC,MAAM,CAAC,OAAO,OAAO,sCAAsC;IAalD,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,sBAAsB;IACtB,aAAa;IACb,KAAK;IAlBZ,MAAM,6DAAqB;IAE3B;;;;;OAKG;IACH,YAAY,EAAC,aAAa,EAAE,OAAO,EAAC,EAHjC;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAChD;QAAwF,OAAO,EAAvF,OAAO,cAAc,EAAE,OAAO,GAAG,OAAO,wBAAwB,EAAE,OAAO,CACnF;KACmC,EAWnC;IAED,UAAU,8EAA0B;IACpC,QAAQ,WAAwB;IAE1B,GAAG,iBAiBR;IAEK,IAAI,kBAoKT;IAED;;;OAGG;IACG,mBAAmB,IAFZ,OAAO,CAAC,IAAI,CAAC,CA0BzB;CACF"}
1
+ {"version":3,"file":"request-runner.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/request-runner.js"],"names":[],"mappings":"AAMA,OAAO,MAAM,MAAM,iBAAiB,CAAA;AACpC,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAC/C,OAAO,QAAQ,MAAM,eAAe,CAAA;AAqGpC,MAAM,CAAC,OAAO,OAAO,sCAAsC;IAalD,MAAM;IACN,aAAa;IACb,OAAO;IACP,QAAQ;IACR,sBAAsB;IACtB,aAAa;IACb,KAAK;IAlBZ,MAAM,6DAAqB;IAE3B;;;;;OAKG;IACH,YAAY,EAAC,aAAa,EAAE,OAAO,EAAC,EAHjC;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAChD;QAAwF,OAAO,EAAvF,OAAO,cAAc,EAAE,OAAO,GAAG,OAAO,wBAAwB,EAAE,OAAO,CACnF;KACmC,EAWnC;IAED,UAAU,8EAA0B;IACpC,QAAQ,WAAwB;IAE1B,GAAG,iBAiBR;IAEK,IAAI,kBA0KT;IAED;;;OAGG;IACG,mBAAmB,IAFZ,OAAO,CAAC,IAAI,CAAC,CA0BzB;CACF"}
@@ -2,6 +2,7 @@
2
2
  import { ensureError } from "typanic";
3
3
  import BacktraceCleaner from "../../utils/backtrace-cleaner-node.js";
4
4
  import EventEmitter from "../../utils/event-emitter.js";
5
+ import { HttpResponseBodyTooLargeError } from "./errors.js";
5
6
  import Logger from "../../logger.js";
6
7
  import RequestTiming from "./request-timing.js";
7
8
  import Response from "./response.js";
@@ -270,7 +271,14 @@ export default class VelociousHttpServerClientRequestRunner {
270
271
  errorType: "framework-error"
271
272
  });
272
273
  response.setStatus(500);
273
- response.setErrorBody(error);
274
+ try {
275
+ response.setErrorBody(error);
276
+ }
277
+ catch (responseError) {
278
+ if (!(responseError instanceof HttpResponseBodyTooLargeError))
279
+ throw responseError;
280
+ response.setBody("");
281
+ }
274
282
  }
275
283
  await this.logger.debug(() => ["Request runner done", {
276
284
  httpMethod: request.httpMethod(),
@@ -306,4 +314,4 @@ export default class VelociousHttpServerClientRequestRunner {
306
314
  await logger[requestTiming.completedLogMethod](completedMessage);
307
315
  }
308
316
  }
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBQ25DLE9BQU8sZ0JBQWdCLE1BQU0sdUNBQXVDLENBQUE7QUFDcEUsT0FBTyxZQUFZLE1BQU0sOEJBQThCLENBQUE7QUFDdkQsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUE7QUFDcEMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxRQUFRLE1BQU0sZUFBZSxDQUFBO0FBQ3BDLE9BQU8sY0FBYyxNQUFNLDBCQUEwQixDQUFBO0FBQ3JELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBRTNEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxJQUFJO0lBQzFCLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFdkIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQ3BDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLHNCQUFzQjtJQUN4RCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUE7SUFFbEUsSUFBSSxXQUFXLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1FBQUUsT0FBTyxXQUFXLENBQUE7SUFFbkUsTUFBTSxTQUFTLEdBQUcsT0FBTyw0Q0FBNEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRO1FBQzdGLENBQUMsQ0FBQyw0Q0FBNEMsQ0FBQyxD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QUFHLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtRQUNqRyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUM5QixNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLGFBQWEsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQzVHLGVBQWUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNyRCxhQUFhLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDOUMsVUFBVSxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUc7WUFDbkYsaUJBQWlCLGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdEQsR0FBRztTQUNKLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRVYsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUNsRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtlbnN1cmVFcnJvcn0gZnJvbSBcInR5cGFuaWNcIlxuaW1wb3J0IEJhY2t0cmFjZUNsZWFuZXIgZnJvbSBcIi4uLy4uL3V0aWxzL2JhY2t0cmFjZS1jbGVhbmVyLW5vZGUuanNcIlxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiLi4vLi4vdXRpbHMvZXZlbnQtZW1pdHRlci5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlcXVlc3RUaW1pbmcgZnJvbSBcIi4vcmVxdWVzdC10aW1pbmcuanNcIlxuaW1wb3J0IFJlc3BvbnNlIGZyb20gXCIuL3Jlc3BvbnNlLmpzXCJcbmltcG9ydCBSb3V0ZXNSZXNvbHZlciBmcm9tIFwiLi4vLi4vcm91dGVzL3Jlc29sdmVyLmpzXCJcbmltcG9ydCB7UkVRVUVTVF9USU1FX1pPTkVfSEVBREVSfSBmcm9tIFwiLi4vLi4vdGltZS16b25lLmpzXCJcblxuLyoqXG4gKiBSdW5zIHN0YWNrIGZyYW1lIGxpbmUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gbGluZSAtIFBvdGVudGlhbCBoZWFkZXIgbGluZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGxpbmUgaXMgYSBzdGFjayBmcmFtZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tGcmFtZUxpbmUobGluZSkge1xuICBpZiAoIWxpbmUpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiAvXmF0XFxzKy91LnRlc3QobGluZS50cmltKCkpXG59XG5cbi8qKlxuICogUnVucyByZXF1ZXN0IGVycm9yIHN1bW1hcnkuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIHRvIGZvcm1hdCBmb3IgbG9nZ2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBjbGVhbmVkU3RhY2tXaXRoSGVhZGVyIC0gQ2xlYW5lZCBzdGFjayB3aXRoIGhlYWRlciBsaW5lLlxuICogQHJldHVybnMge3N0cmluZ30gLSBFcnJvciBzdW1tYXJ5IGxpbmUgd2l0aCB0eXBlIGluZm9ybWF0aW9uLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0RXJyb3JTdW1tYXJ5KGVycm9yLCBjbGVhbmVkU3RhY2tXaXRoSGVhZGVyKSB7XG4gIGNvbnN0IHN0YWNrSGVhZGVyID0gY2xlYW5lZFN0YWNrV2l0aEhlYWRlcj8uc3BsaXQoXCJcXG5cIilbMF0/LnRyaW0oKVxuXG4gIGlmIChzdGFja0hlYWRlciAmJiAhc3RhY2tGcmFtZUxpbmUoc3RhY2tIZWFkZXIpKSByZXR1cm4gc3RhY2tIZWFkZXJcblxuICBjb25zdCBlcnJvckNvZGUgPSB0eXBlb2YgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGVycm9yKS5jb2RlID09PSBcInN0cmluZ1wiXG4gICAgPyAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAoZXJyb3IpLmNvZGVcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcilcblxuICBpZiAoZXJyb3JDb2RlKSByZXR1cm4gYCR7ZXJyb3IubmFtZX0gWyR7ZXJyb3JDb2RlfV06ICR7ZXJyb3JNZXNzYWdlfWBcblxuICByZXR1cm4gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3JNZXNzYWdlfWBcbn1cblxuLyoqXG4gKiBSdW5zIHJlcXVlc3QgZXJyb3IgbG9nIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIHRvIGZvcm1hdCBmb3IgbG9nZ2luZy5cbiAqIEByZXR1cm5zIHt7XG4gKiAgIGVycm9yU3VtbWFyeTogc3RyaW5nLFxuICogICBjbGVhbmVkQmFja3RyYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gKiB9fSAtIExvZyBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0RXJyb3JMb2dEZXRhaWxzKGVycm9yKSB7XG4gIGNvbnN0IGNsZWFuZWRTdGFja1dpdGhIZWFkZXIgPSBCYWNrdHJhY2VDbGVhbmVyLmdldENsZWFuZWRTdGFjayhlcnJvcilcbiAgY29uc3QgZXJyb3JTdW1tYXJ5ID0gcmVxdWVzdEVycm9yU3VtbWFyeShlcnJvciwgY2xlYW5lZFN0YWNrV2l0aEhlYWRlcilcbiAgY29uc3QgY2xlYW5lZEJhY2t0cmFjZSA9IEJhY2t0cmFjZUNsZWFuZXIuZ2V0Q2xlYW5lZFN0YWNrKGVycm9yLCB7aW5jbHVkZUVycm9ySGVhZGVyOiBmYWxzZX0pIHx8IGNsZWFuZWRTdGFja1dpdGhIZWFkZXJcblxuICByZXR1cm4ge2Vycm9yU3VtbWFyeSwgY2xlYW5lZEJhY2t0cmFjZX1cbn1cblxuLyoqXG4gKiBSdW5zIHJlcXVlc3QgZXJyb3IgbG9nIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3tcbiAqICAgZXJyb3JTdW1tYXJ5OiBzdHJpbmcsXG4gKiAgIGNsZWFuZWRCYWNrdHJhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAqIH19IGxvZ0RldGFpbHMgLSBMb2cgZGV0YWlscy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2luZ2xlIHJlcXVlc3QgZXJyb3IgbG9nIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RFcnJvckxvZ01lc3NhZ2UobG9nRGV0YWlscykge1xuICBpZiAoIWxvZ0RldGFpbHMuY2xlYW5lZEJhY2t0cmFjZSkge1xuICAgIHJldHVybiBgRXJyb3Igd2hpbGUgcnVubmluZyByZXF1ZXN0OiAke2xvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5fWBcbiAgfVxuXG4gIHJldHVybiBgRXJyb3Igd2hpbGUgcnVubmluZyByZXF1ZXN0OiAke2xvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5fVxcbkNsZWFuZWQgYmFja3RyYWNlOlxcbiR7bG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlfWBcbn1cblxuLyoqXG4gKiBSdW5zIHJlc3BvbnNlIGJvZHkgdHlwZSBmb3IgbG9nLlxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzcG9uc2UgLSBSZXNwb25zZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJlc3BvbnNlIGJvZHkgdHlwZSBmb3IgbG9nZ2luZy5cbiAqL1xuZnVuY3Rpb24gcmVzcG9uc2VCb2R5VHlwZUZvckxvZyhyZXNwb25zZSkge1xuICBpZiAocmVzcG9uc2UuZ2V0RmlsZVBhdGgoKSkgcmV0dXJuIFwiZmlsZVwiXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc3BvbnNlLmdldEJvZHkoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJ1bnNldFwiXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGZvcm1hdCBidWNrZXQgbXMuXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBNaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtaWxsaXNlY29uZHMgd2l0aCBvbmUgZGVjaW1hbCBwbGFjZS5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0QnVja2V0TXModmFsdWUpIHtcbiAgcmV0dXJuIGAke3ZhbHVlLnRvRml4ZWQoMSl9bXNgXG59XG5cbi8qKlxuICogUnVucyBxdWVyeSBjb3VudCBsYWJlbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFF1ZXJ5IGNvdW50LlxuICogQHJldHVybnMge3N0cmluZ30gLSBRdWVyeSBjb3VudCBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gcXVlcnlDb3VudExhYmVsKGNvdW50KSB7XG4gIHJldHVybiBgJHtjb3VudH0gJHtjb3VudCA9PT0gMSA/IFwicXVlcnlcIiA6IFwicXVlcmllc1wifWBcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFJlcXVlc3RSdW5uZXIge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3R9KSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25maWd1cmF0aW9uIGdpdmVuXCIpXG4gICAgaWYgKCFyZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXF1ZXN0IGdpdmVuXCIpXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgIHRoaXMucmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KVxuICAgIHRoaXMuY29tcGxldGVkUmVxdWVzdExvZ2dlZCA9IGZhbHNlXG4gICAgdGhpcy5yZXF1ZXN0VGltaW5nID0gbmV3IFJlcXVlc3RUaW1pbmcoKVxuICAgIHRoaXMuc3RhdGUgPSBcInJ1bm5pbmdcIlxuICB9XG5cbiAgZ2V0UmVxdWVzdCgpIHsgcmV0dXJuIHRoaXMucmVxdWVzdCB9XG4gIGdldFN0YXRlKCkgeyByZXR1cm4gdGhpcy5zdGF0ZSB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIHRoaXMucmVxdWVzdFRpbWluZy5zdGFydGVkQXRNcyA9IERhdGUubm93KClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFJlcXVlc3RUaW1pbmcodGhpcy5yZXF1ZXN0VGltaW5nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZWRhY3RvciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRMb2dSZWRhY3RvcigpXG4gICAgICBjb25zdCBzZW5zaXRpdmVWYWx1ZXMgPSByZWRhY3Rvci5yZXF1ZXN0U2Vuc2l0aXZlVmFsdWVzKHRoaXMucmVxdWVzdCwgdGhpcy5yZXF1ZXN0VGltaW5nLmdldExvZ1NlbnNpdGl2ZVZhbHVlcygpKVxuXG4gICAgICB0aGlzLnJlcXVlc3RUaW1pbmcucmVnaXN0ZXJMb2dTZW5zaXRpdmVWYWx1ZXMoc2Vuc2l0aXZlVmFsdWVzKVxuXG4gICAgICAvLyBSdW4gdGhlIHdob2xlIHJlcXVlc3QgaW5zaWRlIGFueSBwZXItdGVzdCBzaGFyZWQgY29ubmVjdGlvbiBjb250ZXh0IHNvIGFuXG4gICAgICAvLyBpbi1wcm9jZXNzIGhhbmRsZXIgZXhlY3V0ZXMgb24gdGhlIHRlc3QncyBjb25uZWN0aW9uIChhbmQgb3BlbiB0cmFuc2FjdGlvbikuXG4gICAgICAvLyBObyBzaGFyZWQgY29ubmVjdGlvbiBpcyBzZXQgb3V0c2lkZSB0ZXN0cyAvIGluIHdvcmtlciB0aHJlYWRzLCBzbyB0aGlzIGlzIGFcbiAgICAgIC8vIG5vLW9wIHRoZXJlLlxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZXN0U2hhcmVkQ29ubmVjdGlvbkNvbnRleHRzKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnVuKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIF9ydW4oKSB7XG4gICAgY29uc3Qge2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSA9IHRoaXNcblxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdD9cIilcblxuICAgIGNvbnN0IHJlZGFjdG9yID0gY29uZmlndXJhdGlvbi5nZXRMb2dSZWRhY3RvcigpXG4gICAgY29uc3Qgc2Vuc2l0aXZlVmFsdWVzID0gdGhpcy5yZXF1ZXN0VGltaW5nLmdldExvZ1NlbnNpdGl2ZVZhbHVlcygpXG4gICAgY29uc3QgbG9nZ2VkUGF0aCA9IHJlZGFjdG9yLnJlZGFjdFBhdGgocmVxdWVzdC5wYXRoKCksIHNlbnNpdGl2ZVZhbHVlcylcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSdW4gcmVxdWVzdCBsaWZlY3ljbGVcIiwge1xuICAgICAgICBodHRwTWV0aG9kOiByZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgaHR0cFZlcnNpb246IHJlcXVlc3QuaHR0cFZlcnNpb24oKSxcbiAgICAgICAgb3JpZ2luOiByZXF1ZXN0Lm9yaWdpbigpLFxuICAgICAgICBwYXRoOiBsb2dnZWRQYXRoLFxuICAgICAgICByZW1vdGVBZGRyZXNzOiByZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKVxuICAgICAgfV0pXG4gICAgICAvLyBCZWZvcmUgd2UgY2hlY2tlZCBpZiB0aGUgc2VjLWZldGNoLW1vZGUgd2FzIFwiY29yc1wiLCBidXQgaXQgc2VlbXMgdGhlIHNlYy1mZXRjaC1tb2RlIGlzbid0IGFsd2F5cyBwcmVzZW50XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSdW4gQ09SU1wiLCB7aHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksIHNlY0ZldGNoTW9kZTogcmVxdWVzdC5oZWFkZXIoXCJzZWMtZmV0Y2gtbW9kZVwiKX1dKVxuXG4gICAgICBjb25zdCBjb3JzID0gY29uZmlndXJhdGlvbi5nZXRDb3JzKClcblxuICAgICAgaWYgKGNvcnMpIHtcbiAgICAgICAgYXdhaXQgY29ycyh7cmVxdWVzdCwgcmVzcG9uc2V9KVxuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJDT1JTIGhhbmRsZXIgZG9uZVwiLCB7XG4gICAgICAgICAgaHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksXG4gICAgICAgICAgcGF0aDogbG9nZ2VkUGF0aCxcbiAgICAgICAgICByZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKVxuICAgICAgICB9XSlcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVlc3QuaHR0cE1ldGhvZCgpID09IFwiT1BUSU9OU1wiICYmIHJlcXVlc3QuaGVhZGVyKFwic2VjLWZldGNoLW1vZGVcIikgPT0gXCJjb3JzXCIpIHtcbiAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKDIwMClcbiAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShcIlwiKVxuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJIYW5kbGVkIHByZWZsaWdodCBPUFRJT05TIHJlcXVlc3RcIiwge1xuICAgICAgICAgIHBhdGg6IGxvZ2dlZFBhdGgsXG4gICAgICAgICAgcmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKClcbiAgICAgICAgfV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZyhcIlJ1biByZXF1ZXN0XCIpXG4gICAgICAgIGNvbnN0IHJvdXRlc1Jlc29sdmVyID0gbmV3IFJvdXRlc1Jlc29sdmVyKHtjb25maWd1cmF0aW9uLCByZXF1ZXN0LCByZXNwb25zZX0pXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZU1zID0gRGF0ZS5ub3coKVxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aW1lb3V0SWQuXG4gICAgICAgICAqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgbGV0IHRpbWVvdXRJZFxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aW1lb3V0UmVqZWN0LlxuICAgICAgICAgKiBAdHlwZSB7KChlcnJvcjogRXJyb3IpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBsZXQgdGltZW91dFJlamVjdFxuICAgICAgICBsZXQgdGltZWRPdXQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnN0IHNldFJlcXVlc3RUaW1lb3V0U2Vjb25kcyA9ICgvKiogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH0gKi8gdGltZW91dFNlY29uZHMpID0+IHtcbiAgICAgICAgICBpZiAodGltZW91dElkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICAgICAgdGltZW91dElkID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aW1lb3V0U2Vjb25kcyAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRTZWNvbmRzKSB8fCB0aW1lb3V0U2Vjb25kcyA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSB0aW1lb3V0U2Vjb25kcyAqIDEwMDBcbiAgICAgICAgICBjb25zdCBlbGFwc2VkTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lTXNcbiAgICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXRNcyAtIGVsYXBzZWRNc1xuXG4gICAgICAgICAgaWYgKHJlbWFpbmluZ01zIDw9IDApIHtcbiAgICAgICAgICAgIHRpbWVvdXRSZWplY3Q/LihuZXcgRXJyb3IoYFJlcXVlc3QgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dFNlY29uZHN9c2ApKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lb3V0UmVqZWN0Py4obmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRTZWNvbmRzfXNgKSlcbiAgICAgICAgICB9LCByZW1haW5pbmdNcylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXRSZWplY3QgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZVxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXNwb25zZS5zZXRSZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcigodGltZW91dFNlY29uZHMpID0+IHtcbiAgICAgICAgICBzZXRSZXF1ZXN0VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpXG4gICAgICAgIH0pXG5cbiAgICAgICAgc2V0UmVxdWVzdFRpbWVvdXRTZWNvbmRzKGNvbmZpZ3VyYXRpb24uZ2V0UmVxdWVzdFRpbWVvdXRNcz8uKCkpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBsZXQgcmVzb2x2ZVByb21pc2VcblxuICAgICAgICBjb25zdCBydW5SZXNvbHZlZFJlcXVlc3QgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByb3V0ZXNSZXNvbHZlci5yZXNvbHZlKClcbiAgICAgICAgICAvLyBLZWVwIFByb21pc2UucmFjZSBoZXJlIHRvIGFsbG93IGR5bmFtaWMgdGltZW91dCB1cGRhdGVzLlxuICAgICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbcmVzb2x2ZVByb21pc2UsIHRpbWVvdXRQcm9taXNlXSlcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSb3V0ZXMgcmVzb2x2ZXIgZG9uZVwiLCB7XG4gICAgICAgICAgICBodHRwTWV0aG9kOiByZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgICAgIHBhdGg6IGxvZ2dlZFBhdGgsXG4gICAgICAgICAgICByZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSxcbiAgICAgICAgICAgIGhhc0ZpbGVQYXRoOiBCb29sZWFuKHJlc3BvbnNlLmdldEZpbGVQYXRoKCkpLFxuICAgICAgICAgICAgYm9keVR5cGU6IHJlc3BvbnNlQm9keVR5cGVGb3JMb2cocmVzcG9uc2UpXG4gICAgICAgICAgfV0pXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3RUaW1lWm9uZSA9IHJlcXVlc3QuaGVhZGVyKFJFUVVFU1RfVElNRV9aT05FX0hFQURFUilcblxuICAgICAgICAgIGlmIChyZXF1ZXN0VGltZVpvbmUgIT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0VGltZVpvbmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24ucnVuV2l0aFRpbWV6b25lKHJlcXVlc3RUaW1lWm9uZSwgcnVuUmVzb2x2ZWRSZXF1ZXN0KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBydW5SZXNvbHZlZFJlcXVlc3QoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAodGltZWRPdXQgJiYgcmVzb2x2ZVByb21pc2UpIHtcbiAgICAgICAgICAgIHZvaWQgcmVzb2x2ZVByb21pc2UuY2F0Y2goKHJlc29sdmVFcnJvcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzYWZlUmVzb2x2ZUVycm9yID0gcmVkYWN0b3IucmVkYWN0RXJyb3IoZW5zdXJlRXJyb3IocmVzb2x2ZUVycm9yKSwgc2Vuc2l0aXZlVmFsdWVzKVxuXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1wiUmVxdWVzdCBmaW5pc2hlZCBhZnRlciB0aW1lb3V0XCIsIHNhZmVSZXNvbHZlRXJyb3JdKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAodGltZW91dElkKSBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBlbnN1cmVFcnJvcihlKVxuICAgICAgY29uc3QgZXJyb3JXaXRoQ29udGV4dCA9IC8qKiBAdHlwZSB7e3ZlbG9jaW91c0NvbnRleHQ/OiBvYmplY3R9fSAqLyAoZXJyb3IpXG4gICAgICBjb25zdCBlcnJvckNvbnRleHQgPSBlcnJvcldpdGhDb250ZXh0LnZlbG9jaW91c0NvbnRleHQgfHwge3N0YWdlOiBcInJlcXVlc3QtcnVubmVyXCJ9XG4gICAgICBjb25zdCBsb2dEZXRhaWxzID0gcmVxdWVzdEVycm9yTG9nRGV0YWlscyhlcnJvcilcbiAgICAgIGNvbnN0IHJlZGFjdGVkTG9nRGV0YWlscyA9IHtcbiAgICAgICAgY2xlYW5lZEJhY2t0cmFjZTogbG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlXG4gICAgICAgICAgPyByZWRhY3Rvci5yZWRhY3RTdHJpbmcobG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlLCBzZW5zaXRpdmVWYWx1ZXMpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVycm9yU3VtbWFyeTogcmVkYWN0b3IucmVkYWN0U3RyaW5nKGxvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5LCBzZW5zaXRpdmVWYWx1ZXMpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IHJlcXVlc3RFcnJvckxvZ01lc3NhZ2UocmVkYWN0ZWRMb2dEZXRhaWxzKSlcblxuICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0ge1xuICAgICAgICBjb250ZXh0OiByZWRhY3Rvci5yZWRhY3RTdHJ1Y3R1cmVkKGVycm9yQ29udGV4dCwgc2Vuc2l0aXZlVmFsdWVzKSxcbiAgICAgICAgZXJyb3I6IHJlZGFjdG9yLnJlZGFjdEVycm9yKGVycm9yLCBzZW5zaXRpdmVWYWx1ZXMpLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXNwb25zZVxuICAgICAgfVxuXG4gICAgICBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBlcnJvclBheWxvYWQpXG4gICAgICBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImFsbC1lcnJvclwiLCB7XG4gICAgICAgIC4uLmVycm9yUGF5bG9hZCxcbiAgICAgICAgZXJyb3JUeXBlOiBcImZyYW1ld29yay1lcnJvclwiXG4gICAgICB9KVxuXG4gICAgICByZXNwb25zZS5zZXRTdGF0dXMoNTAwKVxuICAgICAgcmVzcG9uc2Uuc2V0RXJyb3JCb2R5KGVycm9yKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlJlcXVlc3QgcnVubmVyIGRvbmVcIiwge1xuICAgICAgaHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksXG4gICAgICBwYXRoOiBsb2dnZWRQYXRoLFxuICAgICAgcmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKClcbiAgICB9XSlcbiAgICB0aGlzLnN0YXRlID0gXCJkb25lXCJcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiZG9uZVwiLCB0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbG9nIGNvbXBsZXRlZCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBMb2dzIHRoZSBjb21wbGV0ZWQgcmVxdWVzdCBsaW5lIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBzZXJ2ZWQuXG4gICAqL1xuICBhc3luYyBsb2dDb21wbGV0ZWRSZXF1ZXN0KCkge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZFJlcXVlc3RMb2dnZWQpIHJldHVyblxuXG4gICAgdGhpcy5jb21wbGV0ZWRSZXF1ZXN0TG9nZ2VkID0gdHJ1ZVxuXG4gICAgY29uc3QgcmVxdWVzdFRpbWluZyA9IHRoaXMucmVxdWVzdFRpbWluZ1xuXG4gICAgcmVxdWVzdFRpbWluZy5tYXJrUmVzcG9uc2VTZXJ2ZWQoKVxuXG4gICAgaWYgKCFyZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ1N1YmplY3QgfHwgIXJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nTWV0aG9kKSByZXR1cm5cblxuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIocmVxdWVzdFRpbWluZy5jb21wbGV0ZWRMb2dTdWJqZWN0LCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcbiAgICBjb25zdCBzdW1tYXJ5ID0gcmVxdWVzdFRpbWluZy5zdW1tYXJ5KClcbiAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucmVzcG9uc2VcbiAgICBjb25zdCBjb21wbGV0ZWRNZXNzYWdlID0gW1xuICAgICAgYENvbXBsZXRlZCAke3Jlc3BvbnNlLmdldFN0YXR1c0NvZGUoKX0gJHtyZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCl9IGluICR7TWF0aC5yb3VuZChzdW1tYXJ5LnRvdGFsTXMpfW1zIChgLFxuICAgICAgYENvbnRyb2xsZXI6ICR7Zm9ybWF0QnVja2V0TXMoc3VtbWFyeS5jb250cm9sbGVyTXMpfWAsXG4gICAgICBgIHwgVmlld3M6ICR7Zm9ybWF0QnVja2V0TXMoc3VtbWFyeS52aWV3c01zKX1gLFxuICAgICAgYCB8IERCOiAke2Zvcm1hdEJ1Y2tldE1zKHN1bW1hcnkuZGJNcyl9ICgke3F1ZXJ5Q291bnRMYWJlbChzdW1tYXJ5LmRiUXVlcnlDb3VudCl9KWAsXG4gICAgICBgIHwgVmVsb2Npb3VzOiAke2Zvcm1hdEJ1Y2tldE1zKHN1bW1hcnkudmVsb2Npb3VzTXMpfWAsXG4gICAgICBgKWBcbiAgICBdLmpvaW4oXCJcIilcblxuICAgIGF3YWl0IGxvZ2dlcltyZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ01ldGhvZF0oY29tcGxldGVkTWVzc2FnZSlcbiAgfVxufVxuIl19
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QtcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFBO0FBQ25DLE9BQU8sZ0JBQWdCLE1BQU0sdUNBQXVDLENBQUE7QUFDcEUsT0FBTyxZQUFZLE1BQU0sOEJBQThCLENBQUE7QUFDdkQsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3pELE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sYUFBYSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sUUFBUSxNQUFNLGVBQWUsQ0FBQTtBQUNwQyxPQUFPLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUUzRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsSUFBSTtJQUMxQixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRXZCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUNwQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQUssRUFBRSxzQkFBc0I7SUFDeEQsTUFBTSxXQUFXLEdBQUcsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBO0lBRWxFLElBQUksV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUFFLE9BQU8sV0FBVyxDQUFBO0lBRW5FLE1BQU0sU0FBUyxHQUFHLE9BQU8sNENBQTRDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJ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bXBvcnQge2Vuc3VyZUVycm9yfSBmcm9tIFwidHlwYW5pY1wiXG5pbXBvcnQgQmFja3RyYWNlQ2xlYW5lciBmcm9tIFwiLi4vLi4vdXRpbHMvYmFja3RyYWNlLWNsZWFuZXItbm9kZS5qc1wiXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gXCIuLi8uLi91dGlscy9ldmVudC1lbWl0dGVyLmpzXCJcbmltcG9ydCB7SHR0cFJlc3BvbnNlQm9keVRvb0xhcmdlRXJyb3J9IGZyb20gXCIuL2Vycm9ycy5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlcXVlc3RUaW1pbmcgZnJvbSBcIi4vcmVxdWVzdC10aW1pbmcuanNcIlxuaW1wb3J0IFJlc3BvbnNlIGZyb20gXCIuL3Jlc3BvbnNlLmpzXCJcbmltcG9ydCBSb3V0ZXNSZXNvbHZlciBmcm9tIFwiLi4vLi4vcm91dGVzL3Jlc29sdmVyLmpzXCJcbmltcG9ydCB7UkVRVUVTVF9USU1FX1pPTkVfSEVBREVSfSBmcm9tIFwiLi4vLi4vdGltZS16b25lLmpzXCJcblxuLyoqXG4gKiBSdW5zIHN0YWNrIGZyYW1lIGxpbmUuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gbGluZSAtIFBvdGVudGlhbCBoZWFkZXIgbGluZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGxpbmUgaXMgYSBzdGFjayBmcmFtZS5cbiAqL1xuZnVuY3Rpb24gc3RhY2tGcmFtZUxpbmUobGluZSkge1xuICBpZiAoIWxpbmUpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiAvXmF0XFxzKy91LnRlc3QobGluZS50cmltKCkpXG59XG5cbi8qKlxuICogUnVucyByZXF1ZXN0IGVycm9yIHN1bW1hcnkuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIHRvIGZvcm1hdCBmb3IgbG9nZ2luZy5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBjbGVhbmVkU3RhY2tXaXRoSGVhZGVyIC0gQ2xlYW5lZCBzdGFjayB3aXRoIGhlYWRlciBsaW5lLlxuICogQHJldHVybnMge3N0cmluZ30gLSBFcnJvciBzdW1tYXJ5IGxpbmUgd2l0aCB0eXBlIGluZm9ybWF0aW9uLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0RXJyb3JTdW1tYXJ5KGVycm9yLCBjbGVhbmVkU3RhY2tXaXRoSGVhZGVyKSB7XG4gIGNvbnN0IHN0YWNrSGVhZGVyID0gY2xlYW5lZFN0YWNrV2l0aEhlYWRlcj8uc3BsaXQoXCJcXG5cIilbMF0/LnRyaW0oKVxuXG4gIGlmIChzdGFja0hlYWRlciAmJiAhc3RhY2tGcmFtZUxpbmUoc3RhY2tIZWFkZXIpKSByZXR1cm4gc3RhY2tIZWFkZXJcblxuICBjb25zdCBlcnJvckNvZGUgPSB0eXBlb2YgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGVycm9yKS5jb2RlID09PSBcInN0cmluZ1wiXG4gICAgPyAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAoZXJyb3IpLmNvZGVcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8IFN0cmluZyhlcnJvcilcblxuICBpZiAoZXJyb3JDb2RlKSByZXR1cm4gYCR7ZXJyb3IubmFtZX0gWyR7ZXJyb3JDb2RlfV06ICR7ZXJyb3JNZXNzYWdlfWBcblxuICByZXR1cm4gYCR7ZXJyb3IubmFtZX06ICR7ZXJyb3JNZXNzYWdlfWBcbn1cblxuLyoqXG4gKiBSdW5zIHJlcXVlc3QgZXJyb3IgbG9nIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIHRvIGZvcm1hdCBmb3IgbG9nZ2luZy5cbiAqIEByZXR1cm5zIHt7XG4gKiAgIGVycm9yU3VtbWFyeTogc3RyaW5nLFxuICogICBjbGVhbmVkQmFja3RyYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gKiB9fSAtIExvZyBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiByZXF1ZXN0RXJyb3JMb2dEZXRhaWxzKGVycm9yKSB7XG4gIGNvbnN0IGNsZWFuZWRTdGFja1dpdGhIZWFkZXIgPSBCYWNrdHJhY2VDbGVhbmVyLmdldENsZWFuZWRTdGFjayhlcnJvcilcbiAgY29uc3QgZXJyb3JTdW1tYXJ5ID0gcmVxdWVzdEVycm9yU3VtbWFyeShlcnJvciwgY2xlYW5lZFN0YWNrV2l0aEhlYWRlcilcbiAgY29uc3QgY2xlYW5lZEJhY2t0cmFjZSA9IEJhY2t0cmFjZUNsZWFuZXIuZ2V0Q2xlYW5lZFN0YWNrKGVycm9yLCB7aW5jbHVkZUVycm9ySGVhZGVyOiBmYWxzZX0pIHx8IGNsZWFuZWRTdGFja1dpdGhIZWFkZXJcblxuICByZXR1cm4ge2Vycm9yU3VtbWFyeSwgY2xlYW5lZEJhY2t0cmFjZX1cbn1cblxuLyoqXG4gKiBSdW5zIHJlcXVlc3QgZXJyb3IgbG9nIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3tcbiAqICAgZXJyb3JTdW1tYXJ5OiBzdHJpbmcsXG4gKiAgIGNsZWFuZWRCYWNrdHJhY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAqIH19IGxvZ0RldGFpbHMgLSBMb2cgZGV0YWlscy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU2luZ2xlIHJlcXVlc3QgZXJyb3IgbG9nIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RFcnJvckxvZ01lc3NhZ2UobG9nRGV0YWlscykge1xuICBpZiAoIWxvZ0RldGFpbHMuY2xlYW5lZEJhY2t0cmFjZSkge1xuICAgIHJldHVybiBgRXJyb3Igd2hpbGUgcnVubmluZyByZXF1ZXN0OiAke2xvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5fWBcbiAgfVxuXG4gIHJldHVybiBgRXJyb3Igd2hpbGUgcnVubmluZyByZXF1ZXN0OiAke2xvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5fVxcbkNsZWFuZWQgYmFja3RyYWNlOlxcbiR7bG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlfWBcbn1cblxuLyoqXG4gKiBSdW5zIHJlc3BvbnNlIGJvZHkgdHlwZSBmb3IgbG9nLlxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzcG9uc2UgLSBSZXNwb25zZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJlc3BvbnNlIGJvZHkgdHlwZSBmb3IgbG9nZ2luZy5cbiAqL1xuZnVuY3Rpb24gcmVzcG9uc2VCb2R5VHlwZUZvckxvZyhyZXNwb25zZSkge1xuICBpZiAocmVzcG9uc2UuZ2V0RmlsZVBhdGgoKSkgcmV0dXJuIFwiZmlsZVwiXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc3BvbnNlLmdldEJvZHkoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gXCJ1bnNldFwiXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGZvcm1hdCBidWNrZXQgbXMuXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBNaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtaWxsaXNlY29uZHMgd2l0aCBvbmUgZGVjaW1hbCBwbGFjZS5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0QnVja2V0TXModmFsdWUpIHtcbiAgcmV0dXJuIGAke3ZhbHVlLnRvRml4ZWQoMSl9bXNgXG59XG5cbi8qKlxuICogUnVucyBxdWVyeSBjb3VudCBsYWJlbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFF1ZXJ5IGNvdW50LlxuICogQHJldHVybnMge3N0cmluZ30gLSBRdWVyeSBjb3VudCBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gcXVlcnlDb3VudExhYmVsKGNvdW50KSB7XG4gIHJldHVybiBgJHtjb3VudH0gJHtjb3VudCA9PT0gMSA/IFwicXVlcnlcIiA6IFwicXVlcmllc1wifWBcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSHR0cFNlcnZlckNsaWVudFJlcXVlc3RSdW5uZXIge1xuICBldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3R9KSB7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb25maWd1cmF0aW9uIGdpdmVuXCIpXG4gICAgaWYgKCFyZXF1ZXN0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXF1ZXN0IGdpdmVuXCIpXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcylcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgIHRoaXMucmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KVxuICAgIHRoaXMuY29tcGxldGVkUmVxdWVzdExvZ2dlZCA9IGZhbHNlXG4gICAgdGhpcy5yZXF1ZXN0VGltaW5nID0gbmV3IFJlcXVlc3RUaW1pbmcoKVxuICAgIHRoaXMuc3RhdGUgPSBcInJ1bm5pbmdcIlxuICB9XG5cbiAgZ2V0UmVxdWVzdCgpIHsgcmV0dXJuIHRoaXMucmVxdWVzdCB9XG4gIGdldFN0YXRlKCkgeyByZXR1cm4gdGhpcy5zdGF0ZSB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIHRoaXMucmVxdWVzdFRpbWluZy5zdGFydGVkQXRNcyA9IERhdGUubm93KClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFJlcXVlc3RUaW1pbmcodGhpcy5yZXF1ZXN0VGltaW5nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZWRhY3RvciA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRMb2dSZWRhY3RvcigpXG4gICAgICBjb25zdCBzZW5zaXRpdmVWYWx1ZXMgPSByZWRhY3Rvci5yZXF1ZXN0U2Vuc2l0aXZlVmFsdWVzKHRoaXMucmVxdWVzdCwgdGhpcy5yZXF1ZXN0VGltaW5nLmdldExvZ1NlbnNpdGl2ZVZhbHVlcygpKVxuXG4gICAgICB0aGlzLnJlcXVlc3RUaW1pbmcucmVnaXN0ZXJMb2dTZW5zaXRpdmVWYWx1ZXMoc2Vuc2l0aXZlVmFsdWVzKVxuXG4gICAgICAvLyBSdW4gdGhlIHdob2xlIHJlcXVlc3QgaW5zaWRlIGFueSBwZXItdGVzdCBzaGFyZWQgY29ubmVjdGlvbiBjb250ZXh0IHNvIGFuXG4gICAgICAvLyBpbi1wcm9jZXNzIGhhbmRsZXIgZXhlY3V0ZXMgb24gdGhlIHRlc3QncyBjb25uZWN0aW9uIChhbmQgb3BlbiB0cmFuc2FjdGlvbikuXG4gICAgICAvLyBObyBzaGFyZWQgY29ubmVjdGlvbiBpcyBzZXQgb3V0c2lkZSB0ZXN0cyAvIGluIHdvcmtlciB0aHJlYWRzLCBzbyB0aGlzIGlzIGFcbiAgICAgIC8vIG5vLW9wIHRoZXJlLlxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZXN0U2hhcmVkQ29ubmVjdGlvbkNvbnRleHRzKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fcnVuKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIF9ydW4oKSB7XG4gICAgY29uc3Qge2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSA9IHRoaXNcblxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdD9cIilcblxuICAgIGNvbnN0IHJlZGFjdG9yID0gY29uZmlndXJhdGlvbi5nZXRMb2dSZWRhY3RvcigpXG4gICAgY29uc3Qgc2Vuc2l0aXZlVmFsdWVzID0gdGhpcy5yZXF1ZXN0VGltaW5nLmdldExvZ1NlbnNpdGl2ZVZhbHVlcygpXG4gICAgY29uc3QgbG9nZ2VkUGF0aCA9IHJlZGFjdG9yLnJlZGFjdFBhdGgocmVxdWVzdC5wYXRoKCksIHNlbnNpdGl2ZVZhbHVlcylcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSdW4gcmVxdWVzdCBsaWZlY3ljbGVcIiwge1xuICAgICAgICBodHRwTWV0aG9kOiByZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgaHR0cFZlcnNpb246IHJlcXVlc3QuaHR0cFZlcnNpb24oKSxcbiAgICAgICAgb3JpZ2luOiByZXF1ZXN0Lm9yaWdpbigpLFxuICAgICAgICBwYXRoOiBsb2dnZWRQYXRoLFxuICAgICAgICByZW1vdGVBZGRyZXNzOiByZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKVxuICAgICAgfV0pXG4gICAgICAvLyBCZWZvcmUgd2UgY2hlY2tlZCBpZiB0aGUgc2VjLWZldGNoLW1vZGUgd2FzIFwiY29yc1wiLCBidXQgaXQgc2VlbXMgdGhlIHNlYy1mZXRjaC1tb2RlIGlzbid0IGFsd2F5cyBwcmVzZW50XG4gICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSdW4gQ09SU1wiLCB7aHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksIHNlY0ZldGNoTW9kZTogcmVxdWVzdC5oZWFkZXIoXCJzZWMtZmV0Y2gtbW9kZVwiKX1dKVxuXG4gICAgICBjb25zdCBjb3JzID0gY29uZmlndXJhdGlvbi5nZXRDb3JzKClcblxuICAgICAgaWYgKGNvcnMpIHtcbiAgICAgICAgYXdhaXQgY29ycyh7cmVxdWVzdCwgcmVzcG9uc2V9KVxuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJDT1JTIGhhbmRsZXIgZG9uZVwiLCB7XG4gICAgICAgICAgaHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksXG4gICAgICAgICAgcGF0aDogbG9nZ2VkUGF0aCxcbiAgICAgICAgICByZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKVxuICAgICAgICB9XSlcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVlc3QuaHR0cE1ldGhvZCgpID09IFwiT1BUSU9OU1wiICYmIHJlcXVlc3QuaGVhZGVyKFwic2VjLWZldGNoLW1vZGVcIikgPT0gXCJjb3JzXCIpIHtcbiAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKDIwMClcbiAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShcIlwiKVxuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJIYW5kbGVkIHByZWZsaWdodCBPUFRJT05TIHJlcXVlc3RcIiwge1xuICAgICAgICAgIHBhdGg6IGxvZ2dlZFBhdGgsXG4gICAgICAgICAgcmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKClcbiAgICAgICAgfV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZyhcIlJ1biByZXF1ZXN0XCIpXG4gICAgICAgIGNvbnN0IHJvdXRlc1Jlc29sdmVyID0gbmV3IFJvdXRlc1Jlc29sdmVyKHtjb25maWd1cmF0aW9uLCByZXF1ZXN0LCByZXNwb25zZX0pXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZU1zID0gRGF0ZS5ub3coKVxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aW1lb3V0SWQuXG4gICAgICAgICAqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgbGV0IHRpbWVvdXRJZFxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyB0aW1lb3V0UmVqZWN0LlxuICAgICAgICAgKiBAdHlwZSB7KChlcnJvcjogRXJyb3IpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBsZXQgdGltZW91dFJlamVjdFxuICAgICAgICBsZXQgdGltZWRPdXQgPSBmYWxzZVxuXG4gICAgICAgIGNvbnN0IHNldFJlcXVlc3RUaW1lb3V0U2Vjb25kcyA9ICgvKiogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH0gKi8gdGltZW91dFNlY29uZHMpID0+IHtcbiAgICAgICAgICBpZiAodGltZW91dElkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICAgICAgdGltZW91dElkID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0aW1lb3V0U2Vjb25kcyAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRTZWNvbmRzKSB8fCB0aW1lb3V0U2Vjb25kcyA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSB0aW1lb3V0U2Vjb25kcyAqIDEwMDBcbiAgICAgICAgICBjb25zdCBlbGFwc2VkTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lTXNcbiAgICAgICAgICBjb25zdCByZW1haW5pbmdNcyA9IHRpbWVvdXRNcyAtIGVsYXBzZWRNc1xuXG4gICAgICAgICAgaWYgKHJlbWFpbmluZ01zIDw9IDApIHtcbiAgICAgICAgICAgIHRpbWVvdXRSZWplY3Q/LihuZXcgRXJyb3IoYFJlcXVlc3QgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dFNlY29uZHN9c2ApKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lb3V0UmVqZWN0Py4obmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXRTZWNvbmRzfXNgKSlcbiAgICAgICAgICB9LCByZW1haW5pbmdNcylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXRSZWplY3QgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZVxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXNwb25zZS5zZXRSZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcigodGltZW91dFNlY29uZHMpID0+IHtcbiAgICAgICAgICBzZXRSZXF1ZXN0VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpXG4gICAgICAgIH0pXG5cbiAgICAgICAgc2V0UmVxdWVzdFRpbWVvdXRTZWNvbmRzKGNvbmZpZ3VyYXRpb24uZ2V0UmVxdWVzdFRpbWVvdXRNcz8uKCkpXG5cbiAgICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xuICAgICAgICBsZXQgcmVzb2x2ZVByb21pc2VcblxuICAgICAgICBjb25zdCBydW5SZXNvbHZlZFJlcXVlc3QgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZVByb21pc2UgPSByb3V0ZXNSZXNvbHZlci5yZXNvbHZlKClcbiAgICAgICAgICAvLyBLZWVwIFByb21pc2UucmFjZSBoZXJlIHRvIGFsbG93IGR5bmFtaWMgdGltZW91dCB1cGRhdGVzLlxuICAgICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbcmVzb2x2ZVByb21pc2UsIHRpbWVvdXRQcm9taXNlXSlcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2dlci5kZWJ1ZygoKSA9PiBbXCJSb3V0ZXMgcmVzb2x2ZXIgZG9uZVwiLCB7XG4gICAgICAgICAgICBodHRwTWV0aG9kOiByZXF1ZXN0Lmh0dHBNZXRob2QoKSxcbiAgICAgICAgICAgIHBhdGg6IGxvZ2dlZFBhdGgsXG4gICAgICAgICAgICByZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSxcbiAgICAgICAgICAgIGhhc0ZpbGVQYXRoOiBCb29sZWFuKHJlc3BvbnNlLmdldEZpbGVQYXRoKCkpLFxuICAgICAgICAgICAgYm9keVR5cGU6IHJlc3BvbnNlQm9keVR5cGVGb3JMb2cocmVzcG9uc2UpXG4gICAgICAgICAgfV0pXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3RUaW1lWm9uZSA9IHJlcXVlc3QuaGVhZGVyKFJFUVVFU1RfVElNRV9aT05FX0hFQURFUilcblxuICAgICAgICAgIGlmIChyZXF1ZXN0VGltZVpvbmUgIT09IHVuZGVmaW5lZCAmJiByZXF1ZXN0VGltZVpvbmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24ucnVuV2l0aFRpbWV6b25lKHJlcXVlc3RUaW1lWm9uZSwgcnVuUmVzb2x2ZWRSZXF1ZXN0KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBydW5SZXNvbHZlZFJlcXVlc3QoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAodGltZWRPdXQgJiYgcmVzb2x2ZVByb21pc2UpIHtcbiAgICAgICAgICAgIHZvaWQgcmVzb2x2ZVByb21pc2UuY2F0Y2goKHJlc29sdmVFcnJvcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzYWZlUmVzb2x2ZUVycm9yID0gcmVkYWN0b3IucmVkYWN0RXJyb3IoZW5zdXJlRXJyb3IocmVzb2x2ZUVycm9yKSwgc2Vuc2l0aXZlVmFsdWVzKVxuXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oKCkgPT4gW1wiUmVxdWVzdCBmaW5pc2hlZCBhZnRlciB0aW1lb3V0XCIsIHNhZmVSZXNvbHZlRXJyb3JdKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAodGltZW91dElkKSBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBlbnN1cmVFcnJvcihlKVxuICAgICAgY29uc3QgZXJyb3JXaXRoQ29udGV4dCA9IC8qKiBAdHlwZSB7e3ZlbG9jaW91c0NvbnRleHQ/OiBvYmplY3R9fSAqLyAoZXJyb3IpXG4gICAgICBjb25zdCBlcnJvckNvbnRleHQgPSBlcnJvcldpdGhDb250ZXh0LnZlbG9jaW91c0NvbnRleHQgfHwge3N0YWdlOiBcInJlcXVlc3QtcnVubmVyXCJ9XG4gICAgICBjb25zdCBsb2dEZXRhaWxzID0gcmVxdWVzdEVycm9yTG9nRGV0YWlscyhlcnJvcilcbiAgICAgIGNvbnN0IHJlZGFjdGVkTG9nRGV0YWlscyA9IHtcbiAgICAgICAgY2xlYW5lZEJhY2t0cmFjZTogbG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlXG4gICAgICAgICAgPyByZWRhY3Rvci5yZWRhY3RTdHJpbmcobG9nRGV0YWlscy5jbGVhbmVkQmFja3RyYWNlLCBzZW5zaXRpdmVWYWx1ZXMpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVycm9yU3VtbWFyeTogcmVkYWN0b3IucmVkYWN0U3RyaW5nKGxvZ0RldGFpbHMuZXJyb3JTdW1tYXJ5LCBzZW5zaXRpdmVWYWx1ZXMpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubG9nZ2VyLmVycm9yKCgpID0+IHJlcXVlc3RFcnJvckxvZ01lc3NhZ2UocmVkYWN0ZWRMb2dEZXRhaWxzKSlcblxuICAgICAgY29uc3QgZXJyb3JQYXlsb2FkID0ge1xuICAgICAgICBjb250ZXh0OiByZWRhY3Rvci5yZWRhY3RTdHJ1Y3R1cmVkKGVycm9yQ29udGV4dCwgc2Vuc2l0aXZlVmFsdWVzKSxcbiAgICAgICAgZXJyb3I6IHJlZGFjdG9yLnJlZGFjdEVycm9yKGVycm9yLCBzZW5zaXRpdmVWYWx1ZXMpLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXNwb25zZVxuICAgICAgfVxuXG4gICAgICBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImZyYW1ld29yay1lcnJvclwiLCBlcnJvclBheWxvYWQpXG4gICAgICBjb25maWd1cmF0aW9uLmdldEVycm9yRXZlbnRzKCkuZW1pdChcImFsbC1lcnJvclwiLCB7XG4gICAgICAgIC4uLmVycm9yUGF5bG9hZCxcbiAgICAgICAgZXJyb3JUeXBlOiBcImZyYW1ld29yay1lcnJvclwiXG4gICAgICB9KVxuXG4gICAgICByZXNwb25zZS5zZXRTdGF0dXMoNTAwKVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2Uuc2V0RXJyb3JCb2R5KGVycm9yKVxuICAgICAgfSBjYXRjaCAocmVzcG9uc2VFcnJvcikge1xuICAgICAgICBpZiAoIShyZXNwb25zZUVycm9yIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQm9keVRvb0xhcmdlRXJyb3IpKSB0aHJvdyByZXNwb25zZUVycm9yXG5cbiAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShcIlwiKVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMubG9nZ2VyLmRlYnVnKCgpID0+IFtcIlJlcXVlc3QgcnVubmVyIGRvbmVcIiwge1xuICAgICAgaHR0cE1ldGhvZDogcmVxdWVzdC5odHRwTWV0aG9kKCksXG4gICAgICBwYXRoOiBsb2dnZWRQYXRoLFxuICAgICAgcmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZS5nZXRTdGF0dXNDb2RlKClcbiAgICB9XSlcbiAgICB0aGlzLnN0YXRlID0gXCJkb25lXCJcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwiZG9uZVwiLCB0aGlzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbG9nIGNvbXBsZXRlZCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBMb2dzIHRoZSBjb21wbGV0ZWQgcmVxdWVzdCBsaW5lIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBzZXJ2ZWQuXG4gICAqL1xuICBhc3luYyBsb2dDb21wbGV0ZWRSZXF1ZXN0KCkge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZFJlcXVlc3RMb2dnZWQpIHJldHVyblxuXG4gICAgdGhpcy5jb21wbGV0ZWRSZXF1ZXN0TG9nZ2VkID0gdHJ1ZVxuXG4gICAgY29uc3QgcmVxdWVzdFRpbWluZyA9IHRoaXMucmVxdWVzdFRpbWluZ1xuXG4gICAgcmVxdWVzdFRpbWluZy5tYXJrUmVzcG9uc2VTZXJ2ZWQoKVxuXG4gICAgaWYgKCFyZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ1N1YmplY3QgfHwgIXJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nTWV0aG9kKSByZXR1cm5cblxuICAgIGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIocmVxdWVzdFRpbWluZy5jb21wbGV0ZWRMb2dTdWJqZWN0LCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcbiAgICBjb25zdCBzdW1tYXJ5ID0gcmVxdWVzdFRpbWluZy5zdW1tYXJ5KClcbiAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucmVzcG9uc2VcbiAgICBjb25zdCBjb21wbGV0ZWRNZXNzYWdlID0gW1xuICAgICAgYENvbXBsZXRlZCAke3Jlc3BvbnNlLmdldFN0YXR1c0NvZGUoKX0gJHtyZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCl9IGluICR7TWF0aC5yb3VuZChzdW1tYXJ5LnRvdGFsTXMpfW1zIChgLFxuICAgICAgYENvbnRyb2xsZXI6ICR7Zm9ybWF0QnVja2V0TXMoc3VtbWFyeS5jb250cm9sbGVyTXMpfWAsXG4gICAgICBgIHwgVmlld3M6ICR7Zm9ybWF0QnVja2V0TXMoc3VtbWFyeS52aWV3c01zKX1gLFxuICAgICAgYCB8IERCOiAke2Zvcm1hdEJ1Y2tldE1zKHN1bW1hcnkuZGJNcyl9ICgke3F1ZXJ5Q291bnRMYWJlbChzdW1tYXJ5LmRiUXVlcnlDb3VudCl9KWAsXG4gICAgICBgIHwgVmVsb2Npb3VzOiAke2Zvcm1hdEJ1Y2tldE1zKHN1bW1hcnkudmVsb2Npb3VzTXMpfWAsXG4gICAgICBgKWBcbiAgICBdLmpvaW4oXCJcIilcblxuICAgIGF3YWl0IGxvZ2dlcltyZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ01ldGhvZF0oY29tcGxldGVkTWVzc2FnZSlcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/response.js"],"names":[],"mappings":"AA+EA,MAAM,CAAC,OAAO,OAAO,iCAAiC;IAgC7C,aAAa;IACb,iBAAiB;IACjB,8BAA8B,oBA4MT,MAAM,GAAG,SAAS,KAAK,IAAI;IA/BhD,UAAU;IACV,aAAa;IA/MpB;;4CAEwC;IACxC,IAAI,EADM,MAAM,GAAG,UAAU,GAAG,IAAI,CACzB;IAEX;;+BAE2B;IAC3B,QAAQ,EADE,MAAM,GAAG,IAAI,CACR;IAEf;;oFAEgF;IAChF,cAAc,EADJ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CACvD;IAErB;;0CAEsC;IACtC,OAAO,EADG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CACtB;IAEZ;;yBAEqB;IACrB,mBAAmB,EADT,OAAO,CACU;IAE3B;;;;OAIG;IACH,YAAY,EAAC,aAAa,EAAC,EAFxB;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAClD;KAC0B,EAI1B;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAJF,MAIE,EAAE,KAAK,EAHT,MAGS,GAFP,IAAI,CAQhB;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAJF,MAIE,EAAE,KAAK,EAHT,MAGS,GAFP,IAAI,CAIhB;IAED;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAHF,MAGE,GAFA,MAAM,EAAE,CAepB;IAED;;;;OAIG;IACH,YAAY,CAAC,GAAG,EAHL,MAGK,GAFH,IAAI,CAUhB;IAED;;;;OAIG;IACH,kBAAkB,IAFL,IAAI,CAIhB;IAED;;;OAGG;IACH,qBAAqB,IAFR,OAAO,CAInB;IAED;;;OAGG;IACH,OAAO,IAFM,MAAM,GAAG,UAAU,GAAG,IAAI,CAQtC;IAED;;;OAGG;IACH,aAAa,IAFA,MAAM,CAIlB;IAED;;;OAGG;IACH,gBAAgB,IAFH,MAAM,CAIlB;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAHF,MAAM,GAAG,UAGP,GAFA,IAAI,CAMhB;IAED;;;OAGG;IACH,WAAW,IAFE,MAAM,GAAG,IAAI,CAIzB;IAED;;;OAGG;IACH,iBAAiB,IAFJ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAI9E;IAED;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAJL,MAIK,EAAE,UAAU,AAHzB,CACA,EADQ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAGtC,GAFtB,IAAI,CAMhB;IAED;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAHP,KAGO,GAFL,IAAI,CAKhB;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAM,EAHL,MAAM,GAAG,MAGJ,GAFH,IAAI,CAYhB;IAED;;;OAGG;IACH,mBAAmB,IAFN,MAAM,GAAG,SAAS,CAI9B;IAED;;;;OAIG;IACH,mBAAmB,CAAC,cAAc,EAHvB,MAAM,GAAG,SAAS,GAAG,IAGE,GAFrB,IAAI,CAYhB;IAED;;;;OAIG;IACH,gCAAgC,CAAC,OAAO,EAH7B,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,KAAK,IAGX,GAF3B,IAAI,CAIhB;CACF"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/response.js"],"names":[],"mappings":"AAiFA,MAAM,CAAC,OAAO,OAAO,iCAAiC;IAgC7C,aAAa;IACb,iBAAiB;IACjB,8BAA8B,oBAqNT,MAAM,GAAG,SAAS,KAAK,IAAI;IA/BhD,UAAU;IACV,aAAa;IAxNpB;;4CAEwC;IACxC,IAAI,EADM,MAAM,GAAG,UAAU,GAAG,IAAI,CACzB;IAEX;;+BAE2B;IAC3B,QAAQ,EADE,MAAM,GAAG,IAAI,CACR;IAEf;;oFAEgF;IAChF,cAAc,EADJ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CACvD;IAErB;;0CAEsC;IACtC,OAAO,EADG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CACtB;IAEZ;;yBAEqB;IACrB,mBAAmB,EADT,OAAO,CACU;IAE3B;;;;OAIG;IACH,YAAY,EAAC,aAAa,EAAC,EAFxB;QAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO,CAClD;KAC0B,EAI1B;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAJF,MAIE,EAAE,KAAK,EAHT,MAGS,GAFP,IAAI,CAQhB;IAED;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAJF,MAIE,EAAE,KAAK,EAHT,MAGS,GAFP,IAAI,CAIhB;IAED;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAHF,MAGE,GAFA,MAAM,EAAE,CAepB;IAED;;;;OAIG;IACH,YAAY,CAAC,GAAG,EAHL,MAGK,GAFH,IAAI,CAUhB;IAED;;;;OAIG;IACH,kBAAkB,IAFL,IAAI,CAIhB;IAED;;;OAGG;IACH,qBAAqB,IAFR,OAAO,CAInB;IAED;;;OAGG;IACH,OAAO,IAFM,MAAM,GAAG,UAAU,GAAG,IAAI,CAQtC;IAED;;;OAGG;IACH,aAAa,IAFA,MAAM,CAIlB;IAED;;;OAGG;IACH,gBAAgB,IAFH,MAAM,CAIlB;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAHF,MAAM,GAAG,UAGP,GAFA,IAAI,CAehB;IAED;;;OAGG;IACH,WAAW,IAFE,MAAM,GAAG,IAAI,CAIzB;IAED;;;OAGG;IACH,iBAAiB,IAFJ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAI9E;IAED;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAJL,MAIK,EAAE,UAAU,AAHzB,CACA,EADQ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAGtC,GAFtB,IAAI,CAMhB;IAED;;;;OAIG;IACH,YAAY,CAAC,KAAK,EAHP,KAGO,GAFL,IAAI,CAKhB;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAM,EAHL,MAAM,GAAG,MAGJ,GAFH,IAAI,CAYhB;IAED;;;OAGG;IACH,mBAAmB,IAFN,MAAM,GAAG,SAAS,CAI9B;IAED;;;;OAIG;IACH,mBAAmB,CAAC,cAAc,EAHvB,MAAM,GAAG,SAAS,GAAG,IAGE,GAFrB,IAAI,CAYhB;IAED;;;;OAIG;IACH,gCAAgC,CAAC,OAAO,EAH7B,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,KAAK,IAGX,GAF3B,IAAI,CAIhB;CACF"}
@@ -1,4 +1,5 @@
1
1
  // @ts-check
2
+ import { HttpResponseBodyTooLargeError } from "./errors.js";
2
3
  /**
3
4
  * Named status aliases.
4
5
  * @type {Record<string, number>} */
@@ -202,6 +203,12 @@ export default class VelociousHttpServerClientResponse {
202
203
  setBody(value) {
203
204
  this.filePath = null;
204
205
  this.fileOnFinished = null;
206
+ const actualBytes = typeof value === "string" ? Buffer.byteLength(value, "utf8") : value.byteLength;
207
+ const maxBytes = this.configuration.getHttpServerMaxBufferedResponseBodyBytes();
208
+ if (maxBytes !== undefined && actualBytes > maxBytes) {
209
+ this.body = "";
210
+ throw new HttpResponseBodyTooLargeError({ actualBytes, maxBytes });
211
+ }
205
212
  this.body = value;
206
213
  }
207
214
  /**
@@ -288,4 +295,4 @@ export default class VelociousHttpServerClientResponse {
288
295
  this._requestTimeoutMsChangeHandler = handler;
289
296
  }
290
297
  }
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7b0NBRW9DO0FBQ3BDLE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsU0FBUyxFQUFFLEdBQUc7SUFDZCxXQUFXLEVBQUUsR0FBRztJQUNoQix1QkFBdUIsRUFBRSxHQUFHO0NBQzdCLENBQUE7QUFFRDs7b0NBRW9DO0FBQ3BDLE1BQU0sd0JBQXdCLEdBQUc7SUFDL0IsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUscUJBQXFCO0lBQzFCLEdBQUcsRUFBRSxZQUFZO0lBQ2pCLEdBQUcsRUFBRSxhQUFhO0lBQ2xCLEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsVUFBVTtJQUNmLEdBQUcsRUFBRSwrQkFBK0I7SUFDcEMsR0FBRyxFQUFFLFlBQVk7SUFDakIsR0FBRyxFQUFFLGVBQWU7SUFDcEIsR0FBRyxFQUFFLGlCQUFpQjtJQUN0QixHQUFHLEVBQUUsY0FBYztJQUNuQixHQUFHLEVBQUUsa0JBQWtCO0lBQ3ZCLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixHQUFHLEVBQUUsbUJBQW1CO0lBQ3hCLEdBQUcsRUFBRSxPQUFPO0lBQ1osR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixHQUFHLEVBQUUsb0JBQW9CO0lBQ3pCLEdBQUcsRUFBRSxhQUFhO0lBQ2xCLEdBQUcsRUFBRSxjQUFjO0lBQ25CLEdBQUcsRUFBRSxrQkFBa0I7SUFDdkIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixH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QyxJQUFJLElBQUksQ0FBQTtJQUN0RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFBO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQUMsY0FBYztRQUNoQyxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDMUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQTtRQUN6QyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUE7UUFDcEMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdDQUFnQyxDQUFDLE9BQU87UUFDdEMsSUFBSSxDQUFDLDhCQUE4QixHQUFHLE9BQU8sQ0FBQTtJQUMvQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBOYW1lZCBzdGF0dXMgYWxpYXNlcy5cbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqL1xuY29uc3QgTkFNRURfU1RBVFVTX0FMSUFTRVMgPSB7XG4gIFwic3VjY2Vzc1wiOiAyMDAsXG4gIFwibm90LWZvdW5kXCI6IDQwNCxcbiAgXCJpbnRlcm5hbC1zZXJ2ZXItZXJyb3JcIjogNTAwXG59XG5cbi8qKlxuICogU3RhbmRhcmQgc3RhdHVzIG1lc3NhZ2VzLlxuICogQHR5cGUge1JlY29yZDxudW1iZXIsIHN0cmluZz59ICovXG5jb25zdCBTVEFOREFSRF9TVEFUVVNfTUVTU0FHRVMgPSB7XG4gIDEwMDogXCJDb250aW51ZVwiLFxuICAxMDE6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuICAxMDI6IFwiUHJvY2Vzc2luZ1wiLFxuICAxMDM6IFwiRWFybHkgSGludHNcIixcbiAgMjAwOiBcIk9LXCIsXG4gIDIwMTogXCJDcmVhdGVkXCIsXG4gIDIwMjogXCJBY2NlcHRlZFwiLFxuICAyMDM6IFwiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIixcbiAgMjA0OiBcIk5vIENvbnRlbnRcIixcbiAgMjA1OiBcIlJlc2V0IENvbnRlbnRcIixcbiAgMjA2OiBcIlBhcnRpYWwgQ29udGVudFwiLFxuICAyMDc6IFwiTXVsdGktU3RhdHVzXCIsXG4gIDIwODogXCJBbHJlYWR5IFJlcG9ydGVkXCIsXG4gIDIyNjogXCJJTSBVc2VkXCIsXG4gIDMwMDogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gIDMwMTogXCJNb3ZlZCBQZXJtYW5lbnRseVwiLFxuICAzMDI6IFwiRm91bmRcIixcbiAgMzAzOiBcIlNlZSBPdGhlclwiLFxuICAzMDQ6IFwiTm90IE1vZGlmaWVkXCIsXG4gIDMwNTogXCJVc2UgUHJveHlcIixcbiAgMzA3OiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICAzMDg6IFwiUGVybWFuZW50IFJlZGlyZWN0XCIsXG4gIDQwMDogXCJCYWQgUmVxdWVzdFwiLFxuICA0MDE6IFwiVW5hdXRob3JpemVkXCIsXG4gIDQwMjogXCJQYXltZW50IFJlcXVpcmVkXCIsXG4gIDQwMzogXCJGb3JiaWRkZW5cIixcbiAgNDA0OiBcIk5vdCBGb3VuZFwiLFxuICA0MDU6IFwiTWV0aG9kIE5vdCBBbGxvd2VkXCIsXG4gIDQwNjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuICA0MDc6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgNDA4OiBcIlJlcXVlc3QgVGltZW91dFwiLFxuICA0MDk6IFwiQ29uZmxpY3RcIixcbiAgNDEwOiBcIkdvbmVcIixcbiAgNDExOiBcIkxlbmd0aCBSZXF1aXJlZFwiLFxuICA0MTI6IFwiUHJlY29uZGl0aW9uIEZhaWxlZFwiLFxuICA0MTM6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgNDE0OiBcIlVSSSBUb28gTG9uZ1wiLFxuICA0MTU6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuICA0MTY6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gIDQxNzogXCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcbiAgNDE4OiBcIkknbSBhIHRlYXBvdFwiLFxuICA0MjE6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICA0MjI6IFwiVW5wcm9jZXNzYWJsZSBFbnRpdHlcIixcbiAgNDIzOiBcIkxvY2tlZFwiLFxuICA0MjQ6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgNDI1OiBcIlRvbyBFYXJseVwiLFxuICA0MjY6IFwiVXBncmFkZSBSZXF1aXJlZFwiLFxuICA0Mjg6IFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCIsXG4gIDQyOTogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICA0MzE6IFwiUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZVwiLFxuICA0NTE6IFwiVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnNcIixcbiAgNTAwOiBcIkludGVybmFsIHNlcnZlciBlcnJvclwiLFxuICA1MDE6IFwiTm90IEltcGxlbWVudGVkXCIsXG4gIDUwMjogXCJCYWQgR2F0ZXdheVwiLFxuICA1MDM6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICA1MDQ6IFwiR2F0ZXdheSBUaW1lb3V0XCIsXG4gIDUwNTogXCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiLFxuICA1MDY6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcbiAgNTA3OiBcIkluc3VmZmljaWVudCBTdG9yYWdlXCIsXG4gIDUwODogXCJMb29wIERldGVjdGVkXCIsXG4gIDUxMDogXCJOb3QgRXh0ZW5kZWRcIixcbiAgNTExOiBcIk5ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIlxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50UmVzcG9uc2Uge1xuICAvKipcbiAgICogQm9keS5cbiAgICogQHR5cGUge3N0cmluZyB8IFVpbnQ4QXJyYXkgfCBudWxsfSAqL1xuICBib2R5ID0gbnVsbFxuXG4gIC8qKlxuICAgKiBGaWxlIHBhdGguXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAqL1xuICBmaWxlUGF0aCA9IG51bGxcblxuICAvKipcbiAgICogRmlsZSByZXNwb25zZSBjb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAdHlwZSB7KChyZXN1bHQ6IFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gKi9cbiAgZmlsZU9uRmluaXNoZWQgPSBudWxsXG5cbiAgLyoqXG4gICAqIEhlYWRlcnMuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovXG4gIGhlYWRlcnMgPSB7fVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNvbXByZXNzaW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIHNwZWNpZmljIHJlc3BvbnNlLlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgY29tcHJlc3Npb25EaXNhYmxlZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb259KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGhlYWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRIZWFkZXIoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmhlYWRlcnMpKSB7XG4gICAgICB0aGlzLmhlYWRlcnNba2V5XSA9IFtdXG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXJzW2tleV0ucHVzaCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBLZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0SGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzLmhlYWRlcnNba2V5XSA9IFt2YWx1ZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV2ZXJ5IHZhbHVlIHNldCBmb3IgYSBoZWFkZXIsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBIZWFkZXIgdmFsdWVzIGluIGluc2VydGlvbiBvcmRlci5cbiAgICovXG4gIGdldEhlYWRlcihrZXkpIHtcbiAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCB2YWx1ZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaGVhZGVyS2V5LnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlS2V5KSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKC4uLnRoaXMuaGVhZGVyc1toZWFkZXJLZXldKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGV2ZXJ5IHZhbHVlIHNldCBmb3IgYSBoZWFkZXIsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHJlbW92ZUhlYWRlcihrZXkpIHtcbiAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaGVhZGVyS2V5LnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlS2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmhlYWRlcnNbaGVhZGVyS2V5XVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBIVFRQIHJlc3BvbnNlIGNvbXByZXNzaW9uIGZvciB0aGlzIHNwZWNpZmljIHJlc3BvbnNlLCBldmVuIHdoZW4gdGhlXG4gICAqIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIGNvbXByZXNzIGJ1ZmZlcmVkIHJlc3BvbnNlcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZGlzYWJsZUNvbXByZXNzaW9uKCkge1xuICAgIHRoaXMuY29tcHJlc3Npb25EaXNhYmxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGNvbXByZXNzaW9uIGRpc2FibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGNvbXByZXNzaW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIHJlc3BvbnNlLlxuICAgKi9cbiAgaXNDb21wcmVzc2lvbkRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXByZXNzaW9uRGlzYWJsZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBib2R5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgVWludDhBcnJheSB8IG51bGx9IC0gVGhlIGJvZHkuXG4gICAqL1xuICBnZXRCb2R5KCkge1xuICAgIGlmICh0aGlzLmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYm9keVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGJvZHkgaGFzIGJlZW4gc2V0XCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgZ2V0U3RhdHVzQ29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2RlIHx8IDIwMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHN0YXR1cyBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBzdGF0dXMgbWVzc2FnZS5cbiAgICovXG4gIGdldFN0YXR1c01lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRCb2R5KHZhbHVlKSB7XG4gICAgdGhpcy5maWxlUGF0aCA9IG51bGxcbiAgICB0aGlzLmZpbGVPbkZpbmlzaGVkID0gbnVsbFxuICAgIHRoaXMuYm9keSA9IHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBGaWxlIHBhdGguXG4gICAqL1xuICBnZXRGaWxlUGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5maWxlUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpbGUgcmVzcG9uc2UgY29tcGxldGlvbiBjYWxsYmFjay5cbiAgICogQHJldHVybnMgeygocmVzdWx0OiBcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCIpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IG51bGx9IC0gRmlsZSByZXNwb25zZSBjb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKi9cbiAgZ2V0RmlsZU9uRmluaXNoZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZU9uRmluaXNoZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBmaWxlIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcGFyYW0geygocmVzdWx0OiBcImNvbXBsZXRlZFwiIHwgXCJhYm9ydGVkXCIpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IG51bGx9IFtvbkZpbmlzaGVkXSAtIENvbXBsZXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldEZpbGVQYXRoKHBhdGgsIG9uRmluaXNoZWQgPSBudWxsKSB7XG4gICAgdGhpcy5maWxlUGF0aCA9IHBhdGhcbiAgICB0aGlzLmZpbGVPbkZpbmlzaGVkID0gb25GaW5pc2hlZFxuICAgIHRoaXMuYm9keSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBlcnJvciBib2R5LlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRFcnJvckJvZHkoZXJyb3IpIHtcbiAgICB0aGlzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcIilcbiAgICB0aGlzLnNldEJvZHkoYCR7ZXJyb3IubWVzc2FnZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWApXG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0cyBhIG51bWVyaWMgSFRUUCBzdGF0dXMgY29kZSAoZS5nLiBgNDIyYCkgb3Igb25lIG9mIHRoZVxuICAgKiBuYW1lZCBhbGlhc2VzIChgXCJzdWNjZXNzXCJgLCBgXCJub3QtZm91bmRcImAsIGBcImludGVybmFsLXNlcnZlci1lcnJvclwiYCkuXG4gICAqIE51bWVyaWMgaW5wdXRzIGluIHRoZSBzdGFuZGFyZCAxeHgtNXh4IHJhbmdlIHJlc29sdmUgdGhlaXIgb3duXG4gICAqIHN0YXR1cyBtZXNzYWdlcyBmcm9tIHRoZSBJQU5BIHJlZ2lzdHJ5OyBhbGlhc2VzIGtlZXAgdGhlXG4gICAqIGJhY2stY29tcGF0aWJsZSBjb2RlIG1hcHBpbmcuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBzdGF0dXMgLSBTdGF0dXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFN0YXR1cyhzdGF0dXMpIHtcbiAgICBjb25zdCBhbGlhc0NvZGUgPSBOQU1FRF9TVEFUVVNfQUxJQVNFU1tTdHJpbmcoc3RhdHVzKV1cbiAgICBjb25zdCBudW1lcmljU3RhdHVzID0gYWxpYXNDb2RlID8/IE51bWJlcihzdGF0dXMpXG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtZXJpY1N0YXR1cykgfHwgbnVtZXJpY1N0YXR1cyA8IDEwMCB8fCBudW1lcmljU3RhdHVzID4gNTk5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBzdGF0dXM6ICR7c3RhdHVzfWApXG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVtZXJpY1N0YXR1c1xuICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IFNUQU5EQVJEX1NUQVRVU19NRVNTQUdFU1tudW1lcmljU3RhdHVzXSB8fCBcIk9LXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCByZXF1ZXN0IHRpbWVvdXQgbXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9IC0gUmVxdWVzdCB0aW1lb3V0IGluIHNlY29uZHMuXG4gICAqL1xuICBnZXRSZXF1ZXN0VGltZW91dE1zKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0VGltZW91dE1zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgcmVxdWVzdCB0aW1lb3V0IG1zLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZCB8IG51bGx9IHRpbWVvdXRTZWNvbmRzIC0gVGltZW91dCBpbiBzZWNvbmRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRSZXF1ZXN0VGltZW91dE1zKHRpbWVvdXRTZWNvbmRzKSB7XG4gICAgaWYgKHR5cGVvZiB0aW1lb3V0U2Vjb25kcyA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUodGltZW91dFNlY29uZHMpKSB7XG4gICAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zID0gdGltZW91dFNlY29uZHNcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNcyA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcikge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIodGhpcy5fcmVxdWVzdFRpbWVvdXRNcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgcmVxdWVzdCB0aW1lb3V0IG1zIGNoYW5nZSBoYW5kbGVyLlxuICAgKiBAcGFyYW0geyh0aW1lb3V0U2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB2b2lkfSBoYW5kbGVyIC0gQ2hhbmdlIGhhbmRsZXIuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHNldFJlcXVlc3RUaW1lb3V0TXNDaGFuZ2VIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlciA9IGhhbmRsZXJcbiAgfVxufVxuIl19
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFekQ7O29DQUVvQztBQUNwQyxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLFNBQVMsRUFBRSxHQUFHO0lBQ2QsV0FBVyxFQUFFLEdBQUc7SUFDaEIsdUJBQXVCLEVBQUUsR0FBRztDQUM3QixDQUFBO0FBRUQ7O29DQUVvQztBQUNwQyxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLEdBQUcsRUFBRSxVQUFVO0lBQ2YsR0FBRyxFQUFFLHFCQUFxQjtJQUMxQixHQUFHLEVBQUUsWUFBWTtJQUNqQixHQUFHLEVBQUUsYUFBYTtJQUNsQixHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUsK0JBQStCO0lBQ3BDLEdBQUcsRUFBRSxZQUFZO0lBQ2pCLEdBQUcsRUFBRSxlQUFlO0lBQ3BCLEdBQUcsRUFBRSxpQkFBaUI7SUFDdEIsR0FBRyxFQUFFLGNBQWM7SUFDbkIsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxrQkFBa0I7SUFDdkIsR0FBRyxFQUFFLG1CQUFtQjtJQUN4QixHQUFHLEVBQUUsT0FBTztJQUNaLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxjQUFjO0lBQ25CLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdBQUcsRUFBRSxvQkFBb0I7SUFDekIsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixHQUFHLEVBQUUsYUFBYTtJQUNsQixHQUFHLEVBQUUsY0FBYztJQUNuQixHQUFHLEVBQUUsa0JBQWtCO0lBQ3ZCLEdBQUcsRUFBRSxXQUFXO0lBQ2hCLEdB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QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtIdHRwUmVzcG9uc2VCb2R5VG9vTGFyZ2VFcnJvcn0gZnJvbSBcIi4vZXJyb3JzLmpzXCJcblxuLyoqXG4gKiBOYW1lZCBzdGF0dXMgYWxpYXNlcy5cbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSAqL1xuY29uc3QgTkFNRURfU1RBVFVTX0FMSUFTRVMgPSB7XG4gIFwic3VjY2Vzc1wiOiAyMDAsXG4gIFwibm90LWZvdW5kXCI6IDQwNCxcbiAgXCJpbnRlcm5hbC1zZXJ2ZXItZXJyb3JcIjogNTAwXG59XG5cbi8qKlxuICogU3RhbmRhcmQgc3RhdHVzIG1lc3NhZ2VzLlxuICogQHR5cGUge1JlY29yZDxudW1iZXIsIHN0cmluZz59ICovXG5jb25zdCBTVEFOREFSRF9TVEFUVVNfTUVTU0FHRVMgPSB7XG4gIDEwMDogXCJDb250aW51ZVwiLFxuICAxMDE6IFwiU3dpdGNoaW5nIFByb3RvY29sc1wiLFxuICAxMDI6IFwiUHJvY2Vzc2luZ1wiLFxuICAxMDM6IFwiRWFybHkgSGludHNcIixcbiAgMjAwOiBcIk9LXCIsXG4gIDIwMTogXCJDcmVhdGVkXCIsXG4gIDIwMjogXCJBY2NlcHRlZFwiLFxuICAyMDM6IFwiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb25cIixcbiAgMjA0OiBcIk5vIENvbnRlbnRcIixcbiAgMjA1OiBcIlJlc2V0IENvbnRlbnRcIixcbiAgMjA2OiBcIlBhcnRpYWwgQ29udGVudFwiLFxuICAyMDc6IFwiTXVsdGktU3RhdHVzXCIsXG4gIDIwODogXCJBbHJlYWR5IFJlcG9ydGVkXCIsXG4gIDIyNjogXCJJTSBVc2VkXCIsXG4gIDMwMDogXCJNdWx0aXBsZSBDaG9pY2VzXCIsXG4gIDMwMTogXCJNb3ZlZCBQZXJtYW5lbnRseVwiLFxuICAzMDI6IFwiRm91bmRcIixcbiAgMzAzOiBcIlNlZSBPdGhlclwiLFxuICAzMDQ6IFwiTm90IE1vZGlmaWVkXCIsXG4gIDMwNTogXCJVc2UgUHJveHlcIixcbiAgMzA3OiBcIlRlbXBvcmFyeSBSZWRpcmVjdFwiLFxuICAzMDg6IFwiUGVybWFuZW50IFJlZGlyZWN0XCIsXG4gIDQwMDogXCJCYWQgUmVxdWVzdFwiLFxuICA0MDE6IFwiVW5hdXRob3JpemVkXCIsXG4gIDQwMjogXCJQYXltZW50IFJlcXVpcmVkXCIsXG4gIDQwMzogXCJGb3JiaWRkZW5cIixcbiAgNDA0OiBcIk5vdCBGb3VuZFwiLFxuICA0MDU6IFwiTWV0aG9kIE5vdCBBbGxvd2VkXCIsXG4gIDQwNjogXCJOb3QgQWNjZXB0YWJsZVwiLFxuICA0MDc6IFwiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIixcbiAgNDA4OiBcIlJlcXVlc3QgVGltZW91dFwiLFxuICA0MDk6IFwiQ29uZmxpY3RcIixcbiAgNDEwOiBcIkdvbmVcIixcbiAgNDExOiBcIkxlbmd0aCBSZXF1aXJlZFwiLFxuICA0MTI6IFwiUHJlY29uZGl0aW9uIEZhaWxlZFwiLFxuICA0MTM6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIixcbiAgNDE0OiBcIlVSSSBUb28gTG9uZ1wiLFxuICA0MTU6IFwiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZVwiLFxuICA0MTY6IFwiUmFuZ2UgTm90IFNhdGlzZmlhYmxlXCIsXG4gIDQxNzogXCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcbiAgNDE4OiBcIkknbSBhIHRlYXBvdFwiLFxuICA0MjE6IFwiTWlzZGlyZWN0ZWQgUmVxdWVzdFwiLFxuICA0MjI6IFwiVW5wcm9jZXNzYWJsZSBFbnRpdHlcIixcbiAgNDIzOiBcIkxvY2tlZFwiLFxuICA0MjQ6IFwiRmFpbGVkIERlcGVuZGVuY3lcIixcbiAgNDI1OiBcIlRvbyBFYXJseVwiLFxuICA0MjY6IFwiVXBncmFkZSBSZXF1aXJlZFwiLFxuICA0Mjg6IFwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCIsXG4gIDQyOTogXCJUb28gTWFueSBSZXF1ZXN0c1wiLFxuICA0MzE6IFwiUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZVwiLFxuICA0NTE6IFwiVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnNcIixcbiAgNTAwOiBcIkludGVybmFsIHNlcnZlciBlcnJvclwiLFxuICA1MDE6IFwiTm90IEltcGxlbWVudGVkXCIsXG4gIDUwMjogXCJCYWQgR2F0ZXdheVwiLFxuICA1MDM6IFwiU2VydmljZSBVbmF2YWlsYWJsZVwiLFxuICA1MDQ6IFwiR2F0ZXdheSBUaW1lb3V0XCIsXG4gIDUwNTogXCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiLFxuICA1MDY6IFwiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXNcIixcbiAgNTA3OiBcIkluc3VmZmljaWVudCBTdG9yYWdlXCIsXG4gIDUwODogXCJMb29wIERldGVjdGVkXCIsXG4gIDUxMDogXCJOb3QgRXh0ZW5kZWRcIixcbiAgNTExOiBcIk5ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWRcIlxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNIdHRwU2VydmVyQ2xpZW50UmVzcG9uc2Uge1xuICAvKipcbiAgICogQm9keS5cbiAgICogQHR5cGUge3N0cmluZyB8IFVpbnQ4QXJyYXkgfCBudWxsfSAqL1xuICBib2R5ID0gbnVsbFxuXG4gIC8qKlxuICAgKiBGaWxlIHBhdGguXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAqL1xuICBmaWxlUGF0aCA9IG51bGxcblxuICAvKipcbiAgICogRmlsZSByZXNwb25zZSBjb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAdHlwZSB7KChyZXN1bHQ6IFwiY29tcGxldGVkXCIgfCBcImFib3J0ZWRcIikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gKi9cbiAgZmlsZU9uRmluaXNoZWQgPSBudWxsXG5cbiAgLyoqXG4gICAqIEhlYWRlcnMuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59ICovXG4gIGhlYWRlcnMgPSB7fVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNvbXByZXNzaW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIHNwZWNpZmljIHJlc3BvbnNlLlxuICAgKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgY29tcHJlc3Npb25EaXNhYmxlZCA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb259KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9yZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGhlYWRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIEtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhZGRIZWFkZXIoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmhlYWRlcnMpKSB7XG4gICAgICB0aGlzLmhlYWRlcnNba2V5XSA9IFtdXG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXJzW2tleV0ucHVzaCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBoZWFkZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBLZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIHVzZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0SGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICB0aGlzLmhlYWRlcnNba2V5XSA9IFt2YWx1ZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGV2ZXJ5IHZhbHVlIHNldCBmb3IgYSBoZWFkZXIsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBIZWFkZXIgdmFsdWVzIGluIGluc2VydGlvbiBvcmRlci5cbiAgICovXG4gIGdldEhlYWRlcihrZXkpIHtcbiAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCB2YWx1ZXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaGVhZGVyS2V5LnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlS2V5KSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKC4uLnRoaXMuaGVhZGVyc1toZWFkZXJLZXldKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGV2ZXJ5IHZhbHVlIHNldCBmb3IgYSBoZWFkZXIsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gSGVhZGVyIG5hbWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHJlbW92ZUhlYWRlcihrZXkpIHtcbiAgICBjb25zdCBsb3dlckNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKVxuXG4gICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaGVhZGVyS2V5LnRvTG93ZXJDYXNlKCkgPT0gbG93ZXJDYXNlS2V5KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmhlYWRlcnNbaGVhZGVyS2V5XVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyBIVFRQIHJlc3BvbnNlIGNvbXByZXNzaW9uIGZvciB0aGlzIHNwZWNpZmljIHJlc3BvbnNlLCBldmVuIHdoZW4gdGhlXG4gICAqIHNlcnZlciBpcyBjb25maWd1cmVkIHRvIGNvbXByZXNzIGJ1ZmZlcmVkIHJlc3BvbnNlcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgZGlzYWJsZUNvbXByZXNzaW9uKCkge1xuICAgIHRoaXMuY29tcHJlc3Npb25EaXNhYmxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGNvbXByZXNzaW9uIGRpc2FibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGNvbXByZXNzaW9uIGhhcyBiZWVuIGRpc2FibGVkIGZvciB0aGlzIHJlc3BvbnNlLlxuICAgKi9cbiAgaXNDb21wcmVzc2lvbkRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXByZXNzaW9uRGlzYWJsZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBib2R5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgVWludDhBcnJheSB8IG51bGx9IC0gVGhlIGJvZHkuXG4gICAqL1xuICBnZXRCb2R5KCkge1xuICAgIGlmICh0aGlzLmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYm9keVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGJvZHkgaGFzIGJlZW4gc2V0XCIpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHN0YXR1cyBjb2RlLlxuICAgKi9cbiAgZ2V0U3RhdHVzQ29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2RlIHx8IDIwMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHN0YXR1cyBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBzdGF0dXMgbWVzc2FnZS5cbiAgICovXG4gIGdldFN0YXR1c01lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNldCBib2R5LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFVpbnQ4QXJyYXl9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRCb2R5KHZhbHVlKSB7XG4gICAgdGhpcy5maWxlUGF0aCA9IG51bGxcbiAgICB0aGlzLmZpbGVPbkZpbmlzaGVkID0gbnVsbFxuXG4gICAgY29uc3QgYWN0dWFsQnl0ZXMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgXCJ1dGY4XCIpIDogdmFsdWUuYnl0ZUxlbmd0aFxuICAgIGNvbnN0IG1heEJ5dGVzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEh0dHBTZXJ2ZXJNYXhCdWZmZXJlZFJlc3BvbnNlQm9keUJ5dGVzKClcblxuICAgIGlmIChtYXhCeXRlcyAhPT0gdW5kZWZpbmVkICYmIGFjdHVhbEJ5dGVzID4gbWF4Qnl0ZXMpIHtcbiAgICAgIHRoaXMuYm9keSA9IFwiXCJcbiAgICAgIHRocm93IG5ldyBIdHRwUmVzcG9uc2VCb2R5VG9vTGFyZ2VFcnJvcih7YWN0dWFsQnl0ZXMsIG1heEJ5dGVzfSlcbiAgICB9XG5cbiAgICB0aGlzLmJvZHkgPSB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGZpbGUgcGF0aC5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gRmlsZSBwYXRoLlxuICAgKi9cbiAgZ2V0RmlsZVBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaWxlIHJlc3BvbnNlIGNvbXBsZXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHsoKHJlc3VsdDogXCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwiKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSAtIEZpbGUgcmVzcG9uc2UgY29tcGxldGlvbiBjYWxsYmFjay5cbiAgICovXG4gIGdldEZpbGVPbkZpbmlzaGVkKCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVPbkZpbmlzaGVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgZmlsZSBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHBhcmFtIHsoKHJlc3VsdDogXCJjb21wbGV0ZWRcIiB8IFwiYWJvcnRlZFwiKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikgfCBudWxsfSBbb25GaW5pc2hlZF0gLSBDb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRGaWxlUGF0aChwYXRoLCBvbkZpbmlzaGVkID0gbnVsbCkge1xuICAgIHRoaXMuZmlsZVBhdGggPSBwYXRoXG4gICAgdGhpcy5maWxlT25GaW5pc2hlZCA9IG9uRmluaXNoZWRcbiAgICB0aGlzLmJvZHkgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgZXJyb3IgYm9keS5cbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBFcnJvciBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0RXJyb3JCb2R5KGVycm9yKSB7XG4gICAgdGhpcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIpXG4gICAgdGhpcy5zZXRCb2R5KGAke2Vycm9yLm1lc3NhZ2V9XFxuXFxuJHtlcnJvci5zdGFja31gKVxuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYSBudW1lcmljIEhUVFAgc3RhdHVzIGNvZGUgKGUuZy4gYDQyMmApIG9yIG9uZSBvZiB0aGVcbiAgICogbmFtZWQgYWxpYXNlcyAoYFwic3VjY2Vzc1wiYCwgYFwibm90LWZvdW5kXCJgLCBgXCJpbnRlcm5hbC1zZXJ2ZXItZXJyb3JcImApLlxuICAgKiBOdW1lcmljIGlucHV0cyBpbiB0aGUgc3RhbmRhcmQgMXh4LTV4eCByYW5nZSByZXNvbHZlIHRoZWlyIG93blxuICAgKiBzdGF0dXMgbWVzc2FnZXMgZnJvbSB0aGUgSUFOQSByZWdpc3RyeTsgYWxpYXNlcyBrZWVwIHRoZVxuICAgKiBiYWNrLWNvbXBhdGlibGUgY29kZSBtYXBwaW5nLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gc3RhdHVzIC0gU3RhdHVzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRTdGF0dXMoc3RhdHVzKSB7XG4gICAgY29uc3QgYWxpYXNDb2RlID0gTkFNRURfU1RBVFVTX0FMSUFTRVNbU3RyaW5nKHN0YXR1cyldXG4gICAgY29uc3QgbnVtZXJpY1N0YXR1cyA9IGFsaWFzQ29kZSA/PyBOdW1iZXIoc3RhdHVzKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bWVyaWNTdGF0dXMpIHx8IG51bWVyaWNTdGF0dXMgPCAxMDAgfHwgbnVtZXJpY1N0YXR1cyA+IDU5OSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgc3RhdHVzOiAke3N0YXR1c31gKVxuICAgIH1cblxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IG51bWVyaWNTdGF0dXNcbiAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSBTVEFOREFSRF9TVEFUVVNfTUVTU0FHRVNbbnVtZXJpY1N0YXR1c10gfHwgXCJPS1wiXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgcmVxdWVzdCB0aW1lb3V0IG1zLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgdW5kZWZpbmVkfSAtIFJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzLlxuICAgKi9cbiAgZ2V0UmVxdWVzdFRpbWVvdXRNcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdFRpbWVvdXRNc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHJlcXVlc3QgdGltZW91dCBtcy5cbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsfSB0aW1lb3V0U2Vjb25kcyAtIFRpbWVvdXQgaW4gc2Vjb25kcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc2V0UmVxdWVzdFRpbWVvdXRNcyh0aW1lb3V0U2Vjb25kcykge1xuICAgIGlmICh0eXBlb2YgdGltZW91dFNlY29uZHMgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRTZWNvbmRzKSkge1xuICAgICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNcyA9IHRpbWVvdXRTZWNvbmRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3RUaW1lb3V0TXNDaGFuZ2VIYW5kbGVyKHRoaXMuX3JlcXVlc3RUaW1lb3V0TXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IHJlcXVlc3QgdGltZW91dCBtcyBjaGFuZ2UgaGFuZGxlci5cbiAgICogQHBhcmFtIHsodGltZW91dFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gdm9pZH0gaGFuZGxlciAtIENoYW5nZSBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXRSZXF1ZXN0VGltZW91dE1zQ2hhbmdlSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgdGhpcy5fcmVxdWVzdFRpbWVvdXRNc0NoYW5nZUhhbmRsZXIgPSBoYW5kbGVyXG4gIH1cbn1cbiJdfQ==