@pipeline-builder/pipeline-core 4.1.15 → 4.1.17

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 (54) hide show
  1. package/lib/cdk.d.ts +1 -0
  2. package/lib/cdk.js +2 -1
  3. package/lib/config/app-config.d.ts +5 -8
  4. package/lib/config/app-config.js +36 -38
  5. package/lib/config/config-types.d.ts +9 -112
  6. package/lib/config/config-types.js +1 -1
  7. package/lib/config/handler-constants.d.ts +12 -3
  8. package/lib/config/handler-constants.js +9 -26
  9. package/lib/config/infrastructure-config.js +44 -43
  10. package/lib/config/server-config.d.ts +1 -1
  11. package/lib/config/server-config.js +33 -32
  12. package/lib/config/service-client.d.ts +3 -7
  13. package/lib/config/service-client.js +5 -11
  14. package/lib/core/artifact-manager.d.ts +0 -17
  15. package/lib/core/artifact-manager.js +1 -17
  16. package/lib/core/metadata-helpers.d.ts +16 -0
  17. package/lib/core/metadata-helpers.js +41 -1
  18. package/lib/core/pipeline-helpers.js +23 -58
  19. package/lib/core/plugin-contract.d.ts +126 -0
  20. package/lib/core/plugin-contract.js +217 -0
  21. package/lib/core/plugin-lookup-envelope.d.ts +14 -0
  22. package/lib/core/plugin-lookup-envelope.js +29 -0
  23. package/lib/core/step-manifest.d.ts +50 -0
  24. package/lib/core/step-manifest.js +47 -0
  25. package/lib/handlers/platform-credential.d.ts +47 -0
  26. package/lib/handlers/platform-credential.js +87 -0
  27. package/lib/handlers/plugin-lookup-handler.d.ts +1 -1
  28. package/lib/handlers/plugin-lookup-handler.js +48 -42
  29. package/lib/index.d.ts +8 -8
  30. package/lib/index.js +10 -9
  31. package/lib/pipeline/pipeline-builder.d.ts +7 -0
  32. package/lib/pipeline/pipeline-builder.js +25 -9
  33. package/lib/pipeline/pipeline-configuration.js +6 -5
  34. package/lib/pipeline/plugin-lookup.d.ts +0 -1
  35. package/lib/pipeline/plugin-lookup.js +55 -23
  36. package/lib/pipeline/plugin-spec.d.ts +41 -0
  37. package/lib/pipeline/plugin-spec.js +1 -1
  38. package/lib/pipeline/stage-builder.d.ts +11 -0
  39. package/lib/pipeline/stage-builder.js +31 -12
  40. package/lib/pipeline/step-manifest-recorder.d.ts +22 -0
  41. package/lib/pipeline/step-manifest-recorder.js +57 -0
  42. package/lib/pipeline/step-types.d.ts +16 -4
  43. package/lib/pipeline/step-types.js +1 -1
  44. package/lib/template/index.d.ts +4 -4
  45. package/lib/template/index.js +5 -5
  46. package/lib/template/plugin-resolver.js +5 -5
  47. package/lib/template/tokenizer.d.ts +4 -0
  48. package/lib/template/tokenizer.js +11 -7
  49. package/lib/testing/exports.json +72 -0
  50. package/package.json +36 -8
  51. package/lib/config/billing-config.d.ts +0 -27
  52. package/lib/config/billing-config.js +0 -534
  53. package/lib/config/entitlements.d.ts +0 -23
  54. package/lib/config/entitlements.js +0 -46
@@ -3,37 +3,20 @@
3
3
  /**
4
4
  * Leaf constants for the PluginLookup Lambda handler.
5
5
  *
6
- * Deliberately dependency-free (only `process.env` reads, no imports) so the
7
- * handler's esbuild bundle stays small — it does not drag in the whole config
8
- * machinery via `app-config.ts`. The handler imports THIS module, not
9
- * `CoreConstants`.
10
- *
11
- * This originally guarded a much sharper edge: `app-config.ts` →
12
- * `infrastructure-config.ts` → `aws-cdk-lib`, which OOM-killed esbuild
13
- * (hundreds of MB, SIGKILL during cold-start synth). That chain is gone —
14
- * `infrastructure-config.ts` is now CDK-free and the constructs live behind the
15
- * `/cdk` entry point — but the dependency-free contract is still worth keeping.
16
- *
17
- * `CoreConstants` (app-config.ts) re-exports these so synth-side consumers
18
- * (api-server, server-config) keep using `CoreConstants.HANDLER_*` unchanged —
19
- * single source of truth lives here.
6
+ * Dependency-free so the handler's esbuild bundle stays small — it does not drag
7
+ * in the config machinery via `app-config.ts`. The handler imports THIS module;
8
+ * `CoreConstants` re-exports the values for synth-side consumers. The Lambda's
9
+ * environment carries only `PLATFORM_SECRET_NAME`, so these are fixed values,
10
+ * not env knobs.
20
11
  */
21
- /** Parse an integer env var, falling back on unset OR malformed (NaN). A raw
22
- * `parseInt` returning NaN silently disables the handler's retry loop / axios
23
- * timeout — breaking every plugin lookup — so guard it. Kept inline to preserve
24
- * this module's dependency-free contract (no imports → small Lambda bundle). */
25
- function envInt(value, fallback) {
26
- const n = parseInt(value ?? '', 10);
27
- return Number.isNaN(n) ? fallback : n;
28
- }
29
12
  /** Default platform URL fallback when PLATFORM_BASE_URL is not set. */
30
13
  export const DEFAULT_PLATFORM_URL = 'https://localhost:8443';
31
14
  /** Custom-resource handler timeout (must be < the Lambda's 30s to allow response handling). */
32
- export const HANDLER_TIMEOUT_MS = envInt(process.env.HANDLER_TIMEOUT_MS, 25000); // 25s
15
+ export const HANDLER_TIMEOUT_MS = 25_000;
33
16
  /** Platform base URL the handler calls; overridable per-request via ResourceProperties.baseURL. */
34
17
  export const HANDLER_DEFAULT_BASE_URL = process.env.PLATFORM_BASE_URL || DEFAULT_PLATFORM_URL;
35
18
  /** Max retries on transient plugin-lookup failures. */
36
- export const HANDLER_MAX_RETRIES = envInt(process.env.HANDLER_MAX_RETRIES, 2);
19
+ export const HANDLER_MAX_RETRIES = 2;
37
20
  /** Base backoff between handler retries (exponential). */
38
- export const HANDLER_RETRY_DELAY_MS = envInt(process.env.HANDLER_RETRY_DELAY_MS, 1000); // 1s
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci1jb25zdGFudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2hhbmRsZXItY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7OztpRkFHaUY7QUFDakYsU0FBUyxNQUFNLENBQUMsS0FBeUIsRUFBRSxRQUFnQjtJQUN6RCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNwQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsd0JBQXdCLENBQUM7QUFFN0QsK0ZBQStGO0FBQy9GLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUV2RixtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxvQkFBb0IsQ0FBQztBQUU5Rix1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFOUUsMERBQTBEO0FBQzFELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIExlYWYgY29uc3RhbnRzIGZvciB0aGUgUGx1Z2luTG9va3VwIExhbWJkYSBoYW5kbGVyLlxuICpcbiAqIERlbGliZXJhdGVseSBkZXBlbmRlbmN5LWZyZWUgKG9ubHkgYHByb2Nlc3MuZW52YCByZWFkcywgbm8gaW1wb3J0cykgc28gdGhlXG4gKiBoYW5kbGVyJ3MgZXNidWlsZCBidW5kbGUgc3RheXMgc21hbGwg4oCUIGl0IGRvZXMgbm90IGRyYWcgaW4gdGhlIHdob2xlIGNvbmZpZ1xuICogbWFjaGluZXJ5IHZpYSBgYXBwLWNvbmZpZy50c2AuIFRoZSBoYW5kbGVyIGltcG9ydHMgVEhJUyBtb2R1bGUsIG5vdFxuICogYENvcmVDb25zdGFudHNgLlxuICpcbiAqIFRoaXMgb3JpZ2luYWxseSBndWFyZGVkIGEgbXVjaCBzaGFycGVyIGVkZ2U6IGBhcHAtY29uZmlnLnRzYCDihpJcbiAqIGBpbmZyYXN0cnVjdHVyZS1jb25maWcudHNgIOKGkiBgYXdzLWNkay1saWJgLCB3aGljaCBPT00ta2lsbGVkIGVzYnVpbGRcbiAqIChodW5kcmVkcyBvZiBNQiwgU0lHS0lMTCBkdXJpbmcgY29sZC1zdGFydCBzeW50aCkuIFRoYXQgY2hhaW4gaXMgZ29uZSDigJRcbiAqIGBpbmZyYXN0cnVjdHVyZS1jb25maWcudHNgIGlzIG5vdyBDREstZnJlZSBhbmQgdGhlIGNvbnN0cnVjdHMgbGl2ZSBiZWhpbmQgdGhlXG4gKiBgL2Nka2AgZW50cnkgcG9pbnQg4oCUIGJ1dCB0aGUgZGVwZW5kZW5jeS1mcmVlIGNvbnRyYWN0IGlzIHN0aWxsIHdvcnRoIGtlZXBpbmcuXG4gKlxuICogYENvcmVDb25zdGFudHNgIChhcHAtY29uZmlnLnRzKSByZS1leHBvcnRzIHRoZXNlIHNvIHN5bnRoLXNpZGUgY29uc3VtZXJzXG4gKiAoYXBpLXNlcnZlciwgc2VydmVyLWNvbmZpZykga2VlcCB1c2luZyBgQ29yZUNvbnN0YW50cy5IQU5ETEVSXypgIHVuY2hhbmdlZCDigJRcbiAqIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggbGl2ZXMgaGVyZS5cbiAqL1xuXG4vKiogUGFyc2UgYW4gaW50ZWdlciBlbnYgdmFyLCBmYWxsaW5nIGJhY2sgb24gdW5zZXQgT1IgbWFsZm9ybWVkIChOYU4pLiBBIHJhd1xuICogIGBwYXJzZUludGAgcmV0dXJuaW5nIE5hTiBzaWxlbnRseSBkaXNhYmxlcyB0aGUgaGFuZGxlcidzIHJldHJ5IGxvb3AgLyBheGlvc1xuICogIHRpbWVvdXQg4oCUIGJyZWFraW5nIGV2ZXJ5IHBsdWdpbiBsb29rdXAg4oCUIHNvIGd1YXJkIGl0LiBLZXB0IGlubGluZSB0byBwcmVzZXJ2ZVxuICogIHRoaXMgbW9kdWxlJ3MgZGVwZW5kZW5jeS1mcmVlIGNvbnRyYWN0IChubyBpbXBvcnRzIOKGkiBzbWFsbCBMYW1iZGEgYnVuZGxlKS4gKi9cbmZ1bmN0aW9uIGVudkludCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IHBhcnNlSW50KHZhbHVlID8/ICcnLCAxMCk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4obikgPyBmYWxsYmFjayA6IG47XG59XG5cbi8qKiBEZWZhdWx0IHBsYXRmb3JtIFVSTCBmYWxsYmFjayB3aGVuIFBMQVRGT1JNX0JBU0VfVVJMIGlzIG5vdCBzZXQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QTEFURk9STV9VUkwgPSAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODQ0Myc7XG5cbi8qKiBDdXN0b20tcmVzb3VyY2UgaGFuZGxlciB0aW1lb3V0IChtdXN0IGJlIDwgdGhlIExhbWJkYSdzIDMwcyB0byBhbGxvdyByZXNwb25zZSBoYW5kbGluZykuICovXG5leHBvcnQgY29uc3QgSEFORExFUl9USU1FT1VUX01TID0gZW52SW50KHByb2Nlc3MuZW52LkhBTkRMRVJfVElNRU9VVF9NUywgMjUwMDApOyAvLyAyNXNcblxuLyoqIFBsYXRmb3JtIGJhc2UgVVJMIHRoZSBoYW5kbGVyIGNhbGxzOyBvdmVycmlkYWJsZSBwZXItcmVxdWVzdCB2aWEgUmVzb3VyY2VQcm9wZXJ0aWVzLmJhc2VVUkwuICovXG5leHBvcnQgY29uc3QgSEFORExFUl9ERUZBVUxUX0JBU0VfVVJMID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkwgfHwgREVGQVVMVF9QTEFURk9STV9VUkw7XG5cbi8qKiBNYXggcmV0cmllcyBvbiB0cmFuc2llbnQgcGx1Z2luLWxvb2t1cCBmYWlsdXJlcy4gKi9cbmV4cG9ydCBjb25zdCBIQU5ETEVSX01BWF9SRVRSSUVTID0gZW52SW50KHByb2Nlc3MuZW52LkhBTkRMRVJfTUFYX1JFVFJJRVMsIDIpO1xuXG4vKiogQmFzZSBiYWNrb2ZmIGJldHdlZW4gaGFuZGxlciByZXRyaWVzIChleHBvbmVudGlhbCkuICovXG5leHBvcnQgY29uc3QgSEFORExFUl9SRVRSWV9ERUxBWV9NUyA9IGVudkludChwcm9jZXNzLmVudi5IQU5ETEVSX1JFVFJZX0RFTEFZX01TLCAxMDAwKTsgLy8gMXNcbiJdfQ==
21
+ export const HANDLER_RETRY_DELAY_MS = 1000;
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci1jb25zdGFudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2hhbmRsZXItY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7O0dBUUc7QUFFSCx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsd0JBQXdCLENBQUM7QUFFN0QsK0ZBQStGO0FBQy9GLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUV6QyxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxvQkFBb0IsQ0FBQztBQUU5Rix1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRXJDLDBEQUEwRDtBQUMxRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBMZWFmIGNvbnN0YW50cyBmb3IgdGhlIFBsdWdpbkxvb2t1cCBMYW1iZGEgaGFuZGxlci5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgc28gdGhlIGhhbmRsZXIncyBlc2J1aWxkIGJ1bmRsZSBzdGF5cyBzbWFsbCDigJQgaXQgZG9lcyBub3QgZHJhZ1xuICogaW4gdGhlIGNvbmZpZyBtYWNoaW5lcnkgdmlhIGBhcHAtY29uZmlnLnRzYC4gVGhlIGhhbmRsZXIgaW1wb3J0cyBUSElTIG1vZHVsZTtcbiAqIGBDb3JlQ29uc3RhbnRzYCByZS1leHBvcnRzIHRoZSB2YWx1ZXMgZm9yIHN5bnRoLXNpZGUgY29uc3VtZXJzLiBUaGUgTGFtYmRhJ3NcbiAqIGVudmlyb25tZW50IGNhcnJpZXMgb25seSBgUExBVEZPUk1fU0VDUkVUX05BTUVgLCBzbyB0aGVzZSBhcmUgZml4ZWQgdmFsdWVzLFxuICogbm90IGVudiBrbm9icy5cbiAqL1xuXG4vKiogRGVmYXVsdCBwbGF0Zm9ybSBVUkwgZmFsbGJhY2sgd2hlbiBQTEFURk9STV9CQVNFX1VSTCBpcyBub3Qgc2V0LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExBVEZPUk1fVVJMID0gJ2h0dHBzOi8vbG9jYWxob3N0Ojg0NDMnO1xuXG4vKiogQ3VzdG9tLXJlc291cmNlIGhhbmRsZXIgdGltZW91dCAobXVzdCBiZSA8IHRoZSBMYW1iZGEncyAzMHMgdG8gYWxsb3cgcmVzcG9uc2UgaGFuZGxpbmcpLiAqL1xuZXhwb3J0IGNvbnN0IEhBTkRMRVJfVElNRU9VVF9NUyA9IDI1XzAwMDtcblxuLyoqIFBsYXRmb3JtIGJhc2UgVVJMIHRoZSBoYW5kbGVyIGNhbGxzOyBvdmVycmlkYWJsZSBwZXItcmVxdWVzdCB2aWEgUmVzb3VyY2VQcm9wZXJ0aWVzLmJhc2VVUkwuICovXG5leHBvcnQgY29uc3QgSEFORExFUl9ERUZBVUxUX0JBU0VfVVJMID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkwgfHwgREVGQVVMVF9QTEFURk9STV9VUkw7XG5cbi8qKiBNYXggcmV0cmllcyBvbiB0cmFuc2llbnQgcGx1Z2luLWxvb2t1cCBmYWlsdXJlcy4gKi9cbmV4cG9ydCBjb25zdCBIQU5ETEVSX01BWF9SRVRSSUVTID0gMjtcblxuLyoqIEJhc2UgYmFja29mZiBiZXR3ZWVuIGhhbmRsZXIgcmV0cmllcyAoZXhwb25lbnRpYWwpLiAqL1xuZXhwb3J0IGNvbnN0IEhBTkRMRVJfUkVUUllfREVMQVlfTVMgPSAxMDAwO1xuIl19
@@ -1,5 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { envBool, envInt, envStr } from '@pipeline-builder/api-core';
3
4
  import path from 'path';
4
5
  /**
5
6
  * Load Docker registry configuration from environment variables.
@@ -19,8 +20,8 @@ import path from 'path';
19
20
  * @returns Registry configuration
20
21
  */
21
22
  export function loadRegistryConfig() {
22
- const host = process.env.IMAGE_REGISTRY_HOST || 'registry';
23
- const port = parseInt(process.env.IMAGE_REGISTRY_PORT || '5000', 10);
23
+ const host = envStr('IMAGE_REGISTRY_HOST', 'registry');
24
+ const port = envInt('IMAGE_REGISTRY_PORT', 5_000);
24
25
  // When no explicit pull host is set, derive it from PLATFORM_BASE_URL — the
25
26
  // public platform endpoint an out-of-cluster client (AWS CodeBuild) can
26
27
  // resolve, unlike the in-cluster `registry` ClusterIP. Only falls back to the
@@ -31,10 +32,10 @@ export function loadRegistryConfig() {
31
32
  port,
32
33
  pullHost: process.env.IMAGE_REGISTRY_PULL_HOST || platform?.host || host,
33
34
  pullPort: process.env.IMAGE_REGISTRY_PULL_PORT
34
- ? parseInt(process.env.IMAGE_REGISTRY_PULL_PORT, 10)
35
+ ? envInt('IMAGE_REGISTRY_PULL_PORT', port)
35
36
  : (platform?.port ?? port),
36
- network: process.env.DOCKER_NETWORK || '',
37
- http: process.env.IMAGE_REGISTRY_HTTP !== 'false',
37
+ network: envStr('DOCKER_NETWORK', ''),
38
+ http: envBool('IMAGE_REGISTRY_HTTP', true),
38
39
  };
39
40
  }
40
41
  /** Extract host + port from PLATFORM_BASE_URL (e.g. `https://pipeline-builder.com`
@@ -66,50 +67,50 @@ export function parsePlatformBaseUrl(raw) {
66
67
  */
67
68
  export function loadPluginBuildConfig() {
68
69
  return {
69
- concurrency: parseInt(process.env.PLUGIN_BUILD_CONCURRENCY || '1', 10),
70
- maxAttempts: parseInt(process.env.PLUGIN_BUILD_MAX_ATTEMPTS || '2', 10),
71
- backoffDelayMs: parseInt(process.env.PLUGIN_BUILD_BACKOFF_DELAY_MS || '5000', 10),
72
- workerTimeoutMs: parseInt(process.env.PLUGIN_BUILD_WORKER_TIMEOUT_MS || '10000', 10),
73
- tempDirMaxAgeMs: parseInt(process.env.TEMP_DIR_MAX_AGE_MS || '14400000', 10),
74
- dlqMaxAttempts: parseInt(process.env.PLUGIN_DLQ_MAX_ATTEMPTS || '3', 10),
75
- dlqBackoffBaseMs: parseInt(process.env.PLUGIN_DLQ_BACKOFF_BASE_MS || '300000', 10),
76
- dlqMaxSize: parseInt(process.env.PLUGIN_DLQ_MAX_SIZE || '20', 10),
70
+ concurrency: envInt('PLUGIN_BUILD_CONCURRENCY', 1),
71
+ maxAttempts: envInt('PLUGIN_BUILD_MAX_ATTEMPTS', 2),
72
+ backoffDelayMs: envInt('PLUGIN_BUILD_BACKOFF_DELAY_MS', 5_000),
73
+ workerTimeoutMs: envInt('PLUGIN_BUILD_WORKER_TIMEOUT_MS', 10_000),
74
+ tempDirMaxAgeMs: envInt('TEMP_DIR_MAX_AGE_MS', 14_400_000),
75
+ dlqMaxAttempts: envInt('PLUGIN_DLQ_MAX_ATTEMPTS', 3),
76
+ dlqBackoffBaseMs: envInt('PLUGIN_DLQ_BACKOFF_BASE_MS', 300_000),
77
+ dlqMaxSize: envInt('PLUGIN_DLQ_MAX_SIZE', 20),
77
78
  };
78
79
  }
79
80
  export function loadDatabaseConfig() {
80
81
  return {
81
82
  postgres: {
82
- host: process.env.DB_HOST || 'postgres',
83
- port: parseInt(process.env.DB_PORT || '5432', 10),
84
- database: process.env.DATABASE || 'pipeline_builder',
85
- user: process.env.DB_USER || 'postgres',
86
- password: process.env.DB_PASSWORD || '',
83
+ host: envStr('DB_HOST', 'postgres'),
84
+ port: envInt('DB_PORT', 5_432),
85
+ database: envStr('DATABASE', 'pipeline_builder'),
86
+ user: envStr('DB_USER', 'postgres'),
87
+ password: envStr('DB_PASSWORD', ''),
87
88
  },
88
89
  drizzle: {
89
- maxPoolSize: parseInt(process.env.DRIZZLE_MAX_POOL_SIZE || '20', 10),
90
- idleTimeoutMillis: parseInt(process.env.DRIZZLE_IDLE_TIMEOUT_MILLIS || '30000', 10),
91
- connectionTimeoutMillis: parseInt(process.env.DRIZZLE_CONNECTION_TIMEOUT_MILLIS || '10000', 10),
90
+ maxPoolSize: envInt('DRIZZLE_MAX_POOL_SIZE', 20),
91
+ idleTimeoutMillis: envInt('DRIZZLE_IDLE_TIMEOUT_MILLIS', 30_000),
92
+ connectionTimeoutMillis: envInt('DRIZZLE_CONNECTION_TIMEOUT_MILLIS', 10_000),
92
93
  },
93
94
  };
94
95
  }
95
96
  export function loadObservabilityConfig() {
96
97
  return {
97
- logLevel: process.env.LOG_LEVEL || 'info',
98
- logFormat: process.env.LOG_FORMAT || 'json',
99
- serviceName: process.env.SERVICE_NAME || 'api',
98
+ logLevel: envStr('LOG_LEVEL', 'info'),
99
+ logFormat: envStr('LOG_FORMAT', 'json'),
100
+ serviceName: envStr('SERVICE_NAME', 'api'),
100
101
  tracing: {
101
- enabled: process.env.OTEL_TRACING_ENABLED === 'true',
102
- endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces',
102
+ enabled: envBool('OTEL_TRACING_ENABLED', false),
103
+ endpoint: envStr('OTEL_EXPORTER_OTLP_ENDPOINT', 'http://localhost:4318/v1/traces'),
103
104
  },
104
105
  };
105
106
  }
106
107
  export function loadComplianceConfig() {
107
108
  return {
108
- scanSchedulerIntervalMs: parseInt(process.env.SCAN_SCHEDULER_INTERVAL_MS || '60000', 10),
109
- systemOrgScansEnabled: process.env.SYSTEM_ORG_SCANS_ENABLED === 'true',
110
- scanLockTtlMs: parseInt(process.env.SCAN_LOCK_TTL_MS || '300000', 10),
111
- digestSchedulerIntervalMs: parseInt(process.env.DIGEST_SCHEDULER_INTERVAL_MS || '3600000', 10),
112
- digestLockTtlMs: parseInt(process.env.DIGEST_LOCK_TTL_MS || '300000', 10),
109
+ scanSchedulerIntervalMs: envInt('SCAN_SCHEDULER_INTERVAL_MS', 60_000),
110
+ systemOrgScansEnabled: envBool('SYSTEM_ORG_SCANS_ENABLED', false),
111
+ scanLockTtlMs: envInt('SCAN_LOCK_TTL_MS', 300_000),
112
+ digestSchedulerIntervalMs: envInt('DIGEST_SCHEDULER_INTERVAL_MS', 3_600_000),
113
+ digestLockTtlMs: envInt('DIGEST_LOCK_TTL_MS', 300_000),
113
114
  };
114
115
  }
115
116
  /**
@@ -128,10 +129,10 @@ export function loadComplianceConfig() {
128
129
  export function loadDockerConfig() {
129
130
  return {
130
131
  tempRoot: process.env.DOCKER_BUILD_TEMP_ROOT || path.join(process.cwd(), 'tmp'),
131
- timeoutMs: parseInt(process.env.DOCKER_BUILD_TIMEOUT_MS || '900000', 10),
132
- pushTimeoutMs: parseInt(process.env.DOCKER_PUSH_TIMEOUT_MS || '300000', 10),
133
- buildkitAddr: process.env.BUILDKIT_HOST || 'unix:///run/buildkit/buildkitd.sock',
134
- signingPublicKeyFile: process.env.PLUGIN_SIGNING_PUBLIC_KEY_FILE || '/etc/pipeline-builder/plugin-signing/plugin-signing.pub',
132
+ timeoutMs: envInt('DOCKER_BUILD_TIMEOUT_MS', 900_000),
133
+ pushTimeoutMs: envInt('DOCKER_PUSH_TIMEOUT_MS', 300_000),
134
+ buildkitAddr: envStr('BUILDKIT_HOST', 'unix:///run/buildkit/buildkitd.sock'),
135
+ signingPublicKeyFile: envStr('PLUGIN_SIGNING_PUBLIC_KEY_FILE', '/etc/pipeline-builder/plugin-signing/plugin-signing.pub'),
135
136
  };
136
137
  }
137
138
  /**
@@ -150,21 +151,21 @@ export function loadDockerConfig() {
150
151
  export function loadAWSConfig() {
151
152
  return {
152
153
  lambda: {
153
- runtime: process.env.LAMBDA_RUNTIME || 'nodejs24.x',
154
- timeoutSeconds: parseInt(process.env.LAMBDA_TIMEOUT || '900', 10),
155
- memorySize: parseInt(process.env.LAMBDA_MEMORY_SIZE || '512', 10),
154
+ runtime: envStr('LAMBDA_RUNTIME', 'nodejs24.x'),
155
+ timeoutSeconds: envInt('LAMBDA_TIMEOUT', 900),
156
+ memorySize: envInt('LAMBDA_MEMORY_SIZE', 512),
156
157
  architecture: process.env.LAMBDA_ARCHITECTURE === 'x86_64' ? 'x86_64' : 'arm64',
157
158
  reservedConcurrentExecutions: process.env.LAMBDA_RESERVED_CONCURRENCY
158
- ? parseInt(process.env.LAMBDA_RESERVED_CONCURRENCY, 10)
159
+ ? envInt('LAMBDA_RESERVED_CONCURRENCY', 0)
159
160
  : undefined,
160
161
  },
161
162
  logging: {
162
- groupName: process.env.LOG_GROUP_NAME || '/pipeline-builder/logs',
163
+ groupName: envStr('LOG_GROUP_NAME', '/pipeline-builder/logs'),
163
164
  },
164
165
  codeBuild: {
165
- computeType: (process.env.CODEBUILD_COMPUTE_TYPE || 'SMALL').toUpperCase(),
166
- defaultImage: process.env.CODEBUILD_DEFAULT_IMAGE || 'pipeline-bootstrap:1.0',
166
+ computeType: (envStr('CODEBUILD_COMPUTE_TYPE', 'SMALL')).toUpperCase(),
167
+ defaultImage: envStr('CODEBUILD_DEFAULT_IMAGE', 'pipeline-bootstrap:1.0'),
167
168
  },
168
169
  };
169
170
  }
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mcmFzdHJ1Y3R1cmUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9pbmZyYXN0cnVjdHVyZS1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFHeEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksVUFBVSxDQUFDO0lBQzNELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JFLE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSTtRQUNKLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFFBQVEsRUFBRSxJQUFJLElBQUksSUFBSTtRQUN4RSxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0I7WUFDNUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQztZQUNwRCxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQztRQUM1QixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksRUFBRTtRQUN6QyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsS0FBSyxPQUFPO0tBQ2xELENBQUM7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QUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksd0JBQXdCO1NBQ2xFO1FBRUQsU0FBUyxFQUFFO1lBQ1QsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsSUFBSSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDMUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksd0JBQXdCO1NBQzlFO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IEFXU0NvbmZpZywgQnVpbGRDb25maWcsIENvbXBsaWFuY2VDb25maWcsIERhdGFiYXNlQ29uZmlnLCBPYnNlcnZhYmlsaXR5Q29uZmlnLCBQbHVnaW5CdWlsZENvbmZpZywgUmVnaXN0cnlDb25maWcgfSBmcm9tICcuL2NvbmZpZy10eXBlcy5qcyc7XG5cbi8qKlxuICogTG9hZCBEb2NrZXIgcmVnaXN0cnkgY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIGBJTUFHRV9SRUdJU1RSWV9IT1NUYCDigJQgUmVnaXN0cnkgaG9zdG5hbWUgKGRlZmF1bHQ6IGAncmVnaXN0cnknYClcbiAqIC0gYElNQUdFX1JFR0lTVFJZX1BPUlRgIOKAlCBSZWdpc3RyeSBwb3J0IChkZWZhdWx0OiBgNTAwMGApXG4gKiAtIGBJTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1RgIOKAlCBIb3N0IGFuIG91dC1vZi1jbHVzdGVyIGNsaWVudCAoQ29kZUJ1aWxkKVxuICogICB1c2VzIHRvIHB1bGwgcGx1Z2luIGltYWdlcy4gV2hlbiB1bnNldCwgZGVyaXZlZCBmcm9tIGBQTEFURk9STV9CQVNFX1VSTGAnc1xuICogICBob3N0ICh0aGUgcHVibGljIGVuZHBvaW50IENvZGVCdWlsZCBjYW4gcmVzb2x2ZSksIHRoZW4gYElNQUdFX1JFR0lTVFJZX0hPU1RgLlxuICogLSBgSU1BR0VfUkVHSVNUUllfUFVMTF9QT1JUYCDigJQgUG9ydCBmb3IgdGhlIGFib3ZlLiBXaGVuIHVuc2V0LCBkZXJpdmVkIGZyb21cbiAqICAgYFBMQVRGT1JNX0JBU0VfVVJMYCdzIHBvcnQsIHRoZW4gYElNQUdFX1JFR0lTVFJZX1BPUlRgLlxuICogLSBgRE9DS0VSX05FVFdPUktgIOKAlCBEb2NrZXIgbmV0d29yayBmb3IgYnVpbGQvcHVzaCAoZGVmYXVsdDogYCcnYClcbiAqIC0gYElNQUdFX1JFR0lTVFJZX0hUVFBgIOKAlCBVc2UgcGxhaW4gSFRUUCBpbnN0ZWFkIG9mIEhUVFBTIChkZWZhdWx0OiBgdHJ1ZWAsXG4gKiAgIHRoZSBpbi1jbHVzdGVyIHJlZ2lzdHJ5IGhhcyBubyBUTFMpLlxuICpcbiAqIEByZXR1cm5zIFJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRSZWdpc3RyeUNvbmZpZygpOiBSZWdpc3RyeUNvbmZpZyB7XG4gIGNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5JTUFHRV9SRUdJU1RSWV9IT1NUIHx8ICdyZWdpc3RyeSc7XG4gIGNvbnN0IHBvcnQgPSBwYXJzZUludChwcm9jZXNzLmVudi5JTUFHRV9SRUdJU1RSWV9QT1JUIHx8ICc1MDAwJywgMTApO1xuICAvLyBXaGVuIG5vIGV4cGxpY2l0IHB1bGwgaG9zdCBpcyBzZXQsIGRlcml2ZSBpdCBmcm9tIFBMQVRGT1JNX0JBU0VfVVJMIOKAlCB0aGVcbiAgLy8gcHVibGljIHBsYXRmb3JtIGVuZHBvaW50IGFuIG91dC1vZi1jbHVzdGVyIGNsaWVudCAoQVdTIENvZGVCdWlsZCkgY2FuXG4gIC8vIHJlc29sdmUsIHVubGlrZSB0aGUgaW4tY2x1c3RlciBgcmVnaXN0cnlgIENsdXN0ZXJJUC4gT25seSBmYWxscyBiYWNrIHRvIHRoZVxuICAvLyBpbi1jbHVzdGVyIGhvc3Qgd2hlbiBQTEFURk9STV9CQVNFX1VSTCBpcyB1bnNldC91bnBhcnNlYWJsZSAoZS5nLiBsb2NhbCkuXG4gIGNvbnN0IHBsYXRmb3JtID0gcGFyc2VQbGF0Zm9ybUJhc2VVcmwocHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkwpO1xuICByZXR1cm4ge1xuICAgIGhvc3QsXG4gICAgcG9ydCxcbiAgICBwdWxsSG9zdDogcHJvY2Vzcy5lbnYuSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIHx8IHBsYXRmb3JtPy5ob3N0IHx8IGhvc3QsXG4gICAgcHVsbFBvcnQ6IHByb2Nlc3MuZW52LklNQUdFX1JFR0lTVFJZX1BVTExfUE9SVFxuICAgICAgPyBwYXJzZUludChwcm9jZXNzLmVudi5JTUFHRV9SRUdJU1RSWV9QVUxMX1BPUlQsIDEwKVxuICAgICAgOiAocGxhdGZvcm0/LnBvcnQgPz8gcG9ydCksXG4gICAgbmV0d29yazogcHJvY2Vzcy5lbnYuRE9DS0VSX05FVFdPUksgfHwgJycsXG4gICAgaHR0cDogcHJvY2Vzcy5lbnYuSU1BR0VfUkVHSVNUUllfSFRUUCAhPT0gJ2ZhbHNlJyxcbiAgfTtcbn1cblxuLyoqIEV4dHJhY3QgaG9zdCArIHBvcnQgZnJvbSBQTEFURk9STV9CQVNFX1VSTCAoZS5nLiBgaHR0cHM6Ly9waXBlbGluZS1idWlsZGVyLmNvbWBcbiAqICDihpIgYHsgaG9zdDogJ3BpcGVsaW5lLWJ1aWxkZXIuY29tJywgcG9ydDogNDQzIH1gKS4gUmV0dXJucyBudWxsIHdoZW4gdGhlIHZhbHVlXG4gKiAgaXMgdW5zZXQgb3Igbm90IGEgdmFsaWQgVVJMLiBFeHBvcnRlZCBzbyB0aGUgQ0xJIChwaXBlbGluZS1tYW5hZ2VyKSBkZXJpdmVzXG4gKiAgdGhlIHJlZ2lzdHJ5IHB1bGwgdGFyZ2V0IHdpdGggdGhlIFNBTUUgcGFyc2luZywgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBsYXRmb3JtQmFzZVVybChyYXc/OiBzdHJpbmcpOiB7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0gfCBudWxsIHtcbiAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHUgPSBuZXcgVVJMKHJhdyk7XG4gICAgLy8gQSBzY2hlbWUtbGVzcyB2YWx1ZSBsaWtlIGBob3N0Ojg0NDNgIHBhcnNlcyB3aXRoIGEgY3VzdG9tIHByb3RvY29sIGFuZCBhblxuICAgIC8vIEVNUFRZIGhvc3RuYW1lIOKAlCByZWplY3QgaXQgc28gY2FsbGVycyBmYWxsIGJhY2sgcmF0aGVyIHRoYW4gZGVyaXZlIGFcbiAgICAvLyBob3N0LWxlc3MgZW5kcG9pbnQuXG4gICAgaWYgKCF1Lmhvc3RuYW1lKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBwb3J0ID0gdS5wb3J0ID8gcGFyc2VJbnQodS5wb3J0LCAxMCkgOiAodS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MCk7XG4gICAgcmV0dXJuIHsgaG9zdDogdS5ob3N0bmFtZSwgcG9ydCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgcGx1Z2luIGJ1aWxkIHF1ZXVlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBgUExVR0lOX0JVSUxEX0NPTkNVUlJFTkNZYCDigJQgTWF4IGNvbmN1cnJlbnQgcGx1Z2luIGJ1aWxkcyAoZGVmYXVsdDogYDFgKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFBsdWdpbkJ1aWxkQ29uZmlnKCk6IFBsdWdpbkJ1aWxkQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBjb25jdXJyZW5jeTogcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExVR0lOX0JVSUxEX0NPTkNVUlJFTkNZIHx8ICcxJywgMTApLFxuICAgIG1heEF0dGVtcHRzOiBwYXJzZUludChwcm9jZXNzLmVudi5QTFVHSU5fQlVJTERfTUFYX0FUVEVNUFRTIHx8ICcyJywgMTApLFxuICAgIGJhY2tvZmZEZWxheU1zOiBwYXJzZUludChwcm9jZXNzLmVudi5QTFVHSU5fQlVJTERfQkFDS09GRl9ERUxBWV9NUyB8fCAnNTAwMCcsIDEwKSxcbiAgICB3b3JrZXJUaW1lb3V0TXM6IHBhcnNlSW50KHByb2Nlc3MuZW52LlBMVUdJTl9CVUlMRF9XT1JLRVJfVElNRU9VVF9NUyB8fCAnMTAwMDAnLCAxMCksXG4gICAgdGVtcERpck1heEFnZU1zOiBwYXJzZUludChwcm9jZXNzLmVudi5URU1QX0RJUl9NQVhfQUdFX01TIHx8ICcxNDQwMDAwMCcsIDEwKSxcbiAgICBkbHFNYXhBdHRlbXB0czogcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExVR0lOX0RMUV9NQVhfQVRURU1QVFMgfHwgJzMnLCAxMCksXG4gICAgZGxxQmFja29mZkJhc2VNczogcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExVR0lOX0RMUV9CQUNLT0ZGX0JBU0VfTVMgfHwgJzMwMDAwMCcsIDEwKSxcbiAgICBkbHFNYXhTaXplOiBwYXJzZUludChwcm9jZXNzLmVudi5QTFVHSU5fRExRX01BWF9TSVpFIHx8ICcyMCcsIDEwKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWREYXRhYmFzZUNvbmZpZygpOiBEYXRhYmFzZUNvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgcG9zdGdyZXM6IHtcbiAgICAgIGhvc3Q6IHByb2Nlc3MuZW52LkRCX0hPU1QgfHwgJ3Bvc3RncmVzJyxcbiAgICAgIHBvcnQ6IHBhcnNlSW50KHByb2Nlc3MuZW52LkRCX1BPUlQgfHwgJzU0MzInLCAxMCksXG4gICAgICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuREFUQUJBU0UgfHwgJ3BpcGVsaW5lX2J1aWxkZXInLFxuICAgICAgdXNlcjogcHJvY2Vzcy5lbnYuREJfVVNFUiB8fCAncG9zdGdyZXMnLFxuICAgICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LkRCX1BBU1NXT1JEIHx8ICcnLFxuICAgIH0sXG4gICAgZHJpenpsZToge1xuICAgICAgbWF4UG9vbFNpemU6IHBhcnNlSW50KHByb2Nlc3MuZW52LkRSSVpaTEVfTUFYX1BPT0xfU0laRSB8fCAnMjAnLCAxMCksXG4gICAgICBpZGxlVGltZW91dE1pbGxpczogcGFyc2VJbnQocHJvY2Vzcy5lbnYuRFJJWlpMRV9JRExFX1RJTUVPVVRfTUlMTElTIHx8ICczMDAwMCcsIDEwKSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBwYXJzZUludChwcm9jZXNzLmVudi5EUklaWkxFX0NPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMgfHwgJzEwMDAwJywgMTApLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkT2JzZXJ2YWJpbGl0eUNvbmZpZygpOiBPYnNlcnZhYmlsaXR5Q29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBsb2dMZXZlbDogcHJvY2Vzcy5lbnYuTE9HX0xFVkVMIHx8ICdpbmZvJyxcbiAgICBsb2dGb3JtYXQ6IHByb2Nlc3MuZW52LkxPR19GT1JNQVQgfHwgJ2pzb24nLFxuICAgIHNlcnZpY2VOYW1lOiBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ2FwaScsXG4gICAgdHJhY2luZzoge1xuICAgICAgZW5hYmxlZDogcHJvY2Vzcy5lbnYuT1RFTF9UUkFDSU5HX0VOQUJMRUQgPT09ICd0cnVlJyxcbiAgICAgIGVuZHBvaW50OiBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQgfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6NDMxOC92MS90cmFjZXMnLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29tcGxpYW5jZUNvbmZpZygpOiBDb21wbGlhbmNlQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBzY2FuU2NoZWR1bGVySW50ZXJ2YWxNczogcGFyc2VJbnQocHJvY2Vzcy5lbnYuU0NBTl9TQ0hFRFVMRVJfSU5URVJWQUxfTVMgfHwgJzYwMDAwJywgMTApLFxuICAgIHN5c3RlbU9yZ1NjYW5zRW5hYmxlZDogcHJvY2Vzcy5lbnYuU1lTVEVNX09SR19TQ0FOU19FTkFCTEVEID09PSAndHJ1ZScsXG4gICAgc2NhbkxvY2tUdGxNczogcGFyc2VJbnQocHJvY2Vzcy5lbnYuU0NBTl9MT0NLX1RUTF9NUyB8fCAnMzAwMDAwJywgMTApLFxuICAgIGRpZ2VzdFNjaGVkdWxlckludGVydmFsTXM6IHBhcnNlSW50KHByb2Nlc3MuZW52LkRJR0VTVF9TQ0hFRFVMRVJfSU5URVJWQUxfTVMgfHwgJzM2MDAwMDAnLCAxMCksXG4gICAgZGlnZXN0TG9ja1R0bE1zOiBwYXJzZUludChwcm9jZXNzLmVudi5ESUdFU1RfTE9DS19UVExfTVMgfHwgJzMwMDAwMCcsIDEwKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMb2FkIHBsdWdpbiBidWlsZCBjb25maWd1cmF0aW9uLiBCdWlsZHMgcnVuIGFnYWluc3QgYSByb290bGVzcyBgbW9ieS9idWlsZGtpdGBcbiAqIHNpZGVjYXIg4oCUIHNlZSBgQlVJTERLSVRfSE9TVGAuXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBgRE9DS0VSX0JVSUxEX1RFTVBfUk9PVGAg4oCUIFRlbXAgZGlyZWN0b3J5IGZvciBidWlsZCBjb250ZXh0cyAoZGVmYXVsdDogYDxjd2Q+L3RtcGApXG4gKiAtIGBET0NLRVJfQlVJTERfVElNRU9VVF9NU2Ag4oCUIEJ1aWxkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiBgOTAwMDAwYCAvIDE1IG1pbilcbiAqIC0gYERPQ0tFUl9QVVNIX1RJTUVPVVRfTVNgIOKAlCBQdXNoIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiBgMzAwMDAwYCAvIDUgbWluKVxuICogLSBgQlVJTERLSVRfSE9TVGAg4oCUIGJ1aWxkY3RsIGAtLWFkZHJgIHZhbHVlIGZvciB0aGUgYnVpbGRraXRkIHNpZGVjYXJcbiAqICAgKGRlZmF1bHQ6IGB1bml4Oi8vL3J1bi9idWlsZGtpdC9idWlsZGtpdGQuc29ja2ApXG4gKiAtIGBQTFVHSU5fU0lHTklOR19QVUJMSUNfS0VZX0ZJTEVgIOKAlCBQRU0gcHVibGljIGtleSBwbHVnaW4gaW1hZ2VzIGFyZSB2ZXJpZmllZFxuICogICBhZ2FpbnN0IChkZWZhdWx0OiBgL2V0Yy9waXBlbGluZS1idWlsZGVyL3BsdWdpbi1zaWduaW5nL3BsdWdpbi1zaWduaW5nLnB1YmApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRG9ja2VyQ29uZmlnKCk6IEJ1aWxkQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICB0ZW1wUm9vdDogcHJvY2Vzcy5lbnYuRE9DS0VSX0JVSUxEX1RFTVBfUk9PVCB8fCBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RtcCcpLFxuICAgIHRpbWVvdXRNczogcGFyc2VJbnQocHJvY2Vzcy5lbnYuRE9DS0VSX0JVSUxEX1RJTUVPVVRfTVMgfHwgJzkwMDAwMCcsIDEwKSxcbiAgICBwdXNoVGltZW91dE1zOiBwYXJzZUludChwcm9jZXNzLmVudi5ET0NLRVJfUFVTSF9USU1FT1VUX01TIHx8ICczMDAwMDAnLCAxMCksXG4gICAgYnVpbGRraXRBZGRyOiBwcm9jZXNzLmVudi5CVUlMREtJVF9IT1NUIHx8ICd1bml4Oi8vL3J1bi9idWlsZGtpdC9idWlsZGtpdGQuc29jaycsXG4gICAgc2lnbmluZ1B1YmxpY0tleUZpbGU6IHByb2Nlc3MuZW52LlBMVUdJTl9TSUdOSU5HX1BVQkxJQ19LRVlfRklMRSB8fCAnL2V0Yy9waXBlbGluZS1idWlsZGVyL3BsdWdpbi1zaWduaW5nL3BsdWdpbi1zaWduaW5nLnB1YicsXG4gIH07XG59XG5cbi8qKlxuICogTG9hZCBBV1MgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIGBMQU1CREFfUlVOVElNRWAg4oCUIExhbWJkYSBydW50aW1lIChkZWZhdWx0OiBgJ25vZGVqczI0LngnYDsgdW5rbm93biB2YWx1ZXMgZmFsbCBiYWNrIHRvIGl0KVxuICogLSBgTEFNQkRBX1RJTUVPVVRgIOKAlCBMYW1iZGEgdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiBgOTAwYClcbiAqIC0gYExBTUJEQV9NRU1PUllfU0laRWAg4oCUIExhbWJkYSBtZW1vcnkgaW4gTUIgKGRlZmF1bHQ6IGA1MTJgKVxuICogLSBgTEFNQkRBX0FSQ0hJVEVDVFVSRWAg4oCUIGAneDg2XzY0J2Agb3IgQVJNIChkZWZhdWx0OiBBUk1fNjQpXG4gKiAtIGBMT0dfR1JPVVBfTkFNRWAg4oCUIENsb3VkV2F0Y2ggbG9nIGdyb3VwIChkZWZhdWx0OiBgJy9waXBlbGluZS1idWlsZGVyL2xvZ3MnYClcbiAqIC0gYENPREVCVUlMRF9DT01QVVRFX1RZUEVgIOKAlCBDb2RlQnVpbGQgY29tcHV0ZSB0eXBlIChkZWZhdWx0OiBgJ1NNQUxMJ2ApXG4gKlxuICogQHJldHVybnMgQVdTIGluZnJhc3RydWN0dXJlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBV1NDb25maWcoKTogQVdTQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBsYW1iZGE6IHtcbiAgICAgIHJ1bnRpbWU6IHByb2Nlc3MuZW52LkxBTUJEQV9SVU5USU1FIHx8ICdub2RlanMyNC54JyxcbiAgICAgIHRpbWVvdXRTZWNvbmRzOiBwYXJzZUludChwcm9jZXNzLmVudi5MQU1CREFfVElNRU9VVCB8fCAnOTAwJywgMTApLFxuICAgICAgbWVtb3J5U2l6ZTogcGFyc2VJbnQocHJvY2Vzcy5lbnYuTEFNQkRBX01FTU9SWV9TSVpFIHx8ICc1MTInLCAxMCksXG4gICAgICBhcmNoaXRlY3R1cmU6IHByb2Nlc3MuZW52LkxBTUJEQV9BUkNISVRFQ1RVUkUgPT09ICd4ODZfNjQnID8gJ3g4Nl82NCcgOiAnYXJtNjQnLFxuICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogcHJvY2Vzcy5lbnYuTEFNQkRBX1JFU0VSVkVEX0NPTkNVUlJFTkNZXG4gICAgICAgID8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuTEFNQkRBX1JFU0VSVkVEX0NPTkNVUlJFTkNZLCAxMClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcblxuICAgIGxvZ2dpbmc6IHtcbiAgICAgIGdyb3VwTmFtZTogcHJvY2Vzcy5lbnYuTE9HX0dST1VQX05BTUUgfHwgJy9waXBlbGluZS1idWlsZGVyL2xvZ3MnLFxuICAgIH0sXG5cbiAgICBjb2RlQnVpbGQ6IHtcbiAgICAgIGNvbXB1dGVUeXBlOiAocHJvY2Vzcy5lbnYuQ09ERUJVSUxEX0NPTVBVVEVfVFlQRSB8fCAnU01BTEwnKS50b1VwcGVyQ2FzZSgpLFxuICAgICAgZGVmYXVsdEltYWdlOiBwcm9jZXNzLmVudi5DT0RFQlVJTERfREVGQVVMVF9JTUFHRSB8fCAncGlwZWxpbmUtYm9vdHN0cmFwOjEuMCcsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mcmFzdHJ1Y3R1cmUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9pbmZyYXN0cnVjdHVyZS1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFHeEI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEQsNEVBQTRFO0lBQzVFLHdFQUF3RTtJQUN4RSw4RUFBOEU7SUFDOUUsNEVBQTRFO0lBQzVFLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNyRSxPQUFPO1FBQ0wsSUFBSTtRQUNKLElBQUk7UUFDSixRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsSUFBSSxRQUFRLEVBQUUsSUFBSSxJQUFJLElBQUk7UUFDeEUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCO1lBQzVDLENBQUMsQ0FBQyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1FBQzVCLE9BQU8sRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxPQUFPLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDO0tBQzNDLENBQUM7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T0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTztZQUMvRSw0QkFBNEIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQjtnQkFDbkUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsRUFBRSxDQUFDLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxTQUFTO1NBQ2Q7UUFFRCxPQUFPLEVBQUU7WUFDUCxTQUFTLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLHdCQUF3QixDQUFDO1NBQzlEO1FBRUQsU0FBUyxFQUFFO1lBQ1QsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ3RFLFlBQVksRUFBRSxNQUFNLENBQUMseUJBQXlCLEVBQUUsd0JBQXdCLENBQUM7U0FDMUU7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnZCb29sLCBlbnZJbnQsIGVudlN0ciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHR5cGUgeyBBV1NDb25maWcsIEJ1aWxkQ29uZmlnLCBDb21wbGlhbmNlQ29uZmlnLCBEYXRhYmFzZUNvbmZpZywgT2JzZXJ2YWJpbGl0eUNvbmZpZywgUGx1Z2luQnVpbGRDb25maWcsIFJlZ2lzdHJ5Q29uZmlnIH0gZnJvbSAnLi9jb25maWctdHlwZXMuanMnO1xuXG4vKipcbiAqIExvYWQgRG9ja2VyIHJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBgSU1BR0VfUkVHSVNUUllfSE9TVGAg4oCUIFJlZ2lzdHJ5IGhvc3RuYW1lIChkZWZhdWx0OiBgJ3JlZ2lzdHJ5J2ApXG4gKiAtIGBJTUFHRV9SRUdJU1RSWV9QT1JUYCDigJQgUmVnaXN0cnkgcG9ydCAoZGVmYXVsdDogYDUwMDBgKVxuICogLSBgSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUYCDigJQgSG9zdCBhbiBvdXQtb2YtY2x1c3RlciBjbGllbnQgKENvZGVCdWlsZClcbiAqICAgdXNlcyB0byBwdWxsIHBsdWdpbiBpbWFnZXMuIFdoZW4gdW5zZXQsIGRlcml2ZWQgZnJvbSBgUExBVEZPUk1fQkFTRV9VUkxgJ3NcbiAqICAgaG9zdCAodGhlIHB1YmxpYyBlbmRwb2ludCBDb2RlQnVpbGQgY2FuIHJlc29sdmUpLCB0aGVuIGBJTUFHRV9SRUdJU1RSWV9IT1NUYC5cbiAqIC0gYElNQUdFX1JFR0lTVFJZX1BVTExfUE9SVGAg4oCUIFBvcnQgZm9yIHRoZSBhYm92ZS4gV2hlbiB1bnNldCwgZGVyaXZlZCBmcm9tXG4gKiAgIGBQTEFURk9STV9CQVNFX1VSTGAncyBwb3J0LCB0aGVuIGBJTUFHRV9SRUdJU1RSWV9QT1JUYC5cbiAqIC0gYERPQ0tFUl9ORVRXT1JLYCDigJQgRG9ja2VyIG5ldHdvcmsgZm9yIGJ1aWxkL3B1c2ggKGRlZmF1bHQ6IGAnJ2ApXG4gKiAtIGBJTUFHRV9SRUdJU1RSWV9IVFRQYCDigJQgVXNlIHBsYWluIEhUVFAgaW5zdGVhZCBvZiBIVFRQUyAoZGVmYXVsdDogYHRydWVgLFxuICogICB0aGUgaW4tY2x1c3RlciByZWdpc3RyeSBoYXMgbm8gVExTKS5cbiAqXG4gKiBAcmV0dXJucyBSZWdpc3RyeSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUmVnaXN0cnlDb25maWcoKTogUmVnaXN0cnlDb25maWcge1xuICBjb25zdCBob3N0ID0gZW52U3RyKCdJTUFHRV9SRUdJU1RSWV9IT1NUJywgJ3JlZ2lzdHJ5Jyk7XG4gIGNvbnN0IHBvcnQgPSBlbnZJbnQoJ0lNQUdFX1JFR0lTVFJZX1BPUlQnLCA1XzAwMCk7XG4gIC8vIFdoZW4gbm8gZXhwbGljaXQgcHVsbCBob3N0IGlzIHNldCwgZGVyaXZlIGl0IGZyb20gUExBVEZPUk1fQkFTRV9VUkwg4oCUIHRoZVxuICAvLyBwdWJsaWMgcGxhdGZvcm0gZW5kcG9pbnQgYW4gb3V0LW9mLWNsdXN0ZXIgY2xpZW50IChBV1MgQ29kZUJ1aWxkKSBjYW5cbiAgLy8gcmVzb2x2ZSwgdW5saWtlIHRoZSBpbi1jbHVzdGVyIGByZWdpc3RyeWAgQ2x1c3RlcklQLiBPbmx5IGZhbGxzIGJhY2sgdG8gdGhlXG4gIC8vIGluLWNsdXN0ZXIgaG9zdCB3aGVuIFBMQVRGT1JNX0JBU0VfVVJMIGlzIHVuc2V0L3VucGFyc2VhYmxlIChlLmcuIGxvY2FsKS5cbiAgY29uc3QgcGxhdGZvcm0gPSBwYXJzZVBsYXRmb3JtQmFzZVVybChwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTCk7XG4gIHJldHVybiB7XG4gICAgaG9zdCxcbiAgICBwb3J0LFxuICAgIHB1bGxIb3N0OiBwcm9jZXNzLmVudi5JTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1QgfHwgcGxhdGZvcm0/Lmhvc3QgfHwgaG9zdCxcbiAgICBwdWxsUG9ydDogcHJvY2Vzcy5lbnYuSU1BR0VfUkVHSVNUUllfUFVMTF9QT1JUXG4gICAgICA/IGVudkludCgnSU1BR0VfUkVHSVNUUllfUFVMTF9QT1JUJywgcG9ydClcbiAgICAgIDogKHBsYXRmb3JtPy5wb3J0ID8/IHBvcnQpLFxuICAgIG5ldHdvcms6IGVudlN0cignRE9DS0VSX05FVFdPUksnLCAnJyksXG4gICAgaHR0cDogZW52Qm9vbCgnSU1BR0VfUkVHSVNUUllfSFRUUCcsIHRydWUpLFxuICB9O1xufVxuXG4vKiogRXh0cmFjdCBob3N0ICsgcG9ydCBmcm9tIFBMQVRGT1JNX0JBU0VfVVJMIChlLmcuIGBodHRwczovL3BpcGVsaW5lLWJ1aWxkZXIuY29tYFxuICogIOKGkiBgeyBob3N0OiAncGlwZWxpbmUtYnVpbGRlci5jb20nLCBwb3J0OiA0NDMgfWApLiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgdmFsdWVcbiAqICBpcyB1bnNldCBvciBub3QgYSB2YWxpZCBVUkwuIEV4cG9ydGVkIHNvIHRoZSBDTEkgKHBpcGVsaW5lLW1hbmFnZXIpIGRlcml2ZXNcbiAqICB0aGUgcmVnaXN0cnkgcHVsbCB0YXJnZXQgd2l0aCB0aGUgU0FNRSBwYXJzaW5nLCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGxhdGZvcm1CYXNlVXJsKHJhdz86IHN0cmluZyk6IHsgaG9zdDogc3RyaW5nOyBwb3J0OiBudW1iZXIgfSB8IG51bGwge1xuICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwocmF3KTtcbiAgICAvLyBBIHNjaGVtZS1sZXNzIHZhbHVlIGxpa2UgYGhvc3Q6ODQ0M2AgcGFyc2VzIHdpdGggYSBjdXN0b20gcHJvdG9jb2wgYW5kIGFuXG4gICAgLy8gRU1QVFkgaG9zdG5hbWUg4oCUIHJlamVjdCBpdCBzbyBjYWxsZXJzIGZhbGwgYmFjayByYXRoZXIgdGhhbiBkZXJpdmUgYVxuICAgIC8vIGhvc3QtbGVzcyBlbmRwb2ludC5cbiAgICBpZiAoIXUuaG9zdG5hbWUpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHBvcnQgPSB1LnBvcnQgPyBwYXJzZUludCh1LnBvcnQsIDEwKSA6ICh1LnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwKTtcbiAgICByZXR1cm4geyBob3N0OiB1Lmhvc3RuYW1lLCBwb3J0IH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogTG9hZCBwbHVnaW4gYnVpbGQgcXVldWUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIGBQTFVHSU5fQlVJTERfQ09OQ1VSUkVOQ1lgIOKAlCBNYXggY29uY3VycmVudCBwbHVnaW4gYnVpbGRzIChkZWZhdWx0OiBgMWApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkUGx1Z2luQnVpbGRDb25maWcoKTogUGx1Z2luQnVpbGRDb25maWcge1xuICByZXR1cm4ge1xuICAgIGNvbmN1cnJlbmN5OiBlbnZJbnQoJ1BMVUdJTl9CVUlMRF9DT05DVVJSRU5DWScsIDEpLFxuICAgIG1heEF0dGVtcHRzOiBlbnZJbnQoJ1BMVUdJTl9CVUlMRF9NQVhfQVRURU1QVFMnLCAyKSxcbiAgICBiYWNrb2ZmRGVsYXlNczogZW52SW50KCdQTFVHSU5fQlVJTERfQkFDS09GRl9ERUxBWV9NUycsIDVfMDAwKSxcbiAgICB3b3JrZXJUaW1lb3V0TXM6IGVudkludCgnUExVR0lOX0JVSUxEX1dPUktFUl9USU1FT1VUX01TJywgMTBfMDAwKSxcbiAgICB0ZW1wRGlyTWF4QWdlTXM6IGVudkludCgnVEVNUF9ESVJfTUFYX0FHRV9NUycsIDE0XzQwMF8wMDApLFxuICAgIGRscU1heEF0dGVtcHRzOiBlbnZJbnQoJ1BMVUdJTl9ETFFfTUFYX0FUVEVNUFRTJywgMyksXG4gICAgZGxxQmFja29mZkJhc2VNczogZW52SW50KCdQTFVHSU5fRExRX0JBQ0tPRkZfQkFTRV9NUycsIDMwMF8wMDApLFxuICAgIGRscU1heFNpemU6IGVudkludCgnUExVR0lOX0RMUV9NQVhfU0laRScsIDIwKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWREYXRhYmFzZUNvbmZpZygpOiBEYXRhYmFzZUNvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgcG9zdGdyZXM6IHtcbiAgICAgIGhvc3Q6IGVudlN0cignREJfSE9TVCcsICdwb3N0Z3JlcycpLFxuICAgICAgcG9ydDogZW52SW50KCdEQl9QT1JUJywgNV80MzIpLFxuICAgICAgZGF0YWJhc2U6IGVudlN0cignREFUQUJBU0UnLCAncGlwZWxpbmVfYnVpbGRlcicpLFxuICAgICAgdXNlcjogZW52U3RyKCdEQl9VU0VSJywgJ3Bvc3RncmVzJyksXG4gICAgICBwYXNzd29yZDogZW52U3RyKCdEQl9QQVNTV09SRCcsICcnKSxcbiAgICB9LFxuICAgIGRyaXp6bGU6IHtcbiAgICAgIG1heFBvb2xTaXplOiBlbnZJbnQoJ0RSSVpaTEVfTUFYX1BPT0xfU0laRScsIDIwKSxcbiAgICAgIGlkbGVUaW1lb3V0TWlsbGlzOiBlbnZJbnQoJ0RSSVpaTEVfSURMRV9USU1FT1VUX01JTExJUycsIDMwXzAwMCksXG4gICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogZW52SW50KCdEUklaWkxFX0NPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMnLCAxMF8wMDApLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkT2JzZXJ2YWJpbGl0eUNvbmZpZygpOiBPYnNlcnZhYmlsaXR5Q29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBsb2dMZXZlbDogZW52U3RyKCdMT0dfTEVWRUwnLCAnaW5mbycpLFxuICAgIGxvZ0Zvcm1hdDogZW52U3RyKCdMT0dfRk9STUFUJywgJ2pzb24nKSxcbiAgICBzZXJ2aWNlTmFtZTogZW52U3RyKCdTRVJWSUNFX05BTUUnLCAnYXBpJyksXG4gICAgdHJhY2luZzoge1xuICAgICAgZW5hYmxlZDogZW52Qm9vbCgnT1RFTF9UUkFDSU5HX0VOQUJMRUQnLCBmYWxzZSksXG4gICAgICBlbmRwb2ludDogZW52U3RyKCdPVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQnLCAnaHR0cDovL2xvY2FsaG9zdDo0MzE4L3YxL3RyYWNlcycpLFxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29tcGxpYW5jZUNvbmZpZygpOiBDb21wbGlhbmNlQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBzY2FuU2NoZWR1bGVySW50ZXJ2YWxNczogZW52SW50KCdTQ0FOX1NDSEVEVUxFUl9JTlRFUlZBTF9NUycsIDYwXzAwMCksXG4gICAgc3lzdGVtT3JnU2NhbnNFbmFibGVkOiBlbnZCb29sKCdTWVNURU1fT1JHX1NDQU5TX0VOQUJMRUQnLCBmYWxzZSksXG4gICAgc2NhbkxvY2tUdGxNczogZW52SW50KCdTQ0FOX0xPQ0tfVFRMX01TJywgMzAwXzAwMCksXG4gICAgZGlnZXN0U2NoZWR1bGVySW50ZXJ2YWxNczogZW52SW50KCdESUdFU1RfU0NIRURVTEVSX0lOVEVSVkFMX01TJywgM182MDBfMDAwKSxcbiAgICBkaWdlc3RMb2NrVHRsTXM6IGVudkludCgnRElHRVNUX0xPQ0tfVFRMX01TJywgMzAwXzAwMCksXG4gIH07XG59XG5cbi8qKlxuICogTG9hZCBwbHVnaW4gYnVpbGQgY29uZmlndXJhdGlvbi4gQnVpbGRzIHJ1biBhZ2FpbnN0IGEgcm9vdGxlc3MgYG1vYnkvYnVpbGRraXRgXG4gKiBzaWRlY2FyIOKAlCBzZWUgYEJVSUxES0lUX0hPU1RgLlxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gYERPQ0tFUl9CVUlMRF9URU1QX1JPT1RgIOKAlCBUZW1wIGRpcmVjdG9yeSBmb3IgYnVpbGQgY29udGV4dHMgKGRlZmF1bHQ6IGA8Y3dkPi90bXBgKVxuICogLSBgRE9DS0VSX0JVSUxEX1RJTUVPVVRfTVNgIOKAlCBCdWlsZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogYDkwMDAwMGAgLyAxNSBtaW4pXG4gKiAtIGBET0NLRVJfUFVTSF9USU1FT1VUX01TYCDigJQgUHVzaCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogYDMwMDAwMGAgLyA1IG1pbilcbiAqIC0gYEJVSUxES0lUX0hPU1RgIOKAlCBidWlsZGN0bCBgLS1hZGRyYCB2YWx1ZSBmb3IgdGhlIGJ1aWxka2l0ZCBzaWRlY2FyXG4gKiAgIChkZWZhdWx0OiBgdW5peDovLy9ydW4vYnVpbGRraXQvYnVpbGRraXRkLnNvY2tgKVxuICogLSBgUExVR0lOX1NJR05JTkdfUFVCTElDX0tFWV9GSUxFYCDigJQgUEVNIHB1YmxpYyBrZXkgcGx1Z2luIGltYWdlcyBhcmUgdmVyaWZpZWRcbiAqICAgYWdhaW5zdCAoZGVmYXVsdDogYC9ldGMvcGlwZWxpbmUtYnVpbGRlci9wbHVnaW4tc2lnbmluZy9wbHVnaW4tc2lnbmluZy5wdWJgKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZERvY2tlckNvbmZpZygpOiBCdWlsZENvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgdGVtcFJvb3Q6IHByb2Nlc3MuZW52LkRPQ0tFUl9CVUlMRF9URU1QX1JPT1QgfHwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd0bXAnKSxcbiAgICB0aW1lb3V0TXM6IGVudkludCgnRE9DS0VSX0JVSUxEX1RJTUVPVVRfTVMnLCA5MDBfMDAwKSxcbiAgICBwdXNoVGltZW91dE1zOiBlbnZJbnQoJ0RPQ0tFUl9QVVNIX1RJTUVPVVRfTVMnLCAzMDBfMDAwKSxcbiAgICBidWlsZGtpdEFkZHI6IGVudlN0cignQlVJTERLSVRfSE9TVCcsICd1bml4Oi8vL3J1bi9idWlsZGtpdC9idWlsZGtpdGQuc29jaycpLFxuICAgIHNpZ25pbmdQdWJsaWNLZXlGaWxlOiBlbnZTdHIoJ1BMVUdJTl9TSUdOSU5HX1BVQkxJQ19LRVlfRklMRScsICcvZXRjL3BpcGVsaW5lLWJ1aWxkZXIvcGx1Z2luLXNpZ25pbmcvcGx1Z2luLXNpZ25pbmcucHViJyksXG4gIH07XG59XG5cbi8qKlxuICogTG9hZCBBV1MgaW5mcmFzdHJ1Y3R1cmUgY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIGBMQU1CREFfUlVOVElNRWAg4oCUIExhbWJkYSBydW50aW1lIChkZWZhdWx0OiBgJ25vZGVqczI0LngnYDsgdW5rbm93biB2YWx1ZXMgZmFsbCBiYWNrIHRvIGl0KVxuICogLSBgTEFNQkRBX1RJTUVPVVRgIOKAlCBMYW1iZGEgdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiBgOTAwYClcbiAqIC0gYExBTUJEQV9NRU1PUllfU0laRWAg4oCUIExhbWJkYSBtZW1vcnkgaW4gTUIgKGRlZmF1bHQ6IGA1MTJgKVxuICogLSBgTEFNQkRBX0FSQ0hJVEVDVFVSRWAg4oCUIGAneDg2XzY0J2Agb3IgQVJNIChkZWZhdWx0OiBBUk1fNjQpXG4gKiAtIGBMT0dfR1JPVVBfTkFNRWAg4oCUIENsb3VkV2F0Y2ggbG9nIGdyb3VwIChkZWZhdWx0OiBgJy9waXBlbGluZS1idWlsZGVyL2xvZ3MnYClcbiAqIC0gYENPREVCVUlMRF9DT01QVVRFX1RZUEVgIOKAlCBDb2RlQnVpbGQgY29tcHV0ZSB0eXBlIChkZWZhdWx0OiBgJ1NNQUxMJ2ApXG4gKlxuICogQHJldHVybnMgQVdTIGluZnJhc3RydWN0dXJlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBV1NDb25maWcoKTogQVdTQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBsYW1iZGE6IHtcbiAgICAgIHJ1bnRpbWU6IGVudlN0cignTEFNQkRBX1JVTlRJTUUnLCAnbm9kZWpzMjQueCcpLFxuICAgICAgdGltZW91dFNlY29uZHM6IGVudkludCgnTEFNQkRBX1RJTUVPVVQnLCA5MDApLFxuICAgICAgbWVtb3J5U2l6ZTogZW52SW50KCdMQU1CREFfTUVNT1JZX1NJWkUnLCA1MTIpLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9jZXNzLmVudi5MQU1CREFfQVJDSElURUNUVVJFID09PSAneDg2XzY0JyA/ICd4ODZfNjQnIDogJ2FybTY0JyxcbiAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IHByb2Nlc3MuZW52LkxBTUJEQV9SRVNFUlZFRF9DT05DVVJSRU5DWVxuICAgICAgICA/IGVudkludCgnTEFNQkRBX1JFU0VSVkVEX0NPTkNVUlJFTkNZJywgMClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcblxuICAgIGxvZ2dpbmc6IHtcbiAgICAgIGdyb3VwTmFtZTogZW52U3RyKCdMT0dfR1JPVVBfTkFNRScsICcvcGlwZWxpbmUtYnVpbGRlci9sb2dzJyksXG4gICAgfSxcblxuICAgIGNvZGVCdWlsZDoge1xuICAgICAgY29tcHV0ZVR5cGU6IChlbnZTdHIoJ0NPREVCVUlMRF9DT01QVVRFX1RZUEUnLCAnU01BTEwnKSkudG9VcHBlckNhc2UoKSxcbiAgICAgIGRlZmF1bHRJbWFnZTogZW52U3RyKCdDT0RFQlVJTERfREVGQVVMVF9JTUFHRScsICdwaXBlbGluZS1ib290c3RyYXA6MS4wJyksXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -46,7 +46,7 @@ export declare function validateServerConfig(config: ServerConfig): void;
46
46
  *
47
47
  * No SECRET is validated any more: there is none left. User tokens are ES256
48
48
  * signed by platform (whose signing key is validated at platform's boot, where
49
- * it is loaded) and internal service tokens are ES256 signed per service (#14),
49
+ * it is loaded) and internal service tokens are ES256 signed per service,
50
50
  * whose key and bundle `createApp` requires at startup.
51
51
  *
52
52
  * @param config - Auth configuration to validate
@@ -1,8 +1,13 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { createLogger } from '@pipeline-builder/api-core';
3
+ import { createLogger, envBool, envInt, serviceEndpoint } from '@pipeline-builder/api-core';
4
4
  import { CoreConstants } from './app-config.js';
5
5
  const log = createLogger('server-config');
6
+ /** `{ <key>Host, <key>Port }` for one sibling service, from the shared registry. */
7
+ function endpoint(service, key) {
8
+ const { host, port } = serviceEndpoint(service);
9
+ return { [`${key}Host`]: host, [`${key}Port`]: port };
10
+ }
6
11
  /**
7
12
  * Load server configuration from environment variables.
8
13
  *
@@ -17,41 +22,37 @@ const log = createLogger('server-config');
17
22
  */
18
23
  export function loadServerConfig() {
19
24
  return {
20
- port: parseInt(process.env.PORT || '3000', 10),
25
+ port: envInt('PORT', 3_000),
21
26
  cors: {
22
- credentials: process.env.CORS_CREDENTIALS !== 'false',
27
+ credentials: envBool('CORS_CREDENTIALS', true),
23
28
  origin: process.env.CORS_ORIGIN
24
29
  ? process.env.CORS_ORIGIN.split(',').map(o => o.trim())
25
30
  : [process.env.PLATFORM_BASE_URL || CoreConstants.DEFAULT_PLATFORM_URL],
26
31
  },
27
- trustProxy: parseInt(process.env.TRUST_PROXY || '1', 10),
32
+ trustProxy: envInt('TRUST_PROXY', 1),
28
33
  platformUrl: process.env.PLATFORM_BASE_URL || CoreConstants.DEFAULT_PLATFORM_URL,
29
34
  httpClient: {
30
- timeout: parseInt(process.env.HTTP_CLIENT_TIMEOUT || '5000', 10),
31
- maxRetries: parseInt(process.env.HTTP_CLIENT_MAX_RETRIES || '2', 10),
32
- retryDelayMs: parseInt(process.env.HTTP_CLIENT_RETRY_DELAY_MS || '200', 10),
35
+ timeout: envInt('HTTP_CLIENT_TIMEOUT', 5_000),
36
+ maxRetries: envInt('HTTP_CLIENT_MAX_RETRIES', 2),
37
+ retryDelayMs: envInt('HTTP_CLIENT_RETRY_DELAY_MS', 200),
33
38
  },
34
39
  sse: {
35
- maxClientsPerRequest: parseInt(process.env.SSE_MAX_CLIENTS_PER_REQUEST || '10', 10),
36
- clientTimeoutMs: parseInt(process.env.SSE_CLIENT_TIMEOUT_MS || '1800000', 10),
37
- cleanupIntervalMs: parseInt(process.env.SSE_CLEANUP_INTERVAL_MS || '300000', 10),
40
+ maxClientsPerRequest: envInt('SSE_MAX_CLIENTS_PER_REQUEST', 10),
41
+ clientTimeoutMs: envInt('SSE_CLIENT_TIMEOUT_MS', 1_800_000),
42
+ cleanupIntervalMs: envInt('SSE_CLEANUP_INTERVAL_MS', 300_000),
38
43
  },
39
44
  services: {
40
- pluginHost: process.env.PLUGIN_SERVICE_HOST || 'plugin',
41
- pluginPort: parseInt(process.env.PLUGIN_SERVICE_PORT || '3000', 10),
42
- pipelineHost: process.env.PIPELINE_SERVICE_HOST || 'pipeline',
43
- pipelinePort: parseInt(process.env.PIPELINE_SERVICE_PORT || '3000', 10),
44
- messageHost: process.env.MESSAGE_SERVICE_HOST || 'message',
45
- messagePort: parseInt(process.env.MESSAGE_SERVICE_PORT || '3000', 10),
46
- platformHost: process.env.PLATFORM_SERVICE_HOST || 'platform',
47
- platformPort: parseInt(process.env.PLATFORM_SERVICE_PORT || '3000', 10),
48
- complianceHost: process.env.COMPLIANCE_SERVICE_HOST || 'compliance',
49
- compliancePort: parseInt(process.env.COMPLIANCE_SERVICE_PORT || '3000', 10),
50
- billingHost: process.env.BILLING_SERVICE_HOST || 'billing',
51
- billingPort: parseInt(process.env.BILLING_SERVICE_PORT || '3000', 10),
52
- billingTimeout: parseInt(process.env.BILLING_SERVICE_TIMEOUT || '5000', 10),
53
- imageRegistryHost: process.env.IMAGE_REGISTRY_SERVICE_HOST || 'image-registry',
54
- imageRegistryPort: parseInt(process.env.IMAGE_REGISTRY_SERVICE_PORT || '3000', 10),
45
+ ...endpoint('plugin', 'plugin'),
46
+ ...endpoint('pipeline', 'pipeline'),
47
+ ...endpoint('message', 'message'),
48
+ ...endpoint('platform', 'platform'),
49
+ ...endpoint('compliance', 'compliance'),
50
+ ...endpoint('billing', 'billing'),
51
+ ...endpoint('image-registry', 'imageRegistry'),
52
+ ...endpoint('quota', 'quota'),
53
+ ...endpoint('reporting', 'reporting'),
54
+ ...endpoint('ask', 'ask'),
55
+ billingTimeout: envInt('BILLING_SERVICE_TIMEOUT', 5000, { min: 1 }),
55
56
  },
56
57
  };
57
58
  }
@@ -69,11 +70,11 @@ export function loadServerConfig() {
69
70
  export function loadAuthConfig() {
70
71
  return {
71
72
  jwt: {
72
- expiresIn: parseInt(process.env.JWT_EXPIRES_IN || '7200', 10),
73
- saltRounds: parseInt(process.env.BCRYPT_SALT_ROUNDS || '12', 10),
73
+ expiresIn: envInt('JWT_EXPIRES_IN', 7_200),
74
+ saltRounds: envInt('BCRYPT_SALT_ROUNDS', 12),
74
75
  },
75
76
  refreshToken: {
76
- expiresIn: parseInt(process.env.REFRESH_TOKEN_EXPIRES_IN || '2592000', 10),
77
+ expiresIn: envInt('REFRESH_TOKEN_EXPIRES_IN', 2_592_000),
77
78
  },
78
79
  };
79
80
  }
@@ -88,8 +89,8 @@ export function loadAuthConfig() {
88
89
  */
89
90
  export function loadRateLimitConfig() {
90
91
  return {
91
- max: parseInt(process.env.LIMITER_MAX || '100', 10),
92
- windowMs: parseInt(process.env.LIMITER_WINDOWMS || '900000', 10),
92
+ max: envInt('LIMITER_MAX', 100),
93
+ windowMs: envInt('LIMITER_WINDOWMS', 900_000),
93
94
  };
94
95
  }
95
96
  /**
@@ -127,7 +128,7 @@ export function validateServerConfig(config) {
127
128
  *
128
129
  * No SECRET is validated any more: there is none left. User tokens are ES256
129
130
  * signed by platform (whose signing key is validated at platform's boot, where
130
- * it is loaded) and internal service tokens are ES256 signed per service (#14),
131
+ * it is loaded) and internal service tokens are ES256 signed per service,
131
132
  * whose key and bundle `createApp` requires at startup.
132
133
  *
133
134
  * @param config - Auth configuration to validate
@@ -153,4 +154,4 @@ export function validateAuthConfig(config) {
153
154
  throw new Error(`Auth configuration validation failed:\n${errors.map(e => ` - ${e}`).join('\n')}`);
154
155
  }
155
156
  }
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvc2VydmVyLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHaEQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTFDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQjtJQUM5QixPQUFPO1FBQ0wsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzlDLElBQUksRUFBRTtZQUNKLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLE9BQU87WUFDckQsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVztnQkFDN0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksYUFBYSxDQUFDLG9CQUFvQixDQUFDO1NBQzFFO1FBQ0QsVUFBVSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3hELFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixJQUFJLGFBQWEsQ0FBQyxvQkFBb0I7UUFFaEYsVUFBVSxFQUFFO1lBQ1YsT0FBTyxFQUFF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QUEwQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNuRixDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJy4vYXBwLWNvbmZpZy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckNvbmZpZywgQXV0aENvbmZpZywgUmF0ZUxpbWl0Q29uZmlnIH0gZnJvbSAnLi9jb25maWctdHlwZXMuanMnO1xuXG5jb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoJ3NlcnZlci1jb25maWcnKTtcblxuLyoqXG4gKiBMb2FkIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gYFBPUlRgIOKAlCBIVFRQIGxpc3RlbiBwb3J0IChkZWZhdWx0OiBgMzAwMGApXG4gKiAtIGBDT1JTX09SSUdJTmAg4oCUIENvbW1hLXNlcGFyYXRlZCBhbGxvd2VkIG9yaWdpbnMgKGRlZmF1bHQ6IGBQTEFURk9STV9CQVNFX1VSTGApXG4gKiAtIGBDT1JTX0NSRURFTlRJQUxTYCDigJQgQWxsb3cgY3JlZGVudGlhbHM7IHNldCB0byBgJ2ZhbHNlJ2AgdG8gZGlzYWJsZSAoZGVmYXVsdDogYHRydWVgKVxuICogLSBgVFJVU1RfUFJPWFlgIOKAlCBFeHByZXNzIHRydXN0IHByb3h5IGhvcHMgKGRlZmF1bHQ6IGAxYClcbiAqIC0gYFBMQVRGT1JNX0JBU0VfVVJMYCDigJQgRnJvbnRlbmQgVVJMIHVzZWQgYXMgQ09SUyBmYWxsYmFjayAoZGVmYXVsdDogYCdodHRwczovL2xvY2FsaG9zdDo4NDQzJ2ApXG4gKlxuICogQHJldHVybnMgU2VydmVyIGNvbmZpZ3VyYXRpb24gd2l0aCBwb3J0LCBDT1JTLCB0cnVzdCBwcm94eSwgYW5kIHBsYXRmb3JtIFVSTFxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFNlcnZlckNvbmZpZygpOiBTZXJ2ZXJDb25maWcge1xuICByZXR1cm4ge1xuICAgIHBvcnQ6IHBhcnNlSW50KHByb2Nlc3MuZW52LlBPUlQgfHwgJzMwMDAnLCAxMCksXG4gICAgY29yczoge1xuICAgICAgY3JlZGVudGlhbHM6IHByb2Nlc3MuZW52LkNPUlNfQ1JFREVOVElBTFMgIT09ICdmYWxzZScsXG4gICAgICBvcmlnaW46IHByb2Nlc3MuZW52LkNPUlNfT1JJR0lOXG4gICAgICAgID8gcHJvY2Vzcy5lbnYuQ09SU19PUklHSU4uc3BsaXQoJywnKS5tYXAobyA9PiBvLnRyaW0oKSlcbiAgICAgICAgOiBbcHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkwgfHwgQ29yZUNvbnN0YW50cy5ERUZBVUxUX1BMQVRGT1JNX1VSTF0sXG4gICAgfSxcbiAgICB0cnVzdFByb3h5OiBwYXJzZUludChwcm9jZXNzLmVudi5UUlVTVF9QUk9YWSB8fCAnMScsIDEwKSxcbiAgICBwbGF0Zm9ybVVybDogcHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkwgfHwgQ29yZUNvbnN0YW50cy5ERUZBVUxUX1BMQVRGT1JNX1VSTCxcblxuICAgIGh0dHBDbGllbnQ6IHtcbiAgICAgIHRpbWVvdXQ6IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX1RJTUVPVVQgfHwgJzUwMDAnLCAxMCksXG4gICAgICBtYXhSZXRyaWVzOiBwYXJzZUludChwcm9jZXNzLmVudi5IVFRQX0NMSUVOVF9NQVhfUkVUUklFUyB8fCAnMicsIDEwKSxcbiAgICAgIHJldHJ5RGVsYXlNczogcGFyc2VJbnQocHJvY2Vzcy5lbnYuSFRUUF9DTElFTlRfUkVUUllfREVMQVlfTVMgfHwgJzIwMCcsIDEwKSxcbiAgICB9LFxuXG4gICAgc3NlOiB7XG4gICAgICBtYXhDbGllbnRzUGVyUmVxdWVzdDogcGFyc2VJbnQocHJvY2Vzcy5lbnYuU1NFX01BWF9DTElFTlRTX1BFUl9SRVFVRVNUIHx8ICcxMCcsIDEwKSxcbiAgICAgIGNsaWVudFRpbWVvdXRNczogcGFyc2VJbnQocHJvY2Vzcy5lbnYuU1NFX0NMSUVOVF9USU1FT1VUX01TIHx8ICcxODAwMDAwJywgMTApLFxuICAgICAgY2xlYW51cEludGVydmFsTXM6IHBhcnNlSW50KHByb2Nlc3MuZW52LlNTRV9DTEVBTlVQX0lOVEVSVkFMX01TIHx8ICczMDAwMDAnLCAxMCksXG4gICAgfSxcblxuICAgIHNlcnZpY2VzOiB7XG4gICAgICBwbHVnaW5Ib3N0OiBwcm9jZXNzLmVudi5QTFVHSU5fU0VSVklDRV9IT1NUIHx8ICdwbHVnaW4nLFxuICAgICAgcGx1Z2luUG9ydDogcGFyc2VJbnQocHJvY2Vzcy5lbnYuUExVR0lOX1NFUlZJQ0VfUE9SVCB8fCAnMzAwMCcsIDEwKSxcbiAgICAgIHBpcGVsaW5lSG9zdDogcHJvY2Vzcy5lbnYuUElQRUxJTkVfU0VSVklDRV9IT1NUIHx8ICdwaXBlbGluZScsXG4gICAgICBwaXBlbGluZVBvcnQ6IHBhcnNlSW50KHByb2Nlc3MuZW52LlBJUEVMSU5FX1NFUlZJQ0VfUE9SVCB8fCAnMzAwMCcsIDEwKSxcbiAgICAgIG1lc3NhZ2VIb3N0OiBwcm9jZXNzLmVudi5NRVNTQUdFX1NFUlZJQ0VfSE9TVCB8fCAnbWVzc2FnZScsXG4gICAgICBtZXNzYWdlUG9ydDogcGFyc2VJbnQocHJvY2Vzcy5lbnYuTUVTU0FHRV9TRVJWSUNFX1BPUlQgfHwgJzMwMDAnLCAxMCksXG4gICAgICBwbGF0Zm9ybUhvc3Q6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFUlZJQ0VfSE9TVCB8fCAncGxhdGZvcm0nLFxuICAgICAgcGxhdGZvcm1Qb3J0OiBwYXJzZUludChwcm9jZXNzLmVudi5QTEFURk9STV9TRVJWSUNFX1BPUlQgfHwgJzMwMDAnLCAxMCksXG4gICAgICBjb21wbGlhbmNlSG9zdDogcHJvY2Vzcy5lbnYuQ09NUExJQU5DRV9TRVJWSUNFX0hPU1QgfHwgJ2NvbXBsaWFuY2UnLFxuICAgICAgY29tcGxpYW5jZVBvcnQ6IHBhcnNlSW50KHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfU0VSVklDRV9QT1JUIHx8ICczMDAwJywgMTApLFxuICAgICAgYmlsbGluZ0hvc3Q6IHByb2Nlc3MuZW52LkJJTExJTkdfU0VSVklDRV9IT1NUIHx8ICdiaWxsaW5nJyxcbiAgICAgIGJpbGxpbmdQb3J0OiBwYXJzZUludChwcm9jZXNzLmVudi5CSUxMSU5HX1NFUlZJQ0VfUE9SVCB8fCAnMzAwMCcsIDEwKSxcbiAgICAgIGJpbGxpbmdUaW1lb3V0OiBwYXJzZUludChwcm9jZXNzLmVudi5CSUxMSU5HX1NFUlZJQ0VfVElNRU9VVCB8fCAnNTAwMCcsIDEwKSxcbiAgICAgIGltYWdlUmVnaXN0cnlIb3N0OiBwcm9jZXNzLmVudi5JTUFHRV9SRUdJU1RSWV9TRVJWSUNFX0hPU1QgfHwgJ2ltYWdlLXJlZ2lzdHJ5JyxcbiAgICAgIGltYWdlUmVnaXN0cnlQb3J0OiBwYXJzZUludChwcm9jZXNzLmVudi5JTUFHRV9SRUdJU1RSWV9TRVJWSUNFX1BPUlQgfHwgJzMwMDAnLCAxMCksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMb2FkIGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBgSldUX0VYUElSRVNfSU5gIOKAlCBKV1QgbGlmZXRpbWUgaW4gc2Vjb25kcyAoZGVmYXVsdDogYDcyMDBgID0gMiBob3VycylcbiAqIC0gYEJDUllQVF9TQUxUX1JPVU5EU2Ag4oCUIGJjcnlwdCBzYWx0IHJvdW5kcyBmb3IgcGFzc3dvcmQgaGFzaGluZyAoZGVmYXVsdDogYDEyYClcbiAqIC0gYFJFRlJFU0hfVE9LRU5fRVhQSVJFU19JTmAg4oCUIFJlZnJlc2ggdG9rZW4gbGlmZXRpbWUgaW4gc2Vjb25kcyAoZGVmYXVsdDogYDI1OTIwMDBgID0gMzAgZGF5cylcbiAqXG4gKiBAcmV0dXJucyBBdXRoZW50aWNhdGlvbiBjb25maWd1cmF0aW9uIHdpdGggc2FmZSBkZWZhdWx0cyAoZW1wdHkgc3RyaW5ncyB3aGVuIGVudiB2YXJzIGFyZSB1bnNldCkuXG4gKiBDYWxsIHtAbGluayB2YWxpZGF0ZUF1dGhDb25maWd9IGF0IHNlcnZlciBzdGFydHVwIHRvIGVuZm9yY2UgcmVxdWlyZWQgc2VjcmV0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBdXRoQ29uZmlnKCk6IEF1dGhDb25maWcge1xuICByZXR1cm4ge1xuICAgIGp3dDoge1xuICAgICAgZXhwaXJlc0luOiBwYXJzZUludChwcm9jZXNzLmVudi5KV1RfRVhQSVJFU19JTiB8fCAnNzIwMCcsIDEwKSxcbiAgICAgIHNhbHRSb3VuZHM6IHBhcnNlSW50KHByb2Nlc3MuZW52LkJDUllQVF9TQUxUX1JPVU5EUyB8fCAnMTInLCAxMCksXG4gICAgfSxcbiAgICByZWZyZXNoVG9rZW46IHtcbiAgICAgIGV4cGlyZXNJbjogcGFyc2VJbnQocHJvY2Vzcy5lbnYuUkVGUkVTSF9UT0tFTl9FWFBJUkVTX0lOIHx8ICcyNTkyMDAwJywgMTApLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogTG9hZCByYXRlIGxpbWl0aW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBgTElNSVRFUl9NQVhgIOKAlCBNYXggcmVxdWVzdHMgcGVyIHdpbmRvdyAoZGVmYXVsdDogYDEwMGApXG4gKiAtIGBMSU1JVEVSX1dJTkRPV01TYCDigJQgUmF0ZSBsaW1pdCB3aW5kb3cgaW4gbXMgKGRlZmF1bHQ6IGA5MDAwMDBgID0gMTUgbWludXRlcylcbiAqXG4gKiBAcmV0dXJucyBSYXRlIGxpbWl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRSYXRlTGltaXRDb25maWcoKTogUmF0ZUxpbWl0Q29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBtYXg6IHBhcnNlSW50KHByb2Nlc3MuZW52LkxJTUlURVJfTUFYIHx8ICcxMDAnLCAxMCksXG4gICAgd2luZG93TXM6IHBhcnNlSW50KHByb2Nlc3MuZW52LkxJTUlURVJfV0lORE9XTVMgfHwgJzkwMDAwMCcsIDEwKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBhbmQgbG9nIHdhcm5pbmdzIGZvciBpbnNlY3VyZSBzZXR0aW5ncy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gU2VydmVyIGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VydmVyQ29uZmlnKGNvbmZpZzogU2VydmVyQ29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIENoZWNrIENPUlMgY29uZmlndXJhdGlvblxuICBjb25zdCBvcmlnaW4gPSBjb25maWcuY29ycy5vcmlnaW47XG4gIGNvbnN0IGlzV2lsZGNhcmQgPSBvcmlnaW4gPT09ICcqJyB8fCAoQXJyYXkuaXNBcnJheShvcmlnaW4pICYmIG9yaWdpbi5pbmNsdWRlcygnKicpKTtcbiAgaWYgKGlzV2lsZGNhcmQpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCdDT1JTIG9yaWdpbiBzZXQgdG8gd2lsZGNhcmQgKCopIC0gY29uc2lkZXIgcmVzdHJpY3RpbmcgdG8gc3BlY2lmaWMgZG9tYWlucycpO1xuICB9XG4gIGlmIChpc1dpbGRjYXJkICYmIGNvbmZpZy5jb3JzLmNyZWRlbnRpYWxzKSB7XG4gICAgLy8gQnJvd3NlcnMgcmVqZWN0IHRoaXMgY29tYmluYXRpb24sIGJ1dCBpdCBpbmRpY2F0ZXMgYSBtaXNjb25maWd1cmF0aW9uXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1NFQ1VSSVRZIEVSUk9SOiBDT1JTX09SSUdJTj0qIHdpdGggQ09SU19DUkVERU5USUFMUz10cnVlIGlzIGFuIGludmFsaWQgYW5kIGluc2VjdXJlIGNvbmZpZ3VyYXRpb24uICcgK1xuICAgICAgJ1NldCBDT1JTX09SSUdJTiB0byBzcGVjaWZpYyBkb21haW5zIG9yIGRpc2FibGUgQ09SU19DUkVERU5USUFMUy4nLFxuICAgICk7XG4gIH1cblxuICAvLyBDaGVjayBwbGF0Zm9ybSBVUkwgdXNlcyBIVFRQU1xuICBpZiAoY29uZmlnLnBsYXRmb3JtVXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJlxuICAgICFjb25maWcucGxhdGZvcm1VcmwuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpKSB7XG4gICAgd2FybmluZ3MucHVzaCgnUGxhdGZvcm0gVVJMIHVzZXMgSFRUUCBpbnN0ZWFkIG9mIEhUVFBTIC0gaW5zZWN1cmUgZm9yIHByb2R1Y3Rpb24nKTtcbiAgfVxuXG4gIC8vIERpc3BsYXkgd2FybmluZ3NcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBsb2cud2FybignU2VydmVyIGNvbmZpZ3VyYXRpb24gd2FybmluZ3M6Jyk7XG4gICAgd2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IGxvZy53YXJuKGAgIC0gJHt3YXJuaW5nfWApKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gKHRva2VuIGxpZmV0aW1lcykuXG4gKiBDYWxsIHRoaXMgYXQgc2VydmVyIHN0YXJ0dXAsIG5vdCBkdXJpbmcgQ0RLIHN5bnRoZXNpcy5cbiAqXG4gKiBObyBTRUNSRVQgaXMgdmFsaWRhdGVkIGFueSBtb3JlOiB0aGVyZSBpcyBub25lIGxlZnQuIFVzZXIgdG9rZW5zIGFyZSBFUzI1NlxuICogc2lnbmVkIGJ5IHBsYXRmb3JtICh3aG9zZSBzaWduaW5nIGtleSBpcyB2YWxpZGF0ZWQgYXQgcGxhdGZvcm0ncyBib290LCB3aGVyZVxuICogaXQgaXMgbG9hZGVkKSBhbmQgaW50ZXJuYWwgc2VydmljZSB0b2tlbnMgYXJlIEVTMjU2IHNpZ25lZCBwZXIgc2VydmljZSAoIzE0KSxcbiAqIHdob3NlIGtleSBhbmQgYnVuZGxlIGBjcmVhdGVBcHBgIHJlcXVpcmVzIGF0IHN0YXJ0dXAuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIEF1dGggY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICogQHRocm93cyB7RXJyb3J9IElmIHRva2VuIGxpZmV0aW1lcyBhcmUgb3V0IG9mIHJhbmdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUF1dGhDb25maWcoY29uZmlnOiBBdXRoQ29uZmlnKTogdm9pZCB7XG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQ2hlY2sgSldUIGV4cGlyYXRpb24gdGltZXNcbiAgaWYgKGNvbmZpZy5qd3QuZXhwaXJlc0luID4gODY0MDApIHtcbiAgICBlcnJvcnMucHVzaCgnSldUIGV4cGlyYXRpb24gbXVzdCBub3QgZXhjZWVkIDI0IGhvdXJzICg4NjQwMCBzZWNvbmRzKScpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5qd3QuZXhwaXJlc0luID4gNzIwMCkge1xuICAgIHdhcm5pbmdzLnB1c2goJ0pXVCBleHBpcmF0aW9uIHRpbWUgaXMgZ3JlYXRlciB0aGFuIDIgaG91cnMgLSBzaG9ydGVyIGV4cGlyYXRpb24gcmVjb21tZW5kZWQnKTtcbiAgfVxuXG4gIC8vIERpc3BsYXkgd2FybmluZ3NcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBsb2cud2FybignQXV0aCBjb25maWd1cmF0aW9uIHdhcm5pbmdzOicpO1xuICAgIHdhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiBsb2cud2FybihgICAtICR7d2FybmluZ31gKSk7XG4gIH1cblxuICAvLyBUaHJvdyBlcnJvcnNcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF1dGggY29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDpcXG4ke2Vycm9ycy5tYXAoZSA9PiBgICAtICR7ZX1gKS5qb2luKCdcXG4nKX1gLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvc2VydmVyLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQXdCLE1BQU0sNEJBQTRCLENBQUM7QUFDbEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR2hELE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUUxQyxvRkFBb0Y7QUFDcEYsU0FBUyxRQUFRLENBQW1CLE9BQXdCLEVBQUUsR0FBTTtJQUNsRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxPQUFPLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBNkQsQ0FBQztBQUNuSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFDM0IsSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUM7WUFDOUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVztnQkFDN0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksYUFBYSxDQUFDLG9CQUFvQixDQUFDO1NBQzFFO1FBQ0QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixJQUFJLGFBQWEsQ0FBQyxvQkFBb0I7UUFFaEYsVUFBVSxFQUFFO1lBQ1YsT0FBTyxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUM7WUFDN0MsVUFBVSxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUM7WUFDaEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLENBQUM7U0FDeEQ7UUFFRCxHQUFHLEVBQUU7WUFDSCxvQkFBb0IsRUFBRSxNQUFNLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxDQUFDO1lBQy9ELGVBQWUsRUFBRSxNQUFNLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxDQUFDO1lBQzNELGlCQUFpQixFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxPQUFPLENBQUM7U0FDOUQ7UUFFRCxRQUFRLEVBQUU7WUFDUixHQUFHLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO1lBQy9CLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7WUFDbkMsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztZQUNqQyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ25DLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUM7WUFDdkMsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztZQUNqQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUM7WUFDOUMsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztZQUM3QixHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDO1lBQ3JDLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDekIsY0FBYyxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDcEU7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsY0FBYztJQUM1QixPQUFPO1FBQ0wsR0FBRyxFQUFFO1lBQ0gsU0FBUyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUM7WUFDMUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7U0FDN0M7UUFDRCxZQUFZLEVBQUU7WUFDWixTQUFTLEVBQUUsTUFBTSxDQUFDLDBCQUEwQixFQUFFLFNBQVMsQ0FBQztTQUN6RDtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLE9BQU87UUFDTCxHQUFHLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUM7UUFDL0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLENBQUM7S0FDOUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BQW9CO0lBQ3ZELE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUU5QiwyQkFBMkI7SUFDM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDbEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLElBQUksVUFBVSxFQUFFLENBQUM7UUFDZixRQUFRLENBQUMsSUFBSSxDQUFDLDRFQUE0RSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUNELElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsd0VBQXdFO1FBQ3hFLE1BQU0sSUFBSSxLQUFLLENBQ2IscUdBQXFHO1lBQ3JHLGtFQUFrRSxDQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUVELGdDQUFnQztJQUNoQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztRQUMxQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDNUMsUUFBUSxDQUFDLElBQUksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUMzQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWtCO0lBQ25ELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztJQUM1QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFFOUIsNkJBQTZCO0lBQzdCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7U0FBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsOEVBQThFLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDekMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELGVBQWU7SUFDZixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYiwwQ0FBMEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDbkYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZW52Qm9vbCwgZW52SW50LCBzZXJ2aWNlRW5kcG9pbnQsIHR5cGUgSW50ZXJuYWxTZXJ2aWNlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJy4vYXBwLWNvbmZpZy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlckNvbmZpZywgQXV0aENvbmZpZywgUmF0ZUxpbWl0Q29uZmlnIH0gZnJvbSAnLi9jb25maWctdHlwZXMuanMnO1xuXG5jb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoJ3NlcnZlci1jb25maWcnKTtcblxuLyoqIGB7IDxrZXk+SG9zdCwgPGtleT5Qb3J0IH1gIGZvciBvbmUgc2libGluZyBzZXJ2aWNlLCBmcm9tIHRoZSBzaGFyZWQgcmVnaXN0cnkuICovXG5mdW5jdGlvbiBlbmRwb2ludDxLIGV4dGVuZHMgc3RyaW5nPihzZXJ2aWNlOiBJbnRlcm5hbFNlcnZpY2UsIGtleTogSyk6IFJlY29yZDxgJHtLfUhvc3RgLCBzdHJpbmc+ICYgUmVjb3JkPGAke0t9UG9ydGAsIG51bWJlcj4ge1xuICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHNlcnZpY2VFbmRwb2ludChzZXJ2aWNlKTtcbiAgcmV0dXJuIHsgW2Ake2tleX1Ib3N0YF06IGhvc3QsIFtgJHtrZXl9UG9ydGBdOiBwb3J0IH0gYXMgUmVjb3JkPGAke0t9SG9zdGAsIHN0cmluZz4gJiBSZWNvcmQ8YCR7S31Qb3J0YCwgbnVtYmVyPjtcbn1cblxuLyoqXG4gKiBMb2FkIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gYFBPUlRgIOKAlCBIVFRQIGxpc3RlbiBwb3J0IChkZWZhdWx0OiBgMzAwMGApXG4gKiAtIGBDT1JTX09SSUdJTmAg4oCUIENvbW1hLXNlcGFyYXRlZCBhbGxvd2VkIG9yaWdpbnMgKGRlZmF1bHQ6IGBQTEFURk9STV9CQVNFX1VSTGApXG4gKiAtIGBDT1JTX0NSRURFTlRJQUxTYCDigJQgQWxsb3cgY3JlZGVudGlhbHM7IHNldCB0byBgJ2ZhbHNlJ2AgdG8gZGlzYWJsZSAoZGVmYXVsdDogYHRydWVgKVxuICogLSBgVFJVU1RfUFJPWFlgIOKAlCBFeHByZXNzIHRydXN0IHByb3h5IGhvcHMgKGRlZmF1bHQ6IGAxYClcbiAqIC0gYFBMQVRGT1JNX0JBU0VfVVJMYCDigJQgRnJvbnRlbmQgVVJMIHVzZWQgYXMgQ09SUyBmYWxsYmFjayAoZGVmYXVsdDogYCdodHRwczovL2xvY2FsaG9zdDo4NDQzJ2ApXG4gKlxuICogQHJldHVybnMgU2VydmVyIGNvbmZpZ3VyYXRpb24gd2l0aCBwb3J0LCBDT1JTLCB0cnVzdCBwcm94eSwgYW5kIHBsYXRmb3JtIFVSTFxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFNlcnZlckNvbmZpZygpOiBTZXJ2ZXJDb25maWcge1xuICByZXR1cm4ge1xuICAgIHBvcnQ6IGVudkludCgnUE9SVCcsIDNfMDAwKSxcbiAgICBjb3JzOiB7XG4gICAgICBjcmVkZW50aWFsczogZW52Qm9vbCgnQ09SU19DUkVERU5USUFMUycsIHRydWUpLFxuICAgICAgb3JpZ2luOiBwcm9jZXNzLmVudi5DT1JTX09SSUdJTlxuICAgICAgICA/IHByb2Nlc3MuZW52LkNPUlNfT1JJR0lOLnNwbGl0KCcsJykubWFwKG8gPT4gby50cmltKCkpXG4gICAgICAgIDogW3Byb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMIHx8IENvcmVDb25zdGFudHMuREVGQVVMVF9QTEFURk9STV9VUkxdLFxuICAgIH0sXG4gICAgdHJ1c3RQcm94eTogZW52SW50KCdUUlVTVF9QUk9YWScsIDEpLFxuICAgIHBsYXRmb3JtVXJsOiBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTCB8fCBDb3JlQ29uc3RhbnRzLkRFRkFVTFRfUExBVEZPUk1fVVJMLFxuXG4gICAgaHR0cENsaWVudDoge1xuICAgICAgdGltZW91dDogZW52SW50KCdIVFRQX0NMSUVOVF9USU1FT1VUJywgNV8wMDApLFxuICAgICAgbWF4UmV0cmllczogZW52SW50KCdIVFRQX0NMSUVOVF9NQVhfUkVUUklFUycsIDIpLFxuICAgICAgcmV0cnlEZWxheU1zOiBlbnZJbnQoJ0hUVFBfQ0xJRU5UX1JFVFJZX0RFTEFZX01TJywgMjAwKSxcbiAgICB9LFxuXG4gICAgc3NlOiB7XG4gICAgICBtYXhDbGllbnRzUGVyUmVxdWVzdDogZW52SW50KCdTU0VfTUFYX0NMSUVOVFNfUEVSX1JFUVVFU1QnLCAxMCksXG4gICAgICBjbGllbnRUaW1lb3V0TXM6IGVudkludCgnU1NFX0NMSUVOVF9USU1FT1VUX01TJywgMV84MDBfMDAwKSxcbiAgICAgIGNsZWFudXBJbnRlcnZhbE1zOiBlbnZJbnQoJ1NTRV9DTEVBTlVQX0lOVEVSVkFMX01TJywgMzAwXzAwMCksXG4gICAgfSxcblxuICAgIHNlcnZpY2VzOiB7XG4gICAgICAuLi5lbmRwb2ludCgncGx1Z2luJywgJ3BsdWdpbicpLFxuICAgICAgLi4uZW5kcG9pbnQoJ3BpcGVsaW5lJywgJ3BpcGVsaW5lJyksXG4gICAgICAuLi5lbmRwb2ludCgnbWVzc2FnZScsICdtZXNzYWdlJyksXG4gICAgICAuLi5lbmRwb2ludCgncGxhdGZvcm0nLCAncGxhdGZvcm0nKSxcbiAgICAgIC4uLmVuZHBvaW50KCdjb21wbGlhbmNlJywgJ2NvbXBsaWFuY2UnKSxcbiAgICAgIC4uLmVuZHBvaW50KCdiaWxsaW5nJywgJ2JpbGxpbmcnKSxcbiAgICAgIC4uLmVuZHBvaW50KCdpbWFnZS1yZWdpc3RyeScsICdpbWFnZVJlZ2lzdHJ5JyksXG4gICAgICAuLi5lbmRwb2ludCgncXVvdGEnLCAncXVvdGEnKSxcbiAgICAgIC4uLmVuZHBvaW50KCdyZXBvcnRpbmcnLCAncmVwb3J0aW5nJyksXG4gICAgICAuLi5lbmRwb2ludCgnYXNrJywgJ2FzaycpLFxuICAgICAgYmlsbGluZ1RpbWVvdXQ6IGVudkludCgnQklMTElOR19TRVJWSUNFX1RJTUVPVVQnLCA1MDAwLCB7IG1pbjogMSB9KSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIExvYWQgYXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIGBKV1RfRVhQSVJFU19JTmAg4oCUIEpXVCBsaWZldGltZSBpbiBzZWNvbmRzIChkZWZhdWx0OiBgNzIwMGAgPSAyIGhvdXJzKVxuICogLSBgQkNSWVBUX1NBTFRfUk9VTkRTYCDigJQgYmNyeXB0IHNhbHQgcm91bmRzIGZvciBwYXNzd29yZCBoYXNoaW5nIChkZWZhdWx0OiBgMTJgKVxuICogLSBgUkVGUkVTSF9UT0tFTl9FWFBJUkVTX0lOYCDigJQgUmVmcmVzaCB0b2tlbiBsaWZldGltZSBpbiBzZWNvbmRzIChkZWZhdWx0OiBgMjU5MjAwMGAgPSAzMCBkYXlzKVxuICpcbiAqIEByZXR1cm5zIEF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gd2l0aCBzYWZlIGRlZmF1bHRzIChlbXB0eSBzdHJpbmdzIHdoZW4gZW52IHZhcnMgYXJlIHVuc2V0KS5cbiAqIENhbGwge0BsaW5rIHZhbGlkYXRlQXV0aENvbmZpZ30gYXQgc2VydmVyIHN0YXJ0dXAgdG8gZW5mb3JjZSByZXF1aXJlZCBzZWNyZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEF1dGhDb25maWcoKTogQXV0aENvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgand0OiB7XG4gICAgICBleHBpcmVzSW46IGVudkludCgnSldUX0VYUElSRVNfSU4nLCA3XzIwMCksXG4gICAgICBzYWx0Um91bmRzOiBlbnZJbnQoJ0JDUllQVF9TQUxUX1JPVU5EUycsIDEyKSxcbiAgICB9LFxuICAgIHJlZnJlc2hUb2tlbjoge1xuICAgICAgZXhwaXJlc0luOiBlbnZJbnQoJ1JFRlJFU0hfVE9LRU5fRVhQSVJFU19JTicsIDJfNTkyXzAwMCksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMb2FkIHJhdGUgbGltaXRpbmcgY29uZmlndXJhdGlvbiBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIGBMSU1JVEVSX01BWGAg4oCUIE1heCByZXF1ZXN0cyBwZXIgd2luZG93IChkZWZhdWx0OiBgMTAwYClcbiAqIC0gYExJTUlURVJfV0lORE9XTVNgIOKAlCBSYXRlIGxpbWl0IHdpbmRvdyBpbiBtcyAoZGVmYXVsdDogYDkwMDAwMGAgPSAxNSBtaW51dGVzKVxuICpcbiAqIEByZXR1cm5zIFJhdGUgbGltaXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFJhdGVMaW1pdENvbmZpZygpOiBSYXRlTGltaXRDb25maWcge1xuICByZXR1cm4ge1xuICAgIG1heDogZW52SW50KCdMSU1JVEVSX01BWCcsIDEwMCksXG4gICAgd2luZG93TXM6IGVudkludCgnTElNSVRFUl9XSU5ET1dNUycsIDkwMF8wMDApLFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNlcnZlciBjb25maWd1cmF0aW9uIGFuZCBsb2cgd2FybmluZ3MgZm9yIGluc2VjdXJlIHNldHRpbmdzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBTZXJ2ZXIgY29uZmlndXJhdGlvbiB0byB2YWxpZGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTZXJ2ZXJDb25maWcoY29uZmlnOiBTZXJ2ZXJDb25maWcpOiB2b2lkIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQ2hlY2sgQ09SUyBjb25maWd1cmF0aW9uXG4gIGNvbnN0IG9yaWdpbiA9IGNvbmZpZy5jb3JzLm9yaWdpbjtcbiAgY29uc3QgaXNXaWxkY2FyZCA9IG9yaWdpbiA9PT0gJyonIHx8IChBcnJheS5pc0FycmF5KG9yaWdpbikgJiYgb3JpZ2luLmluY2x1ZGVzKCcqJykpO1xuICBpZiAoaXNXaWxkY2FyZCkge1xuICAgIHdhcm5pbmdzLnB1c2goJ0NPUlMgb3JpZ2luIHNldCB0byB3aWxkY2FyZCAoKikgLSBjb25zaWRlciByZXN0cmljdGluZyB0byBzcGVjaWZpYyBkb21haW5zJyk7XG4gIH1cbiAgaWYgKGlzV2lsZGNhcmQgJiYgY29uZmlnLmNvcnMuY3JlZGVudGlhbHMpIHtcbiAgICAvLyBCcm93c2VycyByZWplY3QgdGhpcyBjb21iaW5hdGlvbiwgYnV0IGl0IGluZGljYXRlcyBhIG1pc2NvbmZpZ3VyYXRpb25cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnU0VDVVJJVFkgRVJST1I6IENPUlNfT1JJR0lOPSogd2l0aCBDT1JTX0NSRURFTlRJQUxTPXRydWUgaXMgYW4gaW52YWxpZCBhbmQgaW5zZWN1cmUgY29uZmlndXJhdGlvbi4gJyArXG4gICAgICAnU2V0IENPUlNfT1JJR0lOIHRvIHNwZWNpZmljIGRvbWFpbnMgb3IgZGlzYWJsZSBDT1JTX0NSRURFTlRJQUxTLicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIHBsYXRmb3JtIFVSTCB1c2VzIEhUVFBTXG4gIGlmIChjb25maWcucGxhdGZvcm1Vcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmXG4gICAgIWNvbmZpZy5wbGF0Zm9ybVVybC5pbmNsdWRlcygnbG9jYWxob3N0JykpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCdQbGF0Zm9ybSBVUkwgdXNlcyBIVFRQIGluc3RlYWQgb2YgSFRUUFMgLSBpbnNlY3VyZSBmb3IgcHJvZHVjdGlvbicpO1xuICB9XG5cbiAgLy8gRGlzcGxheSB3YXJuaW5nc1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGxvZy53YXJuKCdTZXJ2ZXIgY29uZmlndXJhdGlvbiB3YXJuaW5nczonKTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4gbG9nLndhcm4oYCAgLSAke3dhcm5pbmd9YCkpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbiAodG9rZW4gbGlmZXRpbWVzKS5cbiAqIENhbGwgdGhpcyBhdCBzZXJ2ZXIgc3RhcnR1cCwgbm90IGR1cmluZyBDREsgc3ludGhlc2lzLlxuICpcbiAqIE5vIFNFQ1JFVCBpcyB2YWxpZGF0ZWQgYW55IG1vcmU6IHRoZXJlIGlzIG5vbmUgbGVmdC4gVXNlciB0b2tlbnMgYXJlIEVTMjU2XG4gKiBzaWduZWQgYnkgcGxhdGZvcm0gKHdob3NlIHNpZ25pbmcga2V5IGlzIHZhbGlkYXRlZCBhdCBwbGF0Zm9ybSdzIGJvb3QsIHdoZXJlXG4gKiBpdCBpcyBsb2FkZWQpIGFuZCBpbnRlcm5hbCBzZXJ2aWNlIHRva2VucyBhcmUgRVMyNTYgc2lnbmVkIHBlciBzZXJ2aWNlLFxuICogd2hvc2Uga2V5IGFuZCBidW5kbGUgYGNyZWF0ZUFwcGAgcmVxdWlyZXMgYXQgc3RhcnR1cC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQXV0aCBjb25maWd1cmF0aW9uIHRvIHZhbGlkYXRlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdG9rZW4gbGlmZXRpbWVzIGFyZSBvdXQgb2YgcmFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQXV0aENvbmZpZyhjb25maWc6IEF1dGhDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBDaGVjayBKV1QgZXhwaXJhdGlvbiB0aW1lc1xuICBpZiAoY29uZmlnLmp3dC5leHBpcmVzSW4gPiA4NjQwMCkge1xuICAgIGVycm9ycy5wdXNoKCdKV1QgZXhwaXJhdGlvbiBtdXN0IG5vdCBleGNlZWQgMjQgaG91cnMgKDg2NDAwIHNlY29uZHMpJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmp3dC5leHBpcmVzSW4gPiA3MjAwKSB7XG4gICAgd2FybmluZ3MucHVzaCgnSldUIGV4cGlyYXRpb24gdGltZSBpcyBncmVhdGVyIHRoYW4gMiBob3VycyAtIHNob3J0ZXIgZXhwaXJhdGlvbiByZWNvbW1lbmRlZCcpO1xuICB9XG5cbiAgLy8gRGlzcGxheSB3YXJuaW5nc1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIGxvZy53YXJuKCdBdXRoIGNvbmZpZ3VyYXRpb24gd2FybmluZ3M6Jyk7XG4gICAgd2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IGxvZy53YXJuKGAgIC0gJHt3YXJuaW5nfWApKTtcbiAgfVxuXG4gIC8vIFRocm93IGVycm9yc1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQXV0aCBjb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7ZXJyb3JzLm1hcChlID0+IGAgIC0gJHtlfWApLmpvaW4oJ1xcbicpfWAsXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -1,11 +1,7 @@
1
- import { InternalHttpClient } from '@pipeline-builder/api-core';
2
- /** Sibling services reachable over the internal network, keyed by the typed
3
- * `server.services.<name>Host`/`<name>Port` config entries. */
4
- export type InternalService = 'plugin' | 'pipeline' | 'message' | 'platform' | 'compliance' | 'billing';
1
+ import { InternalHttpClient, type InternalService } from '@pipeline-builder/api-core';
5
2
  /**
6
- * Construct an `InternalHttpClient` for a sibling service from the typed
7
- * `server.services` config — replacing the per-client boilerplate of reading
8
- * `Config.getAny('server')` with a loose cast and hand-building the host/port.
3
+ * Construct an `InternalHttpClient` for a sibling service at its registry
4
+ * address (`<NAME>_SERVICE_HOST` / `<NAME>_SERVICE_PORT`).
9
5
  *
10
6
  * @example
11
7
  * export const messageClient = createServiceClient('message');
@@ -1,20 +1,14 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { InternalHttpClient } from '@pipeline-builder/api-core';
4
- import { Config } from './app-config.js';
3
+ import { InternalHttpClient, serviceEndpoint } from '@pipeline-builder/api-core';
5
4
  /**
6
- * Construct an `InternalHttpClient` for a sibling service from the typed
7
- * `server.services` config — replacing the per-client boilerplate of reading
8
- * `Config.getAny('server')` with a loose cast and hand-building the host/port.
5
+ * Construct an `InternalHttpClient` for a sibling service at its registry
6
+ * address (`<NAME>_SERVICE_HOST` / `<NAME>_SERVICE_PORT`).
9
7
  *
10
8
  * @example
11
9
  * export const messageClient = createServiceClient('message');
12
10
  */
13
11
  export function createServiceClient(service) {
14
- const { services } = Config.get('server');
15
- return new InternalHttpClient({
16
- host: services[`${service}Host`],
17
- port: services[`${service}Port`],
18
- });
12
+ return new InternalHttpClient(serviceEndpoint(service));
19
13
  }
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3NlcnZpY2UtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBTXpDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBd0I7SUFDMUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsT0FBTyxJQUFJLGtCQUFrQixDQUFDO1FBQzVCLElBQUksRUFBRSxRQUFRLENBQUMsR0FBRyxPQUFPLE1BQU0sQ0FBQztRQUNoQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsT0FBTyxNQUFNLENBQUM7S0FDakMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBJbnRlcm5hbEh0dHBDbGllbnQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2FwcC1jb25maWcuanMnO1xuXG4vKiogU2libGluZyBzZXJ2aWNlcyByZWFjaGFibGUgb3ZlciB0aGUgaW50ZXJuYWwgbmV0d29yaywga2V5ZWQgYnkgdGhlIHR5cGVkXG4gKiAgYHNlcnZlci5zZXJ2aWNlcy48bmFtZT5Ib3N0YC9gPG5hbWU+UG9ydGAgY29uZmlnIGVudHJpZXMuICovXG5leHBvcnQgdHlwZSBJbnRlcm5hbFNlcnZpY2UgPSAncGx1Z2luJyB8ICdwaXBlbGluZScgfCAnbWVzc2FnZScgfCAncGxhdGZvcm0nIHwgJ2NvbXBsaWFuY2UnIHwgJ2JpbGxpbmcnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBgSW50ZXJuYWxIdHRwQ2xpZW50YCBmb3IgYSBzaWJsaW5nIHNlcnZpY2UgZnJvbSB0aGUgdHlwZWRcbiAqIGBzZXJ2ZXIuc2VydmljZXNgIGNvbmZpZyDigJQgcmVwbGFjaW5nIHRoZSBwZXItY2xpZW50IGJvaWxlcnBsYXRlIG9mIHJlYWRpbmdcbiAqIGBDb25maWcuZ2V0QW55KCdzZXJ2ZXInKWAgd2l0aCBhIGxvb3NlIGNhc3QgYW5kIGhhbmQtYnVpbGRpbmcgdGhlIGhvc3QvcG9ydC5cbiAqXG4gKiBAZXhhbXBsZVxuICogICBleHBvcnQgY29uc3QgbWVzc2FnZUNsaWVudCA9IGNyZWF0ZVNlcnZpY2VDbGllbnQoJ21lc3NhZ2UnKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VDbGllbnQoc2VydmljZTogSW50ZXJuYWxTZXJ2aWNlKTogSW50ZXJuYWxIdHRwQ2xpZW50IHtcbiAgY29uc3QgeyBzZXJ2aWNlcyB9ID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gIHJldHVybiBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KHtcbiAgICBob3N0OiBzZXJ2aWNlc1tgJHtzZXJ2aWNlfUhvc3RgXSxcbiAgICBwb3J0OiBzZXJ2aWNlc1tgJHtzZXJ2aWNlfVBvcnRgXSxcbiAgfSk7XG59XG4iXX0=
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3NlcnZpY2UtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBd0IsTUFBTSw0QkFBNEIsQ0FBQztBQUV2Rzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBd0I7SUFDMUQsT0FBTyxJQUFJLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgSW50ZXJuYWxIdHRwQ2xpZW50LCBzZXJ2aWNlRW5kcG9pbnQsIHR5cGUgSW50ZXJuYWxTZXJ2aWNlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBgSW50ZXJuYWxIdHRwQ2xpZW50YCBmb3IgYSBzaWJsaW5nIHNlcnZpY2UgYXQgaXRzIHJlZ2lzdHJ5XG4gKiBhZGRyZXNzIChgPE5BTUU+X1NFUlZJQ0VfSE9TVGAgLyBgPE5BTUU+X1NFUlZJQ0VfUE9SVGApLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGV4cG9ydCBjb25zdCBtZXNzYWdlQ2xpZW50ID0gY3JlYXRlU2VydmljZUNsaWVudCgnbWVzc2FnZScpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmljZUNsaWVudChzZXJ2aWNlOiBJbnRlcm5hbFNlcnZpY2UpOiBJbnRlcm5hbEh0dHBDbGllbnQge1xuICByZXR1cm4gbmV3IEludGVybmFsSHR0cENsaWVudChzZXJ2aWNlRW5kcG9pbnQoc2VydmljZSkpO1xufVxuIl19
@@ -6,23 +6,6 @@ export interface ArtifactKey {
6
6
  readonly pluginAlias: string;
7
7
  readonly outputDirectory: string;
8
8
  }
9
- /**
10
- * The plugin-alias SEGMENT of an artifact key: the explicit alias, or
11
- * `${name}-alias` when there is none. THE rule — the frontend's artifact picker
12
- * (`frontend/src/lib/artifact-keys.ts`), the CLI's pre-resolver and
13
- * `PluginLookup.normalize` all build keys this way.
14
- *
15
- * The two places that REGISTER keys used to disagree with it, in opposite
16
- * directions: stage steps registered the bare name (`nodejs-build`, no suffix)
17
- * and the synth step suffixed an explicit alias (`my-synth-alias`). Any step
18
- * whose input artifact was picked in the UI then failed synth with "No artifact
19
- * registered", because the key it asked for was never the key that had been
20
- * stored.
21
- */
22
- export declare function pluginArtifactAlias(plugin: {
23
- name: string;
24
- alias?: string;
25
- }): string;
26
9
  /**
27
10
  * Manages build step artifacts with hierarchical key-based lookup.
28
11
  * Keys follow the pattern: stageName:stageAlias:pluginName:pluginAlias:outputDirectory