@pipeline-builder/api-core 4.1.3 → 4.1.4

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 (75) hide show
  1. package/README.md +3 -3
  2. package/lib/errors/app-errors.d.ts +0 -4
  3. package/lib/errors/app-errors.js +1 -8
  4. package/lib/helpers/restore-helpers.d.ts +3 -3
  5. package/lib/helpers/restore-helpers.js +4 -4
  6. package/lib/helpers/sse-helpers.d.ts +8 -1
  7. package/lib/helpers/sse-helpers.js +11 -3
  8. package/lib/middleware/auth.d.ts +174 -43
  9. package/lib/middleware/auth.js +384 -179
  10. package/lib/middleware/index.d.ts +1 -0
  11. package/lib/middleware/index.js +2 -1
  12. package/lib/middleware/route-table.d.ts +104 -0
  13. package/lib/middleware/route-table.js +230 -0
  14. package/lib/middleware/step-up.d.ts +48 -16
  15. package/lib/middleware/step-up.js +74 -36
  16. package/lib/services/api-key-exchange.d.ts +25 -0
  17. package/lib/services/api-key-exchange.js +219 -0
  18. package/lib/services/cache-service.d.ts +11 -26
  19. package/lib/services/cache-service.js +20 -74
  20. package/lib/services/compliance-event-subscriber.d.ts +5 -4
  21. package/lib/services/compliance-event-subscriber.js +8 -6
  22. package/lib/services/durable-event-bus.d.ts +22 -39
  23. package/lib/services/durable-event-bus.js +95 -43
  24. package/lib/services/env-redis.d.ts +27 -0
  25. package/lib/services/env-redis.js +63 -1
  26. package/lib/services/http-client.d.ts +10 -15
  27. package/lib/services/http-client.js +32 -27
  28. package/lib/services/index.d.ts +3 -0
  29. package/lib/services/index.js +4 -1
  30. package/lib/services/jwks-cache.d.ts +102 -0
  31. package/lib/services/jwks-cache.js +222 -0
  32. package/lib/services/quota.js +12 -4
  33. package/lib/services/remote-audit-client.d.ts +1 -1
  34. package/lib/services/remote-audit-client.js +32 -1
  35. package/lib/services/scheduler.d.ts +2 -3
  36. package/lib/services/scheduler.js +2 -2
  37. package/lib/services/service-boot.d.ts +4 -2
  38. package/lib/services/service-boot.js +7 -3
  39. package/lib/services/service-keys.d.ts +83 -0
  40. package/lib/services/service-keys.js +354 -0
  41. package/lib/services/sse-ticket-store.d.ts +55 -22
  42. package/lib/services/sse-ticket-store.js +122 -79
  43. package/lib/services/token-revocation.js +30 -18
  44. package/lib/testing/route-coverage.d.ts +64 -0
  45. package/lib/testing/route-coverage.js +183 -0
  46. package/lib/testing/service-tokens.d.ts +66 -0
  47. package/lib/testing/service-tokens.js +137 -0
  48. package/lib/testing/tier-mock.d.ts +2 -2
  49. package/lib/testing/tier-mock.js +3 -3
  50. package/lib/testing/user-tokens.d.ts +75 -0
  51. package/lib/testing/user-tokens.js +115 -0
  52. package/lib/types/catalog-metadata.d.ts +0 -2
  53. package/lib/types/catalog-metadata.js +1 -3
  54. package/lib/types/common.d.ts +103 -4
  55. package/lib/types/common.js +11 -1
  56. package/lib/types/error-codes.d.ts +15 -0
  57. package/lib/types/error-codes.js +22 -1
  58. package/lib/types/permissions.d.ts +35 -1
  59. package/lib/types/permissions.js +70 -2
  60. package/lib/utils/api-key.d.ts +34 -0
  61. package/lib/utils/api-key.js +75 -0
  62. package/lib/utils/env.d.ts +0 -2
  63. package/lib/utils/env.js +1 -6
  64. package/lib/utils/index.d.ts +3 -0
  65. package/lib/utils/index.js +4 -1
  66. package/lib/utils/jwk.d.ts +98 -0
  67. package/lib/utils/jwk.js +139 -0
  68. package/lib/utils/logger.d.ts +4 -1
  69. package/lib/utils/logger.js +1 -22
  70. package/lib/utils/secret-encryption.d.ts +7 -2
  71. package/lib/utils/secret-encryption.js +47 -4
  72. package/lib/utils/secret-rotation.d.ts +17 -0
  73. package/lib/utils/secret-rotation.js +54 -0
  74. package/lib/validation/common-schemas.js +5 -4
  75. package/package.json +20 -1
@@ -0,0 +1,115 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Test helpers for the ES256 user-token chain.
5
+ *
6
+ * Before #5 every suite that needed an authenticated request just signed a JWT
7
+ * with a literal `JWT_SECRET` — one line, and seventeen independent copies of
8
+ * it. User tokens are asymmetric now, which needs a keypair, a `kid` and a JWKS
9
+ * the verifier can fetch, so that per-suite copy-paste would be ~15 lines each.
10
+ * Hence one shared seam, in api-core next to the route-coverage helper, imported
11
+ * by the suites of every package:
12
+ *
13
+ * ```ts
14
+ * import { installTestJwks, signTestUserToken } from '@pipeline-builder/api-core/lib/testing/user-tokens.js';
15
+ *
16
+ * const jwks = installTestJwks();
17
+ * const token = signTestUserToken({ sub: 'u1', role: 'member', ... });
18
+ * ```
19
+ *
20
+ * `installTestJwks` replaces the process-wide JWKS cache with one backed by the
21
+ * generated keys — no HTTP, and it counts fetches so a test can assert the
22
+ * refresh / unknown-`kid` / negative-cache behaviour.
23
+ */
24
+ import crypto, {} from 'crypto';
25
+ import { JwksCache, setPlatformJwksCache } from '../services/jwks-cache.js';
26
+ import { USER_TOKEN_ALGORITHM, publicJwkFrom } from '../utils/jwk.js';
27
+ /** Generate one EC P-256 signing key, `kid` = its RFC 7638 thumbprint. */
28
+ export function generateTestSigningKey() {
29
+ const { privateKey, publicKey } = crypto.generateKeyPairSync('ec', { namedCurve: 'prime256v1' });
30
+ const jwk = publicJwkFrom(publicKey);
31
+ return { kid: jwk.kid, privateKey, publicKey, jwk };
32
+ }
33
+ /**
34
+ * Sign `payload` as an ES256 JWT with `key`. `expiresIn` seconds (default 300).
35
+ * Synchronous — `crypto.sign` is, and platform's async signer only exists
36
+ * because KMS is a network call — so a suite can mint a token inline wherever it
37
+ * used to call `jwt.sign`.
38
+ */
39
+ export function signTestUserToken(payload, options = {
40
+ key: defaultKey(),
41
+ }) {
42
+ const key = options.key ?? defaultKey();
43
+ const now = Math.floor(Date.now() / 1000);
44
+ const body = {
45
+ ...payload,
46
+ iat: payload.iat ?? now,
47
+ exp: payload.exp ?? now + (options.expiresIn ?? 300),
48
+ ...(options.notBefore !== undefined ? { nbf: now + options.notBefore } : {}),
49
+ ...(options.issuer ? { iss: options.issuer } : {}),
50
+ ...(options.audience ? { aud: options.audience } : {}),
51
+ };
52
+ const b64 = (value) => Buffer.from(JSON.stringify(value), 'utf-8').toString('base64url');
53
+ const signingInput = `${b64({ alg: USER_TOKEN_ALGORITHM, typ: 'JWT', kid: options.kid ?? key.kid })}.${b64(body)}`;
54
+ const signature = crypto.sign('sha256', Buffer.from(signingInput, 'utf-8'), {
55
+ key: key.privateKey,
56
+ dsaEncoding: 'ieee-p1363',
57
+ });
58
+ return `${signingInput}.${signature.toString('base64url')}`;
59
+ }
60
+ /** The claim block a USER principal must carry to satisfy `hasValidIdentityClaims`. */
61
+ export function testUserIdentityClaims() {
62
+ return {
63
+ type: 'access',
64
+ principalType: 'user',
65
+ token_use: 'access',
66
+ amr: ['pwd'],
67
+ aal: 1,
68
+ auth_time: Math.floor(Date.now() / 1000),
69
+ };
70
+ }
71
+ let installed;
72
+ function defaultKey() {
73
+ if (!installed)
74
+ throw new Error('installTestJwks() must be called before signing a test user token');
75
+ return installed.primary;
76
+ }
77
+ /**
78
+ * Install a JWKS cache backed by freshly generated keys (or `keys` when given)
79
+ * as the process-wide one, and return a handle over it. Call in `beforeEach`;
80
+ * `uninstallTestJwks()` restores the real HTTP-backed cache.
81
+ */
82
+ export function installTestJwks(keys = [generateTestSigningKey()], cacheOptions = {}) {
83
+ let published = keys;
84
+ let fetches = 0;
85
+ let failures = 0;
86
+ const handle = {
87
+ get keys() { return published; },
88
+ get primary() { return published[0]; },
89
+ fetchCount: () => fetches,
90
+ failNextFetches: (count) => { failures = count; },
91
+ publish: (next) => { published = next; },
92
+ document: () => ({ keys: published.map((k) => k.jwk) }),
93
+ };
94
+ const cache = new JwksCache({
95
+ source: 'test',
96
+ fetch: async () => {
97
+ fetches += 1;
98
+ if (failures > 0) {
99
+ failures -= 1;
100
+ throw new Error('test JWKS fetch failure');
101
+ }
102
+ return handle.document();
103
+ },
104
+ ...cacheOptions,
105
+ });
106
+ setPlatformJwksCache(cache);
107
+ installed = handle;
108
+ return handle;
109
+ }
110
+ /** Restore the real (HTTP-backed) JWKS cache. */
111
+ export function uninstallTestJwks() {
112
+ setPlatformJwksCache(undefined);
113
+ installed = undefined;
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci10b2tlbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy91c2VyLXRva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sTUFBTSxFQUFFLEVBQWtCLE1BQU0sUUFBUSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFxQyxNQUFNLGlCQUFpQixDQUFDO0FBVXpHLDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE9BQWdDLEVBQ2hDLE9BQU8sR0FBc0g7SUFDM0gsR0FBRyxFQUFFLFVBQVUsRUFBRTtDQUNsQjtJQUVELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7SUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDMUMsTUFBTSxJQUFJLEdBQTRCO1FBQ3BDLEdBQUcsT0FBTztRQUNWLEdBQUcsRUFBRSxP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RyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sRUFBRSxDQUFDLElBQXNCLEVBQUUsRUFBRSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFELFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0tBQ3hELENBQUM7SUFFRixNQUFNLEtBQUssR0FBRyxJQUFJLFNBQVMsQ0FBQztRQUMxQixNQUFNLEVBQUUsTUFBTTtRQUNkLEtBQUssRUFBRSxLQUFLLElBQUksRUFBRTtZQUNoQixPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ2IsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLFFBQVEsSUFBSSxDQUFDLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQ0QsR0FBRyxZQUFZO0tBQ2hCLENBQUMsQ0FBQztJQUNILG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLFNBQVMsR0FBRyxNQUFNLENBQUM7SUFDbkIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELGlEQUFpRDtBQUNqRCxNQUFNLFVBQVUsaUJBQWlCO0lBQy9CLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRlc3QgaGVscGVycyBmb3IgdGhlIEVTMjU2IHVzZXItdG9rZW4gY2hhaW4uXG4gKlxuICogQmVmb3JlICM1IGV2ZXJ5IHN1aXRlIHRoYXQgbmVlZGVkIGFuIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdCBqdXN0IHNpZ25lZCBhIEpXVFxuICogd2l0aCBhIGxpdGVyYWwgYEpXVF9TRUNSRVRgIOKAlCBvbmUgbGluZSwgYW5kIHNldmVudGVlbiBpbmRlcGVuZGVudCBjb3BpZXMgb2ZcbiAqIGl0LiBVc2VyIHRva2VucyBhcmUgYXN5bW1ldHJpYyBub3csIHdoaWNoIG5lZWRzIGEga2V5cGFpciwgYSBga2lkYCBhbmQgYSBKV0tTXG4gKiB0aGUgdmVyaWZpZXIgY2FuIGZldGNoLCBzbyB0aGF0IHBlci1zdWl0ZSBjb3B5LXBhc3RlIHdvdWxkIGJlIH4xNSBsaW5lcyBlYWNoLlxuICogSGVuY2Ugb25lIHNoYXJlZCBzZWFtLCBpbiBhcGktY29yZSBuZXh0IHRvIHRoZSByb3V0ZS1jb3ZlcmFnZSBoZWxwZXIsIGltcG9ydGVkXG4gKiBieSB0aGUgc3VpdGVzIG9mIGV2ZXJ5IHBhY2thZ2U6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGluc3RhbGxUZXN0Sndrcywgc2lnblRlc3RVc2VyVG9rZW4gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9saWIvdGVzdGluZy91c2VyLXRva2Vucy5qcyc7XG4gKlxuICogY29uc3QgandrcyA9IGluc3RhbGxUZXN0SndrcygpO1xuICogY29uc3QgdG9rZW4gPSBzaWduVGVzdFVzZXJUb2tlbih7IHN1YjogJ3UxJywgcm9sZTogJ21lbWJlcicsIC4uLiB9KTtcbiAqIGBgYFxuICpcbiAqIGBpbnN0YWxsVGVzdEp3a3NgIHJlcGxhY2VzIHRoZSBwcm9jZXNzLXdpZGUgSldLUyBjYWNoZSB3aXRoIG9uZSBiYWNrZWQgYnkgdGhlXG4gKiBnZW5lcmF0ZWQga2V5cyDigJQgbm8gSFRUUCwgYW5kIGl0IGNvdW50cyBmZXRjaGVzIHNvIGEgdGVzdCBjYW4gYXNzZXJ0IHRoZVxuICogcmVmcmVzaCAvIHVua25vd24tYGtpZGAgLyBuZWdhdGl2ZS1jYWNoZSBiZWhhdmlvdXIuXG4gKi9cblxuaW1wb3J0IGNyeXB0bywgeyB0eXBlIEtleU9iamVjdCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBKd2tzQ2FjaGUsIHNldFBsYXRmb3JtSndrc0NhY2hlIH0gZnJvbSAnLi4vc2VydmljZXMvandrcy1jYWNoZS5qcyc7XG5pbXBvcnQgeyBVU0VSX1RPS0VOX0FMR09SSVRITSwgcHVibGljSndrRnJvbSwgdHlwZSBKd2tzRG9jdW1lbnQsIHR5cGUgUHVibGljSndrIH0gZnJvbSAnLi4vdXRpbHMvandrLmpzJztcblxuLyoqIEEgZ2VuZXJhdGVkIHNpZ25pbmcga2V5LCBpbiBldmVyeSBmb3JtIHRoZSB0ZXN0cyBuZWVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZXN0U2lnbmluZ0tleSB7XG4gIGtpZDogc3RyaW5nO1xuICBwcml2YXRlS2V5OiBLZXlPYmplY3Q7XG4gIHB1YmxpY0tleTogS2V5T2JqZWN0O1xuICBqd2s6IFB1YmxpY0p3aztcbn1cblxuLyoqIEdlbmVyYXRlIG9uZSBFQyBQLTI1NiBzaWduaW5nIGtleSwgYGtpZGAgPSBpdHMgUkZDIDc2MzggdGh1bWJwcmludC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRlc3RTaWduaW5nS2V5KCk6IFRlc3RTaWduaW5nS2V5IHtcbiAgY29uc3QgeyBwcml2YXRlS2V5LCBwdWJsaWNLZXkgfSA9IGNyeXB0by5nZW5lcmF0ZUtleVBhaXJTeW5jKCdlYycsIHsgbmFtZWRDdXJ2ZTogJ3ByaW1lMjU2djEnIH0pO1xuICBjb25zdCBqd2sgPSBwdWJsaWNKd2tGcm9tKHB1YmxpY0tleSk7XG4gIHJldHVybiB7IGtpZDogandrLmtpZCwgcHJpdmF0ZUtleSwgcHVibGljS2V5LCBqd2sgfTtcbn1cblxuLyoqXG4gKiBTaWduIGBwYXlsb2FkYCBhcyBhbiBFUzI1NiBKV1Qgd2l0aCBga2V5YC4gYGV4cGlyZXNJbmAgc2Vjb25kcyAoZGVmYXVsdCAzMDApLlxuICogU3luY2hyb25vdXMg4oCUIGBjcnlwdG8uc2lnbmAgaXMsIGFuZCBwbGF0Zm9ybSdzIGFzeW5jIHNpZ25lciBvbmx5IGV4aXN0c1xuICogYmVjYXVzZSBLTVMgaXMgYSBuZXR3b3JrIGNhbGwg4oCUIHNvIGEgc3VpdGUgY2FuIG1pbnQgYSB0b2tlbiBpbmxpbmUgd2hlcmV2ZXIgaXRcbiAqIHVzZWQgdG8gY2FsbCBgand0LnNpZ25gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblRlc3RVc2VyVG9rZW4oXG4gIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiB7IGtleTogVGVzdFNpZ25pbmdLZXk7IGV4cGlyZXNJbj86IG51bWJlcjsgaXNzdWVyPzogc3RyaW5nOyBhdWRpZW5jZT86IHN0cmluZzsga2lkPzogc3RyaW5nOyBub3RCZWZvcmU/OiBudW1iZXIgfSA9IHtcbiAgICBrZXk6IGRlZmF1bHRLZXkoKSxcbiAgfSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5ID8/IGRlZmF1bHRLZXkoKTtcbiAgY29uc3Qgbm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XG4gIGNvbnN0IGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIC4uLnBheWxvYWQsXG4gICAgaWF0OiBwYXlsb2FkLmlhdCA/PyBub3csXG4gICAgZXhwOiBwYXlsb2FkLmV4cCA/PyBub3cgKyAob3B0aW9ucy5leHBpcmVzSW4gPz8gMzAwKSxcbiAgICAuLi4ob3B0aW9ucy5ub3RCZWZvcmUgIT09IHVuZGVmaW5lZCA/IHsgbmJmOiBub3cgKyBvcHRpb25zLm5vdEJlZm9yZSB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLmlzc3VlciA/IHsgaXNzOiBvcHRpb25zLmlzc3VlciB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLmF1ZGllbmNlID8geyBhdWQ6IG9wdGlvbnMuYXVkaWVuY2UgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgYjY0ID0gKHZhbHVlOiB1bmtub3duKSA9PiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZSksICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjR1cmwnKTtcbiAgY29uc3Qgc2lnbmluZ0lucHV0ID0gYCR7YjY0KHsgYWxnOiBVU0VSX1RPS0VOX0FMR09SSVRITSwgdHlwOiAnSldUJywga2lkOiBvcHRpb25zLmtpZCA/PyBrZXkua2lkIH0pfS4ke2I2NChib2R5KX1gO1xuICBjb25zdCBzaWduYXR1cmUgPSBjcnlwdG8uc2lnbignc2hhMjU2JywgQnVmZmVyLmZyb20oc2lnbmluZ0lucHV0LCAndXRmLTgnKSwge1xuICAgIGtleToga2V5LnByaXZhdGVLZXksXG4gICAgZHNhRW5jb2Rpbmc6ICdpZWVlLXAxMzYzJyxcbiAgfSk7XG4gIHJldHVybiBgJHtzaWduaW5nSW5wdXR9LiR7c2lnbmF0dXJlLnRvU3RyaW5nKCdiYXNlNjR1cmwnKX1gO1xufVxuXG4vKiogVGhlIGNsYWltIGJsb2NrIGEgVVNFUiBwcmluY2lwYWwgbXVzdCBjYXJyeSB0byBzYXRpc2Z5IGBoYXNWYWxpZElkZW50aXR5Q2xhaW1zYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0VXNlcklkZW50aXR5Q2xhaW1zKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnYWNjZXNzJyxcbiAgICBwcmluY2lwYWxUeXBlOiAndXNlcicsXG4gICAgdG9rZW5fdXNlOiAnYWNjZXNzJyxcbiAgICBhbXI6IFsncHdkJ10sXG4gICAgYWFsOiAxLFxuICAgIGF1dGhfdGltZTogTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCksXG4gIH07XG59XG5cbi8qKiBIYW5kbGUgb3ZlciB0aGUgaW5zdGFsbGVkIHRlc3QgSldLUyDigJQgbGV0cyBhIHRlc3Qgcm90YXRlIGtleXMgYW5kIGNvdW50IGZldGNoZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RKd2tzSGFuZGxlIHtcbiAgLyoqIEtleXMgY3VycmVudGx5IHB1Ymxpc2hlZC4gKi9cbiAga2V5czogVGVzdFNpZ25pbmdLZXlbXTtcbiAgLyoqIFRoZSBmaXJzdCBwdWJsaXNoZWQga2V5IOKAlCB3aGF0IGBzaWduVGVzdFVzZXJUb2tlbmAgdXNlcyBieSBkZWZhdWx0LiAqL1xuICBwcmltYXJ5OiBUZXN0U2lnbmluZ0tleTtcbiAgLyoqIEhvdyBtYW55IHRpbWVzIHRoZSB2ZXJpZmllciBoYXMgZmV0Y2hlZCB0aGUgZG9jdW1lbnQuICovXG4gIGZldGNoQ291bnQoKTogbnVtYmVyO1xuICAvKiogTWFrZSB0aGUgbmV4dCBmZXRjaChlcykgZmFpbCwgdG8gZXhlcmNpc2UgdGhlIG5lZ2F0aXZlIGNhY2hlIC8gZmFpbC1jbG9zZWQgcGF0aHMuICovXG4gIGZhaWxOZXh0RmV0Y2hlcyhjb3VudDogbnVtYmVyKTogdm9pZDtcbiAgLyoqIFJlcGxhY2UgdGhlIHB1Ymxpc2hlZCBzZXQgKGEgcm90YXRpb24pLCBsZWF2aW5nIHRoZSBjYWNoZSB0byBub3RpY2UuICovXG4gIHB1Ymxpc2goa2V5czogVGVzdFNpZ25pbmdLZXlbXSk6IHZvaWQ7XG4gIC8qKiBUaGUgZG9jdW1lbnQgYXMgdGhlIHZlcmlmaWVyIHNlZXMgaXQuICovXG4gIGRvY3VtZW50KCk6IEp3a3NEb2N1bWVudDtcbn1cblxubGV0IGluc3RhbGxlZDogVGVzdEp3a3NIYW5kbGUgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRLZXkoKTogVGVzdFNpZ25pbmdLZXkge1xuICBpZiAoIWluc3RhbGxlZCkgdGhyb3cgbmV3IEVycm9yKCdpbnN0YWxsVGVzdEp3a3MoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgc2lnbmluZyBhIHRlc3QgdXNlciB0b2tlbicpO1xuICByZXR1cm4gaW5zdGFsbGVkLnByaW1hcnk7XG59XG5cbi8qKlxuICogSW5zdGFsbCBhIEpXS1MgY2FjaGUgYmFja2VkIGJ5IGZyZXNobHkgZ2VuZXJhdGVkIGtleXMgKG9yIGBrZXlzYCB3aGVuIGdpdmVuKVxuICogYXMgdGhlIHByb2Nlc3Mtd2lkZSBvbmUsIGFuZCByZXR1cm4gYSBoYW5kbGUgb3ZlciBpdC4gQ2FsbCBpbiBgYmVmb3JlRWFjaGA7XG4gKiBgdW5pbnN0YWxsVGVzdEp3a3MoKWAgcmVzdG9yZXMgdGhlIHJlYWwgSFRUUC1iYWNrZWQgY2FjaGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsVGVzdEp3a3MoXG4gIGtleXM6IFRlc3RTaWduaW5nS2V5W10gPSBbZ2VuZXJhdGVUZXN0U2lnbmluZ0tleSgpXSxcbiAgY2FjaGVPcHRpb25zOiB7IHJlZnJlc2hJbnRlcnZhbE1zPzogbnVtYmVyOyBuZWdhdGl2ZVR0bE1zPzogbnVtYmVyOyB1bmtub3duS2lkQ29vbGRvd25Ncz86IG51bWJlciB9ID0ge30sXG4pOiBUZXN0Sndrc0hhbmRsZSB7XG4gIGxldCBwdWJsaXNoZWQgPSBrZXlzO1xuICBsZXQgZmV0Y2hlcyA9IDA7XG4gIGxldCBmYWlsdXJlcyA9IDA7XG5cbiAgY29uc3QgaGFuZGxlOiBUZXN0Sndrc0hhbmRsZSA9IHtcbiAgICBnZXQga2V5cygpIHsgcmV0dXJuIHB1Ymxpc2hlZDsgfSxcbiAgICBnZXQgcHJpbWFyeSgpIHsgcmV0dXJuIHB1Ymxpc2hlZFswXTsgfSxcbiAgICBmZXRjaENvdW50OiAoKSA9PiBmZXRjaGVzLFxuICAgIGZhaWxOZXh0RmV0Y2hlczogKGNvdW50OiBudW1iZXIpID0+IHsgZmFpbHVyZXMgPSBjb3VudDsgfSxcbiAgICBwdWJsaXNoOiAobmV4dDogVGVzdFNpZ25pbmdLZXlbXSkgPT4geyBwdWJsaXNoZWQgPSBuZXh0OyB9LFxuICAgIGRvY3VtZW50OiAoKSA9PiAoeyBrZXlzOiBwdWJsaXNoZWQubWFwKChrKSA9PiBrLmp3aykgfSksXG4gIH07XG5cbiAgY29uc3QgY2FjaGUgPSBuZXcgSndrc0NhY2hlKHtcbiAgICBzb3VyY2U6ICd0ZXN0JyxcbiAgICBmZXRjaDogYXN5bmMgKCkgPT4ge1xuICAgICAgZmV0Y2hlcyArPSAxO1xuICAgICAgaWYgKGZhaWx1cmVzID4gMCkge1xuICAgICAgICBmYWlsdXJlcyAtPSAxO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rlc3QgSldLUyBmZXRjaCBmYWlsdXJlJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFuZGxlLmRvY3VtZW50KCk7XG4gICAgfSxcbiAgICAuLi5jYWNoZU9wdGlvbnMsXG4gIH0pO1xuICBzZXRQbGF0Zm9ybUp3a3NDYWNoZShjYWNoZSk7XG4gIGluc3RhbGxlZCA9IGhhbmRsZTtcbiAgcmV0dXJuIGhhbmRsZTtcbn1cblxuLyoqIFJlc3RvcmUgdGhlIHJlYWwgKEhUVFAtYmFja2VkKSBKV0tTIGNhY2hlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW5zdGFsbFRlc3RKd2tzKCk6IHZvaWQge1xuICBzZXRQbGF0Zm9ybUp3a3NDYWNoZSh1bmRlZmluZWQpO1xuICBpbnN0YWxsZWQgPSB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -11,8 +11,6 @@
11
11
  /** Lifecycle stage of a catalog entity. */
12
12
  export declare const LIFECYCLE_STAGES: readonly ['experimental', 'production', 'deprecated'];
13
13
  export type Lifecycle = (typeof LIFECYCLE_STAGES)[number];
14
- /** Default lifecycle applied when none is supplied (matches the DB column default). */
15
- export declare const DEFAULT_LIFECYCLE: Lifecycle;
16
14
  /** Operational criticality of a catalog entity (optional/unset by default). */
17
15
  export declare const CRITICALITY_LEVELS: readonly ['low', 'medium', 'high', 'critical'];
18
16
  export type Criticality = (typeof CRITICALITY_LEVELS)[number];
@@ -12,10 +12,8 @@
12
12
  */
13
13
  /** Lifecycle stage of a catalog entity. */
14
14
  export const LIFECYCLE_STAGES = ['experimental', 'production', 'deprecated'];
15
- /** Default lifecycle applied when none is supplied (matches the DB column default). */
16
- export const DEFAULT_LIFECYCLE = 'production';
17
15
  /** Operational criticality of a catalog entity (optional/unset by default). */
18
16
  export const CRITICALITY_LEVELS = ['low', 'medium', 'high', 'critical'];
19
17
  /** Whether an owner reference points at an individual user or a team/org. */
20
18
  export const OWNER_TYPES = ['user', 'team'];
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZy1tZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9jYXRhbG9nLW1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7OztHQVNHO0FBRUgsMkNBQTJDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQVUsQ0FBQztBQUd0Rix1RkFBdUY7QUFDdkYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWMsWUFBWSxDQUFDO0FBRXpELCtFQUErRTtBQUMvRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBVSxDQUFDO0FBR2pGLDZFQUE2RTtBQUM3RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBEZXZlbG9wZXItcG9ydGFsIGNhdGFsb2cgbWV0YWRhdGEgc2hhcmVkIGFjcm9zcyBjYXRhbG9nIGVudGl0aWVzXG4gKiAocGlwZWxpbmVzIGFuZCBwbHVnaW5zIHRvZGF5OyBhbnkgZnV0dXJlIGNhdGFsb2dhYmxlIGVudGl0eSBuZXh0KS5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIG93bmVyc2hpcC9saWZlY3ljbGUvY2xhc3NpZmljYXRpb24gZmllbGRzIGFuIGludGVybmFsXG4gKiBkZXZlbG9wZXIgcG9ydGFsIGtleXMgaXRzIGNhdGFsb2csIFwibXkgc2VydmljZXNcIiB2aWV3cywgYW5kIHNjb3JlY2FyZHNcbiAqIG9mZiBvZiDigJQgdGhlIGNvdW50ZXJwYXJ0IHRvIEJhY2tzdGFnZSdzIGBtZXRhZGF0YWAvYHNwZWMub3duZXJgL1xuICogYHNwZWMubGlmZWN5Y2xlYC4gS2VwdCBoZXJlIChub3QgcGVyLXNjaGVtYSkgc28gdGhlIERCIHNjaGVtYSwgdGhlIFpvZFxuICogdmFsaWRhdGlvbiwgYW5kIHRoZSBBUEkgYWxsIGRyYXcgZnJvbSBvbmUgc291cmNlIG9mIHRydXRoLlxuICovXG5cbi8qKiBMaWZlY3ljbGUgc3RhZ2Ugb2YgYSBjYXRhbG9nIGVudGl0eS4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfU1RBR0VTID0gWydleHBlcmltZW50YWwnLCAncHJvZHVjdGlvbicsICdkZXByZWNhdGVkJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBMaWZlY3ljbGUgPSAodHlwZW9mIExJRkVDWUNMRV9TVEFHRVMpW251bWJlcl07XG5cbi8qKiBEZWZhdWx0IGxpZmVjeWNsZSBhcHBsaWVkIHdoZW4gbm9uZSBpcyBzdXBwbGllZCAobWF0Y2hlcyB0aGUgREIgY29sdW1uIGRlZmF1bHQpLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElGRUNZQ0xFOiBMaWZlY3ljbGUgPSAncHJvZHVjdGlvbic7XG5cbi8qKiBPcGVyYXRpb25hbCBjcml0aWNhbGl0eSBvZiBhIGNhdGFsb2cgZW50aXR5IChvcHRpb25hbC91bnNldCBieSBkZWZhdWx0KS4gKi9cbmV4cG9ydCBjb25zdCBDUklUSUNBTElUWV9MRVZFTFMgPSBbJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICdjcml0aWNhbCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ3JpdGljYWxpdHkgPSAodHlwZW9mIENSSVRJQ0FMSVRZX0xFVkVMUylbbnVtYmVyXTtcblxuLyoqIFdoZXRoZXIgYW4gb3duZXIgcmVmZXJlbmNlIHBvaW50cyBhdCBhbiBpbmRpdmlkdWFsIHVzZXIgb3IgYSB0ZWFtL29yZy4gKi9cbmV4cG9ydCBjb25zdCBPV05FUl9UWVBFUyA9IFsndXNlcicsICd0ZWFtJ10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBPd25lclR5cGUgPSAodHlwZW9mIE9XTkVSX1RZUEVTKVtudW1iZXJdO1xuXG4vKiogQSB0aXRsZWQgZXh0ZXJuYWwgbGluayBhdHRhY2hlZCB0byBhIGNhdGFsb2cgZW50aXR5IChkb2NzLCBkYXNoYm9hcmQsIHJ1bmJvb2ssIOKApikuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUxpbmsge1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGljb24gaGludCB0aGUgVUkgbWF5IG1hcCB0byBhIGdseXBoIChlLmcuICdkb2NzJywgJ2Rhc2hib2FyZCcpLiAqL1xuICByZWFkb25seSBpY29uPzogc3RyaW5nO1xufVxuXG4vKiogRnJlZS1mb3JtIHR5cGVkIGNsYXNzaWZpY2F0aW9uIGxhYmVsczogYHsgdGVhbTogJ3BheW1lbnRzJywgdGllcjogJ2dvbGQnIH1gLiAqL1xuZXhwb3J0IHR5cGUgRW50aXR5TGFiZWxzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqIE93bmVyIHJlZmVyZW5jZSBmb3IgYSBjYXRhbG9nIGVudGl0eS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0YWxvZ093bmVyc2hpcCB7XG4gIC8qKiBVc2VyIGlkIChvd25lclR5cGU9J3VzZXInKSBvciB0ZWFtL29yZyBpZCAob3duZXJUeXBlPSd0ZWFtJykuICovXG4gIHJlYWRvbmx5IG93bmVySWQ/OiBzdHJpbmcgfCBudWxsO1xuICByZWFkb25seSBvd25lclR5cGU/OiBPd25lclR5cGUgfCBudWxsO1xufVxuIl19
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0YWxvZy1tZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9jYXRhbG9nLW1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7OztHQVNHO0FBRUgsMkNBQTJDO0FBQzNDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQVUsQ0FBQztBQUd0RiwrRUFBK0U7QUFDL0UsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQVUsQ0FBQztBQUdqRiw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRGV2ZWxvcGVyLXBvcnRhbCBjYXRhbG9nIG1ldGFkYXRhIHNoYXJlZCBhY3Jvc3MgY2F0YWxvZyBlbnRpdGllc1xuICogKHBpcGVsaW5lcyBhbmQgcGx1Z2lucyB0b2RheTsgYW55IGZ1dHVyZSBjYXRhbG9nYWJsZSBlbnRpdHkgbmV4dCkuXG4gKlxuICogVGhlc2UgYXJlIHRoZSBvd25lcnNoaXAvbGlmZWN5Y2xlL2NsYXNzaWZpY2F0aW9uIGZpZWxkcyBhbiBpbnRlcm5hbFxuICogZGV2ZWxvcGVyIHBvcnRhbCBrZXlzIGl0cyBjYXRhbG9nLCBcIm15IHNlcnZpY2VzXCIgdmlld3MsIGFuZCBzY29yZWNhcmRzXG4gKiBvZmYgb2Yg4oCUIHRoZSBjb3VudGVycGFydCB0byBCYWNrc3RhZ2UncyBgbWV0YWRhdGFgL2BzcGVjLm93bmVyYC9cbiAqIGBzcGVjLmxpZmVjeWNsZWAuIEtlcHQgaGVyZSAobm90IHBlci1zY2hlbWEpIHNvIHRoZSBEQiBzY2hlbWEsIHRoZSBab2RcbiAqIHZhbGlkYXRpb24sIGFuZCB0aGUgQVBJIGFsbCBkcmF3IGZyb20gb25lIHNvdXJjZSBvZiB0cnV0aC5cbiAqL1xuXG4vKiogTGlmZWN5Y2xlIHN0YWdlIG9mIGEgY2F0YWxvZyBlbnRpdHkuICovXG5leHBvcnQgY29uc3QgTElGRUNZQ0xFX1NUQUdFUyA9IFsnZXhwZXJpbWVudGFsJywgJ3Byb2R1Y3Rpb24nLCAnZGVwcmVjYXRlZCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlID0gKHR5cGVvZiBMSUZFQ1lDTEVfU1RBR0VTKVtudW1iZXJdO1xuXG4vKiogT3BlcmF0aW9uYWwgY3JpdGljYWxpdHkgb2YgYSBjYXRhbG9nIGVudGl0eSAob3B0aW9uYWwvdW5zZXQgYnkgZGVmYXVsdCkuICovXG5leHBvcnQgY29uc3QgQ1JJVElDQUxJVFlfTEVWRUxTID0gWydsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnLCAnY3JpdGljYWwnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENyaXRpY2FsaXR5ID0gKHR5cGVvZiBDUklUSUNBTElUWV9MRVZFTFMpW251bWJlcl07XG5cbi8qKiBXaGV0aGVyIGFuIG93bmVyIHJlZmVyZW5jZSBwb2ludHMgYXQgYW4gaW5kaXZpZHVhbCB1c2VyIG9yIGEgdGVhbS9vcmcuICovXG5leHBvcnQgY29uc3QgT1dORVJfVFlQRVMgPSBbJ3VzZXInLCAndGVhbSddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgT3duZXJUeXBlID0gKHR5cGVvZiBPV05FUl9UWVBFUylbbnVtYmVyXTtcblxuLyoqIEEgdGl0bGVkIGV4dGVybmFsIGxpbmsgYXR0YWNoZWQgdG8gYSBjYXRhbG9nIGVudGl0eSAoZG9jcywgZGFzaGJvYXJkLCBydW5ib29rLCDigKYpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlMaW5rIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBpY29uIGhpbnQgdGhlIFVJIG1heSBtYXAgdG8gYSBnbHlwaCAoZS5nLiAnZG9jcycsICdkYXNoYm9hcmQnKS4gKi9cbiAgcmVhZG9ubHkgaWNvbj86IHN0cmluZztcbn1cblxuLyoqIEZyZWUtZm9ybSB0eXBlZCBjbGFzc2lmaWNhdGlvbiBsYWJlbHM6IGB7IHRlYW06ICdwYXltZW50cycsIHRpZXI6ICdnb2xkJyB9YC4gKi9cbmV4cG9ydCB0eXBlIEVudGl0eUxhYmVscyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbi8qKiBPd25lciByZWZlcmVuY2UgZm9yIGEgY2F0YWxvZyBlbnRpdHkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGFsb2dPd25lcnNoaXAge1xuICAvKiogVXNlciBpZCAob3duZXJUeXBlPSd1c2VyJykgb3IgdGVhbS9vcmcgaWQgKG93bmVyVHlwZT0ndGVhbScpLiAqL1xuICByZWFkb25seSBvd25lcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgcmVhZG9ubHkgb3duZXJUeXBlPzogT3duZXJUeXBlIHwgbnVsbDtcbn1cbiJdfQ==
@@ -6,8 +6,74 @@ import type { QuotaTier } from './quota-tiers.js';
6
6
  * scoped identity check it via `hasScope`. Kept a closed union (mirroring
7
7
  * {@link Permission}) so a typo on either the mint or the check side is a compile
8
8
  * error. Add a value here when introducing a new scoped-token surface.
9
+ *
10
+ * - `reporting:ingest` — the AWS event-ingestion Lambda's writes (`/reports/events`,
11
+ * `/reports/ingest-health`) and the incident webhook.
12
+ * - `registry:push` — `docker push` into the owning org's own namespace via
13
+ * image-registry's `/token` endpoint. Grants the raw-image write that
14
+ * `plugins:write` grants a person, and nothing else: a scoped token carries no
15
+ * permissions, so it can neither read the API nor push outside its org.
16
+ * - `scim` — an identity provider's SCIM 2.0 client (3b) driving
17
+ * `/scim/v2/Users` and `/scim/v2/Groups` for the key's OWN org. It provisions
18
+ * and deactivates memberships and moves people between directory groups; it
19
+ * can never read or write anything else, and — because a scoped token carries
20
+ * no permissions — it cannot author the group → Role rules its syncs resolve
21
+ * through. Only a service-account key may carry it; a person's token never does.
22
+ */
23
+ export type TokenScope = 'reporting:ingest' | 'registry:push' | 'scim';
24
+ /**
25
+ * Runtime catalog of {@link TokenScope} (a union is erased at runtime). This is
26
+ * the ONE allowlist every mint path validates against — platform's key/token
27
+ * issue routes included — so a new scope is added in exactly one place.
28
+ */
29
+ export declare const TOKEN_SCOPES: readonly TokenScope[];
30
+ /**
31
+ * What kind of principal a token speaks for. Auth decisions branch on this claim
32
+ * — never on the shape of `sub` or on which optional claims happen to be present.
33
+ *
34
+ * - `user` — a person (session, machine session, PAT or impersonation).
35
+ * - `service_account` — a non-human account owned by ONE org, holding org Roles
36
+ * and authenticating with a `pb_sa_…` key exchanged at
37
+ * platform. Never satisfies an assurance/step-up gate.
38
+ * - `service` — an internal Pipeline Builder service ({@link signServiceToken}).
39
+ */
40
+ export type PrincipalType = 'user' | 'service_account' | 'service';
41
+ /**
42
+ * How a token is used. `access` is a session-style access token (interactive,
43
+ * machine-session or service); `api_key` is a standalone credential tracked by
44
+ * its own record — a Personal Access Token or a service-account key, named by
45
+ * `jti`.
46
+ */
47
+ export type TokenUse = 'access' | 'api_key';
48
+ /**
49
+ * Authentication methods (`amr`, RFC 8176 style) that established a user's
50
+ * session. `pwd` password sign-in; `oauth` social sign-in (Google, GitHub …);
51
+ * `sso` per-org OIDC single sign-on; `webauthn` a passkey (WebAuthn assertion
52
+ * with user verification); `stepup` a step-up re-verification token; `mfa` a
53
+ * second factor was presented as well — today an authenticator-app code (TOTP)
54
+ * or one of its recovery codes, so it appears ALONGSIDE the method that
55
+ * identified the user (`['pwd', 'mfa']`), never on its own.
9
56
  */
10
- export type TokenScope = 'reporting:ingest';
57
+ export type AuthMethod = 'pwd' | 'oauth' | 'sso' | 'webauthn' | 'stepup' | 'mfa';
58
+ /**
59
+ * Authenticator assurance level of the session a token speaks for (#8).
60
+ *
61
+ * - `1` — one factor: a password, a social sign-in, or SSO through an IdP the
62
+ * org has NOT marked as enforcing MFA.
63
+ * - `2` — MFA-grade: a passkey asserted with user verification, a password plus
64
+ * an authenticator-app code, or SSO through an IdP the org HAS marked as
65
+ * enforcing MFA (providers don't send `amr` reliably, so the org's own
66
+ * statement about its IdP is the signal).
67
+ *
68
+ * Fixed when the session is opened and stored on its refresh-session slot, so
69
+ * refresh / renewal / switch-org copy it verbatim and can never RAISE it —
70
+ * earning aal 2 always means authenticating again with a second factor.
71
+ */
72
+ export type AssuranceLevel = 1 | 2;
73
+ /** Runtime catalogs for the claim unions above (a union is erased at runtime). */
74
+ export declare const PRINCIPAL_TYPES: readonly PrincipalType[];
75
+ export declare const TOKEN_USES: readonly TokenUse[];
76
+ export declare const AUTH_METHODS: readonly AuthMethod[];
11
77
  /**
12
78
  * Quota type identifiers.
13
79
  *
@@ -132,6 +198,39 @@ export interface JwtPayload {
132
198
  username: string;
133
199
  /** User email */
134
200
  email: string;
201
+ /** Which kind of principal this token speaks for (see {@link PrincipalType}). */
202
+ principalType: PrincipalType;
203
+ /** How the token is used (see {@link TokenUse}); PATs are `api_key`. */
204
+ token_use: TokenUse;
205
+ /**
206
+ * Methods that authenticated the session (user principals). Kept on the
207
+ * refresh-session slot, so refresh / renew / switch-org carry it unchanged.
208
+ * Absent on service tokens.
209
+ */
210
+ amr?: AuthMethod[];
211
+ /** Assurance level (user principals). Never raised by refresh / renew / switch-org. */
212
+ aal?: AssuranceLevel;
213
+ /** Epoch seconds of the sign-in that established the session (user principals).
214
+ * Never reset by refresh / renew / switch-org. */
215
+ auth_time?: number;
216
+ /**
217
+ * The active org REQUIRES MFA and its grace period has passed (#8).
218
+ *
219
+ * Carried as a claim so no service has to look the policy up: the org policy
220
+ * is enforced where the token is ISSUED (a session scoped to such an org gets
221
+ * `aal: 2` or is refused), and this claim is the record of that decision, for
222
+ * UI copy and audit rather than for a second enforcement point.
223
+ */
224
+ mfaRequired?: boolean;
225
+ /**
226
+ * BOOTSTRAP-ADMIN EXCEPTION (#8, revision 4). Set only on a session opened by
227
+ * the install's bootstrap admin (`BOOTSTRAP_SUPERADMIN_EMAILS`, system org)
228
+ * while they still have no enrolled factor. Such a session is `aal: 1` and may
229
+ * reach ONLY enrolment, sign-out and the routes `init-platform.sh` calls;
230
+ * every other service refuses it outright (see `requireAuth`). The exception
231
+ * closes permanently at the first enrolment and never reopens.
232
+ */
233
+ mfaEnrollmentPending?: boolean;
135
234
  /** Per-org role in the active organization ('owner' | 'admin' | 'member'). Not a global role. */
136
235
  role: OrgRole;
137
236
  /** Derived: true when role is 'admin' or 'owner' in the active organization */
@@ -188,9 +287,9 @@ export interface JwtPayload {
188
287
  /**
189
288
  * Unique token id. On an impersonation token it identifies the SESSION, so it
190
289
  * can be revoked on its own across every service (see
191
- * `TokenRevocationStore.getSessionRevocation`). Personal Access Tokens carry
192
- * one too, validated against a different record — which is why a `jti` alone
193
- * never marks a token as impersonation; `impersonatorId` does.
290
+ * `TokenRevocationStore.getSessionRevocation`). Personal Access Tokens
291
+ * (`token_use: 'api_key'`) carry one too, validated against their own record.
292
+ * A `jti` alone never classifies a token — `token_use` and `impersonatorId` do.
194
293
  */
195
294
  jti?: string;
196
295
  /**
@@ -1,5 +1,15 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Runtime catalog of {@link TokenScope} (a union is erased at runtime). This is
5
+ * the ONE allowlist every mint path validates against — platform's key/token
6
+ * issue routes included — so a new scope is added in exactly one place.
7
+ */
8
+ export const TOKEN_SCOPES = ['reporting:ingest', 'registry:push', 'scim'];
9
+ /** Runtime catalogs for the claim unions above (a union is erased at runtime). */
10
+ export const PRINCIPAL_TYPES = ['user', 'service_account', 'service'];
11
+ export const TOKEN_USES = ['access', 'api_key'];
12
+ export const AUTH_METHODS = ['pwd', 'oauth', 'sso', 'webauthn', 'stepup', 'mfa'];
3
13
  /**
4
14
  * Valid quota type values.
5
15
  */
@@ -38,4 +48,4 @@ export function isValidQuotaType(value) {
38
48
  export function effectiveRootOrgId(payload) {
39
49
  return payload.rootOrganizationId ?? payload.organizationId;
40
50
  }
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBMEN0Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxjQUFjO0lBQzdELFlBQVksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsWUFBWTtDQUNyRCxDQUFDO0FBRVg7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQWtCLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBaUxEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxPQUFrRTtJQUVsRSxPQUFPLE9BQU8sQ0FBQyxrQkFBa0IsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVGllciB9IGZyb20gJy4vcXVvdGEtdGllcnMuanMnO1xuXG4vKipcbiAqIENhcGFiaWxpdHkgc2NvcGUgY2F0YWxvZyBmb3IgbWFjaGluZS9hdXRvbWF0aW9uIHRva2Vucy4gQSBzY29wZWQgdG9rZW4gY2Fycmllc1xuICogZXhhY3RseSBvbmUgb2YgdGhlc2UgaW5zdGVhZCBvZiByb2xlLWJhc2VkIHBlcm1pc3Npb25zOyBlbmRwb2ludHMgdGhhdCBhY2NlcHQgYVxuICogc2NvcGVkIGlkZW50aXR5IGNoZWNrIGl0IHZpYSBgaGFzU2NvcGVgLiBLZXB0IGEgY2xvc2VkIHVuaW9uIChtaXJyb3JpbmdcbiAqIHtAbGluayBQZXJtaXNzaW9ufSkgc28gYSB0eXBvIG9uIGVpdGhlciB0aGUgbWludCBvciB0aGUgY2hlY2sgc2lkZSBpcyBhIGNvbXBpbGVcbiAqIGVycm9yLiBBZGQgYSB2YWx1ZSBoZXJlIHdoZW4gaW50cm9kdWNpbmcgYSBuZXcgc2NvcGVkLXRva2VuIHN1cmZhY2UuXG4gKi9cbmV4cG9ydCB0eXBlIFRva2VuU2NvcGUgPSAncmVwb3J0aW5nOmluZ2VzdCc7XG5cbi8qKlxuICogUXVvdGEgdHlwZSBpZGVudGlmaWVycy5cbiAqXG4gKiAtIGBwbHVnaW5zYCAvIGBwaXBlbGluZXNgIOKAlCBjb3VudCBvZiBjcmVhdGVkIGVudGl0aWVzXG4gKiAtIGBhcGlDYWxsc2Ag4oCUIGdlbmVyaWMgQVBJIGNhbGwgY291bnQgKHJlYWQtaGVhdnkgcGF0aHMpXG4gKiAtIGBhaUNhbGxzYCDigJQgQUkgcHJvdmlkZXIgaW52b2NhdGlvbnMgKGNvdW50ZWQgc2VwYXJhdGVseSBiZWNhdXNlIGVhY2ggY2FsbFxuICogICBoYXMgZXh0ZXJuYWwgZG9sbGFyIGNvc3Q7IHNpemVkIHNtYWxsZXIgdGhhbiBhcGlDYWxscyBwZXIgdGllcilcbiAqIC0gYHN0b3JhZ2VCeXRlc2Ag4oCUIHJlZ2lzdHJ5IHN0b3JhZ2UgYnVkZ2V0IHBlciBvcmcuIFVubGlrZSB0aGUgb3RoZXJzXG4gKiAgICh3aGljaCBjb3VudCBkaXNjcmV0ZSBldmVudHMpLCB0aGlzIGlzIGEgbWVhc3VyZWQgdG90YWwgcmVjb21wdXRlZFxuICogICBvbiBkZW1hbmQuIEluY3JlbWVudGVkIGJ5IHRoZSBpbWFnZS1yZWdpc3RyeSdzIHB1c2gtZ2F0ZSBiZWZvcmVcbiAqICAgaXNzdWluZyBhIHRva2VuIHdob3NlIHNjb3BlIGluY2x1ZGVzIGBwdXNoYDsgdGhlIEdDIHNjaGVkdWxlclxuICogICBldmVudHVhbGx5IGZyZWVzIHRoZSBieXRlcywgdGhlbiB0aGUgbmV4dCBwdXNoLWdhdGUgY2hlY2sgcmVhZHNcbiAqICAgdGhlIGxvd2VyIHZhbHVlLiBOT1QgYSBjb3VudGVyLXN0eWxlIHF1b3RhIGluIHRoZSBzZW5zZSBvZlxuICogICBgaW5jcmVtZW50VXNhZ2VgIOKAlCB0aGUgcmVnaXN0cnkgcHVzaGVzIHRoZSBtZWFzdXJlZCB0b3RhbCB2aWFcbiAqICAgYHVwZGF0ZUxpbWl0c2AvYHJlc2V0VXNhZ2VgIGZsb3dzLiBUaWVyIGxpbWl0cyBhcmUgYnl0ZXMuXG4gKiAtIGBkYXNoYm9hcmRzYCAvIGBhbGVydFJ1bGVzYCAvIGBhbGVydERlc3RpbmF0aW9uc2AgLyBgaWRwQ29uZmlnc2Ag4oCUXG4gKiAgIHJlc291cmNlLWNvdW50IHF1b3RhcyBhZGRlZCB0byBjbG9zZSBwZXItb3JnIERvUyBzdXJmYWNlcyBpbiB0aGVcbiAqICAgdXNlci1lZGl0YWJsZSBmZWF0dXJlIHRhYmxlcy4gV2l0aG91dCB0aGVzZSBjYXBzIGEgc2luZ2xlIG9yZyBjb3VsZFxuICogICBzcGFtIHRob3VzYW5kcyBvZiBkYXNoYm9hcmRzIC8gcnVsZXMgYW5kIGJsb2F0IHRoZSBzaGFyZWQgUG9zdGdyZXMgL1xuICogICBNb25nbyB3b3JraW5nIHNldHMuIENvdW50ZWQgYXQgY3JlYXRlIHRpbWU7IGRlY3JlbWVudGVkIG9uIGRlbGV0ZS5cbiAqL1xuLy8gTk9URTogYHNlYXRzYCBpcyBpbnRlbnRpb25hbGx5IE5PVCBoZXJlLiBJdCdzIGEgdGllciBsaW1pdCAoUXVvdGFUaWVyTGltaXRzKVxuLy8gZW5mb3JjZWQgYnkgY29tcGFyaW5nIHRoZSBvcmcncyBMSVZFIG1lbWJlciBjb3VudCBhdCBpbnZpdGUgdGltZSDigJQgbm90IGFuXG4vLyBpbmNyZW1lbnRpbmcgcGVyLXBlcmlvZCBjb3VudGVyIGxpa2UgdGhlIGNvbnN1bWFibGUgcXVvdGFzIGJlbG93LlxuZXhwb3J0IHR5cGUgUXVvdGFUeXBlID1cbiAgfCAncGx1Z2lucycgfCAncGlwZWxpbmVzJyB8ICdhcGlDYWxscycgfCAnYWlDYWxscycgfCAnc3RvcmFnZUJ5dGVzJ1xuICB8ICdkYXNoYm9hcmRzJyB8ICdhbGVydFJ1bGVzJyB8ICdhbGVydERlc3RpbmF0aW9ucycgfCAnaWRwQ29uZmlncyc7XG5cbi8qKlxuICogVmFsaWQgcXVvdGEgdHlwZSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxJRF9RVU9UQV9UWVBFUyA9IFtcbiAgJ3BsdWdpbnMnLCAncGlwZWxpbmVzJywgJ2FwaUNhbGxzJywgJ2FpQ2FsbHMnLCAnc3RvcmFnZUJ5dGVzJyxcbiAgJ2Rhc2hib2FyZHMnLCAnYWxlcnRSdWxlcycsICdhbGVydERlc3RpbmF0aW9ucycsICdpZHBDb25maWdzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgUXVvdGFUeXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBUcnVlIGlmIHZhbHVlIGlzIGEgdmFsaWQgUXVvdGFUeXBlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGlmIChpc1ZhbGlkUXVvdGFUeXBlKHJlcS5ib2R5LnF1b3RhVHlwZSkpIHtcbiAqICAgLy8gcXVvdGFUeXBlIGlzIGd1YXJhbnRlZWQgdG8gYmUgUXVvdGFUeXBlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRRdW90YVR5cGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBRdW90YVR5cGUge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBWQUxJRF9RVU9UQV9UWVBFUy5pbmNsdWRlcyh2YWx1ZSBhcyBRdW90YVR5cGUpO1xufVxuXG4vKipcbiAqIFJlc3VsdCBmcm9tIHF1b3RhIGNoZWNrIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUNoZWNrUmVzdWx0IHtcbiAgLyoqIFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgYWxsb3dlZCAqL1xuICBhbGxvd2VkOiBib29sZWFuO1xuICAvKiogTWF4aW11bSBxdW90YSBsaW1pdCAoLTEgZm9yIHVubGltaXRlZCkgKi9cbiAgbGltaXQ6IG51bWJlcjtcbiAgLyoqIEN1cnJlbnQgdXNhZ2UgY291bnQgKi9cbiAgdXNlZDogbnVtYmVyO1xuICAvKiogUmVtYWluaW5nIHF1b3RhICgtMSBmb3IgdW5saW1pdGVkKSAqL1xuICByZW1haW5pbmc6IG51bWJlcjtcbiAgLyoqIElTTyB0aW1lc3RhbXAgd2hlbiBxdW90YSByZXNldHMgKi9cbiAgcmVzZXRBdDogc3RyaW5nO1xuICAvKiogV2hldGhlciBxdW90YSBpcyB1bmxpbWl0ZWQgKi9cbiAgdW5saW1pdGVkOiBib29sZWFuO1xuICAvKipcbiAgICogVHJ1ZSBPTkxZIHdoZW4gdGhpcyByZXN1bHQgaXMgdGhlIGZhaWwtb3BlbiBzZW50aW5lbCByZXR1cm5lZCBiZWNhdXNlIHRoZVxuICAgKiBxdW90YSBzZXJ2aWNlIHdhcyB1bnJlYWNoYWJsZSAvIHJldHVybmVkIG5vbi1vayAobm90IGEgcmVhbCBxdW90YSByZWFkaW5nKS5cbiAgICogTGV0cyBmYWlsLWNsb3NlZCBjYWxsZXJzIChlLmcuIHRoZSByZWdpc3RyeSBzdG9yYWdlIHB1c2gtZ2F0ZSkgZGlzdGluZ3Vpc2hcbiAgICogYW4gb3V0YWdlIGZyb20gYSBnZW51aW5lIGBsaW1pdDogLTFgICh1bmxpbWl0ZWQpIG9yZy4gQWJzZW50IG9uIHJlYWwgcmVzdWx0cy5cbiAgICovXG4gIGZhaWxPcGVuPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBRdW90YSBpbmZvcm1hdGlvbiBmb3IgZXJyb3IgcmVzcG9uc2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhSW5mbyB7XG4gIHR5cGU6IFF1b3RhVHlwZTtcbiAgbGltaXQ6IG51bWJlcjtcbiAgdXNlZDogbnVtYmVyO1xuICByZW1haW5pbmc6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBBUEkgc3VjY2VzcyByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlTdWNjZXNzUmVzcG9uc2U8VCA9IHVua25vd24+IHtcbiAgc3VjY2VzczogdHJ1ZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBkYXRhPzogVDtcbiAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdGFuZGFyZCBBUEkgZXJyb3IgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRXJyb3JSZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGZhbHNlO1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgY29kZT86IHN0cmluZztcbiAgZGV0YWlscz86IHVua25vd247XG4gIHF1b3RhPzogUXVvdGFJbmZvO1xufVxuXG4vKipcbiAqIENvbWJpbmVkIEFQSSByZXNwb25zZSB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBBcGlSZXNwb25zZTxUID0gdW5rbm93bj4gPSBBcGlTdWNjZXNzUmVzcG9uc2U8VD4gfCBBcGlFcnJvclJlc3BvbnNlO1xuXG4vKipcbiAqIEpXVCBwYXlsb2FkIGZyb20gYWNjZXNzIHRva2Vucy5cbiAqXG4gKiBVc2VycyBjYW4gYmVsb25nIHRvIG11bHRpcGxlIG9yZ2FuaXphdGlvbnMuIFRoZSB0b2tlbiBpcyBzY29wZWQgdG8gb25lXG4gKiBhY3RpdmUgb3JnYW5pemF0aW9uIGF0IGEgdGltZS4gVGhlIGByb2xlYCBmaWVsZCBpcyB0aGUgdXNlcidzIHBlci1vcmdcbiAqIHJvbGUgaW4gdGhhdCBvcmdhbml6YXRpb24gKGZyb20gdGhlIFVzZXJPcmdhbml6YXRpb24ganVuY3Rpb24gY29sbGVjdGlvbiksXG4gKiBhbmQgYGlzQWRtaW5gIGlzIGRlcml2ZWQgYXMgYHJvbGUgPT09ICdhZG1pbicgfHwgcm9sZSA9PT0gJ293bmVyJ2AuXG4gKlxuICogVXNlIGBQT1NUIC9hdXRoL3N3aXRjaC1vcmdgIHRvIGNoYW5nZSB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiwgd2hpY2hcbiAqIHJlLWlzc3VlcyB0b2tlbnMgd2l0aCB0aGUgbmV3IG9yZydzIHJvbGUgYW5kIGNvbnRleHQuXG4gKi9cbi8qKlxuICogQ29hcnNlIHBlci1vcmcgbWVtYmVyc2hpcCBsYWJlbCwgREVSSVZFRCBmcm9tIHRoZSBSb2xlcyBhIHVzZXIgaXMgYXNzaWduZWRcbiAqICh0aGUgaGlnaGVzdCBgZ3JhbnRzUm9sZWAgYW1vbmcgdGhlbTsgYG93bmVyYCBpcyBzZXQgb25seSBieSBvd25lcnNoaXBcbiAqIHRyYW5zZmVyKS4gSXQgaXMgYSBkaXNwbGF5L2F1dGhvcml0eSBsYWJlbCDigJQgZHJpdmluZyBgaXNBZG1pbmAsIG93bmVyc2hpcCxcbiAqIGFuZCBzZWF0IGFjY291bnRpbmcg4oCUIE5PVCBhIHBlcm1pc3Npb24gc291cmNlLiBFZmZlY3RpdmUgcGVybWlzc2lvbnMgY29tZVxuICogc29sZWx5IGZyb20gdGhlIHVzZXIncyBhc3NpZ25lZCBSb2xlcyAoc2VlIGByZXNvbHZlVXNlclBlcm1pc3Npb25zYCkuIE5vdCBhXG4gKiBnbG9iYWwgcm9sZS5cbiAqL1xuZXhwb3J0IHR5cGUgT3JnUm9sZSA9ICdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSnd0UGF5bG9hZCB7XG4gIC8qKiBVc2VyIElEIChzdWJqZWN0KSAqL1xuICBzdWI6IHN0cmluZztcbiAgLyoqIFVzZXJuYW1lICovXG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIC8qKiBVc2VyIGVtYWlsICovXG4gIGVtYWlsOiBzdHJpbmc7XG4gIC8qKiBQZXItb3JnIHJvbGUgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKCdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcicpLiBOb3QgYSBnbG9iYWwgcm9sZS4gKi9cbiAgcm9sZTogT3JnUm9sZTtcbiAgLyoqIERlcml2ZWQ6IHRydWUgd2hlbiByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJyBpbiB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAqL1xuICBpc0FkbWluPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlc29sdmVkIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9ucyBmb3IgdGhlIGFjdGl2ZSBvcmcvdGVhbSDigJQgdGhlIHVuaW9uIG9mXG4gICAqIHRoZSBwZXJtaXNzaW9ucyBjYXJyaWVkIGJ5IGV2ZXJ5IFJvbGUgdGhlIHVzZXIgaXMgYXNzaWduZWQgKHNlZVxuICAgKiBgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc2ApLiBBYnNlbnQgb24gbWFjaGluZS9zY29wZWQgdG9rZW5zLiBTdXBlcmFkbWlucyBhcmVcbiAgICogZ3JhbnRlZCBhbGwgcGVybWlzc2lvbnMgaW1wbGljaXRseSBhbmQgbWF5IG9taXQgdGhpcy4gRW5kcG9pbnRzIGVuZm9yY2UgdmlhXG4gICAqIGByZXF1aXJlUGVybWlzc2lvbiguLi4pYC5cbiAgICovXG4gIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xuICAvKipcbiAgICogR2xvYmFsIHN1cGVyLWFkbWluIGZsYWcgKGNyb3NzLW9yZykuIFdoZW4gYHRydWVgLCB0aGUgdXNlciBpcyB0cmVhdGVkXG4gICAqIGFzIGEgc3lzdGVtIGFkbWluaXN0cmF0b3IgcmVnYXJkbGVzcyBvZiB3aGljaCBvcmcgdGhleSdyZSBjdXJyZW50bHlcbiAgICogYWN0aW5nIHVuZGVyLiBUaGlzIGlzIHRoZSBTT0xFIHNpZ25hbCBmb3Igc3lzYWRtaW4gYXV0aG9yaXR5IOKAlCB0aGUgb2xkIHBhdGhcbiAgICogKG1lbWJlcnNoaXAgaW4gdGhlIHdlbGwta25vd24gXCJzeXN0ZW1cIiBvcmcgd2l0aCByb2xlIGFkbWluL293bmVyKSBoYXMgYmVlblxuICAgKiByZW1vdmVkIGJlY2F1c2UgaXQgY29uZmxhdGVkIFwiUGlwZWxpbmUgQnVpbGRlciBvcGVyYXRvclwiIHdpdGggXCJyZWFsIGN1c3RvbWVyXG4gICAqIHRlbmFudFwiIGluIHRoZSBkYXRhIG1vZGVsLiBHcmFudCBzeXNhZG1pbiBvbmx5IHZpYSBgaXNTdXBlckFkbWluYC5cbiAgICovXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW47XG4gIC8qKiBPcmdhbml6YXRpb24ncyBxdW90YSB0aWVyLiAqL1xuICB0aWVyPzogUXVvdGFUaWVyO1xuICAvKiogUmVzb2x2ZWQgZmVhdHVyZSBmbGFncyBmb3IgdGhpcyB1c2VyL29yZyAqL1xuICBmZWF0dXJlcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTmFycm93IGNhcGFiaWxpdHkgc2NvcGUgZm9yIG1hY2hpbmUvYXV0b21hdGlvbiB0b2tlbnMgKGUuZy5cbiAgICogYCdyZXBvcnRpbmc6aW5nZXN0J2ApLiBBYnNlbnQgb24gbm9ybWFsIGludGVyYWN0aXZlIHVzZXIgdG9rZW5zLiBFbmRwb2ludHNcbiAgICogdGhhdCBhY2NlcHQgYSBzY29wZWQgaWRlbnRpdHkgY2hlY2sgdGhpcyAoc2VlIGBoYXNTY29wZWApIGluc3RlYWQgb2Ygcm9sZTtcbiAgICogYSBzY29wZWQgdG9rZW4gaXMgbWludGVkIHdpdGggbWluaW1hbCByb2xlIGZvciBsZWFzdC1wcml2aWxlZ2UuXG4gICAqL1xuICBzY29wZT86IFRva2VuU2NvcGU7XG4gIC8qKiBBY3RpdmUgb3JnYW5pemF0aW9uIElEIChmcm9tIFVzZXJPcmdhbml6YXRpb24gbWVtYmVyc2hpcCkgKi9cbiAgb3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnYW5pemF0aW9uIG5hbWUgKi9cbiAgb3JnYW5pemF0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHkgKG9yZy10ZWFtLWhpZXJhcmNoeSBwcm9wb3NhbCwgcGhhc2UgMSkuXG4gICAqIGBwYXJlbnRPcmdhbml6YXRpb25JZGAgaXMgdGhlIGFjdGl2ZSBvcmcncyBkaXJlY3QgcGFyZW50OyBgcm9vdE9yZ2FuaXphdGlvbklkYFxuICAgKiBpcyB0aGUgdG9wIG9mIGl0cyBhbmNlc3RyeSBjaGFpbi4gQm90aCBhcmUgKipvbWl0dGVkIGZvciBmbGF0IChyb290KSBvcmdzKiog4oCUXG4gICAqIGNvbnN1bWVycyBzaG91bGQgdHJlYXQgdGhlIGVmZmVjdGl2ZSByb290IGFzIGByb290T3JnYW5pemF0aW9uSWQgPz8gb3JnYW5pemF0aW9uSWRgXG4gICAqICh1c2UgdGhlIHNoYXJlZCB7QGxpbmsgZWZmZWN0aXZlUm9vdE9yZ0lkfSBhY2Nlc3NvciByYXRoZXIgdGhhbiBjb2FsZXNjaW5nIGlubGluZSkuXG4gICAqIEN1cnJlbnRseSBldmVyeSBvcmcgaXMgZmxhdCwgc28gdGhlc2UgYXJlIGFic2VudCBvbiBhbGwgdG9rZW5zIHRvZGF5LlxuICAgKi9cbiAgcGFyZW50T3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBSb290IG9yZ2FuaXphdGlvbiBJRCBvZiB0aGUgYWN0aXZlIG9yZydzIGFuY2VzdHJ5IGNoYWluIChzZWUgYHBhcmVudE9yZ2FuaXphdGlvbklkYCkuICovXG4gIHJvb3RPcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFNldCBvbiB0b2tlbnMgaXNzdWVkIGJ5IHRoZSBzeXNhZG1pbiBpbXBlcnNvbmF0aW9uIGZsb3dcbiAgICogKGBQT1NUIC9hZG1pbi9pbXBlcnNvbmF0ZS86dXNlcklkYCkuIENhcnJpZXMgdGhlIG9yaWdpbmFsIHN5c2FkbWluJ3NcbiAgICogdXNlciBpZCBzbyBhdWRpdCBldmVudHMgc3RpbGwgYXR0cmlidXRlIGFjdGlvbnMgY29ycmVjdGx5LlxuICAgKi9cbiAgaW1wZXJzb25hdG9ySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVbmlxdWUgdG9rZW4gaWQuIE9uIGFuIGltcGVyc29uYXRpb24gdG9rZW4gaXQgaWRlbnRpZmllcyB0aGUgU0VTU0lPTiwgc28gaXRcbiAgICogY2FuIGJlIHJldm9rZWQgb24gaXRzIG93biBhY3Jvc3MgZXZlcnkgc2VydmljZSAoc2VlXG4gICAqIGBUb2tlblJldm9jYXRpb25TdG9yZS5nZXRTZXNzaW9uUmV2b2NhdGlvbmApLiBQZXJzb25hbCBBY2Nlc3MgVG9rZW5zIGNhcnJ5XG4gICAqIG9uZSB0b28sIHZhbGlkYXRlZCBhZ2FpbnN0IGEgZGlmZmVyZW50IHJlY29yZCDigJQgd2hpY2ggaXMgd2h5IGEgYGp0aWAgYWxvbmVcbiAgICogbmV2ZXIgbWFya3MgYSB0b2tlbiBhcyBpbXBlcnNvbmF0aW9uOyBgaW1wZXJzb25hdG9ySWRgIGRvZXMuXG4gICAqL1xuICBqdGk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSB0b2tlbiBpcyByZWFkLW9ubHkg4oCUIGFueSBub24tR0VUIHJlcXVlc3QgaXMgcmVqZWN0ZWRcbiAgICogdXBzdHJlYW0gYnkgdGhlIHBsYXRmb3JtJ3MgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gZ2F0ZS4gTGV0c1xuICAgKiBzeXNhZG1pbnMgXCJ2aWV3IGFzIHVzZXIgWFwiIHdpdGhvdXQgcmlza2luZyBhIGRlc3RydWN0aXZlIGFjdGlvbi5cbiAgICovXG4gIGltcGVyc29uYXRpb25SZWFkT25seT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgdXNlcidzIGB0b2tlblZlcnNpb25gIGF0IHRoZSBtb21lbnQgdGhpcyB0b2tlbiB3YXMgaXNzdWVkLiBFdmVyeVxuICAgKiBwcml2aWxlZ2UgY2hhbmdlIChkZWFjdGl2YXRlIC8gcm9sZSBvciB0aWVyIGRvd25ncmFkZSAvIG1lbWJlcnNoaXAgb3JcbiAgICogb3duZXJzaGlwIGNoYW5nZSAvIHBhc3N3b3JkIGNoYW5nZSAvIGxvZ291dC1hbGwpIGluY3JlbWVudHMgdGhlIHVzZXInc1xuICAgKiBzZXJ2ZXItc2lkZSBgdG9rZW5WZXJzaW9uYCwgc28gYSB0b2tlbiB3aG9zZSBlbWJlZGRlZCB2ZXJzaW9uIGlzIGJlaGluZCB0aGVcbiAgICogY3VycmVudCBvbmUgaGFzIGJlZW4gUkVWT0tFRC4gUGxhdGZvcm0gdmFsaWRhdGVzIHRoaXMgYWdhaW5zdCBNb25nbzsgdGhlXG4gICAqIHN0YXRlbGVzcyBzZXJ2aWNlcyB2YWxpZGF0ZSBpdCBhZ2FpbnN0IGEgUmVkaXMtcHVibGlzaGVkIGN1cnJlbnQtdmVyc2lvblxuICAgKiBzdG9yZSAoc2VlIGBzZXRUb2tlblJldm9jYXRpb25TdG9yZWApLiBBYnNlbnQgb24gbWFjaGluZS9zZXJ2aWNlIHRva2Vucy5cbiAgICovXG4gIHRva2VuVmVyc2lvbj86IG51bWJlcjtcbiAgLyoqIFRva2VuIHR5cGUgKi9cbiAgdHlwZTogJ2FjY2VzcycgfCAncmVmcmVzaCc7XG4gIC8qKiBJc3N1ZWQgYXQgdGltZXN0YW1wICovXG4gIGlhdD86IG51bWJlcjtcbiAgLyoqIEV4cGlyYXRpb24gdGltZXN0YW1wICovXG4gIGV4cD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYWNjb3VudCBib3VuZGFyeSAocm9vdCBvcmcpIGZvciBhIHRva2VuJ3MgYWN0aXZlIG9yZy5cbiAqXG4gKiBUaGUgYWNjb3VudCByb290IGlzIGByb290T3JnYW5pemF0aW9uSWQgPz8gb3JnYW5pemF0aW9uSWRgOiBhIGZsYXQgKHJvb3QpIG9yZ1xuICogb21pdHMgYHJvb3RPcmdhbml6YXRpb25JZGAsIHNvIGl0IElTIGl0cyBvd24gcm9vdDsgYSB0ZWFtIChjaGlsZCkgb3JnIGNhcnJpZXNcbiAqIHRoZSB0b3Agb2YgaXRzIGFuY2VzdHJ5IGNoYWluLiBFdmVyeSBhY2NvdW50LXNjb3BlZCByZWFkIChxdW90YS9zZWF0L2JpbGxpbmdcbiAqIHBvb2xpbmcpIG11c3QgcmVzb2x2ZSB0aHJvdWdoIHRoaXMgY29hbGVzY2UgcmF0aGVyIHRoYW4gcmVhZGluZ1xuICogYG9yZ2FuaXphdGlvbklkYCBkaXJlY3RseSDigJQgdGhlIGxhdHRlciBzaWxlbnRseSB3b3JrcyB0b2RheSAoYWxsIG9yZ3MgZmxhdClcbiAqIGJ1dCB3b3VsZCBiaW5kIHRvIHRoZSB0ZWFtIGluc3RlYWQgb2YgdGhlIGFjY291bnQgb25jZSB0ZWFtcyBleGlzdC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgZWZmZWN0aXZlIHJvb3Qgb3JnIGlkLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5laXRoZXIgZmllbGQgaXMgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0aXZlUm9vdE9yZ0lkKFxuICBwYXlsb2FkOiBQaWNrPEp3dFBheWxvYWQsICdvcmdhbml6YXRpb25JZCcgfCAncm9vdE9yZ2FuaXphdGlvbklkJz4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcGF5bG9hZC5yb290T3JnYW5pemF0aW9uSWQgPz8gcGF5bG9hZC5vcmdhbml6YXRpb25JZDtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBFeHByZXNzIFJlcXVlc3Qgd2l0aCB1c2VyIHByb3BlcnR5LlxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIG5hbWVzcGFjZSBFeHByZXNzIHtcbiAgICBpbnRlcmZhY2UgUmVxdWVzdCB7XG4gICAgICB1c2VyPzogSnd0UGF5bG9hZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIEhUVFAgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBob3N0bmFtZSAqL1xuICBob3N0OiBzdHJpbmc7XG4gIC8qKiBTZXJ2aWNlIHBvcnQgKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhlYWx0aCBjaGVjayByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiAnaGVhbHRoeScgfCAndW5oZWFsdGh5JztcbiAgc2VydmljZTogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgdXB0aW1lOiBudW1iZXI7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCcgfCAndW5rbm93bic+O1xufVxuIl19
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBMkJ0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUEwQixDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQWlEakcsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBNkIsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDaEcsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUF3QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQTBCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQThCeEc7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYztJQUM3RCxZQUFZLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFlBQVk7Q0FDckQsQ0FBQztBQUVYOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFrQixDQUFDLENBQUM7QUFDckYsQ0FBQztBQWtORDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsT0FBa0U7SUFFbEUsT0FBTyxPQUFPLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJy4vcGVybWlzc2lvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBRdW90YVRpZXIgfSBmcm9tICcuL3F1b3RhLXRpZXJzLmpzJztcblxuLyoqXG4gKiBDYXBhYmlsaXR5IHNjb3BlIGNhdGFsb2cgZm9yIG1hY2hpbmUvYXV0b21hdGlvbiB0b2tlbnMuIEEgc2NvcGVkIHRva2VuIGNhcnJpZXNcbiAqIGV4YWN0bHkgb25lIG9mIHRoZXNlIGluc3RlYWQgb2Ygcm9sZS1iYXNlZCBwZXJtaXNzaW9uczsgZW5kcG9pbnRzIHRoYXQgYWNjZXB0IGFcbiAqIHNjb3BlZCBpZGVudGl0eSBjaGVjayBpdCB2aWEgYGhhc1Njb3BlYC4gS2VwdCBhIGNsb3NlZCB1bmlvbiAobWlycm9yaW5nXG4gKiB7QGxpbmsgUGVybWlzc2lvbn0pIHNvIGEgdHlwbyBvbiBlaXRoZXIgdGhlIG1pbnQgb3IgdGhlIGNoZWNrIHNpZGUgaXMgYSBjb21waWxlXG4gKiBlcnJvci4gQWRkIGEgdmFsdWUgaGVyZSB3aGVuIGludHJvZHVjaW5nIGEgbmV3IHNjb3BlZC10b2tlbiBzdXJmYWNlLlxuICpcbiAqIC0gYHJlcG9ydGluZzppbmdlc3RgIOKAlCB0aGUgQVdTIGV2ZW50LWluZ2VzdGlvbiBMYW1iZGEncyB3cml0ZXMgKGAvcmVwb3J0cy9ldmVudHNgLFxuICogICBgL3JlcG9ydHMvaW5nZXN0LWhlYWx0aGApIGFuZCB0aGUgaW5jaWRlbnQgd2ViaG9vay5cbiAqIC0gYHJlZ2lzdHJ5OnB1c2hgICAgIOKAlCBgZG9ja2VyIHB1c2hgIGludG8gdGhlIG93bmluZyBvcmcncyBvd24gbmFtZXNwYWNlIHZpYVxuICogICBpbWFnZS1yZWdpc3RyeSdzIGAvdG9rZW5gIGVuZHBvaW50LiBHcmFudHMgdGhlIHJhdy1pbWFnZSB3cml0ZSB0aGF0XG4gKiAgIGBwbHVnaW5zOndyaXRlYCBncmFudHMgYSBwZXJzb24sIGFuZCBub3RoaW5nIGVsc2U6IGEgc2NvcGVkIHRva2VuIGNhcnJpZXMgbm9cbiAqICAgcGVybWlzc2lvbnMsIHNvIGl0IGNhbiBuZWl0aGVyIHJlYWQgdGhlIEFQSSBub3IgcHVzaCBvdXRzaWRlIGl0cyBvcmcuXG4gKiAtIGBzY2ltYCAgICAgICAgICAgICDigJQgYW4gaWRlbnRpdHkgcHJvdmlkZXIncyBTQ0lNIDIuMCBjbGllbnQgKDNiKSBkcml2aW5nXG4gKiAgIGAvc2NpbS92Mi9Vc2Vyc2AgYW5kIGAvc2NpbS92Mi9Hcm91cHNgIGZvciB0aGUga2V5J3MgT1dOIG9yZy4gSXQgcHJvdmlzaW9uc1xuICogICBhbmQgZGVhY3RpdmF0ZXMgbWVtYmVyc2hpcHMgYW5kIG1vdmVzIHBlb3BsZSBiZXR3ZWVuIGRpcmVjdG9yeSBncm91cHM7IGl0XG4gKiAgIGNhbiBuZXZlciByZWFkIG9yIHdyaXRlIGFueXRoaW5nIGVsc2UsIGFuZCDigJQgYmVjYXVzZSBhIHNjb3BlZCB0b2tlbiBjYXJyaWVzXG4gKiAgIG5vIHBlcm1pc3Npb25zIOKAlCBpdCBjYW5ub3QgYXV0aG9yIHRoZSBncm91cCDihpIgUm9sZSBydWxlcyBpdHMgc3luY3MgcmVzb2x2ZVxuICogICB0aHJvdWdoLiBPbmx5IGEgc2VydmljZS1hY2NvdW50IGtleSBtYXkgY2FycnkgaXQ7IGEgcGVyc29uJ3MgdG9rZW4gbmV2ZXIgZG9lcy5cbiAqL1xuZXhwb3J0IHR5cGUgVG9rZW5TY29wZSA9ICdyZXBvcnRpbmc6aW5nZXN0JyB8ICdyZWdpc3RyeTpwdXNoJyB8ICdzY2ltJztcblxuLyoqXG4gKiBSdW50aW1lIGNhdGFsb2cgb2Yge0BsaW5rIFRva2VuU2NvcGV9IChhIHVuaW9uIGlzIGVyYXNlZCBhdCBydW50aW1lKS4gVGhpcyBpc1xuICogdGhlIE9ORSBhbGxvd2xpc3QgZXZlcnkgbWludCBwYXRoIHZhbGlkYXRlcyBhZ2FpbnN0IOKAlCBwbGF0Zm9ybSdzIGtleS90b2tlblxuICogaXNzdWUgcm91dGVzIGluY2x1ZGVkIOKAlCBzbyBhIG5ldyBzY29wZSBpcyBhZGRlZCBpbiBleGFjdGx5IG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRPS0VOX1NDT1BFUzogcmVhZG9ubHkgVG9rZW5TY29wZVtdID0gWydyZXBvcnRpbmc6aW5nZXN0JywgJ3JlZ2lzdHJ5OnB1c2gnLCAnc2NpbSddO1xuXG4vKipcbiAqIFdoYXQga2luZCBvZiBwcmluY2lwYWwgYSB0b2tlbiBzcGVha3MgZm9yLiBBdXRoIGRlY2lzaW9ucyBicmFuY2ggb24gdGhpcyBjbGFpbVxuICog4oCUIG5ldmVyIG9uIHRoZSBzaGFwZSBvZiBgc3ViYCBvciBvbiB3aGljaCBvcHRpb25hbCBjbGFpbXMgaGFwcGVuIHRvIGJlIHByZXNlbnQuXG4gKlxuICogLSBgdXNlcmAgICAgICAgICAgICDigJQgYSBwZXJzb24gKHNlc3Npb24sIG1hY2hpbmUgc2Vzc2lvbiwgUEFUIG9yIGltcGVyc29uYXRpb24pLlxuICogLSBgc2VydmljZV9hY2NvdW50YCDigJQgYSBub24taHVtYW4gYWNjb3VudCBvd25lZCBieSBPTkUgb3JnLCBob2xkaW5nIG9yZyBSb2xlc1xuICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBhdXRoZW50aWNhdGluZyB3aXRoIGEgYHBiX3NhX+KApmAga2V5IGV4Y2hhbmdlZCBhdFxuICogICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLiBOZXZlciBzYXRpc2ZpZXMgYW4gYXNzdXJhbmNlL3N0ZXAtdXAgZ2F0ZS5cbiAqIC0gYHNlcnZpY2VgICAgICAgICAg4oCUIGFuIGludGVybmFsIFBpcGVsaW5lIEJ1aWxkZXIgc2VydmljZSAoe0BsaW5rIHNpZ25TZXJ2aWNlVG9rZW59KS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJpbmNpcGFsVHlwZSA9ICd1c2VyJyB8ICdzZXJ2aWNlX2FjY291bnQnIHwgJ3NlcnZpY2UnO1xuXG4vKipcbiAqIEhvdyBhIHRva2VuIGlzIHVzZWQuIGBhY2Nlc3NgIGlzIGEgc2Vzc2lvbi1zdHlsZSBhY2Nlc3MgdG9rZW4gKGludGVyYWN0aXZlLFxuICogbWFjaGluZS1zZXNzaW9uIG9yIHNlcnZpY2UpOyBgYXBpX2tleWAgaXMgYSBzdGFuZGFsb25lIGNyZWRlbnRpYWwgdHJhY2tlZCBieVxuICogaXRzIG93biByZWNvcmQg4oCUIGEgUGVyc29uYWwgQWNjZXNzIFRva2VuIG9yIGEgc2VydmljZS1hY2NvdW50IGtleSwgbmFtZWQgYnlcbiAqIGBqdGlgLlxuICovXG5leHBvcnQgdHlwZSBUb2tlblVzZSA9ICdhY2Nlc3MnIHwgJ2FwaV9rZXknO1xuXG4vKipcbiAqIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKGBhbXJgLCBSRkMgODE3NiBzdHlsZSkgdGhhdCBlc3RhYmxpc2hlZCBhIHVzZXInc1xuICogc2Vzc2lvbi4gYHB3ZGAgcGFzc3dvcmQgc2lnbi1pbjsgYG9hdXRoYCBzb2NpYWwgc2lnbi1pbiAoR29vZ2xlLCBHaXRIdWIg4oCmKTtcbiAqIGBzc29gIHBlci1vcmcgT0lEQyBzaW5nbGUgc2lnbi1vbjsgYHdlYmF1dGhuYCBhIHBhc3NrZXkgKFdlYkF1dGhuIGFzc2VydGlvblxuICogd2l0aCB1c2VyIHZlcmlmaWNhdGlvbik7IGBzdGVwdXBgIGEgc3RlcC11cCByZS12ZXJpZmljYXRpb24gdG9rZW47IGBtZmFgIGFcbiAqIHNlY29uZCBmYWN0b3Igd2FzIHByZXNlbnRlZCBhcyB3ZWxsIOKAlCB0b2RheSBhbiBhdXRoZW50aWNhdG9yLWFwcCBjb2RlIChUT1RQKVxuICogb3Igb25lIG9mIGl0cyByZWNvdmVyeSBjb2Rlcywgc28gaXQgYXBwZWFycyBBTE9OR1NJREUgdGhlIG1ldGhvZCB0aGF0XG4gKiBpZGVudGlmaWVkIHRoZSB1c2VyIChgWydwd2QnLCAnbWZhJ11gKSwgbmV2ZXIgb24gaXRzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0aE1ldGhvZCA9ICdwd2QnIHwgJ29hdXRoJyB8ICdzc28nIHwgJ3dlYmF1dGhuJyB8ICdzdGVwdXAnIHwgJ21mYSc7XG5cbi8qKlxuICogQXV0aGVudGljYXRvciBhc3N1cmFuY2UgbGV2ZWwgb2YgdGhlIHNlc3Npb24gYSB0b2tlbiBzcGVha3MgZm9yICgjOCkuXG4gKlxuICogLSBgMWAg4oCUIG9uZSBmYWN0b3I6IGEgcGFzc3dvcmQsIGEgc29jaWFsIHNpZ24taW4sIG9yIFNTTyB0aHJvdWdoIGFuIElkUCB0aGVcbiAqICAgb3JnIGhhcyBOT1QgbWFya2VkIGFzIGVuZm9yY2luZyBNRkEuXG4gKiAtIGAyYCDigJQgTUZBLWdyYWRlOiBhIHBhc3NrZXkgYXNzZXJ0ZWQgd2l0aCB1c2VyIHZlcmlmaWNhdGlvbiwgYSBwYXNzd29yZCBwbHVzXG4gKiAgIGFuIGF1dGhlbnRpY2F0b3ItYXBwIGNvZGUsIG9yIFNTTyB0aHJvdWdoIGFuIElkUCB0aGUgb3JnIEhBUyBtYXJrZWQgYXNcbiAqICAgZW5mb3JjaW5nIE1GQSAocHJvdmlkZXJzIGRvbid0IHNlbmQgYGFtcmAgcmVsaWFibHksIHNvIHRoZSBvcmcncyBvd25cbiAqICAgc3RhdGVtZW50IGFib3V0IGl0cyBJZFAgaXMgdGhlIHNpZ25hbCkuXG4gKlxuICogRml4ZWQgd2hlbiB0aGUgc2Vzc2lvbiBpcyBvcGVuZWQgYW5kIHN0b3JlZCBvbiBpdHMgcmVmcmVzaC1zZXNzaW9uIHNsb3QsIHNvXG4gKiByZWZyZXNoIC8gcmVuZXdhbCAvIHN3aXRjaC1vcmcgY29weSBpdCB2ZXJiYXRpbSBhbmQgY2FuIG5ldmVyIFJBSVNFIGl0IOKAlFxuICogZWFybmluZyBhYWwgMiBhbHdheXMgbWVhbnMgYXV0aGVudGljYXRpbmcgYWdhaW4gd2l0aCBhIHNlY29uZCBmYWN0b3IuXG4gKi9cbmV4cG9ydCB0eXBlIEFzc3VyYW5jZUxldmVsID0gMSB8IDI7XG5cbi8qKiBSdW50aW1lIGNhdGFsb2dzIGZvciB0aGUgY2xhaW0gdW5pb25zIGFib3ZlIChhIHVuaW9uIGlzIGVyYXNlZCBhdCBydW50aW1lKS4gKi9cbmV4cG9ydCBjb25zdCBQUklOQ0lQQUxfVFlQRVM6IHJlYWRvbmx5IFByaW5jaXBhbFR5cGVbXSA9IFsndXNlcicsICdzZXJ2aWNlX2FjY291bnQnLCAnc2VydmljZSddO1xuZXhwb3J0IGNvbnN0IFRPS0VOX1VTRVM6IHJlYWRvbmx5IFRva2VuVXNlW10gPSBbJ2FjY2VzcycsICdhcGlfa2V5J107XG5leHBvcnQgY29uc3QgQVVUSF9NRVRIT0RTOiByZWFkb25seSBBdXRoTWV0aG9kW10gPSBbJ3B3ZCcsICdvYXV0aCcsICdzc28nLCAnd2ViYXV0aG4nLCAnc3RlcHVwJywgJ21mYSddO1xuXG4vKipcbiAqIFF1b3RhIHR5cGUgaWRlbnRpZmllcnMuXG4gKlxuICogLSBgcGx1Z2luc2AgLyBgcGlwZWxpbmVzYCDigJQgY291bnQgb2YgY3JlYXRlZCBlbnRpdGllc1xuICogLSBgYXBpQ2FsbHNgIOKAlCBnZW5lcmljIEFQSSBjYWxsIGNvdW50IChyZWFkLWhlYXZ5IHBhdGhzKVxuICogLSBgYWlDYWxsc2Ag4oCUIEFJIHByb3ZpZGVyIGludm9jYXRpb25zIChjb3VudGVkIHNlcGFyYXRlbHkgYmVjYXVzZSBlYWNoIGNhbGxcbiAqICAgaGFzIGV4dGVybmFsIGRvbGxhciBjb3N0OyBzaXplZCBzbWFsbGVyIHRoYW4gYXBpQ2FsbHMgcGVyIHRpZXIpXG4gKiAtIGBzdG9yYWdlQnl0ZXNgIOKAlCByZWdpc3RyeSBzdG9yYWdlIGJ1ZGdldCBwZXIgb3JnLiBVbmxpa2UgdGhlIG90aGVyc1xuICogICAod2hpY2ggY291bnQgZGlzY3JldGUgZXZlbnRzKSwgdGhpcyBpcyBhIG1lYXN1cmVkIHRvdGFsIHJlY29tcHV0ZWRcbiAqICAgb24gZGVtYW5kLiBJbmNyZW1lbnRlZCBieSB0aGUgaW1hZ2UtcmVnaXN0cnkncyBwdXNoLWdhdGUgYmVmb3JlXG4gKiAgIGlzc3VpbmcgYSB0b2tlbiB3aG9zZSBzY29wZSBpbmNsdWRlcyBgcHVzaGA7IHRoZSBHQyBzY2hlZHVsZXJcbiAqICAgZXZlbnR1YWxseSBmcmVlcyB0aGUgYnl0ZXMsIHRoZW4gdGhlIG5leHQgcHVzaC1nYXRlIGNoZWNrIHJlYWRzXG4gKiAgIHRoZSBsb3dlciB2YWx1ZS4gTk9UIGEgY291bnRlci1zdHlsZSBxdW90YSBpbiB0aGUgc2Vuc2Ugb2ZcbiAqICAgYGluY3JlbWVudFVzYWdlYCDigJQgdGhlIHJlZ2lzdHJ5IHB1c2hlcyB0aGUgbWVhc3VyZWQgdG90YWwgdmlhXG4gKiAgIGB1cGRhdGVMaW1pdHNgL2ByZXNldFVzYWdlYCBmbG93cy4gVGllciBsaW1pdHMgYXJlIGJ5dGVzLlxuICogLSBgZGFzaGJvYXJkc2AgLyBgYWxlcnRSdWxlc2AgLyBgYWxlcnREZXN0aW5hdGlvbnNgIC8gYGlkcENvbmZpZ3NgIOKAlFxuICogICByZXNvdXJjZS1jb3VudCBxdW90YXMgYWRkZWQgdG8gY2xvc2UgcGVyLW9yZyBEb1Mgc3VyZmFjZXMgaW4gdGhlXG4gKiAgIHVzZXItZWRpdGFibGUgZmVhdHVyZSB0YWJsZXMuIFdpdGhvdXQgdGhlc2UgY2FwcyBhIHNpbmdsZSBvcmcgY291bGRcbiAqICAgc3BhbSB0aG91c2FuZHMgb2YgZGFzaGJvYXJkcyAvIHJ1bGVzIGFuZCBibG9hdCB0aGUgc2hhcmVkIFBvc3RncmVzIC9cbiAqICAgTW9uZ28gd29ya2luZyBzZXRzLiBDb3VudGVkIGF0IGNyZWF0ZSB0aW1lOyBkZWNyZW1lbnRlZCBvbiBkZWxldGUuXG4gKi9cbi8vIE5PVEU6IGBzZWF0c2AgaXMgaW50ZW50aW9uYWxseSBOT1QgaGVyZS4gSXQncyBhIHRpZXIgbGltaXQgKFF1b3RhVGllckxpbWl0cylcbi8vIGVuZm9yY2VkIGJ5IGNvbXBhcmluZyB0aGUgb3JnJ3MgTElWRSBtZW1iZXIgY291bnQgYXQgaW52aXRlIHRpbWUg4oCUIG5vdCBhblxuLy8gaW5jcmVtZW50aW5nIHBlci1wZXJpb2QgY291bnRlciBsaWtlIHRoZSBjb25zdW1hYmxlIHF1b3RhcyBiZWxvdy5cbmV4cG9ydCB0eXBlIFF1b3RhVHlwZSA9XG4gIHwgJ3BsdWdpbnMnIHwgJ3BpcGVsaW5lcycgfCAnYXBpQ2FsbHMnIHwgJ2FpQ2FsbHMnIHwgJ3N0b3JhZ2VCeXRlcydcbiAgfCAnZGFzaGJvYXJkcycgfCAnYWxlcnRSdWxlcycgfCAnYWxlcnREZXN0aW5hdGlvbnMnIHwgJ2lkcENvbmZpZ3MnO1xuXG4vKipcbiAqIFZhbGlkIHF1b3RhIHR5cGUgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgVkFMSURfUVVPVEFfVFlQRVMgPSBbXG4gICdwbHVnaW5zJywgJ3BpcGVsaW5lcycsICdhcGlDYWxscycsICdhaUNhbGxzJywgJ3N0b3JhZ2VCeXRlcycsXG4gICdkYXNoYm9hcmRzJywgJ2FsZXJ0UnVsZXMnLCAnYWxlcnREZXN0aW5hdGlvbnMnLCAnaWRwQ29uZmlncycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNWYWxpZFF1b3RhVHlwZShyZXEuYm9keS5xdW90YVR5cGUpKSB7XG4gKiAgIC8vIHF1b3RhVHlwZSBpcyBndWFyYW50ZWVkIHRvIGJlIFF1b3RhVHlwZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUXVvdGFUeXBlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgVkFMSURfUVVPVEFfVFlQRVMuaW5jbHVkZXModmFsdWUgYXMgUXVvdGFUeXBlKTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgZnJvbSBxdW90YSBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFDaGVja1Jlc3VsdCB7XG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGFsbG93ZWQgKi9cbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgLyoqIE1heGltdW0gcXVvdGEgbGltaXQgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIGxpbWl0OiBudW1iZXI7XG4gIC8qKiBDdXJyZW50IHVzYWdlIGNvdW50ICovXG4gIHVzZWQ6IG51bWJlcjtcbiAgLyoqIFJlbWFpbmluZyBxdW90YSAoLTEgZm9yIHVubGltaXRlZCkgKi9cbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIC8qKiBJU08gdGltZXN0YW1wIHdoZW4gcXVvdGEgcmVzZXRzICovXG4gIHJlc2V0QXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgcXVvdGEgaXMgdW5saW1pdGVkICovXG4gIHVubGltaXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgT05MWSB3aGVuIHRoaXMgcmVzdWx0IGlzIHRoZSBmYWlsLW9wZW4gc2VudGluZWwgcmV0dXJuZWQgYmVjYXVzZSB0aGVcbiAgICogcXVvdGEgc2VydmljZSB3YXMgdW5yZWFjaGFibGUgLyByZXR1cm5lZCBub24tb2sgKG5vdCBhIHJlYWwgcXVvdGEgcmVhZGluZykuXG4gICAqIExldHMgZmFpbC1jbG9zZWQgY2FsbGVycyAoZS5nLiB0aGUgcmVnaXN0cnkgc3RvcmFnZSBwdXNoLWdhdGUpIGRpc3Rpbmd1aXNoXG4gICAqIGFuIG91dGFnZSBmcm9tIGEgZ2VudWluZSBgbGltaXQ6IC0xYCAodW5saW1pdGVkKSBvcmcuIEFic2VudCBvbiByZWFsIHJlc3VsdHMuXG4gICAqL1xuICBmYWlsT3Blbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUXVvdGEgaW5mb3JtYXRpb24gZm9yIGVycm9yIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUluZm8ge1xuICB0eXBlOiBRdW90YVR5cGU7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHVzZWQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIHN1Y2Nlc3MgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIHN1Y2Nlc3M6IHRydWU7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgZGF0YT86IFQ7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIGVycm9yIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBmYWxzZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiB1bmtub3duO1xuICBxdW90YT86IFF1b3RhSW5mbztcbn1cblxuLyoqXG4gKiBDb21iaW5lZCBBUEkgcmVzcG9uc2UgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2U8VCA9IHVua25vd24+ID0gQXBpU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgQXBpRXJyb3JSZXNwb25zZTtcblxuLyoqXG4gKiBKV1QgcGF5bG9hZCBmcm9tIGFjY2VzcyB0b2tlbnMuXG4gKlxuICogVXNlcnMgY2FuIGJlbG9uZyB0byBtdWx0aXBsZSBvcmdhbml6YXRpb25zLiBUaGUgdG9rZW4gaXMgc2NvcGVkIHRvIG9uZVxuICogYWN0aXZlIG9yZ2FuaXphdGlvbiBhdCBhIHRpbWUuIFRoZSBgcm9sZWAgZmllbGQgaXMgdGhlIHVzZXIncyBwZXItb3JnXG4gKiByb2xlIGluIHRoYXQgb3JnYW5pemF0aW9uIChmcm9tIHRoZSBVc2VyT3JnYW5pemF0aW9uIGp1bmN0aW9uIGNvbGxlY3Rpb24pLFxuICogYW5kIGBpc0FkbWluYCBpcyBkZXJpdmVkIGFzIGByb2xlID09PSAnYWRtaW4nIHx8IHJvbGUgPT09ICdvd25lcidgLlxuICpcbiAqIFVzZSBgUE9TVCAvYXV0aC9zd2l0Y2gtb3JnYCB0byBjaGFuZ2UgdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24sIHdoaWNoXG4gKiByZS1pc3N1ZXMgdG9rZW5zIHdpdGggdGhlIG5ldyBvcmcncyByb2xlIGFuZCBjb250ZXh0LlxuICovXG4vKipcbiAqIENvYXJzZSBwZXItb3JnIG1lbWJlcnNoaXAgbGFiZWwsIERFUklWRUQgZnJvbSB0aGUgUm9sZXMgYSB1c2VyIGlzIGFzc2lnbmVkXG4gKiAodGhlIGhpZ2hlc3QgYGdyYW50c1JvbGVgIGFtb25nIHRoZW07IGBvd25lcmAgaXMgc2V0IG9ubHkgYnkgb3duZXJzaGlwXG4gKiB0cmFuc2ZlcikuIEl0IGlzIGEgZGlzcGxheS9hdXRob3JpdHkgbGFiZWwg4oCUIGRyaXZpbmcgYGlzQWRtaW5gLCBvd25lcnNoaXAsXG4gKiBhbmQgc2VhdCBhY2NvdW50aW5nIOKAlCBOT1QgYSBwZXJtaXNzaW9uIHNvdXJjZS4gRWZmZWN0aXZlIHBlcm1pc3Npb25zIGNvbWVcbiAqIHNvbGVseSBmcm9tIHRoZSB1c2VyJ3MgYXNzaWduZWQgUm9sZXMgKHNlZSBgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc2ApLiBOb3QgYVxuICogZ2xvYmFsIHJvbGUuXG4gKi9cbmV4cG9ydCB0eXBlIE9yZ1JvbGUgPSAnb3duZXInIHwgJ2FkbWluJyB8ICdtZW1iZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp3dFBheWxvYWQge1xuICAvKiogVXNlciBJRCAoc3ViamVjdCkgKi9cbiAgc3ViOiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSAqL1xuICB1c2VybmFtZTogc3RyaW5nO1xuICAvKiogVXNlciBlbWFpbCAqL1xuICBlbWFpbDogc3RyaW5nO1xuICAvKiogV2hpY2gga2luZCBvZiBwcmluY2lwYWwgdGhpcyB0b2tlbiBzcGVha3MgZm9yIChzZWUge0BsaW5rIFByaW5jaXBhbFR5cGV9KS4gKi9cbiAgcHJpbmNpcGFsVHlwZTogUHJpbmNpcGFsVHlwZTtcbiAgLyoqIEhvdyB0aGUgdG9rZW4gaXMgdXNlZCAoc2VlIHtAbGluayBUb2tlblVzZX0pOyBQQVRzIGFyZSBgYXBpX2tleWAuICovXG4gIHRva2VuX3VzZTogVG9rZW5Vc2U7XG4gIC8qKlxuICAgKiBNZXRob2RzIHRoYXQgYXV0aGVudGljYXRlZCB0aGUgc2Vzc2lvbiAodXNlciBwcmluY2lwYWxzKS4gS2VwdCBvbiB0aGVcbiAgICogcmVmcmVzaC1zZXNzaW9uIHNsb3QsIHNvIHJlZnJlc2ggLyByZW5ldyAvIHN3aXRjaC1vcmcgY2FycnkgaXQgdW5jaGFuZ2VkLlxuICAgKiBBYnNlbnQgb24gc2VydmljZSB0b2tlbnMuXG4gICAqL1xuICBhbXI/OiBBdXRoTWV0aG9kW107XG4gIC8qKiBBc3N1cmFuY2UgbGV2ZWwgKHVzZXIgcHJpbmNpcGFscykuIE5ldmVyIHJhaXNlZCBieSByZWZyZXNoIC8gcmVuZXcgLyBzd2l0Y2gtb3JnLiAqL1xuICBhYWw/OiBBc3N1cmFuY2VMZXZlbDtcbiAgLyoqIEVwb2NoIHNlY29uZHMgb2YgdGhlIHNpZ24taW4gdGhhdCBlc3RhYmxpc2hlZCB0aGUgc2Vzc2lvbiAodXNlciBwcmluY2lwYWxzKS5cbiAgICogIE5ldmVyIHJlc2V0IGJ5IHJlZnJlc2ggLyByZW5ldyAvIHN3aXRjaC1vcmcuICovXG4gIGF1dGhfdGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBhY3RpdmUgb3JnIFJFUVVJUkVTIE1GQSBhbmQgaXRzIGdyYWNlIHBlcmlvZCBoYXMgcGFzc2VkICgjOCkuXG4gICAqXG4gICAqIENhcnJpZWQgYXMgYSBjbGFpbSBzbyBubyBzZXJ2aWNlIGhhcyB0byBsb29rIHRoZSBwb2xpY3kgdXA6IHRoZSBvcmcgcG9saWN5XG4gICAqIGlzIGVuZm9yY2VkIHdoZXJlIHRoZSB0b2tlbiBpcyBJU1NVRUQgKGEgc2Vzc2lvbiBzY29wZWQgdG8gc3VjaCBhbiBvcmcgZ2V0c1xuICAgKiBgYWFsOiAyYCBvciBpcyByZWZ1c2VkKSwgYW5kIHRoaXMgY2xhaW0gaXMgdGhlIHJlY29yZCBvZiB0aGF0IGRlY2lzaW9uLCBmb3JcbiAgICogVUkgY29weSBhbmQgYXVkaXQgcmF0aGVyIHRoYW4gZm9yIGEgc2Vjb25kIGVuZm9yY2VtZW50IHBvaW50LlxuICAgKi9cbiAgbWZhUmVxdWlyZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQk9PVFNUUkFQLUFETUlOIEVYQ0VQVElPTiAoIzgsIHJldmlzaW9uIDQpLiBTZXQgb25seSBvbiBhIHNlc3Npb24gb3BlbmVkIGJ5XG4gICAqIHRoZSBpbnN0YWxsJ3MgYm9vdHN0cmFwIGFkbWluIChgQk9PVFNUUkFQX1NVUEVSQURNSU5fRU1BSUxTYCwgc3lzdGVtIG9yZylcbiAgICogd2hpbGUgdGhleSBzdGlsbCBoYXZlIG5vIGVucm9sbGVkIGZhY3Rvci4gU3VjaCBhIHNlc3Npb24gaXMgYGFhbDogMWAgYW5kIG1heVxuICAgKiByZWFjaCBPTkxZIGVucm9sbWVudCwgc2lnbi1vdXQgYW5kIHRoZSByb3V0ZXMgYGluaXQtcGxhdGZvcm0uc2hgIGNhbGxzO1xuICAgKiBldmVyeSBvdGhlciBzZXJ2aWNlIHJlZnVzZXMgaXQgb3V0cmlnaHQgKHNlZSBgcmVxdWlyZUF1dGhgKS4gVGhlIGV4Y2VwdGlvblxuICAgKiBjbG9zZXMgcGVybWFuZW50bHkgYXQgdGhlIGZpcnN0IGVucm9sbWVudCBhbmQgbmV2ZXIgcmVvcGVucy5cbiAgICovXG4gIG1mYUVucm9sbG1lbnRQZW5kaW5nPzogYm9vbGVhbjtcbiAgLyoqIFBlci1vcmcgcm9sZSBpbiB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAoJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJykuIE5vdCBhIGdsb2JhbCByb2xlLiAqL1xuICByb2xlOiBPcmdSb2xlO1xuICAvKiogRGVyaXZlZDogdHJ1ZSB3aGVuIHJvbGUgaXMgJ2FkbWluJyBvciAnb3duZXInIGluIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uICovXG4gIGlzQWRtaW4/OiBib29sZWFuO1xuICAvKipcbiAgICogUmVzb2x2ZWQgZmluZS1ncmFpbmVkIHBlcm1pc3Npb25zIGZvciB0aGUgYWN0aXZlIG9yZy90ZWFtIOKAlCB0aGUgdW5pb24gb2ZcbiAgICogdGhlIHBlcm1pc3Npb25zIGNhcnJpZWQgYnkgZXZlcnkgUm9sZSB0aGUgdXNlciBpcyBhc3NpZ25lZCAoc2VlXG4gICAqIGByZXNvbHZlVXNlclBlcm1pc3Npb25zYCkuIEFic2VudCBvbiBtYWNoaW5lL3Njb3BlZCB0b2tlbnMuIFN1cGVyYWRtaW5zIGFyZVxuICAgKiBncmFudGVkIGFsbCBwZXJtaXNzaW9ucyBpbXBsaWNpdGx5IGFuZCBtYXkgb21pdCB0aGlzLiBFbmRwb2ludHMgZW5mb3JjZSB2aWFcbiAgICogYHJlcXVpcmVQZXJtaXNzaW9uKC4uLilgLlxuICAgKi9cbiAgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW107XG4gIC8qKlxuICAgKiBHbG9iYWwgc3VwZXItYWRtaW4gZmxhZyAoY3Jvc3Mtb3JnKS4gV2hlbiBgdHJ1ZWAsIHRoZSB1c2VyIGlzIHRyZWF0ZWRcbiAgICogYXMgYSBzeXN0ZW0gYWRtaW5pc3RyYXRvciByZWdhcmRsZXNzIG9mIHdoaWNoIG9yZyB0aGV5J3JlIGN1cnJlbnRseVxuICAgKiBhY3RpbmcgdW5kZXIuIFRoaXMgaXMgdGhlIFNPTEUgc2lnbmFsIGZvciBzeXNhZG1pbiBhdXRob3JpdHkg4oCUIHRoZSBvbGQgcGF0aFxuICAgKiAobWVtYmVyc2hpcCBpbiB0aGUgd2VsbC1rbm93biBcInN5c3RlbVwiIG9yZyB3aXRoIHJvbGUgYWRtaW4vb3duZXIpIGhhcyBiZWVuXG4gICAqIHJlbW92ZWQgYmVjYXVzZSBpdCBjb25mbGF0ZWQgXCJQaXBlbGluZSBCdWlsZGVyIG9wZXJhdG9yXCIgd2l0aCBcInJlYWwgY3VzdG9tZXJcbiAgICogdGVuYW50XCIgaW4gdGhlIGRhdGEgbW9kZWwuIEdyYW50IHN5c2FkbWluIG9ubHkgdmlhIGBpc1N1cGVyQWRtaW5gLlxuICAgKi9cbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbjtcbiAgLyoqIE9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXIuICovXG4gIHRpZXI/OiBRdW90YVRpZXI7XG4gIC8qKiBSZXNvbHZlZCBmZWF0dXJlIGZsYWdzIGZvciB0aGlzIHVzZXIvb3JnICovXG4gIGZlYXR1cmVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBOYXJyb3cgY2FwYWJpbGl0eSBzY29wZSBmb3IgbWFjaGluZS9hdXRvbWF0aW9uIHRva2VucyAoZS5nLlxuICAgKiBgJ3JlcG9ydGluZzppbmdlc3QnYCkuIEFic2VudCBvbiBub3JtYWwgaW50ZXJhY3RpdmUgdXNlciB0b2tlbnMuIEVuZHBvaW50c1xuICAgKiB0aGF0IGFjY2VwdCBhIHNjb3BlZCBpZGVudGl0eSBjaGVjayB0aGlzIChzZWUgYGhhc1Njb3BlYCkgaW5zdGVhZCBvZiByb2xlO1xuICAgKiBhIHNjb3BlZCB0b2tlbiBpcyBtaW50ZWQgd2l0aCBtaW5pbWFsIHJvbGUgZm9yIGxlYXN0LXByaXZpbGVnZS5cbiAgICovXG4gIHNjb3BlPzogVG9rZW5TY29wZTtcbiAgLyoqIEFjdGl2ZSBvcmdhbml6YXRpb24gSUQgKGZyb20gVXNlck9yZ2FuaXphdGlvbiBtZW1iZXJzaGlwKSAqL1xuICBvcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmdhbml6YXRpb24gbmFtZSAqL1xuICBvcmdhbml6YXRpb25OYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogT3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSAob3JnLXRlYW0taGllcmFyY2h5IHByb3Bvc2FsLCBwaGFzZSAxKS5cbiAgICogYHBhcmVudE9yZ2FuaXphdGlvbklkYCBpcyB0aGUgYWN0aXZlIG9yZydzIGRpcmVjdCBwYXJlbnQ7IGByb290T3JnYW5pemF0aW9uSWRgXG4gICAqIGlzIHRoZSB0b3Agb2YgaXRzIGFuY2VzdHJ5IGNoYWluLiBCb3RoIGFyZSAqKm9taXR0ZWQgZm9yIGZsYXQgKHJvb3QpIG9yZ3MqKiDigJRcbiAgICogY29uc3VtZXJzIHNob3VsZCB0cmVhdCB0aGUgZWZmZWN0aXZlIHJvb3QgYXMgYHJvb3RPcmdhbml6YXRpb25JZCA/PyBvcmdhbml6YXRpb25JZGBcbiAgICogKHVzZSB0aGUgc2hhcmVkIHtAbGluayBlZmZlY3RpdmVSb290T3JnSWR9IGFjY2Vzc29yIHJhdGhlciB0aGFuIGNvYWxlc2NpbmcgaW5saW5lKS5cbiAgICogQ3VycmVudGx5IGV2ZXJ5IG9yZyBpcyBmbGF0LCBzbyB0aGVzZSBhcmUgYWJzZW50IG9uIGFsbCB0b2tlbnMgdG9kYXkuXG4gICAqL1xuICBwYXJlbnRPcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqIFJvb3Qgb3JnYW5pemF0aW9uIElEIG9mIHRoZSBhY3RpdmUgb3JnJ3MgYW5jZXN0cnkgY2hhaW4gKHNlZSBgcGFyZW50T3JnYW5pemF0aW9uSWRgKS4gKi9cbiAgcm9vdE9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKipcbiAgICogU2V0IG9uIHRva2VucyBpc3N1ZWQgYnkgdGhlIHN5c2FkbWluIGltcGVyc29uYXRpb24gZmxvd1xuICAgKiAoYFBPU1QgL2FkbWluL2ltcGVyc29uYXRlLzp1c2VySWRgKS4gQ2FycmllcyB0aGUgb3JpZ2luYWwgc3lzYWRtaW4nc1xuICAgKiB1c2VyIGlkIHNvIGF1ZGl0IGV2ZW50cyBzdGlsbCBhdHRyaWJ1dGUgYWN0aW9ucyBjb3JyZWN0bHkuXG4gICAqL1xuICBpbXBlcnNvbmF0b3JJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFVuaXF1ZSB0b2tlbiBpZC4gT24gYW4gaW1wZXJzb25hdGlvbiB0b2tlbiBpdCBpZGVudGlmaWVzIHRoZSBTRVNTSU9OLCBzbyBpdFxuICAgKiBjYW4gYmUgcmV2b2tlZCBvbiBpdHMgb3duIGFjcm9zcyBldmVyeSBzZXJ2aWNlIChzZWVcbiAgICogYFRva2VuUmV2b2NhdGlvblN0b3JlLmdldFNlc3Npb25SZXZvY2F0aW9uYCkuIFBlcnNvbmFsIEFjY2VzcyBUb2tlbnNcbiAgICogKGB0b2tlbl91c2U6ICdhcGlfa2V5J2ApIGNhcnJ5IG9uZSB0b28sIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZWlyIG93biByZWNvcmQuXG4gICAqIEEgYGp0aWAgYWxvbmUgbmV2ZXIgY2xhc3NpZmllcyBhIHRva2VuIOKAlCBgdG9rZW5fdXNlYCBhbmQgYGltcGVyc29uYXRvcklkYCBkby5cbiAgICovXG4gIGp0aT86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIHRva2VuIGlzIHJlYWQtb25seSDigJQgYW55IG5vbi1HRVQgcmVxdWVzdCBpcyByZWplY3RlZFxuICAgKiB1cHN0cmVhbSBieSB0aGUgcGxhdGZvcm0ncyByZWFkLW9ubHkgaW1wZXJzb25hdGlvbiBnYXRlLiBMZXRzXG4gICAqIHN5c2FkbWlucyBcInZpZXcgYXMgdXNlciBYXCIgd2l0aG91dCByaXNraW5nIGEgZGVzdHJ1Y3RpdmUgYWN0aW9uLlxuICAgKi9cbiAgaW1wZXJzb25hdGlvblJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyJ3MgYHRva2VuVmVyc2lvbmAgYXQgdGhlIG1vbWVudCB0aGlzIHRva2VuIHdhcyBpc3N1ZWQuIEV2ZXJ5XG4gICAqIHByaXZpbGVnZSBjaGFuZ2UgKGRlYWN0aXZhdGUgLyByb2xlIG9yIHRpZXIgZG93bmdyYWRlIC8gbWVtYmVyc2hpcCBvclxuICAgKiBvd25lcnNoaXAgY2hhbmdlIC8gcGFzc3dvcmQgY2hhbmdlIC8gbG9nb3V0LWFsbCkgaW5jcmVtZW50cyB0aGUgdXNlcidzXG4gICAqIHNlcnZlci1zaWRlIGB0b2tlblZlcnNpb25gLCBzbyBhIHRva2VuIHdob3NlIGVtYmVkZGVkIHZlcnNpb24gaXMgYmVoaW5kIHRoZVxuICAgKiBjdXJyZW50IG9uZSBoYXMgYmVlbiBSRVZPS0VELiBQbGF0Zm9ybSB2YWxpZGF0ZXMgdGhpcyBhZ2FpbnN0IE1vbmdvOyB0aGVcbiAgICogc3RhdGVsZXNzIHNlcnZpY2VzIHZhbGlkYXRlIGl0IGFnYWluc3QgYSBSZWRpcy1wdWJsaXNoZWQgY3VycmVudC12ZXJzaW9uXG4gICAqIHN0b3JlIChzZWUgYHNldFRva2VuUmV2b2NhdGlvblN0b3JlYCkuIEFic2VudCBvbiBtYWNoaW5lL3NlcnZpY2UgdG9rZW5zLlxuICAgKi9cbiAgdG9rZW5WZXJzaW9uPzogbnVtYmVyO1xuICAvKiogVG9rZW4gdHlwZSAqL1xuICB0eXBlOiAnYWNjZXNzJyB8ICdyZWZyZXNoJztcbiAgLyoqIElzc3VlZCBhdCB0aW1lc3RhbXAgKi9cbiAgaWF0PzogbnVtYmVyO1xuICAvKiogRXhwaXJhdGlvbiB0aW1lc3RhbXAgKi9cbiAgZXhwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBhY2NvdW50IGJvdW5kYXJ5IChyb290IG9yZykgZm9yIGEgdG9rZW4ncyBhY3RpdmUgb3JnLlxuICpcbiAqIFRoZSBhY2NvdW50IHJvb3QgaXMgYHJvb3RPcmdhbml6YXRpb25JZCA/PyBvcmdhbml6YXRpb25JZGA6IGEgZmxhdCAocm9vdCkgb3JnXG4gKiBvbWl0cyBgcm9vdE9yZ2FuaXphdGlvbklkYCwgc28gaXQgSVMgaXRzIG93biByb290OyBhIHRlYW0gKGNoaWxkKSBvcmcgY2Fycmllc1xuICogdGhlIHRvcCBvZiBpdHMgYW5jZXN0cnkgY2hhaW4uIEV2ZXJ5IGFjY291bnQtc2NvcGVkIHJlYWQgKHF1b3RhL3NlYXQvYmlsbGluZ1xuICogcG9vbGluZykgbXVzdCByZXNvbHZlIHRocm91Z2ggdGhpcyBjb2FsZXNjZSByYXRoZXIgdGhhbiByZWFkaW5nXG4gKiBgb3JnYW5pemF0aW9uSWRgIGRpcmVjdGx5IOKAlCB0aGUgbGF0dGVyIHNpbGVudGx5IHdvcmtzIHRvZGF5IChhbGwgb3JncyBmbGF0KVxuICogYnV0IHdvdWxkIGJpbmQgdG8gdGhlIHRlYW0gaW5zdGVhZCBvZiB0aGUgYWNjb3VudCBvbmNlIHRlYW1zIGV4aXN0LlxuICpcbiAqIEByZXR1cm5zIHRoZSBlZmZlY3RpdmUgcm9vdCBvcmcgaWQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciBmaWVsZCBpcyBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlZmZlY3RpdmVSb290T3JnSWQoXG4gIHBheWxvYWQ6IFBpY2s8Snd0UGF5bG9hZCwgJ29yZ2FuaXphdGlvbklkJyB8ICdyb290T3JnYW5pemF0aW9uSWQnPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBwYXlsb2FkLnJvb3RPcmdhbml6YXRpb25JZCA/PyBwYXlsb2FkLm9yZ2FuaXphdGlvbklkO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIEV4cHJlc3MgUmVxdWVzdCB3aXRoIHVzZXIgcHJvcGVydHkuXG4gKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbmFtZXNwYWNlIEV4cHJlc3Mge1xuICAgIGludGVyZmFjZSBSZXF1ZXN0IHtcbiAgICAgIHVzZXI/OiBKd3RQYXlsb2FkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNlcnZpY2UgY29uZmlndXJhdGlvbiBmb3IgaW50ZXJuYWwgSFRUUCBjbGllbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUNvbmZpZyB7XG4gIC8qKiBTZXJ2aWNlIGhvc3RuYW1lICovXG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFNlcnZpY2UgcG9ydCAqL1xuICBwb3J0OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSGVhbHRoIGNoZWNrIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrUmVzcG9uc2Uge1xuICBzdGF0dXM6ICdoZWFsdGh5JyB8ICd1bmhlYWx0aHknO1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICB1cHRpbWU6IG51bWJlcjtcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgZGVwZW5kZW5jaWVzPzogUmVjb3JkPHN0cmluZywgJ2Nvbm5lY3RlZCcgfCAnZGlzY29ubmVjdGVkJyB8ICd1bmtub3duJz47XG59XG4iXX0=
@@ -12,7 +12,21 @@ export declare enum ErrorCode {
12
12
  TOKEN_INVALID = "TOKEN_INVALID",
13
13
  TOKEN_MISSING = "TOKEN_MISSING",
14
14
  TOKEN_REVOKED = "TOKEN_REVOKED",
15
+ /** The session is not MFA-grade (`aal` below the route's `minAssurance`).
16
+ * The client sends the person to enrol / sign in again with a second
17
+ * factor — it must NOT sign them out or retry a token refresh, since a
18
+ * refresh can never raise the assurance level. */
19
+ MFA_REQUIRED = "MFA_REQUIRED",
20
+ /** The session is MFA-grade but its `auth_time` is older than the route's
21
+ * `maxAge` — the person must authenticate again (not merely refresh). */
22
+ REAUTH_REQUIRED = "REAUTH_REQUIRED",
15
23
  INSUFFICIENT_PERMISSIONS = "INSUFFICIENT_PERMISSIONS",
24
+ /** A machine credential (service principal, org service account, or an
25
+ * exchanged access key) reached a route that requires a person. */
26
+ HUMAN_SESSION_REQUIRED = "HUMAN_SESSION_REQUIRED",
27
+ /** A bootstrap-admin enrolment session (`mfaEnrollmentPending`) reached a
28
+ * route outside the enrolment / sign-out / setup allowlist. */
29
+ MFA_ENROLLMENT_REQUIRED = "MFA_ENROLLMENT_REQUIRED",
16
30
  ORG_MISMATCH = "ORG_MISMATCH",
17
31
  COMPLIANCE_VIOLATION = "COMPLIANCE_VIOLATION",
18
32
  NOT_FOUND = "NOT_FOUND",
@@ -41,6 +55,7 @@ export declare enum ErrorCode {
41
55
  ADDON_OVER_CAP = "ADDON_OVER_CAP",// 409
42
56
  INTERNAL_ERROR = "INTERNAL_ERROR",
43
57
  DATABASE_ERROR = "DATABASE_ERROR",
58
+ NOT_IMPLEMENTED = "NOT_IMPLEMENTED",
44
59
  SERVICE_UNAVAILABLE = "SERVICE_UNAVAILABLE",
45
60
  COMPLIANCE_SERVICE_UNAVAILABLE = "COMPLIANCE_SERVICE_UNAVAILABLE"
46
61
  }
@@ -16,8 +16,22 @@ export var ErrorCode;
16
16
  ErrorCode["TOKEN_INVALID"] = "TOKEN_INVALID";
17
17
  ErrorCode["TOKEN_MISSING"] = "TOKEN_MISSING";
18
18
  ErrorCode["TOKEN_REVOKED"] = "TOKEN_REVOKED";
19
+ /** The session is not MFA-grade (`aal` below the route's `minAssurance`).
20
+ * The client sends the person to enrol / sign in again with a second
21
+ * factor — it must NOT sign them out or retry a token refresh, since a
22
+ * refresh can never raise the assurance level. */
23
+ ErrorCode["MFA_REQUIRED"] = "MFA_REQUIRED";
24
+ /** The session is MFA-grade but its `auth_time` is older than the route's
25
+ * `maxAge` — the person must authenticate again (not merely refresh). */
26
+ ErrorCode["REAUTH_REQUIRED"] = "REAUTH_REQUIRED";
19
27
  // Authorization errors (403)
20
28
  ErrorCode["INSUFFICIENT_PERMISSIONS"] = "INSUFFICIENT_PERMISSIONS";
29
+ /** A machine credential (service principal, org service account, or an
30
+ * exchanged access key) reached a route that requires a person. */
31
+ ErrorCode["HUMAN_SESSION_REQUIRED"] = "HUMAN_SESSION_REQUIRED";
32
+ /** A bootstrap-admin enrolment session (`mfaEnrollmentPending`) reached a
33
+ * route outside the enrolment / sign-out / setup allowlist. */
34
+ ErrorCode["MFA_ENROLLMENT_REQUIRED"] = "MFA_ENROLLMENT_REQUIRED";
21
35
  ErrorCode["ORG_MISMATCH"] = "ORG_MISMATCH";
22
36
  ErrorCode["COMPLIANCE_VIOLATION"] = "COMPLIANCE_VIOLATION";
23
37
  // Not found errors (404)
@@ -53,6 +67,8 @@ export var ErrorCode;
53
67
  // Server errors (500)
54
68
  ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
55
69
  ErrorCode["DATABASE_ERROR"] = "DATABASE_ERROR";
70
+ // Not implemented (501) — the configured provider has no such capability
71
+ ErrorCode["NOT_IMPLEMENTED"] = "NOT_IMPLEMENTED";
56
72
  // Service unavailable (503)
57
73
  ErrorCode["SERVICE_UNAVAILABLE"] = "SERVICE_UNAVAILABLE";
58
74
  ErrorCode["COMPLIANCE_SERVICE_UNAVAILABLE"] = "COMPLIANCE_SERVICE_UNAVAILABLE";
@@ -66,7 +82,11 @@ export const ErrorCodeStatus = {
66
82
  [ErrorCode.TOKEN_INVALID]: 401,
67
83
  [ErrorCode.TOKEN_MISSING]: 401,
68
84
  [ErrorCode.TOKEN_REVOKED]: 401,
85
+ [ErrorCode.MFA_REQUIRED]: 401,
86
+ [ErrorCode.REAUTH_REQUIRED]: 401,
69
87
  [ErrorCode.INSUFFICIENT_PERMISSIONS]: 403,
88
+ [ErrorCode.HUMAN_SESSION_REQUIRED]: 403,
89
+ [ErrorCode.MFA_ENROLLMENT_REQUIRED]: 403,
70
90
  [ErrorCode.ORG_MISMATCH]: 403,
71
91
  [ErrorCode.COMPLIANCE_VIOLATION]: 403,
72
92
  [ErrorCode.NOT_FOUND]: 404,
@@ -95,6 +115,7 @@ export const ErrorCodeStatus = {
95
115
  [ErrorCode.ADDON_OVER_CAP]: 409,
96
116
  [ErrorCode.INTERNAL_ERROR]: 500,
97
117
  [ErrorCode.DATABASE_ERROR]: 500,
118
+ [ErrorCode.NOT_IMPLEMENTED]: 501,
98
119
  [ErrorCode.SERVICE_UNAVAILABLE]: 503,
99
120
  [ErrorCode.COMPLIANCE_SERVICE_UNAVAILABLE]: 503,
100
121
  };
@@ -104,4 +125,4 @@ export const ErrorCodeStatus = {
104
125
  export function getStatusForErrorCode(code) {
105
126
  return ErrorCodeStatus[code] ?? 500;
106
127
  }
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXJyb3ItY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFOLElBQVksU0F3RFg7QUF4REQsV0FBWSxTQUFTO0lBQ25CLDhCQUE4QjtJQUM5QiwwQ0FBNkIsQ0FBQTtJQUM3Qiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUUvQiw2QkFBNkI7SUFDN0Isa0VBQXFELENBQUE7SUFDckQsMENBQTZCLENBQUE7SUFDN0IsMERBQTZDLENBQUE7SUFFN0MseUJBQXlCO0lBQ3pCLG9DQUF1QixDQUFBO0lBQ3ZCLDRDQUErQixDQUFBO0lBRS9CLDBCQUEwQjtJQUMxQixrREFBcUMsQ0FBQTtJQUNyQyw4REFBaUQsQ0FBQTtJQUNqRCw0REFBK0MsQ0FBQTtJQUMvQyw4Q0FBaUMsQ0FBQTtJQUNqQywwREFBNkMsQ0FBQTtJQUM3Qyw4REFBaUQsQ0FBQTtJQUNqRCxvRUFBdUQsQ0FBQTtJQUN2RCx3RUFBMkQsQ0FBQTtJQUMzRCw4REFBaUQsQ0FBQTtJQUNqRCxzRUFBeUQsQ0FBQTtJQUV6RCxnQ0FBZ0M7SUFDaEMsOENBQWlDLENBQUE7SUFDakMsd0RBQTJDLENBQUE7SUFFM0MsdUJBQXVCO0lBQ3ZCLG9EQUF1QyxDQUFBO0lBRXZDLHdCQUF3QjtJQUN4QixrQ0FBcUIsQ0FBQTtJQUNyQixnREFBbUMsQ0FBQTtJQUNuQyw0Q0FBK0IsQ0FBQTtJQUUvQixpQkFBaUI7SUFDakIsZ0VBQW1ELENBQUE7SUFDbkQsb0VBQXVELENBQUE7SUFDdkQsc0RBQXlDLENBQUE7SUFDekMsb0RBQXVDLENBQUE7SUFDdkMsNENBQStCLENBQUE7SUFDL0IsOENBQWlDLENBQUE7SUFFakMsc0JBQXNCO0lB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bnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU3RhbmRhcmRpemVkIGVycm9yIGNvZGVzIHVzZWQgYWNyb3NzIGFsbCBBUEkgbWljcm9zZXJ2aWNlcy5cbiAqIFVzZSB0aGVzZSBjb2RlcyBpbiBlcnJvciByZXNwb25zZXMgZm9yIGNvbnNpc3RlbnQgY2xpZW50IGhhbmRsaW5nLlxuICpcbiAqIEVhY2ggSFRUUCBzdGF0dXMgY2F0ZWdvcnkgaGFzIG9uZSBwcmltYXJ5IGNvZGUuIFVzZSB0aGUgYGRldGFpbHNgXG4gKiBmaWVsZCBpbiBlcnJvciByZXNwb25zZXMgZm9yIHN1Yi10eXBlIGluZm9ybWF0aW9uIChlLmcuIHdoaWNoIHF1b3RhXG4gKiB3YXMgZXhjZWVkZWQsIHdoaWNoIGZpZWxkIGZhaWxlZCB2YWxpZGF0aW9uKS5cbiAqL1xuZXhwb3J0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gQXV0aGVudGljYXRpb24gZXJyb3JzICg0MDEpXG4gIFVOQVVUSE9SSVpFRCA9ICdVTkFVVEhPUklaRUQnLFxuICBUT0tFTl9FWFBJUkVEID0gJ1RPS0VOX0VYUElSRUQnLFxuICBUT0tFTl9JTlZBTElEID0gJ1RPS0VOX0lOVkFMSUQnLFxuICBUT0tFTl9NSVNTSU5HID0gJ1RPS0VOX01JU1NJTkcnLFxuICBUT0tFTl9SRVZPS0VEID0gJ1RPS0VOX1JFVk9LRUQnLFxuXG4gIC8vIEF1dGhvcml6YXRpb24gZXJyb3JzICg0MDMpXG4gIElOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyA9ICdJTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMnLFxuICBPUkdfTUlTTUFUQ0ggPSAnT1JHX01JU01BVENIJyxcbiAgQ09NUExJQU5DRV9WSU9MQVRJT04gPSAnQ09NUExJQU5DRV9WSU9MQVRJT04nLFxuXG4gIC8vIE5vdCBmb3VuZCBlcnJvcnMgKDQwNClcbiAgTk9UX0ZPVU5EID0gJ05PVF9GT1VORCcsXG4gIE9SR19OT1RfRk9VTkQgPSAnT1JHX05PVF9GT1VORCcsXG5cbiAgLy8gVmFsaWRhdGlvbiBlcnJvcnMgKDQwMClcbiAgVkFMSURBVElPTl9FUlJPUiA9ICdWQUxJREFUSU9OX0VSUk9SJyxcbiAgTUlTU0lOR19SRVFVSVJFRF9GSUVMRCA9ICdNSVNTSU5HX1JFUVVJUkVEX0ZJRUxEJyxcbiAgVEVNUExBVEVfVU5LTk9XTl9QQVRIID0gJ1RFTVBMQVRFX1VOS05PV05fUEFUSCcsXG4gIFRFTVBMQVRFX0NZQ0xFID0gJ1RFTVBMQVRFX0NZQ0xFJyxcbiAgVEVNUExBVEVfUEFSU0VfRVJST1IgPSAnVEVNUExBVEVfUEFSU0VfRVJST1InLFxuICBURU1QTEFURV9UWVBFX01JU01BVENIID0gJ1RFTVBMQVRFX1RZUEVfTUlTTUFUQ0gnLFxuICBURU1QTEFURV9TRUNSRVRTX1JFU0VSVkVEID0gJ1RFTVBMQVRFX1NFQ1JFVFNfUkVTRVJWRUQnLFxuICBURU1QTEFURV9DT05UUkFDVF9WSU9MQVRJT04gPSAnVEVNUExBVEVfQ09OVFJBQ1RfVklPTEFUSU9OJyxcbiAgVEVNUExBVEVfU0laRV9FWENFRURFRCA9ICdURU1QTEFURV9TSVpFX0VYQ0VFREVEJyxcbiAgVEVNUExBVEVfVkFMSURBVElPTl9GQUlMRUQgPSAnVEVNUExBVEVfVkFMSURBVElPTl9GQUlMRUQnLFxuXG4gIC8vIFF1b3RhL1JhdGUgbGltaXQgZXJyb3JzICg0MjkpXG4gIFFVT1RBX0VYQ0VFREVEID0gJ1FVT1RBX0VYQ0VFREVEJyxcbiAgUkFURV9MSU1JVF9FWENFRURFRCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcblxuICAvLyBQYXlsb2FkIGVycm9ycyAoNDEzKVxuICBQQVlMT0FEX1RPT19MQVJHRSA9ICdQQVlMT0FEX1RPT19MQVJHRScsXG5cbiAgLy8gQ29uZmxpY3QgZXJyb3JzICg0MDkpXG4gIENPTkZMSUNUID0gJ0NPTkZMSUNUJyxcbiAgRFVQTElDQVRFX0VOVFJZID0gJ0RVUExJQ0FURV9FTlRSWScsXG4gIFNDQU5fQ09ORkxJQ1QgPSAnU0NBTl9DT05GTElDVCcsXG5cbiAgLy8gQmlsbGluZyBlcnJvcnNcbiAgUEFZTUVOVF9NRVRIT0RfUkVRVUlSRUQgPSAnUEFZTUVOVF9NRVRIT0RfUkVRVUlSRUQnLCAvLyA0MDJcbiAgRElTQ09VTlRfQ0VJTElOR19FWENFRURFRCA9ICdESVNDT1VOVF9DRUlMSU5HX0VYQ0VFREVEJywgLy8gNDAwXG4gIERJU0NPVU5UX05PVF9GT1VORCA9ICdESVNDT1VOVF9OT1RfRk9VTkQnLCAvLyA0MDRcbiAgRElTQ09VTlRfSU5BQ1RJVkUgPSAnRElTQ09VTlRfSU5BQ1RJVkUnLCAvLyA0MDlcbiAgUExBTl9PVkVSX0NBUCA9ICdQTEFOX09WRVJfQ0FQJywgLy8gNDA5XG4gIEFERE9OX09WRVJfQ0FQID0gJ0FERE9OX09WRVJfQ0FQJywgLy8gNDA5XG5cbiAgLy8gU2VydmVyIGVycm9ycyAoNTAwKVxuICBJTlRFUk5BTF9FUlJPUiA9ICdJTlRFUk5BTF9FUlJPUicsXG4gIERBVEFCQVNFX0VSUk9SID0gJ0RBVEFCQVNFX0VSUk9SJyxcblxuICAvLyBTZXJ2aWNlIHVuYXZhaWxhYmxlICg1MDMpXG4gIFNFUlZJQ0VfVU5BVkFJTEFCTEUgPSAnU0VSVklDRV9VTkFWQUlMQUJMRScsXG4gIENPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRSA9ICdDT01QTElBTkNFX1NFUlZJQ0VfVU5BVkFJTEFCTEUnLFxufVxuXG4vKipcbiAqIE1hcHMgZXJyb3IgY29kZXMgdG8gdGhlaXIgZGVmYXVsdCBIVFRQIHN0YXR1cyBjb2Rlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVycm9yQ29kZVN0YXR1czogUmVjb3JkPEVycm9yQ29kZSwgbnVtYmVyPiA9IHtcbiAgW0Vycm9yQ29kZS5VTkFVVEhPUklaRURdOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fRVhQSVJFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9JTlZBTElEXTogNDAxLFxuICBbRXJyb3JDb2RlLlRPS0VOX01JU1NJTkddOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fUkVWT0tFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlNdOiA0MDMsXG4gIFtFcnJvckNvZGUuT1JHX01JU01BVENIXTogNDAzLFxuICBbRXJyb3JDb2RlLkNPTVBMSUFOQ0VfVklPTEFUSU9OXTogNDAzLFxuICBbRXJyb3JDb2RlLk5PVF9GT1VORF06IDQwNCxcbiAgW0Vycm9yQ29kZS5PUkdfTk9UX0ZPVU5EXTogNDA0LFxuICBbRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1JdOiA0MDAsXG4gIFtFcnJvckNvZGUuTUlTU0lOR19SRVFVSVJFRF9GSUVMRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9VTktOT1dOX1BBVEhdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfQ1lDTEVdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfUEFSU0VfRVJST1JdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfVFlQRV9NSVNNQVRDSF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9TRUNSRVRTX1JFU0VSVkVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX0NPTlRSQUNUX1ZJT0xBVElPTl06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9TSVpFX0VYQ0VFREVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX1ZBTElEQVRJT05fRkFJTEVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEXTogNDI5LFxuICBbRXJyb3JDb2RlLlJBVEVfTElNSVRfRVhDRUVERURdOiA0MjksXG4gIFtFcnJvckNvZGUuUEFZTE9BRF9UT09fTEFSR0VdOiA0MTMsXG4gIFtFcnJvckNvZGUuQ09ORkxJQ1RdOiA0MDksXG4gIFtFcnJvckNvZGUuRFVQTElDQVRFX0VOVFJZXTogNDA5LFxuICBbRXJyb3JDb2RlLlNDQU5fQ09ORkxJQ1RdOiA0MDksXG4gIFtFcnJvckNvZGUuUEFZTUVOVF9NRVRIT0RfUkVRVUlSRURdOiA0MDIsXG4gIFtFcnJvckNvZGUuRElTQ09VTlRfQ0VJTElOR19FWENFRURFRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5ESVNDT1VOVF9OT1RfRk9VTkRdOiA0MDQsXG4gIFtFcnJvckNvZGUuRElTQ09VTlRfSU5BQ1RJVkVdOiA0MDksXG4gIFtFcnJvckNvZGUuUExBTl9PVkVSX0NBUF06IDQwOSxcbiAgW0Vycm9yQ29kZS5BRERPTl9PVkVSX0NBUF06IDQwOSxcbiAgW0Vycm9yQ29kZS5JTlRFUk5BTF9FUlJPUl06IDUwMCxcbiAgW0Vycm9yQ29kZS5EQVRBQkFTRV9FUlJPUl06IDUwMCxcbiAgW0Vycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFXTogNTAzLFxuICBbRXJyb3JDb2RlLkNPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRV06IDUwMyxcbn07XG5cbi8qKlxuICogR2V0IHRoZSBIVFRQIHN0YXR1cyBjb2RlIGZvciBhbiBlcnJvciBjb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKGNvZGU6IEVycm9yQ29kZSk6IG51bWJlciB7XG4gIHJldHVybiBFcnJvckNvZGVTdGF0dXNbY29kZV0gPz8gNTAwO1xufVxuIl19
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXJyb3ItY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFOLElBQVksU0F5RVg7QUF6RUQsV0FBWSxTQUFTO0lBQ25CLDhCQUE4QjtJQUM5QiwwQ0FBNkIsQ0FBQTtJQUM3Qiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQjs7O3VEQUdtRDtJQUNuRCwwQ0FBNkIsQ0FBQTtJQUM3Qjs4RUFDMEU7SUFDMUUsZ0RBQW1DLENBQUE7SUFFbkMsNkJBQTZCO0lBQzdCLGtFQUFxRCxDQUFBO0lBQ3JEO3dFQUNvRTtJQUNwRSw4REFBaUQsQ0FBQTtJQUNqRDtvRUFDZ0U7SUFDaEUsZ0VBQW1ELENBQUE7SUFDbkQsMENBQTZCLENBQUE7SUFDN0IsMERBQTZDLENBQUE7SUFFN0MseUJBQXlCO0lBQ3pCLG9DQUF1QixDQUFBO0lBQ3ZCLDRDQUErQixDQUFBO0lBRS9CLDBCQUEwQjtJQUMxQixrREFBcUMsQ0FBQTtJQUNyQyw4REFBaUQsQ0FBQTtJQUNqRCw0REFBK0MsQ0FBQTtJQUMvQyw4Q0FBaUMsQ0FBQTtJQUNqQywwREFBNkMsQ0FBQTtJQUM3Qyw4REFBaUQsQ0FBQTtJQUNqRCxvRUFBdUQsQ0FBQTtJQUN2RCx3RUFBMkQsQ0FBQTtJQUMzRCw4REFBaUQsQ0FBQTtJQUNqRCxzRUFBeUQsQ0FBQTtJQUV6RCxnQ0FBZ0M7SUFDaEMsOENBQWlDLENBQUE7SUFDakMsd0RBQTJDLENBQUE7SUFFM0MsdUJBQXVCO0lBQ3ZCLG9EQUF1QyxDQUFBO0lBRXZDLHdCQUF3QjtJQUN4QixrQ0FBcUIsQ0FBQTtJQUNyQixnREFBbUMsQ0FBQTtJQUNuQyw0Q0FBK0IsQ0FBQTtJQUUvQixpQkFB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Q0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRztJQUMvQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHO0lBQy9CLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUc7SUFDL0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRztJQUNoQyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUc7SUFDcEMsQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsRUFBRSxHQUFHO0NBQ2hELENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUFlO0lBQ25ELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU3RhbmRhcmRpemVkIGVycm9yIGNvZGVzIHVzZWQgYWNyb3NzIGFsbCBBUEkgbWljcm9zZXJ2aWNlcy5cbiAqIFVzZSB0aGVzZSBjb2RlcyBpbiBlcnJvciByZXNwb25zZXMgZm9yIGNvbnNpc3RlbnQgY2xpZW50IGhhbmRsaW5nLlxuICpcbiAqIEVhY2ggSFRUUCBzdGF0dXMgY2F0ZWdvcnkgaGFzIG9uZSBwcmltYXJ5IGNvZGUuIFVzZSB0aGUgYGRldGFpbHNgXG4gKiBmaWVsZCBpbiBlcnJvciByZXNwb25zZXMgZm9yIHN1Yi10eXBlIGluZm9ybWF0aW9uIChlLmcuIHdoaWNoIHF1b3RhXG4gKiB3YXMgZXhjZWVkZWQsIHdoaWNoIGZpZWxkIGZhaWxlZCB2YWxpZGF0aW9uKS5cbiAqL1xuZXhwb3J0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gQXV0aGVudGljYXRpb24gZXJyb3JzICg0MDEpXG4gIFVOQVVUSE9SSVpFRCA9ICdVTkFVVEhPUklaRUQnLFxuICBUT0tFTl9FWFBJUkVEID0gJ1RPS0VOX0VYUElSRUQnLFxuICBUT0tFTl9JTlZBTElEID0gJ1RPS0VOX0lOVkFMSUQnLFxuICBUT0tFTl9NSVNTSU5HID0gJ1RPS0VOX01JU1NJTkcnLFxuICBUT0tFTl9SRVZPS0VEID0gJ1RPS0VOX1JFVk9LRUQnLFxuICAvKiogVGhlIHNlc3Npb24gaXMgbm90IE1GQS1ncmFkZSAoYGFhbGAgYmVsb3cgdGhlIHJvdXRlJ3MgYG1pbkFzc3VyYW5jZWApLlxuICAgKiAgVGhlIGNsaWVudCBzZW5kcyB0aGUgcGVyc29uIHRvIGVucm9sIC8gc2lnbiBpbiBhZ2FpbiB3aXRoIGEgc2Vjb25kXG4gICAqICBmYWN0b3Ig4oCUIGl0IG11c3QgTk9UIHNpZ24gdGhlbSBvdXQgb3IgcmV0cnkgYSB0b2tlbiByZWZyZXNoLCBzaW5jZSBhXG4gICAqICByZWZyZXNoIGNhbiBuZXZlciByYWlzZSB0aGUgYXNzdXJhbmNlIGxldmVsLiAqL1xuICBNRkFfUkVRVUlSRUQgPSAnTUZBX1JFUVVJUkVEJyxcbiAgLyoqIFRoZSBzZXNzaW9uIGlzIE1GQS1ncmFkZSBidXQgaXRzIGBhdXRoX3RpbWVgIGlzIG9sZGVyIHRoYW4gdGhlIHJvdXRlJ3NcbiAgICogIGBtYXhBZ2VgIOKAlCB0aGUgcGVyc29uIG11c3QgYXV0aGVudGljYXRlIGFnYWluIChub3QgbWVyZWx5IHJlZnJlc2gpLiAqL1xuICBSRUFVVEhfUkVRVUlSRUQgPSAnUkVBVVRIX1JFUVVJUkVEJyxcblxuICAvLyBBdXRob3JpemF0aW9uIGVycm9ycyAoNDAzKVxuICBJTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMgPSAnSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TJyxcbiAgLyoqIEEgbWFjaGluZSBjcmVkZW50aWFsIChzZXJ2aWNlIHByaW5jaXBhbCwgb3JnIHNlcnZpY2UgYWNjb3VudCwgb3IgYW5cbiAgICogIGV4Y2hhbmdlZCBhY2Nlc3Mga2V5KSByZWFjaGVkIGEgcm91dGUgdGhhdCByZXF1aXJlcyBhIHBlcnNvbi4gKi9cbiAgSFVNQU5fU0VTU0lPTl9SRVFVSVJFRCA9ICdIVU1BTl9TRVNTSU9OX1JFUVVJUkVEJyxcbiAgLyoqIEEgYm9vdHN0cmFwLWFkbWluIGVucm9sbWVudCBzZXNzaW9uIChgbWZhRW5yb2xsbWVudFBlbmRpbmdgKSByZWFjaGVkIGFcbiAgICogIHJvdXRlIG91dHNpZGUgdGhlIGVucm9sbWVudCAvIHNpZ24tb3V0IC8gc2V0dXAgYWxsb3dsaXN0LiAqL1xuICBNRkFfRU5ST0xMTUVOVF9SRVFVSVJFRCA9ICdNRkFfRU5ST0xMTUVOVF9SRVFVSVJFRCcsXG4gIE9SR19NSVNNQVRDSCA9ICdPUkdfTUlTTUFUQ0gnLFxuICBDT01QTElBTkNFX1ZJT0xBVElPTiA9ICdDT01QTElBTkNFX1ZJT0xBVElPTicsXG5cbiAgLy8gTm90IGZvdW5kIGVycm9ycyAoNDA0KVxuICBOT1RfRk9VTkQgPSAnTk9UX0ZPVU5EJyxcbiAgT1JHX05PVF9GT1VORCA9ICdPUkdfTk9UX0ZPVU5EJyxcblxuICAvLyBWYWxpZGF0aW9uIGVycm9ycyAoNDAwKVxuICBWQUxJREFUSU9OX0VSUk9SID0gJ1ZBTElEQVRJT05fRVJST1InLFxuICBNSVNTSU5HX1JFUVVJUkVEX0ZJRUxEID0gJ01JU1NJTkdfUkVRVUlSRURfRklFTEQnLFxuICBURU1QTEFURV9VTktOT1dOX1BBVEggPSAnVEVNUExBVEVfVU5LTk9XTl9QQVRIJyxcbiAgVEVNUExBVEVfQ1lDTEUgPSAnVEVNUExBVEVfQ1lDTEUnLFxuICBURU1QTEFURV9QQVJTRV9FUlJPUiA9ICdURU1QTEFURV9QQVJTRV9FUlJPUicsXG4gIFRFTVBMQVRFX1RZUEVfTUlTTUFUQ0ggPSAnVEVNUExBVEVfVFlQRV9NSVNNQVRDSCcsXG4gIFRFTVBMQVRFX1NFQ1JFVFNfUkVTRVJWRUQgPSAnVEVNUExBVEVfU0VDUkVUU19SRVNFUlZFRCcsXG4gIFRFTVBMQVRFX0NPTlRSQUNUX1ZJT0xBVElPTiA9ICdURU1QTEFURV9DT05UUkFDVF9WSU9MQVRJT04nLFxuICBURU1QTEFURV9TSVpFX0VYQ0VFREVEID0gJ1RFTVBMQVRFX1NJWkVfRVhDRUVERUQnLFxuICBURU1QTEFURV9WQUxJREFUSU9OX0ZBSUxFRCA9ICdURU1QTEFURV9WQUxJREFUSU9OX0ZBSUxFRCcsXG5cbiAgLy8gUXVvdGEvUmF0ZSBsaW1pdCBlcnJvcnMgKDQyOSlcbiAgUVVPVEFfRVhDRUVERUQgPSAnUVVPVEFfRVhDRUVERUQnLFxuICBSQVRFX0xJTUlUX0VYQ0VFREVEID0gJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuXG4gIC8vIFBheWxvYWQgZXJyb3JzICg0MTMpXG4gIFBBWUxPQURfVE9PX0xBUkdFID0gJ1BBWUxPQURfVE9PX0xBUkdFJyxcblxuICAvLyBDb25mbGljdCBlcnJvcnMgKDQwOSlcbiAgQ09ORkxJQ1QgPSAnQ09ORkxJQ1QnLFxuICBEVVBMSUNBVEVfRU5UUlkgPSAnRFVQTElDQVRFX0VOVFJZJyxcbiAgU0NBTl9DT05GTElDVCA9ICdTQ0FOX0NPTkZMSUNUJyxcblxuICAvLyBCaWxsaW5nIGVycm9yc1xuICBQQVlNRU5UX01FVEhPRF9SRVFVSVJFRCA9ICdQQVlNRU5UX01FVEhPRF9SRVFVSVJFRCcsIC8vIDQwMlxuICBESVNDT1VOVF9DRUlMSU5HX0VYQ0VFREVEID0gJ0RJU0NPVU5UX0NFSUxJTkdfRVhDRUVERUQnLCAvLyA0MDBcbiAgRElTQ09VTlRfTk9UX0ZPVU5EID0gJ0RJU0NPVU5UX05PVF9GT1VORCcsIC8vIDQwNFxuICBESVNDT1VOVF9JTkFDVElWRSA9ICdESVNDT1VOVF9JTkFDVElWRScsIC8vIDQwOVxuICBQTEFOX09WRVJfQ0FQID0gJ1BMQU5fT1ZFUl9DQVAnLCAvLyA0MDlcbiAgQURET05fT1ZFUl9DQVAgPSAnQURET05fT1ZFUl9DQVAnLCAvLyA0MDlcblxuICAvLyBTZXJ2ZXIgZXJyb3JzICg1MDApXG4gIElOVEVSTkFMX0VSUk9SID0gJ0lOVEVSTkFMX0VSUk9SJyxcbiAgREFUQUJBU0VfRVJST1IgPSAnREFUQUJBU0VfRVJST1InLFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCAoNTAxKSDigJQgdGhlIGNvbmZpZ3VyZWQgcHJvdmlkZXIgaGFzIG5vIHN1Y2ggY2FwYWJpbGl0eVxuICBOT1RfSU1QTEVNRU5URUQgPSAnTk9UX0lNUExFTUVOVEVEJyxcblxuICAvLyBTZXJ2aWNlIHVuYXZhaWxhYmxlICg1MDMpXG4gIFNFUlZJQ0VfVU5BVkFJTEFCTEUgPSAnU0VSVklDRV9VTkFWQUlMQUJMRScsXG4gIENPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRSA9ICdDT01QTElBTkNFX1NFUlZJQ0VfVU5BVkFJTEFCTEUnLFxufVxuXG4vKipcbiAqIE1hcHMgZXJyb3IgY29kZXMgdG8gdGhlaXIgZGVmYXVsdCBIVFRQIHN0YXR1cyBjb2Rlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVycm9yQ29kZVN0YXR1czogUmVjb3JkPEVycm9yQ29kZSwgbnVtYmVyPiA9IHtcbiAgW0Vycm9yQ29kZS5VTkFVVEhPUklaRURdOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fRVhQSVJFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9JTlZBTElEXTogNDAxLFxuICBbRXJyb3JDb2RlLlRPS0VOX01JU1NJTkddOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fUkVWT0tFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5NRkFfUkVRVUlSRURdOiA0MDEsXG4gIFtFcnJvckNvZGUuUkVBVVRIX1JFUVVJUkVEXTogNDAxLFxuICBbRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OU106IDQwMyxcbiAgW0Vycm9yQ29kZS5IVU1BTl9TRVNTSU9OX1JFUVVJUkVEXTogNDAzLFxuICBbRXJyb3JDb2RlLk1GQV9FTlJPTExNRU5UX1JFUVVJUkVEXTogNDAzLFxuICBbRXJyb3JDb2RlLk9SR19NSVNNQVRDSF06IDQwMyxcbiAgW0Vycm9yQ29kZS5DT01QTElBTkNFX1ZJT0xBVElPTl06IDQwMyxcbiAgW0Vycm9yQ29kZS5OT1RfRk9VTkRdOiA0MDQsXG4gIFtFcnJvckNvZGUuT1JHX05PVF9GT1VORF06IDQwNCxcbiAgW0Vycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SXTogNDAwLFxuICBbRXJyb3JDb2RlLk1JU1NJTkdfUkVRVUlSRURfRklFTERdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfVU5LTk9XTl9QQVRIXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX0NZQ0xFXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX1BBUlNFX0VSUk9SXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX1RZUEVfTUlTTUFUQ0hdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfU0VDUkVUU19SRVNFUlZFRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9DT05UUkFDVF9WSU9MQVRJT05dOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfU0laRV9FWENFRURFRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9WQUxJREFUSU9OX0ZBSUxFRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5RVU9UQV9FWENFRURFRF06IDQyOSxcbiAgW0Vycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVEXTogNDI5LFxuICBbRXJyb3JDb2RlLlBBWUxPQURfVE9PX0xBUkdFXTogNDEzLFxuICBbRXJyb3JDb2RlLkNPTkZMSUNUXTogNDA5LFxuICBbRXJyb3JDb2RlLkRVUExJQ0FURV9FTlRSWV06IDQwOSxcbiAgW0Vycm9yQ29kZS5TQ0FOX0NPTkZMSUNUXTogNDA5LFxuICBbRXJyb3JDb2RlLlBBWU1FTlRfTUVUSE9EX1JFUVVJUkVEXTogNDAyLFxuICBbRXJyb3JDb2RlLkRJU0NPVU5UX0NFSUxJTkdfRVhDRUVERURdOiA0MDAsXG4gIFtFcnJvckNvZGUuRElTQ09VTlRfTk9UX0ZPVU5EXTogNDA0LFxuICBbRXJyb3JDb2RlLkRJU0NPVU5UX0lOQUNUSVZFXTogNDA5LFxuICBbRXJyb3JDb2RlLlBMQU5fT1ZFUl9DQVBdOiA0MDksXG4gIFtFcnJvckNvZGUuQURET05fT1ZFUl9DQVBdOiA0MDksXG4gIFtFcnJvckNvZGUuSU5URVJOQUxfRVJST1JdOiA1MDAsXG4gIFtFcnJvckNvZGUuREFUQUJBU0VfRVJST1JdOiA1MDAsXG4gIFtFcnJvckNvZGUuTk9UX0lNUExFTUVOVEVEXTogNTAxLFxuICBbRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEVdOiA1MDMsXG4gIFtFcnJvckNvZGUuQ09NUExJQU5DRV9TRVJWSUNFX1VOQVZBSUxBQkxFXTogNTAzLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIEhUVFAgc3RhdHVzIGNvZGUgZm9yIGFuIGVycm9yIGNvZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0dXNGb3JFcnJvckNvZGUoY29kZTogRXJyb3JDb2RlKTogbnVtYmVyIHtcbiAgcmV0dXJuIEVycm9yQ29kZVN0YXR1c1tjb2RlXSA/PyA1MDA7XG59XG4iXX0=
@@ -12,9 +12,36 @@ import type { OrgRole } from './common.js';
12
12
  * global `isSuperAdmin` flag, not a per-org permission; and `requireStepUp`
13
13
  * (MFA) / `requireFeature` (plan entitlements) remain orthogonal gates.
14
14
  */
15
- export type Permission = 'pipelines:read' | 'pipelines:write' | 'pipelines:publish' | 'templates:read' | 'templates:write' | 'templates:publish' | 'plugins:read' | 'plugins:write' | 'plugins:publish' | 'compliance:read' | 'compliance:write' | 'members:manage' | 'roles:manage' | 'invitations:manage' | 'dashboards:read' | 'dashboards:write' | 'observability:read' | 'observability:write' | 'reports:read' | 'reports:rollup' | 'messages:read' | 'messages:write' | 'billing:read' | 'billing:manage' | 'quotas:read' | 'registry:read' | 'registry:write' | 'org:settings' | 'org:idp' | 'org:kms' | 'org:impersonation';
15
+ export type Permission = 'pipelines:read' | 'pipelines:write' | 'pipelines:publish' | 'templates:read' | 'templates:write' | 'templates:publish' | 'plugins:read' | 'plugins:write' | 'plugins:publish' | 'compliance:read' | 'compliance:write' | 'members:manage' | 'roles:manage' | 'invitations:manage' | 'service_accounts:manage' | 'dashboards:read' | 'dashboards:write' | 'observability:read' | 'observability:write' | 'reports:read' | 'reports:rollup' | 'messages:read' | 'messages:write' | 'billing:read' | 'billing:manage' | 'quotas:read' | 'registry:read' | 'registry:write' | 'org:settings' | 'org:idp' | 'org:kms' | 'org:impersonation';
16
16
  /** All valid permissions (order determines display order in the picker). */
17
17
  export declare const ALL_PERMISSIONS: readonly Permission[];
18
+ /**
19
+ * Display metadata for one permission: the label + description the
20
+ * permission-picker UI shows, and the category it groups under.
21
+ */
22
+ export interface PermissionMeta {
23
+ id: Permission;
24
+ label: string;
25
+ description: string;
26
+ category: string;
27
+ }
28
+ /**
29
+ * The permission catalog with display metadata, in picker order.
30
+ *
31
+ * This module is the SINGLE catalog for backend and browser alike: it has no
32
+ * runtime dependencies (the only import is a type), so the frontend imports it
33
+ * through the `@pipeline-builder/api-core/permissions` subpath instead of keeping
34
+ * a hand-maintained mirror. Every id in {@link ALL_PERMISSIONS} must appear here
35
+ * exactly once (asserted by `permissions.test.ts`).
36
+ */
37
+ export declare const PERMISSION_CATALOG: readonly PermissionMeta[];
38
+ /** Human label for a permission id (falls back to the raw id for an unknown one). */
39
+ export declare function permissionLabel(id: string): string;
40
+ /** One picker section: a category and the permissions it contains, in catalog order. */
41
+ export interface PermissionCategory {
42
+ category: string;
43
+ permissions: PermissionMeta[];
44
+ }
18
45
  /** Check whether a string is a valid Permission. */
19
46
  export declare function isValidPermission(value: string): value is Permission;
20
47
  /**
@@ -36,6 +63,13 @@ export declare const SUPERADMIN_ONLY_PERMISSIONS: readonly Permission[];
36
63
  export declare const ORG_ASSIGNABLE_PERMISSIONS: readonly Permission[];
37
64
  /** Whether `permission` may be granted through a user-authored custom Role. */
38
65
  export declare function isOrgAssignablePermission(permission: Permission): boolean;
66
+ /**
67
+ * Category → permissions for the custom-Role AUTHORING picker: the catalog minus
68
+ * the {@link SUPERADMIN_ONLY_PERMISSIONS}, with any now-empty category dropped
69
+ * (so "Registry" disappears). The grouped view of
70
+ * {@link ORG_ASSIGNABLE_PERMISSIONS}.
71
+ */
72
+ export declare const ORG_ASSIGNABLE_CATEGORIES: readonly PermissionCategory[];
39
73
  /**
40
74
  * Seed bundle for each built-in Role, keyed by the coarse role it grants.
41
75
  * Consumed by the Role seeder + the startup backfill to populate a built-in