@workflow/core 5.0.0-beta.42 → 5.0.0-beta.44

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 (220) hide show
  1. package/dist/capabilities.d.ts +4 -4
  2. package/dist/capabilities.js +5 -5
  3. package/dist/capture-stack.d.ts +1 -1
  4. package/dist/capture-stack.js +2 -2
  5. package/dist/class-serialization.d.ts +8 -8
  6. package/dist/class-serialization.js +9 -9
  7. package/dist/classify-error.js +5 -5
  8. package/dist/context-violation-error.d.ts +5 -5
  9. package/dist/context-violation-error.d.ts.map +1 -1
  10. package/dist/context-violation-error.js +5 -5
  11. package/dist/create-hook.d.ts +10 -6
  12. package/dist/create-hook.d.ts.map +1 -1
  13. package/dist/create-hook.js +1 -1
  14. package/dist/define-hook.js +2 -2
  15. package/dist/describe-error.d.ts +7 -7
  16. package/dist/describe-error.js +8 -8
  17. package/dist/encryption.d.ts +5 -5
  18. package/dist/encryption.js +7 -7
  19. package/dist/events-consumer.d.ts +19 -7
  20. package/dist/events-consumer.d.ts.map +1 -1
  21. package/dist/events-consumer.js +33 -12
  22. package/dist/flushable-stream.d.ts +4 -4
  23. package/dist/flushable-stream.js +12 -12
  24. package/dist/global.d.ts +1 -1
  25. package/dist/global.js +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +2 -2
  28. package/dist/log-format.d.ts +2 -2
  29. package/dist/log-format.js +5 -5
  30. package/dist/logger.js +4 -4
  31. package/dist/private.d.ts +39 -64
  32. package/dist/private.d.ts.map +1 -1
  33. package/dist/private.js +294 -48
  34. package/dist/replay-payload-cache.d.ts +1 -1
  35. package/dist/replay-payload-cache.js +4 -4
  36. package/dist/runtime/compute-instance.d.ts +4 -3
  37. package/dist/runtime/compute-instance.d.ts.map +1 -1
  38. package/dist/runtime/compute-instance.js +5 -4
  39. package/dist/runtime/constants.d.ts +46 -19
  40. package/dist/runtime/constants.d.ts.map +1 -1
  41. package/dist/runtime/constants.js +76 -38
  42. package/dist/runtime/count-step-started-events.d.ts +7 -7
  43. package/dist/runtime/count-step-started-events.js +4 -4
  44. package/dist/runtime/deployment-guard.d.ts +7 -7
  45. package/dist/runtime/deployment-guard.js +8 -8
  46. package/dist/runtime/get-port-lazy.d.ts +2 -2
  47. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  48. package/dist/runtime/get-port-lazy.js +37 -30
  49. package/dist/runtime/get-world-lazy.d.ts +2 -2
  50. package/dist/runtime/get-world-lazy.js +3 -3
  51. package/dist/runtime/helpers.d.ts +18 -18
  52. package/dist/runtime/helpers.js +27 -27
  53. package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
  54. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  55. package/dist/runtime/quickjs-entrypoint.js +200 -81
  56. package/dist/runtime/quickjs-runtime.d.ts +31 -15
  57. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  58. package/dist/runtime/quickjs-runtime.js +126 -77
  59. package/dist/runtime/quickjs-serde.d.ts +10 -10
  60. package/dist/runtime/quickjs-serde.js +20 -20
  61. package/dist/runtime/replay-budget.d.ts +4 -4
  62. package/dist/runtime/replay-budget.js +5 -5
  63. package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
  64. package/dist/runtime/replay-recovery-reporter.js +2 -2
  65. package/dist/runtime/resume-hook.d.ts +2 -2
  66. package/dist/runtime/resume-hook.js +27 -27
  67. package/dist/runtime/resume-latency.d.ts +25 -25
  68. package/dist/runtime/resume-latency.d.ts.map +1 -1
  69. package/dist/runtime/resume-latency.js +4 -4
  70. package/dist/runtime/run-id-time.d.ts +2 -2
  71. package/dist/runtime/run-id-time.js +5 -5
  72. package/dist/runtime/run.d.ts +21 -4
  73. package/dist/runtime/run.d.ts.map +1 -1
  74. package/dist/runtime/run.js +154 -35
  75. package/dist/runtime/runs.d.ts +4 -4
  76. package/dist/runtime/runs.js +2 -2
  77. package/dist/runtime/start.d.ts +3 -3
  78. package/dist/runtime/start.d.ts.map +1 -1
  79. package/dist/runtime/start.js +27 -23
  80. package/dist/runtime/step-executor.d.ts +59 -11
  81. package/dist/runtime/step-executor.d.ts.map +1 -1
  82. package/dist/runtime/step-executor.js +116 -42
  83. package/dist/runtime/step-latency.d.ts +20 -14
  84. package/dist/runtime/step-latency.d.ts.map +1 -1
  85. package/dist/runtime/step-latency.js +13 -11
  86. package/dist/runtime/step-ownership.d.ts +6 -6
  87. package/dist/runtime/step-ownership.js +8 -8
  88. package/dist/runtime/step-single-flight.d.ts +1 -1
  89. package/dist/runtime/step-single-flight.d.ts.map +1 -1
  90. package/dist/runtime/step-single-flight.js +17 -11
  91. package/dist/runtime/suspension-handler.d.ts +99 -7
  92. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  93. package/dist/runtime/suspension-handler.js +678 -57
  94. package/dist/runtime/unserializable-step.d.ts +34 -0
  95. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  96. package/dist/runtime/unserializable-step.js +52 -0
  97. package/dist/runtime/vm-mode.d.ts +1 -1
  98. package/dist/runtime/vm-mode.js +2 -2
  99. package/dist/runtime/wait-continuation.d.ts +31 -9
  100. package/dist/runtime/wait-continuation.d.ts.map +1 -1
  101. package/dist/runtime/wait-continuation.js +44 -13
  102. package/dist/runtime/wait-until.d.ts +1 -1
  103. package/dist/runtime/wait-until.js +2 -2
  104. package/dist/runtime/world-compatibility.d.ts +20 -9
  105. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  106. package/dist/runtime/world-compatibility.js +24 -13
  107. package/dist/runtime/world-init.d.ts +5 -5
  108. package/dist/runtime/world-init.js +6 -6
  109. package/dist/runtime/world.d.ts.map +1 -1
  110. package/dist/runtime/world.js +13 -3
  111. package/dist/runtime.d.ts.map +1 -1
  112. package/dist/runtime.js +417 -213
  113. package/dist/sealed-box.d.ts +7 -7
  114. package/dist/sealed-box.js +15 -15
  115. package/dist/serialization/client.js +2 -2
  116. package/dist/serialization/codec-devalue-vm.d.ts +1 -1
  117. package/dist/serialization/codec-devalue-vm.js +4 -4
  118. package/dist/serialization/codec-devalue.d.ts +1 -1
  119. package/dist/serialization/codec-devalue.js +2 -2
  120. package/dist/serialization/codec.d.ts +4 -4
  121. package/dist/serialization/codec.js +2 -2
  122. package/dist/serialization/compression.d.ts +12 -11
  123. package/dist/serialization/compression.d.ts.map +1 -1
  124. package/dist/serialization/compression.js +16 -15
  125. package/dist/serialization/encryption.d.ts +7 -7
  126. package/dist/serialization/encryption.d.ts.map +1 -1
  127. package/dist/serialization/encryption.js +8 -8
  128. package/dist/serialization/errors.js +2 -2
  129. package/dist/serialization/format.d.ts +6 -6
  130. package/dist/serialization/format.js +7 -7
  131. package/dist/serialization/hardened.d.ts +18 -18
  132. package/dist/serialization/hardened.d.ts.map +1 -1
  133. package/dist/serialization/hardened.js +41 -32
  134. package/dist/serialization/index.d.ts +1 -1
  135. package/dist/serialization/index.js +2 -2
  136. package/dist/serialization/reducers/class-vm.d.ts +1 -1
  137. package/dist/serialization/reducers/class-vm.js +2 -2
  138. package/dist/serialization/reducers/class.js +2 -2
  139. package/dist/serialization/reducers/common-vm.js +12 -12
  140. package/dist/serialization/reducers/common.js +12 -12
  141. package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
  142. package/dist/serialization/reducers/step-function-vm.js +2 -2
  143. package/dist/serialization/reducers/step-function.js +2 -2
  144. package/dist/serialization/step.js +2 -2
  145. package/dist/serialization/types.d.ts +5 -5
  146. package/dist/serialization/types.js +2 -2
  147. package/dist/serialization/workflow-vm.d.ts +1 -1
  148. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  149. package/dist/serialization/workflow-vm.js +13 -10
  150. package/dist/serialization-format.d.ts +11 -11
  151. package/dist/serialization-format.d.ts.map +1 -1
  152. package/dist/serialization-format.js +29 -23
  153. package/dist/serialization.d.ts +20 -12
  154. package/dist/serialization.d.ts.map +1 -1
  155. package/dist/serialization.js +141 -99
  156. package/dist/set-attributes.js +2 -2
  157. package/dist/source-map.d.ts +1 -1
  158. package/dist/source-map.d.ts.map +1 -1
  159. package/dist/source-map.js +18 -12
  160. package/dist/step/context-storage.d.ts +5 -5
  161. package/dist/step/context-storage.js +1 -1
  162. package/dist/step/writable-stream.d.ts +3 -3
  163. package/dist/step/writable-stream.js +7 -7
  164. package/dist/step.js +12 -12
  165. package/dist/symbols.d.ts +2 -2
  166. package/dist/symbols.js +3 -3
  167. package/dist/telemetry/semantic-conventions.d.ts +21 -13
  168. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  169. package/dist/telemetry/semantic-conventions.js +21 -15
  170. package/dist/telemetry.d.ts +9 -3
  171. package/dist/telemetry.d.ts.map +1 -1
  172. package/dist/telemetry.js +40 -10
  173. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  174. package/dist/test-support/orchestrator-context.js +12 -2
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +2 -2
  177. package/dist/vm/index.js +4 -4
  178. package/dist/vm/script-cache.d.ts.map +1 -1
  179. package/dist/vm/script-cache.js +23 -17
  180. package/dist/vm/uint8array-base64.js +1 -1
  181. package/dist/workflow/abort-controller.d.ts +1 -1
  182. package/dist/workflow/abort-controller.js +12 -12
  183. package/dist/workflow/create-hook.js +3 -3
  184. package/dist/workflow/get-workflow-metadata.js +2 -2
  185. package/dist/workflow/hook.js +18 -18
  186. package/dist/workflow/set-attributes.d.ts +1 -1
  187. package/dist/workflow/set-attributes.js +2 -2
  188. package/dist/workflow/sleep.js +2 -2
  189. package/dist/workflow/world-init-stub.d.ts +1 -1
  190. package/dist/workflow/world-init-stub.js +2 -2
  191. package/dist/workflow.d.ts +2 -2
  192. package/dist/workflow.js +36 -14
  193. package/docs/api-reference/create-hook.mdx +15 -15
  194. package/docs/api-reference/create-webhook.mdx +15 -15
  195. package/docs/api-reference/define-hook.mdx +10 -10
  196. package/docs/api-reference/fatal-error.mdx +2 -2
  197. package/docs/api-reference/fetch.mdx +7 -7
  198. package/docs/api-reference/get-step-metadata.mdx +2 -2
  199. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  200. package/docs/api-reference/get-writable.mdx +7 -7
  201. package/docs/api-reference/index.mdx +1 -1
  202. package/docs/api-reference/retryable-error.mdx +1 -1
  203. package/docs/api-reference/set-attributes.mdx +2 -2
  204. package/docs/api-reference/sleep.mdx +3 -3
  205. package/docs/foundations/cancellation.mdx +31 -31
  206. package/docs/foundations/errors-and-retries.mdx +42 -11
  207. package/docs/foundations/hooks.mdx +37 -37
  208. package/docs/foundations/idempotency.mdx +9 -9
  209. package/docs/foundations/serialization.mdx +21 -22
  210. package/docs/foundations/starting-workflows.mdx +36 -37
  211. package/docs/foundations/streaming.mdx +68 -39
  212. package/docs/foundations/versioning.mdx +3 -3
  213. package/docs/foundations/workflows-and-steps.mdx +9 -9
  214. package/docs/how-it-works/cancellation.mdx +62 -62
  215. package/docs/how-it-works/code-transform.mdx +66 -54
  216. package/docs/how-it-works/encryption.mdx +25 -21
  217. package/docs/how-it-works/event-sourcing.mdx +84 -28
  218. package/docs/how-it-works/framework-integrations.mdx +12 -12
  219. package/docs/how-it-works/understanding-directives.mdx +21 -21
  220. package/package.json +7 -7
@@ -37,7 +37,7 @@ function reviveArrayBuffer(value) {
37
37
  // ---- Error subclass helper ----
38
38
  // Creates a reducer for a built-in Error subclass whose serialized shape
39
39
  // is exactly { message, stack, cause? }. Matches by `value.name`
40
- // (instance property) for cross-realm + bundler-output robustness see
40
+ // (instance property) for cross-realm + bundler-output robustness; see
41
41
  // the host-side common.ts for full rationale.
42
42
  function makeNamedErrorSubclassReducer(subclassName) {
43
43
  return (value) => {
@@ -58,7 +58,7 @@ function makeNamedErrorSubclassReducer(subclassName) {
58
58
  // constructor on globalThis so the resulting object passes
59
59
  // `instanceof TypeError` etc. in the consuming realm. Falls back to
60
60
  // a base Error with the right `.name` if the constructor is not
61
- // available (defensive built-ins always exist).
61
+ // available (defensive: built-ins always exist).
62
62
  function makeNamedErrorSubclassReviver(subclassName) {
63
63
  return (value) => {
64
64
  const Cls = globalThis[subclassName];
@@ -194,7 +194,7 @@ export function getCommonReducers() {
194
194
  SyntaxError: makeNamedErrorSubclassReducer('SyntaxError'),
195
195
  TypeError: makeNamedErrorSubclassReducer('TypeError'),
196
196
  URIError: makeNamedErrorSubclassReducer('URIError'),
197
- // Base Error reducer catch-all. Matched LAST after subclass-specific
197
+ // Base Error reducer: catch-all. Matched LAST after subclass-specific
198
198
  // reducers above. Preserves `name` so user Error subclasses without
199
199
  // dedicated reducers retain their identity through the round-trip.
200
200
  Error: (value) => {
@@ -220,7 +220,7 @@ export function getCommonReducers() {
220
220
  source: value.source,
221
221
  flags: value.flags,
222
222
  },
223
- // Request/Response/Headers serialize using the polyfill constructors
223
+ // Request/Response/Headers: serialize using the polyfill constructors
224
224
  Headers: (value) => {
225
225
  const H = globalThis.Headers;
226
226
  if (!H || !(value instanceof H))
@@ -290,7 +290,7 @@ export function getCommonReducers() {
290
290
  if (type)
291
291
  s.type = type;
292
292
  // Preserve wire framing so the step-side reviver can unframe
293
- // byte streams (framed-v1) dropping it turns a framed webhook
293
+ // byte streams (framed-v1); dropping it turns a framed webhook
294
294
  // body into raw length-prefixed bytes for the consumer.
295
295
  const framing = value[Symbol.for('WORKFLOW_STREAM_FRAMING')];
296
296
  if (framing)
@@ -328,7 +328,7 @@ export function getCommonReducers() {
328
328
  WorkflowFunction: (value) => {
329
329
  // Only match function references with a workflowId property (set by
330
330
  // the SWC compiler on workflow functions). Plain { workflowId } objects
331
- // are NOT matched this prevents infinite recursion since the reduced
331
+ // are NOT matched; this prevents infinite recursion since the reduced
332
332
  // form { workflowId } is a plain object, not a function.
333
333
  if (typeof value !== 'function')
334
334
  return false;
@@ -497,7 +497,7 @@ export function getCommonRevivers() {
497
497
  Uint8ClampedArray: (value) => new Uint8ClampedArray(reviveArrayBuffer(value)),
498
498
  Uint16Array: (value) => new Uint16Array(reviveArrayBuffer(value)),
499
499
  Uint32Array: (value) => new Uint32Array(reviveArrayBuffer(value)),
500
- // Web API types revived as plain objects in the VM since the real
500
+ // Web API types: revived as plain objects in the VM since the real
501
501
  // constructors (Headers, Request, Response) are not available in QuickJS.
502
502
  // The workflow code can access the properties but not call Web API methods.
503
503
  Headers: (value) => {
@@ -517,7 +517,7 @@ export function getCommonRevivers() {
517
517
  return value;
518
518
  },
519
519
  Response: (value) => {
520
- // Don't use Object.setPrototypeOf devalue continues to set properties
520
+ // Don't use Object.setPrototypeOf: devalue continues to set properties
521
521
  // on the object after the reviver runs, and getter-only properties
522
522
  // (like 'ok') on the prototype would cause "no setter" errors.
523
523
  // Instead, copy methods directly onto the object.
@@ -540,12 +540,12 @@ export function getCommonRevivers() {
540
540
  const RS = globalThis.ReadableStream;
541
541
  const stream = Object.create(RS ? RS.prototype : {});
542
542
  if (value && 'bodyInit' in value) {
543
- // Body from Response/Request constructor store the raw data
543
+ // Body from Response/Request constructor: store the raw data
544
544
  stream[Symbol.for('BODY_INIT')] = value.bodyInit;
545
545
  }
546
546
  else if (value && 'name' in value) {
547
- // Named stream reference preserve the name/type for re-serialization.
548
- // Streams are opaque pointers in the VM they can be passed to steps
547
+ // Named stream reference: preserve the name/type for re-serialization.
548
+ // Streams are opaque pointers in the VM; they can be passed to steps
549
549
  // but not consumed directly.
550
550
  stream[Symbol.for('WORKFLOW_STREAM_NAME')] = value.name;
551
551
  if (value.type)
@@ -576,4 +576,4 @@ export function getCommonRevivers() {
576
576
  },
577
577
  };
578
578
  }
579
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXZtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLXZtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFJSCxxRkFBcUY7QUFFckYsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQWM7SUFFZCxJQUFJLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDN0IsOERBQThEO0lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFzQjtJQUMxQyxPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUN0QyxJQUFJLEtBQUssS0FBSyxHQUFHO1FBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1B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QUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNLWNvbXBhdGlibGUgY29tbW9uIHJlZHVjZXJzIGFuZCByZXZpdmVycy5cbiAqXG4gKiBJZGVudGljYWwgdG8gY29tbW9uLnRzIGJ1dCB3aXRob3V0IE5vZGUuanMgZGVwZW5kZW5jaWVzOlxuICogLSBVc2VzIG5hdGl2ZSBgYnRvYWAgLyBgYXRvYmAgKHByb3ZpZGVkIGJ5IHF1aWNranMtd2FzaSdzIGJhc2U2NFxuICogICBleHRlbnNpb24sIHNlZSBgcXVpY2tqcy1hc3NldHMuZ2VuZXJhdGVkLnRzYCkgaW5zdGVhZCBvZiBCdWZmZXJcbiAqICAgb3IgcHVyZS1KUyBiYXNlNjQuXG4gKiAtIFVzZXMgYGluc3RhbmNlb2YgRXJyb3JgIGluc3RlYWQgb2YgYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgc2FmZSB0byBidW5kbGUgaW50byB0aGUgUXVpY2tKUyBXQVNNIFZNLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVkdWNlcnMsIFJldml2ZXJzLCBTZXJpYWxpemFibGVTcGVjaWFsIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vLyAtLS0tIEJhc2U2NCBoZWxwZXJzIChuYXRpdmUgYnRvYS9hdG9iIGZyb20gdGhlIHF1aWNranMtd2FzaSBiYXNlNjQgZXh0ZW5zaW9uKSAtLS0tXG5cbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjQoXG4gIHZhbHVlOiBBcnJheUJ1ZmZlckxpa2UsXG4gIG9mZnNldDogbnVtYmVyLFxuICBsZW5ndGg6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgLy8gYnRvYSByZXF1aXJlcyBhIGJpbmFyeSBzdHJpbmcuIEJ1aWxkIGl0IGZyb20gdGhlIGJ5dGUgdmlldy5cbiAgY29uc3QgdWludDggPSBuZXcgVWludDhBcnJheSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpO1xuICBsZXQgYmluYXJ5ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdWludDgubGVuZ3RoOyBpKyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1aW50OFtpXSEpO1xuICB9XG4gIHJldHVybiBidG9hKGJpbmFyeSk7XG59XG5cbmZ1bmN0aW9uIHZpZXdUb0Jhc2U2NCh2YWx1ZTogQXJyYXlCdWZmZXJWaWV3KTogc3RyaW5nIHtcbiAgcmV0dXJuIGFycmF5QnVmZmVyVG9CYXNlNjQodmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWU6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcbiAgaWYgKHZhbHVlID09PSAnLicpIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gIGNvbnN0IGJpbmFyeSA9IGF0b2IodmFsdWUpO1xuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7IGkrKykge1xuICAgIGJ5dGVzW2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcjtcbn1cblxuLy8gLS0tLSBFcnJvciBzdWJjbGFzcyBoZWxwZXIgLS0tLVxuXG4vLyBDcmVhdGVzIGEgcmVkdWNlciBmb3IgYSBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlXG4vLyBpcyBleGFjdGx5IHsgbWVzc2FnZSwgc3RhY2ssIGNhdXNlPyB9LiBNYXRjaGVzIGJ5IGB2YWx1ZS5uYW1lYFxuLy8gKGluc3RhbmNlIHByb3BlcnR5KSBmb3IgY3Jvc3MtcmVhbG0gKyBidW5kbGVyLW91dHB1dCByb2J1c3RuZXNzIOKAlCBzZWVcbi8vIHRoZSBob3N0LXNpZGUgY29tbW9uLnRzIGZvciBmdWxsIHJhdGlvbmFsZS5cbmZ1bmN0aW9uIG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKHN1YmNsYXNzTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiAoXG4gICAgdmFsdWU6IHVua25vd25cbiAgKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nOyBjYXVzZT86IHVua25vd24gfSB8IGZhbHNlID0+IHtcbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh2YWx1ZS5uYW1lICE9PSBzdWJjbGFzc05hbWUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZWR1Y2VkOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9ID0ge1xuICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgICB9O1xuICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIHsgY2F1c2U6IHVua25vd24gfSkuY2F1c2U7XG4gICAgcmV0dXJuIHJlZHVjZWQ7XG4gIH07XG59XG5cbi8vIENyZWF0ZXMgYSByZXZpdmVyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzLiBMb29rcyB1cCB0aGVcbi8vIGNvbnN0cnVjdG9yIG9uIGdsb2JhbFRoaXMgc28gdGhlIHJlc3VsdGluZyBvYmplY3QgcGFzc2VzXG4vLyBgaW5zdGFuY2VvZiBUeXBlRXJyb3JgIGV0Yy4gaW4gdGhlIGNvbnN1bWluZyByZWFsbS4gRmFsbHMgYmFjayB0b1xuLy8gYSBiYXNlIEVycm9yIHdpdGggdGhlIHJpZ2h0IGAubmFtZWAgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdFxuLy8gYXZhaWxhYmxlIChkZWZlbnNpdmUg4oCUIGJ1aWx0LWlucyBhbHdheXMgZXhpc3QpLlxuZnVuY3Rpb24gbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoc3ViY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuICh2YWx1ZTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nOyBjYXVzZT86IHVua25vd24gfSkgPT4ge1xuICAgIGNvbnN0IENscyA9IChnbG9iYWxUaGlzIGFzIGFueSlbc3ViY2xhc3NOYW1lXTtcbiAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgIGlmICh0eXBlb2YgQ2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvciA9IG5ldyBDbHModmFsdWUubWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHN1YmNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIChlcnJvciBhcyBhbnkpLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vLyAtLS0tIFJlZHVjZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJlZHVjZXJzKCk6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciAmJlxuICAgICAgYXJyYXlCdWZmZXJUb0Jhc2U2NCh2YWx1ZSwgMCwgdmFsdWUuYnl0ZUxlbmd0aCksXG4gICAgQmlnSW50OiAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgJiYgdmFsdWUudG9TdHJpbmcoKSxcbiAgICBCaWdJbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdmFsaWQgPSAhTnVtYmVyLmlzTmFOKHZhbHVlLmdldERhdGUoKSk7XG4gICAgICByZXR1cm4gdmFsaWQgPyB2YWx1ZS50b0lTT1N0cmluZygpIDogJy4nO1xuICAgIH0sXG4gICAgLy8gRE9NRXhjZXB0aW9uIGlzIGNoZWNrZWQgYmVmb3JlIEVycm9yIHNvIHRoYXQgRE9NRXhjZXB0aW9uLXNwZWNpZmljXG4gICAgLy8gc2hhcGUgKG5hbWUsIG1lc3NhZ2UsIHN0YWNrLCBjYXVzZSkgc3Vydml2ZXMgdGhlIHJvdW5kLXRyaXAuXG4gICAgRE9NRXhjZXB0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRE9NRXhjZXB0aW9uJ10gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIG5hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgICAgIH07XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgcmVkdWNlZC5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICAvLyBGaXJzdC1jbGFzcyBFcnJvciBzdWJjbGFzcyByZWR1Y2Vycy4gT3JkZXIgbWF0dGVyczogZWFjaCBzdWJjbGFzc1xuICAgIC8vIHJlZHVjZXIgaXMgY2hlY2tlZCBiZWZvcmUgdGhlIGdlbmVyaWMgYEVycm9yYCBjYXRjaC1hbGwgc28gdGhhdFxuICAgIC8vIGUuZy4gYSBUeXBlRXJyb3IgaW5zdGFuY2Ugcm91dGVzIHRocm91Z2ggdGhlIFR5cGVFcnJvciByZWR1Y2VyXG4gICAgLy8gaW5zdGVhZCBvZiB0aGUgYmFzZSBFcnJvciByZWR1Y2VyLiBNYXRjaGluZyBpcyBieSBgdmFsdWUubmFtZWBcbiAgICAvLyAodGhlIGluc3RhbmNlIHByb3BlcnR5KSBmb3IgY3Jvc3MtcmVhbG0gKyBidW5kbGVyIHJvYnVzdG5lc3M7XG4gICAgLy8gc2VlIGNvbW1vbi50cyBmb3IgZnVsbCByYXRpb25hbGUuXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgfHwgdmFsdWUubmFtZSAhPT0gJ0FnZ3JlZ2F0ZUVycm9yJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWdncmVnYXRlRXJyb3InXSA9IHtcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgICBlcnJvcnM6ICh2YWx1ZSBhcyBBZ2dyZWdhdGVFcnJvcikuZXJyb3JzLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIEV2YWxFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0V2YWxFcnJvcicpLFxuICAgIEZhdGFsRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdGYXRhbEVycm9yJyksXG4gICAgLy8gSG9va0NvbmZsaWN0RXJyb3IgY2FycmllcyBhbiBleHRyYSB0b2tlbiAoKyBvcHRpb25hbFxuICAgIC8vIGNvbmZsaWN0aW5nUnVuSWQpOyBtaXJyb3IgdGhlIGhvc3Qtc2lkZSBjb21tb24udHMgcmVkdWNlci5cbiAgICBIb29rQ29uZmxpY3RFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB8fCB2YWx1ZS5uYW1lICE9PSAnSG9va0NvbmZsaWN0RXJyb3InKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydIb29rQ29uZmxpY3RFcnJvciddID0ge1xuICAgICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogdmFsdWUuc3RhY2ssXG4gICAgICAgIHRva2VuOiAodmFsdWUgYXMgYW55KS50b2tlbixcbiAgICAgIH07XG4gICAgICBpZiAoKHZhbHVlIGFzIGFueSkuY29uZmxpY3RpbmdSdW5JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlZHVjZWQuY29uZmxpY3RpbmdSdW5JZCA9ICh2YWx1ZSBhcyBhbnkpLmNvbmZsaWN0aW5nUnVuSWQ7XG4gICAgICB9XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgcmVkdWNlZC5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBSYW5nZUVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignUmFuZ2VFcnJvcicpLFxuICAgIFJlZmVyZW5jZUVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignUmVmZXJlbmNlRXJyb3InKSxcbiAgICAvLyBSZXRyeWFibGVFcnJvciBjYXJyaWVzIGFuIGV4dHJhIHJldHJ5QWZ0ZXI7IHNlcmlhbGl6ZSBhcyBudW1lcmljXG4gICAgLy8gZXBvY2ggdGltZXN0YW1wIGZvciBjcm9zcy1yZWFsbSBzYWZldHkgKHNlZSBob3N0LXNpZGUgY29tbW9uLnRzKS5cbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB8fCB2YWx1ZS5uYW1lICE9PSAnUmV0cnlhYmxlRXJyb3InKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZXRyeUFmdGVyUmF3ID0gKHZhbHVlIGFzIGFueSkucmV0cnlBZnRlcjtcbiAgICAgIGxldCByZXRyeUFmdGVyOiBudW1iZXI7XG4gICAgICBpZiAoXG4gICAgICAgIHJldHJ5QWZ0ZXJSYXcgJiZcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiAocmV0cnlBZnRlclJhdyBhcyB7IGdldFRpbWU/OiB1bmtub3duIH0pLmdldFRpbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0ID0gKHJldHJ5QWZ0ZXJSYXcgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICAgICAgICByZXRyeUFmdGVyID0gTnVtYmVyLmlzTmFOKHQpID8gRGF0ZS5ub3coKSArIDEwMDAgOiB0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiByZXRyeUFmdGVyUmF3ID09PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZShyZXRyeUFmdGVyUmF3KS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRyeUFmdGVyID0gRGF0ZS5ub3coKSArIDEwMDA7XG4gICAgICB9XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZXRyeWFibGVFcnJvciddID0ge1xuICAgICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogdmFsdWUuc3RhY2ssXG4gICAgICAgIHJldHJ5QWZ0ZXIsXG4gICAgICB9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgLy8gUnVudGltZURlY3J5cHRpb25FcnJvciBjYXJyaWVzIGFuIGV4dHJhIGBjb250ZXh0YCBvYmplY3QgKG9wZXJhdGlvbixcbiAgICAvLyBieXRlTGVuZ3RoLCBmb3JtYXRQcmVmaXgpIHRoYXQgdGhlIGdlbmVyaWMgRXJyb3IgcmVkdWNlciB3b3VsZCBkcm9wLlxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgfHwgdmFsdWUubmFtZSAhPT0gJ1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydSdW50aW1lRGVjcnlwdGlvbkVycm9yJ10gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgICAgIH07XG4gICAgICBjb25zdCBjb250ZXh0ID0gKHZhbHVlIGFzIGFueSkuY29udGV4dDtcbiAgICAgIGlmIChjb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIH1cbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1VSSUVycm9yJyksXG4gICAgLy8gQmFzZSBFcnJvciByZWR1Y2VyIOKAlCBjYXRjaC1hbGwuIE1hdGNoZWQgTEFTVCBhZnRlciBzdWJjbGFzcy1zcGVjaWZpY1xuICAgIC8vIHJlZHVjZXJzIGFib3ZlLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHVzZXIgRXJyb3Igc3ViY2xhc3NlcyB3aXRob3V0XG4gICAgLy8gZGVkaWNhdGVkIHJlZHVjZXJzIHJldGFpbiB0aGVpciBpZGVudGl0eSB0aHJvdWdoIHRoZSByb3VuZC10cmlwLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIEluIHRoZSBWTSwgdXNlIGluc3RhbmNlb2YgRXJyb3IgKG5vIG5vZGU6dXRpbCBhdmFpbGFibGUpXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRXJyb3InXSA9IHtcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIEZsb2F0MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50OEFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIEludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgSW50MzJBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIE1hcDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIE1hcCAmJiBBcnJheS5mcm9tKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwICYmIHtcbiAgICAgICAgc291cmNlOiB2YWx1ZS5zb3VyY2UsXG4gICAgICAgIGZsYWdzOiB2YWx1ZS5mbGFncyxcbiAgICAgIH0sXG4gICAgLy8gUmVxdWVzdC9SZXNwb25zZS9IZWFkZXJzIOKAlCBzZXJpYWxpemUgdXNpbmcgdGhlIHBvbHlmaWxsIGNvbnN0cnVjdG9yc1xuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgSCA9IChnbG9iYWxUaGlzIGFzIGFueSkuSGVhZGVycztcbiAgICAgIGlmICghSCB8fCAhKHZhbHVlIGluc3RhbmNlb2YgSCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlIGFzIEl0ZXJhYmxlPFtzdHJpbmcsIHN0cmluZ10+KTtcbiAgICB9LFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgUiA9IChnbG9iYWxUaGlzIGFzIGFueSkuUmVxdWVzdDtcbiAgICAgIGlmICghUikgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVXNlIGluc3RhbmNlb2YgT1IgY2hlY2sgZm9yIHRoZSBSZXF1ZXN0LXNwZWNpZmljIC5qc29uIG1ldGhvZFxuICAgICAgLy8gKGR1Y2stdHlwaW5nIG9uIG1ldGhvZC91cmwgYWxvbmUgd291bGQgbWF0Y2ggcGxhaW4gb2JqZWN0cyBhbmRcbiAgICAgIC8vIGNhdXNlIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB0aGUgcmVkdWNlciBvdXRwdXQgYWxzbyBoYXMgdGhvc2UpXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFIpICYmIHR5cGVvZiB2YWx1ZT8uanNvbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZT8ubWV0aG9kICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IHZhbHVlLmhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIC8vIEluY2x1ZGUgdGhlIHdlYmhvb2sgcmVzcG9uc2Ugd3JpdGFibGUgc3RyZWFtIGlmIHByZXNlbnRcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFJyldO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgZGF0YS5yZXNwb25zZVdyaXRhYmxlID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgUiA9IChnbG9iYWxUaGlzIGFzIGFueSkuUmVzcG9uc2U7XG4gICAgICBpZiAoIVIpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFVzZSBpbnN0YW5jZW9mIE9SIGNoZWNrIGZvciBSZXNwb25zZS1zcGVjaWZpYyAuY2xvbmUgbWV0aG9kXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFIpICYmIHR5cGVvZiB2YWx1ZT8uY2xvbmUgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWU/LnN0YXR1cyAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBzdGF0dXM6IHZhbHVlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogdmFsdWUuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogdmFsdWUuaGVhZGVycyxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgcmVkaXJlY3RlZDogdmFsdWUucmVkaXJlY3RlZCxcbiAgICAgIH07XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgUlMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLlJlYWRhYmxlU3RyZWFtO1xuICAgICAgaWYgKFxuICAgICAgICAhUlMgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJTIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IFJTLnByb3RvdHlwZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZVtTeW1ib2wuZm9yKCdCT0RZX0lOSVQnKV07XG4gICAgICBpZiAoYm9keUluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBib2R5SW5pdCB9O1xuICAgICAgfVxuICAgICAgLy8gUHJlc2VydmUgc3RyZWFtIG5hbWUgaWYgcHJlc2VudCAob3BhcXVlIHBvaW50ZXIgZm9yIHBhc3NpbmcgdG8gc3RlcHMpXG4gICAgICBjb25zdCBuYW1lID0gdmFsdWVbU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX05BTUUnKV07XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBjb25zdCBzOiBhbnkgPSB7IG5hbWUgfTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbHVlW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyldO1xuICAgICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgICAgLy8gUHJlc2VydmUgd2lyZSBmcmFtaW5nIHNvIHRoZSBzdGVwLXNpZGUgcmV2aXZlciBjYW4gdW5mcmFtZVxuICAgICAgICAvLyBieXRlIHN0cmVhbXMgKGZyYW1lZC12MSkg4oCUIGRyb3BwaW5nIGl0IHR1cm5zIGEgZnJhbWVkIHdlYmhvb2tcbiAgICAgICAgLy8gYm9keSBpbnRvIHJhdyBsZW5ndGgtcHJlZml4ZWQgYnl0ZXMgZm9yIHRoZSBjb25zdW1lci5cbiAgICAgICAgY29uc3QgZnJhbWluZyA9IHZhbHVlW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9GUkFNSU5HJyldO1xuICAgICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBuYW1lOiAnX19lbXB0eScgfTtcbiAgICB9KSBhcyBhbnksXG4gICAgV3JpdGFibGVTdHJlYW06ICgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IFdTID0gKGdsb2JhbFRoaXMgYXMgYW55KS5Xcml0YWJsZVN0cmVhbTtcbiAgICAgIGlmIChcbiAgICAgICAgIVdTIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBXUyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBXUy5wcm90b3R5cGUpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpXTtcbiAgICAgIGNvbnN0IHM6IHsgbmFtZTogc3RyaW5nOyBydW5JZD86IHN0cmluZzsgZGVwbG95bWVudElkPzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG5hbWU6IG5hbWUgfHwgJ19fZW1wdHknLFxuICAgICAgfTtcbiAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSB3YXMgZm9yd2FyZGVkIGZyb20gYW5vdGhlciBydW4gKHBhcmVudCAtPiBjaGlsZFxuICAgICAgLy8gdmlhIHN0YXJ0KCkpLCBwcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZC9kZXBsb3ltZW50SWQgc28gdGhlXG4gICAgICAvLyBzdGVwLXNpZGUgcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgLy8gTWlycm9ycyB0aGUgbm9kZTp2bSB3b3JrZmxvdyByZWR1Y2VyIGluIHNlcmlhbGl6YXRpb24udHMuXG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX1JVTl9JRCcpXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPVxuICAgICAgICB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSUQnKV07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH0pIGFzIGFueSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBTZXQgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgVVJMOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgVVJMICYmIHZhbHVlLmhyZWYsXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBPbmx5IG1hdGNoIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2l0aCBhIHdvcmtmbG93SWQgcHJvcGVydHkgKHNldCBieVxuICAgICAgLy8gdGhlIFNXQyBjb21waWxlciBvbiB3b3JrZmxvdyBmdW5jdGlvbnMpLiBQbGFpbiB7IHdvcmtmbG93SWQgfSBvYmplY3RzXG4gICAgICAvLyBhcmUgTk9UIG1hdGNoZWQg4oCUIHRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHRoZSByZWR1Y2VkXG4gICAgICAvLyBmb3JtIHsgd29ya2Zsb3dJZCB9IGlzIGEgcGxhaW4gb2JqZWN0LCBub3QgYSBmdW5jdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHdvcmtmbG93SWQgPSAodmFsdWUgYXMgYW55KS53b3JrZmxvd0lkO1xuICAgICAgaWYgKHR5cGVvZiB3b3JrZmxvd0lkICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHsgd29ya2Zsb3dJZCB9O1xuICAgIH0sXG4gICAgVVJMU2VhcmNoUGFyYW1zOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlLnNpemUgPT09IDAgPyAnLicgOiBTdHJpbmcodmFsdWUpO1xuICAgIH0sXG4gICAgVWludDhBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgVWludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gIH07XG59XG5cbi8vIC0tLS0gUmV2aXZlcnMgLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmV2aXZlcnMoKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpLFxuICAgIEJpZ0ludDogKHZhbHVlOiBzdHJpbmcpID0+IEJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgQmlnSW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBCaWdVaW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IERhdGUodmFsdWUpLFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBET01FeGNlcHRpb24odmFsdWUubWVzc2FnZSwgdmFsdWUubmFtZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IodmFsdWUuZXJyb3JzID8/IFtdLCB2YWx1ZS5tZXNzYWdlKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIChlcnJvciBhcyBhbnkpLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBFdmFsRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyKCdFdmFsRXJyb3InKSxcbiAgICBGYXRhbEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFByZWZlciB0aGUgaG9zdC1yZWdpc3RlcmVkIEZhdGFsRXJyb3IgY2xhc3MgKHJlZ2lzdGVyZWQgdmlhXG4gICAgICAvLyBTeW1ib2wuZm9yIGtleXMgYnkgQHdvcmtmbG93L2Vycm9ycyBzbyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYFxuICAgICAgLy8gd29ya3MgYWNyb3NzIHJlYWxtcykuIEZhbGwgYmFjayB0byBhIHN5bnRoZXNpemVkIEVycm9yIHdpdGhcbiAgICAgIC8vIHRoZSByaWdodCAubmFtZSB3aGVuIG5vIHJlZ2lzdHJhdGlvbiBpcyBwcmVzZW50LlxuICAgICAgLy8gRmF0YWxFcnJvcidzIGNvbnN0cnVjdG9yIHRha2VzIG9ubHkgYG1lc3NhZ2VgLCBzbyBjYXVzZSBpc1xuICAgICAgLy8gYXR0YWNoZWQgYXMgYSBwcm9wZXJ0eSBhZnRlciBjb25zdHJ1Y3Rpb24gKG1hdGNoaW5nIHRoZSBob3N0XG4gICAgICAvLyByZXZpdmVyIGluIGNvbW1vbi50cykuXG4gICAgICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgIF07XG4gICAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgQ2xzKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSk7XG4gICAgICAgIGVycm9yLm5hbWUgPSAnRmF0YWxFcnJvcic7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUHJlZmVyIHRoZSByZWdpc3RlcmVkIEhvb2tDb25mbGljdEVycm9yIGNsYXNzIChzZWUgdGhlIEZhdGFsRXJyb3JcbiAgICAgIC8vIHJldml2ZXIgYWJvdmUpLiBJdHMgY29uc3RydWN0b3IgdGFrZXMgKHRva2VuLCBjb25mbGljdGluZ1J1bklkKS5cbiAgICAgIGNvbnN0IENscyA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0hvb2tDb25mbGljdEVycm9yJylcbiAgICAgIF07XG4gICAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgQ2xzKHZhbHVlLnRva2VuLCB2YWx1ZS5jb25mbGljdGluZ1J1bklkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5uYW1lID0gJ0hvb2tDb25mbGljdEVycm9yJztcbiAgICAgICAgKGVycm9yIGFzIGFueSkudG9rZW4gPSB2YWx1ZS50b2tlbjtcbiAgICAgICAgaWYgKHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChlcnJvciBhcyBhbnkpLmNvbmZsaWN0aW5nUnVuSWQgPSB2YWx1ZS5jb25mbGljdGluZ1J1bklkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUmV0cnlhYmxlRXJyb3IncyBjb25zdHJ1Y3RvciBhY2NlcHRzIChtZXNzYWdlLCB7IHJldHJ5QWZ0ZXIgfSkuXG4gICAgICAvLyBDYXVzZSBpcyBhdHRhY2hlZCBhZnRlciBjb25zdHJ1Y3Rpb24gKHRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdFxuICAgICAgLy8gZm9yd2FyZCBpdCkuIHJldHJ5QWZ0ZXIgaXMgc3RvcmVkIGFzIGEgRGF0ZSBpbiB0aGUgVk0gcmVhbG0uXG4gICAgICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICBdO1xuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IG5ldyBEYXRlKHZhbHVlLnJldHJ5QWZ0ZXIpO1xuICAgICAgbGV0IGVycm9yOiBFcnJvcjtcbiAgICAgIGlmICh0eXBlb2YgQ2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yID0gbmV3IENscyh2YWx1ZS5tZXNzYWdlLCB7IHJldHJ5QWZ0ZXIgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IubmFtZSA9ICdSZXRyeWFibGVFcnJvcic7XG4gICAgICAgIChlcnJvciBhcyBhbnkpLnJldHJ5QWZ0ZXIgPSByZXRyeUFmdGVyO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgKGVycm9yIGFzIGFueSkuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUHJlZmVyIHRoZSByZWdpc3RlcmVkIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgY2xhc3MgKHNlZSB0aGVcbiAgICAgIC8vIEZhdGFsRXJyb3IgcmV2aXZlciBhYm92ZSkuIEl0cyBjb25zdHJ1Y3RvciBhY2NlcHRzXG4gICAgICAvLyAobWVzc2FnZSwgeyBjYXVzZSwgY29udGV4dCB9KS5cbiAgICAgIGNvbnN0IENscyA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgXTtcbiAgICAgIGxldCBlcnJvcjogRXJyb3I7XG4gICAgICBpZiAodHlwZW9mIENscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBvcHRzOiB7IGNhdXNlPzogdW5rbm93bjsgY29udGV4dD86IHVua25vd24gfSA9IHt9O1xuICAgICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgb3B0cy5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgICBpZiAodmFsdWUuY29udGV4dCAhPT0gdW5kZWZpbmVkKSBvcHRzLmNvbnRleHQgPSB2YWx1ZS5jb250ZXh0O1xuICAgICAgICBlcnJvciA9IG5ldyBDbHModmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICAgICAgaWYgKHZhbHVlLmNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChlcnJvciBhcyBhbnkpLmNvbnRleHQgPSB2YWx1ZS5jb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmV2aXZlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyKCdVUklFcnJvcicpLFxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEZsb2F0MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBGbG9hdDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgSW50OEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgTWFwOiAodmFsdWUpID0+IG5ldyBNYXAodmFsdWUpLFxuICAgIFJlZ0V4cDogKHZhbHVlKSA9PiBuZXcgUmVnRXhwKHZhbHVlLnNvdXJjZSwgdmFsdWUuZmxhZ3MpLFxuICAgIFNldDogKHZhbHVlKSA9PiBuZXcgU2V0KHZhbHVlKSxcbiAgICBVUkw6ICh2YWx1ZSkgPT4gbmV3IFVSTCh2YWx1ZSksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlKSA9PiBuZXcgVVJMU2VhcmNoUGFyYW1zKHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlKSxcbiAgICBVaW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgVWludDhDbGFtcGVkQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBVaW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgLy8gV2ViIEFQSSB0eXBlcyDigJQgcmV2aXZlZCBhcyBwbGFpbiBvYmplY3RzIGluIHRoZSBWTSBzaW5jZSB0aGUgcmVhbFxuICAgIC8vIGNvbnN0cnVjdG9ycyAoSGVhZGVycywgUmVxdWVzdCwgUmVzcG9uc2UpIGFyZSBub3QgYXZhaWxhYmxlIGluIFF1aWNrSlMuXG4gICAgLy8gVGhlIHdvcmtmbG93IGNvZGUgY2FuIGFjY2VzcyB0aGUgcHJvcGVydGllcyBidXQgbm90IGNhbGwgV2ViIEFQSSBtZXRob2RzLlxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyAoZ2xvYmFsVGhpcyBhcyBhbnkpLkhlYWRlcnModmFsdWUpO1xuICAgIH0sXG4gICAgUmVxdWVzdDogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IFJlcSA9IChnbG9iYWxUaGlzIGFzIGFueSkuUmVxdWVzdDtcbiAgICAgIGlmIChSZXEpIHtcbiAgICAgICAgdmFsdWUuanNvbiA9IFJlcS5wcm90b3R5cGUuanNvbjtcbiAgICAgICAgdmFsdWUudGV4dCA9IFJlcS5wcm90b3R5cGUudGV4dDtcbiAgICAgICAgdmFsdWUuYXJyYXlCdWZmZXIgPSBSZXEucHJvdG90eXBlLmFycmF5QnVmZmVyO1xuICAgICAgfVxuICAgICAgLy8gQ2Fycnkgb3ZlciB0aGUgd2ViaG9vayByZXNwb25zZSB3cml0YWJsZSBzdHJlYW0gdG8gdGhlIHN5bWJvbCBwcm9wZXJ0eVxuICAgICAgaWYgKHZhbHVlLnJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgdmFsdWVbU3ltYm9sLmZvcignV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRScpXSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIC8vIERvbid0IHVzZSBPYmplY3Quc2V0UHJvdG90eXBlT2Yg4oCUIGRldmFsdWUgY29udGludWVzIHRvIHNldCBwcm9wZXJ0aWVzXG4gICAgICAvLyBvbiB0aGUgb2JqZWN0IGFmdGVyIHRoZSByZXZpdmVyIHJ1bnMsIGFuZCBnZXR0ZXItb25seSBwcm9wZXJ0aWVzXG4gICAgICAvLyAobGlrZSAnb2snKSBvbiB0aGUgcHJvdG90eXBlIHdvdWxkIGNhdXNlIFwibm8gc2V0dGVyXCIgZXJyb3JzLlxuICAgICAgLy8gSW5zdGVhZCwgY29weSBtZXRob2RzIGRpcmVjdGx5IG9udG8gdGhlIG9iamVjdC5cbiAgICAgIGNvbnN0IFJlc3AgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLlJlc3BvbnNlO1xuICAgICAgaWYgKFJlc3ApIHtcbiAgICAgICAgdmFsdWUuanNvbiA9IFJlc3AucHJvdG90eXBlLmpzb247XG4gICAgICAgIHZhbHVlLnRleHQgPSBSZXNwLnByb3RvdHlwZS50ZXh0O1xuICAgICAgICB2YWx1ZS5hcnJheUJ1ZmZlciA9IFJlc3AucHJvdG90eXBlLmFycmF5QnVmZmVyO1xuICAgICAgICBpZiAoUmVzcC5wcm90b3R5cGUuYnl0ZXMpIHZhbHVlLmJ5dGVzID0gUmVzcC5wcm90b3R5cGUuYnl0ZXM7XG4gICAgICAgIGlmIChSZXNwLnByb3RvdHlwZS5jbG9uZSkgdmFsdWUuY2xvbmUgPSBSZXNwLnByb3RvdHlwZS5jbG9uZTtcbiAgICAgIH1cbiAgICAgIHZhbHVlLl9ib2R5ID0gdmFsdWUuYm9keTtcbiAgICAgIHZhbHVlLm9rID0gdmFsdWUuc3RhdHVzID49IDIwMCAmJiB2YWx1ZS5zdGF0dXMgPCAzMDA7XG4gICAgICB2YWx1ZS5ib2R5VXNlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgUlMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLlJlYWRhYmxlU3RyZWFtO1xuICAgICAgY29uc3Qgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShSUyA/IFJTLnByb3RvdHlwZSA6IHt9KTtcbiAgICAgIGlmICh2YWx1ZSAmJiAnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIEJvZHkgZnJvbSBSZXNwb25zZS9SZXF1ZXN0IGNvbnN0cnVjdG9yIOKAlCBzdG9yZSB0aGUgcmF3IGRhdGFcbiAgICAgICAgc3RyZWFtW1N5bWJvbC5mb3IoJ0JPRFlfSU5JVCcpXSA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiAnbmFtZScgaW4gdmFsdWUpIHtcbiAgICAgICAgLy8gTmFtZWQgc3RyZWFtIHJlZmVyZW5jZSDigJQgcHJlc2VydmUgdGhlIG5hbWUvdHlwZSBmb3IgcmUtc2VyaWFsaXphdGlvbi5cbiAgICAgICAgLy8gU3RyZWFtcyBhcmUgb3BhcXVlIHBvaW50ZXJzIGluIHRoZSBWTSDigJQgdGhleSBjYW4gYmUgcGFzc2VkIHRvIHN0ZXBzXG4gICAgICAgIC8vIGJ1dCBub3QgY29uc3VtZWQgZGlyZWN0bHkuXG4gICAgICAgIHN0cmVhbVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpXSA9IHZhbHVlLm5hbWU7XG4gICAgICAgIGlmICh2YWx1ZS50eXBlKSBzdHJlYW1bU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX1RZUEUnKV0gPSB2YWx1ZS50eXBlO1xuICAgICAgICBpZiAodmFsdWUuZnJhbWluZykge1xuICAgICAgICAgIHN0cmVhbVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fRlJBTUlORycpXSA9IHZhbHVlLmZyYW1pbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBXUyA9IChnbG9iYWxUaGlzIGFzIGFueSkuV3JpdGFibGVTdHJlYW07XG4gICAgICBjb25zdCBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFdTID8gV1MucHJvdG90eXBlIDoge30pO1xuICAgICAgaWYgKHZhbHVlICYmICduYW1lJyBpbiB2YWx1ZSkge1xuICAgICAgICBzdHJlYW1bU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX05BTUUnKV0gPSB2YWx1ZS5uYW1lO1xuICAgICAgfVxuICAgICAgLy8gUHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQvZGVwbG95bWVudElkLCBpZiBwcmVzZW50LCBzbyB0aGF0IHdoZW5cbiAgICAgIC8vIHRoZSBoYW5kbGUgaXMgbGF0ZXIgcGFzc2VkIHRvIGEgc3RlcCB0aGUgd29ya2Zsb3cgcmVkdWNlciBjYW5cbiAgICAgIC8vIGZvcndhcmQgaXQgdGhyb3VnaCB0byB0aGUgc3RlcCByZXZpdmVyIChjcm9zcy1ydW4gd3JpdGFibGVcbiAgICAgIC8vIGZvcndhcmRpbmcgdmlhIHN0YXJ0KCkpLlxuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5ydW5JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyZWFtW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9TRVJWRVJfUlVOX0lEJyldID0gKFxuICAgICAgICAgIHZhbHVlIGFzIGFueVxuICAgICAgICApLnJ1bklkO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmVhbVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSUQnKV0gPSAoXG4gICAgICAgICAgdmFsdWUgYXMgYW55XG4gICAgICAgICkuZGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9LFxuICB9O1xufVxuIl19
579
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXZtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLXZtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFJSCxxRkFBcUY7QUFFckYsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQWM7SUFFZCxJQUFJLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDN0IsOERBQThEO0lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFzQjtJQUMxQyxPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUN0QyxJQUFJLEtBQUssS0FBSyxHQUFHO1FBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1B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QUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNLWNvbXBhdGlibGUgY29tbW9uIHJlZHVjZXJzIGFuZCByZXZpdmVycy5cbiAqXG4gKiBJZGVudGljYWwgdG8gY29tbW9uLnRzIGJ1dCB3aXRob3V0IE5vZGUuanMgZGVwZW5kZW5jaWVzOlxuICogLSBVc2VzIG5hdGl2ZSBgYnRvYWAgLyBgYXRvYmAgKHByb3ZpZGVkIGJ5IHF1aWNranMtd2FzaSdzIGJhc2U2NFxuICogICBleHRlbnNpb24sIHNlZSBgcXVpY2tqcy1hc3NldHMuZ2VuZXJhdGVkLnRzYCkgaW5zdGVhZCBvZiBCdWZmZXJcbiAqICAgb3IgcHVyZS1KUyBiYXNlNjQuXG4gKiAtIFVzZXMgYGluc3RhbmNlb2YgRXJyb3JgIGluc3RlYWQgb2YgYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgc2FmZSB0byBidW5kbGUgaW50byB0aGUgUXVpY2tKUyBXQVNNIFZNLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVkdWNlcnMsIFJldml2ZXJzLCBTZXJpYWxpemFibGVTcGVjaWFsIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vLyAtLS0tIEJhc2U2NCBoZWxwZXJzIChuYXRpdmUgYnRvYS9hdG9iIGZyb20gdGhlIHF1aWNranMtd2FzaSBiYXNlNjQgZXh0ZW5zaW9uKSAtLS0tXG5cbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9CYXNlNjQoXG4gIHZhbHVlOiBBcnJheUJ1ZmZlckxpa2UsXG4gIG9mZnNldDogbnVtYmVyLFxuICBsZW5ndGg6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgLy8gYnRvYSByZXF1aXJlcyBhIGJpbmFyeSBzdHJpbmcuIEJ1aWxkIGl0IGZyb20gdGhlIGJ5dGUgdmlldy5cbiAgY29uc3QgdWludDggPSBuZXcgVWludDhBcnJheSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpO1xuICBsZXQgYmluYXJ5ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdWludDgubGVuZ3RoOyBpKyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1aW50OFtpXSEpO1xuICB9XG4gIHJldHVybiBidG9hKGJpbmFyeSk7XG59XG5cbmZ1bmN0aW9uIHZpZXdUb0Jhc2U2NCh2YWx1ZTogQXJyYXlCdWZmZXJWaWV3KTogc3RyaW5nIHtcbiAgcmV0dXJuIGFycmF5QnVmZmVyVG9CYXNlNjQodmFsdWUuYnVmZmVyLCB2YWx1ZS5ieXRlT2Zmc2V0LCB2YWx1ZS5ieXRlTGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWU6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcbiAgaWYgKHZhbHVlID09PSAnLicpIHJldHVybiBuZXcgQXJyYXlCdWZmZXIoMCk7XG4gIGNvbnN0IGJpbmFyeSA9IGF0b2IodmFsdWUpO1xuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7IGkrKykge1xuICAgIGJ5dGVzW2ldID0gYmluYXJ5LmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcjtcbn1cblxuLy8gLS0tLSBFcnJvciBzdWJjbGFzcyBoZWxwZXIgLS0tLVxuXG4vLyBDcmVhdGVzIGEgcmVkdWNlciBmb3IgYSBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlXG4vLyBpcyBleGFjdGx5IHsgbWVzc2FnZSwgc3RhY2ssIGNhdXNlPyB9LiBNYXRjaGVzIGJ5IGB2YWx1ZS5uYW1lYFxuLy8gKGluc3RhbmNlIHByb3BlcnR5KSBmb3IgY3Jvc3MtcmVhbG0gKyBidW5kbGVyLW91dHB1dCByb2J1c3RuZXNzOyBzZWVcbi8vIHRoZSBob3N0LXNpZGUgY29tbW9uLnRzIGZvciBmdWxsIHJhdGlvbmFsZS5cbmZ1bmN0aW9uIG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKHN1YmNsYXNzTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiAoXG4gICAgdmFsdWU6IHVua25vd25cbiAgKTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nOyBjYXVzZT86IHVua25vd24gfSB8IGZhbHNlID0+IHtcbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh2YWx1ZS5uYW1lICE9PSBzdWJjbGFzc05hbWUpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZWR1Y2VkOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9ID0ge1xuICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgICB9O1xuICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIHsgY2F1c2U6IHVua25vd24gfSkuY2F1c2U7XG4gICAgcmV0dXJuIHJlZHVjZWQ7XG4gIH07XG59XG5cbi8vIENyZWF0ZXMgYSByZXZpdmVyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzLiBMb29rcyB1cCB0aGVcbi8vIGNvbnN0cnVjdG9yIG9uIGdsb2JhbFRoaXMgc28gdGhlIHJlc3VsdGluZyBvYmplY3QgcGFzc2VzXG4vLyBgaW5zdGFuY2VvZiBUeXBlRXJyb3JgIGV0Yy4gaW4gdGhlIGNvbnN1bWluZyByZWFsbS4gRmFsbHMgYmFjayB0b1xuLy8gYSBiYXNlIEVycm9yIHdpdGggdGhlIHJpZ2h0IGAubmFtZWAgaWYgdGhlIGNvbnN0cnVjdG9yIGlzIG5vdFxuLy8gYXZhaWxhYmxlIChkZWZlbnNpdmU6IGJ1aWx0LWlucyBhbHdheXMgZXhpc3QpLlxuZnVuY3Rpb24gbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoc3ViY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuICh2YWx1ZTogeyBtZXNzYWdlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nOyBjYXVzZT86IHVua25vd24gfSkgPT4ge1xuICAgIGNvbnN0IENscyA9IChnbG9iYWxUaGlzIGFzIGFueSlbc3ViY2xhc3NOYW1lXTtcbiAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgIGlmICh0eXBlb2YgQ2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvciA9IG5ldyBDbHModmFsdWUubWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHN1YmNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIChlcnJvciBhcyBhbnkpLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vLyAtLS0tIFJlZHVjZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJlZHVjZXJzKCk6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciAmJlxuICAgICAgYXJyYXlCdWZmZXJUb0Jhc2U2NCh2YWx1ZSwgMCwgdmFsdWUuYnl0ZUxlbmd0aCksXG4gICAgQmlnSW50OiAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgJiYgdmFsdWUudG9TdHJpbmcoKSxcbiAgICBCaWdJbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgdmFsaWQgPSAhTnVtYmVyLmlzTmFOKHZhbHVlLmdldERhdGUoKSk7XG4gICAgICByZXR1cm4gdmFsaWQgPyB2YWx1ZS50b0lTT1N0cmluZygpIDogJy4nO1xuICAgIH0sXG4gICAgLy8gRE9NRXhjZXB0aW9uIGlzIGNoZWNrZWQgYmVmb3JlIEVycm9yIHNvIHRoYXQgRE9NRXhjZXB0aW9uLXNwZWNpZmljXG4gICAgLy8gc2hhcGUgKG5hbWUsIG1lc3NhZ2UsIHN0YWNrLCBjYXVzZSkgc3Vydml2ZXMgdGhlIHJvdW5kLXRyaXAuXG4gICAgRE9NRXhjZXB0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRE9NRXhjZXB0aW9uJ10gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIG5hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgICAgIH07XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgcmVkdWNlZC5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICAvLyBGaXJzdC1jbGFzcyBFcnJvciBzdWJjbGFzcyByZWR1Y2Vycy4gT3JkZXIgbWF0dGVyczogZWFjaCBzdWJjbGFzc1xuICAgIC8vIHJlZHVjZXIgaXMgY2hlY2tlZCBiZWZvcmUgdGhlIGdlbmVyaWMgYEVycm9yYCBjYXRjaC1hbGwgc28gdGhhdFxuICAgIC8vIGUuZy4gYSBUeXBlRXJyb3IgaW5zdGFuY2Ugcm91dGVzIHRocm91Z2ggdGhlIFR5cGVFcnJvciByZWR1Y2VyXG4gICAgLy8gaW5zdGVhZCBvZiB0aGUgYmFzZSBFcnJvciByZWR1Y2VyLiBNYXRjaGluZyBpcyBieSBgdmFsdWUubmFtZWBcbiAgICAvLyAodGhlIGluc3RhbmNlIHByb3BlcnR5KSBmb3IgY3Jvc3MtcmVhbG0gKyBidW5kbGVyIHJvYnVzdG5lc3M7XG4gICAgLy8gc2VlIGNvbW1vbi50cyBmb3IgZnVsbCByYXRpb25hbGUuXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgfHwgdmFsdWUubmFtZSAhPT0gJ0FnZ3JlZ2F0ZUVycm9yJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnQWdncmVnYXRlRXJyb3InXSA9IHtcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgICBlcnJvcnM6ICh2YWx1ZSBhcyBBZ2dyZWdhdGVFcnJvcikuZXJyb3JzLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIEV2YWxFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0V2YWxFcnJvcicpLFxuICAgIEZhdGFsRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdGYXRhbEVycm9yJyksXG4gICAgLy8gSG9va0NvbmZsaWN0RXJyb3IgY2FycmllcyBhbiBleHRyYSB0b2tlbiAoKyBvcHRpb25hbFxuICAgIC8vIGNvbmZsaWN0aW5nUnVuSWQpOyBtaXJyb3IgdGhlIGhvc3Qtc2lkZSBjb21tb24udHMgcmVkdWNlci5cbiAgICBIb29rQ29uZmxpY3RFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB8fCB2YWx1ZS5uYW1lICE9PSAnSG9va0NvbmZsaWN0RXJyb3InKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydIb29rQ29uZmxpY3RFcnJvciddID0ge1xuICAgICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogdmFsdWUuc3RhY2ssXG4gICAgICAgIHRva2VuOiAodmFsdWUgYXMgYW55KS50b2tlbixcbiAgICAgIH07XG4gICAgICBpZiAoKHZhbHVlIGFzIGFueSkuY29uZmxpY3RpbmdSdW5JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlZHVjZWQuY29uZmxpY3RpbmdSdW5JZCA9ICh2YWx1ZSBhcyBhbnkpLmNvbmZsaWN0aW5nUnVuSWQ7XG4gICAgICB9XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgcmVkdWNlZC5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBSYW5nZUVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignUmFuZ2VFcnJvcicpLFxuICAgIFJlZmVyZW5jZUVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignUmVmZXJlbmNlRXJyb3InKSxcbiAgICAvLyBSZXRyeWFibGVFcnJvciBjYXJyaWVzIGFuIGV4dHJhIHJldHJ5QWZ0ZXI7IHNlcmlhbGl6ZSBhcyBudW1lcmljXG4gICAgLy8gZXBvY2ggdGltZXN0YW1wIGZvciBjcm9zcy1yZWFsbSBzYWZldHkgKHNlZSBob3N0LXNpZGUgY29tbW9uLnRzKS5cbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB8fCB2YWx1ZS5uYW1lICE9PSAnUmV0cnlhYmxlRXJyb3InKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZXRyeUFmdGVyUmF3ID0gKHZhbHVlIGFzIGFueSkucmV0cnlBZnRlcjtcbiAgICAgIGxldCByZXRyeUFmdGVyOiBudW1iZXI7XG4gICAgICBpZiAoXG4gICAgICAgIHJldHJ5QWZ0ZXJSYXcgJiZcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiAocmV0cnlBZnRlclJhdyBhcyB7IGdldFRpbWU/OiB1bmtub3duIH0pLmdldFRpbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0ID0gKHJldHJ5QWZ0ZXJSYXcgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICAgICAgICByZXRyeUFmdGVyID0gTnVtYmVyLmlzTmFOKHQpID8gRGF0ZS5ub3coKSArIDEwMDAgOiB0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiByZXRyeUFmdGVyUmF3ID09PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZShyZXRyeUFmdGVyUmF3KS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRyeUFmdGVyID0gRGF0ZS5ub3coKSArIDEwMDA7XG4gICAgICB9XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydSZXRyeWFibGVFcnJvciddID0ge1xuICAgICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogdmFsdWUuc3RhY2ssXG4gICAgICAgIHJldHJ5QWZ0ZXIsXG4gICAgICB9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgLy8gUnVudGltZURlY3J5cHRpb25FcnJvciBjYXJyaWVzIGFuIGV4dHJhIGBjb250ZXh0YCBvYmplY3QgKG9wZXJhdGlvbixcbiAgICAvLyBieXRlTGVuZ3RoLCBmb3JtYXRQcmVmaXgpIHRoYXQgdGhlIGdlbmVyaWMgRXJyb3IgcmVkdWNlciB3b3VsZCBkcm9wLlxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgfHwgdmFsdWUubmFtZSAhPT0gJ1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydSdW50aW1lRGVjcnlwdGlvbkVycm9yJ10gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgICAgIH07XG4gICAgICBjb25zdCBjb250ZXh0ID0gKHZhbHVlIGFzIGFueSkuY29udGV4dDtcbiAgICAgIGlmIChjb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIH1cbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1VSSUVycm9yJyksXG4gICAgLy8gQmFzZSBFcnJvciByZWR1Y2VyOiBjYXRjaC1hbGwuIE1hdGNoZWQgTEFTVCBhZnRlciBzdWJjbGFzcy1zcGVjaWZpY1xuICAgIC8vIHJlZHVjZXJzIGFib3ZlLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHVzZXIgRXJyb3Igc3ViY2xhc3NlcyB3aXRob3V0XG4gICAgLy8gZGVkaWNhdGVkIHJlZHVjZXJzIHJldGFpbiB0aGVpciBpZGVudGl0eSB0aHJvdWdoIHRoZSByb3VuZC10cmlwLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIEluIHRoZSBWTSwgdXNlIGluc3RhbmNlb2YgRXJyb3IgKG5vIG5vZGU6dXRpbCBhdmFpbGFibGUpXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRXJyb3InXSA9IHtcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIEZsb2F0MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50OEFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIEludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgSW50MzJBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIE1hcDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIE1hcCAmJiBBcnJheS5mcm9tKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwICYmIHtcbiAgICAgICAgc291cmNlOiB2YWx1ZS5zb3VyY2UsXG4gICAgICAgIGZsYWdzOiB2YWx1ZS5mbGFncyxcbiAgICAgIH0sXG4gICAgLy8gUmVxdWVzdC9SZXNwb25zZS9IZWFkZXJzOiBzZXJpYWxpemUgdXNpbmcgdGhlIHBvbHlmaWxsIGNvbnN0cnVjdG9yc1xuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgSCA9IChnbG9iYWxUaGlzIGFzIGFueSkuSGVhZGVycztcbiAgICAgIGlmICghSCB8fCAhKHZhbHVlIGluc3RhbmNlb2YgSCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlIGFzIEl0ZXJhYmxlPFtzdHJpbmcsIHN0cmluZ10+KTtcbiAgICB9LFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgUiA9IChnbG9iYWxUaGlzIGFzIGFueSkuUmVxdWVzdDtcbiAgICAgIGlmICghUikgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVXNlIGluc3RhbmNlb2YgT1IgY2hlY2sgZm9yIHRoZSBSZXF1ZXN0LXNwZWNpZmljIC5qc29uIG1ldGhvZFxuICAgICAgLy8gKGR1Y2stdHlwaW5nIG9uIG1ldGhvZC91cmwgYWxvbmUgd291bGQgbWF0Y2ggcGxhaW4gb2JqZWN0cyBhbmRcbiAgICAgIC8vIGNhdXNlIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB0aGUgcmVkdWNlciBvdXRwdXQgYWxzbyBoYXMgdGhvc2UpXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFIpICYmIHR5cGVvZiB2YWx1ZT8uanNvbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZT8ubWV0aG9kICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IHZhbHVlLmhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIC8vIEluY2x1ZGUgdGhlIHdlYmhvb2sgcmVzcG9uc2Ugd3JpdGFibGUgc3RyZWFtIGlmIHByZXNlbnRcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFJyldO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgZGF0YS5yZXNwb25zZVdyaXRhYmxlID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgUiA9IChnbG9iYWxUaGlzIGFzIGFueSkuUmVzcG9uc2U7XG4gICAgICBpZiAoIVIpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFVzZSBpbnN0YW5jZW9mIE9SIGNoZWNrIGZvciBSZXNwb25zZS1zcGVjaWZpYyAuY2xvbmUgbWV0aG9kXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFIpICYmIHR5cGVvZiB2YWx1ZT8uY2xvbmUgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWU/LnN0YXR1cyAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBzdGF0dXM6IHZhbHVlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogdmFsdWUuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogdmFsdWUuaGVhZGVycyxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgcmVkaXJlY3RlZDogdmFsdWUucmVkaXJlY3RlZCxcbiAgICAgIH07XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgUlMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLlJlYWRhYmxlU3RyZWFtO1xuICAgICAgaWYgKFxuICAgICAgICAhUlMgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJTIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IFJTLnByb3RvdHlwZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZVtTeW1ib2wuZm9yKCdCT0RZX0lOSVQnKV07XG4gICAgICBpZiAoYm9keUluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBib2R5SW5pdCB9O1xuICAgICAgfVxuICAgICAgLy8gUHJlc2VydmUgc3RyZWFtIG5hbWUgaWYgcHJlc2VudCAob3BhcXVlIHBvaW50ZXIgZm9yIHBhc3NpbmcgdG8gc3RlcHMpXG4gICAgICBjb25zdCBuYW1lID0gdmFsdWVbU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX05BTUUnKV07XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBjb25zdCBzOiBhbnkgPSB7IG5hbWUgfTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbHVlW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyldO1xuICAgICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgICAgLy8gUHJlc2VydmUgd2lyZSBmcmFtaW5nIHNvIHRoZSBzdGVwLXNpZGUgcmV2aXZlciBjYW4gdW5mcmFtZVxuICAgICAgICAvLyBieXRlIHN0cmVhbXMgKGZyYW1lZC12MSk7IGRyb3BwaW5nIGl0IHR1cm5zIGEgZnJhbWVkIHdlYmhvb2tcbiAgICAgICAgLy8gYm9keSBpbnRvIHJhdyBsZW5ndGgtcHJlZml4ZWQgYnl0ZXMgZm9yIHRoZSBjb25zdW1lci5cbiAgICAgICAgY29uc3QgZnJhbWluZyA9IHZhbHVlW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9GUkFNSU5HJyldO1xuICAgICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBuYW1lOiAnX19lbXB0eScgfTtcbiAgICB9KSBhcyBhbnksXG4gICAgV3JpdGFibGVTdHJlYW06ICgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IFdTID0gKGdsb2JhbFRoaXMgYXMgYW55KS5Xcml0YWJsZVN0cmVhbTtcbiAgICAgIGlmIChcbiAgICAgICAgIVdTIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBXUyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBXUy5wcm90b3R5cGUpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpXTtcbiAgICAgIGNvbnN0IHM6IHsgbmFtZTogc3RyaW5nOyBydW5JZD86IHN0cmluZzsgZGVwbG95bWVudElkPzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG5hbWU6IG5hbWUgfHwgJ19fZW1wdHknLFxuICAgICAgfTtcbiAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSB3YXMgZm9yd2FyZGVkIGZyb20gYW5vdGhlciBydW4gKHBhcmVudCAtPiBjaGlsZFxuICAgICAgLy8gdmlhIHN0YXJ0KCkpLCBwcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZC9kZXBsb3ltZW50SWQgc28gdGhlXG4gICAgICAvLyBzdGVwLXNpZGUgcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgLy8gTWlycm9ycyB0aGUgbm9kZTp2bSB3b3JrZmxvdyByZWR1Y2VyIGluIHNlcmlhbGl6YXRpb24udHMuXG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX1JVTl9JRCcpXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPVxuICAgICAgICB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSUQnKV07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH0pIGFzIGFueSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBTZXQgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgVVJMOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgVVJMICYmIHZhbHVlLmhyZWYsXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBPbmx5IG1hdGNoIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2l0aCBhIHdvcmtmbG93SWQgcHJvcGVydHkgKHNldCBieVxuICAgICAgLy8gdGhlIFNXQyBjb21waWxlciBvbiB3b3JrZmxvdyBmdW5jdGlvbnMpLiBQbGFpbiB7IHdvcmtmbG93SWQgfSBvYmplY3RzXG4gICAgICAvLyBhcmUgTk9UIG1hdGNoZWQ7IHRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHRoZSByZWR1Y2VkXG4gICAgICAvLyBmb3JtIHsgd29ya2Zsb3dJZCB9IGlzIGEgcGxhaW4gb2JqZWN0LCBub3QgYSBmdW5jdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHdvcmtmbG93SWQgPSAodmFsdWUgYXMgYW55KS53b3JrZmxvd0lkO1xuICAgICAgaWYgKHR5cGVvZiB3b3JrZmxvd0lkICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHsgd29ya2Zsb3dJZCB9O1xuICAgIH0sXG4gICAgVVJMU2VhcmNoUGFyYW1zOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlLnNpemUgPT09IDAgPyAnLicgOiBTdHJpbmcodmFsdWUpO1xuICAgIH0sXG4gICAgVWludDhBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgVWludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gIH07XG59XG5cbi8vIC0tLS0gUmV2aXZlcnMgLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmV2aXZlcnMoKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpLFxuICAgIEJpZ0ludDogKHZhbHVlOiBzdHJpbmcpID0+IEJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgQmlnSW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBCaWdVaW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IERhdGUodmFsdWUpLFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBET01FeGNlcHRpb24odmFsdWUubWVzc2FnZSwgdmFsdWUubmFtZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IodmFsdWUuZXJyb3JzID8/IFtdLCB2YWx1ZS5tZXNzYWdlKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIChlcnJvciBhcyBhbnkpLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBFdmFsRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyKCdFdmFsRXJyb3InKSxcbiAgICBGYXRhbEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFByZWZlciB0aGUgaG9zdC1yZWdpc3RlcmVkIEZhdGFsRXJyb3IgY2xhc3MgKHJlZ2lzdGVyZWQgdmlhXG4gICAgICAvLyBTeW1ib2wuZm9yIGtleXMgYnkgQHdvcmtmbG93L2Vycm9ycyBzbyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYFxuICAgICAgLy8gd29ya3MgYWNyb3NzIHJlYWxtcykuIEZhbGwgYmFjayB0byBhIHN5bnRoZXNpemVkIEVycm9yIHdpdGhcbiAgICAgIC8vIHRoZSByaWdodCAubmFtZSB3aGVuIG5vIHJlZ2lzdHJhdGlvbiBpcyBwcmVzZW50LlxuICAgICAgLy8gRmF0YWxFcnJvcidzIGNvbnN0cnVjdG9yIHRha2VzIG9ubHkgYG1lc3NhZ2VgLCBzbyBjYXVzZSBpc1xuICAgICAgLy8gYXR0YWNoZWQgYXMgYSBwcm9wZXJ0eSBhZnRlciBjb25zdHJ1Y3Rpb24gKG1hdGNoaW5nIHRoZSBob3N0XG4gICAgICAvLyByZXZpdmVyIGluIGNvbW1vbi50cykuXG4gICAgICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgIF07XG4gICAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgQ2xzKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSk7XG4gICAgICAgIGVycm9yLm5hbWUgPSAnRmF0YWxFcnJvcic7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUHJlZmVyIHRoZSByZWdpc3RlcmVkIEhvb2tDb25mbGljdEVycm9yIGNsYXNzIChzZWUgdGhlIEZhdGFsRXJyb3JcbiAgICAgIC8vIHJldml2ZXIgYWJvdmUpLiBJdHMgY29uc3RydWN0b3IgdGFrZXMgKHRva2VuLCBjb25mbGljdGluZ1J1bklkKS5cbiAgICAgIGNvbnN0IENscyA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0hvb2tDb25mbGljdEVycm9yJylcbiAgICAgIF07XG4gICAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgQ2xzKHZhbHVlLnRva2VuLCB2YWx1ZS5jb25mbGljdGluZ1J1bklkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5uYW1lID0gJ0hvb2tDb25mbGljdEVycm9yJztcbiAgICAgICAgKGVycm9yIGFzIGFueSkudG9rZW4gPSB2YWx1ZS50b2tlbjtcbiAgICAgICAgaWYgKHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChlcnJvciBhcyBhbnkpLmNvbmZsaWN0aW5nUnVuSWQgPSB2YWx1ZS5jb25mbGljdGluZ1J1bklkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUmV0cnlhYmxlRXJyb3IncyBjb25zdHJ1Y3RvciBhY2NlcHRzIChtZXNzYWdlLCB7IHJldHJ5QWZ0ZXIgfSkuXG4gICAgICAvLyBDYXVzZSBpcyBhdHRhY2hlZCBhZnRlciBjb25zdHJ1Y3Rpb24gKHRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdFxuICAgICAgLy8gZm9yd2FyZCBpdCkuIHJldHJ5QWZ0ZXIgaXMgc3RvcmVkIGFzIGEgRGF0ZSBpbiB0aGUgVk0gcmVhbG0uXG4gICAgICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICBdO1xuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IG5ldyBEYXRlKHZhbHVlLnJldHJ5QWZ0ZXIpO1xuICAgICAgbGV0IGVycm9yOiBFcnJvcjtcbiAgICAgIGlmICh0eXBlb2YgQ2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yID0gbmV3IENscyh2YWx1ZS5tZXNzYWdlLCB7IHJldHJ5QWZ0ZXIgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IubmFtZSA9ICdSZXRyeWFibGVFcnJvcic7XG4gICAgICAgIChlcnJvciBhcyBhbnkpLnJldHJ5QWZ0ZXIgPSByZXRyeUFmdGVyO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgKGVycm9yIGFzIGFueSkuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUHJlZmVyIHRoZSByZWdpc3RlcmVkIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgY2xhc3MgKHNlZSB0aGVcbiAgICAgIC8vIEZhdGFsRXJyb3IgcmV2aXZlciBhYm92ZSkuIEl0cyBjb25zdHJ1Y3RvciBhY2NlcHRzXG4gICAgICAvLyAobWVzc2FnZSwgeyBjYXVzZSwgY29udGV4dCB9KS5cbiAgICAgIGNvbnN0IENscyA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgXTtcbiAgICAgIGxldCBlcnJvcjogRXJyb3I7XG4gICAgICBpZiAodHlwZW9mIENscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBvcHRzOiB7IGNhdXNlPzogdW5rbm93bjsgY29udGV4dD86IHVua25vd24gfSA9IHt9O1xuICAgICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgb3B0cy5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgICBpZiAodmFsdWUuY29udGV4dCAhPT0gdW5kZWZpbmVkKSBvcHRzLmNvbnRleHQgPSB2YWx1ZS5jb250ZXh0O1xuICAgICAgICBlcnJvciA9IG5ldyBDbHModmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICAgICAgaWYgKHZhbHVlLmNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChlcnJvciBhcyBhbnkpLmNvbnRleHQgPSB2YWx1ZS5jb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmV2aXZlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyKCdVUklFcnJvcicpLFxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEZsb2F0MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBGbG9hdDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgSW50OEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgTWFwOiAodmFsdWUpID0+IG5ldyBNYXAodmFsdWUpLFxuICAgIFJlZ0V4cDogKHZhbHVlKSA9PiBuZXcgUmVnRXhwKHZhbHVlLnNvdXJjZSwgdmFsdWUuZmxhZ3MpLFxuICAgIFNldDogKHZhbHVlKSA9PiBuZXcgU2V0KHZhbHVlKSxcbiAgICBVUkw6ICh2YWx1ZSkgPT4gbmV3IFVSTCh2YWx1ZSksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlKSA9PiBuZXcgVVJMU2VhcmNoUGFyYW1zKHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlKSxcbiAgICBVaW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgVWludDhDbGFtcGVkQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBVaW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgLy8gV2ViIEFQSSB0eXBlczogcmV2aXZlZCBhcyBwbGFpbiBvYmplY3RzIGluIHRoZSBWTSBzaW5jZSB0aGUgcmVhbFxuICAgIC8vIGNvbnN0cnVjdG9ycyAoSGVhZGVycywgUmVxdWVzdCwgUmVzcG9uc2UpIGFyZSBub3QgYXZhaWxhYmxlIGluIFF1aWNrSlMuXG4gICAgLy8gVGhlIHdvcmtmbG93IGNvZGUgY2FuIGFjY2VzcyB0aGUgcHJvcGVydGllcyBidXQgbm90IGNhbGwgV2ViIEFQSSBtZXRob2RzLlxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyAoZ2xvYmFsVGhpcyBhcyBhbnkpLkhlYWRlcnModmFsdWUpO1xuICAgIH0sXG4gICAgUmVxdWVzdDogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IFJlcSA9IChnbG9iYWxUaGlzIGFzIGFueSkuUmVxdWVzdDtcbiAgICAgIGlmIChSZXEpIHtcbiAgICAgICAgdmFsdWUuanNvbiA9IFJlcS5wcm90b3R5cGUuanNvbjtcbiAgICAgICAgdmFsdWUudGV4dCA9IFJlcS5wcm90b3R5cGUudGV4dDtcbiAgICAgICAgdmFsdWUuYXJyYXlCdWZmZXIgPSBSZXEucHJvdG90eXBlLmFycmF5QnVmZmVyO1xuICAgICAgfVxuICAgICAgLy8gQ2Fycnkgb3ZlciB0aGUgd2ViaG9vayByZXNwb25zZSB3cml0YWJsZSBzdHJlYW0gdG8gdGhlIHN5bWJvbCBwcm9wZXJ0eVxuICAgICAgaWYgKHZhbHVlLnJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgdmFsdWVbU3ltYm9sLmZvcignV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRScpXSA9IHZhbHVlLnJlc3BvbnNlV3JpdGFibGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIC8vIERvbid0IHVzZSBPYmplY3Quc2V0UHJvdG90eXBlT2Y6IGRldmFsdWUgY29udGludWVzIHRvIHNldCBwcm9wZXJ0aWVzXG4gICAgICAvLyBvbiB0aGUgb2JqZWN0IGFmdGVyIHRoZSByZXZpdmVyIHJ1bnMsIGFuZCBnZXR0ZXItb25seSBwcm9wZXJ0aWVzXG4gICAgICAvLyAobGlrZSAnb2snKSBvbiB0aGUgcHJvdG90eXBlIHdvdWxkIGNhdXNlIFwibm8gc2V0dGVyXCIgZXJyb3JzLlxuICAgICAgLy8gSW5zdGVhZCwgY29weSBtZXRob2RzIGRpcmVjdGx5IG9udG8gdGhlIG9iamVjdC5cbiAgICAgIGNvbnN0IFJlc3AgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLlJlc3BvbnNlO1xuICAgICAgaWYgKFJlc3ApIHtcbiAgICAgICAgdmFsdWUuanNvbiA9IFJlc3AucHJvdG90eXBlLmpzb247XG4gICAgICAgIHZhbHVlLnRleHQgPSBSZXNwLnByb3RvdHlwZS50ZXh0O1xuICAgICAgICB2YWx1ZS5hcnJheUJ1ZmZlciA9IFJlc3AucHJvdG90eXBlLmFycmF5QnVmZmVyO1xuICAgICAgICBpZiAoUmVzcC5wcm90b3R5cGUuYnl0ZXMpIHZhbHVlLmJ5dGVzID0gUmVzcC5wcm90b3R5cGUuYnl0ZXM7XG4gICAgICAgIGlmIChSZXNwLnByb3RvdHlwZS5jbG9uZSkgdmFsdWUuY2xvbmUgPSBSZXNwLnByb3RvdHlwZS5jbG9uZTtcbiAgICAgIH1cbiAgICAgIHZhbHVlLl9ib2R5ID0gdmFsdWUuYm9keTtcbiAgICAgIHZhbHVlLm9rID0gdmFsdWUuc3RhdHVzID49IDIwMCAmJiB2YWx1ZS5zdGF0dXMgPCAzMDA7XG4gICAgICB2YWx1ZS5ib2R5VXNlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgUmVhZGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgUlMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLlJlYWRhYmxlU3RyZWFtO1xuICAgICAgY29uc3Qgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShSUyA/IFJTLnByb3RvdHlwZSA6IHt9KTtcbiAgICAgIGlmICh2YWx1ZSAmJiAnYm9keUluaXQnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIEJvZHkgZnJvbSBSZXNwb25zZS9SZXF1ZXN0IGNvbnN0cnVjdG9yOiBzdG9yZSB0aGUgcmF3IGRhdGFcbiAgICAgICAgc3RyZWFtW1N5bWJvbC5mb3IoJ0JPRFlfSU5JVCcpXSA9IHZhbHVlLmJvZHlJbml0O1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiAnbmFtZScgaW4gdmFsdWUpIHtcbiAgICAgICAgLy8gTmFtZWQgc3RyZWFtIHJlZmVyZW5jZTogcHJlc2VydmUgdGhlIG5hbWUvdHlwZSBmb3IgcmUtc2VyaWFsaXphdGlvbi5cbiAgICAgICAgLy8gU3RyZWFtcyBhcmUgb3BhcXVlIHBvaW50ZXJzIGluIHRoZSBWTTsgdGhleSBjYW4gYmUgcGFzc2VkIHRvIHN0ZXBzXG4gICAgICAgIC8vIGJ1dCBub3QgY29uc3VtZWQgZGlyZWN0bHkuXG4gICAgICAgIHN0cmVhbVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpXSA9IHZhbHVlLm5hbWU7XG4gICAgICAgIGlmICh2YWx1ZS50eXBlKSBzdHJlYW1bU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX1RZUEUnKV0gPSB2YWx1ZS50eXBlO1xuICAgICAgICBpZiAodmFsdWUuZnJhbWluZykge1xuICAgICAgICAgIHN0cmVhbVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fRlJBTUlORycpXSA9IHZhbHVlLmZyYW1pbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfSxcbiAgICBXcml0YWJsZVN0cmVhbTogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBXUyA9IChnbG9iYWxUaGlzIGFzIGFueSkuV3JpdGFibGVTdHJlYW07XG4gICAgICBjb25zdCBzdHJlYW0gPSBPYmplY3QuY3JlYXRlKFdTID8gV1MucHJvdG90eXBlIDoge30pO1xuICAgICAgaWYgKHZhbHVlICYmICduYW1lJyBpbiB2YWx1ZSkge1xuICAgICAgICBzdHJlYW1bU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX05BTUUnKV0gPSB2YWx1ZS5uYW1lO1xuICAgICAgfVxuICAgICAgLy8gUHJlc2VydmUgdGhlIGZvcmVpZ24gcnVuSWQvZGVwbG95bWVudElkLCBpZiBwcmVzZW50LCBzbyB0aGF0IHdoZW5cbiAgICAgIC8vIHRoZSBoYW5kbGUgaXMgbGF0ZXIgcGFzc2VkIHRvIGEgc3RlcCB0aGUgd29ya2Zsb3cgcmVkdWNlciBjYW5cbiAgICAgIC8vIGZvcndhcmQgaXQgdGhyb3VnaCB0byB0aGUgc3RlcCByZXZpdmVyIChjcm9zcy1ydW4gd3JpdGFibGVcbiAgICAgIC8vIGZvcndhcmRpbmcgdmlhIHN0YXJ0KCkpLlxuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5ydW5JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyZWFtW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9TRVJWRVJfUlVOX0lEJyldID0gKFxuICAgICAgICAgIHZhbHVlIGFzIGFueVxuICAgICAgICApLnJ1bklkO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS5kZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmVhbVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSUQnKV0gPSAoXG4gICAgICAgICAgdmFsdWUgYXMgYW55XG4gICAgICAgICkuZGVwbG95bWVudElkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9LFxuICB9O1xufVxuIl19