cdk-nextjs 0.7.9 → 0.7.11

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 (54) hide show
  1. package/.jsii +3 -3
  2. package/README.md +1 -1
  3. package/docs/harness-coverage.md +1 -1
  4. package/docs/nextjs-private-apis.md +128 -0
  5. package/lib/adapter/adapter.mjs +276 -24
  6. package/lib/adapter/build-outputs.d.ts +1 -1
  7. package/lib/adapter/build-outputs.js +29 -13
  8. package/lib/adapter/build-outputs.test.js +35 -7
  9. package/lib/adapter/cache-handler.d.ts +1 -1
  10. package/lib/adapter/cache-handler.js +1 -1
  11. package/lib/adapter/cache-kinds.d.ts +12 -1
  12. package/lib/adapter/cache-kinds.js +16 -4
  13. package/lib/adapter/init-cache.js +7 -7
  14. package/lib/adapter/local-file-cache-handler.d.ts +1 -1
  15. package/lib/adapter/local-file-cache-handler.js +1 -1
  16. package/lib/adapter/memory-cache-handler.d.ts +2 -2
  17. package/lib/adapter/memory-cache-handler.js +1 -1
  18. package/lib/adapter/s3-cache-handler.d.ts +2 -2
  19. package/lib/adapter/s3-cache-handler.js +1 -1
  20. package/lib/adapter/use-cache-common.d.ts +1 -1
  21. package/lib/adapter/use-cache-common.js +1 -1
  22. package/lib/adapter/use-cache-common.test.js +1 -1
  23. package/lib/adapter/use-cache-default-handler.d.ts +1 -1
  24. package/lib/adapter/use-cache-default-handler.js +1 -1
  25. package/lib/adapter/use-cache-handlers.test.js +1 -1
  26. package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
  27. package/lib/adapter/use-cache-remote-handler.js +1 -1
  28. package/lib/cdk-nextjs-version.d.ts +10 -0
  29. package/lib/cdk-nextjs-version.js +15 -0
  30. package/lib/nextjs-api.js +1 -1
  31. package/lib/nextjs-build/nextjs-build.js +7 -6
  32. package/lib/nextjs-build/nextjs-build.test.js +16 -3
  33. package/lib/nextjs-cache.js +1 -1
  34. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  35. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  36. package/lib/nextjs-distribution.js +5 -5
  37. package/lib/nextjs-post-deploy.js +1 -1
  38. package/lib/nextjs-static-assets.js +1 -1
  39. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  40. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  41. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  42. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  43. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  44. package/lib/runtime/core.test.js +17 -8
  45. package/lib/runtime/dispatch.js +4 -5
  46. package/lib/runtime/image.js +43 -32
  47. package/lib/runtime/image.test.js +27 -26
  48. package/lib/runtime/lambda.mjs +276 -36
  49. package/lib/runtime/manifest.d.ts +34 -8
  50. package/lib/runtime/manifest.js +7 -5
  51. package/lib/runtime/server.mjs +276 -36
  52. package/package.json +1 -1
  53. package/scripts/capture-adapter-fixture.mjs +13 -1
  54. package/scripts/zero-config-build.mjs +5 -1
@@ -370,4 +370,4 @@ function sharedTagManifest() {
370
370
  }
371
371
  return global[tag_manifest_1.TAG_MANIFEST_SYMBOL];
372
372
  }
373
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLWNvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3VzZS1jYWNoZS1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBMEJBLG9DQUVDO0FBR0Qsc0NBSUM7QUFrQkQsZ0NBcUJDO0FBR0Qsc0NBS0M7QUFHRCxvQ0FnQkM7QUFPRCx3Q0FFQztBQXlKRCw0Q0FFQztBQW1CRCwwQkFXQztBQWVELGdDQTRCQztBQWFELHNDQUVDO0FBUUQsa0NBY0M7QUFhRCw4Q0F3Q0M7QUE1YUQ7Ozs7OztFQU1FO0FBQ0Ysc0RBQXNEO0FBQ3RELDhEQUEwRDtBQUMxRCxrREFBNkI7QUFLN0IsdURBTTJCO0FBQzNCLDBEQUE4RTtBQUU5RSxxREFBdUQ7QUFBOUMsc0dBQUEsV0FBVyxPQUFPO0FBRTNCLDBFQUEwRTtBQUMxRSxTQUFnQixZQUFZO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssd0JBQXdCLENBQUM7QUFDN0QsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxTQUFnQixhQUFhLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQzFELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDakUsQ0FBQztBQVVEOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsVUFBVSxDQUM5QixNQUFrQztJQUVsQyxNQUFNLE1BQU0sR0FBRyxNQUFN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Q0FBQztnQkFDbEUsaUJBQWlCO2dCQUNqQixLQUFLLEVBQUUsSUFBQSxlQUFRLEVBQUMsK0JBQStCLENBQUM7Z0JBQ2hELDREQUE0RDtnQkFDNUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEtBQUssU0FBUzthQUM5RCxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsSUFBSSxDQUNWLHdHQUF3RyxDQUN6RyxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sQ0FBQyxrQ0FBbUIsQ0FBQyxHQUFHLElBQUksbUNBQWlCLENBQUM7Z0JBQ2xELGlCQUFpQjthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLGtDQUFtQixDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFdoYXQgdGhlIHR3byBgY2FjaGVIYW5kbGVyc2AgKGAndXNlIGNhY2hlJ2AgYW5kIGAndXNlIGNhY2hlOiByZW1vdGUnYCkgc2hhcmU6XG4gIHRoZSBpbi1tZW1vcnkgZW50cnkgc3RvcmUsIHRoZSBwZW5kaW5nLWBzZXRgIGJvb2trZWVwaW5nIE5leHQuanMgcmVxdWlyZXMgb2ZcbiAgZXZlcnkgaGFuZGxlciwgYW5kIHRoZSBwcm9jZXNzJ3Mgb25lIHRhZyBtYW5pZmVzdCAoYFRyYWNrZWRUYWdNYXJrZXJzYCksXG4gIHdoaWNoIG1ha2VzIGByZXZhbGlkYXRlVGFnYCByZWFjaCBldmVyeSBpbnN0YW5jZSB0aHJvdWdoIHRoZSByZXZhbGlkYXRpb25cbiAgdGFibGUncyBtYXJrZXIgcm93cy5cbiovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IER5bmFtb0RCQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhhbmRsZXIsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9jYWNoZS1oYW5kbGVycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUdfUkVGUkVTSF9NUyxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFRhZ01hcmtlclRhYmxlLFxuICBUcmFja2VkVGFnTWFya2Vycyxcbn0gZnJvbSBcIi4vYXdzLWNhY2hlLXN0b3JlXCI7XG5pbXBvcnQgeyBvdXRzaWRlUmVxdWVzdCwgVEFHX01BTklGRVNUX1NZTUJPTCB9IGZyb20gXCIuLi9ydW50aW1lL3RhZy1tYW5pZmVzdFwiO1xuXG5leHBvcnQgeyBtYXJrZXJDbG9jayBhcyBub3cgfSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcblxuLyoqIFdoZXRoZXIgdGhpcyBwcm9jZXNzIGlzIGBuZXh0IGJ1aWxkYCByYXRoZXIgdGhhbiBhIGRlcGxveWVkIHNlcnZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J1aWxkUGhhc2UoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5ORVhUX1BIQVNFID09PSBcInBoYXNlLXByb2R1Y3Rpb24tYnVpbGRcIjtcbn1cblxuLyoqIEEgcG9zaXRpdmUgaW50ZWdlciBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgYGZhbGxiYWNrYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGcm9tRW52KG5hbWU6IHN0cmluZywgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gXCJcIiA/IE5hTiA6IE51bWJlcihyYXcpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwID8gdmFsdWUgOiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBBIGBDYWNoZUVudHJ5YCB3aXRoIGl0cyB2YWx1ZSByZWFkIHRvIHRoZSBlbmQ6IHRoZSBieXRlcyBhcmUgd2hhdCBpcyBrZXB0LFxuICogYW5kIGV2ZXJ5IGBnZXRgIGhhbmRzIG91dCBhIGZyZXNoIHN0cmVhbSBvdmVyIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkRW50cnkgZXh0ZW5kcyBPbWl0PENhY2hlRW50cnksIFwidmFsdWVcIj4ge1xuICB2YWx1ZTogVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBSZWFkIGBzdHJlYW1gIHRvIHRoZSBlbmQsIG9yIHRocm93IGlmIGl0IGVycm9ycy5cbiAqXG4gKiBgQ2FjaGVFbnRyeS52YWx1ZWAgXCJjYW4gZXJyb3IgYW5kIG9ubHkgaGF2ZSBwYXJ0aWFsIGRhdGFcIiAoTmV4dC5qcydzXG4gKiBgY2FjaGUtaGFuZGxlcnMvdHlwZXMuZC50c2ApLiBUaHJvd2luZyBpcyBob3cgYSBwYXJ0aWFsIGVudHJ5IGlzIGtlcHQgb3V0OlxuICogYm90aCBoYW5kbGVycyBzdG9yZSBub3RoaW5nIHdoZW4gdGhpcyByZWplY3RzLCB3aGljaCBpcyB3aGF0IE5leHQuanMncyBvd25cbiAqIGRlZmF1bHQgaGFuZGxlciBkb2VzIHRvby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW0oXG4gIHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgIHNpemUgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgfVxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBieXRlcy5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKiogYHBlbmRpbmdFbnRyeWAgcmVzb2x2ZWQgYW5kIHJlYWQgdG8gdGhlIGVuZC4gU2VlIHtAbGluayByZWFkU3RyZWFtfS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9yZWRFbnRyeU9mKFxuICBwZW5kaW5nRW50cnk6IFByb21pc2U8Q2FjaGVFbnRyeT4sXG4pOiBQcm9taXNlPFN0b3JlZEVudHJ5PiB7XG4gIGNvbnN0IGVudHJ5ID0gYXdhaXQgcGVuZGluZ0VudHJ5O1xuICByZXR1cm4geyAuLi5lbnRyeSwgdmFsdWU6IGF3YWl0IHJlYWRTdHJlYW0oZW50cnkudmFsdWUpIH07XG59XG5cbi8qKiBgc3RvcmVkYCBhcyB0aGUgYENhY2hlRW50cnlgIGEgYGdldGAgcmV0dXJucywgd2l0aCBpdHMgb3duIHN0cmVhbS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUVudHJ5T2YoXG4gIHN0b3JlZDogU3RvcmVkRW50cnksXG4gIHJldmFsaWRhdGU6IG51bWJlciA9IHN0b3JlZC5yZXZhbGlkYXRlLFxuKTogQ2FjaGVFbnRyeSB7XG4gIGNvbnN0IGJ5dGVzID0gc3RvcmVkLnZhbHVlO1xuICByZXR1cm4ge1xuICAgIC4uLnN0b3JlZCxcbiAgICByZXZhbGlkYXRlLFxuICAgIHZhbHVlOiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAvLyBBIGNvcHk6IHdob2V2ZXIgcmVhZHMgdGhlIHN0cmVhbSBtYXkgdHJhbnNmZXIgb3IgbXV0YXRlIHRoZSBjaHVuay5cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ5dGVzLnNsaWNlKCkpO1xuICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICB9LFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgTmV4dC5qcyB3b3VsZCByZWdlbmVyYXRlIGBlbnRyeWAgb24gZXZlcnkgcmVhZCBhbnl3YXksIHNvIHN0b3JpbmcgaXRcbiAqIGlzIGEgd3JpdGUgbm90aGluZyByZWFkcyBiYWNrLiBOZXh0LmpzJ3MgZGVmYXVsdCBoYW5kbGVyIHNraXBzIHRoZXNlIHRoZSBzYW1lXG4gKiB3YXksIG91dHNpZGUgdGhlIGRldiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWNFbnRyeShlbnRyeTogUGljazxDYWNoZUVudHJ5LCBcImV4cGlyZVwiPik6IGJvb2xlYW4ge1xuICByZXR1cm4gZW50cnkuZXhwaXJlID09PSAwO1xufVxuXG4vKipcbiAqIFRoZSBpbi1mbGlnaHQgYHNldGBzLCBieSBjYWNoZSBrZXkuIGBDYWNoZUhhbmRsZXIuc2V0YCByZWNlaXZlcyBhbiBlbnRyeSB0aGF0XG4gKiBtYXkgc3RpbGwgYmUgc3RyZWFtaW5nLCBhbmQgXCJpZiBhIGBnZXRgIGZvciB0aGUgc2FtZSBjYWNoZSBrZXkgaXMgY2FsbGVkXG4gKiBiZWZvcmUgdGhlIHBlbmRpbmcgZW50cnkgaXMgY29tcGxldGUsIHRoZSBjYWNoZSBoYW5kbGVyIG11c3Qgd2FpdCBmb3IgdGhlXG4gKiBgc2V0YCBvcGVyYXRpb24gdG8gZmluaXNoXCIgKGBjYWNoZS1oYW5kbGVycy90eXBlcy5kLnRzYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZW5kaW5nU2V0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gIC8qKiBSZXNvbHZlcyBvbmNlIG5vIGBzZXRgIGZvciBga2V5YCBpcyBpbiBmbGlnaHQuICovXG4gIGFzeW5jIHdhaXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBwID0gdGhpcy5wZW5kaW5nLmdldChrZXkpOyBwOyBwID0gdGhpcy5wZW5kaW5nLmdldChrZXkpKSB7XG4gICAgICBhd2FpdCBwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGBzZXRgIGZvciBga2V5YCBhbmQgcmV0dXJuIHRoZSBmdW5jdGlvbiB0aGF0IGVuZHMgaXQuIFNhZmUgdG9cbiAgICogY2FsbCBtb3JlIHRoYW4gb25jZTogb25seSB0aGUgcmVnaXN0cmF0aW9uIGl0IG1hZGUgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGJlZ2luKGtleTogc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gICAgbGV0IHJlc29sdmU6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHIpID0+IChyZXNvbHZlID0gcikpO1xuICAgIHRoaXMucGVuZGluZy5zZXQoa2V5LCBwcm9taXNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGVuZGluZy5nZXQoa2V5KSA9PT0gcHJvbWlzZSkge1xuICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFN0b3JlZCBlbnRyaWVzIGJ5IGNhY2hlIGtleSwgbGVhc3QgcmVjZW50bHkgdXNlZCBldmljdGVkIGZpcnN0IG9uY2UgdGhlaXJcbiAqIGJ5dGVzIHBhc3MgYG1heEJ5dGVzYC4gU2l6ZWQgYnkgYnl0ZXMgcmF0aGVyIHRoYW4gZW50cmllcywgbGlrZSBOZXh0LmpzJ3NcbiAqIGRlZmF1bHQgaGFuZGxlciAoYGNhY2hlTWF4TWVtb3J5U2l6ZWAsIDUwIE1CKSwgc2luY2UgYSBgJ3VzZSBjYWNoZSdgIGVudHJ5IGlzXG4gKiBhbiBSU0MgcGF5bG9hZCBvZiBhbnkgc2l6ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudHJ5THJ1IHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZEVudHJ5PigpO1xuICBwcml2YXRlIGJ5dGVzID0gMDtcbiAgLyoqXG4gICAqIE5vIGxhdGVyIHRoYW4gdGhlIG9sZGVzdCBlbnRyeSdzIGB0aW1lc3RhbXBgOiB0aGUgbGFzdCBzY2FuJ3MgYW5zd2VyLCBsZXNzXG4gICAqIHdoYXRldmVyIHdhcyBzZXQgc2luY2UuIEVudHJpZXMgZHJvcHBlZCBzaW5jZSBvbmx5IG1ha2UgaXQgZWFybHkuIFNlZVxuICAgKiB7QGxpbmsgb2xkZXN0Qm91bmR9LlxuICAgKi9cbiAgcHJpdmF0ZSBsb3dlc3QgPSBJbmZpbml0eTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1heEJ5dGVzOiBudW1iZXIpIHt9XG5cbiAgZ2V0KGtleTogc3RyaW5nKTogU3RvcmVkRW50cnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgLy8gUmUtaW5zZXJ0ZWQgdG8gbWFyayBpdCBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBzZXQoa2V5OiBzdHJpbmcsIGVudHJ5OiBTdG9yZWRFbnRyeSk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgY29uc3Qgc2l6ZSA9IHNpemVPZihrZXksIGVudHJ5KTtcbiAgICBpZiAoc2l6ZSA+IHRoaXMubWF4Qnl0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnNldChrZXksIGVudHJ5KTtcbiAgICB0aGlzLmJ5dGVzICs9IHNpemU7XG4gICAgdGhpcy5sb3dlc3QgPSBNYXRoLm1pbih0aGlzLmxvd2VzdCwgZW50cnkudGltZXN0YW1wKTtcbiAgICBmb3IgKGNvbnN0IFtvbGRlc3RLZXksIG9sZGVzdF0gb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBpZiAodGhpcy5ieXRlcyA8PSB0aGlzLm1heEJ5dGVzKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShvbGRlc3RLZXkpO1xuICAgICAgdGhpcy5ieXRlcyAtPSBzaXplT2Yob2xkZXN0S2V5LCBvbGRlc3QpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5lbnRyaWVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5ieXRlcyAtPSBzaXplT2Yoa2V5LCBleGlzdGluZyk7XG4gICAgICBpZiAodGhpcy5lbnRyaWVzLnNpemUgPT09IDApIHtcbiAgICAgICAgdGhpcy5sb3dlc3QgPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGB0aW1lc3RhbXBgIG9mIHRoZSBvbGRlc3QgZW50cnkgaGVsZCwgYEluZmluaXR5YCB3aXRoIG5vbmUsIGRyb3BwaW5nXG4gICAqIG9uIHRoZSB3YXkgdGhlIGVudHJpZXMgcGFzdCBgcmV2YWxpZGF0ZWAgYXQgYGF0YCAoYG5vdygpYCk6IGEgaGFuZGxlclxuICAgKiB0aGF0IGRyb3BzIHRoZW0gd2hlbiBuZXh0IHJlYWQgd291bGQgb3RoZXJ3aXNlIGhvbGQgdGhlbSB1bnRpbCB0aGVuLCBhbmRcbiAgICogdGhleSB3b3VsZCBjb3VudCBoZXJlIG1lYW53aGlsZS4gQSBzY2FuLCBzbyBhc2tlZCBvbmNlIGluIGEgd2hpbGU6IGluXG4gICAqIGJldHdlZW4sIHtAbGluayBvbGRlc3RCb3VuZH0gYW5zd2Vycy5cbiAgICovXG4gIG9sZGVzdFRpbWVzdGFtcChhdCA9IC1JbmZpbml0eSk6IG51bWJlciB7XG4gICAgbGV0IG9sZGVzdCA9IEluZmluaXR5O1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZW50cmllcykge1xuICAgICAgaWYgKGlzUGFzdFJldmFsaWRhdGUoZW50cnksIGF0KSkge1xuICAgICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2xkZXN0ID0gTWF0aC5taW4ob2xkZXN0LCBlbnRyeS50aW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvd2VzdCA9IG9sZGVzdDtcbiAgICByZXR1cm4gb2xkZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vIGxhdGVyIHRoYW4ge0BsaW5rIG9sZGVzdFRpbWVzdGFtcH0sIHdpdGhvdXQgaXRzIHNjYW46IGFzIG9mIHRoZSBsYXN0XG4gICAqIG9uZSwgbGVzcyB0aGUgZW50cmllcyBzZXQgc2luY2UuIGBJbmZpbml0eWAgd2l0aCBub25lIGhlbGQuIERyb3BzIHRoZVxuICAgKiBlbnRyaWVzIHBhc3QgYHJldmFsaWRhdGVgIGF0IGBhdGAgZnJvbSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbmQsIHVwIHRvXG4gICAqIHRoZSBmaXJzdCB0aGF0IGlzbid0LCBzbyB7QGxpbmsgaG9sZHNMaXZlfSBkb2Vzbid0IHdhbGsgcGFzdCB0aGVtIG9uIGV2ZXJ5XG4gICAqIHJlcXVlc3QgdW50aWwgdGhlIG5leHQgc2Nhbi5cbiAgICovXG4gIG9sZGVzdEJvdW5kKGF0ID0gLUluZmluaXR5KTogbnVtYmVyIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGlmICghaXNQYXN0UmV2YWxpZGF0ZShlbnRyeSwgYXQpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5zaXplID09PSAwID8gSW5maW5pdHkgOiB0aGlzLmxvd2VzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIGVudHJ5IG5vdCBwYXN0IGByZXZhbGlkYXRlYCBhdCBgYXRgIGlzIGhlbGQuIFVzdWFsbHkgdGhlIGZpcnN0XG4gICAqIGVudHJ5IGFuc3dlcnM7IHRoZSBleHBpcmVkIG9uZXMgaXQgcGFzc2VzIGFyZSBkcm9wcGVkIGJ5IHRoZSBzY2FuXG4gICAqIHtAbGluayBvbGRlc3RUaW1lc3RhbXB9IG1ha2VzLCBub3QgaGVyZSwgc28gYXNraW5nIGNoYW5nZXMgbm90aGluZy5cbiAgICovXG4gIGhvbGRzTGl2ZShhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIGlmICghaXNQYXN0UmV2YWxpZGF0ZShlbnRyeSwgYXQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuc2l6ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaXplT2Yoa2V5OiBzdHJpbmcsIGVudHJ5OiBTdG9yZWRFbnRyeSk6IG51bWJlciB7XG4gIHJldHVybiBlbnRyeS52YWx1ZS5ieXRlTGVuZ3RoICsga2V5Lmxlbmd0aDtcbn1cblxuLyoqIFdoZXRoZXIgYHN0b3JlZGAgaXMgcGFzdCBgcmV2YWxpZGF0ZWAgYXQgYGF0YCAoYG5vdygpYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXN0UmV2YWxpZGF0ZShzdG9yZWQ6IFN0b3JlZEVudHJ5LCBhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBhdCA+IHN0b3JlZC50aW1lc3RhbXAgKyBzdG9yZWQucmV2YWxpZGF0ZSAqIDEwMDA7XG59XG5cbi8qKiBEZWZhdWx0IHNpemUgb2YgZWFjaCBoYW5kbGVyJ3MgbWVtb3J5IHN0b3JlOiBOZXh0LmpzJ3MgZGVmYXVsdCwgNTAgTUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU1PUllfQllURVMgPSA1MCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIEhvdyBsb25nIG9uZSByZXZhbGlkYXRpb24gdGFibGUgcmVxdWVzdCBtYXkgdGFrZSwgcGVyIGF0dGVtcHQuIFRoZSBTREsgc2V0c1xuICogbm8gbGltaXQsIGFuZCBhIHJlZnJlc2ggbGVmdCBpbiBmbGlnaHQgYWNyb3NzIGEgTGFtYmRhIGZyZWV6ZSBjYW4gc2l0IG9uIGFcbiAqIGNvbm5lY3Rpb24gdGhhdCBkaWVkIG1lYW53aGlsZSB3aXRob3V0IGEgcmVzZXQ6IGV2ZXJ5IHJlcXVlc3QgdGhhdCB3YWl0c1xuICogZm9yIHRoZSByZWZyZXNoIChhbiBpbnN0YW5jZSBgYmVoaW5kYCwgSVNSKSB3b3VsZCB3YWl0IHdpdGggaXQuIFRoZSBTREtcbiAqIHJldHJpZXMgYSB0aW1lZC1vdXQgYXR0ZW1wdCwgc28gYSBkZWFkIGNvbm5lY3Rpb24gY29zdHMgdXAgdG8gaXRzIGF0dGVtcHRzXG4gKiB0aW1lcyB0aGlzLlxuICovXG5leHBvcnQgY29uc3QgVEFHX1RBQkxFX1JFUVVFU1RfVElNRU9VVF9NUyA9IDMwMDA7XG5cbi8qKlxuICogV2FpdCBmb3IgYHdvcmtgIGlmIGB3YWl0YCwgb3IgZWxzZSBsZXQgaXQgcnVuIG9uOiBlaXRoZXIgd2F5IGEgcmVqZWN0aW9uIGlzXG4gKiBsb2dnZWQgd2l0aCBgZmFpbHVyZWAgcmF0aGVyIHRoYW4gdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRJZihcbiAgd2FpdDogYm9vbGVhbixcbiAgd29yazogUHJvbWlzZTx2b2lkPixcbiAgZmFpbHVyZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxvZ2dlZCA9IHdvcmsuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihmYWlsdXJlLCBlcnJvcik7XG4gIH0pO1xuICBpZiAod2FpdCkge1xuICAgIGF3YWl0IGxvZ2dlZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ01ldGhvZHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHJlZnJlc2hUYWdzYCBhbHdheXMgd2FpdHMgZm9yIHRoZSByZXZhbGlkYXRpb24gbG9nIHF1ZXJ5LCByYXRoZXJcbiAgICogdGhhbiBvbmx5IHdoZW4gdGhlIGluc3RhbmNlIGlzIGBiZWhpbmRgLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYmxvY2tpbmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBgY2FjaGVIYW5kbGVyc2AgbWV0aG9kcyB0aGF0IG9ubHkgZ28gdGhyb3VnaCBgdGFnc2AsIHRoZSBzYW1lIGZvciB0aGVcbiAqIGBkZWZhdWx0YCBhbmQgYHJlbW90ZWAgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdNZXRob2RzKFxuICB0YWdzOiBUcmFja2VkVGFnTWFya2VycyxcbiAgb3B0aW9uczogVGFnTWV0aG9kc09wdGlvbnMgPSB7fSxcbik6IFBpY2s8Q2FjaGVIYW5kbGVyLCBcInJlZnJlc2hUYWdzXCIgfCBcInVwZGF0ZVRhZ3NcIj4ge1xuICByZXR1cm4ge1xuICAgIC8vIFN0YXJ0ZWQsIG5vdCBhd2FpdGVkLCB3aGlsZSB0aGUgaW5zdGFuY2Uga2VlcHMgdXAsIHVubGVzcyBgYmxvY2tpbmdgLlxuICAgIC8vIE5leHQuanMgYXdhaXRzIGByZWZyZXNoVGFnc2AgaW5zaWRlIHRoZSBmaXJzdCBgJ3VzZSBjYWNoZSdgIGxvb2t1cCBvZiBhXG4gICAgLy8gcmVxdWVzdCAoYHVzZS1jYWNoZS13cmFwcGVyYCksIGFuZCBhIHN0YWdlZCByZW5kZXIgZW5kcyBpdHMgc3RhdGljIHN0YWdlXG4gICAgLy8gb24gYSB0aW1lcjogYSBsb2cgYFF1ZXJ5YCB0aGVyZSBwdXNoZWQgdGhlIGVudHJ5IG91dCBvZiB0aGUgc3RhdGljXG4gICAgLy8gc3RhZ2UsIHNvIGEgY2FjaGVkIG5hdmlnYXRpb24gc3RvcmVkIHRoZSBwYWdlIHNlZ21lbnQgd2l0aG91dCBpdC4gV2hhdFxuICAgIC8vIHRoZSBxdWVyeSBmaW5kcyBhcHBsaWVzIGZyb20gdGhlIG5leHQgcmVxdWVzdC4gQXdhaXRlZCBvbmNlIHRoZSBpbnN0YW5jZVxuICAgIC8vIGlzIGBiZWhpbmRgLCB3aGljaCB0aGUgcnVudGltZSBzZXR0bGVzIGJlZm9yZSBhIHBhZ2UgcmVuZGVyIHN0YXJ0c1xuICAgIC8vIChgY2F0Y2hVcGApOiB0aGUgZmlyc3QgcmVxdWVzdCBhZnRlciBhbiBpZGxlIG9yIGZyb3plbiBzcGVsbCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzZXJ2ZSB3aGF0ZXZlciB3YXMgcmV2YWxpZGF0ZWQgZWxzZXdoZXJlIG1lYW53aGlsZS4gQSBwYWdlJ3NcbiAgICAvLyByZW5kZXIganVzdCBhZnRlciBgY2F0Y2hVcGAgZ2V0cyBhIGdyYWNlIG1vcmUgKGBiZWhpbmRJblJlbmRlcmApLCBzbyBhXG4gICAgLy8gcmVxdWVzdCB0aGF0IGNhbWUgaW4ganVzdCBzaG9ydCBvZiB0aGUgbGluZSBkb2Vzbid0IGNyb3NzIGl0IGluc2lkZVxuICAgIC8vIHRoZSByZW5kZXIuIE5vdCBldmVuIHRoZW4gd2hpbGUgdGhlIGluc3RhbmNlIGhvbGRzIG5vIGVudHJ5IHRoZSBxdWVyeVxuICAgIC8vIGNvdWxkIGV4cGlyZSAoYGhvbGRzRW50cmllc2ApLCB3aXRoIGEgYHJlZnJlc2hJbnRlcnZhbE1zYCBvZiBgMGAgdG9vLlxuICAgIHJlZnJlc2hUYWdzOiAoKSA9PlxuICAgICAgYXdhaXRJZihcbiAgICAgICAgb3B0aW9ucy5ibG9ja2luZyA9PT0gdHJ1ZSB8fCAodGFncy5iZWhpbmRJblJlbmRlciAmJiB0YWdzLmhvbGRzRW50cmllcyksXG4gICAgICAgIHRhZ3MucmVmcmVzaCgpLFxuICAgICAgICBcIkVycm9yIHJlZnJlc2hpbmcgY2FjaGUgdGFnczpcIixcbiAgICAgICksXG4gICAgYXN5bmMgdXBkYXRlVGFncyhyZXZhbGlkYXRlZFRhZ3MsIGR1cmF0aW9ucykge1xuICAgICAgYXdhaXQgdGFncy51cGRhdGUocmV2YWxpZGF0ZWRUYWdzLCBkdXJhdGlvbnMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUnVuIGEgY2FjaGUgaGFuZGxlciBtZXRob2QncyB3b3JrIG91dHNpZGUgdGhlIHJlcXVlc3QgdGhhdCBjYWxsZWQgaXRcbiAqICh7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnMub3V0c2lkZVJlbmRlcn0pLiBOZXh0LmpzIGF3YWl0cyB0aGVzZSBtZXRob2RzXG4gKiBpbnNpZGUgYSBzdGFnZWQgcmVuZGVyLCBhbmQgMTYuNCBlbmRzIHRoZSByZW5kZXIncyBzdGF0aWMgc3RhZ2Ugb24gYW55XG4gKiBgRGF0ZS5ub3coKWAsIGBuZXcgRGF0ZSgpYCwgYE1hdGgucmFuZG9tKClgIG9yIGBjcnlwdG9gIHJhbmRvbSBjYWxsIG1hZGUgaW5cbiAqIHRoZSByZXF1ZXN0J3MgY29udGV4dCBkdXJpbmcgaXQ6IG91cnMsIHRoZSBBV1MgU0RLJ3MgKHJlcXVlc3Qgc2lnbmluZyxcbiAqIGludm9jYXRpb24gaWRzKSBhbmQgYGRlYnVnYCdzIGFsaWtlLiBBIGRyYWZ0IG1vZGUgcGFnZSwgcmVuZGVyZWQgd2hvbGUgYXRcbiAqIHJlcXVlc3QgdGltZSwgbG9zdCBpdHMgc3RhdGljIHN0YWdlIHRoYXQgd2F5IHRvIGByZWZyZXNoVGFnc2AsIHNvIHRoZSBjbGllbnRcbiAqIGNhY2hlZCBub3RoaW5nIGZyb20gaXRzIEhUTUwuIENyZWF0aW5nIHRoZSBtYW5pZmVzdCBpcyBpbiBoZXJlIHRvbzogdGhlXG4gKiBmaXJzdCBoYW5kbGVyIGNhbGwgb2YgYSBwcm9jZXNzIGRvZXMgaXQsIGluc2lkZSBhIHJlbmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dHNpZGVSZW5kZXI8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgcmV0dXJuIG91dHNpZGVSZXF1ZXN0KHNoYXJlZFRhZ01hbmlmZXN0KS5vdXRzaWRlUmVuZGVyKGZuKTtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgYnVpbHQgYnkgYGNyZWF0ZWAgb24gZmlyc3QgdXNlIHJhdGhlciB0aGFuIG9uIGltcG9ydCwgc28gbG9hZGluZ1xuICogdGhlIG1vZHVsZSAtIHdoaWNoIGplc3QsIGFuZCBOZXh0LmpzJ3MgY29uZmlnIHZhbGlkYXRpb24sIGRvIHdpdGhvdXQgdXNpbmdcbiAqIGl0IC0gbmVpdGhlciBjb25zdHJ1Y3RzIEFXUyBjbGllbnRzIG5vciB3YXJucyBhYm91dCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBFdmVyeSBtZXRob2QgcnVucyB7QGxpbmsgb3V0c2lkZVJlbmRlcn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXp5SGFuZGxlcihjcmVhdGU6ICgpID0+IENhY2hlSGFuZGxlcik6IENhY2hlSGFuZGxlciB7XG4gIGxldCBoYW5kbGVyOiBDYWNoZUhhbmRsZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGluc3RhbmNlID0gKCkgPT4gKGhhbmRsZXIgPz89IGNyZWF0ZSgpKTtcbiAgcmV0dXJuIHtcbiAgICBnZXQ6IChjYWNoZUtleSwgc29mdFRhZ3MpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkuZ2V0KGNhY2hlS2V5LCBzb2Z0VGFncykpLFxuICAgIHNldDogKGNhY2hlS2V5LCBwZW5kaW5nRW50cnkpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkuc2V0KGNhY2hlS2V5LCBwZW5kaW5nRW50cnkpKSxcbiAgICByZWZyZXNoVGFnczogKCkgPT4gb3V0c2lkZVJlbmRlcigoKSA9PiBpbnN0YW5jZSgpLnJlZnJlc2hUYWdzKCkpLFxuICAgIGdldEV4cGlyYXRpb246ICh0YWdzKSA9PlxuICAgICAgb3V0c2lkZVJlbmRlcigoKSA9PiBpbnN0YW5jZSgpLmdldEV4cGlyYXRpb24odGFncykpLFxuICAgIHVwZGF0ZVRhZ3M6ICh0YWdzLCBkdXJhdGlvbnMpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkudXBkYXRlVGFncyh0YWdzLCBkdXJhdGlvbnMpKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcHJvY2VzcydzIG9uZSB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9LCBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAqXG4gKiBLZXB0IG9uIGBnbG9iYWxUaGlzYCBiZWNhdXNlIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSBoYW5kbGVyIGFuZCB0aGUgYGRlZmF1bHRgXG4gKiBhbmQgYHJlbW90ZWAgaGFuZGxlcnMgYXJlIHNlcGFyYXRlIGJ1bmRsZXMgLSBzZXBhcmF0ZSBtb2R1bGUgaW5zdGFuY2VzIC0gYW5kXG4gKiBzaG91bGQgc2hhcmUgb25lIG1hbmlmZXN0OiBvbmUgcmVmcmVzaCByZWFkIGZvciBhbGwgb2YgdGhlbSwgYW5kIG9uZSBtYXJrZXJcbiAqIHdyaXRlIHBlciBgcmV2YWxpZGF0ZVRhZ2AuXG4gKlxuICogQXQgYnVpbGQgdGltZSB0aGVyZSBpcyBubyB0YWJsZSB0byByZWFkIChhbmQgbm8gY3JlZGVudGlhbHMgdG8gcmVhZCBpdFxuICogd2l0aCksIHNvIHRhZ3Mgc3RheSBsb2NhbCB0byB0aGUgcHJvY2VzcyB0aGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFRhZ01hbmlmZXN0KCk6IFRyYWNrZWRUYWdNYXJrZXJzIHtcbiAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyB7IFtUQUdfTUFOSUZFU1RfU1lNQk9MXT86IFRyYWNrZWRUYWdNYXJrZXJzIH07XG4gIGlmICghZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVmcmVzaEludGVydmFsTXMgPSBudW1iZXJGcm9tRW52KFxuICAgICAgXCJDREtfTkVYVEpTX1RBR19SRUZSRVNIX01TXCIsXG4gICAgICBERUZBVUxUX1RBR19SRUZSRVNIX01TLFxuICAgICk7XG4gICAgaWYgKGNvbmZpZy50YWJsZU5hbWUgJiYgIWlzQnVpbGRQaGFzZSgpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgRHluYW1vREJDbGllbnQoe1xuICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgIC8vIFdpdGhvdXQgYHRocm93T25SZXF1ZXN0VGltZW91dGAgdGhlIHRpbWVvdXQgb25seSBsb2dzIGEgd2FybmluZy4gSXRcbiAgICAgICAgLy8gZW5kcyBvbmNlIHRoZSByZXNwb25zZSBoZWFkZXJzIGFycml2ZTogYHNvY2tldFRpbWVvdXRgLCBhblxuICAgICAgICAvLyBpbmFjdGl2aXR5IHRpbWVyIGtlcHQgdW50aWwgdGhlIHJlcXVlc3QgY2xvc2VzLCBjb3ZlcnMgdGhlIGJvZHkuXG4gICAgICAgIHJlcXVlc3RIYW5kbGVyOiB7XG4gICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6IFRBR19UQUJMRV9SRVFVRVNUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgdGhyb3dPblJlcXVlc3RUaW1lb3V0OiB0cnVlLFxuICAgICAgICAgIHNvY2tldFRpbWVvdXQ6IFRBR19UQUJMRV9SRVFVRVNUX1RJTUVPVVRfTVMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGdsb2JhbFtUQUdfTUFOSUZFU1RfU1lNQk9MXSA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICAgIG1hcmtlcnM6IG5ldyBUYWdNYXJrZXJUYWJsZShjbGllbnQsIGNvbmZpZy50YWJsZU5hbWUsIGNvbmZpZy5idWlsZElkKSxcbiAgICAgICAgbG9nOiBuZXcgUmV2YWxpZGF0aW9uTG9nKGNsaWVudCwgY29uZmlnLnRhYmxlTmFtZSwgY29uZmlnLmJ1aWxkSWQpLFxuICAgICAgICByZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgICAgZGVidWc6IGdldERlYnVnKFwiY2RrLW5leHRqczpjYWNoZS1oYW5kbGVyOnRhZ3NcIiksXG4gICAgICAgIC8vIFNldCBpbiBldmVyeSBMYW1iZGEgcnVudGltZTsgYSBjb250YWluZXIgaXMgbmV2ZXIgZnJvemVuLlxuICAgICAgICBjYW5GcmVlemU6IHByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSAhPT0gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNCdWlsZFBoYXNlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiQ0RLX05FWFRKU19SRVZBTElEQVRJT05fVEFCTEVfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCBjYWNoZSB0YWdzIGFyZSBsb2NhbCB0byBlYWNoIGluc3RhbmNlXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBnbG9iYWxbVEFHX01BTklGRVNUX1NZTUJPTF0gPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgICByZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdO1xufVxuIl19
373
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLWNvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3VzZS1jYWNoZS1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBdUJBLG9DQUVDO0FBR0Qsc0NBSUM7QUFrQkQsZ0NBcUJDO0FBR0Qsc0NBS0M7QUFHRCxvQ0FnQkM7QUFPRCx3Q0FFQztBQXlKRCw0Q0FFQztBQW1CRCwwQkFXQztBQWVELGdDQTRCQztBQWFELHNDQUVDO0FBUUQsa0NBY0M7QUFhRCw4Q0F3Q0M7QUF6YUQ7Ozs7OztFQU1FO0FBQ0Ysc0RBQXNEO0FBQ3RELDhEQUEwRDtBQUMxRCxrREFBNkI7QUFFN0IsdURBTTJCO0FBQzNCLDBEQUE4RTtBQUU5RSxxREFBdUQ7QUFBOUMsc0dBQUEsV0FBVyxPQUFPO0FBRTNCLDBFQUEwRTtBQUMxRSxTQUFnQixZQUFZO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssd0JBQXdCLENBQUM7QUFDN0QsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxTQUFnQixhQUFhLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQzFELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDakUsQ0FBQztBQVVEOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsVUFBVSxDQUM5QixNQUFrQztJQUVsQyxNQUFNLE1BQU0sR0FBRyxNQUFN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Q0FBQztnQkFDbEUsaUJBQWlCO2dCQUNqQixLQUFLLEVBQUUsSUFBQSxlQUFRLEVBQUMsK0JBQStCLENBQUM7Z0JBQ2hELDREQUE0RDtnQkFDNUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEtBQUssU0FBUzthQUM5RCxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsSUFBSSxDQUNWLHdHQUF3RyxDQUN6RyxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sQ0FBQyxrQ0FBbUIsQ0FBQyxHQUFHLElBQUksbUNBQWlCLENBQUM7Z0JBQ2xELGlCQUFpQjthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLGtDQUFtQixDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFdoYXQgdGhlIHR3byBgY2FjaGVIYW5kbGVyc2AgKGAndXNlIGNhY2hlJ2AgYW5kIGAndXNlIGNhY2hlOiByZW1vdGUnYCkgc2hhcmU6XG4gIHRoZSBpbi1tZW1vcnkgZW50cnkgc3RvcmUsIHRoZSBwZW5kaW5nLWBzZXRgIGJvb2trZWVwaW5nIE5leHQuanMgcmVxdWlyZXMgb2ZcbiAgZXZlcnkgaGFuZGxlciwgYW5kIHRoZSBwcm9jZXNzJ3Mgb25lIHRhZyBtYW5pZmVzdCAoYFRyYWNrZWRUYWdNYXJrZXJzYCksXG4gIHdoaWNoIG1ha2VzIGByZXZhbGlkYXRlVGFnYCByZWFjaCBldmVyeSBpbnN0YW5jZSB0aHJvdWdoIHRoZSByZXZhbGlkYXRpb25cbiAgdGFibGUncyBtYXJrZXIgcm93cy5cbiovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IER5bmFtb0RCQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUVudHJ5LCBDYWNoZUhhbmRsZXIgfSBmcm9tIFwibmV4dC9jYWNoZVwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUdfUkVGUkVTSF9NUyxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFRhZ01hcmtlclRhYmxlLFxuICBUcmFja2VkVGFnTWFya2Vycyxcbn0gZnJvbSBcIi4vYXdzLWNhY2hlLXN0b3JlXCI7XG5pbXBvcnQgeyBvdXRzaWRlUmVxdWVzdCwgVEFHX01BTklGRVNUX1NZTUJPTCB9IGZyb20gXCIuLi9ydW50aW1lL3RhZy1tYW5pZmVzdFwiO1xuXG5leHBvcnQgeyBtYXJrZXJDbG9jayBhcyBub3cgfSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcblxuLyoqIFdoZXRoZXIgdGhpcyBwcm9jZXNzIGlzIGBuZXh0IGJ1aWxkYCByYXRoZXIgdGhhbiBhIGRlcGxveWVkIHNlcnZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J1aWxkUGhhc2UoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5ORVhUX1BIQVNFID09PSBcInBoYXNlLXByb2R1Y3Rpb24tYnVpbGRcIjtcbn1cblxuLyoqIEEgcG9zaXRpdmUgaW50ZWdlciBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgYGZhbGxiYWNrYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGcm9tRW52KG5hbWU6IHN0cmluZywgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gXCJcIiA/IE5hTiA6IE51bWJlcihyYXcpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwID8gdmFsdWUgOiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBBIGBDYWNoZUVudHJ5YCB3aXRoIGl0cyB2YWx1ZSByZWFkIHRvIHRoZSBlbmQ6IHRoZSBieXRlcyBhcmUgd2hhdCBpcyBrZXB0LFxuICogYW5kIGV2ZXJ5IGBnZXRgIGhhbmRzIG91dCBhIGZyZXNoIHN0cmVhbSBvdmVyIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkRW50cnkgZXh0ZW5kcyBPbWl0PENhY2hlRW50cnksIFwidmFsdWVcIj4ge1xuICB2YWx1ZTogVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBSZWFkIGBzdHJlYW1gIHRvIHRoZSBlbmQsIG9yIHRocm93IGlmIGl0IGVycm9ycy5cbiAqXG4gKiBgQ2FjaGVFbnRyeS52YWx1ZWAgXCJjYW4gZXJyb3IgYW5kIG9ubHkgaGF2ZSBwYXJ0aWFsIGRhdGFcIiAoTmV4dC5qcydzXG4gKiBgY2FjaGUtaGFuZGxlcnMvdHlwZXMuZC50c2ApLiBUaHJvd2luZyBpcyBob3cgYSBwYXJ0aWFsIGVudHJ5IGlzIGtlcHQgb3V0OlxuICogYm90aCBoYW5kbGVycyBzdG9yZSBub3RoaW5nIHdoZW4gdGhpcyByZWplY3RzLCB3aGljaCBpcyB3aGF0IE5leHQuanMncyBvd25cbiAqIGRlZmF1bHQgaGFuZGxlciBkb2VzIHRvby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW0oXG4gIHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgIHNpemUgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgfVxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBieXRlcy5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKiogYHBlbmRpbmdFbnRyeWAgcmVzb2x2ZWQgYW5kIHJlYWQgdG8gdGhlIGVuZC4gU2VlIHtAbGluayByZWFkU3RyZWFtfS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9yZWRFbnRyeU9mKFxuICBwZW5kaW5nRW50cnk6IFByb21pc2U8Q2FjaGVFbnRyeT4sXG4pOiBQcm9taXNlPFN0b3JlZEVudHJ5PiB7XG4gIGNvbnN0IGVudHJ5ID0gYXdhaXQgcGVuZGluZ0VudHJ5O1xuICByZXR1cm4geyAuLi5lbnRyeSwgdmFsdWU6IGF3YWl0IHJlYWRTdHJlYW0oZW50cnkudmFsdWUpIH07XG59XG5cbi8qKiBgc3RvcmVkYCBhcyB0aGUgYENhY2hlRW50cnlgIGEgYGdldGAgcmV0dXJucywgd2l0aCBpdHMgb3duIHN0cmVhbS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUVudHJ5T2YoXG4gIHN0b3JlZDogU3RvcmVkRW50cnksXG4gIHJldmFsaWRhdGU6IG51bWJlciA9IHN0b3JlZC5yZXZhbGlkYXRlLFxuKTogQ2FjaGVFbnRyeSB7XG4gIGNvbnN0IGJ5dGVzID0gc3RvcmVkLnZhbHVlO1xuICByZXR1cm4ge1xuICAgIC4uLnN0b3JlZCxcbiAgICByZXZhbGlkYXRlLFxuICAgIHZhbHVlOiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAvLyBBIGNvcHk6IHdob2V2ZXIgcmVhZHMgdGhlIHN0cmVhbSBtYXkgdHJhbnNmZXIgb3IgbXV0YXRlIHRoZSBjaHVuay5cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ5dGVzLnNsaWNlKCkpO1xuICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICB9LFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgTmV4dC5qcyB3b3VsZCByZWdlbmVyYXRlIGBlbnRyeWAgb24gZXZlcnkgcmVhZCBhbnl3YXksIHNvIHN0b3JpbmcgaXRcbiAqIGlzIGEgd3JpdGUgbm90aGluZyByZWFkcyBiYWNrLiBOZXh0LmpzJ3MgZGVmYXVsdCBoYW5kbGVyIHNraXBzIHRoZXNlIHRoZSBzYW1lXG4gKiB3YXksIG91dHNpZGUgdGhlIGRldiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWNFbnRyeShlbnRyeTogUGljazxDYWNoZUVudHJ5LCBcImV4cGlyZVwiPik6IGJvb2xlYW4ge1xuICByZXR1cm4gZW50cnkuZXhwaXJlID09PSAwO1xufVxuXG4vKipcbiAqIFRoZSBpbi1mbGlnaHQgYHNldGBzLCBieSBjYWNoZSBrZXkuIGBDYWNoZUhhbmRsZXIuc2V0YCByZWNlaXZlcyBhbiBlbnRyeSB0aGF0XG4gKiBtYXkgc3RpbGwgYmUgc3RyZWFtaW5nLCBhbmQgXCJpZiBhIGBnZXRgIGZvciB0aGUgc2FtZSBjYWNoZSBrZXkgaXMgY2FsbGVkXG4gKiBiZWZvcmUgdGhlIHBlbmRpbmcgZW50cnkgaXMgY29tcGxldGUsIHRoZSBjYWNoZSBoYW5kbGVyIG11c3Qgd2FpdCBmb3IgdGhlXG4gKiBgc2V0YCBvcGVyYXRpb24gdG8gZmluaXNoXCIgKGBjYWNoZS1oYW5kbGVycy90eXBlcy5kLnRzYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZW5kaW5nU2V0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gIC8qKiBSZXNvbHZlcyBvbmNlIG5vIGBzZXRgIGZvciBga2V5YCBpcyBpbiBmbGlnaHQuICovXG4gIGFzeW5jIHdhaXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBwID0gdGhpcy5wZW5kaW5nLmdldChrZXkpOyBwOyBwID0gdGhpcy5wZW5kaW5nLmdldChrZXkpKSB7XG4gICAgICBhd2FpdCBwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGBzZXRgIGZvciBga2V5YCBhbmQgcmV0dXJuIHRoZSBmdW5jdGlvbiB0aGF0IGVuZHMgaXQuIFNhZmUgdG9cbiAgICogY2FsbCBtb3JlIHRoYW4gb25jZTogb25seSB0aGUgcmVnaXN0cmF0aW9uIGl0IG1hZGUgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGJlZ2luKGtleTogc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gICAgbGV0IHJlc29sdmU6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHIpID0+IChyZXNvbHZlID0gcikpO1xuICAgIHRoaXMucGVuZGluZy5zZXQoa2V5LCBwcm9taXNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGVuZGluZy5nZXQoa2V5KSA9PT0gcHJvbWlzZSkge1xuICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFN0b3JlZCBlbnRyaWVzIGJ5IGNhY2hlIGtleSwgbGVhc3QgcmVjZW50bHkgdXNlZCBldmljdGVkIGZpcnN0IG9uY2UgdGhlaXJcbiAqIGJ5dGVzIHBhc3MgYG1heEJ5dGVzYC4gU2l6ZWQgYnkgYnl0ZXMgcmF0aGVyIHRoYW4gZW50cmllcywgbGlrZSBOZXh0LmpzJ3NcbiAqIGRlZmF1bHQgaGFuZGxlciAoYGNhY2hlTWF4TWVtb3J5U2l6ZWAsIDUwIE1CKSwgc2luY2UgYSBgJ3VzZSBjYWNoZSdgIGVudHJ5IGlzXG4gKiBhbiBSU0MgcGF5bG9hZCBvZiBhbnkgc2l6ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudHJ5THJ1IHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZEVudHJ5PigpO1xuICBwcml2YXRlIGJ5dGVzID0gMDtcbiAgLyoqXG4gICAqIE5vIGxhdGVyIHRoYW4gdGhlIG9sZGVzdCBlbnRyeSdzIGB0aW1lc3RhbXBgOiB0aGUgbGFzdCBzY2FuJ3MgYW5zd2VyLCBsZXNzXG4gICAqIHdoYXRldmVyIHdhcyBzZXQgc2luY2UuIEVudHJpZXMgZHJvcHBlZCBzaW5jZSBvbmx5IG1ha2UgaXQgZWFybHkuIFNlZVxuICAgKiB7QGxpbmsgb2xkZXN0Qm91bmR9LlxuICAgKi9cbiAgcHJpdmF0ZSBsb3dlc3QgPSBJbmZpbml0eTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1heEJ5dGVzOiBudW1iZXIpIHt9XG5cbiAgZ2V0KGtleTogc3RyaW5nKTogU3RvcmVkRW50cnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgLy8gUmUtaW5zZXJ0ZWQgdG8gbWFyayBpdCBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBzZXQoa2V5OiBzdHJpbmcsIGVudHJ5OiBTdG9yZWRFbnRyeSk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgY29uc3Qgc2l6ZSA9IHNpemVPZihrZXksIGVudHJ5KTtcbiAgICBpZiAoc2l6ZSA+IHRoaXMubWF4Qnl0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnNldChrZXksIGVudHJ5KTtcbiAgICB0aGlzLmJ5dGVzICs9IHNpemU7XG4gICAgdGhpcy5sb3dlc3QgPSBNYXRoLm1pbih0aGlzLmxvd2VzdCwgZW50cnkudGltZXN0YW1wKTtcbiAgICBmb3IgKGNvbnN0IFtvbGRlc3RLZXksIG9sZGVzdF0gb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBpZiAodGhpcy5ieXRlcyA8PSB0aGlzLm1heEJ5dGVzKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShvbGRlc3RLZXkpO1xuICAgICAgdGhpcy5ieXRlcyAtPSBzaXplT2Yob2xkZXN0S2V5LCBvbGRlc3QpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5lbnRyaWVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5ieXRlcyAtPSBzaXplT2Yoa2V5LCBleGlzdGluZyk7XG4gICAgICBpZiAodGhpcy5lbnRyaWVzLnNpemUgPT09IDApIHtcbiAgICAgICAgdGhpcy5sb3dlc3QgPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGB0aW1lc3RhbXBgIG9mIHRoZSBvbGRlc3QgZW50cnkgaGVsZCwgYEluZmluaXR5YCB3aXRoIG5vbmUsIGRyb3BwaW5nXG4gICAqIG9uIHRoZSB3YXkgdGhlIGVudHJpZXMgcGFzdCBgcmV2YWxpZGF0ZWAgYXQgYGF0YCAoYG5vdygpYCk6IGEgaGFuZGxlclxuICAgKiB0aGF0IGRyb3BzIHRoZW0gd2hlbiBuZXh0IHJlYWQgd291bGQgb3RoZXJ3aXNlIGhvbGQgdGhlbSB1bnRpbCB0aGVuLCBhbmRcbiAgICogdGhleSB3b3VsZCBjb3VudCBoZXJlIG1lYW53aGlsZS4gQSBzY2FuLCBzbyBhc2tlZCBvbmNlIGluIGEgd2hpbGU6IGluXG4gICAqIGJldHdlZW4sIHtAbGluayBvbGRlc3RCb3VuZH0gYW5zd2Vycy5cbiAgICovXG4gIG9sZGVzdFRpbWVzdGFtcChhdCA9IC1JbmZpbml0eSk6IG51bWJlciB7XG4gICAgbGV0IG9sZGVzdCA9IEluZmluaXR5O1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZW50cmllcykge1xuICAgICAgaWYgKGlzUGFzdFJldmFsaWRhdGUoZW50cnksIGF0KSkge1xuICAgICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2xkZXN0ID0gTWF0aC5taW4ob2xkZXN0LCBlbnRyeS50aW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvd2VzdCA9IG9sZGVzdDtcbiAgICByZXR1cm4gb2xkZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vIGxhdGVyIHRoYW4ge0BsaW5rIG9sZGVzdFRpbWVzdGFtcH0sIHdpdGhvdXQgaXRzIHNjYW46IGFzIG9mIHRoZSBsYXN0XG4gICAqIG9uZSwgbGVzcyB0aGUgZW50cmllcyBzZXQgc2luY2UuIGBJbmZpbml0eWAgd2l0aCBub25lIGhlbGQuIERyb3BzIHRoZVxuICAgKiBlbnRyaWVzIHBhc3QgYHJldmFsaWRhdGVgIGF0IGBhdGAgZnJvbSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbmQsIHVwIHRvXG4gICAqIHRoZSBmaXJzdCB0aGF0IGlzbid0LCBzbyB7QGxpbmsgaG9sZHNMaXZlfSBkb2Vzbid0IHdhbGsgcGFzdCB0aGVtIG9uIGV2ZXJ5XG4gICAqIHJlcXVlc3QgdW50aWwgdGhlIG5leHQgc2Nhbi5cbiAgICovXG4gIG9sZGVzdEJvdW5kKGF0ID0gLUluZmluaXR5KTogbnVtYmVyIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGlmICghaXNQYXN0UmV2YWxpZGF0ZShlbnRyeSwgYXQpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5zaXplID09PSAwID8gSW5maW5pdHkgOiB0aGlzLmxvd2VzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIGVudHJ5IG5vdCBwYXN0IGByZXZhbGlkYXRlYCBhdCBgYXRgIGlzIGhlbGQuIFVzdWFsbHkgdGhlIGZpcnN0XG4gICAqIGVudHJ5IGFuc3dlcnM7IHRoZSBleHBpcmVkIG9uZXMgaXQgcGFzc2VzIGFyZSBkcm9wcGVkIGJ5IHRoZSBzY2FuXG4gICAqIHtAbGluayBvbGRlc3RUaW1lc3RhbXB9IG1ha2VzLCBub3QgaGVyZSwgc28gYXNraW5nIGNoYW5nZXMgbm90aGluZy5cbiAgICovXG4gIGhvbGRzTGl2ZShhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIGlmICghaXNQYXN0UmV2YWxpZGF0ZShlbnRyeSwgYXQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuc2l6ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaXplT2Yoa2V5OiBzdHJpbmcsIGVudHJ5OiBTdG9yZWRFbnRyeSk6IG51bWJlciB7XG4gIHJldHVybiBlbnRyeS52YWx1ZS5ieXRlTGVuZ3RoICsga2V5Lmxlbmd0aDtcbn1cblxuLyoqIFdoZXRoZXIgYHN0b3JlZGAgaXMgcGFzdCBgcmV2YWxpZGF0ZWAgYXQgYGF0YCAoYG5vdygpYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXN0UmV2YWxpZGF0ZShzdG9yZWQ6IFN0b3JlZEVudHJ5LCBhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBhdCA+IHN0b3JlZC50aW1lc3RhbXAgKyBzdG9yZWQucmV2YWxpZGF0ZSAqIDEwMDA7XG59XG5cbi8qKiBEZWZhdWx0IHNpemUgb2YgZWFjaCBoYW5kbGVyJ3MgbWVtb3J5IHN0b3JlOiBOZXh0LmpzJ3MgZGVmYXVsdCwgNTAgTUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU1PUllfQllURVMgPSA1MCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIEhvdyBsb25nIG9uZSByZXZhbGlkYXRpb24gdGFibGUgcmVxdWVzdCBtYXkgdGFrZSwgcGVyIGF0dGVtcHQuIFRoZSBTREsgc2V0c1xuICogbm8gbGltaXQsIGFuZCBhIHJlZnJlc2ggbGVmdCBpbiBmbGlnaHQgYWNyb3NzIGEgTGFtYmRhIGZyZWV6ZSBjYW4gc2l0IG9uIGFcbiAqIGNvbm5lY3Rpb24gdGhhdCBkaWVkIG1lYW53aGlsZSB3aXRob3V0IGEgcmVzZXQ6IGV2ZXJ5IHJlcXVlc3QgdGhhdCB3YWl0c1xuICogZm9yIHRoZSByZWZyZXNoIChhbiBpbnN0YW5jZSBgYmVoaW5kYCwgSVNSKSB3b3VsZCB3YWl0IHdpdGggaXQuIFRoZSBTREtcbiAqIHJldHJpZXMgYSB0aW1lZC1vdXQgYXR0ZW1wdCwgc28gYSBkZWFkIGNvbm5lY3Rpb24gY29zdHMgdXAgdG8gaXRzIGF0dGVtcHRzXG4gKiB0aW1lcyB0aGlzLlxuICovXG5leHBvcnQgY29uc3QgVEFHX1RBQkxFX1JFUVVFU1RfVElNRU9VVF9NUyA9IDMwMDA7XG5cbi8qKlxuICogV2FpdCBmb3IgYHdvcmtgIGlmIGB3YWl0YCwgb3IgZWxzZSBsZXQgaXQgcnVuIG9uOiBlaXRoZXIgd2F5IGEgcmVqZWN0aW9uIGlzXG4gKiBsb2dnZWQgd2l0aCBgZmFpbHVyZWAgcmF0aGVyIHRoYW4gdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRJZihcbiAgd2FpdDogYm9vbGVhbixcbiAgd29yazogUHJvbWlzZTx2b2lkPixcbiAgZmFpbHVyZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxvZ2dlZCA9IHdvcmsuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihmYWlsdXJlLCBlcnJvcik7XG4gIH0pO1xuICBpZiAod2FpdCkge1xuICAgIGF3YWl0IGxvZ2dlZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ01ldGhvZHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHJlZnJlc2hUYWdzYCBhbHdheXMgd2FpdHMgZm9yIHRoZSByZXZhbGlkYXRpb24gbG9nIHF1ZXJ5LCByYXRoZXJcbiAgICogdGhhbiBvbmx5IHdoZW4gdGhlIGluc3RhbmNlIGlzIGBiZWhpbmRgLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYmxvY2tpbmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBgY2FjaGVIYW5kbGVyc2AgbWV0aG9kcyB0aGF0IG9ubHkgZ28gdGhyb3VnaCBgdGFnc2AsIHRoZSBzYW1lIGZvciB0aGVcbiAqIGBkZWZhdWx0YCBhbmQgYHJlbW90ZWAgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdNZXRob2RzKFxuICB0YWdzOiBUcmFja2VkVGFnTWFya2VycyxcbiAgb3B0aW9uczogVGFnTWV0aG9kc09wdGlvbnMgPSB7fSxcbik6IFBpY2s8Q2FjaGVIYW5kbGVyLCBcInJlZnJlc2hUYWdzXCIgfCBcInVwZGF0ZVRhZ3NcIj4ge1xuICByZXR1cm4ge1xuICAgIC8vIFN0YXJ0ZWQsIG5vdCBhd2FpdGVkLCB3aGlsZSB0aGUgaW5zdGFuY2Uga2VlcHMgdXAsIHVubGVzcyBgYmxvY2tpbmdgLlxuICAgIC8vIE5leHQuanMgYXdhaXRzIGByZWZyZXNoVGFnc2AgaW5zaWRlIHRoZSBmaXJzdCBgJ3VzZSBjYWNoZSdgIGxvb2t1cCBvZiBhXG4gICAgLy8gcmVxdWVzdCAoYHVzZS1jYWNoZS13cmFwcGVyYCksIGFuZCBhIHN0YWdlZCByZW5kZXIgZW5kcyBpdHMgc3RhdGljIHN0YWdlXG4gICAgLy8gb24gYSB0aW1lcjogYSBsb2cgYFF1ZXJ5YCB0aGVyZSBwdXNoZWQgdGhlIGVudHJ5IG91dCBvZiB0aGUgc3RhdGljXG4gICAgLy8gc3RhZ2UsIHNvIGEgY2FjaGVkIG5hdmlnYXRpb24gc3RvcmVkIHRoZSBwYWdlIHNlZ21lbnQgd2l0aG91dCBpdC4gV2hhdFxuICAgIC8vIHRoZSBxdWVyeSBmaW5kcyBhcHBsaWVzIGZyb20gdGhlIG5leHQgcmVxdWVzdC4gQXdhaXRlZCBvbmNlIHRoZSBpbnN0YW5jZVxuICAgIC8vIGlzIGBiZWhpbmRgLCB3aGljaCB0aGUgcnVudGltZSBzZXR0bGVzIGJlZm9yZSBhIHBhZ2UgcmVuZGVyIHN0YXJ0c1xuICAgIC8vIChgY2F0Y2hVcGApOiB0aGUgZmlyc3QgcmVxdWVzdCBhZnRlciBhbiBpZGxlIG9yIGZyb3plbiBzcGVsbCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzZXJ2ZSB3aGF0ZXZlciB3YXMgcmV2YWxpZGF0ZWQgZWxzZXdoZXJlIG1lYW53aGlsZS4gQSBwYWdlJ3NcbiAgICAvLyByZW5kZXIganVzdCBhZnRlciBgY2F0Y2hVcGAgZ2V0cyBhIGdyYWNlIG1vcmUgKGBiZWhpbmRJblJlbmRlcmApLCBzbyBhXG4gICAgLy8gcmVxdWVzdCB0aGF0IGNhbWUgaW4ganVzdCBzaG9ydCBvZiB0aGUgbGluZSBkb2Vzbid0IGNyb3NzIGl0IGluc2lkZVxuICAgIC8vIHRoZSByZW5kZXIuIE5vdCBldmVuIHRoZW4gd2hpbGUgdGhlIGluc3RhbmNlIGhvbGRzIG5vIGVudHJ5IHRoZSBxdWVyeVxuICAgIC8vIGNvdWxkIGV4cGlyZSAoYGhvbGRzRW50cmllc2ApLCB3aXRoIGEgYHJlZnJlc2hJbnRlcnZhbE1zYCBvZiBgMGAgdG9vLlxuICAgIHJlZnJlc2hUYWdzOiAoKSA9PlxuICAgICAgYXdhaXRJZihcbiAgICAgICAgb3B0aW9ucy5ibG9ja2luZyA9PT0gdHJ1ZSB8fCAodGFncy5iZWhpbmRJblJlbmRlciAmJiB0YWdzLmhvbGRzRW50cmllcyksXG4gICAgICAgIHRhZ3MucmVmcmVzaCgpLFxuICAgICAgICBcIkVycm9yIHJlZnJlc2hpbmcgY2FjaGUgdGFnczpcIixcbiAgICAgICksXG4gICAgYXN5bmMgdXBkYXRlVGFncyhyZXZhbGlkYXRlZFRhZ3MsIGR1cmF0aW9ucykge1xuICAgICAgYXdhaXQgdGFncy51cGRhdGUocmV2YWxpZGF0ZWRUYWdzLCBkdXJhdGlvbnMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUnVuIGEgY2FjaGUgaGFuZGxlciBtZXRob2QncyB3b3JrIG91dHNpZGUgdGhlIHJlcXVlc3QgdGhhdCBjYWxsZWQgaXRcbiAqICh7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnMub3V0c2lkZVJlbmRlcn0pLiBOZXh0LmpzIGF3YWl0cyB0aGVzZSBtZXRob2RzXG4gKiBpbnNpZGUgYSBzdGFnZWQgcmVuZGVyLCBhbmQgMTYuNCBlbmRzIHRoZSByZW5kZXIncyBzdGF0aWMgc3RhZ2Ugb24gYW55XG4gKiBgRGF0ZS5ub3coKWAsIGBuZXcgRGF0ZSgpYCwgYE1hdGgucmFuZG9tKClgIG9yIGBjcnlwdG9gIHJhbmRvbSBjYWxsIG1hZGUgaW5cbiAqIHRoZSByZXF1ZXN0J3MgY29udGV4dCBkdXJpbmcgaXQ6IG91cnMsIHRoZSBBV1MgU0RLJ3MgKHJlcXVlc3Qgc2lnbmluZyxcbiAqIGludm9jYXRpb24gaWRzKSBhbmQgYGRlYnVnYCdzIGFsaWtlLiBBIGRyYWZ0IG1vZGUgcGFnZSwgcmVuZGVyZWQgd2hvbGUgYXRcbiAqIHJlcXVlc3QgdGltZSwgbG9zdCBpdHMgc3RhdGljIHN0YWdlIHRoYXQgd2F5IHRvIGByZWZyZXNoVGFnc2AsIHNvIHRoZSBjbGllbnRcbiAqIGNhY2hlZCBub3RoaW5nIGZyb20gaXRzIEhUTUwuIENyZWF0aW5nIHRoZSBtYW5pZmVzdCBpcyBpbiBoZXJlIHRvbzogdGhlXG4gKiBmaXJzdCBoYW5kbGVyIGNhbGwgb2YgYSBwcm9jZXNzIGRvZXMgaXQsIGluc2lkZSBhIHJlbmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dHNpZGVSZW5kZXI8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgcmV0dXJuIG91dHNpZGVSZXF1ZXN0KHNoYXJlZFRhZ01hbmlmZXN0KS5vdXRzaWRlUmVuZGVyKGZuKTtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgYnVpbHQgYnkgYGNyZWF0ZWAgb24gZmlyc3QgdXNlIHJhdGhlciB0aGFuIG9uIGltcG9ydCwgc28gbG9hZGluZ1xuICogdGhlIG1vZHVsZSAtIHdoaWNoIGplc3QsIGFuZCBOZXh0LmpzJ3MgY29uZmlnIHZhbGlkYXRpb24sIGRvIHdpdGhvdXQgdXNpbmdcbiAqIGl0IC0gbmVpdGhlciBjb25zdHJ1Y3RzIEFXUyBjbGllbnRzIG5vciB3YXJucyBhYm91dCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBFdmVyeSBtZXRob2QgcnVucyB7QGxpbmsgb3V0c2lkZVJlbmRlcn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXp5SGFuZGxlcihjcmVhdGU6ICgpID0+IENhY2hlSGFuZGxlcik6IENhY2hlSGFuZGxlciB7XG4gIGxldCBoYW5kbGVyOiBDYWNoZUhhbmRsZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGluc3RhbmNlID0gKCkgPT4gKGhhbmRsZXIgPz89IGNyZWF0ZSgpKTtcbiAgcmV0dXJuIHtcbiAgICBnZXQ6IChjYWNoZUtleSwgc29mdFRhZ3MpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkuZ2V0KGNhY2hlS2V5LCBzb2Z0VGFncykpLFxuICAgIHNldDogKGNhY2hlS2V5LCBwZW5kaW5nRW50cnkpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkuc2V0KGNhY2hlS2V5LCBwZW5kaW5nRW50cnkpKSxcbiAgICByZWZyZXNoVGFnczogKCkgPT4gb3V0c2lkZVJlbmRlcigoKSA9PiBpbnN0YW5jZSgpLnJlZnJlc2hUYWdzKCkpLFxuICAgIGdldEV4cGlyYXRpb246ICh0YWdzKSA9PlxuICAgICAgb3V0c2lkZVJlbmRlcigoKSA9PiBpbnN0YW5jZSgpLmdldEV4cGlyYXRpb24odGFncykpLFxuICAgIHVwZGF0ZVRhZ3M6ICh0YWdzLCBkdXJhdGlvbnMpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkudXBkYXRlVGFncyh0YWdzLCBkdXJhdGlvbnMpKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcHJvY2VzcydzIG9uZSB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9LCBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAqXG4gKiBLZXB0IG9uIGBnbG9iYWxUaGlzYCBiZWNhdXNlIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSBoYW5kbGVyIGFuZCB0aGUgYGRlZmF1bHRgXG4gKiBhbmQgYHJlbW90ZWAgaGFuZGxlcnMgYXJlIHNlcGFyYXRlIGJ1bmRsZXMgLSBzZXBhcmF0ZSBtb2R1bGUgaW5zdGFuY2VzIC0gYW5kXG4gKiBzaG91bGQgc2hhcmUgb25lIG1hbmlmZXN0OiBvbmUgcmVmcmVzaCByZWFkIGZvciBhbGwgb2YgdGhlbSwgYW5kIG9uZSBtYXJrZXJcbiAqIHdyaXRlIHBlciBgcmV2YWxpZGF0ZVRhZ2AuXG4gKlxuICogQXQgYnVpbGQgdGltZSB0aGVyZSBpcyBubyB0YWJsZSB0byByZWFkIChhbmQgbm8gY3JlZGVudGlhbHMgdG8gcmVhZCBpdFxuICogd2l0aCksIHNvIHRhZ3Mgc3RheSBsb2NhbCB0byB0aGUgcHJvY2VzcyB0aGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFRhZ01hbmlmZXN0KCk6IFRyYWNrZWRUYWdNYXJrZXJzIHtcbiAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyB7IFtUQUdfTUFOSUZFU1RfU1lNQk9MXT86IFRyYWNrZWRUYWdNYXJrZXJzIH07XG4gIGlmICghZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVmcmVzaEludGVydmFsTXMgPSBudW1iZXJGcm9tRW52KFxuICAgICAgXCJDREtfTkVYVEpTX1RBR19SRUZSRVNIX01TXCIsXG4gICAgICBERUZBVUxUX1RBR19SRUZSRVNIX01TLFxuICAgICk7XG4gICAgaWYgKGNvbmZpZy50YWJsZU5hbWUgJiYgIWlzQnVpbGRQaGFzZSgpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgRHluYW1vREJDbGllbnQoe1xuICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgIC8vIFdpdGhvdXQgYHRocm93T25SZXF1ZXN0VGltZW91dGAgdGhlIHRpbWVvdXQgb25seSBsb2dzIGEgd2FybmluZy4gSXRcbiAgICAgICAgLy8gZW5kcyBvbmNlIHRoZSByZXNwb25zZSBoZWFkZXJzIGFycml2ZTogYHNvY2tldFRpbWVvdXRgLCBhblxuICAgICAgICAvLyBpbmFjdGl2aXR5IHRpbWVyIGtlcHQgdW50aWwgdGhlIHJlcXVlc3QgY2xvc2VzLCBjb3ZlcnMgdGhlIGJvZHkuXG4gICAgICAgIHJlcXVlc3RIYW5kbGVyOiB7XG4gICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6IFRBR19UQUJMRV9SRVFVRVNUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgdGhyb3dPblJlcXVlc3RUaW1lb3V0OiB0cnVlLFxuICAgICAgICAgIHNvY2tldFRpbWVvdXQ6IFRBR19UQUJMRV9SRVFVRVNUX1RJTUVPVVRfTVMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGdsb2JhbFtUQUdfTUFOSUZFU1RfU1lNQk9MXSA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICAgIG1hcmtlcnM6IG5ldyBUYWdNYXJrZXJUYWJsZShjbGllbnQsIGNvbmZpZy50YWJsZU5hbWUsIGNvbmZpZy5idWlsZElkKSxcbiAgICAgICAgbG9nOiBuZXcgUmV2YWxpZGF0aW9uTG9nKGNsaWVudCwgY29uZmlnLnRhYmxlTmFtZSwgY29uZmlnLmJ1aWxkSWQpLFxuICAgICAgICByZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgICAgZGVidWc6IGdldERlYnVnKFwiY2RrLW5leHRqczpjYWNoZS1oYW5kbGVyOnRhZ3NcIiksXG4gICAgICAgIC8vIFNldCBpbiBldmVyeSBMYW1iZGEgcnVudGltZTsgYSBjb250YWluZXIgaXMgbmV2ZXIgZnJvemVuLlxuICAgICAgICBjYW5GcmVlemU6IHByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSAhPT0gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNCdWlsZFBoYXNlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiQ0RLX05FWFRKU19SRVZBTElEQVRJT05fVEFCTEVfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCBjYWNoZSB0YWdzIGFyZSBsb2NhbCB0byBlYWNoIGluc3RhbmNlXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBnbG9iYWxbVEFHX01BTklGRVNUX1NZTUJPTF0gPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgICByZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdO1xufVxuIl19