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

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 (78) hide show
  1. package/dist/attribute-changes.d.ts +3 -5
  2. package/dist/attribute-changes.d.ts.map +1 -1
  3. package/dist/attribute-changes.js +2 -2
  4. package/dist/capabilities.d.ts +6 -5
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +14 -12
  7. package/dist/events-consumer.d.ts +30 -7
  8. package/dist/events-consumer.d.ts.map +1 -1
  9. package/dist/events-consumer.js +67 -11
  10. package/dist/flushable-stream.js +2 -2
  11. package/dist/global.d.ts +3 -1
  12. package/dist/global.d.ts.map +1 -1
  13. package/dist/global.js +8 -5
  14. package/dist/private.d.ts +20 -14
  15. package/dist/private.d.ts.map +1 -1
  16. package/dist/private.js +67 -29
  17. package/dist/replay-payload-cache.d.ts +13 -17
  18. package/dist/replay-payload-cache.d.ts.map +1 -1
  19. package/dist/replay-payload-cache.js +55 -57
  20. package/dist/runtime/constants.d.ts +3 -3
  21. package/dist/runtime/constants.d.ts.map +1 -1
  22. package/dist/runtime/constants.js +4 -4
  23. package/dist/runtime/helpers.d.ts +15 -34
  24. package/dist/runtime/helpers.d.ts.map +1 -1
  25. package/dist/runtime/helpers.js +18 -43
  26. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  27. package/dist/runtime/quickjs-entrypoint.js +8 -1
  28. package/dist/runtime/quickjs-runtime.js +7 -1
  29. package/dist/runtime/resume-hook.d.ts +20 -12
  30. package/dist/runtime/resume-hook.d.ts.map +1 -1
  31. package/dist/runtime/resume-hook.js +195 -249
  32. package/dist/runtime/resume-latency.d.ts +13 -6
  33. package/dist/runtime/resume-latency.d.ts.map +1 -1
  34. package/dist/runtime/resume-latency.js +4 -2
  35. package/dist/runtime/run.d.ts +1 -1
  36. package/dist/runtime/run.d.ts.map +1 -1
  37. package/dist/runtime/run.js +3 -2
  38. package/dist/runtime/start.js +12 -10
  39. package/dist/runtime/step-latency.d.ts +31 -14
  40. package/dist/runtime/step-latency.d.ts.map +1 -1
  41. package/dist/runtime/step-latency.js +19 -13
  42. package/dist/runtime/suspension-handler.d.ts +9 -7
  43. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  44. package/dist/runtime/suspension-handler.js +41 -41
  45. package/dist/runtime/vm-mode.d.ts +1 -1
  46. package/dist/runtime/vm-mode.d.ts.map +1 -1
  47. package/dist/runtime/vm-mode.js +1 -1
  48. package/dist/runtime.d.ts.map +1 -1
  49. package/dist/runtime.js +278 -125
  50. package/dist/serialization/hardened.d.ts +5 -4
  51. package/dist/serialization/hardened.d.ts.map +1 -1
  52. package/dist/serialization/hardened.js +7 -1
  53. package/dist/serialization-format.js +2 -2
  54. package/dist/serialization.d.ts +8 -9
  55. package/dist/serialization.d.ts.map +1 -1
  56. package/dist/serialization.js +32 -25
  57. package/dist/step.d.ts.map +1 -1
  58. package/dist/step.js +3 -11
  59. package/dist/telemetry/semantic-conventions.d.ts +51 -8
  60. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  61. package/dist/telemetry/semantic-conventions.js +38 -5
  62. package/dist/telemetry.d.ts +12 -0
  63. package/dist/telemetry.d.ts.map +1 -1
  64. package/dist/telemetry.js +62 -2
  65. package/dist/version.d.ts +1 -1
  66. package/dist/version.js +2 -2
  67. package/dist/vm/script-cache.d.ts +9 -11
  68. package/dist/vm/script-cache.d.ts.map +1 -1
  69. package/dist/vm/script-cache.js +25 -40
  70. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
  71. package/dist/workflow/attribute-dispatcher.js +3 -6
  72. package/dist/workflow/hook.d.ts.map +1 -1
  73. package/dist/workflow/hook.js +6 -15
  74. package/dist/workflow.d.ts +16 -0
  75. package/dist/workflow.d.ts.map +1 -1
  76. package/dist/workflow.js +73 -29
  77. package/docs/foundations/errors-and-retries.mdx +1 -1
  78. package/package.json +6 -6
@@ -146,10 +146,12 @@ export async function start(workflow, argsOrOptions, options) {
146
146
  : ulid()}`;
147
147
  let framedByteStreams;
148
148
  let targetSupportsCompression;
149
- // The consumer's hook-resume protocol version, stamped onto the new run
150
- // so a later `resumeHook()` gates its parallel path on the deployment
151
- // that will actually consume the queue message. `undefined` means "could
152
- // not attest" and fails the gate closed.
149
+ // The consumer's hook-resume protocol version, stamped onto the new
150
+ // run. Current producers write the hook_received event durably before
151
+ // publishing the wake and never read it; OLDER producers gate their
152
+ // lazy (hookInput-carrying) path on the deployment that will actually
153
+ // consume the queue message. `undefined` means "could not attest" and
154
+ // fails that gate closed.
153
155
  let targetHookResumeInputVersion;
154
156
  // Public key of the target run, when the capability probe was able to
155
157
  // supply one (cross-deployment only).
@@ -165,8 +167,8 @@ export async function start(workflow, argsOrOptions, options) {
165
167
  framedByteStreams = false;
166
168
  targetSupportsCompression = false;
167
169
  // No probe channel to the target, so we cannot attest the consumer
168
- // honors `hookInput`; leave the marker off (fail closed to
169
- // sequential).
170
+ // honors `hookInput`; leave the marker off (older producers fail
171
+ // closed to their sequential path).
170
172
  targetHookResumeInputVersion = undefined;
171
173
  }
172
174
  else {
@@ -326,9 +328,9 @@ export async function start(workflow, argsOrOptions, options) {
326
328
  features: { encryption: !!encryptionKey },
327
329
  // Attest that the *consumer* deployment's runtime re-ensures a
328
330
  // `hook_received` event from a queue message's `hookInput` on replay.
329
- // A resume of this run reads the marker (mirrored onto the hook's
330
- // resumeContext by the server) to decide whether the parallel fast
331
- // path is safe. For a cross-deployment start the consumer is the
331
+ // An OLDER producer resuming this run reads the marker (mirrored onto
332
+ // the hook's resumeContext by the server) to decide whether its lazy
333
+ // fast path is safe. For a cross-deployment start the consumer is the
332
334
  // target deployment, so we stamp the *target's* value carried back on
333
335
  // the health-check probe, never the caller's. Omitted when we could
334
336
  // not attest the target (older target, timeout, or no probe channel),
@@ -441,4 +443,4 @@ export async function start(workflow, argsOrOptions, options) {
441
443
  });
442
444
  });
443
445
  }
444
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixnQ0FBZ0MsRUFDaEMsMENBQTBDLEVBQzFDLGlDQUFpQyxFQUNqQyxtQkFBbUIsR0FDcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsT0FBTyxFQUNMLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLDBCQUEwQixFQUUxQixtQkFBbUIsRUFDbkIsTUFBTSxHQUNQLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFF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dW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IGdsb2JhbFNpbmdsZXRvbiB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyB3b3JrZmxvd0Rpc3BsYXlOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludm9rZVBheWxvYWQsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFBBUkVOVF9SVU5fSURfQVRUUklCVVRFLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgd29ya2Zsb3dSdW5JZFNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMgfSBmcm9tICcuLi9hdHRyaWJ1dGUtY2hhbmdlcy5qcyc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBieXRlc1RvQmFzZTY0LFxuICBkZWNvZGVSdW5QdWJsaWNLZXksXG4gIGRlcml2ZVJ1bktleVBhaXIsXG59IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgc2VhbFRvLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNvbnRleHRTdG9yYWdlIH0gZnJvbSAnLi4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSwgaGVhbHRoQ2hlY2sgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi9ydW4uanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dWbUZyb21FbnYgfSBmcm9tICcuL3ZtLW1vZGUuanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCB9IGZyb20gJy4vd29ybGQtY29tcGF0aWJpbGl0eS5qcyc7XG5cbi8qKlxuICogVGltZW91dCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnQgY2FwYWJpbGl0eSBwcm9iZSBkb25lIGJlZm9yZVxuICogZGVoeWRyYXRpbmcgd29ya2Zsb3cgYXJndW1lbnRzLiBLZXB0IHRpZ2h0IG9uIHB1cnBvc2U6IHRoZSBwcm9iZSBpc1xuICogYW4gb3B0aW1pemF0aW9uIChpdCBsZXRzIHRoZSBjYWxsZXIgZW1pdCB0aGUgZnJhbWVkIGJ5dGUtc3RyZWFtIHdpcmVcbiAqIGZvcm1hdCB3aGVuIHRoZSB0YXJnZXQgc3VwcG9ydHMgaXQpLCBhbmQgdGhlIGZhbGxiYWNrIG9uIHRpbWVvdXQgaXNcbiAqIHRoZSBsZWdhY3kgcmF3IGZvcm1hdCB3aGljaCBhbHdheXMgd29ya3MuIExvbmcgZGVsYXlzIGhlcmUgd291bGRcbiAqIG1ha2UgYHN0YXJ0KHsgZGVwbG95bWVudElkOiAuLi4gfSlgIHNsb3dlciBmb3IgdXNlcnMgd2hvc2UgdGFyZ2V0XG4gKiBkZXBsb3ltZW50cyBkb24ndCByZWNvZ25pemUgdGhlIGhlYWx0aCBjaGVjayBhdCBhbGwuXG4gKi9cbmNvbnN0IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TID0gMl8wMDA7XG5cbi8qKiBVTElEIGdlbmVyYXRvciBmb3IgY2xpZW50LXNpZGUgcnVuSWQgZ2VuZXJhdGlvbiAqL1xuY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLyoqXG4gKiBDcm9zcy1ydW4gbGluZWFnZSBmb3IgYSBydW4gYmVpbmcgc3RhcnRlZCBmcm9tIGluc2lkZSBhbm90aGVyIHJ1bi5cbiAqXG4gKiBUaGUgYW1iaWVudCBzdGVwIGNvbnRleHQgY2FycmllcyB0aGUgcGFyZW50IHJ1biBpZCBhbmQgdGhlIHJvb3Qgb2YgaXRzXG4gKiBsaW5lYWdlOyB0aGUgcnVudGltZSBmaWxscyBib3RoIGZyb20gdGhlIHJ1biBpdCBhbHJlYWR5IGhhcyBsb2FkZWQsIHNvIHRoaXNcbiAqIGlzIGEgcHVyZSBjb250ZXh0IHJlYWQgd2l0aCBubyBJL08uIFRoZSBuZXcgcnVuIHJlY29yZHMgYCRwYXJlbnRSdW5JZGAgKHRoZVxuICogZWRnZSkgYW5kIGluaGVyaXRzIHRoZSBwYXJlbnQncyBgJHJvb3RSdW5JZGAgKHRoZSBwYXJlbnQgaXRzZWxmIHdoZW4gaXQgaXMgYVxuICogcm9vdCksIHNvIGEgZGFpc3kgY2hhaW4gb3IgZmFuLW91dCBvZiBhbnkgZGVwdGggZ3JvdXBzIHVuZGVyIG9uZSByb290IGlkLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYSB0b3AtbGV2ZWwgYHN0YXJ0KClgLCB3aGljaCBoYXMgbm8gY29udGV4dCwgc29cbiAqIHN0YW5kYWxvbmUgcnVucyBjYXJyeSBubyBsaW5lYWdlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTGluZWFnZUF0dHJpYnV0ZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0b3JlID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgY29uc3QgcGFyZW50UnVuSWQgPSBzdG9yZT8ud29ya2Zsb3dNZXRhZGF0YT8ud29ya2Zsb3dSdW5JZDtcbiAgaWYgKCFwYXJlbnRSdW5JZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIFtST09UX1JVTl9JRF9BVFRSSUJVVEVdOiBzdG9yZS5yb290UnVuSWQgPz8gcGFyZW50UnVuSWQsXG4gICAgW1BBUkVOVF9SVU5fSURfQVRUUklCVVRFXTogcGFyZW50UnVuSWQsXG4gIH07XG59XG5cbi8vIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBpcyBhIG5vLW9wIGluIFdvcmxkcyB3aXRob3V0IGF0b21pYyBkZXBsb3ltZW50cy5cbi8vIFRoZSB3YXJuaW5nIHRoYXQgZXhwbGFpbnMgdGhpcyBvbmx5IG5lZWRzIHRvIGZpcmUgb25jZSBwZXIgcHJvY2VzczogYVxuLy8gd29ya2Zsb3cgdGhhdCBoYXJkY29kZXMgJ2xhdGVzdCcgZm9yIGl0cyBWZXJjZWwgZGVwbG95bWVudCB3b3VsZCBvdGhlcndpc2Vcbi8vIGxvZyBpdCBvbiBldmVyeSBsb2NhbC9Qb3N0Z3JlcyBydW4sIGZsb29kaW5nIHRpZ2h0IGRldiBsb29wcy5cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKSBzbyBcIm9uY2UgcGVyIHByb2Nlc3NcIiBpcyBub3Qgb25jZVxuLy8gcGVyIGJ1bmRsZXIgbGF5ZXIuXG5jb25zdCBsYXRlc3ROb09wV2FybmluZyA9IGdsb2JhbFNpbmdsZXRvbihcbiAgJ0B3b3JrZmxvdy9jb3JlLy9sYXRlc3ROb09wV2FybmluZycsXG4gIDEsXG4gICgpID0+ICh7IHdhcm5lZDogZmFsc2UgfSlcbik7XG5cbi8qKlxuICogUmVzZXQgdGhlIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBuby1vcCB3YXJuLW9uY2UgZ3VhcmQuIFRlc3Qtb25seSxcbiAqIGV4cG9ydGVkIHNvIHVuaXQgdGVzdHMgY2FuIGV4ZXJjaXNlIHRoZSB3YXJuIHBhdGggYWNyb3NzIGBzdGFydCgpYCBjYWxscy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldExhdGVzdE5vT3BXYXJuRm9yVGVzdHMoKTogdm9pZCB7XG4gIGxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCA9IGZhbHNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIHdvcmxkIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1biBjcmVhdGlvbixcbiAgICogYnkgZGVmYXVsdCB0aGUgd29ybGQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKi9cbiAgd29ybGQ/OiBXb3JsZDtcblxuICAvKipcbiAgICogVGhlIHNwZWMgdmVyc2lvbiB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByZWdpb24gaWRlbnRpZmllciBmb3IgdGhlIG5ldyBydW4uIEN1cnJlbnRseSBjb25zdW1lZCBvbmx5XG4gICAqIGJ5IGBAd29ya2Zsb3cvd29ybGQtdmVyY2VsYCwgd2hpY2ggZW1iZWRzIHRoZSByZWdpb24gaW50byB0aGUgdGFnZ2VkXG4gICAqIHJ1biBJRCBhbmQgcm91dGVzIHRoZSBpbml0aWFsIHdvcmtmbG93IG1lc3NhZ2UgdG8gdGhlIG1hdGNoaW5nXG4gICAqIHJlZ2lvbmFsIHF1ZXVlLiBXaGVuIG9taXR0ZWQsIHRoZSB3b3JsZCBmYWxscyBiYWNrIHRvIGl0cyBvd25cbiAgICogZGVmYXVsdCAoZm9yIGB3b3JsZC12ZXJjZWxgOiB0aGUgYFZFUkNFTF9SRUdJT05gIGVudmlyb25tZW50XG4gICAqIHZhcmlhYmxlLCB0aGVuIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IHJlZ2lvbiBgaWFkMWA7IGEgY29uY3JldGUsXG4gICAqIHJvdXRhYmxlIHJlZ2lvbiBpcyBhbHdheXMgY2hvc2VuKS5cbiAgICpcbiAgICogV29ybGRzIHdpdGhvdXQgYSByZWdpb25hbCBkaW1lbnNpb24gaWdub3JlIHRoaXMgZmllbGQuXG4gICAqL1xuICByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsYWludGV4dCBhdHRyaWJ1dGVzIHRvIHNlZWQgb24gdGhlIHJ1biBhcyBpdCBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIG5hdGl2ZS1hdHRyaWJ1dGVzIHJ1bnMgKHNwZWMgdmVyc2lvbiA0IGFuZCBsYXRlcikuXG4gICAqL1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGVybWl0IHJlc2VydmVkIGAkYC1wcmVmaXhlZCBrZXlzIGluIGBhdHRyaWJ1dGVzYC4gVGhlIGAkYCBuYW1lc3BhY2VcbiAgICogaXMgcmVzZXJ2ZWQgZm9yIGZyYW1ld29yay9saWJyYXJ5IGNvZGUgYnVpbHQgb24gdG9wIG9mIHRoZSB3b3JrZmxvd1xuICAgKiBTREsgKHRlbGVtZXRyeSwgYWdlbnQgbWV0YWRhdGEsIHBsYXRmb3JtLWVtaXR0ZWQgdGFncywgZXRjLik7IHVzZXJcbiAgICogY29kZSBNVVNUIE5PVCB3cml0ZSBrZXlzIGluIGl0LCBhbmQgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc29cbiAgICogYWNjaWRlbnRhbCBjb2xsaXNpb25zIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gU2FtZSBzZW1hbnRpY3MgYXNcbiAgICogdGhlIGBzZXRBdHRyaWJ1dGVzYCBvcHRpb24gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIElEIG9mIGFuIGV4aXN0aW5nIHJ1biB0aGlzIHJ1biBpcyBiZWluZyByZXBsYXllZCBmcm9tLCBpZiBhbnkuXG4gICAqXG4gICAqIFJlY29yZGVkIG9uIHRoZSBuZXcgcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHRgIGFzIGByZXBsYXllZEZyb21SdW5JZGAgc29cbiAgICogdG9vbGluZyAoZS5nLiB0aGUgZGFzaGJvYXJkIHJ1bnMgbGlzdCkgY2FuIHNob3cgdGhhdCBhIHJ1biBvcmlnaW5hdGVkIGFzXG4gICAqIGEgcmVwbGF5IGFuZCBsaW5rIGJhY2sgdG8gaXRzIHNvdXJjZS4gU2V0IGF1dG9tYXRpY2FsbHkgYnlcbiAgICoge0BsaW5rIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nfTsgdGhlcmUncyB1c3VhbGx5IG5vIHJlYXNvbiB0byBwYXNzIGl0XG4gICAqIGRpcmVjdGx5LlxuICAgKlxuICAgKiBNdXN0IGJlIGEgcnVuIElEOiBgd3J1bl9gIGZvbGxvd2VkIGJ5IGEgMjYtY2hhciBVTElELiBJdCdzIGEgZm9yZWlnbiBrZXlcbiAgICogdG8gdGhlIHNvdXJjZSBydW4sIHNvIGBzdGFydCgpYCB2YWxpZGF0ZXMgdGhlIGV4YWN0IHNoYXBlIGFuZCByZWplY3RzXG4gICAqIGFueXRoaW5nIGVsc2UgcmF0aGVyIHRoYW4gcGVyc2lzdCBhIGxpbmVhZ2UgbGluayB0aGF0IHBvaW50cyBhdCBnYXJiYWdlLlxuICAgKi9cbiAgcmVwbGF5ZWRGcm9tUnVuSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2Ugb2YgdGhlIHRhcmdldCBkZXBsb3ltZW50LiBTY29wZXMgdGhlIHdvcmtmbG93IHF1ZXVlXG4gICAqIHRvcGljIHRvIGBfX3tuYW1lc3BhY2V9X3drZl93b3JrZmxvd18qYCAoZS5nLiBgJ2V2ZSdgKSBpbnN0ZWFkIG9mIHRoZVxuICAgKiBkZWZhdWx0IGBfX3drZl93b3JrZmxvd18qYCwgYW5kIGlzIGFsc28gdXNlZCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnRcbiAgICogY2FwYWJpbGl0eSBwcm9iZS4gRmFsbHMgYmFjayB0byBgV09SS0ZMT1dfUVVFVUVfTkFNRVNQQUNFYCBpbiB0aGVcbiAgICogY2FsbGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBXaXRoaW4gYSBkZXBsb3ltZW50IHRoZSBlbnYgZmFsbGJhY2sgaXMgY29ycmVjdC4gQ3Jvc3MtY29udGV4dCBjYWxsZXJzXG4gICAqIChlLmcuIHRoZSBvYnNlcnZhYmlsaXR5IGRhc2hib2FyZCByZXBsYXlpbmcgYSBydW4pIG11c3QgcGFzcyB0aGVcbiAgICogVEFSR0VUIGRlcGxveW1lbnQncyBuYW1lc3BhY2UgZXhwbGljaXRseTogdGhlIGVudiBmYWxsYmFjayByZXNvbHZlcyBpblxuICAgKiB0aGUgY2FsbGVyJ3MgcHJvY2VzcywgYW5kIGEgcnVuIGVucXVldWVkIHRvIGEgdG9waWMgdGhlIHRhcmdldCBoYXMgbm9cbiAgICogY29uc3VtZXIgZm9yIGlzIG5ldmVyIHBpY2tlZCB1cC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgZGVwbG95bWVudCBJRCB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgYXV0b21hdGljYWxseSBpbmZlcnJlZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiB3aGVuIGRlcGxveWluZyB0byBWZXJjZWwuXG4gICAqXG4gICAqIFNldCB0byBgJ2xhdGVzdCdgIHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0aGUgbW9zdCByZWNlbnQgZGVwbG95bWVudFxuICAgKiBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3IgZ2l0IGJyYW5jaCkuXG4gICAqIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGluIHdvcmxkcyB3aXRoIGF0b21pYywgaW1tdXRhYmxlIGRlcGxveW1lbnRzXG4gICAqIChjdXJyZW50bHkgVmVyY2VsKS4gSW4gb3RoZXIgd29ybGRzIChsb2NhbCBkZXYsIFBvc3RncmVzKSB0aGVyZSBpcyBub1xuICAgKiBub3Rpb24gb2YgbXVsdGlwbGUgZGVwbG95bWVudHMgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyBgJ2xhdGVzdCdgIGhhcyBub1xuICAgKiBlZmZlY3Q6IGEgd2FybmluZyBpcyBsb2dnZWQgYW5kIHRoZSBydW4gdGFyZ2V0cyB0aGUgY3VycmVudCBkZXBsb3ltZW50LlxuICAgKlxuICAgKiAqKk5vdGU6KiogV2hlbiBgZGVwbG95bWVudElkYCBpcyBwcm92aWRlZCwgdGhlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgYmVjb21lIGB1bmtub3duYFxuICAgKiBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhlIHR5cGVzIHdpbGwgYmUgY29uc2lzdGVudCBhY3Jvc3MgZGVwbG95bWVudHMuXG4gICAqL1xuICBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIHwgKHN0cmluZyAmIHt9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkIGV4dGVuZHMgU3RhcnRPcHRpb25zQmFzZSB7XG4gIGRlcGxveW1lbnRJZD86IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyBhIHdvcmtmbG93IHJ1bi5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhcnRPcHRpb25zID1cbiAgfCBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4gIHwgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZDtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9IChcbiAgLi4uYXJnczogVEFyZ3NcbikgPT4gUHJvbWlzZTxUUmVzdWx0PjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBnZW5lcmF0ZWQgbWV0YWRhdGEgb2YgYSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dNZXRhZGF0YSA9IHsgd29ya2Zsb3dJZDogc3RyaW5nIH07XG5cbi8qKlxuICogU3RhcnRzIGEgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvdyAtIFRoZSBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbiB0byBzdGFydC5cbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3b3JrZmxvdyAob3B0aW9uYWwpLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHdvcmtmbG93IHJ1biAob3B0aW9uYWwpLlxuICogQHJldHVybnMgVGhlIHVuaXF1ZSBydW4gSUQgZm9yIHRoZSBuZXdseSBzdGFydGVkIHdvcmtmbG93IGludm9jYXRpb24uXG4gKi9cbi8vIE92ZXJsb2FkcyB3aXRoIGRlcGxveW1lbnRJZCAtIGFyZ3MgYW5kIHJldHVybiB0eXBlIGJlY29tZSB1bmtub3duXG4vLyBVc2VzIGdlbmVyaWNzIHNvIHR5cGVkIHdvcmtmbG93cyBhcmUgYXNzaWduYWJsZSAoYXZvaWRzIGNvbnRyYXZhcmlhbmNlIGlzc3VlcyksXG4vLyBidXQgdGhlIHJldHVybiB0eXBlIGFuZCBhcmdzIGFyZSBzdGlsbCB1bmtub3duIHNpbmNlIHRoZSBkZXBsb3llZCB2ZXJzaW9uIG1heSBkaWZmZXIuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiB1bmtub3duW10sXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbi8vIE92ZXJsb2FkcyB3aXRob3V0IGRlcGxveW1lbnRJZCAtIHByZXNlcnZlIHR5cGUgaW5mZXJlbmNlXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzOiBUQXJncyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxbXSwgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnQ8VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+KFxuICB3b3JrZmxvdzogV29ya2Zsb3dGdW5jdGlvbjxUQXJncywgVFJlc3VsdD4gfCBXb3JrZmxvd01ldGFkYXRhLFxuICBhcmdzT3JPcHRpb25zPzogVEFyZ3MgfCBTdGFydE9wdGlvbnMsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNcbikge1xuICAndXNlIHN0ZXAnO1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBmaWVsZCBpcyBhZGRlZCBieSBvdXIgY2xpZW50IHRyYW5zZm9ybVxuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IHdvcmtmbG93Py53b3JrZmxvd0lkO1xuXG4gICAgaWYgKCF3b3JrZmxvd05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYCdzdGFydCcgcmVjZWl2ZWQgYW4gaW52YWxpZCB3b3JrZmxvdyBmdW5jdGlvbi4gRW5zdXJlIHRoZSBXb3JrZmxvdyBTREsgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkgYW5kIHRoZSBmdW5jdGlvbiBpbmNsdWRlcyBhICd1c2Ugd29ya2Zsb3cnIGRpcmVjdGl2ZS5gLFxuICAgICAgICB7IHNsdWc6ICdzdGFydC1pbnZhbGlkLXdvcmtmbG93LWZ1bmN0aW9uJyB9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNwYW5OYW1lID0gYHdvcmtmbG93LnN0YXJ0ICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWA7XG4gICAgcmV0dXJuIHRyYWNlKHNwYW5OYW1lLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdzdGFydCcpLFxuICAgICAgfSk7XG5cbiAgICAgIGxldCBhcmdzOiBTZXJpYWxpemFibGVbXSA9IFtdO1xuICAgICAgbGV0IG9wdHM6IFN0YXJ0T3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzT3JPcHRpb25zKSkge1xuICAgICAgICBhcmdzID0gYXJnc09yT3B0aW9ucyBhcyBTZXJpYWxpemFibGVbXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3NPck9wdGlvbnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdHMgPSBhcmdzT3JPcHRpb25zO1xuICAgICAgfVxuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93QXJndW1lbnRzQ291bnQoYXJncy5sZW5ndGgpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHdvcmxkID0gb3B0cy53b3JsZCA/PyAoYXdhaXQgZ2V0V29ybGRMYXp5KCkpO1xuICAgICAgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCh3b3JsZCk7XG4gICAgICBjb25zdCBjdXJyZW50RGVwbG95bWVudElkID0gYXdhaXQgd29ybGQuZ2V0RGVwbG95bWVudElkKCk7XG4gICAgICBsZXQgZGVwbG95bWVudElkID0gb3B0cy5kZXBsb3ltZW50SWQgPz8gY3VycmVudERlcGxveW1lbnRJZDtcblxuICAgICAgLy8gV2hlbiAnbGF0ZXN0JyBpcyByZXF1ZXN0ZWQsIHJlc29sdmUgdGhlIGFjdHVhbCBsYXRlc3QgZGVwbG95bWVudCBJRFxuICAgICAgLy8gZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQncyBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvclxuICAgICAgLy8gc2FtZSBnaXQgYnJhbmNoIGZvciBwcmV2aWV3IGRlcGxveW1lbnRzKS5cbiAgICAgIC8vXG4gICAgICAvLyBSZXNvbHZpbmcgJ2xhdGVzdCcgb25seSBtZWFucyBzb21ldGhpbmcgaW4gd29ybGRzIHdpdGggYXRvbWljLFxuICAgICAgLy8gaW1tdXRhYmxlIGRlcGxveW1lbnRzIChlLmcuIFZlcmNlbCksIHdoaWNoIGltcGxlbWVudFxuICAgICAgLy8gcmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpLiBXb3JsZHMgd2l0aG91dCB0aGF0IGNvbmNlcHQgKGxvY2FsIGRldixcbiAgICAgIC8vIHNlbGYtaG9zdGVkIFBvc3RncmVzKSBoYXZlIG5vdGhpbmcgdG8gcmVzb2x2ZSBiZXR3ZWVuLCBzbyByYXRoZXIgdGhhblxuICAgICAgLy8gZmFpbCBhIHJ1biB0aGF0IHdvcmtzIGZpbmUgb24gVmVyY2VsLCB3ZSB3YXJuIGFuZCBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBjdXJyZW50IGRlcGxveW1lbnQsIG1ha2luZyAnbGF0ZXN0JyBhbiBlZmZlY3RpdmUgbm8tb3AgdGhlcmUuXG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSAnbGF0ZXN0Jykge1xuICAgICAgICBpZiAod29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCkge1xuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXYXJuIG9uY2UgcGVyIHByb2Nlc3M7IHNlZSBsYXRlc3ROb09wV2FybmluZy53YXJuZWQgYWJvdmUuXG4gICAgICAgICAgaWYgKCFsYXRlc3ROb09wV2FybmluZy53YXJuZWQpIHtcbiAgICAgICAgICAgIGxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIFwiZGVwbG95bWVudElkOiAnbGF0ZXN0JyBoYXMgbm8gZWZmZWN0IGluIHRoaXMgd29ybGQgYW5kIHdhcyBpZ25vcmVkLiBcIiArXG4gICAgICAgICAgICAgICAgJ0l0IGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHdvcmxkcyB3aXRoIGF0b21pYyBkZXBsb3ltZW50cywgc3VjaCBhcyBWZXJjZWwuICcgK1xuICAgICAgICAgICAgICAgICdUaGUgcnVuIHdpbGwgdGFyZ2V0IHRoZSBjdXJyZW50IGRlcGxveW1lbnQuJyxcbiAgICAgICAgICAgICAgeyBjdXJyZW50RGVwbG95bWVudElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlcGxveW1lbnRJZCA9IGN1cnJlbnREZXBsb3ltZW50SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVjaWRlIHdoZXRoZXIgdG8gd3JpdGUgYnl0ZSBzdHJlYW1zIGluIHRoZSBmcmFtZWQgd2lyZSBmb3JtYXQuXG4gICAgICAvLyBGb3Igc2FtZS1kZXBsb3ltZW50IHN0YXJ0cyAodGhlIGNvbW1vbiBjYXNlKSB3ZSBrbm93IHRoZSB0YXJnZXQgaXNcbiAgICAgIC8vIHJ1bm5pbmcgdGhpcyBzYW1lIFNESyB2ZXJzaW9uLCBzbyBmcmFtaW5nIGlzIHNhZmUuIEZvciBjcm9zcy1cbiAgICAgIC8vIGRlcGxveW1lbnQgc3RhcnRzIChleHBsaWNpdCBkZXBsb3ltZW50SWQgb3IgJ2xhdGVzdCcgdGhhdCByZXNvbHZlc1xuICAgICAgLy8gdG8gYSBkaWZmZXJlbnQgZGVwbG95bWVudCkgd2UgcHJvYmUgdGhlIHRhcmdldCB2aWEgaGVhbHRoQ2hlY2sgdG9cbiAgICAgIC8vIGxlYXJuIGl0cyB3b3JrZmxvdy1jb3JlIHZlcnNpb24sIHRoZW4gZGVyaXZlIHRoZSBjYXBhYmlsaXR5LiBUaGVcbiAgICAgIC8vIHByb2JlIGhhcyBhIHRpZ2h0IHRpbWVvdXQ6IG9uIG1pc3MvZmFpbHVyZSB3ZSBmYWxsIGJhY2sgdG8gdGhlXG4gICAgICAvLyBsZWdhY3kgcmF3IGJ5dGUgZm9ybWF0LCB3aGljaCBpcyB1bml2ZXJzYWxseSByZWFkYWJsZS5cbiAgICAgIC8vXG4gICAgICAvLyBXb3JsZHMgdGhhdCBkb24ndCBleHBvc2UgdGhlIGBzdHJlYW1zYCBBUEkgKGUuZy4gbWluaW1hbCB0ZXN0XG4gICAgICAvLyBtb2NrcykgY2FuJ3Qgc2VydmljZSBoZWFsdGggY2hlY2tzLCBzbyB3ZSBza2lwIHRoZSBwcm9iZSBmb3IgdGhlbS5cbiAgICAgIC8vIEdlbmVyYXRlIHJ1bklkIGNsaWVudC1zaWRlIHNvIHdlIGhhdmUgaXQgYmVmb3JlIHNlcmlhbGl6YXRpb25cbiAgICAgIC8vIChyZXF1aXJlZCBmb3IgZnV0dXJlIEUyRSBlbmNyeXB0aW9uIHdoZXJlIHJ1bklkIGlzIHBhcnQgb2YgdGhlXG4gICAgICAvLyBlbmNyeXB0aW9uIGNvbnRleHQpLiBXaGVuIHRoZSBXb3JsZCBwcm92aWRlcyBhIGBjcmVhdGVSdW5JZCgpYFxuICAgICAgLy8gaW1wbGVtZW50YXRpb24sIHVzZSBpdCBzbyB3b3JsZHMgY2FuIGVtYmVkIGltcGxlbWVudGF0aW9uLXNwZWNpZmljXG4gICAgICAvLyBtZXRhZGF0YSAoZS5nLiwgcmVnaW9uKSBpbnRvIHRoZSBJRCwgZm9yd2FyZGluZyB0aGUgZnVsbCBvcHRpb25zXG4gICAgICAvLyBiYWcgc28gd29ybGRzIGNhbiByZWFkIHdoaWNoZXZlciBmaWVsZHMgdGhleSByZWNvZ25pc2U7IG90aGVyd2lzZVxuICAgICAgLy8gZmFsbCBiYWNrIHRvIGEgc3RhbmRhcmQgbW9ub3RvbmljIFVMSUQuXG4gICAgICBjb25zdCBydW5JZCA9IGB3cnVuXyR7XG4gICAgICAgIHdvcmxkLmNyZWF0ZVJ1bklkXG4gICAgICAgICAgPyB3b3JsZC5jcmVhdGVSdW5JZChvcHRzIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PilcbiAgICAgICAgICA6IHVsaWQoKVxuICAgICAgfWA7XG5cbiAgICAgIGxldCBmcmFtZWRCeXRlU3RyZWFtczogYm9vbGVhbjtcbiAgICAgIGxldCB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uOiBib29sZWFuO1xuICAgICAgLy8gVGhlIGNvbnN1bWVyJ3MgaG9vay1yZXN1bWUgcHJvdG9jb2wgdmVyc2lvbiwgc3RhbXBlZCBvbnRvIHRoZSBuZXcgcnVuXG4gICAgICAvLyBzbyBhIGxhdGVyIGByZXN1bWVIb29rKClgIGdhdGVzIGl0cyBwYXJhbGxlbCBwYXRoIG9uIHRoZSBkZXBsb3ltZW50XG4gICAgICAvLyB0aGF0IHdpbGwgYWN0dWFsbHkgY29uc3VtZSB0aGUgcXVldWUgbWVzc2FnZS4gYHVuZGVmaW5lZGAgbWVhbnMgXCJjb3VsZFxuICAgICAgLy8gbm90IGF0dGVzdFwiIGFuZCBmYWlscyB0aGUgZ2F0ZSBjbG9zZWQuXG4gICAgICBsZXQgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gUHVibGljIGtleSBvZiB0aGUgdGFyZ2V0IHJ1biwgd2hlbiB0aGUgY2FwYWJpbGl0eSBwcm9iZSB3YXMgYWJsZSB0b1xuICAgICAgLy8gc3VwcGx5IG9uZSAoY3Jvc3MtZGVwbG95bWVudCBvbmx5KS5cbiAgICAgIGxldCBwcm9iZWRSdW5QdWJsaWNLZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09IGN1cnJlbnREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSB0cnVlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gdHJ1ZTtcbiAgICAgICAgLy8gU2FtZSBkZXBsb3ltZW50OiB0aGlzIHByb2Nlc3MgaXMgdGhlIGNvbnN1bWVyLCBzbyBpdHMgb3duIGNvbnN0YW50XG4gICAgICAgIC8vIGlzIGF1dGhvcml0YXRpdmUuXG4gICAgICAgIHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSBIT09LX1JFU1VNRV9JTlBVVF9WRVJTSU9OO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd29ybGQuc3RyZWFtcz8uZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gZmFsc2U7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSBmYWxzZTtcbiAgICAgICAgLy8gTm8gcHJvYmUgY2hhbm5lbCB0byB0aGUgdGFyZ2V0LCBzbyB3ZSBjYW5ub3QgYXR0ZXN0IHRoZSBjb25zdW1lclxuICAgICAgICAvLyBob25vcnMgYGhvb2tJbnB1dGA7IGxlYXZlIHRoZSBtYXJrZXIgb2ZmIChmYWlsIGNsb3NlZCB0b1xuICAgICAgICAvLyBzZXF1ZW50aWFsKS5cbiAgICAgICAgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFzayBmb3IgdGhpcyBydW4ncyBwdWJsaWMga2V5IHdoaWxlIHdlJ3JlIGhlcmUuIFRoZSBwcm9iZSBhbHJlYWR5XG4gICAgICAgIC8vIGJsb2NrcyBgc3RhcnQoKWAgb24gZXZlcnkgY3Jvc3MtZGVwbG95bWVudCBjYWxsLCBhbmQgdGhlIHJlc3BvbmRlclxuICAgICAgICAvLyBleGVjdXRlcyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50IHdoZXJlIHRoZSBrZXkgbWF0ZXJpYWwgaXNcbiAgICAgICAgLy8gbG9jYWwsIHNvIHRoZSBrZXkgY29tZXMgYmFjayBmb3IgZnJlZSBvbiBhIHJlc3BvbnNlIHdlIGFyZVxuICAgICAgICAvLyBhbHJlYWR5IGF3YWl0aW5nLCBhbmQgd2UgY2FuIHNraXAgdGhlIGtleS1sb29rdXAgQVBJIHJlcXVlc3RcbiAgICAgICAgLy8gZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBvbiB0aW1lb3V0IG9yIGFuIG9sZGVyIHRhcmdldCwgbm8ga2V5IGNvbWVzXG4gICAgICAgIC8vIGJhY2sgYW5kIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgcmVndWxhciBsb29rdXAgYmVsb3cuXG4gICAgICAgIGNvbnN0IHByb2JlID0gYXdhaXQgaGVhbHRoQ2hlY2sod29ybGQsIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdGltZW91dDogQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMsXG4gICAgICAgICAgbmFtZXNwYWNlOiBvcHRzLm5hbWVzcGFjZSxcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgcHJvYmVkUnVuUHVibGljS2V5ID0gcHJvYmU/LmVuY3J5cHRpb25QdWJsaWNLZXk7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGdldFJ1bkNhcGFiaWxpdGllcyhwcm9iZT8ud29ya2Zsb3dDb3JlVmVyc2lvbik7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gY2FwYWJpbGl0aWVzLmZyYW1lZEJ5dGVTdHJlYW1zO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUFxuICAgICAgICApO1xuICAgICAgICAvLyBUaGUgcmVzcG9uZGVyIHJ1bnMgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gaXRzXG4gICAgICAgIC8vIGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYCByZWZsZWN0cyB0aGUgY29uc3VtZXIuIFVuZGVmaW5lZCBvbiBhblxuICAgICAgICAvLyBvbGRlciB0YXJnZXQgb3IgYSBwcm9iZSB0aW1lb3V0LCBsZWF2aW5nIHRoZSBtYXJrZXIgb2ZmLlxuICAgICAgICB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uID0gcHJvYmU/Lmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgdG8gcHJvcGFnYXRlIGFjcm9zcyBxdWV1ZSBib3VuZGFyeVxuICAgICAgY29uc3QgdHJhY2VDYXJyaWVyID0gYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG5cbiAgICAgIC8vIERlZmF1bHQgbmV3IHJ1bnMgdG8gdGhlIGNvbmZpZ3VyZWQgd29ybGQncyBzcGVjIHZlcnNpb24uIFRoZSB3b3JsZFxuICAgICAgLy8gaXRzZWxmIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBhZ2FpbnN0IHRoaXMgcnVudGltZSdzIHNwZWMgdmVyc2lvbi5cbiAgICAgIGNvbnN0IHNwZWNWZXJzaW9uID0gb3B0cy5zcGVjVmVyc2lvbiA/PyB3b3JsZC5zcGVjVmVyc2lvbjtcbiAgICAgIGNvbnN0IHYxQ29tcGF0ID0gaXNMZWdhY3lTcGVjVmVyc2lvbihzcGVjVmVyc2lvbik7XG4gICAgICBjb25zdCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9IG9wdHMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWU7XG4gICAgICBsZXQgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRzLmF0dHJpYnV0ZXMgJiYgT2JqZWN0LmtleXMob3B0cy5hdHRyaWJ1dGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChzcGVjVmVyc2lvbiA8IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgJ0luaXRpYWwgd29ya2Zsb3cgYXR0cmlidXRlcyByZXF1aXJlIGEgV29ybGQgdGhhdCBzdXBwb3J0cyBzcGVjIHZlcnNpb24gNCBvciBsYXRlci4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlc2AgdHJlYXRzIGB1bmRlZmluZWRgIGFzIFwicmVtb3ZlIHRoaXNcbiAgICAgICAgLy8ga2V5XCIsIHdoaWNoIGlzIG1lYW5pbmdsZXNzIGF0IGNyZWF0aW9uIHRpbWUuIFJlamVjdCBpdCB1cCBmcm9udFxuICAgICAgICAvLyBzbyBKUyBjYWxsZXJzIGdldCBhIGNsZWFyIGVycm9yIGluc3RlYWQgb2YgYSBkb3duc3RyZWFtIHNjaGVtYVxuICAgICAgICAvLyBmYWlsdXJlICh0aGUgdHlwZXMgYWxyZWFkeSBmb3JiaWQgbm9uLXN0cmluZyB2YWx1ZXMpLlxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRzLmF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgYEluaXRpYWwgd29ya2Zsb3cgYXR0cmlidXRlICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gbXVzdCBiZSBhIHN0cmluZyB2YWx1ZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFuZ2VzID0gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhvcHRzLmF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgY2hhbmdlcy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiBba2V5LCB2YWx1ZSBhcyBzdHJpbmddKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcm9zcy1ydW4gbGluZWFnZTogdGhlIHJlc2VydmVkIGtleXMgcmlkZSBvbiB0aGUgcnVuJ3MgZXhpc3RpbmdcbiAgICAgIC8vIGF0dHJpYnV0ZXMsIHNvIHRoZXkgYWRkIG5vIGV4dHJhIHdyaXRlLiBDYWxsZXIgYXR0cmlidXRlcyBhcmUgc3ByZWFkXG4gICAgICAvLyBsYXN0LCBzbyBhIGNhbGxlciB3aXRoIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIGNhbiBkZWxpYmVyYXRlbHlcbiAgICAgIC8vIHJlLXBhcmVudC5cbiAgICAgIGNvbnN0IGxpbmVhZ2UgPVxuICAgICAgICBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFU1xuICAgICAgICAgID8gcmVzb2x2ZUxpbmVhZ2VBdHRyaWJ1dGVzKClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJ1bkF0dHJpYnV0ZXMgPSBsaW5lYWdlXG4gICAgICAgID8geyAuLi5saW5lYWdlLCAuLi5hdHRyaWJ1dGVzIH1cbiAgICAgICAgOiBhdHRyaWJ1dGVzO1xuXG4gICAgICAvLyBTaGFyZWQgYnkgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50IGFuZCB0aGUgcmVzaWxpZW50LXN0YXJ0IHF1ZXVlIGlucHV0LlxuICAgICAgY29uc3QgYXR0cmlidXRlU2VlZCA9IHJ1bkF0dHJpYnV0ZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5BdHRyaWJ1dGVzLFxuICAgICAgICAgICAgLi4uKGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzIHx8IGxpbmVhZ2UgIT0gbnVsbFxuICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgYXMgY29uc3QgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG5cbiAgICAgIC8vIGByZXBsYXllZEZyb21SdW5JZGAgaXMgYSBmb3JlaWduIGtleSB0byB0aGUgc291cmNlIHJ1bjsgcmVqZWN0IGFueXRoaW5nXG4gICAgICAvLyB0aGF0IGlzbid0IGEgcmVhbCBydW4gSUQgc28gdGhlIGxpbmVhZ2UgbGluayBjYW4ndCBwb2ludCBhdCBnYXJiYWdlLlxuICAgICAgaWYgKFxuICAgICAgICBvcHRzLnJlcGxheWVkRnJvbVJ1bklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXdvcmtmbG93UnVuSWRTY2hlbWEuc2FmZVBhcnNlKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnN1Y2Nlc3NcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYHJlcGxheWVkRnJvbVJ1bklkIG11c3QgYmUgYSBydW4gSUQgKHdydW5fPHVsaWQ+KTsgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIFN0cmluZyhvcHRzLnJlcGxheWVkRnJvbVJ1bklkKS5zbGljZSgwLCA2NClcbiAgICAgICAgICApfS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgLy8gUmVzb2x2ZSBob3cgdG8gZW5jcnlwdCB0aGUgd29ya2Zsb3cgYXJndW1lbnRzLlxuICAgICAgLy9cbiAgICAgIC8vIFByZWZlcnJlZDogdGhlIGNhcGFiaWxpdHkgcHJvYmUgYWxyZWFkeSB0b2xkIHVzIHRoaXMgcnVuJ3MgcHVibGljXG4gICAgICAvLyBrZXksIHNvIHNlYWwgdG8gaXQuIFRoYXQgc2tpcHMgYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gLCB3aGljaCBmb3IgYVxuICAgICAgLy8gY3Jvc3MtZGVwbG95bWVudCBzdGFydCBpcyBhIGBydW4ta2V5YCBBUEkgcmVxdWVzdCwgdGhlIGxhc3Qgb25lIGxlZnRcbiAgICAgIC8vIG9uIHRoaXMgcGF0aC4gSXQgaXMgYWxzbyBhIHByaXZpbGVnZSByZWR1Y3Rpb246IHRoZSBjYWxsZXIgZW5kcyB1cFxuICAgICAgLy8gYWJsZSB0byB3cml0ZSB0aGUgYXJndW1lbnRzIGJ1dCBub3QgcmVhZCB0aGVtIGJhY2ssIHdoZXJlYXMgZmV0Y2hpbmdcbiAgICAgIC8vIHRoZSBzeW1tZXRyaWMga2V5IGdyYW50cyBmdWxsIHJlYWQgYWNjZXNzIHRvIGEgcnVuIGl0IG1lcmVseVxuICAgICAgLy8gbGF1bmNoZWQuXG4gICAgICBjb25zdCBwcm9iZWRQdWJsaWNLZXkgPSBkZWNvZGVSdW5QdWJsaWNLZXkocHJvYmVkUnVuUHVibGljS2V5KTtcblxuICAgICAgbGV0IGVuY3J5cHRpb25LZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgZW5jcnlwdGlvblB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBpZiAocHJvYmVkUHVibGljS2V5KSB7XG4gICAgICAgIGVuY3J5cHRpb25LZXkgPSBzZWFsVG8ocHJvYmVkUHVibGljS2V5KTtcbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IHByb2JlZFJ1blB1YmxpY0tleTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5JZCwge1xuICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICB9KTtcbiAgICAgICAgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIFB1Ymxpc2ggdGhlIHJ1bidzIFgyNTUxOSBwdWJsaWMga2V5IHNvIHRoYXQgY3Jvc3MtcnVuIHdyaXRlcnMgKGFcbiAgICAgICAgLy8gaG9vayByZXN1bXB0aW9uIGZyb20gYW5vdGhlciBkZXBsb3ltZW50LCBhIHNpYmxpbmcgd3JpdGluZyBpbnRvIGFcbiAgICAgICAgLy8gZm9yd2FyZGVkIHN0cmVhbSkgY2FuIHNlYWwgcGF5bG9hZHMgKnRvKiB0aGlzIHJ1biB3aXRob3V0IGhvbGRpbmdcbiAgICAgICAgLy8gaXRzIHN5bW1ldHJpYyBrZXkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFByZXNlbmNlIG9mIHRoaXMgZmllbGQgaXMgdGhlIHdyaXRlci1zaWRlIGdhdGUgZm9yIHNlYWxlZFxuICAgICAgICAvLyBlbnZlbG9wZXMsIHNvIGl0IG11c3Qgb25seSBiZSBzdGFtcGVkIHdoZW4gdGhpcyBydW50aW1lIGNvdWxkXG4gICAgICAgIC8vIGl0c2VsZiBvcGVuIG9uZS4gVGhhdCBob2xkcyBieSBjb25zdHJ1Y3Rpb24gaGVyZTogZGVyaXZhdGlvbiBhbmRcbiAgICAgICAgLy8gYGVuY3BgIGRpc3BhdGNoIGxpdmUgaW4gdGhlIHNhbWUgcGFja2FnZSwgc28gYW55IGNvcmUgdGhhdCBjYW5cbiAgICAgICAgLy8gc3RhbXAgY2FuIGFsc28gb3Blbi4gUnVucyBhcmUgcGlubmVkIHRvIHRoZWlyIGNyZWF0aW5nIGRlcGxveW1lbnQsXG4gICAgICAgIC8vIHNvIHRoZSBjYXBhYmlsaXR5IHRoaXMgYXR0ZXN0cyB0byBpcyBzdGlsbCBhY2N1cmF0ZSBhdCByZXN1bWUgdGltZS5cbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IHJhd0tleVxuICAgICAgICAgID8gYnl0ZXNUb0Jhc2U2NCgoYXdhaXQgZGVyaXZlUnVuS2V5UGFpcihyYXdLZXkpKS5wdWJsaWNLZXkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBydW4gdmlhIHJ1bl9jcmVhdGVkIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgIC8vIFBhc3MgY2xpZW50LWdlbmVyYXRlZCBydW5JZCAtIHNlcnZlciB3aWxsIGFjY2VwdCBhbmQgdXNlIGl0XG4gICAgICAvLyBDb21wcmVzcyB3b3JrZmxvdyBhcmd1bWVudHMgb25seSB3aGVuIHRoZSBydW4gaXRzZWxmIGlzIG1hcmtlZCBhc1xuICAgICAgLy8gcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjVmVyc2lvbiA+PSA1KSBBTkQgdGhlXG4gICAgICAvLyB0YXJnZXQgZGVwbG95bWVudCBjYW4gZGVjb2RlIHRoZW0gKHNhbWUtZGVwbG95bWVudCwgb3IgcHJvYmVkXG4gICAgICAvLyBjYXBhYmlsaXR5IGZvciBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0cykuXG4gICAgICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gJiZcbiAgICAgICAgc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OO1xuICAgICAgY29uc3Qgd29ya2Zsb3dBcmd1bWVudHMgPSBhd2FpdCBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgYXJncyxcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIG9wcyxcbiAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgdjFDb21wYXQsXG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zLFxuICAgICAgICBjb21wcmVzc2lvblxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGVudmlyb25tZW50IHRoaXMgY2FsbGVyJ3Mgb3duIGBydW5fY3JlYXRlZGAgd3JpdGUgaXMgYXR0cmlidXRlZFxuICAgICAgLy8gdG8uIFN0YW1wZWQgaW50byB0aGUgcXVldWUgbWVzc2FnZSdzIGBydW5JbnB1dGAgKE5PVCBpbnRvXG4gICAgICAvLyBgcnVuX2NyZWF0ZWRgLCB3aG9zZSB0ZW5hbnQgdGhlIGJhY2tlbmQgYWxyZWFkeSBrbm93cykgc28gdGhlXG4gICAgICAvLyBkZXBsb3ltZW50IHRoYXQgY29uc3VtZXMgdGhlIG1lc3NhZ2UgY2FuIHRlbGwgd2hldGhlciB0aGUgcnVuIGl0IGlzXG4gICAgICAvLyBiZWluZyBhc2tlZCB0byByZXNpbGllbnRseSBjcmVhdGUgd2FzIGNyZWF0ZWQgYWdhaW5zdCBhIGRpZmZlcmVudFxuICAgICAgLy8gZW52aXJvbm1lbnQgdGhhbiBpdHMgb3duLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB0d28gd3JpdGVzIGJlbG93IGdvIHRvIGRpZmZlcmVudCBwbGFjZXMgYnkgZGlmZmVyZW50IHJvdXRlczpcbiAgICAgIC8vIGBldmVudHMuY3JlYXRlYCBpcyBhdHRyaWJ1dGVkIHRvIFRISVMgY2xpZW50J3MgdGVuYW50LCB3aGlsZSB0aGUgcXVldWVcbiAgICAgIC8vIG1lc3NhZ2UgaXMgcGlubmVkIHRvIGEgZGVwbG95bWVudElkLiBXaGVuIHRob3NlIGRpc2FncmVlIChhXG4gICAgICAvLyBwcm9kdWN0aW9uLWNyZWRlbnRpYWxlZCBjbGllbnQgcGlubmluZyBhIHByZXZpZXcgZGVwbG95bWVudCkgdGhlXG4gICAgICAvLyBwcmV2aWV3IGNvbnN1bWVyIGNhbid0IGZpbmQgdGhlIHJ1biBpbiBpdHMgb3duIHRlbmFudCwgZmFsbHMgYmFjayB0b1xuICAgICAgLy8gcmVzaWxpZW50IHN0YXJ0LCBhbmQgcmUtY3JlYXRlcyBpdDogb25lIGNsaWVudC1taW50ZWQgcnVuIGlkLCB0d29cbiAgICAgIC8vIGVudmlyb25tZW50cywgdGhlIHByb2R1Y3Rpb24gY29weSBwZW5kaW5nIGZvcmV2ZXIgYW5kIHRoZSBwcmV2aWV3IGNvcHlcbiAgICAgIC8vIGV4ZWN1dGluZy4gV29ybGRzIHdpdGggYSBzaW5nbGUgdGVuYW50IHJldHVybiB1bmRlZmluZWQgYW5kIHRoZSBmaWVsZFxuICAgICAgLy8gaXMgYWJzZW50LlxuICAgICAgY29uc3QgY3JlYXRvckVudmlyb25tZW50ID0gd29ybGQuZ2V0RW52aXJvbm1lbnQ/LigpO1xuXG4gICAgICAvLyBJZiBXT1JLRkxPV19WTSBpcyBzZXQgb24gdGhlIGNsaWVudCBzdGFydGluZyB0aGUgcnVuLCBzdGFtcCB0aGVcbiAgICAgIC8vIGVuZ2luZSBjaG9pY2UgaW50byB0aGUgcnVuJ3MgZXhlY3V0aW9uQ29udGV4dCBzbyB0aGUgcnVuIGtlZXBzXG4gICAgICAvLyBleGVjdXRpbmcgb24gdGhlIGVuZ2luZSBpdCBzdGFydGVkIG9uICh0aGUgc2FtZSBkZXBsb3ltZW50IGNhblxuICAgICAgLy8gc2VydmUgYm90aCBWTSBlbmdpbmVzKS4gVW5rbm93biB2YWx1ZXMgdGhyb3c7IHNlZVxuICAgICAgLy8gZ2V0V29ya2Zsb3dWbUZyb21FbnYoKS5cbiAgICAgIGNvbnN0IHdvcmtmbG93Vm0gPSBnZXRXb3JrZmxvd1ZtRnJvbUVudigpO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgICAvLyBBdHRlc3QgdGhhdCB0aGUgKmNvbnN1bWVyKiBkZXBsb3ltZW50J3MgcnVudGltZSByZS1lbnN1cmVzIGFcbiAgICAgICAgLy8gYGhvb2tfcmVjZWl2ZWRgIGV2ZW50IGZyb20gYSBxdWV1ZSBtZXNzYWdlJ3MgYGhvb2tJbnB1dGAgb24gcmVwbGF5LlxuICAgICAgICAvLyBBIHJlc3VtZSBvZiB0aGlzIHJ1biByZWFkcyB0aGUgbWFya2VyIChtaXJyb3JlZCBvbnRvIHRoZSBob29rJ3NcbiAgICAgICAgLy8gcmVzdW1lQ29udGV4dCBieSB0aGUgc2VydmVyKSB0byBkZWNpZGUgd2hldGhlciB0aGUgcGFyYWxsZWwgZmFzdFxuICAgICAgICAvLyBwYXRoIGlzIHNhZmUuIEZvciBhIGNyb3NzLWRlcGxveW1lbnQgc3RhcnQgdGhlIGNvbnN1bWVyIGlzIHRoZVxuICAgICAgICAvLyB0YXJnZXQgZGVwbG95bWVudCwgc28gd2Ugc3RhbXAgdGhlICp0YXJnZXQncyogdmFsdWUgY2FycmllZCBiYWNrIG9uXG4gICAgICAgIC8vIHRoZSBoZWFsdGgtY2hlY2sgcHJvYmUsIG5ldmVyIHRoZSBjYWxsZXIncy4gT21pdHRlZCB3aGVuIHdlIGNvdWxkXG4gICAgICAgIC8vIG5vdCBhdHRlc3QgdGhlIHRhcmdldCAob2xkZXIgdGFyZ2V0LCB0aW1lb3V0LCBvciBubyBwcm9iZSBjaGFubmVsKSxcbiAgICAgICAgLy8gd2hpY2ggZmFpbHMgdGhlIHJlc3VtZSBnYXRlIGNsb3NlZCB0byB0aGUgc2VxdWVudGlhbCBwYXRoLlxuICAgICAgICAuLi4odGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGhvb2tSZXN1bWVJbnB1dFZlcnNpb246IHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4od29ya2Zsb3dWbSA/IHsgd29ya2Zsb3dWbSB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5yZXBsYXllZEZyb21SdW5JZFxuICAgICAgICAgID8geyByZXBsYXllZEZyb21SdW5JZDogb3B0cy5yZXBsYXllZEZyb21SdW5JZCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGV2ZW50cy5jcmVhdGUgKHJ1bl9jcmVhdGVkKSBhbmQgcXVldWUgaW4gcGFyYWxsZWwuXG4gICAgICAvLyBJZiBldmVudHMuY3JlYXRlIGZhaWxzIHdpdGggNDI5LzV4eCwgdGhlIHJ1biB3YXMgc3RpbGwgYWNjZXB0ZWRcbiAgICAgIC8vIHZpYSB0aGUgcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuXG4gICAgICBjb25zdCBbcnVuQ3JlYXRlZFJlc3VsdCwgcXVldWVSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgLi4uKGVuY3J5cHRpb25QdWJsaWNLZXkgPyB7IGVuY3J5cHRpb25QdWJsaWNLZXkgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uYXR0cmlidXRlU2VlZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHYxQ29tcGF0IH1cbiAgICAgICAgKSxcbiAgICAgICAgd29ybGQucXVldWUoXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBvcHRzLm5hbWVzcGFjZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAuLi4oc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgcnVuSW5wdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIC4uLihjcmVhdG9yRW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgID8geyBlbnZpcm9ubWVudDogY3JlYXRvckVudmlyb25tZW50IH1cbiAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uYXR0cmlidXRlU2VlZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAvLyBGb3J3YXJkIGFueSBjYWxsZXItc3VwcGxpZWQgcmVnaW9uIGhpbnQgc28gd29ybGRzIHdpdGhcbiAgICAgICAgICAgIC8vIHBlci1yZWdpb24gcXVldWUgcm91dGluZyAoZS5nLiB3b3JsZC12ZXJjZWwpIGNhbiB0YXJnZXQgdGhlXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBxdWV1ZS4gV29ybGRzIHdpdGhvdXQgYSByZWdpb25hbCBkaW1lbnNpb24gaWdub3JlXG4gICAgICAgICAgICAvLyB0aGlzIGZpZWxkLlxuICAgICAgICAgICAgLi4uKG9wdHMucmVnaW9uICE9PSB1bmRlZmluZWQgPyB7IHJlZ2lvbjogb3B0cy5yZWdpb24gfSA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICBdKTtcblxuICAgICAgLy8gUXVldWUgZmFpbHVyZSBpcyBhbHdheXMgZmF0YWw6IHRoZSBydW4gd2FzIG5vdCBlbnF1ZXVlZFxuICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBldmVudHMuY3JlYXRlIHJlc3VsdFxuICAgICAgbGV0IHJlc2lsaWVudFN0YXJ0ID0gZmFsc2U7XG4gICAgICBpZiAocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgY29uc3QgZXJyID0gcnVuQ3JlYXRlZFJlc3VsdC5yZWFzb247XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAvLyA0MDk6IFRoZSBydW4gYWxyZWFkeSBleGlzdHMuIFRoaXMgY2FuIGhhcHBlbiBpbiBleHRyZW1lIGNhc2VzIHdoZXJlXG4gICAgICAgICAgLy8gdGhlIHJ1biBjcmVhdGlvbiBjYWxsIGdldHMgYSBjb2xkIHN0YXJ0IG9yIG90aGVyIHNsb3dkb3duLCBhbmQgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gKyBydW5fc3RhcnRlZCBjYWxsIGNvbXBsZXRlcyBmYXN0ZXIuIFdlIGV4cGVjdCB0aGlzIHRvIGJlIDw9MSUgb2YgY2FzZXMuXG4gICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gc2FmZWx5IHJldHVybi5cbiAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgIC8vIDQyOSAoVGhyb3R0bGVFcnJvciksIDV4eCwgYW5kIHRyYW5zaWVudCB0cmFuc3BvcnQgZmFpbHVyZXNcbiAgICAgICAgICAvLyAoVFJBTlNQT1JUL1RJTUVPVVQpIGFyZSByZXRyeWFibGU6IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGVcbiAgICAgICAgICAvLyBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBieSB0aGUgcnVudGltZSB3aGVuIGl0IGNhbGxzXG4gICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQuXG4gICAgICAgICAgcmVzaWxpZW50U3RhcnQgPSB0cnVlO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICdSdW4gY3JlYXRpb24gZXZlbnQgZmFpbGVkLCBidXQgdGhlIHJ1biB3YXMgYWNjZXB0ZWQgdmlhIHRoZSBxdWV1ZS4gJyArXG4gICAgICAgICAgICAgICdUaGUgcnVuX2NyZWF0ZWQgZXZlbnQgd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS4nLFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgZXJyb3I6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZTtcbiAgICAgICAgLy8gVmVyaWZ5IHNlcnZlciBhY2NlcHRlZCBvdXIgcnVuSWRcbiAgICAgICAgaWYgKCF2MUNvbXBhdCAmJiByZXN1bHQucnVuLnJ1bklkICE9PSBydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBTZXJ2ZXIgcmV0dXJuZWQgZGlmZmVyZW50IHJ1bklkIHRoYW4gcmVxdWVzdGVkOiBleHBlY3RlZCAke3J1bklkfSwgZ290ICR7cmVzdWx0LnJ1bi5ydW5JZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVzZSBhcmd1bWVudC1zdHJlYW0gb3BzIGFyZSBmbHVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGUgcHJvbWlzZVxuICAgICAgLy8gaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZCB3YWl0VW50aWxcbiAgICAgIC8vIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksIHNvIHVuZXhwZWN0ZWRcbiAgICAgIC8vIGZhaWx1cmVzIGFyZSBsb2dnZWQgaW5zdGVhZC5cbiAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ0JhY2tncm91bmQgZmx1c2ggb2Ygd29ya2Zsb3cgYXJndW1lbnQgc3RyZWFtcyBmYWlsZWQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkRlcGxveW1lbnRJZChkZXBsb3ltZW50SWQpLFxuICAgICAgICAuLi4ocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnXG4gICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocnVuQ3JlYXRlZFJlc3VsdC52YWx1ZS5ydW4uc3RhdHVzKVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgUnVuPFRSZXN1bHQ+KHJ1bklkLCB7IHJlc2lsaWVudFN0YXJ0IH0pO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
446
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixnQ0FBZ0MsRUFDaEMsMENBQTBDLEVBQzFDLGlDQUFpQyxFQUNqQyxtQkFBbUIsR0FDcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsT0FBTyxFQUNMLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLDBCQUEwQixFQUUxQixtQkFBbUIsRUFDbkIsTUFBTSxHQUNQLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFF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bnRpdHlDb25mbGljdEVycm9yLCBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgZ2xvYmFsU2luZ2xldG9uIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IHdvcmtmbG93RGlzcGxheU5hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW52b2tlUGF5bG9hZCwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgUEFSRU5UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIFJPT1RfUlVOX0lEX0FUVFJJQlVURSxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0FUVFJJQlVURVMsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB3b3JrZmxvd1J1bklkU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyB9IGZyb20gJy4uL2F0dHJpYnV0ZS1jaGFuZ2VzLmpzJztcbmltcG9ydCB7IGdldFJ1bkNhcGFiaWxpdGllcyB9IGZyb20gJy4uL2NhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBpc1JldHJ5YWJsZVdvcmxkRXJyb3IgfSBmcm9tICcuLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBpbXBvcnRLZXkgfSBmcm9tICcuLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuLi9zY2hlbWFzLmpzJztcbmltcG9ydCB7XG4gIGJ5dGVzVG9CYXNlNjQsXG4gIGRlY29kZVJ1blB1YmxpY0tleSxcbiAgZGVyaXZlUnVuS2V5UGFpcixcbn0gZnJvbSAnLi4vc2VhbGVkLWJveC5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxuICBzZWFsVG8sXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuLi9zdGVwL2NvbnRleHQtc3RvcmFnZS5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZVRyYWNlQ2FycmllciwgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgdmVyc2lvbiBhcyB3b3JrZmxvd0NvcmVWZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lLCBoZWFsdGhDaGVjayB9IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSdW4gfSBmcm9tICcuL3J1bi5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1ZtRnJvbUVudiB9IGZyb20gJy4vdm0tbW9kZS5qcyc7XG5pbXBvcnQgeyBzYWZlV2FpdFVudGlsLCB3YWl0ZWRVbnRpbCB9IGZyb20gJy4vd2FpdC11bnRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sIH0gZnJvbSAnLi93b3JsZC1jb21wYXRpYmlsaXR5LmpzJztcblxuLyoqXG4gKiBUaW1lb3V0IGZvciB0aGUgY3Jvc3MtZGVwbG95bWVudCBjYXBhYmlsaXR5IHByb2JlIGRvbmUgYmVmb3JlXG4gKiBkZWh5ZHJhdGluZyB3b3JrZmxvdyBhcmd1bWVudHMuIEtlcHQgdGlnaHQgb24gcHVycG9zZTogdGhlIHByb2JlIGlzXG4gKiBhbiBvcHRpbWl6YXRpb24gKGl0IGxldHMgdGhlIGNhbGxlciBlbWl0IHRoZSBmcmFtZWQgYnl0ZS1zdHJlYW0gd2lyZVxuICogZm9ybWF0IHdoZW4gdGhlIHRhcmdldCBzdXBwb3J0cyBpdCksIGFuZCB0aGUgZmFsbGJhY2sgb24gdGltZW91dCBpc1xuICogdGhlIGxlZ2FjeSByYXcgZm9ybWF0IHdoaWNoIGFsd2F5cyB3b3Jrcy4gTG9uZyBkZWxheXMgaGVyZSB3b3VsZFxuICogbWFrZSBgc3RhcnQoeyBkZXBsb3ltZW50SWQ6IC4uLiB9KWAgc2xvd2VyIGZvciB1c2VycyB3aG9zZSB0YXJnZXRcbiAqIGRlcGxveW1lbnRzIGRvbid0IHJlY29nbml6ZSB0aGUgaGVhbHRoIGNoZWNrIGF0IGFsbC5cbiAqL1xuY29uc3QgQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqIFVMSUQgZ2VuZXJhdG9yIGZvciBjbGllbnQtc2lkZSBydW5JZCBnZW5lcmF0aW9uICovXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vKipcbiAqIENyb3NzLXJ1biBsaW5lYWdlIGZvciBhIHJ1biBiZWluZyBzdGFydGVkIGZyb20gaW5zaWRlIGFub3RoZXIgcnVuLlxuICpcbiAqIFRoZSBhbWJpZW50IHN0ZXAgY29udGV4dCBjYXJyaWVzIHRoZSBwYXJlbnQgcnVuIGlkIGFuZCB0aGUgcm9vdCBvZiBpdHNcbiAqIGxpbmVhZ2U7IHRoZSBydW50aW1lIGZpbGxzIGJvdGggZnJvbSB0aGUgcnVuIGl0IGFscmVhZHkgaGFzIGxvYWRlZCwgc28gdGhpc1xuICogaXMgYSBwdXJlIGNvbnRleHQgcmVhZCB3aXRoIG5vIEkvTy4gVGhlIG5ldyBydW4gcmVjb3JkcyBgJHBhcmVudFJ1bklkYCAodGhlXG4gKiBlZGdlKSBhbmQgaW5oZXJpdHMgdGhlIHBhcmVudCdzIGAkcm9vdFJ1bklkYCAodGhlIHBhcmVudCBpdHNlbGYgd2hlbiBpdCBpcyBhXG4gKiByb290KSwgc28gYSBkYWlzeSBjaGFpbiBvciBmYW4tb3V0IG9mIGFueSBkZXB0aCBncm91cHMgdW5kZXIgb25lIHJvb3QgaWQuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBhIHRvcC1sZXZlbCBgc3RhcnQoKWAsIHdoaWNoIGhhcyBubyBjb250ZXh0LCBzb1xuICogc3RhbmRhbG9uZSBydW5zIGNhcnJ5IG5vIGxpbmVhZ2UuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMaW5lYWdlQXR0cmlidXRlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RvcmUgPSBjb250ZXh0U3RvcmFnZS5nZXRTdG9yZSgpO1xuICBjb25zdCBwYXJlbnRSdW5JZCA9IHN0b3JlPy53b3JrZmxvd01ldGFkYXRhPy53b3JrZmxvd1J1bklkO1xuICBpZiAoIXBhcmVudFJ1bklkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgW1JPT1RfUlVOX0lEX0FUVFJJQlVURV06IHN0b3JlLnJvb3RSdW5JZCA/PyBwYXJlbnRSdW5JZCxcbiAgICBbUEFSRU5UX1JVTl9JRF9BVFRSSUJVVEVdOiBwYXJlbnRSdW5JZCxcbiAgfTtcbn1cblxuLy8gYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIGlzIGEgbm8tb3AgaW4gV29ybGRzIHdpdGhvdXQgYXRvbWljIGRlcGxveW1lbnRzLlxuLy8gVGhlIHdhcm5pbmcgdGhhdCBleHBsYWlucyB0aGlzIG9ubHkgbmVlZHMgdG8gZmlyZSBvbmNlIHBlciBwcm9jZXNzOiBhXG4vLyB3b3JrZmxvdyB0aGF0IGhhcmRjb2RlcyAnbGF0ZXN0JyBmb3IgaXRzIFZlcmNlbCBkZXBsb3ltZW50IHdvdWxkIG90aGVyd2lzZVxuLy8gbG9nIGl0IG9uIGV2ZXJ5IGxvY2FsL1Bvc3RncmVzIHJ1biwgZmxvb2RpbmcgdGlnaHQgZGV2IGxvb3BzLlxuLy8gT24gYGdsb2JhbFRoaXNgIChzZWUgYGdsb2JhbFNpbmdsZXRvbmApIHNvIFwib25jZSBwZXIgcHJvY2Vzc1wiIGlzIG5vdCBvbmNlXG4vLyBwZXIgYnVuZGxlciBsYXllci5cbmNvbnN0IGxhdGVzdE5vT3BXYXJuaW5nID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL2xhdGVzdE5vT3BXYXJuaW5nJyxcbiAgMSxcbiAgKCkgPT4gKHsgd2FybmVkOiBmYWxzZSB9KVxuKTtcblxuLyoqXG4gKiBSZXNldCB0aGUgYGRlcGxveW1lbnRJZDogJ2xhdGVzdCdgIG5vLW9wIHdhcm4tb25jZSBndWFyZC4gVGVzdC1vbmx5LFxuICogZXhwb3J0ZWQgc28gdW5pdCB0ZXN0cyBjYW4gZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCBhY3Jvc3MgYHN0YXJ0KClgIGNhbGxzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0TGF0ZXN0Tm9PcFdhcm5Gb3JUZXN0cygpOiB2b2lkIHtcbiAgbGF0ZXN0Tm9PcFdhcm5pbmcud2FybmVkID0gZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ybGQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuIGNyZWF0aW9uLFxuICAgKiBieSBkZWZhdWx0IHRoZSB3b3JsZCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqL1xuICB3b3JsZD86IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBUaGUgc3BlYyB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi4gRGVmYXVsdHMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHJlZ2lvbiBpZGVudGlmaWVyIGZvciB0aGUgbmV3IHJ1bi4gQ3VycmVudGx5IGNvbnN1bWVkIG9ubHlcbiAgICogYnkgYEB3b3JrZmxvdy93b3JsZC12ZXJjZWxgLCB3aGljaCBlbWJlZHMgdGhlIHJlZ2lvbiBpbnRvIHRoZSB0YWdnZWRcbiAgICogcnVuIElEIGFuZCByb3V0ZXMgdGhlIGluaXRpYWwgd29ya2Zsb3cgbWVzc2FnZSB0byB0aGUgbWF0Y2hpbmdcbiAgICogcmVnaW9uYWwgcXVldWUuIFdoZW4gb21pdHRlZCwgdGhlIHdvcmxkIGZhbGxzIGJhY2sgdG8gaXRzIG93blxuICAgKiBkZWZhdWx0IChmb3IgYHdvcmxkLXZlcmNlbGA6IHRoZSBgVkVSQ0VMX1JFR0lPTmAgZW52aXJvbm1lbnRcbiAgICogdmFyaWFibGUsIHRoZW4gdGhlIHNlcnZlci1zaWRlIGRlZmF1bHQgcmVnaW9uIGBpYWQxYDsgYSBjb25jcmV0ZSxcbiAgICogcm91dGFibGUgcmVnaW9uIGlzIGFsd2F5cyBjaG9zZW4pLlxuICAgKlxuICAgKiBXb3JsZHMgd2l0aG91dCBhIHJlZ2lvbmFsIGRpbWVuc2lvbiBpZ25vcmUgdGhpcyBmaWVsZC5cbiAgICovXG4gIHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGxhaW50ZXh0IGF0dHJpYnV0ZXMgdG8gc2VlZCBvbiB0aGUgcnVuIGFzIGl0IGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEF2YWlsYWJsZSBmb3IgbmF0aXZlLWF0dHJpYnV0ZXMgcnVucyAoc3BlYyB2ZXJzaW9uIDQgYW5kIGxhdGVyKS5cbiAgICovXG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQZXJtaXQgcmVzZXJ2ZWQgYCRgLXByZWZpeGVkIGtleXMgaW4gYGF0dHJpYnV0ZXNgLiBUaGUgYCRgIG5hbWVzcGFjZVxuICAgKiBpcyByZXNlcnZlZCBmb3IgZnJhbWV3b3JrL2xpYnJhcnkgY29kZSBidWlsdCBvbiB0b3Agb2YgdGhlIHdvcmtmbG93XG4gICAqIFNESyAodGVsZW1ldHJ5LCBhZ2VudCBtZXRhZGF0YSwgcGxhdGZvcm0tZW1pdHRlZCB0YWdzLCBldGMuKTsgdXNlclxuICAgKiBjb2RlIE1VU1QgTk9UIHdyaXRlIGtleXMgaW4gaXQsIGFuZCB2YWxpZGF0aW9uIHJlamVjdHMgdGhlbSBzb1xuICAgKiBhY2NpZGVudGFsIGNvbGxpc2lvbnMgd2l0aCB0b29saW5nLW93bmVkIGtleXMgY2FuJ3Qgc2xpcCB0aHJvdWdoLlxuICAgKlxuICAgKiBPbmx5IGZsaXAgdGhpcyB0byBgdHJ1ZWAgaWYgeW91ciBjYWxsZXIgaXMgaXRzZWxmIGEgZnJhbWV3b3JrIG9yXG4gICAqIGxpYnJhcnkgdGhhdCBvd25zIGEgYCRgLXByZWZpeGVkIHN1Yi1uYW1lc3BhY2UgYW5kIGtub3dzIHRoZVxuICAgKiBjb252ZW50aW9ucyBvZiBhbnkgb3RoZXIgdG9vbHMgd3JpdGluZyBpbnRvIGl0LiBTYW1lIHNlbWFudGljcyBhc1xuICAgKiB0aGUgYHNldEF0dHJpYnV0ZXNgIG9wdGlvbiBvZiB0aGUgc2FtZSBuYW1lLlxuICAgKi9cbiAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgYW4gZXhpc3RpbmcgcnVuIHRoaXMgcnVuIGlzIGJlaW5nIHJlcGxheWVkIGZyb20sIGlmIGFueS5cbiAgICpcbiAgICogUmVjb3JkZWQgb24gdGhlIG5ldyBydW4ncyBgZXhlY3V0aW9uQ29udGV4dGAgYXMgYHJlcGxheWVkRnJvbVJ1bklkYCBzb1xuICAgKiB0b29saW5nIChlLmcuIHRoZSBkYXNoYm9hcmQgcnVucyBsaXN0KSBjYW4gc2hvdyB0aGF0IGEgcnVuIG9yaWdpbmF0ZWQgYXNcbiAgICogYSByZXBsYXkgYW5kIGxpbmsgYmFjayB0byBpdHMgc291cmNlLiBTZXQgYXV0b21hdGljYWxseSBieVxuICAgKiB7QGxpbmsgcmVjcmVhdGVSdW5Gcm9tRXhpc3Rpbmd9OyB0aGVyZSdzIHVzdWFsbHkgbm8gcmVhc29uIHRvIHBhc3MgaXRcbiAgICogZGlyZWN0bHkuXG4gICAqXG4gICAqIE11c3QgYmUgYSBydW4gSUQ6IGB3cnVuX2AgZm9sbG93ZWQgYnkgYSAyNi1jaGFyIFVMSUQuIEl0J3MgYSBmb3JlaWduIGtleVxuICAgKiB0byB0aGUgc291cmNlIHJ1biwgc28gYHN0YXJ0KClgIHZhbGlkYXRlcyB0aGUgZXhhY3Qgc2hhcGUgYW5kIHJlamVjdHNcbiAgICogYW55dGhpbmcgZWxzZSByYXRoZXIgdGhhbiBwZXJzaXN0IGEgbGluZWFnZSBsaW5rIHRoYXQgcG9pbnRzIGF0IGdhcmJhZ2UuXG4gICAqL1xuICByZXBsYXllZEZyb21SdW5JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSBvZiB0aGUgdGFyZ2V0IGRlcGxveW1lbnQuIFNjb3BlcyB0aGUgd29ya2Zsb3cgcXVldWVcbiAgICogdG9waWMgdG8gYF9fe25hbWVzcGFjZX1fd2tmX3dvcmtmbG93XypgIChlLmcuIGAnZXZlJ2ApIGluc3RlYWQgb2YgdGhlXG4gICAqIGRlZmF1bHQgYF9fd2tmX3dvcmtmbG93XypgLCBhbmQgaXMgYWxzbyB1c2VkIGZvciB0aGUgY3Jvc3MtZGVwbG95bWVudFxuICAgKiBjYXBhYmlsaXR5IHByb2JlLiBGYWxscyBiYWNrIHRvIGBXT1JLRkxPV19RVUVVRV9OQU1FU1BBQ0VgIGluIHRoZVxuICAgKiBjYWxsaW5nIHByb2Nlc3MuXG4gICAqXG4gICAqIFdpdGhpbiBhIGRlcGxveW1lbnQgdGhlIGVudiBmYWxsYmFjayBpcyBjb3JyZWN0LiBDcm9zcy1jb250ZXh0IGNhbGxlcnNcbiAgICogKGUuZy4gdGhlIG9ic2VydmFiaWxpdHkgZGFzaGJvYXJkIHJlcGxheWluZyBhIHJ1bikgbXVzdCBwYXNzIHRoZVxuICAgKiBUQVJHRVQgZGVwbG95bWVudCdzIG5hbWVzcGFjZSBleHBsaWNpdGx5OiB0aGUgZW52IGZhbGxiYWNrIHJlc29sdmVzIGluXG4gICAqIHRoZSBjYWxsZXIncyBwcm9jZXNzLCBhbmQgYSBydW4gZW5xdWV1ZWQgdG8gYSB0b3BpYyB0aGUgdGFyZ2V0IGhhcyBub1xuICAgKiBjb25zdW1lciBmb3IgaXMgbmV2ZXIgcGlja2VkIHVwLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IElEIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIHdoZW4gZGVwbG95aW5nIHRvIFZlcmNlbC5cbiAgICpcbiAgICogU2V0IHRvIGAnbGF0ZXN0J2AgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZSBtb3N0IHJlY2VudCBkZXBsb3ltZW50XG4gICAqIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvciBnaXQgYnJhbmNoKS5cbiAgICogVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgaW4gd29ybGRzIHdpdGggYXRvbWljLCBpbW11dGFibGUgZGVwbG95bWVudHNcbiAgICogKGN1cnJlbnRseSBWZXJjZWwpLiBJbiBvdGhlciB3b3JsZHMgKGxvY2FsIGRldiwgUG9zdGdyZXMpIHRoZXJlIGlzIG5vXG4gICAqIG5vdGlvbiBvZiBtdWx0aXBsZSBkZXBsb3ltZW50cyB0byByZXNvbHZlIGJldHdlZW4sIHNvIGAnbGF0ZXN0J2AgaGFzIG5vXG4gICAqIGVmZmVjdDogYSB3YXJuaW5nIGlzIGxvZ2dlZCBhbmQgdGhlIHJ1biB0YXJnZXRzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXG4gICAqXG4gICAqICoqTm90ZToqKiBXaGVuIGBkZXBsb3ltZW50SWRgIGlzIHByb3ZpZGVkLCB0aGUgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBiZWNvbWUgYHVua25vd25gXG4gICAqIHNpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGUgdHlwZXMgd2lsbCBiZSBjb25zaXN0ZW50IGFjcm9zcyBkZXBsb3ltZW50cy5cbiAgICovXG4gIGRlcGxveW1lbnRJZDogJ2xhdGVzdCcgfCAoc3RyaW5nICYge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgZGVwbG95bWVudElkPzogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgdHlwZSBTdGFydE9wdGlvbnMgPVxuICB8IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbiAgfCBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93RnVuY3Rpb248VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+ID0gKFxuICAuLi5hcmdzOiBUQXJnc1xuKSA9PiBQcm9taXNlPFRSZXN1bHQ+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGdlbmVyYXRlZCBtZXRhZGF0YSBvZiBhIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd01ldGFkYXRhID0geyB3b3JrZmxvd0lkOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTdGFydHMgYSB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uIHRvIHN0YXJ0LlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHdvcmtmbG93IChvcHRpb25hbCkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgcnVuIChvcHRpb25hbCkuXG4gKiBAcmV0dXJucyBUaGUgdW5pcXVlIHJ1biBJRCBmb3IgdGhlIG5ld2x5IHN0YXJ0ZWQgd29ya2Zsb3cgaW52b2NhdGlvbi5cbiAqL1xuLy8gT3ZlcmxvYWRzIHdpdGggZGVwbG95bWVudElkIC0gYXJncyBhbmQgcmV0dXJuIHR5cGUgYmVjb21lIHVua25vd25cbi8vIFVzZXMgZ2VuZXJpY3Mgc28gdHlwZWQgd29ya2Zsb3dzIGFyZSBhc3NpZ25hYmxlIChhdm9pZHMgY29udHJhdmFyaWFuY2UgaXNzdWVzKSxcbi8vIGJ1dCB0aGUgcmV0dXJuIHR5cGUgYW5kIGFyZ3MgYXJlIHN0aWxsIHVua25vd24gc2luY2UgdGhlIGRlcGxveWVkIHZlcnNpb24gbWF5IGRpZmZlci5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IHVua25vd25bXSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuLy8gT3ZlcmxvYWRzIHdpdGhvdXQgZGVwbG95bWVudElkIC0gcHJlc2VydmUgdHlwZSBpbmZlcmVuY2VcbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IFRBcmdzLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3NPck9wdGlvbnM/OiBUQXJncyB8IFN0YXJ0T3B0aW9ucyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1xuKSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiBhd2FpdCB3YWl0ZWRVbnRpbCgoKSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGlzIGZpZWxkIGlzIGFkZGVkIGJ5IG91ciBjbGllbnQgdHJhbnNmb3JtXG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gd29ya2Zsb3c/LndvcmtmbG93SWQ7XG5cbiAgICBpZiAoIXdvcmtmbG93TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgJ3N0YXJ0JyByZWNlaXZlZCBhbiBpbnZhbGlkIHdvcmtmbG93IGZ1bmN0aW9uLiBFbnN1cmUgdGhlIFdvcmtmbG93IFNESyBpcyBjb25maWd1cmVkIGNvcnJlY3RseSBhbmQgdGhlIGZ1bmN0aW9uIGluY2x1ZGVzIGEgJ3VzZSB3b3JrZmxvdycgZGlyZWN0aXZlLmAsXG4gICAgICAgIHsgc2x1ZzogJ3N0YXJ0LWludmFsaWQtd29ya2Zsb3ctZnVuY3Rpb24nIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3Bhbk5hbWUgPSBgd29ya2Zsb3cuc3RhcnQgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YDtcbiAgICByZXR1cm4gdHJhY2Uoc3Bhbk5hbWUsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ3N0YXJ0JyksXG4gICAgICB9KTtcblxuICAgICAgbGV0IGFyZ3M6IFNlcmlhbGl6YWJsZVtdID0gW107XG4gICAgICBsZXQgb3B0czogU3RhcnRPcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NPck9wdGlvbnMpKSB7XG4gICAgICAgIGFyZ3MgPSBhcmdzT3JPcHRpb25zIGFzIFNlcmlhbGl6YWJsZVtdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnc09yT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0cyA9IGFyZ3NPck9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChhcmdzLmxlbmd0aCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgd29ybGQgPSBvcHRzLndvcmxkID8/IChhd2FpdCBnZXRXb3JsZExhenkoKSk7XG4gICAgICBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sKHdvcmxkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgICAgIGxldCBkZXBsb3ltZW50SWQgPSBvcHRzLmRlcGxveW1lbnRJZCA/PyBjdXJyZW50RGVwbG95bWVudElkO1xuXG4gICAgICAvLyBXaGVuICdsYXRlc3QnIGlzIHJlcXVlc3RlZCwgcmVzb2x2ZSB0aGUgYWN0dWFsIGxhdGVzdCBkZXBsb3ltZW50IElEXG4gICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCdzIGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yXG4gICAgICAvLyBzYW1lIGdpdCBicmFuY2ggZm9yIHByZXZpZXcgZGVwbG95bWVudHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFJlc29sdmluZyAnbGF0ZXN0JyBvbmx5IG1lYW5zIHNvbWV0aGluZyBpbiB3b3JsZHMgd2l0aCBhdG9taWMsXG4gICAgICAvLyBpbW11dGFibGUgZGVwbG95bWVudHMgKGUuZy4gVmVyY2VsKSwgd2hpY2ggaW1wbGVtZW50XG4gICAgICAvLyByZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCkuIFdvcmxkcyB3aXRob3V0IHRoYXQgY29uY2VwdCAobG9jYWwgZGV2LFxuICAgICAgLy8gc2VsZi1ob3N0ZWQgUG9zdGdyZXMpIGhhdmUgbm90aGluZyB0byByZXNvbHZlIGJldHdlZW4sIHNvIHJhdGhlciB0aGFuXG4gICAgICAvLyBmYWlsIGEgcnVuIHRoYXQgd29ya3MgZmluZSBvbiBWZXJjZWwsIHdlIHdhcm4gYW5kIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGN1cnJlbnQgZGVwbG95bWVudCwgbWFraW5nICdsYXRlc3QnIGFuIGVmZmVjdGl2ZSBuby1vcCB0aGVyZS5cbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgIGlmICh3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKSB7XG4gICAgICAgICAgZGVwbG95bWVudElkID0gYXdhaXQgd29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdhcm4gb25jZSBwZXIgcHJvY2Vzczsgc2VlIGxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCBhYm92ZS5cbiAgICAgICAgICBpZiAoIWxhdGVzdE5vT3BXYXJuaW5nLndhcm5lZCkge1xuICAgICAgICAgICAgbGF0ZXN0Tm9PcFdhcm5pbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgXCJkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIGhhcyBubyBlZmZlY3QgaW4gdGhpcyB3b3JsZCBhbmQgd2FzIGlnbm9yZWQuIFwiICtcbiAgICAgICAgICAgICAgICAnSXQgaXMgb25seSBzdXBwb3J0ZWQgYnkgd29ybGRzIHdpdGggYXRvbWljIGRlcGxveW1lbnRzLCBzdWNoIGFzIFZlcmNlbC4gJyArXG4gICAgICAgICAgICAgICAgJ1RoZSBydW4gd2lsbCB0YXJnZXQgdGhlIGN1cnJlbnQgZGVwbG95bWVudC4nLFxuICAgICAgICAgICAgICB7IGN1cnJlbnREZXBsb3ltZW50SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVwbG95bWVudElkID0gY3VycmVudERlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZWNpZGUgd2hldGhlciB0byB3cml0ZSBieXRlIHN0cmVhbXMgaW4gdGhlIGZyYW1lZCB3aXJlIGZvcm1hdC5cbiAgICAgIC8vIEZvciBzYW1lLWRlcGxveW1lbnQgc3RhcnRzICh0aGUgY29tbW9uIGNhc2UpIHdlIGtub3cgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gcnVubmluZyB0aGlzIHNhbWUgU0RLIHZlcnNpb24sIHNvIGZyYW1pbmcgaXMgc2FmZS4gRm9yIGNyb3NzLVxuICAgICAgLy8gZGVwbG95bWVudCBzdGFydHMgKGV4cGxpY2l0IGRlcGxveW1lbnRJZCBvciAnbGF0ZXN0JyB0aGF0IHJlc29sdmVzXG4gICAgICAvLyB0byBhIGRpZmZlcmVudCBkZXBsb3ltZW50KSB3ZSBwcm9iZSB0aGUgdGFyZ2V0IHZpYSBoZWFsdGhDaGVjayB0b1xuICAgICAgLy8gbGVhcm4gaXRzIHdvcmtmbG93LWNvcmUgdmVyc2lvbiwgdGhlbiBkZXJpdmUgdGhlIGNhcGFiaWxpdHkuIFRoZVxuICAgICAgLy8gcHJvYmUgaGFzIGEgdGlnaHQgdGltZW91dDogb24gbWlzcy9mYWlsdXJlIHdlIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGxlZ2FjeSByYXcgYnl0ZSBmb3JtYXQsIHdoaWNoIGlzIHVuaXZlcnNhbGx5IHJlYWRhYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIFdvcmxkcyB0aGF0IGRvbid0IGV4cG9zZSB0aGUgYHN0cmVhbXNgIEFQSSAoZS5nLiBtaW5pbWFsIHRlc3RcbiAgICAgIC8vIG1vY2tzKSBjYW4ndCBzZXJ2aWNlIGhlYWx0aCBjaGVja3MsIHNvIHdlIHNraXAgdGhlIHByb2JlIGZvciB0aGVtLlxuICAgICAgLy8gR2VuZXJhdGUgcnVuSWQgY2xpZW50LXNpZGUgc28gd2UgaGF2ZSBpdCBiZWZvcmUgc2VyaWFsaXphdGlvblxuICAgICAgLy8gKHJlcXVpcmVkIGZvciBmdXR1cmUgRTJFIGVuY3J5cHRpb24gd2hlcmUgcnVuSWQgaXMgcGFydCBvZiB0aGVcbiAgICAgIC8vIGVuY3J5cHRpb24gY29udGV4dCkuIFdoZW4gdGhlIFdvcmxkIHByb3ZpZGVzIGEgYGNyZWF0ZVJ1bklkKClgXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiwgdXNlIGl0IHNvIHdvcmxkcyBjYW4gZW1iZWQgaW1wbGVtZW50YXRpb24tc3BlY2lmaWNcbiAgICAgIC8vIG1ldGFkYXRhIChlLmcuLCByZWdpb24pIGludG8gdGhlIElELCBmb3J3YXJkaW5nIHRoZSBmdWxsIG9wdGlvbnNcbiAgICAgIC8vIGJhZyBzbyB3b3JsZHMgY2FuIHJlYWQgd2hpY2hldmVyIGZpZWxkcyB0aGV5IHJlY29nbmlzZTsgb3RoZXJ3aXNlXG4gICAgICAvLyBmYWxsIGJhY2sgdG8gYSBzdGFuZGFyZCBtb25vdG9uaWMgVUxJRC5cbiAgICAgIGNvbnN0IHJ1bklkID0gYHdydW5fJHtcbiAgICAgICAgd29ybGQuY3JlYXRlUnVuSWRcbiAgICAgICAgICA/IHdvcmxkLmNyZWF0ZVJ1bklkKG9wdHMgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVxuICAgICAgICAgIDogdWxpZCgpXG4gICAgICB9YDtcblxuICAgICAgbGV0IGZyYW1lZEJ5dGVTdHJlYW1zOiBib29sZWFuO1xuICAgICAgbGV0IHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb246IGJvb2xlYW47XG4gICAgICAvLyBUaGUgY29uc3VtZXIncyBob29rLXJlc3VtZSBwcm90b2NvbCB2ZXJzaW9uLCBzdGFtcGVkIG9udG8gdGhlIG5ld1xuICAgICAgLy8gcnVuLiBDdXJyZW50IHByb2R1Y2VycyB3cml0ZSB0aGUgaG9va19yZWNlaXZlZCBldmVudCBkdXJhYmx5IGJlZm9yZVxuICAgICAgLy8gcHVibGlzaGluZyB0aGUgd2FrZSBhbmQgbmV2ZXIgcmVhZCBpdDsgT0xERVIgcHJvZHVjZXJzIGdhdGUgdGhlaXJcbiAgICAgIC8vIGxhenkgKGhvb2tJbnB1dC1jYXJyeWluZykgcGF0aCBvbiB0aGUgZGVwbG95bWVudCB0aGF0IHdpbGwgYWN0dWFsbHlcbiAgICAgIC8vIGNvbnN1bWUgdGhlIHF1ZXVlIG1lc3NhZ2UuIGB1bmRlZmluZWRgIG1lYW5zIFwiY291bGQgbm90IGF0dGVzdFwiIGFuZFxuICAgICAgLy8gZmFpbHMgdGhhdCBnYXRlIGNsb3NlZC5cbiAgICAgIGxldCB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBQdWJsaWMga2V5IG9mIHRoZSB0YXJnZXQgcnVuLCB3aGVuIHRoZSBjYXBhYmlsaXR5IHByb2JlIHdhcyBhYmxlIHRvXG4gICAgICAvLyBzdXBwbHkgb25lIChjcm9zcy1kZXBsb3ltZW50IG9ubHkpLlxuICAgICAgbGV0IHByb2JlZFJ1blB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGRlcGxveW1lbnRJZCA9PT0gY3VycmVudERlcGxveW1lbnRJZCkge1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IHRydWU7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSB0cnVlO1xuICAgICAgICAvLyBTYW1lIGRlcGxveW1lbnQ6IHRoaXMgcHJvY2VzcyBpcyB0aGUgY29uc3VtZXIsIHNvIGl0cyBvd24gY29uc3RhbnRcbiAgICAgICAgLy8gaXMgYXV0aG9yaXRhdGl2ZS5cbiAgICAgICAgdGFyZ2V0SG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT047XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3b3JsZC5zdHJlYW1zPy5nZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZTtcbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiA9IGZhbHNlO1xuICAgICAgICAvLyBObyBwcm9iZSBjaGFubmVsIHRvIHRoZSB0YXJnZXQsIHNvIHdlIGNhbm5vdCBhdHRlc3QgdGhlIGNvbnN1bWVyXG4gICAgICAgIC8vIGhvbm9ycyBgaG9va0lucHV0YDsgbGVhdmUgdGhlIG1hcmtlciBvZmYgKG9sZGVyIHByb2R1Y2VycyBmYWlsXG4gICAgICAgIC8vIGNsb3NlZCB0byB0aGVpciBzZXF1ZW50aWFsIHBhdGgpLlxuICAgICAgICB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXNrIGZvciB0aGlzIHJ1bidzIHB1YmxpYyBrZXkgd2hpbGUgd2UncmUgaGVyZS4gVGhlIHByb2JlIGFscmVhZHlcbiAgICAgICAgLy8gYmxvY2tzIGBzdGFydCgpYCBvbiBldmVyeSBjcm9zcy1kZXBsb3ltZW50IGNhbGwsIGFuZCB0aGUgcmVzcG9uZGVyXG4gICAgICAgIC8vIGV4ZWN1dGVzIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQgd2hlcmUgdGhlIGtleSBtYXRlcmlhbCBpc1xuICAgICAgICAvLyBsb2NhbCwgc28gdGhlIGtleSBjb21lcyBiYWNrIGZvciBmcmVlIG9uIGEgcmVzcG9uc2Ugd2UgYXJlXG4gICAgICAgIC8vIGFscmVhZHkgYXdhaXRpbmcsIGFuZCB3ZSBjYW4gc2tpcCB0aGUga2V5LWxvb2t1cCBBUEkgcmVxdWVzdFxuICAgICAgICAvLyBlbnRpcmVseS4gQmVzdC1lZmZvcnQ6IG9uIHRpbWVvdXQgb3IgYW4gb2xkZXIgdGFyZ2V0LCBubyBrZXkgY29tZXNcbiAgICAgICAgLy8gYmFjayBhbmQgd2UgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGxvb2t1cCBiZWxvdy5cbiAgICAgICAgY29uc3QgcHJvYmUgPSBhd2FpdCBoZWFsdGhDaGVjayh3b3JsZCwge1xuICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0aW1lb3V0OiBDUk9TU19ERVBMT1lNRU5UX0NBUEFCSUxJVFlfUFJPQkVfVElNRU9VVF9NUyxcbiAgICAgICAgICBuYW1lc3BhY2U6IG9wdHMubmFtZXNwYWNlLFxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBwcm9iZWRSdW5QdWJsaWNLZXkgPSBwcm9iZT8uZW5jcnlwdGlvblB1YmxpY0tleTtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZ2V0UnVuQ2FwYWJpbGl0aWVzKHByb2JlPy53b3JrZmxvd0NvcmVWZXJzaW9uKTtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBjYXBhYmlsaXRpZXMuZnJhbWVkQnl0ZVN0cmVhbXM7XG4gICAgICAgIHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb24gPSBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoXG4gICAgICAgICAgU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQXG4gICAgICAgICk7XG4gICAgICAgIC8vIFRoZSByZXNwb25kZXIgcnVucyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50LCBzbyBpdHNcbiAgICAgICAgLy8gYGhvb2tSZXN1bWVJbnB1dFZlcnNpb25gIHJlZmxlY3RzIHRoZSBjb25zdW1lci4gVW5kZWZpbmVkIG9uIGFuXG4gICAgICAgIC8vIG9sZGVyIHRhcmdldCBvciBhIHByb2JlIHRpbWVvdXQsIGxlYXZpbmcgdGhlIG1hcmtlciBvZmYuXG4gICAgICAgIHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSBwcm9iZT8uaG9va1Jlc3VtZUlucHV0VmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICAgICAgLy8gU2VyaWFsaXplIGN1cnJlbnQgdHJhY2UgY29udGV4dCB0byBwcm9wYWdhdGUgYWNyb3NzIHF1ZXVlIGJvdW5kYXJ5XG4gICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTtcblxuICAgICAgLy8gRGVmYXVsdCBuZXcgcnVucyB0byB0aGUgY29uZmlndXJlZCB3b3JsZCdzIHNwZWMgdmVyc2lvbi4gVGhlIHdvcmxkXG4gICAgICAvLyBpdHNlbGYgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGFnYWluc3QgdGhpcyBydW50aW1lJ3Mgc3BlYyB2ZXJzaW9uLlxuICAgICAgY29uc3Qgc3BlY1ZlcnNpb24gPSBvcHRzLnNwZWNWZXJzaW9uID8/IHdvcmxkLnNwZWNWZXJzaW9uO1xuICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKHNwZWNWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID0gb3B0cy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZTtcbiAgICAgIGxldCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG9wdHMuYXR0cmlidXRlcyAmJiBPYmplY3Qua2V5cyhvcHRzLmF0dHJpYnV0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHNwZWNWZXJzaW9uIDwgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0FUVFJJQlVURVMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAnSW5pdGlhbCB3b3JrZmxvdyBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBXb3JsZCB0aGF0IHN1cHBvcnRzIHNwZWMgdmVyc2lvbiA0IG9yIGxhdGVyLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzYCB0cmVhdHMgYHVuZGVmaW5lZGAgYXMgXCJyZW1vdmUgdGhpc1xuICAgICAgICAvLyBrZXlcIiwgd2hpY2ggaXMgbWVhbmluZ2xlc3MgYXQgY3JlYXRpb24gdGltZS4gUmVqZWN0IGl0IHVwIGZyb250XG4gICAgICAgIC8vIHNvIEpTIGNhbGxlcnMgZ2V0IGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiBhIGRvd25zdHJlYW0gc2NoZW1hXG4gICAgICAgIC8vIGZhaWx1cmUgKHRoZSB0eXBlcyBhbHJlYWR5IGZvcmJpZCBub24tc3RyaW5nIHZhbHVlcykuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMuYXR0cmlidXRlcykpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICBgSW5pdGlhbCB3b3JrZmxvdyBhdHRyaWJ1dGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfSBtdXN0IGJlIGEgc3RyaW5nIHZhbHVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzKG9wdHMuYXR0cmlidXRlcywge1xuICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYXR0cmlidXRlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBjaGFuZ2VzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IFtrZXksIHZhbHVlIGFzIHN0cmluZ10pXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyb3NzLXJ1biBsaW5lYWdlOiB0aGUgcmVzZXJ2ZWQga2V5cyByaWRlIG9uIHRoZSBydW4ncyBleGlzdGluZ1xuICAgICAgLy8gYXR0cmlidXRlcywgc28gdGhleSBhZGQgbm8gZXh0cmEgd3JpdGUuIENhbGxlciBhdHRyaWJ1dGVzIGFyZSBzcHJlYWRcbiAgICAgIC8vIGxhc3QsIHNvIGEgY2FsbGVyIHdpdGggYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgY2FuIGRlbGliZXJhdGVseVxuICAgICAgLy8gcmUtcGFyZW50LlxuICAgICAgY29uc3QgbGluZWFnZSA9XG4gICAgICAgIHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTXG4gICAgICAgICAgPyByZXNvbHZlTGluZWFnZUF0dHJpYnV0ZXMoKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcnVuQXR0cmlidXRlcyA9IGxpbmVhZ2VcbiAgICAgICAgPyB7IC4uLmxpbmVhZ2UsIC4uLmF0dHJpYnV0ZXMgfVxuICAgICAgICA6IGF0dHJpYnV0ZXM7XG5cbiAgICAgIC8vIFNoYXJlZCBieSB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQgYW5kIHRoZSByZXNpbGllbnQtc3RhcnQgcXVldWUgaW5wdXQuXG4gICAgICBjb25zdCBhdHRyaWJ1dGVTZWVkID0gcnVuQXR0cmlidXRlc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bkF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAuLi4oYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgfHwgbGluZWFnZSAhPSBudWxsXG4gICAgICAgICAgICAgID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSBhcyBjb25zdCB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fTtcblxuICAgICAgLy8gYHJlcGxheWVkRnJvbVJ1bklkYCBpcyBhIGZvcmVpZ24ga2V5IHRvIHRoZSBzb3VyY2UgcnVuOyByZWplY3QgYW55dGhpbmdcbiAgICAgIC8vIHRoYXQgaXNuJ3QgYSByZWFsIHJ1biBJRCBzbyB0aGUgbGluZWFnZSBsaW5rIGNhbid0IHBvaW50IGF0IGdhcmJhZ2UuXG4gICAgICBpZiAoXG4gICAgICAgIG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhd29ya2Zsb3dSdW5JZFNjaGVtYS5zYWZlUGFyc2Uob3B0cy5yZXBsYXllZEZyb21SdW5JZCkuc3VjY2Vzc1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICBgcmVwbGF5ZWRGcm9tUnVuSWQgbXVzdCBiZSBhIHJ1biBJRCAod3J1bl88dWxpZD4pOyByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgU3RyaW5nKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnNsaWNlKDAsIDY0KVxuICAgICAgICAgICl9LmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzb2x2ZSBlbmNyeXB0aW9uIGtleSBmb3IgdGhlIG5ldyBydW4uIFRoZSBydW5JZCBoYXMgYWxyZWFkeSBiZWVuXG4gICAgICAvLyBnZW5lcmF0ZWQgYWJvdmUgKGNsaWVudC1nZW5lcmF0ZWQgVUxJRCkgYW5kIHdpbGwgYmUgdXNlZCBmb3IgYm90aFxuICAgICAgLy8ga2V5IGRlcml2YXRpb24gYW5kIHRoZSBydW5fY3JlYXRlZCBldmVudC4gVGhlIFdvcmxkIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyB1c2VzIHRoZSBydW5JZCBmb3IgcGVyLXJ1biBIS0RGIGtleSBkZXJpdmF0aW9uLiBXZSBwYXNzIHRoZSByZXNvbHZlZFxuICAgICAgLy8gZGVwbG95bWVudElkIChub3QganVzdCB0aGUgcmF3IG9wdHMpIHNvIHRoZSBXb3JsZCBjYW4gdXNlIGl0IGZvclxuICAgICAgLy8ga2V5IHJlc29sdXRpb24gZXZlbiB3aGVuIGRlcGxveW1lbnRJZCB3YXMgaW5mZXJyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gb3B0cyAoZS5nLiwgaW4gZTJlIHRlc3QgcnVubmVycykuXG4gICAgICAvLyBSZXNvbHZlIGhvdyB0byBlbmNyeXB0IHRoZSB3b3JrZmxvdyBhcmd1bWVudHMuXG4gICAgICAvL1xuICAgICAgLy8gUHJlZmVycmVkOiB0aGUgY2FwYWJpbGl0eSBwcm9iZSBhbHJlYWR5IHRvbGQgdXMgdGhpcyBydW4ncyBwdWJsaWNcbiAgICAgIC8vIGtleSwgc28gc2VhbCB0byBpdC4gVGhhdCBza2lwcyBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAsIHdoaWNoIGZvciBhXG4gICAgICAvLyBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0IGlzIGEgYHJ1bi1rZXlgIEFQSSByZXF1ZXN0LCB0aGUgbGFzdCBvbmUgbGVmdFxuICAgICAgLy8gb24gdGhpcyBwYXRoLiBJdCBpcyBhbHNvIGEgcHJpdmlsZWdlIHJlZHVjdGlvbjogdGhlIGNhbGxlciBlbmRzIHVwXG4gICAgICAvLyBhYmxlIHRvIHdyaXRlIHRoZSBhcmd1bWVudHMgYnV0IG5vdCByZWFkIHRoZW0gYmFjaywgd2hlcmVhcyBmZXRjaGluZ1xuICAgICAgLy8gdGhlIHN5bW1ldHJpYyBrZXkgZ3JhbnRzIGZ1bGwgcmVhZCBhY2Nlc3MgdG8gYSBydW4gaXQgbWVyZWx5XG4gICAgICAvLyBsYXVuY2hlZC5cbiAgICAgIGNvbnN0IHByb2JlZFB1YmxpY0tleSA9IGRlY29kZVJ1blB1YmxpY0tleShwcm9iZWRSdW5QdWJsaWNLZXkpO1xuXG4gICAgICBsZXQgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBlbmNyeXB0aW9uUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChwcm9iZWRQdWJsaWNLZXkpIHtcbiAgICAgICAgZW5jcnlwdGlvbktleSA9IHNlYWxUbyhwcm9iZWRQdWJsaWNLZXkpO1xuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5ID0gcHJvYmVkUnVuUHVibGljS2V5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bklkLCB7XG4gICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgIH0pO1xuICAgICAgICBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gUHVibGlzaCB0aGUgcnVuJ3MgWDI1NTE5IHB1YmxpYyBrZXkgc28gdGhhdCBjcm9zcy1ydW4gd3JpdGVycyAoYVxuICAgICAgICAvLyBob29rIHJlc3VtcHRpb24gZnJvbSBhbm90aGVyIGRlcGxveW1lbnQsIGEgc2libGluZyB3cml0aW5nIGludG8gYVxuICAgICAgICAvLyBmb3J3YXJkZWQgc3RyZWFtKSBjYW4gc2VhbCBwYXlsb2FkcyAqdG8qIHRoaXMgcnVuIHdpdGhvdXQgaG9sZGluZ1xuICAgICAgICAvLyBpdHMgc3ltbWV0cmljIGtleS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUHJlc2VuY2Ugb2YgdGhpcyBmaWVsZCBpcyB0aGUgd3JpdGVyLXNpZGUgZ2F0ZSBmb3Igc2VhbGVkXG4gICAgICAgIC8vIGVudmVsb3Blcywgc28gaXQgbXVzdCBvbmx5IGJlIHN0YW1wZWQgd2hlbiB0aGlzIHJ1bnRpbWUgY291bGRcbiAgICAgICAgLy8gaXRzZWxmIG9wZW4gb25lLiBUaGF0IGhvbGRzIGJ5IGNvbnN0cnVjdGlvbiBoZXJlOiBkZXJpdmF0aW9uIGFuZFxuICAgICAgICAvLyBgZW5jcGAgZGlzcGF0Y2ggbGl2ZSBpbiB0aGUgc2FtZSBwYWNrYWdlLCBzbyBhbnkgY29yZSB0aGF0IGNhblxuICAgICAgICAvLyBzdGFtcCBjYW4gYWxzbyBvcGVuLiBSdW5zIGFyZSBwaW5uZWQgdG8gdGhlaXIgY3JlYXRpbmcgZGVwbG95bWVudCxcbiAgICAgICAgLy8gc28gdGhlIGNhcGFiaWxpdHkgdGhpcyBhdHRlc3RzIHRvIGlzIHN0aWxsIGFjY3VyYXRlIGF0IHJlc3VtZSB0aW1lLlxuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5ID0gcmF3S2V5XG4gICAgICAgICAgPyBieXRlc1RvQmFzZTY0KChhd2FpdCBkZXJpdmVSdW5LZXlQYWlyKHJhd0tleSkpLnB1YmxpY0tleSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHJ1biB2aWEgcnVuX2NyZWF0ZWQgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgLy8gUGFzcyBjbGllbnQtZ2VuZXJhdGVkIHJ1bklkIC0gc2VydmVyIHdpbGwgYWNjZXB0IGFuZCB1c2UgaXRcbiAgICAgIC8vIENvbXByZXNzIHdvcmtmbG93IGFyZ3VtZW50cyBvbmx5IHdoZW4gdGhlIHJ1biBpdHNlbGYgaXMgbWFya2VkIGFzXG4gICAgICAvLyBwb3NzaWJseSBjb250YWluaW5nIGNvbXByZXNzZWQgcGF5bG9hZHMgKHNwZWNWZXJzaW9uID49IDUpIEFORCB0aGVcbiAgICAgIC8vIHRhcmdldCBkZXBsb3ltZW50IGNhbiBkZWNvZGUgdGhlbSAoc2FtZS1kZXBsb3ltZW50LCBvciBwcm9iZWRcbiAgICAgIC8vIGNhcGFiaWxpdHkgZm9yIGNyb3NzLWRlcGxveW1lbnQgc3RhcnRzKS5cbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiAmJlxuICAgICAgICBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT047XG4gICAgICBjb25zdCB3b3JrZmxvd0FyZ3VtZW50cyA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICAgICAgICBhcmdzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgb3BzLFxuICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICB2MUNvbXBhdCxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIGNvbXByZXNzaW9uXG4gICAgICApO1xuXG4gICAgICAvLyBUaGUgZW52aXJvbm1lbnQgdGhpcyBjYWxsZXIncyBvd24gYHJ1bl9jcmVhdGVkYCB3cml0ZSBpcyBhdHRyaWJ1dGVkXG4gICAgICAvLyB0by4gU3RhbXBlZCBpbnRvIHRoZSBxdWV1ZSBtZXNzYWdlJ3MgYHJ1bklucHV0YCAoTk9UIGludG9cbiAgICAgIC8vIGBydW5fY3JlYXRlZGAsIHdob3NlIHRlbmFudCB0aGUgYmFja2VuZCBhbHJlYWR5IGtub3dzKSBzbyB0aGVcbiAgICAgIC8vIGRlcGxveW1lbnQgdGhhdCBjb25zdW1lcyB0aGUgbWVzc2FnZSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBydW4gaXQgaXNcbiAgICAgIC8vIGJlaW5nIGFza2VkIHRvIHJlc2lsaWVudGx5IGNyZWF0ZSB3YXMgY3JlYXRlZCBhZ2FpbnN0IGEgZGlmZmVyZW50XG4gICAgICAvLyBlbnZpcm9ubWVudCB0aGFuIGl0cyBvd24uXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHR3byB3cml0ZXMgYmVsb3cgZ28gdG8gZGlmZmVyZW50IHBsYWNlcyBieSBkaWZmZXJlbnQgcm91dGVzOlxuICAgICAgLy8gYGV2ZW50cy5jcmVhdGVgIGlzIGF0dHJpYnV0ZWQgdG8gVEhJUyBjbGllbnQncyB0ZW5hbnQsIHdoaWxlIHRoZSBxdWV1ZVxuICAgICAgLy8gbWVzc2FnZSBpcyBwaW5uZWQgdG8gYSBkZXBsb3ltZW50SWQuIFdoZW4gdGhvc2UgZGlzYWdyZWUgKGFcbiAgICAgIC8vIHByb2R1Y3Rpb24tY3JlZGVudGlhbGVkIGNsaWVudCBwaW5uaW5nIGEgcHJldmlldyBkZXBsb3ltZW50KSB0aGVcbiAgICAgIC8vIHByZXZpZXcgY29uc3VtZXIgY2FuJ3QgZmluZCB0aGUgcnVuIGluIGl0cyBvd24gdGVuYW50LCBmYWxscyBiYWNrIHRvXG4gICAgICAvLyByZXNpbGllbnQgc3RhcnQsIGFuZCByZS1jcmVhdGVzIGl0OiBvbmUgY2xpZW50LW1pbnRlZCBydW4gaWQsIHR3b1xuICAgICAgLy8gZW52aXJvbm1lbnRzLCB0aGUgcHJvZHVjdGlvbiBjb3B5IHBlbmRpbmcgZm9yZXZlciBhbmQgdGhlIHByZXZpZXcgY29weVxuICAgICAgLy8gZXhlY3V0aW5nLiBXb3JsZHMgd2l0aCBhIHNpbmdsZSB0ZW5hbnQgcmV0dXJuIHVuZGVmaW5lZCBhbmQgdGhlIGZpZWxkXG4gICAgICAvLyBpcyBhYnNlbnQuXG4gICAgICBjb25zdCBjcmVhdG9yRW52aXJvbm1lbnQgPSB3b3JsZC5nZXRFbnZpcm9ubWVudD8uKCk7XG5cbiAgICAgIC8vIElmIFdPUktGTE9XX1ZNIGlzIHNldCBvbiB0aGUgY2xpZW50IHN0YXJ0aW5nIHRoZSBydW4sIHN0YW1wIHRoZVxuICAgICAgLy8gZW5naW5lIGNob2ljZSBpbnRvIHRoZSBydW4ncyBleGVjdXRpb25Db250ZXh0IHNvIHRoZSBydW4ga2VlcHNcbiAgICAgIC8vIGV4ZWN1dGluZyBvbiB0aGUgZW5naW5lIGl0IHN0YXJ0ZWQgb24gKHRoZSBzYW1lIGRlcGxveW1lbnQgY2FuXG4gICAgICAvLyBzZXJ2ZSBib3RoIFZNIGVuZ2luZXMpLiBVbmtub3duIHZhbHVlcyB0aHJvdzsgc2VlXG4gICAgICAvLyBnZXRXb3JrZmxvd1ZtRnJvbUVudigpLlxuICAgICAgY29uc3Qgd29ya2Zsb3dWbSA9IGdldFdvcmtmbG93Vm1Gcm9tRW52KCk7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgIC8vIEF0dGVzdCB0aGF0IHRoZSAqY29uc3VtZXIqIGRlcGxveW1lbnQncyBydW50aW1lIHJlLWVuc3VyZXMgYVxuICAgICAgICAvLyBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSBhIHF1ZXVlIG1lc3NhZ2UncyBgaG9va0lucHV0YCBvbiByZXBsYXkuXG4gICAgICAgIC8vIEFuIE9MREVSIHByb2R1Y2VyIHJlc3VtaW5nIHRoaXMgcnVuIHJlYWRzIHRoZSBtYXJrZXIgKG1pcnJvcmVkIG9udG9cbiAgICAgICAgLy8gdGhlIGhvb2sncyByZXN1bWVDb250ZXh0IGJ5IHRoZSBzZXJ2ZXIpIHRvIGRlY2lkZSB3aGV0aGVyIGl0cyBsYXp5XG4gICAgICAgIC8vIGZhc3QgcGF0aCBpcyBzYWZlLiBGb3IgYSBjcm9zcy1kZXBsb3ltZW50IHN0YXJ0IHRoZSBjb25zdW1lciBpcyB0aGVcbiAgICAgICAgLy8gdGFyZ2V0IGRlcGxveW1lbnQsIHNvIHdlIHN0YW1wIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIGNhcnJpZWQgYmFjayBvblxuICAgICAgICAvLyB0aGUgaGVhbHRoLWNoZWNrIHByb2JlLCBuZXZlciB0aGUgY2FsbGVyJ3MuIE9taXR0ZWQgd2hlbiB3ZSBjb3VsZFxuICAgICAgICAvLyBub3QgYXR0ZXN0IHRoZSB0YXJnZXQgKG9sZGVyIHRhcmdldCwgdGltZW91dCwgb3Igbm8gcHJvYmUgY2hhbm5lbCksXG4gICAgICAgIC8vIHdoaWNoIGZhaWxzIHRoZSByZXN1bWUgZ2F0ZSBjbG9zZWQgdG8gdGhlIHNlcXVlbnRpYWwgcGF0aC5cbiAgICAgICAgLi4uKHRhcmdldEhvb2tSZXN1bWVJbnB1dFZlcnNpb24gIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBob29rUmVzdW1lSW5wdXRWZXJzaW9uOiB0YXJnZXRIb29rUmVzdW1lSW5wdXRWZXJzaW9uIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKHdvcmtmbG93Vm0gPyB7IHdvcmtmbG93Vm0gfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWRcbiAgICAgICAgICA/IHsgcmVwbGF5ZWRGcm9tUnVuSWQ6IG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBldmVudHMuY3JlYXRlIChydW5fY3JlYXRlZCkgYW5kIHF1ZXVlIGluIHBhcmFsbGVsLlxuICAgICAgLy8gSWYgZXZlbnRzLmNyZWF0ZSBmYWlscyB3aXRoIDQyOS81eHgsIHRoZSBydW4gd2FzIHN0aWxsIGFjY2VwdGVkXG4gICAgICAvLyB2aWEgdGhlIHF1ZXVlIGFuZCBjcmVhdGlvbiB3aWxsIGJlIHJlLXRyaWVkIGFzeW5jIGJ5IHRoZSBydW50aW1lLlxuICAgICAgY29uc3QgW3J1bkNyZWF0ZWRSZXN1bHQsIHF1ZXVlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgIC4uLihlbmNyeXB0aW9uUHVibGljS2V5ID8geyBlbmNyeXB0aW9uUHVibGljS2V5IH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICksXG4gICAgICAgIHdvcmxkLnF1ZXVlKFxuICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgb3B0cy5uYW1lc3BhY2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgLi4uKHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DQk9SX1FVRVVFX1RSQU5TUE9SVFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHJ1bklucHV0OiB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAuLi4oZW5jcnlwdGlvblB1YmxpY0tleSA/IHsgZW5jcnlwdGlvblB1YmxpY0tleSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oY3JlYXRvckVudmlyb25tZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICA/IHsgZW52aXJvbm1lbnQ6IGNyZWF0b3JFbnZpcm9ubWVudCB9XG4gICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgLy8gRm9yd2FyZCBhbnkgY2FsbGVyLXN1cHBsaWVkIHJlZ2lvbiBoaW50IHNvIHdvcmxkcyB3aXRoXG4gICAgICAgICAgICAvLyBwZXItcmVnaW9uIHF1ZXVlIHJvdXRpbmcgKGUuZy4gd29ybGQtdmVyY2VsKSBjYW4gdGFyZ2V0IHRoZVxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcXVldWUuIFdvcmxkcyB3aXRob3V0IGEgcmVnaW9uYWwgZGltZW5zaW9uIGlnbm9yZVxuICAgICAgICAgICAgLy8gdGhpcyBmaWVsZC5cbiAgICAgICAgICAgIC4uLihvcHRzLnJlZ2lvbiAhPT0gdW5kZWZpbmVkID8geyByZWdpb246IG9wdHMucmVnaW9uIH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsOiB0aGUgcnVuIHdhcyBub3QgZW5xdWV1ZWRcbiAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlbnRzLmNyZWF0ZSByZXN1bHRcbiAgICAgIGxldCByZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuICAgICAgaWYgKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHJ1bkNyZWF0ZWRSZXN1bHQucmVhc29uO1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gNDA5OiBUaGUgcnVuIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiBoYXBwZW4gaW4gZXh0cmVtZSBjYXNlcyB3aGVyZVxuICAgICAgICAgIC8vIHRoZSBydW4gY3JlYXRpb24gY2FsbCBnZXRzIGEgY29sZCBzdGFydCBvciBvdGhlciBzbG93ZG93biwgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAgIC8vICsgcnVuX3N0YXJ0ZWQgY2FsbCBjb21wbGV0ZXMgZmFzdGVyLiBXZSBleHBlY3QgdGhpcyB0byBiZSA8PTElIG9mIGNhc2VzLlxuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNhZmVseSByZXR1cm4uXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAvLyA0MjkgKFRocm90dGxlRXJyb3IpLCA1eHgsIGFuZCB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmVzXG4gICAgICAgICAgLy8gKFRSQU5TUE9SVC9USU1FT1VUKSBhcmUgcmV0cnlhYmxlOiB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlXG4gICAgICAgICAgLy8gcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxsc1xuICAgICAgICAgIC8vIHJ1bl9zdGFydGVkLlxuICAgICAgICAgIHJlc2lsaWVudFN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUnVuIGNyZWF0aW9uIGV2ZW50IGZhaWxlZCwgYnV0IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGUgcXVldWUuICcgK1xuICAgICAgICAgICAgICAnVGhlIHJ1bl9jcmVhdGVkIGV2ZW50IHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGVycm9yOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWU7XG4gICAgICAgIC8vIFZlcmlmeSBzZXJ2ZXIgYWNjZXB0ZWQgb3VyIHJ1bklkXG4gICAgICAgIGlmICghdjFDb21wYXQgJiYgcmVzdWx0LnJ1bi5ydW5JZCAhPT0gcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgU2VydmVyIHJldHVybmVkIGRpZmZlcmVudCBydW5JZCB0aGFuIHJlcXVlc3RlZDogZXhwZWN0ZWQgJHtydW5JZH0sIGdvdCAke3Jlc3VsdC5ydW4ucnVuSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlc2UgYXJndW1lbnQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlIHByb21pc2VcbiAgICAgIC8vIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWQgd2FpdFVudGlsXG4gICAgICAvLyByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLCBzbyB1bmV4cGVjdGVkXG4gICAgICAvLyBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHdvcmtmbG93IGFyZ3VtZW50IHN0cmVhbXMgZmFpbGVkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5EZXBsb3ltZW50SWQoZGVwbG95bWVudElkKSxcbiAgICAgICAgLi4uKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJ1xuICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuLnN0YXR1cylcbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFJ1bjxUUmVzdWx0PihydW5JZCwgeyByZXNpbGllbnRTdGFydCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
@@ -74,21 +74,30 @@ export interface StepLatencyTracking {
74
74
  * Wall-clock ms this invocation's synchronous workflow-function replay
75
75
  * took: from calling `runWorkflow` to it throwing the suspension that
76
76
  * scheduled this batch. Excludes awaited network I/O (the suspension's
77
- * event commits, the step's own start POST). Present only alongside
78
- * `rsfsAnchorMs`.
77
+ * event commits, the step's own start POST). Reported for every batch that
78
+ * qualifies for TTFS or STSO, not just the first step.
79
79
  *
80
- * This is the FINAL replay pass only: the invocation that reached and
81
- * scheduled the first step. Valid RSFS paths can replay more than once
82
- * before the first step (e.g. a workflow-body `setAttributes()` detour
83
- * replays twice), and a redelivery omits earlier invocations' replay work
84
- * entirely; this value is not accumulated across those earlier passes.
85
- * Do not read it as "the replay portion of RSFS": RSFS
86
- * ({@link rsfsAnchorMs}) covers the whole run_started-to-first-step
87
- * window, this covers only the last pass.
80
+ * This is the FINAL pass only: the one that reached and scheduled this
81
+ * batch. Valid RSFS paths can replay more than once before the first step
82
+ * (e.g. a workflow-body `setAttributes()` detour replays twice), and a
83
+ * redelivery omits earlier invocations' replay work entirely; this value is
84
+ * not accumulated across those earlier passes. Do not read it as "the
85
+ * replay portion of RSFS": RSFS ({@link rsfsAnchorMs}) covers the whole
86
+ * run_started-to-first-step window, this covers only the last pass.
87
+ *
88
+ * On a retained resume this measures the resume, not a replay, which is
89
+ * why the distribution is bimodal and why {@link retained} is reported
90
+ * alongside it as the dimension that separates the two modes.
88
91
  */
89
92
  replayMs?: number;
90
93
  /** Whether turbo mode is active for this invocation. */
91
94
  turbo: boolean;
95
+ /**
96
+ * Whether a retained VM session served this batch, as opposed to a full
97
+ * replay from the event log. Reported as a `retained` entry in
98
+ * {@link StepLatencyEventData.optimizations}, alongside `turbo`.
99
+ */
100
+ retained: boolean;
92
101
  }
93
102
  /** Latency telemetry attached to a step's terminal event's `eventData`. */
94
103
  export interface StepLatencyEventData {
@@ -99,12 +108,18 @@ export interface StepLatencyEventData {
99
108
  /** Client-measured run_started → first step's start POST, ms. */
100
109
  rsfs?: number;
101
110
  /**
102
- * Client-measured wall-clock ms of the FINAL replay pass that scheduled
103
- * the first step (see {@link StepLatencyTracking.replayMs}); not
104
- * accumulated across earlier pre-first-step passes, so it must not be
105
- * read as "the replay portion of `rsfs`".
111
+ * Client-measured wall-clock ms of the FINAL pass that scheduled this
112
+ * batch (see {@link StepLatencyTracking.replayMs}); not accumulated
113
+ * across earlier passes, so it must not be read as "the replay portion of
114
+ * `rsfs`". Present whenever `ttfs` or `stso` is.
106
115
  */
107
116
  finalSchedulingReplay?: number;
117
+ /**
118
+ * Active runtime modes for this measurement: `turbo`, `lazyStepStart`,
119
+ * `optimisticStart`, and `retained` (a retained VM served the batch; its
120
+ * absence means a full replay). The server turns each known entry into a
121
+ * bounded boolean tag on every latency metric.
122
+ */
108
123
  optimizations?: string[];
109
124
  }
110
125
  /**
@@ -170,6 +185,8 @@ export declare function computeStepLatencyTracking(params: {
170
185
  suspensionCreatedHooks: boolean;
171
186
  /** Whether turbo mode is active for this invocation. */
172
187
  turbo: boolean;
188
+ /** See {@link StepLatencyTracking.retained}. */
189
+ retained: boolean;
173
190
  }): StepLatencyTracking | undefined;
174
191
  /**
175
192
  * Compute the latency telemetry to attach to the step's terminal event.
@@ -1 +1 @@
1
- {"version":3,"file":"step-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/step-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB;AAYD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,wEAAwE;IACxE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;;;;;;;OAQG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,mBAAmB,GAAG,SAAS,CAuFlC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,oBAAoB,GAAG,SAAS,CAqFnC"}
1
+ {"version":3,"file":"step-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/step-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAYD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAkCD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,wEAAwE;IACxE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;;;;;;;OAQG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,0EAA0E;IAC1E,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,2BAA2B,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAChC,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,mBAAmB,GAAG,SAAS,CAwFlC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,4EAA4E;IAC5E,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,oBAAoB,GAAG,SAAS,CAyFnC"}
@@ -107,16 +107,17 @@ export function computeStepLatencyTracking(params) {
107
107
  ...(preStepAttrStartMs !== undefined ? { preStepAttrStartMs } : {}),
108
108
  }
109
109
  : {}),
110
- ...(rsfsEligible
111
- ? {
112
- rsfsAnchorMs: params.runStartedReceivedAtMs,
113
- replayMs: params.replayMs,
114
- }
115
- : {}),
110
+ ...(rsfsEligible ? { rsfsAnchorMs: params.runStartedReceivedAtMs } : {}),
116
111
  ...(prevStepEndMs !== undefined
117
112
  ? { prevStepEndMs, stepCount, eventCount }
118
113
  : {}),
114
+ // Not gated on rsfsEligible: replay cost is meaningful for every batch
115
+ // this function returns tracking for. Gating it on RSFS left the STSO
116
+ // population — ordinary step-to-step transitions, the bulk of step
117
+ // scheduling — with no replay-cost telemetry at all.
118
+ replayMs: params.replayMs,
119
119
  turbo: params.turbo,
120
+ retained: params.retained,
120
121
  };
121
122
  }
122
123
  /**
@@ -167,12 +168,11 @@ export function computeStepLatencyEventData(params) {
167
168
  // passes (e.g. a setAttributes detour) and must not be read as "the
168
169
  // replay portion of rsfs"; rsfs covers the whole window.
169
170
  //
170
- // finalSchedulingReplay duplicates what OTEL already captures on the run/invocation
171
- // span, but is deliberately collected as client telemetry so the server
172
- // can emit it as an UNSAMPLED, full-population metric: workflow-server's
173
- // server spans are heavily sampled in production (~7%), and client spans
174
- // can't be filtered by SDK version, so neither can serve as the
175
- // dashboard's exact TTFS decomposition.
171
+ // finalSchedulingReplay duplicates what OTEL already captures on the
172
+ // run/invocation span, but is deliberately collected as client telemetry
173
+ // so the server can emit it as an UNSAMPLED, full-population metric:
174
+ // workflow-server's server spans are heavily sampled in production (~7%),
175
+ // so they cannot serve as the dashboard's exact TTFS decomposition.
176
176
  const rsfs = tracking.rsfsAnchorMs !== undefined &&
177
177
  params.stepStartPostSentAtMs !== undefined
178
178
  ? Math.max(0, params.stepStartPostSentAtMs - tracking.rsfsAnchorMs)
@@ -192,6 +192,12 @@ export function computeStepLatencyEventData(params) {
192
192
  optimizations.push('optimisticStart');
193
193
  if (params.preclaimedStart)
194
194
  optimizations.push('preclaimedStart');
195
+ // Rides the existing optimizations list rather than a dedicated wire
196
+ // field: the server already parses this array and turns each known entry
197
+ // into a bounded boolean tag on every latency metric, so `retained`
198
+ // dimensions ttfs/stso/rsfs/finalSchedulingReplay for free.
199
+ if (tracking.retained)
200
+ optimizations.push('retained');
195
201
  return {
196
202
  ...(ttfs !== undefined ? { ttfs } : {}),
197
203
  ...(stso !== undefined ? { stso } : {}),
@@ -206,4 +212,4 @@ export function computeStepLatencyEventData(params) {
206
212
  optimizations,
207
213
  };
208
214
  }
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQThGQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFvQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLDhCQUE4QixHQUFvQyxJQUFJLEdBQUcsQ0FDN0U7SUFDRSxjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQXdEMUM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFCLElBQUksWUFBWSxHQUNkLE1BQU0sQ0FBQyxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQ25DLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzdCLElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksOEJBQThCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRCxrQkFBa0I7b0JBQ2hCLGtCQUFrQixLQUFLLFNBQVM7d0JB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RSxPQUFPO1FBQ0wsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLEtBQUssU0FBUztZQUN4RCxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQ3pELENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPIC8gUlNGUykgdGhyZWFkZWQgZnJvbSB0aGVcbiAqIG9yY2hlc3RyYXRvcidzIGlubGluZSBleGVjdXRpb24gcGF0aCBpbnRvIGBleGVjdXRlU3RlcGAuXG4gKlxuICogVFRGUyAodGltZS10by1maXJzdC1zdGVwKSBtZWFzdXJlcyBydW4gY3JlYXRpb24g4oaSIHRoZSBmaXJzdCBzdGVwJ3MgYm9keVxuICogYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIFNUU08gKHN0ZXAtdG8tc3RlcCBvdmVyaGVhZCkgbWVhc3VyZXMgdGhlIHByZXZpb3VzXG4gKiBzdGVwJ3MgdGVybWluYWwgZXZlbnQg4oaSIHRoZSBuZXh0IHN0ZXAncyBib2R5IGJlZ2lubmluZyB0byBleGVjdXRlLiBSU0ZTXG4gKiAocnVuLXN0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCkgbWVhc3VyZXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyDihpJcbiAqIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCBiZWluZyBpc3N1ZWQsIGEgc3ViLXdpbmRvdyBvZiBUVEZTIHRoYXRcbiAqIGlzb2xhdGVzIHJlcGxheSBvdmVyaGVhZCBmcm9tIHRoZSBydW4tY3JlYXRpb24gcXVldWUgaG9wOyBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICogaXMgdGhlIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uLWV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBvbmx5IHRoZSBGSU5BTFxuICogcmVwbGF5IHBhc3Mgd2l0aGluIHRoYXQgd2luZG93ICh0aGUgcGFzcyB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAqIGZpcnN0IHN0ZXApOyBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXAgcGFzc2VzXG4gKiAoc2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfSksIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAqIHJlcGxheSBwb3J0aW9uIG9mIFJTRlNcIi4gQWxsIGFyZSBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsXG4gKiBldmVudCBzbyBhIGJhY2tlbmQgY2FuIGVtaXQgbGF0ZW5jeSBtZXRyaWNzIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLFxuICogd2l0aG91dCBleHRyYSBldmVudC1sb2cgcXVlcmllcy5cbiAqXG4gKiBFbGlnaWJpbGl0eSBpcyBkZWNpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgKHdoaWNoIG93bnMgdGhlIGV2ZW50IGxvZykgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9OyB0aGUgZmluYWwgdmFsdWVzIGFyZSBjb21wdXRlZCBieVxuICogYGV4ZWN1dGVTdGVwYCByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeVRyYWNraW5nIHtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiAoZnJvbSB0aGUgcnVuLWlkIFVMSUQsIGZhbGxpbmcgYmFjayB0byB0aGUgcnVuXG4gICAqIHNuYXBzaG90J3MgYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMuXG4gICAqL1xuICB0dGZzQW5jaG9yTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgaW52b2NhdGlvbiBzcGVudCBjb21taXR0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBhaGVhZCBvZiB0aGUgZmlyc3RcbiAgICogc3RlcCBjb21taXRzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gYmF0Y2gpLiBTdWJ0cmFjdGVkIGZyb20gVFRGUyBzbyB0aGVcbiAgICogbWV0cmljIHJlZmxlY3RzIHJ1bnRpbWUgb3ZlcmhlYWQgcmF0aGVyIHRoYW4gdGhlIHVzZXIncyBob29rIHdyaXRlcy5cbiAgICovXG4gIHByZVN0ZXBCbG9ja2luZ01zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGZpcnN0IHByZS1zdGVwIGBhdHRyX3NldGAgd3JpdGUgYmVnYW4gKGl0cyBjbGllbnQtc3RhbXBlZFxuICAgKiBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFdoZW4gcHJlc2VudCwgdGhlIFRURlNcbiAgICogbWVhc3VyZW1lbnQgRU5EUyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0OiBhXG4gICAqIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICAgKiByZXNvbHZlcyB0aHJvdWdoIGFuIGV4dHJhIHJlcGxheSAoc2VlIHRoZSBgaGFzQXR0cmlidXRlRXZlbnRzYCBicmFuY2ggaW5cbiAgICogcnVudGltZS50cyksIHNvIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHdyaXRlIHVudGlsIHRoZSBzdGVwIGJvZHkgcnVucyBpc1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCwgd2hpY2ggaXMgc3VidHJhY3RlZCBieSBlbmRpbmdcbiAgICogdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgc3RlcCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuXG4gICAqIHNjaGVkdWxlZC5cbiAgICovXG4gIHByZVN0ZXBBdHRyU3RhcnRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIHRoZSBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQgd2FzIHJlY29yZGVkIChpdHNcbiAgICogY2xpZW50LXN0YW1wZWQgYG9jY3VycmVkQXRgLCBmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHlcbiAgICogd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFNUU08uXG4gICAqL1xuICBwcmV2U3RlcEVuZE1zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHVuaXF1ZSB0ZXJtaW5hbCBzdGVwcyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBldmVudHMgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nLiAqL1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLLlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFJTRlM6IHRoZSBzYW1lIGVsaWdpYmlsaXR5IGFzXG4gICAqIFRURlMgKHNlZSB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9KSwgcGx1cyBhIHJlY292ZXJhYmxlXG4gICAqIGFuY2hvci4gSW4gdHVyYm8gbW9kZSwgYHJ1bl9zdGFydGVkYCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICogYXdhaXRlZCwgc28gdGhpcyBpcyBzdGFtcGVkIGF0IHRoZSBwb2ludCB0aGUgcnVudGltZSBzeW50aGVzaXplcyB0aGVcbiAgICogcnVuIGxvY2FsbHkgYW5kIGJlZ2lucyByZXBsYXkgaW5zdGVhZCBvZiBhdCB0aGUgcmVhbCByZXNwb25zZTsgdGhlXG4gICAqIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUIGlzIHN0aWxsIGNoYWluZWQgb24gdGhlIHJlYWwgYHJ1bl9zdGFydGVkYFxuICAgKiBwcm9taXNlIChzZWUgc3RlcC1leGVjdXRvci50cyksIHNvIFJTRlMgc3RpbGwgZW5kcyB1cCBtZWFzdXJpbmcgdGhlXG4gICAqIGdlbnVpbmUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcC1QT1NUIHN0cmV0Y2ggZXZlbiB0aG91Z2ggdGhlIHR3b1xuICAgKiBoYWx2ZXMgb3ZlcmxhcCB1bmRlciB0dXJiby5cbiAgICovXG4gIHJzZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3luY2hyb25vdXMgd29ya2Zsb3ctZnVuY3Rpb24gcmVwbGF5XG4gICAqIHRvb2s6IGZyb20gY2FsbGluZyBgcnVuV29ya2Zsb3dgIHRvIGl0IHRocm93aW5nIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICogc2NoZWR1bGVkIHRoaXMgYmF0Y2guIEV4Y2x1ZGVzIGF3YWl0ZWQgbmV0d29yayBJL08gKHRoZSBzdXNwZW5zaW9uJ3NcbiAgICogZXZlbnQgY29tbWl0cywgdGhlIHN0ZXAncyBvd24gc3RhcnQgUE9TVCkuIFByZXNlbnQgb25seSBhbG9uZ3NpZGVcbiAgICogYHJzZnNBbmNob3JNc2AuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHk6IHRoZSBpbnZvY2F0aW9uIHRoYXQgcmVhY2hlZCBhbmRcbiAgICogc2NoZWR1bGVkIHRoZSBmaXJzdCBzdGVwLiBWYWxpZCBSU0ZTIHBhdGhzIGNhbiByZXBsYXkgbW9yZSB0aGFuIG9uY2VcbiAgICogYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlcygpYCBkZXRvdXJcbiAgICogcmVwbGF5cyB0d2ljZSksIGFuZCBhIHJlZGVsaXZlcnkgb21pdHMgZWFybGllciBpbnZvY2F0aW9ucycgcmVwbGF5IHdvcmtcbiAgICogZW50aXJlbHk7IHRoaXMgdmFsdWUgaXMgbm90IGFjY3VtdWxhdGVkIGFjcm9zcyB0aG9zZSBlYXJsaWVyIHBhc3Nlcy5cbiAgICogRG8gbm90IHJlYWQgaXQgYXMgXCJ0aGUgcmVwbGF5IHBvcnRpb24gb2YgUlNGU1wiOiBSU0ZTXG4gICAqICh7QGxpbmsgcnNmc0FuY2hvck1zfSkgY292ZXJzIHRoZSB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwXG4gICAqIHdpbmRvdywgdGhpcyBjb3ZlcnMgb25seSB0aGUgbGFzdCBwYXNzLlxuICAgKi9cbiAgcmVwbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1vc3QgbmVnYXRpdmUgcmF3IGR1cmF0aW9uIHN0aWxsIGF0dHJpYnV0ZWQgdG8gY3Jvc3MtbWFjaGluZSBjbG9jayBza2V3XG4gKiAoYW5kIGNsYW1wZWQgdG8gMCkuIEFueXRoaW5nIG1vcmUgbmVnYXRpdmUgbWVhbnMgYSBjb3JydXB0IGFuY2hvciAoZS5nLiBhXG4gKiBtaXMtZGVjb2RlZCBydW4tSUQgdGltZXN0YW1wKSBhbmQgdGhlIHNhbXBsZSBpcyBkcm9wcGVkIGluc3RlYWQ6IGFcbiAqIHN5c3RlbWF0aWNhbGx5IGNvcnJ1cHQgYW5jaG9yIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYW4gZXhhY3QtemVybyBsYXRlbmN5XG4gKiBvbiBldmVyeSBzYW1wbGUsIHNpbGVudGx5IGRyYWdnaW5nIGVudGlyZSBwZXJjZW50aWxlIGRpc3RyaWJ1dGlvbnMgdG8gMFxuICogcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGFzIG1pc3NpbmcgZGF0YS5cbiAqL1xuY29uc3QgTUFYX0NMT0NLX1NLRVdfTVMgPSA2MF8wMDA7XG5cbi8qKiBMYXRlbmN5IHRlbGVtZXRyeSBhdHRhY2hlZCB0byBhIHN0ZXAncyB0ZXJtaW5hbCBldmVudCdzIGBldmVudERhdGFgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB7XG4gIHR0ZnM/OiBudW1iZXI7XG4gIHN0c28/OiBudW1iZXI7XG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgZXZlbnRDb3VudD86IG51bWJlcjtcbiAgLyoqIENsaWVudC1tZWFzdXJlZCBydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzIHN0YXJ0IFBPU1QsIG1zLiAqL1xuICByc2ZzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ2xpZW50LW1lYXN1cmVkIHdhbGwtY2xvY2sgbXMgb2YgdGhlIEZJTkFMIHJlcGxheSBwYXNzIHRoYXQgc2NoZWR1bGVkXG4gICAqIHRoZSBmaXJzdCBzdGVwIChzZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9KTsgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHByZS1maXJzdC1zdGVwIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmVcbiAgICogcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiBgcnNmc2BcIi5cbiAgICovXG4gIGZpbmFsU2NoZWR1bGluZ1JlcGxheT86IG51bWJlcjtcbiAgb3B0aW1pemF0aW9ucz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgZGlzcXVhbGlmeSBUVEZTIHdoZW4gcHJlc2VudCBpbiB0aGUgZXZlbnQgbG9nIGF0IHRoZSB0aW1lXG4gKiB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBiYXRjaCBpcyBzY2hlZHVsZWQ6XG4gKlxuICogLSBBbnkgc3RlcCBldmVudCBtZWFucyB0aGlzIGlzIG5vdCB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBleGVjdXRpb24uXG4gKiAtIGBob29rX3JlY2VpdmVkYCAvIGB3YWl0X2NyZWF0ZWRgIC8gYHdhaXRfY29tcGxldGVkYCBtZWFuIHRoZSBydW4ncyBwYXRoIHRvXG4gKiAgIHRoZSBmaXJzdCBzdGVwIGRlcGVuZGVkIG9uIHVzZXItZHJpdmVuIHRpbWluZyAoYSB3ZWJob29rIGFycml2aW5nLCBhXG4gKiAgIHNsZWVwIGVsYXBzaW5nKSwgc28gdGhlIG1lYXN1cmVtZW50IHdvdWxkIG5vdCByZWZsZWN0IHJ1bnRpbWUgb3ZlcmhlYWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGFic2VudCwgd2l0aCB0aGVpciBjb3N0IHN1YnRyYWN0ZWQgaW5zdGVhZDpcbiAqXG4gKiAtIGBob29rX2NyZWF0ZWRgOiBhIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBiZWZvcmUgdGhlIGZpcnN0IHN0ZXBcbiAqICAgY29tbWl0cyBpbiB0aGUgc2FtZSBpbnZvY2F0aW9uLCB3aG9zZSBtZWFzdXJlZCBkdXJhdGlvbiBpcyBzdWJ0cmFjdGVkIHZpYVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uXG4gKiAtIGBhdHRyX3NldGAgKHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgKTogcmVzb2x2ZXMgdGhyb3VnaFxuICogICBhbiBleHRyYSByZXBsYXkgYmVmb3JlIHN0ZXBzIHJ1bi4gU3VidHJhY3RlZCBieSBlbmRpbmcgdGhlIG1lYXN1cmVtZW50IGF0XG4gKiAgIHRoZSBmaXJzdCBhdHRyIHdyaXRlJ3MgdGltZXN0YW1wIGluc3RlYWQ7IHNlZVxuICogICB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQXR0clN0YXJ0TXN9LlxuICovXG5jb25zdCBUVEZTX0RJU1FVQUxJRllJTkdfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFxuICBbXG4gICAgJ3N0ZXBfY3JlYXRlZCcsXG4gICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAnc3RlcF9mYWlsZWQnLFxuICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAnaG9va19yZWNlaXZlZCcsXG4gICAgJ3dhaXRfY3JlYXRlZCcsXG4gICAgJ3dhaXRfY29tcGxldGVkJyxcbiAgXVxuKTtcblxuLyoqXG4gKiBEZWNpZGUsIGZyb20gdGhlIG9yY2hlc3RyYXRvcidzIHZpZXcgb2YgdGhlIGV2ZW50IGxvZywgd2hldGhlciB0aGUgaW5saW5lXG4gKiBzdGVwIGJhdGNoIGFib3V0IHRvIGV4ZWN1dGUgcXVhbGlmaWVzIGZvciBUVEZTIGFuZC9vciBTVFNPIG1lYXN1cmVtZW50LlxuICogUmV0dXJucyB1bmRlZmluZWQgd2hlbiBuZWl0aGVyIGFwcGxpZXMuIENhbGxlZCBvbmNlIHBlciBiYXRjaDsgdGhlIHJlc3VsdFxuICogaXMgcGFzc2VkIHRvIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXAgb25seSwgc28gYSBwYXJhbGxlbCBmaXJzdCBiYXRjaCBlbWl0cyBhXG4gKiBzaW5nbGUgc2FtcGxlIHJhdGhlciB0aGFuIG9uZSBwZXIgc2libGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHBhcmFtczoge1xuICAvKiogVGhlIG9yY2hlc3RyYXRvcidzIGN1cnJlbnQgaW4tbWVtb3J5IGV2ZW50IGxvZyAoYXNjZW5kaW5nIG9yZGVyKS4gKi9cbiAgZXZlbnRzOiBFdmVudFtdO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBpbml0aWFsIGV2ZW50IGxvYWQgY29udGFpbmVkIG5vdGhpbmcgYmV5b25kXG4gICAqIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkL2F0dHJfc2V0LiBQcmUtZXhpc3RpbmcgaG9vayBldmVudHMgd2VyZSB3cml0dGVuXG4gICAqIGJ5IGFuIGVhcmxpZXIgaW52b2NhdGlvbiwgc28gdGhlIHRpbWUgdGhleSBhZGRlZCAoaW5jbHVkaW5nIHRoZSBxdWV1ZVxuICAgKiBob3AgYmFjayB0byB0aGlzIGludm9jYXRpb24pIGlzIHVubWVhc3VyYWJsZSBhbmQgZGlzcXVhbGlmaWVzIFRURlMuXG4gICAqIGF0dHJfc2V0IGlzIHBlcm1pdHRlZDogYSByZWRlbGl2ZXJ5IGNhbiBsYW5kIGFmdGVyIGEgY29tbWl0dGVkIHByZS1zdGVwXG4gICAqIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrcyBpcyBzdWJ0cmFjdGVkIHZpYSBgcHJlU3RlcEF0dHJTdGFydE1zYFxuICAgKiByZWdhcmRsZXNzIG9mIHdoaWNoIGludm9jYXRpb24gd3JvdGUgaXQuXG4gICAqL1xuICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuO1xuICAvKiogRXBvY2ggbXMgb2YgcnVuIGNyZWF0aW9uLCBpZiByZWNvdmVyYWJsZS4gQWJzZW50IGRpc3F1YWxpZmllcyBUVEZTLiAqL1xuICBydW5DcmVhdGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLIChvcixcbiAgICogdW5kZXIgdHVyYm8sIHRoZSBpbnN0YW50IHRoZSBydW4gd2FzIHN5bnRoZXNpemVkIGxvY2FsbHk7IHNlZVxuICAgKiB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5yc2ZzQW5jaG9yTXN9KS4gQWJzZW50IGRpc3F1YWxpZmllcyBSU0ZTLlxuICAgKi9cbiAgcnVuU3RhcnRlZFJlY2VpdmVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogV2FsbC1jbG9jayBtcyB0aGlzIHN1c3BlbnNpb24ncyBgcnVuV29ya2Zsb3dgIGNhbGwgc3BlbnQgZXhlY3V0aW5nXG4gICAqIHN5bmNocm9ub3VzbHkgYmVmb3JlIHRocm93aW5nOiB0aGUgRklOQUwgcmVwbGF5IHBhc3Mgb25seSwgbm90XG4gICAqIGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHBhc3Nlcy4gU2VlXG4gICAqIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfS5cbiAgICovXG4gIHJlcGxheU1zOiBudW1iZXI7XG4gIC8qKiBTZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXN9LiAqL1xuICBwcmVTdGVwQmxvY2tpbmdNczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFjY3VtdWxhdG9yJ3MgdmFsdWUgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdCB3cm90ZSB0aGUgcnVuJ3MgZmlyc3RcbiAgICogYXR0cl9zZXQgKGl0cyBob29rIHBoYXNlIHJ1bnMgYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gdGhlXG4gICAqIG1lYXN1cmVtZW50IGVuZHMgYXQgdGhlIGF0dHIgd3JpdGUsIG9ubHkgaG9vayB0aW1lIGZyb20gYmVmb3JlIHRoYXRcbiAgICogcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQ7IGxhdGVyIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWRcbiAgICogd2luZG93LiBVbmRlZmluZWQgd2hlbiBubyBhdHRyIHN1c3BlbnNpb24gaGFwcGVuZWQgaW4gdGhpcyBpbnZvY2F0aW9uXG4gICAqIChlLmcuIHRoZSBhdHRyX3NldCB3YXMgbG9hZGVkIGZyb20gYSByZWRlbGl2ZXJ5J3Mgc25hcHNob3QsIHdoZXJlIG5vXG4gICAqIHNhbWUtaW52b2NhdGlvbiBob29rIHRpbWUgcHJlY2VkZXMgaXQpLlxuICAgKi9cbiAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdXNwZW5zaW9uIHRoYXQgc2NoZWR1bGVkIHRoaXMgYmF0Y2ggYWxzbyBjcmVhdGVkIHdhaXRzLlxuICAgKiBUaG9zZSBgd2FpdF9jcmVhdGVkYCB3cml0ZXMgYXJlIG5vdCBpbiBgZXZlbnRzYCB5ZXQgKHRoZXkgd2VyZSBjb21taXR0ZWRcbiAgICogYnkgdGhpcyBzdXNwZW5zaW9uIHBhc3MpLCBzbyB0aGV5IG11c3QgYmUgcmVwb3J0ZWQgc2VwYXJhdGVseS4gQVxuICAgKiB3YWl0IGRpc3F1YWxpZmllcyBib3RoIG1lYXN1cmVtZW50cy5cbiAgICovXG4gIHN1c3BlbnNpb25IYXNXYWl0czogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHN1c3BlbnNpb24gdGhhdCBzY2hlZHVsZWQgdGhpcyBiYXRjaCBhbHNvIGNyZWF0ZWQgaG9va3NcbiAgICogKGFsc28gbm90IGluIGBldmVudHNgIHlldCkuIEhvb2tzIGtlZXAgVFRGUyBlbGlnaWJsZSAodGhlaXIgbWVhc3VyZWRcbiAgICogd3JpdGUgdGltZSBpcyBzdWJ0cmFjdGVkIHZpYSBgcHJlU3RlcEJsb2NraW5nTXNgKSBidXQgZGlzcXVhbGlmeSBTVFNPLFxuICAgKiB3aGljaCBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGEgcHVyZSBiYWNrLXRvLWJhY2sgc3RlcCBnYXAuXG4gICAqL1xuICBzdXNwZW5zaW9uQ3JlYXRlZEhvb2tzOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0dXJibyBtb2RlIGlzIGFjdGl2ZSBmb3IgdGhpcyBpbnZvY2F0aW9uLiAqL1xuICB0dXJibzogYm9vbGVhbjtcbn0pOiBTdGVwTGF0ZW5jeVRyYWNraW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBldmVudHMgfSA9IHBhcmFtcztcblxuICBsZXQgdHRmc0VsaWdpYmxlID1cbiAgICBwYXJhbXMuaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiAmJlxuICAgIHBhcmFtcy5ydW5DcmVhdGVkQXRNcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgIXBhcmFtcy5zdXNwZW5zaW9uSGFzV2FpdHM7XG4gIGxldCBwcmVTdGVwQXR0clN0YXJ0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWYgKHR0ZnNFbGlnaWJsZSkge1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICBpZiAoVFRGU19ESVNRVUFMSUZZSU5HX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICAgIHR0ZnNFbGlnaWJsZSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcpIHtcbiAgICAgICAgY29uc3QgYXR0clN0YXJ0TXMgPSArKGV2ZW50Lm9jY3VycmVkQXQgPz8gZXZlbnQuY3JlYXRlZEF0KTtcbiAgICAgICAgcHJlU3RlcEF0dHJTdGFydE1zID1cbiAgICAgICAgICBwcmVTdGVwQXR0clN0YXJ0TXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBhdHRyU3RhcnRNc1xuICAgICAgICAgICAgOiBNYXRoLm1pbihwcmVTdGVwQXR0clN0YXJ0TXMsIGF0dHJTdGFydE1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTVFNPOiB0aGUgdHdvIHN0ZXBzIHJhbiBiYWNrLXRvLWJhY2ssIHNvIHRoZSBuZXdlc3Qga25vd24gZXZlbnQgaXMgdGhlXG4gIC8vIHByZXZpb3VzIHN0ZXAncyB0ZXJtaW5hbCBldmVudCwgd2l0aCBub3RoaW5nIChob29rX3JlY2VpdmVkLCB3YWl0cyxcbiAgLy8gYXR0cl9zZXQsIC4uLikgaW4gYmV0d2VlbiBhbmQgdGhpcyBzdXNwZW5zaW9uIHNjaGVkdWxpbmcgbm90aGluZyBidXRcbiAgLy8gc3RlcHMuXG4gIGxldCBwcmV2U3RlcEVuZE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBzdGVwQ291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGV2ZW50Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgbGFzdEV2ZW50ID0gZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXTtcbiAgaWYgKFxuICAgICFwYXJhbXMuc3VzcGVuc2lvbkhhc1dhaXRzICYmXG4gICAgIXBhcmFtcy5zdXNwZW5zaW9uQ3JlYXRlZEhvb2tzICYmXG4gICAgbGFzdEV2ZW50ICYmXG4gICAgKGxhc3RFdmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgIGxhc3RFdmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpXG4gICkge1xuICAgIHByZXZTdGVwRW5kTXMgPSArKGxhc3RFdmVudC5vY2N1cnJlZEF0ID8/IGxhc3RFdmVudC5jcmVhdGVkQXQpO1xuICAgIGNvbnN0IHRlcm1pbmFsU3RlcElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpICYmXG4gICAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIHRlcm1pbmFsU3RlcElkcy5hZGQoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHN0ZXBDb3VudCA9IHRlcm1pbmFsU3RlcElkcy5zaXplO1xuICAgIGV2ZW50Q291bnQgPSBldmVudHMubGVuZ3RoO1xuICB9XG5cbiAgLy8gUlNGUyBzaGFyZXMgVFRGUydzIGVsaWdpYmlsaXR5IGV4YWN0bHkgKHNhbWUgZXZlbnQtbG9nL3dhaXQgY2hlY2tzKSxcbiAgLy8gcGx1cyBpdHMgb3duIGFuY2hvciBiZWluZyByZWNvdmVyYWJsZS5cbiAgY29uc3QgcnNmc0VsaWdpYmxlID1cbiAgICB0dGZzRWxpZ2libGUgJiYgcGFyYW1zLnJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgIT09IHVuZGVmaW5lZDtcblxuICBpZiAoIXR0ZnNFbGlnaWJsZSAmJiBwcmV2U3RlcEVuZE1zID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4odHRmc0VsaWdpYmxlXG4gICAgICA/IHtcbiAgICAgICAgICB0dGZzQW5jaG9yTXM6IHBhcmFtcy5ydW5DcmVhdGVkQXRNcyxcbiAgICAgICAgICAvLyBXaGVuIHRoZSBtZWFzdXJlbWVudCBlbmRzIGF0IHRoZSBmaXJzdCBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAvLyB0aW1lIGZyb20gYmVmb3JlIHRoYXQgcG9pbnQgaXMgaW5zaWRlIHRoZSBtZWFzdXJlZCB3aW5kb3cuXG4gICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXM6XG4gICAgICAgICAgICBwcmVTdGVwQXR0clN0YXJ0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IChwYXJhbXMucHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID8/IDApXG4gICAgICAgICAgICAgIDogcGFyYW1zLnByZVN0ZXBCbG9ja2luZ01zLFxuICAgICAgICAgIC4uLihwcmVTdGVwQXR0clN0YXJ0TXMgIT09IHVuZGVmaW5lZCA/IHsgcHJlU3RlcEF0dHJTdGFydE1zIH0gOiB7fSksXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyc2ZzRWxpZ2libGVcbiAgICAgID8ge1xuICAgICAgICAgIHJzZnNBbmNob3JNczogcGFyYW1zLnJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMsXG4gICAgICAgICAgcmVwbGF5TXM6IHBhcmFtcy5yZXBsYXlNcyxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHByZXZTdGVwRW5kTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHByZXZTdGVwRW5kTXMsIHN0ZXBDb3VudCwgZXZlbnRDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICB0dXJibzogcGFyYW1zLnR1cmJvLFxuICB9O1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIGxhdGVuY3kgdGVsZW1ldHJ5IHRvIGF0dGFjaCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LlxuICogQ2FsbGVkIGJ5IGBleGVjdXRlU3RlcGAgd2l0aCB0aGUgd2FsbC1jbG9jayB0aW1lc3RhbXAgdGFrZW4gaW1tZWRpYXRlbHlcbiAqIGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBydW5zLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG9cbiAqIHJlcG9ydCAobm8gdHJhY2tpbmcsIG9yIGEgcmV0cnkgYXR0ZW1wdDsgcmV0cmllcyBtZWFzdXJlIG5laXRoZXIgVFRGUyBub3JcbiAqIFNUU08pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhKHBhcmFtczoge1xuICB0cmFja2luZzogU3RlcExhdGVuY3lUcmFja2luZyB8IHVuZGVmaW5lZDtcbiAgLyoqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdXNlciBzdGVwIGNvZGUgYmVnYW4gZXhlY3V0aW5nLiAqL1xuICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBgRGF0ZS5ub3coKWAgdGFrZW4gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVFxuICAgKiAoYHN0ZXBfc3RhcnRlZGApIHdhcyBpc3N1ZWQuIFByZXNlbnQgb25seSBmb3IgdGhlIGxhenkgaW5saW5lIHN0ZXBzIFJTRlNcbiAgICogY2FyZXMgYWJvdXQ7IHNlZSB0aGUgY2FsbCBzaXRlcyBpbiBzdGVwLWV4ZWN1dG9yLnRzLlxuICAgKi9cbiAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBzdGVwIHdhcyBzdGFydGVkIGxhemlseSAobm8gc2VwYXJhdGUgc3RlcF9jcmVhdGVkIHdyaXRlKS4gKi9cbiAgbGF6eVN0ZXBTdGFydDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIGJvZHkgcmFuIG9wdGltaXN0aWNhbGx5LCB3aXRob3V0IGF3YWl0aW5nIHN0ZXBfc3RhcnRlZC4gKi9cbiAgb3B0aW1pc3RpY1N0YXJ0OiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RlcCdzIGBzdGVwX2NyZWF0ZWRgICsgYHN0ZXBfc3RhcnRlZGAgcGFpciB3YXMgcHJlLWNsYWltZWRcbiAgICogaW5zaWRlIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIncyBiYXRjaGVkIGZhbi1vdXQgd3JpdGUgKG5vIHN0YXJ0IFBPU1Qgb2ZcbiAgICogaXRzIG93biBhdCBhbGwpLlxuICAgKi9cbiAgcHJlY2xhaW1lZFN0YXJ0PzogYm9vbGVhbjtcbn0pOiBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgdHJhY2tpbmcgfSA9IHBhcmFtcztcbiAgaWYgKCF0cmFja2luZyB8fCBwYXJhbXMuYXR0ZW1wdCAhPT0gMSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBTbWFsbCBuZWdhdGl2ZSBkdXJhdGlvbnMgY2xhbXAgdG8gMDogY3Jvc3MtaW52b2NhdGlvbiB0aW1lc3RhbXBzIGNhblxuICAvLyBjb21lIGZyb20gYW5vdGhlciBtYWNoaW5lJ3MgY2xvY2ssIHNvIGJvdW5kZWQgc2tldyBtdXN0IG5vdCBwcm9kdWNlXG4gIC8vIG5lZ2F0aXZlIHZhbHVlcy4gRHVyYXRpb25zIG1vcmUgbmVnYXRpdmUgdGhhbiBNQVhfQ0xPQ0tfU0tFV19NUyBhcmUgbm90XG4gIC8vIHNrZXcgYnV0IGEgY29ycnVwdCBhbmNob3IsIGFuZCB0aGUgc2FtcGxlIGlzIGRyb3BwZWQgKHNlZSB0aGUgY29uc3RhbnQnc1xuICAvLyBkb2MgY29tbWVudCkuXG4gIC8vXG4gIC8vIEEgcHJlLXN0ZXAgc2V0QXR0cmlidXRlcyBkZXRvdXIgZW5kcyB0aGUgbWVhc3VyZW1lbnQgYXQgdGhlIGZpcnN0IGF0dHJcbiAgLy8gd3JpdGUgaW5zdGVhZCBvZiB0aGUgc3RlcCdzIGNvZGUgc3RhcnQ6IHRoZSByZW1haW5kZXIgaXMgdGhlIGR1cmF0aW9uXG4gIC8vIG9mIHRoZSBzZXRBdHRyaWJ1dGVzIGNhbGwgKHJlc29sdmVkIHZpYSBhbiBleHRyYSByZXBsYXkpLCB3aGljaCBpc1xuICAvLyBzdWJ0cmFjdGVkIHJhdGhlciB0aGFuIGRpc3F1YWxpZnlpbmcgdGhlIHNhbXBsZS4gSW4gdGhhdCBjYXNlXG4gIC8vIGB0cmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc2AgYWxyZWFkeSBob2xkcyBvbmx5IHRoZSBob29rIHRpbWUgZnJvbVxuICAvLyBCRUZPUkUgdGhlIGF0dHIgd3JpdGU7IGhvb2sgd3JpdGVzIGFmdGVyIHRoZSB3aW5kb3cgY2xvc2VkIGFyZSBleGNsdWRlZFxuICAvLyBieSBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyAoc2VlIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcykuXG4gIGNvbnN0IHR0ZnNFbmRNcyA9IHRyYWNraW5nLnByZVN0ZXBBdHRyU3RhcnRNcyA/PyBwYXJhbXMuc3RlcENvZGVTdGFydGVkQXRNcztcbiAgY29uc3QgcmF3VHRmcyA9XG4gICAgdHJhY2tpbmcudHRmc0FuY2hvck1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gdHRmc0VuZE1zIC0gdHJhY2tpbmcudHRmc0FuY2hvck1zIC0gKHRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zID8/IDApXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdHRmcyA9XG4gICAgcmF3VHRmcyAhPT0gdW5kZWZpbmVkICYmIHJhd1R0ZnMgPj0gLU1BWF9DTE9DS19TS0VXX01TXG4gICAgICA/IE1hdGgubWF4KDAsIHJhd1R0ZnMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3U3RzbyA9XG4gICAgdHJhY2tpbmcucHJldlN0ZXBFbmRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHBhcmFtcy5zdGVwQ29kZVN0YXJ0ZWRBdE1zIC0gdHJhY2tpbmcucHJldlN0ZXBFbmRNc1xuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0c28gPVxuICAgIHJhd1N0c28gIT09IHVuZGVmaW5lZCAmJiByYXdTdHNvID49IC1NQVhfQ0xPQ0tfU0tFV19NU1xuICAgICAgPyBNYXRoLm1heCgwLCByYXdTdHNvKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIC8vIFJTRlMgZW5kcyBhdCB0aGUgYWN0dWFsIHN0YXJ0LVBPU1QgaW5zdGFudCwgbm90IGF0IHR0ZnNFbmRNczogdW5saWtlXG4gIC8vIFRURlMgaXQgaXMgbm90IHN1YmplY3QgdG8gdGhlIHByZS1zdGVwIGF0dHItd3JpdGUgc2hvcnRjdXQsIHNvIGFcbiAgLy8gcHJlLXN0ZXAgc2V0QXR0cmlidXRlcyBkZXRvdXIgKHJhcmUpIG1ha2VzIFJTRlMgaW5jbHVkZSB0aGUgZGV0b3VyXG4gIC8vIHdoaWxlIFRURlMgZXhjbHVkZXMgaXQuIGBmaW5hbFNjaGVkdWxpbmdSZXBsYXlgIGlzIGEgZGlyZWN0IHBhc3N0aHJvdWdoXG4gIC8vIG9mIGB0cmFja2luZy5yZXBsYXlNc2AsIHRoZSBGSU5BTCByZXBsYXkgcGFzcyBvbmx5IChzZWVcbiAgLy8gU3RlcExhdGVuY3lUcmFja2luZy5yZXBsYXlNcyksIHNvIG5vIGZ1cnRoZXIgc3VidHJhY3Rpb24gYXBwbGllcywgYnV0XG4gIC8vIGl0IGFsc28gbWVhbnMgaXQgaXMgTk9UIGFjY3VtdWxhdGVkIGFjcm9zcyBhbnkgZWFybGllciBwcmUtZmlyc3Qtc3RlcFxuICAvLyBwYXNzZXMgKGUuZy4gYSBzZXRBdHRyaWJ1dGVzIGRldG91cikgYW5kIG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAgLy8gcmVwbGF5IHBvcnRpb24gb2YgcnNmc1wiOyByc2ZzIGNvdmVycyB0aGUgd2hvbGUgd2luZG93LlxuICAvL1xuICAvLyBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgZHVwbGljYXRlcyB3aGF0IE9URUwgYWxyZWFkeSBjYXB0dXJlcyBvbiB0aGUgcnVuL2ludm9jYXRpb25cbiAgLy8gc3BhbiwgYnV0IGlzIGRlbGliZXJhdGVseSBjb2xsZWN0ZWQgYXMgY2xpZW50IHRlbGVtZXRyeSBzbyB0aGUgc2VydmVyXG4gIC8vIGNhbiBlbWl0IGl0IGFzIGFuIFVOU0FNUExFRCwgZnVsbC1wb3B1bGF0aW9uIG1ldHJpYzogd29ya2Zsb3ctc2VydmVyJ3NcbiAgLy8gc2VydmVyIHNwYW5zIGFyZSBoZWF2aWx5IHNhbXBsZWQgaW4gcHJvZHVjdGlvbiAofjclKSwgYW5kIGNsaWVudCBzcGFuc1xuICAvLyBjYW4ndCBiZSBmaWx0ZXJlZCBieSBTREsgdmVyc2lvbiwgc28gbmVpdGhlciBjYW4gc2VydmUgYXMgdGhlXG4gIC8vIGRhc2hib2FyZCdzIGV4YWN0IFRURlMgZGVjb21wb3NpdGlvbi5cbiAgY29uc3QgcnNmcyA9XG4gICAgdHJhY2tpbmcucnNmc0FuY2hvck1zICE9PSB1bmRlZmluZWQgJiZcbiAgICBwYXJhbXMuc3RlcFN0YXJ0UG9zdFNlbnRBdE1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gTWF0aC5tYXgoMCwgcGFyYW1zLnN0ZXBTdGFydFBvc3RTZW50QXRNcyAtIHRyYWNraW5nLnJzZnNBbmNob3JNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgPVxuICAgIHRyYWNraW5nLnJlcGxheU1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gTWF0aC5tYXgoMCwgdHJhY2tpbmcucmVwbGF5TXMpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBpZiAodHRmcyA9PT0gdW5kZWZpbmVkICYmIHN0c28gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBvcHRpbWl6YXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAodHJhY2tpbmcudHVyYm8pIG9wdGltaXphdGlvbnMucHVzaCgndHVyYm8nKTtcbiAgaWYgKHBhcmFtcy5sYXp5U3RlcFN0YXJ0KSBvcHRpbWl6YXRpb25zLnB1c2goJ2xhenlTdGVwU3RhcnQnKTtcbiAgaWYgKHBhcmFtcy5vcHRpbWlzdGljU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgnb3B0aW1pc3RpY1N0YXJ0Jyk7XG4gIGlmIChwYXJhbXMucHJlY2xhaW1lZFN0YXJ0KSBvcHRpbWl6YXRpb25zLnB1c2goJ3ByZWNsYWltZWRTdGFydCcpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uKHR0ZnMgIT09IHVuZGVmaW5lZCA/IHsgdHRmcyB9IDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgPyB7IHN0c28gfSA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkICYmIHRyYWNraW5nLnN0ZXBDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgc3RlcENvdW50OiB0cmFja2luZy5zdGVwQ291bnQgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCAmJiB0cmFja2luZy5ldmVudENvdW50ICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBldmVudENvdW50OiB0cmFja2luZy5ldmVudENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyc2ZzICE9PSB1bmRlZmluZWQgPyB7IHJzZnMgfSA6IHt9KSxcbiAgICAuLi4oZmluYWxTY2hlZHVsaW5nUmVwbGF5ICE9PSB1bmRlZmluZWQgPyB7IGZpbmFsU2NoZWR1bGluZ1JlcGxheSB9IDoge30pLFxuICAgIG9wdGltaXphdGlvbnMsXG4gIH07XG59XG4iXX0=
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sYXRlbmN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1sYXRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVHQTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUEwQmpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLDhCQUE4QixHQUFvQyxJQUFJLEdBQUcsQ0FDN0U7SUFDRSxjQUFjO0lBQ2QsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGVBQWU7SUFDZixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQTBEMUM7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRTFCLElBQUksWUFBWSxHQUNkLE1BQU0sQ0FBQyxzQkFBc0I7UUFDN0IsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO1FBQ25DLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQzdCLElBQUksa0JBQXNDLENBQUM7SUFDM0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksOEJBQThCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzRCxrQkFBa0I7b0JBQ2hCLGtCQUFrQixLQUFLLFNBQVM7d0JB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b3cvd29ybGQnO1xuXG4vKipcbiAqIENsaWVudC1zaWRlIGxhdGVuY3kgbWVhc3VyZW1lbnQgKFRURlMgLyBTVFNPIC8gUlNGUykgdGhyZWFkZWQgZnJvbSB0aGVcbiAqIG9yY2hlc3RyYXRvcidzIGlubGluZSBleGVjdXRpb24gcGF0aCBpbnRvIGBleGVjdXRlU3RlcGAuXG4gKlxuICogVFRGUyAodGltZS10by1maXJzdC1zdGVwKSBtZWFzdXJlcyBydW4gY3JlYXRpb24g4oaSIHRoZSBmaXJzdCBzdGVwJ3MgYm9keVxuICogYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIFNUU08gKHN0ZXAtdG8tc3RlcCBvdmVyaGVhZCkgbWVhc3VyZXMgdGhlIHByZXZpb3VzXG4gKiBzdGVwJ3MgdGVybWluYWwgZXZlbnQg4oaSIHRoZSBuZXh0IHN0ZXAncyBib2R5IGJlZ2lubmluZyB0byBleGVjdXRlLiBSU0ZTXG4gKiAocnVuLXN0YXJ0ZWQtdG8tZmlyc3Qtc3RlcCkgbWVhc3VyZXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyDihpJcbiAqIHRoZSBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCBiZWluZyBpc3N1ZWQsIGEgc3ViLXdpbmRvdyBvZiBUVEZTIHRoYXRcbiAqIGlzb2xhdGVzIHJlcGxheSBvdmVyaGVhZCBmcm9tIHRoZSBydW4tY3JlYXRpb24gcXVldWUgaG9wOyBgZmluYWxTY2hlZHVsaW5nUmVwbGF5YFxuICogaXMgdGhlIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uLWV4ZWN1dGlvbiBkdXJhdGlvbiBvZiBvbmx5IHRoZSBGSU5BTFxuICogcmVwbGF5IHBhc3Mgd2l0aGluIHRoYXQgd2luZG93ICh0aGUgcGFzcyB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAqIGZpcnN0IHN0ZXApOyBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcHJlLWZpcnN0LXN0ZXAgcGFzc2VzXG4gKiAoc2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zfSksIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXMgXCJ0aGVcbiAqIHJlcGxheSBwb3J0aW9uIG9mIFJTRlNcIi4gQWxsIGFyZSBhdHRhY2hlZCB0byB0aGUgc3RlcCdzIHRlcm1pbmFsXG4gKiBldmVudCBzbyBhIGJhY2tlbmQgY2FuIGVtaXQgbGF0ZW5jeSBtZXRyaWNzIGZyb20gdGhlIGV2ZW50IHdyaXRlIGFsb25lLFxuICogd2l0aG91dCBleHRyYSBldmVudC1sb2cgcXVlcmllcy5cbiAqXG4gKiBFbGlnaWJpbGl0eSBpcyBkZWNpZGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgKHdoaWNoIG93bnMgdGhlIGV2ZW50IGxvZykgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9OyB0aGUgZmluYWwgdmFsdWVzIGFyZSBjb21wdXRlZCBieVxuICogYGV4ZWN1dGVTdGVwYCByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnMgdmlhXG4gKiB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTGF0ZW5jeVRyYWNraW5nIHtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIG9mIHJ1biBjcmVhdGlvbiAoZnJvbSB0aGUgcnVuLWlkIFVMSUQsIGZhbGxpbmcgYmFjayB0byB0aGUgcnVuXG4gICAqIHNuYXBzaG90J3MgYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMuXG4gICAqL1xuICB0dGZzQW5jaG9yTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgaW52b2NhdGlvbiBzcGVudCBjb21taXR0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50c1xuICAgKiBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vaygpYCBhaGVhZCBvZiB0aGUgZmlyc3RcbiAgICogc3RlcCBjb21taXRzIGluIHRoZSBzYW1lIHN1c3BlbnNpb24gYmF0Y2gpLiBTdWJ0cmFjdGVkIGZyb20gVFRGUyBzbyB0aGVcbiAgICogbWV0cmljIHJlZmxlY3RzIHJ1bnRpbWUgb3ZlcmhlYWQgcmF0aGVyIHRoYW4gdGhlIHVzZXIncyBob29rIHdyaXRlcy5cbiAgICovXG4gIHByZVN0ZXBCbG9ja2luZ01zPzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGZpcnN0IHByZS1zdGVwIGBhdHRyX3NldGAgd3JpdGUgYmVnYW4gKGl0cyBjbGllbnQtc3RhbXBlZFxuICAgKiBgb2NjdXJyZWRBdGAsIGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCkuIFdoZW4gcHJlc2VudCwgdGhlIFRURlNcbiAgICogbWVhc3VyZW1lbnQgRU5EUyBoZXJlIGluc3RlYWQgb2YgYXQgdGhlIHN0ZXAncyBjb2RlIHN0YXJ0OiBhXG4gICAqIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICAgKiByZXNvbHZlcyB0aHJvdWdoIGFuIGV4dHJhIHJlcGxheSAoc2VlIHRoZSBgaGFzQXR0cmlidXRlRXZlbnRzYCBicmFuY2ggaW5cbiAgICogcnVudGltZS50cyksIHNvIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHdyaXRlIHVudGlsIHRoZSBzdGVwIGJvZHkgcnVucyBpc1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCwgd2hpY2ggaXMgc3VidHJhY3RlZCBieSBlbmRpbmdcbiAgICogdGhlIG1lYXN1cmVtZW50IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgc3RlcCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBiZWVuXG4gICAqIHNjaGVkdWxlZC5cbiAgICovXG4gIHByZVN0ZXBBdHRyU3RhcnRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEVwb2NoIG1zIHRoZSBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQgd2FzIHJlY29yZGVkIChpdHNcbiAgICogY2xpZW50LXN0YW1wZWQgYG9jY3VycmVkQXRgLCBmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLiBQcmVzZW50IG9ubHlcbiAgICogd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFNUU08uXG4gICAqL1xuICBwcmV2U3RlcEVuZE1zPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHVuaXF1ZSB0ZXJtaW5hbCBzdGVwcyBhbHJlYWR5IGluIHRoZSBldmVudCBsb2cuICovXG4gIHN0ZXBDb3VudD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBldmVudHMgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nLiAqL1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZCBieSB0aGUgU0RLLlxuICAgKiBQcmVzZW50IG9ubHkgd2hlbiB0aGUgc3RlcCBxdWFsaWZpZXMgZm9yIFJTRlM6IHRoZSBzYW1lIGVsaWdpYmlsaXR5IGFzXG4gICAqIFRURlMgKHNlZSB7QGxpbmsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmd9KSwgcGx1cyBhIHJlY292ZXJhYmxlXG4gICAqIGFuY2hvci4gSW4gdHVyYm8gbW9kZSwgYHJ1bl9zdGFydGVkYCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICogYXdhaXRlZCwgc28gdGhpcyBpcyBzdGFtcGVkIGF0IHRoZSBwb2ludCB0aGUgcnVudGltZSBzeW50aGVzaXplcyB0aGVcbiAgICogcnVuIGxvY2FsbHkgYW5kIGJlZ2lucyByZXBsYXkgaW5zdGVhZCBvZiBhdCB0aGUgcmVhbCByZXNwb25zZTsgdGhlXG4gICAqIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUIGlzIHN0aWxsIGNoYWluZWQgb24gdGhlIHJlYWwgYHJ1bl9zdGFydGVkYFxuICAgKiBwcm9taXNlIChzZWUgc3RlcC1leGVjdXRvci50cyksIHNvIFJTRlMgc3RpbGwgZW5kcyB1cCBtZWFzdXJpbmcgdGhlXG4gICAqIGdlbnVpbmUgcnVuX3N0YXJ0ZWQtdG8tZmlyc3Qtc3RlcC1QT1NUIHN0cmV0Y2ggZXZlbiB0aG91Z2ggdGhlIHR3b1xuICAgKiBoYWx2ZXMgb3ZlcmxhcCB1bmRlciB0dXJiby5cbiAgICovXG4gIHJzZnNBbmNob3JNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdhbGwtY2xvY2sgbXMgdGhpcyBpbnZvY2F0aW9uJ3Mgc3luY2hyb25vdXMgd29ya2Zsb3ctZnVuY3Rpb24gcmVwbGF5XG4gICAqIHRvb2s6IGZyb20gY2FsbGluZyBgcnVuV29ya2Zsb3dgIHRvIGl0IHRocm93aW5nIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICogc2NoZWR1bGVkIHRoaXMgYmF0Y2guIEV4Y2x1ZGVzIGF3YWl0ZWQgbmV0d29yayBJL08gKHRoZSBzdXNwZW5zaW9uJ3NcbiAgICogZXZlbnQgY29tbWl0cywgdGhlIHN0ZXAncyBvd24gc3RhcnQgUE9TVCkuIFJlcG9ydGVkIGZvciBldmVyeSBiYXRjaCB0aGF0XG4gICAqIHF1YWxpZmllcyBmb3IgVFRGUyBvciBTVFNPLCBub3QganVzdCB0aGUgZmlyc3Qgc3RlcC5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgRklOQUwgcGFzcyBvbmx5OiB0aGUgb25lIHRoYXQgcmVhY2hlZCBhbmQgc2NoZWR1bGVkIHRoaXNcbiAgICogYmF0Y2guIFZhbGlkIFJTRlMgcGF0aHMgY2FuIHJlcGxheSBtb3JlIHRoYW4gb25jZSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXBcbiAgICogKGUuZy4gYSB3b3JrZmxvdy1ib2R5IGBzZXRBdHRyaWJ1dGVzKClgIGRldG91ciByZXBsYXlzIHR3aWNlKSwgYW5kIGFcbiAgICogcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyByZXBsYXkgd29yayBlbnRpcmVseTsgdGhpcyB2YWx1ZSBpc1xuICAgKiBub3QgYWNjdW11bGF0ZWQgYWNyb3NzIHRob3NlIGVhcmxpZXIgcGFzc2VzLiBEbyBub3QgcmVhZCBpdCBhcyBcInRoZVxuICAgKiByZXBsYXkgcG9ydGlvbiBvZiBSU0ZTXCI6IFJTRlMgKHtAbGluayByc2ZzQW5jaG9yTXN9KSBjb3ZlcnMgdGhlIHdob2xlXG4gICAqIHJ1bl9zdGFydGVkLXRvLWZpcnN0LXN0ZXAgd2luZG93LCB0aGlzIGNvdmVycyBvbmx5IHRoZSBsYXN0IHBhc3MuXG4gICAqXG4gICAqIE9uIGEgcmV0YWluZWQgcmVzdW1lIHRoaXMgbWVhc3VyZXMgdGhlIHJlc3VtZSwgbm90IGEgcmVwbGF5LCB3aGljaCBpc1xuICAgKiB3aHkgdGhlIGRpc3RyaWJ1dGlvbiBpcyBiaW1vZGFsIGFuZCB3aHkge0BsaW5rIHJldGFpbmVkfSBpcyByZXBvcnRlZFxuICAgKiBhbG9uZ3NpZGUgaXQgYXMgdGhlIGRpbWVuc2lvbiB0aGF0IHNlcGFyYXRlcyB0aGUgdHdvIG1vZGVzLlxuICAgKi9cbiAgcmVwbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciBhIHJldGFpbmVkIFZNIHNlc3Npb24gc2VydmVkIHRoaXMgYmF0Y2gsIGFzIG9wcG9zZWQgdG8gYSBmdWxsXG4gICAqIHJlcGxheSBmcm9tIHRoZSBldmVudCBsb2cuIFJlcG9ydGVkIGFzIGEgYHJldGFpbmVkYCBlbnRyeSBpblxuICAgKiB7QGxpbmsgU3RlcExhdGVuY3lFdmVudERhdGEub3B0aW1pemF0aW9uc30sIGFsb25nc2lkZSBgdHVyYm9gLlxuICAgKi9cbiAgcmV0YWluZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW9zdCBuZWdhdGl2ZSByYXcgZHVyYXRpb24gc3RpbGwgYXR0cmlidXRlZCB0byBjcm9zcy1tYWNoaW5lIGNsb2NrIHNrZXdcbiAqIChhbmQgY2xhbXBlZCB0byAwKS4gQW55dGhpbmcgbW9yZSBuZWdhdGl2ZSBtZWFucyBhIGNvcnJ1cHQgYW5jaG9yIChlLmcuIGFcbiAqIG1pcy1kZWNvZGVkIHJ1bi1JRCB0aW1lc3RhbXApIGFuZCB0aGUgc2FtcGxlIGlzIGRyb3BwZWQgaW5zdGVhZDogYVxuICogc3lzdGVtYXRpY2FsbHkgY29ycnVwdCBhbmNob3Igd291bGQgb3RoZXJ3aXNlIHJlcG9ydCBhbiBleGFjdC16ZXJvIGxhdGVuY3lcbiAqIG9uIGV2ZXJ5IHNhbXBsZSwgc2lsZW50bHkgZHJhZ2dpbmcgZW50aXJlIHBlcmNlbnRpbGUgZGlzdHJpYnV0aW9ucyB0byAwXG4gKiByYXRoZXIgdGhhbiBzdXJmYWNpbmcgYXMgbWlzc2luZyBkYXRhLlxuICovXG5jb25zdCBNQVhfQ0xPQ0tfU0tFV19NUyA9IDYwXzAwMDtcblxuLyoqIExhdGVuY3kgdGVsZW1ldHJ5IGF0dGFjaGVkIHRvIGEgc3RlcCdzIHRlcm1pbmFsIGV2ZW50J3MgYGV2ZW50RGF0YWAuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBMYXRlbmN5RXZlbnREYXRhIHtcbiAgdHRmcz86IG51bWJlcjtcbiAgc3Rzbz86IG51bWJlcjtcbiAgc3RlcENvdW50PzogbnVtYmVyO1xuICBldmVudENvdW50PzogbnVtYmVyO1xuICAvKiogQ2xpZW50LW1lYXN1cmVkIHJ1bl9zdGFydGVkIOKGkiBmaXJzdCBzdGVwJ3Mgc3RhcnQgUE9TVCwgbXMuICovXG4gIHJzZnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDbGllbnQtbWVhc3VyZWQgd2FsbC1jbG9jayBtcyBvZiB0aGUgRklOQUwgcGFzcyB0aGF0IHNjaGVkdWxlZCB0aGlzXG4gICAqIGJhdGNoIChzZWUge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9KTsgbm90IGFjY3VtdWxhdGVkXG4gICAqIGFjcm9zcyBlYXJsaWVyIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmUgcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZlxuICAgKiBgcnNmc2BcIi4gUHJlc2VudCB3aGVuZXZlciBgdHRmc2Agb3IgYHN0c29gIGlzLlxuICAgKi9cbiAgZmluYWxTY2hlZHVsaW5nUmVwbGF5PzogbnVtYmVyO1xuICAvKipcbiAgICogQWN0aXZlIHJ1bnRpbWUgbW9kZXMgZm9yIHRoaXMgbWVhc3VyZW1lbnQ6IGB0dXJib2AsIGBsYXp5U3RlcFN0YXJ0YCxcbiAgICogYG9wdGltaXN0aWNTdGFydGAsIGFuZCBgcmV0YWluZWRgIChhIHJldGFpbmVkIFZNIHNlcnZlZCB0aGUgYmF0Y2g7IGl0c1xuICAgKiBhYnNlbmNlIG1lYW5zIGEgZnVsbCByZXBsYXkpLiBUaGUgc2VydmVyIHR1cm5zIGVhY2gga25vd24gZW50cnkgaW50byBhXG4gICAqIGJvdW5kZWQgYm9vbGVhbiB0YWcgb24gZXZlcnkgbGF0ZW5jeSBtZXRyaWMuXG4gICAqL1xuICBvcHRpbWl6YXRpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgdGhhdCBkaXNxdWFsaWZ5IFRURlMgd2hlbiBwcmVzZW50IGluIHRoZSBldmVudCBsb2cgYXQgdGhlIHRpbWVcbiAqIHRoZSBydW4ncyBmaXJzdCBzdGVwIGJhdGNoIGlzIHNjaGVkdWxlZDpcbiAqXG4gKiAtIEFueSBzdGVwIGV2ZW50IG1lYW5zIHRoaXMgaXMgbm90IHRoZSBydW4ncyBmaXJzdCBzdGVwIGV4ZWN1dGlvbi5cbiAqIC0gYGhvb2tfcmVjZWl2ZWRgIC8gYHdhaXRfY3JlYXRlZGAgLyBgd2FpdF9jb21wbGV0ZWRgIG1lYW4gdGhlIHJ1bidzIHBhdGggdG9cbiAqICAgdGhlIGZpcnN0IHN0ZXAgZGVwZW5kZWQgb24gdXNlci1kcml2ZW4gdGltaW5nIChhIHdlYmhvb2sgYXJyaXZpbmcsIGFcbiAqICAgc2xlZXAgZWxhcHNpbmcpLCBzbyB0aGUgbWVhc3VyZW1lbnQgd291bGQgbm90IHJlZmxlY3QgcnVudGltZSBvdmVyaGVhZC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgYWJzZW50LCB3aXRoIHRoZWlyIGNvc3Qgc3VidHJhY3RlZCBpbnN0ZWFkOlxuICpcbiAqIC0gYGhvb2tfY3JlYXRlZGA6IGEgZmlyZS1hbmQtZm9yZ2V0IGBjcmVhdGVIb29rKClgIGJlZm9yZSB0aGUgZmlyc3Qgc3RlcFxuICogICBjb21taXRzIGluIHRoZSBzYW1lIGludm9jYXRpb24sIHdob3NlIG1lYXN1cmVkIGR1cmF0aW9uIGlzIHN1YnRyYWN0ZWQgdmlhXG4gKiAgIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zfS5cbiAqIC0gYGF0dHJfc2V0YCAod29ya2Zsb3ctYm9keSBgc2V0QXR0cmlidXRlc2ApOiByZXNvbHZlcyB0aHJvdWdoXG4gKiAgIGFuIGV4dHJhIHJlcGxheSBiZWZvcmUgc3RlcHMgcnVuLiBTdWJ0cmFjdGVkIGJ5IGVuZGluZyB0aGUgbWVhc3VyZW1lbnQgYXRcbiAqICAgdGhlIGZpcnN0IGF0dHIgd3JpdGUncyB0aW1lc3RhbXAgaW5zdGVhZDsgc2VlXG4gKiAgIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnByZVN0ZXBBdHRyU3RhcnRNc30uXG4gKi9cbmNvbnN0IFRURlNfRElTUVVBTElGWUlOR19FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoXG4gIFtcbiAgICAnc3RlcF9jcmVhdGVkJyxcbiAgICAnc3RlcF9zdGFydGVkJyxcbiAgICAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICdob29rX3JlY2VpdmVkJyxcbiAgICAnd2FpdF9jcmVhdGVkJyxcbiAgICAnd2FpdF9jb21wbGV0ZWQnLFxuICBdXG4pO1xuXG4vKipcbiAqIERlY2lkZSwgZnJvbSB0aGUgb3JjaGVzdHJhdG9yJ3MgdmlldyBvZiB0aGUgZXZlbnQgbG9nLCB3aGV0aGVyIHRoZSBpbmxpbmVcbiAqIHN0ZXAgYmF0Y2ggYWJvdXQgdG8gZXhlY3V0ZSBxdWFsaWZpZXMgZm9yIFRURlMgYW5kL29yIFNUU08gbWVhc3VyZW1lbnQuXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIG5laXRoZXIgYXBwbGllcy4gQ2FsbGVkIG9uY2UgcGVyIGJhdGNoOyB0aGUgcmVzdWx0XG4gKiBpcyBwYXNzZWQgdG8gdGhlIGJhdGNoJ3MgZmlyc3Qgc3RlcCBvbmx5LCBzbyBhIHBhcmFsbGVsIGZpcnN0IGJhdGNoIGVtaXRzIGFcbiAqIHNpbmdsZSBzYW1wbGUgcmF0aGVyIHRoYW4gb25lIHBlciBzaWJsaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcocGFyYW1zOiB7XG4gIC8qKiBUaGUgb3JjaGVzdHJhdG9yJ3MgY3VycmVudCBpbi1tZW1vcnkgZXZlbnQgbG9nIChhc2NlbmRpbmcgb3JkZXIpLiAqL1xuICBldmVudHM6IEV2ZW50W107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaW52b2NhdGlvbidzIGluaXRpYWwgZXZlbnQgbG9hZCBjb250YWluZWQgbm90aGluZyBiZXlvbmRcbiAgICogcnVuX2NyZWF0ZWQvcnVuX3N0YXJ0ZWQvYXR0cl9zZXQuIFByZS1leGlzdGluZyBob29rIGV2ZW50cyB3ZXJlIHdyaXR0ZW5cbiAgICogYnkgYW4gZWFybGllciBpbnZvY2F0aW9uLCBzbyB0aGUgdGltZSB0aGV5IGFkZGVkIChpbmNsdWRpbmcgdGhlIHF1ZXVlXG4gICAqIGhvcCBiYWNrIHRvIHRoaXMgaW52b2NhdGlvbikgaXMgdW5tZWFzdXJhYmxlIGFuZCBkaXNxdWFsaWZpZXMgVFRGUy5cbiAgICogYXR0cl9zZXQgaXMgcGVybWl0dGVkOiBhIHJlZGVsaXZlcnkgY2FuIGxhbmQgYWZ0ZXIgYSBjb21taXR0ZWQgcHJlLXN0ZXBcbiAgICogYXR0cl9zZXQsIGFuZCB0aGUgZGV0b3VyIGl0IG1hcmtzIGlzIHN1YnRyYWN0ZWQgdmlhIGBwcmVTdGVwQXR0clN0YXJ0TXNgXG4gICAqIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggaW52b2NhdGlvbiB3cm90ZSBpdC5cbiAgICovXG4gIGludm9jYXRpb25TdGFydGVkQ2xlYW46IGJvb2xlYW47XG4gIC8qKiBFcG9jaCBtcyBvZiBydW4gY3JlYXRpb24sIGlmIHJlY292ZXJhYmxlLiBBYnNlbnQgZGlzcXVhbGlmaWVzIFRURlMuICovXG4gIHJ1bkNyZWF0ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBFcG9jaCBtcyB0aGUgYHJ1bl9zdGFydGVkYCByZXNwb25zZSB3YXMgcmVjZWl2ZWQvcGFyc2VkIGJ5IHRoZSBTREsgKG9yLFxuICAgKiB1bmRlciB0dXJibywgdGhlIGluc3RhbnQgdGhlIHJ1biB3YXMgc3ludGhlc2l6ZWQgbG9jYWxseTsgc2VlXG4gICAqIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJzZnNBbmNob3JNc30pLiBBYnNlbnQgZGlzcXVhbGlmaWVzIFJTRlMuXG4gICAqL1xuICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIG1zIHRoaXMgc3VzcGVuc2lvbidzIGBydW5Xb3JrZmxvd2AgY2FsbCBzcGVudCBleGVjdXRpbmdcbiAgICogc3luY2hyb25vdXNseSBiZWZvcmUgdGhyb3dpbmc6IHRoZSBGSU5BTCByZXBsYXkgcGFzcyBvbmx5LCBub3RcbiAgICogYWNjdW11bGF0ZWQgYWNyb3NzIGVhcmxpZXIgcGFzc2VzLiBTZWVcbiAgICoge0BsaW5rIFN0ZXBMYXRlbmN5VHJhY2tpbmcucmVwbGF5TXN9LlxuICAgKi9cbiAgcmVwbGF5TXM6IG51bWJlcjtcbiAgLyoqIFNlZSB7QGxpbmsgU3RlcExhdGVuY3lUcmFja2luZy5wcmVTdGVwQmxvY2tpbmdNc30uICovXG4gIHByZVN0ZXBCbG9ja2luZ01zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYWNjdW11bGF0b3IncyB2YWx1ZSBhcyBvZiB0aGUgc3VzcGVuc2lvbiB0aGF0IHdyb3RlIHRoZSBydW4ncyBmaXJzdFxuICAgKiBhdHRyX3NldCAoaXRzIGhvb2sgcGhhc2UgcnVucyBiZWZvcmUgaXRzIGF0dHIgd3JpdGVzKS4gV2hlbiB0aGVcbiAgICogbWVhc3VyZW1lbnQgZW5kcyBhdCB0aGUgYXR0ciB3cml0ZSwgb25seSBob29rIHRpbWUgZnJvbSBiZWZvcmUgdGhhdFxuICAgKiBwb2ludCBtYXkgYmUgc3VidHJhY3RlZDsgbGF0ZXIgaG9vayB3cml0ZXMgZmFsbCBvdXRzaWRlIHRoZSBtZWFzdXJlZFxuICAgKiB3aW5kb3cuIFVuZGVmaW5lZCB3aGVuIG5vIGF0dHIgc3VzcGVuc2lvbiBoYXBwZW5lZCBpbiB0aGlzIGludm9jYXRpb25cbiAgICogKGUuZy4gdGhlIGF0dHJfc2V0IHdhcyBsb2FkZWQgZnJvbSBhIHJlZGVsaXZlcnkncyBzbmFwc2hvdCwgd2hlcmUgbm9cbiAgICogc2FtZS1pbnZvY2F0aW9uIGhvb2sgdGltZSBwcmVjZWRlcyBpdCkuXG4gICAqL1xuICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHN1c3BlbnNpb24gdGhhdCBzY2hlZHVsZWQgdGhpcyBiYXRjaCBhbHNvIGNyZWF0ZWQgd2FpdHMuXG4gICAqIFRob3NlIGB3YWl0X2NyZWF0ZWRgIHdyaXRlcyBhcmUgbm90IGluIGBldmVudHNgIHlldCAodGhleSB3ZXJlIGNvbW1pdHRlZFxuICAgKiBieSB0aGlzIHN1c3BlbnNpb24gcGFzcyksIHNvIHRoZXkgbXVzdCBiZSByZXBvcnRlZCBzZXBhcmF0ZWx5LiBBXG4gICAqIHdhaXQgZGlzcXVhbGlmaWVzIGJvdGggbWVhc3VyZW1lbnRzLlxuICAgKi9cbiAgc3VzcGVuc2lvbkhhc1dhaXRzOiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3VzcGVuc2lvbiB0aGF0IHNjaGVkdWxlZCB0aGlzIGJhdGNoIGFsc28gY3JlYXRlZCBob29rc1xuICAgKiAoYWxzbyBub3QgaW4gYGV2ZW50c2AgeWV0KS4gSG9va3Mga2VlcCBUVEZTIGVsaWdpYmxlICh0aGVpciBtZWFzdXJlZFxuICAgKiB3cml0ZSB0aW1lIGlzIHN1YnRyYWN0ZWQgdmlhIGBwcmVTdGVwQmxvY2tpbmdNc2ApIGJ1dCBkaXNxdWFsaWZ5IFNUU08sXG4gICAqIHdoaWNoIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBwdXJlIGJhY2stdG8tYmFjayBzdGVwIGdhcC5cbiAgICovXG4gIHN1c3BlbnNpb25DcmVhdGVkSG9va3M6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHR1cmJvIG1vZGUgaXMgYWN0aXZlIGZvciB0aGlzIGludm9jYXRpb24uICovXG4gIHR1cmJvOiBib29sZWFuO1xuICAvKiogU2VlIHtAbGluayBTdGVwTGF0ZW5jeVRyYWNraW5nLnJldGFpbmVkfS4gKi9cbiAgcmV0YWluZWQ6IGJvb2xlYW47XG59KTogU3RlcExhdGVuY3lUcmFja2luZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZXZlbnRzIH0gPSBwYXJhbXM7XG5cbiAgbGV0IHR0ZnNFbGlnaWJsZSA9XG4gICAgcGFyYW1zLmludm9jYXRpb25TdGFydGVkQ2xlYW4gJiZcbiAgICBwYXJhbXMucnVuQ3JlYXRlZEF0TXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICFwYXJhbXMuc3VzcGVuc2lvbkhhc1dhaXRzO1xuICBsZXQgcHJlU3RlcEF0dHJTdGFydE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlmICh0dGZzRWxpZ2libGUpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKFRURlNfRElTUVVBTElGWUlOR19FVkVOVF9UWVBFUy5oYXMoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgICB0dGZzRWxpZ2libGUgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnKSB7XG4gICAgICAgIGNvbnN0IGF0dHJTdGFydE1zID0gKyhldmVudC5vY2N1cnJlZEF0ID8/IGV2ZW50LmNyZWF0ZWRBdCk7XG4gICAgICAgIHByZVN0ZXBBdHRyU3RhcnRNcyA9XG4gICAgICAgICAgcHJlU3RlcEF0dHJTdGFydE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYXR0clN0YXJ0TXNcbiAgICAgICAgICAgIDogTWF0aC5taW4ocHJlU3RlcEF0dHJTdGFydE1zLCBhdHRyU3RhcnRNcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gU1RTTzogdGhlIHR3byBzdGVwcyByYW4gYmFjay10by1iYWNrLCBzbyB0aGUgbmV3ZXN0IGtub3duIGV2ZW50IGlzIHRoZVxuICAvLyBwcmV2aW91cyBzdGVwJ3MgdGVybWluYWwgZXZlbnQsIHdpdGggbm90aGluZyAoaG9va19yZWNlaXZlZCwgd2FpdHMsXG4gIC8vIGF0dHJfc2V0LCAuLi4pIGluIGJldHdlZW4gYW5kIHRoaXMgc3VzcGVuc2lvbiBzY2hlZHVsaW5nIG5vdGhpbmcgYnV0XG4gIC8vIHN0ZXBzLlxuICBsZXQgcHJldlN0ZXBFbmRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RlcENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBldmVudENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGxhc3RFdmVudCA9IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV07XG4gIGlmIChcbiAgICAhcGFyYW1zLnN1c3BlbnNpb25IYXNXYWl0cyAmJlxuICAgICFwYXJhbXMuc3VzcGVuc2lvbkNyZWF0ZWRIb29rcyAmJlxuICAgIGxhc3RFdmVudCAmJlxuICAgIChsYXN0RXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICBsYXN0RXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKVxuICApIHtcbiAgICBwcmV2U3RlcEVuZE1zID0gKyhsYXN0RXZlbnQub2NjdXJyZWRBdCA/PyBsYXN0RXZlbnQuY3JlYXRlZEF0KTtcbiAgICBjb25zdCB0ZXJtaW5hbFN0ZXBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgaWYgKFxuICAgICAgICAoZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKSAmJlxuICAgICAgICBldmVudC5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICB0ZXJtaW5hbFN0ZXBJZHMuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdGVwQ291bnQgPSB0ZXJtaW5hbFN0ZXBJZHMuc2l6ZTtcbiAgICBldmVudENvdW50ID0gZXZlbnRzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIFJTRlMgc2hhcmVzIFRURlMncyBlbGlnaWJpbGl0eSBleGFjdGx5IChzYW1lIGV2ZW50LWxvZy93YWl0IGNoZWNrcyksXG4gIC8vIHBsdXMgaXRzIG93biBhbmNob3IgYmVpbmcgcmVjb3ZlcmFibGUuXG4gIGNvbnN0IHJzZnNFbGlnaWJsZSA9XG4gICAgdHRmc0VsaWdpYmxlICYmIHBhcmFtcy5ydW5TdGFydGVkUmVjZWl2ZWRBdE1zICE9PSB1bmRlZmluZWQ7XG5cbiAgaWYgKCF0dGZzRWxpZ2libGUgJiYgcHJldlN0ZXBFbmRNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uKHR0ZnNFbGlnaWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgdHRmc0FuY2hvck1zOiBwYXJhbXMucnVuQ3JlYXRlZEF0TXMsXG4gICAgICAgICAgLy8gV2hlbiB0aGUgbWVhc3VyZW1lbnQgZW5kcyBhdCB0aGUgZmlyc3QgYXR0ciB3cml0ZSwgb25seSBob29rXG4gICAgICAgICAgLy8gdGltZSBmcm9tIGJlZm9yZSB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ01zOlxuICAgICAgICAgICAgcHJlU3RlcEF0dHJTdGFydE1zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAocGFyYW1zLnByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA/PyAwKVxuICAgICAgICAgICAgICA6IHBhcmFtcy5wcmVTdGVwQmxvY2tpbmdNcyxcbiAgICAgICAgICAuLi4ocHJlU3RlcEF0dHJTdGFydE1zICE9PSB1bmRlZmluZWQgPyB7IHByZVN0ZXBBdHRyU3RhcnRNcyB9IDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocnNmc0VsaWdpYmxlID8geyByc2ZzQW5jaG9yTXM6IHBhcmFtcy5ydW5TdGFydGVkUmVjZWl2ZWRBdE1zIH0gOiB7fSksXG4gICAgLi4uKHByZXZTdGVwRW5kTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHByZXZTdGVwRW5kTXMsIHN0ZXBDb3VudCwgZXZlbnRDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICAvLyBOb3QgZ2F0ZWQgb24gcnNmc0VsaWdpYmxlOiByZXBsYXkgY29zdCBpcyBtZWFuaW5nZnVsIGZvciBldmVyeSBiYXRjaFxuICAgIC8vIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cmFja2luZyBmb3IuIEdhdGluZyBpdCBvbiBSU0ZTIGxlZnQgdGhlIFNUU09cbiAgICAvLyBwb3B1bGF0aW9uIOKAlCBvcmRpbmFyeSBzdGVwLXRvLXN0ZXAgdHJhbnNpdGlvbnMsIHRoZSBidWxrIG9mIHN0ZXBcbiAgICAvLyBzY2hlZHVsaW5nIOKAlCB3aXRoIG5vIHJlcGxheS1jb3N0IHRlbGVtZXRyeSBhdCBhbGwuXG4gICAgcmVwbGF5TXM6IHBhcmFtcy5yZXBsYXlNcyxcbiAgICB0dXJibzogcGFyYW1zLnR1cmJvLFxuICAgIHJldGFpbmVkOiBwYXJhbXMucmV0YWluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGF0ZW5jeSB0ZWxlbWV0cnkgdG8gYXR0YWNoIHRvIHRoZSBzdGVwJ3MgdGVybWluYWwgZXZlbnQuXG4gKiBDYWxsZWQgYnkgYGV4ZWN1dGVTdGVwYCB3aXRoIHRoZSB3YWxsLWNsb2NrIHRpbWVzdGFtcCB0YWtlbiBpbW1lZGlhdGVseVxuICogYmVmb3JlIHVzZXIgc3RlcCBjb2RlIHJ1bnMuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0b1xuICogcmVwb3J0IChubyB0cmFja2luZywgb3IgYSByZXRyeSBhdHRlbXB0OyByZXRyaWVzIG1lYXN1cmUgbmVpdGhlciBUVEZTIG5vclxuICogU1RTTykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEocGFyYW1zOiB7XG4gIHRyYWNraW5nOiBTdGVwTGF0ZW5jeVRyYWNraW5nIHwgdW5kZWZpbmVkO1xuICAvKiogYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIHN0ZXAgY29kZSBiZWdhbiBleGVjdXRpbmcuICovXG4gIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAncyBzdGFydCBQT1NUXG4gICAqIChgc3RlcF9zdGFydGVkYCkgd2FzIGlzc3VlZC4gUHJlc2VudCBvbmx5IGZvciB0aGUgbGF6eSBpbmxpbmUgc3RlcHMgUlNGU1xuICAgKiBjYXJlcyBhYm91dDsgc2VlIHRoZSBjYWxsIHNpdGVzIGluIHN0ZXAtZXhlY3V0b3IudHMuXG4gICAqL1xuICBzdGVwU3RhcnRQb3N0U2VudEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgYXR0ZW1wdDogbnVtYmVyO1xuICAvKiogV2hldGhlciB0aGlzIHN0ZXAgd2FzIHN0YXJ0ZWQgbGF6aWx5IChubyBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgd3JpdGUpLiAqL1xuICBsYXp5U3RlcFN0YXJ0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYm9keSByYW4gb3B0aW1pc3RpY2FsbHksIHdpdGhvdXQgYXdhaXRpbmcgc3RlcF9zdGFydGVkLiAqL1xuICBvcHRpbWlzdGljU3RhcnQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdGVwJ3MgYHN0ZXBfY3JlYXRlZGAgKyBgc3RlcF9zdGFydGVkYCBwYWlyIHdhcyBwcmUtY2xhaW1lZFxuICAgKiBpbnNpZGUgdGhlIHN1c3BlbnNpb24gaGFuZGxlcidzIGJhdGNoZWQgZmFuLW91dCB3cml0ZSAobm8gc3RhcnQgUE9TVCBvZlxuICAgKiBpdHMgb3duIGF0IGFsbCkuXG4gICAqL1xuICBwcmVjbGFpbWVkU3RhcnQ/OiBib29sZWFuO1xufSk6IFN0ZXBMYXRlbmN5RXZlbnREYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyB0cmFja2luZyB9ID0gcGFyYW1zO1xuICBpZiAoIXRyYWNraW5nIHx8IHBhcmFtcy5hdHRlbXB0ICE9PSAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFNtYWxsIG5lZ2F0aXZlIGR1cmF0aW9ucyBjbGFtcCB0byAwOiBjcm9zcy1pbnZvY2F0aW9uIHRpbWVzdGFtcHMgY2FuXG4gIC8vIGNvbWUgZnJvbSBhbm90aGVyIG1hY2hpbmUncyBjbG9jaywgc28gYm91bmRlZCBza2V3IG11c3Qgbm90IHByb2R1Y2VcbiAgLy8gbmVnYXRpdmUgdmFsdWVzLiBEdXJhdGlvbnMgbW9yZSBuZWdhdGl2ZSB0aGFuIE1BWF9DTE9DS19TS0VXX01TIGFyZSBub3RcbiAgLy8gc2tldyBidXQgYSBjb3JydXB0IGFuY2hvciwgYW5kIHRoZSBzYW1wbGUgaXMgZHJvcHBlZCAoc2VlIHRoZSBjb25zdGFudCdzXG4gIC8vIGRvYyBjb21tZW50KS5cbiAgLy9cbiAgLy8gQSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciBlbmRzIHRoZSBtZWFzdXJlbWVudCBhdCB0aGUgZmlyc3QgYXR0clxuICAvLyB3cml0ZSBpbnN0ZWFkIG9mIHRoZSBzdGVwJ3MgY29kZSBzdGFydDogdGhlIHJlbWFpbmRlciBpcyB0aGUgZHVyYXRpb25cbiAgLy8gb2YgdGhlIHNldEF0dHJpYnV0ZXMgY2FsbCAocmVzb2x2ZWQgdmlhIGFuIGV4dHJhIHJlcGxheSksIHdoaWNoIGlzXG4gIC8vIHN1YnRyYWN0ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZyB0aGUgc2FtcGxlLiBJbiB0aGF0IGNhc2VcbiAgLy8gYHRyYWNraW5nLnByZVN0ZXBCbG9ja2luZ01zYCBhbHJlYWR5IGhvbGRzIG9ubHkgdGhlIGhvb2sgdGltZSBmcm9tXG4gIC8vIEJFRk9SRSB0aGUgYXR0ciB3cml0ZTsgaG9vayB3cml0ZXMgYWZ0ZXIgdGhlIHdpbmRvdyBjbG9zZWQgYXJlIGV4Y2x1ZGVkXG4gIC8vIGJ5IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIChzZWUgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zKS5cbiAgY29uc3QgdHRmc0VuZE1zID0gdHJhY2tpbmcucHJlU3RlcEF0dHJTdGFydE1zID8/IHBhcmFtcy5zdGVwQ29kZVN0YXJ0ZWRBdE1zO1xuICBjb25zdCByYXdUdGZzID1cbiAgICB0cmFja2luZy50dGZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0dGZzRW5kTXMgLSB0cmFja2luZy50dGZzQW5jaG9yTXMgLSAodHJhY2tpbmcucHJlU3RlcEJsb2NraW5nTXMgPz8gMClcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCB0dGZzID1cbiAgICByYXdUdGZzICE9PSB1bmRlZmluZWQgJiYgcmF3VHRmcyA+PSAtTUFYX0NMT0NLX1NLRVdfTVNcbiAgICAgID8gTWF0aC5tYXgoMCwgcmF3VHRmcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByYXdTdHNvID1cbiAgICB0cmFja2luZy5wcmV2U3RlcEVuZE1zICE9PSB1bmRlZmluZWRcbiAgICAgID8gcGFyYW1zLnN0ZXBDb2RlU3RhcnRlZEF0TXMgLSB0cmFja2luZy5wcmV2U3RlcEVuZE1zXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RzbyA9XG4gICAgcmF3U3RzbyAhPT0gdW5kZWZpbmVkICYmIHJhd1N0c28gPj0gLU1BWF9DTE9DS19TS0VXX01TXG4gICAgICA/IE1hdGgubWF4KDAsIHJhd1N0c28pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgLy8gUlNGUyBlbmRzIGF0IHRoZSBhY3R1YWwgc3RhcnQtUE9TVCBpbnN0YW50LCBub3QgYXQgdHRmc0VuZE1zOiB1bmxpa2VcbiAgLy8gVFRGUyBpdCBpcyBub3Qgc3ViamVjdCB0byB0aGUgcHJlLXN0ZXAgYXR0ci13cml0ZSBzaG9ydGN1dCwgc28gYVxuICAvLyBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzIGRldG91ciAocmFyZSkgbWFrZXMgUlNGUyBpbmNsdWRlIHRoZSBkZXRvdXJcbiAgLy8gd2hpbGUgVFRGUyBleGNsdWRlcyBpdC4gYGZpbmFsU2NoZWR1bGluZ1JlcGxheWAgaXMgYSBkaXJlY3QgcGFzc3Rocm91Z2hcbiAgLy8gb2YgYHRyYWNraW5nLnJlcGxheU1zYCwgdGhlIEZJTkFMIHJlcGxheSBwYXNzIG9ubHkgKHNlZVxuICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zKSwgc28gbm8gZnVydGhlciBzdWJ0cmFjdGlvbiBhcHBsaWVzLCBidXRcbiAgLy8gaXQgYWxzbyBtZWFucyBpdCBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzIGFueSBlYXJsaWVyIHByZS1maXJzdC1zdGVwXG4gIC8vIHBhc3NlcyAoZS5nLiBhIHNldEF0dHJpYnV0ZXMgZGV0b3VyKSBhbmQgbXVzdCBub3QgYmUgcmVhZCBhcyBcInRoZVxuICAvLyByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCI7IHJzZnMgY292ZXJzIHRoZSB3aG9sZSB3aW5kb3cuXG4gIC8vXG4gIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBkdXBsaWNhdGVzIHdoYXQgT1RFTCBhbHJlYWR5IGNhcHR1cmVzIG9uIHRoZVxuICAvLyBydW4vaW52b2NhdGlvbiBzcGFuLCBidXQgaXMgZGVsaWJlcmF0ZWx5IGNvbGxlY3RlZCBhcyBjbGllbnQgdGVsZW1ldHJ5XG4gIC8vIHNvIHRoZSBzZXJ2ZXIgY2FuIGVtaXQgaXQgYXMgYW4gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOlxuICAvLyB3b3JrZmxvdy1zZXJ2ZXIncyBzZXJ2ZXIgc3BhbnMgYXJlIGhlYXZpbHkgc2FtcGxlZCBpbiBwcm9kdWN0aW9uICh+NyUpLFxuICAvLyBzbyB0aGV5IGNhbm5vdCBzZXJ2ZSBhcyB0aGUgZGFzaGJvYXJkJ3MgZXhhY3QgVFRGUyBkZWNvbXBvc2l0aW9uLlxuICBjb25zdCByc2ZzID1cbiAgICB0cmFja2luZy5yc2ZzQW5jaG9yTXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIHBhcmFtcy5zdGVwU3RhcnRQb3N0U2VudEF0TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heCgwLCBwYXJhbXMuc3RlcFN0YXJ0UG9zdFNlbnRBdE1zIC0gdHJhY2tpbmcucnNmc0FuY2hvck1zKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbmFsU2NoZWR1bGluZ1JlcGxheSA9XG4gICAgdHJhY2tpbmcucmVwbGF5TXMgIT09IHVuZGVmaW5lZFxuICAgICAgPyBNYXRoLm1heCgwLCB0cmFja2luZy5yZXBsYXlNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0dGZzID09PSB1bmRlZmluZWQgJiYgc3RzbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG9wdGltaXphdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGlmICh0cmFja2luZy50dXJibykgb3B0aW1pemF0aW9ucy5wdXNoKCd0dXJibycpO1xuICBpZiAocGFyYW1zLmxhenlTdGVwU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgnbGF6eVN0ZXBTdGFydCcpO1xuICBpZiAocGFyYW1zLm9wdGltaXN0aWNTdGFydCkgb3B0aW1pemF0aW9ucy5wdXNoKCdvcHRpbWlzdGljU3RhcnQnKTtcbiAgaWYgKHBhcmFtcy5wcmVjbGFpbWVkU3RhcnQpIG9wdGltaXphdGlvbnMucHVzaCgncHJlY2xhaW1lZFN0YXJ0Jyk7XG4gIC8vIFJpZGVzIHRoZSBleGlzdGluZyBvcHRpbWl6YXRpb25zIGxpc3QgcmF0aGVyIHRoYW4gYSBkZWRpY2F0ZWQgd2lyZVxuICAvLyBmaWVsZDogdGhlIHNlcnZlciBhbHJlYWR5IHBhcnNlcyB0aGlzIGFycmF5IGFuZCB0dXJucyBlYWNoIGtub3duIGVudHJ5XG4gIC8vIGludG8gYSBib3VuZGVkIGJvb2xlYW4gdGFnIG9uIGV2ZXJ5IGxhdGVuY3kgbWV0cmljLCBzbyBgcmV0YWluZWRgXG4gIC8vIGRpbWVuc2lvbnMgdHRmcy9zdHNvL3JzZnMvZmluYWxTY2hlZHVsaW5nUmVwbGF5IGZvciBmcmVlLlxuICBpZiAodHJhY2tpbmcucmV0YWluZWQpIG9wdGltaXphdGlvbnMucHVzaCgncmV0YWluZWQnKTtcblxuICByZXR1cm4ge1xuICAgIC4uLih0dGZzICE9PSB1bmRlZmluZWQgPyB7IHR0ZnMgfSA6IHt9KSxcbiAgICAuLi4oc3RzbyAhPT0gdW5kZWZpbmVkID8geyBzdHNvIH0gOiB7fSksXG4gICAgLi4uKHN0c28gIT09IHVuZGVmaW5lZCAmJiB0cmFja2luZy5zdGVwQ291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHN0ZXBDb3VudDogdHJhY2tpbmcuc3RlcENvdW50IH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzdHNvICE9PSB1bmRlZmluZWQgJiYgdHJhY2tpbmcuZXZlbnRDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgZXZlbnRDb3VudDogdHJhY2tpbmcuZXZlbnRDb3VudCB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocnNmcyAhPT0gdW5kZWZpbmVkID8geyByc2ZzIH0gOiB7fSksXG4gICAgLi4uKGZpbmFsU2NoZWR1bGluZ1JlcGxheSAhPT0gdW5kZWZpbmVkID8geyBmaW5hbFNjaGVkdWxpbmdSZXBsYXkgfSA6IHt9KSxcbiAgICBvcHRpbWl6YXRpb25zLFxuICB9O1xufVxuIl19