@pipeline-builder/api-core 4.1.7 → 4.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +8 -0
  2. package/lib/helpers/org-hierarchy.d.ts +19 -0
  3. package/lib/helpers/org-hierarchy.js +29 -1
  4. package/lib/index.d.ts +26 -0
  5. package/lib/index.js +27 -1
  6. package/lib/services/api-key-exchange.js +3 -2
  7. package/lib/services/audit-spool.js +3 -2
  8. package/lib/services/cache-service.js +5 -4
  9. package/lib/services/compliance-event-subscriber.js +3 -2
  10. package/lib/services/durable-event-bus.js +3 -2
  11. package/lib/services/entity-events.js +3 -2
  12. package/lib/services/env-redis.js +3 -2
  13. package/lib/services/http-client.js +8 -7
  14. package/lib/services/index.d.ts +6 -2
  15. package/lib/services/index.js +11 -3
  16. package/lib/services/jwks-cache.d.ts +0 -12
  17. package/lib/services/jwks-cache.js +7 -6
  18. package/lib/services/leader-lock.js +3 -2
  19. package/lib/services/notification-channels.d.ts +112 -0
  20. package/lib/services/notification-channels.js +123 -0
  21. package/lib/services/quota.js +4 -4
  22. package/lib/services/remote-audit-client.d.ts +1 -1
  23. package/lib/services/remote-audit-client.js +4 -4
  24. package/lib/services/retry-forever.d.ts +37 -0
  25. package/lib/services/retry-forever.js +58 -0
  26. package/lib/services/retry-strategy.d.ts +7 -3
  27. package/lib/services/retry-strategy.js +2 -2
  28. package/lib/services/scheduler.js +2 -2
  29. package/lib/services/service-boot.d.ts +20 -4
  30. package/lib/services/service-boot.js +10 -6
  31. package/lib/services/service-keys.js +6 -5
  32. package/lib/services/sse-ticket-store.js +3 -2
  33. package/lib/services/token-revocation.js +6 -5
  34. package/lib/testing/mock-api-core.d.ts +150 -0
  35. package/lib/testing/mock-api-core.js +246 -0
  36. package/lib/testing/mock-drizzle.d.ts +6 -0
  37. package/lib/testing/mock-drizzle.js +57 -0
  38. package/lib/types/http.d.ts +4 -0
  39. package/lib/types/http.js +1 -1
  40. package/lib/types/index.d.ts +1 -0
  41. package/lib/types/index.js +2 -1
  42. package/lib/types/metadata-keys.d.ts +543 -0
  43. package/lib/types/metadata-keys.js +117 -0
  44. package/lib/types/permissions.d.ts +19 -0
  45. package/lib/types/permissions.js +33 -1
  46. package/lib/types/quota-tiers.js +21 -31
  47. package/lib/utils/api-key.d.ts +0 -9
  48. package/lib/utils/api-key.js +2 -13
  49. package/lib/utils/audit.js +3 -2
  50. package/lib/utils/env.d.ts +6 -2
  51. package/lib/utils/env.js +9 -4
  52. package/lib/utils/identity.d.ts +37 -1
  53. package/lib/utils/identity.js +62 -10
  54. package/lib/utils/index.d.ts +2 -1
  55. package/lib/utils/index.js +7 -2
  56. package/lib/utils/params.d.ts +35 -0
  57. package/lib/utils/params.js +24 -1
  58. package/lib/utils/secret-encryption.d.ts +4 -4
  59. package/lib/utils/secret-encryption.js +5 -5
  60. package/lib/utils/ssrf.d.ts +73 -14
  61. package/lib/utils/ssrf.js +138 -21
  62. package/package.json +26 -1
@@ -6,7 +6,7 @@ import { ErrorCode } from '../types/error-codes.js';
6
6
  import { DEFAULT_TIER, isValidTier } from '../types/quota-tiers.js';
7
7
  import { createLogger } from '../utils/logger.js';
8
8
  import { emitCounter } from '../utils/metric-emitter.js';
9
- import { sendError, sendQuotaExceeded } from '../utils/response.js';
9
+ import { errorMessage, sendError, sendQuotaExceeded } from '../utils/response.js';
10
10
  /**
11
11
  * Retry options for quota calls — fail fast (a slow quota service must not stall the request).
12
12
  *
@@ -252,7 +252,7 @@ export function createQuotaService(config = {}) {
252
252
  * @param logWarn - Logging function for warnings
253
253
  */
254
254
  export function incrementQuota(quotaService, orgId, quotaType, logWarn) {
255
- quotaService.increment(orgId, quotaType, getQuotaServiceAuthHeader(orgId)).catch((err) => logWarn('Quota increment failed', { error: err instanceof Error ? err.message : String(err) }));
255
+ quotaService.increment(orgId, quotaType, getQuotaServiceAuthHeader(orgId)).catch((err) => logWarn('Quota increment failed', { error: errorMessage(err) }));
256
256
  }
257
257
  /**
258
258
  * Atomic reserve helper for the "reserve + commit / rollback" pattern.
@@ -303,6 +303,6 @@ export function sendQuotaReserveDenied(res, quotaType, reservation) {
303
303
  * has already failed, no point compounding the error.
304
304
  */
305
305
  export function decrementQuota(quotaService, orgId, quotaType, authHeader, logWarn, amount = 1, resetAtSnapshot) {
306
- quotaService.decrement(orgId, quotaType, authHeader, amount, resetAtSnapshot).catch((err) => logWarn('Quota rollback failed', { error: err instanceof Error ? err.message : String(err) }));
306
+ quotaService.decrement(orgId, quotaType, authHeader, amount, resetAtSnapshot).catch((err) => logWarn('Quota rollback failed', { error: errorMessage(err) }));
307
307
  }
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcXVvdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUl0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXBFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBK0Q7SUFDeEYsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFckMsK0NBQStDO0FBQy9DLEVBQUU7QUFDRiw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRixpRkFBaUY7QUFDakYsb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSxnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQy9FLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsS0FBSyxNQUFNLENBQUM7QUFFL0U7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsS0FBYTtJQUNyRCxPQUFPLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDekcsQ0FBQztBQWdGRDs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixLQUFhLEVBQ2IsU0FBb0IsRUFDcEIsTUFBa0QsRUFDbEQsVUFBbUI7SUFFbkIsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0VBQWdFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3hILFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDbEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzVGLENBQUM7SUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN6SCxXQUFXLENBQUMseUJBQXlCLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDNUcsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxvQkFBb0I7SUFDM0IsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJO1FBQ2IsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNULElBQUksRUFBRSxDQUFDO1FBQ1AsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNiLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUNqQyxTQUFTLEVBQUUsSUFBSTtRQUNmLDBFQUEwRTtRQUMxRSxrRUFBa0U7UUFDbEUsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBYSxFQUFFLFVBQW1CLEVBQUUsU0FBa0I7SUFDMUUsTUFBTSxPQUFPLEdBQTJCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzlELElBQUksVUFBVTtRQUFFLE9BQU8sQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDO0lBQ25ELElBQUksU0FBUztRQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDbkQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQU0sR0FBdUIsRUFBRTtJQUNoRSxNQUFNLGFBQWEsR0FBa0I7UUFDbkMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxPQUFPO1FBQzlELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDM0UsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSTtLQUNoQyxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFL0MsT0FBTztRQUNMLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBYSxFQUFFLFNBQW9CLEVBQUUsVUFBa0IsRUFBRSxTQUFrQjtZQUNyRixNQUFNLElBQUksR0FBRyxXQUFXLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFFckYsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUk5QixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFFNUYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsOERBQThELEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDbEcsV0FBVyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQy9GLE9BQU8sb0JBQW9CLEVBQUUsQ0FBQztZQUNoQyxDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQ3pGLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0VBQWdFLEVBQUU7b0JBQzVFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztpQkFDbEYsQ0FBQyxDQUFDO2dCQUNILFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRixPQUFPLG9CQUFvQixFQUFFLENBQUM7WUFDaEMsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ25DLENBQUM7UUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWEsRUFBRSxTQUFvQixFQUFFLFVBQWtCLEVBQUUsTUFBTSxHQUFXLENBQUMsRUFBRSxTQUFrQjtZQUM3RyxNQUFNLElBQUksR0FBRyxXQUFXLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFFOUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNO2lCQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUcscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBRXhILElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRTtvQkFDdkMsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVO2lCQUMzRCxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBYSxFQUFFLFNBQW9CLEVBQUUsVUFBa0IsRUFBRSxNQUFNLEdBQVcsQ0FBQyxFQUFFLFNBQWtCO1lBQzNHLE1BQU0sSUFBSSxHQUFHLFdBQVcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUU5RCwwRUFBMEU7WUFDMUUsc0RBQXNEO1lBQ3RELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FNL0IsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUcscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBRW5ILElBQUksQ0FBQyxRQUFRO2dCQUFFLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUUxRSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztnQkFDdkMsd0VBQXdFO2dCQUN4RSx3RUFBd0U7Z0JBQ3hFLHdFQUF3RTtnQkFDeEUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsY0FBYyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUN6RCxPQUFPO3dCQUNMLFFBQVEsRUFBRSxJQUFJO3dCQUNkLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO3FCQUNqRSxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEYsQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMxRCxPQUFPLGtCQUFrQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3RSxDQUFDO1lBRUQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO1lBQ3BDLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFO2FBQ25FLENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFhLEVBQUUsU0FBb0IsRUFBRSxVQUFrQixFQUFFLE1BQU0sR0FBVyxDQUFDLEVBQUUsZUFBd0IsRUFBRSxTQUFrQjtZQUN2SSxNQUFNLElBQUksR0FBRyxXQUFXLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDOUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNO2lCQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUcscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBRXJLLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDN0Msb0VBQW9FO2dCQUNwRSxtRUFBbUU7Z0JBQ25FLHFDQUFxQztnQkFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyw0REFBNEQsRUFBRTtvQkFDeEUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVO2lCQUMzRCxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxZQUFZLENBQUUsS0FBYSxFQUMvQixNQUEwQyxFQUMxQyxVQUFrQixFQUNsQixTQUFrQjtZQUVsQixNQUFNLElBQUksR0FBRyxXQUFXLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFFcEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXpHLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRTtvQkFDM0MsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVU7aUJBQ2hELENBQUMsQ0FBQztnQkFDSCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDdkQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxTQUFrQjtZQUNqRSxNQUFNLElBQUksR0FBRyxXQUFXLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFFcEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUk5QixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFFNUYsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3ZFLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0RBQXNELFlBQVksT0FBTyxFQUFFO29CQUNyRixLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVk7aUJBQ25FLENBQUMsQ0FBQztnQkFDSCxXQUFXLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUM1SCxPQUFPLFlBQVksQ0FBQztZQUN0QixDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztZQUM3QyxPQUFPLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ3hELENBQUM7UUFFRCxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQWEsRUFBRSxTQUFxQixFQUFFLFVBQW1CLEVBQUUsU0FBa0I7WUFDdkYsTUFBTSxJQUFJLEdBQUcsV0FBVyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBRTFELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFOUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO29CQUNuQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVTtpQkFDbkQsQ0FBQyxDQUFDO2dCQUNILE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNyRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFFLFlBQTBCLEVBQ3hELEtBQWEsRUFDYixTQUFvQixFQUNwQixPQUFrRDtJQUVsRCxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFZLEVBQUUsRUFBRSxDQUNoRyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FDOUYsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFFLFlBQTBCLEVBQ3RELEtBQWEsRUFDYixTQUFvQixFQUNwQixVQUFrQixFQUNsQixNQUFNLEdBQVcsQ0FBQyxFQUNsQixTQUFrQjtJQUVsQixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCxxRkFBcUY7QUFDckYsTUFBTSxxQ0FBcUMsR0FBRyxDQUFDLENBQUM7QUFFaEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxHQUFhLEVBQUUsU0FBb0IsRUFBRSxXQUErQjtJQUN6RyxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVc7WUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzFGLFNBQVMsQ0FDUCxHQUFHLEVBQ0gsR0FBRyxFQUNILHFCQUFxQixTQUFTLDZDQUE2QyxFQUMzRSxTQUFTLENBQUMsbUJBQW1CLENBQzlCLENBQUM7UUFDRixPQUFPO0lBQ1QsQ0FBQztJQUNELGlCQUFpQixDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBRSxZQUEwQixFQUN4RCxLQUFhLEVBQ2IsU0FBb0IsRUFDcEIsVUFBa0IsRUFDbEIsT0FBa0QsRUFDbEQsTUFBTSxHQUFXLENBQUMsRUFDbEIsZUFBd0I7SUFFeEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBWSxFQUFFLEVBQUUsQ0FDbkcsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQzdGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcblxuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIgfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHR5cGUgeyBRdW90YVR5cGUsIFF1b3RhQ2hlY2tSZXN1bHQsIFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9USUVSLCBpc1ZhbGlkVGllciwgdHlwZSBRdW90YVRpZXIgfSBmcm9tICcuLi90eXBlcy9xdW90YS10aWVycy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBzZW5kRXJyb3IsIHNlbmRRdW90YUV4Y2VlZGVkIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIFJldHJ5IG9wdGlvbnMgZm9yIHF1b3RhIGNhbGxzIOKAlCBmYWlsIGZhc3QgKGEgc2xvdyBxdW90YSBzZXJ2aWNlIG11c3Qgbm90IHN0YWxsIHRoZSByZXF1ZXN0KS5cbiAqXG4gKiBORVZFUiByZXRyeSBhIDQyOS4gVGhlIHF1b3RhIHNlcnZpY2UgYW5zd2VycyBhbiBvdmVyLWxpbWl0IG9yZyB3aXRoIDQyOVxuICogUVVPVEFfRVhDRUVERUQgYW5kIGBSZXRyeS1BZnRlcmAgPSBzZWNvbmRzIHVudGlsIHRoZSBwZXJpb2QgcmVzZXRzOyB0aGUgSFRUUFxuICogY2xpZW50IGhvbm9ycyB0aGF0IChjYXBwZWQgYXQgNjBzKSwgc28gYSBzaW5nbGUgcmF0ZS1saW1pdCByZXRyeSBzdGFsbGVkIHRoZVxuICogcmVxdWVzdCB3ZWxsIHBhc3QgdGhlIGhhbmRsZXIgdGltZW91dCwgd2hpY2ggdGhlbiBhbnN3ZXJlZCA1MDMgYW5kIHRoZSByZWFsXG4gKiA0Mjkgd2FzIGxvc3QuIEEgNDI5IGlzIGEgZmluYWwgYW5zd2VyIGhlcmUuXG4gKi9cbmNvbnN0IFFVT1RBX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMCxcbiAgbWF4UmV0cmllczogMSxcbn07XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncXVvdGEnKTtcblxuLy8gUkVTRVJWRSBGQUlMIE1PREUg4oCUIGV4cGxpY2l0LCBzaW5nbGUgcG9saWN5LlxuLy9cbi8vIGByZXNlcnZlYCBnYXRlcyBFWFBFTlNJVkUsIGJpbGxhYmxlIHJlc291cmNlcyAocGlwZWxpbmVzLCBwbHVnaW4gYnVpbGRzLCBBSVxuLy8gY2FsbHMsIHBsYXRmb3JtIGZlYXR1cmUgc2xvdHMpLiBFdmVyeSBxdW90YSB0eXBlIGlzIGEgcGVyLXBlcmlvZCBGTE9XIGNvdW50ZXJcbi8vIHdpdGggbm8gYWZ0ZXItdGhlLWZhY3QgcmVjb25jaWxpYXRpb246IGEgdW5pdCBjb25zdW1lZCB3aGlsZSB0aGUgcmVzZXJ2YXRpb25cbi8vIGNvdWxkIG5vdCBiZSBjb25maXJtZWQgaXMgbmV2ZXIgY291bnRlZCwgc28gZmFpbC1vcGVuIGxldHMgYW4gb3JnIGNvbnN1bWVcbi8vIHVuYm91bmRlZCB1bm1ldGVyZWQgdW5pdHMgZm9yIHRoZSB3aG9sZSBsZW5ndGggb2YgYW4gaW5jaWRlbnQg4oCUIGFuZCBhblxuLy8gdW5jb25maXJtZWQgcmVzZXJ2ZSAodGltZW91dCwgb3BlbiBjaXJjdWl0KSBtYXkgZXZlbiBoYXZlIGxhbmRlZCBzZXJ2ZXItc2lkZS5cbi8vIFNvIGByZXNlcnZlYCBmYWlscyBDTE9TRUQgd2hlbmV2ZXIgdGhlIHF1b3RhIHNlcnZpY2UgZGlkIG5vdCBDT05GSVJNIHRoZSBzbG90OlxuLy8gICAtIHVucmVhY2hhYmxlIC8gdGltZWQgb3V0IC8gY2lyY3VpdCBicmVha2VyIG9wZW4gKG5vIHJlc3BvbnNlKSxcbi8vICAgLSBhIHJlYWNoYWJsZS1idXQtZXJyb3JlZCByZXNwb25zZSAoNXh4LCA0eHgsIG1hbGZvcm1lZCBib2R5KSxcbi8vICAgLSBhIDQyOSB0aGF0IGlzIE5PVCBhIGdlbnVpbmUgUVVPVEFfRVhDRUVERUQgKGdhdGV3YXkgLyByYXRlIGxpbWl0ZXIpLlxuLy8gT3BlcmF0b3JzIHdobyBwcmVmZXIgYXZhaWxhYmlsaXR5IG92ZXIgZW5mb3JjZW1lbnQgb3B0IHRoZSBXSE9MRSBzZXQgaW50b1xuLy8gZmFpbC1vcGVuIHdpdGggUVVPVEFfUkVTRVJWRV9GQUlMX09QRU49dHJ1ZS4gQm90aCBvdXRjb21lcyBlbWl0IGEgY291bnRlclxuLy8gKGBxdW90YV9mYWlsX2Nsb3NlZF90b3RhbGAgLyBgcXVvdGFfZmFpbF9vcGVuX3RvdGFsYCkgdGFnZ2VkIHdpdGggdGhlIHJlYXNvbi5cbi8vIGBjaGVja2AgKGEgY2hlYXAgcmVhZCBnYXRlKSBzdGF5cyBmYWlsLW9wZW47IGBpbmNyZW1lbnRgIGlzIGZpcmUtYW5kLWZvcmdldC5cbmNvbnN0IFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOID0gcHJvY2Vzcy5lbnYuUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gPT09ICd0cnVlJztcblxuLyoqXG4gKiBTZXJ2aWNlLXByaW5jaXBhbCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIGZvciBhIHF1b3RhIGNhbGwgbWFkZSBvbiBiZWhhbGYgb2ZcbiAqIGBvcmdJZGAgYnkgdGhlIENVUlJFTlQgc2VydmljZSAoYFNFUlZJQ0VfTkFNRWAsIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBoZWFsdGhcbiAqIHJvdXRlciByZXBvcnRzKS5cbiAqXG4gKiBUaGUgcXVvdGEgc2VydmljZSdzIG11dGF0aW9uIGVuZHBvaW50cyAoYC86b3JnSWQvaW5jcmVtZW50YCwgYC9kZWNyZW1lbnRgKVxuICogcmVqZWN0IGFueXRoaW5nIGJ1dCBhIHNpZ25lZCBzZXJ2aWNlIHByaW5jaXBhbCBvciBhIHN5c3RlbSBhZG1pbiwgc29cbiAqIGZvcndhcmRpbmcgdGhlIGVuZCB1c2VyJ3MgYmVhcmVyIHRva2VuIHRoZXJlIGlzIGFsd2F5cyBhIDQwMy4gU2VydmljZSB0b2tlbnNcbiAqIGFyZSBhbHNvIGV4ZW1wdCBmcm9tIHRoZSBxdW90YSBzZXJ2aWNlJ3MgcGVyLUlQIHJhdGUgbGltaXRlciwgc28gaG90LXBhdGhcbiAqIHF1b3RhIHRyYWZmaWMgZnJvbSBhIGJ1c3kgcG9kIGNhbid0IGV4aGF1c3QgdGhhdCBwb2QgSVAncyBidWNrZXQgYW5kIHNpbGVudGx5XG4gKiB0dXJuIGVuZm9yY2VtZW50IG9mZi4gU2NvcGVkIHRvIHRoZSB0YXJnZXQgb3JnIHdpdGggdGhlIGxvd2VzdCByb2xlIChtZW1iZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVvdGFTZXJ2aWNlQXV0aEhlYWRlcihvcmdJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJywgb3JnSWQsIHJvbGU6ICdtZW1iZXInIH0pO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN5bmNocm9ub3VzIHF1b3RhIHJlc2VydmF0aW9uICB0aGUgYXRvbWljIGNoZWNrK2luY3JlbWVudFxuICogdmFyaWFudC4gYGV4Y2VlZGVkOiB0cnVlYCBtZWFucyB0aGUgb3BlcmF0aW9uIHdhcyByZWplY3RlZCBhdCB0aGUgREJcbiAqIGxldmVsOyB0aGUgY2FsbGVyIHNob3VsZCByZXR1cm4gNDI5IHdpdGhvdXQgcnVubmluZyB0aGUgZ2F0ZWQgYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNsb3Qgd2FzIE5PVCByZXNlcnZlZCDigJQgdGhlIGdhdGVkIGFjdGlvbiBtdXN0IG5vdCBydW4uICovXG4gIGV4Y2VlZGVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0ICh0cnVlKSBieSB0aGUgcXVvdGEgQ0xJRU5UIHdoZW4gdGhlIHJlc2VydmF0aW9uIHdhcyBkZW5pZWQgYmVjYXVzZSB0aGVcbiAgICogcXVvdGEgc2VydmljZSBjb3VsZCBub3QgQ09ORklSTSBpdCAodW5yZWFjaGFibGUgLyB0aW1lb3V0IC8gY2lyY3VpdCBvcGVuIC9cbiAgICogZXJyb3JlZCkg4oCUIG5vdCBiZWNhdXNlIHRoZSBvcmcgaXMgb3ZlciBpdHMgbGltaXQuIEFsd2F5cyBwYWlyZWQgd2l0aFxuICAgKiBgZXhjZWVkZWQ6IHRydWVgLiBBbnN3ZXIgd2l0aCB7QGxpbmsgc2VuZFF1b3RhUmVzZXJ2ZURlbmllZH0sIHdoaWNoIG1hcHMgaXQgdG9cbiAgICogNTAzIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIDQyOSBcInF1b3RhIGV4Y2VlZGVkXCIuXG4gICAqL1xuICB1bmF2YWlsYWJsZT86IGJvb2xlYW47XG4gIHF1b3RhOiB7XG4gICAgdHlwZTogUXVvdGFUeXBlO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgdXNlZDogbnVtYmVyO1xuICAgIHJlbWFpbmluZzogbnVtYmVyO1xuICAgIHJlc2V0QXQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbi8qKlxuICogUXVvdGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhU2VydmljZSB7XG4gIC8qKiBDaGVjayBpZiBxdW90YSBpcyBhdmFpbGFibGUgKGZhaWwtb3BlbiBvbiBlcnJvcikuICovXG4gIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD47XG4gIC8qKiBJbmNyZW1lbnQgcXVvdGEgdXNhZ2UuIFJldHVybnMgYSBwcm9taXNlIHNvIGNhbGxlcnMgY2FuIG9wdGlvbmFsbHkgaGFuZGxlIGVycm9ycy4gKi9cbiAgaW5jcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEF0b21pYyByZXNlcnZlICB0aGUgc2FtZSBhdG9taWMgY2hlY2sraW5jcmVtZW50IGFzIGBpbmNyZW1lbnRgLCBidXRcbiAgICogcGFyc2VzIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBzZWUgd2hldGhlciB0aGUgc2xvdCB3YXMgYWN0dWFsbHlcbiAgICogcmVzZXJ2ZWQuIFVzZSB0aGlzIGZvciBleHBlbnNpdmUgcmVzb3VyY2VzIHdoZXJlIHRoZSBwb3N0LWhvYyBmaXJlLVxuICAgKiBhbmQtZm9yZ2V0IHBhdHRlcm4gYWxsb3dzIGNvbmN1cnJlbnQgb3Zlci1zcGVuZC5cbiAgICpcbiAgICogRmFpbHMgQ0xPU0VEIChgZXhjZWVkZWQ6IHRydWVgKSB3aGVuZXZlciB0aGUgc2xvdCBpcyBub3QgY29uZmlybWVkIOKAlFxuICAgKiB1bnJlYWNoYWJsZSwgdGltZW91dCwgb3BlbiBjaXJjdWl0LCBub24tb2ssIG9yIGEgbm9uLXF1b3RhIDQyOSDigJQgdW5sZXNzXG4gICAqIGBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTj10cnVlYCAoc2VlIHRoZSBwb2xpY3kgbm90ZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSkuXG4gICAqL1xuICByZXNlcnZlKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+O1xuICAvKipcbiAgICogUm9sbCBiYWNrIGEgcHJldmlvdXNseSByZXNlcnZlZCBzbG90LiBGaXJlLWFuZC1mb3JnZXQg4oCUIG5ldmVyIHRocm93cy5cbiAgICogUGFzcyBgcmVzZXRBdFNuYXBzaG90YCAodGhlIGBxdW90YS5yZXNldEF0YCBvYnNlcnZlZCB3aGVuIHRoZSBzbG90IHdhc1xuICAgKiByZXNlcnZlZCkgdG8gbWFrZSB0aGUgcm9sbGJhY2sgY29uZGl0aW9uYWw6IGlmIHRoZSBwZXJpb2Qgcm9sbGVkIG92ZXJcbiAgICogYmV0d2VlbiByZXNlcnZlIGFuZCByb2xsYmFjaywgdGhlIHNlcnZlciBza2lwcyB0aGUgZGVjcmVtZW50IHNvIGl0IGRvZXNuJ3RcbiAgICogc3RlYWwgY2FwYWNpdHkgZnJvbSB0aGUgbmV3IHBlcmlvZC5cbiAgICovXG4gIGRlY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFVwZGF0ZSBxdW90YSBsaW1pdHMuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqL1xuICB1cGRhdGVMaW1pdHMob3JnSWQ6IHN0cmluZywgbGltaXRzOiBQYXJ0aWFsPFJlY29yZDxRdW90YVR5cGUsIG51bWJlcj4+LCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKiBSZXNldCBxdW90YSB1c2FnZS4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuICovXG4gIHJlc2V0KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZT86IFF1b3RhVHlwZSwgYXV0aEhlYWRlcj86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIEdldCB0aGUgb3JnJ3MgcXVvdGEgYFF1b3RhVGllcmAuIFVzZWQgYnkgdGhlIHBsdWdpbi1idWlsZCBxdWV1ZSBwYXJ0aXRpb25pbmdcbiAgICogdG8gcm91dGUgYSBidWlsZCB0byB0aGUgcmlnaHQgcGVyLXRpZXIgcXVldWUuIEZhaWwtb3BlbiByZXR1cm5zIGBERUZBVUxUX1RJRVJgXG4gICAqIChgZGV2ZWxvcGVyYCB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCwgYHVubGltaXRlZGAgd2hlbiBpdCdzIGRpc2FibGVkKTsgYVxuICAgKiBtaXNjbGFzc2lmaWVkIG9yZyBzdGlsbCBidWlsZHMgb24gdGhlIGRlZmF1bHQgcXVldWUsIGp1c3Qgd2l0aG91dCB0aGVcbiAgICogdGllci1zY29wZWQgc2NoZWR1bGluZyBib29zdC5cbiAgICovXG4gIGdldFRpZXIob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhVGllcj47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcXVvdGEgc2VydmljZSBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFTZXJ2aWNlQ29uZmlnIHtcbiAgLyoqIFF1b3RhIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFFVT1RBX1NFUlZJQ0VfSE9TVCBvciAncXVvdGEnKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUXVvdGEgc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUVVPVEFfU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiA1MDAwKSAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFwcGx5IHRoZSBleHBsaWNpdCByZXNlcnZlIGZhaWwtbW9kZSBwb2xpY3kgdG8gYSByZXNlcnZhdGlvbiB0aGUgcXVvdGEgc2VydmljZVxuICogZGlkIE5PVCBjb25maXJtIChzZWUgUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gYWJvdmUpLiBEZWZhdWx0OiBkZW55LlxuICovXG5mdW5jdGlvbiB1bmNvbmZpcm1lZFJlc2VydmUoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICByZWFzb246ICd1bnJlYWNoYWJsZScgfCAndHJhbnNpZW50LTQyOScgfCAnbm9uLW9rJyxcbiAgc3RhdHVzQ29kZT86IG51bWJlcixcbik6IFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIGlmIChRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTikge1xuICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IHF1b3RhIHJlc2VydmUgbm90IGNvbmZpcm1lZCwgYWxsb3dpbmcgcmVxdWVzdCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgcmVhc29uLCBzdGF0dXNDb2RlIH0pO1xuICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ3Jlc2VydmUnLCByZWFzb24sIHF1b3RhVHlwZSB9KTtcbiAgICByZXR1cm4geyBleGNlZWRlZDogZmFsc2UsIHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IC0xLCB1c2VkOiAwLCByZW1haW5pbmc6IC0xIH0gfTtcbiAgfVxuICBsb2dnZXIud2FybignUVVPVEFfRkFJTF9DTE9TRUQ6IHF1b3RhIHJlc2VydmUgbm90IGNvbmZpcm1lZCwgZGVueWluZyByZXF1ZXN0JywgeyBvcmdJZCwgcXVvdGFUeXBlLCByZWFzb24sIHN0YXR1c0NvZGUgfSk7XG4gIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX2Nsb3NlZF90b3RhbCcsIHsgb3BlcmF0aW9uOiAncmVzZXJ2ZScsIHJlYXNvbiwgcXVvdGFUeXBlIH0pO1xuICByZXR1cm4geyBleGNlZWRlZDogdHJ1ZSwgdW5hdmFpbGFibGU6IHRydWUsIHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IDAsIHVzZWQ6IDAsIHJlbWFpbmluZzogMCB9IH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZmFpbC1vcGVuIHF1b3RhIHJlc3VsdCAoYWxsb3dzIHRoZSByZXF1ZXN0KS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFpbE9wZW5SZXN1bHQoKTogUXVvdGFDaGVja1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZDogdHJ1ZSxcbiAgICBsaW1pdDogLTEsXG4gICAgdXNlZDogMCxcbiAgICByZW1haW5pbmc6IC0xLFxuICAgIHJlc2V0QXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB1bmxpbWl0ZWQ6IHRydWUsXG4gICAgLy8gVGFnIHRoZSBzZW50aW5lbCBzbyBmYWlsLWNsb3NlZCBjYWxsZXJzIGNhbiB0ZWxsIGFuIG91dGFnZSBhcGFydCBmcm9tIGFcbiAgICAvLyByZWFsIHVubGltaXRlZCAoLTEpIHJlYWRpbmcuIFJlYWwgcXVvdGEgcmVzdWx0cyBuZXZlciBzZXQgdGhpcy5cbiAgICBmYWlsT3BlbjogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBjb21tb24gcmVxdWVzdCBoZWFkZXJzIHdpdGggb3B0aW9uYWwgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRIZWFkZXJzKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI/OiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAneC1vcmctaWQnOiBvcmdJZCB9O1xuICBpZiAoYXV0aEhlYWRlcikgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYXV0aEhlYWRlcjtcbiAgaWYgKHJlcXVlc3RJZCkgaGVhZGVyc1snWC1SZXF1ZXN0LUlkJ10gPSByZXF1ZXN0SWQ7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHF1b3RhIHNlcnZpY2UgY2xpZW50LlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHF1b3RhU2VydmljZSA9IGNyZWF0ZVF1b3RhU2VydmljZSgpO1xuICpcbiAqIC8vIENoZWNrIHF1b3RhIGJlZm9yZSBwcm9jZXNzaW5nXG4gKiBjb25zdCBxdW90YSA9IGF3YWl0IHF1b3RhU2VydmljZS5jaGVjayhvcmdJZCwgJ2FwaUNhbGxzJywgYXV0aEhlYWRlcik7XG4gKiBpZiAoIXF1b3RhLmFsbG93ZWQpIHtcbiAqIHJldHVybiByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUXVvdGEgZXhjZWVkZWQnIH0pO1xuICogfVxuICpcbiAqIC8vIEluY3JlbWVudCBxdW90YSBhZnRlciBzdWNjZXNzXG4gKiBxdW90YVNlcnZpY2UuaW5jcmVtZW50KG9yZ0lkLCAnYXBpQ2FsbHMnLCBhdXRoSGVhZGVyKS5jYXRjaChlcnIgPT4gbG9nZ2VyLndhcm4oJ1F1b3RhIGluY3JlbWVudCBmYWlsZWQnLCB7IGVycm9yOiBlcnIgfSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdW90YVNlcnZpY2UoY29uZmlnOiBRdW90YVNlcnZpY2VDb25maWcgPSB7fSk6IFF1b3RhU2VydmljZSB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gcHJvY2Vzcy5lbnYuUVVPVEFfU0VSVklDRV9IT1NUID8/ICdxdW90YScsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUVVPVEFfU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IDUwMDAsXG4gIH07XG5cbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlU2FmZUNsaWVudChzZXJ2aWNlQ29uZmlnKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vJHtlbmNvZGVVUklDb21wb25lbnQocXVvdGFUeXBlKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICBkYXRhPzogeyBxdW90YVR5cGU6IHN0cmluZzsgc3RhdHVzOiBRdW90YUNoZWNrUmVzdWx0IH07XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIHNlcnZpY2UgdW5yZWFjaGFibGUsIGFsbG93aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ2NoZWNrJywgcmVhc29uOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlLmJvZHkuZGF0YT8uc3RhdHVzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIGNoZWNrIHJldHVybmVkIG5vbi1vaywgYWxsb3dpbmcgcmVxdWVzdCcsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLCBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICdjaGVjaycsIHJlYXNvbjogJ25vbi1vaycsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZhaWxPcGVuUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZS5ib2R5LmRhdGEuc3RhdHVzO1xuICAgIH0sXG5cbiAgICBhc3luYyBpbmNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2luY3JlbWVudGA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50XG4gICAgICAgIC5wb3N0KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBpbmNyZW1lbnQgcXVvdGEnLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50LCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1F1b3RhIGluY3JlbWVudGVkJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc2VydmUob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcblxuICAgICAgLy8gMjAwIGNhcnJpZXMgYGRhdGEucXVvdGFgOyA0MjkgKFFVT1RBX0VYQ0VFREVEKSBjYXJyaWVzIGBkZXRhaWxzLnF1b3RhYC5cbiAgICAgIC8vIEJvdGggc2hhcGVzIGFyZSBub3JtYWxpemVkIGludG8gUXVvdGFSZXNlcnZlUmVzdWx0LlxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIGRldGFpbHM/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIC8qKiBgc2VuZEVycm9yYCdzIGVycm9yLWNvZGUgZmllbGQuICovXG4gICAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50IH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3VucmVhY2hhYmxlJyk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlc3BvbnNlLmJvZHkuZGV0YWlscz8ucXVvdGE7XG4gICAgICAgIC8vIE9ubHkgYSBHRU5VSU5FIHF1b3RhLWV4Y2VlZGVkIDQyOSBtZWFucyBcIm92ZXIgcXVvdGFcIi4gQSBnZW5lcmljIDQyOSDigJRcbiAgICAgICAgLy8gYW4gaW50ZXJ2ZW5pbmcgZ2F0ZXdheSBvciByYXRlIGxpbWl0ZXIg4oCUIGRpZCBub3QgY29uZmlybSBhbnl0aGluZywgc29cbiAgICAgICAgLy8gaXQgZ29lcyB0aHJvdWdoIHRoZSBzYW1lIHVuY29uZmlybWVkLXJlc2VydmF0aW9uIHBvbGljeSBhcyBhbiBvdXRhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZS5ib2R5LmNvZGUgPT09IEVycm9yQ29kZS5RVU9UQV9FWENFRURFRCB8fCBxKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4Y2VlZGVkOiB0cnVlLFxuICAgICAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAwLCB1c2VkOiAwLCByZW1haW5pbmc6IDAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3RyYW5zaWVudC00MjknLCByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ25vbi1vaycsIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxID0gcmVzcG9uc2UuYm9keS5kYXRhPy5xdW90YTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4Y2VlZGVkOiBmYWxzZSxcbiAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAtMSwgdXNlZDogMCwgcmVtYWluaW5nOiAtMSB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVjcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyID0gMSwgcmVzZXRBdFNuYXBzaG90Pzogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2RlY3JlbWVudGA7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudFxuICAgICAgICAucG9zdChwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50LCAuLi4ocmVzZXRBdFNuYXBzaG90ICYmIHsgcmVzZXRBdFNuYXBzaG90IH0pIH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIC8vIFJvbGxiYWNrIGZhaWx1cmUgaXMgbG9nZ2VkIGJ1dCBuZXZlciBwcm9wYWdhdGVkICB0aGUgYWN0aW9uJ3Mgb3duXG4gICAgICAgIC8vIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBzdXJmYWNlZCB0byB0aGUgY2FsbGVyOyBhIHN0dWNrIGNvdW50ZXJcbiAgICAgICAgLy8gcmVzb2x2ZXMgb24gdGhlIG5leHQgcGVyaW9kIHJlc2V0LlxuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGRlY3JlbWVudCBxdW90YSAoc2xvdCB3aWxsIHJlc2V0IG9uIG5leHQgcGVyaW9kKScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUXVvdGEgZGVjcmVtZW50ZWQnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlTGltaXRzKCBvcmdJZDogc3RyaW5nLFxuICAgICAgbGltaXRzOiBQYXJ0aWFsPFJlY29yZDxRdW90YVR5cGUsIG51bWJlcj4+LFxuICAgICAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICAgICAgcmVxdWVzdElkPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wdXQocGF0aCwgbGltaXRzLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB1cGRhdGUgcXVvdGEgbGltaXRzJywge1xuICAgICAgICAgIG9yZ0lkLCBsaW1pdHMsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnUXVvdGEgbGltaXRzIHVwZGF0ZWQnLCB7IG9yZ0lkLCBsaW1pdHMgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGllcihvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFUaWVyPiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfWA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhPzogeyB0aWVyPzogc3RyaW5nIH0gfTtcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICAgIH0+KHBhdGgsIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFFVT1RBX0ZBSUxfT1BFTjogdGllciBsb29rdXAgZmFpbGVkLCBkZWZhdWx0aW5nIHRvICR7REVGQVVMVF9USUVSfSB0aWVyYCwge1xuICAgICAgICAgIG9yZ0lkLCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSwgZGVmYXVsdFRpZXI6IERFRkFVTFRfVElFUixcbiAgICAgICAgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ3RpZXInLCByZWFzb246IHJlc3BvbnNlID8gJ25vbi1vaycgOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGU6ICd0aWVyJyB9KTtcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfVElFUjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGllciA9IHJlc3BvbnNlLmJvZHkuZGF0YT8ucXVvdGE/LnRpZXI7XG4gICAgICByZXR1cm4gdGllciAmJiBpc1ZhbGlkVGllcih0aWVyKSA/IHRpZXI6IERFRkFVTFRfVElFUjtcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzZXQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlPzogUXVvdGFUeXBlLCBhdXRoSGVhZGVyPzogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L3Jlc2V0YDtcblxuICAgICAgY29uc3QgYm9keSA9IHF1b3RhVHlwZSA/IHsgcXVvdGFUeXBlIH06IHt9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChwYXRoLCBib2R5LCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciA/PyAnJywgcmVxdWVzdElkKSB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZXNldCBxdW90YScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1F1b3RhIHJlc2V0JywgeyBvcmdJZCwgcXVvdGFUeXBlOiBxdW90YVR5cGUgPz8gJ2FsbCcgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCBxdW90YSBNRVRFUklORyBpbmNyZW1lbnQgd2l0aCBzdGFuZGFyZGl6ZWQgZXJyb3IgbG9nZ2luZy5cbiAqXG4gKiBBdXRoZW50aWNhdGVzIGFzIHRoZSBjYWxsaW5nIFNFUlZJQ0UgKHtAbGluayBnZXRRdW90YVNlcnZpY2VBdXRoSGVhZGVyfSksIG5ldmVyXG4gKiB3aXRoIHRoZSBlbmQgdXNlcidzIHRva2VuOiBgL3F1b3Rhcy86b3JnSWQvaW5jcmVtZW50YCBpcyBzZXJ2aWNlLXByaW5jaXBhbCAvXG4gKiBzeXN0ZW0tYWRtaW4gb25seSwgc28gYSBmb3J3YXJkZWQgdXNlciBKV1Qgd2FzIGFsd2F5cyByZWplY3RlZCAoNDAzKSBhbmQgdGhlXG4gKiBtZXRlcmVkIHF1b3RhIChlLmcuIGBhcGlDYWxsc2AsIGFuZCB0aGUgYGFwaV9wYWNrYCBidW5kbGUgcmFpc2luZyBpdCkgbmV2ZXJcbiAqIG1vdmVkLlxuICpcbiAqIEBwYXJhbSBxdW90YVNlcnZpY2UgLSBRdW90YSBzZXJ2aWNlIGNsaWVudFxuICogQHBhcmFtIG9yZ0lkIC0gT3JnYW5pemF0aW9uIElEIHdob3NlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWRcbiAqIEBwYXJhbSBxdW90YVR5cGUgLSBRdW90YSB0eXBlIHRvIGluY3JlbWVudFxuICogQHBhcmFtIGxvZ1dhcm4gLSBMb2dnaW5nIGZ1bmN0aW9uIGZvciB3YXJuaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5jcmVtZW50UXVvdGEoIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBvcmdJZDogc3RyaW5nLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbiAgbG9nV2FybjogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgcXVvdGFTZXJ2aWNlLmluY3JlbWVudChvcmdJZCwgcXVvdGFUeXBlLCBnZXRRdW90YVNlcnZpY2VBdXRoSGVhZGVyKG9yZ0lkKSkuY2F0Y2goKGVycjogdW5rbm93bikgPT5cbiAgICBsb2dXYXJuKCdRdW90YSBpbmNyZW1lbnQgZmFpbGVkJywgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZTogU3RyaW5nKGVycikgfSksXG4gICk7XG59XG5cbi8qKlxuICogQXRvbWljIHJlc2VydmUgaGVscGVyIGZvciB0aGUgXCJyZXNlcnZlICsgY29tbWl0IC8gcm9sbGJhY2tcIiBwYXR0ZXJuLlxuICogVXNlIGZvciBleHBlbnNpdmUgcmVzb3VyY2VzIChwaXBlbGluZXMsIHBsdWdpbnMsIEFJIGNhbGxzKSB3aGVyZSB0aGVcbiAqIGZpcmUtYW5kLWZvcmdldCBwb3N0LWhvYyBgaW5jcmVtZW50UXVvdGFgIGFsbG93cyBjb25jdXJyZW50IG92ZXItc3BlbmQuXG4gKlxuICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCByZXN1bHQgc28gdGhlIGNhbGxlciBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gcnVuXG4gKiB0aGUgZ2F0ZWQgYWN0aW9uIG9yIDQyOSB0aGUgY2xpZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXNlcnZhdGlvbiA9IGF3YWl0IHJlc2VydmVRdW90YShxdW90YVNlcnZpY2UsIG9yZ0lkLCAncGlwZWxpbmVzJywgYXV0aEhlYWRlcik7XG4gKiBpZiAocmVzZXJ2YXRpb24uZXhjZWVkZWQpIHJldHVybiBzZW5kUXVvdGFSZXNlcnZlRGVuaWVkKHJlcywgJ3BpcGVsaW5lcycsIHJlc2VydmF0aW9uKTtcbiAqIHRyeSB7XG4gKiBhd2FpdCBkb0V4cGVuc2l2ZVRoaW5nKCk7XG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqIC8vIFBhc3MgdGhlIHJlc2VydmVkIHJlc2V0QXQgc28gYSBwZXJpb2Qgcm9sbG92ZXIgZG9lc24ndCBnZXQgZG91YmxlLWNoYXJnZWQuXG4gKiBkZWNyZW1lbnRRdW90YShxdW90YVNlcnZpY2UsIG9yZ0lkLCAncGlwZWxpbmVzJywgYXV0aEhlYWRlciwgbG9nV2FybiwgMSwgcmVzZXJ2YXRpb24ucXVvdGEucmVzZXRBdCk7XG4gKiB0aHJvdyBlcnI7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2VydmVRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gIGFtb3VudDogbnVtYmVyID0gMSxcbiAgcmVxdWVzdElkPzogc3RyaW5nLFxuKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+IHtcbiAgcmV0dXJuIHF1b3RhU2VydmljZS5yZXNlcnZlKG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIsIGFtb3VudCwgcmVxdWVzdElkKTtcbn1cblxuLyoqIFNlY29uZHMgYSBjbGllbnQgc2hvdWxkIHdhaXQgYmVmb3JlIHJldHJ5aW5nIHdoZW4gcXVvdGEgY291bGRuJ3QgYmUgY29uZmlybWVkLiAqL1xuY29uc3QgUVVPVEFfVU5BVkFJTEFCTEVfUkVUUllfQUZURVJfU0VDT05EUyA9IDU7XG5cbi8qKlxuICogQW5zd2VyIGEgREVOSUVEIHJlc2VydmF0aW9uIChgcmVzZXJ2YXRpb24uZXhjZWVkZWQgPT09IHRydWVgKS5cbiAqXG4gKiAtIGB1bmF2YWlsYWJsZWAgKHRoZSBxdW90YSBzZXJ2aWNlIGNvdWxkbid0IGNvbmZpcm0gdGhlIHNsb3QpIOKGkiAqKjUwMyoqXG4gKiAgIGBTRVJWSUNFX1VOQVZBSUxBQkxFYCB3aXRoIGEgc2hvcnQgYFJldHJ5LUFmdGVyYDogdGhlIG9yZyBpcyBub3Qgb3ZlciBpdHNcbiAqICAgbGltaXQsIHNvIGEgNDI5IFwicXVvdGEgZXhjZWVkZWRcIiB3b3VsZCBzZW5kIHVzZXJzIHRvIHVwZ3JhZGUgZm9yIGFuIG91dGFnZS5cbiAqIC0gb3RoZXJ3aXNlIOKGkiB0aGUgc3RhbmRhcmQgNDI5IGBRVU9UQV9FWENFRURFRGAgd2l0aCB0aGUgWC1RdW90YS0qIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW5kUXVvdGFSZXNlcnZlRGVuaWVkKHJlczogUmVzcG9uc2UsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCByZXNlcnZhdGlvbjogUXVvdGFSZXNlcnZlUmVzdWx0KTogdm9pZCB7XG4gIGlmIChyZXNlcnZhdGlvbi51bmF2YWlsYWJsZSkge1xuICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSByZXMuc2V0SGVhZGVyKCdSZXRyeS1BZnRlcicsIFFVT1RBX1VOQVZBSUxBQkxFX1JFVFJZX0FGVEVSX1NFQ09ORFMpO1xuICAgIHNlbmRFcnJvcihcbiAgICAgIHJlcyxcbiAgICAgIDUwMyxcbiAgICAgIGBVbmFibGUgdG8gY29uZmlybSAke3F1b3RhVHlwZX0gcXVvdGEgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIHNob3J0bHkuYCxcbiAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbmRRdW90YUV4Y2VlZGVkKHJlcywgcXVvdGFUeXBlLCByZXNlcnZhdGlvbi5xdW90YSwgcmVzZXJ2YXRpb24ucXVvdGEucmVzZXRBdCk7XG59XG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IHJvbGxiYWNrIGZvciBhIHByZXZpb3VzbHkgcmVzZXJ2ZWQgcXVvdGEgc2xvdC5cbiAqIExvZ3Mgb24gZmFpbHVyZSBidXQgbmV2ZXIgdGhyb3dzICB0aGUgYWN0aW9uIHRoYXQgbmVlZGVkIHRoZSByb2xsYmFja1xuICogaGFzIGFscmVhZHkgZmFpbGVkLCBubyBwb2ludCBjb21wb3VuZGluZyB0aGUgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNyZW1lbnRRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gIGxvZ1dhcm46IChtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkLFxuICBhbW91bnQ6IG51bWJlciA9IDEsXG4gIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZyxcbik6IHZvaWQge1xuICBxdW90YVNlcnZpY2UuZGVjcmVtZW50KG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIsIGFtb3VudCwgcmVzZXRBdFNuYXBzaG90KS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PlxuICAgIGxvZ1dhcm4oJ1F1b3RhIHJvbGxiYWNrIGZhaWxlZCcsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2U6IFN0cmluZyhlcnIpIH0pLFxuICApO1xufVxuIl19
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcXVvdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUl0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFrQixNQUFNLHlCQUF5QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUYsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXJDLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSxnRkFBZ0Y7QUFDaEYsaUZBQWlGO0FBQ2pGLG9FQUFvRTtBQUNwRSxtRUFBbUU7QUFDbkUsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEtBQUssTUFBTSxDQUFDO0FBRS9FOzs7Ozs7Ozs7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LEdBQUcsQ0FBQyxDQUFDO0FBRWhEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsR0FBYSxFQUFFLFNBQW9CLEVBQUUsV0FBK0I7SUFDekcsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXO1lBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUscUNBQXFDLENBQUMsQ0FBQztRQUMxRixTQUFTLENBQ1AsR0FBRyxFQUNILEdBQUcsRUFDSCxxQkFBcUIsU0FBUyw2Q0FBNkMsRUFDM0UsU0FBUyxDQUFDLG1CQUFtQixDQUM5QixDQUFDO1FBQ0YsT0FBTztJQUNULENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUUsWUFBMEIsRUFDeEQsS0FBYSxFQUNiLFNBQW9CLEVBQ3BCLFVBQWtCLEVBQ2xCLE9BQWtELEVBQ2xELE1BQU0sR0FBVyxDQUFDLEVBQ2xCLGVBQXdCO0lBRXhCLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVksRUFBRSxFQUFFLENBQ25HLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUMvRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUeXBlLCBRdW90YUNoZWNrUmVzdWx0LCBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCB7IERFRkFVTFRfVElFUiwgaXNWYWxpZFRpZXIsIHR5cGUgUXVvdGFUaWVyIH0gZnJvbSAnLi4vdHlwZXMvcXVvdGEtdGllcnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBzZW5kRXJyb3IsIHNlbmRRdW90YUV4Y2VlZGVkIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIFJldHJ5IG9wdGlvbnMgZm9yIHF1b3RhIGNhbGxzIOKAlCBmYWlsIGZhc3QgKGEgc2xvdyBxdW90YSBzZXJ2aWNlIG11c3Qgbm90IHN0YWxsIHRoZSByZXF1ZXN0KS5cbiAqXG4gKiBORVZFUiByZXRyeSBhIDQyOS4gVGhlIHF1b3RhIHNlcnZpY2UgYW5zd2VycyBhbiBvdmVyLWxpbWl0IG9yZyB3aXRoIDQyOVxuICogUVVPVEFfRVhDRUVERUQgYW5kIGBSZXRyeS1BZnRlcmAgPSBzZWNvbmRzIHVudGlsIHRoZSBwZXJpb2QgcmVzZXRzOyB0aGUgSFRUUFxuICogY2xpZW50IGhvbm9ycyB0aGF0IChjYXBwZWQgYXQgNjBzKSwgc28gYSBzaW5nbGUgcmF0ZS1saW1pdCByZXRyeSBzdGFsbGVkIHRoZVxuICogcmVxdWVzdCB3ZWxsIHBhc3QgdGhlIGhhbmRsZXIgdGltZW91dCwgd2hpY2ggdGhlbiBhbnN3ZXJlZCA1MDMgYW5kIHRoZSByZWFsXG4gKiA0Mjkgd2FzIGxvc3QuIEEgNDI5IGlzIGEgZmluYWwgYW5zd2VyIGhlcmUuXG4gKi9cbmNvbnN0IFFVT1RBX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMCxcbiAgbWF4UmV0cmllczogMSxcbn07XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncXVvdGEnKTtcblxuLy8gUkVTRVJWRSBGQUlMIE1PREUg4oCUIGV4cGxpY2l0LCBzaW5nbGUgcG9saWN5LlxuLy9cbi8vIGByZXNlcnZlYCBnYXRlcyBFWFBFTlNJVkUsIGJpbGxhYmxlIHJlc291cmNlcyAocGlwZWxpbmVzLCBwbHVnaW4gYnVpbGRzLCBBSVxuLy8gY2FsbHMsIHBsYXRmb3JtIGZlYXR1cmUgc2xvdHMpLiBFdmVyeSBxdW90YSB0eXBlIGlzIGEgcGVyLXBlcmlvZCBGTE9XIGNvdW50ZXJcbi8vIHdpdGggbm8gYWZ0ZXItdGhlLWZhY3QgcmVjb25jaWxpYXRpb246IGEgdW5pdCBjb25zdW1lZCB3aGlsZSB0aGUgcmVzZXJ2YXRpb25cbi8vIGNvdWxkIG5vdCBiZSBjb25maXJtZWQgaXMgbmV2ZXIgY291bnRlZCwgc28gZmFpbC1vcGVuIGxldHMgYW4gb3JnIGNvbnN1bWVcbi8vIHVuYm91bmRlZCB1bm1ldGVyZWQgdW5pdHMgZm9yIHRoZSB3aG9sZSBsZW5ndGggb2YgYW4gaW5jaWRlbnQg4oCUIGFuZCBhblxuLy8gdW5jb25maXJtZWQgcmVzZXJ2ZSAodGltZW91dCwgb3BlbiBjaXJjdWl0KSBtYXkgZXZlbiBoYXZlIGxhbmRlZCBzZXJ2ZXItc2lkZS5cbi8vIFNvIGByZXNlcnZlYCBmYWlscyBDTE9TRUQgd2hlbmV2ZXIgdGhlIHF1b3RhIHNlcnZpY2UgZGlkIG5vdCBDT05GSVJNIHRoZSBzbG90OlxuLy8gICAtIHVucmVhY2hhYmxlIC8gdGltZWQgb3V0IC8gY2lyY3VpdCBicmVha2VyIG9wZW4gKG5vIHJlc3BvbnNlKSxcbi8vICAgLSBhIHJlYWNoYWJsZS1idXQtZXJyb3JlZCByZXNwb25zZSAoNXh4LCA0eHgsIG1hbGZvcm1lZCBib2R5KSxcbi8vICAgLSBhIDQyOSB0aGF0IGlzIE5PVCBhIGdlbnVpbmUgUVVPVEFfRVhDRUVERUQgKGdhdGV3YXkgLyByYXRlIGxpbWl0ZXIpLlxuLy8gT3BlcmF0b3JzIHdobyBwcmVmZXIgYXZhaWxhYmlsaXR5IG92ZXIgZW5mb3JjZW1lbnQgb3B0IHRoZSBXSE9MRSBzZXQgaW50b1xuLy8gZmFpbC1vcGVuIHdpdGggUVVPVEFfUkVTRVJWRV9GQUlMX09QRU49dHJ1ZS4gQm90aCBvdXRjb21lcyBlbWl0IGEgY291bnRlclxuLy8gKGBxdW90YV9mYWlsX2Nsb3NlZF90b3RhbGAgLyBgcXVvdGFfZmFpbF9vcGVuX3RvdGFsYCkgdGFnZ2VkIHdpdGggdGhlIHJlYXNvbi5cbi8vIGBjaGVja2AgKGEgY2hlYXAgcmVhZCBnYXRlKSBzdGF5cyBmYWlsLW9wZW47IGBpbmNyZW1lbnRgIGlzIGZpcmUtYW5kLWZvcmdldC5cbmNvbnN0IFFVT1RBX1JFU0VSVkVfRkFJTF9PUEVOID0gcHJvY2Vzcy5lbnYuUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gPT09ICd0cnVlJztcblxuLyoqXG4gKiBTZXJ2aWNlLXByaW5jaXBhbCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIGZvciBhIHF1b3RhIGNhbGwgbWFkZSBvbiBiZWhhbGYgb2ZcbiAqIGBvcmdJZGAgYnkgdGhlIENVUlJFTlQgc2VydmljZSAoYFNFUlZJQ0VfTkFNRWAsIHRoZSBzYW1lIGlkZW50aXR5IHRoZSBoZWFsdGhcbiAqIHJvdXRlciByZXBvcnRzKS5cbiAqXG4gKiBUaGUgcXVvdGEgc2VydmljZSdzIG11dGF0aW9uIGVuZHBvaW50cyAoYC86b3JnSWQvaW5jcmVtZW50YCwgYC9kZWNyZW1lbnRgKVxuICogcmVqZWN0IGFueXRoaW5nIGJ1dCBhIHNpZ25lZCBzZXJ2aWNlIHByaW5jaXBhbCBvciBhIHN5c3RlbSBhZG1pbiwgc29cbiAqIGZvcndhcmRpbmcgdGhlIGVuZCB1c2VyJ3MgYmVhcmVyIHRva2VuIHRoZXJlIGlzIGFsd2F5cyBhIDQwMy4gU2VydmljZSB0b2tlbnNcbiAqIGFyZSBhbHNvIGV4ZW1wdCBmcm9tIHRoZSBxdW90YSBzZXJ2aWNlJ3MgcGVyLUlQIHJhdGUgbGltaXRlciwgc28gaG90LXBhdGhcbiAqIHF1b3RhIHRyYWZmaWMgZnJvbSBhIGJ1c3kgcG9kIGNhbid0IGV4aGF1c3QgdGhhdCBwb2QgSVAncyBidWNrZXQgYW5kIHNpbGVudGx5XG4gKiB0dXJuIGVuZm9yY2VtZW50IG9mZi4gU2NvcGVkIHRvIHRoZSB0YXJnZXQgb3JnIHdpdGggdGhlIGxvd2VzdCByb2xlIChtZW1iZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVvdGFTZXJ2aWNlQXV0aEhlYWRlcihvcmdJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWU6IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAnYXBpJywgb3JnSWQsIHJvbGU6ICdtZW1iZXInIH0pO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN5bmNocm9ub3VzIHF1b3RhIHJlc2VydmF0aW9uICB0aGUgYXRvbWljIGNoZWNrK2luY3JlbWVudFxuICogdmFyaWFudC4gYGV4Y2VlZGVkOiB0cnVlYCBtZWFucyB0aGUgb3BlcmF0aW9uIHdhcyByZWplY3RlZCBhdCB0aGUgREJcbiAqIGxldmVsOyB0aGUgY2FsbGVyIHNob3VsZCByZXR1cm4gNDI5IHdpdGhvdXQgcnVubmluZyB0aGUgZ2F0ZWQgYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIC8qKiBUcnVlIHdoZW4gdGhlIHNsb3Qgd2FzIE5PVCByZXNlcnZlZCDigJQgdGhlIGdhdGVkIGFjdGlvbiBtdXN0IG5vdCBydW4uICovXG4gIGV4Y2VlZGVkOiBib29sZWFuO1xuICAvKipcbiAgICogU2V0ICh0cnVlKSBieSB0aGUgcXVvdGEgQ0xJRU5UIHdoZW4gdGhlIHJlc2VydmF0aW9uIHdhcyBkZW5pZWQgYmVjYXVzZSB0aGVcbiAgICogcXVvdGEgc2VydmljZSBjb3VsZCBub3QgQ09ORklSTSBpdCAodW5yZWFjaGFibGUgLyB0aW1lb3V0IC8gY2lyY3VpdCBvcGVuIC9cbiAgICogZXJyb3JlZCkg4oCUIG5vdCBiZWNhdXNlIHRoZSBvcmcgaXMgb3ZlciBpdHMgbGltaXQuIEFsd2F5cyBwYWlyZWQgd2l0aFxuICAgKiBgZXhjZWVkZWQ6IHRydWVgLiBBbnN3ZXIgd2l0aCB7QGxpbmsgc2VuZFF1b3RhUmVzZXJ2ZURlbmllZH0sIHdoaWNoIG1hcHMgaXQgdG9cbiAgICogNTAzIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIDQyOSBcInF1b3RhIGV4Y2VlZGVkXCIuXG4gICAqL1xuICB1bmF2YWlsYWJsZT86IGJvb2xlYW47XG4gIHF1b3RhOiB7XG4gICAgdHlwZTogUXVvdGFUeXBlO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgdXNlZDogbnVtYmVyO1xuICAgIHJlbWFpbmluZzogbnVtYmVyO1xuICAgIHJlc2V0QXQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbi8qKlxuICogUXVvdGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhU2VydmljZSB7XG4gIC8qKiBDaGVjayBpZiBxdW90YSBpcyBhdmFpbGFibGUgKGZhaWwtb3BlbiBvbiBlcnJvcikuICovXG4gIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD47XG4gIC8qKiBJbmNyZW1lbnQgcXVvdGEgdXNhZ2UuIFJldHVybnMgYSBwcm9taXNlIHNvIGNhbGxlcnMgY2FuIG9wdGlvbmFsbHkgaGFuZGxlIGVycm9ycy4gKi9cbiAgaW5jcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEF0b21pYyByZXNlcnZlICB0aGUgc2FtZSBhdG9taWMgY2hlY2sraW5jcmVtZW50IGFzIGBpbmNyZW1lbnRgLCBidXRcbiAgICogcGFyc2VzIHRoZSByZXNwb25zZSBzbyBjYWxsZXJzIGNhbiBzZWUgd2hldGhlciB0aGUgc2xvdCB3YXMgYWN0dWFsbHlcbiAgICogcmVzZXJ2ZWQuIFVzZSB0aGlzIGZvciBleHBlbnNpdmUgcmVzb3VyY2VzIHdoZXJlIHRoZSBwb3N0LWhvYyBmaXJlLVxuICAgKiBhbmQtZm9yZ2V0IHBhdHRlcm4gYWxsb3dzIGNvbmN1cnJlbnQgb3Zlci1zcGVuZC5cbiAgICpcbiAgICogRmFpbHMgQ0xPU0VEIChgZXhjZWVkZWQ6IHRydWVgKSB3aGVuZXZlciB0aGUgc2xvdCBpcyBub3QgY29uZmlybWVkIOKAlFxuICAgKiB1bnJlYWNoYWJsZSwgdGltZW91dCwgb3BlbiBjaXJjdWl0LCBub24tb2ssIG9yIGEgbm9uLXF1b3RhIDQyOSDigJQgdW5sZXNzXG4gICAqIGBRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTj10cnVlYCAoc2VlIHRoZSBwb2xpY3kgbm90ZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSkuXG4gICAqL1xuICByZXNlcnZlKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudD86IG51bWJlciwgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+O1xuICAvKipcbiAgICogUm9sbCBiYWNrIGEgcHJldmlvdXNseSByZXNlcnZlZCBzbG90LiBGaXJlLWFuZC1mb3JnZXQg4oCUIG5ldmVyIHRocm93cy5cbiAgICogUGFzcyBgcmVzZXRBdFNuYXBzaG90YCAodGhlIGBxdW90YS5yZXNldEF0YCBvYnNlcnZlZCB3aGVuIHRoZSBzbG90IHdhc1xuICAgKiByZXNlcnZlZCkgdG8gbWFrZSB0aGUgcm9sbGJhY2sgY29uZGl0aW9uYWw6IGlmIHRoZSBwZXJpb2Qgcm9sbGVkIG92ZXJcbiAgICogYmV0d2VlbiByZXNlcnZlIGFuZCByb2xsYmFjaywgdGhlIHNlcnZlciBza2lwcyB0aGUgZGVjcmVtZW50IHNvIGl0IGRvZXNuJ3RcbiAgICogc3RlYWwgY2FwYWNpdHkgZnJvbSB0aGUgbmV3IHBlcmlvZC5cbiAgICovXG4gIGRlY3JlbWVudChvcmdJZDogc3RyaW5nLCBxdW90YVR5cGU6IFF1b3RhVHlwZSwgYXV0aEhlYWRlcjogc3RyaW5nLCBhbW91bnQ/OiBudW1iZXIsIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFVwZGF0ZSBxdW90YSBsaW1pdHMuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqL1xuICB1cGRhdGVMaW1pdHMob3JnSWQ6IHN0cmluZywgbGltaXRzOiBQYXJ0aWFsPFJlY29yZDxRdW90YVR5cGUsIG51bWJlcj4+LCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKiBSZXNldCBxdW90YSB1c2FnZS4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuICovXG4gIHJlc2V0KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZT86IFF1b3RhVHlwZSwgYXV0aEhlYWRlcj86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIEdldCB0aGUgb3JnJ3MgcXVvdGEgYFF1b3RhVGllcmAuIFVzZWQgYnkgdGhlIHBsdWdpbi1idWlsZCBxdWV1ZSBwYXJ0aXRpb25pbmdcbiAgICogdG8gcm91dGUgYSBidWlsZCB0byB0aGUgcmlnaHQgcGVyLXRpZXIgcXVldWUuIEZhaWwtb3BlbiByZXR1cm5zIGBERUZBVUxUX1RJRVJgXG4gICAqIChgZGV2ZWxvcGVyYCB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCwgYHVubGltaXRlZGAgd2hlbiBpdCdzIGRpc2FibGVkKTsgYVxuICAgKiBtaXNjbGFzc2lmaWVkIG9yZyBzdGlsbCBidWlsZHMgb24gdGhlIGRlZmF1bHQgcXVldWUsIGp1c3Qgd2l0aG91dCB0aGVcbiAgICogdGllci1zY29wZWQgc2NoZWR1bGluZyBib29zdC5cbiAgICovXG4gIGdldFRpZXIob3JnSWQ6IHN0cmluZywgYXV0aEhlYWRlcjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhVGllcj47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcXVvdGEgc2VydmljZSBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFTZXJ2aWNlQ29uZmlnIHtcbiAgLyoqIFF1b3RhIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFFVT1RBX1NFUlZJQ0VfSE9TVCBvciAncXVvdGEnKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUXVvdGEgc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUVVPVEFfU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiA1MDAwKSAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFwcGx5IHRoZSBleHBsaWNpdCByZXNlcnZlIGZhaWwtbW9kZSBwb2xpY3kgdG8gYSByZXNlcnZhdGlvbiB0aGUgcXVvdGEgc2VydmljZVxuICogZGlkIE5PVCBjb25maXJtIChzZWUgUVVPVEFfUkVTRVJWRV9GQUlMX09QRU4gYWJvdmUpLiBEZWZhdWx0OiBkZW55LlxuICovXG5mdW5jdGlvbiB1bmNvbmZpcm1lZFJlc2VydmUoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICByZWFzb246ICd1bnJlYWNoYWJsZScgfCAndHJhbnNpZW50LTQyOScgfCAnbm9uLW9rJyxcbiAgc3RhdHVzQ29kZT86IG51bWJlcixcbik6IFF1b3RhUmVzZXJ2ZVJlc3VsdCB7XG4gIGlmIChRVU9UQV9SRVNFUlZFX0ZBSUxfT1BFTikge1xuICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IHF1b3RhIHJlc2VydmUgbm90IGNvbmZpcm1lZCwgYWxsb3dpbmcgcmVxdWVzdCcsIHsgb3JnSWQsIHF1b3RhVHlwZSwgcmVhc29uLCBzdGF0dXNDb2RlIH0pO1xuICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ3Jlc2VydmUnLCByZWFzb24sIHF1b3RhVHlwZSB9KTtcbiAgICByZXR1cm4geyBleGNlZWRlZDogZmFsc2UsIHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IC0xLCB1c2VkOiAwLCByZW1haW5pbmc6IC0xIH0gfTtcbiAgfVxuICBsb2dnZXIud2FybignUVVPVEFfRkFJTF9DTE9TRUQ6IHF1b3RhIHJlc2VydmUgbm90IGNvbmZpcm1lZCwgZGVueWluZyByZXF1ZXN0JywgeyBvcmdJZCwgcXVvdGFUeXBlLCByZWFzb24sIHN0YXR1c0NvZGUgfSk7XG4gIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX2Nsb3NlZF90b3RhbCcsIHsgb3BlcmF0aW9uOiAncmVzZXJ2ZScsIHJlYXNvbiwgcXVvdGFUeXBlIH0pO1xuICByZXR1cm4geyBleGNlZWRlZDogdHJ1ZSwgdW5hdmFpbGFibGU6IHRydWUsIHF1b3RhOiB7IHR5cGU6IHF1b3RhVHlwZSwgbGltaXQ6IDAsIHVzZWQ6IDAsIHJlbWFpbmluZzogMCB9IH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZmFpbC1vcGVuIHF1b3RhIHJlc3VsdCAoYWxsb3dzIHRoZSByZXF1ZXN0KS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmFpbE9wZW5SZXN1bHQoKTogUXVvdGFDaGVja1Jlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZDogdHJ1ZSxcbiAgICBsaW1pdDogLTEsXG4gICAgdXNlZDogMCxcbiAgICByZW1haW5pbmc6IC0xLFxuICAgIHJlc2V0QXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB1bmxpbWl0ZWQ6IHRydWUsXG4gICAgLy8gVGFnIHRoZSBzZW50aW5lbCBzbyBmYWlsLWNsb3NlZCBjYWxsZXJzIGNhbiB0ZWxsIGFuIG91dGFnZSBhcGFydCBmcm9tIGFcbiAgICAvLyByZWFsIHVubGltaXRlZCAoLTEpIHJlYWRpbmcuIFJlYWwgcXVvdGEgcmVzdWx0cyBuZXZlciBzZXQgdGhpcy5cbiAgICBmYWlsT3BlbjogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBjb21tb24gcmVxdWVzdCBoZWFkZXJzIHdpdGggb3B0aW9uYWwgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRIZWFkZXJzKG9yZ0lkOiBzdHJpbmcsIGF1dGhIZWFkZXI/OiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAneC1vcmctaWQnOiBvcmdJZCB9O1xuICBpZiAoYXV0aEhlYWRlcikgaGVhZGVycy5BdXRob3JpemF0aW9uID0gYXV0aEhlYWRlcjtcbiAgaWYgKHJlcXVlc3RJZCkgaGVhZGVyc1snWC1SZXF1ZXN0LUlkJ10gPSByZXF1ZXN0SWQ7XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHF1b3RhIHNlcnZpY2UgY2xpZW50LlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBzZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIFF1b3RhIHNlcnZpY2UgY2xpZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHF1b3RhU2VydmljZSA9IGNyZWF0ZVF1b3RhU2VydmljZSgpO1xuICpcbiAqIC8vIENoZWNrIHF1b3RhIGJlZm9yZSBwcm9jZXNzaW5nXG4gKiBjb25zdCBxdW90YSA9IGF3YWl0IHF1b3RhU2VydmljZS5jaGVjayhvcmdJZCwgJ2FwaUNhbGxzJywgYXV0aEhlYWRlcik7XG4gKiBpZiAoIXF1b3RhLmFsbG93ZWQpIHtcbiAqIHJldHVybiByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUXVvdGEgZXhjZWVkZWQnIH0pO1xuICogfVxuICpcbiAqIC8vIEluY3JlbWVudCBxdW90YSBhZnRlciBzdWNjZXNzXG4gKiBxdW90YVNlcnZpY2UuaW5jcmVtZW50KG9yZ0lkLCAnYXBpQ2FsbHMnLCBhdXRoSGVhZGVyKS5jYXRjaChlcnIgPT4gbG9nZ2VyLndhcm4oJ1F1b3RhIGluY3JlbWVudCBmYWlsZWQnLCB7IGVycm9yOiBlcnIgfSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdW90YVNlcnZpY2UoY29uZmlnOiBRdW90YVNlcnZpY2VDb25maWcgPSB7fSk6IFF1b3RhU2VydmljZSB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gcHJvY2Vzcy5lbnYuUVVPVEFfU0VSVklDRV9IT1NUID8/ICdxdW90YScsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUVVPVEFfU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IDUwMDAsXG4gIH07XG5cbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlU2FmZUNsaWVudChzZXJ2aWNlQ29uZmlnKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNoZWNrKG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFDaGVja1Jlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vJHtlbmNvZGVVUklDb21wb25lbnQocXVvdGFUeXBlKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8e1xuICAgICAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgICAgICBkYXRhPzogeyBxdW90YVR5cGU6IHN0cmluZzsgc3RhdHVzOiBRdW90YUNoZWNrUmVzdWx0IH07XG4gICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSwgLi4uUVVPVEFfUkVRVUVTVF9PUFRJT05TIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIHNlcnZpY2UgdW5yZWFjaGFibGUsIGFsbG93aW5nIHJlcXVlc3QnLCB7IG9yZ0lkLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ2NoZWNrJywgcmVhc29uOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGUgfSk7XG4gICAgICAgIHJldHVybiBjcmVhdGVGYWlsT3BlblJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MgfHwgIXJlc3BvbnNlLmJvZHkuZGF0YT8uc3RhdHVzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdRVU9UQV9GQUlMX09QRU46IFF1b3RhIGNoZWNrIHJldHVybmVkIG5vbi1vaywgYWxsb3dpbmcgcmVxdWVzdCcsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLCBtZXNzYWdlOiByZXNwb25zZS5ib2R5Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICBlbWl0Q291bnRlcigncXVvdGFfZmFpbF9vcGVuX3RvdGFsJywgeyBvcGVyYXRpb246ICdjaGVjaycsIHJlYXNvbjogJ25vbi1vaycsIHF1b3RhVHlwZSB9KTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZhaWxPcGVuUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNwb25zZS5ib2R5LmRhdGEuc3RhdHVzO1xuICAgIH0sXG5cbiAgICBhc3luYyBpbmNyZW1lbnQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2luY3JlbWVudGA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50XG4gICAgICAgIC5wb3N0KHBhdGgsIHsgcXVvdGFUeXBlLCBhbW91bnQgfSwgeyBoZWFkZXJzOiBidWlsZEhlYWRlcnMob3JnSWQsIGF1dGhIZWFkZXIsIHJlcXVlc3RJZCksIC4uLlFVT1RBX1JFUVVFU1RfT1BUSU9OUyB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBpbmNyZW1lbnQgcXVvdGEnLCB7XG4gICAgICAgICAgb3JnSWQsIHF1b3RhVHlwZSwgYW1vdW50LCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1F1b3RhIGluY3JlbWVudGVkJywgeyBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc2VydmUob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlOiBRdW90YVR5cGUsIGF1dGhIZWFkZXI6IHN0cmluZywgYW1vdW50OiBudW1iZXIgPSAxLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPFF1b3RhUmVzZXJ2ZVJlc3VsdD4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX0vaW5jcmVtZW50YDtcblxuICAgICAgLy8gMjAwIGNhcnJpZXMgYGRhdGEucXVvdGFgOyA0MjkgKFFVT1RBX0VYQ0VFREVEKSBjYXJyaWVzIGBkZXRhaWxzLnF1b3RhYC5cbiAgICAgIC8vIEJvdGggc2hhcGVzIGFyZSBub3JtYWxpemVkIGludG8gUXVvdGFSZXNlcnZlUmVzdWx0LlxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIGRldGFpbHM/OiB7IHF1b3RhPzogUXVvdGFSZXNlcnZlUmVzdWx0WydxdW90YSddIH07XG4gICAgICAgIC8qKiBgc2VuZEVycm9yYCdzIGVycm9yLWNvZGUgZmllbGQuICovXG4gICAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgICB9PihwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50IH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UpIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3VucmVhY2hhYmxlJyk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlc3BvbnNlLmJvZHkuZGV0YWlscz8ucXVvdGE7XG4gICAgICAgIC8vIE9ubHkgYSBHRU5VSU5FIHF1b3RhLWV4Y2VlZGVkIDQyOSBtZWFucyBcIm92ZXIgcXVvdGFcIi4gQSBnZW5lcmljIDQyOSDigJRcbiAgICAgICAgLy8gYW4gaW50ZXJ2ZW5pbmcgZ2F0ZXdheSBvciByYXRlIGxpbWl0ZXIg4oCUIGRpZCBub3QgY29uZmlybSBhbnl0aGluZywgc29cbiAgICAgICAgLy8gaXQgZ29lcyB0aHJvdWdoIHRoZSBzYW1lIHVuY29uZmlybWVkLXJlc2VydmF0aW9uIHBvbGljeSBhcyBhbiBvdXRhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZS5ib2R5LmNvZGUgPT09IEVycm9yQ29kZS5RVU9UQV9FWENFRURFRCB8fCBxKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4Y2VlZGVkOiB0cnVlLFxuICAgICAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAwLCB1c2VkOiAwLCByZW1haW5pbmc6IDAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ3RyYW5zaWVudC00MjknLCByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCB8fCAhcmVzcG9uc2UuYm9keS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB1bmNvbmZpcm1lZFJlc2VydmUob3JnSWQsIHF1b3RhVHlwZSwgJ25vbi1vaycsIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxID0gcmVzcG9uc2UuYm9keS5kYXRhPy5xdW90YTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4Y2VlZGVkOiBmYWxzZSxcbiAgICAgICAgcXVvdGE6IHEgPz8geyB0eXBlOiBxdW90YVR5cGUsIGxpbWl0OiAtMSwgdXNlZDogMCwgcmVtYWluaW5nOiAtMSB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVjcmVtZW50KG9yZ0lkOiBzdHJpbmcsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCBhdXRoSGVhZGVyOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyID0gMSwgcmVzZXRBdFNuYXBzaG90Pzogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L2RlY3JlbWVudGA7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudFxuICAgICAgICAucG9zdChwYXRoLCB7IHF1b3RhVHlwZSwgYW1vdW50LCAuLi4ocmVzZXRBdFNuYXBzaG90ICYmIHsgcmVzZXRBdFNuYXBzaG90IH0pIH0sIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgIC8vIFJvbGxiYWNrIGZhaWx1cmUgaXMgbG9nZ2VkIGJ1dCBuZXZlciBwcm9wYWdhdGVkICB0aGUgYWN0aW9uJ3Mgb3duXG4gICAgICAgIC8vIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBzdXJmYWNlZCB0byB0aGUgY2FsbGVyOyBhIHN0dWNrIGNvdW50ZXJcbiAgICAgICAgLy8gcmVzb2x2ZXMgb24gdGhlIG5leHQgcGVyaW9kIHJlc2V0LlxuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGRlY3JlbWVudCBxdW90YSAoc2xvdCB3aWxsIHJlc2V0IG9uIG5leHQgcGVyaW9kKScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBhbW91bnQsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUXVvdGEgZGVjcmVtZW50ZWQnLCB7IG9yZ0lkLCBxdW90YVR5cGUsIGFtb3VudCB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlTGltaXRzKCBvcmdJZDogc3RyaW5nLFxuICAgICAgbGltaXRzOiBQYXJ0aWFsPFJlY29yZDxRdW90YVR5cGUsIG51bWJlcj4+LFxuICAgICAgYXV0aEhlYWRlcjogc3RyaW5nLFxuICAgICAgcmVxdWVzdElkPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgcGF0aCA9IGAvcXVvdGFzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG9yZ0lkKX1gO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wdXQocGF0aCwgbGltaXRzLCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciwgcmVxdWVzdElkKSB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB1cGRhdGUgcXVvdGEgbGltaXRzJywge1xuICAgICAgICAgIG9yZ0lkLCBsaW1pdHMsIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnUXVvdGEgbGltaXRzIHVwZGF0ZWQnLCB7IG9yZ0lkLCBsaW1pdHMgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0VGllcihvcmdJZDogc3RyaW5nLCBhdXRoSGVhZGVyOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZyk6IFByb21pc2U8UXVvdGFUaWVyPiB7XG4gICAgICBjb25zdCBwYXRoID0gYC9xdW90YXMvJHtlbmNvZGVVUklDb21wb25lbnQob3JnSWQpfWA7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDx7XG4gICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIGRhdGE/OiB7IHF1b3RhPzogeyB0aWVyPzogc3RyaW5nIH0gfTtcbiAgICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICAgIH0+KHBhdGgsIHsgaGVhZGVyczogYnVpbGRIZWFkZXJzKG9yZ0lkLCBhdXRoSGVhZGVyLCByZXF1ZXN0SWQpLCAuLi5RVU9UQV9SRVFVRVNUX09QVElPTlMgfSk7XG5cbiAgICAgIGlmICghcmVzcG9uc2UgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwIHx8ICFyZXNwb25zZS5ib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFFVT1RBX0ZBSUxfT1BFTjogdGllciBsb29rdXAgZmFpbGVkLCBkZWZhdWx0aW5nIHRvICR7REVGQVVMVF9USUVSfSB0aWVyYCwge1xuICAgICAgICAgIG9yZ0lkLCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSwgZGVmYXVsdFRpZXI6IERFRkFVTFRfVElFUixcbiAgICAgICAgfSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdxdW90YV9mYWlsX29wZW5fdG90YWwnLCB7IG9wZXJhdGlvbjogJ3RpZXInLCByZWFzb246IHJlc3BvbnNlID8gJ25vbi1vaycgOiAndW5yZWFjaGFibGUnLCBxdW90YVR5cGU6ICd0aWVyJyB9KTtcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfVElFUjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGllciA9IHJlc3BvbnNlLmJvZHkuZGF0YT8ucXVvdGE/LnRpZXI7XG4gICAgICByZXR1cm4gdGllciAmJiBpc1ZhbGlkVGllcih0aWVyKSA/IHRpZXI6IERFRkFVTFRfVElFUjtcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVzZXQob3JnSWQ6IHN0cmluZywgcXVvdGFUeXBlPzogUXVvdGFUeXBlLCBhdXRoSGVhZGVyPzogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBgL3F1b3Rhcy8ke2VuY29kZVVSSUNvbXBvbmVudChvcmdJZCl9L3Jlc2V0YDtcblxuICAgICAgY29uc3QgYm9keSA9IHF1b3RhVHlwZSA/IHsgcXVvdGFUeXBlIH06IHt9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChwYXRoLCBib2R5LCB7IGhlYWRlcnM6IGJ1aWxkSGVhZGVycyhvcmdJZCwgYXV0aEhlYWRlciA/PyAnJywgcmVxdWVzdElkKSB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZSB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZXNldCBxdW90YScsIHtcbiAgICAgICAgICBvcmdJZCwgcXVvdGFUeXBlLCBzdGF0dXNDb2RlOiByZXNwb25zZT8uc3RhdHVzQ29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1F1b3RhIHJlc2V0JywgeyBvcmdJZCwgcXVvdGFUeXBlOiBxdW90YVR5cGUgPz8gJ2FsbCcgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEZpcmUtYW5kLWZvcmdldCBxdW90YSBNRVRFUklORyBpbmNyZW1lbnQgd2l0aCBzdGFuZGFyZGl6ZWQgZXJyb3IgbG9nZ2luZy5cbiAqXG4gKiBBdXRoZW50aWNhdGVzIGFzIHRoZSBjYWxsaW5nIFNFUlZJQ0UgKHtAbGluayBnZXRRdW90YVNlcnZpY2VBdXRoSGVhZGVyfSksIG5ldmVyXG4gKiB3aXRoIHRoZSBlbmQgdXNlcidzIHRva2VuOiBgL3F1b3Rhcy86b3JnSWQvaW5jcmVtZW50YCBpcyBzZXJ2aWNlLXByaW5jaXBhbCAvXG4gKiBzeXN0ZW0tYWRtaW4gb25seSwgc28gYSBmb3J3YXJkZWQgdXNlciBKV1Qgd2FzIGFsd2F5cyByZWplY3RlZCAoNDAzKSBhbmQgdGhlXG4gKiBtZXRlcmVkIHF1b3RhIChlLmcuIGBhcGlDYWxsc2AsIGFuZCB0aGUgYGFwaV9wYWNrYCBidW5kbGUgcmFpc2luZyBpdCkgbmV2ZXJcbiAqIG1vdmVkLlxuICpcbiAqIEBwYXJhbSBxdW90YVNlcnZpY2UgLSBRdW90YSBzZXJ2aWNlIGNsaWVudFxuICogQHBhcmFtIG9yZ0lkIC0gT3JnYW5pemF0aW9uIElEIHdob3NlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWRcbiAqIEBwYXJhbSBxdW90YVR5cGUgLSBRdW90YSB0eXBlIHRvIGluY3JlbWVudFxuICogQHBhcmFtIGxvZ1dhcm4gLSBMb2dnaW5nIGZ1bmN0aW9uIGZvciB3YXJuaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5jcmVtZW50UXVvdGEoIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBvcmdJZDogc3RyaW5nLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbiAgbG9nV2FybjogKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgcXVvdGFTZXJ2aWNlLmluY3JlbWVudChvcmdJZCwgcXVvdGFUeXBlLCBnZXRRdW90YVNlcnZpY2VBdXRoSGVhZGVyKG9yZ0lkKSkuY2F0Y2goKGVycjogdW5rbm93bikgPT5cbiAgICBsb2dXYXJuKCdRdW90YSBpbmNyZW1lbnQgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSksXG4gICk7XG59XG5cbi8qKlxuICogQXRvbWljIHJlc2VydmUgaGVscGVyIGZvciB0aGUgXCJyZXNlcnZlICsgY29tbWl0IC8gcm9sbGJhY2tcIiBwYXR0ZXJuLlxuICogVXNlIGZvciBleHBlbnNpdmUgcmVzb3VyY2VzIChwaXBlbGluZXMsIHBsdWdpbnMsIEFJIGNhbGxzKSB3aGVyZSB0aGVcbiAqIGZpcmUtYW5kLWZvcmdldCBwb3N0LWhvYyBgaW5jcmVtZW50UXVvdGFgIGFsbG93cyBjb25jdXJyZW50IG92ZXItc3BlbmQuXG4gKlxuICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCByZXN1bHQgc28gdGhlIGNhbGxlciBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gcnVuXG4gKiB0aGUgZ2F0ZWQgYWN0aW9uIG9yIDQyOSB0aGUgY2xpZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXNlcnZhdGlvbiA9IGF3YWl0IHJlc2VydmVRdW90YShxdW90YVNlcnZpY2UsIG9yZ0lkLCAncGlwZWxpbmVzJywgYXV0aEhlYWRlcik7XG4gKiBpZiAocmVzZXJ2YXRpb24uZXhjZWVkZWQpIHJldHVybiBzZW5kUXVvdGFSZXNlcnZlRGVuaWVkKHJlcywgJ3BpcGVsaW5lcycsIHJlc2VydmF0aW9uKTtcbiAqIHRyeSB7XG4gKiBhd2FpdCBkb0V4cGVuc2l2ZVRoaW5nKCk7XG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqIC8vIFBhc3MgdGhlIHJlc2VydmVkIHJlc2V0QXQgc28gYSBwZXJpb2Qgcm9sbG92ZXIgZG9lc24ndCBnZXQgZG91YmxlLWNoYXJnZWQuXG4gKiBkZWNyZW1lbnRRdW90YShxdW90YVNlcnZpY2UsIG9yZ0lkLCAncGlwZWxpbmVzJywgYXV0aEhlYWRlciwgbG9nV2FybiwgMSwgcmVzZXJ2YXRpb24ucXVvdGEucmVzZXRBdCk7XG4gKiB0aHJvdyBlcnI7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2VydmVRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gIGFtb3VudDogbnVtYmVyID0gMSxcbiAgcmVxdWVzdElkPzogc3RyaW5nLFxuKTogUHJvbWlzZTxRdW90YVJlc2VydmVSZXN1bHQ+IHtcbiAgcmV0dXJuIHF1b3RhU2VydmljZS5yZXNlcnZlKG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIsIGFtb3VudCwgcmVxdWVzdElkKTtcbn1cblxuLyoqIFNlY29uZHMgYSBjbGllbnQgc2hvdWxkIHdhaXQgYmVmb3JlIHJldHJ5aW5nIHdoZW4gcXVvdGEgY291bGRuJ3QgYmUgY29uZmlybWVkLiAqL1xuY29uc3QgUVVPVEFfVU5BVkFJTEFCTEVfUkVUUllfQUZURVJfU0VDT05EUyA9IDU7XG5cbi8qKlxuICogQW5zd2VyIGEgREVOSUVEIHJlc2VydmF0aW9uIChgcmVzZXJ2YXRpb24uZXhjZWVkZWQgPT09IHRydWVgKS5cbiAqXG4gKiAtIGB1bmF2YWlsYWJsZWAgKHRoZSBxdW90YSBzZXJ2aWNlIGNvdWxkbid0IGNvbmZpcm0gdGhlIHNsb3QpIOKGkiAqKjUwMyoqXG4gKiAgIGBTRVJWSUNFX1VOQVZBSUxBQkxFYCB3aXRoIGEgc2hvcnQgYFJldHJ5LUFmdGVyYDogdGhlIG9yZyBpcyBub3Qgb3ZlciBpdHNcbiAqICAgbGltaXQsIHNvIGEgNDI5IFwicXVvdGEgZXhjZWVkZWRcIiB3b3VsZCBzZW5kIHVzZXJzIHRvIHVwZ3JhZGUgZm9yIGFuIG91dGFnZS5cbiAqIC0gb3RoZXJ3aXNlIOKGkiB0aGUgc3RhbmRhcmQgNDI5IGBRVU9UQV9FWENFRURFRGAgd2l0aCB0aGUgWC1RdW90YS0qIGhlYWRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZW5kUXVvdGFSZXNlcnZlRGVuaWVkKHJlczogUmVzcG9uc2UsIHF1b3RhVHlwZTogUXVvdGFUeXBlLCByZXNlcnZhdGlvbjogUXVvdGFSZXNlcnZlUmVzdWx0KTogdm9pZCB7XG4gIGlmIChyZXNlcnZhdGlvbi51bmF2YWlsYWJsZSkge1xuICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSByZXMuc2V0SGVhZGVyKCdSZXRyeS1BZnRlcicsIFFVT1RBX1VOQVZBSUxBQkxFX1JFVFJZX0FGVEVSX1NFQ09ORFMpO1xuICAgIHNlbmRFcnJvcihcbiAgICAgIHJlcyxcbiAgICAgIDUwMyxcbiAgICAgIGBVbmFibGUgdG8gY29uZmlybSAke3F1b3RhVHlwZX0gcXVvdGEgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIHNob3J0bHkuYCxcbiAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbmRRdW90YUV4Y2VlZGVkKHJlcywgcXVvdGFUeXBlLCByZXNlcnZhdGlvbi5xdW90YSwgcmVzZXJ2YXRpb24ucXVvdGEucmVzZXRBdCk7XG59XG5cbi8qKlxuICogRmlyZS1hbmQtZm9yZ2V0IHJvbGxiYWNrIGZvciBhIHByZXZpb3VzbHkgcmVzZXJ2ZWQgcXVvdGEgc2xvdC5cbiAqIExvZ3Mgb24gZmFpbHVyZSBidXQgbmV2ZXIgdGhyb3dzICB0aGUgYWN0aW9uIHRoYXQgbmVlZGVkIHRoZSByb2xsYmFja1xuICogaGFzIGFscmVhZHkgZmFpbGVkLCBubyBwb2ludCBjb21wb3VuZGluZyB0aGUgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNyZW1lbnRRdW90YSggcXVvdGFTZXJ2aWNlOiBRdW90YVNlcnZpY2UsXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHF1b3RhVHlwZTogUXVvdGFUeXBlLFxuICBhdXRoSGVhZGVyOiBzdHJpbmcsXG4gIGxvZ1dhcm46IChtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkLFxuICBhbW91bnQ6IG51bWJlciA9IDEsXG4gIHJlc2V0QXRTbmFwc2hvdD86IHN0cmluZyxcbik6IHZvaWQge1xuICBxdW90YVNlcnZpY2UuZGVjcmVtZW50KG9yZ0lkLCBxdW90YVR5cGUsIGF1dGhIZWFkZXIsIGFtb3VudCwgcmVzZXRBdFNuYXBzaG90KS5jYXRjaCgoZXJyOiB1bmtub3duKSA9PlxuICAgIGxvZ1dhcm4oJ1F1b3RhIHJvbGxiYWNrIGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pLFxuICApO1xufVxuIl19
@@ -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.restore', 'plugin.purge', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'plugin.build.retry', 'plugin.dlq.replay', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline.purge', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline_template.purge', '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.rule.restore', 'compliance.rule.purge', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.policy.purge', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.create', 'compliance.scan.cancel', 'compliance.notification-preference.update', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'message.announcement.create', 'message.delete', 'message.restore', 'message.purge', 'billing.subscription.create', 'billing.subscription.update', 'billing.subscription.reactivate', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.ledger.backfill', '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.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'reporting.settings.update', 'reporting.deployment.outcome', 'reporting.retention.sync', 'authz.denied', 'ask.query', 'ask.agent.turn'];
13
+ export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.delete', 'plugin.restore', 'plugin.purge', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'plugin.build.retry', 'plugin.dlq.replay', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline.purge', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline_template.purge', '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.rule.restore', 'compliance.rule.purge', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.policy.purge', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.create', 'compliance.scan.cancel', 'compliance.notification-preference.update', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'message.announcement.create', 'message.delete', 'message.restore', 'message.purge', 'billing.subscription.create', 'billing.subscription.update', 'billing.subscription.reactivate', '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.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'reporting.settings.update', 'reporting.deployment.outcome', 'reporting.retention.sync', 'authz.denied', 'ask.query', 'ask.agent.turn'];
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;
@@ -6,6 +6,7 @@ import { createSafeClient } from './http-client.js';
6
6
  import { getServiceAuthHeader, setAuthzDenialAuditor } from '../middleware/auth.js';
7
7
  import { createLogger } from '../utils/logger.js';
8
8
  import { emitCounter } from '../utils/metric-emitter.js';
9
+ import { errorMessage } from '../utils/response.js';
9
10
  const logger = createLogger('remote-audit');
10
11
  /**
11
12
  * Audit ingest is best-effort and MUST NOT block the caller, but a transient
@@ -152,7 +153,6 @@ export const REMOTE_AUDIT_ACTIONS = [
152
153
  'billing.tier.override',
153
154
  // Operator-only reseed of the invoice ledger from the payment provider's
154
155
  // history (POST /billing/admin/backfill) — mutates finance data fleet-wide.
155
- 'billing.ledger.backfill',
156
156
  'billing.addon.add',
157
157
  'billing.addon.remove',
158
158
  // System-initiated removal of a tier-included add-on on a plan upgrade (the
@@ -259,7 +259,7 @@ export function createRemoteAuditClient(config = {}) {
259
259
  return ok;
260
260
  }
261
261
  catch (err) {
262
- logger.warn('Remote audit ingest threw', { action: event.action, error: err instanceof Error ? err.message : String(err) });
262
+ logger.warn('Remote audit ingest threw', { action: event.action, error: errorMessage(err) });
263
263
  return false;
264
264
  }
265
265
  }
@@ -306,7 +306,7 @@ export function createRemoteAuditClient(config = {}) {
306
306
  }
307
307
  }
308
308
  catch (err) {
309
- logger.warn('Audit spool drain failed', { error: err instanceof Error ? err.message : String(err) });
309
+ logger.warn('Audit spool drain failed', { error: errorMessage(err) });
310
310
  }
311
311
  finally {
312
312
  draining = false;
@@ -418,4 +418,4 @@ export function createRemoteAuditAccessor(serviceName) {
418
418
  emit: (event) => svc().emit(event),
419
419
  };
420
420
  }
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDZFQUE2RTtJQUM3RSwrRUFBK0U7SUFDL0UscUVBQXFFO0lBQ3JFLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsNEVBQTRFO0lBQzVFLHdFQUF3RTtJQUN4RSxjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7SUFDZixlQUFlO0lBQ2YsOEVBQThFO0lBQzlFLDRFQUE0RTtJQUM1RSxvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQix5RUFBeUU7SUFDekUsNEVBQTRFO0lBQzVFLDRF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LElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7S0FDM0UsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFlRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsV0FBbUIsRUFBRSxNQUFNLEdBQTRCLEVBQUU7SUFDaEcsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSx3QkFBd0IsRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsT0FBTztRQUNMLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO1FBQ2xELE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsV0FBbUI7SUFJM0QsSUFBSSxLQUFLLEdBQThCLElBQUksQ0FBQztJQUM1QyxNQUFNLEdBQUcsR0FBRyxHQUF1QixFQUFFO1FBQ25DLElBQUksQ0FBQyxLQUFLO1lBQUUsS0FBSyxHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsT0FBTztRQUNMLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNO1FBQ2xDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sLCB0eXBlIEF1ZGl0U3Bvb2xFbnRyeSB9IGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIsIHNldEF1dGh6RGVuaWFsQXVkaXRvciwgdHlwZSBBdXRoekRlbmlhbEluZm8gfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZW1vdGUtYXVkaXQnKTtcblxuLyoqXG4gKiBBdWRpdCBpbmdlc3QgaXMgYmVzdC1lZmZvcnQgYW5kIE1VU1QgTk9UIGJsb2NrIHRoZSBjYWxsZXIsIGJ1dCBhIHRyYW5zaWVudFxuICogZmFpbHVyZSAoNDI5IC8gNXh4IC8gY29ubmVjdGlvbiByZXNldCAvIHRpbWVvdXQpIHNob3VsZCBub3Qgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJvdyBvbiB0aGUgZmlyc3QgYXR0ZW1wdC4gRWFjaCBlbWlzc2lvbiBjYXJyaWVzIGEgc3RhYmxlIHBlci1ldmVudFxuICogYElkZW1wb3RlbmN5LUtleWAgKHNlZSBgcmVjb3JkYCksIHNvIHRoZSBodHRwLWNsaWVudCB0cmVhdHMgdGhlIFBPU1QgYXNcbiAqIHJldHJ5LXNhZmUgYW5kIHRoZSBwbGF0Zm9ybSBjYW4gZGVkdXAgYSByZXRyaWVkIGRlbGl2ZXJ5IGluc3RlYWQgb2Ygd3JpdGluZyBhXG4gKiBkdXBsaWNhdGUgcm93LiBCdWRnZXQgaXMga2VwdCBzbWFsbCBzbyBhIGhhcmQtZG93biBwbGF0Zm9ybSBjYW4ndCBiYWNrIHRoZVxuICogd29ya2VyIHVwIGZvciBsb25nOiBiYXNlIGRlbGF5IMOXKDIgcmV0cmllcykgKyBhIGNvdXBsZSBvZiA0MjkgYmFja29mZnMuXG4gKi9cbmNvbnN0IEFVRElUX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMixcbiAgbWF4UmV0cmllczogMixcbn07XG5cbi8qKlxuICogVGhlIGV4YWN0IHNldCBvZiBhdWRpdCBhY3Rpb25zIGEgTk9OLVBMQVRGT1JNIChyZW1vdGUpIHNlcnZpY2UgaXMgcGVybWl0dGVkIHRvXG4gKiBlbWl0IHRocm91Z2ggYFBPU1QgL2F1ZGl0L2V2ZW50c2AuIFRoaXMgaXMgdGhlIFNJTkdMRSBTT1VSQ0Ug4oCUIGBSZW1vdGVBdWRpdEFjdGlvbmBcbiAqIGlzIGRlcml2ZWQgZnJvbSBpdCwgc28gdGhlIHR5cGUgYW5kIHRoZSBydW50aW1lIGFsbG93LWxpc3QgY2FuIG5ldmVyIGRyaWZ0LlxuICpcbiAqIFNFQ1VSSVRZOiBwbGF0Zm9ybSdzIGluZ2VzdCB2YWxpZGF0ZXMgYGFjdGlvbmAgYWdhaW5zdCB0aGlzIHN1YnNldCAodmlhXG4gKiB7QGxpbmsgaXNSZW1vdGVBdWRpdEFjdGlvbn0pLCBOT1QgdGhlIGZ1bGwgcGxhdGZvcm0gYEF1ZGl0QWN0aW9uYCB1bmlvbiDigJQgYVxuICogYHNlcnZpY2U6KmAgdG9rZW4gbXVzdCBub3QgYmUgYWJsZSB0byBmb3JnZSBwbGF0Zm9ybS1hdXRob3JpdHkgZXZlbnRzXG4gKiAoYGFkbWluLnN1cGVyYWRtaW4uZ3JhbnRgLCBgb3JnLm93bmVyc2hpcC50cmFuc2ZlcmAsIGB1c2VyLmxvZ2luYCwg4oCmKS4gS2VlcFxuICogdGhpcyBsaXN0IGZyZWUgb2YgYW55IHBsYXRmb3JtLW9ubHkgYWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVNT1RFX0FVRElUX0FDVElPTlMgPSBbXG4gICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAgJ3BsdWdpbi5idWlsZC5mYWlsZWQnLFxuICAncGx1Z2luLmJ1aWxkLnRpbWVvdXQnLFxuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gICdwbHVnaW4uZGVsZXRlJyxcbiAgJ3BsdWdpbi5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIHB1cmdlOiBwZXJtYW5lbnQgaGFyZC1kZWxldGUgb2YgYSBzb2Z0LWRlbGV0ZWQgcGx1Z2luIHRvbWJzdG9uZSBvblxuICAvLyBkZW1hbmQgKGZpbmFsaXplcyB3aGF0IHRoZSByZXRlbnRpb24gc3dlZXAgd291bGQgb3RoZXJ3aXNlIGRvIGxhdGVyKS5cbiAgJ3BsdWdpbi5wdXJnZScsXG4gICdwbHVnaW4udXBkYXRlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBCdWlsZCByZS1ydW5zIGZyb20gdGhlIHF1ZXVlLXRyaWFnZSBzdXJmYWNlOiByZS1lbnF1ZXVlIGEgRkFJTEVEIGJ1aWxkXG4gIC8vIChgcGx1Z2luLmJ1aWxkLnJldHJ5YCkgb3IgYSBkZWFkLWxldHRlcmVkIG9uZSAoYHBsdWdpbi5kbHEucmVwbGF5YCkuIEJvdGhcbiAgLy8gcmUtcnVuIGFuIGltYWdlIGJ1aWxkICsgcGx1Z2luIHBlcnNpc3Qgb24gdGhlIGNhbGxlcidzIGF1dGhvcml0eSwgc28gdGhleVxuICAvLyBhcmUgYXVkaXRlZCBtdXRhdGlvbnM7IGBhZmZlY3RlZE9yZ0lkYCBjYXJyaWVzIHRoZSBqb2IncyBvd25pbmcgb3JnLlxuICAncGx1Z2luLmJ1aWxkLnJldHJ5JyxcbiAgJ3BsdWdpbi5kbHEucmVwbGF5JyxcbiAgLy8gUGlwZWxpbmUgbXV0YXRpb25zIOKAlCBlbWl0dGVkIGJ5IGFwaS9waXBlbGluZSdzIHJvdXRlIGhhbmRsZXJzXG4gIC8vIChjcmVhdGUvdXBkYXRlL2RlbGV0ZSArIENvZGVQaXBlbGluZSBleGVjdXRpb24gdHJpZ2dlci9jYW5jZWwpIGFuZFxuICAvLyBwb3N0ZWQgdG8gcGxhdGZvcm0ncyBgUE9TVCAvYXVkaXQvZXZlbnRzYCBpbmdlc3QuXG4gICdwaXBlbGluZS5jcmVhdGUnLFxuICAncGlwZWxpbmUudXBkYXRlJyxcbiAgJ3BpcGVsaW5lLmRlbGV0ZScsXG4gICdwaXBlbGluZS5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIHB1cmdlOiBwZXJtYW5lbnQgaGFyZC1kZWxldGUgb2YgYSBzb2Z0LWRlbGV0ZWQgcGlwZWxpbmUgL1xuICAvLyBwaXBlbGluZV90ZW1wbGF0ZSB0b21ic3RvbmUgb24gZGVtYW5kIChmaW5hbGl6ZXMgd2hhdCB0aGUgcmV0ZW50aW9uIHN3ZWVwXG4gIC8vIHdvdWxkIG90aGVyd2lzZSBkbyBsYXRlcikuIGB0YXJnZXRJZGAgaXMgdGhlIHB1cmdlZCBpZC5cbiAgJ3BpcGVsaW5lLnB1cmdlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLmNyZWF0ZScsXG4gICdwaXBlbGluZV90ZW1wbGF0ZS51cGRhdGUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLnJlc3RvcmUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUucHVyZ2UnLFxuICAncGlwZWxpbmUuZXhlY3V0aW9uLnN0YXJ0JyxcbiAgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5jYW5jZWwnLFxuICAvLyBDb2RlUGlwZWxpbmUgQVJOLXJlZ2lzdHJ5IGNvbmZpZyAoYXBpL3BpcGVsaW5lIHJlZ2lzdHJ5IHJvdXRlKSDigJQgcmVnaXN0ZXJpbmcgL1xuICAvLyBkZXJlZ2lzdGVyaW5nIHRoZSBleHRlcm5hbCBDb2RlUGlwZWxpbmUgdGhhdCBiYWNrcyBhIHBpcGVsaW5lIChkZXBsb3ktYWZmZWN0aW5nKS5cbiAgJ3BpcGVsaW5lLnJlZ2lzdHJ5LnJlZ2lzdGVyJyxcbiAgJ3BpcGVsaW5lLnJlZ2lzdHJ5LmRlcmVnaXN0ZXInLFxuICAvLyBRdW90YSBhZG1pbmlzdHJhdGlvbiAoYXBpL3F1b3RhKSDigJQgYSBzdXBlcmFkbWluIHJlc2V0dGluZyBhbiBvcmcncyB1c2FnZVxuICAvLyBjb3VudGVyIG9yIGVkaXRpbmcgaXRzIHRpZXIgbGltaXRzLiBgYWZmZWN0ZWRPcmdJZGAgaXMgdGhlIG9yZyBjaGFuZ2VkO1xuICAvLyBgZGV0YWlsc2AgY2FycmllcyB0aGUgcXVvdGFUeXBlICsgb2xkL25ldyB2YWx1ZS5cbiAgJ3F1b3RhLnJlc2V0JyxcbiAgJ3F1b3RhLmxpbWl0LnVwZGF0ZScsXG4gIC8vIEEgc3VwZXJhZG1pbiBkZWxldGluZyBhbiBvcmcncyBlbnRpcmUgcXVvdGEgZG9jdW1lbnQuXG4gICdxdW90YS5kZWxldGUnLFxuICAvLyBDb21wbGlhbmNlIGFkbWluaXN0cmF0aW9uIChhcGkvY29tcGxpYW5jZSkg4oCUIHRoZSBlbmZvcmNlbWVudC1wb3N0dXJlIHN1cmZhY2UuXG4gIC8vIEFwcHJvdmluZy9yZXZva2luZyBhbiBleGVtcHRpb24sIHRvZ2dsaW5nL2F1dGhvcmluZy9kZWxldGluZyBhIHJ1bGUsXG4gIC8vIGF1dGhvcmluZy9kZWxldGluZyBhIHBvbGljeSwgbWFuYWdpbmcgc2NhbiBzY2hlZHVsZXMsIGFwcGx5aW5nIGEgdGVtcGxhdGUsXG4gIC8vIG9yIGNhbmNlbGxpbmcgYSBydW5uaW5nIHNjYW4uIGB0YXJnZXRJZGAgaXMgdGhlIHJ1bGUvcG9saWN5L2V4ZW1wdGlvbi9zY2FuIGlkLlxuICAnY29tcGxpYW5jZS5leGVtcHRpb24uYXBwcm92ZScsXG4gICdjb21wbGlhbmNlLmV4ZW1wdGlvbi5yZXZva2UnLFxuICAnY29tcGxpYW5jZS5ydWxlLnRvZ2dsZScsXG4gICdjb21wbGlhbmNlLnJ1bGUuY3JlYXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS51cGRhdGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLmRlbGV0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUucmVzdG9yZScsXG4gIC8vIE1hbnVhbCBvbi1kZW1hbmQgaGFyZC1kZWxldGUgKFBVUkdFKSBvZiBhIHNvZnQtZGVsZXRlZCBydWxlL3BvbGljeSB0b21ic3RvbmUg4oCUXG4gIC8vIHRoZSBjYWxsZXItaW5pdGlhdGVkIGNvdW50ZXJwYXJ0IHRvIHRoZSByZXRlbnRpb24gc3dlZXAncyBhdXRvLXB1cmdlLiBEZXN0cm95c1xuICAvLyB0aGUgdG9tYnN0b25lIHBlcm1hbmVudGx5LCBzbyBpdCBjYXJyaWVzIHRoZSBkdXJhYmxlLCB0YW1wZXItZXZpZGVudCB0cmFpbC5cbiAgJ2NvbXBsaWFuY2UucnVsZS5wdXJnZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LmRlbGV0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5yZXN0b3JlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnB1cmdlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UudGVtcGxhdGUuYXBwbHknLFxuICAvLyBMYXVuY2hpbmcgYW4gb3JnLXdpZGUgcmUtZXZhbHVhdGlvbiAodGhlIGNvdW50ZXJwYXJ0IHRvIGAuY2FuY2VsYCkg4oCUIGl0XG4gIC8vIHBlcnNpc3RzIGEgc2NhbiBhbmQgY2FuIGJsb2NrIGVudGl0aWVzIHRoYXQgcGFzc2VkIGJlZm9yZS5cbiAgJ2NvbXBsaWFuY2Uuc2Nhbi5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLmNhbmNlbCcsXG4gIC8vIFBlci1vcmcgY29tcGxpYW5jZSBub3RpZmljYXRpb24gc2V0dGluZ3M6IHJlY2lwaWVudHMgKyB0aGUgb3V0Ym91bmQgd2ViaG9va1xuICAvLyBVUkwvc2VjcmV0LiBCZWFyZXItZXF1aXZhbGVudCBjb25maWcgdGhhdCByZWRpcmVjdHMgdmlvbGF0aW9uIG5vdGljZXMsIHNvIGFcbiAgLy8gY2hhbmdlIGNhcnJpZXMgdGhlIGR1cmFibGUgdHJhaWwgKG5ldmVyIHRoZSBzZWNyZXQgaXRzZWxmKS5cbiAgJ2NvbXBsaWFuY2Uubm90aWZpY2F0aW9uLXByZWZlcmVuY2UudXBkYXRlJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcyAocHJldmlvdXNseSBvbmx5IGEgbG9nIGxpbmUpLlxuICAncmVnaXN0cnkuZ2MnLFxuICAncmVnaXN0cnkuaW1hZ2UuZGVsZXRlJyxcbiAgLy8gQ3Jvc3MtcmVwbyB0YWcvaW1hZ2UgY29weSAoYXBpL2ltYWdlLXJlZ2lzdHJ5IFBPU1QgL2FwaS9pbWFnZXMvY29weSkuIEFcbiAgLy8gY3Jvc3MtdGVuYW50IGNvcHkgbW92ZXMgZGF0YSBhY3Jvc3MgY3VzdG9tZXIgYm91bmRhcmllcywgc28gaXQgbmVlZHMgdGhlXG4gIC8vIGR1cmFibGUsIHRhbXBlci1ldmlkZW50IHRyYWlsIOKAlCBub3QganVzdCB0aGUgTG9raSBvcGVyYXRvciBsaW5lLlxuICAncmVnaXN0cnkuaW1hZ2UuY29weScsXG4gIC8vIE1lc3NhZ2luZyAoYXBpL21lc3NhZ2UpIOKAlCBhZG1pbiBCUk9BRENBU1QgYW5ub3VuY2VtZW50cyArIGRlc3RydWN0aXZlXG4gIC8vIGRlbGV0ZXMuIDE6MSB1c2VyIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBhdWRpdGVkIChub2lzZSArIHRoZXkgd291bGRcbiAgLy8gcHVsbCBwcml2YXRlIGNvbnRlbnQgaW50byB0aGUgdHJhaWwpLiBgZGV0YWlsc2AgY2FycnkgbWV0YWRhdGEgb25seVxuICAvLyAoc3ViamVjdC90eXBlL3Njb3BlKSwgTkVWRVIgbWVzc2FnZSBib2R5IGNvbnRlbnQuXG4gICdtZXNzYWdlLmFubm91bmNlbWVudC5jcmVhdGUnLFxuICAnbWVzc2FnZS5kZWxldGUnLFxuICAnbWVzc2FnZS5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIG9uLWRlbWFuZCBQVVJHRSAocGVybWFuZW50IGhhcmQtZGVsZXRlKSBvZiBhbiBhbHJlYWR5LXNvZnQtZGVsZXRlZFxuICAvLyBtZXNzYWdlIHRvbWJzdG9uZSDigJQgdGhlIGRlc3RydWN0aXZlIGZpbmFsaXplciB0aGUgcmV0ZW50aW9uIHN3ZWVwIHdvdWxkXG4gIC8vIG90aGVyd2lzZSBwZXJmb3JtIGF0IHRoZSBwdXJnZSBkZWFkbGluZS4gYGRldGFpbHNgIGNhcnJ5IG1ldGFkYXRhIG9ubHkuXG4gICdtZXNzYWdlLnB1cmdlJyxcbiAgLy8gQmlsbGluZyAoYXBpL2JpbGxpbmcpIOKAlCBzdWJzY3JpcHRpb24gKyBlbnRpdGxlbWVudCBtdXRhdGlvbnMsIG1pcnJvcmVkIHRvIHRoZVxuICAvLyBjZW50cmFsIGF1ZGl0IHRyYWlsICh0aGVzZSBhbHNvIHdyaXRlIHRvIHRoZSBzZXJ2aWNlLWxvY2FsIGJpbGxpbmdfZXZlbnRzXG4gIC8vIGNvbGxlY3Rpb24pLiBgZGV0YWlsc2AgY2FycnkgcGxhbi90aWVyL2FkZG9uIGlkcyBvbmx5IOKAlCBuZXZlciBjYXJkL3BheW1lbnRcbiAgLy8gc2VjcmV0cyBvciBhbiBBV1MgYWNjb3VudCBpZC5cbiAgLy8gU3Vic2NyaXB0aW9uIGxpZmVjeWNsZSBhIENVU1RPTUVSIGRyaXZlcyAodGhlIGFkbWluIGNvdW50ZXJwYXJ0IGlzXG4gIC8vIGBiaWxsaW5nLnRpZXIub3ZlcnJpZGVgKTogc2VsZi1zZXJ2ZSBjcmVhdGUgKGRpcmVjdCBvciBNYXJrZXRwbGFjZSBjbGFpbSksXG4gIC8vIHBsYW4vaW50ZXJ2YWwgY2hhbmdlLCBjYW5jZWwtYXQtcGVyaW9kLWVuZCwgdW5kby1jYW5jZWwsIGNhc2NhZGUgZGVsZXRlLlxuICAnYmlsbGluZy5zdWJzY3JpcHRpb24uY3JlYXRlJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLnVwZGF0ZScsXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5yZWFjdGl2YXRlJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLmNhbmNlbCcsXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5kZWxldGUnLFxuICAnYmlsbGluZy50aWVyLm92ZXJyaWRlJyxcbiAgLy8gT3BlcmF0b3Itb25seSByZXNlZWQgb2YgdGhlIGludm9pY2UgbGVkZ2VyIGZyb20gdGhlIHBheW1lbnQgcHJvdmlkZXInc1xuICAvLyBoaXN0b3J5IChQT1NUIC9iaWxsaW5nL2FkbWluL2JhY2tmaWxsKSDigJQgbXV0YXRlcyBmaW5hbmNlIGRhdGEgZmxlZXQtd2lkZS5cbiAgJ2JpbGxpbmcubGVkZ2VyLmJhY2tmaWxsJyxcbiAgJ2JpbGxpbmcuYWRkb24uYWRkJyxcbiAgJ2JpbGxpbmcuYWRkb24ucmVtb3ZlJyxcbiAgLy8gU3lzdGVtLWluaXRpYXRlZCByZW1vdmFsIG9mIGEgdGllci1pbmNsdWRlZCBhZGQtb24gb24gYSBwbGFuIHVwZ3JhZGUgKHRoZVxuICAvLyBhY2NvdW50J3MgbmV3IHRpZXIgbm93IGJ1bmRsZXMgdGhlIGZlYXR1cmUpIOKAlCBkaXN0aW5jdCBmcm9tIGEgdXNlci1pbml0aWF0ZWRcbiAgLy8gYHJlbW92ZWAgc28gZmluYW5jZSBjYW4gdGVsbCBhbiBhdXRvLXBydW5lIGZyb20gYSBjdXN0b21lciBhY3Rpb24uXG4gICdiaWxsaW5nLmFkZG9uLnBydW5lJyxcbiAgLy8gRGlzY291bnRzIChkb2NzL2JpbGxpbmctZGlzY291bnRzLm1kKSDigJQgbWludC9pc3N1ZS9hcHBseS9yZW1vdmUvcmV2b2tlIG9mIGFcbiAgLy8gcHJpY2UgY291cG9uIG9yIHVzYWdlIGNyZWRpdC4gYGRldGFpbHNgIGNhcnJ5IHRoZSBkaXNjb3VudCBpZCArIGtpbmQvdmFsdWVcbiAgLy8gb25seSwgbmV2ZXIgdGhlIG9wYXF1ZSB0b2tlbiBvciBzaWduaW5nIGtleS5cbiAgJ2JpbGxpbmcuZGlzY291bnQuZ2VuZXJhdGUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5pc3N1ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50LmFwcGx5JyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmVtb3ZlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmV2b2tlJyxcbiAgLy8gUHJvbW90aW9ucyAoZG9jcy9iaWxsaW5nLWRpc2NvdW50cy5tZCNwcm9tb3Rpb25zKSDigJQgcnVsZS1kcml2ZW4gYXV0by1ncmFudFxuICAvLyBjYW1wYWlnbnMuIGBkZXRhaWxzYCBjYXJyeSB0aGUgcHJvbW90aW9uIGlkICsgY2VudHMvZXZlbnQgb25seS5cbiAgJ2JpbGxpbmcucHJvbW90aW9uLmNyZWF0ZScsXG4gICdiaWxsaW5nLnByb21vdGlvbi51cGRhdGUnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24ucmV2b2tlJyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmdyYW50JyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmFjdGl2YXRlJyxcbiAgLy8gVXNhZ2UtY3JlZGl0IHJlYWxpemF0aW9uIOKAlCBhIGN1c3RvbWVyL2NvbXBsaWFuY2UtdmlzaWJsZSByZWNvcmQgb2YgY3JlZGl0XG4gIC8vIG1vdmVtZW50OiBgY29uc3VtZWRgIChNYXJrZXRwbGFjZSBtZXRlcmVkIGRyYXdkb3duKSwgYGV4aGF1c3RlZGAgKGJhbGFuY2UgaGl0XG4gIC8vIHplcm8pLCBhbmQgYSBjb21ibyBlbmRpbmcuIGBkZXRhaWxzYCBjYXJyeSBjZW50cy9pZHMgb25seSwgbm8gcGF5bWVudCBzZWNyZXRzLlxuICAnYmlsbGluZy5jcmVkaXQuY29uc3VtZWQnLFxuICAnYmlsbGluZy5jcmVkaXQuZXhoYXVzdGVkJyxcbiAgJ2JpbGxpbmcuY29tYm8uZXhwaXJlZCcsXG4gIC8vIFJlcG9ydGluZyAoYXBpL3JlcG9ydGluZykg4oCUIHRoZSB0aHJlZSByZXBvcnRpbmcgbXV0YXRpb25zIHdob3NlIGVmZmVjdFxuICAvLyBvdXRsaXZlcyBhIHJlcXVlc3QgbG9nOiB0aGUgcGVyLW9yZyBjb3JyZWxhdGlvbi13aW5kb3cgY29uZmlnIHdyaXRlLCBhXG4gIC8vIHBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VyIChpdCBtb3ZlcyB0aGUgb3JnJ3MgRE9SQSBDRlIvTVRUUiksIGFuZCB0aGVcbiAgLy8gaW5ib3VuZCBiaWxsaW5n4oaScmVwb3J0aW5nIHJldGVudGlvbi1lbnRpdGxlbWVudCBzeW5jIChhIHJldGVudGlvbiBjdXQgaXMgYVxuICAvLyBkYXRhLWRlc3Ryb3lpbmcgY2hhbmdlIGFwcGxpZWQgYnkgdGhlIG5leHQgc3dlZXApLiBgZGV0YWlsc2AgY2FycnkgdGhlXG4gIC8vIHNldHRpbmdzL291dGNvbWUgdmFsdWVzIG9ubHkuXG4gICdyZXBvcnRpbmcuc2V0dGluZ3MudXBkYXRlJyxcbiAgJ3JlcG9ydGluZy5kZXBsb3ltZW50Lm91dGNvbWUnLFxuICAncmVwb3J0aW5nLnJldGVudGlvbi5zeW5jJyxcbiAgLy8gRGVuaWVkIGF1dGhvcml6YXRpb24gYXR0ZW1wdCDigJQgZW1pdHRlZCBiZXN0LWVmZm9ydCBieSB0aGUgc2hhcmVkXG4gIC8vIGByZXF1aXJlUGVybWlzc2lvbmAgLyBgcmVxdWlyZVN5c3RlbUFkbWluYCBnYXRlIHdoZW4gYSBzdGF0ZS1jaGFuZ2luZ1xuICAvLyAobm9uLUdFVCkgcmVxdWVzdCBpcyByZWplY3RlZCwgc28gcHJvYmluZy9lc2NhbGF0aW9uIGF0dGVtcHRzIGFyZSB2aXNpYmxlXG4gIC8vIHJhdGhlciB0aGFuIGludmlzaWJsZS4gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gKyBwYXRoO1xuICAvLyBgb3V0Y29tZWAgaXMgJ2ZhaWx1cmUnLlxuICAnYXV0aHouZGVuaWVkJyxcbiAgLy8gXCJBc2tcIiBhc3Npc3RhbnQgYWN0aXZpdHkg4oCUIHZpc2liaWxpdHkgaW50byB3aGF0IHRoZSBhc3Npc3RhbnQgZGlkIG9uIGEgdXNlcidzXG4gIC8vIGJlaGFsZi4gYGFzay5xdWVyeWAgaXMgYSByZWFkLW9ubHkgaG93LXRvIHR1cm47IGBhc2suYWdlbnQudHVybmAgaXMgYSB0b29sLWNhbGxpbmdcbiAgLy8gdHVybi4gYGRldGFpbHNgIGNhcnJ5IFNBRkUgTUVUQURBVEEgT05MWSAodG9vbHMgdXNlZCwgcHJvcG9zYWwga2luZHMsIHF1ZXJ5XG4gIC8vIGxlbmd0aCwgb3V0Y29tZSksIG5ldmVyIHRoZSByYXcgcXVlcnkgdGV4dC5cbiAgJ2Fzay5xdWVyeScsXG4gICdhc2suYWdlbnQudHVybicsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbiA9IHR5cGVvZiBSRU1PVEVfQVVESVRfQUNUSU9OU1tudW1iZXJdO1xuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIGFjdGlvbiBhIHJlbW90ZSBzZXJ2aWNlIG1heSBlbWl0ICh0aGUgaW5nZXN0IGFsbG93LWxpc3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVtb3RlQXVkaXRBY3Rpb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFJlbW90ZUF1ZGl0QWN0aW9uIHtcbiAgcmV0dXJuIChSRU1PVEVfQVVESVRfQUNUSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0RXZlbnQge1xuICBhY3Rpb246IFJlbW90ZUF1ZGl0QWN0aW9uO1xuICBhY3RvcklkOiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIG9yZ0lkPzogc3RyaW5nO1xuICBhZmZlY3RlZE9yZ0lkPzogc3RyaW5nO1xuICB0YXJnZXRUeXBlPzogc3RyaW5nO1xuICB0YXJnZXRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpZCB0aGUgYXVkaXRlZCBhY3Rpb24gc3VjY2VlZCBvciBmYWlsPyBEZWZhdWx0cyB0byAnc3VjY2Vzcycgd2hlbiBvbWl0dGVkXG4gICAqICh0aGUgcGxhdGZvcm0gaW5nZXN0IGFwcGxpZXMgdGhlIHNhbWUgZGVmYXVsdCkuIERlbmllZC1hdXRoeiBldmVudHMgc2V0XG4gICAqICdmYWlsdXJlJyBzbyBhIHJldmlld2VyIGNhbiBmaWx0ZXIgYXR0ZW1wdHMgZnJvbSBjb21wbGV0ZWQgYWN0aW9ucy5cbiAgICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBhdWRpdGVkIGFjdGlvbiBhY3R1YWxseSBPQ0NVUlJFRCAoSVNPLTg2MDEpLCBzdGFtcGVkIGF0IGVtaXNzaW9uLlxuICAgKiBUaGUgcGxhdGZvcm0gc3RvcmVzIHRoaXMgZm9yIHJldmlld2VyczsgaXQgaXMgTk9UIHRoZSBjaGFpbi1vcmRlcmluZyBmaWVsZFxuICAgKiAodGhlIHRhbXBlci1ldmlkZW50IGNoYWluIG9yZGVycyBieSBpbmdlc3QvYGNyZWF0ZWRBdGApLiBJdCBtYXR0ZXJzIGZvclxuICAgKiBTUE9PTEVEIGV2ZW50czogb25lIGJ1ZmZlcmVkIGR1cmluZyBhIHBsYXRmb3JtIG91dGFnZSBpcyByZS1kZWxpdmVyZWQg4oCUIGFuZFxuICAgKiBzbyBjaGFpbmVkIOKAlCBsYXRlciwgYnV0IGBvY2N1cnJlZEF0YCBwcmVzZXJ2ZXMgd2hlbiBpdCByZWFsbHkgaGFwcGVuZWQuXG4gICAqL1xuICBvY2N1cnJlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlIHBlci1lbWlzc2lvbiBkZWR1cCBrZXkgKGFsc28gc2VudCBhcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyIHRoZVxuICAgKiBwbGF0Zm9ybSBpbmdlc3QgZGVkdXBzIG9uKS4gU3RhbXBlZCBieSBgcmVjb3JkKClgIGFuZCBjYXJyaWVkIG9uIHRoZSBzcG9vbGVkXG4gICAqIGNvcHkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBsYXRlciByZS1kZWxpdmVyeSBjb2xsYXBzZSB0byBPTkUgc3RvcmVkIHJvdy5cbiAgICovXG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uIFdoZW4gYSB7QGxpbmsgQXVkaXRTcG9vbH0gaXMgY29uZmlndXJlZCwgYW4gZW1pc3Npb24gdGhhdFxuICAgKiBleGhhdXN0cyBpdHMgbGl2ZSByZXRyaWVzIGlzIGJ1ZmZlcmVkIGFuZCByZS1kZWxpdmVyZWQgbGF0ZXIgaW5zdGVhZCBvZlxuICAgKiBiZWluZyBkcm9wcGVkLlxuICAgKi9cbiAgcmVjb3JkKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIGJhY2tncm91bmQgc3Bvb2wtZHJhaW4gdGltZXIgKGlmIGFueSkuIFNhZmUgdG8gY2FsbCByZXBlYXRlZGx5LiAqL1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgZHVyYWJsZSBidWZmZXIuIFdoZW4gc2V0LCBhbiBlbWlzc2lvbiB0aGF0IGV4aGF1c3RzIGl0cyBsaXZlIHJldHJ5XG4gICAqIGJ1ZGdldCAoc3VzdGFpbmVkIHBsYXRmb3JtIG91dGFnZSkgaXMgc3Bvb2xlZCBhbmQgcmUtZGVsaXZlcmVkIOKAlCBvbiB0aGUgbmV4dFxuICAgKiBzdWNjZXNzZnVsIGVtaXNzaW9uIGFuZCBvbiBhIHBlcmlvZGljIHRpbWVyIOKAlCBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAqL1xuICBzcG9vbD86IEF1ZGl0U3Bvb2w7XG4gIC8qKiBTcG9vbC1kcmFpbiBpbnRlcnZhbCBtcyAoZGVmYXVsdCAzMF8wMDApLiBPbmx5IHVzZWQgd2hlbiBgc3Bvb2xgIGlzIHNldC4gKi9cbiAgZHJhaW5JbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZHJhaW5lZCBwZXIgc3dlZXAgKGRlZmF1bHQgMTAwKS4gKi9cbiAgZHJhaW5CYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcmVtb3RlLWF1ZGl0IGNsaWVudCB0YXJnZXRlZCBhdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBVc2VkIGJ5IGFwaS9wbHVnaW4ncyBidWlsZCB3b3JrZXIgdG8gcHVzaCBgcGx1Z2luLmJ1aWxkLipgIGV2ZW50cyBpbnRvXG4gKiB0aGUgcGxhdGZvcm0ncyBNb25nb0RCIGBhdWRpdF9ldmVudHNgIGNvbGxlY3Rpb24uIE90aGVyIHNlcnZpY2VzXG4gKiB3aXRoIHdvcmtlci1zdHlsZSBlbWl0dGVycyBjYW4gdXNlIHRoZSBzYW1lIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCgpO1xuICogYXVkaXRDbGllbnQucmVjb3JkKHtcbiAqIGFjdGlvbjogJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnLFxuICogYWN0b3JJZDogJ3VzZXItMTIzJyxcbiAqIG9yZ0lkOiAnb3JnLWFjbWUnLFxuICogdGFyZ2V0VHlwZTogJ3BsdWdpbicsXG4gKiB0YXJnZXRJZDogJ3BsdWdpbi1hYmMnLFxuICogZGV0YWlsczogeyBuYW1lOiAnbXktcGx1Z2luJywgdmVyc2lvbjogJzEuMC4wJyB9LFxuICogfSwgJ3BsdWdpbicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdENsaWVudChjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBSZW1vdGVBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9IT1NUID8/ICdwbGF0Zm9ybScsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IDMwMDAsXG4gIH07XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNhZmVDbGllbnQoc2VydmljZUNvbmZpZyk7XG4gIGNvbnN0IHNwb29sID0gY29uZmlnLnNwb29sO1xuICBjb25zdCBkcmFpbkJhdGNoU2l6ZSA9IGNvbmZpZy5kcmFpbkJhdGNoU2l6ZSA/PyAxMDA7XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgT05FIGxpdmUgZGVsaXZlcnkuIFJlc29sdmVzIGB0cnVlYCBvbiBhIDJ4eCBhY2NlcHQsIGBmYWxzZWAgb24gYW55XG4gICAqIG5vbi0yeHggLyB0aHJvd24gZXJyb3IgKHRoZSBodHRwLWNsaWVudCBoYXMgYWxyZWFkeSBhcHBsaWVkIHRoZSByZXRyeVxuICAgKiBidWRnZXQpLiBBIHN0YWJsZSBwZXItZW1pc3Npb24gYElkZW1wb3RlbmN5LUtleWAgbWFrZXMgdGhpcyBub24taWRlbXBvdGVudFxuICAgKiBQT1NUIHJldHJ5LXNhZmUgYW5kIGxldHMgdGhlIHBsYXRmb3JtIGluZ2VzdCBkZWR1cCBhIHJlLWRlbGl2ZXJlZCBldmVudFxuICAgKiBpbnN0ZWFkIG9mIHdyaXRpbmcgYSBkdXBsaWNhdGUgYXVkaXQgcm93IChhbmQgZHVwbGljYXRlIGNoYWluIGxpbmspLlxuICAgKiBgSWRlbXBvdGVuY3ktS2V5YCBpcyBkZXJpdmVkIGZyb20gdGhlIGV2ZW50IHNvIGEgU1BPT0xFRCByZS1kZWxpdmVyeSByZXVzZXNcbiAgICogdGhlIHNhbWUga2V5IGFzIGl0cyBvcmlnaW5hbCBsaXZlIGF0dGVtcHQg4oCUIHRoZSB0d28gY29sbGFwc2UgdG8gb25lIHJvdy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGl2ZXIoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdXRoSGVhZGVyID0gZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgb3JnSWQ6IGV2ZW50Lm9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ0F1dGhvcml6YXRpb24nOiBhdXRoSGVhZGVyLFxuICAgICAgJ0lkZW1wb3RlbmN5LUtleSc6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KCcvYXVkaXQvZXZlbnRzJywgZXZlbnQsIHsgaGVhZGVycywgLi4uQVVESVRfUkVRVUVTVF9PUFRJT05TIH0pO1xuICAgICAgY29uc3Qgb2sgPSAhIXJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDA7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IG5vbi1vaycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3QgdGhyZXcnLCB7IGFjdGlvbjogZXZlbnQuYWN0aW9uLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZSBzcG9vbCBkcmFpbnMgc28gYSBwZXJpb2RpYyB0aWNrIGFuZCBhbiBvbi1zdWNjZXNzIGRyYWluIGNhbid0IGJvdGhcbiAgLy8gcHVsbCB0aGUgc2FtZSBiYXRjaC4gU3RvcHMgZWFybHkgdGhlIG1vbWVudCBhIHJlLWRlbGl2ZXJ5IGZhaWxzIChwbGF0Zm9ybVxuICAvLyBzdGlsbCBkb3duKSBzbyB3ZSBkb24ndCBoYW1tZXIgaXQgb3IgY2h1cm4gdGhlIGJ1ZmZlci5cbiAgbGV0IGRyYWluaW5nID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIGRyYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc3Bvb2wgfHwgZHJhaW5pbmcpIHJldHVybjtcbiAgICBkcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBhd2FpdCBzcG9vbC50YWtlKGRyYWluQmF0Y2hTaXplKTtcbiAgICAgICAgaWYgKGJhdGNoLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBkZWxpdmVyZWQ6IEF1ZGl0U3Bvb2xFbnRyeVtdID0gW107XG4gICAgICAgIGNvbnN0IGZhaWxlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgbGV0IHBsYXRmb3JtRG93biA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhdGNoKSB7XG4gICAgICAgICAgaWYgKHBsYXRmb3JtRG93bikgeyBmYWlsZWQucHVzaChlbnRyeSk7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCBkZWxpdmVyKGVudHJ5LmV2ZW50LCBlbnRyeS5zZXJ2aWNlTmFtZSk7XG4gICAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgICBkZWxpdmVyZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfcmVkZWxpdmVyZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbGF0Zm9ybURvd24gPSB0cnVlO1xuICAgICAgICAgICAgZmFpbGVkLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBY2tub3dsZWRnZSB0aGUgZGVsaXZlcmVkIHByZWZpeCBzbyBpdCBjbGVhcnMgdGhlIGluLXByb2dyZXNzIGxpc3Q7IHRoZVxuICAgICAgICAvLyByZWxpYWJsZSB0YWtlKCkgbW92ZWQgdGhlIHdob2xlIGJhdGNoIHRoZXJlLCBzbyB1bmFja2VkIHN1cnZpdm9ycyBhcmVcbiAgICAgICAgLy8gcmVjbGFpbWVkIGJ5IHJlY292ZXIoKSBhZnRlciBhIGNyYXNoIHJhdGhlciB0aGFuIGJlaW5nIHNpbGVudGx5IGxvc3QuXG4gICAgICAgIGlmIChkZWxpdmVyZWQubGVuZ3RoID4gMCkgYXdhaXQgc3Bvb2wuYWNrKGRlbGl2ZXJlZCk7XG4gICAgICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHNwb29sLnJlcXVldWUoZmFpbGVkKTtcbiAgICAgICAgICByZXR1cm47IC8vIHN0aWxsIGRvd24g4oCUIHRyeSBhZ2FpbiBvbiB0aGUgbmV4dCB0aWNrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBkcmFpbiBmYWlsZWQnLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgbGV0IGRyYWluVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgaWYgKHNwb29sKSB7XG4gICAgLy8gUmVjbGFpbSBhbnkgYmF0Y2ggc3RyYW5kZWQgb24gdGhlIGluLXByb2dyZXNzIGxpc3QgYnkgYSBwcmlvciBjcmFzaCwgdGhlblxuICAgIC8vIGF0dGVtcHQgdG8gZmx1c2ggaXQuIEJvdGggYXJlIGJlc3QtZWZmb3J0ICh0aGUgc3Bvb2wgc3dhbGxvd3MgaXRzIGVycm9ycykuXG4gICAgdm9pZCBzcG9vbC5yZWNvdmVyKCkudGhlbigoKSA9PiBkcmFpbigpKTtcbiAgICBkcmFpblRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB2b2lkIGRyYWluKCk7IH0sIGNvbmZpZy5kcmFpbkludGVydmFsTXMgPz8gMzBfMDAwKTtcbiAgICAvLyBEb24ndCBsZXQgdGhlIGRyYWluIHRpbWVyIGtlZXAgdGhlIHByb2Nlc3MgYWxpdmUgb24gc2h1dGRvd24uXG4gICAgKGRyYWluVGltZXIgYXMgdW5rbm93biBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlY29yZChldmVudCwgc2VydmljZU5hbWUpIHtcbiAgICAgIC8vIFN0YW1wIHdoZW4gdGhlIGFjdGlvbiBhY3R1YWxseSBvY2N1cnJlZCAoc3Vydml2ZXMgc3Bvb2wgZGVsYXkpIGFuZCBwaW4gYVxuICAgICAgLy8gc3RhYmxlIGlkZW1wb3RlbmN5IGtleSBzbyBhIGxpdmUgYXR0ZW1wdCBhbmQgaXRzIHNwb29sZWQgcmV0cnkgZGVkdXAuXG4gICAgICBjb25zdCBzdGFtcGVkOiBSZW1vdGVBdWRpdEV2ZW50ID0ge1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgb2NjdXJyZWRBdDogZXZlbnQub2NjdXJyZWRBdCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGlkZW1wb3RlbmN5S2V5OiBldmVudC5pZGVtcG90ZW5jeUtleSA/PyByYW5kb21VVUlEKCksXG4gICAgICB9O1xuICAgICAgdm9pZCBkZWxpdmVyKHN0YW1wZWQsIHNlcnZpY2VOYW1lKS50aGVuKChvaykgPT4ge1xuICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfZW1pdHRlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUsIG91dGNvbWU6IHN0YW1wZWQub3V0Y29tZSA/PyAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgaWYgKHNwb29sKSB2b2lkIGRyYWluKCk7IC8vIHBsYXRmb3JtIGlzIHJlYWNoYWJsZSDigJQgZmx1c2ggYW55IGJhY2tsb2dcbiAgICAgICAgfSBlbHNlIGlmIChzcG9vbCkge1xuICAgICAgICAgIHZvaWQgc3Bvb2wuZW5xdWV1ZSh7IGV2ZW50OiBzdGFtcGVkLCBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfZHJvcHBlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICBpZiAoZHJhaW5UaW1lcikgeyBjbGVhckludGVydmFsKGRyYWluVGltZXIpOyBkcmFpblRpbWVyID0gdW5kZWZpbmVkOyB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgc3RhbmRhcmQgYGF1dGh6LmRlbmllZGAgc2luayB1c2VkIGJ5IGV2ZXJ5IHJlbW90ZS1hdWRpdCBzZXJ2aWNlXG4gKiAocGlwZWxpbmUsIHBsdWdpbiwgY29tcGxpYW5jZSwgcXVvdGEsIG1lc3NhZ2UsIGJpbGxpbmcsIHJlcG9ydGluZywg4oCmKS5cbiAqXG4gKiBUaGUgc2hhcmVkIGByZXF1aXJlQXV0aGAgZ2F0ZSBmb3J3YXJkcyBlYWNoIERFTklFRCBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0IHRvXG4gKiB0aGUgYXVkaXRvciBzZXQgdmlhIHtAbGluayBzZXRBdXRoekRlbmlhbEF1ZGl0b3J9OyB0aGlzIHdpcmVzIHRoYXQgaG9vayB0byB0aGVcbiAqIHNlcnZpY2UncyB7QGxpbmsgUmVtb3RlQXVkaXRDbGllbnR9LCBmb3J3YXJkaW5nIGEgYGZhaWx1cmVgLW91dGNvbWVcbiAqIGBhdXRoei5kZW5pZWRgIGV2ZW50IHNvIHByb2JpbmcgLyBwcml2aWxlZ2UtZXNjYWxhdGlvbiBhdHRlbXB0cyBsZWF2ZSBhIHRyYWlsLlxuICogRW1pc3Npb24gaXMgZmlyZS1hbmQtZm9yZ2V0ICh0aGUgY2xpZW50IG5ldmVyIHRocm93cykuIGBnZXRDbGllbnRgIGlzIGEgZ2V0dGVyXG4gKiBzbyB0aGUgY2xpZW50IHN0YXlzIGxhemlseSBjb25zdHJ1Y3RlZCAoc2VydmljZXMgbWVtb2l6ZSBpdCBvbiBmaXJzdCB1c2UpLlxuICpcbiAqIFBsYXRmb3JtIGlzIGludGVudGlvbmFsbHkgTk9UIGEgY2FsbGVyIOKAlCBpdCBpcyB0aGUgYXVkaXQgYXV0aG9yaXR5IGFuZCB3cml0ZXNcbiAqIGBhdXRoei5kZW5pZWRgIHN0cmFpZ2h0IHRvIGl0cyBsb2NhbCBzdG9yZSAod2l0aCBgYWZmZWN0ZWRPcmdJZGApLCBub3QgdGhyb3VnaFxuICogYSBSZW1vdGVBdWRpdENsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWU6IHN0cmluZywgZ2V0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudCk6IHZvaWQge1xuICBzZXRBdXRoekRlbmlhbEF1ZGl0b3IoKGluZm86IEF1dGh6RGVuaWFsSW5mbykgPT4gZ2V0Q2xpZW50KCkucmVjb3JkKHtcbiAgICBhY3Rpb246ICdhdXRoei5kZW5pZWQnLFxuICAgIGFjdG9ySWQ6IGluZm8uYWN0b3JJZCA/PyAnYW5vbnltb3VzJyxcbiAgICBhY3RvckVtYWlsOiBpbmZvLmFjdG9yRW1haWwsXG4gICAgb3JnSWQ6IGluZm8ub3JnSWQsXG4gICAgb3V0Y29tZTogJ2ZhaWx1cmUnLFxuICAgIGRldGFpbHM6IHsgbWV0aG9kOiBpbmZvLm1ldGhvZCwgcGF0aDogaW5mby5wYXRoLCByZXF1aXJlZDogaW5mby5yZXF1aXJlZCB9LFxuICB9LCBzZXJ2aWNlTmFtZSkpO1xufVxuXG4vKipcbiAqIEEgc2VydmljZS1zY29wZWQgYXVkaXQgY2xpZW50OiBhIGR1cmFibGUtc3Bvb2wtYmFja2VkIHtAbGluayBSZW1vdGVBdWRpdENsaWVudH1cbiAqIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBwcmUtYm91bmQgZm9yIGVtaXNzaW9uLiBSZXBsYWNlcyB0aGUgcGVyLXNlcnZpY2VcbiAqIGJvaWxlcnBsYXRlIG9mIGBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCh7IHNwb29sOiBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2woKSA/PyB1bmRlZmluZWQgfSlgXG4gKiBwbHVzIGEgaGFuZC1yb2xsZWQgYGVtaXQ8U2VydmljZT5BdWRpdGAgd3JhcHBlciB0aGF0IHJlcGVhdHMgdGhlIHNlcnZpY2UgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlQXVkaXRDbGllbnQge1xuICAvKiogRW1pdCBhbiBhdWRpdCBldmVudCB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgYm91bmQuIEZpcmUtYW5kLWZvcmdldC4gKi9cbiAgZW1pdChldmVudDogUmVtb3RlQXVkaXRFdmVudCk6IHZvaWQ7XG4gIC8qKiBUaGUgdW5kZXJseWluZyByZW1vdGUgY2xpZW50IOKAlCBmb3IgYHdpcmVBdXRoekRlbmlhbEF1ZGl0b3JgICsgYGNsb3NlKClgLiAqL1xuICByZWFkb25seSBjbGllbnQ6IFJlbW90ZUF1ZGl0Q2xpZW50O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgc2VydmljZSdzIGF1ZGl0IGNsaWVudDogYSBSZW1vdGVBdWRpdENsaWVudCB3aXJlZCB0byB0aGUgZHVyYWJsZSBSZWRpc1xuICogc3Bvb2wgKGZyb20gYW1iaWVudCBlbnY7IG51bGwg4oaSIG5vIHNwb29sKSB3aXRoIGBzZXJ2aWNlTmFtZWAgYm91bmQuIENvbnN0cnVjdFxuICogT05DRSBwZXIgcHJvY2VzcyDigJQgbWVtb2l6ZSBiZWhpbmQgYSBsYXp5IGBnZXRBdWRpdENsaWVudCgpYCBpbiB0aGUgc2VydmljZSdzXG4gKiBgc2VydmljZXMvYXVkaXQudHNgLiBQYXNzIGBjb25maWcuc3Bvb2xgIHRvIG92ZXJyaWRlIHRoZSBlbnYtZGVyaXZlZCBzcG9vbFxuICogKGUuZy4gcmV1c2UgYSBzZXJ2aWNlJ3MgZXhpc3RpbmcgaW9yZWRpcyBjb25uZWN0aW9uKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VBdWRpdENsaWVudChzZXJ2aWNlTmFtZTogc3RyaW5nLCBjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBTZXJ2aWNlQXVkaXRDbGllbnQge1xuICBjb25zdCBzcG9vbCA9IGNvbmZpZy5zcG9vbCA/PyBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2woKSA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHsgLi4uY29uZmlnLCBzcG9vbCB9KTtcbiAgcmV0dXJuIHtcbiAgICBlbWl0OiAoZXZlbnQpID0+IGNsaWVudC5yZWNvcmQoZXZlbnQsIHNlcnZpY2VOYW1lKSxcbiAgICBjbGllbnQsXG4gIH07XG59XG5cbi8qKlxuICogTGF6aWx5LWNvbnN0cnVjdGVkIHJlbW90ZS1hdWRpdCBhY2Nlc3NvciBmb3IgYSBzZXJ2aWNlLiBFdmVyeSBzZXJ2aWNlJ3NcbiAqIGBzZXJ2aWNlcy9hdWRpdC50c2AgdXNlZCB0byBoYW5kLXJvbGwgdGhlIHNhbWUgbW9kdWxlIHNpbmdsZXRvbiAoYSBgbGV0IGF1ZGl0YFxuICogKyBgc3ZjKClgIHRoYXQgYnVpbGRzIGEge0BsaW5rIFNlcnZpY2VBdWRpdENsaWVudH0gb24gZmlyc3QgdXNlLCB0aGVuIGFcbiAqIGBnZXRBdWRpdENsaWVudCgpYCByZXR1cm5pbmcgYC5jbGllbnRgIGFuZCBhbiBgZW1pdChldmVudClgIGZvcndhcmRpbmcgdG9cbiAqIGAuZW1pdGApLiBUaGlzIHBhY2thZ2VzIHRoYXQgcGF0dGVybiBpbiBPTkUgcGxhY2Ugc28gZWFjaCBzZXJ2aWNlJ3MgYXVkaXRcbiAqIHdpcmluZyBpcyBhIG9uZS1saW5lciBhbmQgY2FuJ3QgZHJpZnQuXG4gKlxuICogTGF6eSBvbiBwdXJwb3NlOiB0aGUgdW5kZXJseWluZyBjbGllbnQgd2lyZXMgYW4gZW52LVJlZGlzIGF1ZGl0IHNwb29sLCBzb1xuICogYnVpbGRpbmcgaXQgYXQgaW1wb3J0IHRpbWUgd291bGQgZm9yY2UgdGhhdCBjb25uZWN0aW9uIHdoZXJldmVyIHRoZSBtb2R1bGUgaXNcbiAqIG1lcmVseSBpbXBvcnRlZCAoZS5nLiB0ZXN0cykuIGBnZXRBdWRpdENsaWVudGAgaXMgcGFzc2VkIHRvXG4gKiBgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcmA7IGBlbWl0YCBiYWNrcyB0aGUgcGVyLXNlcnZpY2UgYGVtaXRYQXVkaXRgIGhlbHBlcnMuXG4gKiBCb3RoIHN0YXkgRklSRS1BTkQtRk9SR0VUIChyZWNvcmQgbmV2ZXIgdGhyb3dzIC8gaXMgbm90IGF3YWl0ZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVtb3RlQXVkaXRBY2Nlc3NvcihzZXJ2aWNlTmFtZTogc3RyaW5nKToge1xuICBnZXRBdWRpdENsaWVudDogKCkgPT4gUmVtb3RlQXVkaXRDbGllbnQ7XG4gIGVtaXQ6IChldmVudDogUmVtb3RlQXVkaXRFdmVudCkgPT4gdm9pZDtcbn0ge1xuICBsZXQgYXVkaXQ6IFNlcnZpY2VBdWRpdENsaWVudCB8IG51bGwgPSBudWxsO1xuICBjb25zdCBzdmMgPSAoKTogU2VydmljZUF1ZGl0Q2xpZW50ID0+IHtcbiAgICBpZiAoIWF1ZGl0KSBhdWRpdCA9IGNyZWF0ZVNlcnZpY2VBdWRpdENsaWVudChzZXJ2aWNlTmFtZSk7XG4gICAgcmV0dXJuIGF1ZGl0O1xuICB9O1xuICByZXR1cm4ge1xuICAgIGdldEF1ZGl0Q2xpZW50OiAoKSA9PiBzdmMoKS5jbGllbnQsXG4gICAgZW1pdDogKGV2ZW50KSA9PiBzdmMoKS5lbWl0KGV2ZW50KSxcbiAgfTtcbn1cbiJdfQ==
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsd0JBQXdCLEVBQXlDLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFNUM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLHFCQUFxQixHQUErRDtJQUN4RixtQkFBbUIsRUFBRSxDQUFDO0lBQ3RCLFVBQVUsRUFBRSxDQUFDO0NBQ2QsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRztJQUNsQyx3QkFBd0I7SUFDeEIscUJBQXFCO0lBQ3JCLHNCQUFzQjtJQUN0Qiw2RUFBNkU7SUFDN0UsK0VBQStFO0lBQy9FLHFFQUFxRTtJQUNyRSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNw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QUM7QUFlRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsV0FBbUIsRUFBRSxNQUFNLEdBQTRCLEVBQUU7SUFDaEcsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSx3QkFBd0IsRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0QsT0FBTztRQUNMLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDO1FBQ2xELE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsV0FBbUI7SUFJM0QsSUFBSSxLQUFLLEdBQThCLElBQUksQ0FBQztJQUM1QyxNQUFNLEdBQUcsR0FBRyxHQUF1QixFQUFFO1FBQ25DLElBQUksQ0FBQyxLQUFLO1lBQUUsS0FBSyxHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsT0FBTztRQUNMLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNO1FBQ2xDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sLCB0eXBlIEF1ZGl0U3Bvb2xFbnRyeSB9IGZyb20gJy4vYXVkaXQtc3Bvb2wuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCwgdHlwZSBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIsIHNldEF1dGh6RGVuaWFsQXVkaXRvciwgdHlwZSBBdXRoekRlbmlhbEluZm8gfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZW1vdGUtYXVkaXQnKTtcblxuLyoqXG4gKiBBdWRpdCBpbmdlc3QgaXMgYmVzdC1lZmZvcnQgYW5kIE1VU1QgTk9UIGJsb2NrIHRoZSBjYWxsZXIsIGJ1dCBhIHRyYW5zaWVudFxuICogZmFpbHVyZSAoNDI5IC8gNXh4IC8gY29ubmVjdGlvbiByZXNldCAvIHRpbWVvdXQpIHNob3VsZCBub3Qgc2lsZW50bHkgZHJvcCB0aGVcbiAqIHJvdyBvbiB0aGUgZmlyc3QgYXR0ZW1wdC4gRWFjaCBlbWlzc2lvbiBjYXJyaWVzIGEgc3RhYmxlIHBlci1ldmVudFxuICogYElkZW1wb3RlbmN5LUtleWAgKHNlZSBgcmVjb3JkYCksIHNvIHRoZSBodHRwLWNsaWVudCB0cmVhdHMgdGhlIFBPU1QgYXNcbiAqIHJldHJ5LXNhZmUgYW5kIHRoZSBwbGF0Zm9ybSBjYW4gZGVkdXAgYSByZXRyaWVkIGRlbGl2ZXJ5IGluc3RlYWQgb2Ygd3JpdGluZyBhXG4gKiBkdXBsaWNhdGUgcm93LiBCdWRnZXQgaXMga2VwdCBzbWFsbCBzbyBhIGhhcmQtZG93biBwbGF0Zm9ybSBjYW4ndCBiYWNrIHRoZVxuICogd29ya2VyIHVwIGZvciBsb25nOiBiYXNlIGRlbGF5IMOXKDIgcmV0cmllcykgKyBhIGNvdXBsZSBvZiA0MjkgYmFja29mZnMuXG4gKi9cbmNvbnN0IEFVRElUX1JFUVVFU1RfT1BUSU9OUzogUGljazxSZXF1ZXN0T3B0aW9ucywgJ21heFJhdGVMaW1pdFJldHJpZXMnIHwgJ21heFJldHJpZXMnPiA9IHtcbiAgbWF4UmF0ZUxpbWl0UmV0cmllczogMixcbiAgbWF4UmV0cmllczogMixcbn07XG5cbi8qKlxuICogVGhlIGV4YWN0IHNldCBvZiBhdWRpdCBhY3Rpb25zIGEgTk9OLVBMQVRGT1JNIChyZW1vdGUpIHNlcnZpY2UgaXMgcGVybWl0dGVkIHRvXG4gKiBlbWl0IHRocm91Z2ggYFBPU1QgL2F1ZGl0L2V2ZW50c2AuIFRoaXMgaXMgdGhlIFNJTkdMRSBTT1VSQ0Ug4oCUIGBSZW1vdGVBdWRpdEFjdGlvbmBcbiAqIGlzIGRlcml2ZWQgZnJvbSBpdCwgc28gdGhlIHR5cGUgYW5kIHRoZSBydW50aW1lIGFsbG93LWxpc3QgY2FuIG5ldmVyIGRyaWZ0LlxuICpcbiAqIFNFQ1VSSVRZOiBwbGF0Zm9ybSdzIGluZ2VzdCB2YWxpZGF0ZXMgYGFjdGlvbmAgYWdhaW5zdCB0aGlzIHN1YnNldCAodmlhXG4gKiB7QGxpbmsgaXNSZW1vdGVBdWRpdEFjdGlvbn0pLCBOT1QgdGhlIGZ1bGwgcGxhdGZvcm0gYEF1ZGl0QWN0aW9uYCB1bmlvbiDigJQgYVxuICogYHNlcnZpY2U6KmAgdG9rZW4gbXVzdCBub3QgYmUgYWJsZSB0byBmb3JnZSBwbGF0Zm9ybS1hdXRob3JpdHkgZXZlbnRzXG4gKiAoYGFkbWluLnN1cGVyYWRtaW4uZ3JhbnRgLCBgb3JnLm93bmVyc2hpcC50cmFuc2ZlcmAsIGB1c2VyLmxvZ2luYCwg4oCmKS4gS2VlcFxuICogdGhpcyBsaXN0IGZyZWUgb2YgYW55IHBsYXRmb3JtLW9ubHkgYWN0aW9uLlxuICovXG5leHBvcnQgY29uc3QgUkVNT1RFX0FVRElUX0FDVElPTlMgPSBbXG4gICdwbHVnaW4uYnVpbGQuY29tcGxldGVkJyxcbiAgJ3BsdWdpbi5idWlsZC5mYWlsZWQnLFxuICAncGx1Z2luLmJ1aWxkLnRpbWVvdXQnLFxuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gICdwbHVnaW4uZGVsZXRlJyxcbiAgJ3BsdWdpbi5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIHB1cmdlOiBwZXJtYW5lbnQgaGFyZC1kZWxldGUgb2YgYSBzb2Z0LWRlbGV0ZWQgcGx1Z2luIHRvbWJzdG9uZSBvblxuICAvLyBkZW1hbmQgKGZpbmFsaXplcyB3aGF0IHRoZSByZXRlbnRpb24gc3dlZXAgd291bGQgb3RoZXJ3aXNlIGRvIGxhdGVyKS5cbiAgJ3BsdWdpbi5wdXJnZScsXG4gICdwbHVnaW4udXBkYXRlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBCdWlsZCByZS1ydW5zIGZyb20gdGhlIHF1ZXVlLXRyaWFnZSBzdXJmYWNlOiByZS1lbnF1ZXVlIGEgRkFJTEVEIGJ1aWxkXG4gIC8vIChgcGx1Z2luLmJ1aWxkLnJldHJ5YCkgb3IgYSBkZWFkLWxldHRlcmVkIG9uZSAoYHBsdWdpbi5kbHEucmVwbGF5YCkuIEJvdGhcbiAgLy8gcmUtcnVuIGFuIGltYWdlIGJ1aWxkICsgcGx1Z2luIHBlcnNpc3Qgb24gdGhlIGNhbGxlcidzIGF1dGhvcml0eSwgc28gdGhleVxuICAvLyBhcmUgYXVkaXRlZCBtdXRhdGlvbnM7IGBhZmZlY3RlZE9yZ0lkYCBjYXJyaWVzIHRoZSBqb2IncyBvd25pbmcgb3JnLlxuICAncGx1Z2luLmJ1aWxkLnJldHJ5JyxcbiAgJ3BsdWdpbi5kbHEucmVwbGF5JyxcbiAgLy8gUGlwZWxpbmUgbXV0YXRpb25zIOKAlCBlbWl0dGVkIGJ5IGFwaS9waXBlbGluZSdzIHJvdXRlIGhhbmRsZXJzXG4gIC8vIChjcmVhdGUvdXBkYXRlL2RlbGV0ZSArIENvZGVQaXBlbGluZSBleGVjdXRpb24gdHJpZ2dlci9jYW5jZWwpIGFuZFxuICAvLyBwb3N0ZWQgdG8gcGxhdGZvcm0ncyBgUE9TVCAvYXVkaXQvZXZlbnRzYCBpbmdlc3QuXG4gICdwaXBlbGluZS5jcmVhdGUnLFxuICAncGlwZWxpbmUudXBkYXRlJyxcbiAgJ3BpcGVsaW5lLmRlbGV0ZScsXG4gICdwaXBlbGluZS5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIHB1cmdlOiBwZXJtYW5lbnQgaGFyZC1kZWxldGUgb2YgYSBzb2Z0LWRlbGV0ZWQgcGlwZWxpbmUgL1xuICAvLyBwaXBlbGluZV90ZW1wbGF0ZSB0b21ic3RvbmUgb24gZGVtYW5kIChmaW5hbGl6ZXMgd2hhdCB0aGUgcmV0ZW50aW9uIHN3ZWVwXG4gIC8vIHdvdWxkIG90aGVyd2lzZSBkbyBsYXRlcikuIGB0YXJnZXRJZGAgaXMgdGhlIHB1cmdlZCBpZC5cbiAgJ3BpcGVsaW5lLnB1cmdlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLmNyZWF0ZScsXG4gICdwaXBlbGluZV90ZW1wbGF0ZS51cGRhdGUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLnJlc3RvcmUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUucHVyZ2UnLFxuICAncGlwZWxpbmUuZXhlY3V0aW9uLnN0YXJ0JyxcbiAgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5jYW5jZWwnLFxuICAvLyBDb2RlUGlwZWxpbmUgQVJOLXJlZ2lzdHJ5IGNvbmZpZyAoYXBpL3BpcGVsaW5lIHJlZ2lzdHJ5IHJvdXRlKSDigJQgcmVnaXN0ZXJpbmcgL1xuICAvLyBkZXJlZ2lzdGVyaW5nIHRoZSBleHRlcm5hbCBDb2RlUGlwZWxpbmUgdGhhdCBiYWNrcyBhIHBpcGVsaW5lIChkZXBsb3ktYWZmZWN0aW5nKS5cbiAgJ3BpcGVsaW5lLnJlZ2lzdHJ5LnJlZ2lzdGVyJyxcbiAgJ3BpcGVsaW5lLnJlZ2lzdHJ5LmRlcmVnaXN0ZXInLFxuICAvLyBRdW90YSBhZG1pbmlzdHJhdGlvbiAoYXBpL3F1b3RhKSDigJQgYSBzdXBlcmFkbWluIHJlc2V0dGluZyBhbiBvcmcncyB1c2FnZVxuICAvLyBjb3VudGVyIG9yIGVkaXRpbmcgaXRzIHRpZXIgbGltaXRzLiBgYWZmZWN0ZWRPcmdJZGAgaXMgdGhlIG9yZyBjaGFuZ2VkO1xuICAvLyBgZGV0YWlsc2AgY2FycmllcyB0aGUgcXVvdGFUeXBlICsgb2xkL25ldyB2YWx1ZS5cbiAgJ3F1b3RhLnJlc2V0JyxcbiAgJ3F1b3RhLmxpbWl0LnVwZGF0ZScsXG4gIC8vIEEgc3VwZXJhZG1pbiBkZWxldGluZyBhbiBvcmcncyBlbnRpcmUgcXVvdGEgZG9jdW1lbnQuXG4gICdxdW90YS5kZWxldGUnLFxuICAvLyBDb21wbGlhbmNlIGFkbWluaXN0cmF0aW9uIChhcGkvY29tcGxpYW5jZSkg4oCUIHRoZSBlbmZvcmNlbWVudC1wb3N0dXJlIHN1cmZhY2UuXG4gIC8vIEFwcHJvdmluZy9yZXZva2luZyBhbiBleGVtcHRpb24sIHRvZ2dsaW5nL2F1dGhvcmluZy9kZWxldGluZyBhIHJ1bGUsXG4gIC8vIGF1dGhvcmluZy9kZWxldGluZyBhIHBvbGljeSwgbWFuYWdpbmcgc2NhbiBzY2hlZHVsZXMsIGFwcGx5aW5nIGEgdGVtcGxhdGUsXG4gIC8vIG9yIGNhbmNlbGxpbmcgYSBydW5uaW5nIHNjYW4uIGB0YXJnZXRJZGAgaXMgdGhlIHJ1bGUvcG9saWN5L2V4ZW1wdGlvbi9zY2FuIGlkLlxuICAnY29tcGxpYW5jZS5leGVtcHRpb24uYXBwcm92ZScsXG4gICdjb21wbGlhbmNlLmV4ZW1wdGlvbi5yZXZva2UnLFxuICAnY29tcGxpYW5jZS5ydWxlLnRvZ2dsZScsXG4gICdjb21wbGlhbmNlLnJ1bGUuY3JlYXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS51cGRhdGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLmRlbGV0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUucmVzdG9yZScsXG4gIC8vIE1hbnVhbCBvbi1kZW1hbmQgaGFyZC1kZWxldGUgKFBVUkdFKSBvZiBhIHNvZnQtZGVsZXRlZCBydWxlL3BvbGljeSB0b21ic3RvbmUg4oCUXG4gIC8vIHRoZSBjYWxsZXItaW5pdGlhdGVkIGNvdW50ZXJwYXJ0IHRvIHRoZSByZXRlbnRpb24gc3dlZXAncyBhdXRvLXB1cmdlLiBEZXN0cm95c1xuICAvLyB0aGUgdG9tYnN0b25lIHBlcm1hbmVudGx5LCBzbyBpdCBjYXJyaWVzIHRoZSBkdXJhYmxlLCB0YW1wZXItZXZpZGVudCB0cmFpbC5cbiAgJ2NvbXBsaWFuY2UucnVsZS5wdXJnZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LmRlbGV0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5yZXN0b3JlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnB1cmdlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UudGVtcGxhdGUuYXBwbHknLFxuICAvLyBMYXVuY2hpbmcgYW4gb3JnLXdpZGUgcmUtZXZhbHVhdGlvbiAodGhlIGNvdW50ZXJwYXJ0IHRvIGAuY2FuY2VsYCkg4oCUIGl0XG4gIC8vIHBlcnNpc3RzIGEgc2NhbiBhbmQgY2FuIGJsb2NrIGVudGl0aWVzIHRoYXQgcGFzc2VkIGJlZm9yZS5cbiAgJ2NvbXBsaWFuY2Uuc2Nhbi5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLmNhbmNlbCcsXG4gIC8vIFBlci1vcmcgY29tcGxpYW5jZSBub3RpZmljYXRpb24gc2V0dGluZ3M6IHJlY2lwaWVudHMgKyB0aGUgb3V0Ym91bmQgd2ViaG9va1xuICAvLyBVUkwvc2VjcmV0LiBCZWFyZXItZXF1aXZhbGVudCBjb25maWcgdGhhdCByZWRpcmVjdHMgdmlvbGF0aW9uIG5vdGljZXMsIHNvIGFcbiAgLy8gY2hhbmdlIGNhcnJpZXMgdGhlIGR1cmFibGUgdHJhaWwgKG5ldmVyIHRoZSBzZWNyZXQgaXRzZWxmKS5cbiAgJ2NvbXBsaWFuY2Uubm90aWZpY2F0aW9uLXByZWZlcmVuY2UudXBkYXRlJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcyAocHJldmlvdXNseSBvbmx5IGEgbG9nIGxpbmUpLlxuICAncmVnaXN0cnkuZ2MnLFxuICAncmVnaXN0cnkuaW1hZ2UuZGVsZXRlJyxcbiAgLy8gQ3Jvc3MtcmVwbyB0YWcvaW1hZ2UgY29weSAoYXBpL2ltYWdlLXJlZ2lzdHJ5IFBPU1QgL2FwaS9pbWFnZXMvY29weSkuIEFcbiAgLy8gY3Jvc3MtdGVuYW50IGNvcHkgbW92ZXMgZGF0YSBhY3Jvc3MgY3VzdG9tZXIgYm91bmRhcmllcywgc28gaXQgbmVlZHMgdGhlXG4gIC8vIGR1cmFibGUsIHRhbXBlci1ldmlkZW50IHRyYWlsIOKAlCBub3QganVzdCB0aGUgTG9raSBvcGVyYXRvciBsaW5lLlxuICAncmVnaXN0cnkuaW1hZ2UuY29weScsXG4gIC8vIE1lc3NhZ2luZyAoYXBpL21lc3NhZ2UpIOKAlCBhZG1pbiBCUk9BRENBU1QgYW5ub3VuY2VtZW50cyArIGRlc3RydWN0aXZlXG4gIC8vIGRlbGV0ZXMuIDE6MSB1c2VyIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBhdWRpdGVkIChub2lzZSArIHRoZXkgd291bGRcbiAgLy8gcHVsbCBwcml2YXRlIGNvbnRlbnQgaW50byB0aGUgdHJhaWwpLiBgZGV0YWlsc2AgY2FycnkgbWV0YWRhdGEgb25seVxuICAvLyAoc3ViamVjdC90eXBlL3Njb3BlKSwgTkVWRVIgbWVzc2FnZSBib2R5IGNvbnRlbnQuXG4gICdtZXNzYWdlLmFubm91bmNlbWVudC5jcmVhdGUnLFxuICAnbWVzc2FnZS5kZWxldGUnLFxuICAnbWVzc2FnZS5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIG9uLWRlbWFuZCBQVVJHRSAocGVybWFuZW50IGhhcmQtZGVsZXRlKSBvZiBhbiBhbHJlYWR5LXNvZnQtZGVsZXRlZFxuICAvLyBtZXNzYWdlIHRvbWJzdG9uZSDigJQgdGhlIGRlc3RydWN0aXZlIGZpbmFsaXplciB0aGUgcmV0ZW50aW9uIHN3ZWVwIHdvdWxkXG4gIC8vIG90aGVyd2lzZSBwZXJmb3JtIGF0IHRoZSBwdXJnZSBkZWFkbGluZS4gYGRldGFpbHNgIGNhcnJ5IG1ldGFkYXRhIG9ubHkuXG4gICdtZXNzYWdlLnB1cmdlJyxcbiAgLy8gQmlsbGluZyAoYXBpL2JpbGxpbmcpIOKAlCBzdWJzY3JpcHRpb24gKyBlbnRpdGxlbWVudCBtdXRhdGlvbnMsIG1pcnJvcmVkIHRvIHRoZVxuICAvLyBjZW50cmFsIGF1ZGl0IHRyYWlsICh0aGVzZSBhbHNvIHdyaXRlIHRvIHRoZSBzZXJ2aWNlLWxvY2FsIGJpbGxpbmdfZXZlbnRzXG4gIC8vIGNvbGxlY3Rpb24pLiBgZGV0YWlsc2AgY2FycnkgcGxhbi90aWVyL2FkZG9uIGlkcyBvbmx5IOKAlCBuZXZlciBjYXJkL3BheW1lbnRcbiAgLy8gc2VjcmV0cyBvciBhbiBBV1MgYWNjb3VudCBpZC5cbiAgLy8gU3Vic2NyaXB0aW9uIGxpZmVjeWNsZSBhIENVU1RPTUVSIGRyaXZlcyAodGhlIGFkbWluIGNvdW50ZXJwYXJ0IGlzXG4gIC8vIGBiaWxsaW5nLnRpZXIub3ZlcnJpZGVgKTogc2VsZi1zZXJ2ZSBjcmVhdGUgKGRpcmVjdCBvciBNYXJrZXRwbGFjZSBjbGFpbSksXG4gIC8vIHBsYW4vaW50ZXJ2YWwgY2hhbmdlLCBjYW5jZWwtYXQtcGVyaW9kLWVuZCwgdW5kby1jYW5jZWwsIGNhc2NhZGUgZGVsZXRlLlxuICAnYmlsbGluZy5zdWJzY3JpcHRpb24uY3JlYXRlJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLnVwZGF0ZScsXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5yZWFjdGl2YXRlJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLmNhbmNlbCcsXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5kZWxldGUnLFxuICAnYmlsbGluZy50aWVyLm92ZXJyaWRlJyxcbiAgLy8gT3BlcmF0b3Itb25seSByZXNlZWQgb2YgdGhlIGludm9pY2UgbGVkZ2VyIGZyb20gdGhlIHBheW1lbnQgcHJvdmlkZXInc1xuICAvLyBoaXN0b3J5IChQT1NUIC9iaWxsaW5nL2FkbWluL2JhY2tmaWxsKSDigJQgbXV0YXRlcyBmaW5hbmNlIGRhdGEgZmxlZXQtd2lkZS5cbiAgJ2JpbGxpbmcuYWRkb24uYWRkJyxcbiAgJ2JpbGxpbmcuYWRkb24ucmVtb3ZlJyxcbiAgLy8gU3lzdGVtLWluaXRpYXRlZCByZW1vdmFsIG9mIGEgdGllci1pbmNsdWRlZCBhZGQtb24gb24gYSBwbGFuIHVwZ3JhZGUgKHRoZVxuICAvLyBhY2NvdW50J3MgbmV3IHRpZXIgbm93IGJ1bmRsZXMgdGhlIGZlYXR1cmUpIOKAlCBkaXN0aW5jdCBmcm9tIGEgdXNlci1pbml0aWF0ZWRcbiAgLy8gYHJlbW92ZWAgc28gZmluYW5jZSBjYW4gdGVsbCBhbiBhdXRvLXBydW5lIGZyb20gYSBjdXN0b21lciBhY3Rpb24uXG4gICdiaWxsaW5nLmFkZG9uLnBydW5lJyxcbiAgLy8gRGlzY291bnRzIChkb2NzL2JpbGxpbmctZGlzY291bnRzLm1kKSDigJQgbWludC9pc3N1ZS9hcHBseS9yZW1vdmUvcmV2b2tlIG9mIGFcbiAgLy8gcHJpY2UgY291cG9uIG9yIHVzYWdlIGNyZWRpdC4gYGRldGFpbHNgIGNhcnJ5IHRoZSBkaXNjb3VudCBpZCArIGtpbmQvdmFsdWVcbiAgLy8gb25seSwgbmV2ZXIgdGhlIG9wYXF1ZSB0b2tlbiBvciBzaWduaW5nIGtleS5cbiAgJ2JpbGxpbmcuZGlzY291bnQuZ2VuZXJhdGUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5pc3N1ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50LmFwcGx5JyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmVtb3ZlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmV2b2tlJyxcbiAgLy8gUHJvbW90aW9ucyAoZG9jcy9iaWxsaW5nLWRpc2NvdW50cy5tZCNwcm9tb3Rpb25zKSDigJQgcnVsZS1kcml2ZW4gYXV0by1ncmFudFxuICAvLyBjYW1wYWlnbnMuIGBkZXRhaWxzYCBjYXJyeSB0aGUgcHJvbW90aW9uIGlkICsgY2VudHMvZXZlbnQgb25seS5cbiAgJ2JpbGxpbmcucHJvbW90aW9uLmNyZWF0ZScsXG4gICdiaWxsaW5nLnByb21vdGlvbi51cGRhdGUnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24ucmV2b2tlJyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmdyYW50JyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmFjdGl2YXRlJyxcbiAgLy8gVXNhZ2UtY3JlZGl0IHJlYWxpemF0aW9uIOKAlCBhIGN1c3RvbWVyL2NvbXBsaWFuY2UtdmlzaWJsZSByZWNvcmQgb2YgY3JlZGl0XG4gIC8vIG1vdmVtZW50OiBgY29uc3VtZWRgIChNYXJrZXRwbGFjZSBtZXRlcmVkIGRyYXdkb3duKSwgYGV4aGF1c3RlZGAgKGJhbGFuY2UgaGl0XG4gIC8vIHplcm8pLCBhbmQgYSBjb21ibyBlbmRpbmcuIGBkZXRhaWxzYCBjYXJyeSBjZW50cy9pZHMgb25seSwgbm8gcGF5bWVudCBzZWNyZXRzLlxuICAnYmlsbGluZy5jcmVkaXQuY29uc3VtZWQnLFxuICAnYmlsbGluZy5jcmVkaXQuZXhoYXVzdGVkJyxcbiAgJ2JpbGxpbmcuY29tYm8uZXhwaXJlZCcsXG4gIC8vIFJlcG9ydGluZyAoYXBpL3JlcG9ydGluZykg4oCUIHRoZSB0aHJlZSByZXBvcnRpbmcgbXV0YXRpb25zIHdob3NlIGVmZmVjdFxuICAvLyBvdXRsaXZlcyBhIHJlcXVlc3QgbG9nOiB0aGUgcGVyLW9yZyBjb3JyZWxhdGlvbi13aW5kb3cgY29uZmlnIHdyaXRlLCBhXG4gIC8vIHBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VyIChpdCBtb3ZlcyB0aGUgb3JnJ3MgRE9SQSBDRlIvTVRUUiksIGFuZCB0aGVcbiAgLy8gaW5ib3VuZCBiaWxsaW5n4oaScmVwb3J0aW5nIHJldGVudGlvbi1lbnRpdGxlbWVudCBzeW5jIChhIHJldGVudGlvbiBjdXQgaXMgYVxuICAvLyBkYXRhLWRlc3Ryb3lpbmcgY2hhbmdlIGFwcGxpZWQgYnkgdGhlIG5leHQgc3dlZXApLiBgZGV0YWlsc2AgY2FycnkgdGhlXG4gIC8vIHNldHRpbmdzL291dGNvbWUgdmFsdWVzIG9ubHkuXG4gICdyZXBvcnRpbmcuc2V0dGluZ3MudXBkYXRlJyxcbiAgJ3JlcG9ydGluZy5kZXBsb3ltZW50Lm91dGNvbWUnLFxuICAncmVwb3J0aW5nLnJldGVudGlvbi5zeW5jJyxcbiAgLy8gRGVuaWVkIGF1dGhvcml6YXRpb24gYXR0ZW1wdCDigJQgZW1pdHRlZCBiZXN0LWVmZm9ydCBieSB0aGUgc2hhcmVkXG4gIC8vIGByZXF1aXJlUGVybWlzc2lvbmAgLyBgcmVxdWlyZVN5c3RlbUFkbWluYCBnYXRlIHdoZW4gYSBzdGF0ZS1jaGFuZ2luZ1xuICAvLyAobm9uLUdFVCkgcmVxdWVzdCBpcyByZWplY3RlZCwgc28gcHJvYmluZy9lc2NhbGF0aW9uIGF0dGVtcHRzIGFyZSB2aXNpYmxlXG4gIC8vIHJhdGhlciB0aGFuIGludmlzaWJsZS4gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gKyBwYXRoO1xuICAvLyBgb3V0Y29tZWAgaXMgJ2ZhaWx1cmUnLlxuICAnYXV0aHouZGVuaWVkJyxcbiAgLy8gXCJBc2tcIiBhc3Npc3RhbnQgYWN0aXZpdHkg4oCUIHZpc2liaWxpdHkgaW50byB3aGF0IHRoZSBhc3Npc3RhbnQgZGlkIG9uIGEgdXNlcidzXG4gIC8vIGJlaGFsZi4gYGFzay5xdWVyeWAgaXMgYSByZWFkLW9ubHkgaG93LXRvIHR1cm47IGBhc2suYWdlbnQudHVybmAgaXMgYSB0b29sLWNhbGxpbmdcbiAgLy8gdHVybi4gYGRldGFpbHNgIGNhcnJ5IFNBRkUgTUVUQURBVEEgT05MWSAodG9vbHMgdXNlZCwgcHJvcG9zYWwga2luZHMsIHF1ZXJ5XG4gIC8vIGxlbmd0aCwgb3V0Y29tZSksIG5ldmVyIHRoZSByYXcgcXVlcnkgdGV4dC5cbiAgJ2Fzay5xdWVyeScsXG4gICdhc2suYWdlbnQudHVybicsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbiA9IHR5cGVvZiBSRU1PVEVfQVVESVRfQUNUSU9OU1tudW1iZXJdO1xuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIGFjdGlvbiBhIHJlbW90ZSBzZXJ2aWNlIG1heSBlbWl0ICh0aGUgaW5nZXN0IGFsbG93LWxpc3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVtb3RlQXVkaXRBY3Rpb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFJlbW90ZUF1ZGl0QWN0aW9uIHtcbiAgcmV0dXJuIChSRU1PVEVfQVVESVRfQUNUSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0RXZlbnQge1xuICBhY3Rpb246IFJlbW90ZUF1ZGl0QWN0aW9uO1xuICBhY3RvcklkOiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIG9yZ0lkPzogc3RyaW5nO1xuICBhZmZlY3RlZE9yZ0lkPzogc3RyaW5nO1xuICB0YXJnZXRUeXBlPzogc3RyaW5nO1xuICB0YXJnZXRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpZCB0aGUgYXVkaXRlZCBhY3Rpb24gc3VjY2VlZCBvciBmYWlsPyBEZWZhdWx0cyB0byAnc3VjY2Vzcycgd2hlbiBvbWl0dGVkXG4gICAqICh0aGUgcGxhdGZvcm0gaW5nZXN0IGFwcGxpZXMgdGhlIHNhbWUgZGVmYXVsdCkuIERlbmllZC1hdXRoeiBldmVudHMgc2V0XG4gICAqICdmYWlsdXJlJyBzbyBhIHJldmlld2VyIGNhbiBmaWx0ZXIgYXR0ZW1wdHMgZnJvbSBjb21wbGV0ZWQgYWN0aW9ucy5cbiAgICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBhdWRpdGVkIGFjdGlvbiBhY3R1YWxseSBPQ0NVUlJFRCAoSVNPLTg2MDEpLCBzdGFtcGVkIGF0IGVtaXNzaW9uLlxuICAgKiBUaGUgcGxhdGZvcm0gc3RvcmVzIHRoaXMgZm9yIHJldmlld2VyczsgaXQgaXMgTk9UIHRoZSBjaGFpbi1vcmRlcmluZyBmaWVsZFxuICAgKiAodGhlIHRhbXBlci1ldmlkZW50IGNoYWluIG9yZGVycyBieSBpbmdlc3QvYGNyZWF0ZWRBdGApLiBJdCBtYXR0ZXJzIGZvclxuICAgKiBTUE9PTEVEIGV2ZW50czogb25lIGJ1ZmZlcmVkIGR1cmluZyBhIHBsYXRmb3JtIG91dGFnZSBpcyByZS1kZWxpdmVyZWQg4oCUIGFuZFxuICAgKiBzbyBjaGFpbmVkIOKAlCBsYXRlciwgYnV0IGBvY2N1cnJlZEF0YCBwcmVzZXJ2ZXMgd2hlbiBpdCByZWFsbHkgaGFwcGVuZWQuXG4gICAqL1xuICBvY2N1cnJlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlIHBlci1lbWlzc2lvbiBkZWR1cCBrZXkgKGFsc28gc2VudCBhcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyIHRoZVxuICAgKiBwbGF0Zm9ybSBpbmdlc3QgZGVkdXBzIG9uKS4gU3RhbXBlZCBieSBgcmVjb3JkKClgIGFuZCBjYXJyaWVkIG9uIHRoZSBzcG9vbGVkXG4gICAqIGNvcHkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBsYXRlciByZS1kZWxpdmVyeSBjb2xsYXBzZSB0byBPTkUgc3RvcmVkIHJvdy5cbiAgICovXG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uIFdoZW4gYSB7QGxpbmsgQXVkaXRTcG9vbH0gaXMgY29uZmlndXJlZCwgYW4gZW1pc3Npb24gdGhhdFxuICAgKiBleGhhdXN0cyBpdHMgbGl2ZSByZXRyaWVzIGlzIGJ1ZmZlcmVkIGFuZCByZS1kZWxpdmVyZWQgbGF0ZXIgaW5zdGVhZCBvZlxuICAgKiBiZWluZyBkcm9wcGVkLlxuICAgKi9cbiAgcmVjb3JkKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIGJhY2tncm91bmQgc3Bvb2wtZHJhaW4gdGltZXIgKGlmIGFueSkuIFNhZmUgdG8gY2FsbCByZXBlYXRlZGx5LiAqL1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgZHVyYWJsZSBidWZmZXIuIFdoZW4gc2V0LCBhbiBlbWlzc2lvbiB0aGF0IGV4aGF1c3RzIGl0cyBsaXZlIHJldHJ5XG4gICAqIGJ1ZGdldCAoc3VzdGFpbmVkIHBsYXRmb3JtIG91dGFnZSkgaXMgc3Bvb2xlZCBhbmQgcmUtZGVsaXZlcmVkIOKAlCBvbiB0aGUgbmV4dFxuICAgKiBzdWNjZXNzZnVsIGVtaXNzaW9uIGFuZCBvbiBhIHBlcmlvZGljIHRpbWVyIOKAlCBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAqL1xuICBzcG9vbD86IEF1ZGl0U3Bvb2w7XG4gIC8qKiBTcG9vbC1kcmFpbiBpbnRlcnZhbCBtcyAoZGVmYXVsdCAzMF8wMDApLiBPbmx5IHVzZWQgd2hlbiBgc3Bvb2xgIGlzIHNldC4gKi9cbiAgZHJhaW5JbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZHJhaW5lZCBwZXIgc3dlZXAgKGRlZmF1bHQgMTAwKS4gKi9cbiAgZHJhaW5CYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcmVtb3RlLWF1ZGl0IGNsaWVudCB0YXJnZXRlZCBhdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBVc2VkIGJ5IGFwaS9wbHVnaW4ncyBidWlsZCB3b3JrZXIgdG8gcHVzaCBgcGx1Z2luLmJ1aWxkLipgIGV2ZW50cyBpbnRvXG4gKiB0aGUgcGxhdGZvcm0ncyBNb25nb0RCIGBhdWRpdF9ldmVudHNgIGNvbGxlY3Rpb24uIE90aGVyIHNlcnZpY2VzXG4gKiB3aXRoIHdvcmtlci1zdHlsZSBlbWl0dGVycyBjYW4gdXNlIHRoZSBzYW1lIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCgpO1xuICogYXVkaXRDbGllbnQucmVjb3JkKHtcbiAqIGFjdGlvbjogJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnLFxuICogYWN0b3JJZDogJ3VzZXItMTIzJyxcbiAqIG9yZ0lkOiAnb3JnLWFjbWUnLFxuICogdGFyZ2V0VHlwZTogJ3BsdWdpbicsXG4gKiB0YXJnZXRJZDogJ3BsdWdpbi1hYmMnLFxuICogZGV0YWlsczogeyBuYW1lOiAnbXktcGx1Z2luJywgdmVyc2lvbjogJzEuMC4wJyB9LFxuICogfSwgJ3BsdWdpbicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdENsaWVudChjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBSZW1vdGVBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9IT1NUID8/ICdwbGF0Zm9ybScsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IDMwMDAsXG4gIH07XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNhZmVDbGllbnQoc2VydmljZUNvbmZpZyk7XG4gIGNvbnN0IHNwb29sID0gY29uZmlnLnNwb29sO1xuICBjb25zdCBkcmFpbkJhdGNoU2l6ZSA9IGNvbmZpZy5kcmFpbkJhdGNoU2l6ZSA/PyAxMDA7XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgT05FIGxpdmUgZGVsaXZlcnkuIFJlc29sdmVzIGB0cnVlYCBvbiBhIDJ4eCBhY2NlcHQsIGBmYWxzZWAgb24gYW55XG4gICAqIG5vbi0yeHggLyB0aHJvd24gZXJyb3IgKHRoZSBodHRwLWNsaWVudCBoYXMgYWxyZWFkeSBhcHBsaWVkIHRoZSByZXRyeVxuICAgKiBidWRnZXQpLiBBIHN0YWJsZSBwZXItZW1pc3Npb24gYElkZW1wb3RlbmN5LUtleWAgbWFrZXMgdGhpcyBub24taWRlbXBvdGVudFxuICAgKiBQT1NUIHJldHJ5LXNhZmUgYW5kIGxldHMgdGhlIHBsYXRmb3JtIGluZ2VzdCBkZWR1cCBhIHJlLWRlbGl2ZXJlZCBldmVudFxuICAgKiBpbnN0ZWFkIG9mIHdyaXRpbmcgYSBkdXBsaWNhdGUgYXVkaXQgcm93IChhbmQgZHVwbGljYXRlIGNoYWluIGxpbmspLlxuICAgKiBgSWRlbXBvdGVuY3ktS2V5YCBpcyBkZXJpdmVkIGZyb20gdGhlIGV2ZW50IHNvIGEgU1BPT0xFRCByZS1kZWxpdmVyeSByZXVzZXNcbiAgICogdGhlIHNhbWUga2V5IGFzIGl0cyBvcmlnaW5hbCBsaXZlIGF0dGVtcHQg4oCUIHRoZSB0d28gY29sbGFwc2UgdG8gb25lIHJvdy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGl2ZXIoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdXRoSGVhZGVyID0gZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgb3JnSWQ6IGV2ZW50Lm9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ0F1dGhvcml6YXRpb24nOiBhdXRoSGVhZGVyLFxuICAgICAgJ0lkZW1wb3RlbmN5LUtleSc6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KCcvYXVkaXQvZXZlbnRzJywgZXZlbnQsIHsgaGVhZGVycywgLi4uQVVESVRfUkVRVUVTVF9PUFRJT05TIH0pO1xuICAgICAgY29uc3Qgb2sgPSAhIXJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDA7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IG5vbi1vaycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3QgdGhyZXcnLCB7IGFjdGlvbjogZXZlbnQuYWN0aW9uLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VyaWFsaXplIHNwb29sIGRyYWlucyBzbyBhIHBlcmlvZGljIHRpY2sgYW5kIGFuIG9uLXN1Y2Nlc3MgZHJhaW4gY2FuJ3QgYm90aFxuICAvLyBwdWxsIHRoZSBzYW1lIGJhdGNoLiBTdG9wcyBlYXJseSB0aGUgbW9tZW50IGEgcmUtZGVsaXZlcnkgZmFpbHMgKHBsYXRmb3JtXG4gIC8vIHN0aWxsIGRvd24pIHNvIHdlIGRvbid0IGhhbW1lciBpdCBvciBjaHVybiB0aGUgYnVmZmVyLlxuICBsZXQgZHJhaW5pbmcgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gZHJhaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzcG9vbCB8fCBkcmFpbmluZykgcmV0dXJuO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGF3YWl0IHNwb29sLnRha2UoZHJhaW5CYXRjaFNpemUpO1xuICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGRlbGl2ZXJlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3QgZmFpbGVkOiBBdWRpdFNwb29sRW50cnlbXSA9IFtdO1xuICAgICAgICBsZXQgcGxhdGZvcm1Eb3duID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYmF0Y2gpIHtcbiAgICAgICAgICBpZiAocGxhdGZvcm1Eb3duKSB7IGZhaWxlZC5wdXNoKGVudHJ5KTsgY29udGludWU7IH1cbiAgICAgICAgICBjb25zdCBvayA9IGF3YWl0IGRlbGl2ZXIoZW50cnkuZXZlbnQsIGVudHJ5LnNlcnZpY2VOYW1lKTtcbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIGRlbGl2ZXJlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWRlbGl2ZXJlZF90b3RhbCcsIHsgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsYXRmb3JtRG93biA9IHRydWU7XG4gICAgICAgICAgICBmYWlsZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFja25vd2xlZGdlIHRoZSBkZWxpdmVyZWQgcHJlZml4IHNvIGl0IGNsZWFycyB0aGUgaW4tcHJvZ3Jlc3MgbGlzdDsgdGhlXG4gICAgICAgIC8vIHJlbGlhYmxlIHRha2UoKSBtb3ZlZCB0aGUgd2hvbGUgYmF0Y2ggdGhlcmUsIHNvIHVuYWNrZWQgc3Vydml2b3JzIGFyZVxuICAgICAgICAvLyByZWNsYWltZWQgYnkgcmVjb3ZlcigpIGFmdGVyIGEgY3Jhc2ggcmF0aGVyIHRoYW4gYmVpbmcgc2lsZW50bHkgbG9zdC5cbiAgICAgICAgaWYgKGRlbGl2ZXJlZC5sZW5ndGggPiAwKSBhd2FpdCBzcG9vbC5hY2soZGVsaXZlcmVkKTtcbiAgICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgc3Bvb2wucmVxdWV1ZShmYWlsZWQpO1xuICAgICAgICAgIHJldHVybjsgLy8gc3RpbGwgZG93biDigJQgdHJ5IGFnYWluIG9uIHRoZSBuZXh0IHRpY2tcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIGRyYWluIGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGxldCBkcmFpblRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gIGlmIChzcG9vbCkge1xuICAgIC8vIFJlY2xhaW0gYW55IGJhdGNoIHN0cmFuZGVkIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IGJ5IGEgcHJpb3IgY3Jhc2gsIHRoZW5cbiAgICAvLyBhdHRlbXB0IHRvIGZsdXNoIGl0LiBCb3RoIGFyZSBiZXN0LWVmZm9ydCAodGhlIHNwb29sIHN3YWxsb3dzIGl0cyBlcnJvcnMpLlxuICAgIHZvaWQgc3Bvb2wucmVjb3ZlcigpLnRoZW4oKCkgPT4gZHJhaW4oKSk7XG4gICAgZHJhaW5UaW1lciA9IHNldEludGVydmFsKCgpID0+IHsgdm9pZCBkcmFpbigpOyB9LCBjb25maWcuZHJhaW5JbnRlcnZhbE1zID8/IDMwXzAwMCk7XG4gICAgLy8gRG9uJ3QgbGV0IHRoZSBkcmFpbiB0aW1lciBrZWVwIHRoZSBwcm9jZXNzIGFsaXZlIG9uIHNodXRkb3duLlxuICAgIChkcmFpblRpbWVyIGFzIHVua25vd24gYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZWNvcmQoZXZlbnQsIHNlcnZpY2VOYW1lKSB7XG4gICAgICAvLyBTdGFtcCB3aGVuIHRoZSBhY3Rpb24gYWN0dWFsbHkgb2NjdXJyZWQgKHN1cnZpdmVzIHNwb29sIGRlbGF5KSBhbmQgcGluIGFcbiAgICAgIC8vIHN0YWJsZSBpZGVtcG90ZW5jeSBrZXkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBzcG9vbGVkIHJldHJ5IGRlZHVwLlxuICAgICAgY29uc3Qgc3RhbXBlZDogUmVtb3RlQXVkaXRFdmVudCA9IHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIG9jY3VycmVkQXQ6IGV2ZW50Lm9jY3VycmVkQXQgPz8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBpZGVtcG90ZW5jeUtleTogZXZlbnQuaWRlbXBvdGVuY3lLZXkgPz8gcmFuZG9tVVVJRCgpLFxuICAgICAgfTtcbiAgICAgIHZvaWQgZGVsaXZlcihzdGFtcGVkLCBzZXJ2aWNlTmFtZSkudGhlbigob2spID0+IHtcbiAgICAgICAgaWYgKG9rKSB7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X2VtaXR0ZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCBvdXRjb21lOiBzdGFtcGVkLm91dGNvbWUgPz8gJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgIGlmIChzcG9vbCkgdm9pZCBkcmFpbigpOyAvLyBwbGF0Zm9ybSBpcyByZWFjaGFibGUg4oCUIGZsdXNoIGFueSBiYWNrbG9nXG4gICAgICAgIH0gZWxzZSBpZiAoc3Bvb2wpIHtcbiAgICAgICAgICB2b2lkIHNwb29sLmVucXVldWUoeyBldmVudDogc3RhbXBlZCwgc2VydmljZU5hbWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X2Ryb3BwZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGNsb3NlKCkge1xuICAgICAgaWYgKGRyYWluVGltZXIpIHsgY2xlYXJJbnRlcnZhbChkcmFpblRpbWVyKTsgZHJhaW5UaW1lciA9IHVuZGVmaW5lZDsgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIHN0YW5kYXJkIGBhdXRoei5kZW5pZWRgIHNpbmsgdXNlZCBieSBldmVyeSByZW1vdGUtYXVkaXQgc2VydmljZVxuICogKHBpcGVsaW5lLCBwbHVnaW4sIGNvbXBsaWFuY2UsIHF1b3RhLCBtZXNzYWdlLCBiaWxsaW5nLCByZXBvcnRpbmcsIOKApikuXG4gKlxuICogVGhlIHNoYXJlZCBgcmVxdWlyZUF1dGhgIGdhdGUgZm9yd2FyZHMgZWFjaCBERU5JRUQgc3RhdGUtY2hhbmdpbmcgcmVxdWVzdCB0b1xuICogdGhlIGF1ZGl0b3Igc2V0IHZpYSB7QGxpbmsgc2V0QXV0aHpEZW5pYWxBdWRpdG9yfTsgdGhpcyB3aXJlcyB0aGF0IGhvb2sgdG8gdGhlXG4gKiBzZXJ2aWNlJ3Mge0BsaW5rIFJlbW90ZUF1ZGl0Q2xpZW50fSwgZm9yd2FyZGluZyBhIGBmYWlsdXJlYC1vdXRjb21lXG4gKiBgYXV0aHouZGVuaWVkYCBldmVudCBzbyBwcm9iaW5nIC8gcHJpdmlsZWdlLWVzY2FsYXRpb24gYXR0ZW1wdHMgbGVhdmUgYSB0cmFpbC5cbiAqIEVtaXNzaW9uIGlzIGZpcmUtYW5kLWZvcmdldCAodGhlIGNsaWVudCBuZXZlciB0aHJvd3MpLiBgZ2V0Q2xpZW50YCBpcyBhIGdldHRlclxuICogc28gdGhlIGNsaWVudCBzdGF5cyBsYXppbHkgY29uc3RydWN0ZWQgKHNlcnZpY2VzIG1lbW9pemUgaXQgb24gZmlyc3QgdXNlKS5cbiAqXG4gKiBQbGF0Zm9ybSBpcyBpbnRlbnRpb25hbGx5IE5PVCBhIGNhbGxlciDigJQgaXQgaXMgdGhlIGF1ZGl0IGF1dGhvcml0eSBhbmQgd3JpdGVzXG4gKiBgYXV0aHouZGVuaWVkYCBzdHJhaWdodCB0byBpdHMgbG9jYWwgc3RvcmUgKHdpdGggYGFmZmVjdGVkT3JnSWRgKSwgbm90IHRocm91Z2hcbiAqIGEgUmVtb3RlQXVkaXRDbGllbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGdldENsaWVudDogKCkgPT4gUmVtb3RlQXVkaXRDbGllbnQpOiB2b2lkIHtcbiAgc2V0QXV0aHpEZW5pYWxBdWRpdG9yKChpbmZvOiBBdXRoekRlbmlhbEluZm8pID0+IGdldENsaWVudCgpLnJlY29yZCh7XG4gICAgYWN0aW9uOiAnYXV0aHouZGVuaWVkJyxcbiAgICBhY3RvcklkOiBpbmZvLmFjdG9ySWQgPz8gJ2Fub255bW91cycsXG4gICAgYWN0b3JFbWFpbDogaW5mby5hY3RvckVtYWlsLFxuICAgIG9yZ0lkOiBpbmZvLm9yZ0lkLFxuICAgIG91dGNvbWU6ICdmYWlsdXJlJyxcbiAgICBkZXRhaWxzOiB7IG1ldGhvZDogaW5mby5tZXRob2QsIHBhdGg6IGluZm8ucGF0aCwgcmVxdWlyZWQ6IGluZm8ucmVxdWlyZWQgfSxcbiAgfSwgc2VydmljZU5hbWUpKTtcbn1cblxuLyoqXG4gKiBBIHNlcnZpY2Utc2NvcGVkIGF1ZGl0IGNsaWVudDogYSBkdXJhYmxlLXNwb29sLWJhY2tlZCB7QGxpbmsgUmVtb3RlQXVkaXRDbGllbnR9XG4gKiB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgcHJlLWJvdW5kIGZvciBlbWlzc2lvbi4gUmVwbGFjZXMgdGhlIHBlci1zZXJ2aWNlXG4gKiBib2lsZXJwbGF0ZSBvZiBgY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQoeyBzcG9vbDogY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKCkgPz8gdW5kZWZpbmVkIH0pYFxuICogcGx1cyBhIGhhbmQtcm9sbGVkIGBlbWl0PFNlcnZpY2U+QXVkaXRgIHdyYXBwZXIgdGhhdCByZXBlYXRzIHRoZSBzZXJ2aWNlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUF1ZGl0Q2xpZW50IHtcbiAgLyoqIEVtaXQgYW4gYXVkaXQgZXZlbnQgd2l0aCB0aGUgc2VydmljZSBuYW1lIGJvdW5kLiBGaXJlLWFuZC1mb3JnZXQuICovXG4gIGVtaXQoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQpOiB2b2lkO1xuICAvKiogVGhlIHVuZGVybHlpbmcgcmVtb3RlIGNsaWVudCDigJQgZm9yIGB3aXJlQXV0aHpEZW5pYWxBdWRpdG9yYCArIGBjbG9zZSgpYC4gKi9cbiAgcmVhZG9ubHkgY2xpZW50OiBSZW1vdGVBdWRpdENsaWVudDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIHNlcnZpY2UncyBhdWRpdCBjbGllbnQ6IGEgUmVtb3RlQXVkaXRDbGllbnQgd2lyZWQgdG8gdGhlIGR1cmFibGUgUmVkaXNcbiAqIHNwb29sIChmcm9tIGFtYmllbnQgZW52OyBudWxsIOKGkiBubyBzcG9vbCkgd2l0aCBgc2VydmljZU5hbWVgIGJvdW5kLiBDb25zdHJ1Y3RcbiAqIE9OQ0UgcGVyIHByb2Nlc3Mg4oCUIG1lbW9pemUgYmVoaW5kIGEgbGF6eSBgZ2V0QXVkaXRDbGllbnQoKWAgaW4gdGhlIHNlcnZpY2Unc1xuICogYHNlcnZpY2VzL2F1ZGl0LnRzYC4gUGFzcyBgY29uZmlnLnNwb29sYCB0byBvdmVycmlkZSB0aGUgZW52LWRlcml2ZWQgc3Bvb2xcbiAqIChlLmcuIHJldXNlIGEgc2VydmljZSdzIGV4aXN0aW5nIGlvcmVkaXMgY29ubmVjdGlvbikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXJ2aWNlQXVkaXRDbGllbnQoc2VydmljZU5hbWU6IHN0cmluZywgY29uZmlnOiBSZW1vdGVBdWRpdENsaWVudENvbmZpZyA9IHt9KTogU2VydmljZUF1ZGl0Q2xpZW50IHtcbiAgY29uc3Qgc3Bvb2wgPSBjb25maWcuc3Bvb2wgPz8gY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKCkgPz8gdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCh7IC4uLmNvbmZpZywgc3Bvb2wgfSk7XG4gIHJldHVybiB7XG4gICAgZW1pdDogKGV2ZW50KSA9PiBjbGllbnQucmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSksXG4gICAgY2xpZW50LFxuICB9O1xufVxuXG4vKipcbiAqIExhemlseS1jb25zdHJ1Y3RlZCByZW1vdGUtYXVkaXQgYWNjZXNzb3IgZm9yIGEgc2VydmljZS4gRXZlcnkgc2VydmljZSdzXG4gKiBgc2VydmljZXMvYXVkaXQudHNgIHVzZWQgdG8gaGFuZC1yb2xsIHRoZSBzYW1lIG1vZHVsZSBzaW5nbGV0b24gKGEgYGxldCBhdWRpdGBcbiAqICsgYHN2YygpYCB0aGF0IGJ1aWxkcyBhIHtAbGluayBTZXJ2aWNlQXVkaXRDbGllbnR9IG9uIGZpcnN0IHVzZSwgdGhlbiBhXG4gKiBgZ2V0QXVkaXRDbGllbnQoKWAgcmV0dXJuaW5nIGAuY2xpZW50YCBhbmQgYW4gYGVtaXQoZXZlbnQpYCBmb3J3YXJkaW5nIHRvXG4gKiBgLmVtaXRgKS4gVGhpcyBwYWNrYWdlcyB0aGF0IHBhdHRlcm4gaW4gT05FIHBsYWNlIHNvIGVhY2ggc2VydmljZSdzIGF1ZGl0XG4gKiB3aXJpbmcgaXMgYSBvbmUtbGluZXIgYW5kIGNhbid0IGRyaWZ0LlxuICpcbiAqIExhenkgb24gcHVycG9zZTogdGhlIHVuZGVybHlpbmcgY2xpZW50IHdpcmVzIGFuIGVudi1SZWRpcyBhdWRpdCBzcG9vbCwgc29cbiAqIGJ1aWxkaW5nIGl0IGF0IGltcG9ydCB0aW1lIHdvdWxkIGZvcmNlIHRoYXQgY29ubmVjdGlvbiB3aGVyZXZlciB0aGUgbW9kdWxlIGlzXG4gKiBtZXJlbHkgaW1wb3J0ZWQgKGUuZy4gdGVzdHMpLiBgZ2V0QXVkaXRDbGllbnRgIGlzIHBhc3NlZCB0b1xuICogYHdpcmVBdXRoekRlbmlhbEF1ZGl0b3JgOyBgZW1pdGAgYmFja3MgdGhlIHBlci1zZXJ2aWNlIGBlbWl0WEF1ZGl0YCBoZWxwZXJzLlxuICogQm90aCBzdGF5IEZJUkUtQU5ELUZPUkdFVCAocmVjb3JkIG5ldmVyIHRocm93cyAvIGlzIG5vdCBhd2FpdGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUF1ZGl0QWNjZXNzb3Ioc2VydmljZU5hbWU6IHN0cmluZyk6IHtcbiAgZ2V0QXVkaXRDbGllbnQ6ICgpID0+IFJlbW90ZUF1ZGl0Q2xpZW50O1xuICBlbWl0OiAoZXZlbnQ6IFJlbW90ZUF1ZGl0RXZlbnQpID0+IHZvaWQ7XG59IHtcbiAgbGV0IGF1ZGl0OiBTZXJ2aWNlQXVkaXRDbGllbnQgfCBudWxsID0gbnVsbDtcbiAgY29uc3Qgc3ZjID0gKCk6IFNlcnZpY2VBdWRpdENsaWVudCA9PiB7XG4gICAgaWYgKCFhdWRpdCkgYXVkaXQgPSBjcmVhdGVTZXJ2aWNlQXVkaXRDbGllbnQoc2VydmljZU5hbWUpO1xuICAgIHJldHVybiBhdWRpdDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBnZXRBdWRpdENsaWVudDogKCkgPT4gc3ZjKCkuY2xpZW50LFxuICAgIGVtaXQ6IChldmVudCkgPT4gc3ZjKCkuZW1pdChldmVudCksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The next delay in a capped doubling sequence.
3
+ *
4
+ * Exposed on its own for loops that are not "retry until success" — notably a
5
+ * readiness MONITOR, which keeps polling forever and only wants the backoff
6
+ * arithmetic while it waits for a dependency to come back.
7
+ */
8
+ export declare function nextBackoffMs(currentMs: number, maxMs: number): number;
9
+ /** Options for {@link retryForever}. */
10
+ export interface RetryForeverOptions {
11
+ /** First delay after a failure, in ms. Doubles from here. */
12
+ baseMs: number;
13
+ /** Ceiling the doubling delay is capped at, in ms. */
14
+ maxMs: number;
15
+ /**
16
+ * Called after every failed attempt, with the error and the delay about to
17
+ * be waited. This is where the caller logs — the helper never logs itself,
18
+ * because each call site wants its own message and fields.
19
+ */
20
+ onAttemptFailed: (error: unknown, delayMs: number) => void;
21
+ /**
22
+ * Keep going? Checked before each attempt. Defaults to "always". A caller
23
+ * that can shut down (a closing relay, a draining server) passes its abort
24
+ * predicate here so the loop never keeps a dying process alive.
25
+ */
26
+ shouldContinue?: () => boolean;
27
+ }
28
+ /**
29
+ * Run `fn` until it succeeds, waiting `baseMs`, `2×baseMs`, … capped at
30
+ * `maxMs` between attempts.
31
+ *
32
+ * Resolves with `fn`'s value on the first success. Resolves with `undefined`
33
+ * when `shouldContinue()` turns false before an attempt — the caller aborted,
34
+ * which is not an error. Never rejects: the whole point is that a failing
35
+ * dependency does not propagate out as a thrown boot error.
36
+ */
37
+ export declare function retryForever<T>(fn: () => Promise<T>, { baseMs, maxMs, onAttemptFailed, shouldContinue }: RetryForeverOptions): Promise<T | undefined>;
@@ -0,0 +1,58 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Capped exponential backoff for operations that must NEVER give up.
5
+ *
6
+ * Distinct from `retry-strategy.ts` next door, which is HTTP-shaped: it has a
7
+ * bounded attempt count, inspects status codes and honours `Retry-After`. This
8
+ * one is for process-lifetime dependency waits — a cold Mongo at boot, a Redis
9
+ * pub/sub subscription that has to come up eventually — where giving up after N
10
+ * attempts is the wrong answer. Crash-looping the pod (or, worse, silently
11
+ * continuing degraded) is what these loops exist to avoid.
12
+ *
13
+ * Four separate hand-rolled copies of the same `delay = Math.min(delay * 2,
14
+ * max)` loop had drifted apart; this is the one implementation.
15
+ */
16
+ /**
17
+ * `unref`'d on purpose: these loops run for the life of the process, and a
18
+ * pending backoff timer must never be the thing that keeps a draining Node
19
+ * process from exiting. (`unref` is absent on the browser/timer shim some test
20
+ * environments install, hence the optional call.)
21
+ */
22
+ const sleep = (ms) => new Promise((resolve) => {
23
+ setTimeout(resolve, ms).unref?.();
24
+ });
25
+ /**
26
+ * The next delay in a capped doubling sequence.
27
+ *
28
+ * Exposed on its own for loops that are not "retry until success" — notably a
29
+ * readiness MONITOR, which keeps polling forever and only wants the backoff
30
+ * arithmetic while it waits for a dependency to come back.
31
+ */
32
+ export function nextBackoffMs(currentMs, maxMs) {
33
+ return Math.min(currentMs * 2, maxMs);
34
+ }
35
+ /**
36
+ * Run `fn` until it succeeds, waiting `baseMs`, `2×baseMs`, … capped at
37
+ * `maxMs` between attempts.
38
+ *
39
+ * Resolves with `fn`'s value on the first success. Resolves with `undefined`
40
+ * when `shouldContinue()` turns false before an attempt — the caller aborted,
41
+ * which is not an error. Never rejects: the whole point is that a failing
42
+ * dependency does not propagate out as a thrown boot error.
43
+ */
44
+ export async function retryForever(fn, { baseMs, maxMs, onAttemptFailed, shouldContinue }) {
45
+ let delayMs = baseMs;
46
+ while (shouldContinue?.() ?? true) {
47
+ try {
48
+ return await fn();
49
+ }
50
+ catch (error) {
51
+ onAttemptFailed(error, delayMs);
52
+ await sleep(delayMs);
53
+ delayMs = nextBackoffMs(delayMs, maxMs);
54
+ }
55
+ }
56
+ return undefined;
57
+ }
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktZm9yZXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZXRyeS1mb3JldmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQVUsRUFBaUIsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7SUFDbkUsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0FBQ3BDLENBQUMsQ0FBQyxDQUFDO0FBRUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxTQUFpQixFQUFFLEtBQWE7SUFDNUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQXNCRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxFQUFvQixFQUNwQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBdUI7SUFFdkUsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLE9BQU8sY0FBYyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIENhcHBlZCBleHBvbmVudGlhbCBiYWNrb2ZmIGZvciBvcGVyYXRpb25zIHRoYXQgbXVzdCBORVZFUiBnaXZlIHVwLlxuICpcbiAqIERpc3RpbmN0IGZyb20gYHJldHJ5LXN0cmF0ZWd5LnRzYCBuZXh0IGRvb3IsIHdoaWNoIGlzIEhUVFAtc2hhcGVkOiBpdCBoYXMgYVxuICogYm91bmRlZCBhdHRlbXB0IGNvdW50LCBpbnNwZWN0cyBzdGF0dXMgY29kZXMgYW5kIGhvbm91cnMgYFJldHJ5LUFmdGVyYC4gVGhpc1xuICogb25lIGlzIGZvciBwcm9jZXNzLWxpZmV0aW1lIGRlcGVuZGVuY3kgd2FpdHMg4oCUIGEgY29sZCBNb25nbyBhdCBib290LCBhIFJlZGlzXG4gKiBwdWIvc3ViIHN1YnNjcmlwdGlvbiB0aGF0IGhhcyB0byBjb21lIHVwIGV2ZW50dWFsbHkg4oCUIHdoZXJlIGdpdmluZyB1cCBhZnRlciBOXG4gKiBhdHRlbXB0cyBpcyB0aGUgd3JvbmcgYW5zd2VyLiBDcmFzaC1sb29waW5nIHRoZSBwb2QgKG9yLCB3b3JzZSwgc2lsZW50bHlcbiAqIGNvbnRpbnVpbmcgZGVncmFkZWQpIGlzIHdoYXQgdGhlc2UgbG9vcHMgZXhpc3QgdG8gYXZvaWQuXG4gKlxuICogRm91ciBzZXBhcmF0ZSBoYW5kLXJvbGxlZCBjb3BpZXMgb2YgdGhlIHNhbWUgYGRlbGF5ID0gTWF0aC5taW4oZGVsYXkgKiAyLFxuICogbWF4KWAgbG9vcCBoYWQgZHJpZnRlZCBhcGFydDsgdGhpcyBpcyB0aGUgb25lIGltcGxlbWVudGF0aW9uLlxuICovXG5cbi8qKlxuICogYHVucmVmYCdkIG9uIHB1cnBvc2U6IHRoZXNlIGxvb3BzIHJ1biBmb3IgdGhlIGxpZmUgb2YgdGhlIHByb2Nlc3MsIGFuZCBhXG4gKiBwZW5kaW5nIGJhY2tvZmYgdGltZXIgbXVzdCBuZXZlciBiZSB0aGUgdGhpbmcgdGhhdCBrZWVwcyBhIGRyYWluaW5nIE5vZGVcbiAqIHByb2Nlc3MgZnJvbSBleGl0aW5nLiAoYHVucmVmYCBpcyBhYnNlbnQgb24gdGhlIGJyb3dzZXIvdGltZXIgc2hpbSBzb21lIHRlc3RcbiAqIGVudmlyb25tZW50cyBpbnN0YWxsLCBoZW5jZSB0aGUgb3B0aW9uYWwgY2FsbC4pXG4gKi9cbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+ID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpLnVucmVmPy4oKTtcbn0pO1xuXG4vKipcbiAqIFRoZSBuZXh0IGRlbGF5IGluIGEgY2FwcGVkIGRvdWJsaW5nIHNlcXVlbmNlLlxuICpcbiAqIEV4cG9zZWQgb24gaXRzIG93biBmb3IgbG9vcHMgdGhhdCBhcmUgbm90IFwicmV0cnkgdW50aWwgc3VjY2Vzc1wiIOKAlCBub3RhYmx5IGFcbiAqIHJlYWRpbmVzcyBNT05JVE9SLCB3aGljaCBrZWVwcyBwb2xsaW5nIGZvcmV2ZXIgYW5kIG9ubHkgd2FudHMgdGhlIGJhY2tvZmZcbiAqIGFyaXRobWV0aWMgd2hpbGUgaXQgd2FpdHMgZm9yIGEgZGVwZW5kZW5jeSB0byBjb21lIGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0QmFja29mZk1zKGN1cnJlbnRNczogbnVtYmVyLCBtYXhNczogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWluKGN1cnJlbnRNcyAqIDIsIG1heE1zKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayByZXRyeUZvcmV2ZXJ9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeUZvcmV2ZXJPcHRpb25zIHtcbiAgLyoqIEZpcnN0IGRlbGF5IGFmdGVyIGEgZmFpbHVyZSwgaW4gbXMuIERvdWJsZXMgZnJvbSBoZXJlLiAqL1xuICBiYXNlTXM6IG51bWJlcjtcbiAgLyoqIENlaWxpbmcgdGhlIGRvdWJsaW5nIGRlbGF5IGlzIGNhcHBlZCBhdCwgaW4gbXMuICovXG4gIG1heE1zOiBudW1iZXI7XG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgZXZlcnkgZmFpbGVkIGF0dGVtcHQsIHdpdGggdGhlIGVycm9yIGFuZCB0aGUgZGVsYXkgYWJvdXQgdG9cbiAgICogYmUgd2FpdGVkLiBUaGlzIGlzIHdoZXJlIHRoZSBjYWxsZXIgbG9ncyDigJQgdGhlIGhlbHBlciBuZXZlciBsb2dzIGl0c2VsZixcbiAgICogYmVjYXVzZSBlYWNoIGNhbGwgc2l0ZSB3YW50cyBpdHMgb3duIG1lc3NhZ2UgYW5kIGZpZWxkcy5cbiAgICovXG4gIG9uQXR0ZW1wdEZhaWxlZDogKGVycm9yOiB1bmtub3duLCBkZWxheU1zOiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBLZWVwIGdvaW5nPyBDaGVja2VkIGJlZm9yZSBlYWNoIGF0dGVtcHQuIERlZmF1bHRzIHRvIFwiYWx3YXlzXCIuIEEgY2FsbGVyXG4gICAqIHRoYXQgY2FuIHNodXQgZG93biAoYSBjbG9zaW5nIHJlbGF5LCBhIGRyYWluaW5nIHNlcnZlcikgcGFzc2VzIGl0cyBhYm9ydFxuICAgKiBwcmVkaWNhdGUgaGVyZSBzbyB0aGUgbG9vcCBuZXZlciBrZWVwcyBhIGR5aW5nIHByb2Nlc3MgYWxpdmUuXG4gICAqL1xuICBzaG91bGRDb250aW51ZT86ICgpID0+IGJvb2xlYW47XG59XG5cbi8qKlxuICogUnVuIGBmbmAgdW50aWwgaXQgc3VjY2VlZHMsIHdhaXRpbmcgYGJhc2VNc2AsIGAyw5diYXNlTXNgLCDigKYgY2FwcGVkIGF0XG4gKiBgbWF4TXNgIGJldHdlZW4gYXR0ZW1wdHMuXG4gKlxuICogUmVzb2x2ZXMgd2l0aCBgZm5gJ3MgdmFsdWUgb24gdGhlIGZpcnN0IHN1Y2Nlc3MuIFJlc29sdmVzIHdpdGggYHVuZGVmaW5lZGBcbiAqIHdoZW4gYHNob3VsZENvbnRpbnVlKClgIHR1cm5zIGZhbHNlIGJlZm9yZSBhbiBhdHRlbXB0IOKAlCB0aGUgY2FsbGVyIGFib3J0ZWQsXG4gKiB3aGljaCBpcyBub3QgYW4gZXJyb3IuIE5ldmVyIHJlamVjdHM6IHRoZSB3aG9sZSBwb2ludCBpcyB0aGF0IGEgZmFpbGluZ1xuICogZGVwZW5kZW5jeSBkb2VzIG5vdCBwcm9wYWdhdGUgb3V0IGFzIGEgdGhyb3duIGJvb3QgZXJyb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXRyeUZvcmV2ZXI8VD4oXG4gIGZuOiAoKSA9PiBQcm9taXNlPFQ+LFxuICB7IGJhc2VNcywgbWF4TXMsIG9uQXR0ZW1wdEZhaWxlZCwgc2hvdWxkQ29udGludWUgfTogUmV0cnlGb3JldmVyT3B0aW9ucyxcbik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICBsZXQgZGVsYXlNcyA9IGJhc2VNcztcbiAgd2hpbGUgKHNob3VsZENvbnRpbnVlPy4oKSA/PyB0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBvbkF0dGVtcHRGYWlsZWQoZXJyb3IsIGRlbGF5TXMpO1xuICAgICAgYXdhaXQgc2xlZXAoZGVsYXlNcyk7XG4gICAgICBkZWxheU1zID0gbmV4dEJhY2tvZmZNcyhkZWxheU1zLCBtYXhNcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -9,12 +9,16 @@ export declare const DEFAULT_MAX_RATE_LIMIT_RETRIES: number;
9
9
  * Configuration for retry behavior.
10
10
  */
11
11
  export interface RetryConfig {
12
- /** Maximum retry attempts for transient failures (default: 2) */
12
+ /** Retries AFTER the initial attempt (so `3` ⇒ up to 4 attempts). */
13
13
  maxRetries: number;
14
14
  /** Base delay between retries in ms — doubles each attempt (default: 200) */
15
15
  retryDelayMs: number;
16
- /** Maximum retry attempts specifically for 429 rate limiting (default: 4) */
17
- maxRateLimitRetries: number;
16
+ /**
17
+ * Maximum retry attempts specifically for 429 rate limiting (default:
18
+ * {@link DEFAULT_MAX_RATE_LIMIT_RETRIES}). HTTP-only — omit it for a
19
+ * non-HTTP consumer such as the database connection retry.
20
+ */
21
+ maxRateLimitRetries?: number;
18
22
  }
19
23
  /**
20
24
  * Result of a retry decision: whether to retry, and how long to wait.