@pipeline-builder/api-core 4.1.19 → 4.1.21

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 (38) hide show
  1. package/lib/helpers/access-helpers.d.ts +50 -2
  2. package/lib/helpers/access-helpers.js +44 -3
  3. package/lib/helpers/index.d.ts +1 -1
  4. package/lib/helpers/index.js +2 -2
  5. package/lib/middleware/ask-provenance.d.ts +53 -0
  6. package/lib/middleware/ask-provenance.js +26 -0
  7. package/lib/middleware/index.d.ts +1 -0
  8. package/lib/middleware/index.js +2 -1
  9. package/lib/services/http-client.d.ts +0 -1
  10. package/lib/services/http-client.js +5 -7
  11. package/lib/services/index.d.ts +2 -2
  12. package/lib/services/index.js +3 -3
  13. package/lib/services/remote-audit-client.d.ts +1 -15
  14. package/lib/services/remote-audit-client.js +2 -295
  15. package/lib/services/s3-client.d.ts +54 -0
  16. package/lib/services/s3-client.js +106 -0
  17. package/lib/types/ask-proposals.d.ts +269 -0
  18. package/lib/types/ask-proposals.js +308 -0
  19. package/lib/types/compliance-exemption.d.ts +24 -0
  20. package/lib/types/compliance-exemption.js +4 -0
  21. package/lib/types/index.d.ts +5 -2
  22. package/lib/types/index.js +5 -2
  23. package/lib/types/remote-audit-actions.d.ts +23 -0
  24. package/lib/types/remote-audit-actions.js +305 -0
  25. package/lib/types/wire-vocabulary.d.ts +2 -2
  26. package/lib/types/wire-vocabulary.js +3 -3
  27. package/lib/utils/date.d.ts +19 -0
  28. package/lib/utils/date.js +22 -0
  29. package/lib/utils/dsse.d.ts +32 -0
  30. package/lib/utils/dsse.js +55 -0
  31. package/lib/utils/index.d.ts +3 -1
  32. package/lib/utils/index.js +4 -2
  33. package/lib/utils/response.d.ts +34 -4
  34. package/lib/utils/response.js +30 -5
  35. package/lib/utils/sensitive-patterns.js +17 -1
  36. package/lib/validation/index.d.ts +2 -2
  37. package/lib/validation/index.js +3 -3
  38. package/package.json +13 -1
@@ -1,6 +1,6 @@
1
1
  export { exchangeApiKey, resetApiKeyExchangeCache, ApiKeyRejectedError, ApiKeyExchangeUnavailableError, } from './api-key-exchange.js';
2
2
  export { createCacheService, type RedisCacheClient, type CacheInvalidationMessage, type CacheInvalidationBus, type RedisInvalidationClient, CacheService, } from './cache-service.js';
3
- export { closeLeaderLock, withLeaderLock, createEnvRedisLock, type LockRedis, } from './leader-lock.js';
3
+ export { withLeaderLock, createEnvRedisLock, type LockRedis, } from './leader-lock.js';
4
4
  export { sendSystemNotification, SYSTEM_NOTIFY_PATH, type SystemNotification, } from './system-notification.js';
5
5
  export { createScheduler, type SchedulerOptions, type Scheduler, } from './scheduler.js';
6
6
  export { createComplianceClient, type ComplianceCheckResult, type ComplianceViolation, } from './compliance-client.js';
@@ -16,7 +16,7 @@ export { getErrorRetryDecision, } from './retry-strategy.js';
16
16
  export type { RetryConfig, } from './retry-strategy.js';
17
17
  export { nextBackoffMs, retryForever, } from './retry-forever.js';
18
18
  export { getQuotaServiceAuthHeader, createQuotaService, incrementQuota, reserveQuota, sendQuotaReserveDenied, decrementQuota, type QuotaReserveResult, type QuotaService, } from './quota.js';
19
- export { isRemoteAuditAction, createRemoteAuditClient, wireAuthzDenialAuditor, recordAudit, REMOTE_AUDIT_ACTIONS, type RemoteAuditEvent, type RemoteAuditClient, } from './remote-audit-client.js';
19
+ export { createRemoteAuditClient, wireAuthzDenialAuditor, recordAudit, type RemoteAuditEvent, type RemoteAuditClient, } from './remote-audit-client.js';
20
20
  export { auditSpoolKey, createEnvRedisAuditSpool, type AuditSpool, } from './audit-spool.js';
21
21
  export { resolveRedisConnection, describeRedisConnection, createRedisClient, createEnvRedisClient, createRedisReadyGate, incrWindow, RedisConfigError, type RedisEvalClient, } from './env-redis.js';
22
22
  export { createRedisTokenRevocationStore, createEnvRedisTokenRevocationStore, publishTokenRevocation, publishSessionRevocation, publishCredentialRevocation, } from './token-revocation.js';
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export { exchangeApiKey, resetApiKeyExchangeCache, ApiKeyRejectedError, ApiKeyExchangeUnavailableError, } from './api-key-exchange.js';
4
4
  export { createCacheService, CacheService, } from './cache-service.js';
5
- export { closeLeaderLock, withLeaderLock, createEnvRedisLock, } from './leader-lock.js';
5
+ export { withLeaderLock, createEnvRedisLock, } from './leader-lock.js';
6
6
  export { sendSystemNotification, SYSTEM_NOTIFY_PATH, } from './system-notification.js';
7
7
  export { createScheduler, } from './scheduler.js';
8
8
  export { createComplianceClient, } from './compliance-client.js';
@@ -23,7 +23,7 @@ export { createEnvRedisDurableEventBus, } from './durable-event-bus.js';
23
23
  export { getErrorRetryDecision, } from './retry-strategy.js';
24
24
  export { nextBackoffMs, retryForever, } from './retry-forever.js';
25
25
  export { getQuotaServiceAuthHeader, createQuotaService, incrementQuota, reserveQuota, sendQuotaReserveDenied, decrementQuota, } from './quota.js';
26
- export { isRemoteAuditAction, createRemoteAuditClient, wireAuthzDenialAuditor, recordAudit, REMOTE_AUDIT_ACTIONS, } from './remote-audit-client.js';
26
+ export { createRemoteAuditClient, wireAuthzDenialAuditor, recordAudit, } from './remote-audit-client.js';
27
27
  export { auditSpoolKey, createEnvRedisAuditSpool, } from './audit-spool.js';
28
28
  export { resolveRedisConnection, describeRedisConnection, createRedisClient, createEnvRedisClient, createRedisReadyGate, incrWindow, RedisConfigError, } from './env-redis.js';
29
29
  export { createRedisTokenRevocationStore, createEnvRedisTokenRevocationStore, publishTokenRevocation, publishSessionRevocation, publishCredentialRevocation, } from './token-revocation.js';
@@ -31,4 +31,4 @@ export { createMemorySseTicketStore, createEnvSseTicketStore, envSseTicketCaps,
31
31
  export { wireServiceSecurity, } from './service-boot.js';
32
32
  export { createWebhookChannel, createEmailChannel, createChannelRegistry, } from './notification-channels.js';
33
33
  export { createEcosystemNotifyClient, ECOSYSTEM_NOTIFY_PATH, } from './ecosystem-notify-client.js';
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsOEJBQThCLEdBQy9CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGtCQUFrQixFQUtsQixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGNBQWMsRUFDZCxrQkFBa0IsR0FFbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGtCQUFrQixHQUVuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxlQUFlLEdBR2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLHNCQUFzQixHQUd2QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUUzQiw4QkFBOEIsR0FFL0IsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELE9BQU8sRUFHTCxZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLFNBQVMsR0FDVixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLGlGQUFpRjtBQUNqRiw4RUFBOEU7QUFDOUUsaUZBQWlGO0FBQ2pGLCtEQUErRDtBQUMvRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGVBQWUsRUFDZixnQkFBZ0IsR0FDakIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQiwrRUFBK0U7QUFDL0UseURBQXlEO0FBQ3pELE9BQU8sRUFDTCxvQkFBb0IsR0FDckIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsNkJBQTZCLEdBRzlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLHFCQUFxQixHQUN0QixNQUFNLHFCQUFxQixDQUFDO0FBSTdCLE9BQU8sRUFDTCxhQUFhLEVBQ2IsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLFlBQVksRUFDWixzQkFBc0IsRUFDdEIsY0FBYyxHQUdmLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsb0JBQW9CLEdBR3JCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNMLGFBQWEsRUFDYix3QkFBd0IsR0FFekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsZ0JBQWdCLEdBRWpCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QiwyQkFBMkIsR0FDNUIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixnQkFBZ0IsR0FJakIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsbUJBQW1CLEdBQ3BCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIscUJBQXFCLEdBTXRCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixxQkFBcUIsR0FFdEIsTUFBTSw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICBleGNoYW5nZUFwaUtleSxcbiAgcmVzZXRBcGlLZXlFeGNoYW5nZUNhY2hlLFxuICBBcGlLZXlSZWplY3RlZEVycm9yLFxuICBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IsXG59IGZyb20gJy4vYXBpLWtleS1leGNoYW5nZS5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVDYWNoZVNlcnZpY2UsXG4gIHR5cGUgUmVkaXNDYWNoZUNsaWVudCxcbiAgdHlwZSBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2FjaGVJbnZhbGlkYXRpb25CdXMsXG4gIHR5cGUgUmVkaXNJbnZhbGlkYXRpb25DbGllbnQsXG4gIENhY2hlU2VydmljZSxcbn0gZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCB7XG4gIGNsb3NlTGVhZGVyTG9jayxcbiAgd2l0aExlYWRlckxvY2ssXG4gIGNyZWF0ZUVudlJlZGlzTG9jayxcbiAgdHlwZSBMb2NrUmVkaXMsXG59IGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuZXhwb3J0IHtcbiAgc2VuZFN5c3RlbU5vdGlmaWNhdGlvbixcbiAgU1lTVEVNX05PVElGWV9QQVRILFxuICB0eXBlIFN5c3RlbU5vdGlmaWNhdGlvbixcbn0gZnJvbSAnLi9zeXN0ZW0tbm90aWZpY2F0aW9uLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVNjaGVkdWxlcixcbiAgdHlwZSBTY2hlZHVsZXJPcHRpb25zLFxuICB0eXBlIFNjaGVkdWxlcixcbn0gZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlQ29tcGxpYW5jZUNsaWVudCxcbiAgdHlwZSBDb21wbGlhbmNlQ2hlY2tSZXN1bHQsXG4gIHR5cGUgQ29tcGxpYW5jZVZpb2xhdGlvbixcbn0gZnJvbSAnLi9jb21wbGlhbmNlLWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBwbHVnaW5SdW5zT3duSW1hZ2UsXG4gIHBsdWdpbkNvbXBsaWFuY2VUYWdzLFxuICBkZXJpdmVQbHVnaW5JbWFnZUNvbXBsaWFuY2UsXG4gIHR5cGUgUGx1Z2luQ29tcGxpYW5jZUF0dHJpYnV0ZXMsXG4gIFBMVUdJTl9JTUFHRV9DT01QTElBTkNFX0ZJRUxEUyxcbiAgdHlwZSBQbHVnaW5JbWFnZVJvdyxcbn0gZnJvbSAnLi4vdXRpbHMvcGx1Z2luLWNvbXBsaWFuY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWV2ZW50LXN1YnNjcmliZXIuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBFbnRpdHlFdmVudCxcbiAgdHlwZSBFbnRpdHlFdmVudFN1YnNjcmliZXIsXG4gIGVudGl0eUV2ZW50cyxcbn0gZnJvbSAnLi9lbnRpdHktZXZlbnRzLmpzJztcbmV4cG9ydCB7XG4gIGRlc3Ryb3lTaGFyZWRIdHRwQWdlbnRzLFxuICBjcmVhdGVTYWZlQ2xpZW50LFxuICBSZXNwb25zZVRvb0xhcmdlRXJyb3IsXG4gIEludGVybmFsSHR0cENsaWVudCxcbn0gZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBzZXRQbGF0Zm9ybUp3a3NDYWNoZSxcbiAgSndrc1VuYXZhaWxhYmxlRXJyb3IsXG4gIFVua25vd25LaWRFcnJvcixcbiAgSndrc0NhY2hlLFxufSBmcm9tICcuL2p3a3MtY2FjaGUuanMnO1xuLy8gU2VydmljZS1rZXkgaW50ZXJuYWxzIHN0YXkgaW50ZXJuYWwuIFRoZSBwYWNrYWdlIHN1cmZhY2UgaXMgdGhlIHZlcmlmeS9pbnNwZWN0XG4vLyBzaWRlIHRoYXQgcGxhdGZvcm0ncyBKV1Qgb3B0aW9ucyBhbmQgdGhlIGF1dGggbWlkZGxld2FyZSBuZWVkOyBrZXkgTUFURVJJQUxcbi8vIGhhbmRsaW5nIChgc2lnblNlcnZpY2VKd3RgLCB0aGUgYnVuZGxlLCB0aGUgdGVzdCByZXNldCBob29rKSBpcyByZWFjaGFibGUgb25seVxuLy8gYnkgZGVlcCBpbXBvcnQgZnJvbSBpbnNpZGUgYXBpLWNvcmUgYW5kIGl0cyB0ZXN0aW5nIGhlbHBlcnMuXG5leHBvcnQge1xuICBpc1NlcnZpY2VLaWQsXG4gIHNlcnZpY2VJZGVudGl0eSxcbiAgdmVyaWZ5U2VydmljZUp3dCxcbn0gZnJvbSAnLi9zZXJ2aWNlLWtleXMuanMnO1xuLy8gVGhlIGJyZWFrZXIgaXMgd2lyZWQgYnkgdGhlIHNoYXJlZCBIVFRQIGNsaWVudDsgc2VydmljZXMgY29uc3VtZSBpdHMgRUZGRUNULFxuLy8gbm90IHRoZSBjbGFzcy4gT25seSB0aGUgb3BlcmF0aW9uYWwgc3VyZmFjZSBpcyBwdWJsaWMuXG5leHBvcnQge1xuICByZXNldENpcmN1aXRCcmVha2Vycyxcbn0gZnJvbSAnLi9jaXJjdWl0LWJyZWFrZXIuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlRW52UmVkaXNEdXJhYmxlRXZlbnRCdXMsXG4gIHR5cGUgRXZlbnRTdWJzY3JpcHRpb24sXG4gIHR5cGUgRHVyYWJsZUV2ZW50QnVzLFxufSBmcm9tICcuL2R1cmFibGUtZXZlbnQtYnVzLmpzJztcbmV4cG9ydCB7XG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFJldHJ5Q29uZmlnLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCB7XG4gIG5leHRCYWNrb2ZmTXMsXG4gIHJldHJ5Rm9yZXZlcixcbn0gZnJvbSAnLi9yZXRyeS1mb3JldmVyLmpzJztcbmV4cG9ydCB7XG4gIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXIsXG4gIGNyZWF0ZVF1b3RhU2VydmljZSxcbiAgaW5jcmVtZW50UXVvdGEsXG4gIHJlc2VydmVRdW90YSxcbiAgc2VuZFF1b3RhUmVzZXJ2ZURlbmllZCxcbiAgZGVjcmVtZW50UXVvdGEsXG4gIHR5cGUgUXVvdGFSZXNlcnZlUmVzdWx0LFxuICB0eXBlIFF1b3RhU2VydmljZSxcbn0gZnJvbSAnLi9xdW90YS5qcyc7XG5leHBvcnQge1xuICBpc1JlbW90ZUF1ZGl0QWN0aW9uLFxuICBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCxcbiAgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcixcbiAgcmVjb3JkQXVkaXQsXG4gIFJFTU9URV9BVURJVF9BQ1RJT05TLFxuICB0eXBlIFJlbW90ZUF1ZGl0RXZlbnQsXG4gIHR5cGUgUmVtb3RlQXVkaXRDbGllbnQsXG59IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBhdWRpdFNwb29sS2V5LFxuICBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wsXG4gIHR5cGUgQXVkaXRTcG9vbCxcbn0gZnJvbSAnLi9hdWRpdC1zcG9vbC5qcyc7XG5leHBvcnQge1xuICByZXNvbHZlUmVkaXNDb25uZWN0aW9uLFxuICBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbixcbiAgY3JlYXRlUmVkaXNDbGllbnQsXG4gIGNyZWF0ZUVudlJlZGlzQ2xpZW50LFxuICBjcmVhdGVSZWRpc1JlYWR5R2F0ZSxcbiAgaW5jcldpbmRvdyxcbiAgUmVkaXNDb25maWdFcnJvcixcbiAgdHlwZSBSZWRpc0V2YWxDbGllbnQsXG59IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIHB1Ymxpc2hUb2tlblJldm9jYXRpb24sXG4gIHB1Ymxpc2hTZXNzaW9uUmV2b2NhdGlvbixcbiAgcHVibGlzaENyZWRlbnRpYWxSZXZvY2F0aW9uLFxufSBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUsXG4gIGNyZWF0ZUVudlNzZVRpY2tldFN0b3JlLFxuICBlbnZTc2VUaWNrZXRDYXBzLFxuICB0eXBlIEVudlNzZVRpY2tldFN0b3JlQ29uZmlnLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlQ29uZmlnLFxufSBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuZXhwb3J0IHtcbiAgd2lyZVNlcnZpY2VTZWN1cml0eSxcbn0gZnJvbSAnLi9zZXJ2aWNlLWJvb3QuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlV2ViaG9va0NoYW5uZWwsXG4gIGNyZWF0ZUVtYWlsQ2hhbm5lbCxcbiAgY3JlYXRlQ2hhbm5lbFJlZ2lzdHJ5LFxuICB0eXBlIE5vdGlmaWNhdGlvblByaW9yaXR5LFxuICB0eXBlIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2hhbm5lbFRhcmdldCxcbiAgdHlwZSBEZWxpdmVyeVJlc3VsdCxcbiAgdHlwZSBOb3RpZmljYXRpb25DaGFubmVsLFxufSBmcm9tICcuL25vdGlmaWNhdGlvbi1jaGFubmVscy5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG4gIEVDT1NZU1RFTV9OT1RJRllfUEFUSCxcbiAgdHlwZSBFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG59IGZyb20gJy4vZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQuanMnO1xuIl19
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsOEJBQThCLEdBQy9CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGtCQUFrQixFQUtsQixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsY0FBYyxFQUNkLGtCQUFrQixHQUVuQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsa0JBQWtCLEdBRW5CLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNMLGVBQWUsR0FHaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsc0JBQXNCLEdBR3ZCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsMkJBQTJCLEVBRTNCLDhCQUE4QixHQUUvQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsT0FBTyxFQUdMLFlBQVksR0FDYixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsU0FBUyxHQUNWLE1BQU0saUJBQWlCLENBQUM7QUFDekIsaUZBQWlGO0FBQ2pGLDhFQUE4RTtBQUM5RSxpRkFBaUY7QUFDakYsK0RBQStEO0FBQy9ELE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUNmLGdCQUFnQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLCtFQUErRTtBQUMvRSx5REFBeUQ7QUFDekQsT0FBTyxFQUNMLG9CQUFvQixHQUNyQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCw2QkFBNkIsR0FHOUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wscUJBQXFCLEdBQ3RCLE1BQU0scUJBQXFCLENBQUM7QUFJN0IsT0FBTyxFQUNMLGFBQWEsRUFDYixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGtCQUFrQixFQUNsQixjQUFjLEVBQ2QsWUFBWSxFQUNaLHNCQUFzQixFQUN0QixjQUFjLEdBR2YsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsV0FBVyxHQUdaLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNMLGFBQWEsRUFDYix3QkFBd0IsR0FFekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsZ0JBQWdCLEdBRWpCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QiwyQkFBMkIsR0FDNUIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixnQkFBZ0IsR0FJakIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsbUJBQW1CLEdBQ3BCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIscUJBQXFCLEdBTXRCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixxQkFBcUIsR0FFdEIsTUFBTSw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICBleGNoYW5nZUFwaUtleSxcbiAgcmVzZXRBcGlLZXlFeGNoYW5nZUNhY2hlLFxuICBBcGlLZXlSZWplY3RlZEVycm9yLFxuICBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IsXG59IGZyb20gJy4vYXBpLWtleS1leGNoYW5nZS5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVDYWNoZVNlcnZpY2UsXG4gIHR5cGUgUmVkaXNDYWNoZUNsaWVudCxcbiAgdHlwZSBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2FjaGVJbnZhbGlkYXRpb25CdXMsXG4gIHR5cGUgUmVkaXNJbnZhbGlkYXRpb25DbGllbnQsXG4gIENhY2hlU2VydmljZSxcbn0gZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCB7XG4gIHdpdGhMZWFkZXJMb2NrLFxuICBjcmVhdGVFbnZSZWRpc0xvY2ssXG4gIHR5cGUgTG9ja1JlZGlzLFxufSBmcm9tICcuL2xlYWRlci1sb2NrLmpzJztcbmV4cG9ydCB7XG4gIHNlbmRTeXN0ZW1Ob3RpZmljYXRpb24sXG4gIFNZU1RFTV9OT1RJRllfUEFUSCxcbiAgdHlwZSBTeXN0ZW1Ob3RpZmljYXRpb24sXG59IGZyb20gJy4vc3lzdGVtLW5vdGlmaWNhdGlvbi5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVTY2hlZHVsZXIsXG4gIHR5cGUgU2NoZWR1bGVyT3B0aW9ucyxcbiAgdHlwZSBTY2hlZHVsZXIsXG59IGZyb20gJy4vc2NoZWR1bGVyLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbXBsaWFuY2VDbGllbnQsXG4gIHR5cGUgQ29tcGxpYW5jZUNoZWNrUmVzdWx0LFxuICB0eXBlIENvbXBsaWFuY2VWaW9sYXRpb24sXG59IGZyb20gJy4vY29tcGxpYW5jZS1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgcGx1Z2luUnVuc093bkltYWdlLFxuICBwbHVnaW5Db21wbGlhbmNlVGFncyxcbiAgZGVyaXZlUGx1Z2luSW1hZ2VDb21wbGlhbmNlLFxuICB0eXBlIFBsdWdpbkNvbXBsaWFuY2VBdHRyaWJ1dGVzLFxuICBQTFVHSU5fSU1BR0VfQ09NUExJQU5DRV9GSUVMRFMsXG4gIHR5cGUgUGx1Z2luSW1hZ2VSb3csXG59IGZyb20gJy4uL3V0aWxzL3BsdWdpbi1jb21wbGlhbmNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgRW50aXR5RXZlbnQsXG4gIHR5cGUgRW50aXR5RXZlbnRTdWJzY3JpYmVyLFxuICBlbnRpdHlFdmVudHMsXG59IGZyb20gJy4vZW50aXR5LWV2ZW50cy5qcyc7XG5leHBvcnQge1xuICBkZXN0cm95U2hhcmVkSHR0cEFnZW50cyxcbiAgY3JlYXRlU2FmZUNsaWVudCxcbiAgUmVzcG9uc2VUb29MYXJnZUVycm9yLFxuICBJbnRlcm5hbEh0dHBDbGllbnQsXG59IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuZXhwb3J0IHtcbiAgc2V0UGxhdGZvcm1Kd2tzQ2FjaGUsXG4gIEp3a3NVbmF2YWlsYWJsZUVycm9yLFxuICBVbmtub3duS2lkRXJyb3IsXG4gIEp3a3NDYWNoZSxcbn0gZnJvbSAnLi9qd2tzLWNhY2hlLmpzJztcbi8vIFNlcnZpY2Uta2V5IGludGVybmFscyBzdGF5IGludGVybmFsLiBUaGUgcGFja2FnZSBzdXJmYWNlIGlzIHRoZSB2ZXJpZnkvaW5zcGVjdFxuLy8gc2lkZSB0aGF0IHBsYXRmb3JtJ3MgSldUIG9wdGlvbnMgYW5kIHRoZSBhdXRoIG1pZGRsZXdhcmUgbmVlZDsga2V5IE1BVEVSSUFMXG4vLyBoYW5kbGluZyAoYHNpZ25TZXJ2aWNlSnd0YCwgdGhlIGJ1bmRsZSwgdGhlIHRlc3QgcmVzZXQgaG9vaykgaXMgcmVhY2hhYmxlIG9ubHlcbi8vIGJ5IGRlZXAgaW1wb3J0IGZyb20gaW5zaWRlIGFwaS1jb3JlIGFuZCBpdHMgdGVzdGluZyBoZWxwZXJzLlxuZXhwb3J0IHtcbiAgaXNTZXJ2aWNlS2lkLFxuICBzZXJ2aWNlSWRlbnRpdHksXG4gIHZlcmlmeVNlcnZpY2VKd3QsXG59IGZyb20gJy4vc2VydmljZS1rZXlzLmpzJztcbi8vIFRoZSBicmVha2VyIGlzIHdpcmVkIGJ5IHRoZSBzaGFyZWQgSFRUUCBjbGllbnQ7IHNlcnZpY2VzIGNvbnN1bWUgaXRzIEVGRkVDVCxcbi8vIG5vdCB0aGUgY2xhc3MuIE9ubHkgdGhlIG9wZXJhdGlvbmFsIHN1cmZhY2UgaXMgcHVibGljLlxuZXhwb3J0IHtcbiAgcmVzZXRDaXJjdWl0QnJlYWtlcnMsXG59IGZyb20gJy4vY2lyY3VpdC1icmVha2VyLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUVudlJlZGlzRHVyYWJsZUV2ZW50QnVzLFxuICB0eXBlIEV2ZW50U3Vic2NyaXB0aW9uLFxuICB0eXBlIER1cmFibGVFdmVudEJ1cyxcbn0gZnJvbSAnLi9kdXJhYmxlLWV2ZW50LWJ1cy5qcyc7XG5leHBvcnQge1xuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0IHR5cGUge1xuICBSZXRyeUNvbmZpZyxcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5leHBvcnQge1xuICBuZXh0QmFja29mZk1zLFxuICByZXRyeUZvcmV2ZXIsXG59IGZyb20gJy4vcmV0cnktZm9yZXZlci5qcyc7XG5leHBvcnQge1xuICBnZXRRdW90YVNlcnZpY2VBdXRoSGVhZGVyLFxuICBjcmVhdGVRdW90YVNlcnZpY2UsXG4gIGluY3JlbWVudFF1b3RhLFxuICByZXNlcnZlUXVvdGEsXG4gIHNlbmRRdW90YVJlc2VydmVEZW5pZWQsXG4gIGRlY3JlbWVudFF1b3RhLFxuICB0eXBlIFF1b3RhUmVzZXJ2ZVJlc3VsdCxcbiAgdHlwZSBRdW90YVNlcnZpY2UsXG59IGZyb20gJy4vcXVvdGEuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlUmVtb3RlQXVkaXRDbGllbnQsXG4gIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3IsXG4gIHJlY29yZEF1ZGl0LFxuICB0eXBlIFJlbW90ZUF1ZGl0RXZlbnQsXG4gIHR5cGUgUmVtb3RlQXVkaXRDbGllbnQsXG59IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBhdWRpdFNwb29sS2V5LFxuICBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wsXG4gIHR5cGUgQXVkaXRTcG9vbCxcbn0gZnJvbSAnLi9hdWRpdC1zcG9vbC5qcyc7XG5leHBvcnQge1xuICByZXNvbHZlUmVkaXNDb25uZWN0aW9uLFxuICBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbixcbiAgY3JlYXRlUmVkaXNDbGllbnQsXG4gIGNyZWF0ZUVudlJlZGlzQ2xpZW50LFxuICBjcmVhdGVSZWRpc1JlYWR5R2F0ZSxcbiAgaW5jcldpbmRvdyxcbiAgUmVkaXNDb25maWdFcnJvcixcbiAgdHlwZSBSZWRpc0V2YWxDbGllbnQsXG59IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIHB1Ymxpc2hUb2tlblJldm9jYXRpb24sXG4gIHB1Ymxpc2hTZXNzaW9uUmV2b2NhdGlvbixcbiAgcHVibGlzaENyZWRlbnRpYWxSZXZvY2F0aW9uLFxufSBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUsXG4gIGNyZWF0ZUVudlNzZVRpY2tldFN0b3JlLFxuICBlbnZTc2VUaWNrZXRDYXBzLFxuICB0eXBlIEVudlNzZVRpY2tldFN0b3JlQ29uZmlnLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlQ29uZmlnLFxufSBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuZXhwb3J0IHtcbiAgd2lyZVNlcnZpY2VTZWN1cml0eSxcbn0gZnJvbSAnLi9zZXJ2aWNlLWJvb3QuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlV2ViaG9va0NoYW5uZWwsXG4gIGNyZWF0ZUVtYWlsQ2hhbm5lbCxcbiAgY3JlYXRlQ2hhbm5lbFJlZ2lzdHJ5LFxuICB0eXBlIE5vdGlmaWNhdGlvblByaW9yaXR5LFxuICB0eXBlIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2hhbm5lbFRhcmdldCxcbiAgdHlwZSBEZWxpdmVyeVJlc3VsdCxcbiAgdHlwZSBOb3RpZmljYXRpb25DaGFubmVsLFxufSBmcm9tICcuL25vdGlmaWNhdGlvbi1jaGFubmVscy5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG4gIEVDT1NZU1RFTV9OT1RJRllfUEFUSCxcbiAgdHlwZSBFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG59IGZyb20gJy4vZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQuanMnO1xuIl19
@@ -1,19 +1,5 @@
1
1
  import { type AuditSpool } from './audit-spool.js';
2
- /**
3
- * The exact set of audit actions a NON-PLATFORM (remote) service is permitted to
4
- * emit through `POST /audit/events`. This is the SINGLE SOURCE — `RemoteAuditAction`
5
- * is derived from it, so the type and the runtime allow-list can never drift.
6
- *
7
- * SECURITY: platform's ingest validates `action` against this subset (via
8
- * {@link isRemoteAuditAction}), NOT the full platform `AuditAction` union — a
9
- * `service:*` token must not be able to forge platform-authority events
10
- * (`admin.superadmin.grant`, `org.ownership.transfer`, `user.login`, …). Keep
11
- * this list free of any platform-only action.
12
- */
13
- export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.scan.skipped', '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', 'registry.image.sign', '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', 'publisher.create', 'publisher.update', 'publisher.terms.accept', 'publisher.verify.request', 'publisher.verify.approve', 'publisher.verify.reject', 'publisher.tier.change', 'publisher.suspend', 'publisher.unsuspend', 'publisher.transfer.request', 'publisher.transfer.accept', 'publisher.transfer.decline', 'publisher.transfer.approve', 'publisher.transfer.reject', 'publisher.profile-change.approve', 'publisher.profile-change.reject', 'plugin.request.submit', 'plugin.request.withdraw', 'plugin.request.approve', 'plugin.request.second-approve', 'plugin.request.reject', 'plugin.request.auto-approve', 'plugin.listing.publish', 'plugin.listing.unlist', 'plugin.listing.update', 'plugin.listing.state.change', 'plugin.listing.pause', 'plugin.listing.unpause', 'plugin.version.pause', 'plugin.version.yank', 'plugin.version.unyank', 'plugin.version.deprecate', 'plugin.collection.update', 'ecosystem.auto-approval-rule.create', 'ecosystem.auto-approval-rule.update', 'ecosystem.auto-approval-rule.delete', 'ecosystem.reserved-name.update', 'ecosystem.sla.update', 'registry.image.publish', 'registry.image.resign', 'registry.image.yank', 'registry.image.gc', 'plugin.install.request', 'plugin.install.approve', 'plugin.install.deny', 'plugin.install.create', 'plugin.install.upgrade', 'plugin.install.change-request', 'plugin.install.change-approve', 'plugin.install.change-reject', 'plugin.install.remove', 'org.plugin-install-policy.update', 'plugin.review.create', 'plugin.review.update', 'plugin.review.delete', 'plugin.review.report', 'plugin.review.hold', 'plugin.review.release', 'plugin.review.remove', 'plugin.review.anonymize', 'plugin.review.reply.create', 'plugin.review.reply.update', 'plugin.review.reply.delete', 'plugin.submission.create', 'plugin.submission.verify', 'plugin.submission.gate-fail', 'plugin.submission.approve', 'plugin.submission.reject', 'plugin.submission.claim', 'plugin.submission.expire', 'plugin.advisory.create', 'plugin.advisory.update', 'plugin.advisory.publish', 'plugin.advisory.withdraw', 'plugin.security_notifications.update', 'plugin.security_notifications.external_email.verify', 'plugin.security_notifications.test'];
14
- export type RemoteAuditAction = typeof REMOTE_AUDIT_ACTIONS[number];
15
- /** Whether `value` is an action a remote service may emit (the ingest allow-list). */
16
- export declare function isRemoteAuditAction(value: string): value is RemoteAuditAction;
2
+ import { type RemoteAuditAction } from '../types/remote-audit-actions.js';
17
3
  export interface RemoteAuditEvent {
18
4
  action: RemoteAuditAction;
19
5
  actorId: string;
@@ -5,6 +5,7 @@ import { auditSpoolKey, createEnvRedisAuditSpool } from './audit-spool.js';
5
5
  import { createSafeClient } from './http-client.js';
6
6
  import { setAuthzDenialAuditor } from '../middleware/permission-gates.js';
7
7
  import { getServiceAuthHeader } from '../middleware/service-tokens.js';
8
+ import {} from '../types/remote-audit-actions.js';
8
9
  import { createLogger } from '../utils/logger.js';
9
10
  import { emitCounter } from '../utils/metric-emitter.js';
10
11
  import { errorMessage } from '../utils/response.js';
@@ -23,300 +24,6 @@ const AUDIT_REQUEST_OPTIONS = {
23
24
  maxRateLimitRetries: 2,
24
25
  maxRetries: 2,
25
26
  };
26
- /**
27
- * The exact set of audit actions a NON-PLATFORM (remote) service is permitted to
28
- * emit through `POST /audit/events`. This is the SINGLE SOURCE — `RemoteAuditAction`
29
- * is derived from it, so the type and the runtime allow-list can never drift.
30
- *
31
- * SECURITY: platform's ingest validates `action` against this subset (via
32
- * {@link isRemoteAuditAction}), NOT the full platform `AuditAction` union — a
33
- * `service:*` token must not be able to forge platform-authority events
34
- * (`admin.superadmin.grant`, `org.ownership.transfer`, `user.login`, …). Keep
35
- * this list free of any platform-only action.
36
- */
37
- export const REMOTE_AUDIT_ACTIONS = [
38
- 'plugin.build.completed',
39
- 'plugin.build.failed',
40
- 'plugin.build.timeout',
41
- // A version persisted UNSCANNED because the build-time scan could not run and
42
- // the operator escape hatch `PLUGIN_ALLOW_UNSCANNED` is on (without it the
43
- // build fails `IMAGE_SCAN_UNAVAILABLE`). `details` carry name/version/digest.
44
- 'plugin.scan.skipped',
45
- // Plugin lifecycle mutations (api/plugin route handlers) — the destructive /
46
- // publishing surface that builds already audit's counterpart: registry delete,
47
- // source upload, and deploy-to-cluster. `targetId` is the plugin id.
48
- 'plugin.delete',
49
- 'plugin.restore',
50
- // Manual purge: permanent hard-delete of a soft-deleted plugin tombstone on
51
- // demand (finalizes what the retention sweep would otherwise do later).
52
- 'plugin.purge',
53
- 'plugin.update',
54
- 'plugin.upload',
55
- 'plugin.deploy',
56
- // Plugin bulk mutations (api/plugin bulk-plugin route) + DLQ purge (drops all
57
- // dead-lettered build jobs, cross-org, sysadmin). `details` carries counts.
58
- 'plugin.bulk.update',
59
- 'plugin.bulk.delete',
60
- 'plugin.dlq.purge',
61
- // Build re-runs from the queue-triage surface: re-enqueue a FAILED build
62
- // (`plugin.build.retry`) or a dead-lettered one (`plugin.dlq.replay`). Both
63
- // re-run an image build + plugin persist on the caller's authority, so they
64
- // are audited mutations; `affectedOrgId` carries the job's owning org.
65
- 'plugin.build.retry',
66
- 'plugin.dlq.replay',
67
- // Pipeline mutations — emitted by api/pipeline's route handlers
68
- // (create/update/delete + CodePipeline execution trigger/cancel) and
69
- // posted to platform's `POST /audit/events` ingest.
70
- 'pipeline.create',
71
- 'pipeline.update',
72
- 'pipeline.delete',
73
- 'pipeline.restore',
74
- // Manual purge: permanent hard-delete of a soft-deleted pipeline /
75
- // pipeline_template tombstone on demand (finalizes what the retention sweep
76
- // would otherwise do later). `targetId` is the purged id.
77
- 'pipeline.purge',
78
- 'pipeline_template.create',
79
- 'pipeline_template.update',
80
- 'pipeline_template.delete',
81
- 'pipeline_template.restore',
82
- 'pipeline_template.purge',
83
- 'pipeline.execution.start',
84
- 'pipeline.execution.cancel',
85
- // CodePipeline ARN-registry config (api/pipeline registry route) — registering /
86
- // deregistering the external CodePipeline that backs a pipeline (deploy-affecting).
87
- 'pipeline.registry.register',
88
- 'pipeline.registry.deregister',
89
- // Quota administration (api/quota) — a superadmin resetting an org's usage
90
- // counter or editing its tier limits. `affectedOrgId` is the org changed;
91
- // `details` carries the quotaType + old/new value.
92
- 'quota.reset',
93
- 'quota.limit.update',
94
- // A superadmin deleting an org's entire quota document.
95
- 'quota.delete',
96
- // Compliance administration (api/compliance) — the enforcement-posture surface.
97
- // Approving/revoking an exemption, toggling/authoring/deleting a rule,
98
- // authoring/deleting a policy, managing scan schedules, applying a template,
99
- // or cancelling a running scan. `targetId` is the rule/policy/exemption/scan id.
100
- 'compliance.exemption.approve',
101
- 'compliance.exemption.revoke',
102
- 'compliance.rule.toggle',
103
- 'compliance.rule.create',
104
- 'compliance.rule.update',
105
- 'compliance.rule.delete',
106
- 'compliance.rule.restore',
107
- // Manual on-demand hard-delete (PURGE) of a soft-deleted rule/policy tombstone —
108
- // the caller-initiated counterpart to the retention sweep's auto-purge. Destroys
109
- // the tombstone permanently, so it carries the durable, tamper-evident trail.
110
- 'compliance.rule.purge',
111
- 'compliance.policy.create',
112
- 'compliance.policy.update',
113
- 'compliance.policy.delete',
114
- 'compliance.policy.restore',
115
- 'compliance.policy.purge',
116
- 'compliance.scan-schedule.create',
117
- 'compliance.scan-schedule.update',
118
- 'compliance.scan-schedule.delete',
119
- 'compliance.template.apply',
120
- // Launching an org-wide re-evaluation (the counterpart to `.cancel`) — it
121
- // persists a scan and can block entities that passed before.
122
- 'compliance.scan.create',
123
- 'compliance.scan.cancel',
124
- // Per-org compliance notification settings: recipients + the outbound webhook
125
- // URL/secret. Bearer-equivalent config that redirects violation notices, so a
126
- // change carries the durable trail (never the secret itself).
127
- 'compliance.notification-preference.update',
128
- // Image-registry destructive ops (api/image-registry) — garbage-collection
129
- // sweeps and explicit image/tag deletes.
130
- 'registry.gc',
131
- 'registry.image.delete',
132
- // Cross-repo tag/image copy (api/image-registry POST /api/images/copy). A
133
- // cross-tenant copy moves data across customer boundaries, so it needs the
134
- // durable, tamper-evident trail — not just the Loki operator line.
135
- 'registry.image.copy',
136
- // A plugin image signed + SBOM-attested by the platform's plugin-signing key
137
- // (api/image-registry POST /internal/plugin-signatures, called by the plugin
138
- // build worker). The key is what synth trusts, so every use is on the trail.
139
- 'registry.image.sign',
140
- // Messaging (api/message) — admin BROADCAST announcements + destructive
141
- // deletes. 1:1 user messages are intentionally NOT audited (noise + they would
142
- // pull private content into the trail). `details` carry metadata only
143
- // (subject/type/scope), NEVER message body content.
144
- 'message.announcement.create',
145
- 'message.delete',
146
- 'message.restore',
147
- // Manual on-demand PURGE (permanent hard-delete) of an already-soft-deleted
148
- // message tombstone — the destructive finalizer the retention sweep would
149
- // otherwise perform at the purge deadline. `details` carry metadata only.
150
- 'message.purge',
151
- // Billing (api/billing) — subscription + entitlement mutations, mirrored to the
152
- // central audit trail (these also write to the service-local billing_events
153
- // collection). `details` carry plan/tier/addon ids only — never card/payment
154
- // secrets or an AWS account id.
155
- // Subscription lifecycle a CUSTOMER drives (the admin counterpart is
156
- // `billing.tier.override`): self-serve create (direct or Marketplace claim),
157
- // plan/interval change, cancel-at-period-end, undo-cancel, cascade delete.
158
- 'billing.subscription.create',
159
- 'billing.subscription.update',
160
- 'billing.subscription.reactivate',
161
- 'billing.subscription.cancel',
162
- 'billing.subscription.delete',
163
- 'billing.tier.override',
164
- // Operator-only reseed of the invoice ledger from the payment provider's
165
- // history (POST /billing/admin/backfill) — mutates finance data fleet-wide.
166
- 'billing.addon.add',
167
- 'billing.addon.remove',
168
- // System-initiated removal of a tier-included add-on on a plan upgrade (the
169
- // account's new tier now bundles the feature) — distinct from a user-initiated
170
- // `remove` so finance can tell an auto-prune from a customer action.
171
- 'billing.addon.prune',
172
- // Discounts (docs/billing-discounts.md) — mint/issue/apply/remove/revoke of a
173
- // price coupon or usage credit. `details` carry the discount id + kind/value
174
- // only, never the opaque token or signing key.
175
- 'billing.discount.generate',
176
- 'billing.discount.issue',
177
- 'billing.discount.apply',
178
- 'billing.discount.remove',
179
- 'billing.discount.revoke',
180
- // Promotions (docs/billing-discounts.md#promotions) — rule-driven auto-grant
181
- // campaigns. `details` carry the promotion id + cents/event only.
182
- 'billing.promotion.create',
183
- 'billing.promotion.update',
184
- 'billing.promotion.revoke',
185
- 'billing.promotion.grant',
186
- 'billing.promotion.activate',
187
- // Usage-credit realization — a customer/compliance-visible record of credit
188
- // movement: `consumed` (Marketplace metered drawdown), `exhausted` (balance hit
189
- // zero), and a combo ending. `details` carry cents/ids only, no payment secrets.
190
- 'billing.credit.consumed',
191
- 'billing.credit.exhausted',
192
- 'billing.combo.expired',
193
- // Reporting (api/reporting) — the three reporting mutations whose effect
194
- // outlives a request log: the per-org correlation-window config write, a
195
- // post-deploy outcome marker (it moves the org's DORA CFR/MTTR), and the
196
- // inbound billing→reporting retention-entitlement sync (a retention cut is a
197
- // data-destroying change applied by the next sweep). `details` carry the
198
- // settings/outcome values only.
199
- 'reporting.settings.update',
200
- 'reporting.deployment.outcome',
201
- 'reporting.retention.sync',
202
- // Denied authorization attempt — emitted best-effort by the shared
203
- // `requirePermission` / `requireSystemAdmin` gate when a state-changing
204
- // (non-GET) request is rejected, so probing/escalation attempts are visible
205
- // rather than invisible. `details` carries the required permission + path;
206
- // `outcome` is 'failure'.
207
- 'authz.denied',
208
- // "Ask" assistant activity — visibility into what the assistant did on a user's
209
- // behalf. `ask.query` is a read-only how-to turn; `ask.agent.turn` is a tool-calling
210
- // turn. `details` carry SAFE METADATA ONLY (tools used, proposal kinds, query
211
- // length, outcome), never the raw query text.
212
- 'ask.query',
213
- 'ask.agent.turn',
214
- // Plugin ecosystem (docs/runbooks/ecosystem-moderation.md). Governance actions
215
- // are recorded with `orgId` = the system org; `affectedOrgId` is the
216
- // publisher's org (listing/version/review/advisory/publisher moderation) or
217
- // the installing org (installs + policy). Anonymous submissions use the
218
- // `ANONYMOUS_ACTOR_ID` actor with `details.submissionId`. `details` carry ids,
219
- // versions, digests, tier, state and reason codes only — never review bodies,
220
- // README content, secrets or emails.
221
- // Publishers.
222
- 'publisher.create',
223
- 'publisher.update',
224
- 'publisher.terms.accept',
225
- 'publisher.verify.request',
226
- 'publisher.verify.approve',
227
- 'publisher.verify.reject',
228
- 'publisher.tier.change',
229
- 'publisher.suspend',
230
- 'publisher.unsuspend',
231
- 'publisher.transfer.request',
232
- 'publisher.transfer.accept',
233
- 'publisher.transfer.decline',
234
- 'publisher.transfer.approve',
235
- 'publisher.transfer.reject',
236
- 'publisher.profile-change.approve',
237
- 'publisher.profile-change.reject',
238
- // Publish requests (tenant → system org). `details.kind` names the request.
239
- 'plugin.request.submit',
240
- 'plugin.request.withdraw',
241
- 'plugin.request.approve',
242
- 'plugin.request.second-approve',
243
- 'plugin.request.reject',
244
- 'plugin.request.auto-approve',
245
- // Listings and versions (system org, except the tenant pause).
246
- 'plugin.listing.publish',
247
- 'plugin.listing.unlist',
248
- 'plugin.listing.update',
249
- 'plugin.listing.state.change',
250
- 'plugin.listing.pause',
251
- 'plugin.listing.unpause',
252
- 'plugin.version.pause',
253
- 'plugin.version.yank',
254
- 'plugin.version.unyank',
255
- 'plugin.version.deprecate',
256
- 'plugin.collection.update',
257
- // Ecosystem configuration (system org).
258
- 'ecosystem.auto-approval-rule.create',
259
- 'ecosystem.auto-approval-rule.update',
260
- 'ecosystem.auto-approval-rule.delete',
261
- 'ecosystem.reserved-name.update',
262
- 'ecosystem.sla.update',
263
- // Public registry namespace (`public/*`): copy + sign + attest on publish,
264
- // the tier-change/suspension re-sign job, tag removal on yank/takedown, and
265
- // the retention sweep.
266
- 'registry.image.publish',
267
- 'registry.image.resign',
268
- 'registry.image.yank',
269
- 'registry.image.gc',
270
- // Installs and the installing org's consumption policy (org-local).
271
- 'plugin.install.request',
272
- 'plugin.install.approve',
273
- 'plugin.install.deny',
274
- 'plugin.install.create',
275
- 'plugin.install.upgrade',
276
- // A member's request to change an install past what they may do alone, and its decision.
277
- 'plugin.install.change-request',
278
- 'plugin.install.change-approve',
279
- 'plugin.install.change-reject',
280
- 'plugin.install.remove',
281
- 'org.plugin-install-policy.update',
282
- // Reviews and replies.
283
- 'plugin.review.create',
284
- 'plugin.review.update',
285
- 'plugin.review.delete',
286
- 'plugin.review.report',
287
- 'plugin.review.hold',
288
- 'plugin.review.release',
289
- 'plugin.review.remove',
290
- 'plugin.review.anonymize',
291
- 'plugin.review.reply.create',
292
- 'plugin.review.reply.update',
293
- 'plugin.review.reply.delete',
294
- // Anonymous submissions.
295
- 'plugin.submission.create',
296
- 'plugin.submission.verify',
297
- 'plugin.submission.gate-fail',
298
- 'plugin.submission.approve',
299
- 'plugin.submission.reject',
300
- 'plugin.submission.claim',
301
- 'plugin.submission.expire',
302
- // Security advisories (publish/withdraw are system-org only; update = a
303
- // moderator editing a draft before it is published).
304
- 'plugin.advisory.create',
305
- 'plugin.advisory.update',
306
- 'plugin.advisory.publish',
307
- 'plugin.advisory.withdraw',
308
- // Per-org plugin security notifications (plugin scan gates): the settings
309
- // (recipients, digest, webhook, external address — changed field names and
310
- // the webhook host only, never the secret or the address), an external
311
- // address confirmed through its emailed single-use link, and a test send.
312
- 'plugin.security_notifications.update',
313
- 'plugin.security_notifications.external_email.verify',
314
- 'plugin.security_notifications.test',
315
- ];
316
- /** Whether `value` is an action a remote service may emit (the ingest allow-list). */
317
- export function isRemoteAuditAction(value) {
318
- return REMOTE_AUDIT_ACTIONS.includes(value);
319
- }
320
27
  /**
321
28
  * Construct a remote-audit client targeted at the platform service.
322
29
  *
@@ -565,4 +272,4 @@ export function recordAudit(event) {
565
272
  const { client, serviceName } = boundAudit();
566
273
  client.record(event, serviceName);
567
274
  }
568
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsYUFBYSxFQUFFLHdCQUF3QixFQUF5QyxNQUFNLGtCQUFrQixDQUFDO0FBQ2xILE9BQU8sRUFBRSxnQkFBZ0IsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQXdCLE1BQU0sbUNBQW1DLENBQUM7QUFDaEcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUU1Qzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0scUJBQXFCLEdBQStEO0lBQ3hGLG1CQUFtQixFQUFFLENBQUM7SUFDdEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLDhFQUE4RTtJQUM5RSwyRUFBMkU7SUFDM0UsOEVBQThFO0lBQzlFLHFCQUFxQjtJQUNyQiw2RUFBNkU7SUFDN0UsK0VBQStFO0lBQy9FLHFFQUFxRTtJQUNyRSxlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSw0RUFBNEU7SUFDNUUsdUVBQXVFO0lBQ3ZFLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsZ0VBQWdFO0lBQ2hFLHFFQUFxRTtJQUNyRSxvREFBb0Q7SUFDcEQsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLG1FQUFtRTtJQUNuRSw0RUFBNEU7SUFDNUUsMERBQTBEO0lBQzFELGdCQUFnQjtJQUNoQiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsaUZBQWlGO0lBQ2pGLG9GQUFvRjtJQUNwRiw0QkFBNEI7SUFDNUIsOEJBQThCO0lBQzlCLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsbURBQW1EO0lBQ25ELGFBQWE7SUFDYixvQkFBb0I7SUFDcEIsd0RBQXdEO0lBQ3hELGNBQWM7SUFDZCxnRkFBZ0Y7SUFDaEYsdUVBQXVFO0lBQ3ZFLDZFQUE2RTtJQUM3RSxpRkFBaUY7SUFDakYsOEJBQThCO0lBQzlCLDZCQUE2QjtJQUM3Qix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIseUJBQXlCO0lBQ3pCLGlGQUFpRjtJQUNqRixpRkFBaUY7SUFDakYsOEVBQThFO0lBQzlFLHVCQUF1QjtJQUN2QiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLGlDQUFpQztJQUNqQyxpQ0FBaUM7SUFDakMsaUNBQWlDO0lBQ2pDLDJCQUEyQjtJQUMzQiwwRUFBMEU7SUFDMUUsNkRBQTZEO0lBQzdELHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSw4REFBOEQ7SUFDOUQsMkNBQTJDO0lBQzNDLDJFQUEyRTtJQUMzRSx5Q0FBeUM7SUFDekMsYUFBYTtJQUNiLHVCQUF1QjtJQUN2QiwwRUFBMEU7SUFDMUUsMkVBQTJFO0lBQzNFLG1FQUFtRTtJQUNuRSxxQkFBcUI7SUFDckIsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSw2RUFBNkU7SUFDN0UscUJBQXFCO0lBQ3JCLHdFQUF3RTtJQUN4RSwrRUFBK0U7SUFDL0Usc0VBQXNFO0lBQ3RFLG9EQUFvRDtJQUNwRCw2QkFBNkI7SUFDN0IsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQiw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLDBFQUEwRTtJQUMxRSxlQUFlO0lBQ2YsZ0ZBQWdGO0lBQ2hGLDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsZ0NBQWdDO0lBQ2hDLHFFQUFxRTtJQUNyRSw2RUFBNkU7SUFDN0UsMkVBQTJFO0lBQzNFLDZCQUE2QjtJQUM3Qiw2QkFBNkI7SUFDN0IsaUNBQWlDO0lBQ2pDLDZCQUE2QjtJQUM3Qiw2QkFBNkI7SUFDN0IsdUJBQXVCO0lBQ3ZCLHlFQUF5RTtJQUN6RSw0RUFBNEU7SUFDNUUsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0Qiw0RUFBNEU7SUFDNUUsK0VBQStFO0lBQy9FLHFFQUFxRTtJQUNyRSxxQkFBcUI7SUFDckIsOEVBQThFO0lBQzlFLDZFQUE2RTtJQUM3RSwrQ0FBK0M7SUFDL0MsMkJBQTJCO0lBQzNCLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIseUJBQXlCO0lBQ3pCLHlCQUF5QjtJQUN6Qiw2RUFBNkU7SUFDN0Usa0VBQWtFO0lBQ2xFLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qiw0QkFBNEI7SUFDNUIsNEVBQTRFO0lBQzVFLGdGQUFnRjtJQUNoRixpRkFBaUY7SUFDakYseUJBQXlCO0lBQ3pCLDBCQUEwQjtJQUMxQix1QkFBdUI7SUFDdkIseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsNkVBQTZFO0lBQzdFLHlFQUF5RTtJQUN6RSxnQ0FBZ0M7SUFDaEMsMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5QiwwQkFBMEI7SUFDMUIsbUVBQW1FO0lBQ25FLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsMkVBQTJFO0lBQzNFLDBCQUEwQjtJQUMxQixjQUFjO0lBQ2QsZ0ZBQWdGO0lBQ2hGLHFGQUFxRjtJQUNyRiw4RUFBOEU7SUFDOUUsOENBQThDO0lBQzlDLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsK0VBQStFO0lBQy9FLHFFQUFxRTtJQUNyRSw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLCtFQUErRTtJQUMvRSw4RUFBOEU7SUFDOUUscUNBQXFDO0lBQ3JDLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLHdCQUF3QjtJQUN4QiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLHlCQUF5QjtJQUN6Qix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQiw0QkFBNEI7SUFDNUIsMkJBQTJCO0lBQzNCLDRCQUE0QjtJQUM1Qiw0QkFBNEI7SUFDNUIsMkJBQTJCO0lBQzNCLGtDQUFrQztJQUNsQyxpQ0FBaUM7SUFDakMsNEVBQTRFO0lBQzVFLHVCQUF1QjtJQUN2Qix5QkFBeUI7SUFDekIsd0JBQXdCO0lBQ3hCLCtCQUErQjtJQUMvQix1QkFBdUI7SUFDdkIsNkJBQTZCO0lBQzdCLCtEQUErRDtJQUMvRCx3QkFBd0I7SUFDeEIsdUJBQXVCO0lBQ3ZCLHVCQUF1QjtJQUN2Qiw2QkFBNkI7SUFDN0Isc0JBQXNCO0lBQ3RCLHdCQUF3QjtJQUN4QixzQkFBc0I7SUFDdEIscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QiwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLHdDQUF3QztJQUN4QyxxQ0FBcUM7SUFDckMscUNBQXFDO0lBQ3JDLHFDQUFxQztJQUNyQyxnQ0FBZ0M7SUFDaEMsc0JBQXNCO0lBQ3RCLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtJQUN4Qix1QkFBdUI7SUFDdkIscUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQixvRUFBb0U7SUFDcEUsd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtJQUN4Qix5RkFBeUY7SUFDekYsK0JBQStCO0lBQy9CLCtCQUErQjtJQUMvQiw4QkFBOEI7SUFDOUIsdUJBQXVCO0lBQ3ZCLGtDQUFrQztJQUNsQyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLHlCQUF5QjtJQUN6Qiw0QkFBNEI7SUFDNUIsNEJBQTRCO0lBQzVCLDRCQUE0QjtJQUM1Qix5QkFBeUI7SUFDekIsMEJBQTBCO0lBQzFCLDBCQUEwQjtJQUMxQiw2QkFBNkI7SUFDN0IsMkJBQTJCO0lBQzNCLDBCQUEwQjtJQUMxQix5QkFBeUI7SUFDekIsMEJBQTBCO0lBQzFCLHdFQUF3RTtJQUN4RSxxREFBcUQ7SUFDckQsd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4Qix5QkFBeUI7SUFDekIsMEJBQTBCO0lBQzFCLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsdUVBQXVFO0lBQ3ZFLDBFQUEwRTtJQUMxRSxzQ0FBc0M7SUFDdEMscURBQXFEO0lBQ3JELG9DQUFvQztDQUM1QixDQUFDO0FBSVgsc0ZBQXNGO0FBQ3RGLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhO0lBQy9DLE9BQVEsb0JBQTBDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUEwRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsTUFBTSxHQUE0QixFQUFFO0lBQzFFLE1BQU0sYUFBYSxHQUFrQjtRQUNuQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSTtRQUNyRCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSTtRQUNyRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJO0tBQ2hDLENBQUM7SUFDRiwwRUFBMEU7SUFDMUUsOEVBQThFO0lBQzlFLDhFQUE4RTtJQUM5RSwyQkFBMkI7SUFDM0IsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxJQUFJLEdBQUcsQ0FBQztJQUVwRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssVUFBVSxPQUFPLENBQUMsS0FBdUIsRUFBRSxXQUFtQjtRQUNqRSxJQUFJLENBQUM7WUFDSCxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLHlFQUF5RTtZQUN6RSwwRUFBMEU7WUFDMUUsdUVBQXVFO1lBQ3ZFLHVFQUF1RTtZQUN2RSxtQ0FBbUM7WUFDbkMsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDN0YsTUFBTSxPQUFPLEdBQTJCO2dCQUN0QyxlQUFlLEVBQUUsVUFBVTtnQkFDM0IsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGNBQWMsSUFBSSxVQUFVLEVBQUU7YUFDeEQsQ0FBQztZQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDakYsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDeEcsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELCtFQUErRTtJQUMvRSw0RUFBNEU7SUFDNUUseURBQXlEO0lBQ3pELElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixLQUFLLFVBQVUsS0FBSztRQUNsQixJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVE7WUFBRSxPQUFPO1FBQy9CLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDaEIsSUFBSSxDQUFDO1lBQ0gsU0FBUyxDQUFDO2dCQUNSLE1BQU0sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQUUsT0FBTztnQkFDL0IsTUFBTSxTQUFTLEdBQXNCLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxNQUFNLEdBQXNCLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUMxQixJQUFJLFlBQVksRUFBRSxDQUFDO3dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQUMsU0FBUztvQkFBQyxDQUFDO29CQUNuRCxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDekQsSUFBSSxFQUFFLEVBQUUsQ0FBQzt3QkFDUCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN0QixXQUFXLENBQUMsK0JBQStCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQy9FLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixZQUFZLEdBQUcsSUFBSSxDQUFDO3dCQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyQixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsMEVBQTBFO2dCQUMxRSx3RUFBd0U7Z0JBQ3hFLHdFQUF3RTtnQkFDeEUsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDNUIsT0FBTyxDQUFDLDBDQUEwQztnQkFDcEQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO2dCQUFTLENBQUM7WUFDVCxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFzRCxDQUFDO0lBQzNELElBQUksS0FBSyxFQUFFLENBQUM7UUFDViw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLDBFQUEwRTtRQUMxRSwwRUFBMEU7UUFDMUUsVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsS0FBSyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsRUFBRSxNQUFNLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLGdFQUFnRTtRQUMvRCxVQUFnRCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVc7WUFDdkIsMkVBQTJFO1lBQzNFLHdFQUF3RTtZQUN4RSxNQUFNLE9BQU8sR0FBcUI7Z0JBQ2hDLEdBQUcsS0FBSztnQkFDUixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDeEQsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjLElBQUksVUFBVSxFQUFFO2FBQ3JELENBQUM7WUFDRixLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQzdDLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ1AsV0FBVyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDO29CQUNwRyxJQUFJLEtBQUs7d0JBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDLDRDQUE0QztnQkFDdkUsQ0FBQztxQkFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNqQixLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELENBQUM7cUJBQU0sQ0FBQztvQkFDTixXQUFXLENBQUMscUJBQXFCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDL0QsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNmLHFFQUFxRTtnQkFDckUsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLG9DQUFvQztnQkFDcEMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxLQUFLO1lBQ0gsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUFDLENBQUM7UUFDeEUsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsV0FBbUIsRUFBRSxTQUFrQztJQUM1RixxQkFBcUIsQ0FBQyxDQUFDLElBQXFCLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNsRSxNQUFNLEVBQUUsY0FBYztRQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxXQUFXO1FBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtRQUMzQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7S0FDM0UsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFhRCxJQUFJLFlBQVksR0FBd0IsSUFBSSxDQUFDO0FBRTdDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsV0FBbUIsRUFBRSxNQUEwQjtJQUM5RSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzlCLFlBQVksR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzlCLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsVUFBVTtJQUNqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyRkFBMkYsQ0FBQyxDQUFDO0lBQy9HLENBQUM7SUFDRCxZQUFZLENBQUMsTUFBTSxLQUFLLHVCQUF1QixDQUFDO1FBQzlDLEtBQUssRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxTQUFTO0tBQy9GLENBQUMsQ0FBQztJQUNILE9BQU8sWUFBNEQsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU8sVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDO0FBQzdCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBdUI7SUFDakQsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgYXVkaXRTcG9vbEtleSwgY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sLCB0eXBlIEF1ZGl0U3Bvb2wsIHR5cGUgQXVkaXRTcG9vbEVudHJ5IH0gZnJvbSAnLi9hdWRpdC1zcG9vbC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTYWZlQ2xpZW50LCB0eXBlIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzZXRBdXRoekRlbmlhbEF1ZGl0b3IsIHR5cGUgQXV0aHpEZW5pYWxJbmZvIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9wZXJtaXNzaW9uLWdhdGVzLmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncmVtb3RlLWF1ZGl0Jyk7XG5cbi8qKlxuICogQXVkaXQgaW5nZXN0IGlzIGJlc3QtZWZmb3J0IGFuZCBNVVNUIE5PVCBibG9jayB0aGUgY2FsbGVyLCBidXQgYSB0cmFuc2llbnRcbiAqIGZhaWx1cmUgKDQyOSAvIDV4eCAvIGNvbm5lY3Rpb24gcmVzZXQgLyB0aW1lb3V0KSBzaG91bGQgbm90IHNpbGVudGx5IGRyb3AgdGhlXG4gKiByb3cgb24gdGhlIGZpcnN0IGF0dGVtcHQuIEVhY2ggZW1pc3Npb24gY2FycmllcyBhIHN0YWJsZSBwZXItZXZlbnRcbiAqIGBJZGVtcG90ZW5jeS1LZXlgIChzZWUgYHJlY29yZGApLCBzbyB0aGUgaHR0cC1jbGllbnQgdHJlYXRzIHRoZSBQT1NUIGFzXG4gKiByZXRyeS1zYWZlIGFuZCB0aGUgcGxhdGZvcm0gY2FuIGRlZHVwIGEgcmV0cmllZCBkZWxpdmVyeSBpbnN0ZWFkIG9mIHdyaXRpbmcgYVxuICogZHVwbGljYXRlIHJvdy4gQnVkZ2V0IGlzIGtlcHQgc21hbGwgc28gYSBoYXJkLWRvd24gcGxhdGZvcm0gY2FuJ3QgYmFjayB0aGVcbiAqIHdvcmtlciB1cCBmb3IgbG9uZzogYmFzZSBkZWxheSDDlygyIHJldHJpZXMpICsgYSBjb3VwbGUgb2YgNDI5IGJhY2tvZmZzLlxuICovXG5jb25zdCBBVURJVF9SRVFVRVNUX09QVElPTlM6IFBpY2s8UmVxdWVzdE9wdGlvbnMsICdtYXhSYXRlTGltaXRSZXRyaWVzJyB8ICdtYXhSZXRyaWVzJz4gPSB7XG4gIG1heFJhdGVMaW1pdFJldHJpZXM6IDIsXG4gIG1heFJldHJpZXM6IDIsXG59O1xuXG4vKipcbiAqIFRoZSBleGFjdCBzZXQgb2YgYXVkaXQgYWN0aW9ucyBhIE5PTi1QTEFURk9STSAocmVtb3RlKSBzZXJ2aWNlIGlzIHBlcm1pdHRlZCB0b1xuICogZW1pdCB0aHJvdWdoIGBQT1NUIC9hdWRpdC9ldmVudHNgLiBUaGlzIGlzIHRoZSBTSU5HTEUgU09VUkNFIOKAlCBgUmVtb3RlQXVkaXRBY3Rpb25gXG4gKiBpcyBkZXJpdmVkIGZyb20gaXQsIHNvIHRoZSB0eXBlIGFuZCB0aGUgcnVudGltZSBhbGxvdy1saXN0IGNhbiBuZXZlciBkcmlmdC5cbiAqXG4gKiBTRUNVUklUWTogcGxhdGZvcm0ncyBpbmdlc3QgdmFsaWRhdGVzIGBhY3Rpb25gIGFnYWluc3QgdGhpcyBzdWJzZXQgKHZpYVxuICoge0BsaW5rIGlzUmVtb3RlQXVkaXRBY3Rpb259KSwgTk9UIHRoZSBmdWxsIHBsYXRmb3JtIGBBdWRpdEFjdGlvbmAgdW5pb24g4oCUIGFcbiAqIGBzZXJ2aWNlOipgIHRva2VuIG11c3Qgbm90IGJlIGFibGUgdG8gZm9yZ2UgcGxhdGZvcm0tYXV0aG9yaXR5IGV2ZW50c1xuICogKGBhZG1pbi5zdXBlcmFkbWluLmdyYW50YCwgYG9yZy5vd25lcnNoaXAudHJhbnNmZXJgLCBgdXNlci5sb2dpbmAsIOKApikuIEtlZXBcbiAqIHRoaXMgbGlzdCBmcmVlIG9mIGFueSBwbGF0Zm9ybS1vbmx5IGFjdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFTU9URV9BVURJVF9BQ1RJT05TID0gW1xuICAncGx1Z2luLmJ1aWxkLmNvbXBsZXRlZCcsXG4gICdwbHVnaW4uYnVpbGQuZmFpbGVkJyxcbiAgJ3BsdWdpbi5idWlsZC50aW1lb3V0JyxcbiAgLy8gQSB2ZXJzaW9uIHBlcnNpc3RlZCBVTlNDQU5ORUQgYmVjYXVzZSB0aGUgYnVpbGQtdGltZSBzY2FuIGNvdWxkIG5vdCBydW4gYW5kXG4gIC8vIHRoZSBvcGVyYXRvciBlc2NhcGUgaGF0Y2ggYFBMVUdJTl9BTExPV19VTlNDQU5ORURgIGlzIG9uICh3aXRob3V0IGl0IHRoZVxuICAvLyBidWlsZCBmYWlscyBgSU1BR0VfU0NBTl9VTkFWQUlMQUJMRWApLiBgZGV0YWlsc2AgY2FycnkgbmFtZS92ZXJzaW9uL2RpZ2VzdC5cbiAgJ3BsdWdpbi5zY2FuLnNraXBwZWQnLFxuICAvLyBQbHVnaW4gbGlmZWN5Y2xlIG11dGF0aW9ucyAoYXBpL3BsdWdpbiByb3V0ZSBoYW5kbGVycykg4oCUIHRoZSBkZXN0cnVjdGl2ZSAvXG4gIC8vIHB1Ymxpc2hpbmcgc3VyZmFjZSB0aGF0IGJ1aWxkcyBhbHJlYWR5IGF1ZGl0J3MgY291bnRlcnBhcnQ6IHJlZ2lzdHJ5IGRlbGV0ZSxcbiAgLy8gc291cmNlIHVwbG9hZCwgYW5kIGRlcGxveS10by1jbHVzdGVyLiBgdGFyZ2V0SWRgIGlzIHRoZSBwbHVnaW4gaWQuXG4gICdwbHVnaW4uZGVsZXRlJyxcbiAgJ3BsdWdpbi5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIHB1cmdlOiBwZXJtYW5lbnQgaGFyZC1kZWxldGUgb2YgYSBzb2Z0LWRlbGV0ZWQgcGx1Z2luIHRvbWJzdG9uZSBvblxuICAvLyBkZW1hbmQgKGZpbmFsaXplcyB3aGF0IHRoZSByZXRlbnRpb24gc3dlZXAgd291bGQgb3RoZXJ3aXNlIGRvIGxhdGVyKS5cbiAgJ3BsdWdpbi5wdXJnZScsXG4gICdwbHVnaW4udXBkYXRlJyxcbiAgJ3BsdWdpbi51cGxvYWQnLFxuICAncGx1Z2luLmRlcGxveScsXG4gIC8vIFBsdWdpbiBidWxrIG11dGF0aW9ucyAoYXBpL3BsdWdpbiBidWxrLXBsdWdpbiByb3V0ZSkgKyBETFEgcHVyZ2UgKGRyb3BzIGFsbFxuICAvLyBkZWFkLWxldHRlcmVkIGJ1aWxkIGpvYnMsIGNyb3NzLW9yZywgc3lzYWRtaW4pLiBgZGV0YWlsc2AgY2FycmllcyBjb3VudHMuXG4gICdwbHVnaW4uYnVsay51cGRhdGUnLFxuICAncGx1Z2luLmJ1bGsuZGVsZXRlJyxcbiAgJ3BsdWdpbi5kbHEucHVyZ2UnLFxuICAvLyBCdWlsZCByZS1ydW5zIGZyb20gdGhlIHF1ZXVlLXRyaWFnZSBzdXJmYWNlOiByZS1lbnF1ZXVlIGEgRkFJTEVEIGJ1aWxkXG4gIC8vIChgcGx1Z2luLmJ1aWxkLnJldHJ5YCkgb3IgYSBkZWFkLWxldHRlcmVkIG9uZSAoYHBsdWdpbi5kbHEucmVwbGF5YCkuIEJvdGhcbiAgLy8gcmUtcnVuIGFuIGltYWdlIGJ1aWxkICsgcGx1Z2luIHBlcnNpc3Qgb24gdGhlIGNhbGxlcidzIGF1dGhvcml0eSwgc28gdGhleVxuICAvLyBhcmUgYXVkaXRlZCBtdXRhdGlvbnM7IGBhZmZlY3RlZE9yZ0lkYCBjYXJyaWVzIHRoZSBqb2IncyBvd25pbmcgb3JnLlxuICAncGx1Z2luLmJ1aWxkLnJldHJ5JyxcbiAgJ3BsdWdpbi5kbHEucmVwbGF5JyxcbiAgLy8gUGlwZWxpbmUgbXV0YXRpb25zIOKAlCBlbWl0dGVkIGJ5IGFwaS9waXBlbGluZSdzIHJvdXRlIGhhbmRsZXJzXG4gIC8vIChjcmVhdGUvdXBkYXRlL2RlbGV0ZSArIENvZGVQaXBlbGluZSBleGVjdXRpb24gdHJpZ2dlci9jYW5jZWwpIGFuZFxuICAvLyBwb3N0ZWQgdG8gcGxhdGZvcm0ncyBgUE9TVCAvYXVkaXQvZXZlbnRzYCBpbmdlc3QuXG4gICdwaXBlbGluZS5jcmVhdGUnLFxuICAncGlwZWxpbmUudXBkYXRlJyxcbiAgJ3BpcGVsaW5lLmRlbGV0ZScsXG4gICdwaXBlbGluZS5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIHB1cmdlOiBwZXJtYW5lbnQgaGFyZC1kZWxldGUgb2YgYSBzb2Z0LWRlbGV0ZWQgcGlwZWxpbmUgL1xuICAvLyBwaXBlbGluZV90ZW1wbGF0ZSB0b21ic3RvbmUgb24gZGVtYW5kIChmaW5hbGl6ZXMgd2hhdCB0aGUgcmV0ZW50aW9uIHN3ZWVwXG4gIC8vIHdvdWxkIG90aGVyd2lzZSBkbyBsYXRlcikuIGB0YXJnZXRJZGAgaXMgdGhlIHB1cmdlZCBpZC5cbiAgJ3BpcGVsaW5lLnB1cmdlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLmNyZWF0ZScsXG4gICdwaXBlbGluZV90ZW1wbGF0ZS51cGRhdGUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUuZGVsZXRlJyxcbiAgJ3BpcGVsaW5lX3RlbXBsYXRlLnJlc3RvcmUnLFxuICAncGlwZWxpbmVfdGVtcGxhdGUucHVyZ2UnLFxuICAncGlwZWxpbmUuZXhlY3V0aW9uLnN0YXJ0JyxcbiAgJ3BpcGVsaW5lLmV4ZWN1dGlvbi5jYW5jZWwnLFxuICAvLyBDb2RlUGlwZWxpbmUgQVJOLXJlZ2lzdHJ5IGNvbmZpZyAoYXBpL3BpcGVsaW5lIHJlZ2lzdHJ5IHJvdXRlKSDigJQgcmVnaXN0ZXJpbmcgL1xuICAvLyBkZXJlZ2lzdGVyaW5nIHRoZSBleHRlcm5hbCBDb2RlUGlwZWxpbmUgdGhhdCBiYWNrcyBhIHBpcGVsaW5lIChkZXBsb3ktYWZmZWN0aW5nKS5cbiAgJ3BpcGVsaW5lLnJlZ2lzdHJ5LnJlZ2lzdGVyJyxcbiAgJ3BpcGVsaW5lLnJlZ2lzdHJ5LmRlcmVnaXN0ZXInLFxuICAvLyBRdW90YSBhZG1pbmlzdHJhdGlvbiAoYXBpL3F1b3RhKSDigJQgYSBzdXBlcmFkbWluIHJlc2V0dGluZyBhbiBvcmcncyB1c2FnZVxuICAvLyBjb3VudGVyIG9yIGVkaXRpbmcgaXRzIHRpZXIgbGltaXRzLiBgYWZmZWN0ZWRPcmdJZGAgaXMgdGhlIG9yZyBjaGFuZ2VkO1xuICAvLyBgZGV0YWlsc2AgY2FycmllcyB0aGUgcXVvdGFUeXBlICsgb2xkL25ldyB2YWx1ZS5cbiAgJ3F1b3RhLnJlc2V0JyxcbiAgJ3F1b3RhLmxpbWl0LnVwZGF0ZScsXG4gIC8vIEEgc3VwZXJhZG1pbiBkZWxldGluZyBhbiBvcmcncyBlbnRpcmUgcXVvdGEgZG9jdW1lbnQuXG4gICdxdW90YS5kZWxldGUnLFxuICAvLyBDb21wbGlhbmNlIGFkbWluaXN0cmF0aW9uIChhcGkvY29tcGxpYW5jZSkg4oCUIHRoZSBlbmZvcmNlbWVudC1wb3N0dXJlIHN1cmZhY2UuXG4gIC8vIEFwcHJvdmluZy9yZXZva2luZyBhbiBleGVtcHRpb24sIHRvZ2dsaW5nL2F1dGhvcmluZy9kZWxldGluZyBhIHJ1bGUsXG4gIC8vIGF1dGhvcmluZy9kZWxldGluZyBhIHBvbGljeSwgbWFuYWdpbmcgc2NhbiBzY2hlZHVsZXMsIGFwcGx5aW5nIGEgdGVtcGxhdGUsXG4gIC8vIG9yIGNhbmNlbGxpbmcgYSBydW5uaW5nIHNjYW4uIGB0YXJnZXRJZGAgaXMgdGhlIHJ1bGUvcG9saWN5L2V4ZW1wdGlvbi9zY2FuIGlkLlxuICAnY29tcGxpYW5jZS5leGVtcHRpb24uYXBwcm92ZScsXG4gICdjb21wbGlhbmNlLmV4ZW1wdGlvbi5yZXZva2UnLFxuICAnY29tcGxpYW5jZS5ydWxlLnRvZ2dsZScsXG4gICdjb21wbGlhbmNlLnJ1bGUuY3JlYXRlJyxcbiAgJ2NvbXBsaWFuY2UucnVsZS51cGRhdGUnLFxuICAnY29tcGxpYW5jZS5ydWxlLmRlbGV0ZScsXG4gICdjb21wbGlhbmNlLnJ1bGUucmVzdG9yZScsXG4gIC8vIE1hbnVhbCBvbi1kZW1hbmQgaGFyZC1kZWxldGUgKFBVUkdFKSBvZiBhIHNvZnQtZGVsZXRlZCBydWxlL3BvbGljeSB0b21ic3RvbmUg4oCUXG4gIC8vIHRoZSBjYWxsZXItaW5pdGlhdGVkIGNvdW50ZXJwYXJ0IHRvIHRoZSByZXRlbnRpb24gc3dlZXAncyBhdXRvLXB1cmdlLiBEZXN0cm95c1xuICAvLyB0aGUgdG9tYnN0b25lIHBlcm1hbmVudGx5LCBzbyBpdCBjYXJyaWVzIHRoZSBkdXJhYmxlLCB0YW1wZXItZXZpZGVudCB0cmFpbC5cbiAgJ2NvbXBsaWFuY2UucnVsZS5wdXJnZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5wb2xpY3kudXBkYXRlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LmRlbGV0ZScsXG4gICdjb21wbGlhbmNlLnBvbGljeS5yZXN0b3JlJyxcbiAgJ2NvbXBsaWFuY2UucG9saWN5LnB1cmdlJyxcbiAgJ2NvbXBsaWFuY2Uuc2Nhbi1zY2hlZHVsZS5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLXNjaGVkdWxlLnVwZGF0ZScsXG4gICdjb21wbGlhbmNlLnNjYW4tc2NoZWR1bGUuZGVsZXRlJyxcbiAgJ2NvbXBsaWFuY2UudGVtcGxhdGUuYXBwbHknLFxuICAvLyBMYXVuY2hpbmcgYW4gb3JnLXdpZGUgcmUtZXZhbHVhdGlvbiAodGhlIGNvdW50ZXJwYXJ0IHRvIGAuY2FuY2VsYCkg4oCUIGl0XG4gIC8vIHBlcnNpc3RzIGEgc2NhbiBhbmQgY2FuIGJsb2NrIGVudGl0aWVzIHRoYXQgcGFzc2VkIGJlZm9yZS5cbiAgJ2NvbXBsaWFuY2Uuc2Nhbi5jcmVhdGUnLFxuICAnY29tcGxpYW5jZS5zY2FuLmNhbmNlbCcsXG4gIC8vIFBlci1vcmcgY29tcGxpYW5jZSBub3RpZmljYXRpb24gc2V0dGluZ3M6IHJlY2lwaWVudHMgKyB0aGUgb3V0Ym91bmQgd2ViaG9va1xuICAvLyBVUkwvc2VjcmV0LiBCZWFyZXItZXF1aXZhbGVudCBjb25maWcgdGhhdCByZWRpcmVjdHMgdmlvbGF0aW9uIG5vdGljZXMsIHNvIGFcbiAgLy8gY2hhbmdlIGNhcnJpZXMgdGhlIGR1cmFibGUgdHJhaWwgKG5ldmVyIHRoZSBzZWNyZXQgaXRzZWxmKS5cbiAgJ2NvbXBsaWFuY2Uubm90aWZpY2F0aW9uLXByZWZlcmVuY2UudXBkYXRlJyxcbiAgLy8gSW1hZ2UtcmVnaXN0cnkgZGVzdHJ1Y3RpdmUgb3BzIChhcGkvaW1hZ2UtcmVnaXN0cnkpIOKAlCBnYXJiYWdlLWNvbGxlY3Rpb25cbiAgLy8gc3dlZXBzIGFuZCBleHBsaWNpdCBpbWFnZS90YWcgZGVsZXRlcy5cbiAgJ3JlZ2lzdHJ5LmdjJyxcbiAgJ3JlZ2lzdHJ5LmltYWdlLmRlbGV0ZScsXG4gIC8vIENyb3NzLXJlcG8gdGFnL2ltYWdlIGNvcHkgKGFwaS9pbWFnZS1yZWdpc3RyeSBQT1NUIC9hcGkvaW1hZ2VzL2NvcHkpLiBBXG4gIC8vIGNyb3NzLXRlbmFudCBjb3B5IG1vdmVzIGRhdGEgYWNyb3NzIGN1c3RvbWVyIGJvdW5kYXJpZXMsIHNvIGl0IG5lZWRzIHRoZVxuICAvLyBkdXJhYmxlLCB0YW1wZXItZXZpZGVudCB0cmFpbCDigJQgbm90IGp1c3QgdGhlIExva2kgb3BlcmF0b3IgbGluZS5cbiAgJ3JlZ2lzdHJ5LmltYWdlLmNvcHknLFxuICAvLyBBIHBsdWdpbiBpbWFnZSBzaWduZWQgKyBTQk9NLWF0dGVzdGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIHBsdWdpbi1zaWduaW5nIGtleVxuICAvLyAoYXBpL2ltYWdlLXJlZ2lzdHJ5IFBPU1QgL2ludGVybmFsL3BsdWdpbi1zaWduYXR1cmVzLCBjYWxsZWQgYnkgdGhlIHBsdWdpblxuICAvLyBidWlsZCB3b3JrZXIpLiBUaGUga2V5IGlzIHdoYXQgc3ludGggdHJ1c3RzLCBzbyBldmVyeSB1c2UgaXMgb24gdGhlIHRyYWlsLlxuICAncmVnaXN0cnkuaW1hZ2Uuc2lnbicsXG4gIC8vIE1lc3NhZ2luZyAoYXBpL21lc3NhZ2UpIOKAlCBhZG1pbiBCUk9BRENBU1QgYW5ub3VuY2VtZW50cyArIGRlc3RydWN0aXZlXG4gIC8vIGRlbGV0ZXMuIDE6MSB1c2VyIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBhdWRpdGVkIChub2lzZSArIHRoZXkgd291bGRcbiAgLy8gcHVsbCBwcml2YXRlIGNvbnRlbnQgaW50byB0aGUgdHJhaWwpLiBgZGV0YWlsc2AgY2FycnkgbWV0YWRhdGEgb25seVxuICAvLyAoc3ViamVjdC90eXBlL3Njb3BlKSwgTkVWRVIgbWVzc2FnZSBib2R5IGNvbnRlbnQuXG4gICdtZXNzYWdlLmFubm91bmNlbWVudC5jcmVhdGUnLFxuICAnbWVzc2FnZS5kZWxldGUnLFxuICAnbWVzc2FnZS5yZXN0b3JlJyxcbiAgLy8gTWFudWFsIG9uLWRlbWFuZCBQVVJHRSAocGVybWFuZW50IGhhcmQtZGVsZXRlKSBvZiBhbiBhbHJlYWR5LXNvZnQtZGVsZXRlZFxuICAvLyBtZXNzYWdlIHRvbWJzdG9uZSDigJQgdGhlIGRlc3RydWN0aXZlIGZpbmFsaXplciB0aGUgcmV0ZW50aW9uIHN3ZWVwIHdvdWxkXG4gIC8vIG90aGVyd2lzZSBwZXJmb3JtIGF0IHRoZSBwdXJnZSBkZWFkbGluZS4gYGRldGFpbHNgIGNhcnJ5IG1ldGFkYXRhIG9ubHkuXG4gICdtZXNzYWdlLnB1cmdlJyxcbiAgLy8gQmlsbGluZyAoYXBpL2JpbGxpbmcpIOKAlCBzdWJzY3JpcHRpb24gKyBlbnRpdGxlbWVudCBtdXRhdGlvbnMsIG1pcnJvcmVkIHRvIHRoZVxuICAvLyBjZW50cmFsIGF1ZGl0IHRyYWlsICh0aGVzZSBhbHNvIHdyaXRlIHRvIHRoZSBzZXJ2aWNlLWxvY2FsIGJpbGxpbmdfZXZlbnRzXG4gIC8vIGNvbGxlY3Rpb24pLiBgZGV0YWlsc2AgY2FycnkgcGxhbi90aWVyL2FkZG9uIGlkcyBvbmx5IOKAlCBuZXZlciBjYXJkL3BheW1lbnRcbiAgLy8gc2VjcmV0cyBvciBhbiBBV1MgYWNjb3VudCBpZC5cbiAgLy8gU3Vic2NyaXB0aW9uIGxpZmVjeWNsZSBhIENVU1RPTUVSIGRyaXZlcyAodGhlIGFkbWluIGNvdW50ZXJwYXJ0IGlzXG4gIC8vIGBiaWxsaW5nLnRpZXIub3ZlcnJpZGVgKTogc2VsZi1zZXJ2ZSBjcmVhdGUgKGRpcmVjdCBvciBNYXJrZXRwbGFjZSBjbGFpbSksXG4gIC8vIHBsYW4vaW50ZXJ2YWwgY2hhbmdlLCBjYW5jZWwtYXQtcGVyaW9kLWVuZCwgdW5kby1jYW5jZWwsIGNhc2NhZGUgZGVsZXRlLlxuICAnYmlsbGluZy5zdWJzY3JpcHRpb24uY3JlYXRlJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLnVwZGF0ZScsXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5yZWFjdGl2YXRlJyxcbiAgJ2JpbGxpbmcuc3Vic2NyaXB0aW9uLmNhbmNlbCcsXG4gICdiaWxsaW5nLnN1YnNjcmlwdGlvbi5kZWxldGUnLFxuICAnYmlsbGluZy50aWVyLm92ZXJyaWRlJyxcbiAgLy8gT3BlcmF0b3Itb25seSByZXNlZWQgb2YgdGhlIGludm9pY2UgbGVkZ2VyIGZyb20gdGhlIHBheW1lbnQgcHJvdmlkZXInc1xuICAvLyBoaXN0b3J5IChQT1NUIC9iaWxsaW5nL2FkbWluL2JhY2tmaWxsKSDigJQgbXV0YXRlcyBmaW5hbmNlIGRhdGEgZmxlZXQtd2lkZS5cbiAgJ2JpbGxpbmcuYWRkb24uYWRkJyxcbiAgJ2JpbGxpbmcuYWRkb24ucmVtb3ZlJyxcbiAgLy8gU3lzdGVtLWluaXRpYXRlZCByZW1vdmFsIG9mIGEgdGllci1pbmNsdWRlZCBhZGQtb24gb24gYSBwbGFuIHVwZ3JhZGUgKHRoZVxuICAvLyBhY2NvdW50J3MgbmV3IHRpZXIgbm93IGJ1bmRsZXMgdGhlIGZlYXR1cmUpIOKAlCBkaXN0aW5jdCBmcm9tIGEgdXNlci1pbml0aWF0ZWRcbiAgLy8gYHJlbW92ZWAgc28gZmluYW5jZSBjYW4gdGVsbCBhbiBhdXRvLXBydW5lIGZyb20gYSBjdXN0b21lciBhY3Rpb24uXG4gICdiaWxsaW5nLmFkZG9uLnBydW5lJyxcbiAgLy8gRGlzY291bnRzIChkb2NzL2JpbGxpbmctZGlzY291bnRzLm1kKSDigJQgbWludC9pc3N1ZS9hcHBseS9yZW1vdmUvcmV2b2tlIG9mIGFcbiAgLy8gcHJpY2UgY291cG9uIG9yIHVzYWdlIGNyZWRpdC4gYGRldGFpbHNgIGNhcnJ5IHRoZSBkaXNjb3VudCBpZCArIGtpbmQvdmFsdWVcbiAgLy8gb25seSwgbmV2ZXIgdGhlIG9wYXF1ZSB0b2tlbiBvciBzaWduaW5nIGtleS5cbiAgJ2JpbGxpbmcuZGlzY291bnQuZ2VuZXJhdGUnLFxuICAnYmlsbGluZy5kaXNjb3VudC5pc3N1ZScsXG4gICdiaWxsaW5nLmRpc2NvdW50LmFwcGx5JyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmVtb3ZlJyxcbiAgJ2JpbGxpbmcuZGlzY291bnQucmV2b2tlJyxcbiAgLy8gUHJvbW90aW9ucyAoZG9jcy9iaWxsaW5nLWRpc2NvdW50cy5tZCNwcm9tb3Rpb25zKSDigJQgcnVsZS1kcml2ZW4gYXV0by1ncmFudFxuICAvLyBjYW1wYWlnbnMuIGBkZXRhaWxzYCBjYXJyeSB0aGUgcHJvbW90aW9uIGlkICsgY2VudHMvZXZlbnQgb25seS5cbiAgJ2JpbGxpbmcucHJvbW90aW9uLmNyZWF0ZScsXG4gICdiaWxsaW5nLnByb21vdGlvbi51cGRhdGUnLFxuICAnYmlsbGluZy5wcm9tb3Rpb24ucmV2b2tlJyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmdyYW50JyxcbiAgJ2JpbGxpbmcucHJvbW90aW9uLmFjdGl2YXRlJyxcbiAgLy8gVXNhZ2UtY3JlZGl0IHJlYWxpemF0aW9uIOKAlCBhIGN1c3RvbWVyL2NvbXBsaWFuY2UtdmlzaWJsZSByZWNvcmQgb2YgY3JlZGl0XG4gIC8vIG1vdmVtZW50OiBgY29uc3VtZWRgIChNYXJrZXRwbGFjZSBtZXRlcmVkIGRyYXdkb3duKSwgYGV4aGF1c3RlZGAgKGJhbGFuY2UgaGl0XG4gIC8vIHplcm8pLCBhbmQgYSBjb21ibyBlbmRpbmcuIGBkZXRhaWxzYCBjYXJyeSBjZW50cy9pZHMgb25seSwgbm8gcGF5bWVudCBzZWNyZXRzLlxuICAnYmlsbGluZy5jcmVkaXQuY29uc3VtZWQnLFxuICAnYmlsbGluZy5jcmVkaXQuZXhoYXVzdGVkJyxcbiAgJ2JpbGxpbmcuY29tYm8uZXhwaXJlZCcsXG4gIC8vIFJlcG9ydGluZyAoYXBpL3JlcG9ydGluZykg4oCUIHRoZSB0aHJlZSByZXBvcnRpbmcgbXV0YXRpb25zIHdob3NlIGVmZmVjdFxuICAvLyBvdXRsaXZlcyBhIHJlcXVlc3QgbG9nOiB0aGUgcGVyLW9yZyBjb3JyZWxhdGlvbi13aW5kb3cgY29uZmlnIHdyaXRlLCBhXG4gIC8vIHBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VyIChpdCBtb3ZlcyB0aGUgb3JnJ3MgRE9SQSBDRlIvTVRUUiksIGFuZCB0aGVcbiAgLy8gaW5ib3VuZCBiaWxsaW5n4oaScmVwb3J0aW5nIHJldGVudGlvbi1lbnRpdGxlbWVudCBzeW5jIChhIHJldGVudGlvbiBjdXQgaXMgYVxuICAvLyBkYXRhLWRlc3Ryb3lpbmcgY2hhbmdlIGFwcGxpZWQgYnkgdGhlIG5leHQgc3dlZXApLiBgZGV0YWlsc2AgY2FycnkgdGhlXG4gIC8vIHNldHRpbmdzL291dGNvbWUgdmFsdWVzIG9ubHkuXG4gICdyZXBvcnRpbmcuc2V0dGluZ3MudXBkYXRlJyxcbiAgJ3JlcG9ydGluZy5kZXBsb3ltZW50Lm91dGNvbWUnLFxuICAncmVwb3J0aW5nLnJldGVudGlvbi5zeW5jJyxcbiAgLy8gRGVuaWVkIGF1dGhvcml6YXRpb24gYXR0ZW1wdCDigJQgZW1pdHRlZCBiZXN0LWVmZm9ydCBieSB0aGUgc2hhcmVkXG4gIC8vIGByZXF1aXJlUGVybWlzc2lvbmAgLyBgcmVxdWlyZVN5c3RlbUFkbWluYCBnYXRlIHdoZW4gYSBzdGF0ZS1jaGFuZ2luZ1xuICAvLyAobm9uLUdFVCkgcmVxdWVzdCBpcyByZWplY3RlZCwgc28gcHJvYmluZy9lc2NhbGF0aW9uIGF0dGVtcHRzIGFyZSB2aXNpYmxlXG4gIC8vIHJhdGhlciB0aGFuIGludmlzaWJsZS4gYGRldGFpbHNgIGNhcnJpZXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gKyBwYXRoO1xuICAvLyBgb3V0Y29tZWAgaXMgJ2ZhaWx1cmUnLlxuICAnYXV0aHouZGVuaWVkJyxcbiAgLy8gXCJBc2tcIiBhc3Npc3RhbnQgYWN0aXZpdHkg4oCUIHZpc2liaWxpdHkgaW50byB3aGF0IHRoZSBhc3Npc3RhbnQgZGlkIG9uIGEgdXNlcidzXG4gIC8vIGJlaGFsZi4gYGFzay5xdWVyeWAgaXMgYSByZWFkLW9ubHkgaG93LXRvIHR1cm47IGBhc2suYWdlbnQudHVybmAgaXMgYSB0b29sLWNhbGxpbmdcbiAgLy8gdHVybi4gYGRldGFpbHNgIGNhcnJ5IFNBRkUgTUVUQURBVEEgT05MWSAodG9vbHMgdXNlZCwgcHJvcG9zYWwga2luZHMsIHF1ZXJ5XG4gIC8vIGxlbmd0aCwgb3V0Y29tZSksIG5ldmVyIHRoZSByYXcgcXVlcnkgdGV4dC5cbiAgJ2Fzay5xdWVyeScsXG4gICdhc2suYWdlbnQudHVybicsXG4gIC8vIFBsdWdpbiBlY29zeXN0ZW0gKGRvY3MvcnVuYm9va3MvZWNvc3lzdGVtLW1vZGVyYXRpb24ubWQpLiBHb3Zlcm5hbmNlIGFjdGlvbnNcbiAgLy8gYXJlIHJlY29yZGVkIHdpdGggYG9yZ0lkYCA9IHRoZSBzeXN0ZW0gb3JnOyBgYWZmZWN0ZWRPcmdJZGAgaXMgdGhlXG4gIC8vIHB1Ymxpc2hlcidzIG9yZyAobGlzdGluZy92ZXJzaW9uL3Jldmlldy9hZHZpc29yeS9wdWJsaXNoZXIgbW9kZXJhdGlvbikgb3JcbiAgLy8gdGhlIGluc3RhbGxpbmcgb3JnIChpbnN0YWxscyArIHBvbGljeSkuIEFub255bW91cyBzdWJtaXNzaW9ucyB1c2UgdGhlXG4gIC8vIGBBTk9OWU1PVVNfQUNUT1JfSURgIGFjdG9yIHdpdGggYGRldGFpbHMuc3VibWlzc2lvbklkYC4gYGRldGFpbHNgIGNhcnJ5IGlkcyxcbiAgLy8gdmVyc2lvbnMsIGRpZ2VzdHMsIHRpZXIsIHN0YXRlIGFuZCByZWFzb24gY29kZXMgb25seSDigJQgbmV2ZXIgcmV2aWV3IGJvZGllcyxcbiAgLy8gUkVBRE1FIGNvbnRlbnQsIHNlY3JldHMgb3IgZW1haWxzLlxuICAvLyBQdWJsaXNoZXJzLlxuICAncHVibGlzaGVyLmNyZWF0ZScsXG4gICdwdWJsaXNoZXIudXBkYXRlJyxcbiAgJ3B1Ymxpc2hlci50ZXJtcy5hY2NlcHQnLFxuICAncHVibGlzaGVyLnZlcmlmeS5yZXF1ZXN0JyxcbiAgJ3B1Ymxpc2hlci52ZXJpZnkuYXBwcm92ZScsXG4gICdwdWJsaXNoZXIudmVyaWZ5LnJlamVjdCcsXG4gICdwdWJsaXNoZXIudGllci5jaGFuZ2UnLFxuICAncHVibGlzaGVyLnN1c3BlbmQnLFxuICAncHVibGlzaGVyLnVuc3VzcGVuZCcsXG4gICdwdWJsaXNoZXIudHJhbnNmZXIucmVxdWVzdCcsXG4gICdwdWJsaXNoZXIudHJhbnNmZXIuYWNjZXB0JyxcbiAgJ3B1Ymxpc2hlci50cmFuc2Zlci5kZWNsaW5lJyxcbiAgJ3B1Ymxpc2hlci50cmFuc2Zlci5hcHByb3ZlJyxcbiAgJ3B1Ymxpc2hlci50cmFuc2Zlci5yZWplY3QnLFxuICAncHVibGlzaGVyLnByb2ZpbGUtY2hhbmdlLmFwcHJvdmUnLFxuICAncHVibGlzaGVyLnByb2ZpbGUtY2hhbmdlLnJlamVjdCcsXG4gIC8vIFB1Ymxpc2ggcmVxdWVzdHMgKHRlbmFudCDihpIgc3lzdGVtIG9yZykuIGBkZXRhaWxzLmtpbmRgIG5hbWVzIHRoZSByZXF1ZXN0LlxuICAncGx1Z2luLnJlcXVlc3Quc3VibWl0JyxcbiAgJ3BsdWdpbi5yZXF1ZXN0LndpdGhkcmF3JyxcbiAgJ3BsdWdpbi5yZXF1ZXN0LmFwcHJvdmUnLFxuICAncGx1Z2luLnJlcXVlc3Quc2Vjb25kLWFwcHJvdmUnLFxuICAncGx1Z2luLnJlcXVlc3QucmVqZWN0JyxcbiAgJ3BsdWdpbi5yZXF1ZXN0LmF1dG8tYXBwcm92ZScsXG4gIC8vIExpc3RpbmdzIGFuZCB2ZXJzaW9ucyAoc3lzdGVtIG9yZywgZXhjZXB0IHRoZSB0ZW5hbnQgcGF1c2UpLlxuICAncGx1Z2luLmxpc3RpbmcucHVibGlzaCcsXG4gICdwbHVnaW4ubGlzdGluZy51bmxpc3QnLFxuICAncGx1Z2luLmxpc3RpbmcudXBkYXRlJyxcbiAgJ3BsdWdpbi5saXN0aW5nLnN0YXRlLmNoYW5nZScsXG4gICdwbHVnaW4ubGlzdGluZy5wYXVzZScsXG4gICdwbHVnaW4ubGlzdGluZy51bnBhdXNlJyxcbiAgJ3BsdWdpbi52ZXJzaW9uLnBhdXNlJyxcbiAgJ3BsdWdpbi52ZXJzaW9uLnlhbmsnLFxuICAncGx1Z2luLnZlcnNpb24udW55YW5rJyxcbiAgJ3BsdWdpbi52ZXJzaW9uLmRlcHJlY2F0ZScsXG4gICdwbHVnaW4uY29sbGVjdGlvbi51cGRhdGUnLFxuICAvLyBFY29zeXN0ZW0gY29uZmlndXJhdGlvbiAoc3lzdGVtIG9yZykuXG4gICdlY29zeXN0ZW0uYXV0by1hcHByb3ZhbC1ydWxlLmNyZWF0ZScsXG4gICdlY29zeXN0ZW0uYXV0by1hcHByb3ZhbC1ydWxlLnVwZGF0ZScsXG4gICdlY29zeXN0ZW0uYXV0by1hcHByb3ZhbC1ydWxlLmRlbGV0ZScsXG4gICdlY29zeXN0ZW0ucmVzZXJ2ZWQtbmFtZS51cGRhdGUnLFxuICAnZWNvc3lzdGVtLnNsYS51cGRhdGUnLFxuICAvLyBQdWJsaWMgcmVnaXN0cnkgbmFtZXNwYWNlIChgcHVibGljLypgKTogY29weSArIHNpZ24gKyBhdHRlc3Qgb24gcHVibGlzaCxcbiAgLy8gdGhlIHRpZXItY2hhbmdlL3N1c3BlbnNpb24gcmUtc2lnbiBqb2IsIHRhZyByZW1vdmFsIG9uIHlhbmsvdGFrZWRvd24sIGFuZFxuICAvLyB0aGUgcmV0ZW50aW9uIHN3ZWVwLlxuICAncmVnaXN0cnkuaW1hZ2UucHVibGlzaCcsXG4gICdyZWdpc3RyeS5pbWFnZS5yZXNpZ24nLFxuICAncmVnaXN0cnkuaW1hZ2UueWFuaycsXG4gICdyZWdpc3RyeS5pbWFnZS5nYycsXG4gIC8vIEluc3RhbGxzIGFuZCB0aGUgaW5zdGFsbGluZyBvcmcncyBjb25zdW1wdGlvbiBwb2xpY3kgKG9yZy1sb2NhbCkuXG4gICdwbHVnaW4uaW5zdGFsbC5yZXF1ZXN0JyxcbiAgJ3BsdWdpbi5pbnN0YWxsLmFwcHJvdmUnLFxuICAncGx1Z2luLmluc3RhbGwuZGVueScsXG4gICdwbHVnaW4uaW5zdGFsbC5jcmVhdGUnLFxuICAncGx1Z2luLmluc3RhbGwudXBncmFkZScsXG4gIC8vIEEgbWVtYmVyJ3MgcmVxdWVzdCB0byBjaGFuZ2UgYW4gaW5zdGFsbCBwYXN0IHdoYXQgdGhleSBtYXkgZG8gYWxvbmUsIGFuZCBpdHMgZGVjaXNpb24uXG4gICdwbHVnaW4uaW5zdGFsbC5jaGFuZ2UtcmVxdWVzdCcsXG4gICdwbHVnaW4uaW5zdGFsbC5jaGFuZ2UtYXBwcm92ZScsXG4gICdwbHVnaW4uaW5zdGFsbC5jaGFuZ2UtcmVqZWN0JyxcbiAgJ3BsdWdpbi5pbnN0YWxsLnJlbW92ZScsXG4gICdvcmcucGx1Z2luLWluc3RhbGwtcG9saWN5LnVwZGF0ZScsXG4gIC8vIFJldmlld3MgYW5kIHJlcGxpZXMuXG4gICdwbHVnaW4ucmV2aWV3LmNyZWF0ZScsXG4gICdwbHVnaW4ucmV2aWV3LnVwZGF0ZScsXG4gICdwbHVnaW4ucmV2aWV3LmRlbGV0ZScsXG4gICdwbHVnaW4ucmV2aWV3LnJlcG9ydCcsXG4gICdwbHVnaW4ucmV2aWV3LmhvbGQnLFxuICAncGx1Z2luLnJldmlldy5yZWxlYXNlJyxcbiAgJ3BsdWdpbi5yZXZpZXcucmVtb3ZlJyxcbiAgJ3BsdWdpbi5yZXZpZXcuYW5vbnltaXplJyxcbiAgJ3BsdWdpbi5yZXZpZXcucmVwbHkuY3JlYXRlJyxcbiAgJ3BsdWdpbi5yZXZpZXcucmVwbHkudXBkYXRlJyxcbiAgJ3BsdWdpbi5yZXZpZXcucmVwbHkuZGVsZXRlJyxcbiAgLy8gQW5vbnltb3VzIHN1Ym1pc3Npb25zLlxuICAncGx1Z2luLnN1Ym1pc3Npb24uY3JlYXRlJyxcbiAgJ3BsdWdpbi5zdWJtaXNzaW9uLnZlcmlmeScsXG4gICdwbHVnaW4uc3VibWlzc2lvbi5nYXRlLWZhaWwnLFxuICAncGx1Z2luLnN1Ym1pc3Npb24uYXBwcm92ZScsXG4gICdwbHVnaW4uc3VibWlzc2lvbi5yZWplY3QnLFxuICAncGx1Z2luLnN1Ym1pc3Npb24uY2xhaW0nLFxuICAncGx1Z2luLnN1Ym1pc3Npb24uZXhwaXJlJyxcbiAgLy8gU2VjdXJpdHkgYWR2aXNvcmllcyAocHVibGlzaC93aXRoZHJhdyBhcmUgc3lzdGVtLW9yZyBvbmx5OyB1cGRhdGUgPSBhXG4gIC8vIG1vZGVyYXRvciBlZGl0aW5nIGEgZHJhZnQgYmVmb3JlIGl0IGlzIHB1Ymxpc2hlZCkuXG4gICdwbHVnaW4uYWR2aXNvcnkuY3JlYXRlJyxcbiAgJ3BsdWdpbi5hZHZpc29yeS51cGRhdGUnLFxuICAncGx1Z2luLmFkdmlzb3J5LnB1Ymxpc2gnLFxuICAncGx1Z2luLmFkdmlzb3J5LndpdGhkcmF3JyxcbiAgLy8gUGVyLW9yZyBwbHVnaW4gc2VjdXJpdHkgbm90aWZpY2F0aW9ucyAocGx1Z2luIHNjYW4gZ2F0ZXMpOiB0aGUgc2V0dGluZ3NcbiAgLy8gKHJlY2lwaWVudHMsIGRpZ2VzdCwgd2ViaG9vaywgZXh0ZXJuYWwgYWRkcmVzcyDigJQgY2hhbmdlZCBmaWVsZCBuYW1lcyBhbmRcbiAgLy8gdGhlIHdlYmhvb2sgaG9zdCBvbmx5LCBuZXZlciB0aGUgc2VjcmV0IG9yIHRoZSBhZGRyZXNzKSwgYW4gZXh0ZXJuYWxcbiAgLy8gYWRkcmVzcyBjb25maXJtZWQgdGhyb3VnaCBpdHMgZW1haWxlZCBzaW5nbGUtdXNlIGxpbmssIGFuZCBhIHRlc3Qgc2VuZC5cbiAgJ3BsdWdpbi5zZWN1cml0eV9ub3RpZmljYXRpb25zLnVwZGF0ZScsXG4gICdwbHVnaW4uc2VjdXJpdHlfbm90aWZpY2F0aW9ucy5leHRlcm5hbF9lbWFpbC52ZXJpZnknLFxuICAncGx1Z2luLnNlY3VyaXR5X25vdGlmaWNhdGlvbnMudGVzdCcsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBSZW1vdGVBdWRpdEFjdGlvbiA9IHR5cGVvZiBSRU1PVEVfQVVESVRfQUNUSU9OU1tudW1iZXJdO1xuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIGFjdGlvbiBhIHJlbW90ZSBzZXJ2aWNlIG1heSBlbWl0ICh0aGUgaW5nZXN0IGFsbG93LWxpc3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVtb3RlQXVkaXRBY3Rpb24odmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFJlbW90ZUF1ZGl0QWN0aW9uIHtcbiAgcmV0dXJuIChSRU1PVEVfQVVESVRfQUNUSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0RXZlbnQge1xuICBhY3Rpb246IFJlbW90ZUF1ZGl0QWN0aW9uO1xuICBhY3RvcklkOiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIG9yZ0lkPzogc3RyaW5nO1xuICBhZmZlY3RlZE9yZ0lkPzogc3RyaW5nO1xuICB0YXJnZXRUeXBlPzogc3RyaW5nO1xuICB0YXJnZXRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpZCB0aGUgYXVkaXRlZCBhY3Rpb24gc3VjY2VlZCBvciBmYWlsPyBEZWZhdWx0cyB0byAnc3VjY2Vzcycgd2hlbiBvbWl0dGVkXG4gICAqICh0aGUgcGxhdGZvcm0gaW5nZXN0IGFwcGxpZXMgdGhlIHNhbWUgZGVmYXVsdCkuIERlbmllZC1hdXRoeiBldmVudHMgc2V0XG4gICAqICdmYWlsdXJlJyBzbyBhIHJldmlld2VyIGNhbiBmaWx0ZXIgYXR0ZW1wdHMgZnJvbSBjb21wbGV0ZWQgYWN0aW9ucy5cbiAgICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBhdWRpdGVkIGFjdGlvbiBhY3R1YWxseSBPQ0NVUlJFRCAoSVNPLTg2MDEpLCBzdGFtcGVkIGF0IGVtaXNzaW9uLlxuICAgKiBUaGUgcGxhdGZvcm0gc3RvcmVzIHRoaXMgZm9yIHJldmlld2VyczsgaXQgaXMgTk9UIHRoZSBjaGFpbi1vcmRlcmluZyBmaWVsZFxuICAgKiAodGhlIHRhbXBlci1ldmlkZW50IGNoYWluIG9yZGVycyBieSBpbmdlc3QvYGNyZWF0ZWRBdGApLiBJdCBtYXR0ZXJzIGZvclxuICAgKiBTUE9PTEVEIGV2ZW50czogb25lIGJ1ZmZlcmVkIGR1cmluZyBhIHBsYXRmb3JtIG91dGFnZSBpcyByZS1kZWxpdmVyZWQg4oCUIGFuZFxuICAgKiBzbyBjaGFpbmVkIOKAlCBsYXRlciwgYnV0IGBvY2N1cnJlZEF0YCBwcmVzZXJ2ZXMgd2hlbiBpdCByZWFsbHkgaGFwcGVuZWQuXG4gICAqL1xuICBvY2N1cnJlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlIHBlci1lbWlzc2lvbiBkZWR1cCBrZXkgKGFsc28gc2VudCBhcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyIHRoZVxuICAgKiBwbGF0Zm9ybSBpbmdlc3QgZGVkdXBzIG9uKS4gU3RhbXBlZCBieSBgcmVjb3JkKClgIGFuZCBjYXJyaWVkIG9uIHRoZSBzcG9vbGVkXG4gICAqIGNvcHkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBsYXRlciByZS1kZWxpdmVyeSBjb2xsYXBzZSB0byBPTkUgc3RvcmVkIHJvdy5cbiAgICovXG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uIFdoZW4gYSB7QGxpbmsgQXVkaXRTcG9vbH0gaXMgY29uZmlndXJlZCwgYW4gZW1pc3Npb24gdGhhdFxuICAgKiBleGhhdXN0cyBpdHMgbGl2ZSByZXRyaWVzIGlzIGJ1ZmZlcmVkIGFuZCByZS1kZWxpdmVyZWQgbGF0ZXIgaW5zdGVhZCBvZlxuICAgKiBiZWluZyBkcm9wcGVkLlxuICAgKi9cbiAgcmVjb3JkKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIGJhY2tncm91bmQgc3Bvb2wtZHJhaW4gdGltZXIgKGlmIGFueSkuIFNhZmUgdG8gY2FsbCByZXBlYXRlZGx5LiAqL1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgZHVyYWJsZSBidWZmZXIuIFdoZW4gc2V0LCBhbiBlbWlzc2lvbiB0aGF0IGV4aGF1c3RzIGl0cyBsaXZlIHJldHJ5XG4gICAqIGJ1ZGdldCAoc3VzdGFpbmVkIHBsYXRmb3JtIG91dGFnZSkgaXMgc3Bvb2xlZCBhbmQgcmUtZGVsaXZlcmVkIOKAlCBvbiB0aGUgbmV4dFxuICAgKiBzdWNjZXNzZnVsIGVtaXNzaW9uIGFuZCBvbiBhIHBlcmlvZGljIHRpbWVyIOKAlCBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAqL1xuICBzcG9vbD86IEF1ZGl0U3Bvb2w7XG4gIC8qKiBTcG9vbC1kcmFpbiBpbnRlcnZhbCBtcyAoZGVmYXVsdCAzMF8wMDApLiBPbmx5IHVzZWQgd2hlbiBgc3Bvb2xgIGlzIHNldC4gKi9cbiAgZHJhaW5JbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZHJhaW5lZCBwZXIgc3dlZXAgKGRlZmF1bHQgMTAwKS4gKi9cbiAgZHJhaW5CYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcmVtb3RlLWF1ZGl0IGNsaWVudCB0YXJnZXRlZCBhdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBVc2VkIGJ5IGFwaS9wbHVnaW4ncyBidWlsZCB3b3JrZXIgdG8gcHVzaCBgcGx1Z2luLmJ1aWxkLipgIGV2ZW50cyBpbnRvXG4gKiB0aGUgcGxhdGZvcm0ncyBNb25nb0RCIGBhdWRpdF9ldmVudHNgIGNvbGxlY3Rpb24uIE90aGVyIHNlcnZpY2VzXG4gKiB3aXRoIHdvcmtlci1zdHlsZSBlbWl0dGVycyBjYW4gdXNlIHRoZSBzYW1lIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCgpO1xuICogYXVkaXRDbGllbnQucmVjb3JkKHtcbiAqIGFjdGlvbjogJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnLFxuICogYWN0b3JJZDogJ3VzZXItMTIzJyxcbiAqIG9yZ0lkOiAnb3JnLWFjbWUnLFxuICogdGFyZ2V0VHlwZTogJ3BsdWdpbicsXG4gKiB0YXJnZXRJZDogJ3BsdWdpbi1hYmMnLFxuICogZGV0YWlsczogeyBuYW1lOiAnbXktcGx1Z2luJywgdmVyc2lvbjogJzEuMC4wJyB9LFxuICogfSwgJ3BsdWdpbicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdENsaWVudChjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBSZW1vdGVBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpLmhvc3QsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpLnBvcnQsXG4gICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gMzAwMCxcbiAgfTtcbiAgLy8gSXRzIG93biBicmVha2VyIHJvdXRlIGNsYXNzOiBhdWRpdCBpbmdlc3QgZmFpbGluZyAoNXh4IHdoaWxlIHBsYXRmb3JtJ3NcbiAgLy8gYXVkaXQgc3RvcmUgaXMgZGVncmFkZWQpIG11c3Qgbm90IG9wZW4gdGhlIGJyZWFrZXIgdGhhdCBwbGF0Zm9ybSdzIEpXS1MgYW5kXG4gIC8vIGtleS1leGNoYW5nZSBjYWxscyByaWRlIG9uIOKAlCB0aGF0IHdvdWxkIHR1cm4gYW4gYXVkaXQgYnJvd25vdXQgaW50byBhbiBhdXRoXG4gIC8vIG91dGFnZSBpbiBldmVyeSBzZXJ2aWNlLlxuICBjb25zdCBjbGllbnQgPSBjcmVhdGVTYWZlQ2xpZW50KHNlcnZpY2VDb25maWcsIHsgYnJlYWtlckNsYXNzOiAnYXVkaXQnIH0pO1xuICBjb25zdCBzcG9vbCA9IGNvbmZpZy5zcG9vbDtcbiAgY29uc3QgZHJhaW5CYXRjaFNpemUgPSBjb25maWcuZHJhaW5CYXRjaFNpemUgPz8gMTAwO1xuXG4gIC8qKlxuICAgKiBBdHRlbXB0IE9ORSBsaXZlIGRlbGl2ZXJ5LiBSZXNvbHZlcyBgdHJ1ZWAgb24gYSAyeHggYWNjZXB0LCBgZmFsc2VgIG9uIGFueVxuICAgKiBub24tMnh4IC8gdGhyb3duIGVycm9yICh0aGUgaHR0cC1jbGllbnQgaGFzIGFscmVhZHkgYXBwbGllZCB0aGUgcmV0cnlcbiAgICogYnVkZ2V0KS4gQSBzdGFibGUgcGVyLWVtaXNzaW9uIGBJZGVtcG90ZW5jeS1LZXlgIG1ha2VzIHRoaXMgbm9uLWlkZW1wb3RlbnRcbiAgICogUE9TVCByZXRyeS1zYWZlIGFuZCBsZXRzIHRoZSBwbGF0Zm9ybSBpbmdlc3QgZGVkdXAgYSByZS1kZWxpdmVyZWQgZXZlbnRcbiAgICogaW5zdGVhZCBvZiB3cml0aW5nIGEgZHVwbGljYXRlIGF1ZGl0IHJvdyAoYW5kIGR1cGxpY2F0ZSBjaGFpbiBsaW5rKS5cbiAgICogYElkZW1wb3RlbmN5LUtleWAgaXMgZGVyaXZlZCBmcm9tIHRoZSBldmVudCBzbyBhIFNQT09MRUQgcmUtZGVsaXZlcnkgcmV1c2VzXG4gICAqIHRoZSBzYW1lIGtleSBhcyBpdHMgb3JpZ2luYWwgbGl2ZSBhdHRlbXB0IOKAlCB0aGUgdHdvIGNvbGxhcHNlIHRvIG9uZSByb3cuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBkZWxpdmVyKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE1pbnRpbmcgdGhlIHRva2VuIGlzIElOU0lERSB0aGUgdHJ5IG9uIHB1cnBvc2UuIEl0IGNhbiB0aHJvdyDigJQgdGhlXG4gICAgICAvLyBzaWduaW5nIGtleSB1bnJlYWRhYmxlLCBub3QgYW4gRUMgUC0yNTYga2V5LCBvciBgU0VSVklDRV9OQU1FYCBub3RcbiAgICAgIC8vIG1hdGNoaW5nIHRoaXMgY2xpZW50J3MgbmFtZS4gT3V0c2lkZSB0aGUgYHRyeWAsIGBkZWxpdmVyYCB3b3VsZCByZWplY3RcbiAgICAgIC8vIGluc3RlYWQgb2YgcmVzb2x2aW5nIGBmYWxzZWA7IGByZWNvcmRgIGZpcmVzIGl0IHdpdGggYSBiYXJlIGAudGhlbmAsIHNvXG4gICAgICAvLyB0aGUgcmVqZWN0aW9uIHdvdWxkIGdvIHVuaGFuZGxlZCBhbmQgY3Jhc2gtbG9vcCB0aGUgcG9kIG9uIGl0cyBmaXJzdFxuICAgICAgLy8gYXVkaXRlZCB3cml0ZS4gSW5zaWRlLCBhIGtleSBwcm9ibGVtIGlzIGp1c3QgYW4gdW5kZWxpdmVyYWJsZSBldmVudDpcbiAgICAgIC8vIHNwb29sZWQsIG9yIGRyb3BwZWQgYW5kIG1ldGVyZWQuXG4gICAgICBjb25zdCBhdXRoSGVhZGVyID0gZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgb3JnSWQ6IGV2ZW50Lm9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYXV0aEhlYWRlcixcbiAgICAgICAgJ0lkZW1wb3RlbmN5LUtleSc6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KCcvYXVkaXQvZXZlbnRzJywgZXZlbnQsIHsgaGVhZGVycywgLi4uQVVESVRfUkVRVUVTVF9PUFRJT05TIH0pO1xuICAgICAgY29uc3Qgb2sgPSAhIXJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDA7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IG5vbi1vaycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3QgdGhyZXcnLCB7IGFjdGlvbjogZXZlbnQuYWN0aW9uLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VyaWFsaXplIHNwb29sIGRyYWlucyBzbyBhIHBlcmlvZGljIHRpY2sgYW5kIGFuIG9uLXN1Y2Nlc3MgZHJhaW4gY2FuJ3QgYm90aFxuICAvLyBwdWxsIHRoZSBzYW1lIGJhdGNoLiBTdG9wcyBlYXJseSB0aGUgbW9tZW50IGEgcmUtZGVsaXZlcnkgZmFpbHMgKHBsYXRmb3JtXG4gIC8vIHN0aWxsIGRvd24pIHNvIHdlIGRvbid0IGhhbW1lciBpdCBvciBjaHVybiB0aGUgYnVmZmVyLlxuICBsZXQgZHJhaW5pbmcgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gZHJhaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzcG9vbCB8fCBkcmFpbmluZykgcmV0dXJuO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGF3YWl0IHNwb29sLnRha2UoZHJhaW5CYXRjaFNpemUpO1xuICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGRlbGl2ZXJlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3QgZmFpbGVkOiBBdWRpdFNwb29sRW50cnlbXSA9IFtdO1xuICAgICAgICBsZXQgcGxhdGZvcm1Eb3duID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYmF0Y2gpIHtcbiAgICAgICAgICBpZiAocGxhdGZvcm1Eb3duKSB7IGZhaWxlZC5wdXNoKGVudHJ5KTsgY29udGludWU7IH1cbiAgICAgICAgICBjb25zdCBvayA9IGF3YWl0IGRlbGl2ZXIoZW50cnkuZXZlbnQsIGVudHJ5LnNlcnZpY2VOYW1lKTtcbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIGRlbGl2ZXJlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWRlbGl2ZXJlZF90b3RhbCcsIHsgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsYXRmb3JtRG93biA9IHRydWU7XG4gICAgICAgICAgICBmYWlsZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFja25vd2xlZGdlIHRoZSBkZWxpdmVyZWQgcHJlZml4IHNvIGl0IGNsZWFycyB0aGUgaW4tcHJvZ3Jlc3MgbGlzdDsgdGhlXG4gICAgICAgIC8vIHJlbGlhYmxlIHRha2UoKSBtb3ZlZCB0aGUgd2hvbGUgYmF0Y2ggdGhlcmUsIHNvIHVuYWNrZWQgc3Vydml2b3JzIGFyZVxuICAgICAgICAvLyByZWNsYWltZWQgYnkgcmVjb3ZlcigpIGFmdGVyIGEgY3Jhc2ggcmF0aGVyIHRoYW4gYmVpbmcgc2lsZW50bHkgbG9zdC5cbiAgICAgICAgaWYgKGRlbGl2ZXJlZC5sZW5ndGggPiAwKSBhd2FpdCBzcG9vbC5hY2soZGVsaXZlcmVkKTtcbiAgICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgc3Bvb2wucmVxdWV1ZShmYWlsZWQpO1xuICAgICAgICAgIHJldHVybjsgLy8gc3RpbGwgZG93biDigJQgdHJ5IGFnYWluIG9uIHRoZSBuZXh0IHRpY2tcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIGRyYWluIGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGxldCBkcmFpblRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gIGlmIChzcG9vbCkge1xuICAgIC8vIFJlY2xhaW0gYW55IGJhdGNoIHN0cmFuZGVkIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IGJ5IGEgcHJpb3IgY3Jhc2gsIHRoZW5cbiAgICAvLyBhdHRlbXB0IHRvIGZsdXNoIGl0LiBCb3RoIGFyZSBiZXN0LWVmZm9ydCAodGhlIHNwb29sIHN3YWxsb3dzIGl0cyBlcnJvcnMpLlxuICAgIHZvaWQgc3Bvb2wucmVjb3ZlcigpLnRoZW4oKCkgPT4gZHJhaW4oKSk7XG4gICAgLy8gRXZlcnkgdGljazogaGVhcnRiZWF0IChzbyBwZWVycyBuZXZlciByZWNsYWltIGEgYmF0Y2ggdGhpcyBwb2QgaXMgc3RpbGxcbiAgICAvLyBkZWxpdmVyaW5nIOKAlCBldmVuIG1pZC1kcmFpbiksIHJlY2xhaW0gYmF0Y2hlcyBvZiBwb2RzIHRoYXQgZGllZCwgZHJhaW4uXG4gICAgZHJhaW5UaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHZvaWQgc3Bvb2wuaGVhcnRiZWF0KCkudGhlbigoKSA9PiBzcG9vbC5yZWNvdmVyKCkpLnRoZW4oKCkgPT4gZHJhaW4oKSk7XG4gICAgfSwgY29uZmlnLmRyYWluSW50ZXJ2YWxNcyA/PyAzMF8wMDApO1xuICAgIC8vIERvbid0IGxldCB0aGUgZHJhaW4gdGltZXIga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZSBvbiBzaHV0ZG93bi5cbiAgICAoZHJhaW5UaW1lciBhcyB1bmtub3duIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSkge1xuICAgICAgLy8gU3RhbXAgd2hlbiB0aGUgYWN0aW9uIGFjdHVhbGx5IG9jY3VycmVkIChzdXJ2aXZlcyBzcG9vbCBkZWxheSkgYW5kIHBpbiBhXG4gICAgICAvLyBzdGFibGUgaWRlbXBvdGVuY3kga2V5IHNvIGEgbGl2ZSBhdHRlbXB0IGFuZCBpdHMgc3Bvb2xlZCByZXRyeSBkZWR1cC5cbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFJlbW90ZUF1ZGl0RXZlbnQgPSB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBvY2N1cnJlZEF0OiBldmVudC5vY2N1cnJlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICB2b2lkIGRlbGl2ZXIoc3RhbXBlZCwgc2VydmljZU5hbWUpLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9lbWl0dGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSwgb3V0Y29tZTogc3RhbXBlZC5vdXRjb21lID8/ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICBpZiAoc3Bvb2wpIHZvaWQgZHJhaW4oKTsgLy8gcGxhdGZvcm0gaXMgcmVhY2hhYmxlIOKAlCBmbHVzaCBhbnkgYmFja2xvZ1xuICAgICAgICB9IGVsc2UgaWYgKHNwb29sKSB7XG4gICAgICAgICAgdm9pZCBzcG9vbC5lbnF1ZXVlKHsgZXZlbnQ6IHN0YW1wZWQsIHNlcnZpY2VOYW1lIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAvLyBCZWx0IGFuZCBicmFjZXMuIGBkZWxpdmVyYCBuZXZlciByZWplY3RzLCBidXQgYW55dGhpbmcgdGhhdCB0aHJvd3NcbiAgICAgICAgLy8gaW4gdGhlIGNvbnRpbnVhdGlvbiB3b3VsZCBvdGhlcndpc2UgYmVjb21lIGFuIHVuaGFuZGxlZCByZWplY3Rpb24g4oCUXG4gICAgICAgIC8vIGFuZCBpbiB0aGlzIHByb2Nlc3MgdGhhdCBpcyBhIGNyYXNoLCBub3QgYSBsb2cgbGluZS4gQW4gYXVkaXQgZXZlbnRcbiAgICAgICAgLy8gbXVzdCBuZXZlciB0YWtlIHRoZSBzZXJ2aWNlIGRvd24uXG4gICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdSZW1vdGUgYXVkaXQgcmVjb3JkIGZhaWxlZCB1bmV4cGVjdGVkbHknLCB7IGFjdGlvbjogc3RhbXBlZC5hY3Rpb24sIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICBpZiAoZHJhaW5UaW1lcikgeyBjbGVhckludGVydmFsKGRyYWluVGltZXIpOyBkcmFpblRpbWVyID0gdW5kZWZpbmVkOyB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgc3RhbmRhcmQgYGF1dGh6LmRlbmllZGAgc2luayB1c2VkIGJ5IGV2ZXJ5IHJlbW90ZS1hdWRpdCBzZXJ2aWNlXG4gKiAocGlwZWxpbmUsIHBsdWdpbiwgY29tcGxpYW5jZSwgcXVvdGEsIG1lc3NhZ2UsIGJpbGxpbmcsIHJlcG9ydGluZywg4oCmKS5cbiAqXG4gKiBUaGUgc2hhcmVkIGByZXF1aXJlQXV0aGAgZ2F0ZSBmb3J3YXJkcyBlYWNoIERFTklFRCBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0IHRvXG4gKiB0aGUgYXVkaXRvciBzZXQgdmlhIHtAbGluayBzZXRBdXRoekRlbmlhbEF1ZGl0b3J9OyB0aGlzIHdpcmVzIHRoYXQgaG9vayB0byB0aGVcbiAqIHNlcnZpY2UncyB7QGxpbmsgUmVtb3RlQXVkaXRDbGllbnR9LCBmb3J3YXJkaW5nIGEgYGZhaWx1cmVgLW91dGNvbWVcbiAqIGBhdXRoei5kZW5pZWRgIGV2ZW50IHNvIHByb2JpbmcgLyBwcml2aWxlZ2UtZXNjYWxhdGlvbiBhdHRlbXB0cyBsZWF2ZSBhIHRyYWlsLlxuICogRW1pc3Npb24gaXMgZmlyZS1hbmQtZm9yZ2V0ICh0aGUgY2xpZW50IG5ldmVyIHRocm93cykuIGBnZXRDbGllbnRgIGlzIGEgZ2V0dGVyXG4gKiBzbyB0aGUgY2xpZW50IHN0YXlzIGxhemlseSBjb25zdHJ1Y3RlZCAoc2VydmljZXMgbWVtb2l6ZSBpdCBvbiBmaXJzdCB1c2UpLlxuICpcbiAqIFBsYXRmb3JtIGlzIGludGVudGlvbmFsbHkgTk9UIGEgY2FsbGVyIOKAlCBpdCBpcyB0aGUgYXVkaXQgYXV0aG9yaXR5IGFuZCB3cml0ZXNcbiAqIGBhdXRoei5kZW5pZWRgIHN0cmFpZ2h0IHRvIGl0cyBsb2NhbCBzdG9yZSAod2l0aCBgYWZmZWN0ZWRPcmdJZGApLCBub3QgdGhyb3VnaFxuICogYSBSZW1vdGVBdWRpdENsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWU6IHN0cmluZywgZ2V0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudCk6IHZvaWQge1xuICBzZXRBdXRoekRlbmlhbEF1ZGl0b3IoKGluZm86IEF1dGh6RGVuaWFsSW5mbykgPT4gZ2V0Q2xpZW50KCkucmVjb3JkKHtcbiAgICBhY3Rpb246ICdhdXRoei5kZW5pZWQnLFxuICAgIGFjdG9ySWQ6IGluZm8uYWN0b3JJZCA/PyAnYW5vbnltb3VzJyxcbiAgICBhY3RvckVtYWlsOiBpbmZvLmFjdG9yRW1haWwsXG4gICAgb3JnSWQ6IGluZm8ub3JnSWQsXG4gICAgb3V0Y29tZTogJ2ZhaWx1cmUnLFxuICAgIGRldGFpbHM6IHsgbWV0aG9kOiBpbmZvLm1ldGhvZCwgcGF0aDogaW5mby5wYXRoLCByZXF1aXJlZDogaW5mby5yZXF1aXJlZCB9LFxuICB9LCBzZXJ2aWNlTmFtZSkpO1xufVxuXG4vKipcbiAqIFRoZSBwcm9jZXNzLXdpZGUgcmVtb3RlLWF1ZGl0IGJpbmRpbmc6IHdoaWNoIHNlcnZpY2UgdGhpcyBwcm9jZXNzIGlzLCBhbmQgdGhlXG4gKiAobGF6aWx5IGJ1aWx0KSBjbGllbnQgaXRzIGV2ZW50cyBnbyB0aHJvdWdoLiBCb3VuZCBPTkNFIGF0IGJvb3QgYnlcbiAqIGB3aXJlU2VydmljZVNlY3VyaXR5KHNlcnZpY2VOYW1lKWAg4oCUIGV2ZXJ5IHN0YXRlbGVzcyBzZXJ2aWNlIGNhbGxzIGl0IOKAlCBzbyB0aGVcbiAqIHNlcnZpY2UgaWRlbnRpdHkgaXMgbmV2ZXIgcmVwZWF0ZWQgYXQgYSBjYWxsIHNpdGUgYW5kIGNhbiBuZXZlciBkcmlmdC5cbiAqL1xuaW50ZXJmYWNlIEF1ZGl0QmluZGluZyB7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQgfCBudWxsO1xufVxuXG5sZXQgYXVkaXRCaW5kaW5nOiBBdWRpdEJpbmRpbmcgfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBCaW5kIHRoaXMgcHJvY2VzcydzIHNlcnZpY2UgaWRlbnRpdHkgZm9yIHtAbGluayByZWNvcmRBdWRpdH0uIENhbGxlZCBieVxuICogYHdpcmVTZXJ2aWNlU2VjdXJpdHlgOyB0ZXN0cyBnbyB0aHJvdWdoIGBiaW5kVGVzdEF1ZGl0U2VydmljZWBcbiAqIChgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUvdGVzdGluZ2ApLCB3aGljaCBwYXNzZXMgYSBzcHkgYGNsaWVudGAuXG4gKlxuICogV2l0aG91dCBgY2xpZW50YCwgdGhlIHJlYWwgb25lIGlzIGJ1aWx0IGxhemlseSBvbiBmaXJzdCBlbWlzc2lvbjogYVxuICogUmVtb3RlQXVkaXRDbGllbnQgd2lyZWQgdG8gdGhlIGR1cmFibGUgZW52LVJlZGlzIHNwb29sIChudWxsIOKGkiBubyBzcG9vbCkuXG4gKiBMYXp5IG9uIHB1cnBvc2Ug4oCUIGJ1aWxkaW5nIGl0IGF0IGJvb3Qgd291bGQgZm9yY2UgdGhlIHNwb29sJ3MgUmVkaXMgY29ubmVjdGlvblxuICogd2hlcmV2ZXIgdGhlIHNlcnZpY2UgbW9kdWxlIGlzIG1lcmVseSBpbXBvcnRlZC4gUmViaW5kaW5nIGNsb3NlcyB0aGUgcHJldmlvdXNcbiAqIGNsaWVudCdzIHNwb29sLWRyYWluIHRpbWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEF1ZGl0U2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nLCBjbGllbnQ/OiBSZW1vdGVBdWRpdENsaWVudCk6IHZvaWQge1xuICBhdWRpdEJpbmRpbmc/LmNsaWVudD8uY2xvc2UoKTtcbiAgYXVkaXRCaW5kaW5nID0geyBzZXJ2aWNlTmFtZSwgY2xpZW50OiBjbGllbnQgPz8gbnVsbCB9O1xufVxuXG4vKiogRHJvcCB0aGUgYmluZGluZyAodGVzdHMgb25seSDigJQgcmV0dXJucyB0aGUgcHJvY2VzcyB0byB0aGUgdW5ib3VuZCBzdGF0ZSkuICovXG5leHBvcnQgZnVuY3Rpb24gdW5iaW5kQXVkaXRTZXJ2aWNlKCk6IHZvaWQge1xuICBhdWRpdEJpbmRpbmc/LmNsaWVudD8uY2xvc2UoKTtcbiAgYXVkaXRCaW5kaW5nID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gYm91bmRBdWRpdCgpOiBBdWRpdEJpbmRpbmcgJiB7IGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQgfSB7XG4gIGlmICghYXVkaXRCaW5kaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhdWRpdCBub3QgaW5pdGlhbGlzZWQ6IGNhbGwgd2lyZVNlcnZpY2VTZWN1cml0eShzZXJ2aWNlTmFtZSkgYXQgYm9vdCBiZWZvcmUgcmVjb3JkQXVkaXQoKScpO1xuICB9XG4gIGF1ZGl0QmluZGluZy5jbGllbnQgPz89IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHtcbiAgICBzcG9vbDogY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKHsga2V5OiBhdWRpdFNwb29sS2V5KGF1ZGl0QmluZGluZy5zZXJ2aWNlTmFtZSkgfSkgPz8gdW5kZWZpbmVkLFxuICB9KTtcbiAgcmV0dXJuIGF1ZGl0QmluZGluZyBhcyBBdWRpdEJpbmRpbmcgJiB7IGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQgfTtcbn1cblxuLyoqXG4gKiBUaGUgYm91bmQgc2VydmljZSdzIFJlbW90ZUF1ZGl0Q2xpZW50LiBUaHJvd3MgXCJhdWRpdCBub3QgaW5pdGlhbGlzZWRcIiBiZWZvcmVcbiAqIGB3aXJlU2VydmljZVNlY3VyaXR5YCBoYXMgcnVuLiBJbnRlcm5hbDogY2FsbGVycyBlbWl0IHRocm91Z2hcbiAqIHtAbGluayByZWNvcmRBdWRpdH07IGB3aXJlU2VydmljZVNlY3VyaXR5YCBoYW5kcyB0aGlzIGdldHRlciB0byB0aGVcbiAqIGBhdXRoei5kZW5pZWRgIHNpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb3VuZEF1ZGl0Q2xpZW50KCk6IFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgcmV0dXJuIGJvdW5kQXVkaXQoKS5jbGllbnQ7XG59XG5cbi8qKlxuICogUmVjb3JkIGFuIGV2ZW50IGluIHRoZSBkdXJhYmxlLCBoYXNoLWNoYWluZWQgY2VudHJhbCBhdWRpdCB0cmFpbCAocGxhdGZvcm0nc1xuICogYFBPU1QgL2F1ZGl0L2V2ZW50c2AgaW5nZXN0KSwgYXR0cmlidXRlZCB0byB0aGUgc2VydmljZSBib3VuZCBhdCBib290LlxuICpcbiAqIEZJUkUtQU5ELUZPUkdFVDogZGVsaXZlcnkgbmV2ZXIgYmxvY2tzIG9yIHRocm93cyDigJQgZW1pdCBvbmx5IEFGVEVSIHRoZVxuICogbXV0YXRpb24gc3VjY2VlZHMsIGFuZCBrZWVwIGBkZXRhaWxzYCBmcmVlIG9mIHNlY3JldHMvdG9rZW5zLCBQSUkgYW5kIEFXU1xuICogYWNjb3VudCBpZHMuIFRoZSBPTkUgdGhpbmcgdGhhdCB0aHJvd3MgaXMgY2FsbGluZyBpdCBiZWZvcmVcbiAqIGB3aXJlU2VydmljZVNlY3VyaXR5KHNlcnZpY2VOYW1lKWAgaGFzIGJvdW5kIHRoZSBzZXJ2aWNlOiB0aGF0IGlzIGEgd2lyaW5nXG4gKiBidWcsIGFuZCBmYWlsaW5nIGxvdWRseSBiZWF0cyBzaWxlbnRseSBhdHRyaWJ1dGluZyB0aGUgZXZlbnQgdG8gbm9ib2R5LlxuICpcbiAqIChUaGUgd2luc3Rvbi9Mb2tpIGxvZyBsaW5lIGlzIGEgZGlmZmVyZW50IHNpbms6IGBsb2dBdWRpdEV2ZW50YC4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBdWRpdChldmVudDogUmVtb3RlQXVkaXRFdmVudCk6IHZvaWQge1xuICBjb25zdCB7IGNsaWVudCwgc2VydmljZU5hbWUgfSA9IGJvdW5kQXVkaXQoKTtcbiAgY2xpZW50LnJlY29yZChldmVudCwgc2VydmljZU5hbWUpO1xufVxuIl19
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWF1ZGl0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9yZW1vdGUtYXVkaXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsYUFBYSxFQUFFLHdCQUF3QixFQUF5QyxNQUFNLGtCQUFrQixDQUFDO0FBQ2xILE9BQU8sRUFBRSxnQkFBZ0IsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQXdCLE1BQU0sbUNBQW1DLENBQUM7QUFDaEcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkUsT0FBTyxFQUEwQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFNUM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLHFCQUFxQixHQUErRDtJQUN4RixtQkFBbUIsRUFBRSxDQUFDO0lBQ3RCLFVBQVUsRUFBRSxDQUFDO0NBQ2QsQ0FBQztBQTBFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxNQUFNLEdBQTRCLEVBQUU7SUFDMUUsTUFBTSxhQUFhLEdBQWtCO1FBQ25DLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FB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QyxLQUF1QjtJQUNqRCxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBhdWRpdFNwb29sS2V5LCBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wsIHR5cGUgQXVkaXRTcG9vbCwgdHlwZSBBdWRpdFNwb29sRW50cnkgfSBmcm9tICcuL2F1ZGl0LXNwb29sLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNhZmVDbGllbnQsIHR5cGUgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IHNldEF1dGh6RGVuaWFsQXVkaXRvciwgdHlwZSBBdXRoekRlbmlhbEluZm8gfSBmcm9tICcuLi9taWRkbGV3YXJlL3Blcm1pc3Npb24tZ2F0ZXMuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIgfSBmcm9tICcuLi9taWRkbGV3YXJlL3NlcnZpY2UtdG9rZW5zLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlbW90ZUF1ZGl0QWN0aW9uIH0gZnJvbSAnLi4vdHlwZXMvcmVtb3RlLWF1ZGl0LWFjdGlvbnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcigncmVtb3RlLWF1ZGl0Jyk7XG5cbi8qKlxuICogQXVkaXQgaW5nZXN0IGlzIGJlc3QtZWZmb3J0IGFuZCBNVVNUIE5PVCBibG9jayB0aGUgY2FsbGVyLCBidXQgYSB0cmFuc2llbnRcbiAqIGZhaWx1cmUgKDQyOSAvIDV4eCAvIGNvbm5lY3Rpb24gcmVzZXQgLyB0aW1lb3V0KSBzaG91bGQgbm90IHNpbGVudGx5IGRyb3AgdGhlXG4gKiByb3cgb24gdGhlIGZpcnN0IGF0dGVtcHQuIEVhY2ggZW1pc3Npb24gY2FycmllcyBhIHN0YWJsZSBwZXItZXZlbnRcbiAqIGBJZGVtcG90ZW5jeS1LZXlgIChzZWUgYHJlY29yZGApLCBzbyB0aGUgaHR0cC1jbGllbnQgdHJlYXRzIHRoZSBQT1NUIGFzXG4gKiByZXRyeS1zYWZlIGFuZCB0aGUgcGxhdGZvcm0gY2FuIGRlZHVwIGEgcmV0cmllZCBkZWxpdmVyeSBpbnN0ZWFkIG9mIHdyaXRpbmcgYVxuICogZHVwbGljYXRlIHJvdy4gQnVkZ2V0IGlzIGtlcHQgc21hbGwgc28gYSBoYXJkLWRvd24gcGxhdGZvcm0gY2FuJ3QgYmFjayB0aGVcbiAqIHdvcmtlciB1cCBmb3IgbG9uZzogYmFzZSBkZWxheSDDlygyIHJldHJpZXMpICsgYSBjb3VwbGUgb2YgNDI5IGJhY2tvZmZzLlxuICovXG5jb25zdCBBVURJVF9SRVFVRVNUX09QVElPTlM6IFBpY2s8UmVxdWVzdE9wdGlvbnMsICdtYXhSYXRlTGltaXRSZXRyaWVzJyB8ICdtYXhSZXRyaWVzJz4gPSB7XG4gIG1heFJhdGVMaW1pdFJldHJpZXM6IDIsXG4gIG1heFJldHJpZXM6IDIsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0RXZlbnQge1xuICBhY3Rpb246IFJlbW90ZUF1ZGl0QWN0aW9uO1xuICBhY3RvcklkOiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIG9yZ0lkPzogc3RyaW5nO1xuICBhZmZlY3RlZE9yZ0lkPzogc3RyaW5nO1xuICB0YXJnZXRUeXBlPzogc3RyaW5nO1xuICB0YXJnZXRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpZCB0aGUgYXVkaXRlZCBhY3Rpb24gc3VjY2VlZCBvciBmYWlsPyBEZWZhdWx0cyB0byAnc3VjY2Vzcycgd2hlbiBvbWl0dGVkXG4gICAqICh0aGUgcGxhdGZvcm0gaW5nZXN0IGFwcGxpZXMgdGhlIHNhbWUgZGVmYXVsdCkuIERlbmllZC1hdXRoeiBldmVudHMgc2V0XG4gICAqICdmYWlsdXJlJyBzbyBhIHJldmlld2VyIGNhbiBmaWx0ZXIgYXR0ZW1wdHMgZnJvbSBjb21wbGV0ZWQgYWN0aW9ucy5cbiAgICovXG4gIG91dGNvbWU/OiAnc3VjY2VzcycgfCAnZmFpbHVyZSc7XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBhdWRpdGVkIGFjdGlvbiBhY3R1YWxseSBPQ0NVUlJFRCAoSVNPLTg2MDEpLCBzdGFtcGVkIGF0IGVtaXNzaW9uLlxuICAgKiBUaGUgcGxhdGZvcm0gc3RvcmVzIHRoaXMgZm9yIHJldmlld2VyczsgaXQgaXMgTk9UIHRoZSBjaGFpbi1vcmRlcmluZyBmaWVsZFxuICAgKiAodGhlIHRhbXBlci1ldmlkZW50IGNoYWluIG9yZGVycyBieSBpbmdlc3QvYGNyZWF0ZWRBdGApLiBJdCBtYXR0ZXJzIGZvclxuICAgKiBTUE9PTEVEIGV2ZW50czogb25lIGJ1ZmZlcmVkIGR1cmluZyBhIHBsYXRmb3JtIG91dGFnZSBpcyByZS1kZWxpdmVyZWQg4oCUIGFuZFxuICAgKiBzbyBjaGFpbmVkIOKAlCBsYXRlciwgYnV0IGBvY2N1cnJlZEF0YCBwcmVzZXJ2ZXMgd2hlbiBpdCByZWFsbHkgaGFwcGVuZWQuXG4gICAqL1xuICBvY2N1cnJlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlIHBlci1lbWlzc2lvbiBkZWR1cCBrZXkgKGFsc28gc2VudCBhcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyIHRoZVxuICAgKiBwbGF0Zm9ybSBpbmdlc3QgZGVkdXBzIG9uKS4gU3RhbXBlZCBieSBgcmVjb3JkKClgIGFuZCBjYXJyaWVkIG9uIHRoZSBzcG9vbGVkXG4gICAqIGNvcHkgc28gYSBsaXZlIGF0dGVtcHQgYW5kIGl0cyBsYXRlciByZS1kZWxpdmVyeSBjb2xsYXBzZSB0byBPTkUgc3RvcmVkIHJvdy5cbiAgICovXG4gIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nO1xuICBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ2xpZW50IGZvciBQT1NUaW5nIGF1ZGl0IGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBgL2F1ZGl0LWV2ZW50c2AgaW5nZXN0XG4gKiBlbmRwb2ludC4gTWludHMgYSBmcmVzaCBzZXJ2aWNlIHRva2VuIHBlciBjYWxsICg1IG1pbiBUVEwpICB0aGVyZSdzIG5vXG4gKiBtZWFuaW5nZnVsIGNhY2hpbmcgYmVuZWZpdCB3aGVuIGVtaXNzaW9ucyBhcmUgc3BhcnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgLyoqXG4gICAqIEZpcmUtYW5kLWZvcmdldCBhdWRpdCBlbWlzc2lvbi4gRmFpbHVyZXMgYXJlIGxvZ2dlZCBhdCB3YXJuIGxldmVsIGJ1dFxuICAgKiBuZXZlciB0aHJvd24gIHRoZSBvcmlnaW5hdGluZyBhY3Rpb24gKGUuZy4gYSBwbHVnaW4gYnVpbGQpIGhhcyBpdHNcbiAgICogb3duIHN1Y2Nlc3MvZmFpbHVyZSBwYXRoIHRoYXQgc2hvdWxkbid0IGdldCBwb2xsdXRlZCBieSBhIGZsYWt5IGF1ZGl0XG4gICAqIGRvd25zdHJlYW0uIFdoZW4gYSB7QGxpbmsgQXVkaXRTcG9vbH0gaXMgY29uZmlndXJlZCwgYW4gZW1pc3Npb24gdGhhdFxuICAgKiBleGhhdXN0cyBpdHMgbGl2ZSByZXRyaWVzIGlzIGJ1ZmZlcmVkIGFuZCByZS1kZWxpdmVyZWQgbGF0ZXIgaW5zdGVhZCBvZlxuICAgKiBiZWluZyBkcm9wcGVkLlxuICAgKi9cbiAgcmVjb3JkKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFN0b3AgdGhlIGJhY2tncm91bmQgc3Bvb2wtZHJhaW4gdGltZXIgKGlmIGFueSkuIFNhZmUgdG8gY2FsbCByZXBlYXRlZGx5LiAqL1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSByZW1vdGUgYXVkaXQgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnIHtcbiAgLyoqIFBsYXRmb3JtIHNlcnZpY2UgaG9zdCAoZGVmYXVsdDogZW52IFBMQVRGT1JNX1NFUlZJQ0VfSE9TVCBvciAncGxhdGZvcm0nKSAqL1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gc2VydmljZSBwb3J0IChkZWZhdWx0OiBlbnYgUExBVEZPUk1fU0VSVklDRV9QT1JUIG9yIDMwMDApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMzAwMCAgYXVkaXQgc2hvdWxkbid0IGJsb2NrIHRoZSB3b3JrZXIpLiAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogT3B0aW9uYWwgZHVyYWJsZSBidWZmZXIuIFdoZW4gc2V0LCBhbiBlbWlzc2lvbiB0aGF0IGV4aGF1c3RzIGl0cyBsaXZlIHJldHJ5XG4gICAqIGJ1ZGdldCAoc3VzdGFpbmVkIHBsYXRmb3JtIG91dGFnZSkgaXMgc3Bvb2xlZCBhbmQgcmUtZGVsaXZlcmVkIOKAlCBvbiB0aGUgbmV4dFxuICAgKiBzdWNjZXNzZnVsIGVtaXNzaW9uIGFuZCBvbiBhIHBlcmlvZGljIHRpbWVyIOKAlCBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAqL1xuICBzcG9vbD86IEF1ZGl0U3Bvb2w7XG4gIC8qKiBTcG9vbC1kcmFpbiBpbnRlcnZhbCBtcyAoZGVmYXVsdCAzMF8wMDApLiBPbmx5IHVzZWQgd2hlbiBgc3Bvb2xgIGlzIHNldC4gKi9cbiAgZHJhaW5JbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZHJhaW5lZCBwZXIgc3dlZXAgKGRlZmF1bHQgMTAwKS4gKi9cbiAgZHJhaW5CYXRjaFNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcmVtb3RlLWF1ZGl0IGNsaWVudCB0YXJnZXRlZCBhdCB0aGUgcGxhdGZvcm0gc2VydmljZS5cbiAqXG4gKiBVc2VkIGJ5IGFwaS9wbHVnaW4ncyBidWlsZCB3b3JrZXIgdG8gcHVzaCBgcGx1Z2luLmJ1aWxkLipgIGV2ZW50cyBpbnRvXG4gKiB0aGUgcGxhdGZvcm0ncyBNb25nb0RCIGBhdWRpdF9ldmVudHNgIGNvbGxlY3Rpb24uIE90aGVyIHNlcnZpY2VzXG4gKiB3aXRoIHdvcmtlci1zdHlsZSBlbWl0dGVycyBjYW4gdXNlIHRoZSBzYW1lIGNsaWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCgpO1xuICogYXVkaXRDbGllbnQucmVjb3JkKHtcbiAqIGFjdGlvbjogJ3BsdWdpbi5idWlsZC5jb21wbGV0ZWQnLFxuICogYWN0b3JJZDogJ3VzZXItMTIzJyxcbiAqIG9yZ0lkOiAnb3JnLWFjbWUnLFxuICogdGFyZ2V0VHlwZTogJ3BsdWdpbicsXG4gKiB0YXJnZXRJZDogJ3BsdWdpbi1hYmMnLFxuICogZGV0YWlsczogeyBuYW1lOiAnbXktcGx1Z2luJywgdmVyc2lvbjogJzEuMC4wJyB9LFxuICogfSwgJ3BsdWdpbicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVBdWRpdENsaWVudChjb25maWc6IFJlbW90ZUF1ZGl0Q2xpZW50Q29uZmlnID0ge30pOiBSZW1vdGVBdWRpdENsaWVudCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpLmhvc3QsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpLnBvcnQsXG4gICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gMzAwMCxcbiAgfTtcbiAgLy8gSXRzIG93biBicmVha2VyIHJvdXRlIGNsYXNzOiBhdWRpdCBpbmdlc3QgZmFpbGluZyAoNXh4IHdoaWxlIHBsYXRmb3JtJ3NcbiAgLy8gYXVkaXQgc3RvcmUgaXMgZGVncmFkZWQpIG11c3Qgbm90IG9wZW4gdGhlIGJyZWFrZXIgdGhhdCBwbGF0Zm9ybSdzIEpXS1MgYW5kXG4gIC8vIGtleS1leGNoYW5nZSBjYWxscyByaWRlIG9uIOKAlCB0aGF0IHdvdWxkIHR1cm4gYW4gYXVkaXQgYnJvd25vdXQgaW50byBhbiBhdXRoXG4gIC8vIG91dGFnZSBpbiBldmVyeSBzZXJ2aWNlLlxuICBjb25zdCBjbGllbnQgPSBjcmVhdGVTYWZlQ2xpZW50KHNlcnZpY2VDb25maWcsIHsgYnJlYWtlckNsYXNzOiAnYXVkaXQnIH0pO1xuICBjb25zdCBzcG9vbCA9IGNvbmZpZy5zcG9vbDtcbiAgY29uc3QgZHJhaW5CYXRjaFNpemUgPSBjb25maWcuZHJhaW5CYXRjaFNpemUgPz8gMTAwO1xuXG4gIC8qKlxuICAgKiBBdHRlbXB0IE9ORSBsaXZlIGRlbGl2ZXJ5LiBSZXNvbHZlcyBgdHJ1ZWAgb24gYSAyeHggYWNjZXB0LCBgZmFsc2VgIG9uIGFueVxuICAgKiBub24tMnh4IC8gdGhyb3duIGVycm9yICh0aGUgaHR0cC1jbGllbnQgaGFzIGFscmVhZHkgYXBwbGllZCB0aGUgcmV0cnlcbiAgICogYnVkZ2V0KS4gQSBzdGFibGUgcGVyLWVtaXNzaW9uIGBJZGVtcG90ZW5jeS1LZXlgIG1ha2VzIHRoaXMgbm9uLWlkZW1wb3RlbnRcbiAgICogUE9TVCByZXRyeS1zYWZlIGFuZCBsZXRzIHRoZSBwbGF0Zm9ybSBpbmdlc3QgZGVkdXAgYSByZS1kZWxpdmVyZWQgZXZlbnRcbiAgICogaW5zdGVhZCBvZiB3cml0aW5nIGEgZHVwbGljYXRlIGF1ZGl0IHJvdyAoYW5kIGR1cGxpY2F0ZSBjaGFpbiBsaW5rKS5cbiAgICogYElkZW1wb3RlbmN5LUtleWAgaXMgZGVyaXZlZCBmcm9tIHRoZSBldmVudCBzbyBhIFNQT09MRUQgcmUtZGVsaXZlcnkgcmV1c2VzXG4gICAqIHRoZSBzYW1lIGtleSBhcyBpdHMgb3JpZ2luYWwgbGl2ZSBhdHRlbXB0IOKAlCB0aGUgdHdvIGNvbGxhcHNlIHRvIG9uZSByb3cuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBkZWxpdmVyKGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50LCBzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE1pbnRpbmcgdGhlIHRva2VuIGlzIElOU0lERSB0aGUgdHJ5IG9uIHB1cnBvc2UuIEl0IGNhbiB0aHJvdyDigJQgdGhlXG4gICAgICAvLyBzaWduaW5nIGtleSB1bnJlYWRhYmxlLCBub3QgYW4gRUMgUC0yNTYga2V5LCBvciBgU0VSVklDRV9OQU1FYCBub3RcbiAgICAgIC8vIG1hdGNoaW5nIHRoaXMgY2xpZW50J3MgbmFtZS4gT3V0c2lkZSB0aGUgYHRyeWAsIGBkZWxpdmVyYCB3b3VsZCByZWplY3RcbiAgICAgIC8vIGluc3RlYWQgb2YgcmVzb2x2aW5nIGBmYWxzZWA7IGByZWNvcmRgIGZpcmVzIGl0IHdpdGggYSBiYXJlIGAudGhlbmAsIHNvXG4gICAgICAvLyB0aGUgcmVqZWN0aW9uIHdvdWxkIGdvIHVuaGFuZGxlZCBhbmQgY3Jhc2gtbG9vcCB0aGUgcG9kIG9uIGl0cyBmaXJzdFxuICAgICAgLy8gYXVkaXRlZCB3cml0ZS4gSW5zaWRlLCBhIGtleSBwcm9ibGVtIGlzIGp1c3QgYW4gdW5kZWxpdmVyYWJsZSBldmVudDpcbiAgICAgIC8vIHNwb29sZWQsIG9yIGRyb3BwZWQgYW5kIG1ldGVyZWQuXG4gICAgICBjb25zdCBhdXRoSGVhZGVyID0gZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgb3JnSWQ6IGV2ZW50Lm9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KTtcbiAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogYXV0aEhlYWRlcixcbiAgICAgICAgJ0lkZW1wb3RlbmN5LUtleSc6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KCcvYXVkaXQvZXZlbnRzJywgZXZlbnQsIHsgaGVhZGVycywgLi4uQVVESVRfUkVRVUVTVF9PUFRJT05TIH0pO1xuICAgICAgY29uc3Qgb2sgPSAhIXJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDA7XG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdSZW1vdGUgYXVkaXQgaW5nZXN0IG5vbi1vaycsIHsgYWN0aW9uOiBldmVudC5hY3Rpb24sIHN0YXR1c0NvZGU6IHJlc3BvbnNlPy5zdGF0dXNDb2RlIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlbW90ZSBhdWRpdCBpbmdlc3QgdGhyZXcnLCB7IGFjdGlvbjogZXZlbnQuYWN0aW9uLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VyaWFsaXplIHNwb29sIGRyYWlucyBzbyBhIHBlcmlvZGljIHRpY2sgYW5kIGFuIG9uLXN1Y2Nlc3MgZHJhaW4gY2FuJ3QgYm90aFxuICAvLyBwdWxsIHRoZSBzYW1lIGJhdGNoLiBTdG9wcyBlYXJseSB0aGUgbW9tZW50IGEgcmUtZGVsaXZlcnkgZmFpbHMgKHBsYXRmb3JtXG4gIC8vIHN0aWxsIGRvd24pIHNvIHdlIGRvbid0IGhhbW1lciBpdCBvciBjaHVybiB0aGUgYnVmZmVyLlxuICBsZXQgZHJhaW5pbmcgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gZHJhaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzcG9vbCB8fCBkcmFpbmluZykgcmV0dXJuO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGF3YWl0IHNwb29sLnRha2UoZHJhaW5CYXRjaFNpemUpO1xuICAgICAgICBpZiAoYmF0Y2gubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGRlbGl2ZXJlZDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3QgZmFpbGVkOiBBdWRpdFNwb29sRW50cnlbXSA9IFtdO1xuICAgICAgICBsZXQgcGxhdGZvcm1Eb3duID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYmF0Y2gpIHtcbiAgICAgICAgICBpZiAocGxhdGZvcm1Eb3duKSB7IGZhaWxlZC5wdXNoKGVudHJ5KTsgY29udGludWU7IH1cbiAgICAgICAgICBjb25zdCBvayA9IGF3YWl0IGRlbGl2ZXIoZW50cnkuZXZlbnQsIGVudHJ5LnNlcnZpY2VOYW1lKTtcbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIGRlbGl2ZXJlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWRlbGl2ZXJlZF90b3RhbCcsIHsgc2VydmljZTogZW50cnkuc2VydmljZU5hbWUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsYXRmb3JtRG93biA9IHRydWU7XG4gICAgICAgICAgICBmYWlsZWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFja25vd2xlZGdlIHRoZSBkZWxpdmVyZWQgcHJlZml4IHNvIGl0IGNsZWFycyB0aGUgaW4tcHJvZ3Jlc3MgbGlzdDsgdGhlXG4gICAgICAgIC8vIHJlbGlhYmxlIHRha2UoKSBtb3ZlZCB0aGUgd2hvbGUgYmF0Y2ggdGhlcmUsIHNvIHVuYWNrZWQgc3Vydml2b3JzIGFyZVxuICAgICAgICAvLyByZWNsYWltZWQgYnkgcmVjb3ZlcigpIGFmdGVyIGEgY3Jhc2ggcmF0aGVyIHRoYW4gYmVpbmcgc2lsZW50bHkgbG9zdC5cbiAgICAgICAgaWYgKGRlbGl2ZXJlZC5sZW5ndGggPiAwKSBhd2FpdCBzcG9vbC5hY2soZGVsaXZlcmVkKTtcbiAgICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgc3Bvb2wucmVxdWV1ZShmYWlsZWQpO1xuICAgICAgICAgIHJldHVybjsgLy8gc3RpbGwgZG93biDigJQgdHJ5IGFnYWluIG9uIHRoZSBuZXh0IHRpY2tcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIGRyYWluIGZhaWxlZCcsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGxldCBkcmFpblRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gIGlmIChzcG9vbCkge1xuICAgIC8vIFJlY2xhaW0gYW55IGJhdGNoIHN0cmFuZGVkIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IGJ5IGEgcHJpb3IgY3Jhc2gsIHRoZW5cbiAgICAvLyBhdHRlbXB0IHRvIGZsdXNoIGl0LiBCb3RoIGFyZSBiZXN0LWVmZm9ydCAodGhlIHNwb29sIHN3YWxsb3dzIGl0cyBlcnJvcnMpLlxuICAgIHZvaWQgc3Bvb2wucmVjb3ZlcigpLnRoZW4oKCkgPT4gZHJhaW4oKSk7XG4gICAgLy8gRXZlcnkgdGljazogaGVhcnRiZWF0IChzbyBwZWVycyBuZXZlciByZWNsYWltIGEgYmF0Y2ggdGhpcyBwb2QgaXMgc3RpbGxcbiAgICAvLyBkZWxpdmVyaW5nIOKAlCBldmVuIG1pZC1kcmFpbiksIHJlY2xhaW0gYmF0Y2hlcyBvZiBwb2RzIHRoYXQgZGllZCwgZHJhaW4uXG4gICAgZHJhaW5UaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHZvaWQgc3Bvb2wuaGVhcnRiZWF0KCkudGhlbigoKSA9PiBzcG9vbC5yZWNvdmVyKCkpLnRoZW4oKCkgPT4gZHJhaW4oKSk7XG4gICAgfSwgY29uZmlnLmRyYWluSW50ZXJ2YWxNcyA/PyAzMF8wMDApO1xuICAgIC8vIERvbid0IGxldCB0aGUgZHJhaW4gdGltZXIga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZSBvbiBzaHV0ZG93bi5cbiAgICAoZHJhaW5UaW1lciBhcyB1bmtub3duIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVjb3JkKGV2ZW50LCBzZXJ2aWNlTmFtZSkge1xuICAgICAgLy8gU3RhbXAgd2hlbiB0aGUgYWN0aW9uIGFjdHVhbGx5IG9jY3VycmVkIChzdXJ2aXZlcyBzcG9vbCBkZWxheSkgYW5kIHBpbiBhXG4gICAgICAvLyBzdGFibGUgaWRlbXBvdGVuY3kga2V5IHNvIGEgbGl2ZSBhdHRlbXB0IGFuZCBpdHMgc3Bvb2xlZCByZXRyeSBkZWR1cC5cbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFJlbW90ZUF1ZGl0RXZlbnQgPSB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBvY2N1cnJlZEF0OiBldmVudC5vY2N1cnJlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGV2ZW50LmlkZW1wb3RlbmN5S2V5ID8/IHJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICB2b2lkIGRlbGl2ZXIoc3RhbXBlZCwgc2VydmljZU5hbWUpLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgIGlmIChvaykge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9lbWl0dGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSwgb3V0Y29tZTogc3RhbXBlZC5vdXRjb21lID8/ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICBpZiAoc3Bvb2wpIHZvaWQgZHJhaW4oKTsgLy8gcGxhdGZvcm0gaXMgcmVhY2hhYmxlIOKAlCBmbHVzaCBhbnkgYmFja2xvZ1xuICAgICAgICB9IGVsc2UgaWYgKHNwb29sKSB7XG4gICAgICAgICAgdm9pZCBzcG9vbC5lbnF1ZXVlKHsgZXZlbnQ6IHN0YW1wZWQsIHNlcnZpY2VOYW1lIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAvLyBCZWx0IGFuZCBicmFjZXMuIGBkZWxpdmVyYCBuZXZlciByZWplY3RzLCBidXQgYW55dGhpbmcgdGhhdCB0aHJvd3NcbiAgICAgICAgLy8gaW4gdGhlIGNvbnRpbnVhdGlvbiB3b3VsZCBvdGhlcndpc2UgYmVjb21lIGFuIHVuaGFuZGxlZCByZWplY3Rpb24g4oCUXG4gICAgICAgIC8vIGFuZCBpbiB0aGlzIHByb2Nlc3MgdGhhdCBpcyBhIGNyYXNoLCBub3QgYSBsb2cgbGluZS4gQW4gYXVkaXQgZXZlbnRcbiAgICAgICAgLy8gbXVzdCBuZXZlciB0YWtlIHRoZSBzZXJ2aWNlIGRvd24uXG4gICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdSZW1vdGUgYXVkaXQgcmVjb3JkIGZhaWxlZCB1bmV4cGVjdGVkbHknLCB7IGFjdGlvbjogc3RhbXBlZC5hY3Rpb24sIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICBpZiAoZHJhaW5UaW1lcikgeyBjbGVhckludGVydmFsKGRyYWluVGltZXIpOyBkcmFpblRpbWVyID0gdW5kZWZpbmVkOyB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgc3RhbmRhcmQgYGF1dGh6LmRlbmllZGAgc2luayB1c2VkIGJ5IGV2ZXJ5IHJlbW90ZS1hdWRpdCBzZXJ2aWNlXG4gKiAocGlwZWxpbmUsIHBsdWdpbiwgY29tcGxpYW5jZSwgcXVvdGEsIG1lc3NhZ2UsIGJpbGxpbmcsIHJlcG9ydGluZywg4oCmKS5cbiAqXG4gKiBUaGUgc2hhcmVkIGByZXF1aXJlQXV0aGAgZ2F0ZSBmb3J3YXJkcyBlYWNoIERFTklFRCBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0IHRvXG4gKiB0aGUgYXVkaXRvciBzZXQgdmlhIHtAbGluayBzZXRBdXRoekRlbmlhbEF1ZGl0b3J9OyB0aGlzIHdpcmVzIHRoYXQgaG9vayB0byB0aGVcbiAqIHNlcnZpY2UncyB7QGxpbmsgUmVtb3RlQXVkaXRDbGllbnR9LCBmb3J3YXJkaW5nIGEgYGZhaWx1cmVgLW91dGNvbWVcbiAqIGBhdXRoei5kZW5pZWRgIGV2ZW50IHNvIHByb2JpbmcgLyBwcml2aWxlZ2UtZXNjYWxhdGlvbiBhdHRlbXB0cyBsZWF2ZSBhIHRyYWlsLlxuICogRW1pc3Npb24gaXMgZmlyZS1hbmQtZm9yZ2V0ICh0aGUgY2xpZW50IG5ldmVyIHRocm93cykuIGBnZXRDbGllbnRgIGlzIGEgZ2V0dGVyXG4gKiBzbyB0aGUgY2xpZW50IHN0YXlzIGxhemlseSBjb25zdHJ1Y3RlZCAoc2VydmljZXMgbWVtb2l6ZSBpdCBvbiBmaXJzdCB1c2UpLlxuICpcbiAqIFBsYXRmb3JtIGlzIGludGVudGlvbmFsbHkgTk9UIGEgY2FsbGVyIOKAlCBpdCBpcyB0aGUgYXVkaXQgYXV0aG9yaXR5IGFuZCB3cml0ZXNcbiAqIGBhdXRoei5kZW5pZWRgIHN0cmFpZ2h0IHRvIGl0cyBsb2NhbCBzdG9yZSAod2l0aCBgYWZmZWN0ZWRPcmdJZGApLCBub3QgdGhyb3VnaFxuICogYSBSZW1vdGVBdWRpdENsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpcmVBdXRoekRlbmlhbEF1ZGl0b3Ioc2VydmljZU5hbWU6IHN0cmluZywgZ2V0Q2xpZW50OiAoKSA9PiBSZW1vdGVBdWRpdENsaWVudCk6IHZvaWQge1xuICBzZXRBdXRoekRlbmlhbEF1ZGl0b3IoKGluZm86IEF1dGh6RGVuaWFsSW5mbykgPT4gZ2V0Q2xpZW50KCkucmVjb3JkKHtcbiAgICBhY3Rpb246ICdhdXRoei5kZW5pZWQnLFxuICAgIGFjdG9ySWQ6IGluZm8uYWN0b3JJZCA/PyAnYW5vbnltb3VzJyxcbiAgICBhY3RvckVtYWlsOiBpbmZvLmFjdG9yRW1haWwsXG4gICAgb3JnSWQ6IGluZm8ub3JnSWQsXG4gICAgb3V0Y29tZTogJ2ZhaWx1cmUnLFxuICAgIGRldGFpbHM6IHsgbWV0aG9kOiBpbmZvLm1ldGhvZCwgcGF0aDogaW5mby5wYXRoLCByZXF1aXJlZDogaW5mby5yZXF1aXJlZCB9LFxuICB9LCBzZXJ2aWNlTmFtZSkpO1xufVxuXG4vKipcbiAqIFRoZSBwcm9jZXNzLXdpZGUgcmVtb3RlLWF1ZGl0IGJpbmRpbmc6IHdoaWNoIHNlcnZpY2UgdGhpcyBwcm9jZXNzIGlzLCBhbmQgdGhlXG4gKiAobGF6aWx5IGJ1aWx0KSBjbGllbnQgaXRzIGV2ZW50cyBnbyB0aHJvdWdoLiBCb3VuZCBPTkNFIGF0IGJvb3QgYnlcbiAqIGB3aXJlU2VydmljZVNlY3VyaXR5KHNlcnZpY2VOYW1lKWAg4oCUIGV2ZXJ5IHN0YXRlbGVzcyBzZXJ2aWNlIGNhbGxzIGl0IOKAlCBzbyB0aGVcbiAqIHNlcnZpY2UgaWRlbnRpdHkgaXMgbmV2ZXIgcmVwZWF0ZWQgYXQgYSBjYWxsIHNpdGUgYW5kIGNhbiBuZXZlciBkcmlmdC5cbiAqL1xuaW50ZXJmYWNlIEF1ZGl0QmluZGluZyB7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQgfCBudWxsO1xufVxuXG5sZXQgYXVkaXRCaW5kaW5nOiBBdWRpdEJpbmRpbmcgfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBCaW5kIHRoaXMgcHJvY2VzcydzIHNlcnZpY2UgaWRlbnRpdHkgZm9yIHtAbGluayByZWNvcmRBdWRpdH0uIENhbGxlZCBieVxuICogYHdpcmVTZXJ2aWNlU2VjdXJpdHlgOyB0ZXN0cyBnbyB0aHJvdWdoIGBiaW5kVGVzdEF1ZGl0U2VydmljZWBcbiAqIChgQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUvdGVzdGluZ2ApLCB3aGljaCBwYXNzZXMgYSBzcHkgYGNsaWVudGAuXG4gKlxuICogV2l0aG91dCBgY2xpZW50YCwgdGhlIHJlYWwgb25lIGlzIGJ1aWx0IGxhemlseSBvbiBmaXJzdCBlbWlzc2lvbjogYVxuICogUmVtb3RlQXVkaXRDbGllbnQgd2lyZWQgdG8gdGhlIGR1cmFibGUgZW52LVJlZGlzIHNwb29sIChudWxsIOKGkiBubyBzcG9vbCkuXG4gKiBMYXp5IG9uIHB1cnBvc2Ug4oCUIGJ1aWxkaW5nIGl0IGF0IGJvb3Qgd291bGQgZm9yY2UgdGhlIHNwb29sJ3MgUmVkaXMgY29ubmVjdGlvblxuICogd2hlcmV2ZXIgdGhlIHNlcnZpY2UgbW9kdWxlIGlzIG1lcmVseSBpbXBvcnRlZC4gUmViaW5kaW5nIGNsb3NlcyB0aGUgcHJldmlvdXNcbiAqIGNsaWVudCdzIHNwb29sLWRyYWluIHRpbWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEF1ZGl0U2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nLCBjbGllbnQ/OiBSZW1vdGVBdWRpdENsaWVudCk6IHZvaWQge1xuICBhdWRpdEJpbmRpbmc/LmNsaWVudD8uY2xvc2UoKTtcbiAgYXVkaXRCaW5kaW5nID0geyBzZXJ2aWNlTmFtZSwgY2xpZW50OiBjbGllbnQgPz8gbnVsbCB9O1xufVxuXG4vKiogRHJvcCB0aGUgYmluZGluZyAodGVzdHMgb25seSDigJQgcmV0dXJucyB0aGUgcHJvY2VzcyB0byB0aGUgdW5ib3VuZCBzdGF0ZSkuICovXG5leHBvcnQgZnVuY3Rpb24gdW5iaW5kQXVkaXRTZXJ2aWNlKCk6IHZvaWQge1xuICBhdWRpdEJpbmRpbmc/LmNsaWVudD8uY2xvc2UoKTtcbiAgYXVkaXRCaW5kaW5nID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gYm91bmRBdWRpdCgpOiBBdWRpdEJpbmRpbmcgJiB7IGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQgfSB7XG4gIGlmICghYXVkaXRCaW5kaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhdWRpdCBub3QgaW5pdGlhbGlzZWQ6IGNhbGwgd2lyZVNlcnZpY2VTZWN1cml0eShzZXJ2aWNlTmFtZSkgYXQgYm9vdCBiZWZvcmUgcmVjb3JkQXVkaXQoKScpO1xuICB9XG4gIGF1ZGl0QmluZGluZy5jbGllbnQgPz89IGNyZWF0ZVJlbW90ZUF1ZGl0Q2xpZW50KHtcbiAgICBzcG9vbDogY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKHsga2V5OiBhdWRpdFNwb29sS2V5KGF1ZGl0QmluZGluZy5zZXJ2aWNlTmFtZSkgfSkgPz8gdW5kZWZpbmVkLFxuICB9KTtcbiAgcmV0dXJuIGF1ZGl0QmluZGluZyBhcyBBdWRpdEJpbmRpbmcgJiB7IGNsaWVudDogUmVtb3RlQXVkaXRDbGllbnQgfTtcbn1cblxuLyoqXG4gKiBUaGUgYm91bmQgc2VydmljZSdzIFJlbW90ZUF1ZGl0Q2xpZW50LiBUaHJvd3MgXCJhdWRpdCBub3QgaW5pdGlhbGlzZWRcIiBiZWZvcmVcbiAqIGB3aXJlU2VydmljZVNlY3VyaXR5YCBoYXMgcnVuLiBJbnRlcm5hbDogY2FsbGVycyBlbWl0IHRocm91Z2hcbiAqIHtAbGluayByZWNvcmRBdWRpdH07IGB3aXJlU2VydmljZVNlY3VyaXR5YCBoYW5kcyB0aGlzIGdldHRlciB0byB0aGVcbiAqIGBhdXRoei5kZW5pZWRgIHNpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb3VuZEF1ZGl0Q2xpZW50KCk6IFJlbW90ZUF1ZGl0Q2xpZW50IHtcbiAgcmV0dXJuIGJvdW5kQXVkaXQoKS5jbGllbnQ7XG59XG5cbi8qKlxuICogUmVjb3JkIGFuIGV2ZW50IGluIHRoZSBkdXJhYmxlLCBoYXNoLWNoYWluZWQgY2VudHJhbCBhdWRpdCB0cmFpbCAocGxhdGZvcm0nc1xuICogYFBPU1QgL2F1ZGl0L2V2ZW50c2AgaW5nZXN0KSwgYXR0cmlidXRlZCB0byB0aGUgc2VydmljZSBib3VuZCBhdCBib290LlxuICpcbiAqIEZJUkUtQU5ELUZPUkdFVDogZGVsaXZlcnkgbmV2ZXIgYmxvY2tzIG9yIHRocm93cyDigJQgZW1pdCBvbmx5IEFGVEVSIHRoZVxuICogbXV0YXRpb24gc3VjY2VlZHMsIGFuZCBrZWVwIGBkZXRhaWxzYCBmcmVlIG9mIHNlY3JldHMvdG9rZW5zLCBQSUkgYW5kIEFXU1xuICogYWNjb3VudCBpZHMuIFRoZSBPTkUgdGhpbmcgdGhhdCB0aHJvd3MgaXMgY2FsbGluZyBpdCBiZWZvcmVcbiAqIGB3aXJlU2VydmljZVNlY3VyaXR5KHNlcnZpY2VOYW1lKWAgaGFzIGJvdW5kIHRoZSBzZXJ2aWNlOiB0aGF0IGlzIGEgd2lyaW5nXG4gKiBidWcsIGFuZCBmYWlsaW5nIGxvdWRseSBiZWF0cyBzaWxlbnRseSBhdHRyaWJ1dGluZyB0aGUgZXZlbnQgdG8gbm9ib2R5LlxuICpcbiAqIChUaGUgd2luc3Rvbi9Mb2tpIGxvZyBsaW5lIGlzIGEgZGlmZmVyZW50IHNpbms6IGBsb2dBdWRpdEV2ZW50YC4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBdWRpdChldmVudDogUmVtb3RlQXVkaXRFdmVudCk6IHZvaWQge1xuICBjb25zdCB7IGNsaWVudCwgc2VydmljZU5hbWUgfSA9IGJvdW5kQXVkaXQoKTtcbiAgY2xpZW50LnJlY29yZChldmVudCwgc2VydmljZU5hbWUpO1xufVxuIl19