@pipeline-builder/api-core 3.4.96 → 3.4.99

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 (43) hide show
  1. package/lib/errors/app-errors.js +1 -1
  2. package/lib/helpers/access-helpers.d.ts +2 -1
  3. package/lib/helpers/access-helpers.js +11 -5
  4. package/lib/helpers/org-hierarchy-http.d.ts +13 -3
  5. package/lib/helpers/org-hierarchy-http.js +10 -5
  6. package/lib/middleware/auth.d.ts +16 -5
  7. package/lib/middleware/auth.js +17 -7
  8. package/lib/services/audit-spool.d.ts +4 -5
  9. package/lib/services/audit-spool.js +10 -27
  10. package/lib/services/cache-service.js +11 -10
  11. package/lib/services/compliance-event-subscriber.js +1 -1
  12. package/lib/services/env-redis.d.ts +20 -0
  13. package/lib/services/env-redis.js +47 -0
  14. package/lib/services/leader-lock.d.ts +10 -0
  15. package/lib/services/leader-lock.js +19 -1
  16. package/lib/services/quota.js +14 -5
  17. package/lib/services/remote-audit-client.d.ts +19 -1
  18. package/lib/services/remote-audit-client.js +41 -1
  19. package/lib/services/scheduler.js +15 -1
  20. package/lib/services/token-revocation.js +8 -30
  21. package/lib/types/common.d.ts +1 -1
  22. package/lib/types/feature-flags.d.ts +1 -1
  23. package/lib/types/feature-flags.js +6 -1
  24. package/lib/types/pipeline.d.ts +9 -9
  25. package/lib/utils/crash-handlers.js +1 -1
  26. package/lib/utils/index.d.ts +0 -1
  27. package/lib/utils/index.js +1 -2
  28. package/lib/utils/logger.js +1 -1
  29. package/lib/utils/metric-emitter.js +1 -1
  30. package/lib/utils/params.d.ts +1 -1
  31. package/lib/utils/params.js +1 -1
  32. package/lib/utils/response.js +1 -1
  33. package/lib/utils/secret-encryption.js +1 -1
  34. package/lib/utils/ssrf.d.ts +1 -1
  35. package/lib/utils/ssrf.js +1 -1
  36. package/lib/validation/ai-schemas.d.ts +4 -4
  37. package/lib/validation/common-schemas.d.ts +8 -8
  38. package/lib/validation/message-schemas.d.ts +10 -10
  39. package/lib/validation/pipeline-schemas.d.ts +13 -13
  40. package/lib/validation/plugin-schemas.d.ts +18 -18
  41. package/package.json +11 -10
  42. package/lib/utils/org-aws-credentials.d.ts +0 -154
  43. package/lib/utils/org-aws-credentials.js +0 -139
@@ -116,10 +116,19 @@ export function createQuotaService(config = {}) {
116
116
  }
117
117
  if (response.statusCode === 429) {
118
118
  const q = response.body.details?.quota;
119
- return {
120
- exceeded: true,
121
- quota: q ?? { type: quotaType, limit: 0, used: 0, remaining: 0 },
122
- };
119
+ // Only a GENUINE quota-exceeded 429 means "over quota". A generic 429 —
120
+ // the quota service's OWN rate limiter (RATE_LIMIT_EXCEEDED) or an
121
+ // intervening gateway during a spike must NOT be surfaced as
122
+ // quota-exceeded: that would falsely block legitimate work behind a
123
+ // transient rate limit. Require the QUOTA_EXCEEDED error code (or the
124
+ // quota payload) and otherwise fall through to the non-ok
125
+ // fail-open/closed policy below (the right handling for a transient 429).
126
+ if (response.body.errorCode === 'QUOTA_EXCEEDED' || q) {
127
+ return {
128
+ exceeded: true,
129
+ quota: q ?? { type: quotaType, limit: 0, used: 0, remaining: 0 },
130
+ };
131
+ }
123
132
  }
124
133
  if (response.statusCode !== 200 || !response.body.success) {
125
134
  if (QUOTA_RESERVE_FAIL_OPEN) {
@@ -245,4 +254,4 @@ export function reserveQuota(quotaService, orgId, quotaType, authHeader, amount
245
254
  export function decrementQuota(quotaService, orgId, quotaType, authHeader, logWarn, amount = 1, resetAtSnapshot) {
246
255
  quotaService.decrement(orgId, quotaType, authHeader, amount, resetAtSnapshot).catch((err) => logWarn('Quota rollback failed', { error: err instanceof Error ? err.message : String(err) }));
247
256
  }
248
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcXVvdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFFekUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCx5RUFBeUU7QUFDekUsTUFBTSxxQkFBcUIsR0FBK0Q7SUFDeEYsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFckMsMkVBQTJFO0FBQzNFLGlGQUFpRjtBQUNqRiw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLHNFQUFzRTtBQUN0RSw2RUFBNkU7QUFDN0UsaUZBQWlGO0FBQ2pGLDJCQUEyQjtBQUMzQixNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEtBQUssTUFBTSxDQUFDO0FBdUUvRTs7R0FFRztBQUNILFNBQVMsb0JBQW9CO0lBQzNCLE9BQU87UUFDTCxPQUFPLEVBQUUsSUFBSTtRQUNiLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDVCxJQUFJLEVBQUUsQ0FBQztRQUNQLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDYixPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7UUFDakMsU0FBUyxFQUFFLElBQUk7UUFDZiwwRUFBMEU7UUFDMUUsa0VBQWtFO1FBQ2xFLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FF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QUFZLEVBQUUsRUFBRSxDQUMxRSxPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FDOUYsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFFLFlBQTBCLEVBQ3RELEtBQWEsRUFDYixTQUFvQixFQUNwQixVQUFrQixFQUNsQixTQUFpQixDQUFDLEVBQ2xCLFNBQWtCO0lBRWxCLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFFLFlBQTBCLEVBQ3hELEtBQWEsRUFDYixTQUFvQixFQUNwQixVQUFrQixFQUNsQixPQUFrRCxFQUNsRCxTQUFpQixDQUFDLEVBQ2xCLGVBQXdCO0lBRXhCLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFLENBQ25HLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUM3RixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVTYWZlQ2xpZW50LCB0eXBlIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSwgUXVvdGFDaGVja1Jlc3VsdCwgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1RJRVIsIGlzVmFsaWRUaWVyLCB0eXBlIFF1b3RhVGllciB9IGZyb20gJy4uL3R5cGVzL3F1b3RhLXRpZXJzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuLyoqIFJldHJ5IG9wdGlvbnMgZm9yIHF1b3RhIGNhbGxzICBmYWlsIGZhc3Qgc2luY2UgcXVvdGEgaXMgZmFpbC1vcGVuLiAqL1xuY29uc3QgUVVPVEFfUkVRVUVTVF9PUFRJT05TOiBQaWNrPFJlcXVlc3RPcHRpb25zLCAnbWF4UmF0ZUxpbWl0UmV0cmllcycgfCAnbWF4UmV0cmllcyc+ID0ge1xuICBtYXhSYXRlTGltaXRSZXRyaWVzOiAxLFxuICBtYXhSZXRyaWVzOiAxLFxufTtcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdxdW90YScpO1xuXG4vLyBgcmVzZXJ2ZWAgZ2F0ZXMgRVhQRU5TSVZFIHJlc291cmNlcyAocGx1Z2luIGJ1aWxkcywgcGlwZWxpbmVzKS4gV2hlbiB0aGVcbi8vIHF1b3RhIHNlcnZpY2UgaXMgcmVhY2hhYmxlIGJ1dCByZXR1cm5zIGFuIGVycm9yIChvZnRlbiBhbiBPVkVSTE9BREVEIHNlcnZpY2UpLFxuLy8gZmFpbGluZyBvcGVuIHdvdWxkIHBpbGUgdW5tZXRlcmVkIGV4cGVuc2l2ZSB3b3JrIG9udG8gaXQgYW5kIGJ5cGFzcyBxdW90YVxuLy8gZW50aXJlbHkg4oCUIHRoZSB0ZXh0Ym9vayBmYWlsLW9wZW4gYmxvdy11cC4gU28gYHJlc2VydmVgIGZhaWxzIENMT1NFRCBvbiBhblxuLy8gZXJyb3JlZCByZXNwb25zZSBieSBkZWZhdWx0LiBPcGVyYXRvcnMgd2hvIHByZWZlciBhdmFpbGFiaWxpdHkgb3ZlclxuLy8gZW5mb3JjZW1lbnQgY2FuIG9wdCBiYWNrIGludG8gZmFpbC1vcGVuIHdpdGggUVVPVEFfUkVTRVJWRV9GQUlMX09QRU49dHJ1ZS5cbi8vIChBIGdlbnVpbmVseSBVTlJFQUNIQUJMRSBzZXJ2aWNlIHN0aWxsIGZhaWxzIG9wZW4g4oCUIHRoYXQncyBhIGNvbmZpcm1lZCBvdXRhZ2UsXG4vLyBub3QgYW4gb3ZlcmxvYWQgc2lnbmFsLilcbmNvbnN0IFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOID0gcHJvY2Vzcy5lbnYuUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gPT09ICd0cnVlJztcblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBzeW5jaHJvbm91cyBxdW90YSByZXNlcnZhdGlvbiAgdGhlIGF0b21pYyBjaGVjaytpbmNyZW1lbnRcbiAqIHZhcmlhbnQuIGBleGNlZWRlZDogdHJ1ZWAgbWVhbnMgdGhlIG9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQgYXQgdGhlIERCXG4gKiBsZXZlbDsgdGhlIGNhbGxlciBzaG91bGQgcmV0dXJuIDQyOSB3aXRob3V0IHJ1bm5pbmcgdGhlIGdhdGVkIGFjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVJlc2VydmVSZXN1bHQge1xuICBleGNlZWRlZDogYm9vbGVhbjtcbiAgcXVvdGE6IHtcbiAgICB0eXBlOiBRdW90YVR5cGU7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICB1c2VkOiBudW1iZXI7XG4gICAgcmVtYWluaW5nOiBudW1iZXI7XG4gICAgcmVzZXRBdD86IHN0cmluZztcbiAgfTtcbn1cblxuLyoqXG4gKiBRdW90YSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFTZXJ2aWNlIHtcbiAgLyoqIENoZWNrIGlmIHF1b3RhIGlzIGF2YWlsYWJsZSAoZmFpbC1vcGVuIG9uIGVycm9yKS4gKi9cbiAgY2hlY2sob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YUNoZWNrUmVzdWx0PjtcbiAgLyoqIEluY3JlbWVudCBxdW90YSB1c2FnZS4gUmV0dXJucyBhIHByb21pc2Ugc28gY2FsbGVycyBjYW4gb3B0aW9uYWxseSBoYW5kbGUgZXJyb3JzLiAqL1xuICBpbmNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50PzogbnVtYmVyLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogQXRvbWljIHJlc2VydmUgIHRoZSBzYW1lIGF0b21pYyBjaGVjaytpbmNyZW1lbnQgYXMgYGluY3JlbWVudGAsIGJ1dFxuICAgKiBwYXJzZXMgdGhlIHJlc3BvbnNlIHNvIGNhbGxlcnMgY2FuIHNlZSB3aGV0aGVyIHRoZSBzbG90IHdhcyBhY3R1YWxseVxuICAgKiByZXNlcnZlZC4gVXNlIHRoaXMgZm9yIGV4cGVuc2l2ZSByZXNvdXJjZXMgd2hlcmUgdGhlIHBvc3QtaG9jIGZpcmUtXG4gICAqIGFuZC1mb3JnZXQgcGF0dGVybiBhbGxvd3MgY29uY3VycmVudCBvdmVyLXNwZW5kLlxuICAgKlxuICAgKiBGYWlsLW9wZW4gc2VtYW50aWNzIG9uIHRyYW5zcG9ydCBlcnJvcnM6IHJldHVybnMgYGV4Y2VlZGVkOiBmYWxzZWAgc29cbiAgICogdGhlIGNhbGxlciBjYW4gcHJvY2VlZCBhbmQgdGhlIHJlcXVlc3QgaXNuJ3QgYmxvY2tlZCBieSBxdW90YS1zZXJ2aWNlXG4gICAqIG91dGFnZXMgKG1hdGNoZXMgYGNoZWNrKClgKS5cbiAgICovXG4gIHJlc2VydmUob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50PzogbnVtYmVyLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD47XG4gIC8qKlxuICAgKiBSb2xsIGJhY2sgYSBwcmV2aW91c2x5IHJlc2VydmVkIHNsb3QuIEZpcmUtYW5kLWZvcmdldCDigJQgbmV2ZXIgdGhyb3dzLlxuICAgKiBQYXNzIGByZXNldEF0U25hcHNob3RgICh0aGUgYHF1b3RhLnJlc2V0QXRgIG9ic2VydmVkIHdoZW4gdGhlIHNsb3Qgd2FzXG4gICAqIHJlc2VydmVkKSB0byBtYWtlIHRoZSByb2xsYmFjayBjb25kaXRpb25hbDogaWYgdGhlIHBlcmlvZCByb2xsZWQgb3ZlclxuICAgKiBiZXR3ZWVuIHJlc2VydmUgYW5kIHJvbGxiYWNrLCB0aGUgc2VydmVyIHNraXBzIHRoZSBkZWNyZW1lbnQgc28gaXQgZG9lc24ndFxuICAgKiBzdGVhbCBjYXBhY2l0eSBmcm9tIHRoZSBuZXcgcGVyaW9kLlxuICAgKi9cbiAgZGVjcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVzZXRBdFNuYXBzaG90Pzogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogVXBkYXRlIHF1b3RhIGxpbWl0cy4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuICovXG4gIHVwZGF0ZUxpbWl0cyhvcmdJZDogc3RyaW5nLCBsaW1pdHM6IFBhcnRpYWw8UmVjb3JkPFF1b3RhVHlwZSwgbnVtYmVyPj4sIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIFJlc2V0IHF1b3RhIHVzYWdlLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gKi9cbiAgcmVzZXQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlPzogUXVvdGFUeXBlLCBhdXRoSGVhZGVyPzogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKipcbiAgICogR2V0IHRoZSBvcmcncyBxdW90YSB0aWVyICgnZGV2ZWxvcGVyJyB8ICdwcm8nIHwgJ3RlYW0nIHwgJ2VudGVycHJpc2UnKS4gVXNlZCBieVxuICAgKiB0aGUgcGx1Z2luLWJ1aWxkIHF1ZXVlIHBhcnRpdGlvbmluZyB0byByb3V0ZSBhIGJ1aWxkIHRvIHRoZVxuICAgKiByaWdodCBwZXItdGllciBxdWV1ZS4gRmFpbC1vcGVuIHJldHVybnMgREVGQVVMVF9USUVSICgnZGV2ZWxvcGVyJylcbiAgICogYSBtaXNjbGFzc2lmaWVkIHByby90ZWFtL2VudGVycHJpc2Ugb3JnIHdpbGwgbGFuZCBpbiB0aGUgZGV2ZWxvcGVyIHF1ZXVlXG4gICAqIGFuZCBzdGlsbCBidWlsZCwganVzdCB3aXRob3V0IHRoZSB0aWVyLXNjb3BlZCBzY2hlZHVsaW5nIGJvb3N0LlxuICAgKi9cbiAgZ2V0VGllcihvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFUaWVyPjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBxdW90YSBzZXJ2aWNlIGNsaWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVNlcnZpY2VDb25maWcge1xuICAvKiogUXVvdGEgc2VydmljZSBob3N0IChkZWZhdWx0OiBlbnYgUVVPVEFfU0VSVklDRV9IT1NUIG9yICdxdW90YScpICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBRdW90YSBzZXJ2aWNlIHBvcnQgKGRlZmF1bHQ6IGVudiBRVU9UQV9TRVJWSUNFX1BPUlQgb3IgMzAwMCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZmFpbC1vcGVuIHF1b3RhIHJlc3VsdCAoYWxsb3dzIHRoZSByZXF1ZXN0KS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFpbE9wZW5SZXN1bHQoKTogUXVvdGFDaGVja1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZDogdHJ1ZSxcbiAgICBsaW1pdDogLTEsXG4gICAgdXNlZDogMCxcbiAgICByZW1haW5pbmc6IC0xLFxuICAgIHJlc2V0QXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB1bmxpbWl0ZWQ6IHRydWUsXG4gICAgLy8gVGFnIHRoZSBzZW50aW5lbCBzbyBmYWlsLWNsb3NlZCBjYWxsZXJzIGNhbiB0ZWxsIGFuIG91dGFnZSBhcGFydCBmcm9tIGFcbiAgICAvLyByZWFsIHVubGltaXRlZCAoLTEpIHJlYWRpbmcuIFJlYWwgcXVvdGEgcmVzdWx0cyBuZXZlciBzZXQgdGhpcy5cbiAgICBmYWlsT3BlbjogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBjb21tb24gcmVxdWVzdCBoZWFkZXJzIHdpdGggb3B0aW9uYWwgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRIZWFkZXJzKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI/OiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAneC1vcmctaWQnOiBvcmdJZCB9O1xuICBpZiAoYXV0aEhlYWRlcikgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYXV0aEhlYWRlcjtcbiAgaWYgKHJlcXVlc3RJZCkgaGVhZGVyc1snWC1SZXF1ZXN0LUlkJ10gPSByZXF1ZXN0SWQ7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHF1b3RhIHNlcnZpY2UgY2xpZW50LlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHF1b3RhU2VydmljZSA9IGNyZWF0ZVF1b3RhU2VydmljZSgpO1xuICpcbiAqIC8vIENoZWNrIHF1b3RhIGJlZm9yZSBwcm9jZXNzaW5nXG4gKiBjb25zdCBxdW90YSA9IGF3YWl0IHF1b3RhU2VydmljZS5jaGVjayhvcmdJZCwgJ2FwaUNhbGxzJywgYXV0aEhlYWRlcik7XG4gKiBpZiAoIXF1b3RhLmFsbG93ZWQpIHtcbiAqIHJldHVybiByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUXVvdGEgZXhjZWVkZWQnIH0pO1xuICogfVxuICpcbiAqIC8vIEluY3JlbWVudCBxdW90YSBhZnRlciBzdWNjZXNzXG4gKiBxdW90YVNlcnZpY2UuaW5jcmVtZW50KG9yZ0lkLCAnYXBpQ2FsbHMnLCBhdXRoSGVhZGVyKS5jYXRjaChlcnIgPT4gbG9nZ2VyLndhcm4oJ1F1b3RhIGluY3JlbWVudCBmYWlsZWQnLCB7IGVycm9yOiBlcnIgfSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdW90YVNlcnZpY2UoY29uZmlnOiBRdW90YVNlcnZpY2VDb25maWcgPSB7fSk6IFF1b3RhU2VydmljZSB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gcHJvY2Vzcy5lbnYuUVVPVEFfU0VSVklDRV9IT1NUID8/ICdxdW90YScsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUVVPVEFfU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IDUwMDAsXG4gIH07XG5cbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlU2FmZUNsaWVudChzZXJ2aWNlQ29uZmlnKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vJHtlbmNvZGVVUklDb21wb25lbnQocXVvdGFUeXBlKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICBkYXRhPzogeyBxdW90YVR5cGU6IHN0cmluZzsgc3RhdHVzOiBRdW90YUNoZWNrUmVzdWx0IH07XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIHNlcnZpY2UgdW5yZWFjaGFibGUsIGFsbG93aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ2NoZWNrJywgcmVhc29uOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlLmJvZHkuZGF0YT8uc3RhdHVzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIGNoZWNrIHJldHVybmVkIG5vbi1vaywgYWxsb3dpbmcgcmVxdWVzdCcsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLCBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICdjaGVjaycsIHJlYXNvbjogJ25vbi1vaycsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZhaWxPcGVuUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZS5ib2R5LmRhdGEuc3RhdHVzO1xuICAgIH0sXG5cbiAgICBhc3luYyBpbmNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2luY3JlbWVudGA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50XG4gICAgICAgIC5wb3N0KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBpbmNyZW1lbnQgcXVvdGEnLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50LCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1F1b3RhIGluY3JlbWVudGVkJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc2VydmUob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcblxuICAgICAgLy8gMjAwIGNhcnJpZXMgYGRhdGEucXVvdGFgOyA0MjkgKFFVT1RBX0VYQ0VFREVEKSBjYXJyaWVzIGBkZXRhaWxzLnF1b3RhYC5cbiAgICAgIC8vIEJvdGggc2hhcGVzIGFyZSBub3JtYWxpemVkIGludG8gUXVvdGFSZXNlcnZlUmVzdWx0LlxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIGRldGFpbHM/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIGVycm9yQ29kZT86IHN0cmluZztcbiAgICAgIH0+KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICBsb2dnZXIud2FybignUVVPVEFfRkFJTF9PUEVOOiBRdW90YSBzZXJ2aWNlIHVucmVhY2hhYmxlIG9uIHJlc2VydmUsIGFsbG93aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ3Jlc2VydmUnLCByZWFzb246ICd1bnJlYWNoYWJsZScsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIHsgZXhjZWVkZWQ6IGZhbHNlLCBxdW90YTogeyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAtMSwgdXNlZDogMCwgcmVtYWluaW5nOiAtMSB9IH07XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlc3BvbnNlLmJvZHkuZGV0YWlscz8ucXVvdGE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXhjZWVkZWQ6IHRydWUsXG4gICAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAwLCB1c2VkOiAwLCByZW1haW5pbmc6IDAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIGlmIChRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIHJlc2VydmUgcmV0dXJuZWQgbm9uLW9rLCBhbGxvd2luZyByZXF1ZXN0Jywge1xuICAgICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICdyZXNlcnZlJywgcmVhc29uOiAnbm9uLW9rJywgcXVvdGFUeXBlIH0pO1xuICAgICAgICAgIHJldHVybiB7IGV4Y2VlZGVkOiBmYWxzZSwgcXVvdGE6IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogLTEsIHVzZWQ6IDAsIHJlbWFpbmluZzogLTEgfSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlcnZpY2UgcmVhY2hhYmxlIGJ1dCBkaWRuJ3QgY29uZmlybSB0aGUgcmVzZXJ2YXRpb24g4oaSIGZhaWwgQ0xPU0VELlxuICAgICAgICBsb2dnZXIud2FybignUVVPVEFfRkFJTF9DTE9TRUQ6IFF1b3RhIHJlc2VydmUgcmV0dXJuZWQgbm9uLW9rLCBkZW55aW5nIHJlcXVlc3QnLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX2Nsb3NlZF90b3RhbCcsIHsgb3BlcmF0aW9uOiAncmVzZXJ2ZScsIHJlYXNvbjogJ25vbi1vaycsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIHsgZXhjZWVkZWQ6IHRydWUsIHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IDAsIHVzZWQ6IDAsIHJlbWFpbmluZzogMCB9IH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHEgPSByZXNwb25zZS5ib2R5LmRhdGE/LnF1b3RhO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhjZWVkZWQ6IGZhbHNlLFxuICAgICAgICBxdW90YTogcSA/PyB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IC0xLCB1c2VkOiAwLCByZW1haW5pbmc6IC0xIH0sXG4gICAgICB9O1xuICAgIH0sXG5cbiAgICBhc3luYyBkZWNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXNldEF0U25hcHNob3Q/OiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vZGVjcmVtZW50YDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50XG4gICAgICAgIC5wb3N0KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQsIC4uLihyZXNldEF0U25hcHNob3QgJiYgeyByZXNldEF0U25hcHNob3QgfSkgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgLy8gUm9sbGJhY2sgZmFpbHVyZSBpcyBsb2dnZWQgYnV0IG5ldmVyIHByb3BhZ2F0ZWQgIHRoZSBhY3Rpb24ncyBvd25cbiAgICAgICAgLy8gZmFpbHVyZSBoYXMgYWxyZWFkeSBiZWVuIHN1cmZhY2VkIHRvIHRoZSBjYWxsZXI7IGEgc3R1Y2sgY291bnRlclxuICAgICAgICAvLyByZXNvbHZlcyBvbiB0aGUgbmV4dCBwZXJpb2QgcmVzZXQuXG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZGVjcmVtZW50IHF1b3RhIChzbG90IHdpbGwgcmVzZXQgb24gbmV4dCBwZXJpb2QpJywge1xuICAgICAgICAgIG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdRdW90YSBkZWNyZW1lbnRlZCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50IH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyB1cGRhdGVMaW1pdHMoIG9yZ0lkOiBzdHJpbmcsXG4gICAgICBsaW1pdHM6IFBhcnRpYWw8UmVjb3JkPFF1b3RhVHlwZSwgbnVtYmVyPj4sXG4gICAgICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gICAgICByZXF1ZXN0SWQ/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfWA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnB1dChwYXRoLCBsaW1pdHMsIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHVwZGF0ZSBxdW90YSBsaW1pdHMnLCB7XG4gICAgICAgICAgb3JnSWQsIGxpbWl0cywgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdRdW90YSBsaW1pdHMgdXBkYXRlZCcsIHsgb3JnSWQsIGxpbWl0cyB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaWVyKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXI+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9YDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PHtcbiAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgZGF0YT86IHsgcXVvdGE/OiB7IHRpZXI/OiBzdHJpbmcgfSB9O1xuICAgICAgICBtZXNzYWdlPzogc3RyaW5nO1xuICAgICAgfT4ocGF0aCwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDAgfHwgIXJlc3BvbnNlLmJvZHkuc3VjY2Vzcykge1xuICAgICAgICBsb2dnZXIud2FybignUVVPVEFfRkFJTF9PUEVOOiB0aWVyIGxvb2t1cCBmYWlsZWQsIGRlZmF1bHRpbmcgdG8gZGV2ZWxvcGVyIHRpZXInLCB7XG4gICAgICAgICAgb3JnSWQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfb3Blbl90b3RhbCcsIHsgb3BlcmF0aW9uOiAndGllcicsIHJlYXNvbjogcmVzcG9uc2UgPyAnbm9uLW9rJyA6ICd1bnJlYWNoYWJsZScsIHF1b3RhVHlwZTogJ3RpZXInIH0pO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9USUVSO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aWVyID0gcmVzcG9uc2UuYm9keS5kYXRhPy5xdW90YT8udGllcjtcbiAgICAgIHJldHVybiB0aWVyICYmIGlzVmFsaWRUaWVyKHRpZXIpID8gdGllcjogREVGQVVMVF9USUVSO1xuICAgIH0sXG5cbiAgICBhc3luYyByZXNldChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU/OiBRdW90YVR5cGUsIGF1dGhIZWFkZXI/OiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vcmVzZXRgO1xuXG4gICAgICBjb25zdCBib2R5ID0gcXVvdGFUeXBlID8geyBxdW90YVR5cGUgfToge307XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KHBhdGgsIGJvZHksIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyID8/ICcnLCByZXF1ZXN0SWQpIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHJlc2V0IHF1b3RhJywge1xuICAgICAgICAgIG9yZ0lkLCBxdW90YVR5cGUsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnUXVvdGEgcmVzZXQnLCB7IG9yZ0lkLCBxdW90YVR5cGU6IHF1b3RhVHlwZSA/PyAnYWxsJyB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IHF1b3RhIGluY3JlbWVudCB3aXRoIHN0YW5kYXJkaXplZCBlcnJvciBsb2dnaW5nLlxuICpcbiAqIFdyYXBzIGBxdW90YVNlcnZpY2UuaW5jcmVtZW50KClgIHdpdGggYSBgLmNhdGNoKClgIHRoYXQgbG9ncyBhIHdhcm5pbmcuXG4gKiBFbGltaW5hdGVzIHRoZSBpZGVudGljYWwgb25lLWxpbmVyIHJlcGVhdGVkIGFjcm9zcyBldmVyeSByZWFkIHJvdXRlLlxuICpcbiAqIEBwYXJhbSBxdW90YVNlcnZpY2UgLSBRdW90YSBzZXJ2aWNlIGNsaWVudFxuICogQHBhcmFtIG9yZ0lkIC0gT3JnYW5pemF0aW9uIElEXG4gKiBAcGFyYW0gcXVvdGFUeXBlIC0gUXVvdGEgdHlwZSB0byBpbmNyZW1lbnRcbiAqIEBwYXJhbSBhdXRoSGVhZGVyIC0gQXV0aG9yaXphdGlvbiBoZWFkZXIgdmFsdWVcbiAqIEBwYXJhbSBsb2dXYXJuIC0gTG9nZ2luZyBmdW5jdGlvbiBmb3Igd2FybmluZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY3JlbWVudFF1b3RhKCBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgbG9nV2FybjogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgcXVvdGFTZXJ2aWNlLmluY3JlbWVudChvcmdJZCwgcXVvdGFUeXBlLCBhdXRoSGVhZGVyKS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PlxuICAgIGxvZ1dhcm4oJ1F1b3RhIGluY3JlbWVudCBmYWlsZWQnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlOiBTdHJpbmcoZXJyKSB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBBdG9taWMgcmVzZXJ2ZSBoZWxwZXIgZm9yIHRoZSBcInJlc2VydmUgKyBjb21taXQgLyByb2xsYmFja1wiIHBhdHRlcm4uXG4gKiBVc2UgZm9yIGV4cGVuc2l2ZSByZXNvdXJjZXMgKHBpcGVsaW5lcywgcGx1Z2lucywgQUkgY2FsbHMpIHdoZXJlIHRoZVxuICogZmlyZS1hbmQtZm9yZ2V0IHBvc3QtaG9jIGBpbmNyZW1lbnRRdW90YWAgYWxsb3dzIGNvbmN1cnJlbnQgb3Zlci1zcGVuZC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBzdHJ1Y3R1cmVkIHJlc3VsdCBzbyB0aGUgY2FsbGVyIGNhbiBkZWNpZGUgd2hldGhlciB0byBydW5cbiAqIHRoZSBnYXRlZCBhY3Rpb24gb3IgNDI5IHRoZSBjbGllbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlc2VydmF0aW9uID0gYXdhaXQgcmVzZXJ2ZVF1b3RhKHF1b3RhU2VydmljZSwgb3JnSWQsICdwaXBlbGluZXMnLCBhdXRoSGVhZGVyKTtcbiAqIGlmIChyZXNlcnZhdGlvbi5leGNlZWRlZCkgcmV0dXJuIHNlbmRRdW90YUV4Y2VlZGVkKHJlcywgJ3BpcGVsaW5lcycsIHJlc2VydmF0aW9uLnF1b3RhKTtcbiAqIHRyeSB7XG4gKiBhd2FpdCBkb0V4cGVuc2l2ZVRoaW5nKCk7XG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqIC8vIFBhc3MgdGhlIHJlc2VydmVkIHJlc2V0QXQgc28gYSBwZXJpb2Qgcm9sbG92ZXIgZG9lc24ndCBnZXQgZG91YmxlLWNoYXJnZWQuXG4gKiBkZWNyZW1lbnRRdW90YShxdW90YVNlcnZpY2UsIG9yZ0lkLCAncGlwZWxpbmVzJywgYXV0aEhlYWRlciwgbG9nV2FybiwgMSwgcmVzZXJ2YXRpb24ucXVvdGEucmVzZXRBdCk7XG4gKiB0aHJvdyBlcnI7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2VydmVRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gIGFtb3VudDogbnVtYmVyID0gMSxcbiAgcmVxdWVzdElkPzogc3RyaW5nLFxuKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+IHtcbiAgcmV0dXJuIHF1b3RhU2VydmljZS5yZXNlcnZlKG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIsIGFtb3VudCwgcmVxdWVzdElkKTtcbn1cblxuLyoqXG4gKiBGaXJlLWFuZC1mb3JnZXQgcm9sbGJhY2sgZm9yIGEgcHJldmlvdXNseSByZXNlcnZlZCBxdW90YSBzbG90LlxuICogTG9ncyBvbiBmYWlsdXJlIGJ1dCBuZXZlciB0aHJvd3MgIHRoZSBhY3Rpb24gdGhhdCBuZWVkZWQgdGhlIHJvbGxiYWNrXG4gKiBoYXMgYWxyZWFkeSBmYWlsZWQsIG5vIHBvaW50IGNvbXBvdW5kaW5nIHRoZSBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY3JlbWVudFF1b3RhKCBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgbG9nV2FybjogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQsXG4gIGFtb3VudDogbnVtYmVyID0gMSxcbiAgcmVzZXRBdFNuYXBzaG90Pzogc3RyaW5nLFxuKTogdm9pZCB7XG4gIHF1b3RhU2VydmljZS5kZWNyZW1lbnQob3JnSWQsIHF1b3RhVHlwZSwgYXV0aEhlYWRlciwgYW1vdW50LCByZXNldEF0U25hcHNob3QpLmNhdGNoKChlcnI6IHVua25vd24pID0+XG4gICAgbG9nV2FybignUXVvdGEgcm9sbGJhY2sgZmFpbGVkJywgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZTogU3RyaW5nKGVycikgfSksXG4gICk7XG59XG4iXX0=
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcXVvdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFFekUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQWtCLE1BQU0seUJBQXlCLENBQUM7QUFDcEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RCx5RUFBeUU7QUFDekUsTUFBTSxxQkFBcUIsR0FBK0Q7SUFDeEYsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFckMsMkVBQTJFO0FBQzNFLGlGQUFpRjtBQUNqRiw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLHNFQUFzRTtBQUN0RSw2RUFBNkU7QUFDN0UsaUZBQWlGO0FBQ2pGLDJCQUEyQjtBQUMzQixNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEtBQUssTUFBTSxDQUFDO0FBdUUvRTs7R0FFRztBQUNILFNBQVMsb0JBQW9CO0lBQzNCLE9BQU87UUFDTCxPQUFPLEVBQUUsSUFBSTtRQUNiLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDVCxJQUFJLEVBQUUsQ0FBQztRQUNQLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDYixPQUFPLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7UUFDakMsU0FBUyxFQUFFLElBQUk7UUFDZiwwRUFBMEU7UUFDMUUsa0VBQWtFO1FBQ2xFLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FF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Q0FBQyxPQUFPLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQzdGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUeXBlLCBRdW90YUNoZWNrUmVzdWx0LCBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IERFRkFVTFRfVElFUiwgaXNWYWxpZFRpZXIsIHR5cGUgUXVvdGFUaWVyIH0gZnJvbSAnLi4vdHlwZXMvcXVvdGEtdGllcnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuXG4vKiogUmV0cnkgb3B0aW9ucyBmb3IgcXVvdGEgY2FsbHMgIGZhaWwgZmFzdCBzaW5jZSBxdW90YSBpcyBmYWlsLW9wZW4uICovXG5jb25zdCBRVU9UQV9SRVFVRVNUX09QVElPTlM6IFBpY2s8UmVxdWVzdE9wdGlvbnMsICdtYXhSYXRlTGltaXRSZXRyaWVzJyB8ICdtYXhSZXRyaWVzJz4gPSB7XG4gIG1heFJhdGVMaW1pdFJldHJpZXM6IDEsXG4gIG1heFJldHJpZXM6IDEsXG59O1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3F1b3RhJyk7XG5cbi8vIGByZXNlcnZlYCBnYXRlcyBFWFBFTlNJVkUgcmVzb3VyY2VzIChwbHVnaW4gYnVpbGRzLCBwaXBlbGluZXMpLiBXaGVuIHRoZVxuLy8gcXVvdGEgc2VydmljZSBpcyByZWFjaGFibGUgYnV0IHJldHVybnMgYW4gZXJyb3IgKG9mdGVuIGFuIE9WRVJMT0FERUQgc2VydmljZSksXG4vLyBmYWlsaW5nIG9wZW4gd291bGQgcGlsZSB1bm1ldGVyZWQgZXhwZW5zaXZlIHdvcmsgb250byBpdCBhbmQgYnlwYXNzIHF1b3RhXG4vLyBlbnRpcmVseSDigJQgdGhlIHRleHRib29rIGZhaWwtb3BlbiBibG93LXVwLiBTbyBgcmVzZXJ2ZWAgZmFpbHMgQ0xPU0VEIG9uIGFuXG4vLyBlcnJvcmVkIHJlc3BvbnNlIGJ5IGRlZmF1bHQuIE9wZXJhdG9ycyB3aG8gcHJlZmVyIGF2YWlsYWJpbGl0eSBvdmVyXG4vLyBlbmZvcmNlbWVudCBjYW4gb3B0IGJhY2sgaW50byBmYWlsLW9wZW4gd2l0aCBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTj10cnVlLlxuLy8gKEEgZ2VudWluZWx5IFVOUkVBQ0hBQkxFIHNlcnZpY2Ugc3RpbGwgZmFpbHMgb3BlbiDigJQgdGhhdCdzIGEgY29uZmlybWVkIG91dGFnZSxcbi8vIG5vdCBhbiBvdmVybG9hZCBzaWduYWwuKVxuY29uc3QgUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gPSBwcm9jZXNzLmVudi5RVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTiA9PT0gJ3RydWUnO1xuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN5bmNocm9ub3VzIHF1b3RhIHJlc2VydmF0aW9uICB0aGUgYXRvbWljIGNoZWNrK2luY3JlbWVudFxuICogdmFyaWFudC4gYGV4Y2VlZGVkOiB0cnVlYCBtZWFucyB0aGUgb3BlcmF0aW9uIHdhcyByZWplY3RlZCBhdCB0aGUgREJcbiAqIGxldmVsOyB0aGUgY2FsbGVyIHNob3VsZCByZXR1cm4gNDI5IHdpdGhvdXQgcnVubmluZyB0aGUgZ2F0ZWQgYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIGV4Y2VlZGVkOiBib29sZWFuO1xuICBxdW90YToge1xuICAgIHR5cGU6IFF1b3RhVHlwZTtcbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIHVzZWQ6IG51bWJlcjtcbiAgICByZW1haW5pbmc6IG51bWJlcjtcbiAgICByZXNldEF0Pzogc3RyaW5nO1xuICB9O1xufVxuXG4vKipcbiAqIFF1b3RhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVNlcnZpY2Uge1xuICAvKiogQ2hlY2sgaWYgcXVvdGEgaXMgYXZhaWxhYmxlIChmYWlsLW9wZW4gb24gZXJyb3IpLiAqL1xuICBjaGVjayhvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhQ2hlY2tSZXN1bHQ+O1xuICAvKiogSW5jcmVtZW50IHF1b3RhIHVzYWdlLiBSZXR1cm5zIGEgcHJvbWlzZSBzbyBjYWxsZXJzIGNhbiBvcHRpb25hbGx5IGhhbmRsZSBlcnJvcnMuICovXG4gIGluY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBBdG9taWMgcmVzZXJ2ZSAgdGhlIHNhbWUgYXRvbWljIGNoZWNrK2luY3JlbWVudCBhcyBgaW5jcmVtZW50YCwgYnV0XG4gICAqIHBhcnNlcyB0aGUgcmVzcG9uc2Ugc28gY2FsbGVycyBjYW4gc2VlIHdoZXRoZXIgdGhlIHNsb3Qgd2FzIGFjdHVhbGx5XG4gICAqIHJlc2VydmVkLiBVc2UgdGhpcyBmb3IgZXhwZW5zaXZlIHJlc291cmNlcyB3aGVyZSB0aGUgcG9zdC1ob2MgZmlyZS1cbiAgICogYW5kLWZvcmdldCBwYXR0ZXJuIGFsbG93cyBjb25jdXJyZW50IG92ZXItc3BlbmQuXG4gICAqXG4gICAqIEZhaWwtb3BlbiBzZW1hbnRpY3Mgb24gdHJhbnNwb3J0IGVycm9yczogcmV0dXJucyBgZXhjZWVkZWQ6IGZhbHNlYCBzb1xuICAgKiB0aGUgY2FsbGVyIGNhbiBwcm9jZWVkIGFuZCB0aGUgcmVxdWVzdCBpc24ndCBibG9ja2VkIGJ5IHF1b3RhLXNlcnZpY2VcbiAgICogb3V0YWdlcyAobWF0Y2hlcyBgY2hlY2soKWApLlxuICAgKi9cbiAgcmVzZXJ2ZShvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFSZXNlcnZlUmVzdWx0PjtcbiAgLyoqXG4gICAqIFJvbGwgYmFjayBhIHByZXZpb3VzbHkgcmVzZXJ2ZWQgc2xvdC4gRmlyZS1hbmQtZm9yZ2V0IOKAlCBuZXZlciB0aHJvd3MuXG4gICAqIFBhc3MgYHJlc2V0QXRTbmFwc2hvdGAgKHRoZSBgcXVvdGEucmVzZXRBdGAgb2JzZXJ2ZWQgd2hlbiB0aGUgc2xvdCB3YXNcbiAgICogcmVzZXJ2ZWQpIHRvIG1ha2UgdGhlIHJvbGxiYWNrIGNvbmRpdGlvbmFsOiBpZiB0aGUgcGVyaW9kIHJvbGxlZCBvdmVyXG4gICAqIGJldHdlZW4gcmVzZXJ2ZSBhbmQgcm9sbGJhY2ssIHRoZSBzZXJ2ZXIgc2tpcHMgdGhlIGRlY3JlbWVudCBzbyBpdCBkb2Vzbid0XG4gICAqIHN0ZWFsIGNhcGFjaXR5IGZyb20gdGhlIG5ldyBwZXJpb2QuXG4gICAqL1xuICBkZWNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50PzogbnVtYmVyLCByZXNldEF0U25hcHNob3Q/OiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBVcGRhdGUgcXVvdGEgbGltaXRzLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gKi9cbiAgdXBkYXRlTGltaXRzKG9yZ0lkOiBzdHJpbmcsIGxpbWl0czogUGFydGlhbDxSZWNvcmQ8UXVvdGFUeXBlLCBudW1iZXI+PiwgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogUmVzZXQgcXVvdGEgdXNhZ2UuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqL1xuICByZXNldChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU/OiBRdW90YVR5cGUsIGF1dGhIZWFkZXI/OiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBHZXQgdGhlIG9yZydzIHF1b3RhIHRpZXIgKCdkZXZlbG9wZXInIHwgJ3BybycgfCAndGVhbScgfCAnZW50ZXJwcmlzZScpLiBVc2VkIGJ5XG4gICAqIHRoZSBwbHVnaW4tYnVpbGQgcXVldWUgcGFydGl0aW9uaW5nIHRvIHJvdXRlIGEgYnVpbGQgdG8gdGhlXG4gICAqIHJpZ2h0IHBlci10aWVyIHF1ZXVlLiBGYWlsLW9wZW4gcmV0dXJucyBERUZBVUxUX1RJRVIgKCdkZXZlbG9wZXInKVxuICAgKiBhIG1pc2NsYXNzaWZpZWQgcHJvL3RlYW0vZW50ZXJwcmlzZSBvcmcgd2lsbCBsYW5kIGluIHRoZSBkZXZlbG9wZXIgcXVldWVcbiAgICogYW5kIHN0aWxsIGJ1aWxkLCBqdXN0IHdpdGhvdXQgdGhlIHRpZXItc2NvcGVkIHNjaGVkdWxpbmcgYm9vc3QuXG4gICAqL1xuICBnZXRUaWVyKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVRpZXI+O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHF1b3RhIHNlcnZpY2UgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhU2VydmljZUNvbmZpZyB7XG4gIC8qKiBRdW90YSBzZXJ2aWNlIGhvc3QgKGRlZmF1bHQ6IGVudiBRVU9UQV9TRVJWSUNFX0hPU1Qgb3IgJ3F1b3RhJykgKi9cbiAgaG9zdD86IHN0cmluZztcbiAgLyoqIFF1b3RhIHNlcnZpY2UgcG9ydCAoZGVmYXVsdDogZW52IFFVT1RBX1NFUlZJQ0VfUE9SVCBvciAzMDAwKSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogNTAwMCkgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmYWlsLW9wZW4gcXVvdGEgcmVzdWx0IChhbGxvd3MgdGhlIHJlcXVlc3QpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpOiBRdW90YUNoZWNrUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkOiB0cnVlLFxuICAgIGxpbWl0OiAtMSxcbiAgICB1c2VkOiAwLFxuICAgIHJlbWFpbmluZzogLTEsXG4gICAgcmVzZXRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHVubGltaXRlZDogdHJ1ZSxcbiAgICAvLyBUYWcgdGhlIHNlbnRpbmVsIHNvIGZhaWwtY2xvc2VkIGNhbGxlcnMgY2FuIHRlbGwgYW4gb3V0YWdlIGFwYXJ0IGZyb20gYVxuICAgIC8vIHJlYWwgdW5saW1pdGVkICgtMSkgcmVhZGluZy4gUmVhbCBxdW90YSByZXN1bHRzIG5ldmVyIHNldCB0aGlzLlxuICAgIGZhaWxPcGVuOiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGNvbW1vbiByZXF1ZXN0IGhlYWRlcnMgd2l0aCBvcHRpb25hbCByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcj86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICd4LW9yZy1pZCc6IG9yZ0lkIH07XG4gIGlmIChhdXRoSGVhZGVyKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBhdXRoSGVhZGVyO1xuICBpZiAocmVxdWVzdElkKSBoZWFkZXJzWydYLVJlcXVlc3QtSWQnXSA9IHJlcXVlc3RJZDtcbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcXVvdGEgc2VydmljZSBjbGllbnQuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHNlcnZpY2UgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgUXVvdGEgc2VydmljZSBjbGllbnRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcXVvdGFTZXJ2aWNlID0gY3JlYXRlUXVvdGFTZXJ2aWNlKCk7XG4gKlxuICogLy8gQ2hlY2sgcXVvdGEgYmVmb3JlIHByb2Nlc3NpbmdcbiAqIGNvbnN0IHF1b3RhID0gYXdhaXQgcXVvdGFTZXJ2aWNlLmNoZWNrKG9yZ0lkLCAnYXBpQ2FsbHMnLCBhdXRoSGVhZGVyKTtcbiAqIGlmICghcXVvdGEuYWxsb3dlZCkge1xuICogcmV0dXJuIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdRdW90YSBleGNlZWRlZCcgfSk7XG4gKiB9XG4gKlxuICogLy8gSW5jcmVtZW50IHF1b3RhIGFmdGVyIHN1Y2Nlc3NcbiAqIHF1b3RhU2VydmljZS5pbmNyZW1lbnQob3JnSWQsICdhcGlDYWxscycsIGF1dGhIZWFkZXIpLmNhdGNoKGVyciA9PiBsb2dnZXIud2FybignUXVvdGEgaW5jcmVtZW50IGZhaWxlZCcsIHsgZXJyb3I6IGVyciB9KSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1b3RhU2VydmljZShjb25maWc6IFF1b3RhU2VydmljZUNvbmZpZyA9IHt9KTogUXVvdGFTZXJ2aWNlIHtcbiAgY29uc3Qgc2VydmljZUNvbmZpZzogU2VydmljZUNvbmZpZyA9IHtcbiAgICBob3N0OiBjb25maWcuaG9zdCA/PyBwcm9jZXNzLmVudi5RVU9UQV9TRVJWSUNFX0hPU1QgPz8gJ3F1b3RhJyxcbiAgICBwb3J0OiBjb25maWcucG9ydCA/PyBwYXJzZUludChwcm9jZXNzLmVudi5RVU9UQV9TRVJWSUNFX1BPUlQgPz8gJzMwMDAnLCAxMCksXG4gICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gNTAwMCxcbiAgfTtcblxuICBjb25zdCBjbGllbnQgPSBjcmVhdGVTYWZlQ2xpZW50KHNlcnZpY2VDb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgY2hlY2sob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YUNoZWNrUmVzdWx0PiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS8ke2VuY29kZVVSSUNvbXBvbmVudChxdW90YVR5cGUpfWA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhVHlwZTogc3RyaW5nOyBzdGF0dXM6IFF1b3RhQ2hlY2tSZXN1bHQgfTtcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICAgIH0+KHBhdGgsIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfT1BFTjogUXVvdGEgc2VydmljZSB1bnJlYWNoYWJsZSwgYWxsb3dpbmcgcmVxdWVzdCcsIHsgb3JnSWQsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfb3Blbl90b3RhbCcsIHsgb3BlcmF0aW9uOiAnY2hlY2snLCByZWFzb246ICd1bnJlYWNoYWJsZScsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZhaWxPcGVuUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDAgfHwgIXJlc3BvbnNlLmJvZHkuc3VjY2VzcyB8fCAhcmVzcG9uc2UuYm9keS5kYXRhPy5zdGF0dXMpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfT1BFTjogUXVvdGEgY2hlY2sgcmV0dXJuZWQgbm9uLW9rLCBhbGxvd2luZyByZXF1ZXN0Jywge1xuICAgICAgICAgIG9yZ0lkLCBxdW90YVR5cGUsIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c0NvZGUsIG1lc3NhZ2U6IHJlc3BvbnNlLmJvZHkubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ2NoZWNrJywgcmVhc29uOiAnbm9uLW9rJywgcXVvdGFUeXBlIH0pO1xuICAgICAgICByZXR1cm4gY3JlYXRlRmFpbE9wZW5SZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmJvZHkuZGF0YS5zdGF0dXM7XG4gICAgfSxcblxuICAgIGFzeW5jIGluY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ6IG51bWJlciA9IDEsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnRcbiAgICAgICAgLnBvc3QocGF0aCwgeyBxdW90YVR5cGUsIGFtb3VudCB9LCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGluY3JlbWVudCBxdW90YScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUXVvdGEgaW5jcmVtZW50ZWQnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzZXJ2ZShvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ6IG51bWJlciA9IDEsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFSZXNlcnZlUmVzdWx0PiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS9pbmNyZW1lbnRgO1xuXG4gICAgICAvLyAyMDAgY2FycmllcyBgZGF0YS5xdW90YWA7IDQyOSAoUVVPVEFfRVhDRUVERUQpIGNhcnJpZXMgYGRldGFpbHMucXVvdGFgLlxuICAgICAgLy8gQm90aCBzaGFwZXMgYXJlIG5vcm1hbGl6ZWQgaW50byBRdW90YVJlc2VydmVSZXN1bHQuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PHtcbiAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgZGF0YT86IHsgcXVvdGE/OiBRdW90YVJlc2VydmVSZXN1bHRbJ3F1b3RhJ10gfTtcbiAgICAgICAgZGV0YWlscz86IHsgcXVvdGE/OiBRdW90YVJlc2VydmVSZXN1bHRbJ3F1b3RhJ10gfTtcbiAgICAgICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgICAgfT4ocGF0aCwgeyBxdW90YVR5cGUsIGFtb3VudCB9LCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIHNlcnZpY2UgdW5yZWFjaGFibGUgb24gcmVzZXJ2ZSwgYWxsb3dpbmcgcmVxdWVzdCcsIHsgb3JnSWQsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfb3Blbl90b3RhbCcsIHsgb3BlcmF0aW9uOiAncmVzZXJ2ZScsIHJlYXNvbjogJ3VucmVhY2hhYmxlJywgcXVvdGFUeXBlIH0pO1xuICAgICAgICByZXR1cm4geyBleGNlZWRlZDogZmFsc2UsIHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IC0xLCB1c2VkOiAwLCByZW1haW5pbmc6IC0xIH0gfTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQyOSkge1xuICAgICAgICBjb25zdCBxID0gcmVzcG9uc2UuYm9keS5kZXRhaWxzPy5xdW90YTtcbiAgICAgICAgLy8gT25seSBhIEdFTlVJTkUgcXVvdGEtZXhjZWVkZWQgNDI5IG1lYW5zIFwib3ZlciBxdW90YVwiLiBBIGdlbmVyaWMgNDI5IOKAlFxuICAgICAgICAvLyB0aGUgcXVvdGEgc2VydmljZSdzIE9XTiByYXRlIGxpbWl0ZXIgKFJBVEVfTElNSVRfRVhDRUVERUQpIG9yIGFuXG4gICAgICAgIC8vIGludGVydmVuaW5nIGdhdGV3YXkgZHVyaW5nIGEgc3Bpa2Ug4oCUIG11c3QgTk9UIGJlIHN1cmZhY2VkIGFzXG4gICAgICAgIC8vIHF1b3RhLWV4Y2VlZGVkOiB0aGF0IHdvdWxkIGZhbHNlbHkgYmxvY2sgbGVnaXRpbWF0ZSB3b3JrIGJlaGluZCBhXG4gICAgICAgIC8vIHRyYW5zaWVudCByYXRlIGxpbWl0LiBSZXF1aXJlIHRoZSBRVU9UQV9FWENFRURFRCBlcnJvciBjb2RlIChvciB0aGVcbiAgICAgICAgLy8gcXVvdGEgcGF5bG9hZCkgYW5kIG90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gdGhlIG5vbi1va1xuICAgICAgICAvLyBmYWlsLW9wZW4vY2xvc2VkIHBvbGljeSBiZWxvdyAodGhlIHJpZ2h0IGhhbmRsaW5nIGZvciBhIHRyYW5zaWVudCA0MjkpLlxuICAgICAgICBpZiAocmVzcG9uc2UuYm9keS5lcnJvckNvZGUgPT09ICdRVU9UQV9FWENFRURFRCcgfHwgcSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBleGNlZWRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHF1b3RhOiBxID8/IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogMCwgdXNlZDogMCwgcmVtYWluaW5nOiAwIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgaWYgKFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1FVT1RBX0ZBSUxfT1BFTjogUXVvdGEgcmVzZXJ2ZSByZXR1cm5lZCBub24tb2ssIGFsbG93aW5nIHJlcXVlc3QnLCB7XG4gICAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ3Jlc2VydmUnLCByZWFzb246ICdub24tb2snLCBxdW90YVR5cGUgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgZXhjZWVkZWQ6IGZhbHNlLCBxdW90YTogeyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAtMSwgdXNlZDogMCwgcmVtYWluaW5nOiAtMSB9IH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VydmljZSByZWFjaGFibGUgYnV0IGRpZG4ndCBjb25maXJtIHRoZSByZXNlcnZhdGlvbiDihpIgZmFpbCBDTE9TRUQuXG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX0NMT1NFRDogUXVvdGEgcmVzZXJ2ZSByZXR1cm5lZCBub24tb2ssIGRlbnlpbmcgcmVxdWVzdCcsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3F1b3RhX2ZhaWxfY2xvc2VkX3RvdGFsJywgeyBvcGVyYXRpb246ICdyZXNlcnZlJywgcmVhc29uOiAnbm9uLW9rJywgcXVvdGFUeXBlIH0pO1xuICAgICAgICByZXR1cm4geyBleGNlZWRlZDogdHJ1ZSwgcXVvdGE6IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogMCwgdXNlZDogMCwgcmVtYWluaW5nOiAwIH0gfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcSA9IHJlc3BvbnNlLmJvZHkuZGF0YT8ucXVvdGE7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGNlZWRlZDogZmFsc2UsXG4gICAgICAgIHF1b3RhOiBxID8/IHsgdHlwZTogcXVvdGFUeXBlLCBsaW1pdDogLTEsIHVzZWQ6IDAsIHJlbWFpbmluZzogLTEgfSxcbiAgICAgIH07XG4gICAgfSxcblxuICAgIGFzeW5jIGRlY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ6IG51bWJlciA9IDEsIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS9kZWNyZW1lbnRgO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnRcbiAgICAgICAgLnBvc3QocGF0aCwgeyBxdW90YVR5cGUsIGFtb3VudCwgLi4uKHJlc2V0QXRTbmFwc2hvdCAmJiB7IHJlc2V0QXRTbmFwc2hvdCB9KSB9LCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAvLyBSb2xsYmFjayBmYWlsdXJlIGlzIGxvZ2dlZCBidXQgbmV2ZXIgcHJvcGFnYXRlZCAgdGhlIGFjdGlvbidzIG93blxuICAgICAgICAvLyBmYWlsdXJlIGhhcyBhbHJlYWR5IGJlZW4gc3VyZmFjZWQgdG8gdGhlIGNhbGxlcjsgYSBzdHVjayBjb3VudGVyXG4gICAgICAgIC8vIHJlc29sdmVzIG9uIHRoZSBuZXh0IHBlcmlvZCByZXNldC5cbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBkZWNyZW1lbnQgcXVvdGEgKHNsb3Qgd2lsbCByZXNldCBvbiBuZXh0IHBlcmlvZCknLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50LCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1F1b3RhIGRlY3JlbWVudGVkJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZUxpbWl0cyggb3JnSWQ6IHN0cmluZyxcbiAgICAgIGxpbWl0czogUGFydGlhbDxSZWNvcmQ8UXVvdGFUeXBlLCBudW1iZXI+PixcbiAgICAgIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgICAgIHJlcXVlc3RJZD86IHN0cmluZyxcbiAgICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9YDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucHV0KHBhdGgsIGxpbWl0cywgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCkgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gdXBkYXRlIHF1b3RhIGxpbWl0cycsIHtcbiAgICAgICAgICBvcmdJZCwgbGltaXRzLCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1F1b3RhIGxpbWl0cyB1cGRhdGVkJywgeyBvcmdJZCwgbGltaXRzIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldFRpZXIob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhVGllcj4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICBkYXRhPzogeyBxdW90YT86IHsgdGllcj86IHN0cmluZyB9IH07XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IHRpZXIgbG9va3VwIGZhaWxlZCwgZGVmYXVsdGluZyB0byBkZXZlbG9wZXIgdGllcicsIHtcbiAgICAgICAgICBvcmdJZCwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICd0aWVyJywgcmVhc29uOiByZXNwb25zZSA/ICdub24tb2snIDogJ3VucmVhY2hhYmxlJywgcXVvdGFUeXBlOiAndGllcicgfSk7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1RJRVI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpZXIgPSByZXNwb25zZS5ib2R5LmRhdGE/LnF1b3RhPy50aWVyO1xuICAgICAgcmV0dXJuIHRpZXIgJiYgaXNWYWxpZFRpZXIodGllcikgPyB0aWVyOiBERUZBVUxUX1RJRVI7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc2V0KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZT86IFF1b3RhVHlwZSwgYXV0aEhlYWRlcj86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfS9yZXNldGA7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBxdW90YVR5cGUgPyB7IHF1b3RhVHlwZSB9OiB7fTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QocGF0aCwgYm9keSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIgPz8gJycsIHJlcXVlc3RJZCkgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcmVzZXQgcXVvdGEnLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgc3RhdHVzQ29kZTogcmVzcG9uc2U/LnN0YXR1c0NvZGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdRdW90YSByZXNldCcsIHsgb3JnSWQsIHF1b3RhVHlwZTogcXVvdGFUeXBlID8/ICdhbGwnIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGaXJlLWFuZC1mb3JnZXQgcXVvdGEgaW5jcmVtZW50IHdpdGggc3RhbmRhcmRpemVkIGVycm9yIGxvZ2dpbmcuXG4gKlxuICogV3JhcHMgYHF1b3RhU2VydmljZS5pbmNyZW1lbnQoKWAgd2l0aCBhIGAuY2F0Y2goKWAgdGhhdCBsb2dzIGEgd2FybmluZy5cbiAqIEVsaW1pbmF0ZXMgdGhlIGlkZW50aWNhbCBvbmUtbGluZXIgcmVwZWF0ZWQgYWNyb3NzIGV2ZXJ5IHJlYWQgcm91dGUuXG4gKlxuICogQHBhcmFtIHF1b3RhU2VydmljZSAtIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKiBAcGFyYW0gb3JnSWQgLSBPcmdhbml6YXRpb24gSURcbiAqIEBwYXJhbSBxdW90YVR5cGUgLSBRdW90YSB0eXBlIHRvIGluY3JlbWVudFxuICogQHBhcmFtIGF1dGhIZWFkZXIgLSBBdXRob3JpemF0aW9uIGhlYWRlciB2YWx1ZVxuICogQHBhcmFtIGxvZ1dhcm4gLSBMb2dnaW5nIGZ1bmN0aW9uIGZvciB3YXJuaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5jcmVtZW50UXVvdGEoIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBvcmdJZDogc3RyaW5nLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbiAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICBsb2dXYXJuOiAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZCxcbik6IHZvaWQge1xuICBxdW90YVNlcnZpY2UuaW5jcmVtZW50KG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIpLmNhdGNoKChlcnI6IHVua25vd24pID0+XG4gICAgbG9nV2FybignUXVvdGEgaW5jcmVtZW50IGZhaWxlZCcsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2U6IFN0cmluZyhlcnIpIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEF0b21pYyByZXNlcnZlIGhlbHBlciBmb3IgdGhlIFwicmVzZXJ2ZSArIGNvbW1pdCAvIHJvbGxiYWNrXCIgcGF0dGVybi5cbiAqIFVzZSBmb3IgZXhwZW5zaXZlIHJlc291cmNlcyAocGlwZWxpbmVzLCBwbHVnaW5zLCBBSSBjYWxscykgd2hlcmUgdGhlXG4gKiBmaXJlLWFuZC1mb3JnZXQgcG9zdC1ob2MgYGluY3JlbWVudFF1b3RhYCBhbGxvd3MgY29uY3VycmVudCBvdmVyLXNwZW5kLlxuICpcbiAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgcmVzdWx0IHNvIHRoZSBjYWxsZXIgY2FuIGRlY2lkZSB3aGV0aGVyIHRvIHJ1blxuICogdGhlIGdhdGVkIGFjdGlvbiBvciA0MjkgdGhlIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzZXJ2YXRpb24gPSBhd2FpdCByZXNlcnZlUXVvdGEocXVvdGFTZXJ2aWNlLCBvcmdJZCwgJ3BpcGVsaW5lcycsIGF1dGhIZWFkZXIpO1xuICogaWYgKHJlc2VydmF0aW9uLmV4Y2VlZGVkKSByZXR1cm4gc2VuZFF1b3RhRXhjZWVkZWQocmVzLCAncGlwZWxpbmVzJywgcmVzZXJ2YXRpb24ucXVvdGEpO1xuICogdHJ5IHtcbiAqIGF3YWl0IGRvRXhwZW5zaXZlVGhpbmcoKTtcbiAqIH0gY2F0Y2ggKGVycikge1xuICogLy8gUGFzcyB0aGUgcmVzZXJ2ZWQgcmVzZXRBdCBzbyBhIHBlcmlvZCByb2xsb3ZlciBkb2Vzbid0IGdldCBkb3VibGUtY2hhcmdlZC5cbiAqIGRlY3JlbWVudFF1b3RhKHF1b3RhU2VydmljZSwgb3JnSWQsICdwaXBlbGluZXMnLCBhdXRoSGVhZGVyLCBsb2dXYXJuLCAxLCByZXNlcnZhdGlvbi5xdW90YS5yZXNldEF0KTtcbiAqIHRocm93IGVycjtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXJ2ZVF1b3RhKCBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4gIGF1dGhIZWFkZXI6IHN0cmluZyxcbiAgYW1vdW50OiBudW1iZXIgPSAxLFxuICByZXF1ZXN0SWQ/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICByZXR1cm4gcXVvdGFTZXJ2aWNlLnJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgYXV0aEhlYWRlciwgYW1vdW50LCByZXF1ZXN0SWQpO1xufVxuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCByb2xsYmFjayBmb3IgYSBwcmV2aW91c2x5IHJlc2VydmVkIHF1b3RhIHNsb3QuXG4gKiBMb2dzIG9uIGZhaWx1cmUgYnV0IG5ldmVyIHRocm93cyAgdGhlIGFjdGlvbiB0aGF0IG5lZWRlZCB0aGUgcm9sbGJhY2tcbiAqIGhhcyBhbHJlYWR5IGZhaWxlZCwgbm8gcG9pbnQgY29tcG91bmRpbmcgdGhlIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjcmVtZW50UXVvdGEoIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBvcmdJZDogc3RyaW5nLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbiAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICBsb2dXYXJuOiAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZCxcbiAgYW1vdW50OiBudW1iZXIgPSAxLFxuICByZXNldEF0U25hcHNob3Q/OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgcXVvdGFTZXJ2aWNlLmRlY3JlbWVudChvcmdJZCwgcXVvdGFUeXBlLCBhdXRoSGVhZGVyLCBhbW91bnQsIHJlc2V0QXRTbmFwc2hvdCkuY2F0Y2goKGVycjogdW5rbm93bikgPT5cbiAgICBsb2dXYXJuKCdRdW90YSByb2xsYmFjayBmYWlsZWQnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlOiBTdHJpbmcoZXJyKSB9KSxcbiAgKTtcbn1cbiJdfQ==
@@ -10,7 +10,7 @@ import { type AuditSpool } from './audit-spool.js';
10
10
  * (`admin.superadmin.grant`, `org.ownership.transfer`, `user.login`, …). Keep
11
11
  * this list free of any platform-only action.
12
12
  */
13
- export declare const REMOTE_AUDIT_ACTIONS: readonly ["plugin.build.completed", "plugin.build.failed", "plugin.build.timeout", "plugin.delete", "plugin.upload", "plugin.deploy", "plugin.bulk.update", "plugin.bulk.delete", "plugin.dlq.purge", "pipeline.create", "pipeline.update", "pipeline.delete", "pipeline.execution.start", "pipeline.execution.cancel", "pipeline.registry.register", "pipeline.registry.deregister", "quota.reset", "quota.limit.update", "quota.delete", "compliance.exemption.approve", "compliance.exemption.revoke", "compliance.rule.toggle", "compliance.rule.create", "compliance.rule.update", "compliance.rule.delete", "compliance.policy.create", "compliance.policy.update", "compliance.policy.delete", "compliance.scan-schedule.create", "compliance.scan-schedule.update", "compliance.scan-schedule.delete", "compliance.template.apply", "compliance.scan.cancel", "registry.gc", "registry.image.delete", "message.announcement.create", "message.delete", "billing.subscription.cancel", "billing.subscription.delete", "billing.tier.override", "billing.addon.add", "billing.addon.remove", "billing.addon.prune", "authz.denied"];
13
+ export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.delete', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.cancel', 'registry.gc', 'registry.image.delete', 'message.announcement.create', 'message.delete', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'authz.denied'];
14
14
  export type RemoteAuditAction = typeof REMOTE_AUDIT_ACTIONS[number];
15
15
  /** Whether `value` is an action a remote service may emit (the ingest allow-list). */
16
16
  export declare function isRemoteAuditAction(value: string): value is RemoteAuditAction;
@@ -140,3 +140,21 @@ export interface ServiceAuditClient {
140
140
  * (e.g. reuse a service's existing ioredis connection).
141
141
  */
142
142
  export declare function createServiceAuditClient(serviceName: string, config?: RemoteAuditClientConfig): ServiceAuditClient;
143
+ /**
144
+ * Lazily-constructed remote-audit accessor for a service. Every service's
145
+ * `services/audit.ts` used to hand-roll the same module singleton (a `let audit`
146
+ * + `svc()` that builds a {@link ServiceAuditClient} on first use, then a
147
+ * `getAuditClient()` returning `.client` and an `emit(event)` forwarding to
148
+ * `.emit`). This packages that pattern in ONE place so each service's audit
149
+ * wiring is a one-liner and can't drift.
150
+ *
151
+ * Lazy on purpose: the underlying client wires an env-Redis audit spool, so
152
+ * building it at import time would force that connection wherever the module is
153
+ * merely imported (e.g. tests). `getAuditClient` is passed to
154
+ * `wireAuthzDenialAuditor`; `emit` backs the per-service `emitXAudit` helpers.
155
+ * Both stay FIRE-AND-FORGET (record never throws / is not awaited).
156
+ */
157
+ export declare function createRemoteAuditAccessor(serviceName: string): {
158
+ getAuditClient: () => RemoteAuditClient;
159
+ emit: (event: RemoteAuditEvent) => void;
160
+ };
@@ -106,6 +106,20 @@ export const REMOTE_AUDIT_ACTIONS = [
106
106
  // account's new tier now bundles the feature) — distinct from a user-initiated
107
107
  // `remove` so finance can tell an auto-prune from a customer action.
108
108
  'billing.addon.prune',
109
+ // Discounts (docs/billing-discounts.md) — mint/issue/apply/remove/revoke of a
110
+ // price coupon or usage credit. `details` carry the discount id + kind/value
111
+ // only, never the opaque token or signing key.
112
+ 'billing.discount.generate',
113
+ 'billing.discount.issue',
114
+ 'billing.discount.apply',
115
+ 'billing.discount.remove',
116
+ 'billing.discount.revoke',
117
+ // Usage-credit realization — a customer/compliance-visible record of credit
118
+ // movement: `consumed` (Marketplace metered drawdown), `exhausted` (balance hit
119
+ // zero), and a combo ending. `details` carry cents/ids only, no payment secrets.
120
+ 'billing.credit.consumed',
121
+ 'billing.credit.exhausted',
122
+ 'billing.combo.expired',
109
123
  // Denied authorization attempt — emitted best-effort by the shared
110
124
  // `requirePermission` / `requireSystemAdmin` gate when a state-changing
111
125
  // (non-GET) request is rejected, so probing/escalation attempts are visible
@@ -293,4 +307,30 @@ export function createServiceAuditClient(serviceName, config = {}) {
293
307
  client,
294
308
  };
295
309
  }
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsMEJBQTBCO0lB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QUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxXQUFtQixFQUFFLFNBQWtDO0lBQzVGLHFCQUFxQixDQUFDLENBQUMsSUFBcUIsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2xFLE1BQU0sRUFBRSxjQUFjO1FBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLFdBQVc7UUFDcEMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1FBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtLQUMzRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDbkIsQ0FBQztBQWVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxXQUFtQixFQUFFLFNBQWtDLEVBQUU7SUFDaEcsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSx3QkFBd0IsRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsT0FBTztRQUNMLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO1FBQ2xELE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sLCB0eXBlIEF1ZGl0U3Bvb2xFbnRyeSB9IGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIsIHNldEF1dGh6RGVuaWFsQXVkaXRvciwgdHlwZSBBdXRoekRlbmlhbEluZm8gfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZW1vdGUtYXVkaXQnKTtcblxuLyoqXG4gKiBBdWRpdCBpbmdlc3QgaXMgYmVzdC1lZmZvcnQgYW5kIE1VU1QgTk9UIGJsb2NrIHRoZSBjYWxsZXIsIGJ1dCBhIHRyYW5zaWVudFxuICogZmFpbHVyZSAoNDI5IC8gNXh4IC8gY29ubmVjdGlvbiByZXNldCAvIHRpbWVvdXQpIHNob3VsZCBub3Qgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJvdyBvbiB0aGUgZmlyc3QgYXR0ZW1wdC4gRWFjaCBlbWlzc2lvbiBjYXJyaWVzIGEgc3RhYmxlIHBlci1ldmVudFxuICogYElkZW1wb3RlbmN5LUtleWAgKHNlZSBgcmVjb3JkYCksIHNvIHRoZSBodHRwLWNsaWVudCB0cmVhdHMgdGhlIFBPU1QgYXNcbiAqIHJldHJ5LXNhZmUgYW5kIHRoZSBwbGF0Zm9ybSBjYW4gZGVkdXAgYSByZXRyaWVkIGRlbGl2ZXJ5IGluc3RlYWQgb2Ygd3JpdGluZyBhXG4gKiBkdXBsaWNhdGUgcm93LiBCdWRnZXQgaXMga2VwdCBzbWFsbCBzbyBhIGhhcmQtZG93biBwbGF0Zm9ybSBjYW4ndCBiYWNrIHRoZVxuICogd29ya2VyIHVwIGZvciBsb25nOiBiYXNlIGRlbGF5IMOXKDIgcmV0cmllcykgKyBhIGNvdXBsZSBvZiA0MjkgYmFja29mZnMuXG4gKi9cbmNvbnN0IEFVRElUX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMixcbiAgbWF4UmV0cmllczogMixcbn07XG5cbi8qKlxuICogVGhlIGV4YWN0IHNldCBvZiBhdWRpdCBhY3Rpb25zIGEgTk9OLVBMQVRGT1JNIChyZW1vdGUpIHNlcnZpY2UgaXMgcGVybWl0dGVkIHRvXG4gKiBlbWl0IHRocm91Z2ggYFBPU1QgL2F1ZGl0L2V2ZW50c2AuIFRoaXMgaXMgdGhlIFNJTkdMRSBTT1VSQ0Ug4oCUIGBSZW1vdGVBdWRpdEFjdGlvbmBcbiAqIGlzIGRlcml2ZWQgZnJvbSBpdCwgc28gdGhlIHR5cGUgYW5kIHRoZSBydW50aW1lIGFsbG93LWxpc3QgY2FuIG5ldmVyIGRyaWZ0LlxuICpcbiAqIFNFQ1VSSVRZOiBwbGF0Zm9ybSdzIGluZ2VzdCB2YWxpZGF0ZXMgYGFjdGlvbmAgYWdhaW5zdCB0aGlzIHN1YnNldCAodmlhXG4gKiB7QGxpbmsgaXNSZW1vdGVBdWRpdEFjdGlvbn0pLCBOT1QgdGhlIGZ1bGwgcGxhdGZvcm0gYEF1ZGl0QWN0aW9uYCB1bmlvbiDigJQgYVxuICogYHNlcnZpY2U6KmAgdG9rZW4gbXVzdCBub3QgYmUgYWJsZSB0byBmb3JnZSBwbGF0Zm9ybS1hdXRob3JpdHkgZXZlbnRzXG4gKiAoYGFkbWluLnN1cGVyYWRtaW4uZ3JhbnRgLCBgb3JnLm93bmVyc2hpcC50cmFuc2ZlcmAsIGB1c2VyLmxvZ2luYCwg4oCmKS4gS2VlcFxuICogdGhpcyBsaXN0IGZyZWUgb2YgYW55IHBsYXRmb3JtLW9ubHkgYWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVNT1RFX0FVRElUX0FDVElPTlMgPSBbXG4gICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAgJ3BsdWdpbi5idWlsZC5mYWlsZWQnLFxuICAncGx1Z2luLmJ1aWxkLnRpbWVvdXQnLFxuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gICdwbHVnaW4uZGVsZXRlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBQaXBlbGluZSBtdXRhdGlvbnMg4oCUIGVtaXR0ZWQgYnkgYXBpL3BpcGVsaW5lJ3Mgcm91dGUgaGFuZGxlcnNcbiAgLy8gKGNyZWF0ZS91cGRhdGUvZGVsZXRlICsgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiB0cmlnZ2VyL2NhbmNlbCkgYW5kXG4gIC8vIHBvc3RlZCB0byBwbGF0Zm9ybSdzIGBQT1NUIC9hdWRpdC9ldmVudHNgIGluZ2VzdC5cbiAgJ3BpcGVsaW5lLmNyZWF0ZScsXG4gICdwaXBlbGluZS51cGRhdGUnLFxuICAncGlwZWxpbmUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5zdGFydCcsXG4gICdwaXBlbGluZS5leGVjdXRpb24uY2FuY2VsJyxcbiAgLy8gQ29kZVBpcGVsaW5lIEFSTi1yZWdpc3RyeSBjb25maWcgKGFwaS9waXBlbGluZSByZWdpc3RyeSByb3V0ZSkg4oCUIHJlZ2lzdGVyaW5nIC9cbiAgLy8gZGVyZWdpc3RlcmluZyB0aGUgZXh0ZXJuYWwgQ29kZVBpcGVsaW5lIHRoYXQgYmFja3MgYSBwaXBlbGluZSAoZGVwbG95LWFmZmVjdGluZykuXG4gICdwaXBlbGluZS5yZWdpc3RyeS5yZWdpc3RlcicsXG4gICdwaXBlbGluZS5yZWdpc3RyeS5kZXJlZ2lzdGVyJyxcbiAgLy8gUXVvdGEgYWRtaW5pc3RyYXRpb24gKGFwaS9xdW90YSkg4oCUIGEgc3VwZXJhZG1pbiByZXNldHRpbmcgYW4gb3JnJ3MgdXNhZ2VcbiAgLy8gY291bnRlciBvciBlZGl0aW5nIGl0cyB0aWVyIGxpbWl0cy4gYGFmZmVjdGVkT3JnSWRgIGlzIHRoZSBvcmcgY2hhbmdlZDtcbiAgLy8gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHF1b3RhVHlwZSArIG9sZC9uZXcgdmFsdWUuXG4gICdxdW90YS5yZXNldCcsXG4gICdxdW90YS5saW1pdC51cGRhdGUnLFxuICAvLyBBIHN1cGVyYWRtaW4gZGVsZXRpbmcgYW4gb3JnJ3MgZW50aXJlIHF1b3RhIGRvY3VtZW50LlxuICAncXVvdGEuZGVsZXRlJyxcbiAgLy8gQ29tcGxpYW5jZSBhZG1pbmlzdHJhdGlvbiAoYXBpL2NvbXBsaWFuY2UpIOKAlCB0aGUgZW5mb3JjZW1lbnQtcG9zdHVyZSBzdXJmYWNlLlxuICAvLyBBcHByb3ZpbmcvcmV2b2tpbmcgYW4gZXhlbXB0aW9uLCB0b2dnbGluZy9hdXRob3JpbmcvZGVsZXRpbmcgYSBydWxlLFxuICAvLyBhdXRob3JpbmcvZGVsZXRpbmcgYSBwb2xpY3ksIG1hbmFnaW5nIHNjYW4gc2NoZWR1bGVzLCBhcHBseWluZyBhIHRlbXBsYXRlLFxuICAvLyBvciBjYW5jZWxsaW5nIGEgcnVubmluZyBzY2FuLiBgdGFyZ2V0SWRgIGlzIHRoZSBydWxlL3BvbGljeS9leGVtcHRpb24vc2NhbiBpZC5cbiAgJ2NvbXBsaWFuY2UuZXhlbXB0aW9uLmFwcHJvdmUnLFxuICAnY29tcGxpYW5jZS5leGVtcHRpb24ucmV2b2tlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS50b2dnbGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kuY3JlYXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS50ZW1wbGF0ZS5hcHBseScsXG4gICdjb21wbGlhbmNlLnNjYW4uY2FuY2VsJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcyAocHJldmlvdXNseSBvbmx5IGEgbG9nIGxpbmUpLlxuICAncmVnaXN0cnkuZ2MnLFxuICAncmVnaXN0cnkuaW1hZ2UuZGVsZXRlJyxcbiAgLy8gTWVzc2FnaW5nIChhcGkvbWVzc2FnZSkg4oCUIGFkbWluIEJST0FEQ0FTVCBhbm5vdW5jZW1lbnRzICsgZGVzdHJ1Y3RpdmVcbiAgLy8gZGVsZXRlcy4gMToxIHVzZXIgbWVzc2FnZXMgYXJlIGludGVudGlvbmFsbHkgTk9UIGF1ZGl0ZWQgKG5vaXNlICsgdGhleSB3b3VsZFxuICAvLyBwdWxsIHByaXZhdGUgY29udGVudCBpbnRvIHRoZSB0cmFpbCkuIGBkZXRhaWxzYCBjYXJyeSBtZXRhZGF0YSBvbmx5XG4gIC8vIChzdWJqZWN0L3R5cGUvc2NvcGUpLCBORVZFUiBtZXNzYWdlIGJvZHkgY29udGVudC5cbiAgJ21lc3NhZ2UuYW5ub3VuY2VtZW50LmNyZWF0ZScsXG4gICdtZXNzYWdlLmRlbGV0ZScsXG4gIC8vIEJpbGxpbmcgKGFwaS9iaWxsaW5nKSDigJQgc3Vic2NyaXB0aW9uICsgZW50aXRsZW1lbnQgbXV0YXRpb25zLCBtaXJyb3JlZCB0byB0aGVcbiAgLy8gY2VudHJhbCBhdWRpdCB0cmFpbCAodGhlc2UgYWxzbyB3cml0ZSB0byB0aGUgc2VydmljZS1sb2NhbCBiaWxsaW5nX2V2ZW50c1xuICAvLyBjb2xsZWN0aW9uKS4gYGRldGFpbHNgIGNhcnJ5IHBsYW4vdGllci9hZGRvbiBpZHMgb25seSDigJQgbmV2ZXIgY2FyZC9wYXltZW50XG4gIC8vIHNlY3JldHMgb3IgYW4gQVdTIGFjY291bnQgaWQuXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5jYW5jZWwnLFxuICAnYmlsbGluZy5zdWJzY3JpcHRpb24uZGVsZXRlJyxcbiAgJ2JpbGxpbmcudGllci5vdmVycmlkZScsXG4gICdiaWxsaW5nLmFkZG9uLmFkZCcsXG4gICdiaWxsaW5nLmFkZG9uLnJlbW92ZScsXG4gIC8vIFN5c3RlbS1pbml0aWF0ZWQgcmVtb3ZhbCBvZiBhIHRpZXItaW5jbHVkZWQgYWRkLW9uIG9uIGEgcGxhbiB1cGdyYWRlICh0aGVcbiAgLy8gYWNjb3VudCdzIG5ldyB0aWVyIG5vdyBidW5kbGVzIHRoZSBmZWF0dXJlKSDigJQgZGlzdGluY3QgZnJvbSBhIHVzZXItaW5pdGlhdGVkXG4gIC8vIGByZW1vdmVgIHNvIGZpbmFuY2UgY2FuIHRlbGwgYW4gYXV0by1wcnVuZSBmcm9tIGEgY3VzdG9tZXIgYWN0aW9uLlxuICAnYmlsbGluZy5hZGRvbi5wcnVuZScsXG4gIC8vIERlbmllZCBhdXRob3JpemF0aW9uIGF0dGVtcHQg4oCUIGVtaXR0ZWQgYmVzdC1lZmZvcnQgYnkgdGhlIHNoYXJlZFxuICAvLyBgcmVxdWlyZVBlcm1pc3Npb25gIC8gYHJlcXVpcmVTeXN0ZW1BZG1pbmAgZ2F0ZSB3aGVuIGEgc3RhdGUtY2hhbmdpbmdcbiAgLy8gKG5vbi1HRVQpIHJlcXVlc3QgaXMgcmVqZWN0ZWQsIHNvIHByb2JpbmcvZXNjYWxhdGlvbiBhdHRlbXB0cyBhcmUgdmlzaWJsZVxuICAvLyByYXRoZXIgdGhhbiBpbnZpc2libGUuIGBkZXRhaWxzYCBjYXJyaWVzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uICsgcGF0aDtcbiAgLy8gYG91dGNvbWVgIGlzICdmYWlsdXJlJy5cbiAgJ2F1dGh6LmRlbmllZCcsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbiA9IHR5cGVvZiBSRU1PVEVfQVVESVRfQUNUSU9OU1tudW1iZXJdO1xuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIGFjdGlvbiBhIHJlbW90ZSBzZXJ2aWNlIG1heSBlbWl0ICh0aGUgaW5nZXN0IGFsbG93LWxpc3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVtb3RlQXVkaXRBY3Rpb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFJlbW90ZUF1ZGl0QWN0aW9uIHtcbiAgcmV0dXJuIChSRU1PVEVfQVVESVRfQUNUSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0RXZlbnQge1xuICBhY3Rpb246IFJlbW90ZUF1ZGl0QWN0aW9uO1xuICBhY3RvcklkOiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIG9yZ0lkPzogc3RyaW5nO1xuICBhZmZlY3RlZE9yZ0lkPzogc3RyaW5nO1xuICB0YXJnZXRUeXBlPzogc3RyaW5nO1xuICB0YXJnZXRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpZCB0aGUgYXVkaXRlZCBhY3Rpb24gc3VjY2VlZCBvciBmYWlsPyBEZWZhdWx0cyB0byAnc3VjY2Vzcycgd2hlbiBvbWl0dGVkXG4gICAqICh0aGUgcGxhdGZvcm0gaW5nZXN0IGFwcGxpZXMgdGhlIHNhbWUgZGVmYXVsdCkuIERlbmllZC1hdXRoeiBldmVudHMgc2V0XG4gICAqICdmYWlsdXJlJyBzbyBhIHJldmlld2VyIGNhbiBmaWx0ZXIgYXR0ZW1wdHMgZnJvbSBjb21wbGV0ZWQgYWN0aW9ucy5cbiAgICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBhdWRpdGVkIGFjdGlvbiBhY3R1YWxseSBPQ0NVUlJFRCAoSVNPLTg2MDEpLCBzdGFtcGVkIGF0IGVtaXNzaW9uLlxuICAgKiBUaGUgcGxhdGZvcm0gc3RvcmVzIHRoaXMgZm9yIHJldmlld2VyczsgaXQgaXMgTk9UIHRoZSBjaGFpbi1vcmRlcmluZyBmaWVsZFxuICAgKiAodGhlIHRhbXBlci1ldmlkZW50IGNoYWluIG9yZGVycyBieSBpbmdlc3QvYGNyZWF0ZWRBdGApLiBJdCBtYXR0ZXJzIGZvclxuICAgKiBTUE9PTEVEIGV2ZW50czogb25lIGJ1ZmZlcmVkIGR1cmluZyBhIHBsYXRmb3JtIG91dGFnZSBpcyByZS1kZWxpdmVyZWQg4oCUIGFuZFxuICAgKiBzbyBjaGFpbmVkIOKAlCBsYXRlciwgYnV0IGBvY2N1cnJlZEF0YCBwcmVzZXJ2ZXMgd2hlbiBpdCByZWFsbHkgaGFwcGVuZWQuXG4gICAqL1xuICBvY2N1cnJlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlIHBlci1lbWlzc2lvbiBkZWR1cCBrZXkgKGFsc28gc2VudCBhcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyIHRoZVxuICAgKiBwbGF0Zm9ybSBpbmdlc3QgZGVkdXBzIG9uKS4gU3RhbXBlZCBieSBgcmVjb3JkKClgIGFuZCBjYXJyaWVkIG9uIHRoZSBzcG9vbGVkXG4gICAqIGNvcHkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBsYXRlciByZS1kZWxpdmVyeSBjb2xsYXBzZSB0byBPTkUgc3RvcmVkIHJvdy5cbiAgICovXG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uIFdoZW4gYSB7QGxpbmsgQXVkaXRTcG9vbH0gaXMgY29uZmlndXJlZCwgYW4gZW1pc3Npb24gdGhhdFxuICAgKiBleGhhdXN0cyBpdHMgbGl2ZSByZXRyaWVzIGlzIGJ1ZmZlcmVkIGFuZCByZS1kZWxpdmVyZWQgbGF0ZXIgaW5zdGVhZCBvZlxuICAgKiBiZWluZyBkcm9wcGVkLlxuICAgKi9cbiAgcmVjb3JkKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIGJhY2tncm91bmQgc3Bvb2wtZHJhaW4gdGltZXIgKGlmIGFueSkuIFNhZmUgdG8gY2FsbCByZXBlYXRlZGx5LiAqL1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgZHVyYWJsZSBidWZmZXIuIFdoZW4gc2V0LCBhbiBlbWlzc2lvbiB0aGF0IGV4aGF1c3RzIGl0cyBsaXZlIHJldHJ5XG4gICAqIGJ1ZGdldCAoc3VzdGFpbmVkIHBsYXRmb3JtIG91dGFnZSkgaXMgc3Bvb2xlZCBhbmQgcmUtZGVsaXZlcmVkIOKAlCBvbiB0aGUgbmV4dFxuICAgKiBzdWNjZXNzZnVsIGVtaXNzaW9uIGFuZCBvbiBhIHBlcmlvZGljIHRpbWVyIOKAlCBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAqL1xuICBzcG9vbD86IEF1ZGl0U3Bvb2w7XG4gIC8qKiBTcG9vbC1kcmFpbiBpbnRlcnZhbCBtcyAoZGVmYXVsdCAzMF8wMDApLiBPbmx5IHVzZWQgd2hlbiBgc3Bvb2xgIGlzIHNldC4gKi9cbiAgZHJhaW5JbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZHJhaW5lZCBwZXIgc3dlZXAgKGRlZmF1bHQgMTAwKS4gKi9cbiAgZHJhaW5CYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcmVtb3RlLWF1ZGl0IGNsaWVudCB0YXJnZXRlZCBhdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBVc2VkIGJ5IGFwaS9wbHVnaW4ncyBidWlsZCB3b3JrZXIgdG8gcHVzaCBgcGx1Z2luLmJ1aWxkLipgIGV2ZW50cyBpbnRvXG4gKiB0aGUgcGxhdGZvcm0ncyBNb25nb0RCIGBhdWRpdF9ldmVudHNgIGNvbGxlY3Rpb24uIE90aGVyIHNlcnZpY2VzXG4gKiB3aXRoIHdvcmtlci1zdHlsZSBlbWl0dGVycyBjYW4gdXNlIHRoZSBzYW1lIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCgpO1xuICogYXVkaXRDbGllbnQucmVjb3JkKHtcbiAqIGFjdGlvbjogJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnLFxuICogYWN0b3JJZDogJ3VzZXItMTIzJyxcbiAqIG9yZ0lkOiAnb3JnLWFjbWUnLFxuICogdGFyZ2V0VHlwZTogJ3BsdWdpbicsXG4gKiB0YXJnZXRJZDogJ3BsdWdpbi1hYmMnLFxuICogZGV0YWlsczogeyBuYW1lOiAnbXktcGx1Z2luJywgdmVyc2lvbjogJzEuMC4wJyB9LFxuICogfSwgJ3BsdWdpbicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdENsaWVudChjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBSZW1vdGVBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9IT1NUID8/ICdwbGF0Zm9ybScsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IDMwMDAsXG4gIH07XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNhZmVDbGllbnQoc2VydmljZUNvbmZpZyk7XG4gIGNvbnN0IHNwb29sID0gY29uZmlnLnNwb29sO1xuICBjb25zdCBkcmFpbkJhdGNoU2l6ZSA9IGNvbmZpZy5kcmFpbkJhdGNoU2l6ZSA/PyAxMDA7XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgT05FIGxpdmUgZGVsaXZlcnkuIFJlc29sdmVzIGB0cnVlYCBvbiBhIDJ4eCBhY2NlcHQsIGBmYWxzZWAgb24gYW55XG4gICAqIG5vbi0yeHggLyB0aHJvd24gZXJyb3IgKHRoZSBodHRwLWNsaWVudCBoYXMgYWxyZWFkeSBhcHBsaWVkIHRoZSByZXRyeVxuICAgKiBidWRnZXQpLiBBIHN0YWJsZSBwZXItZW1pc3Npb24gYElkZW1wb3RlbmN5LUtleWAgbWFrZXMgdGhpcyBub24taWRlbXBvdGVudFxuICAgKiBQT1NUIHJldHJ5LXNhZmUgYW5kIGxldHMgdGhlIHBsYXRmb3JtIGluZ2VzdCBkZWR1cCBhIHJlLWRlbGl2ZXJlZCBldmVudFxuICAgKiBpbnN0ZWFkIG9mIHdyaXRpbmcgYSBkdXBsaWNhdGUgYXVkaXQgcm93IChhbmQgZHVwbGljYXRlIGNoYWluIGxpbmspLlxuICAgKiBgSWRlbXBvdGVuY3ktS2V5YCBpcyBkZXJpdmVkIGZyb20gdGhlIGV2ZW50IHNvIGEgU1BPT0xFRCByZS1kZWxpdmVyeSByZXVzZXNcbiAgICogdGhlIHNhbWUga2V5IGFzIGl0cyBvcmlnaW5hbCBsaXZlIGF0dGVtcHQg4oCUIHRoZSB0d28gY29sbGFwc2UgdG8gb25lIHJvdy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGl2ZXIoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdXRoSGVhZGVyID0gZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgb3JnSWQ6IGV2ZW50Lm9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ0F1dGhvcml6YXRpb24nOiBhdXRoSGVhZGVyLFxuICAgICAgJ0lkZW1wb3RlbmN5LUtleSc6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KCcvYXVkaXQvZXZlbnRzJywgZXZlbnQsIHsgaGVhZGVycywgLi4uQVVESVRfUkVRVUVTVF9PUFRJT05TIH0pO1xuICAgICAgY29uc3Qgb2sgPSAhIXJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDA7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IG5vbi1vaycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3QgdGhyZXcnLCB7IGFjdGlvbjogZXZlbnQuYWN0aW9uLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZSBzcG9vbCBkcmFpbnMgc28gYSBwZXJpb2RpYyB0aWNrIGFuZCBhbiBvbi1zdWNjZXNzIGRyYWluIGNhbid0IGJvdGhcbiAgLy8gcHVsbCB0aGUgc2FtZSBiYXRjaC4gU3RvcHMgZWFybHkgdGhlIG1vbWVudCBhIHJlLWRlbGl2ZXJ5IGZhaWxzIChwbGF0Zm9ybVxuICAvLyBzdGlsbCBkb3duKSBzbyB3ZSBkb24ndCBoYW1tZXIgaXQgb3IgY2h1cm4gdGhlIGJ1ZmZlci5cbiAgbGV0IGRyYWluaW5nID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIGRyYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc3Bvb2wgfHwgZHJhaW5pbmcpIHJldHVybjtcbiAgICBkcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBhd2FpdCBzcG9vbC50YWtlKGRyYWluQmF0Y2hTaXplKTtcbiAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBmYWlsZWQ6IEF1ZGl0U3Bvb2xFbnRyeVtdID0gW107XG4gICAgICAgIGxldCBwbGF0Zm9ybURvd24gPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBiYXRjaCkge1xuICAgICAgICAgIGlmIChwbGF0Zm9ybURvd24pIHsgZmFpbGVkLnB1c2goZW50cnkpOyBjb250aW51ZTsgfVxuICAgICAgICAgIGNvbnN0IG9rID0gYXdhaXQgZGVsaXZlcihlbnRyeS5ldmVudCwgZW50cnkuc2VydmljZU5hbWUpO1xuICAgICAgICAgIGlmIChvaykge1xuICAgICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX3JlZGVsaXZlcmVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGxhdGZvcm1Eb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGZhaWxlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgc3Bvb2wucmVxdWV1ZShmYWlsZWQpO1xuICAgICAgICAgIHJldHVybjsgLy8gc3RpbGwgZG93biDigJQgdHJ5IGFnYWluIG9uIHRoZSBuZXh0IHRpY2tcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIGRyYWluIGZhaWxlZCcsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBsZXQgZHJhaW5UaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgdW5kZWZpbmVkO1xuICBpZiAoc3Bvb2wpIHtcbiAgICBkcmFpblRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB2b2lkIGRyYWluKCk7IH0sIGNvbmZpZy5kcmFpbkludGVydmFsTXMgPz8gMzBfMDAwKTtcbiAgICAvLyBEb24ndCBsZXQgdGhlIGRyYWluIHRpbWVyIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgb24gc2h1dGRvd24uXG4gICAgKGRyYWluVGltZXIgYXMgdW5rbm93biBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlY29yZChldmVudCwgc2VydmljZU5hbWUpIHtcbiAgICAgIC8vIFN0YW1wIHdoZW4gdGhlIGFjdGlvbiBhY3R1YWxseSBvY2N1cnJlZCAoc3Vydml2ZXMgc3Bvb2wgZGVsYXkpIGFuZCBwaW4gYVxuICAgICAgLy8gc3RhYmxlIGlkZW1wb3RlbmN5IGtleSBzbyBhIGxpdmUgYXR0ZW1wdCBhbmQgaXRzIHNwb29sZWQgcmV0cnkgZGVkdXAuXG4gICAgICBjb25zdCBzdGFtcGVkOiBSZW1vdGVBdWRpdEV2ZW50ID0ge1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgb2NjdXJyZWRBdDogZXZlbnQub2NjdXJyZWRBdCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGlkZW1wb3RlbmN5S2V5OiBldmVudC5pZGVtcG90ZW5jeUtleSA/PyByYW5kb21VVUlEKCksXG4gICAgICB9O1xuICAgICAgdm9pZCBkZWxpdmVyKHN0YW1wZWQsIHNlcnZpY2VOYW1lKS50aGVuKChvaykgPT4ge1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfZW1pdHRlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUsIG91dGNvbWU6IHN0YW1wZWQub3V0Y29tZSA/PyAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgaWYgKHNwb29sKSB2b2lkIGRyYWluKCk7IC8vIHBsYXRmb3JtIGlzIHJlYWNoYWJsZSDigJQgZmx1c2ggYW55IGJhY2tsb2dcbiAgICAgICAgfSBlbHNlIGlmIChzcG9vbCkge1xuICAgICAgICAgIHZvaWQgc3Bvb2wuZW5xdWV1ZSh7IGV2ZW50OiBzdGFtcGVkLCBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfZHJvcHBlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICBpZiAoZHJhaW5UaW1lcikgeyBjbGVhckludGVydmFsKGRyYWluVGltZXIpOyBkcmFpblRpbWVyID0gdW5kZWZpbmVkOyB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgc3RhbmRhcmQgYGF1dGh6LmRlbmllZGAgc2luayB1c2VkIGJ5IGV2ZXJ5IHJlbW90ZS1hdWRpdCBzZXJ2aWNlXG4gKiAocGlwZWxpbmUsIHBsdWdpbiwgY29tcGxpYW5jZSwgcXVvdGEsIG1lc3NhZ2UsIGJpbGxpbmcsIHJlcG9ydGluZywg4oCmKS5cbiAqXG4gKiBUaGUgc2hhcmVkIGByZXF1aXJlQXV0aGAgZ2F0ZSBmb3J3YXJkcyBlYWNoIERFTklFRCBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0IHRvXG4gKiB0aGUgYXVkaXRvciBzZXQgdmlhIHtAbGluayBzZXRBdXRoekRlbmlhbEF1ZGl0b3J9OyB0aGlzIHdpcmVzIHRoYXQgaG9vayB0byB0aGVcbiAqIHNlcnZpY2UncyB7QGxpbmsgUmVtb3RlQXVkaXRDbGllbnR9LCBmb3J3YXJkaW5nIGEgYGZhaWx1cmVgLW91dGNvbWVcbiAqIGBhdXRoei5kZW5pZWRgIGV2ZW50IHNvIHByb2JpbmcgLyBwcml2aWxlZ2UtZXNjYWxhdGlvbiBhdHRlbXB0cyBsZWF2ZSBhIHRyYWlsLlxuICogRW1pc3Npb24gaXMgZmlyZS1hbmQtZm9yZ2V0ICh0aGUgY2xpZW50IG5ldmVyIHRocm93cykuIGBnZXRDbGllbnRgIGlzIGEgZ2V0dGVyXG4gKiBzbyB0aGUgY2xpZW50IHN0YXlzIGxhemlseSBjb25zdHJ1Y3RlZCAoc2VydmljZXMgbWVtb2l6ZSBpdCBvbiBmaXJzdCB1c2UpLlxuICpcbiAqIFBsYXRmb3JtIGlzIGludGVudGlvbmFsbHkgTk9UIGEgY2FsbGVyIOKAlCBpdCBpcyB0aGUgYXVkaXQgYXV0aG9yaXR5IGFuZCB3cml0ZXNcbiAqIGBhdXRoei5kZW5pZWRgIHN0cmFpZ2h0IHRvIGl0cyBsb2NhbCBzdG9yZSAod2l0aCBgYWZmZWN0ZWRPcmdJZGApLCBub3QgdGhyb3VnaFxuICogYSBSZW1vdGVBdWRpdENsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWU6IHN0cmluZywgZ2V0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudCk6IHZvaWQge1xuICBzZXRBdXRoekRlbmlhbEF1ZGl0b3IoKGluZm86IEF1dGh6RGVuaWFsSW5mbykgPT4gZ2V0Q2xpZW50KCkucmVjb3JkKHtcbiAgICBhY3Rpb246ICdhdXRoei5kZW5pZWQnLFxuICAgIGFjdG9ySWQ6IGluZm8uYWN0b3JJZCA/PyAnYW5vbnltb3VzJyxcbiAgICBhY3RvckVtYWlsOiBpbmZvLmFjdG9yRW1haWwsXG4gICAgb3JnSWQ6IGluZm8ub3JnSWQsXG4gICAgb3V0Y29tZTogJ2ZhaWx1cmUnLFxuICAgIGRldGFpbHM6IHsgbWV0aG9kOiBpbmZvLm1ldGhvZCwgcGF0aDogaW5mby5wYXRoLCByZXF1aXJlZDogaW5mby5yZXF1aXJlZCB9LFxuICB9LCBzZXJ2aWNlTmFtZSkpO1xufVxuXG4vKipcbiAqIEEgc2VydmljZS1zY29wZWQgYXVkaXQgY2xpZW50OiBhIGR1cmFibGUtc3Bvb2wtYmFja2VkIHtAbGluayBSZW1vdGVBdWRpdENsaWVudH1cbiAqIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBwcmUtYm91bmQgZm9yIGVtaXNzaW9uLiBSZXBsYWNlcyB0aGUgcGVyLXNlcnZpY2VcbiAqIGJvaWxlcnBsYXRlIG9mIGBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCh7IHNwb29sOiBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2woKSA/PyB1bmRlZmluZWQgfSlgXG4gKiBwbHVzIGEgaGFuZC1yb2xsZWQgYGVtaXQ8U2VydmljZT5BdWRpdGAgd3JhcHBlciB0aGF0IHJlcGVhdHMgdGhlIHNlcnZpY2UgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlQXVkaXRDbGllbnQge1xuICAvKiogRW1pdCBhbiBhdWRpdCBldmVudCB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgYm91bmQuIEZpcmUtYW5kLWZvcmdldC4gKi9cbiAgZW1pdChldmVudDogUmVtb3RlQXVkaXRFdmVudCk6IHZvaWQ7XG4gIC8qKiBUaGUgdW5kZXJseWluZyByZW1vdGUgY2xpZW50IOKAlCBmb3IgYHdpcmVBdXRoekRlbmlhbEF1ZGl0b3JgICsgYGNsb3NlKClgLiAqL1xuICByZWFkb25seSBjbGllbnQ6IFJlbW90ZUF1ZGl0Q2xpZW50O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgc2VydmljZSdzIGF1ZGl0IGNsaWVudDogYSBSZW1vdGVBdWRpdENsaWVudCB3aXJlZCB0byB0aGUgZHVyYWJsZSBSZWRpc1xuICogc3Bvb2wgKGZyb20gYW1iaWVudCBlbnY7IG51bGwg4oaSIG5vIHNwb29sKSB3aXRoIGBzZXJ2aWNlTmFtZWAgYm91bmQuIENvbnN0cnVjdFxuICogT05DRSBwZXIgcHJvY2VzcyDigJQgbWVtb2l6ZSBiZWhpbmQgYSBsYXp5IGBnZXRBdWRpdENsaWVudCgpYCBpbiB0aGUgc2VydmljZSdzXG4gKiBgc2VydmljZXMvYXVkaXQudHNgLiBQYXNzIGBjb25maWcuc3Bvb2xgIHRvIG92ZXJyaWRlIHRoZSBlbnYtZGVyaXZlZCBzcG9vbFxuICogKGUuZy4gcmV1c2UgYSBzZXJ2aWNlJ3MgZXhpc3RpbmcgaW9yZWRpcyBjb25uZWN0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VBdWRpdENsaWVudChzZXJ2aWNlTmFtZTogc3RyaW5nLCBjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBTZXJ2aWNlQXVkaXRDbGllbnQge1xuICBjb25zdCBzcG9vbCA9IGNvbmZpZy5zcG9vbCA/PyBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2woKSA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHsgLi4uY29uZmlnLCBzcG9vbCB9KTtcbiAgcmV0dXJuIHtcbiAgICBlbWl0OiAoZXZlbnQpID0+IGNsaWVudC5yZWNvcmQoZXZlbnQsIHNlcnZpY2VOYW1lKSxcbiAgICBjbGllbnQsXG4gIH07XG59XG4iXX0=
310
+ /**
311
+ * Lazily-constructed remote-audit accessor for a service. Every service's
312
+ * `services/audit.ts` used to hand-roll the same module singleton (a `let audit`
313
+ * + `svc()` that builds a {@link ServiceAuditClient} on first use, then a
314
+ * `getAuditClient()` returning `.client` and an `emit(event)` forwarding to
315
+ * `.emit`). This packages that pattern in ONE place so each service's audit
316
+ * wiring is a one-liner and can't drift.
317
+ *
318
+ * Lazy on purpose: the underlying client wires an env-Redis audit spool, so
319
+ * building it at import time would force that connection wherever the module is
320
+ * merely imported (e.g. tests). `getAuditClient` is passed to
321
+ * `wireAuthzDenialAuditor`; `emit` backs the per-service `emitXAudit` helpers.
322
+ * Both stay FIRE-AND-FORGET (record never throws / is not awaited).
323
+ */
324
+ export function createRemoteAuditAccessor(serviceName) {
325
+ let audit = null;
326
+ const svc = () => {
327
+ if (!audit)
328
+ audit = createServiceAuditClient(serviceName);
329
+ return audit;
330
+ };
331
+ return {
332
+ getAuditClient: () => svc().client,
333
+ emit: (event) => svc().emit(event),
334
+ };
335
+ }
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsMEJBQTBCO0lB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Q0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO1FBQ2xELE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsV0FBbUI7SUFJM0QsSUFBSSxLQUFLLEdBQThCLElBQUksQ0FBQztJQUM1QyxNQUFNLEdBQUcsR0FBRyxHQUF1QixFQUFFO1FBQ25DLElBQUksQ0FBQyxLQUFLO1lBQUUsS0FBSyxHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsT0FBTztRQUNMLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNO1FBQ2xDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sLCB0eXBlIEF1ZGl0U3Bvb2xFbnRyeSB9IGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIsIHNldEF1dGh6RGVuaWFsQXVkaXRvciwgdHlwZSBBdXRoekRlbmlhbEluZm8gfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZW1vdGUtYXVkaXQnKTtcblxuLyoqXG4gKiBBdWRpdCBpbmdlc3QgaXMgYmVzdC1lZmZvcnQgYW5kIE1VU1QgTk9UIGJsb2NrIHRoZSBjYWxsZXIsIGJ1dCBhIHRyYW5zaWVudFxuICogZmFpbHVyZSAoNDI5IC8gNXh4IC8gY29ubmVjdGlvbiByZXNldCAvIHRpbWVvdXQpIHNob3VsZCBub3Qgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJvdyBvbiB0aGUgZmlyc3QgYXR0ZW1wdC4gRWFjaCBlbWlzc2lvbiBjYXJyaWVzIGEgc3RhYmxlIHBlci1ldmVudFxuICogYElkZW1wb3RlbmN5LUtleWAgKHNlZSBgcmVjb3JkYCksIHNvIHRoZSBodHRwLWNsaWVudCB0cmVhdHMgdGhlIFBPU1QgYXNcbiAqIHJldHJ5LXNhZmUgYW5kIHRoZSBwbGF0Zm9ybSBjYW4gZGVkdXAgYSByZXRyaWVkIGRlbGl2ZXJ5IGluc3RlYWQgb2Ygd3JpdGluZyBhXG4gKiBkdXBsaWNhdGUgcm93LiBCdWRnZXQgaXMga2VwdCBzbWFsbCBzbyBhIGhhcmQtZG93biBwbGF0Zm9ybSBjYW4ndCBiYWNrIHRoZVxuICogd29ya2VyIHVwIGZvciBsb25nOiBiYXNlIGRlbGF5IMOXKDIgcmV0cmllcykgKyBhIGNvdXBsZSBvZiA0MjkgYmFja29mZnMuXG4gKi9cbmNvbnN0IEFVRElUX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMixcbiAgbWF4UmV0cmllczogMixcbn07XG5cbi8qKlxuICogVGhlIGV4YWN0IHNldCBvZiBhdWRpdCBhY3Rpb25zIGEgTk9OLVBMQVRGT1JNIChyZW1vdGUpIHNlcnZpY2UgaXMgcGVybWl0dGVkIHRvXG4gKiBlbWl0IHRocm91Z2ggYFBPU1QgL2F1ZGl0L2V2ZW50c2AuIFRoaXMgaXMgdGhlIFNJTkdMRSBTT1VSQ0Ug4oCUIGBSZW1vdGVBdWRpdEFjdGlvbmBcbiAqIGlzIGRlcml2ZWQgZnJvbSBpdCwgc28gdGhlIHR5cGUgYW5kIHRoZSBydW50aW1lIGFsbG93LWxpc3QgY2FuIG5ldmVyIGRyaWZ0LlxuICpcbiAqIFNFQ1VSSVRZOiBwbGF0Zm9ybSdzIGluZ2VzdCB2YWxpZGF0ZXMgYGFjdGlvbmAgYWdhaW5zdCB0aGlzIHN1YnNldCAodmlhXG4gKiB7QGxpbmsgaXNSZW1vdGVBdWRpdEFjdGlvbn0pLCBOT1QgdGhlIGZ1bGwgcGxhdGZvcm0gYEF1ZGl0QWN0aW9uYCB1bmlvbiDigJQgYVxuICogYHNlcnZpY2U6KmAgdG9rZW4gbXVzdCBub3QgYmUgYWJsZSB0byBmb3JnZSBwbGF0Zm9ybS1hdXRob3JpdHkgZXZlbnRzXG4gKiAoYGFkbWluLnN1cGVyYWRtaW4uZ3JhbnRgLCBgb3JnLm93bmVyc2hpcC50cmFuc2ZlcmAsIGB1c2VyLmxvZ2luYCwg4oCmKS4gS2VlcFxuICogdGhpcyBsaXN0IGZyZWUgb2YgYW55IHBsYXRmb3JtLW9ubHkgYWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVNT1RFX0FVRElUX0FDVElPTlMgPSBbXG4gICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAgJ3BsdWdpbi5idWlsZC5mYWlsZWQnLFxuICAncGx1Z2luLmJ1aWxkLnRpbWVvdXQnLFxuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gICdwbHVnaW4uZGVsZXRlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBQaXBlbGluZSBtdXRhdGlvbnMg4oCUIGVtaXR0ZWQgYnkgYXBpL3BpcGVsaW5lJ3Mgcm91dGUgaGFuZGxlcnNcbiAgLy8gKGNyZWF0ZS91cGRhdGUvZGVsZXRlICsgQ29kZVBpcGVsaW5lIGV4ZWN1dGlvbiB0cmlnZ2VyL2NhbmNlbCkgYW5kXG4gIC8vIHBvc3RlZCB0byBwbGF0Zm9ybSdzIGBQT1NUIC9hdWRpdC9ldmVudHNgIGluZ2VzdC5cbiAgJ3BpcGVsaW5lLmNyZWF0ZScsXG4gICdwaXBlbGluZS51cGRhdGUnLFxuICAncGlwZWxpbmUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5zdGFydCcsXG4gICdwaXBlbGluZS5leGVjdXRpb24uY2FuY2VsJyxcbiAgLy8gQ29kZVBpcGVsaW5lIEFSTi1yZWdpc3RyeSBjb25maWcgKGFwaS9waXBlbGluZSByZWdpc3RyeSByb3V0ZSkg4oCUIHJlZ2lzdGVyaW5nIC9cbiAgLy8gZGVyZWdpc3RlcmluZyB0aGUgZXh0ZXJuYWwgQ29kZVBpcGVsaW5lIHRoYXQgYmFja3MgYSBwaXBlbGluZSAoZGVwbG95LWFmZmVjdGluZykuXG4gICdwaXBlbGluZS5yZWdpc3RyeS5yZWdpc3RlcicsXG4gICdwaXBlbGluZS5yZWdpc3RyeS5kZXJlZ2lzdGVyJyxcbiAgLy8gUXVvdGEgYWRtaW5pc3RyYXRpb24gKGFwaS9xdW90YSkg4oCUIGEgc3VwZXJhZG1pbiByZXNldHRpbmcgYW4gb3JnJ3MgdXNhZ2VcbiAgLy8gY291bnRlciBvciBlZGl0aW5nIGl0cyB0aWVyIGxpbWl0cy4gYGFmZmVjdGVkT3JnSWRgIGlzIHRoZSBvcmcgY2hhbmdlZDtcbiAgLy8gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHF1b3RhVHlwZSArIG9sZC9uZXcgdmFsdWUuXG4gICdxdW90YS5yZXNldCcsXG4gICdxdW90YS5saW1pdC51cGRhdGUnLFxuICAvLyBBIHN1cGVyYWRtaW4gZGVsZXRpbmcgYW4gb3JnJ3MgZW50aXJlIHF1b3RhIGRvY3VtZW50LlxuICAncXVvdGEuZGVsZXRlJyxcbiAgLy8gQ29tcGxpYW5jZSBhZG1pbmlzdHJhdGlvbiAoYXBpL2NvbXBsaWFuY2UpIOKAlCB0aGUgZW5mb3JjZW1lbnQtcG9zdHVyZSBzdXJmYWNlLlxuICAvLyBBcHByb3ZpbmcvcmV2b2tpbmcgYW4gZXhlbXB0aW9uLCB0b2dnbGluZy9hdXRob3JpbmcvZGVsZXRpbmcgYSBydWxlLFxuICAvLyBhdXRob3JpbmcvZGVsZXRpbmcgYSBwb2xpY3ksIG1hbmFnaW5nIHNjYW4gc2NoZWR1bGVzLCBhcHBseWluZyBhIHRlbXBsYXRlLFxuICAvLyBvciBjYW5jZWxsaW5nIGEgcnVubmluZyBzY2FuLiBgdGFyZ2V0SWRgIGlzIHRoZSBydWxlL3BvbGljeS9leGVtcHRpb24vc2NhbiBpZC5cbiAgJ2NvbXBsaWFuY2UuZXhlbXB0aW9uLmFwcHJvdmUnLFxuICAnY29tcGxpYW5jZS5leGVtcHRpb24ucmV2b2tlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS50b2dnbGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kuY3JlYXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLmNyZWF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5kZWxldGUnLFxuICAnY29tcGxpYW5jZS50ZW1wbGF0ZS5hcHBseScsXG4gICdjb21wbGlhbmNlLnNjYW4uY2FuY2VsJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcyAocHJldmlvdXNseSBvbmx5IGEgbG9nIGxpbmUpLlxuICAncmVnaXN0cnkuZ2MnLFxuICAncmVnaXN0cnkuaW1hZ2UuZGVsZXRlJyxcbiAgLy8gTWVzc2FnaW5nIChhcGkvbWVzc2FnZSkg4oCUIGFkbWluIEJST0FEQ0FTVCBhbm5vdW5jZW1lbnRzICsgZGVzdHJ1Y3RpdmVcbiAgLy8gZGVsZXRlcy4gMToxIHVzZXIgbWVzc2FnZXMgYXJlIGludGVudGlvbmFsbHkgTk9UIGF1ZGl0ZWQgKG5vaXNlICsgdGhleSB3b3VsZFxuICAvLyBwdWxsIHByaXZhdGUgY29udGVudCBpbnRvIHRoZSB0cmFpbCkuIGBkZXRhaWxzYCBjYXJyeSBtZXRhZGF0YSBvbmx5XG4gIC8vIChzdWJqZWN0L3R5cGUvc2NvcGUpLCBORVZFUiBtZXNzYWdlIGJvZHkgY29udGVudC5cbiAgJ21lc3NhZ2UuYW5ub3VuY2VtZW50LmNyZWF0ZScsXG4gICdtZXNzYWdlLmRlbGV0ZScsXG4gIC8vIEJpbGxpbmcgKGFwaS9iaWxsaW5nKSDigJQgc3Vic2NyaXB0aW9uICsgZW50aXRsZW1lbnQgbXV0YXRpb25zLCBtaXJyb3JlZCB0byB0aGVcbiAgLy8gY2VudHJhbCBhdWRpdCB0cmFpbCAodGhlc2UgYWxzbyB3cml0ZSB0byB0aGUgc2VydmljZS1sb2NhbCBiaWxsaW5nX2V2ZW50c1xuICAvLyBjb2xsZWN0aW9uKS4gYGRldGFpbHNgIGNhcnJ5IHBsYW4vdGllci9hZGRvbiBpZHMgb25seSDigJQgbmV2ZXIgY2FyZC9wYXltZW50XG4gIC8vIHNlY3JldHMgb3IgYW4gQVdTIGFjY291bnQgaWQuXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5jYW5jZWwnLFxuICAnYmlsbGluZy5zdWJzY3JpcHRpb24uZGVsZXRlJyxcbiAgJ2JpbGxpbmcudGllci5vdmVycmlkZScsXG4gICdiaWxsaW5nLmFkZG9uLmFkZCcsXG4gICdiaWxsaW5nLmFkZG9uLnJlbW92ZScsXG4gIC8vIFN5c3RlbS1pbml0aWF0ZWQgcmVtb3ZhbCBvZiBhIHRpZXItaW5jbHVkZWQgYWRkLW9uIG9uIGEgcGxhbiB1cGdyYWRlICh0aGVcbiAgLy8gYWNjb3VudCdzIG5ldyB0aWVyIG5vdyBidW5kbGVzIHRoZSBmZWF0dXJlKSDigJQgZGlzdGluY3QgZnJvbSBhIHVzZXItaW5pdGlhdGVkXG4gIC8vIGByZW1vdmVgIHNvIGZpbmFuY2UgY2FuIHRlbGwgYW4gYXV0by1wcnVuZSBmcm9tIGEgY3VzdG9tZXIgYWN0aW9uLlxuICAnYmlsbGluZy5hZGRvbi5wcnVuZScsXG4gIC8vIERpc2NvdW50cyAoZG9jcy9iaWxsaW5nLWRpc2NvdW50cy5tZCkg4oCUIG1pbnQvaXNzdWUvYXBwbHkvcmVtb3ZlL3Jldm9rZSBvZiBhXG4gIC8vIHByaWNlIGNvdXBvbiBvciB1c2FnZSBjcmVkaXQuIGBkZXRhaWxzYCBjYXJyeSB0aGUgZGlzY291bnQgaWQgKyBraW5kL3ZhbHVlXG4gIC8vIG9ubHksIG5ldmVyIHRoZSBvcGFxdWUgdG9rZW4gb3Igc2lnbmluZyBrZXkuXG4gICdiaWxsaW5nLmRpc2NvdW50LmdlbmVyYXRlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQuaXNzdWUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5hcHBseScsXG4gICdiaWxsaW5nLmRpc2NvdW50LnJlbW92ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50LnJldm9rZScsXG4gIC8vIFVzYWdlLWNyZWRpdCByZWFsaXphdGlvbiDigJQgYSBjdXN0b21lci9jb21wbGlhbmNlLXZpc2libGUgcmVjb3JkIG9mIGNyZWRpdFxuICAvLyBtb3ZlbWVudDogYGNvbnN1bWVkYCAoTWFya2V0cGxhY2UgbWV0ZXJlZCBkcmF3ZG93biksIGBleGhhdXN0ZWRgIChiYWxhbmNlIGhpdFxuICAvLyB6ZXJvKSwgYW5kIGEgY29tYm8gZW5kaW5nLiBgZGV0YWlsc2AgY2FycnkgY2VudHMvaWRzIG9ubHksIG5vIHBheW1lbnQgc2VjcmV0cy5cbiAgJ2JpbGxpbmcuY3JlZGl0LmNvbnN1bWVkJyxcbiAgJ2JpbGxpbmcuY3JlZGl0LmV4aGF1c3RlZCcsXG4gICdiaWxsaW5nLmNvbWJvLmV4cGlyZWQnLFxuICAvLyBEZW5pZWQgYXV0aG9yaXphdGlvbiBhdHRlbXB0IOKAlCBlbWl0dGVkIGJlc3QtZWZmb3J0IGJ5IHRoZSBzaGFyZWRcbiAgLy8gYHJlcXVpcmVQZXJtaXNzaW9uYCAvIGByZXF1aXJlU3lzdGVtQWRtaW5gIGdhdGUgd2hlbiBhIHN0YXRlLWNoYW5naW5nXG4gIC8vIChub24tR0VUKSByZXF1ZXN0IGlzIHJlamVjdGVkLCBzbyBwcm9iaW5nL2VzY2FsYXRpb24gYXR0ZW1wdHMgYXJlIHZpc2libGVcbiAgLy8gcmF0aGVyIHRoYW4gaW52aXNpYmxlLiBgZGV0YWlsc2AgY2FycmllcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiArIHBhdGg7XG4gIC8vIGBvdXRjb21lYCBpcyAnZmFpbHVyZScuXG4gICdhdXRoei5kZW5pZWQnLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUmVtb3RlQXVkaXRBY3Rpb24gPSB0eXBlb2YgUkVNT1RFX0FVRElUX0FDVElPTlNbbnVtYmVyXTtcblxuLyoqIFdoZXRoZXIgYHZhbHVlYCBpcyBhbiBhY3Rpb24gYSByZW1vdGUgc2VydmljZSBtYXkgZW1pdCAodGhlIGluZ2VzdCBhbGxvdy1saXN0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbW90ZUF1ZGl0QWN0aW9uKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBSZW1vdGVBdWRpdEFjdGlvbiB7XG4gIHJldHVybiAoUkVNT1RFX0FVRElUX0FDVElPTlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVBdWRpdEV2ZW50IHtcbiAgYWN0aW9uOiBSZW1vdGVBdWRpdEFjdGlvbjtcbiAgYWN0b3JJZDogc3RyaW5nO1xuICBhY3RvckVtYWlsPzogc3RyaW5nO1xuICBvcmdJZD86IHN0cmluZztcbiAgYWZmZWN0ZWRPcmdJZD86IHN0cmluZztcbiAgdGFyZ2V0VHlwZT86IHN0cmluZztcbiAgdGFyZ2V0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEaWQgdGhlIGF1ZGl0ZWQgYWN0aW9uIHN1Y2NlZWQgb3IgZmFpbD8gRGVmYXVsdHMgdG8gJ3N1Y2Nlc3MnIHdoZW4gb21pdHRlZFxuICAgKiAodGhlIHBsYXRmb3JtIGluZ2VzdCBhcHBsaWVzIHRoZSBzYW1lIGRlZmF1bHQpLiBEZW5pZWQtYXV0aHogZXZlbnRzIHNldFxuICAgKiAnZmFpbHVyZScgc28gYSByZXZpZXdlciBjYW4gZmlsdGVyIGF0dGVtcHRzIGZyb20gY29tcGxldGVkIGFjdGlvbnMuXG4gICAqL1xuICBvdXRjb21lPzogJ3N1Y2Nlc3MnIHwgJ2ZhaWx1cmUnO1xuICAvKipcbiAgICogV2hlbiB0aGUgYXVkaXRlZCBhY3Rpb24gYWN0dWFsbHkgT0NDVVJSRUQgKElTTy04NjAxKSwgc3RhbXBlZCBhdCBlbWlzc2lvbi5cbiAgICogVGhlIHBsYXRmb3JtIHN0b3JlcyB0aGlzIGZvciByZXZpZXdlcnM7IGl0IGlzIE5PVCB0aGUgY2hhaW4tb3JkZXJpbmcgZmllbGRcbiAgICogKHRoZSB0YW1wZXItZXZpZGVudCBjaGFpbiBvcmRlcnMgYnkgaW5nZXN0L2BjcmVhdGVkQXRgKS4gSXQgbWF0dGVycyBmb3JcbiAgICogU1BPT0xFRCBldmVudHM6IG9uZSBidWZmZXJlZCBkdXJpbmcgYSBwbGF0Zm9ybSBvdXRhZ2UgaXMgcmUtZGVsaXZlcmVkIOKAlCBhbmRcbiAgICogc28gY2hhaW5lZCDigJQgbGF0ZXIsIGJ1dCBgb2NjdXJyZWRBdGAgcHJlc2VydmVzIHdoZW4gaXQgcmVhbGx5IGhhcHBlbmVkLlxuICAgKi9cbiAgb2NjdXJyZWRBdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YWJsZSBwZXItZW1pc3Npb24gZGVkdXAga2V5IChhbHNvIHNlbnQgYXMgdGhlIGBJZGVtcG90ZW5jeS1LZXlgIGhlYWRlciB0aGVcbiAgICogcGxhdGZvcm0gaW5nZXN0IGRlZHVwcyBvbikuIFN0YW1wZWQgYnkgYHJlY29yZCgpYCBhbmQgY2FycmllZCBvbiB0aGUgc3Bvb2xlZFxuICAgKiBjb3B5IHNvIGEgbGl2ZSBhdHRlbXB0IGFuZCBpdHMgbGF0ZXIgcmUtZGVsaXZlcnkgY29sbGFwc2UgdG8gT05FIHN0b3JlZCByb3cuXG4gICAqL1xuICBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIENsaWVudCBmb3IgUE9TVGluZyBhdWRpdCBldmVudHMgdG8gdGhlIHBsYXRmb3JtJ3MgYC9hdWRpdC1ldmVudHNgIGluZ2VzdFxuICogZW5kcG9pbnQuIE1pbnRzIGEgZnJlc2ggc2VydmljZSB0b2tlbiBwZXIgY2FsbCAoNSBtaW4gVFRMKSAgdGhlcmUncyBub1xuICogbWVhbmluZ2Z1bCBjYWNoaW5nIGJlbmVmaXQgd2hlbiBlbWlzc2lvbnMgYXJlIHNwYXJzZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVBdWRpdENsaWVudCB7XG4gIC8qKlxuICAgKiBGaXJlLWFuZC1mb3JnZXQgYXVkaXQgZW1pc3Npb24uIEZhaWx1cmVzIGFyZSBsb2dnZWQgYXQgd2FybiBsZXZlbCBidXRcbiAgICogbmV2ZXIgdGhyb3duICB0aGUgb3JpZ2luYXRpbmcgYWN0aW9uIChlLmcuIGEgcGx1Z2luIGJ1aWxkKSBoYXMgaXRzXG4gICAqIG93biBzdWNjZXNzL2ZhaWx1cmUgcGF0aCB0aGF0IHNob3VsZG4ndCBnZXQgcG9sbHV0ZWQgYnkgYSBmbGFreSBhdWRpdFxuICAgKiBkb3duc3RyZWFtLiBXaGVuIGEge0BsaW5rIEF1ZGl0U3Bvb2x9IGlzIGNvbmZpZ3VyZWQsIGFuIGVtaXNzaW9uIHRoYXRcbiAgICogZXhoYXVzdHMgaXRzIGxpdmUgcmV0cmllcyBpcyBidWZmZXJlZCBhbmQgcmUtZGVsaXZlcmVkIGxhdGVyIGluc3RlYWQgb2ZcbiAgICogYmVpbmcgZHJvcHBlZC5cbiAgICovXG4gIHJlY29yZChldmVudDogUmVtb3RlQXVkaXRFdmVudCwgc2VydmljZU5hbWU6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBTdG9wIHRoZSBiYWNrZ3JvdW5kIHNwb29sLWRyYWluIHRpbWVyIChpZiBhbnkpLiBTYWZlIHRvIGNhbGwgcmVwZWF0ZWRseS4gKi9cbiAgY2xvc2UoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgcmVtb3RlIGF1ZGl0IGNsaWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVBdWRpdENsaWVudENvbmZpZyB7XG4gIC8qKiBQbGF0Zm9ybSBzZXJ2aWNlIGhvc3QgKGRlZmF1bHQ6IGVudiBQTEFURk9STV9TRVJWSUNFX0hPU1Qgb3IgJ3BsYXRmb3JtJykgKi9cbiAgaG9zdD86IHN0cmluZztcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgcG9ydCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfUE9SVCBvciAzMDAwKSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IG1zIChkZWZhdWx0IDMwMDAgIGF1ZGl0IHNob3VsZG4ndCBibG9jayB0aGUgd29ya2VyKS4gKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGR1cmFibGUgYnVmZmVyLiBXaGVuIHNldCwgYW4gZW1pc3Npb24gdGhhdCBleGhhdXN0cyBpdHMgbGl2ZSByZXRyeVxuICAgKiBidWRnZXQgKHN1c3RhaW5lZCBwbGF0Zm9ybSBvdXRhZ2UpIGlzIHNwb29sZWQgYW5kIHJlLWRlbGl2ZXJlZCDigJQgb24gdGhlIG5leHRcbiAgICogc3VjY2Vzc2Z1bCBlbWlzc2lvbiBhbmQgb24gYSBwZXJpb2RpYyB0aW1lciDigJQgaW5zdGVhZCBvZiBiZWluZyBsb3N0LlxuICAgKi9cbiAgc3Bvb2w/OiBBdWRpdFNwb29sO1xuICAvKiogU3Bvb2wtZHJhaW4gaW50ZXJ2YWwgbXMgKGRlZmF1bHQgMzBfMDAwKS4gT25seSB1c2VkIHdoZW4gYHNwb29sYCBpcyBzZXQuICovXG4gIGRyYWluSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqIE1heCBlbnRyaWVzIGRyYWluZWQgcGVyIHN3ZWVwIChkZWZhdWx0IDEwMCkuICovXG4gIGRyYWluQmF0Y2hTaXplPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdCBhIHJlbW90ZS1hdWRpdCBjbGllbnQgdGFyZ2V0ZWQgYXQgdGhlIHBsYXRmb3JtIHNlcnZpY2UuXG4gKlxuICogVXNlZCBieSBhcGkvcGx1Z2luJ3MgYnVpbGQgd29ya2VyIHRvIHB1c2ggYHBsdWdpbi5idWlsZC4qYCBldmVudHMgaW50b1xuICogdGhlIHBsYXRmb3JtJ3MgTW9uZ29EQiBgYXVkaXRfZXZlbnRzYCBjb2xsZWN0aW9uLiBPdGhlciBzZXJ2aWNlc1xuICogd2l0aCB3b3JrZXItc3R5bGUgZW1pdHRlcnMgY2FuIHVzZSB0aGUgc2FtZSBjbGllbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGF1ZGl0Q2xpZW50ID0gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoKTtcbiAqIGF1ZGl0Q2xpZW50LnJlY29yZCh7XG4gKiBhY3Rpb246ICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAqIGFjdG9ySWQ6ICd1c2VyLTEyMycsXG4gKiBvcmdJZDogJ29yZy1hY21lJyxcbiAqIHRhcmdldFR5cGU6ICdwbHVnaW4nLFxuICogdGFyZ2V0SWQ6ICdwbHVnaW4tYWJjJyxcbiAqIGRldGFpbHM6IHsgbmFtZTogJ215LXBsdWdpbicsIHZlcnNpb246ICcxLjAuMCcgfSxcbiAqIH0sICdwbHVnaW4nKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoY29uZmlnOiBSZW1vdGVBdWRpdENsaWVudENvbmZpZyA9IHt9KTogUmVtb3RlQXVkaXRDbGllbnQge1xuICBjb25zdCBzZXJ2aWNlQ29uZmlnOiBTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGhvc3Q6IGNvbmZpZy5ob3N0ID8/IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFUlZJQ0VfSE9TVCA/PyAncGxhdGZvcm0nLFxuICAgIHBvcnQ6IGNvbmZpZy5wb3J0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFUlZJQ0VfUE9SVCA/PyAnMzAwMCcsIDEwKSxcbiAgICB0aW1lb3V0OiBjb25maWcudGltZW91dCA/PyAzMDAwLFxuICB9O1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVTYWZlQ2xpZW50KHNlcnZpY2VDb25maWcpO1xuICBjb25zdCBzcG9vbCA9IGNvbmZpZy5zcG9vbDtcbiAgY29uc3QgZHJhaW5CYXRjaFNpemUgPSBjb25maWcuZHJhaW5CYXRjaFNpemUgPz8gMTAwO1xuXG4gIC8qKlxuICAgKiBBdHRlbXB0IE9ORSBsaXZlIGRlbGl2ZXJ5LiBSZXNvbHZlcyBgdHJ1ZWAgb24gYSAyeHggYWNjZXB0LCBgZmFsc2VgIG9uIGFueVxuICAgKiBub24tMnh4IC8gdGhyb3duIGVycm9yICh0aGUgaHR0cC1jbGllbnQgaGFzIGFscmVhZHkgYXBwbGllZCB0aGUgcmV0cnlcbiAgICogYnVkZ2V0KS4gQSBzdGFibGUgcGVyLWVtaXNzaW9uIGBJZGVtcG90ZW5jeS1LZXlgIG1ha2VzIHRoaXMgbm9uLWlkZW1wb3RlbnRcbiAgICogUE9TVCByZXRyeS1zYWZlIGFuZCBsZXRzIHRoZSBwbGF0Zm9ybSBpbmdlc3QgZGVkdXAgYSByZS1kZWxpdmVyZWQgZXZlbnRcbiAgICogaW5zdGVhZCBvZiB3cml0aW5nIGEgZHVwbGljYXRlIGF1ZGl0IHJvdyAoYW5kIGR1cGxpY2F0ZSBjaGFpbiBsaW5rKS5cbiAgICogYElkZW1wb3RlbmN5LUtleWAgaXMgZGVyaXZlZCBmcm9tIHRoZSBldmVudCBzbyBhIFNQT09MRUQgcmUtZGVsaXZlcnkgcmV1c2VzXG4gICAqIHRoZSBzYW1lIGtleSBhcyBpdHMgb3JpZ2luYWwgbGl2ZSBhdHRlbXB0IOKAlCB0aGUgdHdvIGNvbGxhcHNlIHRvIG9uZSByb3cuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBkZWxpdmVyKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYXV0aEhlYWRlciA9IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWUsIG9yZ0lkOiBldmVudC5vcmdJZCwgcm9sZTogJ21lbWJlcicgfSk7XG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdBdXRob3JpemF0aW9uJzogYXV0aEhlYWRlcixcbiAgICAgICdJZGVtcG90ZW5jeS1LZXknOiBldmVudC5pZGVtcG90ZW5jeUtleSA/PyByYW5kb21VVUlEKCksXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdCgnL2F1ZGl0L2V2ZW50cycsIGV2ZW50LCB7IGhlYWRlcnMsIC4uLkFVRElUX1JFUVVFU1RfT1BUSU9OUyB9KTtcbiAgICAgIGNvbnN0IG9rID0gISFyZXNwb25zZSAmJiByZXNwb25zZS5zdGF0dXNDb2RlID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXNDb2RlIDwgMzAwO1xuICAgICAgaWYgKCFvaykge1xuICAgICAgICBsb2dnZXIud2FybignUmVtb3RlIGF1ZGl0IGluZ2VzdCBub24tb2snLCB7IGFjdGlvbjogZXZlbnQuYWN0aW9uLCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvaztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IHRocmV3JywgeyBhY3Rpb246IGV2ZW50LmFjdGlvbiwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXJpYWxpemUgc3Bvb2wgZHJhaW5zIHNvIGEgcGVyaW9kaWMgdGljayBhbmQgYW4gb24tc3VjY2VzcyBkcmFpbiBjYW4ndCBib3RoXG4gIC8vIHB1bGwgdGhlIHNhbWUgYmF0Y2guIFN0b3BzIGVhcmx5IHRoZSBtb21lbnQgYSByZS1kZWxpdmVyeSBmYWlscyAocGxhdGZvcm1cbiAgLy8gc3RpbGwgZG93bikgc28gd2UgZG9uJ3QgaGFtbWVyIGl0IG9yIGNodXJuIHRoZSBidWZmZXIuXG4gIGxldCBkcmFpbmluZyA9IGZhbHNlO1xuICBhc3luYyBmdW5jdGlvbiBkcmFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXNwb29sIHx8IGRyYWluaW5nKSByZXR1cm47XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGJhdGNoID0gYXdhaXQgc3Bvb2wudGFrZShkcmFpbkJhdGNoU2l6ZSk7XG4gICAgICAgIGlmIChiYXRjaC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgY29uc3QgZmFpbGVkOiBBdWRpdFNwb29sRW50cnlbXSA9IFtdO1xuICAgICAgICBsZXQgcGxhdGZvcm1Eb3duID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYmF0Y2gpIHtcbiAgICAgICAgICBpZiAocGxhdGZvcm1Eb3duKSB7IGZhaWxlZC5wdXNoKGVudHJ5KTsgY29udGludWU7IH1cbiAgICAgICAgICBjb25zdCBvayA9IGF3YWl0IGRlbGl2ZXIoZW50cnkuZXZlbnQsIGVudHJ5LnNlcnZpY2VOYW1lKTtcbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWRlbGl2ZXJlZF90b3RhbCcsIHsgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsYXRmb3JtRG93biA9IHRydWU7XG4gICAgICAgICAgICBmYWlsZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHNwb29sLnJlcXVldWUoZmFpbGVkKTtcbiAgICAgICAgICByZXR1cm47IC8vIHN0aWxsIGRvd24g4oCUIHRyeSBhZ2FpbiBvbiB0aGUgbmV4dCB0aWNrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBkcmFpbiBmYWlsZWQnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IGRyYWluVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgaWYgKHNwb29sKSB7XG4gICAgZHJhaW5UaW1lciA9IHNldEludGVydmFsKCgpID0+IHsgdm9pZCBkcmFpbigpOyB9LCBjb25maWcuZHJhaW5JbnRlcnZhbE1zID8/IDMwXzAwMCk7XG4gICAgLy8gRG9uJ3QgbGV0IHRoZSBkcmFpbiB0aW1lciBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlIG9uIHNodXRkb3duLlxuICAgIChkcmFpblRpbWVyIGFzIHVua25vd24gYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZWNvcmQoZXZlbnQsIHNlcnZpY2VOYW1lKSB7XG4gICAgICAvLyBTdGFtcCB3aGVuIHRoZSBhY3Rpb24gYWN0dWFsbHkgb2NjdXJyZWQgKHN1cnZpdmVzIHNwb29sIGRlbGF5KSBhbmQgcGluIGFcbiAgICAgIC8vIHN0YWJsZSBpZGVtcG90ZW5jeSBrZXkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBzcG9vbGVkIHJldHJ5IGRlZHVwLlxuICAgICAgY29uc3Qgc3RhbXBlZDogUmVtb3RlQXVkaXRFdmVudCA9IHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIG9jY3VycmVkQXQ6IGV2ZW50Lm9jY3VycmVkQXQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBpZGVtcG90ZW5jeUtleTogZXZlbnQuaWRlbXBvdGVuY3lLZXkgPz8gcmFuZG9tVVVJRCgpLFxuICAgICAgfTtcbiAgICAgIHZvaWQgZGVsaXZlcihzdGFtcGVkLCBzZXJ2aWNlTmFtZSkudGhlbigob2spID0+IHtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X2VtaXR0ZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCBvdXRjb21lOiBzdGFtcGVkLm91dGNvbWUgPz8gJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgIGlmIChzcG9vbCkgdm9pZCBkcmFpbigpOyAvLyBwbGF0Zm9ybSBpcyByZWFjaGFibGUg4oCUIGZsdXNoIGFueSBiYWNrbG9nXG4gICAgICAgIH0gZWxzZSBpZiAoc3Bvb2wpIHtcbiAgICAgICAgICB2b2lkIHNwb29sLmVucXVldWUoeyBldmVudDogc3RhbXBlZCwgc2VydmljZU5hbWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X2Ryb3BwZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNsb3NlKCkge1xuICAgICAgaWYgKGRyYWluVGltZXIpIHsgY2xlYXJJbnRlcnZhbChkcmFpblRpbWVyKTsgZHJhaW5UaW1lciA9IHVuZGVmaW5lZDsgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIHN0YW5kYXJkIGBhdXRoei5kZW5pZWRgIHNpbmsgdXNlZCBieSBldmVyeSByZW1vdGUtYXVkaXQgc2VydmljZVxuICogKHBpcGVsaW5lLCBwbHVnaW4sIGNvbXBsaWFuY2UsIHF1b3RhLCBtZXNzYWdlLCBiaWxsaW5nLCByZXBvcnRpbmcsIOKApikuXG4gKlxuICogVGhlIHNoYXJlZCBgcmVxdWlyZUF1dGhgIGdhdGUgZm9yd2FyZHMgZWFjaCBERU5JRUQgc3RhdGUtY2hhbmdpbmcgcmVxdWVzdCB0b1xuICogdGhlIGF1ZGl0b3Igc2V0IHZpYSB7QGxpbmsgc2V0QXV0aHpEZW5pYWxBdWRpdG9yfTsgdGhpcyB3aXJlcyB0aGF0IGhvb2sgdG8gdGhlXG4gKiBzZXJ2aWNlJ3Mge0BsaW5rIFJlbW90ZUF1ZGl0Q2xpZW50fSwgZm9yd2FyZGluZyBhIGBmYWlsdXJlYC1vdXRjb21lXG4gKiBgYXV0aHouZGVuaWVkYCBldmVudCBzbyBwcm9iaW5nIC8gcHJpdmlsZWdlLWVzY2FsYXRpb24gYXR0ZW1wdHMgbGVhdmUgYSB0cmFpbC5cbiAqIEVtaXNzaW9uIGlzIGZpcmUtYW5kLWZvcmdldCAodGhlIGNsaWVudCBuZXZlciB0aHJvd3MpLiBgZ2V0Q2xpZW50YCBpcyBhIGdldHRlclxuICogc28gdGhlIGNsaWVudCBzdGF5cyBsYXppbHkgY29uc3RydWN0ZWQgKHNlcnZpY2VzIG1lbW9pemUgaXQgb24gZmlyc3QgdXNlKS5cbiAqXG4gKiBQbGF0Zm9ybSBpcyBpbnRlbnRpb25hbGx5IE5PVCBhIGNhbGxlciDigJQgaXQgaXMgdGhlIGF1ZGl0IGF1dGhvcml0eSBhbmQgd3JpdGVzXG4gKiBgYXV0aHouZGVuaWVkYCBzdHJhaWdodCB0byBpdHMgbG9jYWwgc3RvcmUgKHdpdGggYGFmZmVjdGVkT3JnSWRgKSwgbm90IHRocm91Z2hcbiAqIGEgUmVtb3RlQXVkaXRDbGllbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGdldENsaWVudDogKCkgPT4gUmVtb3RlQXVkaXRDbGllbnQpOiB2b2lkIHtcbiAgc2V0QXV0aHpEZW5pYWxBdWRpdG9yKChpbmZvOiBBdXRoekRlbmlhbEluZm8pID0+IGdldENsaWVudCgpLnJlY29yZCh7XG4gICAgYWN0aW9uOiAnYXV0aHouZGVuaWVkJyxcbiAgICBhY3RvcklkOiBpbmZvLmFjdG9ySWQgPz8gJ2Fub255bW91cycsXG4gICAgYWN0b3JFbWFpbDogaW5mby5hY3RvckVtYWlsLFxuICAgIG9yZ0lkOiBpbmZvLm9yZ0lkLFxuICAgIG91dGNvbWU6ICdmYWlsdXJlJyxcbiAgICBkZXRhaWxzOiB7IG1ldGhvZDogaW5mby5tZXRob2QsIHBhdGg6IGluZm8ucGF0aCwgcmVxdWlyZWQ6IGluZm8ucmVxdWlyZWQgfSxcbiAgfSwgc2VydmljZU5hbWUpKTtcbn1cblxuLyoqXG4gKiBBIHNlcnZpY2Utc2NvcGVkIGF1ZGl0IGNsaWVudDogYSBkdXJhYmxlLXNwb29sLWJhY2tlZCB7QGxpbmsgUmVtb3RlQXVkaXRDbGllbnR9XG4gKiB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgcHJlLWJvdW5kIGZvciBlbWlzc2lvbi4gUmVwbGFjZXMgdGhlIHBlci1zZXJ2aWNlXG4gKiBib2lsZXJwbGF0ZSBvZiBgY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoeyBzcG9vbDogY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKCkgPz8gdW5kZWZpbmVkIH0pYFxuICogcGx1cyBhIGhhbmQtcm9sbGVkIGBlbWl0PFNlcnZpY2U+QXVkaXRgIHdyYXBwZXIgdGhhdCByZXBlYXRzIHRoZSBzZXJ2aWNlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUF1ZGl0Q2xpZW50IHtcbiAgLyoqIEVtaXQgYW4gYXVkaXQgZXZlbnQgd2l0aCB0aGUgc2VydmljZSBuYW1lIGJvdW5kLiBGaXJlLWFuZC1mb3JnZXQuICovXG4gIGVtaXQoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQpOiB2b2lkO1xuICAvKiogVGhlIHVuZGVybHlpbmcgcmVtb3RlIGNsaWVudCDigJQgZm9yIGB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yYCArIGBjbG9zZSgpYC4gKi9cbiAgcmVhZG9ubHkgY2xpZW50OiBSZW1vdGVBdWRpdENsaWVudDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIHNlcnZpY2UncyBhdWRpdCBjbGllbnQ6IGEgUmVtb3RlQXVkaXRDbGllbnQgd2lyZWQgdG8gdGhlIGR1cmFibGUgUmVkaXNcbiAqIHNwb29sIChmcm9tIGFtYmllbnQgZW52OyBudWxsIOKGkiBubyBzcG9vbCkgd2l0aCBgc2VydmljZU5hbWVgIGJvdW5kLiBDb25zdHJ1Y3RcbiAqIE9OQ0UgcGVyIHByb2Nlc3Mg4oCUIG1lbW9pemUgYmVoaW5kIGEgbGF6eSBgZ2V0QXVkaXRDbGllbnQoKWAgaW4gdGhlIHNlcnZpY2Unc1xuICogYHNlcnZpY2VzL2F1ZGl0LnRzYC4gUGFzcyBgY29uZmlnLnNwb29sYCB0byBvdmVycmlkZSB0aGUgZW52LWRlcml2ZWQgc3Bvb2xcbiAqIChlLmcuIHJldXNlIGEgc2VydmljZSdzIGV4aXN0aW5nIGlvcmVkaXMgY29ubmVjdGlvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXJ2aWNlQXVkaXRDbGllbnQoc2VydmljZU5hbWU6IHN0cmluZywgY29uZmlnOiBSZW1vdGVBdWRpdENsaWVudENvbmZpZyA9IHt9KTogU2VydmljZUF1ZGl0Q2xpZW50IHtcbiAgY29uc3Qgc3Bvb2wgPSBjb25maWcuc3Bvb2wgPz8gY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKCkgPz8gdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCh7IC4uLmNvbmZpZywgc3Bvb2wgfSk7XG4gIHJldHVybiB7XG4gICAgZW1pdDogKGV2ZW50KSA9PiBjbGllbnQucmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSksXG4gICAgY2xpZW50LFxuICB9O1xufVxuXG4vKipcbiAqIExhemlseS1jb25zdHJ1Y3RlZCByZW1vdGUtYXVkaXQgYWNjZXNzb3IgZm9yIGEgc2VydmljZS4gRXZlcnkgc2VydmljZSdzXG4gKiBgc2VydmljZXMvYXVkaXQudHNgIHVzZWQgdG8gaGFuZC1yb2xsIHRoZSBzYW1lIG1vZHVsZSBzaW5nbGV0b24gKGEgYGxldCBhdWRpdGBcbiAqICsgYHN2YygpYCB0aGF0IGJ1aWxkcyBhIHtAbGluayBTZXJ2aWNlQXVkaXRDbGllbnR9IG9uIGZpcnN0IHVzZSwgdGhlbiBhXG4gKiBgZ2V0QXVkaXRDbGllbnQoKWAgcmV0dXJuaW5nIGAuY2xpZW50YCBhbmQgYW4gYGVtaXQoZXZlbnQpYCBmb3J3YXJkaW5nIHRvXG4gKiBgLmVtaXRgKS4gVGhpcyBwYWNrYWdlcyB0aGF0IHBhdHRlcm4gaW4gT05FIHBsYWNlIHNvIGVhY2ggc2VydmljZSdzIGF1ZGl0XG4gKiB3aXJpbmcgaXMgYSBvbmUtbGluZXIgYW5kIGNhbid0IGRyaWZ0LlxuICpcbiAqIExhenkgb24gcHVycG9zZTogdGhlIHVuZGVybHlpbmcgY2xpZW50IHdpcmVzIGFuIGVudi1SZWRpcyBhdWRpdCBzcG9vbCwgc29cbiAqIGJ1aWxkaW5nIGl0IGF0IGltcG9ydCB0aW1lIHdvdWxkIGZvcmNlIHRoYXQgY29ubmVjdGlvbiB3aGVyZXZlciB0aGUgbW9kdWxlIGlzXG4gKiBtZXJlbHkgaW1wb3J0ZWQgKGUuZy4gdGVzdHMpLiBgZ2V0QXVkaXRDbGllbnRgIGlzIHBhc3NlZCB0b1xuICogYHdpcmVBdXRoekRlbmlhbEF1ZGl0b3JgOyBgZW1pdGAgYmFja3MgdGhlIHBlci1zZXJ2aWNlIGBlbWl0WEF1ZGl0YCBoZWxwZXJzLlxuICogQm90aCBzdGF5IEZJUkUtQU5ELUZPUkdFVCAocmVjb3JkIG5ldmVyIHRocm93cyAvIGlzIG5vdCBhd2FpdGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUF1ZGl0QWNjZXNzb3Ioc2VydmljZU5hbWU6IHN0cmluZyk6IHtcbiAgZ2V0QXVkaXRDbGllbnQ6ICgpID0+IFJlbW90ZUF1ZGl0Q2xpZW50O1xuICBlbWl0OiAoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQpID0+IHZvaWQ7XG59IHtcbiAgbGV0IGF1ZGl0OiBTZXJ2aWNlQXVkaXRDbGllbnQgfCBudWxsID0gbnVsbDtcbiAgY29uc3Qgc3ZjID0gKCk6IFNlcnZpY2VBdWRpdENsaWVudCA9PiB7XG4gICAgaWYgKCFhdWRpdCkgYXVkaXQgPSBjcmVhdGVTZXJ2aWNlQXVkaXRDbGllbnQoc2VydmljZU5hbWUpO1xuICAgIHJldHVybiBhdWRpdDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBnZXRBdWRpdENsaWVudDogKCkgPT4gc3ZjKCkuY2xpZW50LFxuICAgIGVtaXQ6IChldmVudCkgPT4gc3ZjKCkuZW1pdChldmVudCksXG4gIH07XG59XG4iXX0=
@@ -17,7 +17,18 @@ export function createScheduler(opts) {
17
17
  let interval = null;
18
18
  let startup = null;
19
19
  let stopped = false;
20
+ let running = false;
20
21
  const cycle = async () => {
22
+ // Same-pod re-entrancy guard: setInterval doesn't await the async cycle, so
23
+ // a cycle slower than intervalMs would otherwise overlap ITSELF on this pod
24
+ // (double-processing, duplicate side effects). The optional leader lock only
25
+ // guards CROSS-pod overlap; this guards same-pod. A skipped tick just runs on
26
+ // the next interval.
27
+ if (running) {
28
+ log.debug('Cycle skipped — previous cycle still running (same-pod re-entrancy)');
29
+ return;
30
+ }
31
+ running = true;
21
32
  try {
22
33
  if (opts.lock) {
23
34
  const redis = await opts.lock.redis();
@@ -32,6 +43,9 @@ export function createScheduler(opts) {
32
43
  catch (err) {
33
44
  log.error('Scheduler cycle failed', { error: errorMessage(err) });
34
45
  }
46
+ finally {
47
+ running = false;
48
+ }
35
49
  };
36
50
  const begin = () => {
37
51
  if (stopped)
@@ -69,4 +83,4 @@ export function createScheduler(opts) {
69
83
  },
70
84
  };
71
85
  }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQWtCLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBbUNsRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBc0I7SUFDcEQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLFFBQVEsR0FBMEMsSUFBSSxDQUFDO0lBQzNELElBQUksT0FBTyxHQUF5QyxJQUFJLENBQUM7SUFDekQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRXBCLE1BQU0sS0FBSyxHQUFHLEtBQUssSUFBbUIsRUFBRTtRQUN0QyxJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sR0FBRyxHQUFHLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2xGLElBQUksQ0FBQyxHQUFHO29CQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUNwRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsR0FBRyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLEtBQUssR0FBRyxHQUFTLEVBQUU7UUFDdkIsSUFBSSxPQUFPO1lBQUUsT0FBTyxDQUFDLHlDQUF5QztRQUM5RCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSztZQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDNUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsT0FBTztRQUNMLEtBQUs7WUFDSCxJQUFJLFFBQVEsSUFBSSxPQUFPO2dCQUFFLE9BQU87WUFDaEMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssRUFBRSxDQUFDO1lBQ1YsQ0FBQztZQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFDRCxJQUFJO1lBQ0YsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNmLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFBQyxDQUFDO1lBQ3ZELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFBQyxDQUFDO1lBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoQyxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgd2l0aExlYWRlckxvY2ssIHR5cGUgTG9ja1JlZGlzIH0gZnJvbSAnLi9sZWFkZXItbG9jay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuXG5jb25zdCBlcnJvck1lc3NhZ2UgPSAoZTogdW5rbm93bikgPT4gKGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSk7XG5cbi8qKiBPcHRpb25hbCBjcm9zcy1wb2Qgc2luZ2xlLXJ1bm5lciBsb2NrIGZvciBhIHNjaGVkdWxlcidzIGN5Y2xlLiBUaGUgcmVkaXNcbiAqICBjbGllbnQgaXMgcmVzb2x2ZWQgcGVyIGN5Y2xlIChpdCBtYXkgYmUgYW4gYXN5bmMgZ2V0dGVyLCBlLmcuIGEgQnVsbE1RXG4gKiAgYHF1ZXVlLmNsaWVudGAgcHJvbWlzZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckxvY2sge1xuICByZWRpczogKCkgPT4gTG9ja1JlZGlzIHwgUHJvbWlzZTxMb2NrUmVkaXM+O1xuICBrZXk6IHN0cmluZztcbiAgdHRsTXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJPcHRpb25zIHtcbiAgLyoqIExvZyBsYWJlbCAoYWxzbyB0aGUgbG9nZ2VyIG5hbWUpLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBJbnRlcnZhbCBiZXR3ZWVuIGN5Y2xlcyAobXMpLiAqL1xuICBpbnRlcnZhbE1zOiBudW1iZXI7XG4gIC8qKiBUaGUgd29yayB0byBydW4gZWFjaCBjeWNsZS4gRXJyb3JzIGFyZSBjYXVnaHQgKyBsb2dnZWQsIG5ldmVyIHRocm93bi4gKi9cbiAgcnVuOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogUnVuIGEgY3ljbGUgaW1tZWRpYXRlbHkgd2hlbiBzdGFydGVkLiBEZWZhdWx0IHRydWUuICovXG4gIHJ1bk9uU3RhcnQ/OiBib29sZWFuO1xuICAvKiogRGVsYXkgYmVmb3JlIHRoZSBmaXJzdCBjeWNsZSAoYW5kIGJlZm9yZSB0aGUgaW50ZXJ2YWwgYmVnaW5zKSwgbXMuXG4gICAqICBEZWZhdWx0IDAuIExldHMgYSBzZXJ2aWNlIHdhaXQgZm9yIGRlcGVuZGVuY2llcyB0byBjb21lIHVwLiAqL1xuICBzdGFydHVwRGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIFdoZW4gc2V0LCBlYWNoIGN5Y2xlIHJ1bnMgb25seSBvbiB0aGUgcG9kIHRoYXQgd2lucyB0aGlzIGxvY2sg4oCUIHNvIHdpdGhcbiAgICogIG11bHRpcGxlIHJlcGxpY2FzIG9ubHkgb25lIHJ1bnMgcGVyIHdpbmRvdy4gKi9cbiAgbG9jaz86IFNjaGVkdWxlckxvY2s7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyIHtcbiAgLyoqIFN0YXJ0IHRoZSB0aW1lci4gSWRlbXBvdGVudCDigJQgcmVwZWF0ZWQgY2FsbHMgYXJlIG5vLW9wcy4gKi9cbiAgc3RhcnQoKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIHRpbWVyIChhbmQgY2FuY2VsIGEgcGVuZGluZyBzdGFydHVwIGRlbGF5KS4gU2FmZSBiZWZvcmUgc3RhcnQuICovXG4gIHN0b3AoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIHBlcmlvZGljIGJhY2tncm91bmQgam9iOiBhIHNpbmdsZSB1bnJlZidkIGBzZXRJbnRlcnZhbGAgd2l0aCBzdGFydC1vbmNlXG4gKiBzZW1hbnRpY3MsIGVycm9yIGlzb2xhdGlvbiAoYSB0aHJvd2luZyBjeWNsZSBpcyBsb2dnZWQsIG5ldmVyIGNyYXNoZXMgdGhlXG4gKiBsb29wKSwgYW4gb3B0aW9uYWwgc3RhcnR1cCBkZWxheSwgYW5kIGFuIG9wdGlvbmFsIGNyb3NzLXBvZCBsZWFkZXIgbG9jay5cbiAqXG4gKiBSZXBsYWNlcyB0aGUgaGFuZC1yb2xsZWQgdGltZXIvYHVucmVmYC9gY2F0Y2hgL3N0YXJ0LXN0b3AgYm9pbGVycGxhdGUgdGhhdFxuICogZWFjaCBzY2hlZHVsZXIgKHNjYW4sIGRpZ2VzdCwgcmVnaXN0cnkgR0MsIGJpbGxpbmcgbGlmZWN5Y2xlKSByZXBlYXRlZCwgYW5kXG4gKiBtYWtlcyB0aGUgbGVhZGVyIGxvY2sgYXZhaWxhYmxlIHRvIGFsbCBvZiB0aGVtIHVuaWZvcm1seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjaGVkdWxlcihvcHRzOiBTY2hlZHVsZXJPcHRpb25zKTogU2NoZWR1bGVyIHtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKG9wdHMubmFtZSk7XG4gIGxldCBpbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdGFydHVwOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RvcHBlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGN5Y2xlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAob3B0cy5sb2NrKSB7XG4gICAgICAgIGNvbnN0IHJlZGlzID0gYXdhaXQgb3B0cy5sb2NrLnJlZGlzKCk7XG4gICAgICAgIGNvbnN0IHJhbiA9IGF3YWl0IHdpdGhMZWFkZXJMb2NrKHJlZGlzLCBvcHRzLmxvY2sua2V5LCBvcHRzLmxvY2sudHRsTXMsIG9wdHMucnVuKTtcbiAgICAgICAgaWYgKCFyYW4pIGxvZy5kZWJ1ZygnQ3ljbGUgc2tpcHBlZCDigJQgYW5vdGhlciBwb2QgaG9sZHMgdGhlIGxvY2snKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IG9wdHMucnVuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZXJyb3IoJ1NjaGVkdWxlciBjeWNsZSBmYWlsZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYmVnaW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHN0b3BwZWQpIHJldHVybjsgLy8gc3RvcCgpIGNhbGxlZCBkdXJpbmcgdGhlIHN0YXJ0dXAgZGVsYXlcbiAgICBpZiAob3B0cy5ydW5PblN0YXJ0ICE9PSBmYWxzZSkgdm9pZCBjeWNsZSgpO1xuICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdm9pZCBjeWNsZSgpLCBvcHRzLmludGVydmFsTXMpO1xuICAgIGludGVydmFsLnVucmVmKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCgpOiB2b2lkIHtcbiAgICAgIGlmIChpbnRlcnZhbCB8fCBzdGFydHVwKSByZXR1cm47XG4gICAgICBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBpZiAob3B0cy5zdGFydHVwRGVsYXlNcyAmJiBvcHRzLnN0YXJ0dXBEZWxheU1zID4gMCkge1xuICAgICAgICBzdGFydHVwID0gc2V0VGltZW91dCgoKSA9PiB7IHN0YXJ0dXAgPSBudWxsOyBiZWdpbigpOyB9LCBvcHRzLnN0YXJ0dXBEZWxheU1zKTtcbiAgICAgICAgc3RhcnR1cC51bnJlZigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmVnaW4oKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RhcnRlZCcsIHsgaW50ZXJ2YWxNczogb3B0cy5pbnRlcnZhbE1zLCBsb2NrZWQ6ICEhb3B0cy5sb2NrIH0pO1xuICAgIH0sXG4gICAgc3RvcCgpOiB2b2lkIHtcbiAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgaWYgKHN0YXJ0dXApIHsgY2xlYXJUaW1lb3V0KHN0YXJ0dXApOyBzdGFydHVwID0gbnVsbDsgfVxuICAgICAgaWYgKGludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOyBpbnRlcnZhbCA9IG51bGw7IH1cbiAgICAgIGxvZy5pbmZvKCdTY2hlZHVsZXIgc3RvcHBlZCcpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3NjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQWtCLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBbUNsRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBc0I7SUFDcEQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLFFBQVEsR0FBMEMsSUFBSSxDQUFDO0lBQzNELElBQUksT0FBTyxHQUF5QyxJQUFJLENBQUM7SUFDekQsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVwQixNQUFNLEtBQUssR0FBRyxLQUFLLElBQW1CLEVBQUU7UUFDdEMsNEVBQTRFO1FBQzVFLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UsOEVBQThFO1FBQzlFLHFCQUFxQjtRQUNyQixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osR0FBRyxDQUFDLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1lBQ2pGLE9BQU87UUFDVCxDQUFDO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNmLElBQUksQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNkLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEYsSUFBSSxDQUFDLEdBQUc7b0JBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixHQUFHLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQUcsR0FBUyxFQUFFO1FBQ3ZCLElBQUksT0FBTztZQUFFLE9BQU8sQ0FBQyx5Q0FBeUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUs7WUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzVDLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxLQUFLO1lBQ0gsSUFBSSxRQUFRLElBQUksT0FBTztnQkFBRSxPQUFPO1lBQ2hDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDOUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLEVBQUUsQ0FBQztZQUNWLENBQUM7WUFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0QsSUFBSTtZQUNGLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDZixJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQUMsQ0FBQztZQUN2RCxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQUMsQ0FBQztZQUMzRCxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDaEMsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHdpdGhMZWFkZXJMb2NrLCB0eXBlIExvY2tSZWRpcyB9IGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuY29uc3QgZXJyb3JNZXNzYWdlID0gKGU6IHVua25vd24pID0+IChlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpO1xuXG4vKiogT3B0aW9uYWwgY3Jvc3MtcG9kIHNpbmdsZS1ydW5uZXIgbG9jayBmb3IgYSBzY2hlZHVsZXIncyBjeWNsZS4gVGhlIHJlZGlzXG4gKiAgY2xpZW50IGlzIHJlc29sdmVkIHBlciBjeWNsZSAoaXQgbWF5IGJlIGFuIGFzeW5jIGdldHRlciwgZS5nLiBhIEJ1bGxNUVxuICogIGBxdWV1ZS5jbGllbnRgIHByb21pc2UpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJMb2NrIHtcbiAgcmVkaXM6ICgpID0+IExvY2tSZWRpcyB8IFByb21pc2U8TG9ja1JlZGlzPjtcbiAga2V5OiBzdHJpbmc7XG4gIHR0bE1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyT3B0aW9ucyB7XG4gIC8qKiBMb2cgbGFiZWwgKGFsc28gdGhlIGxvZ2dlciBuYW1lKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogSW50ZXJ2YWwgYmV0d2VlbiBjeWNsZXMgKG1zKS4gKi9cbiAgaW50ZXJ2YWxNczogbnVtYmVyO1xuICAvKiogVGhlIHdvcmsgdG8gcnVuIGVhY2ggY3ljbGUuIEVycm9ycyBhcmUgY2F1Z2h0ICsgbG9nZ2VkLCBuZXZlciB0aHJvd24uICovXG4gIHJ1bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJ1biBhIGN5Y2xlIGltbWVkaWF0ZWx5IHdoZW4gc3RhcnRlZC4gRGVmYXVsdCB0cnVlLiAqL1xuICBydW5PblN0YXJ0PzogYm9vbGVhbjtcbiAgLyoqIERlbGF5IGJlZm9yZSB0aGUgZmlyc3QgY3ljbGUgKGFuZCBiZWZvcmUgdGhlIGludGVydmFsIGJlZ2lucyksIG1zLlxuICAgKiAgRGVmYXVsdCAwLiBMZXRzIGEgc2VydmljZSB3YWl0IGZvciBkZXBlbmRlbmNpZXMgdG8gY29tZSB1cC4gKi9cbiAgc3RhcnR1cERlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBXaGVuIHNldCwgZWFjaCBjeWNsZSBydW5zIG9ubHkgb24gdGhlIHBvZCB0aGF0IHdpbnMgdGhpcyBsb2NrIOKAlCBzbyB3aXRoXG4gICAqICBtdWx0aXBsZSByZXBsaWNhcyBvbmx5IG9uZSBydW5zIHBlciB3aW5kb3cuICovXG4gIGxvY2s/OiBTY2hlZHVsZXJMb2NrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlciB7XG4gIC8qKiBTdGFydCB0aGUgdGltZXIuIElkZW1wb3RlbnQg4oCUIHJlcGVhdGVkIGNhbGxzIGFyZSBuby1vcHMuICovXG4gIHN0YXJ0KCk6IHZvaWQ7XG4gIC8qKiBTdG9wIHRoZSB0aW1lciAoYW5kIGNhbmNlbCBhIHBlbmRpbmcgc3RhcnR1cCBkZWxheSkuIFNhZmUgYmVmb3JlIHN0YXJ0LiAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBwZXJpb2RpYyBiYWNrZ3JvdW5kIGpvYjogYSBzaW5nbGUgdW5yZWYnZCBgc2V0SW50ZXJ2YWxgIHdpdGggc3RhcnQtb25jZVxuICogc2VtYW50aWNzLCBlcnJvciBpc29sYXRpb24gKGEgdGhyb3dpbmcgY3ljbGUgaXMgbG9nZ2VkLCBuZXZlciBjcmFzaGVzIHRoZVxuICogbG9vcCksIGFuIG9wdGlvbmFsIHN0YXJ0dXAgZGVsYXksIGFuZCBhbiBvcHRpb25hbCBjcm9zcy1wb2QgbGVhZGVyIGxvY2suXG4gKlxuICogUmVwbGFjZXMgdGhlIGhhbmQtcm9sbGVkIHRpbWVyL2B1bnJlZmAvYGNhdGNoYC9zdGFydC1zdG9wIGJvaWxlcnBsYXRlIHRoYXRcbiAqIGVhY2ggc2NoZWR1bGVyIChzY2FuLCBkaWdlc3QsIHJlZ2lzdHJ5IEdDLCBiaWxsaW5nIGxpZmVjeWNsZSkgcmVwZWF0ZWQsIGFuZFxuICogbWFrZXMgdGhlIGxlYWRlciBsb2NrIGF2YWlsYWJsZSB0byBhbGwgb2YgdGhlbSB1bmlmb3JtbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY2hlZHVsZXIob3B0czogU2NoZWR1bGVyT3B0aW9ucyk6IFNjaGVkdWxlciB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihvcHRzLm5hbWUpO1xuICBsZXQgaW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RhcnR1cDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgbGV0IHJ1bm5pbmcgPSBmYWxzZTtcblxuICBjb25zdCBjeWNsZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBTYW1lLXBvZCByZS1lbnRyYW5jeSBndWFyZDogc2V0SW50ZXJ2YWwgZG9lc24ndCBhd2FpdCB0aGUgYXN5bmMgY3ljbGUsIHNvXG4gICAgLy8gYSBjeWNsZSBzbG93ZXIgdGhhbiBpbnRlcnZhbE1zIHdvdWxkIG90aGVyd2lzZSBvdmVybGFwIElUU0VMRiBvbiB0aGlzIHBvZFxuICAgIC8vIChkb3VibGUtcHJvY2Vzc2luZywgZHVwbGljYXRlIHNpZGUgZWZmZWN0cykuIFRoZSBvcHRpb25hbCBsZWFkZXIgbG9jayBvbmx5XG4gICAgLy8gZ3VhcmRzIENST1NTLXBvZCBvdmVybGFwOyB0aGlzIGd1YXJkcyBzYW1lLXBvZC4gQSBza2lwcGVkIHRpY2sganVzdCBydW5zIG9uXG4gICAgLy8gdGhlIG5leHQgaW50ZXJ2YWwuXG4gICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgIGxvZy5kZWJ1ZygnQ3ljbGUgc2tpcHBlZCDigJQgcHJldmlvdXMgY3ljbGUgc3RpbGwgcnVubmluZyAoc2FtZS1wb2QgcmUtZW50cmFuY3kpJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJ1bm5pbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBpZiAob3B0cy5sb2NrKSB7XG4gICAgICAgIGNvbnN0IHJlZGlzID0gYXdhaXQgb3B0cy5sb2NrLnJlZGlzKCk7XG4gICAgICAgIGNvbnN0IHJhbiA9IGF3YWl0IHdpdGhMZWFkZXJMb2NrKHJlZGlzLCBvcHRzLmxvY2sua2V5LCBvcHRzLmxvY2sudHRsTXMsIG9wdHMucnVuKTtcbiAgICAgICAgaWYgKCFyYW4pIGxvZy5kZWJ1ZygnQ3ljbGUgc2tpcHBlZCDigJQgYW5vdGhlciBwb2QgaG9sZHMgdGhlIGxvY2snKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IG9wdHMucnVuKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZXJyb3IoJ1NjaGVkdWxlciBjeWNsZSBmYWlsZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBiZWdpbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoc3RvcHBlZCkgcmV0dXJuOyAvLyBzdG9wKCkgY2FsbGVkIGR1cmluZyB0aGUgc3RhcnR1cCBkZWxheVxuICAgIGlmIChvcHRzLnJ1bk9uU3RhcnQgIT09IGZhbHNlKSB2b2lkIGN5Y2xlKCk7XG4gICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB2b2lkIGN5Y2xlKCksIG9wdHMuaW50ZXJ2YWxNcyk7XG4gICAgaW50ZXJ2YWwudW5yZWYoKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0KCk6IHZvaWQge1xuICAgICAgaWYgKGludGVydmFsIHx8IHN0YXJ0dXApIHJldHVybjtcbiAgICAgIHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGlmIChvcHRzLnN0YXJ0dXBEZWxheU1zICYmIG9wdHMuc3RhcnR1cERlbGF5TXMgPiAwKSB7XG4gICAgICAgIHN0YXJ0dXAgPSBzZXRUaW1lb3V0KCgpID0+IHsgc3RhcnR1cCA9IG51bGw7IGJlZ2luKCk7IH0sIG9wdHMuc3RhcnR1cERlbGF5TXMpO1xuICAgICAgICBzdGFydHVwLnVucmVmKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZWdpbigpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oJ1NjaGVkdWxlciBzdGFydGVkJywgeyBpbnRlcnZhbE1zOiBvcHRzLmludGVydmFsTXMsIGxvY2tlZDogISFvcHRzLmxvY2sgfSk7XG4gICAgfSxcbiAgICBzdG9wKCk6IHZvaWQge1xuICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICBpZiAoc3RhcnR1cCkgeyBjbGVhclRpbWVvdXQoc3RhcnR1cCk7IHN0YXJ0dXAgPSBudWxsOyB9XG4gICAgICBpZiAoaW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7IGludGVydmFsID0gbnVsbDsgfVxuICAgICAgbG9nLmluZm8oJ1NjaGVkdWxlciBzdG9wcGVkJyk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==