@pipeline-builder/pipeline-data 4.1.15 → 4.1.16

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 (60) hide show
  1. package/lib/api/access-control-builder.d.ts +18 -1
  2. package/lib/api/access-control-builder.js +19 -6
  3. package/lib/api/crud-service.d.ts +94 -36
  4. package/lib/api/crud-service.js +188 -166
  5. package/lib/api/plugin-resolution.d.ts +253 -0
  6. package/lib/api/plugin-resolution.js +649 -0
  7. package/lib/api/public-directory.d.ts +281 -0
  8. package/lib/api/public-directory.js +457 -0
  9. package/lib/api/query-builders.d.ts +13 -0
  10. package/lib/api/query-builders.js +74 -9
  11. package/lib/api/reporting/caches.js +4 -4
  12. package/lib/api/reporting/dora-scoring.d.ts +3 -3
  13. package/lib/api/reporting/dora-scoring.js +4 -4
  14. package/lib/api/reporting/dora.d.ts +6 -6
  15. package/lib/api/reporting/dora.js +97 -73
  16. package/lib/api/reporting/plugin-runtime.d.ts +25 -0
  17. package/lib/api/reporting/plugin-runtime.js +106 -0
  18. package/lib/api/reporting/query-scope.d.ts +8 -2
  19. package/lib/api/reporting/query-scope.js +16 -7
  20. package/lib/api/reporting/retention.d.ts +4 -10
  21. package/lib/api/reporting/retention.js +8 -11
  22. package/lib/api/reporting/sql-helpers.d.ts +4 -7
  23. package/lib/api/reporting/sql-helpers.js +8 -9
  24. package/lib/api/reporting/types.d.ts +55 -17
  25. package/lib/api/reporting/types.js +1 -1
  26. package/lib/api/reporting-service.d.ts +35 -26
  27. package/lib/api/reporting-service.js +245 -161
  28. package/lib/api/semver-range.d.ts +73 -0
  29. package/lib/api/semver-range.js +227 -0
  30. package/lib/api/soft-delete-sweep.js +8 -20
  31. package/lib/core/query-filters.d.ts +18 -3
  32. package/lib/core/query-filters.js +1 -1
  33. package/lib/database/drizzle-schema.d.ts +7790 -2461
  34. package/lib/database/drizzle-schema.js +29 -1
  35. package/lib/database/index.d.ts +4 -2
  36. package/lib/database/index.js +5 -3
  37. package/lib/database/pg-result.d.ts +19 -0
  38. package/lib/database/pg-result.js +32 -0
  39. package/lib/database/postgres-connection.js +14 -24
  40. package/lib/database/public-reader.d.ts +14 -0
  41. package/lib/database/public-reader.js +68 -0
  42. package/lib/database/retry-strategy.d.ts +3 -5
  43. package/lib/database/retry-strategy.js +4 -6
  44. package/lib/database/schema/compliance.d.ts +16 -34
  45. package/lib/database/schema/compliance.js +4 -4
  46. package/lib/database/schema/dashboard.js +4 -2
  47. package/lib/database/schema/ecosystem.d.ts +6586 -0
  48. package/lib/database/schema/ecosystem.js +709 -0
  49. package/lib/database/schema/message.d.ts +6 -12
  50. package/lib/database/schema/message.js +3 -1
  51. package/lib/database/schema/pipeline.d.ts +79 -5
  52. package/lib/database/schema/pipeline.js +46 -25
  53. package/lib/database/schema/plugin.d.ts +587 -3
  54. package/lib/database/schema/plugin.js +86 -14
  55. package/lib/database/tenancy.d.ts +6 -7
  56. package/lib/database/tenancy.js +13 -14
  57. package/lib/index.d.ts +7 -4
  58. package/lib/index.js +7 -4
  59. package/lib/testing/exports.json +146 -0
  60. package/package.json +44 -7
@@ -15,9 +15,11 @@ export * from './schema/message-attachment.js';
15
15
  export * from './schema/compliance.js';
16
16
  export * from './schema/dashboard.js';
17
17
  export * from './schema/alert.js';
18
+ export * from './schema/ecosystem.js';
18
19
  import { orgAlertDestination, orgAlertRule } from './schema/alert.js';
19
20
  import { compliancePolicy, complianceRule, complianceRuleHistory, complianceAuditLog, complianceExemption, complianceRuleSubscription, complianceScan, complianceScanSchedule, complianceNotificationPreference, complianceNotificationLog, complianceRole, complianceReport, complianceReportSchedule, } from './schema/compliance.js';
20
21
  import { dashboard, dashboardPanel } from './schema/dashboard.js';
22
+ import { publisher, pluginListing, pluginListingVersion, pluginAdvisory, ecosystemAutoApprovalRule, pluginPublishRequest, ecosystemReservedName, ecosystemSetting, ecosystemCollection, pluginReview, pluginReviewReply, pluginReviewReport, pluginReviewVote, pluginReviewHistory, pluginStats, pluginSubmission, ecosystemSearchMiss, ecosystemNotificationQueue, pipelineStepManifest, pluginInstall, pluginInstallPolicy, pluginAdvisoryDelivery, } from './schema/ecosystem.js';
21
23
  import { messageAttachment } from './schema/message-attachment.js';
22
24
  import { message } from './schema/message.js';
23
25
  import { pipelineTemplate } from './schema/pipeline-template.js';
@@ -62,5 +64,31 @@ export const schema = {
62
64
  complianceRole,
63
65
  complianceReport,
64
66
  complianceReportSchedule,
67
+ // Plugin ecosystem — instance-wide directory (no org_id; service-layer gated)
68
+ publisher,
69
+ pluginListing,
70
+ pluginListingVersion,
71
+ pluginAdvisory,
72
+ ecosystemAutoApprovalRule,
73
+ pluginPublishRequest,
74
+ ecosystemReservedName,
75
+ ecosystemSetting,
76
+ ecosystemCollection,
77
+ pluginReview,
78
+ pluginReviewReply,
79
+ pluginReviewReport,
80
+ pluginReviewVote,
81
+ pluginReviewHistory,
82
+ pluginStats,
83
+ pluginSubmission,
84
+ ecosystemSearchMiss,
85
+ ecosystemNotificationQueue,
86
+ // Plugin ecosystem — org-scoped (org_id + RLS; in the org cascade)
87
+ pipelineStepManifest,
88
+ pluginInstall,
89
+ pluginInstallPolicy,
90
+ pluginAdvisoryDelivery,
91
+ // (The public_listings / public_listed_versions views are exported from
92
+ // ./schema/ecosystem but are not tables, so they are not listed here.)
65
93
  };
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLDJEQUEyRDtBQUMzRCxFQUFFO0FBRUYsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG1CQUFtQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixnQ0FBZ0MsRUFDaEMseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsd0JBQXdCLEdBQ3pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxSSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUc7SUFDcEIsTUFBTTtJQUNOLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsT0FBTztJQUNQLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLDhEQUE4RDtJQUM5RCxpQkFBaUI7SUFDakIsWUFBWTtJQUNaLDZFQUE2RTtJQUM3RSxRQUFRO0lBQ1IsdURBQXVEO0lBQ3ZELFlBQVk7SUFDWixtRkFBbUY7SUFDbkYsU0FBUztJQUNULGNBQWM7SUFDZCxrRUFBa0U7SUFDbEUsbUJBQW1CO0lBQ25CLHNFQUFzRTtJQUN0RSxZQUFZO0lBQ1osb0JBQW9CO0lBQ3BCLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLGNBQWM7SUFDZCxzQkFBc0I7SUFDdEIsZ0NBQWdDO0lBQ2hDLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLHdCQUF3QjtDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8vXG4vLyBCYXJyZWwgZm9yIHRoZSBEcml6emxlIHNjaGVtYS4gVGhlIHRhYmxlL3R5cGUgZGVmaW5pdGlvbnMgbGl2ZSBpbiBwZXItZG9tYWluXG4vLyBmaWxlcyB1bmRlciBgLi9zY2hlbWEvKmA7IHRoaXMgbW9kdWxlIHJlLWV4cG9ydHMgZXZlcnkgb25lIG9mIHRoZW0gc28gdGhlXG4vLyBwdWJsaWMgQVBJIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91cyBzaW5nbGUtZmlsZSBzY2hlbWEuIEV4aXN0aW5nXG4vLyBgaW1wb3J0IHsgLi4uIH0gZnJvbSAnLi4uL2RyaXp6bGUtc2NoZW1hJ2Agc2l0ZXMgYW5kIHRoZSBhZ2dyZWdhdGUgYHNjaGVtYWBcbi8vIG9iamVjdCBiZWxvdyBib3RoIGNvbnRpbnVlIHRvIHJlc29sdmUgZXhhY3RseSBhcyBiZWZvcmUuXG4vL1xuXG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9wbHVnaW4uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEvcGlwZWxpbmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEvcGlwZWxpbmUtdGVtcGxhdGUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEvbWVzc2FnZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9tZXNzYWdlLWF0dGFjaG1lbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEvY29tcGxpYW5jZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9kYXNoYm9hcmQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlbWEvYWxlcnQuanMnO1xuXG5pbXBvcnQgeyBvcmdBbGVydERlc3RpbmF0aW9uLCBvcmdBbGVydFJ1bGUgfSBmcm9tICcuL3NjaGVtYS9hbGVydC5qcyc7XG5pbXBvcnQge1xuICBjb21wbGlhbmNlUG9saWN5LFxuICBjb21wbGlhbmNlUnVsZSxcbiAgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LFxuICBjb21wbGlhbmNlQXVkaXRMb2csXG4gIGNvbXBsaWFuY2VFeGVtcHRpb24sXG4gIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLFxuICBjb21wbGlhbmNlU2NhbixcbiAgY29tcGxpYW5jZVNjYW5TY2hlZHVsZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UsXG4gIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2csXG4gIGNvbXBsaWFuY2VSb2xlLFxuICBjb21wbGlhbmNlUmVwb3J0LFxuICBjb21wbGlhbmNlUmVwb3J0U2NoZWR1bGUsXG59IGZyb20gJy4vc2NoZW1hL2NvbXBsaWFuY2UuanMnO1xuaW1wb3J0IHsgZGFzaGJvYXJkLCBkYXNoYm9hcmRQYW5lbCB9IGZyb20gJy4vc2NoZW1hL2Rhc2hib2FyZC5qcyc7XG5pbXBvcnQgeyBtZXNzYWdlQXR0YWNobWVudCB9IGZyb20gJy4vc2NoZW1hL21lc3NhZ2UtYXR0YWNobWVudC5qcyc7XG5pbXBvcnQgeyBtZXNzYWdlIH0gZnJvbSAnLi9zY2hlbWEvbWVzc2FnZS5qcyc7XG5pbXBvcnQgeyBwaXBlbGluZVRlbXBsYXRlIH0gZnJvbSAnLi9zY2hlbWEvcGlwZWxpbmUtdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgcGlwZWxpbmUsIHBpcGVsaW5lUmVnaXN0cnksIHBpcGVsaW5lRXZlbnQsIGRlcGxveW1lbnRPdXRjb21lLCBpbmdlc3RIZWFsdGgsIGluY2lkZW50LCBkb3JhU2V0dGluZ3MgfSBmcm9tICcuL3NjaGVtYS9waXBlbGluZS5qcyc7XG5pbXBvcnQgeyBwbHVnaW4gfSBmcm9tICcuL3NjaGVtYS9wbHVnaW4uanMnO1xuXG4vKipcbiAqIENvbXBsZXRlIERyaXp6bGUgc2NoZW1hIGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2NoZW1hID0ge1xuICBwbHVnaW4sXG4gIHBpcGVsaW5lLFxuICBwaXBlbGluZVRlbXBsYXRlLFxuICBtZXNzYWdlLFxuICBtZXNzYWdlQXR0YWNobWVudCxcbiAgcGlwZWxpbmVSZWdpc3RyeSxcbiAgcGlwZWxpbmVFdmVudCxcbiAgLy8gRE9SQSBwb3N0LWRlcGxveSBvdXRjb21lIG1hcmtlcnMgKyBwZXItb3JnIGluZ2VzdGlvbiBoZWFsdGhcbiAgZGVwbG95bWVudE91dGNvbWUsXG4gIGluZ2VzdEhlYWx0aCxcbiAgLy8gUHJvZHVjdGlvbiBpbmNpZGVudHMgKHdlYmhvb2staW5nZXN0ZWQpIOKGkiBhdXRvbWF0ZWQgcG9zdC1kZXBsb3kgQ0ZSICsgTVRUUlxuICBpbmNpZGVudCxcbiAgLy8gUGVyLW9yZyBET1JBIG92ZXJyaWRlcyAoaW5jaWRlbnQgY29ycmVsYXRpb24gd2luZG93KVxuICBkb3JhU2V0dGluZ3MsXG4gIC8vIE9ic2VydmFiaWxpdHkgZGFzaGJvYXJkcyAodXNlci1lZGl0YWJsZSByZXBsYWNlbWVudCBmb3IgY29kZS1kZWZpbmVkIGRhc2hib2FyZHMpXG4gIGRhc2hib2FyZCxcbiAgZGFzaGJvYXJkUGFuZWwsXG4gIC8vIFBlci1vcmcgYWxlcnQgbm90aWZpY2F0aW9uIGRlc3RpbmF0aW9ucyAobXVsdGktdGVuYW50IGFsZXJ0aW5nKVxuICBvcmdBbGVydERlc3RpbmF0aW9uLFxuICAvLyBwZXItb3JnIG9wZXJhdG9yLWF1dGhvcmVkIGFsZXJ0IHJ1bGVzICBtYXRlcmlhbGl6ZWQgaW50byBQcm9tIFlBTUwuXG4gIG9yZ0FsZXJ0UnVsZSxcbiAgLy8gQ29tcGxpYW5jZSB0YWJsZXNcbiAgY29tcGxpYW5jZVBvbGljeSxcbiAgY29tcGxpYW5jZVJ1bGUsXG4gIGNvbXBsaWFuY2VSdWxlSGlzdG9yeSxcbiAgY29tcGxpYW5jZUF1ZGl0TG9nLFxuICBjb21wbGlhbmNlRXhlbXB0aW9uLFxuICBjb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbixcbiAgY29tcGxpYW5jZVNjYW4sXG4gIGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUsXG4gIGNvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlLFxuICBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nLFxuICBjb21wbGlhbmNlUm9sZSxcbiAgY29tcGxpYW5jZVJlcG9ydCxcbiAgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlLFxufSBhcyBjb25zdDtcbiJdfQ==
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLDJEQUEyRDtBQUMzRCxFQUFFO0FBRUYsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLGdDQUFnQyxFQUNoQyx5QkFBeUIsRUFDekIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQix3QkFBd0IsR0FDekIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QseUJBQXlCLEVBQ3pCLG9CQUFvQixFQUNwQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLDBCQUEwQixFQUMxQixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixzQkFBc0IsR0FDdkIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxSSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUM7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUc7SUFDcEIsTUFBTTtJQUNOLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsT0FBTztJQUNQLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLDhEQUE4RDtJQUM5RCxpQkFBaUI7SUFDakIsWUFBWTtJQUNaLDZFQUE2RTtJQUM3RSxRQUFRO0lBQ1IsdURBQXVEO0lBQ3ZELFlBQVk7SUFDWixtRkFBbUY7SUFDbkYsU0FBUztJQUNULGNBQWM7SUFDZCxrRUFBa0U7SUFDbEUsbUJBQW1CO0lBQ25CLHNFQUFzRTtJQUN0RSxZQUFZO0lBQ1osb0JBQW9CO0lBQ3BCLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsMEJBQTBCO0lBQzFCLGNBQWM7SUFDZCxzQkFBc0I7SUFDdEIsZ0NBQWdDO0lBQ2hDLHlCQUF5QjtJQUN6QixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLHdCQUF3QjtJQUN4Qiw4RUFBOEU7SUFDOUUsU0FBUztJQUNULGFBQWE7SUFDYixvQkFBb0I7SUFDcEIsY0FBYztJQUNkLHlCQUF5QjtJQUN6QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQiwwQkFBMEI7SUFDMUIsbUVBQW1FO0lBQ25FLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLHNCQUFzQjtJQUN0Qix3RUFBd0U7SUFDeEUsdUVBQXVFO0NBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLy9cbi8vIEJhcnJlbCBmb3IgdGhlIERyaXp6bGUgc2NoZW1hLiBUaGUgdGFibGUvdHlwZSBkZWZpbml0aW9ucyBsaXZlIGluIHBlci1kb21haW5cbi8vIGZpbGVzIHVuZGVyIGAuL3NjaGVtYS8qYDsgdGhpcyBtb2R1bGUgcmUtZXhwb3J0cyBldmVyeSBvbmUgb2YgdGhlbSBzbyB0aGVcbi8vIHB1YmxpYyBBUEkgaXMgYnl0ZS1pZGVudGljYWwgdG8gdGhlIHByZXZpb3VzIHNpbmdsZS1maWxlIHNjaGVtYS4gRXhpc3Rpbmdcbi8vIGBpbXBvcnQgeyAuLi4gfSBmcm9tICcuLi4vZHJpenpsZS1zY2hlbWEnYCBzaXRlcyBhbmQgdGhlIGFnZ3JlZ2F0ZSBgc2NoZW1hYFxuLy8gb2JqZWN0IGJlbG93IGJvdGggY29udGludWUgdG8gcmVzb2x2ZSBleGFjdGx5IGFzIGJlZm9yZS5cbi8vXG5cbmV4cG9ydCAqIGZyb20gJy4vc2NoZW1hL3BsdWdpbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9waXBlbGluZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9waXBlbGluZS10ZW1wbGF0ZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9tZXNzYWdlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2NoZW1hL21lc3NhZ2UtYXR0YWNobWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9jb21wbGlhbmNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2NoZW1hL2Rhc2hib2FyZC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9hbGVydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjaGVtYS9lY29zeXN0ZW0uanMnO1xuXG5pbXBvcnQgeyBvcmdBbGVydERlc3RpbmF0aW9uLCBvcmdBbGVydFJ1bGUgfSBmcm9tICcuL3NjaGVtYS9hbGVydC5qcyc7XG5pbXBvcnQge1xuICBjb21wbGlhbmNlUG9saWN5LFxuICBjb21wbGlhbmNlUnVsZSxcbiAgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LFxuICBjb21wbGlhbmNlQXVkaXRMb2csXG4gIGNvbXBsaWFuY2VFeGVtcHRpb24sXG4gIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLFxuICBjb21wbGlhbmNlU2NhbixcbiAgY29tcGxpYW5jZVNjYW5TY2hlZHVsZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UsXG4gIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2csXG4gIGNvbXBsaWFuY2VSb2xlLFxuICBjb21wbGlhbmNlUmVwb3J0LFxuICBjb21wbGlhbmNlUmVwb3J0U2NoZWR1bGUsXG59IGZyb20gJy4vc2NoZW1hL2NvbXBsaWFuY2UuanMnO1xuaW1wb3J0IHsgZGFzaGJvYXJkLCBkYXNoYm9hcmRQYW5lbCB9IGZyb20gJy4vc2NoZW1hL2Rhc2hib2FyZC5qcyc7XG5pbXBvcnQge1xuICBwdWJsaXNoZXIsXG4gIHBsdWdpbkxpc3RpbmcsXG4gIHBsdWdpbkxpc3RpbmdWZXJzaW9uLFxuICBwbHVnaW5BZHZpc29yeSxcbiAgZWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZSxcbiAgcGx1Z2luUHVibGlzaFJlcXVlc3QsXG4gIGVjb3N5c3RlbVJlc2VydmVkTmFtZSxcbiAgZWNvc3lzdGVtU2V0dGluZyxcbiAgZWNvc3lzdGVtQ29sbGVjdGlvbixcbiAgcGx1Z2luUmV2aWV3LFxuICBwbHVnaW5SZXZpZXdSZXBseSxcbiAgcGx1Z2luUmV2aWV3UmVwb3J0LFxuICBwbHVnaW5SZXZpZXdWb3RlLFxuICBwbHVnaW5SZXZpZXdIaXN0b3J5LFxuICBwbHVnaW5TdGF0cyxcbiAgcGx1Z2luU3VibWlzc2lvbixcbiAgZWNvc3lzdGVtU2VhcmNoTWlzcyxcbiAgZWNvc3lzdGVtTm90aWZpY2F0aW9uUXVldWUsXG4gIHBpcGVsaW5lU3RlcE1hbmlmZXN0LFxuICBwbHVnaW5JbnN0YWxsLFxuICBwbHVnaW5JbnN0YWxsUG9saWN5LFxuICBwbHVnaW5BZHZpc29yeURlbGl2ZXJ5LFxufSBmcm9tICcuL3NjaGVtYS9lY29zeXN0ZW0uanMnO1xuaW1wb3J0IHsgbWVzc2FnZUF0dGFjaG1lbnQgfSBmcm9tICcuL3NjaGVtYS9tZXNzYWdlLWF0dGFjaG1lbnQuanMnO1xuaW1wb3J0IHsgbWVzc2FnZSB9IGZyb20gJy4vc2NoZW1hL21lc3NhZ2UuanMnO1xuaW1wb3J0IHsgcGlwZWxpbmVUZW1wbGF0ZSB9IGZyb20gJy4vc2NoZW1hL3BpcGVsaW5lLXRlbXBsYXRlLmpzJztcbmltcG9ydCB7IHBpcGVsaW5lLCBwaXBlbGluZVJlZ2lzdHJ5LCBwaXBlbGluZUV2ZW50LCBkZXBsb3ltZW50T3V0Y29tZSwgaW5nZXN0SGVhbHRoLCBpbmNpZGVudCwgZG9yYVNldHRpbmdzIH0gZnJvbSAnLi9zY2hlbWEvcGlwZWxpbmUuanMnO1xuaW1wb3J0IHsgcGx1Z2luIH0gZnJvbSAnLi9zY2hlbWEvcGx1Z2luLmpzJztcblxuLyoqXG4gKiBDb21wbGV0ZSBEcml6emxlIHNjaGVtYSBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNjaGVtYSA9IHtcbiAgcGx1Z2luLFxuICBwaXBlbGluZSxcbiAgcGlwZWxpbmVUZW1wbGF0ZSxcbiAgbWVzc2FnZSxcbiAgbWVzc2FnZUF0dGFjaG1lbnQsXG4gIHBpcGVsaW5lUmVnaXN0cnksXG4gIHBpcGVsaW5lRXZlbnQsXG4gIC8vIERPUkEgcG9zdC1kZXBsb3kgb3V0Y29tZSBtYXJrZXJzICsgcGVyLW9yZyBpbmdlc3Rpb24gaGVhbHRoXG4gIGRlcGxveW1lbnRPdXRjb21lLFxuICBpbmdlc3RIZWFsdGgsXG4gIC8vIFByb2R1Y3Rpb24gaW5jaWRlbnRzICh3ZWJob29rLWluZ2VzdGVkKSDihpIgYXV0b21hdGVkIHBvc3QtZGVwbG95IENGUiArIE1UVFJcbiAgaW5jaWRlbnQsXG4gIC8vIFBlci1vcmcgRE9SQSBvdmVycmlkZXMgKGluY2lkZW50IGNvcnJlbGF0aW9uIHdpbmRvdylcbiAgZG9yYVNldHRpbmdzLFxuICAvLyBPYnNlcnZhYmlsaXR5IGRhc2hib2FyZHMgKHVzZXItZWRpdGFibGUgcmVwbGFjZW1lbnQgZm9yIGNvZGUtZGVmaW5lZCBkYXNoYm9hcmRzKVxuICBkYXNoYm9hcmQsXG4gIGRhc2hib2FyZFBhbmVsLFxuICAvLyBQZXItb3JnIGFsZXJ0IG5vdGlmaWNhdGlvbiBkZXN0aW5hdGlvbnMgKG11bHRpLXRlbmFudCBhbGVydGluZylcbiAgb3JnQWxlcnREZXN0aW5hdGlvbixcbiAgLy8gcGVyLW9yZyBvcGVyYXRvci1hdXRob3JlZCBhbGVydCBydWxlcyAgbWF0ZXJpYWxpemVkIGludG8gUHJvbSBZQU1MLlxuICBvcmdBbGVydFJ1bGUsXG4gIC8vIENvbXBsaWFuY2UgdGFibGVzXG4gIGNvbXBsaWFuY2VQb2xpY3ksXG4gIGNvbXBsaWFuY2VSdWxlLFxuICBjb21wbGlhbmNlUnVsZUhpc3RvcnksXG4gIGNvbXBsaWFuY2VBdWRpdExvZyxcbiAgY29tcGxpYW5jZUV4ZW1wdGlvbixcbiAgY29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24sXG4gIGNvbXBsaWFuY2VTY2FuLFxuICBjb21wbGlhbmNlU2NhblNjaGVkdWxlLFxuICBjb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZyxcbiAgY29tcGxpYW5jZVJvbGUsXG4gIGNvbXBsaWFuY2VSZXBvcnQsXG4gIGNvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZSxcbiAgLy8gUGx1Z2luIGVjb3N5c3RlbSDigJQgaW5zdGFuY2Utd2lkZSBkaXJlY3RvcnkgKG5vIG9yZ19pZDsgc2VydmljZS1sYXllciBnYXRlZClcbiAgcHVibGlzaGVyLFxuICBwbHVnaW5MaXN0aW5nLFxuICBwbHVnaW5MaXN0aW5nVmVyc2lvbixcbiAgcGx1Z2luQWR2aXNvcnksXG4gIGVjb3N5c3RlbUF1dG9BcHByb3ZhbFJ1bGUsXG4gIHBsdWdpblB1Ymxpc2hSZXF1ZXN0LFxuICBlY29zeXN0ZW1SZXNlcnZlZE5hbWUsXG4gIGVjb3N5c3RlbVNldHRpbmcsXG4gIGVjb3N5c3RlbUNvbGxlY3Rpb24sXG4gIHBsdWdpblJldmlldyxcbiAgcGx1Z2luUmV2aWV3UmVwbHksXG4gIHBsdWdpblJldmlld1JlcG9ydCxcbiAgcGx1Z2luUmV2aWV3Vm90ZSxcbiAgcGx1Z2luUmV2aWV3SGlzdG9yeSxcbiAgcGx1Z2luU3RhdHMsXG4gIHBsdWdpblN1Ym1pc3Npb24sXG4gIGVjb3N5c3RlbVNlYXJjaE1pc3MsXG4gIGVjb3N5c3RlbU5vdGlmaWNhdGlvblF1ZXVlLFxuICAvLyBQbHVnaW4gZWNvc3lzdGVtIOKAlCBvcmctc2NvcGVkIChvcmdfaWQgKyBSTFM7IGluIHRoZSBvcmcgY2FzY2FkZSlcbiAgcGlwZWxpbmVTdGVwTWFuaWZlc3QsXG4gIHBsdWdpbkluc3RhbGwsXG4gIHBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHBsdWdpbkFkdmlzb3J5RGVsaXZlcnksXG4gIC8vIChUaGUgcHVibGljX2xpc3RpbmdzIC8gcHVibGljX2xpc3RlZF92ZXJzaW9ucyB2aWV3cyBhcmUgZXhwb3J0ZWQgZnJvbVxuICAvLyAuL3NjaGVtYS9lY29zeXN0ZW0gYnV0IGFyZSBub3QgdGFibGVzLCBzbyB0aGV5IGFyZSBub3QgbGlzdGVkIGhlcmUuKVxufSBhcyBjb25zdDtcbiJdfQ==
@@ -1,4 +1,6 @@
1
- export * from './drizzle-schema.js';
2
- export * from './postgres-connection.js';
1
+ export { schema, type PluginSecret, type ImageSource, type PluginLifecycle, type PluginContractValueType, type PluginIcon, plugin, type Plugin, type PluginInsert, type PluginUpdate, pipeline, pipelineRegistry, type EventSource, pipelineEvent, deploymentOutcome, ingestHealth, incident, doraSettings, type Pipeline, type PipelineInsert, type Incident, type PipelineUpdate, pipelineTemplate, type PipelineTemplate, type PipelineTemplateInsert, type PipelineTemplateUpdate, type MessageType, type MessagePriority, message, type Message, type MessageInsert, type MessageUpdate, messageAttachment, type MessageAttachment, type RuleSeverity, type RuleTarget, type RuleOperator, type RuleConditionMode, type RuleScope, type RuleCondition, compliancePolicy, complianceRule, complianceRuleHistory, complianceAuditLog, complianceExemption, complianceRuleSubscription, complianceScan, complianceScanSchedule, complianceNotificationPreference, complianceNotificationLog, complianceRole, complianceReport, complianceReportSchedule, type CompliancePolicy, type CompliancePolicyInsert, type ComplianceRule, type ComplianceRuleInsert, type ComplianceExemption, type ComplianceRuleSubscription, type ComplianceScan, type ComplianceNotificationPreference, dashboard, dashboardPanel, type Dashboard, type DashboardInsert, type DashboardUpdate, type DashboardPanel, type DashboardPanelInsert, orgAlertDestination, orgAlertRule, type OrgAlertDestination, type OrgAlertDestinationInsert, type HealthBreakdown, PUBLISHER_TIERS, type PublisherTier, type PublishRequestKind, type PublishRequestStatus, OPEN_PUBLISH_REQUEST_STATUSES, type PublishRequestLane, INSTALL_VERSION_POLICIES, type InstallVersionPolicy, type InstallStatus, type InstallChangeRequest, type BlockOnAdvisory, type OfficialInstalls, type ReviewStatus, type ReviewHoldReason, REVIEW_REPORT_CATEGORIES, type ReviewReportCategory, type AdvisorySeverity, type AdvisoryState, type AdvisorySource, type SubmissionCatalog, type SubmissionStatus, publisher, pluginListing, type ListingVersionSpecSnapshot, pluginListingVersion, pluginAdvisory, ecosystemAutoApprovalRule, pluginPublishRequest, ecosystemReservedName, ecosystemSetting, ecosystemCollection, pluginReview, pluginReviewReply, pluginReviewReport, pluginReviewVote, pluginReviewHistory, pluginStats, pluginSubmission, ecosystemSearchMiss, ecosystemNotificationQueue, pipelineStepManifest, pluginInstall, pluginInstallPolicy, pluginAdvisoryDelivery, publicListings, publicListedVersions, publicAdvisories, publicReviews, OFFICIAL_PUBLISHER_HANDLE, COMMUNITY_PUBLISHER_HANDLE, type Publisher, type PublisherInsert, type PluginListing, type PluginListingInsert, type PluginListingVersion, type PluginListingVersionInsert, type PluginAdvisory, type PluginAdvisoryInsert, type EcosystemAutoApprovalRule, type EcosystemAutoApprovalRuleInsert, type PluginPublishRequest, type PluginPublishRequestInsert, type EcosystemReservedName, type PluginReview, type PluginReviewInsert, type PluginReviewReply, type PluginReviewReplyInsert, type PluginReviewReport, type PluginReviewReportInsert, type PluginReviewHistoryInsert, type PluginStats, type PluginStatsInsert, type PluginSubmission, type PluginSubmissionInsert, type PluginInstall, type PluginInstallInsert, type PluginInstallPolicy, type PluginInstallPolicyInsert, type PublicReview, } from './drizzle-schema.js';
2
+ export { getSslConfig, getConnection, closeConnection, testConnection, type ConnectionOptions, Connection, db, } from './postgres-connection.js';
3
3
  export * from './retry-strategy.js';
4
4
  export * from './tenancy.js';
5
+ export * from './public-reader.js';
6
+ export { PG_UNIQUE_VIOLATION, isUniqueViolation, resultRows, executeRows, type SqlExecutor, } from './pg-result.js';
@@ -1,7 +1,9 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- export * from './drizzle-schema.js';
4
- export * from './postgres-connection.js';
3
+ export { schema, plugin, pipeline, pipelineRegistry, pipelineEvent, deploymentOutcome, ingestHealth, incident, doraSettings, pipelineTemplate, message, messageAttachment, compliancePolicy, complianceRule, complianceRuleHistory, complianceAuditLog, complianceExemption, complianceRuleSubscription, complianceScan, complianceScanSchedule, complianceNotificationPreference, complianceNotificationLog, complianceRole, complianceReport, complianceReportSchedule, dashboard, dashboardPanel, orgAlertDestination, orgAlertRule, PUBLISHER_TIERS, OPEN_PUBLISH_REQUEST_STATUSES, INSTALL_VERSION_POLICIES, REVIEW_REPORT_CATEGORIES, publisher, pluginListing, pluginListingVersion, pluginAdvisory, ecosystemAutoApprovalRule, pluginPublishRequest, ecosystemReservedName, ecosystemSetting, ecosystemCollection, pluginReview, pluginReviewReply, pluginReviewReport, pluginReviewVote, pluginReviewHistory, pluginStats, pluginSubmission, ecosystemSearchMiss, ecosystemNotificationQueue, pipelineStepManifest, pluginInstall, pluginInstallPolicy, pluginAdvisoryDelivery, publicListings, publicListedVersions, publicAdvisories, publicReviews, OFFICIAL_PUBLISHER_HANDLE, COMMUNITY_PUBLISHER_HANDLE, } from './drizzle-schema.js';
4
+ export { getSslConfig, getConnection, closeConnection, testConnection, Connection, db, } from './postgres-connection.js';
5
5
  export * from './retry-strategy.js';
6
6
  export * from './tenancy.js';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2RyaXp6bGUtc2NoZW1hLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcG9zdGdyZXMtY29ubmVjdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdGVuYW5jeS5qcyc7XG4iXX0=
7
+ export * from './public-reader.js';
8
+ export { PG_UNIQUE_VIOLATION, isUniqueViolation, resultRows, executeRows, } from './pg-result.js';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsTUFBTSxFQU1OLE1BQU0sRUFJTixRQUFRLEVBQ1IsZ0JBQWdCLEVBRWhCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFFBQVEsRUFDUixZQUFZLEVBS1osZ0JBQWdCLEVBTWhCLE9BQU8sRUFJUCxpQkFBaUIsRUFRakIsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixnQ0FBZ0MsRUFDaEMseUJBQXlCLEVBQ3pCLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsd0JBQXdCLEVBU3hCLFNBQVMsRUFDVCxjQUFjLEVBTWQsbUJBQW1CLEVBQ25CLFlBQVksRUFJWixlQUFlLEVBSWYsNkJBQTZCLEVBRTdCLHdCQUF3QixFQVF4Qix3QkFBd0IsRUFPeEIsU0FBUyxFQUNULGFBQWEsRUFFYixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHlCQUF5QixFQUN6QixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYix5QkFBeUIsRUFDekIsMEJBQTBCLEdBOEIzQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixjQUFjLEVBRWQsVUFBVSxFQUNWLEVBQUUsR0FDSCxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsV0FBVyxHQUVaLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0IHtcbiAgc2NoZW1hLFxuICB0eXBlIFBsdWdpblNlY3JldCxcbiAgdHlwZSBJbWFnZVNvdXJjZSxcbiAgdHlwZSBQbHVnaW5MaWZlY3ljbGUsXG4gIHR5cGUgUGx1Z2luQ29udHJhY3RWYWx1ZVR5cGUsXG4gIHR5cGUgUGx1Z2luSWNvbixcbiAgcGx1Z2luLFxuICB0eXBlIFBsdWdpbixcbiAgdHlwZSBQbHVnaW5JbnNlcnQsXG4gIHR5cGUgUGx1Z2luVXBkYXRlLFxuICBwaXBlbGluZSxcbiAgcGlwZWxpbmVSZWdpc3RyeSxcbiAgdHlwZSBFdmVudFNvdXJjZSxcbiAgcGlwZWxpbmVFdmVudCxcbiAgZGVwbG95bWVudE91dGNvbWUsXG4gIGluZ2VzdEhlYWx0aCxcbiAgaW5jaWRlbnQsXG4gIGRvcmFTZXR0aW5ncyxcbiAgdHlwZSBQaXBlbGluZSxcbiAgdHlwZSBQaXBlbGluZUluc2VydCxcbiAgdHlwZSBJbmNpZGVudCxcbiAgdHlwZSBQaXBlbGluZVVwZGF0ZSxcbiAgcGlwZWxpbmVUZW1wbGF0ZSxcbiAgdHlwZSBQaXBlbGluZVRlbXBsYXRlLFxuICB0eXBlIFBpcGVsaW5lVGVtcGxhdGVJbnNlcnQsXG4gIHR5cGUgUGlwZWxpbmVUZW1wbGF0ZVVwZGF0ZSxcbiAgdHlwZSBNZXNzYWdlVHlwZSxcbiAgdHlwZSBNZXNzYWdlUHJpb3JpdHksXG4gIG1lc3NhZ2UsXG4gIHR5cGUgTWVzc2FnZSxcbiAgdHlwZSBNZXNzYWdlSW5zZXJ0LFxuICB0eXBlIE1lc3NhZ2VVcGRhdGUsXG4gIG1lc3NhZ2VBdHRhY2htZW50LFxuICB0eXBlIE1lc3NhZ2VBdHRhY2htZW50LFxuICB0eXBlIFJ1bGVTZXZlcml0eSxcbiAgdHlwZSBSdWxlVGFyZ2V0LFxuICB0eXBlIFJ1bGVPcGVyYXRvcixcbiAgdHlwZSBSdWxlQ29uZGl0aW9uTW9kZSxcbiAgdHlwZSBSdWxlU2NvcGUsXG4gIHR5cGUgUnVsZUNvbmRpdGlvbixcbiAgY29tcGxpYW5jZVBvbGljeSxcbiAgY29tcGxpYW5jZVJ1bGUsXG4gIGNvbXBsaWFuY2VSdWxlSGlzdG9yeSxcbiAgY29tcGxpYW5jZUF1ZGl0TG9nLFxuICBjb21wbGlhbmNlRXhlbXB0aW9uLFxuICBjb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbixcbiAgY29tcGxpYW5jZVNjYW4sXG4gIGNvbXBsaWFuY2VTY2FuU2NoZWR1bGUsXG4gIGNvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlLFxuICBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nLFxuICBjb21wbGlhbmNlUm9sZSxcbiAgY29tcGxpYW5jZVJlcG9ydCxcbiAgY29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlLFxuICB0eXBlIENvbXBsaWFuY2VQb2xpY3ksXG4gIHR5cGUgQ29tcGxpYW5jZVBvbGljeUluc2VydCxcbiAgdHlwZSBDb21wbGlhbmNlUnVsZSxcbiAgdHlwZSBDb21wbGlhbmNlUnVsZUluc2VydCxcbiAgdHlwZSBDb21wbGlhbmNlRXhlbXB0aW9uLFxuICB0eXBlIENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLFxuICB0eXBlIENvbXBsaWFuY2VTY2FuLFxuICB0eXBlIENvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlLFxuICBkYXNoYm9hcmQsXG4gIGRhc2hib2FyZFBhbmVsLFxuICB0eXBlIERhc2hib2FyZCxcbiAgdHlwZSBEYXNoYm9hcmRJbnNlcnQsXG4gIHR5cGUgRGFzaGJvYXJkVXBkYXRlLFxuICB0eXBlIERhc2hib2FyZFBhbmVsLFxuICB0eXBlIERhc2hib2FyZFBhbmVsSW5zZXJ0LFxuICBvcmdBbGVydERlc3RpbmF0aW9uLFxuICBvcmdBbGVydFJ1bGUsXG4gIHR5cGUgT3JnQWxlcnREZXN0aW5hdGlvbixcbiAgdHlwZSBPcmdBbGVydERlc3RpbmF0aW9uSW5zZXJ0LFxuICB0eXBlIEhlYWx0aEJyZWFrZG93bixcbiAgUFVCTElTSEVSX1RJRVJTLFxuICB0eXBlIFB1Ymxpc2hlclRpZXIsXG4gIHR5cGUgUHVibGlzaFJlcXVlc3RLaW5kLFxuICB0eXBlIFB1Ymxpc2hSZXF1ZXN0U3RhdHVzLFxuICBPUEVOX1BVQkxJU0hfUkVRVUVTVF9TVEFUVVNFUyxcbiAgdHlwZSBQdWJsaXNoUmVxdWVzdExhbmUsXG4gIElOU1RBTExfVkVSU0lPTl9QT0xJQ0lFUyxcbiAgdHlwZSBJbnN0YWxsVmVyc2lvblBvbGljeSxcbiAgdHlwZSBJbnN0YWxsU3RhdHVzLFxuICB0eXBlIEluc3RhbGxDaGFuZ2VSZXF1ZXN0LFxuICB0eXBlIEJsb2NrT25BZHZpc29yeSxcbiAgdHlwZSBPZmZpY2lhbEluc3RhbGxzLFxuICB0eXBlIFJldmlld1N0YXR1cyxcbiAgdHlwZSBSZXZpZXdIb2xkUmVhc29uLFxuICBSRVZJRVdfUkVQT1JUX0NBVEVHT1JJRVMsXG4gIHR5cGUgUmV2aWV3UmVwb3J0Q2F0ZWdvcnksXG4gIHR5cGUgQWR2aXNvcnlTZXZlcml0eSxcbiAgdHlwZSBBZHZpc29yeVN0YXRlLFxuICB0eXBlIEFkdmlzb3J5U291cmNlLFxuICB0eXBlIFN1Ym1pc3Npb25DYXRhbG9nLFxuICB0eXBlIFN1Ym1pc3Npb25TdGF0dXMsXG4gIHB1Ymxpc2hlcixcbiAgcGx1Z2luTGlzdGluZyxcbiAgdHlwZSBMaXN0aW5nVmVyc2lvblNwZWNTbmFwc2hvdCxcbiAgcGx1Z2luTGlzdGluZ1ZlcnNpb24sXG4gIHBsdWdpbkFkdmlzb3J5LFxuICBlY29zeXN0ZW1BdXRvQXBwcm92YWxSdWxlLFxuICBwbHVnaW5QdWJsaXNoUmVxdWVzdCxcbiAgZWNvc3lzdGVtUmVzZXJ2ZWROYW1lLFxuICBlY29zeXN0ZW1TZXR0aW5nLFxuICBlY29zeXN0ZW1Db2xsZWN0aW9uLFxuICBwbHVnaW5SZXZpZXcsXG4gIHBsdWdpblJldmlld1JlcGx5LFxuICBwbHVnaW5SZXZpZXdSZXBvcnQsXG4gIHBsdWdpblJldmlld1ZvdGUsXG4gIHBsdWdpblJldmlld0hpc3RvcnksXG4gIHBsdWdpblN0YXRzLFxuICBwbHVnaW5TdWJtaXNzaW9uLFxuICBlY29zeXN0ZW1TZWFyY2hNaXNzLFxuICBlY29zeXN0ZW1Ob3RpZmljYXRpb25RdWV1ZSxcbiAgcGlwZWxpbmVTdGVwTWFuaWZlc3QsXG4gIHBsdWdpbkluc3RhbGwsXG4gIHBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHBsdWdpbkFkdmlzb3J5RGVsaXZlcnksXG4gIHB1YmxpY0xpc3RpbmdzLFxuICBwdWJsaWNMaXN0ZWRWZXJzaW9ucyxcbiAgcHVibGljQWR2aXNvcmllcyxcbiAgcHVibGljUmV2aWV3cyxcbiAgT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSxcbiAgQ09NTVVOSVRZX1BVQkxJU0hFUl9IQU5ETEUsXG4gIHR5cGUgUHVibGlzaGVyLFxuICB0eXBlIFB1Ymxpc2hlckluc2VydCxcbiAgdHlwZSBQbHVnaW5MaXN0aW5nLFxuICB0eXBlIFBsdWdpbkxpc3RpbmdJbnNlcnQsXG4gIHR5cGUgUGx1Z2luTGlzdGluZ1ZlcnNpb24sXG4gIHR5cGUgUGx1Z2luTGlzdGluZ1ZlcnNpb25JbnNlcnQsXG4gIHR5cGUgUGx1Z2luQWR2aXNvcnksXG4gIHR5cGUgUGx1Z2luQWR2aXNvcnlJbnNlcnQsXG4gIHR5cGUgRWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZSxcbiAgdHlwZSBFY29zeXN0ZW1BdXRvQXBwcm92YWxSdWxlSW5zZXJ0LFxuICB0eXBlIFBsdWdpblB1Ymxpc2hSZXF1ZXN0LFxuICB0eXBlIFBsdWdpblB1Ymxpc2hSZXF1ZXN0SW5zZXJ0LFxuICB0eXBlIEVjb3N5c3RlbVJlc2VydmVkTmFtZSxcbiAgdHlwZSBQbHVnaW5SZXZpZXcsXG4gIHR5cGUgUGx1Z2luUmV2aWV3SW5zZXJ0LFxuICB0eXBlIFBsdWdpblJldmlld1JlcGx5LFxuICB0eXBlIFBsdWdpblJldmlld1JlcGx5SW5zZXJ0LFxuICB0eXBlIFBsdWdpblJldmlld1JlcG9ydCxcbiAgdHlwZSBQbHVnaW5SZXZpZXdSZXBvcnRJbnNlcnQsXG4gIHR5cGUgUGx1Z2luUmV2aWV3SGlzdG9yeUluc2VydCxcbiAgdHlwZSBQbHVnaW5TdGF0cyxcbiAgdHlwZSBQbHVnaW5TdGF0c0luc2VydCxcbiAgdHlwZSBQbHVnaW5TdWJtaXNzaW9uLFxuICB0eXBlIFBsdWdpblN1Ym1pc3Npb25JbnNlcnQsXG4gIHR5cGUgUGx1Z2luSW5zdGFsbCxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsSW5zZXJ0LFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUGx1Z2luSW5zdGFsbFBvbGljeUluc2VydCxcbiAgdHlwZSBQdWJsaWNSZXZpZXcsXG59IGZyb20gJy4vZHJpenpsZS1zY2hlbWEuanMnO1xuZXhwb3J0IHtcbiAgZ2V0U3NsQ29uZmlnLFxuICBnZXRDb25uZWN0aW9uLFxuICBjbG9zZUNvbm5lY3Rpb24sXG4gIHRlc3RDb25uZWN0aW9uLFxuICB0eXBlIENvbm5lY3Rpb25PcHRpb25zLFxuICBDb25uZWN0aW9uLFxuICBkYixcbn0gZnJvbSAnLi9wb3N0Z3Jlcy1jb25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90ZW5hbmN5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLXJlYWRlci5qcyc7XG5leHBvcnQge1xuICBQR19VTklRVUVfVklPTEFUSU9OLFxuICBpc1VuaXF1ZVZpb2xhdGlvbixcbiAgcmVzdWx0Um93cyxcbiAgZXhlY3V0ZVJvd3MsXG4gIHR5cGUgU3FsRXhlY3V0b3IsXG59IGZyb20gJy4vcGctcmVzdWx0LmpzJztcbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import type { SQL } from 'drizzle-orm';
2
+ /** PostgreSQL SQLSTATE for `unique_violation`. */
3
+ export declare const PG_UNIQUE_VIOLATION = "23505";
4
+ /**
5
+ * True when `err` is a PostgreSQL unique-constraint violation. Drizzle may
6
+ * wrap the driver error, so the `cause` chain is checked too.
7
+ */
8
+ export declare function isUniqueViolation(err: unknown): boolean;
9
+ /**
10
+ * Rows of a raw `execute(sql\`…\`)` result. node-postgres returns
11
+ * `{ rows }`; some drivers (and test fakes) return the bare array.
12
+ */
13
+ export declare function resultRows<T>(res: unknown): T[];
14
+ /** Anything with Drizzle's raw `execute` — the db handle or a transaction. */
15
+ export interface SqlExecutor {
16
+ execute(query: SQL): PromiseLike<unknown>;
17
+ }
18
+ /** Run a raw SQL query and return its rows typed as `T`. */
19
+ export declare function executeRows<T>(executor: SqlExecutor, query: SQL): Promise<T[]>;
@@ -0,0 +1,32 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /** PostgreSQL SQLSTATE for `unique_violation`. */
4
+ export const PG_UNIQUE_VIOLATION = '23505';
5
+ /**
6
+ * True when `err` is a PostgreSQL unique-constraint violation. Drizzle may
7
+ * wrap the driver error, so the `cause` chain is checked too.
8
+ */
9
+ export function isUniqueViolation(err) {
10
+ let cur = err;
11
+ for (let depth = 0; depth < 5 && cur && typeof cur === 'object'; depth++) {
12
+ if (cur.code === PG_UNIQUE_VIOLATION)
13
+ return true;
14
+ cur = cur.cause;
15
+ }
16
+ return false;
17
+ }
18
+ /**
19
+ * Rows of a raw `execute(sql\`…\`)` result. node-postgres returns
20
+ * `{ rows }`; some drivers (and test fakes) return the bare array.
21
+ */
22
+ export function resultRows(res) {
23
+ if (Array.isArray(res))
24
+ return res;
25
+ const rows = res?.rows;
26
+ return Array.isArray(rows) ? rows : [];
27
+ }
28
+ /** Run a raw SQL query and return its rows typed as `T`. */
29
+ export async function executeRows(executor, query) {
30
+ return resultRows(await executor.execute(query));
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGctcmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFiYXNlL3BnLXJlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBSXRDLGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUM7QUFFM0M7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQVk7SUFDNUMsSUFBSSxHQUFHLEdBQVksR0FBRyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3pFLElBQUssR0FBMEIsQ0FBQyxJQUFJLEtBQUssbUJBQW1CO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUUsR0FBRyxHQUFJLEdBQTJCLENBQUMsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFJLEdBQVk7SUFDeEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sR0FBVSxDQUFDO0lBQzFDLE1BQU0sSUFBSSxHQUFJLEdBQTZDLEVBQUUsSUFBSSxDQUFDO0lBQ2xFLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUUsSUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQU9ELDREQUE0RDtBQUM1RCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBSSxRQUFxQixFQUFFLEtBQVU7SUFDcEUsT0FBTyxVQUFVLENBQUksTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcblxuLyoqIFBvc3RncmVTUUwgU1FMU1RBVEUgZm9yIGB1bmlxdWVfdmlvbGF0aW9uYC4gKi9cbmV4cG9ydCBjb25zdCBQR19VTklRVUVfVklPTEFUSU9OID0gJzIzNTA1JztcblxuLyoqXG4gKiBUcnVlIHdoZW4gYGVycmAgaXMgYSBQb3N0Z3JlU1FMIHVuaXF1ZS1jb25zdHJhaW50IHZpb2xhdGlvbi4gRHJpenpsZSBtYXlcbiAqIHdyYXAgdGhlIGRyaXZlciBlcnJvciwgc28gdGhlIGBjYXVzZWAgY2hhaW4gaXMgY2hlY2tlZCB0b28uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaXF1ZVZpb2xhdGlvbihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgbGV0IGN1cjogdW5rbm93biA9IGVycjtcbiAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IDUgJiYgY3VyICYmIHR5cGVvZiBjdXIgPT09ICdvYmplY3QnOyBkZXB0aCsrKSB7XG4gICAgaWYgKChjdXIgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlID09PSBQR19VTklRVUVfVklPTEFUSU9OKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXIgPSAoY3VyIGFzIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSb3dzIG9mIGEgcmF3IGBleGVjdXRlKHNxbFxcYOKAplxcYClgIHJlc3VsdC4gbm9kZS1wb3N0Z3JlcyByZXR1cm5zXG4gKiBgeyByb3dzIH1gOyBzb21lIGRyaXZlcnMgKGFuZCB0ZXN0IGZha2VzKSByZXR1cm4gdGhlIGJhcmUgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN1bHRSb3dzPFQ+KHJlczogdW5rbm93bik6IFRbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHJldHVybiByZXMgYXMgVFtdO1xuICBjb25zdCByb3dzID0gKHJlcyBhcyB7IHJvd3M/OiB1bmtub3duIH0gfCBudWxsIHwgdW5kZWZpbmVkKT8ucm93cztcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocm93cykgPyAocm93cyBhcyBUW10pIDogW107XG59XG5cbi8qKiBBbnl0aGluZyB3aXRoIERyaXp6bGUncyByYXcgYGV4ZWN1dGVgIOKAlCB0aGUgZGIgaGFuZGxlIG9yIGEgdHJhbnNhY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFNxbEV4ZWN1dG9yIHtcbiAgZXhlY3V0ZShxdWVyeTogU1FMKTogUHJvbWlzZUxpa2U8dW5rbm93bj47XG59XG5cbi8qKiBSdW4gYSByYXcgU1FMIHF1ZXJ5IGFuZCByZXR1cm4gaXRzIHJvd3MgdHlwZWQgYXMgYFRgLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVSb3dzPFQ+KGV4ZWN1dG9yOiBTcWxFeGVjdXRvciwgcXVlcnk6IFNRTCk6IFByb21pc2U8VFtdPiB7XG4gIHJldHVybiByZXN1bHRSb3dzPFQ+KGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnkpKTtcbn1cbiJdfQ==
@@ -1,21 +1,11 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { createLogger } from '@pipeline-builder/api-core';
3
+ import { createLogger, envBool, envInt, envStr } from '@pipeline-builder/api-core';
4
4
  import { drizzle } from 'drizzle-orm/node-postgres';
5
5
  import { Pool } from 'pg';
6
6
  import { schema } from './drizzle-schema.js';
7
7
  import { ConnectionRetryStrategy } from './retry-strategy.js';
8
8
  const logger = createLogger('database');
9
- /**
10
- * Get database configuration from environment variables
11
- * Note: Uses environment variables directly to avoid circular dependency with pipeline-core
12
- */
13
- function parseIntEnv(value, fallback) {
14
- if (!value)
15
- return fallback;
16
- const parsed = parseInt(value, 10);
17
- return Number.isNaN(parsed) ? fallback : parsed;
18
- }
19
9
  /** Detect Lambda environment for pool-size tuning */
20
10
  const isLambda = !!process.env.AWS_LAMBDA_FUNCTION_NAME;
21
11
  /**
@@ -53,7 +43,7 @@ export function getSslConfig(explicit) {
53
43
  enabled = process.env.NODE_ENV === 'production';
54
44
  if (!enabled)
55
45
  return false;
56
- return { rejectUnauthorized: process.env.DB_SSL_REJECT_UNAUTHORIZED === 'true' };
46
+ return { rejectUnauthorized: envBool('DB_SSL_REJECT_UNAUTHORIZED', false) };
57
47
  }
58
48
  function getDatabaseConfig() {
59
49
  // Lambda: small pool (each invocation is short-lived, many concurrent instances)
@@ -61,14 +51,14 @@ function getDatabaseConfig() {
61
51
  const defaultPoolSize = isLambda ? 2 : 20;
62
52
  const defaultIdleTimeout = isLambda ? 10000 : 30000;
63
53
  return {
64
- host: process.env.DB_HOST || 'postgres',
65
- port: parseIntEnv(process.env.DB_PORT, 5432),
66
- database: process.env.DATABASE || 'pipeline_builder',
67
- user: process.env.DB_USER || 'postgres',
54
+ host: envStr('DB_HOST', 'postgres'),
55
+ port: envInt('DB_PORT', 5432),
56
+ database: envStr('DATABASE', 'pipeline_builder'),
57
+ user: envStr('DB_USER', 'postgres'),
68
58
  password: process.env.DB_PASSWORD || (process.env.NODE_ENV === 'production' ? (() => { throw new Error('DB_PASSWORD is required in production'); })() : ''),
69
- maxPoolSize: parseIntEnv(process.env.DRIZZLE_MAX_POOL_SIZE, defaultPoolSize),
70
- idleTimeoutMillis: parseIntEnv(process.env.DRIZZLE_IDLE_TIMEOUT_MILLIS, defaultIdleTimeout),
71
- connectionTimeoutMillis: parseIntEnv(process.env.DRIZZLE_CONNECTION_TIMEOUT_MILLIS, 5000),
59
+ maxPoolSize: envInt('DRIZZLE_MAX_POOL_SIZE', defaultPoolSize),
60
+ idleTimeoutMillis: envInt('DRIZZLE_IDLE_TIMEOUT_MILLIS', defaultIdleTimeout),
61
+ connectionTimeoutMillis: envInt('DRIZZLE_CONNECTION_TIMEOUT_MILLIS', 5000),
72
62
  };
73
63
  }
74
64
  /**
@@ -115,11 +105,11 @@ export class Connection {
115
105
  this.options = {
116
106
  enableLogging: options.enableLogging ?? true,
117
107
  enableAutoRetry: options.enableAutoRetry ?? true,
118
- maxRetries: options.maxRetries ?? parseInt(process.env.DB_MAX_RETRIES || '3', 10),
119
- retryDelay: options.retryDelay ?? parseInt(process.env.DB_RETRY_DELAY_MS || '1000', 10),
108
+ maxRetries: options.maxRetries ?? envInt('DB_MAX_RETRIES', 3, { min: 0 }),
109
+ retryDelay: options.retryDelay ?? envInt('DB_RETRY_DELAY_MS', 1000, { min: 0 }),
120
110
  // Env-driven TLS: on-by-default in production, env-enableable elsewhere.
121
111
  // getInstance() is normally called with no options, so this is the only
122
- // place production RDS connections pick up SSL (formerly hard-coded off).
112
+ // place production RDS connections pick up SSL.
123
113
  ssl: getSslConfig(options.ssl),
124
114
  };
125
115
  // Initialize retry strategy
@@ -225,7 +215,7 @@ export class Connection {
225
215
  * @param timeout - Maximum time to wait for connections to close (ms)
226
216
  * @returns Promise that resolves when pool is closed
227
217
  */
228
- async close(timeout = parseIntEnv(process.env.DB_CLOSE_TIMEOUT_MS, 5000)) {
218
+ async close(timeout = envInt('DB_CLOSE_TIMEOUT_MS', 5000)) {
229
219
  if (this.isShuttingDown) {
230
220
  logger.warn('Connection is already shutting down');
231
221
  return;
@@ -410,4 +400,4 @@ export async function testConnection() {
410
400
  const connection = Connection.getInstance();
411
401
  return connection.testConnection();
412
402
  }
413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wb3N0Z3Jlcy1jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFtQixNQUFNLElBQUksQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBRXhDOzs7R0FHRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQXlCLEVBQUUsUUFBZ0I7SUFDOUQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDbEQsQ0FBQztBQUVELHFEQUFxRDtBQUNyRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxRQUFtQztJQUM5RCxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFFNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVB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TUFBTSxVQUFVLGFBQWE7SUFDM0IsT0FBTyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWU7SUFDbkMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVDLE1BQU0sVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQyxzQkFBc0I7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjO0lBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QyxPQUFPLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGRyaXp6bGUgfSBmcm9tICdkcml6emxlLW9ybS9ub2RlLXBvc3RncmVzJztcbmltcG9ydCB7IFBvb2wsIHR5cGUgUG9vbENvbmZpZyB9IGZyb20gJ3BnJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4vZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblJldHJ5U3RyYXRlZ3kgfSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdkYXRhYmFzZScpO1xuXG4vKipcbiAqIEdldCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKiBOb3RlOiBVc2VzIGVudmlyb25tZW50IHZhcmlhYmxlcyBkaXJlY3RseSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggcGlwZWxpbmUtY29yZVxuICovXG5mdW5jdGlvbiBwYXJzZUludEVudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbGxiYWNrO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZCkgPyBmYWxsYmFjayA6IHBhcnNlZDtcbn1cblxuLyoqIERldGVjdCBMYW1iZGEgZW52aXJvbm1lbnQgZm9yIHBvb2wtc2l6ZSB0dW5pbmcgKi9cbmNvbnN0IGlzTGFtYmRhID0gISFwcm9jZXNzLmVudi5BV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUU7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcGcgVExTL1NTTCBjb25maWcgZnJvbSBhbiBleHBsaWNpdCBvcHRpb24gb3IgdGhlIGVudmlyb25tZW50LFxuICogZm9sbG93aW5nIHRoZSBzYW1lIGVudi10dW5hYmxlIHBhdHRlcm4gYXMgdGhlIHBvb2wgc2l6aW5nIGFib3ZlLlxuICpcbiAqIFByZWNlZGVuY2U6XG4gKiAgIDEuIEFuIGV4cGxpY2l0IGBvcHRpb25zLnNzbGAgKGNvbnN0cnVjdG9yIGFyZykgYWx3YXlzIHdpbnMg4oCUIGluY2x1ZGluZyBhblxuICogICAgICBleHBsaWNpdCBgZmFsc2VgIHRvIGZvcmNlIHBsYWludGV4dC5cbiAqICAgMi4gYERCX1NTTGAgKGB0cnVlYC9gMWAgb24sIGBmYWxzZWAvYDBgIG9mZikgb3IgUG9zdGdyZXMnIHN0YW5kYXJkXG4gKiAgICAgIGBQR1NTTE1PREVgIChgZGlzYWJsZWAgPSBvZmYsIGFueSBvdGhlciBtb2RlID0gb24pLlxuICogICAzLiBEZWZhdWx0OiBPTiBpbiBwcm9kdWN0aW9uIChSRFMgY29ubmVjdGlvbnMgbXVzdCBiZSBlbmNyeXB0ZWQgaW4gdHJhbnNpdCksXG4gKiAgICAgIE9GRiBldmVyeXdoZXJlIGVsc2Ugc28gYSBsb2NhbCBQb3N0Z3JlcyB3aXRob3V0IFRMUyBrZWVwcyB3b3JraW5nLlxuICpcbiAqIFdoZW4gZW5hYmxlZCwgYHJlamVjdFVuYXV0aG9yaXplZGAgZm9sbG93cyBgREJfU1NMX1JFSkVDVF9VTkFVVEhPUklaRURgXG4gKiAoZGVmYXVsdCBgZmFsc2VgKTogQVdTIFJEUyBwcmVzZW50cyBhIGNlcnQgc2lnbmVkIGJ5IHRoZSBSRFMgQ0EsIHdoaWNoIGlzIG5vdFxuICogaW4gTm9kZSdzIGRlZmF1bHQgdHJ1c3Qgc3RvcmUgdW5sZXNzIHRoZSBDQSBidW5kbGUgaXMgbW91bnRlZCwgc28gY2VydGlmaWNhdGVcbiAqIFZFUklGSUNBVElPTiBpcyBvcHQtaW4gdG8gYXZvaWQgYnJlYWtpbmcgYSBzdG9jayBSRFMgZGVwbG95IOKAlCB0aGUgY2hhbm5lbCBpc1xuICogc3RpbGwgRU5DUllQVEVELiBTZXQgYERCX1NTTF9SRUpFQ1RfVU5BVVRIT1JJWkVEPXRydWVgIG9uY2UgdGhlIFJEUyBDQSBidW5kbGVcbiAqIGlzIHdpcmVkIHRvIGdldCBmdWxsIHZlcmlmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNzbENvbmZpZyhleHBsaWNpdD86IENvbm5lY3Rpb25PcHRpb25zWydzc2wnXSk6IGJvb2xlYW4gfCB7IHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbiB9IHtcbiAgaWYgKGV4cGxpY2l0ICE9PSB1bmRlZmluZWQpIHJldHVybiBleHBsaWNpdDtcblxuICBjb25zdCBkYlNzbCA9IHByb2Nlc3MuZW52LkRCX1NTTD8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgc3NsTW9kZSA9IHByb2Nlc3MuZW52LlBHU1NMTU9ERT8udG9Mb3dlckNhc2UoKTtcblxuICBsZXQgZW5hYmxlZDogYm9vbGVhbjtcbiAgaWYgKGRiU3NsID09PSAndHJ1ZScgfHwgZGJTc2wgPT09ICcxJykgZW5hYmxlZCA9IHRydWU7XG4gIGVsc2UgaWYgKGRiU3NsID09PSAnZmFsc2UnIHx8IGRiU3NsID09PSAnMCcpIGVuYWJsZWQgPSBmYWxzZTtcbiAgZWxzZSBpZiAoc3NsTW9kZSkgZW5hYmxlZCA9IHNzbE1vZGUgIT09ICdkaXNhYmxlJztcbiAgZWxzZSBlbmFibGVkID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJztcblxuICBpZiAoIWVuYWJsZWQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHsgcmVqZWN0VW5hdXRob3JpemVkOiBwcm9jZXNzLmVudi5EQl9TU0xfUkVKRUNUX1VOQVVUSE9SSVpFRCA9PT0gJ3RydWUnIH07XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlQ29uZmlnKCkge1xuICAvLyBMYW1iZGE6IHNtYWxsIHBvb2wgKGVhY2ggaW52b2NhdGlvbiBpcyBzaG9ydC1saXZlZCwgbWFueSBjb25jdXJyZW50IGluc3RhbmNlcylcbiAgLy8gRUNTL2xvbmctcnVubmluZzogbGFyZ2VyIHBvb2wgZm9yIHN1c3RhaW5lZCBjb25jdXJyZW5jeVxuICBjb25zdCBkZWZhdWx0UG9vbFNpemUgPSBpc0xhbWJkYSA/IDIgOiAyMDtcbiAgY29uc3QgZGVmYXVsdElkbGVUaW1lb3V0ID0gaXNMYW1iZGEgPyAxMDAwMCA6IDMwMDAwO1xuXG4gIHJldHVybiB7XG4gICAgaG9zdDogcHJvY2Vzcy5lbnYuREJfSE9TVCB8fCAncG9zdGdyZXMnLFxuICAgIHBvcnQ6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRCX1BPUlQsIDU0MzIpLFxuICAgIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5EQVRBQkFTRSB8fCAncGlwZWxpbmVfYnVpbGRlcicsXG4gICAgdXNlcjogcHJvY2Vzcy5lbnYuREJfVVNFUiB8fCAncG9zdGdyZXMnLFxuICAgIHBhc3N3b3JkOiBwcm9jZXNzLmVudi5EQl9QQVNTV09SRCB8fCAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyA/ICgoKSA9PiB7IHRocm93IG5ldyBFcnJvcignREJfUEFTU1dPUkQgaXMgcmVxdWlyZWQgaW4gcHJvZHVjdGlvbicpOyB9KSgpIGFzIHN0cmluZyA6ICcnKSxcbiAgICBtYXhQb29sU2l6ZTogcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuRFJJWlpMRV9NQVhfUE9PTF9TSVpFLCBkZWZhdWx0UG9vbFNpemUpLFxuICAgIGlkbGVUaW1lb3V0TWlsbGlzOiBwYXJzZUludEVudihwcm9jZXNzLmVudi5EUklaWkxFX0lETEVfVElNRU9VVF9NSUxMSVMsIGRlZmF1bHRJZGxlVGltZW91dCksXG4gICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IHBhcnNlSW50RW52KHByb2Nlc3MuZW52LkRSSVpaTEVfQ09OTkVDVElPTl9USU1FT1VUX01JTExJUywgNTAwMCksXG4gIH07XG59XG5cbi8qKlxuICogRGF0YWJhc2UgY29ubmVjdGlvbiBzdGF0aXN0aWNzIGZvciBtb25pdG9yaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvblN0YXRzIHtcbiAgdG90YWxDb3VudDogbnVtYmVyO1xuICBpZGxlQ291bnQ6IG51bWJlcjtcbiAgd2FpdGluZ0NvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIC8qKiBXaGV0aGVyIHRvIGVuYWJsZSBjb25uZWN0aW9uIGxvZ2dpbmcgKi9cbiAgZW5hYmxlTG9nZ2luZz86IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSByZXRyeSBmYWlsZWQgY29ubmVjdGlvbnMgKi9cbiAgZW5hYmxlQXV0b1JldHJ5PzogYm9vbGVhbjtcblxuICAvKiogTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbiByZXRyeSBhdHRlbXB0cyAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuXG4gIC8qKiBEZWxheSBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzIGluIG1pbGxpc2Vjb25kcyAqL1xuICByZXRyeURlbGF5PzogbnVtYmVyO1xuXG4gIC8qKiBTU0wgY29uZmlndXJhdGlvbiAqL1xuICBzc2w/OiBib29sZWFuIHwgeyByZWplY3RVbmF1dGhvcml6ZWQ6IGJvb2xlYW4gfTtcbn1cblxuLyoqXG4gKiBTaW5nbGV0b24gZGF0YWJhc2UgY29ubmVjdGlvbiBjbGFzcy5cbiAqIE1hbmFnZXMgUG9zdGdyZVNRTCBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIERyaXp6bGUgT1JNIGluc3RhbmNlLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBTaW5nbGV0b24gcGF0dGVybiBmb3Igc2luZ2xlIGNvbm5lY3Rpb24gcG9vbFxuICogLSBBdXRvbWF0aWMgY29ubmVjdGlvbiByZXRyeSB3aXRoIGJhY2tvZmZcbiAqIC0gQ29ubmVjdGlvbiBoZWFsdGggbW9uaXRvcmluZ1xuICogLSBHcmFjZWZ1bCBzaHV0ZG93biBoYW5kbGluZ1xuICogLSBDb21wcmVoZW5zaXZlIGVycm9yIGhhbmRsaW5nXG4gKiAtIENvbm5lY3Rpb24gc3RhdGlzdGljcyB0cmFja2luZ1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICogY29uc3QgcGx1Z2lucyA9IGF3YWl0IGNvbm5lY3Rpb24uZGIuc2VsZWN0KCkuZnJvbShzY2hlbWEucGx1Z2luKTtcbiAqXG4gKiAvLyBEdXJpbmcgc2h1dGRvd25cbiAqIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb25uZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIERyaXp6bGUgT1JNIGRhdGFiYXNlIGluc3RhbmNlIHdpdGggc2NoZW1hXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGI6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcG9vbDogUG9vbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxDb25uZWN0aW9uT3B0aW9ucz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV0cnlTdHJhdGVneTogQ29ubmVjdGlvblJldHJ5U3RyYXRlZ3k7XG4gIHByaXZhdGUgaXNTaHV0dGluZ0Rvd24gPSBmYWxzZTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBlbmZvcmNlIHNpbmdsZXRvbiBwYXR0ZXJuLlxuICAgKiBJbml0aWFsaXplcyBQb3N0Z3JlU1FMIGNvbm5lY3Rpb24gcG9vbCBhbmQgRHJpenpsZSBPUk0gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbm5lY3Rpb25cbiAgICogQHRocm93cyB7RXJyb3J9IElmIGRhdGFiYXNlIGluaXRpYWxpemF0aW9uIGZhaWxzIGFmdGVyIGFsbCByZXRyaWVzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbm5lY3Rpb25PcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBlbmFibGVMb2dnaW5nOiBvcHRpb25zLmVuYWJsZUxvZ2dpbmcgPz8gdHJ1ZSxcbiAgICAgIGVuYWJsZUF1dG9SZXRyeTogb3B0aW9ucy5lbmFibGVBdXRvUmV0cnkgPz8gdHJ1ZSxcbiAgICAgIG1heFJldHJpZXM6IG9wdGlvbnMubWF4UmV0cmllcyA/PyBwYXJzZUludChwcm9jZXNzLmVudi5EQl9NQVhfUkVUUklFUyB8fCAnMycsIDEwKSxcbiAgICAgIHJldHJ5RGVsYXk6IG9wdGlvbnMucmV0cnlEZWxheSA/PyBwYXJzZUludChwcm9jZXNzLmVudi5EQl9SRVRSWV9ERUxBWV9NUyB8fCAnMTAwMCcsIDEwKSxcbiAgICAgIC8vIEVudi1kcml2ZW4gVExTOiBvbi1ieS1kZWZhdWx0IGluIHByb2R1Y3Rpb24sIGVudi1lbmFibGVhYmxlIGVsc2V3aGVyZS5cbiAgICAgIC8vIGdldEluc3RhbmNlKCkgaXMgbm9ybWFsbHkgY2FsbGVkIHdpdGggbm8gb3B0aW9ucywgc28gdGhpcyBpcyB0aGUgb25seVxuICAgICAgLy8gcGxhY2UgcHJvZHVjdGlvbiBSRFMgY29ubmVjdGlvbnMgcGljayB1cCBTU0wgKGZvcm1lcmx5IGhhcmQtY29kZWQgb2ZmKS5cbiAgICAgIHNzbDogZ2V0U3NsQ29uZmlnKG9wdGlvbnMuc3NsKSxcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSByZXRyeSBzdHJhdGVneVxuICAgIHRoaXMucmV0cnlTdHJhdGVneSA9IG5ldyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSh7XG4gICAgICBtYXhSZXRyaWVzOiB0aGlzLm9wdGlvbnMubWF4UmV0cmllcyxcbiAgICAgIHJldHJ5RGVsYXlNczogdGhpcy5vcHRpb25zLnJldHJ5RGVsYXksXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gZ2V0RGF0YWJhc2VDb25maWcoKTtcblxuICAgICAgY29uc3QgcG9vbENvbmZpZzogUG9vbENvbmZpZyA9IHtcbiAgICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICAgIHBvcnQ6IGNvbmZpZy5wb3J0LFxuICAgICAgICBkYXRhYmFzZTogY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICB1c2VyOiBjb25maWcudXNlcixcbiAgICAgICAgcGFzc3dvcmQ6IGNvbmZpZy5wYXNzd29yZCxcbiAgICAgICAgbWF4OiBjb25maWcubWF4UG9vbFNpemUsXG4gICAgICAgIGlkbGVUaW1lb3V0TWlsbGlzOiBjb25maWcuaWRsZVRpbWVvdXRNaWxsaXMsXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBjb25maWcuY29ubmVjdGlvblRpbWVvdXRNaWxsaXMsXG4gICAgICAgIHNzbDogdGhpcy5vcHRpb25zLnNzbCxcbiAgICAgICAgYWxsb3dFeGl0T25JZGxlOiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5wb29sID0gbmV3IFBvb2wocG9vbENvbmZpZyk7XG4gICAgICB0aGlzLnNldHVwRXZlbnRIYW5kbGVycygpO1xuXG4gICAgICB0aGlzLmRiID0gZHJpenpsZSh0aGlzLnBvb2wsIHsgc2NoZW1hIH0pO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIHRoaXMubG9nQ29ubmVjdGlvbkNvbmZpZyhwb29sQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkYXRhYmFzZSBjb25uZWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcy5cbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBpZiBvbmUgZG9lc24ndCBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChvbmx5IHVzZWQgb24gZmlyc3QgY2FsbClcbiAgICogQHJldHVybnMgVGhlIHNpbmdsZXRvbiBDb25uZWN0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKG9wdGlvbnM/OiBDb25uZWN0aW9uT3B0aW9ucyk6IENvbm5lY3Rpb24ge1xuICAgIGlmICghQ29ubmVjdGlvbi5pbnN0YW5jZSkge1xuICAgICAgQ29ubmVjdGlvbi5pbnN0YW5jZSA9IG5ldyBDb25uZWN0aW9uKG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gQ29ubmVjdGlvbi5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHJlY29uZmlndXJpbmcgdGhlIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbG9zZUV4aXN0aW5nIC0gV2hldGhlciB0byBjbG9zZSBleGlzdGluZyBjb25uZWN0aW9uIGJlZm9yZSByZXNldFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyByZXNldChjbG9zZUV4aXN0aW5nOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChDb25uZWN0aW9uLmluc3RhbmNlICYmIGNsb3NlRXhpc3RpbmcpIHtcbiAgICAgIGF3YWl0IENvbm5lY3Rpb24uaW5zdGFuY2UuY2xvc2UoKTtcbiAgICB9XG4gICAgQ29ubmVjdGlvbi5pbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGVzdHMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgY29ubmVjdGlvbiBpcyBoZWFsdGh5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdGVzdENvbm5lY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMucG9vbC5jb25uZWN0KCk7XG4gICAgICAvLyBSZWxlYXNlIGV2ZW4gaWYgdGhlIHByb2JlIHF1ZXJ5IHRocm93cyDigJQgb3RoZXJ3aXNlIGEgZmxha3kgREIgKHRoZSBleGFjdFxuICAgICAgLy8gY2FzZSB0aGlzIGNoZWNrIGV4aXN0cyBmb3IpIGxlYWtzIGEgcG9vbGVkIGNsaWVudCBlYWNoIGZhaWx1cmUgYW5kIGNhblxuICAgICAgLy8gZXhoYXVzdCB0aGUgcG9vbCBvbiB0aGUgcmV0cnkgcGF0aC5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeSgnU0VMRUNUIDEnKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdCBzdWNjZXNzZnVsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzLmxlbmd0aCA+IDA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjbGllbnQucmVsZWFzZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0RhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbm5lY3Rpb24gcG9vbCBzdGF0aXN0aWNzXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgY29ubmVjdGlvbiBwb29sIHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0cygpOiBDb25uZWN0aW9uU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbENvdW50OiB0aGlzLnBvb2wudG90YWxDb3VudCxcbiAgICAgIGlkbGVDb3VudDogdGhpcy5wb29sLmlkbGVDb3VudCxcbiAgICAgIHdhaXRpbmdDb3VudDogdGhpcy5wb29sLndhaXRpbmdDb3VudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIGdyYWNlZnVsbHkuXG4gICAqIFNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHNodXRkb3duLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZW91dCAtIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBjb25uZWN0aW9ucyB0byBjbG9zZSAobXMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHBvb2wgaXMgY2xvc2VkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xvc2UodGltZW91dDogbnVtYmVyID0gcGFyc2VJbnRFbnYocHJvY2Vzcy5lbnYuREJfQ0xPU0VfVElNRU9VVF9NUywgNTAwMCkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1NodXR0aW5nRG93bikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Nvbm5lY3Rpb24gaXMgYWxyZWFkeSBzaHV0dGluZyBkb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1NodXR0aW5nRG93biA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDbG9zaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbC4uLicpO1xuICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuZ2V0U3RhdHMoKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFBvb2wgc3RhdHMgLSBUb3RhbDogJHtzdGF0cy50b3RhbENvdW50fSwgSWRsZTogJHtzdGF0cy5pZGxlQ291bnR9LCBXYWl0aW5nOiAke3N0YXRzLndhaXRpbmdDb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGEgdGltZW91dCBmb3IgZ3JhY2VmdWwgc2h1dGRvd25cbiAgICAgIGNvbnN0IGNsb3NlUHJvbWlzZSA9IHRoaXMucG9vbC5lbmQoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlIHRpbWVvdXQnKSksIHRpbWVvdXQpLFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtjbG9zZVByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBjbG9zZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xvc2luZyBkYXRhYmFzZSBjb25uZWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU2h1dHRpbmdEb3duID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29ubmVjdGlvbiBpcyBzaHV0dGluZyBkb3duXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgY29ubmVjdGlvbiBpcyBpbiBzaHV0ZG93biBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGlzQ2xvc2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1NodXR0aW5nRG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY29ubmVjdGlvbiBwb29sXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICB0aGlzLnBvb2wub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKCdVbmV4cGVjdGVkIGVycm9yIG9uIGlkbGUgY2xpZW50OicsIGVycik7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlQXV0b1JldHJ5ICYmIHRoaXMucmV0cnlTdHJhdGVneS5nZXRBdHRlbXB0cygpIDwgdGhpcy5vcHRpb25zLm1heFJldHJpZXMpIHtcbiAgICAgICAgdm9pZCB0aGlzLnJldHJ5U3RyYXRlZ3kuaGFuZGxlQ29ubmVjdGlvbkVycm9yKGVyciwgKCkgPT4gdGhpcy50ZXN0Q29ubmVjdGlvbigpKS5jYXRjaCgocmV0cnlFcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Nvbm5lY3Rpb24gcmV0cnkgZXJyb3I6JywgcmV0cnlFcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucG9vbC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMucmV0cnlTdHJhdGVneS5yZXNldCgpOyAvLyBSZXNldCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb25cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnTmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucG9vbC5vbigncmVtb3ZlJywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2xpZW50IHJlbW92ZWQgZnJvbSBwb29sJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gKHNhbml0aXplZClcbiAgICovXG4gIHByaXZhdGUgbG9nQ29ubmVjdGlvbkNvbmZpZyhjb25maWc6IFBvb2xDb25maWcpOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgQ29uZmlndXJhdGlvbjonLCB7XG4gICAgICBob3N0OiBgJHtjb25maWcuaG9zdH06JHtjb25maWcucG9ydH1gLFxuICAgICAgZGF0YWJhc2U6IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgIHVzZXI6IGNvbmZpZy51c2VyLFxuICAgICAgbWF4UG9vbFNpemU6IGNvbmZpZy5tYXgsXG4gICAgICBpZGxlVGltZW91dE1zOiBjb25maWcuaWRsZVRpbWVvdXRNaWxsaXMsXG4gICAgICBjb25uZWN0aW9uVGltZW91dE1zOiBjb25maWcuY29ubmVjdGlvblRpbWVvdXRNaWxsaXMsXG4gICAgICBzc2w6IGNvbmZpZy5zc2wgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2luZ2xldG9uIGRhdGFiYXNlIGluc3RhbmNlIGZvciB1c2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGRiIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiAvLyBTZWxlY3QgcXVlcmllc1xuICogY29uc3QgcGx1Z2lucyA9IGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbik7XG4gKlxuICogLy8gSW5zZXJ0IHF1ZXJpZXNcbiAqIGF3YWl0IGRiLmluc2VydChzY2hlbWEucGx1Z2luKS52YWx1ZXMoeyBuYW1lOiAnbXktcGx1Z2luJyB9KTtcbiAqXG4gKiAvLyBUcmFuc2FjdGlvbnNcbiAqIGF3YWl0IGRiLnRyYW5zYWN0aW9uKGFzeW5jICh0eCkgPT4ge1xuICogICBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBsdWdpbikudmFsdWVzKHsgLi4uIH0pO1xuICogICBhd2FpdCB0eC51cGRhdGUoc2NoZW1hLnBsdWdpbikuc2V0KHsgLi4uIH0pO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuXG4vLyBMYXp5IGluaXRpYWxpemF0aW9uIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIG9uIG1vZHVsZSBsb2FkXG5sZXQgX2RiSW5zdGFuY2U6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+IHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhYmFzZSBpbnN0YW5jZSB3aXRoIGxhenkgaW5pdGlhbGl6YXRpb25cbiAqIFRoaXMgYXZvaWRzIHRoZSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbW9kdWxlIGlzIGxvYWRlZCBiZWZvcmUgZW52aXJvbm1lbnQgaXMgY29uZmlndXJlZFxuICovXG5mdW5jdGlvbiBnZXREYkluc3RhbmNlKCk6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+IHtcbiAgaWYgKCFfZGJJbnN0YW5jZSkge1xuICAgIF9kYkluc3RhbmNlID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpLmRiO1xuICB9XG4gIHJldHVybiBfZGJJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBQcm94eS1iYXNlZCBsYXp5IGRhdGFiYXNlIGluc3RhbmNlXG4gKiBUaGUgYWN0dWFsIGNvbm5lY3Rpb24gaXMgb25seSBjcmVhdGVkIHdoZW4gZmlyc3QgYWNjZXNzZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgZGIgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIC8vIENvbm5lY3Rpb24gaXMgY3JlYXRlZCBoZXJlIG9uIGZpcnN0IHVzZSwgbm90IG9uIGltcG9ydFxuICogY29uc3QgcGx1Z2lucyA9IGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGRiID0gbmV3IFByb3h5KHt9IGFzIFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+LCB7XG4gIGdldChfLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldERiSW5zdGFuY2UoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGluc3RhbmNlW3Byb3AgYXMga2V5b2YgdHlwZW9mIGluc3RhbmNlXTtcbiAgICAvLyBCaW5kIG1ldGhvZHMgdG8gdGhlIGluc3RhbmNlIHRvIHByZXNlcnZlICd0aGlzJyBjb250ZXh0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoaW5zdGFuY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBHZXRzIHRoZSBDb25uZWN0aW9uIGluc3RhbmNlIGZvciBhZHZhbmNlZCBvcGVyYXRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGdldENvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGNvbnN0IGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7XG4gKiBjb25zdCBzdGF0cyA9IGNvbm5lY3Rpb24uZ2V0U3RhdHMoKTtcbiAqIGNvbnNvbGUubG9nKGBBY3RpdmUgY29ubmVjdGlvbnM6ICR7c3RhdHMudG90YWxDb3VudH1gKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29ubmVjdGlvbigpOiBDb25uZWN0aW9uIHtcbiAgcmV0dXJuIENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKTtcbn1cblxuLyoqXG4gKiBDbG9zZXMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAqIFNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHNodXRkb3duXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNsb3NlQ29ubmVjdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogcHJvY2Vzcy5vbignU0lHVEVSTScsIGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgY2xvc2VDb25uZWN0aW9uKCk7XG4gKiAgIHByb2Nlc3MuZXhpdCgwKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9zZUNvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG4gIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgX2RiSW5zdGFuY2UgPSBudWxsOyAvLyBSZXNldCBsYXp5IGluc3RhbmNlXG59XG5cbi8qKlxuICogVGVzdHMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAqXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGhlYWx0aHlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgdGVzdENvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGlmIChhd2FpdCB0ZXN0Q29ubmVjdGlvbigpKSB7XG4gKiAgIGNvbnNvbGUubG9nKCdEYXRhYmFzZSBpcyByZWFkeScpO1xuICogfSBlbHNlIHtcbiAqICAgY29uc29sZS5lcnJvcignRGF0YWJhc2UgY29ubmVjdGlvbiBmYWlsZWQnKTtcbiAqICAgcHJvY2Vzcy5leGl0KDEpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Q29ubmVjdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb24udGVzdENvbm5lY3Rpb24oKTtcbn1cbiJdfQ==
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wb3N0Z3Jlcy1jb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsSUFBSSxFQUFtQixNQUFNLElBQUksQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBRXhDLHFEQUFxRDtBQUNyRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxRQUFtQztJQUM5RCxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFFNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDaEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFFckQsSUFBSSxPQUFnQixDQUFDO0lBQ3JCLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxLQUFLLEtBQUssR0FBRztRQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7U0FDakQsSUFBSSxLQUFLLEtBQUssT0FBTyxJQUFJLEtBQUss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LFdBQVcsRUFBRSxDQUFDO0lBQzVDLE9BQU8sVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBlbnZCb29sLCBlbnZJbnQsIGVudlN0ciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGRyaXp6bGUgfSBmcm9tICdkcml6emxlLW9ybS9ub2RlLXBvc3RncmVzJztcbmltcG9ydCB7IFBvb2wsIHR5cGUgUG9vbENvbmZpZyB9IGZyb20gJ3BnJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4vZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvblJldHJ5U3RyYXRlZ3kgfSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdkYXRhYmFzZScpO1xuXG4vKiogRGV0ZWN0IExhbWJkYSBlbnZpcm9ubWVudCBmb3IgcG9vbC1zaXplIHR1bmluZyAqL1xuY29uc3QgaXNMYW1iZGEgPSAhIXByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBwZyBUTFMvU1NMIGNvbmZpZyBmcm9tIGFuIGV4cGxpY2l0IG9wdGlvbiBvciB0aGUgZW52aXJvbm1lbnQsXG4gKiBmb2xsb3dpbmcgdGhlIHNhbWUgZW52LXR1bmFibGUgcGF0dGVybiBhcyB0aGUgcG9vbCBzaXppbmcgYWJvdmUuXG4gKlxuICogUHJlY2VkZW5jZTpcbiAqICAgMS4gQW4gZXhwbGljaXQgYG9wdGlvbnMuc3NsYCAoY29uc3RydWN0b3IgYXJnKSBhbHdheXMgd2lucyDigJQgaW5jbHVkaW5nIGFuXG4gKiAgICAgIGV4cGxpY2l0IGBmYWxzZWAgdG8gZm9yY2UgcGxhaW50ZXh0LlxuICogICAyLiBgREJfU1NMYCAoYHRydWVgL2AxYCBvbiwgYGZhbHNlYC9gMGAgb2ZmKSBvciBQb3N0Z3Jlcycgc3RhbmRhcmRcbiAqICAgICAgYFBHU1NMTU9ERWAgKGBkaXNhYmxlYCA9IG9mZiwgYW55IG90aGVyIG1vZGUgPSBvbikuXG4gKiAgIDMuIERlZmF1bHQ6IE9OIGluIHByb2R1Y3Rpb24gKFJEUyBjb25uZWN0aW9ucyBtdXN0IGJlIGVuY3J5cHRlZCBpbiB0cmFuc2l0KSxcbiAqICAgICAgT0ZGIGV2ZXJ5d2hlcmUgZWxzZSBzbyBhIGxvY2FsIFBvc3RncmVzIHdpdGhvdXQgVExTIGtlZXBzIHdvcmtpbmcuXG4gKlxuICogV2hlbiBlbmFibGVkLCBgcmVqZWN0VW5hdXRob3JpemVkYCBmb2xsb3dzIGBEQl9TU0xfUkVKRUNUX1VOQVVUSE9SSVpFRGBcbiAqIChkZWZhdWx0IGBmYWxzZWApOiBBV1MgUkRTIHByZXNlbnRzIGEgY2VydCBzaWduZWQgYnkgdGhlIFJEUyBDQSwgd2hpY2ggaXMgbm90XG4gKiBpbiBOb2RlJ3MgZGVmYXVsdCB0cnVzdCBzdG9yZSB1bmxlc3MgdGhlIENBIGJ1bmRsZSBpcyBtb3VudGVkLCBzbyBjZXJ0aWZpY2F0ZVxuICogVkVSSUZJQ0FUSU9OIGlzIG9wdC1pbiB0byBhdm9pZCBicmVha2luZyBhIHN0b2NrIFJEUyBkZXBsb3kg4oCUIHRoZSBjaGFubmVsIGlzXG4gKiBzdGlsbCBFTkNSWVBURUQuIFNldCBgREJfU1NMX1JFSkVDVF9VTkFVVEhPUklaRUQ9dHJ1ZWAgb25jZSB0aGUgUkRTIENBIGJ1bmRsZVxuICogaXMgd2lyZWQgdG8gZ2V0IGZ1bGwgdmVyaWZpY2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3NsQ29uZmlnKGV4cGxpY2l0PzogQ29ubmVjdGlvbk9wdGlvbnNbJ3NzbCddKTogYm9vbGVhbiB8IHsgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuIH0ge1xuICBpZiAoZXhwbGljaXQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGV4cGxpY2l0O1xuXG4gIGNvbnN0IGRiU3NsID0gcHJvY2Vzcy5lbnYuREJfU1NMPy50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBzc2xNb2RlID0gcHJvY2Vzcy5lbnYuUEdTU0xNT0RFPy50b0xvd2VyQ2FzZSgpO1xuXG4gIGxldCBlbmFibGVkOiBib29sZWFuO1xuICBpZiAoZGJTc2wgPT09ICd0cnVlJyB8fCBkYlNzbCA9PT0gJzEnKSBlbmFibGVkID0gdHJ1ZTtcbiAgZWxzZSBpZiAoZGJTc2wgPT09ICdmYWxzZScgfHwgZGJTc2wgPT09ICcwJykgZW5hYmxlZCA9IGZhbHNlO1xuICBlbHNlIGlmIChzc2xNb2RlKSBlbmFibGVkID0gc3NsTW9kZSAhPT0gJ2Rpc2FibGUnO1xuICBlbHNlIGVuYWJsZWQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuXG4gIGlmICghZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4geyByZWplY3RVbmF1dGhvcml6ZWQ6IGVudkJvb2woJ0RCX1NTTF9SRUpFQ1RfVU5BVVRIT1JJWkVEJywgZmFsc2UpIH07XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlQ29uZmlnKCkge1xuICAvLyBMYW1iZGE6IHNtYWxsIHBvb2wgKGVhY2ggaW52b2NhdGlvbiBpcyBzaG9ydC1saXZlZCwgbWFueSBjb25jdXJyZW50IGluc3RhbmNlcylcbiAgLy8gRUNTL2xvbmctcnVubmluZzogbGFyZ2VyIHBvb2wgZm9yIHN1c3RhaW5lZCBjb25jdXJyZW5jeVxuICBjb25zdCBkZWZhdWx0UG9vbFNpemUgPSBpc0xhbWJkYSA/IDIgOiAyMDtcbiAgY29uc3QgZGVmYXVsdElkbGVUaW1lb3V0ID0gaXNMYW1iZGEgPyAxMDAwMCA6IDMwMDAwO1xuXG4gIHJldHVybiB7XG4gICAgaG9zdDogZW52U3RyKCdEQl9IT1NUJywgJ3Bvc3RncmVzJyksXG4gICAgcG9ydDogZW52SW50KCdEQl9QT1JUJywgNTQzMiksXG4gICAgZGF0YWJhc2U6IGVudlN0cignREFUQUJBU0UnLCAncGlwZWxpbmVfYnVpbGRlcicpLFxuICAgIHVzZXI6IGVudlN0cignREJfVVNFUicsICdwb3N0Z3JlcycpLFxuICAgIHBhc3N3b3JkOiBwcm9jZXNzLmVudi5EQl9QQVNTV09SRCB8fCAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyA/ICgoKSA9PiB7IHRocm93IG5ldyBFcnJvcignREJfUEFTU1dPUkQgaXMgcmVxdWlyZWQgaW4gcHJvZHVjdGlvbicpOyB9KSgpIGFzIHN0cmluZyA6ICcnKSxcbiAgICBtYXhQb29sU2l6ZTogZW52SW50KCdEUklaWkxFX01BWF9QT09MX1NJWkUnLCBkZWZhdWx0UG9vbFNpemUpLFxuICAgIGlkbGVUaW1lb3V0TWlsbGlzOiBlbnZJbnQoJ0RSSVpaTEVfSURMRV9USU1FT1VUX01JTExJUycsIGRlZmF1bHRJZGxlVGltZW91dCksXG4gICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IGVudkludCgnRFJJWlpMRV9DT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTJywgNTAwMCksXG4gIH07XG59XG5cbi8qKlxuICogRGF0YWJhc2UgY29ubmVjdGlvbiBzdGF0aXN0aWNzIGZvciBtb25pdG9yaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvblN0YXRzIHtcbiAgdG90YWxDb3VudDogbnVtYmVyO1xuICBpZGxlQ291bnQ6IG51bWJlcjtcbiAgd2FpdGluZ0NvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIC8qKiBXaGV0aGVyIHRvIGVuYWJsZSBjb25uZWN0aW9uIGxvZ2dpbmcgKi9cbiAgZW5hYmxlTG9nZ2luZz86IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSByZXRyeSBmYWlsZWQgY29ubmVjdGlvbnMgKi9cbiAgZW5hYmxlQXV0b1JldHJ5PzogYm9vbGVhbjtcblxuICAvKiogTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbiByZXRyeSBhdHRlbXB0cyAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuXG4gIC8qKiBEZWxheSBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzIGluIG1pbGxpc2Vjb25kcyAqL1xuICByZXRyeURlbGF5PzogbnVtYmVyO1xuXG4gIC8qKiBTU0wgY29uZmlndXJhdGlvbiAqL1xuICBzc2w/OiBib29sZWFuIHwgeyByZWplY3RVbmF1dGhvcml6ZWQ6IGJvb2xlYW4gfTtcbn1cblxuLyoqXG4gKiBTaW5nbGV0b24gZGF0YWJhc2UgY29ubmVjdGlvbiBjbGFzcy5cbiAqIE1hbmFnZXMgUG9zdGdyZVNRTCBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIERyaXp6bGUgT1JNIGluc3RhbmNlLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBTaW5nbGV0b24gcGF0dGVybiBmb3Igc2luZ2xlIGNvbm5lY3Rpb24gcG9vbFxuICogLSBBdXRvbWF0aWMgY29ubmVjdGlvbiByZXRyeSB3aXRoIGJhY2tvZmZcbiAqIC0gQ29ubmVjdGlvbiBoZWFsdGggbW9uaXRvcmluZ1xuICogLSBHcmFjZWZ1bCBzaHV0ZG93biBoYW5kbGluZ1xuICogLSBDb21wcmVoZW5zaXZlIGVycm9yIGhhbmRsaW5nXG4gKiAtIENvbm5lY3Rpb24gc3RhdGlzdGljcyB0cmFja2luZ1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiBjb25zdCBjb25uZWN0aW9uID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpO1xuICogY29uc3QgcGx1Z2lucyA9IGF3YWl0IGNvbm5lY3Rpb24uZGIuc2VsZWN0KCkuZnJvbShzY2hlbWEucGx1Z2luKTtcbiAqXG4gKiAvLyBEdXJpbmcgc2h1dGRvd25cbiAqIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb25uZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIERyaXp6bGUgT1JNIGRhdGFiYXNlIGluc3RhbmNlIHdpdGggc2NoZW1hXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGI6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcG9vbDogUG9vbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxDb25uZWN0aW9uT3B0aW9ucz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmV0cnlTdHJhdGVneTogQ29ubmVjdGlvblJldHJ5U3RyYXRlZ3k7XG4gIHByaXZhdGUgaXNTaHV0dGluZ0Rvd24gPSBmYWxzZTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBlbmZvcmNlIHNpbmdsZXRvbiBwYXR0ZXJuLlxuICAgKiBJbml0aWFsaXplcyBQb3N0Z3JlU1FMIGNvbm5lY3Rpb24gcG9vbCBhbmQgRHJpenpsZSBPUk0gaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbm5lY3Rpb25cbiAgICogQHRocm93cyB7RXJyb3J9IElmIGRhdGFiYXNlIGluaXRpYWxpemF0aW9uIGZhaWxzIGFmdGVyIGFsbCByZXRyaWVzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbm5lY3Rpb25PcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBlbmFibGVMb2dnaW5nOiBvcHRpb25zLmVuYWJsZUxvZ2dpbmcgPz8gdHJ1ZSxcbiAgICAgIGVuYWJsZUF1dG9SZXRyeTogb3B0aW9ucy5lbmFibGVBdXRvUmV0cnkgPz8gdHJ1ZSxcbiAgICAgIG1heFJldHJpZXM6IG9wdGlvbnMubWF4UmV0cmllcyA/PyBlbnZJbnQoJ0RCX01BWF9SRVRSSUVTJywgMywgeyBtaW46IDAgfSksXG4gICAgICByZXRyeURlbGF5OiBvcHRpb25zLnJldHJ5RGVsYXkgPz8gZW52SW50KCdEQl9SRVRSWV9ERUxBWV9NUycsIDEwMDAsIHsgbWluOiAwIH0pLFxuICAgICAgLy8gRW52LWRyaXZlbiBUTFM6IG9uLWJ5LWRlZmF1bHQgaW4gcHJvZHVjdGlvbiwgZW52LWVuYWJsZWFibGUgZWxzZXdoZXJlLlxuICAgICAgLy8gZ2V0SW5zdGFuY2UoKSBpcyBub3JtYWxseSBjYWxsZWQgd2l0aCBubyBvcHRpb25zLCBzbyB0aGlzIGlzIHRoZSBvbmx5XG4gICAgICAvLyBwbGFjZSBwcm9kdWN0aW9uIFJEUyBjb25uZWN0aW9ucyBwaWNrIHVwIFNTTC5cbiAgICAgIHNzbDogZ2V0U3NsQ29uZmlnKG9wdGlvbnMuc3NsKSxcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSByZXRyeSBzdHJhdGVneVxuICAgIHRoaXMucmV0cnlTdHJhdGVneSA9IG5ldyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSh7XG4gICAgICBtYXhSZXRyaWVzOiB0aGlzLm9wdGlvbnMubWF4UmV0cmllcyxcbiAgICAgIHJldHJ5RGVsYXlNczogdGhpcy5vcHRpb25zLnJldHJ5RGVsYXksXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnID0gZ2V0RGF0YWJhc2VDb25maWcoKTtcblxuICAgICAgY29uc3QgcG9vbENvbmZpZzogUG9vbENvbmZpZyA9IHtcbiAgICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICAgIHBvcnQ6IGNvbmZpZy5wb3J0LFxuICAgICAgICBkYXRhYmFzZTogY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICB1c2VyOiBjb25maWcudXNlcixcbiAgICAgICAgcGFzc3dvcmQ6IGNvbmZpZy5wYXNzd29yZCxcbiAgICAgICAgbWF4OiBjb25maWcubWF4UG9vbFNpemUsXG4gICAgICAgIGlkbGVUaW1lb3V0TWlsbGlzOiBjb25maWcuaWRsZVRpbWVvdXRNaWxsaXMsXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBjb25maWcuY29ubmVjdGlvblRpbWVvdXRNaWxsaXMsXG4gICAgICAgIHNzbDogdGhpcy5vcHRpb25zLnNzbCxcbiAgICAgICAgYWxsb3dFeGl0T25JZGxlOiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5wb29sID0gbmV3IFBvb2wocG9vbENvbmZpZyk7XG4gICAgICB0aGlzLnNldHVwRXZlbnRIYW5kbGVycygpO1xuXG4gICAgICB0aGlzLmRiID0gZHJpenpsZSh0aGlzLnBvb2wsIHsgc2NoZW1hIH0pO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxvZ2dpbmcpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIHRoaXMubG9nQ29ubmVjdGlvbkNvbmZpZyhwb29sQ29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkYXRhYmFzZSBjb25uZWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YWJhc2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgQ29ubmVjdGlvbiBjbGFzcy5cbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBpZiBvbmUgZG9lc24ndCBleGlzdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIChvbmx5IHVzZWQgb24gZmlyc3QgY2FsbClcbiAgICogQHJldHVybnMgVGhlIHNpbmdsZXRvbiBDb25uZWN0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKG9wdGlvbnM/OiBDb25uZWN0aW9uT3B0aW9ucyk6IENvbm5lY3Rpb24ge1xuICAgIGlmICghQ29ubmVjdGlvbi5pbnN0YW5jZSkge1xuICAgICAgQ29ubmVjdGlvbi5pbnN0YW5jZSA9IG5ldyBDb25uZWN0aW9uKG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gQ29ubmVjdGlvbi5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHJlY29uZmlndXJpbmcgdGhlIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbG9zZUV4aXN0aW5nIC0gV2hldGhlciB0byBjbG9zZSBleGlzdGluZyBjb25uZWN0aW9uIGJlZm9yZSByZXNldFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyByZXNldChjbG9zZUV4aXN0aW5nOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChDb25uZWN0aW9uLmluc3RhbmNlICYmIGNsb3NlRXhpc3RpbmcpIHtcbiAgICAgIGF3YWl0IENvbm5lY3Rpb24uaW5zdGFuY2UuY2xvc2UoKTtcbiAgICB9XG4gICAgQ29ubmVjdGlvbi5pbnN0YW5jZSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGVzdHMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgY29ubmVjdGlvbiBpcyBoZWFsdGh5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdGVzdENvbm5lY3Rpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMucG9vbC5jb25uZWN0KCk7XG4gICAgICAvLyBSZWxlYXNlIGV2ZW4gaWYgdGhlIHByb2JlIHF1ZXJ5IHRocm93cyDigJQgb3RoZXJ3aXNlIGEgZmxha3kgREIgKHRoZSBleGFjdFxuICAgICAgLy8gY2FzZSB0aGlzIGNoZWNrIGV4aXN0cyBmb3IpIGxlYWtzIGEgcG9vbGVkIGNsaWVudCBlYWNoIGZhaWx1cmUgYW5kIGNhblxuICAgICAgLy8gZXhoYXVzdCB0aGUgcG9vbCBvbiB0aGUgcmV0cnkgcGF0aC5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeSgnU0VMRUNUIDEnKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ0RhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdCBzdWNjZXNzZnVsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzLmxlbmd0aCA+IDA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjbGllbnQucmVsZWFzZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0RhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNvbm5lY3Rpb24gcG9vbCBzdGF0aXN0aWNzXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgY29ubmVjdGlvbiBwb29sIHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0cygpOiBDb25uZWN0aW9uU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbENvdW50OiB0aGlzLnBvb2wudG90YWxDb3VudCxcbiAgICAgIGlkbGVDb3VudDogdGhpcy5wb29sLmlkbGVDb3VudCxcbiAgICAgIHdhaXRpbmdDb3VudDogdGhpcy5wb29sLndhaXRpbmdDb3VudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiBwb29sIGdyYWNlZnVsbHkuXG4gICAqIFNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHNodXRkb3duLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZW91dCAtIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBjb25uZWN0aW9ucyB0byBjbG9zZSAobXMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHBvb2wgaXMgY2xvc2VkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xvc2UodGltZW91dDogbnVtYmVyID0gZW52SW50KCdEQl9DTE9TRV9USU1FT1VUX01TJywgNTAwMCkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1NodXR0aW5nRG93bikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Nvbm5lY3Rpb24gaXMgYWxyZWFkeSBzaHV0dGluZyBkb3duJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1NodXR0aW5nRG93biA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDbG9zaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb24gcG9vbC4uLicpO1xuICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuZ2V0U3RhdHMoKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFBvb2wgc3RhdHMgLSBUb3RhbDogJHtzdGF0cy50b3RhbENvdW50fSwgSWRsZTogJHtzdGF0cy5pZGxlQ291bnR9LCBXYWl0aW5nOiAke3N0YXRzLndhaXRpbmdDb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGEgdGltZW91dCBmb3IgZ3JhY2VmdWwgc2h1dGRvd25cbiAgICAgIGNvbnN0IGNsb3NlUHJvbWlzZSA9IHRoaXMucG9vbC5lbmQoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlIHRpbWVvdXQnKSksIHRpbWVvdXQpLFxuICAgICAgKTtcblxuICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtjbG9zZVByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTG9nZ2luZykge1xuICAgICAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgY29ubmVjdGlvbiBjbG9zZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgY2xvc2luZyBkYXRhYmFzZSBjb25uZWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU2h1dHRpbmdEb3duID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29ubmVjdGlvbiBpcyBzaHV0dGluZyBkb3duXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgY29ubmVjdGlvbiBpcyBpbiBzaHV0ZG93biBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGlzQ2xvc2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1NodXR0aW5nRG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY29ubmVjdGlvbiBwb29sXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICB0aGlzLnBvb2wub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKCdVbmV4cGVjdGVkIGVycm9yIG9uIGlkbGUgY2xpZW50OicsIGVycik7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlQXV0b1JldHJ5ICYmIHRoaXMucmV0cnlTdHJhdGVneS5nZXRBdHRlbXB0cygpIDwgdGhpcy5vcHRpb25zLm1heFJldHJpZXMpIHtcbiAgICAgICAgdm9pZCB0aGlzLnJldHJ5U3RyYXRlZ3kuaGFuZGxlQ29ubmVjdGlvbkVycm9yKGVyciwgKCkgPT4gdGhpcy50ZXN0Q29ubmVjdGlvbigpKS5jYXRjaCgocmV0cnlFcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Nvbm5lY3Rpb24gcmV0cnkgZXJyb3I6JywgcmV0cnlFcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucG9vbC5vbignY29ubmVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMucmV0cnlTdHJhdGVneS5yZXNldCgpOyAvLyBSZXNldCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb25cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnTmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucG9vbC5vbigncmVtb3ZlJywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMb2dnaW5nKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2xpZW50IHJlbW92ZWQgZnJvbSBwb29sJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gKHNhbml0aXplZClcbiAgICovXG4gIHByaXZhdGUgbG9nQ29ubmVjdGlvbkNvbmZpZyhjb25maWc6IFBvb2xDb25maWcpOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbygnRGF0YWJhc2UgQ29uZmlndXJhdGlvbjonLCB7XG4gICAgICBob3N0OiBgJHtjb25maWcuaG9zdH06JHtjb25maWcucG9ydH1gLFxuICAgICAgZGF0YWJhc2U6IGNvbmZpZy5kYXRhYmFzZSxcbiAgICAgIHVzZXI6IGNvbmZpZy51c2VyLFxuICAgICAgbWF4UG9vbFNpemU6IGNvbmZpZy5tYXgsXG4gICAgICBpZGxlVGltZW91dE1zOiBjb25maWcuaWRsZVRpbWVvdXRNaWxsaXMsXG4gICAgICBjb25uZWN0aW9uVGltZW91dE1zOiBjb25maWcuY29ubmVjdGlvblRpbWVvdXRNaWxsaXMsXG4gICAgICBzc2w6IGNvbmZpZy5zc2wgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2luZ2xldG9uIGRhdGFiYXNlIGluc3RhbmNlIGZvciB1c2UgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGRiIH0gZnJvbSAnLi9jb25uZWN0aW9uJztcbiAqXG4gKiAvLyBTZWxlY3QgcXVlcmllc1xuICogY29uc3QgcGx1Z2lucyA9IGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbik7XG4gKlxuICogLy8gSW5zZXJ0IHF1ZXJpZXNcbiAqIGF3YWl0IGRiLmluc2VydChzY2hlbWEucGx1Z2luKS52YWx1ZXMoeyBuYW1lOiAnbXktcGx1Z2luJyB9KTtcbiAqXG4gKiAvLyBUcmFuc2FjdGlvbnNcbiAqIGF3YWl0IGRiLnRyYW5zYWN0aW9uKGFzeW5jICh0eCkgPT4ge1xuICogICBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBsdWdpbikudmFsdWVzKHsgLi4uIH0pO1xuICogICBhd2FpdCB0eC51cGRhdGUoc2NoZW1hLnBsdWdpbikuc2V0KHsgLi4uIH0pO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuXG4vLyBMYXp5IGluaXRpYWxpemF0aW9uIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIG9uIG1vZHVsZSBsb2FkXG5sZXQgX2RiSW5zdGFuY2U6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+IHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogR2V0IHRoZSBkYXRhYmFzZSBpbnN0YW5jZSB3aXRoIGxhenkgaW5pdGlhbGl6YXRpb25cbiAqIFRoaXMgYXZvaWRzIHRoZSByYWNlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbW9kdWxlIGlzIGxvYWRlZCBiZWZvcmUgZW52aXJvbm1lbnQgaXMgY29uZmlndXJlZFxuICovXG5mdW5jdGlvbiBnZXREYkluc3RhbmNlKCk6IFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+IHtcbiAgaWYgKCFfZGJJbnN0YW5jZSkge1xuICAgIF9kYkluc3RhbmNlID0gQ29ubmVjdGlvbi5nZXRJbnN0YW5jZSgpLmRiO1xuICB9XG4gIHJldHVybiBfZGJJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBQcm94eS1iYXNlZCBsYXp5IGRhdGFiYXNlIGluc3RhbmNlXG4gKiBUaGUgYWN0dWFsIGNvbm5lY3Rpb24gaXMgb25seSBjcmVhdGVkIHdoZW4gZmlyc3QgYWNjZXNzZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgZGIgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIC8vIENvbm5lY3Rpb24gaXMgY3JlYXRlZCBoZXJlIG9uIGZpcnN0IHVzZSwgbm90IG9uIGltcG9ydFxuICogY29uc3QgcGx1Z2lucyA9IGF3YWl0IGRiLnNlbGVjdCgpLmZyb20oc2NoZW1hLnBsdWdpbik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGRiID0gbmV3IFByb3h5KHt9IGFzIFJldHVyblR5cGU8dHlwZW9mIGRyaXp6bGU+LCB7XG4gIGdldChfLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldERiSW5zdGFuY2UoKTtcbiAgICBjb25zdCB2YWx1ZSA9IGluc3RhbmNlW3Byb3AgYXMga2V5b2YgdHlwZW9mIGluc3RhbmNlXTtcbiAgICAvLyBCaW5kIG1ldGhvZHMgdG8gdGhlIGluc3RhbmNlIHRvIHByZXNlcnZlICd0aGlzJyBjb250ZXh0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoaW5zdGFuY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBHZXRzIHRoZSBDb25uZWN0aW9uIGluc3RhbmNlIGZvciBhZHZhbmNlZCBvcGVyYXRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGdldENvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGNvbnN0IGNvbm5lY3Rpb24gPSBnZXRDb25uZWN0aW9uKCk7XG4gKiBjb25zdCBzdGF0cyA9IGNvbm5lY3Rpb24uZ2V0U3RhdHMoKTtcbiAqIGNvbnNvbGUubG9nKGBBY3RpdmUgY29ubmVjdGlvbnM6ICR7c3RhdHMudG90YWxDb3VudH1gKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29ubmVjdGlvbigpOiBDb25uZWN0aW9uIHtcbiAgcmV0dXJuIENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKTtcbn1cblxuLyoqXG4gKiBDbG9zZXMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAqIFNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHNodXRkb3duXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNsb3NlQ29ubmVjdGlvbiB9IGZyb20gJy4vY29ubmVjdGlvbic7XG4gKlxuICogcHJvY2Vzcy5vbignU0lHVEVSTScsIGFzeW5jICgpID0+IHtcbiAqICAgYXdhaXQgY2xvc2VDb25uZWN0aW9uKCk7XG4gKiAgIHByb2Nlc3MuZXhpdCgwKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9zZUNvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbm5lY3Rpb24gPSBDb25uZWN0aW9uLmdldEluc3RhbmNlKCk7XG4gIGF3YWl0IGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgX2RiSW5zdGFuY2UgPSBudWxsOyAvLyBSZXNldCBsYXp5IGluc3RhbmNlXG59XG5cbi8qKlxuICogVGVzdHMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb25cbiAqXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiBjb25uZWN0aW9uIGlzIGhlYWx0aHlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgdGVzdENvbm5lY3Rpb24gfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuICpcbiAqIGlmIChhd2FpdCB0ZXN0Q29ubmVjdGlvbigpKSB7XG4gKiAgIGNvbnNvbGUubG9nKCdEYXRhYmFzZSBpcyByZWFkeScpO1xuICogfSBlbHNlIHtcbiAqICAgY29uc29sZS5lcnJvcignRGF0YWJhc2UgY29ubmVjdGlvbiBmYWlsZWQnKTtcbiAqICAgcHJvY2Vzcy5leGl0KDEpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZXN0Q29ubmVjdGlvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29ubmVjdGlvbiA9IENvbm5lY3Rpb24uZ2V0SW5zdGFuY2UoKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb24udGVzdENvbm5lY3Rpb24oKTtcbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ import { drizzle } from 'drizzle-orm/node-postgres';
2
+ import * as schema from './drizzle-schema.js';
3
+ /** The reader role's fixed name (postgres-init.sql creates exactly this role). */
4
+ export declare const PUBLIC_READER_ROLE = "ecosystem_public_reader";
5
+ /** Whether the public reader login is configured (the directory can serve). */
6
+ export declare function isPublicReaderConfigured(): boolean;
7
+ /**
8
+ * The reader's Drizzle instance, created on first use.
9
+ *
10
+ * @throws when the reader isn't configured — check {@link isPublicReaderConfigured} first.
11
+ */
12
+ export declare function getPublicReaderDb(): ReturnType<typeof drizzle<typeof schema>>;
13
+ /** Close the reader pool (graceful shutdown; tests). */
14
+ export declare function closePublicReader(): Promise<void>;
@@ -0,0 +1,68 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * The anonymous public plugin directory's database connection.
5
+ *
6
+ * A second, SMALL pool that logs in as `ecosystem_public_reader` — a role that
7
+ * can SELECT the `public_*` views and nothing else (postgres-init.sql). It
8
+ * connects like every other client, THROUGH pgbouncer (`DB_HOST` / `DB_PORT`),
9
+ * to the dedicated `pipeline_builder_public` pool, which pgbouncer caps at 5
10
+ * server connections for this user across all pools. It is never the
11
+ * application role and never carries a tenant context: the views filter to
12
+ * public rows themselves, so there is nothing to scope.
13
+ *
14
+ * Not configured (no `ECOSYSTEM_PUBLIC_READER_PASSWORD`) → the public directory
15
+ * is off; callers check {@link isPublicReaderConfigured} and answer 404.
16
+ */
17
+ import { envInt } from '@pipeline-builder/api-core';
18
+ import { drizzle } from 'drizzle-orm/node-postgres';
19
+ import { Pool } from 'pg';
20
+ import * as schema from './drizzle-schema.js';
21
+ import { getSslConfig } from './postgres-connection.js';
22
+ /** The reader role's fixed name (postgres-init.sql creates exactly this role). */
23
+ export const PUBLIC_READER_ROLE = 'ecosystem_public_reader';
24
+ let pool = null;
25
+ let readerDb = null;
26
+ /** Whether the public reader login is configured (the directory can serve). */
27
+ export function isPublicReaderConfigured() {
28
+ return (process.env.ECOSYSTEM_PUBLIC_READER_PASSWORD ?? '') !== '';
29
+ }
30
+ /**
31
+ * The reader's Drizzle instance, created on first use.
32
+ *
33
+ * @throws when the reader isn't configured — check {@link isPublicReaderConfigured} first.
34
+ */
35
+ export function getPublicReaderDb() {
36
+ if (readerDb)
37
+ return readerDb;
38
+ if (!isPublicReaderConfigured()) {
39
+ throw new Error('ECOSYSTEM_PUBLIC_READER_PASSWORD is not set: the public plugin directory is disabled');
40
+ }
41
+ pool = new Pool({
42
+ host: process.env.DB_HOST || 'pgbouncer',
43
+ port: envInt('DB_PORT', 6432, { min: 1 }),
44
+ database: process.env.PUBLIC_DIRECTORY_DB_NAME || 'pipeline_builder_public',
45
+ user: PUBLIC_READER_ROLE,
46
+ password: process.env.ECOSYSTEM_PUBLIC_READER_PASSWORD,
47
+ // Below pgbouncer's per-user cap (5), so a replica never queues inside pgbouncer.
48
+ max: envInt('PUBLIC_DIRECTORY_POOL_SIZE', 4, { min: 1 }),
49
+ idleTimeoutMillis: 30_000,
50
+ connectionTimeoutMillis: envInt('DRIZZLE_CONNECTION_TIMEOUT_MILLIS', 5000, { min: 1 }),
51
+ // Client-side bound on one directory query. pgbouncer (transaction mode)
52
+ // refuses a `statement_timeout` startup parameter, so it can't be set there.
53
+ query_timeout: envInt('PUBLIC_DIRECTORY_QUERY_TIMEOUT_MS', 5000, { min: 1 }),
54
+ ssl: getSslConfig(),
55
+ allowExitOnIdle: true,
56
+ });
57
+ readerDb = drizzle(pool, { schema });
58
+ return readerDb;
59
+ }
60
+ /** Close the reader pool (graceful shutdown; tests). */
61
+ export async function closePublicReader() {
62
+ const p = pool;
63
+ pool = null;
64
+ readerDb = null;
65
+ if (p)
66
+ await p.end();
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLXJlYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdWJsaWMtcmVhZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQztBQUUxQixPQUFPLEtBQUssTUFBTSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV4RCxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcseUJBQXlCLENBQUM7QUFFNUQsSUFBSSxJQUFJLEdBQWdCLElBQUksQ0FBQztBQUM3QixJQUFJLFFBQVEsR0FBcUQsSUFBSSxDQUFDO0FBRXRFLCtFQUErRTtBQUMvRSxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHNGQUFzRixDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUNELElBQUksR0FBRyxJQUFJLElBQUksQ0FBQztRQUNkLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxXQUFXO1FBQ3hDLElBQUksRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsSUFBSSx5QkFBeUI7UUFDM0UsSUFBSSxFQUFFLGtCQUFrQjtRQUN4QixRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0M7UUFDdEQsa0ZBQWtGO1FBQ2xGLEdBQUcsRUFBRSxNQUFNLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hELGlCQUFpQixFQUFFLE1BQU07UUFDekIsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLG1DQUFtQyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0Rix5RUFBeUU7UUFDekUsNkVBQTZFO1FBQzdFLGFBQWEsRUFBRSxNQUFNLENBQUMsbUNBQW1DLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzVFLEdBQUcsRUFBRSxZQUFZLEVBQUU7UUFDbkIsZUFBZSxFQUFFLElBQUk7S0FDdEIsQ0FBQyxDQUFDO0lBQ0gsUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCx3REFBd0Q7QUFDeEQsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUI7SUFDckMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2YsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNaLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEIsSUFBSSxDQUFDO1FBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBhbm9ueW1vdXMgcHVibGljIHBsdWdpbiBkaXJlY3RvcnkncyBkYXRhYmFzZSBjb25uZWN0aW9uLlxuICpcbiAqIEEgc2Vjb25kLCBTTUFMTCBwb29sIHRoYXQgbG9ncyBpbiBhcyBgZWNvc3lzdGVtX3B1YmxpY19yZWFkZXJgIOKAlCBhIHJvbGUgdGhhdFxuICogY2FuIFNFTEVDVCB0aGUgYHB1YmxpY18qYCB2aWV3cyBhbmQgbm90aGluZyBlbHNlIChwb3N0Z3Jlcy1pbml0LnNxbCkuIEl0XG4gKiBjb25uZWN0cyBsaWtlIGV2ZXJ5IG90aGVyIGNsaWVudCwgVEhST1VHSCBwZ2JvdW5jZXIgKGBEQl9IT1NUYCAvIGBEQl9QT1JUYCksXG4gKiB0byB0aGUgZGVkaWNhdGVkIGBwaXBlbGluZV9idWlsZGVyX3B1YmxpY2AgcG9vbCwgd2hpY2ggcGdib3VuY2VyIGNhcHMgYXQgNVxuICogc2VydmVyIGNvbm5lY3Rpb25zIGZvciB0aGlzIHVzZXIgYWNyb3NzIGFsbCBwb29scy4gSXQgaXMgbmV2ZXIgdGhlXG4gKiBhcHBsaWNhdGlvbiByb2xlIGFuZCBuZXZlciBjYXJyaWVzIGEgdGVuYW50IGNvbnRleHQ6IHRoZSB2aWV3cyBmaWx0ZXIgdG9cbiAqIHB1YmxpYyByb3dzIHRoZW1zZWx2ZXMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2NvcGUuXG4gKlxuICogTm90IGNvbmZpZ3VyZWQgKG5vIGBFQ09TWVNURU1fUFVCTElDX1JFQURFUl9QQVNTV09SRGApIOKGkiB0aGUgcHVibGljIGRpcmVjdG9yeVxuICogaXMgb2ZmOyBjYWxsZXJzIGNoZWNrIHtAbGluayBpc1B1YmxpY1JlYWRlckNvbmZpZ3VyZWR9IGFuZCBhbnN3ZXIgNDA0LlxuICovXG5cbmltcG9ydCB7IGVudkludCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGRyaXp6bGUgfSBmcm9tICdkcml6emxlLW9ybS9ub2RlLXBvc3RncmVzJztcbmltcG9ydCB7IFBvb2wgfSBmcm9tICdwZyc7XG5cbmltcG9ydCAqIGFzIHNjaGVtYSBmcm9tICcuL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IGdldFNzbENvbmZpZyB9IGZyb20gJy4vcG9zdGdyZXMtY29ubmVjdGlvbi5qcyc7XG5cbi8qKiBUaGUgcmVhZGVyIHJvbGUncyBmaXhlZCBuYW1lIChwb3N0Z3Jlcy1pbml0LnNxbCBjcmVhdGVzIGV4YWN0bHkgdGhpcyByb2xlKS4gKi9cbmV4cG9ydCBjb25zdCBQVUJMSUNfUkVBREVSX1JPTEUgPSAnZWNvc3lzdGVtX3B1YmxpY19yZWFkZXInO1xuXG5sZXQgcG9vbDogUG9vbCB8IG51bGwgPSBudWxsO1xubGV0IHJlYWRlckRiOiBSZXR1cm5UeXBlPHR5cGVvZiBkcml6emxlPHR5cGVvZiBzY2hlbWE+PiB8IG51bGwgPSBudWxsO1xuXG4vKiogV2hldGhlciB0aGUgcHVibGljIHJlYWRlciBsb2dpbiBpcyBjb25maWd1cmVkICh0aGUgZGlyZWN0b3J5IGNhbiBzZXJ2ZSkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQdWJsaWNSZWFkZXJDb25maWd1cmVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHByb2Nlc3MuZW52LkVDT1NZU1RFTV9QVUJMSUNfUkVBREVSX1BBU1NXT1JEID8/ICcnKSAhPT0gJyc7XG59XG5cbi8qKlxuICogVGhlIHJlYWRlcidzIERyaXp6bGUgaW5zdGFuY2UsIGNyZWF0ZWQgb24gZmlyc3QgdXNlLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiB0aGUgcmVhZGVyIGlzbid0IGNvbmZpZ3VyZWQg4oCUIGNoZWNrIHtAbGluayBpc1B1YmxpY1JlYWRlckNvbmZpZ3VyZWR9IGZpcnN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHVibGljUmVhZGVyRGIoKTogUmV0dXJuVHlwZTx0eXBlb2YgZHJpenpsZTx0eXBlb2Ygc2NoZW1hPj4ge1xuICBpZiAocmVhZGVyRGIpIHJldHVybiByZWFkZXJEYjtcbiAgaWYgKCFpc1B1YmxpY1JlYWRlckNvbmZpZ3VyZWQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRUNPU1lTVEVNX1BVQkxJQ19SRUFERVJfUEFTU1dPUkQgaXMgbm90IHNldDogdGhlIHB1YmxpYyBwbHVnaW4gZGlyZWN0b3J5IGlzIGRpc2FibGVkJyk7XG4gIH1cbiAgcG9vbCA9IG5ldyBQb29sKHtcbiAgICBob3N0OiBwcm9jZXNzLmVudi5EQl9IT1NUIHx8ICdwZ2JvdW5jZXInLFxuICAgIHBvcnQ6IGVudkludCgnREJfUE9SVCcsIDY0MzIsIHsgbWluOiAxIH0pLFxuICAgIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5QVUJMSUNfRElSRUNUT1JZX0RCX05BTUUgfHwgJ3BpcGVsaW5lX2J1aWxkZXJfcHVibGljJyxcbiAgICB1c2VyOiBQVUJMSUNfUkVBREVSX1JPTEUsXG4gICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LkVDT1NZU1RFTV9QVUJMSUNfUkVBREVSX1BBU1NXT1JELFxuICAgIC8vIEJlbG93IHBnYm91bmNlcidzIHBlci11c2VyIGNhcCAoNSksIHNvIGEgcmVwbGljYSBuZXZlciBxdWV1ZXMgaW5zaWRlIHBnYm91bmNlci5cbiAgICBtYXg6IGVudkludCgnUFVCTElDX0RJUkVDVE9SWV9QT09MX1NJWkUnLCA0LCB7IG1pbjogMSB9KSxcbiAgICBpZGxlVGltZW91dE1pbGxpczogMzBfMDAwLFxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBlbnZJbnQoJ0RSSVpaTEVfQ09OTkVDVElPTl9USU1FT1VUX01JTExJUycsIDUwMDAsIHsgbWluOiAxIH0pLFxuICAgIC8vIENsaWVudC1zaWRlIGJvdW5kIG9uIG9uZSBkaXJlY3RvcnkgcXVlcnkuIHBnYm91bmNlciAodHJhbnNhY3Rpb24gbW9kZSlcbiAgICAvLyByZWZ1c2VzIGEgYHN0YXRlbWVudF90aW1lb3V0YCBzdGFydHVwIHBhcmFtZXRlciwgc28gaXQgY2FuJ3QgYmUgc2V0IHRoZXJlLlxuICAgIHF1ZXJ5X3RpbWVvdXQ6IGVudkludCgnUFVCTElDX0RJUkVDVE9SWV9RVUVSWV9USU1FT1VUX01TJywgNTAwMCwgeyBtaW46IDEgfSksXG4gICAgc3NsOiBnZXRTc2xDb25maWcoKSxcbiAgICBhbGxvd0V4aXRPbklkbGU6IHRydWUsXG4gIH0pO1xuICByZWFkZXJEYiA9IGRyaXp6bGUocG9vbCwgeyBzY2hlbWEgfSk7XG4gIHJldHVybiByZWFkZXJEYjtcbn1cblxuLyoqIENsb3NlIHRoZSByZWFkZXIgcG9vbCAoZ3JhY2VmdWwgc2h1dGRvd247IHRlc3RzKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9zZVB1YmxpY1JlYWRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcCA9IHBvb2w7XG4gIHBvb2wgPSBudWxsO1xuICByZWFkZXJEYiA9IG51bGw7XG4gIGlmIChwKSBhd2FpdCBwLmVuZCgpO1xufVxuIl19
@@ -6,12 +6,10 @@ export type { RetryConfig };
6
6
  * The backoff DECISION (how many attempts, how long to wait, jitter) is
7
7
  * api-core's `getErrorRetryDecision` — this class owns only the connection-
8
8
  * specific concerns (attempt tracking, logging, the health-probe recovery
9
- * path). It previously carried a second, subtly different implementation: its
10
- * own `RetryConfig` (`baseDelay` rather than `retryDelayMs`), no jitter — so a
11
- * pool of replicas retried in lockstep after a database blip — and an
12
- * off-by-one in the loop condition that gave `maxRetries: 3` only TWO retries.
9
+ * path). Delays are jittered so a pool of replicas doesn't retry in lockstep
10
+ * after a database blip.
13
11
  *
14
- * `maxRetries` now means what it says: N retries AFTER the initial attempt, so
12
+ * `maxRetries` means what it says: N retries AFTER the initial attempt, so
15
13
  * `{ maxRetries: 3 }` makes up to 4 attempts total.
16
14
  *
17
15
  * @example
@@ -8,12 +8,10 @@ const logger = createLogger('retry-strategy');
8
8
  * The backoff DECISION (how many attempts, how long to wait, jitter) is
9
9
  * api-core's `getErrorRetryDecision` — this class owns only the connection-
10
10
  * specific concerns (attempt tracking, logging, the health-probe recovery
11
- * path). It previously carried a second, subtly different implementation: its
12
- * own `RetryConfig` (`baseDelay` rather than `retryDelayMs`), no jitter — so a
13
- * pool of replicas retried in lockstep after a database blip — and an
14
- * off-by-one in the loop condition that gave `maxRetries: 3` only TWO retries.
11
+ * path). Delays are jittered so a pool of replicas doesn't retry in lockstep
12
+ * after a database blip.
15
13
  *
16
- * `maxRetries` now means what it says: N retries AFTER the initial attempt, so
14
+ * `maxRetries` means what it says: N retries AFTER the initial attempt, so
17
15
  * `{ maxRetries: 3 }` makes up to 4 attempts total.
18
16
  *
19
17
  * @example
@@ -118,4 +116,4 @@ export class ConnectionRetryStrategy {
118
116
  return new Promise(resolve => setTimeout(resolve, ms));
119
117
  }
120
118
  }
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcmV0cnktc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFvQixZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqSCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUk5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFHTCxNQUFNO0lBRjNCLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFckIsWUFBNkIsTUFBbUI7c0JBQW5CLE1BQU07SUFBZ0IsQ0FBQztJQUVwRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBSSxTQUEyQjtRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVsQixvRUFBb0U7UUFDcEUsNERBQTREO1FBQzVELHFFQUFxRTtRQUNyRSxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsR0FBSSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLFdBQVcsQ0FBQyxDQUFDO29CQUN2RSxNQUFNLEtBQUssQ0FBQztnQkFDZCxDQUFDO2dCQUVELE1BQU0sQ0FBQyxJQUFJLENBQ1QsNkJBQTZCLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLGtCQUFrQixRQUFRLENBQUMsT0FBTyxPQUFPLEVBQzdHLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUMvQixDQUFDO2dCQUVGLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsS0FBWSxFQUFFLGNBQXNDO1FBQzlFLDZFQUE2RTtRQUM3RSxxQ0FBcUM7UUFDckMsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWhCLE1BQU0sQ0FBQyxLQUFLLENBQ1YsNkJBQTZCLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFDeEUsS0FBSyxDQUFDLE9BQU8sQ0FDZCxDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDdEQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixRQUFRLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQztRQUMvRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sY0FBYyxFQUFFLENBQUM7WUFDekMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsaUNBQWlDO1lBQ3RELENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7WUFDckQsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsRUFBVTtRQUN0QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIsIGdldEVycm9yUmV0cnlEZWNpc2lvbiwgdHlwZSBSZXRyeUNvbmZpZywgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JldHJ5LXN0cmF0ZWd5Jyk7XG5cbmV4cG9ydCB0eXBlIHsgUmV0cnlDb25maWcgfTtcblxuLyoqXG4gKiBFeHBvbmVudGlhbC1iYWNrb2ZmIHJldHJ5IGZvciBkYXRhYmFzZSBjb25uZWN0aW9ucy5cbiAqXG4gKiBUaGUgYmFja29mZiBERUNJU0lPTiAoaG93IG1hbnkgYXR0ZW1wdHMsIGhvdyBsb25nIHRvIHdhaXQsIGppdHRlcikgaXNcbiAqIGFwaS1jb3JlJ3MgYGdldEVycm9yUmV0cnlEZWNpc2lvbmAg4oCUIHRoaXMgY2xhc3Mgb3ducyBvbmx5IHRoZSBjb25uZWN0aW9uLVxuICogc3BlY2lmaWMgY29uY2VybnMgKGF0dGVtcHQgdHJhY2tpbmcsIGxvZ2dpbmcsIHRoZSBoZWFsdGgtcHJvYmUgcmVjb3ZlcnlcbiAqIHBhdGgpLiBJdCBwcmV2aW91c2x5IGNhcnJpZWQgYSBzZWNvbmQsIHN1YnRseSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb246IGl0c1xuICogb3duIGBSZXRyeUNvbmZpZ2AgKGBiYXNlRGVsYXlgIHJhdGhlciB0aGFuIGByZXRyeURlbGF5TXNgKSwgbm8gaml0dGVyIOKAlCBzbyBhXG4gKiBwb29sIG9mIHJlcGxpY2FzIHJldHJpZWQgaW4gbG9ja3N0ZXAgYWZ0ZXIgYSBkYXRhYmFzZSBibGlwIOKAlCBhbmQgYW5cbiAqIG9mZi1ieS1vbmUgaW4gdGhlIGxvb3AgY29uZGl0aW9uIHRoYXQgZ2F2ZSBgbWF4UmV0cmllczogM2Agb25seSBUV08gcmV0cmllcy5cbiAqXG4gKiBgbWF4UmV0cmllc2Agbm93IG1lYW5zIHdoYXQgaXQgc2F5czogTiByZXRyaWVzIEFGVEVSIHRoZSBpbml0aWFsIGF0dGVtcHQsIHNvXG4gKiBgeyBtYXhSZXRyaWVzOiAzIH1gIG1ha2VzIHVwIHRvIDQgYXR0ZW1wdHMgdG90YWwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHN0cmF0ZWd5ID0gbmV3IENvbm5lY3Rpb25SZXRyeVN0cmF0ZWd5KHsgbWF4UmV0cmllczogMywgcmV0cnlEZWxheU1zOiAxMDAwIH0pO1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmF0ZWd5LmV4ZWN1dGUoYXN5bmMgKCkgPT4ge1xuICogICByZXR1cm4gYXdhaXQgZGIucXVlcnkoJ1NFTEVDVCAxJyk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblJldHJ5U3RyYXRlZ3kge1xuICBwcml2YXRlIGF0dGVtcHRzID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmV0cnlDb25maWcpIHt9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGFuIG9wZXJhdGlvbiwgcmV0cnlpbmcgdHJhbnNpZW50IGZhaWx1cmVzIHdpdGggaml0dGVyZWRcbiAgICogZXhwb25lbnRpYWwgYmFja29mZi5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIEFzeW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2l0aCByZXRyaWVzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG9wZXJhdGlvbiByZXN1bHRcbiAgICogQHRocm93cyB0aGUgbGFzdCBlcnJvciBvbmNlIHRoZSByZXRyeSBidWRnZXQgaXMgZXhoYXVzdGVkXG4gICAqL1xuICBhc3luYyBleGVjdXRlPFQ+KG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHRoaXMuYXR0ZW1wdHMgPSAwO1xuXG4gICAgLy8gYGF0dGVtcHRgIGlzIFpFUk8tQkFTRUQgYW5kIGNvdW50cyByZXRyaWVzIGFscmVhZHkgbWFkZSwgbWF0Y2hpbmdcbiAgICAvLyBnZXRFcnJvclJldHJ5RGVjaXNpb24ncyBjb250cmFjdDogaXQgYWxsb3dzIGEgcmV0cnkgd2hpbGVcbiAgICAvLyBgYXR0ZW1wdCA8IG1heFJldHJpZXNgLCBzbyB0aGUgbG9vcCBtYWtlcyBtYXhSZXRyaWVzICsgMSBhdHRlbXB0cy5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbigpO1xuICAgICAgICBpZiAoYXR0ZW1wdCA+IDApIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnT3BlcmF0aW9uIHN1Y2NlZWRlZCBhZnRlciByZXRyeScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmF0dGVtcHRzID0gYXR0ZW1wdCArIDE7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZ2V0RXJyb3JSZXRyeURlY2lzaW9uKGF0dGVtcHQsIHRoaXMuY29uZmlnKTtcbiAgICAgICAgaWYgKCFkZWNpc2lvbi5zaG91bGRSZXRyeSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgTWF4IHJldHJ5IGF0dGVtcHRzICgke3RoaXMuY29uZmlnLm1heFJldHJpZXN9KSByZWFjaGVkYCk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgT3BlcmF0aW9uIGZhaWxlZCAoYXR0ZW1wdCAke3RoaXMuYXR0ZW1wdHN9LyR7dGhpcy5jb25maWcubWF4UmV0cmllc30pLCByZXRyeWluZyBpbiAke2RlY2lzaW9uLmRlbGF5TXN9bXMuLi5gLFxuICAgICAgICAgIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvcikgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlY2lzaW9uLmRlbGF5TXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNvbm5lY3Rpb24gZXJyb3JzIHdpdGggcmV0cnkgdHJhY2tpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvciAtIEVycm9yIHRoYXQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRlc3RDb25uZWN0aW9uIC0gRnVuY3Rpb24gdG8gdGVzdCBpZiBjb25uZWN0aW9uIGlzIHJlc3RvcmVkXG4gICAqL1xuICBhc3luYyBoYW5kbGVDb25uZWN0aW9uRXJyb3IoZXJyb3I6IEVycm9yLCB0ZXN0Q29ubmVjdGlvbjogKCkgPT4gUHJvbWlzZTxib29sZWFuPik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIERlY2lkZSBmcm9tIHRoZSBhdHRlbXB0cyBhbHJlYWR5IHNwZW50ICh6ZXJvLWJhc2VkKSwgVEhFTiByZWNvcmQgdGhpcyBvbmUsXG4gICAgLy8gc28gdGhlIGJ1ZGdldCBtYXRjaGVzIGBleGVjdXRlYCdzLlxuICAgIGNvbnN0IGRlY2lzaW9uID0gZ2V0RXJyb3JSZXRyeURlY2lzaW9uKHRoaXMuYXR0ZW1wdHMsIHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmF0dGVtcHRzKys7XG5cbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICBgQ29ubmVjdGlvbiBlcnJvciAoYXR0ZW1wdCAke3RoaXMuYXR0ZW1wdHN9LyR7dGhpcy5jb25maWcubWF4UmV0cmllc30pOmAsXG4gICAgICBlcnJvci5tZXNzYWdlLFxuICAgICk7XG5cbiAgICBpZiAoIWRlY2lzaW9uLnNob3VsZFJldHJ5KSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ01heCBjb25uZWN0aW9uIHJldHJ5IGF0dGVtcHRzIHJlYWNoZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhgUmV0cnlpbmcgY29ubmVjdGlvbiBpbiAke2RlY2lzaW9uLmRlbGF5TXN9bXMuLi5gKTtcbiAgICBhd2FpdCB0aGlzLnNsZWVwKGRlY2lzaW9uLmRlbGF5TXMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzSGVhbHRoeSA9IGF3YWl0IHRlc3RDb25uZWN0aW9uKCk7XG4gICAgICBpZiAoaXNIZWFsdGh5KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb25uZWN0aW9uIHJlc3RvcmVkJyk7XG4gICAgICAgIHRoaXMuYXR0ZW1wdHMgPSAwOyAvLyBSZXNldCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignQ29ubmVjdGlvbiB0ZXN0IGZhaWxlZCBhZnRlciByZXRyeScpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKHJldHJ5RXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignUmV0cnkgZmFpbGVkOicsIHJldHJ5RXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGF0dGVtcHQgY291bnRlci5cbiAgICogQ2FsbCB0aGlzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGF0dGVtcHQgY291bnQuXG4gICAqL1xuICBnZXRBdHRlbXB0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmF0dGVtcHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNsZWVwcyBmb3IgdGhlIHNwZWNpZmllZCBkdXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG1zIC0gTWlsbGlzZWNvbmRzIHRvIHNsZWVwXG4gICAqL1xuICBwcml2YXRlIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cbn1cbiJdfQ==
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcmV0cnktc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFvQixZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqSCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUk5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBR0wsTUFBTTtJQUYzQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRXJCLFlBQTZCLE1BQW1CO3NCQUFuQixNQUFNO0lBQWdCLENBQUM7SUFFcEQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUksU0FBMkI7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFbEIsb0VBQW9FO1FBQ3BFLDREQUE0RDtRQUM1RCxxRUFBcUU7UUFDckUsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQztnQkFDakQsQ0FBQztnQkFDRCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBQzVCLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxXQUFXLENBQUMsQ0FBQztvQkFDdkUsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxNQUFNLENBQUMsSUFBSSxDQUNULDZCQUE2QixJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxrQkFBa0IsUUFBUSxDQUFDLE9BQU8sT0FBTyxFQUM3RyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDL0IsQ0FBQztnQkFFRixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQVksRUFBRSxjQUFzQztRQUM5RSw2RUFBNkU7UUFDN0UscUNBQXFDO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQixNQUFNLENBQUMsS0FBSyxDQUNWLDZCQUE2QixJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQ3hFLEtBQUssQ0FBQyxPQUFPLENBQ2QsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ3RELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsUUFBUSxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUM7UUFDL0QsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVuQyxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztZQUN0RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLEVBQVU7UUFDdEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBnZXRFcnJvclJldHJ5RGVjaXNpb24sIHR5cGUgUmV0cnlDb25maWcsIGVycm9yTWVzc2FnZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXRyeS1zdHJhdGVneScpO1xuXG5leHBvcnQgdHlwZSB7IFJldHJ5Q29uZmlnIH07XG5cbi8qKlxuICogRXhwb25lbnRpYWwtYmFja29mZiByZXRyeSBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbnMuXG4gKlxuICogVGhlIGJhY2tvZmYgREVDSVNJT04gKGhvdyBtYW55IGF0dGVtcHRzLCBob3cgbG9uZyB0byB3YWl0LCBqaXR0ZXIpIGlzXG4gKiBhcGktY29yZSdzIGBnZXRFcnJvclJldHJ5RGVjaXNpb25gIOKAlCB0aGlzIGNsYXNzIG93bnMgb25seSB0aGUgY29ubmVjdGlvbi1cbiAqIHNwZWNpZmljIGNvbmNlcm5zIChhdHRlbXB0IHRyYWNraW5nLCBsb2dnaW5nLCB0aGUgaGVhbHRoLXByb2JlIHJlY292ZXJ5XG4gKiBwYXRoKS4gRGVsYXlzIGFyZSBqaXR0ZXJlZCBzbyBhIHBvb2wgb2YgcmVwbGljYXMgZG9lc24ndCByZXRyeSBpbiBsb2Nrc3RlcFxuICogYWZ0ZXIgYSBkYXRhYmFzZSBibGlwLlxuICpcbiAqIGBtYXhSZXRyaWVzYCBtZWFucyB3aGF0IGl0IHNheXM6IE4gcmV0cmllcyBBRlRFUiB0aGUgaW5pdGlhbCBhdHRlbXB0LCBzb1xuICogYHsgbWF4UmV0cmllczogMyB9YCBtYWtlcyB1cCB0byA0IGF0dGVtcHRzIHRvdGFsLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdHJhdGVneSA9IG5ldyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSh7IG1heFJldHJpZXM6IDMsIHJldHJ5RGVsYXlNczogMTAwMCB9KTtcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJhdGVneS5leGVjdXRlKGFzeW5jICgpID0+IHtcbiAqICAgcmV0dXJuIGF3YWl0IGRiLnF1ZXJ5KCdTRUxFQ1QgMScpO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25SZXRyeVN0cmF0ZWd5IHtcbiAgcHJpdmF0ZSBhdHRlbXB0cyA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJldHJ5Q29uZmlnKSB7fVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhbiBvcGVyYXRpb24sIHJldHJ5aW5nIHRyYW5zaWVudCBmYWlsdXJlcyB3aXRoIGppdHRlcmVkXG4gICAqIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBBc3luYyBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGggcmV0cmllc1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBvcGVyYXRpb24gcmVzdWx0XG4gICAqIEB0aHJvd3MgdGhlIGxhc3QgZXJyb3Igb25jZSB0aGUgcmV0cnkgYnVkZ2V0IGlzIGV4aGF1c3RlZFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZTxUPihvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcblxuICAgIC8vIGBhdHRlbXB0YCBpcyBaRVJPLUJBU0VEIGFuZCBjb3VudHMgcmV0cmllcyBhbHJlYWR5IG1hZGUsIG1hdGNoaW5nXG4gICAgLy8gZ2V0RXJyb3JSZXRyeURlY2lzaW9uJ3MgY29udHJhY3Q6IGl0IGFsbG93cyBhIHJldHJ5IHdoaWxlXG4gICAgLy8gYGF0dGVtcHQgPCBtYXhSZXRyaWVzYCwgc28gdGhlIGxvb3AgbWFrZXMgbWF4UmV0cmllcyArIDEgYXR0ZW1wdHMuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcGVyYXRpb24oKTtcbiAgICAgICAgaWYgKGF0dGVtcHQgPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ09wZXJhdGlvbiBzdWNjZWVkZWQgYWZ0ZXIgcmV0cnknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5hdHRlbXB0cyA9IGF0dGVtcHQgKyAxO1xuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGdldEVycm9yUmV0cnlEZWNpc2lvbihhdHRlbXB0LCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIGlmICghZGVjaXNpb24uc2hvdWxkUmV0cnkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYE1heCByZXRyeSBhdHRlbXB0cyAoJHt0aGlzLmNvbmZpZy5tYXhSZXRyaWVzfSkgcmVhY2hlZGApO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYE9wZXJhdGlvbiBmYWlsZWQgKGF0dGVtcHQgJHt0aGlzLmF0dGVtcHRzfS8ke3RoaXMuY29uZmlnLm1heFJldHJpZXN9KSwgcmV0cnlpbmcgaW4gJHtkZWNpc2lvbi5kZWxheU1zfW1zLi4uYCxcbiAgICAgICAgICB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChkZWNpc2lvbi5kZWxheU1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjb25uZWN0aW9uIGVycm9ycyB3aXRoIHJldHJ5IHRyYWNraW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3IgLSBFcnJvciB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0ZXN0Q29ubmVjdGlvbiAtIEZ1bmN0aW9uIHRvIHRlc3QgaWYgY29ubmVjdGlvbiBpcyByZXN0b3JlZFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlQ29ubmVjdGlvbkVycm9yKGVycm9yOiBFcnJvciwgdGVzdENvbm5lY3Rpb246ICgpID0+IFByb21pc2U8Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBEZWNpZGUgZnJvbSB0aGUgYXR0ZW1wdHMgYWxyZWFkeSBzcGVudCAoemVyby1iYXNlZCksIFRIRU4gcmVjb3JkIHRoaXMgb25lLFxuICAgIC8vIHNvIHRoZSBidWRnZXQgbWF0Y2hlcyBgZXhlY3V0ZWAncy5cbiAgICBjb25zdCBkZWNpc2lvbiA9IGdldEVycm9yUmV0cnlEZWNpc2lvbih0aGlzLmF0dGVtcHRzLCB0aGlzLmNvbmZpZyk7XG4gICAgdGhpcy5hdHRlbXB0cysrO1xuXG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgYENvbm5lY3Rpb24gZXJyb3IgKGF0dGVtcHQgJHt0aGlzLmF0dGVtcHRzfS8ke3RoaXMuY29uZmlnLm1heFJldHJpZXN9KTpgLFxuICAgICAgZXJyb3IubWVzc2FnZSxcbiAgICApO1xuXG4gICAgaWYgKCFkZWNpc2lvbi5zaG91bGRSZXRyeSkge1xuICAgICAgbG9nZ2VyLmVycm9yKCdNYXggY29ubmVjdGlvbiByZXRyeSBhdHRlbXB0cyByZWFjaGVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYFJldHJ5aW5nIGNvbm5lY3Rpb24gaW4gJHtkZWNpc2lvbi5kZWxheU1zfW1zLi4uYCk7XG4gICAgYXdhaXQgdGhpcy5zbGVlcChkZWNpc2lvbi5kZWxheU1zKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc0hlYWx0aHkgPSBhd2FpdCB0ZXN0Q29ubmVjdGlvbigpO1xuICAgICAgaWYgKGlzSGVhbHRoeSkge1xuICAgICAgICBsb2dnZXIuaW5mbygnQ29ubmVjdGlvbiByZXN0b3JlZCcpO1xuICAgICAgICB0aGlzLmF0dGVtcHRzID0gMDsgLy8gUmVzZXQgb24gc3VjY2Vzc2Z1bCBjb25uZWN0aW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0Nvbm5lY3Rpb24gdGVzdCBmYWlsZWQgYWZ0ZXIgcmV0cnknKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChyZXRyeUVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1JldHJ5IGZhaWxlZDonLCByZXRyeUVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBhdHRlbXB0IGNvdW50ZXIuXG4gICAqIENhbGwgdGhpcyBhZnRlciBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5hdHRlbXB0cyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBhdHRlbXB0IGNvdW50LlxuICAgKi9cbiAgZ2V0QXR0ZW1wdHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5hdHRlbXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTbGVlcHMgZm9yIHRoZSBzcGVjaWZpZWQgZHVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBtcyAtIE1pbGxpc2Vjb25kcyB0byBzbGVlcFxuICAgKi9cbiAgcHJpdmF0ZSBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG59XG4iXX0=