@pipeline-builder/api-core 4.1.7 → 4.1.9

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 (62) hide show
  1. package/README.md +8 -0
  2. package/lib/helpers/org-hierarchy.d.ts +19 -0
  3. package/lib/helpers/org-hierarchy.js +29 -1
  4. package/lib/index.d.ts +26 -0
  5. package/lib/index.js +27 -1
  6. package/lib/services/api-key-exchange.js +3 -2
  7. package/lib/services/audit-spool.js +3 -2
  8. package/lib/services/cache-service.js +5 -4
  9. package/lib/services/compliance-event-subscriber.js +3 -2
  10. package/lib/services/durable-event-bus.js +3 -2
  11. package/lib/services/entity-events.js +3 -2
  12. package/lib/services/env-redis.js +3 -2
  13. package/lib/services/http-client.js +8 -7
  14. package/lib/services/index.d.ts +6 -2
  15. package/lib/services/index.js +11 -3
  16. package/lib/services/jwks-cache.d.ts +0 -12
  17. package/lib/services/jwks-cache.js +7 -6
  18. package/lib/services/leader-lock.js +3 -2
  19. package/lib/services/notification-channels.d.ts +112 -0
  20. package/lib/services/notification-channels.js +123 -0
  21. package/lib/services/quota.js +4 -4
  22. package/lib/services/remote-audit-client.d.ts +1 -1
  23. package/lib/services/remote-audit-client.js +4 -4
  24. package/lib/services/retry-forever.d.ts +37 -0
  25. package/lib/services/retry-forever.js +58 -0
  26. package/lib/services/retry-strategy.d.ts +7 -3
  27. package/lib/services/retry-strategy.js +2 -2
  28. package/lib/services/scheduler.js +2 -2
  29. package/lib/services/service-boot.d.ts +20 -4
  30. package/lib/services/service-boot.js +10 -6
  31. package/lib/services/service-keys.js +6 -5
  32. package/lib/services/sse-ticket-store.js +3 -2
  33. package/lib/services/token-revocation.js +6 -5
  34. package/lib/testing/mock-api-core.d.ts +150 -0
  35. package/lib/testing/mock-api-core.js +246 -0
  36. package/lib/testing/mock-drizzle.d.ts +6 -0
  37. package/lib/testing/mock-drizzle.js +57 -0
  38. package/lib/types/http.d.ts +4 -0
  39. package/lib/types/http.js +1 -1
  40. package/lib/types/index.d.ts +1 -0
  41. package/lib/types/index.js +2 -1
  42. package/lib/types/metadata-keys.d.ts +543 -0
  43. package/lib/types/metadata-keys.js +117 -0
  44. package/lib/types/permissions.d.ts +19 -0
  45. package/lib/types/permissions.js +33 -1
  46. package/lib/types/quota-tiers.js +21 -31
  47. package/lib/utils/api-key.d.ts +0 -9
  48. package/lib/utils/api-key.js +2 -13
  49. package/lib/utils/audit.js +3 -2
  50. package/lib/utils/env.d.ts +6 -2
  51. package/lib/utils/env.js +9 -4
  52. package/lib/utils/identity.d.ts +37 -1
  53. package/lib/utils/identity.js +62 -10
  54. package/lib/utils/index.d.ts +2 -1
  55. package/lib/utils/index.js +7 -2
  56. package/lib/utils/params.d.ts +35 -0
  57. package/lib/utils/params.js +24 -1
  58. package/lib/utils/secret-encryption.d.ts +4 -4
  59. package/lib/utils/secret-encryption.js +5 -5
  60. package/lib/utils/ssrf.d.ts +73 -14
  61. package/lib/utils/ssrf.js +138 -21
  62. package/package.json +26 -1
@@ -77,7 +77,7 @@ export function isRateLimited(statusCode) {
77
77
  */
78
78
  export function getRetryDecision(statusCode, headers, attempt, config) {
79
79
  // 429 rate limiting — use Retry-After or longer backoff (4x base)
80
- if (isRateLimited(statusCode) && attempt < config.maxRateLimitRetries) {
80
+ if (isRateLimited(statusCode) && attempt < (config.maxRateLimitRetries ?? DEFAULT_MAX_RATE_LIMIT_RETRIES)) {
81
81
  const retryAfter = parseRetryAfter(headers['retry-after']);
82
82
  const rawDelay = retryAfter ?? (config.retryDelayMs * 4 * Math.pow(2, attempt));
83
83
  return {
@@ -115,4 +115,4 @@ export function getErrorRetryDecision(attempt, config) {
115
115
  }
116
116
  return { shouldRetry: false, delayMs: 0, reason: 'Max retries exceeded' };
117
117
  }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcmV0cnktc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3Qjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEcsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWxILHNEQUFzRDtBQUN0RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUVsQywrRUFBK0U7QUFDL0UsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUEwQi9DOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQXFDO0lBQ25FLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU3Qiw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFB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RSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxPQUFlLEVBQ2YsTUFBbUI7SUFFbkIsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEUsT0FBTztZQUNMLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO1lBQzVCLE1BQU0sRUFBRSw2QkFBNkI7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxDQUFDO0FBQzVFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcblxuLyoqXG4gKiBEZWZhdWx0IHJldHJ5IGNvbmZpZ3VyYXRpb24gKGVudjogYEhUVFBfQ0xJRU5UX01BWF9SRVRSSUVTYCwgYEhUVFBfQ0xJRU5UX1JFVFJZX0RFTEFZX01TYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9SRVRSSUVTID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuSFRUUF9DTElFTlRfTUFYX1JFVFJJRVMgfHwgJzInLCAxMCk7XG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX1JFVFJZX0RFTEFZX01TIHx8ICcyMDAnLCAxMCk7XG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuSFRUUF9DTElFTlRfTUFYX1JBVEVfTElNSVRfUkVUUklFUyB8fCAnNCcsIDEwKTtcblxuLyoqIE1heCBSZXRyeS1BZnRlciB2YWx1ZSB3ZSdsbCBob25vciAoNjAgc2Vjb25kcykuICovXG5jb25zdCBNQVhfUkVUUllfQUZURVJfTVMgPSA2MF8wMDA7XG5cbi8qKiBIVFRQIHN0YXR1cyBjb2RlcyBjb25zaWRlcmVkIHRyYW5zaWVudCBzZXJ2ZXIgZXJyb3JzIGVsaWdpYmxlIGZvciByZXRyeS4gKi9cbmNvbnN0IFRSQU5TSUVOVF9TVEFUVVNfQ09ERVMgPSBbNTAyLCA1MDMsIDUwNF07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcmV0cnkgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlDb25maWcge1xuICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzIChkZWZhdWx0OiAyKSAqL1xuICBtYXhSZXRyaWVzOiBudW1iZXI7XG4gIC8qKiBCYXNlIGRlbGF5IGJldHdlZW4gcmV0cmllcyBpbiBtcyDigJQgZG91YmxlcyBlYWNoIGF0dGVtcHQgKGRlZmF1bHQ6IDIwMCkgKi9cbiAgcmV0cnlEZWxheU1zOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHNwZWNpZmljYWxseSBmb3IgNDI5IHJhdGUgbGltaXRpbmcgKGRlZmF1bHQ6IDQpICovXG4gIG1heFJhdGVMaW1pdFJldHJpZXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSByZXRyeSBkZWNpc2lvbjogd2hldGhlciB0byByZXRyeSwgYW5kIGhvdyBsb25nIHRvIHdhaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlEZWNpc2lvbiB7XG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1ZXN0IHNob3VsZCBiZSByZXRyaWVkICovXG4gIHNob3VsZFJldHJ5OiBib29sZWFuO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSByZXRyeWluZyAod2l0aCBqaXR0ZXIgYXBwbGllZCkgKi9cbiAgZGVsYXlNczogbnVtYmVyO1xuICAvKiogSHVtYW4tcmVhZGFibGUgcmVhc29uIGZvciB0aGUgcmV0cnkgZGVjaXNpb24gKi9cbiAgcmVhc29uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgYSBgUmV0cnktQWZ0ZXJgIGhlYWRlciB2YWx1ZSBpbnRvIG1pbGxpc2Vjb25kcy5cbiAqIFN1cHBvcnRzIG51bWVyaWMgc2Vjb25kcyAoZS5nLiBcIjVcIikgYW5kIEhUVFAtZGF0ZSBmb3JtYXQuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBtaXNzaW5nIG9yIGludmFsaWQgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXRyeUFmdGVyKGhlYWRlcjogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAoIWhlYWRlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXJbMF0gOiBoZWFkZXI7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHJ5IG51bWVyaWMgc2Vjb25kcyBmaXJzdFxuICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFpc05hTihzZWNvbmRzKSAmJiBzZWNvbmRzID49IDApIHtcbiAgICByZXR1cm4gTWF0aC5taW4oc2Vjb25kcyAqIDEwMDAsIE1BWF9SRVRSWV9BRlRFUl9NUyk7XG4gIH1cblxuICAvLyBUcnkgSFRUUC1kYXRlXG4gIGNvbnN0IGRhdGUgPSBEYXRlLnBhcnNlKHZhbHVlKTtcbiAgaWYgKCFpc05hTihkYXRlKSkge1xuICAgIGNvbnN0IGRlbGF5TXMgPSBkYXRlIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAoZGVsYXlNcyA+IDApIHJldHVybiBNYXRoLm1pbihkZWxheU1zLCBNQVhfUkVUUllfQUZURVJfTVMpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBcHBseSArLy0yNSUgcmFuZG9tIGppdHRlciB0byBhIGRlbGF5IHRvIHByZXZlbnQgdGh1bmRlcmluZyBoZXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSml0dGVyKGRlbGF5OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBqaXR0ZXIgPSBkZWxheSAqIDAuMjUgKiAoMiAqIE1hdGgucmFuZG9tKCkgLSAxKTsgLy8gLTI1JSB0byArMjUlXG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGRlbGF5ICsgaml0dGVyKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgZGVsYXkgZm9yIGEgZ2l2ZW4gYXR0ZW1wdC5cbiAqXG4gKiBAcGFyYW0gYmFzZURlbGF5IC0gQmFzZSBkZWxheSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBhdHRlbXB0IC0gWmVyby1iYXNlZCBhdHRlbXB0IG51bWJlclxuICogQHJldHVybnMgRGVsYXkgaW4gbWlsbGlzZWNvbmRzICh3aXRob3V0IGppdHRlcilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmYoYmFzZURlbGF5OiBudW1iZXIsIGF0dGVtcHQ6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBiYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBhIHN0YXR1cyBjb2RlIHJlcHJlc2VudHMgYSB0cmFuc2llbnQgc2VydmVyIGVycm9yXG4gKiB0aGF0IGlzIGVsaWdpYmxlIGZvciByZXRyeSAoNTAyLCA1MDMsIDUwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zaWVudFN0YXR1c0NvZGUoc3RhdHVzQ29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBUUkFOU0lFTlRfU1RBVFVTX0NPREVTLmluY2x1ZGVzKHN0YXR1c0NvZGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHJhdGUgbGltaXRpbmcgKDQyOSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JhdGVMaW1pdGVkKHN0YXR1c0NvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gc3RhdHVzQ29kZSA9PT0gNDI5O1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgZmFpbGVkIHJlc3BvbnNlIHNob3VsZCBiZSByZXRyaWVkLCBhbmQgY29tcHV0ZSB0aGUgZGVsYXkuXG4gKlxuICogQHBhcmFtIHN0YXR1c0NvZGUgLSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZVxuICogQHBhcmFtIGhlYWRlcnMgLSBSZXNwb25zZSBoZWFkZXJzICh1c2VkIHRvIHJlYWQgUmV0cnktQWZ0ZXIgZm9yIDQyOSlcbiAqIEBwYXJhbSBhdHRlbXB0IC0gWmVyby1iYXNlZCBhdHRlbXB0IG51bWJlclxuICogQHBhcmFtIGNvbmZpZyAtIFJldHJ5IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEEgUmV0cnlEZWNpc2lvbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcmV0cnkgYW5kIHRoZSBkZWxheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmV0cnlEZWNpc2lvbihcbiAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICBoZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnMsXG4gIGF0dGVtcHQ6IG51bWJlcixcbiAgY29uZmlnOiBSZXRyeUNvbmZpZyxcbik6IFJldHJ5RGVjaXNpb24ge1xuICAvLyA0MjkgcmF0ZSBsaW1pdGluZyDigJQgdXNlIFJldHJ5LUFmdGVyIG9yIGxvbmdlciBiYWNrb2ZmICg0eCBiYXNlKVxuICBpZiAoaXNSYXRlTGltaXRlZChzdGF0dXNDb2RlKSAmJiBhdHRlbXB0IDwgY29uZmlnLm1heFJhdGVMaW1pdFJldHJpZXMpIHtcbiAgICBjb25zdCByZXRyeUFmdGVyID0gcGFyc2VSZXRyeUFmdGVyKGhlYWRlcnNbJ3JldHJ5LWFmdGVyJ10pO1xuICAgIGNvbnN0IHJhd0RlbGF5ID0gcmV0cnlBZnRlciA/PyAoY29uZmlnLnJldHJ5RGVsYXlNcyAqIDQgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJldHJ5OiB0cnVlLFxuICAgICAgZGVsYXlNczogYWRkSml0dGVyKHJhd0RlbGF5KSxcbiAgICAgIHJlYXNvbjogJ1JhdGUgbGltaXRlZCAoNDI5KScsXG4gICAgfTtcbiAgfVxuXG4gIC8vIDV4eCB0cmFuc2llbnQgc2VydmVyIGVycm9ycyDigJQgc3RhbmRhcmQgZXhwb25lbnRpYWwgYmFja29mZlxuICBpZiAoaXNUcmFuc2llbnRTdGF0dXNDb2RlKHN0YXR1c0NvZGUpICYmIGF0dGVtcHQgPCBjb25maWcubWF4UmV0cmllcykge1xuICAgIGNvbnN0IHJhd0RlbGF5ID0gY2FsY3VsYXRlQmFja29mZihjb25maWcucmV0cnlEZWxheU1zLCBhdHRlbXB0KTtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkUmV0cnk6IHRydWUsXG4gICAgICBkZWxheU1zOiBhZGRKaXR0ZXIocmF3RGVsYXkpLFxuICAgICAgcmVhc29uOiBgVHJhbnNpZW50IHNlcnZlciBlcnJvciAoJHtzdGF0dXNDb2RlfSlgLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBzaG91bGRSZXRyeTogZmFsc2UsIGRlbGF5TXM6IDAsIHJlYXNvbjogJ05vdCByZXRyeWFibGUnIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb25uZWN0aW9uL3RpbWVvdXQgZXJyb3Igc2hvdWxkIGJlIHJldHJpZWQsIGFuZCBjb21wdXRlIHRoZSBkZWxheS5cbiAqXG4gKiBAcGFyYW0gYXR0ZW1wdCAtIFplcm8tYmFzZWQgYXR0ZW1wdCBudW1iZXJcbiAqIEBwYXJhbSBjb25maWcgLSBSZXRyeSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBBIFJldHJ5RGVjaXNpb24gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHJ5IGFuZCB0aGUgZGVsYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yUmV0cnlEZWNpc2lvbihcbiAgYXR0ZW1wdDogbnVtYmVyLFxuICBjb25maWc6IFJldHJ5Q29uZmlnLFxuKTogUmV0cnlEZWNpc2lvbiB7XG4gIGlmIChhdHRlbXB0IDwgY29uZmlnLm1heFJldHJpZXMpIHtcbiAgICBjb25zdCByYXdEZWxheSA9IGNhbGN1bGF0ZUJhY2tvZmYoY29uZmlnLnJldHJ5RGVsYXlNcywgYXR0ZW1wdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJldHJ5OiB0cnVlLFxuICAgICAgZGVsYXlNczogYWRkSml0dGVyKHJhd0RlbGF5KSxcbiAgICAgIHJlYXNvbjogJ0Nvbm5lY3Rpb24gb3IgdGltZW91dCBlcnJvcicsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IHNob3VsZFJldHJ5OiBmYWxzZSwgZGVsYXlNczogMCwgcmVhc29uOiAnTWF4IHJldHJpZXMgZXhjZWVkZWQnIH07XG59XG4iXX0=
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcmV0cnktc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3Qjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEcsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRWxILHNEQUFzRDtBQUN0RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUVsQywrRUFBK0U7QUFDL0UsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUE4Qi9DOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQXFDO0lBQ25FLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU3Qiw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFB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QUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsT0FBZSxFQUNmLE1BQW1CO0lBRW5CLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLE9BQU87WUFDTCxXQUFXLEVBQUUsSUFBSTtZQUNqQixPQUFPLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQztZQUM1QixNQUFNLEVBQUUsNkJBQTZCO1NBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5cbi8qKlxuICogRGVmYXVsdCByZXRyeSBjb25maWd1cmF0aW9uIChlbnY6IGBIVFRQX0NMSUVOVF9NQVhfUkVUUklFU2AsIGBIVFRQX0NMSUVOVF9SRVRSWV9ERUxBWV9NU2ApLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfUkVUUklFUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX01BWF9SRVRSSUVTIHx8ICcyJywgMTApO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVUUllfREVMQVlfTVMgPSBwYXJzZUludChwcm9jZXNzLmVudi5IVFRQX0NMSUVOVF9SRVRSWV9ERUxBWV9NUyB8fCAnMjAwJywgMTApO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMgfHwgJzQnLCAxMCk7XG5cbi8qKiBNYXggUmV0cnktQWZ0ZXIgdmFsdWUgd2UnbGwgaG9ub3IgKDYwIHNlY29uZHMpLiAqL1xuY29uc3QgTUFYX1JFVFJZX0FGVEVSX01TID0gNjBfMDAwO1xuXG4vKiogSFRUUCBzdGF0dXMgY29kZXMgY29uc2lkZXJlZCB0cmFuc2llbnQgc2VydmVyIGVycm9ycyBlbGlnaWJsZSBmb3IgcmV0cnkuICovXG5jb25zdCBUUkFOU0lFTlRfU1RBVFVTX0NPREVTID0gWzUwMiwgNTAzLCA1MDRdO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHJldHJ5IGJlaGF2aW9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5Q29uZmlnIHtcbiAgLyoqIFJldHJpZXMgQUZURVIgdGhlIGluaXRpYWwgYXR0ZW1wdCAoc28gYDNgIOKHkiB1cCB0byA0IGF0dGVtcHRzKS4gKi9cbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbXMg4oCUIGRvdWJsZXMgZWFjaCBhdHRlbXB0IChkZWZhdWx0OiAyMDApICovXG4gIHJldHJ5RGVsYXlNczogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBzcGVjaWZpY2FsbHkgZm9yIDQyOSByYXRlIGxpbWl0aW5nIChkZWZhdWx0OlxuICAgKiB7QGxpbmsgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTfSkuIEhUVFAtb25seSDigJQgb21pdCBpdCBmb3IgYVxuICAgKiBub24tSFRUUCBjb25zdW1lciBzdWNoIGFzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHJldHJ5LlxuICAgKi9cbiAgbWF4UmF0ZUxpbWl0UmV0cmllcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSByZXRyeSBkZWNpc2lvbjogd2hldGhlciB0byByZXRyeSwgYW5kIGhvdyBsb25nIHRvIHdhaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlEZWNpc2lvbiB7XG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1ZXN0IHNob3VsZCBiZSByZXRyaWVkICovXG4gIHNob3VsZFJldHJ5OiBib29sZWFuO1xuICAvKiogRGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSByZXRyeWluZyAod2l0aCBqaXR0ZXIgYXBwbGllZCkgKi9cbiAgZGVsYXlNczogbnVtYmVyO1xuICAvKiogSHVtYW4tcmVhZGFibGUgcmVhc29uIGZvciB0aGUgcmV0cnkgZGVjaXNpb24gKi9cbiAgcmVhc29uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgYSBgUmV0cnktQWZ0ZXJgIGhlYWRlciB2YWx1ZSBpbnRvIG1pbGxpc2Vjb25kcy5cbiAqIFN1cHBvcnRzIG51bWVyaWMgc2Vjb25kcyAoZS5nLiBcIjVcIikgYW5kIEhUVFAtZGF0ZSBmb3JtYXQuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBtaXNzaW5nIG9yIGludmFsaWQgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXRyeUFmdGVyKGhlYWRlcjogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAoIWhlYWRlcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdmFsdWUgPSBBcnJheS5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXJbMF0gOiBoZWFkZXI7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gVHJ5IG51bWVyaWMgc2Vjb25kcyBmaXJzdFxuICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFpc05hTihzZWNvbmRzKSAmJiBzZWNvbmRzID49IDApIHtcbiAgICByZXR1cm4gTWF0aC5taW4oc2Vjb25kcyAqIDEwMDAsIE1BWF9SRVRSWV9BRlRFUl9NUyk7XG4gIH1cblxuICAvLyBUcnkgSFRUUC1kYXRlXG4gIGNvbnN0IGRhdGUgPSBEYXRlLnBhcnNlKHZhbHVlKTtcbiAgaWYgKCFpc05hTihkYXRlKSkge1xuICAgIGNvbnN0IGRlbGF5TXMgPSBkYXRlIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAoZGVsYXlNcyA+IDApIHJldHVybiBNYXRoLm1pbihkZWxheU1zLCBNQVhfUkVUUllfQUZURVJfTVMpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBcHBseSArLy0yNSUgcmFuZG9tIGppdHRlciB0byBhIGRlbGF5IHRvIHByZXZlbnQgdGh1bmRlcmluZyBoZXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSml0dGVyKGRlbGF5OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBqaXR0ZXIgPSBkZWxheSAqIDAuMjUgKiAoMiAqIE1hdGgucmFuZG9tKCkgLSAxKTsgLy8gLTI1JSB0byArMjUlXG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGRlbGF5ICsgaml0dGVyKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgZGVsYXkgZm9yIGEgZ2l2ZW4gYXR0ZW1wdC5cbiAqXG4gKiBAcGFyYW0gYmFzZURlbGF5IC0gQmFzZSBkZWxheSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBhdHRlbXB0IC0gWmVyby1iYXNlZCBhdHRlbXB0IG51bWJlclxuICogQHJldHVybnMgRGVsYXkgaW4gbWlsbGlzZWNvbmRzICh3aXRob3V0IGppdHRlcilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmYoYmFzZURlbGF5OiBudW1iZXIsIGF0dGVtcHQ6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBiYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBhIHN0YXR1cyBjb2RlIHJlcHJlc2VudHMgYSB0cmFuc2llbnQgc2VydmVyIGVycm9yXG4gKiB0aGF0IGlzIGVsaWdpYmxlIGZvciByZXRyeSAoNTAyLCA1MDMsIDUwNCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyYW5zaWVudFN0YXR1c0NvZGUoc3RhdHVzQ29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBUUkFOU0lFTlRfU1RBVFVTX0NPREVTLmluY2x1ZGVzKHN0YXR1c0NvZGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHJhdGUgbGltaXRpbmcgKDQyOSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JhdGVMaW1pdGVkKHN0YXR1c0NvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gc3RhdHVzQ29kZSA9PT0gNDI5O1xufVxuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIGEgZmFpbGVkIHJlc3BvbnNlIHNob3VsZCBiZSByZXRyaWVkLCBhbmQgY29tcHV0ZSB0aGUgZGVsYXkuXG4gKlxuICogQHBhcmFtIHN0YXR1c0NvZGUgLSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZVxuICogQHBhcmFtIGhlYWRlcnMgLSBSZXNwb25zZSBoZWFkZXJzICh1c2VkIHRvIHJlYWQgUmV0cnktQWZ0ZXIgZm9yIDQyOSlcbiAqIEBwYXJhbSBhdHRlbXB0IC0gWmVyby1iYXNlZCBhdHRlbXB0IG51bWJlclxuICogQHBhcmFtIGNvbmZpZyAtIFJldHJ5IGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEEgUmV0cnlEZWNpc2lvbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcmV0cnkgYW5kIHRoZSBkZWxheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmV0cnlEZWNpc2lvbihcbiAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICBoZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnMsXG4gIGF0dGVtcHQ6IG51bWJlcixcbiAgY29uZmlnOiBSZXRyeUNvbmZpZyxcbik6IFJldHJ5RGVjaXNpb24ge1xuICAvLyA0MjkgcmF0ZSBsaW1pdGluZyDigJQgdXNlIFJldHJ5LUFmdGVyIG9yIGxvbmdlciBiYWNrb2ZmICg0eCBiYXNlKVxuICBpZiAoaXNSYXRlTGltaXRlZChzdGF0dXNDb2RlKSAmJiBhdHRlbXB0IDwgKGNvbmZpZy5tYXhSYXRlTGltaXRSZXRyaWVzID8/IERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUykpIHtcbiAgICBjb25zdCByZXRyeUFmdGVyID0gcGFyc2VSZXRyeUFmdGVyKGhlYWRlcnNbJ3JldHJ5LWFmdGVyJ10pO1xuICAgIGNvbnN0IHJhd0RlbGF5ID0gcmV0cnlBZnRlciA/PyAoY29uZmlnLnJldHJ5RGVsYXlNcyAqIDQgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJldHJ5OiB0cnVlLFxuICAgICAgZGVsYXlNczogYWRkSml0dGVyKHJhd0RlbGF5KSxcbiAgICAgIHJlYXNvbjogJ1JhdGUgbGltaXRlZCAoNDI5KScsXG4gICAgfTtcbiAgfVxuXG4gIC8vIDV4eCB0cmFuc2llbnQgc2VydmVyIGVycm9ycyDigJQgc3RhbmRhcmQgZXhwb25lbnRpYWwgYmFja29mZlxuICBpZiAoaXNUcmFuc2llbnRTdGF0dXNDb2RlKHN0YXR1c0NvZGUpICYmIGF0dGVtcHQgPCBjb25maWcubWF4UmV0cmllcykge1xuICAgIGNvbnN0IHJhd0RlbGF5ID0gY2FsY3VsYXRlQmFja29mZihjb25maWcucmV0cnlEZWxheU1zLCBhdHRlbXB0KTtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkUmV0cnk6IHRydWUsXG4gICAgICBkZWxheU1zOiBhZGRKaXR0ZXIocmF3RGVsYXkpLFxuICAgICAgcmVhc29uOiBgVHJhbnNpZW50IHNlcnZlciBlcnJvciAoJHtzdGF0dXNDb2RlfSlgLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBzaG91bGRSZXRyeTogZmFsc2UsIGRlbGF5TXM6IDAsIHJlYXNvbjogJ05vdCByZXRyeWFibGUnIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb25uZWN0aW9uL3RpbWVvdXQgZXJyb3Igc2hvdWxkIGJlIHJldHJpZWQsIGFuZCBjb21wdXRlIHRoZSBkZWxheS5cbiAqXG4gKiBAcGFyYW0gYXR0ZW1wdCAtIFplcm8tYmFzZWQgYXR0ZW1wdCBudW1iZXJcbiAqIEBwYXJhbSBjb25maWcgLSBSZXRyeSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBBIFJldHJ5RGVjaXNpb24gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHJ5IGFuZCB0aGUgZGVsYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yUmV0cnlEZWNpc2lvbihcbiAgYXR0ZW1wdDogbnVtYmVyLFxuICBjb25maWc6IFJldHJ5Q29uZmlnLFxuKTogUmV0cnlEZWNpc2lvbiB7XG4gIGlmIChhdHRlbXB0IDwgY29uZmlnLm1heFJldHJpZXMpIHtcbiAgICBjb25zdCByYXdEZWxheSA9IGNhbGN1bGF0ZUJhY2tvZmYoY29uZmlnLnJldHJ5RGVsYXlNcywgYXR0ZW1wdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZFJldHJ5OiB0cnVlLFxuICAgICAgZGVsYXlNczogYWRkSml0dGVyKHJhd0RlbGF5KSxcbiAgICAgIHJlYXNvbjogJ0Nvbm5lY3Rpb24gb3IgdGltZW91dCBlcnJvcicsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IHNob3VsZFJldHJ5OiBmYWxzZSwgZGVsYXlNczogMCwgcmVhc29uOiAnTWF4IHJldHJpZXMgZXhjZWVkZWQnIH07XG59XG4iXX0=
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { withLeaderLock } from './leader-lock.js';
4
4
  import { createLogger } from '../utils/logger.js';
5
- const errorMessage = (e) => (e instanceof Error ? e.message : String(e));
5
+ import { errorMessage } from '../utils/response.js';
6
6
  /**
7
7
  * A periodic background job: a single unref'd `setInterval` with start-once
8
8
  * semantics, error isolation (a throwing cycle is logged, never crashes the
@@ -83,4 +83,4 @@ export function createScheduler(opts) {
83
83
  },
84
84
  };
85
85
  }
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQWtCLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBa0NsRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBc0I7SUFDcEQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLFFBQVEsR0FBMEMsSUFBSSxDQUFDO0lBQzNELElBQUksT0FBTyxHQUF5QyxJQUFJLENBQUM7SUFDekQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVwQixNQUFNLEtBQUssR0FBRyxLQUFLLElBQW1CLEVBQUU7UUFDdEMsNEVBQTRFO1FBQzVFLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UsOEVBQThFO1FBQzlFLHFCQUFxQjtRQUNyQixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osR0FBRyxDQUFDLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1lBQ2pGLE9BQU87UUFDVCxDQUFDO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNmLElBQUksQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNkLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xGLElBQUksQ0FBQyxHQUFHO29CQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUNwRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsR0FBRyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7Z0JBQVMsQ0FBQztZQUNULE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sS0FBSyxHQUFHLEdBQVMsRUFBRTtRQUN2QixJQUFJLE9BQU87WUFBRSxPQUFPLENBQUMseUNBQXlDO1FBQzlELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLO1lBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM1QyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixPQUFPO1FBQ0wsS0FBSztZQUNILElBQUksUUFBUSxJQUFJLE9BQU87Z0JBQUUsT0FBTztZQUNoQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2hCLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzlFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxFQUFFLENBQUM7WUFDVixDQUFDO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELElBQUk7WUFDRixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUFDLENBQUM7WUFDdkQsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUFDLENBQUM7WUFDM0QsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyB3aXRoTGVhZGVyTG9jaywgdHlwZSBMb2NrUmVkaXMgfSBmcm9tICcuL2xlYWRlci1sb2NrLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGVycm9yTWVzc2FnZSA9IChlOiB1bmtub3duKSA9PiAoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcblxuLyoqIE9wdGlvbmFsIGNyb3NzLXBvZCBzaW5nbGUtcnVubmVyIGxvY2sgZm9yIGEgc2NoZWR1bGVyJ3MgY3ljbGUuIFRoZSByZWRpc1xuICogIGNsaWVudCBpcyByZXNvbHZlZCBwZXIgY3ljbGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckxvY2sge1xuICByZWRpczogKCkgPT4gTG9ja1JlZGlzO1xuICBrZXk6IHN0cmluZztcbiAgdHRsTXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJPcHRpb25zIHtcbiAgLyoqIExvZyBsYWJlbCAoYWxzbyB0aGUgbG9nZ2VyIG5hbWUpLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBJbnRlcnZhbCBiZXR3ZWVuIGN5Y2xlcyAobXMpLiAqL1xuICBpbnRlcnZhbE1zOiBudW1iZXI7XG4gIC8qKiBUaGUgd29yayB0byBydW4gZWFjaCBjeWNsZS4gRXJyb3JzIGFyZSBjYXVnaHQgKyBsb2dnZWQsIG5ldmVyIHRocm93bi4gKi9cbiAgcnVuOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogUnVuIGEgY3ljbGUgaW1tZWRpYXRlbHkgd2hlbiBzdGFydGVkLiBEZWZhdWx0IHRydWUuICovXG4gIHJ1bk9uU3RhcnQ/OiBib29sZWFuO1xuICAvKiogRGVsYXkgYmVmb3JlIHRoZSBmaXJzdCBjeWNsZSAoYW5kIGJlZm9yZSB0aGUgaW50ZXJ2YWwgYmVnaW5zKSwgbXMuXG4gICAqICBEZWZhdWx0IDAuIExldHMgYSBzZXJ2aWNlIHdhaXQgZm9yIGRlcGVuZGVuY2llcyB0byBjb21lIHVwLiAqL1xuICBzdGFydHVwRGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIFdoZW4gc2V0LCBlYWNoIGN5Y2xlIHJ1bnMgb25seSBvbiB0aGUgcG9kIHRoYXQgd2lucyB0aGlzIGxvY2sg4oCUIHNvIHdpdGhcbiAgICogIG11bHRpcGxlIHJlcGxpY2FzIG9ubHkgb25lIHJ1bnMgcGVyIHdpbmRvdy4gKi9cbiAgbG9jaz86IFNjaGVkdWxlckxvY2s7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyIHtcbiAgLyoqIFN0YXJ0IHRoZSB0aW1lci4gSWRlbXBvdGVudCDigJQgcmVwZWF0ZWQgY2FsbHMgYXJlIG5vLW9wcy4gKi9cbiAgc3RhcnQoKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIHRpbWVyIChhbmQgY2FuY2VsIGEgcGVuZGluZyBzdGFydHVwIGRlbGF5KS4gU2FmZSBiZWZvcmUgc3RhcnQuICovXG4gIHN0b3AoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIHBlcmlvZGljIGJhY2tncm91bmQgam9iOiBhIHNpbmdsZSB1bnJlZidkIGBzZXRJbnRlcnZhbGAgd2l0aCBzdGFydC1vbmNlXG4gKiBzZW1hbnRpY3MsIGVycm9yIGlzb2xhdGlvbiAoYSB0aHJvd2luZyBjeWNsZSBpcyBsb2dnZWQsIG5ldmVyIGNyYXNoZXMgdGhlXG4gKiBsb29wKSwgYW4gb3B0aW9uYWwgc3RhcnR1cCBkZWxheSwgYW5kIGFuIG9wdGlvbmFsIGNyb3NzLXBvZCBsZWFkZXIgbG9jay5cbiAqXG4gKiBSZXBsYWNlcyB0aGUgaGFuZC1yb2xsZWQgdGltZXIvYHVucmVmYC9gY2F0Y2hgL3N0YXJ0LXN0b3AgYm9pbGVycGxhdGUgdGhhdFxuICogZWFjaCBzY2hlZHVsZXIgKHNjYW4sIGRpZ2VzdCwgcmVnaXN0cnkgR0MsIGJpbGxpbmcgbGlmZWN5Y2xlKSByZXBlYXRlZCwgYW5kXG4gKiBtYWtlcyB0aGUgbGVhZGVyIGxvY2sgYXZhaWxhYmxlIHRvIGFsbCBvZiB0aGVtIHVuaWZvcm1seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjaGVkdWxlcihvcHRzOiBTY2hlZHVsZXJPcHRpb25zKTogU2NoZWR1bGVyIHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKG9wdHMubmFtZSk7XG4gIGxldCBpbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdGFydHVwOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuICBsZXQgcnVubmluZyA9IGZhbHNlO1xuXG4gIGNvbnN0IGN5Y2xlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFNhbWUtcG9kIHJlLWVudHJhbmN5IGd1YXJkOiBzZXRJbnRlcnZhbCBkb2Vzbid0IGF3YWl0IHRoZSBhc3luYyBjeWNsZSwgc29cbiAgICAvLyBhIGN5Y2xlIHNsb3dlciB0aGFuIGludGVydmFsTXMgd291bGQgb3RoZXJ3aXNlIG92ZXJsYXAgSVRTRUxGIG9uIHRoaXMgcG9kXG4gICAgLy8gKGRvdWJsZS1wcm9jZXNzaW5nLCBkdXBsaWNhdGUgc2lkZSBlZmZlY3RzKS4gVGhlIG9wdGlvbmFsIGxlYWRlciBsb2NrIG9ubHlcbiAgICAvLyBndWFyZHMgQ1JPU1MtcG9kIG92ZXJsYXA7IHRoaXMgZ3VhcmRzIHNhbWUtcG9kLiBBIHNraXBwZWQgdGljayBqdXN0IHJ1bnMgb25cbiAgICAvLyB0aGUgbmV4dCBpbnRlcnZhbC5cbiAgICBpZiAocnVubmluZykge1xuICAgICAgbG9nLmRlYnVnKCdDeWNsZSBza2lwcGVkIOKAlCBwcmV2aW91cyBjeWNsZSBzdGlsbCBydW5uaW5nIChzYW1lLXBvZCByZS1lbnRyYW5jeSknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcnVubmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChvcHRzLmxvY2spIHtcbiAgICAgICAgY29uc3QgcmVkaXMgPSBvcHRzLmxvY2sucmVkaXMoKTtcbiAgICAgICAgY29uc3QgcmFuID0gYXdhaXQgd2l0aExlYWRlckxvY2socmVkaXMsIG9wdHMubG9jay5rZXksIG9wdHMubG9jay50dGxNcywgb3B0cy5ydW4pO1xuICAgICAgICBpZiAoIXJhbikgbG9nLmRlYnVnKCdDeWNsZSBza2lwcGVkIOKAlCBhbm90aGVyIHBvZCBob2xkcyB0aGUgbG9jaycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgb3B0cy5ydW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvcignU2NoZWR1bGVyIGN5Y2xlIGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBydW5uaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGJlZ2luID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzdG9wcGVkKSByZXR1cm47IC8vIHN0b3AoKSBjYWxsZWQgZHVyaW5nIHRoZSBzdGFydHVwIGRlbGF5XG4gICAgaWYgKG9wdHMucnVuT25TdGFydCAhPT0gZmFsc2UpIHZvaWQgY3ljbGUoKTtcbiAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHZvaWQgY3ljbGUoKSwgb3B0cy5pbnRlcnZhbE1zKTtcbiAgICBpbnRlcnZhbC51bnJlZigpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnQoKTogdm9pZCB7XG4gICAgICBpZiAoaW50ZXJ2YWwgfHwgc3RhcnR1cCkgcmV0dXJuO1xuICAgICAgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgaWYgKG9wdHMuc3RhcnR1cERlbGF5TXMgJiYgb3B0cy5zdGFydHVwRGVsYXlNcyA+IDApIHtcbiAgICAgICAgc3RhcnR1cCA9IHNldFRpbWVvdXQoKCkgPT4geyBzdGFydHVwID0gbnVsbDsgYmVnaW4oKTsgfSwgb3B0cy5zdGFydHVwRGVsYXlNcyk7XG4gICAgICAgIHN0YXJ0dXAudW5yZWYoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJlZ2luKCk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbygnU2NoZWR1bGVyIHN0YXJ0ZWQnLCB7IGludGVydmFsTXM6IG9wdHMuaW50ZXJ2YWxNcywgbG9ja2VkOiAhIW9wdHMubG9jayB9KTtcbiAgICB9LFxuICAgIHN0b3AoKTogdm9pZCB7XG4gICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzdGFydHVwKSB7IGNsZWFyVGltZW91dChzdGFydHVwKTsgc3RhcnR1cCA9IG51bGw7IH1cbiAgICAgIGlmIChpbnRlcnZhbCkgeyBjbGVhckludGVydmFsKGludGVydmFsKTsgaW50ZXJ2YWwgPSBudWxsOyB9XG4gICAgICBsb2cuaW5mbygnU2NoZWR1bGVyIHN0b3BwZWQnKTtcbiAgICB9LFxuICB9O1xufVxuIl19
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQWtCLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWtDcEQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQXNCO0lBQ3BELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBSSxRQUFRLEdBQTBDLElBQUksQ0FBQztJQUMzRCxJQUFJLE9BQU8sR0FBeUMsSUFBSSxDQUFDO0lBQ3pELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFFcEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxJQUFtQixFQUFFO1FBQ3RDLDRFQUE0RTtRQUM1RSw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLDhFQUE4RTtRQUM5RSxxQkFBcUI7UUFDckIsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLEdBQUcsQ0FBQyxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztZQUNqRixPQUFPO1FBQ1QsQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLENBQUMsR0FBRztvQkFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDcEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO2dCQUFTLENBQUM7WUFDVCxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLEtBQUssR0FBRyxHQUFTLEVBQUU7UUFDdkIsSUFBSSxPQUFPO1lBQUUsT0FBTyxDQUFDLHlDQUF5QztRQUM5RCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSztZQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDNUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsT0FBTztRQUNMLEtBQUs7WUFDSCxJQUFJLFFBQVEsSUFBSSxPQUFPO2dCQUFFLE9BQU87WUFDaEMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssRUFBRSxDQUFDO1lBQ1YsQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFDRCxJQUFJO1lBQ0YsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFBQyxDQUFDO1lBQ3ZELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFBQyxDQUFDO1lBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoQyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgd2l0aExlYWRlckxvY2ssIHR5cGUgTG9ja1JlZGlzIH0gZnJvbSAnLi9sZWFkZXItbG9jay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKiogT3B0aW9uYWwgY3Jvc3MtcG9kIHNpbmdsZS1ydW5uZXIgbG9jayBmb3IgYSBzY2hlZHVsZXIncyBjeWNsZS4gVGhlIHJlZGlzXG4gKiAgY2xpZW50IGlzIHJlc29sdmVkIHBlciBjeWNsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyTG9jayB7XG4gIHJlZGlzOiAoKSA9PiBMb2NrUmVkaXM7XG4gIGtleTogc3RyaW5nO1xuICB0dGxNczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlck9wdGlvbnMge1xuICAvKiogTG9nIGxhYmVsIChhbHNvIHRoZSBsb2dnZXIgbmFtZSkuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEludGVydmFsIGJldHdlZW4gY3ljbGVzIChtcykuICovXG4gIGludGVydmFsTXM6IG51bWJlcjtcbiAgLyoqIFRoZSB3b3JrIHRvIHJ1biBlYWNoIGN5Y2xlLiBFcnJvcnMgYXJlIGNhdWdodCArIGxvZ2dlZCwgbmV2ZXIgdGhyb3duLiAqL1xuICBydW46ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKiBSdW4gYSBjeWNsZSBpbW1lZGlhdGVseSB3aGVuIHN0YXJ0ZWQuIERlZmF1bHQgdHJ1ZS4gKi9cbiAgcnVuT25TdGFydD86IGJvb2xlYW47XG4gIC8qKiBEZWxheSBiZWZvcmUgdGhlIGZpcnN0IGN5Y2xlIChhbmQgYmVmb3JlIHRoZSBpbnRlcnZhbCBiZWdpbnMpLCBtcy5cbiAgICogIERlZmF1bHQgMC4gTGV0cyBhIHNlcnZpY2Ugd2FpdCBmb3IgZGVwZW5kZW5jaWVzIHRvIGNvbWUgdXAuICovXG4gIHN0YXJ0dXBEZWxheU1zPzogbnVtYmVyO1xuICAvKiogV2hlbiBzZXQsIGVhY2ggY3ljbGUgcnVucyBvbmx5IG9uIHRoZSBwb2QgdGhhdCB3aW5zIHRoaXMgbG9jayDigJQgc28gd2l0aFxuICAgKiAgbXVsdGlwbGUgcmVwbGljYXMgb25seSBvbmUgcnVucyBwZXIgd2luZG93LiAqL1xuICBsb2NrPzogU2NoZWR1bGVyTG9jaztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXIge1xuICAvKiogU3RhcnQgdGhlIHRpbWVyLiBJZGVtcG90ZW50IOKAlCByZXBlYXRlZCBjYWxscyBhcmUgbm8tb3BzLiAqL1xuICBzdGFydCgpOiB2b2lkO1xuICAvKiogU3RvcCB0aGUgdGltZXIgKGFuZCBjYW5jZWwgYSBwZW5kaW5nIHN0YXJ0dXAgZGVsYXkpLiBTYWZlIGJlZm9yZSBzdGFydC4gKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgcGVyaW9kaWMgYmFja2dyb3VuZCBqb2I6IGEgc2luZ2xlIHVucmVmJ2QgYHNldEludGVydmFsYCB3aXRoIHN0YXJ0LW9uY2VcbiAqIHNlbWFudGljcywgZXJyb3IgaXNvbGF0aW9uIChhIHRocm93aW5nIGN5Y2xlIGlzIGxvZ2dlZCwgbmV2ZXIgY3Jhc2hlcyB0aGVcbiAqIGxvb3ApLCBhbiBvcHRpb25hbCBzdGFydHVwIGRlbGF5LCBhbmQgYW4gb3B0aW9uYWwgY3Jvc3MtcG9kIGxlYWRlciBsb2NrLlxuICpcbiAqIFJlcGxhY2VzIHRoZSBoYW5kLXJvbGxlZCB0aW1lci9gdW5yZWZgL2BjYXRjaGAvc3RhcnQtc3RvcCBib2lsZXJwbGF0ZSB0aGF0XG4gKiBlYWNoIHNjaGVkdWxlciAoc2NhbiwgZGlnZXN0LCByZWdpc3RyeSBHQywgYmlsbGluZyBsaWZlY3ljbGUpIHJlcGVhdGVkLCBhbmRcbiAqIG1ha2VzIHRoZSBsZWFkZXIgbG9jayBhdmFpbGFibGUgdG8gYWxsIG9mIHRoZW0gdW5pZm9ybWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NoZWR1bGVyKG9wdHM6IFNjaGVkdWxlck9wdGlvbnMpOiBTY2hlZHVsZXIge1xuICBjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIob3B0cy5uYW1lKTtcbiAgbGV0IGludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHN0YXJ0dXA6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gIGxldCBydW5uaW5nID0gZmFsc2U7XG5cbiAgY29uc3QgY3ljbGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8gU2FtZS1wb2QgcmUtZW50cmFuY3kgZ3VhcmQ6IHNldEludGVydmFsIGRvZXNuJ3QgYXdhaXQgdGhlIGFzeW5jIGN5Y2xlLCBzb1xuICAgIC8vIGEgY3ljbGUgc2xvd2VyIHRoYW4gaW50ZXJ2YWxNcyB3b3VsZCBvdGhlcndpc2Ugb3ZlcmxhcCBJVFNFTEYgb24gdGhpcyBwb2RcbiAgICAvLyAoZG91YmxlLXByb2Nlc3NpbmcsIGR1cGxpY2F0ZSBzaWRlIGVmZmVjdHMpLiBUaGUgb3B0aW9uYWwgbGVhZGVyIGxvY2sgb25seVxuICAgIC8vIGd1YXJkcyBDUk9TUy1wb2Qgb3ZlcmxhcDsgdGhpcyBndWFyZHMgc2FtZS1wb2QuIEEgc2tpcHBlZCB0aWNrIGp1c3QgcnVucyBvblxuICAgIC8vIHRoZSBuZXh0IGludGVydmFsLlxuICAgIGlmIChydW5uaW5nKSB7XG4gICAgICBsb2cuZGVidWcoJ0N5Y2xlIHNraXBwZWQg4oCUIHByZXZpb3VzIGN5Y2xlIHN0aWxsIHJ1bm5pbmcgKHNhbWUtcG9kIHJlLWVudHJhbmN5KScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgaWYgKG9wdHMubG9jaykge1xuICAgICAgICBjb25zdCByZWRpcyA9IG9wdHMubG9jay5yZWRpcygpO1xuICAgICAgICBjb25zdCByYW4gPSBhd2FpdCB3aXRoTGVhZGVyTG9jayhyZWRpcywgb3B0cy5sb2NrLmtleSwgb3B0cy5sb2NrLnR0bE1zLCBvcHRzLnJ1bik7XG4gICAgICAgIGlmICghcmFuKSBsb2cuZGVidWcoJ0N5Y2xlIHNraXBwZWQg4oCUIGFub3RoZXIgcG9kIGhvbGRzIHRoZSBsb2NrJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBvcHRzLnJ1bigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmVycm9yKCdTY2hlZHVsZXIgY3ljbGUgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYmVnaW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0b3BwZWQpIHJldHVybjsgLy8gc3RvcCgpIGNhbGxlZCBkdXJpbmcgdGhlIHN0YXJ0dXAgZGVsYXlcbiAgICBpZiAob3B0cy5ydW5PblN0YXJ0ICE9PSBmYWxzZSkgdm9pZCBjeWNsZSgpO1xuICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdm9pZCBjeWNsZSgpLCBvcHRzLmludGVydmFsTXMpO1xuICAgIGludGVydmFsLnVucmVmKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCgpOiB2b2lkIHtcbiAgICAgIGlmIChpbnRlcnZhbCB8fCBzdGFydHVwKSByZXR1cm47XG4gICAgICBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBpZiAob3B0cy5zdGFydHVwRGVsYXlNcyAmJiBvcHRzLnN0YXJ0dXBEZWxheU1zID4gMCkge1xuICAgICAgICBzdGFydHVwID0gc2V0VGltZW91dCgoKSA9PiB7IHN0YXJ0dXAgPSBudWxsOyBiZWdpbigpOyB9LCBvcHRzLnN0YXJ0dXBEZWxheU1zKTtcbiAgICAgICAgc3RhcnR1cC51bnJlZigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVnaW4oKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RhcnRlZCcsIHsgaW50ZXJ2YWxNczogb3B0cy5pbnRlcnZhbE1zLCBsb2NrZWQ6ICEhb3B0cy5sb2NrIH0pO1xuICAgIH0sXG4gICAgc3RvcCgpOiB2b2lkIHtcbiAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgaWYgKHN0YXJ0dXApIHsgY2xlYXJUaW1lb3V0KHN0YXJ0dXApOyBzdGFydHVwID0gbnVsbDsgfVxuICAgICAgaWYgKGludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOyBpbnRlcnZhbCA9IG51bGw7IH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RvcHBlZCcpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
@@ -1,4 +1,16 @@
1
1
  import type { RemoteAuditClient } from './remote-audit-client.js';
2
+ import { type TokenRevocationStore } from '../middleware/auth.js';
3
+ /** Per-service overrides for {@link wireServiceSecurity}. */
4
+ export interface ServiceSecurityOptions {
5
+ /**
6
+ * Token-revocation reader to register instead of the env-Redis one. The
7
+ * plugin service passes a store built on the pooled ioredis connection its
8
+ * BullMQ build queue and readiness probe already share, so the process holds
9
+ * ONE Redis connection rather than two. Fail-open either way: a miss/outage
10
+ * yields null and auth degrades to natural token expiry.
11
+ */
12
+ tokenRevocationStore?: TokenRevocationStore;
13
+ }
2
14
  /**
3
15
  * Wire the two boot-security concerns every stateless service sets up
4
16
  * identically at startup:
@@ -12,11 +24,15 @@ import type { RemoteAuditClient } from './remote-audit-client.js';
12
24
  *
13
25
  * Collapses the copy-pasted lines in each service's `index.ts` into one call.
14
26
  *
15
- * NOTE: the PLUGIN service opts out — it shares its health-check Redis
16
- * connection via `createRedisTokenRevocationStore(getHealthRedisConnection())`
17
- * instead of the env-Redis store — so it wires these two concerns by hand.
27
+ * EVERY stateless service goes through here, plugin included. Plugin used to
28
+ * hand-roll these three calls because it needs a different revocation store
29
+ * (its pooled BullMQ Redis connection, not the env-Redis one) — which meant the
30
+ * next concern added here would have silently skipped it. That override is now
31
+ * a parameter, so opting out of the env-Redis store no longer means opting out
32
+ * of the wiring.
18
33
  *
19
34
  * @param serviceName short service name minted into the `authz.denied` records
20
35
  * @param getAuditClient lazy accessor for the service's RemoteAuditClient
36
+ * @param opts per-service overrides — see {@link ServiceSecurityOptions}
21
37
  */
22
- export declare function wireServiceSecurity(serviceName: string, getAuditClient: () => RemoteAuditClient): void;
38
+ export declare function wireServiceSecurity(serviceName: string, getAuditClient: () => RemoteAuditClient, opts?: ServiceSecurityOptions): void;
@@ -17,16 +17,20 @@ import { setTokenRevocationStore } from '../middleware/auth.js';
17
17
  *
18
18
  * Collapses the copy-pasted lines in each service's `index.ts` into one call.
19
19
  *
20
- * NOTE: the PLUGIN service opts out — it shares its health-check Redis
21
- * connection via `createRedisTokenRevocationStore(getHealthRedisConnection())`
22
- * instead of the env-Redis store — so it wires these two concerns by hand.
20
+ * EVERY stateless service goes through here, plugin included. Plugin used to
21
+ * hand-roll these three calls because it needs a different revocation store
22
+ * (its pooled BullMQ Redis connection, not the env-Redis one) — which meant the
23
+ * next concern added here would have silently skipped it. That override is now
24
+ * a parameter, so opting out of the env-Redis store no longer means opting out
25
+ * of the wiring.
23
26
  *
24
27
  * @param serviceName short service name minted into the `authz.denied` records
25
28
  * @param getAuditClient lazy accessor for the service's RemoteAuditClient
29
+ * @param opts per-service overrides — see {@link ServiceSecurityOptions}
26
30
  */
27
- export function wireServiceSecurity(serviceName, getAuditClient) {
31
+ export function wireServiceSecurity(serviceName, getAuditClient, opts = {}) {
28
32
  wireAuthzDenialAuditor(serviceName, getAuditClient);
29
- setTokenRevocationStore(createEnvRedisTokenRevocationStore());
33
+ setTokenRevocationStore(opts.tokenRevocationStore ?? createEnvRedisTokenRevocationStore());
30
34
  setApiKeyExchangeServiceName(serviceName);
31
35
  }
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1ib290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2UtYm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWhFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFdBQW1CLEVBQUUsY0FBdUM7SUFDOUYsc0JBQXNCLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3BELHVCQUF1QixDQUFDLGtDQUFrQyxFQUFFLENBQUMsQ0FBQztJQUM5RCw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNldEFwaUtleUV4Y2hhbmdlU2VydmljZU5hbWUgfSBmcm9tICcuL2FwaS1rZXktZXhjaGFuZ2UuanMnO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVBdWRpdENsaWVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yIH0gZnJvbSAnLi9yZW1vdGUtYXVkaXQtY2xpZW50LmpzJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUgfSBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuaW1wb3J0IHsgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuXG4vKipcbiAqIFdpcmUgdGhlIHR3byBib290LXNlY3VyaXR5IGNvbmNlcm5zIGV2ZXJ5IHN0YXRlbGVzcyBzZXJ2aWNlIHNldHMgdXBcbiAqIGlkZW50aWNhbGx5IGF0IHN0YXJ0dXA6XG4gKiAgIDEuIGZvcndhcmQgZGVuaWVkIChub24tR0VUKSBhdXRob3JpemF0aW9ucyB0byB0aGUgc2hhcmVkIGBhdXRoei5kZW5pZWRgXG4gKiAgICAgIGF1ZGl0IHNpbmsgKGB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yYCk7XG4gKiAgIDIuIHJlZ2lzdGVyIHRoZSBlbnYtUmVkaXMgdG9rZW4tcmV2b2NhdGlvbiByZWFkZXIgKGZhaWwtb3Blbikgc29cbiAqICAgICAgYHJlcXVpcmVBdXRoYCBjYW4gcmVqZWN0IGEgdG9rZW4gYmVoaW5kIHRoZSBwbGF0Zm9ybS1wdWJsaXNoZWRcbiAqICAgICAgYHRva2VuVmVyc2lvbmAgKGBzZXRUb2tlblJldm9jYXRpb25TdG9yZShjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKCkpYCk7XG4gKiAgIDMuIG5hbWUgdGhpcyBwcm9jZXNzIGluIHRoZSBhY2Nlc3Mta2V5IGV4Y2hhbmdlIGNhbGwncyBvd24gc2VydmljZSB0b2tlbiwgc29cbiAqICAgICAgcGxhdGZvcm0gY2FuIGF0dHJpYnV0ZSAoYW5kIHJhdGUtbGltaXQpIHRoZSBleGNoYW5nZXMgaXQgcGVyZm9ybXMuXG4gKlxuICogQ29sbGFwc2VzIHRoZSBjb3B5LXBhc3RlZCBsaW5lcyBpbiBlYWNoIHNlcnZpY2UncyBgaW5kZXgudHNgIGludG8gb25lIGNhbGwuXG4gKlxuICogTk9URTogdGhlIFBMVUdJTiBzZXJ2aWNlIG9wdHMgb3V0IOKAlCBpdCBzaGFyZXMgaXRzIGhlYWx0aC1jaGVjayBSZWRpc1xuICogY29ubmVjdGlvbiB2aWEgYGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUoZ2V0SGVhbHRoUmVkaXNDb25uZWN0aW9uKCkpYFxuICogaW5zdGVhZCBvZiB0aGUgZW52LVJlZGlzIHN0b3JlIOKAlCBzbyBpdCB3aXJlcyB0aGVzZSB0d28gY29uY2VybnMgYnkgaGFuZC5cbiAqXG4gKiBAcGFyYW0gc2VydmljZU5hbWUgc2hvcnQgc2VydmljZSBuYW1lIG1pbnRlZCBpbnRvIHRoZSBgYXV0aHouZGVuaWVkYCByZWNvcmRzXG4gKiBAcGFyYW0gZ2V0QXVkaXRDbGllbnQgbGF6eSBhY2Nlc3NvciBmb3IgdGhlIHNlcnZpY2UncyBSZW1vdGVBdWRpdENsaWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2lyZVNlcnZpY2VTZWN1cml0eShzZXJ2aWNlTmFtZTogc3RyaW5nLCBnZXRBdWRpdENsaWVudDogKCkgPT4gUmVtb3RlQXVkaXRDbGllbnQpOiB2b2lkIHtcbiAgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcihzZXJ2aWNlTmFtZSwgZ2V0QXVkaXRDbGllbnQpO1xuICBzZXRUb2tlblJldm9jYXRpb25TdG9yZShjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKCkpO1xuICBzZXRBcGlLZXlFeGNoYW5nZVNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTtcbn1cbiJdfQ==
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1ib290LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2UtYm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBNkIsTUFBTSx1QkFBdUIsQ0FBQztBQWMzRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLFdBQW1CLEVBQ25CLGNBQXVDLEVBQ3ZDLElBQUksR0FBMkIsRUFBRTtJQUVqQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDcEQsdUJBQXVCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLGtDQUFrQyxFQUFFLENBQUMsQ0FBQztJQUMzRiw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNldEFwaUtleUV4Y2hhbmdlU2VydmljZU5hbWUgfSBmcm9tICcuL2FwaS1rZXktZXhjaGFuZ2UuanMnO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVBdWRpdENsaWVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yIH0gZnJvbSAnLi9yZW1vdGUtYXVkaXQtY2xpZW50LmpzJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUgfSBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuaW1wb3J0IHsgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUsIHR5cGUgVG9rZW5SZXZvY2F0aW9uU3RvcmUgfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuXG4vKiogUGVyLXNlcnZpY2Ugb3ZlcnJpZGVzIGZvciB7QGxpbmsgd2lyZVNlcnZpY2VTZWN1cml0eX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VTZWN1cml0eU9wdGlvbnMge1xuICAvKipcbiAgICogVG9rZW4tcmV2b2NhdGlvbiByZWFkZXIgdG8gcmVnaXN0ZXIgaW5zdGVhZCBvZiB0aGUgZW52LVJlZGlzIG9uZS4gVGhlXG4gICAqIHBsdWdpbiBzZXJ2aWNlIHBhc3NlcyBhIHN0b3JlIGJ1aWx0IG9uIHRoZSBwb29sZWQgaW9yZWRpcyBjb25uZWN0aW9uIGl0c1xuICAgKiBCdWxsTVEgYnVpbGQgcXVldWUgYW5kIHJlYWRpbmVzcyBwcm9iZSBhbHJlYWR5IHNoYXJlLCBzbyB0aGUgcHJvY2VzcyBob2xkc1xuICAgKiBPTkUgUmVkaXMgY29ubmVjdGlvbiByYXRoZXIgdGhhbiB0d28uIEZhaWwtb3BlbiBlaXRoZXIgd2F5OiBhIG1pc3Mvb3V0YWdlXG4gICAqIHlpZWxkcyBudWxsIGFuZCBhdXRoIGRlZ3JhZGVzIHRvIG5hdHVyYWwgdG9rZW4gZXhwaXJ5LlxuICAgKi9cbiAgdG9rZW5SZXZvY2F0aW9uU3RvcmU/OiBUb2tlblJldm9jYXRpb25TdG9yZTtcbn1cblxuLyoqXG4gKiBXaXJlIHRoZSB0d28gYm9vdC1zZWN1cml0eSBjb25jZXJucyBldmVyeSBzdGF0ZWxlc3Mgc2VydmljZSBzZXRzIHVwXG4gKiBpZGVudGljYWxseSBhdCBzdGFydHVwOlxuICogICAxLiBmb3J3YXJkIGRlbmllZCAobm9uLUdFVCkgYXV0aG9yaXphdGlvbnMgdG8gdGhlIHNoYXJlZCBgYXV0aHouZGVuaWVkYFxuICogICAgICBhdWRpdCBzaW5rIChgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcmApO1xuICogICAyLiByZWdpc3RlciB0aGUgZW52LVJlZGlzIHRva2VuLXJldm9jYXRpb24gcmVhZGVyIChmYWlsLW9wZW4pIHNvXG4gKiAgICAgIGByZXF1aXJlQXV0aGAgY2FuIHJlamVjdCBhIHRva2VuIGJlaGluZCB0aGUgcGxhdGZvcm0tcHVibGlzaGVkXG4gKiAgICAgIGB0b2tlblZlcnNpb25gIChgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUoY3JlYXRlRW52UmVkaXNUb2tlblJldm9jYXRpb25TdG9yZSgpKWApO1xuICogICAzLiBuYW1lIHRoaXMgcHJvY2VzcyBpbiB0aGUgYWNjZXNzLWtleSBleGNoYW5nZSBjYWxsJ3Mgb3duIHNlcnZpY2UgdG9rZW4sIHNvXG4gKiAgICAgIHBsYXRmb3JtIGNhbiBhdHRyaWJ1dGUgKGFuZCByYXRlLWxpbWl0KSB0aGUgZXhjaGFuZ2VzIGl0IHBlcmZvcm1zLlxuICpcbiAqIENvbGxhcHNlcyB0aGUgY29weS1wYXN0ZWQgbGluZXMgaW4gZWFjaCBzZXJ2aWNlJ3MgYGluZGV4LnRzYCBpbnRvIG9uZSBjYWxsLlxuICpcbiAqIEVWRVJZIHN0YXRlbGVzcyBzZXJ2aWNlIGdvZXMgdGhyb3VnaCBoZXJlLCBwbHVnaW4gaW5jbHVkZWQuIFBsdWdpbiB1c2VkIHRvXG4gKiBoYW5kLXJvbGwgdGhlc2UgdGhyZWUgY2FsbHMgYmVjYXVzZSBpdCBuZWVkcyBhIGRpZmZlcmVudCByZXZvY2F0aW9uIHN0b3JlXG4gKiAoaXRzIHBvb2xlZCBCdWxsTVEgUmVkaXMgY29ubmVjdGlvbiwgbm90IHRoZSBlbnYtUmVkaXMgb25lKSDigJQgd2hpY2ggbWVhbnQgdGhlXG4gKiBuZXh0IGNvbmNlcm4gYWRkZWQgaGVyZSB3b3VsZCBoYXZlIHNpbGVudGx5IHNraXBwZWQgaXQuIFRoYXQgb3ZlcnJpZGUgaXMgbm93XG4gKiBhIHBhcmFtZXRlciwgc28gb3B0aW5nIG91dCBvZiB0aGUgZW52LVJlZGlzIHN0b3JlIG5vIGxvbmdlciBtZWFucyBvcHRpbmcgb3V0XG4gKiBvZiB0aGUgd2lyaW5nLlxuICpcbiAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBzaG9ydCBzZXJ2aWNlIG5hbWUgbWludGVkIGludG8gdGhlIGBhdXRoei5kZW5pZWRgIHJlY29yZHNcbiAqIEBwYXJhbSBnZXRBdWRpdENsaWVudCBsYXp5IGFjY2Vzc29yIGZvciB0aGUgc2VydmljZSdzIFJlbW90ZUF1ZGl0Q2xpZW50XG4gKiBAcGFyYW0gb3B0cyBwZXItc2VydmljZSBvdmVycmlkZXMg4oCUIHNlZSB7QGxpbmsgU2VydmljZVNlY3VyaXR5T3B0aW9uc31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpcmVTZXJ2aWNlU2VjdXJpdHkoXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gIGdldEF1ZGl0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudCxcbiAgb3B0czogU2VydmljZVNlY3VyaXR5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWUsIGdldEF1ZGl0Q2xpZW50KTtcbiAgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUob3B0cy50b2tlblJldm9jYXRpb25TdG9yZSA/PyBjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlKCkpO1xuICBzZXRBcGlLZXlFeGNoYW5nZVNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTtcbn1cbiJdfQ==
@@ -57,6 +57,7 @@ import jwt from 'jsonwebtoken';
57
57
  import { publicJwkFrom, publicKeyFromJwk } from '../utils/jwk.js';
58
58
  import { createLogger } from '../utils/logger.js';
59
59
  import { emitCounter } from '../utils/metric-emitter.js';
60
+ import { errorMessage } from '../utils/response.js';
60
61
  const logger = createLogger('service-keys');
61
62
  /** The ONLY algorithm an internal service token may be signed with. */
62
63
  export const SERVICE_TOKEN_ALGORITHM = 'ES256';
@@ -93,7 +94,7 @@ function loadConfiguredSigningKey(file) {
93
94
  privateKey = crypto.createPrivateKey(readFileSync(file, 'utf8'));
94
95
  }
95
96
  catch (error) {
96
- throw new ServiceKeyError(`Could not read the service signing key at ${file}: ${error instanceof Error ? error.message : String(error)}`);
97
+ throw new ServiceKeyError(`Could not read the service signing key at ${file}: ${errorMessage(error)}`);
97
98
  }
98
99
  // publicJwkFrom rejects anything but an EC P-256 key, so a service configured
99
100
  // with (say) an RSA key fails HERE rather than minting tokens nobody verifies.
@@ -156,7 +157,7 @@ function parseBundle(raw, file) {
156
157
  document = JSON.parse(raw);
157
158
  }
158
159
  catch (error) {
159
- throw new ServiceKeyError(`${file} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
160
+ throw new ServiceKeyError(`${file} is not valid JSON: ${errorMessage(error)}`);
160
161
  }
161
162
  const services = document?.services;
162
163
  if (!services || typeof services !== 'object') {
@@ -173,7 +174,7 @@ function parseBundle(raw, file) {
173
174
  catch (error) {
174
175
  // One unusable entry must not discard the rest of the bundle — the same
175
176
  // rule the JWKS cache applies to platform's published set.
176
- logger.warn('Skipping unusable service key', { serviceName, kid: jwk.kid, error: error instanceof Error ? error.message : String(error) });
177
+ logger.warn('Skipping unusable service key', { serviceName, kid: jwk.kid, error: errorMessage(error) });
177
178
  }
178
179
  }
179
180
  }
@@ -219,7 +220,7 @@ function verificationKeys() {
219
220
  }
220
221
  catch (error) {
221
222
  if (bundle) {
222
- logger.warn('Service key bundle reload failed; continuing on the loaded copy', { file, error: error instanceof Error ? error.message : String(error) });
223
+ logger.warn('Service key bundle reload failed; continuing on the loaded copy', { file, error: errorMessage(error) });
223
224
  return bundle.byKid;
224
225
  }
225
226
  throw error instanceof ServiceKeyError ? error : new ServiceKeyError(String(error));
@@ -351,4 +352,4 @@ export function _resetServiceKeysForTests() {
351
352
  ephemeralKeys = undefined;
352
353
  ephemeralWarned = false;
353
354
  }
354
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1rZXlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sTUFBTSxFQUFFLEVBQWtCLE1BQU0sUUFBUSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzVDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTVDLHVFQUF1RTtBQUN2RSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUM7QUFFL0MsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFVBQVUsQ0FBQztBQUVqRCxpRkFBaUY7QUFDakYsTUFBTSwwQkFBMEIsR0FBRyxPQUFPLENBQUMsQ0FBQyxZQUFZO0FBb0J4RCw2RUFBNkU7QUFDN0UsTUFBTSxPQUFPLGVBQWdCLFNBQVEsS0FBSztJQUN4QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxlQUFlO0lBQzdCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FB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V0FBVyxFQUFFLENBQUMsQ0FBQztRQUN0RyxNQUFNLElBQUksR0FBRyxDQUFDLGlCQUFpQixDQUFDLHlCQUF5QixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDcEgsQ0FBQztJQUNELFdBQVcsQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QjtJQUMzQyxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QjtJQUN2QyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQ3JCLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDbkIsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUMxQixlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBQZXItc2VydmljZSBzaWduaW5nIGtleXMgZm9yIElOVEVSTkFMIHNlcnZpY2UtdG8tc2VydmljZSB0b2tlbnMgKCMxNCkuXG4gKlxuICogQmVmb3JlIHRoaXMsIGV2ZXJ5IHNlcnZpY2UgaGVsZCBvbmUgc2hhcmVkIGBKV1RfU0VDUkVUYCwgc28gYW55IHNlcnZpY2UgY291bGRcbiAqIG1pbnQgYSB0b2tlbiBuYW1pbmcgYW55IE9USEVSIHNlcnZpY2Ug4oCUIFwiYmlsbGluZyBzYWlkIHNvXCIgd2FzIHVuZmFsc2lmaWFibGUsXG4gKiBhbmQgYSBzaW5nbGUgY29tcHJvbWlzZWQgd29ya2xvYWQgY291bGQgc3BlYWsgZm9yIHRoZSB3aG9sZSBmbGVldC4gTm93IGVhY2hcbiAqIHNlcnZpY2Ugc2lnbnMgd2l0aCBpdHMgT1dOIEVTMjU2IChFQyBQLTI1Nikga2V5IGFuZCBjb25zdW1lcnMgdmVyaWZ5IGFnYWluc3RcbiAqIHRoZSBwdWJsaWMgaGFsdmVzLiBUaGUgYGtpZGAgaXMgYm91bmQgdG8gdGhlIHNpZ25lcidzIE5BTUUsIHNvIGEgdG9rZW4gd2hvc2VcbiAqIGBzdWJgIHNheXMgYHNlcnZpY2U6YmlsbGluZ2AgYnV0IHdhcyBzaWduZWQgd2l0aCBjb21wbGlhbmNlJ3Mga2V5IGlzIGFcbiAqIGZvcmdlcnksIG5vdCBhIHZhbGlkIHRva2VuIHdpdGggYSBjb25mdXNpbmcgc3ViamVjdC5cbiAqXG4gKiAjIyBXaHkgcHVibGljIGtleXMgYXJlIGRpc3RyaWJ1dGVkIGJ5IENPTkZJRywgbm90IGJ5IHBlci1zZXJ2aWNlIEpXS1MgZW5kcG9pbnRzXG4gKlxuICogVGhlIHVzZXIgY2hhaW4gKCM1KSBmZXRjaGVzIHBsYXRmb3JtJ3MgSldLUyBvdmVyIEhUVFAgYmVjYXVzZSB0aGVyZSBpcyBleGFjdGx5XG4gKiBvbmUgc2lnbmVyIGFuZCBpdCBpcyB0aGUgb25lIHNlcnZpY2UgdGhhdCBtdXN0IGJlIHVwIGZvciBhbnlib2R5IHRvIHNpZ24gaW4uXG4gKiBUaGUgc2VydmljZSBjaGFpbiBpcyB0aGUgb3Bwb3NpdGUgc2hhcGUsIGFuZCB0aHJlZSBwcm9wZXJ0aWVzIGRlY2lkZWQgaXQ6XG4gKlxuICogIDEuICoqYHZlcmlmeVNlcnZpY2VQcmluY2lwYWxgIG11c3Qgc3RheSBzeW5jaHJvbm91cy4qKiBUaGUgZ2xvYmFsIHJhdGVcbiAqICAgICBsaW1pdGVyJ3MgYHNraXBgIGFuZCBhcHAtZmFjdG9yeSdzIGAvd2FybXVwYCBndWFyZCB2ZXJpZnkgYSBzZXJ2aWNlIHRva2VuXG4gKiAgICAgQkVGT1JFIGByZXF1aXJlQXV0aGAgcnVucywgaW4gc3luY2hyb25vdXMgRXhwcmVzcyBjYWxsYmFja3MuIEFuIEhUVFAgSldLU1xuICogICAgIGZldGNoIHdvdWxkIGZvcmNlIHRob3NlIGFzeW5jIOKAlCBhIGNoYW5nZSB0aGF0IHJlYWNoZXMgaW50byBldmVyeVxuICogICAgIHNlcnZpY2UncyBsaW1pdGVyIHdpcmluZy5cbiAqICAyLiAqKk5vIGF2YWlsYWJpbGl0eSBjb3VwbGluZy4qKiBXaXRoIHBlci1zZXJ2aWNlIEpXS1MgZW5kcG9pbnRzLCB2ZXJpZnlpbmcgYVxuICogICAgIHRva2VuIG1pbnRlZCBieSBgYmlsbGluZ2AgbmVlZHMgYGJpbGxpbmdgIHRvIGJlIHJlYWNoYWJsZSDigJQgc28gYmlsbGluZ1xuICogICAgIGJlaW5nIGRvd24gd291bGQgc3RvcCBwbGF0Zm9ybSBmcm9tIGFjY2VwdGluZyBiaWxsaW5nJ3MgaW4tZmxpZ2h0IGNhbGxzLFxuICogICAgIHR1cm5pbmcgb25lIG91dGFnZSBpbnRvIHNldmVyYWwuIEEgbW91bnRlZCBmaWxlIGhhcyBubyBzdWNoIGVkZ2UuXG4gKiAgMy4gKipObyBOw5dOIGFkZHJlc3MgY29uZmlnLioqIDEwIHNlcnZpY2VzIHdvdWxkIGVhY2ggbmVlZCBldmVyeSBwZWVyJ3NcbiAqICAgICBob3N0L3BvcnQgKGFuZCBjb21wb3NlLCB3aGljaCBoYXMgbm8gbWVzaCwgd291bGQgbmVlZCB0aGVtIHRvbykuXG4gKlxuICogU28gdGhlIGRlcGxveSBnZW5lcmF0ZXMgb25lIGtleXBhaXIgcGVyIHNlcnZpY2UsIG1vdW50cyBlYWNoIHByaXZhdGUga2V5IE9OTFlcbiAqIGludG8gaXRzIG93biBzZXJ2aWNlLCBhbmQgbW91bnRzIE9ORSBwdWJsaWMgYnVuZGxlIChyZWFkLW9ubHkpIGV2ZXJ5d2hlcmU6XG4gKlxuICogICBgU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFYCAgdGhpcyBzZXJ2aWNlJ3MgRUMgUC0yNTYgcHJpdmF0ZSBrZXkgKFBLQ1MjOCBQRU0pXG4gKiAgIGBTRVJWSUNFX0tFWV9CVU5ETEVfRklMRWAgICBgeyBcInNlcnZpY2VzXCI6IHsgXCI8bmFtZT5cIjogeyBcImtleXNcIjogWzxqd2s+4oCmXSB9IH0gfWBcbiAqXG4gKiBSb3RhdGlvbiBpcyBieSBga2lkYCwgaW4gdGhlIHNhbWUgc2hhcGUgYXMgdGhlIHVzZXIgY2hhaW46IGFkZCB0aGUgbmV3IHB1YmxpY1xuICoga2V5IHRvIHRoZSBidW5kbGUgKHRoZSBzZXJ2aWNlIG5vdyBwdWJsaXNoZXMgdHdvKSwgcm9sbCB0aGUgYnVuZGxlIG91dCwgc3dhcFxuICogdGhhdCBzZXJ2aWNlJ3MgcHJpdmF0ZSBrZXksIHRoZW4gZHJvcCB0aGUgcmV0aXJlZCBwdWJsaWMga2V5LiBUaGUgYnVuZGxlIGlzXG4gKiByZS1yZWFkIG9uIGFuIGludGVydmFsIEFORCBvbiBhbiBtdGltZSBjaGFuZ2UsIHNvIGEgcm90YXRpb24gbmVlZHMgbm8gcmVzdGFydC5cbiAqIGBkZXBsb3kvYmluL3NlcnZpY2Utc2lnbmluZy1rZXlzLnNoYCBnZW5lcmF0ZXMgYW5kIHJvdGF0ZXMgYm90aCBoYWx2ZXMuXG4gKlxuICogIyMgRXBoZW1lcmFsIG1vZGVcbiAqXG4gKiBXaXRoIG5vIGBTRVJWSUNFX1NJR05JTkdfS0VZX0ZJTEVgIGNvbmZpZ3VyZWQsIGEga2V5cGFpciBpcyBnZW5lcmF0ZWRcbiAqIElOLVBST0NFU1MgcGVyIHJlcXVlc3RlZCBzZXJ2aWNlIG5hbWUgYW5kIHJlZ2lzdGVyZWQgaW4gdGhlIGluLW1lbW9yeSBidW5kbGUuXG4gKiBUaGF0IGtlZXBzIHNpbmdsZS1wcm9jZXNzIHN1aXRlcyBhbmQgbG9jYWwgb25lLW9mZiBzY3JpcHRzIHdvcmtpbmcgd2l0aCBubyBrZXlcbiAqIG1hdGVyaWFsLCBhbmQgaXQgY2FuIG5ldmVyIHdpZGVuIHRydXN0OiB0aGUgb25seSB2ZXJpZmllciB0aGF0IGFjY2VwdHMgc3VjaCBhXG4gKiB0b2tlbiBpcyB0aGUgcHJvY2VzcyB0aGF0IG1pbnRlZCBpdC4gSXQgaXMgbG9nZ2VkIG9uY2UgYXQgd2FybiBsZXZlbCwgYW5kXG4gKiBjb3VudGVkLCBiZWNhdXNlIGluIGEgcmVhbCBkZXBsb3ltZW50IGl0IG1lYW5zIHRoaXMgc2VydmljZSdzIHBlZXJzIHdpbGxcbiAqIHJlamVjdCBldmVyeXRoaW5nIGl0IHNlbmRzLlxuICovXG5cbmltcG9ydCBjcnlwdG8sIHsgdHlwZSBLZXlPYmplY3QgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBzdGF0U3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IHB1YmxpY0p3a0Zyb20sIHB1YmxpY0tleUZyb21Kd2ssIHR5cGUgUHVibGljSndrIH0gZnJvbSAnLi4vdXRpbHMvandrLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzZXJ2aWNlLWtleXMnKTtcblxuLyoqIFRoZSBPTkxZIGFsZ29yaXRobSBhbiBpbnRlcm5hbCBzZXJ2aWNlIHRva2VuIG1heSBiZSBzaWduZWQgd2l0aC4gKi9cbmV4cG9ydCBjb25zdCBTRVJWSUNFX1RPS0VOX0FMR09SSVRITSA9ICdFUzI1Nic7XG5cbi8qKiBTdWJqZWN0IHByZWZpeCBuYW1pbmcgdGhlIGNhbGxpbmcgc2VydmljZSBvbiBhIHNlcnZpY2UgdG9rZW4gKGBzZXJ2aWNlOjxuYW1lPmApLiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVggPSAnc2VydmljZTonO1xuXG4vKiogSG93IGxvbmcgYSBsb2FkZWQgYnVuZGxlIGlzIHNlcnZlZCBiZWZvcmUgaXQgaXMgcmUtcmVhZCAocm90YXRpb24gcGlja3VwKS4gKi9cbmNvbnN0IEJVTkRMRV9SRUZSRVNIX0lOVEVSVkFMX01TID0gMzAwXzAwMDsgLy8gNSBtaW51dGVzXG5cbi8qKiBPbmUgc2VydmljZSdzIHB1Ymxpc2hlZCB2ZXJpZmljYXRpb24ga2V5cywgYXMgdGhleSBhcHBlYXIgaW4gdGhlIGJ1bmRsZSBmaWxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlS2V5RW50cnkge1xuICBrZXlzOiBQdWJsaWNKd2tbXTtcbn1cblxuLyoqIFRoZSBkb2N1bWVudCBgU0VSVklDRV9LRVlfQlVORExFX0ZJTEVgIGhvbGRzOiBldmVyeSBzZXJ2aWNlJ3MgcHVibGljIGtleXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VLZXlCdW5kbGUge1xuICBzZXJ2aWNlczogUmVjb3JkPHN0cmluZywgU2VydmljZUtleUVudHJ5Pjtcbn1cblxuLyoqIEEgc2lnbmluZyBrZXkgdGhpcyBwcm9jZXNzIGhvbGRzLCBpbiB0aGUgZm9ybXMgc2lnbmluZyBuZWVkcy4gKi9cbmludGVyZmFjZSBMb2NhbFNpZ25pbmdLZXkge1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICBraWQ6IHN0cmluZztcbiAgcHJpdmF0ZUtleTogS2V5T2JqZWN0O1xuICBwdWJsaWNKd2s6IFB1YmxpY0p3aztcbn1cblxuLyoqIFRoZSBidW5kbGUgY291bGQgbm90IGJlIGxvYWRlZCBvciBkb2VzIG5vdCBrbm93IHRoZSBrZXkgYSB0b2tlbiBuYW1lcy4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlS2V5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdTZXJ2aWNlS2V5RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBwcm9jZXNzJ3Mgc2VydmljZSBpZGVudGl0eSDigJQgdGhlIGA8bmFtZT5gIGluIGBzZXJ2aWNlOjxuYW1lPmAgYW5kIHRoZVxuICogbmFtZSBpdHMga2V5IGlzIHB1Ymxpc2hlZCB1bmRlci4gYFNFUlZJQ0VfTkFNRWAgaXMgYWxyZWFkeSBzZXQgcGVyIHNlcnZpY2UgaW5cbiAqIGV2ZXJ5IGRlcGxveSB0YXJnZXQgKGNvbXBvc2UsIG1pbmlrdWJlLCBlYzIsIGVrcyksIGFuZCBpcyB0aGUgc2FtZSB2YWx1ZSB0aGVcbiAqIGF1ZGl0IGFuZCBtZXRyaWMgbGFiZWxzIHVzZSwgc28gdGhlcmUgaXMgb25lIHNvdXJjZSBvZiB0cnV0aCBmb3IgXCJ3aG8gYW0gSVwiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZUlkZW50aXR5KCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ2FwaSc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTG9jYWwgc2lnbmluZyBrZXlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5sZXQgbG9jYWxLZXk6IExvY2FsU2lnbmluZ0tleSB8IHVuZGVmaW5lZDtcbmxldCBlcGhlbWVyYWxLZXlzOiBNYXA8c3RyaW5nLCBMb2NhbFNpZ25pbmdLZXk+IHwgdW5kZWZpbmVkO1xubGV0IGVwaGVtZXJhbFdhcm5lZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBsb2FkQ29uZmlndXJlZFNpZ25pbmdLZXkoZmlsZTogc3RyaW5nKTogTG9jYWxTaWduaW5nS2V5IHtcbiAgY29uc3Qgc2VydmljZU5hbWUgPSBzZXJ2aWNlSWRlbnRpdHkoKTtcbiAgbGV0IHByaXZhdGVLZXk6IEtleU9iamVjdDtcbiAgdHJ5IHtcbiAgICBwcml2YXRlS2V5ID0gY3J5cHRvLmNyZWF0ZVByaXZhdGVLZXkocmVhZEZpbGVTeW5jKGZpbGUsICd1dGY4JykpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBTZXJ2aWNlS2V5RXJyb3IoYENvdWxkIG5vdCByZWFkIHRoZSBzZXJ2aWNlIHNpZ25pbmcga2V5IGF0ICR7ZmlsZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICB9XG4gIC8vIHB1YmxpY0p3a0Zyb20gcmVqZWN0cyBhbnl0aGluZyBidXQgYW4gRUMgUC0yNTYga2V5LCBzbyBhIHNlcnZpY2UgY29uZmlndXJlZFxuICAvLyB3aXRoIChzYXkpIGFuIFJTQSBrZXkgZmFpbHMgSEVSRSByYXRoZXIgdGhhbiBtaW50aW5nIHRva2VucyBub2JvZHkgdmVyaWZpZXMuXG4gIGNvbnN0IHB1YmxpY0p3ayA9IHB1YmxpY0p3a0Zyb20oY3J5cHRvLmNyZWF0ZVB1YmxpY0tleShwcml2YXRlS2V5KSk7XG4gIHJldHVybiB7IHNlcnZpY2VOYW1lLCBraWQ6IHB1YmxpY0p3ay5raWQsIHByaXZhdGVLZXksIHB1YmxpY0p3ayB9O1xufVxuXG4vKipcbiAqIFRoZSBpbi1wcm9jZXNzIGtleSBmb3IgYHNlcnZpY2VOYW1lYCBpbiBlcGhlbWVyYWwgbW9kZSwgZ2VuZXJhdGVkIG9uIGZpcnN0XG4gKiB1c2UgYW5kIHJlZ2lzdGVyZWQgaW4gdGhlIGluLW1lbW9yeSBidW5kbGUgc28gdGhpcyBwcm9jZXNzIGNhbiB2ZXJpZnkgaXRzIG93blxuICogdG9rZW5zLiBLZXllZCBieSBOQU1FIChub3QganVzdCBvbmUga2V5KSBzbyBhIHNpbmdsZS1wcm9jZXNzIHN1aXRlIGNhbiBtaW50XG4gKiB0b2tlbnMgZm9yIHNldmVyYWwgc2VydmljZXMsIGFzIHRoZSByZWFsIGZsZWV0IGRvZXMgYWNyb3NzIHByb2Nlc3Nlcy5cbiAqL1xuZnVuY3Rpb24gZXBoZW1lcmFsU2lnbmluZ0tleShzZXJ2aWNlTmFtZTogc3RyaW5nKTogTG9jYWxTaWduaW5nS2V5IHtcbiAgZXBoZW1lcmFsS2V5cyA/Pz0gbmV3IE1hcCgpO1xuICBjb25zdCBleGlzdGluZyA9IGVwaGVtZXJhbEtleXMuZ2V0KHNlcnZpY2VOYW1lKTtcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG5cbiAgaWYgKCFlcGhlbWVyYWxXYXJuZWQpIHtcbiAgICBlcGhlbWVyYWxXYXJuZWQgPSB0cnVlO1xuICAgIGVtaXRDb3VudGVyKCdzZXJ2aWNlX3NpZ25pbmdfZXBoZW1lcmFsX2tleV90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCkgfSk7XG4gICAgbG9nZ2VyLndhcm4oJ1NFUlZJQ0VfU0lHTklOR19LRVlfRklMRSBpcyBub3Qgc2V0IOKAlCBtaW50aW5nIGludGVybmFsIHNlcnZpY2UgdG9rZW5zIHdpdGggYW4gRVBIRU1FUkFMIGtleS4gT25seSB0aGlzIHByb2Nlc3Mgd2lsbCBhY2NlcHQgdGhlbTsgZXZlcnkgcGVlciB3aWxsIHJlamVjdCB0aGVtLiBTZXQgU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFICsgU0VSVklDRV9LRVlfQlVORExFX0ZJTEUgKGRlcGxveS9iaW4vc2VydmljZS1zaWduaW5nLWtleXMuc2gpLicpO1xuICB9XG4gIGNvbnN0IHsgcHJpdmF0ZUtleSwgcHVibGljS2V5IH0gPSBjcnlwdG8uZ2VuZXJhdGVLZXlQYWlyU3luYygnZWMnLCB7IG5hbWVkQ3VydmU6ICdwcmltZTI1NnYxJyB9KTtcbiAgY29uc3QgcHVibGljSndrID0gcHVibGljSndrRnJvbShwdWJsaWNLZXkpO1xuICBjb25zdCBnZW5lcmF0ZWQ6IExvY2FsU2lnbmluZ0tleSA9IHsgc2VydmljZU5hbWUsIGtpZDogcHVibGljSndrLmtpZCwgcHJpdmF0ZUtleSwgcHVibGljSndrIH07XG4gIGVwaGVtZXJhbEtleXMuc2V0KHNlcnZpY2VOYW1lLCBnZW5lcmF0ZWQpO1xuICByZXR1cm4gZ2VuZXJhdGVkO1xufVxuXG4vKiogV2hldGhlciB0aGlzIHByb2Nlc3Mgc2lnbnMgd2l0aCBhIG1vdW50ZWQga2V5IChgY29uZmlndXJlZGApIG9yIGFuIGluLXByb2Nlc3Mgb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VLZXlNb2RlKCk6ICdjb25maWd1cmVkJyB8ICdlcGhlbWVyYWwnIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LlNFUlZJQ0VfU0lHTklOR19LRVlfRklMRSA/ICdjb25maWd1cmVkJyA6ICdlcGhlbWVyYWwnO1xufVxuXG4vKipcbiAqIFRoZSBrZXkgYHNlcnZpY2VOYW1lYCBtdXN0IGJlIHNpZ25lZCB3aXRoLlxuICpcbiAqIEluIGBjb25maWd1cmVkYCBtb2RlIHRoZXJlIGlzIGV4YWN0bHkgT05FIGtleSDigJQgdGhpcyBzZXJ2aWNlJ3Mg4oCUIHNvIGEgcmVxdWVzdFxuICogdG8gc2lnbiBhcyBzb21lIE9USEVSIHNlcnZpY2UgaXMgYSBidWcgYW5kIHRocm93cy4gVGhhdCBtYXR0ZXJzOiBiZWZvcmUgIzE0IGFcbiAqIHNlcnZpY2UgY291bGQgbGVnaXRpbWF0ZWx5IG1pbnQgYHNlcnZpY2U6cGxhdGZvcm1gIHdpdGggdGhlIHNoYXJlZCBzZWNyZXRcbiAqIChhcGkvcGx1Z2luIGRpZCwgZm9yIGl0cyByZWdpc3RyeSBwdXNoZXMpLCBhbmQgdW5kZXIgcGVyLXNlcnZpY2Uga2V5cyBzdWNoIGFcbiAqIHRva2VuIHdvdWxkIGJlIHNpbGVudGx5IHVudmVyaWZpYWJsZSBldmVyeXdoZXJlLiBGYWlsaW5nIGF0IHRoZSBtaW50IHR1cm5zXG4gKiB0aGF0IGludG8gYW4gaW1tZWRpYXRlLCBvYnZpb3VzIGVycm9yIGluc3RlYWQgb2YgYSBydW50aW1lIDQwMS5cbiAqL1xuZnVuY3Rpb24gc2lnbmluZ0tleUZvcihzZXJ2aWNlTmFtZTogc3RyaW5nKTogTG9jYWxTaWduaW5nS2V5IHtcbiAgY29uc3QgZmlsZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfU0lHTklOR19LRVlfRklMRTtcbiAgaWYgKCFmaWxlKSByZXR1cm4gZXBoZW1lcmFsU2lnbmluZ0tleShzZXJ2aWNlTmFtZSk7XG5cbiAgaWYgKCFsb2NhbEtleSB8fCBsb2NhbEtleS5zZXJ2aWNlTmFtZSAhPT0gc2VydmljZUlkZW50aXR5KCkpIHtcbiAgICBsb2NhbEtleSA9IGxvYWRDb25maWd1cmVkU2lnbmluZ0tleShmaWxlKTtcbiAgfVxuICBpZiAoc2VydmljZU5hbWUgIT09IGxvY2FsS2V5LnNlcnZpY2VOYW1lKSB7XG4gICAgdGhyb3cgbmV3IFNlcnZpY2VLZXlFcnJvcihcbiAgICAgIGBUaGlzIHByb2Nlc3MgaXMgJyR7bG9jYWxLZXkuc2VydmljZU5hbWV9JyBhbmQgaG9sZHMgb25seSBpdHMgb3duIHNpZ25pbmcga2V5LCBzbyBpdCBjYW5ub3QgbWludCBhIHRva2VuIGZvciAnJHtzZXJ2aWNlTmFtZX0nLiBgXG4gICAgICArICdOYW1lIHRoZSBjYWxsaW5nIHNlcnZpY2UgY29ycmVjdGx5LCBvciBnaXZlIHRoZSBjYWxsZXIgaXRzIG93biBrZXkuJyxcbiAgICApO1xuICB9XG4gIHJldHVybiBsb2NhbEtleTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBWZXJpZmljYXRpb24gYnVuZGxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW50ZXJmYWNlIExvYWRlZEJ1bmRsZSB7XG4gIC8qKiBga2lkYCDihpIgdGhlIHNlcnZpY2UgdGhhdCBwdWJsaXNoZWQgaXQsIHBsdXMgdGhlIHZlcmlmaWNhdGlvbiBrZXkuICovXG4gIGJ5S2lkOiBNYXA8c3RyaW5nLCB7IHNlcnZpY2VOYW1lOiBzdHJpbmc7IGtleTogS2V5T2JqZWN0IH0+O1xuICBsb2FkZWRBdDogbnVtYmVyO1xuICBtdGltZU1zOiBudW1iZXI7XG59XG5cbmxldCBidW5kbGU6IExvYWRlZEJ1bmRsZSB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gcGFyc2VCdW5kbGUocmF3OiBzdHJpbmcsIGZpbGU6IHN0cmluZyk6IE1hcDxzdHJpbmcsIHsgc2VydmljZU5hbWU6IHN0cmluZzsga2V5OiBLZXlPYmplY3QgfT4ge1xuICBsZXQgZG9jdW1lbnQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgZG9jdW1lbnQgPSBKU09OLnBhcnNlKHJhdyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFNlcnZpY2VLZXlFcnJvcihgJHtmaWxlfSBpcyBub3QgdmFsaWQgSlNPTjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gIH1cbiAgY29uc3Qgc2VydmljZXMgPSAoZG9jdW1lbnQgYXMgUGFydGlhbDxTZXJ2aWNlS2V5QnVuZGxlPik/LnNlcnZpY2VzO1xuICBpZiAoIXNlcnZpY2VzIHx8IHR5cGVvZiBzZXJ2aWNlcyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGAke2ZpbGV9IGhhcyBubyBcInNlcnZpY2VzXCIgb2JqZWN0YCk7XG4gIH1cbiAgY29uc3QgYnlLaWQgPSBuZXcgTWFwPHN0cmluZywgeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBrZXk6IEtleU9iamVjdCB9PigpO1xuICBmb3IgKGNvbnN0IFtzZXJ2aWNlTmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgIGZvciAoY29uc3QgandrIG9mIGVudHJ5Py5rZXlzID8/IFtdKSB7XG4gICAgICBpZiAoIWp3az8ua2lkKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ5S2lkLnNldChqd2sua2lkLCB7IHNlcnZpY2VOYW1lLCBrZXk6IHB1YmxpY0tleUZyb21Kd2soandrKSB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE9uZSB1bnVzYWJsZSBlbnRyeSBtdXN0IG5vdCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZSBidW5kbGUg4oCUIHRoZSBzYW1lXG4gICAgICAgIC8vIHJ1bGUgdGhlIEpXS1MgY2FjaGUgYXBwbGllcyB0byBwbGF0Zm9ybSdzIHB1Ymxpc2hlZCBzZXQuXG4gICAgICAgIGxvZ2dlci53YXJuKCdTa2lwcGluZyB1bnVzYWJsZSBzZXJ2aWNlIGtleScsIHsgc2VydmljZU5hbWUsIGtpZDogandrLmtpZCwgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGJ5S2lkLnNpemUgPT09IDApIHRocm93IG5ldyBTZXJ2aWNlS2V5RXJyb3IoYCR7ZmlsZX0gY29udGFpbmVkIG5vIHVzYWJsZSBzZXJ2aWNlIGtleXNgKTtcbiAgcmV0dXJuIGJ5S2lkO1xufVxuXG4vKipcbiAqIFRoZSBga2lkYCDihpIgc2VydmljZSBtYXAsIHJlLXJlYWQgd2hlbiB0aGUgcmVmcmVzaCBpbnRlcnZhbCBoYXMgcGFzc2VkIG9yIHRoZVxuICogZmlsZSdzIG10aW1lIGNoYW5nZWQgKHNvIGEgcm90YXRpb24gaXMgcGlja2VkIHVwIHdpdGhvdXQgYSByZXN0YXJ0KS5cbiAqXG4gKiBJbiBlcGhlbWVyYWwgbW9kZSB0aGUgXCJidW5kbGVcIiBpcyB3aGF0ZXZlciB0aGlzIHByb2Nlc3MgZ2VuZXJhdGVkIGZvciBpdHNlbGYuXG4gKiBOZXZlciB0aHJvd3MgZm9yIGEgbWlzc2luZyBmaWxlIGluIHRoYXQgbW9kZSDigJQgaXQganVzdCBob2xkcyB0aG9zZSBrZXlzLlxuICovXG5mdW5jdGlvbiB2ZXJpZmljYXRpb25LZXlzKCk6IE1hcDxzdHJpbmcsIHsgc2VydmljZU5hbWU6IHN0cmluZzsga2V5OiBLZXlPYmplY3QgfT4ge1xuICBjb25zdCBmaWxlID0gcHJvY2Vzcy5lbnYuU0VSVklDRV9LRVlfQlVORExFX0ZJTEU7XG4gIGlmICghZmlsZSkge1xuICAgIGNvbnN0IGxvY2FsID0gbmV3IE1hcDxzdHJpbmcsIHsgc2VydmljZU5hbWU6IHN0cmluZzsga2V5OiBLZXlPYmplY3QgfT4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBlcGhlbWVyYWxLZXlzPy52YWx1ZXMoKSA/PyBbXSkge1xuICAgICAgbG9jYWwuc2V0KGtleS5raWQsIHsgc2VydmljZU5hbWU6IGtleS5zZXJ2aWNlTmFtZSwga2V5OiBjcnlwdG8uY3JlYXRlUHVibGljS2V5KGtleS5wcml2YXRlS2V5KSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsO1xuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgbGV0IG10aW1lTXMgPSAwO1xuICB0cnkge1xuICAgIG10aW1lTXMgPSBzdGF0U3luYyhmaWxlKS5tdGltZU1zO1xuICB9IGNhdGNoIHtcbiAgICAvLyBVbnJlYWRhYmxlIG5vdzoga2VlcCBzZXJ2aW5nIGEgYnVuZGxlIGFscmVhZHkgaW4gaGFuZCAocHVibGljIGtleXMgZG9uJ3RcbiAgICAvLyBleHBpcmUsIGFuZCByZWZ1c2luZyBldmVyeSBpbnRlcm5hbCBjYWxsIGJlY2F1c2UgYSBtb3VudCBibGlwcGVkIHdvdWxkIGJlXG4gICAgLy8gYSBzZWxmLWluZmxpY3RlZCBvdXRhZ2UpLiBXaXRoIG5vdGhpbmcgaW4gaGFuZCwgZmFpbCBjbG9zZWQgYmVsb3cuXG4gICAgaWYgKGJ1bmRsZSkgcmV0dXJuIGJ1bmRsZS5ieUtpZDtcbiAgfVxuICBpZiAoYnVuZGxlICYmIGJ1bmRsZS5tdGltZU1zID09PSBtdGltZU1zICYmIG5vdyAtIGJ1bmRsZS5sb2FkZWRBdCA8IEJVTkRMRV9SRUZSRVNIX0lOVEVSVkFMX01TKSB7XG4gICAgcmV0dXJuIGJ1bmRsZS5ieUtpZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYnlLaWQgPSBwYXJzZUJ1bmRsZShyZWFkRmlsZVN5bmMoZmlsZSwgJ3V0ZjgnKSwgZmlsZSk7XG4gICAgYnVuZGxlID0geyBieUtpZCwgbG9hZGVkQXQ6IG5vdywgbXRpbWVNcyB9O1xuICAgIHJldHVybiBieUtpZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoYnVuZGxlKSB7XG4gICAgICBsb2dnZXIud2FybignU2VydmljZSBrZXkgYnVuZGxlIHJlbG9hZCBmYWlsZWQ7IGNvbnRpbnVpbmcgb24gdGhlIGxvYWRlZCBjb3B5JywgeyBmaWxlLCBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpIH0pO1xuICAgICAgcmV0dXJuIGJ1bmRsZS5ieUtpZDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3IgaW5zdGFuY2VvZiBTZXJ2aWNlS2V5RXJyb3IgPyBlcnJvciA6IG5ldyBTZXJ2aWNlS2V5RXJyb3IoU3RyaW5nKGVycm9yKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGBraWRgIGJlbG9uZ3MgdG8gYW4gaW50ZXJuYWwgU0VSVklDRSBrZXkuIFRoaXMgaXMgaG93IGEgYmVhcmVyIHRva2VuXG4gKiBpcyByb3V0ZWQgYmV0d2VlbiB0aGUgdHdvIEVTMjU2IGNoYWluczogYm90aCB1c2VyIGFuZCBzZXJ2aWNlIHRva2VucyBhcmVcbiAqIEVTMjU2IHdpdGggYSBga2lkYCwgYW5kIGBraWRgIGlzIGFuIFJGQyA3NjM4IHRodW1icHJpbnQsIHNvIG93bmVyc2hpcCBvZiB0aGVcbiAqIGlkIOKAlCBub3QgYSBjbGFpbSBpbnNpZGUgdGhlIHRva2VuIOKAlCBkZWNpZGVzIHdoaWNoIGtleSBzZXQgbWF5IHZlcmlmeSBpdC5cbiAqIFJldHVybnMgYGZhbHNlYCAobmV2ZXIgdGhyb3dzKSB3aGVuIG5vIGJ1bmRsZSBjYW4gYmUgcmVhZDsgdGhlIHRva2VuIHRoZW5cbiAqIHRha2VzIHRoZSB1c2VyIGNoYWluIGFuZCBpcyByZWplY3RlZCB0aGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZUtpZChraWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB2ZXJpZmljYXRpb25LZXlzKCkuaGFzKGtpZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogRXZlcnkgc2VydmljZSBuYW1lIHRoZSBidW5kbGUgcHVibGlzaGVzIGEga2V5IGZvci4gRGlhZ25vc3RpY3MgYW5kIHRlc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtub3duU2VydmljZU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLnZlcmlmaWNhdGlvbktleXMoKS52YWx1ZXMoKV0ubWFwKCh2KSA9PiB2LnNlcnZpY2VOYW1lKSldLnNvcnQoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2lnbiAvIHZlcmlmeVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBiYXNlNjR1cmwgb2YgYSBKU09OIHZhbHVlLCB0aGUgSldTIHdheSAobm8gcGFkZGluZywgVVJMIGFscGhhYmV0KS4gKi9cbmZ1bmN0aW9uIGI2NHVKc29uKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSwgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NHVybCcpO1xufVxuXG4vKipcbiAqIFNpZ24gYGNsYWltc2AgYXMgdGhpcyBzZXJ2aWNlJ3MgaW50ZXJuYWwgdG9rZW46IEVTMjU2LCBga2lkYCA9IHRoZSBzaWduZXInc1xuICogdGh1bWJwcmludCwgYHN1YmAgPSBgc2VydmljZTo8c2VydmljZU5hbWU+YC4gYGlhdGAvYGV4cGAgYW5kIHRoZSBvcHRpb25hbFxuICogaXNzdWVyL2F1ZGllbmNlIGFyZSBzdGFtcGVkIGhlcmUgc28gdGhlcmUgaXMgb25lIHBsYWNlIHRoYXQgZGVjaWRlcyB3aGF0IGFcbiAqIHNlcnZpY2UgdG9rZW4gc2F5cy5cbiAqXG4gKiBIYW5kLXJvbGxlZCAocmF0aGVyIHRoYW4gYGp3dC5zaWduYCkgb25seSBzbyB0aGUgaGVhZGVyIGNhcnJpZXMgdGhlIGBraWRgIGluXG4gKiB0aGUgc2FtZSBzaGFwZSBwbGF0Zm9ybSdzIHNpZ25lciBwcm9kdWNlcyDigJQgYGNyeXB0by5zaWduYCBpcyBzeW5jaHJvbm91cywgc29cbiAqIHVubGlrZSB0aGUgS01TIHBhdGggdGhpcyBjb3N0cyBub3RoaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblNlcnZpY2VKd3QoXG4gIGNsYWltczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IHsgc2VydmljZU5hbWU6IHN0cmluZzsgZXhwaXJlc0luU2Vjb25kczogbnVtYmVyOyBpc3N1ZXI/OiBzdHJpbmc7IGF1ZGllbmNlPzogc3RyaW5nIH0sXG4pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBzaWduaW5nS2V5Rm9yKG9wdGlvbnMuc2VydmljZU5hbWUpO1xuICBjb25zdCBub3cgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbiAgY29uc3QgYm9keSA9IHtcbiAgICAuLi5jbGFpbXMsXG4gICAgc3ViOiBgJHtTRVJWSUNFX1NVQkpFQ1RfUFJFRklYfSR7b3B0aW9ucy5zZXJ2aWNlTmFtZX1gLFxuICAgIGlhdDogbm93LFxuICAgIGV4cDogbm93ICsgb3B0aW9ucy5leHBpcmVzSW5TZWNvbmRzLFxuICAgIC4uLihvcHRpb25zLmlzc3VlciA/IHsgaXNzOiBvcHRpb25zLmlzc3VlciB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLmF1ZGllbmNlID8geyBhdWQ6IG9wdGlvbnMuYXVkaWVuY2UgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3Qgc2lnbmluZ0lucHV0ID0gYCR7YjY0dUpzb24oeyBhbGc6IFNFUlZJQ0VfVE9LRU5fQUxHT1JJVEhNLCB0eXA6ICdKV1QnLCBraWQ6IGtleS5raWQgfSl9LiR7YjY0dUpzb24oYm9keSl9YDtcbiAgY29uc3Qgc2lnbmF0dXJlID0gY3J5cHRvLnNpZ24oJ3NoYTI1NicsIEJ1ZmZlci5mcm9tKHNpZ25pbmdJbnB1dCwgJ3V0Zi04JyksIHtcbiAgICBrZXk6IGtleS5wcml2YXRlS2V5LFxuICAgIGRzYUVuY29kaW5nOiAnaWVlZS1wMTM2MycsXG4gIH0pO1xuICByZXR1cm4gYCR7c2lnbmluZ0lucHV0fS4ke3NpZ25hdHVyZS50b1N0cmluZygnYmFzZTY0dXJsJyl9YDtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYW4gaW50ZXJuYWwgc2VydmljZSB0b2tlbiwgU1lOQ0hST05PVVNMWSwgYW5kIHJldHVybiBpdHMgY2xhaW1zLlxuICpcbiAqIFRoZSBzZWN1cml0eSBwcm9wZXJ0eSB0aGlzIGZ1bmN0aW9uIGV4aXN0cyBmb3I6IHRoZSBga2lkYCBzZWxlY3RzIHRoZSBrZXlcbiAqIEFORCBuYW1lcyB0aGUgc2lnbmVyLCBhbmQgdGhlIHRva2VuJ3MgYHN1YmAgbXVzdCBhZ3JlZS4gU28gYGJpbGxpbmdgIGNhbm5vdFxuICogYmUgaW1wZXJzb25hdGVkIGJ5IGFueSBvdGhlciBzZXJ2aWNlIOKAlCBub3QgZXZlbiBvbmUgdGhhdCBob2xkcyBhIHZhbGlkIGtleSBvZlxuICogaXRzIG93biDigJQgd2hpY2ggaXMgd2hhdCB0aGUgc2hhcmVkIHNlY3JldCBjb3VsZCBuZXZlciBndWFyYW50ZWUuXG4gKlxuICogQHRocm93cyB7and0Lkpzb25XZWJUb2tlbkVycm9yfSB1bmtub3duIGBraWRgLCB3cm9uZyBhbGdvcml0aG0sIGJhZFxuICogICAgICAgICBzaWduYXR1cmUsIGV4cGlyZWQsIG9yIGEgYHN1YmAgdGhhdCBkaXNhZ3JlZXMgd2l0aCB0aGUgc2lnbmluZyBrZXkuXG4gKiBAdGhyb3dzIHtTZXJ2aWNlS2V5RXJyb3J9IG5vIHZlcmlmaWNhdGlvbiBidW5kbGUgY291bGQgYmUgcmVhZCBhdCBhbGwg4oCUIHRoZVxuICogICAgICAgICB0b2tlbidzIHZhbGlkaXR5IGlzIFVOS05PV04gYW5kIHRoZSBjYWxsZXIgbXVzdCBub3QgdHJlYXQgaXQgYXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTZXJ2aWNlSnd0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIHRva2VuOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsga2lkOiBzdHJpbmc7IGlzc3Vlcj86IHN0cmluZzsgYXVkaWVuY2U/OiBzdHJpbmcgfSxcbik6IFQge1xuICBjb25zdCBlbnRyeSA9IHZlcmlmaWNhdGlvbktleXMoKS5nZXQob3B0aW9ucy5raWQpO1xuICBpZiAoIWVudHJ5KSB7XG4gICAgZW1pdENvdW50ZXIoJ3NlcnZpY2VfdG9rZW5fdmVyaWZ5X3RvdGFsJywgeyByZXN1bHQ6ICd1bmtub3duX2tpZCcgfSk7XG4gICAgdGhyb3cgbmV3IGp3dC5Kc29uV2ViVG9rZW5FcnJvcihgTm8gcHVibGlzaGVkIHNlcnZpY2Uga2V5IGZvciBraWQgJHtvcHRpb25zLmtpZH1gKTtcbiAgfVxuICBsZXQgY2xhaW1zOiBUICYgeyBzdWI/OiB1bmtub3duIH07XG4gIHRyeSB7XG4gICAgY2xhaW1zID0gand0LnZlcmlmeSh0b2tlbiwgZW50cnkua2V5LCB7XG4gICAgICBhbGdvcml0aG1zOiBbU0VSVklDRV9UT0tFTl9BTEdPUklUSE1dLFxuICAgICAgLi4uKG9wdGlvbnMuaXNzdWVyID8geyBpc3N1ZXI6IG9wdGlvbnMuaXNzdWVyIH0gOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5hdWRpZW5jZSA/IHsgYXVkaWVuY2U6IG9wdGlvbnMuYXVkaWVuY2UgfSA6IHt9KSxcbiAgICB9KSBhcyBUICYgeyBzdWI/OiB1bmtub3duIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZW1pdENvdW50ZXIoJ3NlcnZpY2VfdG9rZW5fdmVyaWZ5X3RvdGFsJywgeyByZXN1bHQ6ICdpbnZhbGlkJyB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBpZiAoY2xhaW1zLnN1YiAhPT0gYCR7U0VSVklDRV9TVUJKRUNUX1BSRUZJWH0ke2VudHJ5LnNlcnZpY2VOYW1lfWApIHtcbiAgICAvLyBBIHZhbGlkIHNpZ25hdHVyZSBieSB0aGUgV1JPTkcgc2VydmljZTogdGhlIGtleSBiZWxvbmdzIHRvIGBlbnRyeS5zZXJ2aWNlTmFtZWBcbiAgICAvLyBidXQgdGhlIHRva2VuIHNwZWFrcyBmb3Igc29tZW9uZSBlbHNlLiBUaGlzIGlzIHRoZSBjcm9zcy1zZXJ2aWNlIGZvcmdlcnlcbiAgICAvLyB0aGUgc2hhcmVkIHNlY3JldCBtYWRlIHVuZGV0ZWN0YWJsZS5cbiAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ3N1YmplY3RfbWlzbWF0Y2gnLCBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKGBTZXJ2aWNlIHRva2VuIHN1YmplY3QgJHtTdHJpbmcoY2xhaW1zLnN1Yil9IHdhcyBzaWduZWQgYnkgJHtlbnRyeS5zZXJ2aWNlTmFtZX1gKTtcbiAgfVxuICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ29rJywgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gIHJldHVybiBjbGFpbXM7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGlsZSB0aGlzIHNlcnZpY2Ugc3RpbGwgcHVibGlzaGVzIG1vcmUgdGhhbiBvbmUgdmVyaWZpY2F0aW9uIGtleSDigJQgaS5lLlxuICogYSBzaWduaW5nLWtleSByb3RhdGlvbiBpcyBvcGVuIGFuZCB0aGUgcmV0aXJpbmcga2V5IGlzIHN0aWxsIHRydXN0ZWQuIEZlZWRzXG4gKiB0aGUgYHNlY3JldF9yb3RhdGlvbl9wcmV2aW91c19zZXR7c2VjcmV0PVwiU0VSVklDRV9TSUdOSU5HX0tFWVwifWAgZ2F1Z2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JldGlyaW5nU2VydmljZUtleVB1Ymxpc2hlZCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtZSA9IHNlcnZpY2VJZGVudGl0eSgpO1xuICAgIHJldHVybiBbLi4udmVyaWZpY2F0aW9uS2V5cygpLnZhbHVlcygpXS5maWx0ZXIoKHYpID0+IHYuc2VydmljZU5hbWUgPT09IG1lKS5sZW5ndGggPiAxO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0IHNlYW06IGRyb3AgdGhlIGxvYWRlZCBzaWduaW5nIGtleSwgdGhlIGJ1bmRsZSBhbmQgYW55IGVwaGVtZXJhbCBrZXlzIHNvXG4gKiB0aGUgbmV4dCBzaWduL3ZlcmlmeSByZS1yZWFkcyB0aGUgZW52aXJvbm1lbnQuIERvbid0IGNhbGwgZnJvbSBwcm9kdWN0aW9uIGNvZGVcbiAqIOKAlCByb3RhdGlvbiBpcyBwaWNrZWQgdXAgYnkgdGhlIHJlZnJlc2ggaW50ZXJ2YWwgYW5kIHRoZSBtdGltZSBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNlcnZpY2VLZXlzRm9yVGVzdHMoKTogdm9pZCB7XG4gIGxvY2FsS2V5ID0gdW5kZWZpbmVkO1xuICBidW5kbGUgPSB1bmRlZmluZWQ7XG4gIGVwaGVtZXJhbEtleXMgPSB1bmRlZmluZWQ7XG4gIGVwaGVtZXJhbFdhcm5lZCA9IGZhbHNlO1xufVxuIl19
355
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1rZXlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUVILE9BQU8sTUFBTSxFQUFFLEVBQWtCLE1BQU0sUUFBUSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzVDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qyx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDO0FBRS9DLHVGQUF1RjtBQUN2RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUM7QUFFakQsaUZBQWlGO0FBQ2pGLE1BQU0sMEJBQTBCLEdBQUcsT0FBTyxDQUFDLENBQUMsWUFBWTtBQW9CeEQsNkVBQTZFO0FBQzdFLE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFDeEMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxN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QU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN4RixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSw2QkFBNkI7SUFDM0MsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx5QkFBeUI7SUFDdkMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUNyQixNQUFNLEdBQUcsU0FBUyxDQUFDO0lBQ25CLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDMUIsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGVyLXNlcnZpY2Ugc2lnbmluZyBrZXlzIGZvciBJTlRFUk5BTCBzZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zICgjMTQpLlxuICpcbiAqIEJlZm9yZSB0aGlzLCBldmVyeSBzZXJ2aWNlIGhlbGQgb25lIHNoYXJlZCBgSldUX1NFQ1JFVGAsIHNvIGFueSBzZXJ2aWNlIGNvdWxkXG4gKiBtaW50IGEgdG9rZW4gbmFtaW5nIGFueSBPVEhFUiBzZXJ2aWNlIOKAlCBcImJpbGxpbmcgc2FpZCBzb1wiIHdhcyB1bmZhbHNpZmlhYmxlLFxuICogYW5kIGEgc2luZ2xlIGNvbXByb21pc2VkIHdvcmtsb2FkIGNvdWxkIHNwZWFrIGZvciB0aGUgd2hvbGUgZmxlZXQuIE5vdyBlYWNoXG4gKiBzZXJ2aWNlIHNpZ25zIHdpdGggaXRzIE9XTiBFUzI1NiAoRUMgUC0yNTYpIGtleSBhbmQgY29uc3VtZXJzIHZlcmlmeSBhZ2FpbnN0XG4gKiB0aGUgcHVibGljIGhhbHZlcy4gVGhlIGBraWRgIGlzIGJvdW5kIHRvIHRoZSBzaWduZXIncyBOQU1FLCBzbyBhIHRva2VuIHdob3NlXG4gKiBgc3ViYCBzYXlzIGBzZXJ2aWNlOmJpbGxpbmdgIGJ1dCB3YXMgc2lnbmVkIHdpdGggY29tcGxpYW5jZSdzIGtleSBpcyBhXG4gKiBmb3JnZXJ5LCBub3QgYSB2YWxpZCB0b2tlbiB3aXRoIGEgY29uZnVzaW5nIHN1YmplY3QuXG4gKlxuICogIyMgV2h5IHB1YmxpYyBrZXlzIGFyZSBkaXN0cmlidXRlZCBieSBDT05GSUcsIG5vdCBieSBwZXItc2VydmljZSBKV0tTIGVuZHBvaW50c1xuICpcbiAqIFRoZSB1c2VyIGNoYWluICgjNSkgZmV0Y2hlcyBwbGF0Zm9ybSdzIEpXS1Mgb3ZlciBIVFRQIGJlY2F1c2UgdGhlcmUgaXMgZXhhY3RseVxuICogb25lIHNpZ25lciBhbmQgaXQgaXMgdGhlIG9uZSBzZXJ2aWNlIHRoYXQgbXVzdCBiZSB1cCBmb3IgYW55Ym9keSB0byBzaWduIGluLlxuICogVGhlIHNlcnZpY2UgY2hhaW4gaXMgdGhlIG9wcG9zaXRlIHNoYXBlLCBhbmQgdGhyZWUgcHJvcGVydGllcyBkZWNpZGVkIGl0OlxuICpcbiAqICAxLiAqKmB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsYCBtdXN0IHN0YXkgc3luY2hyb25vdXMuKiogVGhlIGdsb2JhbCByYXRlXG4gKiAgICAgbGltaXRlcidzIGBza2lwYCBhbmQgYXBwLWZhY3RvcnkncyBgL3dhcm11cGAgZ3VhcmQgdmVyaWZ5IGEgc2VydmljZSB0b2tlblxuICogICAgIEJFRk9SRSBgcmVxdWlyZUF1dGhgIHJ1bnMsIGluIHN5bmNocm9ub3VzIEV4cHJlc3MgY2FsbGJhY2tzLiBBbiBIVFRQIEpXS1NcbiAqICAgICBmZXRjaCB3b3VsZCBmb3JjZSB0aG9zZSBhc3luYyDigJQgYSBjaGFuZ2UgdGhhdCByZWFjaGVzIGludG8gZXZlcnlcbiAqICAgICBzZXJ2aWNlJ3MgbGltaXRlciB3aXJpbmcuXG4gKiAgMi4gKipObyBhdmFpbGFiaWxpdHkgY291cGxpbmcuKiogV2l0aCBwZXItc2VydmljZSBKV0tTIGVuZHBvaW50cywgdmVyaWZ5aW5nIGFcbiAqICAgICB0b2tlbiBtaW50ZWQgYnkgYGJpbGxpbmdgIG5lZWRzIGBiaWxsaW5nYCB0byBiZSByZWFjaGFibGUg4oCUIHNvIGJpbGxpbmdcbiAqICAgICBiZWluZyBkb3duIHdvdWxkIHN0b3AgcGxhdGZvcm0gZnJvbSBhY2NlcHRpbmcgYmlsbGluZydzIGluLWZsaWdodCBjYWxscyxcbiAqICAgICB0dXJuaW5nIG9uZSBvdXRhZ2UgaW50byBzZXZlcmFsLiBBIG1vdW50ZWQgZmlsZSBoYXMgbm8gc3VjaCBlZGdlLlxuICogIDMuICoqTm8gTsOXTiBhZGRyZXNzIGNvbmZpZy4qKiAxMCBzZXJ2aWNlcyB3b3VsZCBlYWNoIG5lZWQgZXZlcnkgcGVlcidzXG4gKiAgICAgaG9zdC9wb3J0IChhbmQgY29tcG9zZSwgd2hpY2ggaGFzIG5vIG1lc2gsIHdvdWxkIG5lZWQgdGhlbSB0b28pLlxuICpcbiAqIFNvIHRoZSBkZXBsb3kgZ2VuZXJhdGVzIG9uZSBrZXlwYWlyIHBlciBzZXJ2aWNlLCBtb3VudHMgZWFjaCBwcml2YXRlIGtleSBPTkxZXG4gKiBpbnRvIGl0cyBvd24gc2VydmljZSwgYW5kIG1vdW50cyBPTkUgcHVibGljIGJ1bmRsZSAocmVhZC1vbmx5KSBldmVyeXdoZXJlOlxuICpcbiAqICAgYFNFUlZJQ0VfU0lHTklOR19LRVlfRklMRWAgIHRoaXMgc2VydmljZSdzIEVDIFAtMjU2IHByaXZhdGUga2V5IChQS0NTIzggUEVNKVxuICogICBgU0VSVklDRV9LRVlfQlVORExFX0ZJTEVgICAgYHsgXCJzZXJ2aWNlc1wiOiB7IFwiPG5hbWU+XCI6IHsgXCJrZXlzXCI6IFs8andrPuKApl0gfSB9IH1gXG4gKlxuICogUm90YXRpb24gaXMgYnkgYGtpZGAsIGluIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSB1c2VyIGNoYWluOiBhZGQgdGhlIG5ldyBwdWJsaWNcbiAqIGtleSB0byB0aGUgYnVuZGxlICh0aGUgc2VydmljZSBub3cgcHVibGlzaGVzIHR3byksIHJvbGwgdGhlIGJ1bmRsZSBvdXQsIHN3YXBcbiAqIHRoYXQgc2VydmljZSdzIHByaXZhdGUga2V5LCB0aGVuIGRyb3AgdGhlIHJldGlyZWQgcHVibGljIGtleS4gVGhlIGJ1bmRsZSBpc1xuICogcmUtcmVhZCBvbiBhbiBpbnRlcnZhbCBBTkQgb24gYW4gbXRpbWUgY2hhbmdlLCBzbyBhIHJvdGF0aW9uIG5lZWRzIG5vIHJlc3RhcnQuXG4gKiBgZGVwbG95L2Jpbi9zZXJ2aWNlLXNpZ25pbmcta2V5cy5zaGAgZ2VuZXJhdGVzIGFuZCByb3RhdGVzIGJvdGggaGFsdmVzLlxuICpcbiAqICMjIEVwaGVtZXJhbCBtb2RlXG4gKlxuICogV2l0aCBubyBgU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFYCBjb25maWd1cmVkLCBhIGtleXBhaXIgaXMgZ2VuZXJhdGVkXG4gKiBJTi1QUk9DRVNTIHBlciByZXF1ZXN0ZWQgc2VydmljZSBuYW1lIGFuZCByZWdpc3RlcmVkIGluIHRoZSBpbi1tZW1vcnkgYnVuZGxlLlxuICogVGhhdCBrZWVwcyBzaW5nbGUtcHJvY2VzcyBzdWl0ZXMgYW5kIGxvY2FsIG9uZS1vZmYgc2NyaXB0cyB3b3JraW5nIHdpdGggbm8ga2V5XG4gKiBtYXRlcmlhbCwgYW5kIGl0IGNhbiBuZXZlciB3aWRlbiB0cnVzdDogdGhlIG9ubHkgdmVyaWZpZXIgdGhhdCBhY2NlcHRzIHN1Y2ggYVxuICogdG9rZW4gaXMgdGhlIHByb2Nlc3MgdGhhdCBtaW50ZWQgaXQuIEl0IGlzIGxvZ2dlZCBvbmNlIGF0IHdhcm4gbGV2ZWwsIGFuZFxuICogY291bnRlZCwgYmVjYXVzZSBpbiBhIHJlYWwgZGVwbG95bWVudCBpdCBtZWFucyB0aGlzIHNlcnZpY2UncyBwZWVycyB3aWxsXG4gKiByZWplY3QgZXZlcnl0aGluZyBpdCBzZW5kcy5cbiAqL1xuXG5pbXBvcnQgY3J5cHRvLCB7IHR5cGUgS2V5T2JqZWN0IH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgc3RhdFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBwdWJsaWNKd2tGcm9tLCBwdWJsaWNLZXlGcm9tSndrLCB0eXBlIFB1YmxpY0p3ayB9IGZyb20gJy4uL3V0aWxzL2p3ay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc2VydmljZS1rZXlzJyk7XG5cbi8qKiBUaGUgT05MWSBhbGdvcml0aG0gYW4gaW50ZXJuYWwgc2VydmljZSB0b2tlbiBtYXkgYmUgc2lnbmVkIHdpdGguICovXG5leHBvcnQgY29uc3QgU0VSVklDRV9UT0tFTl9BTEdPUklUSE0gPSAnRVMyNTYnO1xuXG4vKiogU3ViamVjdCBwcmVmaXggbmFtaW5nIHRoZSBjYWxsaW5nIHNlcnZpY2Ugb24gYSBzZXJ2aWNlIHRva2VuIChgc2VydmljZTo8bmFtZT5gKS4gKi9cbmV4cG9ydCBjb25zdCBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYID0gJ3NlcnZpY2U6JztcblxuLyoqIEhvdyBsb25nIGEgbG9hZGVkIGJ1bmRsZSBpcyBzZXJ2ZWQgYmVmb3JlIGl0IGlzIHJlLXJlYWQgKHJvdGF0aW9uIHBpY2t1cCkuICovXG5jb25zdCBCVU5ETEVfUkVGUkVTSF9JTlRFUlZBTF9NUyA9IDMwMF8wMDA7IC8vIDUgbWludXRlc1xuXG4vKiogT25lIHNlcnZpY2UncyBwdWJsaXNoZWQgdmVyaWZpY2F0aW9uIGtleXMsIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBidW5kbGUgZmlsZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUtleUVudHJ5IHtcbiAga2V5czogUHVibGljSndrW107XG59XG5cbi8qKiBUaGUgZG9jdW1lbnQgYFNFUlZJQ0VfS0VZX0JVTkRMRV9GSUxFYCBob2xkczogZXZlcnkgc2VydmljZSdzIHB1YmxpYyBrZXlzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlS2V5QnVuZGxlIHtcbiAgc2VydmljZXM6IFJlY29yZDxzdHJpbmcsIFNlcnZpY2VLZXlFbnRyeT47XG59XG5cbi8qKiBBIHNpZ25pbmcga2V5IHRoaXMgcHJvY2VzcyBob2xkcywgaW4gdGhlIGZvcm1zIHNpZ25pbmcgbmVlZHMuICovXG5pbnRlcmZhY2UgTG9jYWxTaWduaW5nS2V5IHtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAga2lkOiBzdHJpbmc7XG4gIHByaXZhdGVLZXk6IEtleU9iamVjdDtcbiAgcHVibGljSndrOiBQdWJsaWNKd2s7XG59XG5cbi8qKiBUaGUgYnVuZGxlIGNvdWxkIG5vdCBiZSBsb2FkZWQgb3IgZG9lcyBub3Qga25vdyB0aGUga2V5IGEgdG9rZW4gbmFtZXMuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUtleUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnU2VydmljZUtleUVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgcHJvY2VzcydzIHNlcnZpY2UgaWRlbnRpdHkg4oCUIHRoZSBgPG5hbWU+YCBpbiBgc2VydmljZTo8bmFtZT5gIGFuZCB0aGVcbiAqIG5hbWUgaXRzIGtleSBpcyBwdWJsaXNoZWQgdW5kZXIuIGBTRVJWSUNFX05BTUVgIGlzIGFscmVhZHkgc2V0IHBlciBzZXJ2aWNlIGluXG4gKiBldmVyeSBkZXBsb3kgdGFyZ2V0IChjb21wb3NlLCBtaW5pa3ViZSwgZWMyLCBla3MpLCBhbmQgaXMgdGhlIHNhbWUgdmFsdWUgdGhlXG4gKiBhdWRpdCBhbmQgbWV0cmljIGxhYmVscyB1c2UsIHNvIHRoZXJlIGlzIG9uZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIFwid2hvIGFtIElcIi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VJZGVudGl0eSgpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIExvY2FsIHNpZ25pbmcga2V5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubGV0IGxvY2FsS2V5OiBMb2NhbFNpZ25pbmdLZXkgfCB1bmRlZmluZWQ7XG5sZXQgZXBoZW1lcmFsS2V5czogTWFwPHN0cmluZywgTG9jYWxTaWduaW5nS2V5PiB8IHVuZGVmaW5lZDtcbmxldCBlcGhlbWVyYWxXYXJuZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gbG9hZENvbmZpZ3VyZWRTaWduaW5nS2V5KGZpbGU6IHN0cmluZyk6IExvY2FsU2lnbmluZ0tleSB7XG4gIGNvbnN0IHNlcnZpY2VOYW1lID0gc2VydmljZUlkZW50aXR5KCk7XG4gIGxldCBwcml2YXRlS2V5OiBLZXlPYmplY3Q7XG4gIHRyeSB7XG4gICAgcHJpdmF0ZUtleSA9IGNyeXB0by5jcmVhdGVQcml2YXRlS2V5KHJlYWRGaWxlU3luYyhmaWxlLCAndXRmOCcpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGBDb3VsZCBub3QgcmVhZCB0aGUgc2VydmljZSBzaWduaW5nIGtleSBhdCAke2ZpbGV9OiAke2Vycm9yTWVzc2FnZShlcnJvcil9YCk7XG4gIH1cbiAgLy8gcHVibGljSndrRnJvbSByZWplY3RzIGFueXRoaW5nIGJ1dCBhbiBFQyBQLTI1NiBrZXksIHNvIGEgc2VydmljZSBjb25maWd1cmVkXG4gIC8vIHdpdGggKHNheSkgYW4gUlNBIGtleSBmYWlscyBIRVJFIHJhdGhlciB0aGFuIG1pbnRpbmcgdG9rZW5zIG5vYm9keSB2ZXJpZmllcy5cbiAgY29uc3QgcHVibGljSndrID0gcHVibGljSndrRnJvbShjcnlwdG8uY3JlYXRlUHVibGljS2V5KHByaXZhdGVLZXkpKTtcbiAgcmV0dXJuIHsgc2VydmljZU5hbWUsIGtpZDogcHVibGljSndrLmtpZCwgcHJpdmF0ZUtleSwgcHVibGljSndrIH07XG59XG5cbi8qKlxuICogVGhlIGluLXByb2Nlc3Mga2V5IGZvciBgc2VydmljZU5hbWVgIGluIGVwaGVtZXJhbCBtb2RlLCBnZW5lcmF0ZWQgb24gZmlyc3RcbiAqIHVzZSBhbmQgcmVnaXN0ZXJlZCBpbiB0aGUgaW4tbWVtb3J5IGJ1bmRsZSBzbyB0aGlzIHByb2Nlc3MgY2FuIHZlcmlmeSBpdHMgb3duXG4gKiB0b2tlbnMuIEtleWVkIGJ5IE5BTUUgKG5vdCBqdXN0IG9uZSBrZXkpIHNvIGEgc2luZ2xlLXByb2Nlc3Mgc3VpdGUgY2FuIG1pbnRcbiAqIHRva2VucyBmb3Igc2V2ZXJhbCBzZXJ2aWNlcywgYXMgdGhlIHJlYWwgZmxlZXQgZG9lcyBhY3Jvc3MgcHJvY2Vzc2VzLlxuICovXG5mdW5jdGlvbiBlcGhlbWVyYWxTaWduaW5nS2V5KHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBMb2NhbFNpZ25pbmdLZXkge1xuICBlcGhlbWVyYWxLZXlzID8/PSBuZXcgTWFwKCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gZXBoZW1lcmFsS2V5cy5nZXQoc2VydmljZU5hbWUpO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblxuICBpZiAoIWVwaGVtZXJhbFdhcm5lZCkge1xuICAgIGVwaGVtZXJhbFdhcm5lZCA9IHRydWU7XG4gICAgZW1pdENvdW50ZXIoJ3NlcnZpY2Vfc2lnbmluZ19lcGhlbWVyYWxfa2V5X3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlSWRlbnRpdHkoKSB9KTtcbiAgICBsb2dnZXIud2FybignU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFIGlzIG5vdCBzZXQg4oCUIG1pbnRpbmcgaW50ZXJuYWwgc2VydmljZSB0b2tlbnMgd2l0aCBhbiBFUEhFTUVSQUwga2V5LiBPbmx5IHRoaXMgcHJvY2VzcyB3aWxsIGFjY2VwdCB0aGVtOyBldmVyeSBwZWVyIHdpbGwgcmVqZWN0IHRoZW0uIFNldCBTRVJWSUNFX1NJR05JTkdfS0VZX0ZJTEUgKyBTRVJWSUNFX0tFWV9CVU5ETEVfRklMRSAoZGVwbG95L2Jpbi9zZXJ2aWNlLXNpZ25pbmcta2V5cy5zaCkuJyk7XG4gIH1cbiAgY29uc3QgeyBwcml2YXRlS2V5LCBwdWJsaWNLZXkgfSA9IGNyeXB0by5nZW5lcmF0ZUtleVBhaXJTeW5jKCdlYycsIHsgbmFtZWRDdXJ2ZTogJ3ByaW1lMjU2djEnIH0pO1xuICBjb25zdCBwdWJsaWNKd2sgPSBwdWJsaWNKd2tGcm9tKHB1YmxpY0tleSk7XG4gIGNvbnN0IGdlbmVyYXRlZDogTG9jYWxTaWduaW5nS2V5ID0geyBzZXJ2aWNlTmFtZSwga2lkOiBwdWJsaWNKd2sua2lkLCBwcml2YXRlS2V5LCBwdWJsaWNKd2sgfTtcbiAgZXBoZW1lcmFsS2V5cy5zZXQoc2VydmljZU5hbWUsIGdlbmVyYXRlZCk7XG4gIHJldHVybiBnZW5lcmF0ZWQ7XG59XG5cbi8qKiBXaGV0aGVyIHRoaXMgcHJvY2VzcyBzaWducyB3aXRoIGEgbW91bnRlZCBrZXkgKGBjb25maWd1cmVkYCkgb3IgYW4gaW4tcHJvY2VzcyBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZUtleU1vZGUoKTogJ2NvbmZpZ3VyZWQnIHwgJ2VwaGVtZXJhbCcge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFID8gJ2NvbmZpZ3VyZWQnIDogJ2VwaGVtZXJhbCc7XG59XG5cbi8qKlxuICogVGhlIGtleSBgc2VydmljZU5hbWVgIG11c3QgYmUgc2lnbmVkIHdpdGguXG4gKlxuICogSW4gYGNvbmZpZ3VyZWRgIG1vZGUgdGhlcmUgaXMgZXhhY3RseSBPTkUga2V5IOKAlCB0aGlzIHNlcnZpY2UncyDigJQgc28gYSByZXF1ZXN0XG4gKiB0byBzaWduIGFzIHNvbWUgT1RIRVIgc2VydmljZSBpcyBhIGJ1ZyBhbmQgdGhyb3dzLiBUaGF0IG1hdHRlcnM6IGJlZm9yZSAjMTQgYVxuICogc2VydmljZSBjb3VsZCBsZWdpdGltYXRlbHkgbWludCBgc2VydmljZTpwbGF0Zm9ybWAgd2l0aCB0aGUgc2hhcmVkIHNlY3JldFxuICogKGFwaS9wbHVnaW4gZGlkLCBmb3IgaXRzIHJlZ2lzdHJ5IHB1c2hlcyksIGFuZCB1bmRlciBwZXItc2VydmljZSBrZXlzIHN1Y2ggYVxuICogdG9rZW4gd291bGQgYmUgc2lsZW50bHkgdW52ZXJpZmlhYmxlIGV2ZXJ5d2hlcmUuIEZhaWxpbmcgYXQgdGhlIG1pbnQgdHVybnNcbiAqIHRoYXQgaW50byBhbiBpbW1lZGlhdGUsIG9idmlvdXMgZXJyb3IgaW5zdGVhZCBvZiBhIHJ1bnRpbWUgNDAxLlxuICovXG5mdW5jdGlvbiBzaWduaW5nS2V5Rm9yKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBMb2NhbFNpZ25pbmdLZXkge1xuICBjb25zdCBmaWxlID0gcHJvY2Vzcy5lbnYuU0VSVklDRV9TSUdOSU5HX0tFWV9GSUxFO1xuICBpZiAoIWZpbGUpIHJldHVybiBlcGhlbWVyYWxTaWduaW5nS2V5KHNlcnZpY2VOYW1lKTtcblxuICBpZiAoIWxvY2FsS2V5IHx8IGxvY2FsS2V5LnNlcnZpY2VOYW1lICE9PSBzZXJ2aWNlSWRlbnRpdHkoKSkge1xuICAgIGxvY2FsS2V5ID0gbG9hZENvbmZpZ3VyZWRTaWduaW5nS2V5KGZpbGUpO1xuICB9XG4gIGlmIChzZXJ2aWNlTmFtZSAhPT0gbG9jYWxLZXkuc2VydmljZU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKFxuICAgICAgYFRoaXMgcHJvY2VzcyBpcyAnJHtsb2NhbEtleS5zZXJ2aWNlTmFtZX0nIGFuZCBob2xkcyBvbmx5IGl0cyBvd24gc2lnbmluZyBrZXksIHNvIGl0IGNhbm5vdCBtaW50IGEgdG9rZW4gZm9yICcke3NlcnZpY2VOYW1lfScuIGBcbiAgICAgICsgJ05hbWUgdGhlIGNhbGxpbmcgc2VydmljZSBjb3JyZWN0bHksIG9yIGdpdmUgdGhlIGNhbGxlciBpdHMgb3duIGtleS4nLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGxvY2FsS2V5O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFZlcmlmaWNhdGlvbiBidW5kbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgTG9hZGVkQnVuZGxlIHtcbiAgLyoqIGBraWRgIOKGkiB0aGUgc2VydmljZSB0aGF0IHB1Ymxpc2hlZCBpdCwgcGx1cyB0aGUgdmVyaWZpY2F0aW9uIGtleS4gKi9cbiAgYnlLaWQ6IE1hcDxzdHJpbmcsIHsgc2VydmljZU5hbWU6IHN0cmluZzsga2V5OiBLZXlPYmplY3QgfT47XG4gIGxvYWRlZEF0OiBudW1iZXI7XG4gIG10aW1lTXM6IG51bWJlcjtcbn1cblxubGV0IGJ1bmRsZTogTG9hZGVkQnVuZGxlIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBwYXJzZUJ1bmRsZShyYXc6IHN0cmluZywgZmlsZTogc3RyaW5nKTogTWFwPHN0cmluZywgeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBrZXk6IEtleU9iamVjdCB9PiB7XG4gIGxldCBkb2N1bWVudDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBkb2N1bWVudCA9IEpTT04ucGFyc2UocmF3KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGAke2ZpbGV9IGlzIG5vdCB2YWxpZCBKU09OOiAke2Vycm9yTWVzc2FnZShlcnJvcil9YCk7XG4gIH1cbiAgY29uc3Qgc2VydmljZXMgPSAoZG9jdW1lbnQgYXMgUGFydGlhbDxTZXJ2aWNlS2V5QnVuZGxlPik/LnNlcnZpY2VzO1xuICBpZiAoIXNlcnZpY2VzIHx8IHR5cGVvZiBzZXJ2aWNlcyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGAke2ZpbGV9IGhhcyBubyBcInNlcnZpY2VzXCIgb2JqZWN0YCk7XG4gIH1cbiAgY29uc3QgYnlLaWQgPSBuZXcgTWFwPHN0cmluZywgeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBrZXk6IEtleU9iamVjdCB9PigpO1xuICBmb3IgKGNvbnN0IFtzZXJ2aWNlTmFtZSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHNlcnZpY2VzKSkge1xuICAgIGZvciAoY29uc3QgandrIG9mIGVudHJ5Py5rZXlzID8/IFtdKSB7XG4gICAgICBpZiAoIWp3az8ua2lkKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ5S2lkLnNldChqd2sua2lkLCB7IHNlcnZpY2VOYW1lLCBrZXk6IHB1YmxpY0tleUZyb21Kd2soandrKSB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE9uZSB1bnVzYWJsZSBlbnRyeSBtdXN0IG5vdCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZSBidW5kbGUg4oCUIHRoZSBzYW1lXG4gICAgICAgIC8vIHJ1bGUgdGhlIEpXS1MgY2FjaGUgYXBwbGllcyB0byBwbGF0Zm9ybSdzIHB1Ymxpc2hlZCBzZXQuXG4gICAgICAgIGxvZ2dlci53YXJuKCdTa2lwcGluZyB1bnVzYWJsZSBzZXJ2aWNlIGtleScsIHsgc2VydmljZU5hbWUsIGtpZDogandrLmtpZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvcikgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChieUtpZC5zaXplID09PSAwKSB0aHJvdyBuZXcgU2VydmljZUtleUVycm9yKGAke2ZpbGV9IGNvbnRhaW5lZCBubyB1c2FibGUgc2VydmljZSBrZXlzYCk7XG4gIHJldHVybiBieUtpZDtcbn1cblxuLyoqXG4gKiBUaGUgYGtpZGAg4oaSIHNlcnZpY2UgbWFwLCByZS1yZWFkIHdoZW4gdGhlIHJlZnJlc2ggaW50ZXJ2YWwgaGFzIHBhc3NlZCBvciB0aGVcbiAqIGZpbGUncyBtdGltZSBjaGFuZ2VkIChzbyBhIHJvdGF0aW9uIGlzIHBpY2tlZCB1cCB3aXRob3V0IGEgcmVzdGFydCkuXG4gKlxuICogSW4gZXBoZW1lcmFsIG1vZGUgdGhlIFwiYnVuZGxlXCIgaXMgd2hhdGV2ZXIgdGhpcyBwcm9jZXNzIGdlbmVyYXRlZCBmb3IgaXRzZWxmLlxuICogTmV2ZXIgdGhyb3dzIGZvciBhIG1pc3NpbmcgZmlsZSBpbiB0aGF0IG1vZGUg4oCUIGl0IGp1c3QgaG9sZHMgdGhvc2Uga2V5cy5cbiAqL1xuZnVuY3Rpb24gdmVyaWZpY2F0aW9uS2V5cygpOiBNYXA8c3RyaW5nLCB7IHNlcnZpY2VOYW1lOiBzdHJpbmc7IGtleTogS2V5T2JqZWN0IH0+IHtcbiAgY29uc3QgZmlsZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfS0VZX0JVTkRMRV9GSUxFO1xuICBpZiAoIWZpbGUpIHtcbiAgICBjb25zdCBsb2NhbCA9IG5ldyBNYXA8c3RyaW5nLCB7IHNlcnZpY2VOYW1lOiBzdHJpbmc7IGtleTogS2V5T2JqZWN0IH0+KCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZXBoZW1lcmFsS2V5cz8udmFsdWVzKCkgPz8gW10pIHtcbiAgICAgIGxvY2FsLnNldChrZXkua2lkLCB7IHNlcnZpY2VOYW1lOiBrZXkuc2VydmljZU5hbWUsIGtleTogY3J5cHRvLmNyZWF0ZVB1YmxpY0tleShrZXkucHJpdmF0ZUtleSkgfSk7XG4gICAgfVxuICAgIHJldHVybiBsb2NhbDtcbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGxldCBtdGltZU1zID0gMDtcbiAgdHJ5IHtcbiAgICBtdGltZU1zID0gc3RhdFN5bmMoZmlsZSkubXRpbWVNcztcbiAgfSBjYXRjaCB7XG4gICAgLy8gVW5yZWFkYWJsZSBub3c6IGtlZXAgc2VydmluZyBhIGJ1bmRsZSBhbHJlYWR5IGluIGhhbmQgKHB1YmxpYyBrZXlzIGRvbid0XG4gICAgLy8gZXhwaXJlLCBhbmQgcmVmdXNpbmcgZXZlcnkgaW50ZXJuYWwgY2FsbCBiZWNhdXNlIGEgbW91bnQgYmxpcHBlZCB3b3VsZCBiZVxuICAgIC8vIGEgc2VsZi1pbmZsaWN0ZWQgb3V0YWdlKS4gV2l0aCBub3RoaW5nIGluIGhhbmQsIGZhaWwgY2xvc2VkIGJlbG93LlxuICAgIGlmIChidW5kbGUpIHJldHVybiBidW5kbGUuYnlLaWQ7XG4gIH1cbiAgaWYgKGJ1bmRsZSAmJiBidW5kbGUubXRpbWVNcyA9PT0gbXRpbWVNcyAmJiBub3cgLSBidW5kbGUubG9hZGVkQXQgPCBCVU5ETEVfUkVGUkVTSF9JTlRFUlZBTF9NUykge1xuICAgIHJldHVybiBidW5kbGUuYnlLaWQ7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGJ5S2lkID0gcGFyc2VCdW5kbGUocmVhZEZpbGVTeW5jKGZpbGUsICd1dGY4JyksIGZpbGUpO1xuICAgIGJ1bmRsZSA9IHsgYnlLaWQsIGxvYWRlZEF0OiBub3csIG10aW1lTXMgfTtcbiAgICByZXR1cm4gYnlLaWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGJ1bmRsZSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1NlcnZpY2Uga2V5IGJ1bmRsZSByZWxvYWQgZmFpbGVkOyBjb250aW51aW5nIG9uIHRoZSBsb2FkZWQgY29weScsIHsgZmlsZSwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvcikgfSk7XG4gICAgICByZXR1cm4gYnVuZGxlLmJ5S2lkO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvciBpbnN0YW5jZW9mIFNlcnZpY2VLZXlFcnJvciA/IGVycm9yIDogbmV3IFNlcnZpY2VLZXlFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYGtpZGAgYmVsb25ncyB0byBhbiBpbnRlcm5hbCBTRVJWSUNFIGtleS4gVGhpcyBpcyBob3cgYSBiZWFyZXIgdG9rZW5cbiAqIGlzIHJvdXRlZCBiZXR3ZWVuIHRoZSB0d28gRVMyNTYgY2hhaW5zOiBib3RoIHVzZXIgYW5kIHNlcnZpY2UgdG9rZW5zIGFyZVxuICogRVMyNTYgd2l0aCBhIGBraWRgLCBhbmQgYGtpZGAgaXMgYW4gUkZDIDc2MzggdGh1bWJwcmludCwgc28gb3duZXJzaGlwIG9mIHRoZVxuICogaWQg4oCUIG5vdCBhIGNsYWltIGluc2lkZSB0aGUgdG9rZW4g4oCUIGRlY2lkZXMgd2hpY2gga2V5IHNldCBtYXkgdmVyaWZ5IGl0LlxuICogUmV0dXJucyBgZmFsc2VgIChuZXZlciB0aHJvd3MpIHdoZW4gbm8gYnVuZGxlIGNhbiBiZSByZWFkOyB0aGUgdG9rZW4gdGhlblxuICogdGFrZXMgdGhlIHVzZXIgY2hhaW4gYW5kIGlzIHJlamVjdGVkIHRoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlS2lkKGtpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHZlcmlmaWNhdGlvbktleXMoKS5oYXMoa2lkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBFdmVyeSBzZXJ2aWNlIG5hbWUgdGhlIGJ1bmRsZSBwdWJsaXNoZXMgYSBrZXkgZm9yLiBEaWFnbm9zdGljcyBhbmQgdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24ga25vd25TZXJ2aWNlTmFtZXMoKTogc3RyaW5nW10ge1xuICB0cnkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldChbLi4udmVyaWZpY2F0aW9uS2V5cygpLnZhbHVlcygpXS5tYXAoKHYpID0+IHYuc2VydmljZU5hbWUpKV0uc29ydCgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaWduIC8gdmVyaWZ5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIGJhc2U2NHVybCBvZiBhIEpTT04gdmFsdWUsIHRoZSBKV1Mgd2F5IChubyBwYWRkaW5nLCBVUkwgYWxwaGFiZXQpLiAqL1xuZnVuY3Rpb24gYjY0dUpzb24odmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0dXJsJyk7XG59XG5cbi8qKlxuICogU2lnbiBgY2xhaW1zYCBhcyB0aGlzIHNlcnZpY2UncyBpbnRlcm5hbCB0b2tlbjogRVMyNTYsIGBraWRgID0gdGhlIHNpZ25lcidzXG4gKiB0aHVtYnByaW50LCBgc3ViYCA9IGBzZXJ2aWNlOjxzZXJ2aWNlTmFtZT5gLiBgaWF0YC9gZXhwYCBhbmQgdGhlIG9wdGlvbmFsXG4gKiBpc3N1ZXIvYXVkaWVuY2UgYXJlIHN0YW1wZWQgaGVyZSBzbyB0aGVyZSBpcyBvbmUgcGxhY2UgdGhhdCBkZWNpZGVzIHdoYXQgYVxuICogc2VydmljZSB0b2tlbiBzYXlzLlxuICpcbiAqIEhhbmQtcm9sbGVkIChyYXRoZXIgdGhhbiBgand0LnNpZ25gKSBvbmx5IHNvIHRoZSBoZWFkZXIgY2FycmllcyB0aGUgYGtpZGAgaW5cbiAqIHRoZSBzYW1lIHNoYXBlIHBsYXRmb3JtJ3Mgc2lnbmVyIHByb2R1Y2VzIOKAlCBgY3J5cHRvLnNpZ25gIGlzIHN5bmNocm9ub3VzLCBzb1xuICogdW5saWtlIHRoZSBLTVMgcGF0aCB0aGlzIGNvc3RzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduU2VydmljZUp3dChcbiAgY2xhaW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogeyBzZXJ2aWNlTmFtZTogc3RyaW5nOyBleHBpcmVzSW5TZWNvbmRzOiBudW1iZXI7IGlzc3Vlcj86IHN0cmluZzsgYXVkaWVuY2U/OiBzdHJpbmcgfSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IHNpZ25pbmdLZXlGb3Iob3B0aW9ucy5zZXJ2aWNlTmFtZSk7XG4gIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICBjb25zdCBib2R5ID0ge1xuICAgIC4uLmNsYWltcyxcbiAgICBzdWI6IGAke1NFUlZJQ0VfU1VCSkVDVF9QUkVGSVh9JHtvcHRpb25zLnNlcnZpY2VOYW1lfWAsXG4gICAgaWF0OiBub3csXG4gICAgZXhwOiBub3cgKyBvcHRpb25zLmV4cGlyZXNJblNlY29uZHMsXG4gICAgLi4uKG9wdGlvbnMuaXNzdWVyID8geyBpc3M6IG9wdGlvbnMuaXNzdWVyIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMuYXVkaWVuY2UgPyB7IGF1ZDogb3B0aW9ucy5hdWRpZW5jZSB9IDoge30pLFxuICB9O1xuICBjb25zdCBzaWduaW5nSW5wdXQgPSBgJHtiNjR1SnNvbih7IGFsZzogU0VSVklDRV9UT0tFTl9BTEdPUklUSE0sIHR5cDogJ0pXVCcsIGtpZDoga2V5LmtpZCB9KX0uJHtiNjR1SnNvbihib2R5KX1gO1xuICBjb25zdCBzaWduYXR1cmUgPSBjcnlwdG8uc2lnbignc2hhMjU2JywgQnVmZmVyLmZyb20oc2lnbmluZ0lucHV0LCAndXRmLTgnKSwge1xuICAgIGtleToga2V5LnByaXZhdGVLZXksXG4gICAgZHNhRW5jb2Rpbmc6ICdpZWVlLXAxMzYzJyxcbiAgfSk7XG4gIHJldHVybiBgJHtzaWduaW5nSW5wdXR9LiR7c2lnbmF0dXJlLnRvU3RyaW5nKCdiYXNlNjR1cmwnKX1gO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhbiBpbnRlcm5hbCBzZXJ2aWNlIHRva2VuLCBTWU5DSFJPTk9VU0xZLCBhbmQgcmV0dXJuIGl0cyBjbGFpbXMuXG4gKlxuICogVGhlIHNlY3VyaXR5IHByb3BlcnR5IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvcjogdGhlIGBraWRgIHNlbGVjdHMgdGhlIGtleVxuICogQU5EIG5hbWVzIHRoZSBzaWduZXIsIGFuZCB0aGUgdG9rZW4ncyBgc3ViYCBtdXN0IGFncmVlLiBTbyBgYmlsbGluZ2AgY2Fubm90XG4gKiBiZSBpbXBlcnNvbmF0ZWQgYnkgYW55IG90aGVyIHNlcnZpY2Ug4oCUIG5vdCBldmVuIG9uZSB0aGF0IGhvbGRzIGEgdmFsaWQga2V5IG9mXG4gKiBpdHMgb3duIOKAlCB3aGljaCBpcyB3aGF0IHRoZSBzaGFyZWQgc2VjcmV0IGNvdWxkIG5ldmVyIGd1YXJhbnRlZS5cbiAqXG4gKiBAdGhyb3dzIHtqd3QuSnNvbldlYlRva2VuRXJyb3J9IHVua25vd24gYGtpZGAsIHdyb25nIGFsZ29yaXRobSwgYmFkXG4gKiAgICAgICAgIHNpZ25hdHVyZSwgZXhwaXJlZCwgb3IgYSBgc3ViYCB0aGF0IGRpc2FncmVlcyB3aXRoIHRoZSBzaWduaW5nIGtleS5cbiAqIEB0aHJvd3Mge1NlcnZpY2VLZXlFcnJvcn0gbm8gdmVyaWZpY2F0aW9uIGJ1bmRsZSBjb3VsZCBiZSByZWFkIGF0IGFsbCDigJQgdGhlXG4gKiAgICAgICAgIHRva2VuJ3MgdmFsaWRpdHkgaXMgVU5LTk9XTiBhbmQgdGhlIGNhbGxlciBtdXN0IG5vdCB0cmVhdCBpdCBhcyB2YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNlcnZpY2VKd3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgdG9rZW46IHN0cmluZyxcbiAgb3B0aW9uczogeyBraWQ6IHN0cmluZzsgaXNzdWVyPzogc3RyaW5nOyBhdWRpZW5jZT86IHN0cmluZyB9LFxuKTogVCB7XG4gIGNvbnN0IGVudHJ5ID0gdmVyaWZpY2F0aW9uS2V5cygpLmdldChvcHRpb25zLmtpZCk7XG4gIGlmICghZW50cnkpIHtcbiAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ3Vua25vd25fa2lkJyB9KTtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKGBObyBwdWJsaXNoZWQgc2VydmljZSBrZXkgZm9yIGtpZCAke29wdGlvbnMua2lkfWApO1xuICB9XG4gIGxldCBjbGFpbXM6IFQgJiB7IHN1Yj86IHVua25vd24gfTtcbiAgdHJ5IHtcbiAgICBjbGFpbXMgPSBqd3QudmVyaWZ5KHRva2VuLCBlbnRyeS5rZXksIHtcbiAgICAgIGFsZ29yaXRobXM6IFtTRVJWSUNFX1RPS0VOX0FMR09SSVRITV0sXG4gICAgICAuLi4ob3B0aW9ucy5pc3N1ZXIgPyB7IGlzc3Vlcjogb3B0aW9ucy5pc3N1ZXIgfSA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLmF1ZGllbmNlID8geyBhdWRpZW5jZTogb3B0aW9ucy5hdWRpZW5jZSB9IDoge30pLFxuICAgIH0pIGFzIFQgJiB7IHN1Yj86IHVua25vd24gfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl92ZXJpZnlfdG90YWwnLCB7IHJlc3VsdDogJ2ludmFsaWQnIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIGlmIChjbGFpbXMuc3ViICE9PSBgJHtTRVJWSUNFX1NVQkpFQ1RfUFJFRklYfSR7ZW50cnkuc2VydmljZU5hbWV9YCkge1xuICAgIC8vIEEgdmFsaWQgc2lnbmF0dXJlIGJ5IHRoZSBXUk9ORyBzZXJ2aWNlOiB0aGUga2V5IGJlbG9uZ3MgdG8gYGVudHJ5LnNlcnZpY2VOYW1lYFxuICAgIC8vIGJ1dCB0aGUgdG9rZW4gc3BlYWtzIGZvciBzb21lb25lIGVsc2UuIFRoaXMgaXMgdGhlIGNyb3NzLXNlcnZpY2UgZm9yZ2VyeVxuICAgIC8vIHRoZSBzaGFyZWQgc2VjcmV0IG1hZGUgdW5kZXRlY3RhYmxlLlxuICAgIGVtaXRDb3VudGVyKCdzZXJ2aWNlX3Rva2VuX3ZlcmlmeV90b3RhbCcsIHsgcmVzdWx0OiAnc3ViamVjdF9taXNtYXRjaCcsIHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0pO1xuICAgIHRocm93IG5ldyBqd3QuSnNvbldlYlRva2VuRXJyb3IoYFNlcnZpY2UgdG9rZW4gc3ViamVjdCAke1N0cmluZyhjbGFpbXMuc3ViKX0gd2FzIHNpZ25lZCBieSAke2VudHJ5LnNlcnZpY2VOYW1lfWApO1xuICB9XG4gIGVtaXRDb3VudGVyKCdzZXJ2aWNlX3Rva2VuX3ZlcmlmeV90b3RhbCcsIHsgcmVzdWx0OiAnb2snLCBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgcmV0dXJuIGNsYWltcztcbn1cblxuLyoqXG4gKiBUcnVlIHdoaWxlIHRoaXMgc2VydmljZSBzdGlsbCBwdWJsaXNoZXMgbW9yZSB0aGFuIG9uZSB2ZXJpZmljYXRpb24ga2V5IOKAlCBpLmUuXG4gKiBhIHNpZ25pbmcta2V5IHJvdGF0aW9uIGlzIG9wZW4gYW5kIHRoZSByZXRpcmluZyBrZXkgaXMgc3RpbGwgdHJ1c3RlZC4gRmVlZHNcbiAqIHRoZSBgc2VjcmV0X3JvdGF0aW9uX3ByZXZpb3VzX3NldHtzZWNyZXQ9XCJTRVJWSUNFX1NJR05JTkdfS0VZXCJ9YCBnYXVnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmV0aXJpbmdTZXJ2aWNlS2V5UHVibGlzaGVkKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IG1lID0gc2VydmljZUlkZW50aXR5KCk7XG4gICAgcmV0dXJuIFsuLi52ZXJpZmljYXRpb25LZXlzKCkudmFsdWVzKCldLmZpbHRlcigodikgPT4gdi5zZXJ2aWNlTmFtZSA9PT0gbWUpLmxlbmd0aCA+IDE7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3Qgc2VhbTogZHJvcCB0aGUgbG9hZGVkIHNpZ25pbmcga2V5LCB0aGUgYnVuZGxlIGFuZCBhbnkgZXBoZW1lcmFsIGtleXMgc29cbiAqIHRoZSBuZXh0IHNpZ24vdmVyaWZ5IHJlLXJlYWRzIHRoZSBlbnZpcm9ubWVudC4gRG9uJ3QgY2FsbCBmcm9tIHByb2R1Y3Rpb24gY29kZVxuICog4oCUIHJvdGF0aW9uIGlzIHBpY2tlZCB1cCBieSB0aGUgcmVmcmVzaCBpbnRlcnZhbCBhbmQgdGhlIG10aW1lIGNoZWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0U2VydmljZUtleXNGb3JUZXN0cygpOiB2b2lkIHtcbiAgbG9jYWxLZXkgPSB1bmRlZmluZWQ7XG4gIGJ1bmRsZSA9IHVuZGVmaW5lZDtcbiAgZXBoZW1lcmFsS2V5cyA9IHVuZGVmaW5lZDtcbiAgZXBoZW1lcmFsV2FybmVkID0gZmFsc2U7XG59XG4iXX0=
@@ -3,12 +3,13 @@
3
3
  import crypto from 'crypto';
4
4
  import { createEnvRedisClient, createRedisReadyGate } from './env-redis.js';
5
5
  import { createLogger } from '../utils/logger.js';
6
+ import { errorMessage } from '../utils/response.js';
6
7
  const logger = createLogger('sse-ticket-store');
7
8
  function newTicketId() {
8
9
  return crypto.randomBytes(24).toString('base64url');
9
10
  }
10
11
  function errMsg(err) {
11
- return err instanceof Error ? err.message : String(err);
12
+ return errorMessage(err);
12
13
  }
13
14
  /** In-memory backend — single-process fallback when Redis isn't configured. */
14
15
  export function createMemorySseTicketStore(config) {
@@ -170,4 +171,4 @@ export function createEnvSseTicketStore(config) {
170
171
  logger.info('SSE ticket store: in-memory backend (single-process fallback)', { keyPrefix: config.keyPrefix });
171
172
  return createMemorySseTicketStore(config);
172
173
  }
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLXRpY2tldC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9zc2UtdGlja2V0LXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUE2RGhELFNBQVMsV0FBVztJQUNsQixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxHQUFZO0lBQzFCLE9BQU8sR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLDBCQUEwQixDQUFDLE1BQTRCO0lBRXJFLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFnRCxDQUFDO0lBRXZFLE1BQU0sS0FBSyxHQUFHLEdBQVMsRUFBRTtRQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLE9BQU87WUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsU0FBUztnQkFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxD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QUMsOEJBQThCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RSxDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTztZQUNwQixNQUFNLEtBQUssRUFBRSxDQUFDO1lBQ2QsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLEtBQXdDLENBQUM7S0FDOUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQTRCO0lBQ2xFLE1BQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFpQixZQUFZLENBQUMsQ0FBQztJQUNqRSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxpREFBaUQsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNoRyxPQUFPLHlCQUF5QixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQywrREFBK0QsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5RyxPQUFPLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCwgY3JlYXRlUmVkaXNSZWFkeUdhdGUsIHR5cGUgUmVhZHlBd2FyZVJlZGlzIH0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzc2UtdGlja2V0LXN0b3JlJyk7XG5cbi8qKiBXaGF0IGEgdGlja2V0IGF1dGhvcml6ZXM6IHRoZSBvd25pbmcgb3JnIGFuZCwgZm9yIHN1YmplY3QtYm91bmQgY2hhbm5lbHMsIHRoZSBzdHJlYW0gc3ViamVjdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0UmVjb3JkIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgLyoqIFN0cmVhbSBzdWJqZWN0IHRoZSB0aWNrZXQgaXMgYm91bmQgdG8gKGUuZy4gYSBidWlsZC1sb2cgcmVxdWVzdElkKS4gQWJzZW50IGZvciBvcmcta2V5ZWQgY2hhbm5lbHMuICovXG4gIHN1YmplY3Q/OiBzdHJpbmc7XG59XG5cbi8qKiBSZXN1bHQgb2Yge0BsaW5rIFNzZVRpY2tldFN0b3JlLmlzc3VlfS4gKi9cbmV4cG9ydCB0eXBlIFNzZVRpY2tldElzc3VlUmVzdWx0ID1cbiAgfCB7IG9rOiB0cnVlOyB0aWNrZXQ6IHN0cmluZyB9XG4gIHwgeyBvazogZmFsc2U7IHJlYXNvbjogJ3RvdGFsJyB8ICdvcmcnIH07XG5cbi8qKlxuICogVGhlIE9ORSBzdG9yZSBmb3Igc2hvcnQtbGl2ZWQsIHNpbmdsZS11c2UgU1NFIGF1dGggdGlja2V0cywgcGx1cyB0aGVcbiAqIHN0cmVhbS1vd25lcnNoaXAgYmluZGluZ3Mgc3ViamVjdC1ib3VuZCBjaGFubmVscyBuZWVkLlxuICpcbiAqIEEgY2xpZW50IGV4Y2hhbmdlcyBpdHMgSldUIGZvciBhIHRpY2tldCAoc28gdGhlIHRva2VuIG5ldmVyIGxhbmRzIGluIGFuXG4gKiBFdmVudFNvdXJjZSBxdWVyeSBzdHJpbmcgLyBhY2Nlc3MgbG9nKSwgdGhlbiByZWRlZW1zIGl0IG9uIHRoZSBTU0UgYEdFVGAuXG4gKlxuICogLSAqKlRpY2tldHMqKiBhcmUgc2luZ2xlLXVzZSBhY3Jvc3MgcG9kczogdGhlIFJlZGlzIGJhY2tlbmQgcmVkZWVtcyB3aXRoXG4gKiAgIGBHRVRERUxgLCBzbyB0d28gcG9kcyBjYW4gbmV2ZXIgYm90aCBzcGVuZCBvbmUgdGlja2V0LlxuICogLSAqKkNhcHMgY291bnQgTElWRSB0aWNrZXRzKiogKGlzc3VlZCwgbm90IHlldCByZWRlZW1lZCwgbm90IGV4cGlyZWQpIOKAlCBwZXIgb3JnXG4gKiAgIGFuZCBpbiB0b3RhbC4gQSByZWRlZW1lZCBvciBleHBpcmVkIHRpY2tldCBmcmVlcyBpdHMgc2xvdCBpbW1lZGlhdGVseS5cbiAqIC0gKipPd25lcnNoaXAqKiByZWNvcmRzIHdoaWNoIG9yZyBvd25zIGEgc3RyZWFtIHN1YmplY3QsIHNvIGEgc3ViamVjdC1ib3VuZFxuICogICBjaGFubmVsIGNhbiByZWZ1c2UgdG8gbWludCBhIHRpY2tldCBmb3IgYW5vdGhlciBvcmcncyBzdHJlYW0uXG4gKlxuICogQm90aCBiYWNrZW5kcyBzaGFyZSB0aGVzZSBzZW1hbnRpY3M7IHRoZSBpbi1tZW1vcnkgb25lIGlzIGNvcnJlY3QgZm9yIGFcbiAqIHNpbmdsZSBwcm9jZXNzIG9ubHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0U3RvcmUge1xuICAvKiogTWludCBhIHRpY2tldCBmb3IgYG9yZ0lkYCAob3B0aW9uYWxseSBib3VuZCB0byBgc3ViamVjdGApLCBvciByZWplY3Qgd2hlbiBhIGxpdmUtdGlja2V0IGNhcCBpcyByZWFjaGVkLiAqL1xuICBpc3N1ZShvcmdJZDogc3RyaW5nLCBzdWJqZWN0Pzogc3RyaW5nKTogUHJvbWlzZTxTc2VUaWNrZXRJc3N1ZVJlc3VsdD47XG4gIC8qKiBSZWRlZW0gYSB0aWNrZXQgZXhhY3RseSBvbmNlOyBudWxsIHdoZW4gdW5rbm93biwgZXhwaXJlZCBvciBhbHJlYWR5IHNwZW50LiAqL1xuICBjb25zdW1lKHRpY2tldElkOiBzdHJpbmcpOiBQcm9taXNlPFNzZVRpY2tldFJlY29yZCB8IG51bGw+O1xuICAvKiogUmVjb3JkIHRoZSBvcmcgdGhhdCBvd25zIGBzdWJqZWN0YCBmb3IgYHR0bE1zYC4gKi9cbiAgYmluZE93bmVyKHN1YmplY3Q6IHN0cmluZywgb3JnSWQ6IHN0cmluZywgdHRsTXM6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gIC8qKiBUaGUgb3JnIHRoYXQgb3ducyBgc3ViamVjdGAsIG9yIG51bGwgd2hlbiBub25lIGlzIGJvdW5kLiBUaHJvd3Mgd2hlbiB0aGUgYmFja2VuZCBjYW4ndCBhbnN3ZXIuICovXG4gIGdldE93bmVyKHN1YmplY3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIC8qKiBSZWxlYXNlIHRpbWVycy9yZXNvdXJjZXMuIEluLW1lbW9yeSBjbGVhcnMgaXRzIHN3ZWVwIGludGVydmFsOyBSZWRpcyBpcyBhIG5vLW9wLiAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKiBDYXBzICsgVFRMIGZvciB0aGUgdGlja2V0IHN0b3JlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTc2VUaWNrZXRTdG9yZUNvbmZpZyB7XG4gIC8qKiBUaWNrZXQgbGlmZXRpbWUg4oCUIGxvbmcgZW5vdWdoIGZvciB0aGUgY2xpZW50IHRvIG9wZW4gdGhlIEV2ZW50U291cmNlLiAqL1xuICB0dGxNczogbnVtYmVyO1xuICAvKiogQ2FwIG9uIExJVkUgdGlja2V0cyBhY3Jvc3MgYWxsIG9yZ3MgKGFidXNlIC8gbWVtb3J5IGJvdW5kKS4gKi9cbiAgbWF4VG90YWw6IG51bWJlcjtcbiAgLyoqIENhcCBvbiBMSVZFIHRpY2tldHMgcGVyIG9yZyAoc2luZ2xlLXRlbmFudCBmYWlybmVzcyBib3VuZCkuICovXG4gIG1heFBlck9yZzogbnVtYmVyO1xuICAvKipcbiAgICogS2V5IG5hbWVzcGFjZSBzbyBpbmRlcGVuZGVudCBjaGFubmVscyAobWVzc2FnZSBub3RpZmljYXRpb25zLCByZXBvcnRpbmdcbiAgICogZXhlY3V0aW9uLXN0YXR1cywgYSBzZXJ2aWNlJ3MgYnVpbGQtbG9nIHN0cmVhbSkgbmV2ZXIgc2hhcmUgdGlja2V0cywgY2Fwc1xuICAgKiBvciBvd25lcnNoaXAgYmluZGluZ3Mg4oCUIGEgdGlja2V0IG1pbnRlZCBmb3Igb25lIGNoYW5uZWwgbXVzdCBub3QgYmVcbiAgICogcmVkZWVtYWJsZSBvbiBhbm90aGVyLiBPbWl0IGZvciB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuXG4gICAqL1xuICBrZXlQcmVmaXg/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIG5ld1RpY2tldElkKCk6IHN0cmluZyB7XG4gIHJldHVybiBjcnlwdG8ucmFuZG9tQnl0ZXMoMjQpLnRvU3RyaW5nKCdiYXNlNjR1cmwnKTtcbn1cblxuZnVuY3Rpb24gZXJyTXNnKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG59XG5cbi8qKiBJbi1tZW1vcnkgYmFja2VuZCDigJQgc2luZ2xlLXByb2Nlc3MgZmFsbGJhY2sgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVNzZVRpY2tldFN0b3JlKGNvbmZpZzogU3NlVGlja2V0U3RvcmVDb25maWcpOiBTc2VUaWNrZXRTdG9yZSB7XG4gIGludGVyZmFjZSBFbnRyeSBleHRlbmRzIFNzZVRpY2tldFJlY29yZCB7IGV4cGlyZXNBdDogbnVtYmVyIH1cbiAgY29uc3QgdGlja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeT4oKTtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgb3JnSWQ6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4oKTtcblxuICBjb25zdCBzd2VlcCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCB0XSBvZiB0aWNrZXRzKSBpZiAobm93ID49IHQuZXhwaXJlc0F0KSB0aWNrZXRzLmRlbGV0ZShpZCk7XG4gICAgZm9yIChjb25zdCBbaWQsIG9dIG9mIG93bmVycykgaWYgKG5vdyA+PSBvLmV4cGlyZXNBdCkgb3duZXJzLmRlbGV0ZShpZCk7XG4gIH07XG4gIGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoc3dlZXAsIE1hdGgubWF4KDFfMDAwLCBjb25maWcudHRsTXMpKTtcbiAgdGltZXIudW5yZWYoKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGlzc3VlKG9yZ0lkLCBzdWJqZWN0KSB7XG4gICAgICBzd2VlcCgpO1xuICAgICAgaWYgKHRpY2tldHMuc2l6ZSA+PSBjb25maWcubWF4VG90YWwpIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAndG90YWwnIH07XG4gICAgICBsZXQgZm9yT3JnID0gMDtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0aWNrZXRzLnZhbHVlcygpKSBpZiAodC5vcmdJZCA9PT0gb3JnSWQpIGZvck9yZysrO1xuICAgICAgaWYgKGZvck9yZyA+PSBjb25maWcubWF4UGVyT3JnKSByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ29yZycgfTtcbiAgICAgIGNvbnN0IHRpY2tldCA9IG5ld1RpY2tldElkKCk7XG4gICAgICB0aWNrZXRzLnNldCh0aWNrZXQsIHsgb3JnSWQsIC4uLihzdWJqZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzdWJqZWN0IH0pLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBjb25maWcudHRsTXMgfSk7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkKSB7XG4gICAgICBjb25zdCB0ID0gdGlja2V0cy5nZXQodGlja2V0SWQpO1xuICAgICAgdGlja2V0cy5kZWxldGUodGlja2V0SWQpOyAvLyBzaW5nbGUtdXNlIOKAlCBnb25lIHdoZXRoZXIgb3Igbm90IGl0IHdhcyB2YWxpZFxuICAgICAgaWYgKCF0IHx8IERhdGUubm93KCkgPj0gdC5leHBpcmVzQXQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHsgb3JnSWQ6IHQub3JnSWQsIC4uLih0LnN1YmplY3QgIT09IHVuZGVmaW5lZCAmJiB7IHN1YmplY3Q6IHQuc3ViamVjdCB9KSB9O1xuICAgIH0sXG4gICAgYXN5bmMgYmluZE93bmVyKHN1YmplY3QsIG9yZ0lkLCB0dGxNcykge1xuICAgICAgb3duZXJzLnNldChzdWJqZWN0LCB7IG9yZ0lkLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9KTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE93bmVyKHN1YmplY3QpIHtcbiAgICAgIGNvbnN0IG8gPSBvd25lcnMuZ2V0KHN1YmplY3QpO1xuICAgICAgaWYgKCFvKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IG8uZXhwaXJlc0F0KSB7IG93bmVycy5kZWxldGUoc3ViamVjdCk7IHJldHVybiBudWxsOyB9XG4gICAgICByZXR1cm4gby5vcmdJZDtcbiAgICB9LFxuICAgIHN0b3AoKSB7IGNsZWFySW50ZXJ2YWwodGltZXIpOyB9LFxuICB9O1xufVxuXG4vKiogTWluaW1hbCBpb3JlZGlzIHN1cmZhY2UgdGhlIFJlZGlzIGJhY2tlbmQgbmVlZHMgKEdFVERFTCByZXF1aXJlcyBSZWRpcyDiiaUgNi4yKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0UmVkaXMgZXh0ZW5kcyBSZWFkeUF3YXJlUmVkaXMge1xuICBldmFsKHNjcmlwdDogc3RyaW5nLCBudW1LZXlzOiBudW1iZXIsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICB6cmVtKGtleTogc3RyaW5nLCAuLi5tZW1iZXJzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbn1cblxuLyoqXG4gKiBBdG9taWMgbGl2ZS1jb3VudCBpc3N1ZS4gUHJ1bmVzIGV4cGlyZWQgbWVtYmVycyBmcm9tIGJvdGggY2FwIHNldHMsIGNoZWNrcyB0aGVcbiAqIHRvdGFsIHRoZW4gdGhlIHBlci1vcmcgY2FwLCBhbmQgb25seSB0aGVuIHN0b3JlcyB0aGUgdGlja2V0IGFuZCByZWNvcmRzIGl0IGluXG4gKiBib3RoIHNldHMg4oCUIHNvIGNvbmN1cnJlbnQgbWludHMgY2FuJ3Qgb3ZlcnNob290IGEgY2FwIGFuZCBhIGNhcCBjYW4gbmV2ZXJcbiAqIHN0aWNrIChldmVyeSBtZW1iZXIgY2FycmllcyBpdHMgb3duIGV4cGlyeSBzY29yZSBhbmQgZXZlcnkga2V5IGEgVFRMKS5cbiAqXG4gKiBLRVlTOiB0b3RhbCB6c2V0LCBvcmcgenNldCwgdGlja2V0IGtleS5cbiAqIEFSR1Y6IHR0bE1zLCBtYXhUb3RhbCwgbWF4UGVyT3JnLCB0aWNrZXRJZCwgcmVjb3JkIEpTT04uXG4gKiBVc2VzIHRoZSBzZXJ2ZXIgY2xvY2sgc28gZXZlcnkgcG9kIGFncmVlcyBvbiBcImV4cGlyZWRcIi5cbiAqL1xuY29uc3QgSVNTVUVfU0NSSVBUID0gYFxubG9jYWwgdCA9IHJlZGlzLmNhbGwoJ1RJTUUnKVxubG9jYWwgbm93ID0gdG9udW1iZXIodFsxXSkgKiAxMDAwICsgbWF0aC5mbG9vcih0b251bWJlcih0WzJdKSAvIDEwMDApXG5sb2NhbCB0dGwgPSB0b251bWJlcihBUkdWWzFdKVxucmVkaXMuY2FsbCgnWlJFTVJBTkdFQllTQ09SRScsIEtFWVNbMV0sICctaW5mJywgbm93KVxucmVkaXMuY2FsbCgnWlJFTVJBTkdFQllTQ09SRScsIEtFWVNbMl0sICctaW5mJywgbm93KVxuaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCBLRVlTWzFdKSA+PSB0b251bWJlcihBUkdWWzJdKSB0aGVuIHJldHVybiAndG90YWwnIGVuZFxuaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCBLRVlTWzJdKSA+PSB0b251bWJlcihBUkdWWzNdKSB0aGVuIHJldHVybiAnb3JnJyBlbmRcbnJlZGlzLmNhbGwoJ1NFVCcsIEtFWVNbM10sIEFSR1ZbNV0sICdQWCcsIHR0bClcbnJlZGlzLmNhbGwoJ1pBREQnLCBLRVlTWzFdLCBub3cgKyB0dGwsIEFSR1ZbNF0pXG5yZWRpcy5jYWxsKCdaQUREJywgS0VZU1syXSwgbm93ICsgdHRsLCBBUkdWWzRdKVxucmVkaXMuY2FsbCgnUEVYUElSRScsIEtFWVNbMV0sIHR0bClcbnJlZGlzLmNhbGwoJ1BFWFBJUkUnLCBLRVlTWzJdLCB0dGwpXG5yZXR1cm4gJ29rJ2A7XG5cbi8qKlxuICogUmVkaXMgYmFja2VuZCDigJQgbXVsdGktcmVwbGljYSBzYWZlLlxuICpcbiAqIEZhaWwtQ0xPU0VEOiBhIFJlZGlzIGVycm9yIG1ha2VzIGBpc3N1ZWAgcmVqZWN0IChgdG90YWxgKSwgYGNvbnN1bWVgIHJldHVyblxuICogbnVsbCBhbmQgYGdldE93bmVyYCB0aHJvdywgc28gYW4gb3V0YWdlIGRlZ3JhZGVzIHRvIFwibm8gbGl2ZSBzdHJlYW1cIiByYXRoZXJcbiAqIHRoYW4gaGFuZGluZyBvdXQgb3IgYWNjZXB0aW5nIHVudmFsaWRhdGVkIHRpY2tldHMuIGBiaW5kT3duZXJgIGlzIGJlc3QtZWZmb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpczogU3NlVGlja2V0UmVkaXMsIGNvbmZpZzogU3NlVGlja2V0U3RvcmVDb25maWcpOiBTc2VUaWNrZXRTdG9yZSB7XG4gIGNvbnN0IG5zID0gY29uZmlnLmtleVByZWZpeCA/IGAke2NvbmZpZy5rZXlQcmVmaXh9OmAgOiAnJztcbiAgY29uc3QgdGlja2V0S2V5ID0gKHQ6IHN0cmluZykgPT4gYCR7bnN9c3NlOnRrOiR7dH1gO1xuICBjb25zdCBvcmdTZXRLZXkgPSAobzogc3RyaW5nKSA9PiBgJHtuc31zc2U6dGt6Om9yZzoke299YDtcbiAgY29uc3QgdG90YWxTZXRLZXkgPSBgJHtuc31zc2U6dGt6OmFsbGA7XG4gIGNvbnN0IG93bmVyS2V5ID0gKHM6IHN0cmluZykgPT4gYCR7bnN9c3NlOm93bmVyOiR7c31gO1xuICBjb25zdCB0dGxNcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjb25maWcudHRsTXMpKTtcbiAgLy8gVGhlIGVudiBjbGllbnQgaGFzIG5vIG9mZmxpbmUgcXVldWU6IHdhaXQgKGJvdW5kZWQpIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvblxuICAvLyBzbyB0aGUgZmlyc3QgbWludC9yZWRlZW0gYWZ0ZXIgYm9vdCBpc24ndCByZWplY3RlZCBvdXRyaWdodC5cbiAgY29uc3QgcmVhZHkgPSBjcmVhdGVSZWRpc1JlYWR5R2F0ZShyZWRpcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc3N1ZShvcmdJZCwgc3ViamVjdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVhZHkoKTtcbiAgICAgICAgY29uc3QgdGlja2V0ID0gbmV3VGlja2V0SWQoKTtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBTc2VUaWNrZXRSZWNvcmQgPSB7IG9yZ0lkLCAuLi4oc3ViamVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3ViamVjdCB9KSB9O1xuICAgICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgcmVkaXMuZXZhbChcbiAgICAgICAgICBJU1NVRV9TQ1JJUFQsIDMsIHRvdGFsU2V0S2V5LCBvcmdTZXRLZXkob3JnSWQpLCB0aWNrZXRLZXkodGlja2V0KSxcbiAgICAgICAgICB0dGxNcywgY29uZmlnLm1heFRvdGFsLCBjb25maWcubWF4UGVyT3JnLCB0aWNrZXQsIEpTT04uc3RyaW5naWZ5KHJlY29yZCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvdXRjb21lID09PSAnb2snKSByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiBvdXRjb21lID09PSAnb3JnJyA/ICdvcmcnIDogJ3RvdGFsJyB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGlzc3VlIGZhaWxlZCAoZmFpbC1jbG9zZWQpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAndG90YWwnIH07XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXRkZWwodGlja2V0S2V5KHRpY2tldElkKSk7XG4gICAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjID0gSlNPTi5wYXJzZShyYXcpIGFzIFNzZVRpY2tldFJlY29yZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZWM/Lm9yZ0lkICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEZyZWUgdGhlIGxpdmUtY291bnQgc2xvdHMgbm93IHJhdGhlciB0aGFuIGF0IGV4cGlyeS4gQmVzdC1lZmZvcnQ6IGFcbiAgICAgICAgLy8gZmFpbHVyZSBoZXJlIG9ubHkgZGVsYXlzIHRoZSBzbG90IHVudGlsIHRoZSBtZW1iZXIncyBleHBpcnkgc2NvcmUuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtyZWRpcy56cmVtKG9yZ1NldEtleShyZWMub3JnSWQpLCB0aWNrZXRJZCksIHJlZGlzLnpyZW0odG90YWxTZXRLZXksIHRpY2tldElkKV0pXG4gICAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IGxvZ2dlci5kZWJ1ZygnU1NFIHRpY2tldCBzbG90IHJlbGVhc2UgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSkpO1xuICAgICAgICByZXR1cm4gcmVjO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGNvbnN1bWUgZmFpbGVkIChmYWlsLWNsb3NlZCknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBiaW5kT3duZXIoc3ViamVjdCwgb3JnSWQsIG93bmVyVHRsTXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlYWR5KCk7XG4gICAgICAgIGF3YWl0IHJlZGlzLnNldChvd25lcktleShzdWJqZWN0KSwgb3JnSWQsICdQWCcsIE1hdGgubWF4KDEsIE1hdGguY2VpbChvd25lclR0bE1zKSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0Ugc3RyZWFtLW93bmVyIGJpbmQgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBnZXRPd25lcihzdWJqZWN0KSB7XG4gICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgcmV0dXJuIHJlZGlzLmdldChvd25lcktleShzdWJqZWN0KSk7XG4gICAgfSxcbiAgICBzdG9wKCkgeyAvKiBrZXlzIGV4cGlyZSBvbiB0aGVpciBvd24gVFRMICovIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYW4ge0BsaW5rIFNzZVRpY2tldFN0b3JlfSBmcm9tIHRoZSBzdGFuZGFyZCBSZWRpcyBlbnYgKGBSRURJU19VUkxgIG9yXG4gKiBgUkVESVNfU0VOVElORUxTYCk6IHRoZSBSZWRpcyBiYWNrZW5kIHdoZW4gY29uZmlndXJlZCAobXVsdGktcmVwbGljYSBzYWZlKSxcbiAqIG90aGVyd2lzZSB0aGUgaW4tbWVtb3J5IHNpbmdsZS1wcm9jZXNzIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZTc2VUaWNrZXRTdG9yZShjb25maWc6IFNzZVRpY2tldFN0b3JlQ29uZmlnKTogU3NlVGlja2V0U3RvcmUge1xuICBjb25zdCByZWRpcyA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFNzZVRpY2tldFJlZGlzPignc3NlLXRpY2tldCcpO1xuICBpZiAocmVkaXMpIHtcbiAgICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogUmVkaXMgYmFja2VuZCAobXVsdGktcmVwbGljYSknLCB7IGtleVByZWZpeDogY29uZmlnLmtleVByZWZpeCB9KTtcbiAgICByZXR1cm4gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpcywgY29uZmlnKTtcbiAgfVxuICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogaW4tbWVtb3J5IGJhY2tlbmQgKHNpbmdsZS1wcm9jZXNzIGZhbGxiYWNrKScsIHsga2V5UHJlZml4OiBjb25maWcua2V5UHJlZml4IH0pO1xuICByZXR1cm4gY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUoY29uZmlnKTtcbn1cbiJdfQ==
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLXRpY2tldC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9zc2UtdGlja2V0LXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXBELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBNkRoRCxTQUFTLFdBQVc7SUFDbEIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsR0FBWTtJQUMxQixPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxNQUE0QjtJQUVyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztJQUV2RSxNQUFNLEtBQUssR0FBRyxHQUFTLEVBQUU7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxPQUFPO1lBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFNBQVM7Z0JBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxLQUFLLE1B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QUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU87WUFDcEIsTUFBTSxLQUFLLEVBQUUsQ0FBQztZQUNkLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxLQUF3QyxDQUFDO0tBQzlDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxNQUE0QjtJQUNsRSxNQUFNLEtBQUssR0FBRyxvQkFBb0IsQ0FBaUIsWUFBWSxDQUFDLENBQUM7SUFDakUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsaURBQWlELEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDaEcsT0FBTyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsK0RBQStELEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUcsT0FBTywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLCB0eXBlIFJlYWR5QXdhcmVSZWRpcyB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc3NlLXRpY2tldC1zdG9yZScpO1xuXG4vKiogV2hhdCBhIHRpY2tldCBhdXRob3JpemVzOiB0aGUgb3duaW5nIG9yZyBhbmQsIGZvciBzdWJqZWN0LWJvdW5kIGNoYW5uZWxzLCB0aGUgc3RyZWFtIHN1YmplY3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzZVRpY2tldFJlY29yZCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBTdHJlYW0gc3ViamVjdCB0aGUgdGlja2V0IGlzIGJvdW5kIHRvIChlLmcuIGEgYnVpbGQtbG9nIHJlcXVlc3RJZCkuIEFic2VudCBmb3Igb3JnLWtleWVkIGNoYW5uZWxzLiAqL1xuICBzdWJqZWN0Pzogc3RyaW5nO1xufVxuXG4vKiogUmVzdWx0IG9mIHtAbGluayBTc2VUaWNrZXRTdG9yZS5pc3N1ZX0uICovXG5leHBvcnQgdHlwZSBTc2VUaWNrZXRJc3N1ZVJlc3VsdCA9XG4gIHwgeyBvazogdHJ1ZTsgdGlja2V0OiBzdHJpbmcgfVxuICB8IHsgb2s6IGZhbHNlOyByZWFzb246ICd0b3RhbCcgfCAnb3JnJyB9O1xuXG4vKipcbiAqIFRoZSBPTkUgc3RvcmUgZm9yIHNob3J0LWxpdmVkLCBzaW5nbGUtdXNlIFNTRSBhdXRoIHRpY2tldHMsIHBsdXMgdGhlXG4gKiBzdHJlYW0tb3duZXJzaGlwIGJpbmRpbmdzIHN1YmplY3QtYm91bmQgY2hhbm5lbHMgbmVlZC5cbiAqXG4gKiBBIGNsaWVudCBleGNoYW5nZXMgaXRzIEpXVCBmb3IgYSB0aWNrZXQgKHNvIHRoZSB0b2tlbiBuZXZlciBsYW5kcyBpbiBhblxuICogRXZlbnRTb3VyY2UgcXVlcnkgc3RyaW5nIC8gYWNjZXNzIGxvZyksIHRoZW4gcmVkZWVtcyBpdCBvbiB0aGUgU1NFIGBHRVRgLlxuICpcbiAqIC0gKipUaWNrZXRzKiogYXJlIHNpbmdsZS11c2UgYWNyb3NzIHBvZHM6IHRoZSBSZWRpcyBiYWNrZW5kIHJlZGVlbXMgd2l0aFxuICogICBgR0VUREVMYCwgc28gdHdvIHBvZHMgY2FuIG5ldmVyIGJvdGggc3BlbmQgb25lIHRpY2tldC5cbiAqIC0gKipDYXBzIGNvdW50IExJVkUgdGlja2V0cyoqIChpc3N1ZWQsIG5vdCB5ZXQgcmVkZWVtZWQsIG5vdCBleHBpcmVkKSDigJQgcGVyIG9yZ1xuICogICBhbmQgaW4gdG90YWwuIEEgcmVkZWVtZWQgb3IgZXhwaXJlZCB0aWNrZXQgZnJlZXMgaXRzIHNsb3QgaW1tZWRpYXRlbHkuXG4gKiAtICoqT3duZXJzaGlwKiogcmVjb3JkcyB3aGljaCBvcmcgb3ducyBhIHN0cmVhbSBzdWJqZWN0LCBzbyBhIHN1YmplY3QtYm91bmRcbiAqICAgY2hhbm5lbCBjYW4gcmVmdXNlIHRvIG1pbnQgYSB0aWNrZXQgZm9yIGFub3RoZXIgb3JnJ3Mgc3RyZWFtLlxuICpcbiAqIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlc2Ugc2VtYW50aWNzOyB0aGUgaW4tbWVtb3J5IG9uZSBpcyBjb3JyZWN0IGZvciBhXG4gKiBzaW5nbGUgcHJvY2VzcyBvbmx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzZVRpY2tldFN0b3JlIHtcbiAgLyoqIE1pbnQgYSB0aWNrZXQgZm9yIGBvcmdJZGAgKG9wdGlvbmFsbHkgYm91bmQgdG8gYHN1YmplY3RgKSwgb3IgcmVqZWN0IHdoZW4gYSBsaXZlLXRpY2tldCBjYXAgaXMgcmVhY2hlZC4gKi9cbiAgaXNzdWUob3JnSWQ6IHN0cmluZywgc3ViamVjdD86IHN0cmluZyk6IFByb21pc2U8U3NlVGlja2V0SXNzdWVSZXN1bHQ+O1xuICAvKiogUmVkZWVtIGEgdGlja2V0IGV4YWN0bHkgb25jZTsgbnVsbCB3aGVuIHVua25vd24sIGV4cGlyZWQgb3IgYWxyZWFkeSBzcGVudC4gKi9cbiAgY29uc3VtZSh0aWNrZXRJZDogc3RyaW5nKTogUHJvbWlzZTxTc2VUaWNrZXRSZWNvcmQgfCBudWxsPjtcbiAgLyoqIFJlY29yZCB0aGUgb3JnIHRoYXQgb3ducyBgc3ViamVjdGAgZm9yIGB0dGxNc2AuICovXG4gIGJpbmRPd25lcihzdWJqZWN0OiBzdHJpbmcsIG9yZ0lkOiBzdHJpbmcsIHR0bE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogVGhlIG9yZyB0aGF0IG93bnMgYHN1YmplY3RgLCBvciBudWxsIHdoZW4gbm9uZSBpcyBib3VuZC4gVGhyb3dzIHdoZW4gdGhlIGJhY2tlbmQgY2FuJ3QgYW5zd2VyLiAqL1xuICBnZXRPd25lcihzdWJqZWN0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICAvKiogUmVsZWFzZSB0aW1lcnMvcmVzb3VyY2VzLiBJbi1tZW1vcnkgY2xlYXJzIGl0cyBzd2VlcCBpbnRlcnZhbDsgUmVkaXMgaXMgYSBuby1vcC4gKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKiogQ2FwcyArIFRUTCBmb3IgdGhlIHRpY2tldCBzdG9yZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0U3RvcmVDb25maWcge1xuICAvKiogVGlja2V0IGxpZmV0aW1lIOKAlCBsb25nIGVub3VnaCBmb3IgdGhlIGNsaWVudCB0byBvcGVuIHRoZSBFdmVudFNvdXJjZS4gKi9cbiAgdHRsTXM6IG51bWJlcjtcbiAgLyoqIENhcCBvbiBMSVZFIHRpY2tldHMgYWNyb3NzIGFsbCBvcmdzIChhYnVzZSAvIG1lbW9yeSBib3VuZCkuICovXG4gIG1heFRvdGFsOiBudW1iZXI7XG4gIC8qKiBDYXAgb24gTElWRSB0aWNrZXRzIHBlciBvcmcgKHNpbmdsZS10ZW5hbnQgZmFpcm5lc3MgYm91bmQpLiAqL1xuICBtYXhQZXJPcmc6IG51bWJlcjtcbiAgLyoqXG4gICAqIEtleSBuYW1lc3BhY2Ugc28gaW5kZXBlbmRlbnQgY2hhbm5lbHMgKG1lc3NhZ2Ugbm90aWZpY2F0aW9ucywgcmVwb3J0aW5nXG4gICAqIGV4ZWN1dGlvbi1zdGF0dXMsIGEgc2VydmljZSdzIGJ1aWxkLWxvZyBzdHJlYW0pIG5ldmVyIHNoYXJlIHRpY2tldHMsIGNhcHNcbiAgICogb3Igb3duZXJzaGlwIGJpbmRpbmdzIOKAlCBhIHRpY2tldCBtaW50ZWQgZm9yIG9uZSBjaGFubmVsIG11c3Qgbm90IGJlXG4gICAqIHJlZGVlbWFibGUgb24gYW5vdGhlci4gT21pdCBmb3IgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLlxuICAgKi9cbiAga2V5UHJlZml4Pzogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBuZXdUaWNrZXRJZCgpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKDI0KS50b1N0cmluZygnYmFzZTY0dXJsJyk7XG59XG5cbmZ1bmN0aW9uIGVyck1zZyhlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gZXJyb3JNZXNzYWdlKGVycik7XG59XG5cbi8qKiBJbi1tZW1vcnkgYmFja2VuZCDigJQgc2luZ2xlLXByb2Nlc3MgZmFsbGJhY2sgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVNzZVRpY2tldFN0b3JlKGNvbmZpZzogU3NlVGlja2V0U3RvcmVDb25maWcpOiBTc2VUaWNrZXRTdG9yZSB7XG4gIGludGVyZmFjZSBFbnRyeSBleHRlbmRzIFNzZVRpY2tldFJlY29yZCB7IGV4cGlyZXNBdDogbnVtYmVyIH1cbiAgY29uc3QgdGlja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeT4oKTtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgb3JnSWQ6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4oKTtcblxuICBjb25zdCBzd2VlcCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCB0XSBvZiB0aWNrZXRzKSBpZiAobm93ID49IHQuZXhwaXJlc0F0KSB0aWNrZXRzLmRlbGV0ZShpZCk7XG4gICAgZm9yIChjb25zdCBbaWQsIG9dIG9mIG93bmVycykgaWYgKG5vdyA+PSBvLmV4cGlyZXNBdCkgb3duZXJzLmRlbGV0ZShpZCk7XG4gIH07XG4gIGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoc3dlZXAsIE1hdGgubWF4KDFfMDAwLCBjb25maWcudHRsTXMpKTtcbiAgdGltZXIudW5yZWYoKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGlzc3VlKG9yZ0lkLCBzdWJqZWN0KSB7XG4gICAgICBzd2VlcCgpO1xuICAgICAgaWYgKHRpY2tldHMuc2l6ZSA+PSBjb25maWcubWF4VG90YWwpIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAndG90YWwnIH07XG4gICAgICBsZXQgZm9yT3JnID0gMDtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0aWNrZXRzLnZhbHVlcygpKSBpZiAodC5vcmdJZCA9PT0gb3JnSWQpIGZvck9yZysrO1xuICAgICAgaWYgKGZvck9yZyA+PSBjb25maWcubWF4UGVyT3JnKSByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ29yZycgfTtcbiAgICAgIGNvbnN0IHRpY2tldCA9IG5ld1RpY2tldElkKCk7XG4gICAgICB0aWNrZXRzLnNldCh0aWNrZXQsIHsgb3JnSWQsIC4uLihzdWJqZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzdWJqZWN0IH0pLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyBjb25maWcudHRsTXMgfSk7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkKSB7XG4gICAgICBjb25zdCB0ID0gdGlja2V0cy5nZXQodGlja2V0SWQpO1xuICAgICAgdGlja2V0cy5kZWxldGUodGlja2V0SWQpOyAvLyBzaW5nbGUtdXNlIOKAlCBnb25lIHdoZXRoZXIgb3Igbm90IGl0IHdhcyB2YWxpZFxuICAgICAgaWYgKCF0IHx8IERhdGUubm93KCkgPj0gdC5leHBpcmVzQXQpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIHsgb3JnSWQ6IHQub3JnSWQsIC4uLih0LnN1YmplY3QgIT09IHVuZGVmaW5lZCAmJiB7IHN1YmplY3Q6IHQuc3ViamVjdCB9KSB9O1xuICAgIH0sXG4gICAgYXN5bmMgYmluZE93bmVyKHN1YmplY3QsIG9yZ0lkLCB0dGxNcykge1xuICAgICAgb3duZXJzLnNldChzdWJqZWN0LCB7IG9yZ0lkLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9KTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE93bmVyKHN1YmplY3QpIHtcbiAgICAgIGNvbnN0IG8gPSBvd25lcnMuZ2V0KHN1YmplY3QpO1xuICAgICAgaWYgKCFvKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IG8uZXhwaXJlc0F0KSB7IG93bmVycy5kZWxldGUoc3ViamVjdCk7IHJldHVybiBudWxsOyB9XG4gICAgICByZXR1cm4gby5vcmdJZDtcbiAgICB9LFxuICAgIHN0b3AoKSB7IGNsZWFySW50ZXJ2YWwodGltZXIpOyB9LFxuICB9O1xufVxuXG4vKiogTWluaW1hbCBpb3JlZGlzIHN1cmZhY2UgdGhlIFJlZGlzIGJhY2tlbmQgbmVlZHMgKEdFVERFTCByZXF1aXJlcyBSZWRpcyDiiaUgNi4yKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3NlVGlja2V0UmVkaXMgZXh0ZW5kcyBSZWFkeUF3YXJlUmVkaXMge1xuICBldmFsKHNjcmlwdDogc3RyaW5nLCBudW1LZXlzOiBudW1iZXIsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICB6cmVtKGtleTogc3RyaW5nLCAuLi5tZW1iZXJzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbn1cblxuLyoqXG4gKiBBdG9taWMgbGl2ZS1jb3VudCBpc3N1ZS4gUHJ1bmVzIGV4cGlyZWQgbWVtYmVycyBmcm9tIGJvdGggY2FwIHNldHMsIGNoZWNrcyB0aGVcbiAqIHRvdGFsIHRoZW4gdGhlIHBlci1vcmcgY2FwLCBhbmQgb25seSB0aGVuIHN0b3JlcyB0aGUgdGlja2V0IGFuZCByZWNvcmRzIGl0IGluXG4gKiBib3RoIHNldHMg4oCUIHNvIGNvbmN1cnJlbnQgbWludHMgY2FuJ3Qgb3ZlcnNob290IGEgY2FwIGFuZCBhIGNhcCBjYW4gbmV2ZXJcbiAqIHN0aWNrIChldmVyeSBtZW1iZXIgY2FycmllcyBpdHMgb3duIGV4cGlyeSBzY29yZSBhbmQgZXZlcnkga2V5IGEgVFRMKS5cbiAqXG4gKiBLRVlTOiB0b3RhbCB6c2V0LCBvcmcgenNldCwgdGlja2V0IGtleS5cbiAqIEFSR1Y6IHR0bE1zLCBtYXhUb3RhbCwgbWF4UGVyT3JnLCB0aWNrZXRJZCwgcmVjb3JkIEpTT04uXG4gKiBVc2VzIHRoZSBzZXJ2ZXIgY2xvY2sgc28gZXZlcnkgcG9kIGFncmVlcyBvbiBcImV4cGlyZWRcIi5cbiAqL1xuY29uc3QgSVNTVUVfU0NSSVBUID0gYFxubG9jYWwgdCA9IHJlZGlzLmNhbGwoJ1RJTUUnKVxubG9jYWwgbm93ID0gdG9udW1iZXIodFsxXSkgKiAxMDAwICsgbWF0aC5mbG9vcih0b251bWJlcih0WzJdKSAvIDEwMDApXG5sb2NhbCB0dGwgPSB0b251bWJlcihBUkdWWzFdKVxucmVkaXMuY2FsbCgnWlJFTVJBTkdFQllTQ09SRScsIEtFWVNbMV0sICctaW5mJywgbm93KVxucmVkaXMuY2FsbCgnWlJFTVJBTkdFQllTQ09SRScsIEtFWVNbMl0sICctaW5mJywgbm93KVxuaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCBLRVlTWzFdKSA+PSB0b251bWJlcihBUkdWWzJdKSB0aGVuIHJldHVybiAndG90YWwnIGVuZFxuaWYgcmVkaXMuY2FsbCgnWkNBUkQnLCBLRVlTWzJdKSA+PSB0b251bWJlcihBUkdWWzNdKSB0aGVuIHJldHVybiAnb3JnJyBlbmRcbnJlZGlzLmNhbGwoJ1NFVCcsIEtFWVNbM10sIEFSR1ZbNV0sICdQWCcsIHR0bClcbnJlZGlzLmNhbGwoJ1pBREQnLCBLRVlTWzFdLCBub3cgKyB0dGwsIEFSR1ZbNF0pXG5yZWRpcy5jYWxsKCdaQUREJywgS0VZU1syXSwgbm93ICsgdHRsLCBBUkdWWzRdKVxucmVkaXMuY2FsbCgnUEVYUElSRScsIEtFWVNbMV0sIHR0bClcbnJlZGlzLmNhbGwoJ1BFWFBJUkUnLCBLRVlTWzJdLCB0dGwpXG5yZXR1cm4gJ29rJ2A7XG5cbi8qKlxuICogUmVkaXMgYmFja2VuZCDigJQgbXVsdGktcmVwbGljYSBzYWZlLlxuICpcbiAqIEZhaWwtQ0xPU0VEOiBhIFJlZGlzIGVycm9yIG1ha2VzIGBpc3N1ZWAgcmVqZWN0IChgdG90YWxgKSwgYGNvbnN1bWVgIHJldHVyblxuICogbnVsbCBhbmQgYGdldE93bmVyYCB0aHJvdywgc28gYW4gb3V0YWdlIGRlZ3JhZGVzIHRvIFwibm8gbGl2ZSBzdHJlYW1cIiByYXRoZXJcbiAqIHRoYW4gaGFuZGluZyBvdXQgb3IgYWNjZXB0aW5nIHVudmFsaWRhdGVkIHRpY2tldHMuIGBiaW5kT3duZXJgIGlzIGJlc3QtZWZmb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpczogU3NlVGlja2V0UmVkaXMsIGNvbmZpZzogU3NlVGlja2V0U3RvcmVDb25maWcpOiBTc2VUaWNrZXRTdG9yZSB7XG4gIGNvbnN0IG5zID0gY29uZmlnLmtleVByZWZpeCA/IGAke2NvbmZpZy5rZXlQcmVmaXh9OmAgOiAnJztcbiAgY29uc3QgdGlja2V0S2V5ID0gKHQ6IHN0cmluZykgPT4gYCR7bnN9c3NlOnRrOiR7dH1gO1xuICBjb25zdCBvcmdTZXRLZXkgPSAobzogc3RyaW5nKSA9PiBgJHtuc31zc2U6dGt6Om9yZzoke299YDtcbiAgY29uc3QgdG90YWxTZXRLZXkgPSBgJHtuc31zc2U6dGt6OmFsbGA7XG4gIGNvbnN0IG93bmVyS2V5ID0gKHM6IHN0cmluZykgPT4gYCR7bnN9c3NlOm93bmVyOiR7c31gO1xuICBjb25zdCB0dGxNcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChjb25maWcudHRsTXMpKTtcbiAgLy8gVGhlIGVudiBjbGllbnQgaGFzIG5vIG9mZmxpbmUgcXVldWU6IHdhaXQgKGJvdW5kZWQpIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvblxuICAvLyBzbyB0aGUgZmlyc3QgbWludC9yZWRlZW0gYWZ0ZXIgYm9vdCBpc24ndCByZWplY3RlZCBvdXRyaWdodC5cbiAgY29uc3QgcmVhZHkgPSBjcmVhdGVSZWRpc1JlYWR5R2F0ZShyZWRpcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc3N1ZShvcmdJZCwgc3ViamVjdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVhZHkoKTtcbiAgICAgICAgY29uc3QgdGlja2V0ID0gbmV3VGlja2V0SWQoKTtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBTc2VUaWNrZXRSZWNvcmQgPSB7IG9yZ0lkLCAuLi4oc3ViamVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3ViamVjdCB9KSB9O1xuICAgICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgcmVkaXMuZXZhbChcbiAgICAgICAgICBJU1NVRV9TQ1JJUFQsIDMsIHRvdGFsU2V0S2V5LCBvcmdTZXRLZXkob3JnSWQpLCB0aWNrZXRLZXkodGlja2V0KSxcbiAgICAgICAgICB0dGxNcywgY29uZmlnLm1heFRvdGFsLCBjb25maWcubWF4UGVyT3JnLCB0aWNrZXQsIEpTT04uc3RyaW5naWZ5KHJlY29yZCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvdXRjb21lID09PSAnb2snKSByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiBvdXRjb21lID09PSAnb3JnJyA/ICdvcmcnIDogJ3RvdGFsJyB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGlzc3VlIGZhaWxlZCAoZmFpbC1jbG9zZWQpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgcmVhc29uOiAndG90YWwnIH07XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXRkZWwodGlja2V0S2V5KHRpY2tldElkKSk7XG4gICAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcmVjID0gSlNPTi5wYXJzZShyYXcpIGFzIFNzZVRpY2tldFJlY29yZDtcbiAgICAgICAgaWYgKHR5cGVvZiByZWM/Lm9yZ0lkICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEZyZWUgdGhlIGxpdmUtY291bnQgc2xvdHMgbm93IHJhdGhlciB0aGFuIGF0IGV4cGlyeS4gQmVzdC1lZmZvcnQ6IGFcbiAgICAgICAgLy8gZmFpbHVyZSBoZXJlIG9ubHkgZGVsYXlzIHRoZSBzbG90IHVudGlsIHRoZSBtZW1iZXIncyBleHBpcnkgc2NvcmUuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtyZWRpcy56cmVtKG9yZ1NldEtleShyZWMub3JnSWQpLCB0aWNrZXRJZCksIHJlZGlzLnpyZW0odG90YWxTZXRLZXksIHRpY2tldElkKV0pXG4gICAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IGxvZ2dlci5kZWJ1ZygnU1NFIHRpY2tldCBzbG90IHJlbGVhc2UgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSkpO1xuICAgICAgICByZXR1cm4gcmVjO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGNvbnN1bWUgZmFpbGVkIChmYWlsLWNsb3NlZCknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBiaW5kT3duZXIoc3ViamVjdCwgb3JnSWQsIG93bmVyVHRsTXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlYWR5KCk7XG4gICAgICAgIGF3YWl0IHJlZGlzLnNldChvd25lcktleShzdWJqZWN0KSwgb3JnSWQsICdQWCcsIE1hdGgubWF4KDEsIE1hdGguY2VpbChvd25lclR0bE1zKSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0Ugc3RyZWFtLW93bmVyIGJpbmQgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBnZXRPd25lcihzdWJqZWN0KSB7XG4gICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgcmV0dXJuIHJlZGlzLmdldChvd25lcktleShzdWJqZWN0KSk7XG4gICAgfSxcbiAgICBzdG9wKCkgeyAvKiBrZXlzIGV4cGlyZSBvbiB0aGVpciBvd24gVFRMICovIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYW4ge0BsaW5rIFNzZVRpY2tldFN0b3JlfSBmcm9tIHRoZSBzdGFuZGFyZCBSZWRpcyBlbnYgKGBSRURJU19VUkxgIG9yXG4gKiBgUkVESVNfU0VOVElORUxTYCk6IHRoZSBSZWRpcyBiYWNrZW5kIHdoZW4gY29uZmlndXJlZCAobXVsdGktcmVwbGljYSBzYWZlKSxcbiAqIG90aGVyd2lzZSB0aGUgaW4tbWVtb3J5IHNpbmdsZS1wcm9jZXNzIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZTc2VUaWNrZXRTdG9yZShjb25maWc6IFNzZVRpY2tldFN0b3JlQ29uZmlnKTogU3NlVGlja2V0U3RvcmUge1xuICBjb25zdCByZWRpcyA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFNzZVRpY2tldFJlZGlzPignc3NlLXRpY2tldCcpO1xuICBpZiAocmVkaXMpIHtcbiAgICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogUmVkaXMgYmFja2VuZCAobXVsdGktcmVwbGljYSknLCB7IGtleVByZWZpeDogY29uZmlnLmtleVByZWZpeCB9KTtcbiAgICByZXR1cm4gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpcywgY29uZmlnKTtcbiAgfVxuICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogaW4tbWVtb3J5IGJhY2tlbmQgKHNpbmdsZS1wcm9jZXNzIGZhbGxiYWNrKScsIHsga2V5UHJlZml4OiBjb25maWcua2V5UHJlZml4IH0pO1xuICByZXR1cm4gY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUoY29uZmlnKTtcbn1cbiJdfQ==