@pipeline-builder/pipeline-core 4.4.2 → 4.4.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 (43) hide show
  1. package/lib/config/app-config.d.ts +1 -0
  2. package/lib/config/app-config.js +7 -1
  3. package/lib/config/config-types.d.ts +9 -0
  4. package/lib/config/config-types.js +1 -1
  5. package/lib/config/handler-constants.d.ts +7 -0
  6. package/lib/config/handler-constants.js +8 -1
  7. package/lib/config/infrastructure-config.js +2 -1
  8. package/lib/core/audit-correlation.d.ts +34 -0
  9. package/lib/core/audit-correlation.js +50 -0
  10. package/lib/core/pipeline-helpers.js +50 -6
  11. package/lib/core/pipeline-registration.d.ts +25 -0
  12. package/lib/core/pipeline-registration.js +28 -0
  13. package/lib/core/platform-tls.d.ts +43 -0
  14. package/lib/core/platform-tls.js +70 -0
  15. package/lib/core/plugin-contract.d.ts +8 -0
  16. package/lib/core/plugin-contract.js +15 -3
  17. package/lib/core/plugin-lookup-envelope.d.ts +30 -2
  18. package/lib/core/plugin-lookup-envelope.js +58 -7
  19. package/lib/core/quota-exceeded.d.ts +11 -0
  20. package/lib/core/quota-exceeded.js +44 -0
  21. package/lib/core/runtime-check.d.ts +53 -0
  22. package/lib/core/runtime-check.js +56 -0
  23. package/lib/core/security-reports.d.ts +26 -0
  24. package/lib/core/security-reports.js +28 -0
  25. package/lib/core/step-manifest.d.ts +7 -0
  26. package/lib/core/step-manifest.js +1 -1
  27. package/lib/core/synth-failure.d.ts +38 -0
  28. package/lib/core/synth-failure.js +63 -0
  29. package/lib/handlers/plugin-lookup-handler.d.ts +19 -2
  30. package/lib/handlers/plugin-lookup-handler.js +107 -17
  31. package/lib/index.d.ts +9 -2
  32. package/lib/index.js +10 -3
  33. package/lib/pipeline/pipeline-builder.js +55 -8
  34. package/lib/pipeline/plugin-lookup.d.ts +18 -1
  35. package/lib/pipeline/plugin-lookup.js +28 -7
  36. package/lib/pipeline/runtime-vuln-check-step.d.ts +29 -0
  37. package/lib/pipeline/runtime-vuln-check-step.js +36 -0
  38. package/lib/pipeline/stage-builder.d.ts +9 -0
  39. package/lib/pipeline/stage-builder.js +28 -7
  40. package/lib/pipeline/step-manifest-recorder.d.ts +2 -2
  41. package/lib/pipeline/step-manifest-recorder.js +8 -6
  42. package/lib/testing/exports.json +35 -0
  43. package/package.json +5 -4
@@ -44,4 +44,4 @@ export function pluginImageRepository(plugin) {
44
44
  }
45
45
  /** A plugin image repository lookup may return: `public/<publisher>/<name>`, `org-<id>/<name>` or `system/<name>`. */
46
46
  export const PLUGIN_IMAGE_REPOSITORY_RE = /^(?:public\/[a-z0-9]+(?:-[a-z0-9]+)*|org-[a-z0-9][a-z0-9-]*|system)\/[a-z0-9][a-z0-9._-]*$/;
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3N0ZXAtbWFuaWZlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHNDQUFzQyxDQUFDO0FBNEI1RTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXNCO0lBQzFELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEYsT0FBTyxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELHNIQUFzSDtBQUN0SCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0RkFBNEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFN0ZXAgbWFuaWZlc3Q6IHdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb25cbiAqIG9mIGEgZGVwbG95ZWQgcGlwZWxpbmUgcnVucy4gQ0RLLWZyZWUgaGFsZiDigJQgdGhlIHNoYXBlcyBhbmQgaGVscGVycyBzaGFyZWQgYnlcbiAqIHRoZSBzeW50aCAod2hpY2ggcmVjb3JkcyBpdCwgc2VlIGBwaXBlbGluZS9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLnRzYCksIHRoZVxuICogQ0xJICh3aGljaCBzaGlwcyBpdCB3aXRoIHRoZSByZWdpc3RyeSByZWdpc3RyYXRpb24pIGFuZCB0aGUgcGlwZWxpbmUgc2VydmljZVxuICogKHdoaWNoIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGl0IGluIGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApLlxuICpcbiAqIEV2ZW50IGluZ2VzdCBqb2lucyBgcGlwZWxpbmVfZXZlbnRzYCBvbiAocGlwZWxpbmVfaWQsIHN0YWdlX25hbWUsXG4gKiBhY3Rpb25fbmFtZSksIHNvIGBzdGFnZU5hbWVgL2BhY3Rpb25OYW1lYCBoZXJlIGFyZSByZWFkIG9mZiB0aGUgQlVJTFRcbiAqIENvZGVQaXBlbGluZSwgbmV2ZXIgcmVjb21wdXRlZCBmcm9tIG91ciBvd24gaWRzIOKAlCB0aGV5IGFyZSBleGFjdGx5IHRoZSBuYW1lc1xuICogQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgcmVwb3J0LlxuICovXG5cbmltcG9ydCB7IFNZU1RFTV9PUkdfSUQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbi8qKlxuICogRmlsZSB0aGUgc3ludGggYXBwIHdyaXRlcyB0aGUgbWFuaWZlc3QgdG8sIGluc2lkZSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAqIGRpcmVjdG9yeSAoYGNkayBkZXBsb3kgLS1vdXRwdXQ9PGRpcj5gKS4gVGhlIENMSSByZWFkcyBpdCBiYWNrIGFmdGVyIGFcbiAqIHN1Y2Nlc3NmdWwgZGVwbG95IGFuZCBmb3J3YXJkcyBpdCBvbiB0aGUgcmVnaXN0cnkgUE9TVC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNURVBfTUFOSUZFU1RfRklMRSA9ICdwYi1zdGVwLW1hbmlmZXN0Lmpzb24nO1xuXG4vKipcbiAqIGBpZGAgb2YgZXZlcnkgc3ludGhlc2l6ZWQgcGxhY2Vob2xkZXIgcGx1Z2luIChQbHVnaW5Mb29rdXAgYGZhbGxiYWNrKClgIC9cbiAqIGBib290c3RyYXAoKWApIOKAlCBhIHJlY29yZCBzdGFuZGluZyBpbiBmb3IgYSBsb29rdXAgdGhhdCBjb3VsZCBub3QgcmVzb2x2ZSBhdFxuICogc3ludGguIE5ldmVyIGEgcmVhbCBgcGx1Z2luc2Agcm93LCBzbyB0aGUgc3RlcCBtYW5pZmVzdCBuZXZlciByZWNvcmRzIGl0LlxuICovXG5leHBvcnQgY29uc3QgUExBQ0VIT0xERVJfUExVR0lOX0lEID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogT25lIG1hbmlmZXN0IGVudHJ5IGFzIHRoZSBzeW50aCByZWNvcmRzIGl0LiBDYXJyaWVzIHRoZSByZXNvbHZlZCBwbHVnaW5cbiAqIHJlY29yZCdzIGlkIHNvIHRoZSBwaXBlbGluZSBzZXJ2aWNlIGNhbiByZS1yZXNvbHZlIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBuYW1lL3ZlcnNpb24vZGlnZXN0L293bmVyIGl0c2VsZiDigJQgdGhlIENMSSdzIGNsYWltIGlzIG5ldmVyIHRydXN0ZWQgZm9yXG4gKiBhbnl0aGluZyB0aGF0IGZlZWRzIGNyb3NzLW9yZyBzdGF0cyAocHVibGlzaGVyLCB2ZXJpZmllZCB1c2UpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYW5pZmVzdEVudHJ5IHtcbiAgLyoqIENvZGVQaXBlbGluZSBzdGFnZSBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogQ29kZVBpcGVsaW5lIGFjdGlvbiBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIGBwbHVnaW5zLmlkYCBvZiB0aGUgcmVzb2x2ZWQgcGx1Z2luIHJlY29yZC4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBTaWduZWQgaW1hZ2UgZGlnZXN0IHRoZSBzdGVwIGlzIHBpbm5lZCB0bzsgbnVsbCBmb3IgaW1hZ2UtbGVzcyBwbHVnaW5zLiAqL1xuICByZWFkb25seSBpbWFnZURpZ2VzdDogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIFRoZSBwbHVnaW4gZmllbGRzIHtAbGluayBwbHVnaW5JbWFnZVJlcG9zaXRvcnl9IHJlYWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5JbWFnZVJlZiB7XG4gIHJlYWRvbmx5IG9yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYnVpbGRUeXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RyeSByZXBvc2l0b3J5IGFuIG9yZy1vd25lZCBwbHVnaW4gUk9XJ3MgaW1hZ2UgbGl2ZXMgYXRcbiAqIChgPG5hbWVzcGFjZT4vPG5hbWU+YCwgbm8gaG9zdCwgbm8gZGlnZXN0KTogdGhlIHN5c3RlbSBvcmcncyB1bmRlclxuICogYHN5c3RlbS9gLCBhIHRlbmFudCdzIHVuZGVyIGBvcmctPG9yZ0lkPi9gLiBNdXN0IG1hdGNoIHRoZSBwdXNoIHNpZGVcbiAqIChhcGkvcGx1Z2luIGBwbHVnaW5VcmlgKS4gUmV0dXJucyBudWxsIGZvciBhIGBtZXRhZGF0YV9vbmx5YCBwbHVnaW4uXG4gKlxuICogT25seSBmb3Igcm93cyB0aGUgY2FsbGVyJ3Mgb3JnIHJlc29sdmVzIGFzIGl0cyBPV04gKG9yIGl0cyBwYXJlbnQncyk6IHRoZVxuICogcGx1Z2luIGxvb2t1cCBzdGFtcHMgaXQgYXMgdGhlIHJlY29yZCdzIGBpbWFnZVJlcG9zaXRvcnlgLiBBIGxpc3RlZCBwbHVnaW4nc1xuICogcmVwb3NpdG9yeSBpcyBpdHMgbGlzdGluZyB2ZXJzaW9uJ3MgYHB1YmxpYy88cHVibGlzaGVyPi88bmFtZT5gIGNvcHkg4oCUXG4gKiBzeW50aCBuZXZlciBkZXJpdmVzIGEgcmVwb3NpdG9yeSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5JbWFnZVJlcG9zaXRvcnkocGx1Z2luOiBQbHVnaW5JbWFnZVJlZik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocGx1Z2luLmJ1aWxkVHlwZSA9PT0gJ21ldGFkYXRhX29ubHknKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmFtZXNwYWNlID0gcGx1Z2luLm9yZ0lkID09PSBTWVNURU1fT1JHX0lEID8gJ3N5c3RlbScgOiBgb3JnLSR7cGx1Z2luLm9yZ0lkfWA7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9LyR7cGx1Z2luLm5hbWV9YDtcbn1cblxuLyoqIEEgcGx1Z2luIGltYWdlIHJlcG9zaXRvcnkgbG9va3VwIG1heSByZXR1cm46IGBwdWJsaWMvPHB1Ymxpc2hlcj4vPG5hbWU+YCwgYG9yZy08aWQ+LzxuYW1lPmAgb3IgYHN5c3RlbS88bmFtZT5gLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFID0gL14oPzpwdWJsaWNcXC9bYS16MC05XSsoPzotW2EtejAtOV0rKSp8b3JnLVthLXowLTldW2EtejAtOS1dKnxzeXN0ZW0pXFwvW2EtejAtOV1bYS16MC05Ll8tXSokLztcbiJdfQ==
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3N0ZXAtbWFuaWZlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHNDQUFzQyxDQUFDO0FBbUM1RTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXNCO0lBQzFELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEYsT0FBTyxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELHNIQUFzSDtBQUN0SCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0RkFBNEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFN0ZXAgbWFuaWZlc3Q6IHdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb25cbiAqIG9mIGEgZGVwbG95ZWQgcGlwZWxpbmUgcnVucy4gQ0RLLWZyZWUgaGFsZiDigJQgdGhlIHNoYXBlcyBhbmQgaGVscGVycyBzaGFyZWQgYnlcbiAqIHRoZSBzeW50aCAod2hpY2ggcmVjb3JkcyBpdCwgc2VlIGBwaXBlbGluZS9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLnRzYCksIHRoZVxuICogQ0xJICh3aGljaCBzaGlwcyBpdCB3aXRoIHRoZSByZWdpc3RyeSByZWdpc3RyYXRpb24pIGFuZCB0aGUgcGlwZWxpbmUgc2VydmljZVxuICogKHdoaWNoIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGl0IGluIGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApLlxuICpcbiAqIEV2ZW50IGluZ2VzdCBqb2lucyBgcGlwZWxpbmVfZXZlbnRzYCBvbiAocGlwZWxpbmVfaWQsIHN0YWdlX25hbWUsXG4gKiBhY3Rpb25fbmFtZSksIHNvIGBzdGFnZU5hbWVgL2BhY3Rpb25OYW1lYCBoZXJlIGFyZSByZWFkIG9mZiB0aGUgQlVJTFRcbiAqIENvZGVQaXBlbGluZSwgbmV2ZXIgcmVjb21wdXRlZCBmcm9tIG91ciBvd24gaWRzIOKAlCB0aGV5IGFyZSBleGFjdGx5IHRoZSBuYW1lc1xuICogQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgcmVwb3J0LlxuICovXG5cbmltcG9ydCB7IFNZU1RFTV9PUkdfSUQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5cbi8qKlxuICogRmlsZSB0aGUgc3ludGggYXBwIHdyaXRlcyB0aGUgbWFuaWZlc3QgdG8sIGluc2lkZSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAqIGRpcmVjdG9yeSAoYGNkayBkZXBsb3kgLS1vdXRwdXQ9PGRpcj5gKS4gVGhlIENMSSByZWFkcyBpdCBiYWNrIGFmdGVyIGFcbiAqIHN1Y2Nlc3NmdWwgZGVwbG95IGFuZCBmb3J3YXJkcyBpdCBvbiB0aGUgcmVnaXN0cnkgUE9TVC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNURVBfTUFOSUZFU1RfRklMRSA9ICdwYi1zdGVwLW1hbmlmZXN0Lmpzb24nO1xuXG4vKipcbiAqIGBpZGAgb2YgZXZlcnkgc3ludGhlc2l6ZWQgcGxhY2Vob2xkZXIgcGx1Z2luIChQbHVnaW5Mb29rdXAgYGZhbGxiYWNrKClgIC9cbiAqIGBib290c3RyYXAoKWApIOKAlCBhIHJlY29yZCBzdGFuZGluZyBpbiBmb3IgYSBsb29rdXAgdGhhdCBjb3VsZCBub3QgcmVzb2x2ZSBhdFxuICogc3ludGguIE5ldmVyIGEgcmVhbCBgcGx1Z2luc2Agcm93LCBzbyB0aGUgc3RlcCBtYW5pZmVzdCBuZXZlciByZWNvcmRzIGl0LlxuICovXG5leHBvcnQgY29uc3QgUExBQ0VIT0xERVJfUExVR0lOX0lEID0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogT25lIG1hbmlmZXN0IGVudHJ5IGFzIHRoZSBzeW50aCByZWNvcmRzIGl0LiBDYXJyaWVzIHRoZSByZXNvbHZlZCBwbHVnaW5cbiAqIHJlY29yZCdzIGlkIHNvIHRoZSBwaXBlbGluZSBzZXJ2aWNlIGNhbiByZS1yZXNvbHZlIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBuYW1lL3ZlcnNpb24vZGlnZXN0L293bmVyIGl0c2VsZiDigJQgdGhlIENMSSdzIGNsYWltIGlzIG5ldmVyIHRydXN0ZWQgZm9yXG4gKiBhbnl0aGluZyB0aGF0IGZlZWRzIGNyb3NzLW9yZyBzdGF0cyAocHVibGlzaGVyLCB2ZXJpZmllZCB1c2UpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYW5pZmVzdEVudHJ5IHtcbiAgLyoqIENvZGVQaXBlbGluZSBzdGFnZSBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICAvKiogQ29kZVBpcGVsaW5lIGFjdGlvbiBuYW1lLCBhcyB0aGUgYnVpbHQgcGlwZWxpbmUgbmFtZXMgaXQuICovXG4gIHJlYWRvbmx5IGFjdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIGBwbHVnaW5zLmlkYCBvZiB0aGUgcmVzb2x2ZWQgcGx1Z2luIHJlY29yZC4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBTaWduZWQgaW1hZ2UgZGlnZXN0IHRoZSBzdGVwIGlzIHBpbm5lZCB0bzsgbnVsbCBmb3IgaW1hZ2UtbGVzcyBwbHVnaW5zLiAqL1xuICByZWFkb25seSBpbWFnZURpZ2VzdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBzdGVwJ3MgbGFiZWwgKGBwbHVnaW5TdGVwTGFiZWxgOiBgc3ludGhgIG9yIGA8c3RhZ2U+LzxhbGlhcyA/PyBuYW1lPmApIOKAlFxuICAgKiB3aGF0IHRoZSBDTEkgYW5kIHRoZSBsb29rdXAgTGFtYmRhIHNlbmQgYXMgbG9va3VwIGBjb250ZXh0LnN0ZXBLZXlzYCwgYW5kIHRoZVxuICAgKiBydW4tdGltZSBjaGVjayBhc2tzIGFib3V0LiBMZXRzIHRoZSBwbGF0Zm9ybSBqb2luIGxvb2t1cCB3YXJuaW5ncyB0byB0aGlzXG4gICAqIG1hbmlmZXN0IHJvdy5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBLZXk/OiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgcGx1Z2luIGZpZWxkcyB7QGxpbmsgcGx1Z2luSW1hZ2VSZXBvc2l0b3J5fSByZWFkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luSW1hZ2VSZWYge1xuICByZWFkb25seSBvcmdJZDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJ1aWxkVHlwZT86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogUmVnaXN0cnkgcmVwb3NpdG9yeSBhbiBvcmctb3duZWQgcGx1Z2luIFJPVydzIGltYWdlIGxpdmVzIGF0XG4gKiAoYDxuYW1lc3BhY2U+LzxuYW1lPmAsIG5vIGhvc3QsIG5vIGRpZ2VzdCk6IHRoZSBzeXN0ZW0gb3JnJ3MgdW5kZXJcbiAqIGBzeXN0ZW0vYCwgYSB0ZW5hbnQncyB1bmRlciBgb3JnLTxvcmdJZD4vYC4gTXVzdCBtYXRjaCB0aGUgcHVzaCBzaWRlXG4gKiAoYXBpL3BsdWdpbiBgcGx1Z2luVXJpYCkuIFJldHVybnMgbnVsbCBmb3IgYSBgbWV0YWRhdGFfb25seWAgcGx1Z2luLlxuICpcbiAqIE9ubHkgZm9yIHJvd3MgdGhlIGNhbGxlcidzIG9yZyByZXNvbHZlcyBhcyBpdHMgT1dOIChvciBpdHMgcGFyZW50J3MpOiB0aGVcbiAqIHBsdWdpbiBsb29rdXAgc3RhbXBzIGl0IGFzIHRoZSByZWNvcmQncyBgaW1hZ2VSZXBvc2l0b3J5YC4gQSBsaXN0ZWQgcGx1Z2luJ3NcbiAqIHJlcG9zaXRvcnkgaXMgaXRzIGxpc3RpbmcgdmVyc2lvbidzIGBwdWJsaWMvPHB1Ymxpc2hlcj4vPG5hbWU+YCBjb3B5IOKAlFxuICogc3ludGggbmV2ZXIgZGVyaXZlcyBhIHJlcG9zaXRvcnkgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGx1Z2luSW1hZ2VSZXBvc2l0b3J5KHBsdWdpbjogUGx1Z2luSW1hZ2VSZWYpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHBsdWdpbi5idWlsZFR5cGUgPT09ICdtZXRhZGF0YV9vbmx5JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG5hbWVzcGFjZSA9IHBsdWdpbi5vcmdJZCA9PT0gU1lTVEVNX09SR19JRCA/ICdzeXN0ZW0nIDogYG9yZy0ke3BsdWdpbi5vcmdJZH1gO1xuICByZXR1cm4gYCR7bmFtZXNwYWNlfS8ke3BsdWdpbi5uYW1lfWA7XG59XG5cbi8qKiBBIHBsdWdpbiBpbWFnZSByZXBvc2l0b3J5IGxvb2t1cCBtYXkgcmV0dXJuOiBgcHVibGljLzxwdWJsaXNoZXI+LzxuYW1lPmAsIGBvcmctPGlkPi88bmFtZT5gIG9yIGBzeXN0ZW0vPG5hbWU+YC4gKi9cbmV4cG9ydCBjb25zdCBQTFVHSU5fSU1BR0VfUkVQT1NJVE9SWV9SRSA9IC9eKD86cHVibGljXFwvW2EtejAtOV0rKD86LVthLXowLTldKykqfG9yZy1bYS16MC05XVthLXowLTktXSp8c3lzdGVtKVxcL1thLXowLTldW2EtejAtOS5fLV0qJC87XG4iXX0=
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The machine-readable reason a synth failed, as ONE log line.
3
+ *
4
+ * A CodePipeline action failure event only carries CodeBuild's generic
5
+ * summary ("Error while executing command: pipeline-manager pipeline synth …
6
+ * exit status 1") — never the build's output — so the reason a plugin was
7
+ * refused (not installed, denied by policy, signature failure) was readable only
8
+ * by opening the build log. `pipeline-manager pipeline synth` prints this line
9
+ * when it fails inside CodeBuild; the events Lambda finds it in the failed
10
+ * build's CloudWatch log stream and attaches it to the execution event.
11
+ *
12
+ * Dependency-free so the events Lambda can bundle it.
13
+ */
14
+ /** Prefix of the line; the JSON payload follows after one space. */
15
+ export declare const SYNTH_FAILURE_MARKER = "PB_SYNTH_FAILURE";
16
+ /** One plugin the synth refused. */
17
+ export interface SynthFailurePlugin {
18
+ readonly plugin: string;
19
+ readonly code: string;
20
+ readonly message: string;
21
+ }
22
+ /** The structured synth failure. */
23
+ export interface SynthFailure {
24
+ /** One code for the whole failure: the refusal code when all agree, else `PLUGINS_REFUSED` / `SYNTH_FAILED`. */
25
+ readonly code: string;
26
+ readonly message: string;
27
+ readonly plugins: readonly SynthFailurePlugin[];
28
+ }
29
+ /** Build the failure from the refusals (empty for a failure that is not a plugin refusal). */
30
+ export declare function synthFailure(message: string, plugins?: readonly SynthFailurePlugin[]): SynthFailure;
31
+ /** The single log line for a failure. Newlines never appear inside it (JSON-escaped). */
32
+ export declare function formatSynthFailure(failure: SynthFailure): string;
33
+ /**
34
+ * Parse a log line (or a CloudWatch event message, which may carry a
35
+ * timestamp prefix) back into the failure. Returns null for any line that is
36
+ * not a well-formed failure line.
37
+ */
38
+ export declare function parseSynthFailure(line: string): SynthFailure | null;
@@ -0,0 +1,63 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * The machine-readable reason a synth failed, as ONE log line.
5
+ *
6
+ * A CodePipeline action failure event only carries CodeBuild's generic
7
+ * summary ("Error while executing command: pipeline-manager pipeline synth …
8
+ * exit status 1") — never the build's output — so the reason a plugin was
9
+ * refused (not installed, denied by policy, signature failure) was readable only
10
+ * by opening the build log. `pipeline-manager pipeline synth` prints this line
11
+ * when it fails inside CodeBuild; the events Lambda finds it in the failed
12
+ * build's CloudWatch log stream and attaches it to the execution event.
13
+ *
14
+ * Dependency-free so the events Lambda can bundle it.
15
+ */
16
+ /** Prefix of the line; the JSON payload follows after one space. */
17
+ export const SYNTH_FAILURE_MARKER = 'PB_SYNTH_FAILURE';
18
+ /** Caps keep the payload well inside the reporting ingest's 8 KB `detail` bound. */
19
+ const MAX_MESSAGE = 1000;
20
+ const MAX_PLUGINS = 10;
21
+ const MAX_PLUGIN_MESSAGE = 300;
22
+ const clip = (s, max) => (s.length > max ? `${s.slice(0, max - 1)}…` : s);
23
+ /** Build the failure from the refusals (empty for a failure that is not a plugin refusal). */
24
+ export function synthFailure(message, plugins = []) {
25
+ const codes = [...new Set(plugins.map((p) => p.code))];
26
+ const code = plugins.length === 0 ? 'SYNTH_FAILED' : codes.length === 1 ? codes[0] : 'PLUGINS_REFUSED';
27
+ return {
28
+ code,
29
+ message: clip(message, MAX_MESSAGE),
30
+ plugins: plugins.slice(0, MAX_PLUGINS).map((p) => ({
31
+ plugin: clip(p.plugin, 100),
32
+ code: clip(p.code, 100),
33
+ message: clip(p.message, MAX_PLUGIN_MESSAGE),
34
+ })),
35
+ };
36
+ }
37
+ /** The single log line for a failure. Newlines never appear inside it (JSON-escaped). */
38
+ export function formatSynthFailure(failure) {
39
+ return `${SYNTH_FAILURE_MARKER} ${JSON.stringify(failure)}`;
40
+ }
41
+ /**
42
+ * Parse a log line (or a CloudWatch event message, which may carry a
43
+ * timestamp prefix) back into the failure. Returns null for any line that is
44
+ * not a well-formed failure line.
45
+ */
46
+ export function parseSynthFailure(line) {
47
+ const at = line.indexOf(`${SYNTH_FAILURE_MARKER} {`);
48
+ if (at === -1)
49
+ return null;
50
+ try {
51
+ const parsed = JSON.parse(line.slice(at + SYNTH_FAILURE_MARKER.length + 1).trim());
52
+ if (typeof parsed.code !== 'string' || typeof parsed.message !== 'string')
53
+ return null;
54
+ const plugins = Array.isArray(parsed.plugins)
55
+ ? parsed.plugins.filter((p) => !!p && typeof p.plugin === 'string' && typeof p.code === 'string' && typeof p.message === 'string')
56
+ : [];
57
+ return { ...synthFailure(parsed.message, plugins), code: clip(parsed.code, 100) };
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGgtZmFpbHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3N5bnRoLWZhaWx1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsa0JBQWtCLENBQUM7QUFFdkQsb0ZBQW9GO0FBQ3BGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFpQi9CLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFFLEdBQVcsRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEcsOEZBQThGO0FBQzlGLE1BQU0sVUFBVSxZQUFZLENBQUMsT0FBZSxFQUFFLE9BQU8sR0FBa0MsRUFBRTtJQUN2RixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztJQUN4RyxPQUFPO1FBQ0wsSUFBSTtRQUNKLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztRQUNuQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7WUFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLENBQUM7U0FDN0MsQ0FBQyxDQUFDO0tBQ0osQ0FBQztBQUNKLENBQUM7QUFFRCx5RkFBeUY7QUFDekYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE9BQXFCO0lBQ3RELE9BQU8sR0FBRyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDOUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWTtJQUM1QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsb0JBQW9CLElBQUksQ0FBQyxDQUFDO0lBQ3JELElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzNCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUEwQixDQUFDO1FBQzVHLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQTJCLEVBQUUsQ0FDckQsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQztZQUNyRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsT0FBTyxFQUFFLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDcEYsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgbWFjaGluZS1yZWFkYWJsZSByZWFzb24gYSBzeW50aCBmYWlsZWQsIGFzIE9ORSBsb2cgbGluZS5cbiAqXG4gKiBBIENvZGVQaXBlbGluZSBhY3Rpb24gZmFpbHVyZSBldmVudCBvbmx5IGNhcnJpZXMgQ29kZUJ1aWxkJ3MgZ2VuZXJpY1xuICogc3VtbWFyeSAoXCJFcnJvciB3aGlsZSBleGVjdXRpbmcgY29tbWFuZDogcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCDigKZcbiAqIGV4aXQgc3RhdHVzIDFcIikg4oCUIG5ldmVyIHRoZSBidWlsZCdzIG91dHB1dCDigJQgc28gdGhlIHJlYXNvbiBhIHBsdWdpbiB3YXNcbiAqIHJlZnVzZWQgKG5vdCBpbnN0YWxsZWQsIGRlbmllZCBieSBwb2xpY3ksIHNpZ25hdHVyZSBmYWlsdXJlKSB3YXMgcmVhZGFibGUgb25seVxuICogYnkgb3BlbmluZyB0aGUgYnVpbGQgbG9nLiBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGAgcHJpbnRzIHRoaXMgbGluZVxuICogd2hlbiBpdCBmYWlscyBpbnNpZGUgQ29kZUJ1aWxkOyB0aGUgZXZlbnRzIExhbWJkYSBmaW5kcyBpdCBpbiB0aGUgZmFpbGVkXG4gKiBidWlsZCdzIENsb3VkV2F0Y2ggbG9nIHN0cmVhbSBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIGV4ZWN1dGlvbiBldmVudC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgc28gdGhlIGV2ZW50cyBMYW1iZGEgY2FuIGJ1bmRsZSBpdC5cbiAqL1xuXG4vKiogUHJlZml4IG9mIHRoZSBsaW5lOyB0aGUgSlNPTiBwYXlsb2FkIGZvbGxvd3MgYWZ0ZXIgb25lIHNwYWNlLiAqL1xuZXhwb3J0IGNvbnN0IFNZTlRIX0ZBSUxVUkVfTUFSS0VSID0gJ1BCX1NZTlRIX0ZBSUxVUkUnO1xuXG4vKiogQ2FwcyBrZWVwIHRoZSBwYXlsb2FkIHdlbGwgaW5zaWRlIHRoZSByZXBvcnRpbmcgaW5nZXN0J3MgOCBLQiBgZGV0YWlsYCBib3VuZC4gKi9cbmNvbnN0IE1BWF9NRVNTQUdFID0gMTAwMDtcbmNvbnN0IE1BWF9QTFVHSU5TID0gMTA7XG5jb25zdCBNQVhfUExVR0lOX01FU1NBR0UgPSAzMDA7XG5cbi8qKiBPbmUgcGx1Z2luIHRoZSBzeW50aCByZWZ1c2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50aEZhaWx1cmVQbHVnaW4ge1xuICByZWFkb25seSBwbHVnaW46IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgc3RydWN0dXJlZCBzeW50aCBmYWlsdXJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW50aEZhaWx1cmUge1xuICAvKiogT25lIGNvZGUgZm9yIHRoZSB3aG9sZSBmYWlsdXJlOiB0aGUgcmVmdXNhbCBjb2RlIHdoZW4gYWxsIGFncmVlLCBlbHNlIGBQTFVHSU5TX1JFRlVTRURgIC8gYFNZTlRIX0ZBSUxFRGAuICovXG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5zOiByZWFkb25seSBTeW50aEZhaWx1cmVQbHVnaW5bXTtcbn1cblxuY29uc3QgY2xpcCA9IChzOiBzdHJpbmcsIG1heDogbnVtYmVyKTogc3RyaW5nID0+IChzLmxlbmd0aCA+IG1heCA/IGAke3Muc2xpY2UoMCwgbWF4IC0gMSl94oCmYCA6IHMpO1xuXG4vKiogQnVpbGQgdGhlIGZhaWx1cmUgZnJvbSB0aGUgcmVmdXNhbHMgKGVtcHR5IGZvciBhIGZhaWx1cmUgdGhhdCBpcyBub3QgYSBwbHVnaW4gcmVmdXNhbCkuICovXG5leHBvcnQgZnVuY3Rpb24gc3ludGhGYWlsdXJlKG1lc3NhZ2U6IHN0cmluZywgcGx1Z2luczogcmVhZG9ubHkgU3ludGhGYWlsdXJlUGx1Z2luW10gPSBbXSk6IFN5bnRoRmFpbHVyZSB7XG4gIGNvbnN0IGNvZGVzID0gWy4uLm5ldyBTZXQocGx1Z2lucy5tYXAoKHApID0+IHAuY29kZSkpXTtcbiAgY29uc3QgY29kZSA9IHBsdWdpbnMubGVuZ3RoID09PSAwID8gJ1NZTlRIX0ZBSUxFRCcgOiBjb2Rlcy5sZW5ndGggPT09IDEgPyBjb2Rlc1swXSEgOiAnUExVR0lOU19SRUZVU0VEJztcbiAgcmV0dXJuIHtcbiAgICBjb2RlLFxuICAgIG1lc3NhZ2U6IGNsaXAobWVzc2FnZSwgTUFYX01FU1NBR0UpLFxuICAgIHBsdWdpbnM6IHBsdWdpbnMuc2xpY2UoMCwgTUFYX1BMVUdJTlMpLm1hcCgocCkgPT4gKHtcbiAgICAgIHBsdWdpbjogY2xpcChwLnBsdWdpbiwgMTAwKSxcbiAgICAgIGNvZGU6IGNsaXAocC5jb2RlLCAxMDApLFxuICAgICAgbWVzc2FnZTogY2xpcChwLm1lc3NhZ2UsIE1BWF9QTFVHSU5fTUVTU0FHRSksXG4gICAgfSkpLFxuICB9O1xufVxuXG4vKiogVGhlIHNpbmdsZSBsb2cgbGluZSBmb3IgYSBmYWlsdXJlLiBOZXdsaW5lcyBuZXZlciBhcHBlYXIgaW5zaWRlIGl0IChKU09OLWVzY2FwZWQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN5bnRoRmFpbHVyZShmYWlsdXJlOiBTeW50aEZhaWx1cmUpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7U1lOVEhfRkFJTFVSRV9NQVJLRVJ9ICR7SlNPTi5zdHJpbmdpZnkoZmFpbHVyZSl9YDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIGxvZyBsaW5lIChvciBhIENsb3VkV2F0Y2ggZXZlbnQgbWVzc2FnZSwgd2hpY2ggbWF5IGNhcnJ5IGFcbiAqIHRpbWVzdGFtcCBwcmVmaXgpIGJhY2sgaW50byB0aGUgZmFpbHVyZS4gUmV0dXJucyBudWxsIGZvciBhbnkgbGluZSB0aGF0IGlzXG4gKiBub3QgYSB3ZWxsLWZvcm1lZCBmYWlsdXJlIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN5bnRoRmFpbHVyZShsaW5lOiBzdHJpbmcpOiBTeW50aEZhaWx1cmUgfCBudWxsIHtcbiAgY29uc3QgYXQgPSBsaW5lLmluZGV4T2YoYCR7U1lOVEhfRkFJTFVSRV9NQVJLRVJ9IHtgKTtcbiAgaWYgKGF0ID09PSAtMSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShsaW5lLnNsaWNlKGF0ICsgU1lOVEhfRkFJTFVSRV9NQVJLRVIubGVuZ3RoICsgMSkudHJpbSgpKSBhcyBQYXJ0aWFsPFN5bnRoRmFpbHVyZT47XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQuY29kZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHBhcnNlZC5tZXNzYWdlICE9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcGx1Z2lucyA9IEFycmF5LmlzQXJyYXkocGFyc2VkLnBsdWdpbnMpXG4gICAgICA/IHBhcnNlZC5wbHVnaW5zLmZpbHRlcigocCk6IHAgaXMgU3ludGhGYWlsdXJlUGx1Z2luID0+XG4gICAgICAgICEhcCAmJiB0eXBlb2YgcC5wbHVnaW4gPT09ICdzdHJpbmcnICYmIHR5cGVvZiBwLmNvZGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBwLm1lc3NhZ2UgPT09ICdzdHJpbmcnKVxuICAgICAgOiBbXTtcbiAgICByZXR1cm4geyAuLi5zeW50aEZhaWx1cmUocGFyc2VkLm1lc3NhZ2UsIHBsdWdpbnMpLCBjb2RlOiBjbGlwKHBhcnNlZC5jb2RlLCAxMDApIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,20 @@
1
- import type { CloudFormationCustomResourceEvent, CloudFormationCustomResourceResponse } from 'aws-lambda';
1
+ import type { PluginFilter } from '@pipeline-builder/pipeline-data';
2
+ import type { CloudFormationCustomResourceEvent, CloudFormationCustomResourceResponse, Context } from 'aws-lambda';
3
+ /**
4
+ * A plain 429's `Retry-After` (delta-seconds) in ms, clipped to
5
+ * {@link HANDLER_RETRY_AFTER_MAX_MS}; `undefined` when absent or unparseable (an
6
+ * HTTP-date is not worth parsing for a wait this short — the backoff applies).
7
+ */
8
+ export declare function retryAfterMs(headers: unknown): number | undefined;
9
+ /** Truncate to `max` UTF-8 bytes on a character boundary, marking the cut. */
10
+ export declare function truncateReason(reason: string, max?: number): string;
11
+ /**
12
+ * The refusal as the plugin service wrote it — `code`, `message` and a compact
13
+ * rendering of `details` (the blocking CVEs, the policy that refused it…) —
14
+ * so the CloudFormation failure says WHY, not just "API error 409: Conflict".
15
+ * Only those three fields are read: the body is never echoed verbatim.
16
+ */
17
+ export declare function describeRefusal(status: number, statusText: string, body: unknown, filter?: PluginFilter): string;
2
18
  /**
3
19
  * Lambda handler for CloudFormation Custom Resource that performs plugin lookup.
4
20
  *
@@ -14,6 +30,7 @@ import type { CloudFormationCustomResourceEvent, CloudFormationCustomResourceRes
14
30
  * - Failure: Returns error message in Reason
15
31
  *
16
32
  * @param event - CloudFormation custom resource event
33
+ * @param context - Lambda context; its awsRequestId rides the lookup as `X-Request-Id`
17
34
  * @returns CloudFormation response
18
35
  *
19
36
  * @example
@@ -29,4 +46,4 @@ import type { CloudFormationCustomResourceEvent, CloudFormationCustomResourceRes
29
46
  * }
30
47
  * ```
31
48
  */
32
- export declare const handler: (event: CloudFormationCustomResourceEvent) => Promise<CloudFormationCustomResourceResponse>;
49
+ export declare const handler: (event: CloudFormationCustomResourceEvent, context?: Pick<Context, 'awsRequestId'>) => Promise<CloudFormationCustomResourceResponse>;
@@ -1,12 +1,16 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { Agent } from 'https';
3
4
  import axios, { AxiosError } from 'axios';
4
5
  // Import the dependency-free leaf, NOT `app-config.js`/`CoreConstants`: the latter
5
6
  // transitively pulls infrastructure-config → aws-cdk-lib, which esbuild then tries
6
7
  // to bundle into this Lambda (hundreds of MB → OOM/SIGKILL during cold-start synth).
7
- import { HANDLER_TIMEOUT_MS, HANDLER_MAX_RETRIES, HANDLER_RETRY_DELAY_MS, HANDLER_DEFAULT_BASE_URL, } from '../config/handler-constants.js';
8
- import { unwrapLookup } from '../core/plugin-lookup-envelope.js';
9
8
  import { createPlatformCredential, isCredentialRefusal } from './platform-credential.js';
9
+ import { HANDLER_TIMEOUT_MS, HANDLER_MAX_RETRIES, HANDLER_RETRY_DELAY_MS, HANDLER_RETRY_AFTER_MAX_MS, HANDLER_DEFAULT_BASE_URL, } from '../config/handler-constants.js';
10
+ import { correlationHeaders } from '../core/audit-correlation.js';
11
+ import { platformCaList } from '../core/platform-tls.js';
12
+ import { exactPinNotFoundMessage, lookupNotFoundState, unwrapLookup } from '../core/plugin-lookup-envelope.js';
13
+ import { describeQuotaExceeded } from '../core/quota-exceeded.js';
10
14
  /**
11
15
  * Structured logger for Lambda (outputs JSON to CloudWatch).
12
16
  * Debug messages only emitted when LOG_LEVEL=debug.
@@ -38,6 +42,18 @@ const RETRYABLE_CODES = new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT']);
38
42
  function sleep(ms) {
39
43
  return new Promise(resolve => setTimeout(resolve, ms));
40
44
  }
45
+ /**
46
+ * A plain 429's `Retry-After` (delta-seconds) in ms, clipped to
47
+ * {@link HANDLER_RETRY_AFTER_MAX_MS}; `undefined` when absent or unparseable (an
48
+ * HTTP-date is not worth parsing for a wait this short — the backoff applies).
49
+ */
50
+ export function retryAfterMs(headers) {
51
+ const raw = headers?.['retry-after'];
52
+ const seconds = typeof raw === 'string' || typeof raw === 'number' ? Number(raw) : NaN;
53
+ if (!Number.isFinite(seconds) || seconds < 0)
54
+ return undefined;
55
+ return Math.min(seconds * 1000, HANDLER_RETRY_AFTER_MAX_MS);
56
+ }
41
57
  /** Platform secret name — injected as PLATFORM_SECRET_NAME env var by PluginLookup construct. */
42
58
  const PLATFORM_SECRET_NAME = process.env.PLATFORM_SECRET_NAME;
43
59
  if (!PLATFORM_SECRET_NAME) {
@@ -55,20 +71,69 @@ export function _resetCredentialsCache() { credential.reset(); }
55
71
  /** The API refused the credential (401/403) — the caller may refresh it and retry once. */
56
72
  class CredentialRefusedError extends Error {
57
73
  }
74
+ /**
75
+ * CloudFormation caps a custom resource's `Reason` (the response body as a
76
+ * whole must stay under 4096 bytes, and the reason is what the console and
77
+ * `cdk deploy` print). Leave headroom for the other response fields.
78
+ */
79
+ const MAX_REASON_BYTES = 3500;
80
+ /** Truncate to `max` UTF-8 bytes on a character boundary, marking the cut. */
81
+ export function truncateReason(reason, max = MAX_REASON_BYTES) {
82
+ if (Buffer.byteLength(reason, 'utf8') <= max)
83
+ return reason;
84
+ const marker = ' …[truncated]';
85
+ let out = reason.slice(0, max);
86
+ while (Buffer.byteLength(out + marker, 'utf8') > max)
87
+ out = out.slice(0, -1);
88
+ return out + marker;
89
+ }
90
+ /**
91
+ * The refusal as the plugin service wrote it — `code`, `message` and a compact
92
+ * rendering of `details` (the blocking CVEs, the policy that refused it…) —
93
+ * so the CloudFormation failure says WHY, not just "API error 409: Conflict".
94
+ * Only those three fields are read: the body is never echoed verbatim.
95
+ */
96
+ export function describeRefusal(status, statusText, body, filter) {
97
+ const data = body && typeof body === 'object' ? body : {};
98
+ const code = typeof data.code === 'string' ? data.code : undefined;
99
+ const pin = typeof filter?.version === 'string' && /^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(filter.version) ? filter.version : undefined;
100
+ // An exact pin that does not resolve: phrase it from details.state, as the CLI does.
101
+ if (status === 404 && pin && typeof filter?.name === 'string') {
102
+ return `${code ?? 'NOT_FOUND'}: ${exactPinNotFoundMessage(filter.name, pin, lookupNotFoundState(body))}`;
103
+ }
104
+ const message = typeof data.message === 'string' && data.message.length > 0 ? data.message : `API error ${status}: ${statusText}`;
105
+ let details = '';
106
+ if (data.details !== undefined && data.details !== null) {
107
+ try {
108
+ details = ` — details: ${JSON.stringify(data.details)}`;
109
+ }
110
+ catch {
111
+ details = '';
112
+ }
113
+ }
114
+ return `${code ? `${code}: ` : ''}${message}${details}`;
115
+ }
58
116
  /**
59
117
  * Creates a pre-configured Axios instance for API requests.
60
118
  *
61
119
  * @param baseURL - Base URL of the target API
62
120
  * @param key - service-account key sent as the Bearer credential
121
+ * @param requestId - this Lambda invocation's awsRequestId, sent as `X-Request-Id`
122
+ * so the plugin service's audit row joins back to this invocation's log
63
123
  * @returns Configured Axios instance
64
124
  */
65
- function create(baseURL, key) {
125
+ function create(baseURL, key, requestId) {
126
+ // A private-CA platform is VERIFIED against PLATFORM_CA_BUNDLE (set by the
127
+ // PluginLookup construct when the synth had one); otherwise Node's default store.
128
+ const ca = platformCaList();
66
129
  return axios.create({
67
130
  baseURL,
68
131
  timeout: HANDLER_TIMEOUT_MS,
132
+ ...(ca && { httpsAgent: new Agent({ ca }) }),
69
133
  headers: {
70
134
  'Content-Type': 'application/json',
71
135
  'Authorization': `Bearer ${key}`,
136
+ ...correlationHeaders({ requestId }),
72
137
  },
73
138
  });
74
139
  }
@@ -78,31 +143,41 @@ function create(baseURL, key) {
78
143
  * with exponential backoff.
79
144
  *
80
145
  * @param api - Configured Axios instance
146
+ * @param baseURL - The platform URL `api` targets (prefixes a quota refusal's upgrade path)
81
147
  * @param pluginFilter - Filter criteria for the plugin lookup
82
148
  * @returns The plugin data returned by the API
83
149
  * @throws Error on persistent failure, timeout or invalid response
84
150
  */
85
- async function fetch(api, pluginFilter) {
151
+ async function fetch(api, baseURL, pluginFilter, stepKey) {
86
152
  lambdaLog.debug('FETCH', 'Starting plugin fetch', { filter: pluginFilter });
87
153
  let lastError;
154
+ // A plain 429's Retry-After, honoured on the next attempt when longer than the backoff.
155
+ let serverDelay;
88
156
  for (let attempt = 0; attempt <= HANDLER_MAX_RETRIES; attempt++) {
89
157
  if (attempt > 0) {
90
- const delay = HANDLER_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
158
+ const delay = Math.max(HANDLER_RETRY_DELAY_MS * Math.pow(2, attempt - 1), serverDelay ?? 0);
159
+ serverDelay = undefined;
91
160
  lambdaLog.info('RETRY', `Attempt ${attempt + 1}/${HANDLER_MAX_RETRIES + 1} after ${delay}ms`);
92
161
  await sleep(delay);
93
162
  }
94
163
  try {
164
+ // Contract C1: with a known pipeline + step, the plugin service records
165
+ // the warnings it returns against them (not only this Lambda's log).
166
+ const pipelineId = process.env.PIPELINE_ID;
95
167
  const { data: body, status } = await api.post('/api/plugins/lookup', {
96
168
  filter: pluginFilter,
169
+ ...(pipelineId && stepKey ? { context: { pipelineId, stepKeys: [stepKey] } } : {}),
97
170
  });
98
171
  const { plugin: data, warnings } = unwrapLookup(body);
99
172
  if (!data) {
100
173
  throw new Error('Empty response data from API');
101
174
  }
102
- // Lifecycle warnings (deprecated / yanked-but-pinned) — surfaced in the
103
- // deploy log; the lookup still succeeds.
104
- for (const message of warnings)
105
- lambdaLog.warn('LIFECYCLE', message, { plugin: data.name, version: data.version });
175
+ // Graded warnings (lifecycle, vulnerability, compliance) — surfaced in the
176
+ // deploy log; the lookup still succeeds. Vulnerability state never fails a
177
+ // deploy: it is reported (and, with context, recorded server-side).
178
+ for (const w of warnings) {
179
+ lambdaLog.warn('PLUGIN_WARNING', `[${w.severity.toUpperCase()}] ${w.message}`, { plugin: data.name, version: data.version, code: w.code, severity: w.severity });
180
+ }
106
181
  lambdaLog.info('FETCH', 'Plugin fetched successfully', {
107
182
  status,
108
183
  plugin: data.name,
@@ -117,11 +192,24 @@ async function fetch(api, pluginFilter) {
117
192
  lambdaLog.error('FETCH', `Plugin lookup timed out after ${HANDLER_TIMEOUT_MS}ms`);
118
193
  throw new Error(`Plugin lookup timed out after ${HANDLER_TIMEOUT_MS}ms`);
119
194
  }
195
+ // A QUOTA refusal is not transient: the counter only empties when the
196
+ // period resets, so retrying just spends two more lookups' worth of
197
+ // waiting and reports the same thing. Fail fast with the quota, the
198
+ // numbers, the reset date and where to raise it, as the CFN Reason.
199
+ const quotaMessage = error.response?.status === 429
200
+ ? describeQuotaExceeded(error.response.data, baseURL)
201
+ : undefined;
202
+ if (quotaMessage) {
203
+ lambdaLog.error('FETCH', quotaMessage);
204
+ throw new Error(`Failed to fetch plugin: ${quotaMessage}`);
205
+ }
120
206
  const retryable = error.response
121
207
  ? RETRYABLE_STATUSES.has(error.response.status)
122
208
  : RETRYABLE_CODES.has(error.code ?? '');
209
+ if (error.response?.status === 429)
210
+ serverDelay = retryAfterMs(error.response.headers);
123
211
  const msg = error.response
124
- ? `API error ${error.response.status}: ${error.response.statusText}`
212
+ ? describeRefusal(error.response.status, error.response.statusText, error.response.data, pluginFilter)
125
213
  : error.code || error.message;
126
214
  if (isCredentialRefusal(error.response?.status)) {
127
215
  lambdaLog.warn('AUTH', `Credential refused: ${msg}`);
@@ -151,16 +239,16 @@ async function fetch(api, pluginFilter) {
151
239
  * likely rotated underneath this warm container (token-renew stores the new key
152
240
  * and revokes the old one), so drop the cache, re-read the secret and retry once.
153
241
  */
154
- async function lookupWithCredentialRefresh(baseURL, pluginFilter) {
242
+ async function lookupWithCredentialRefresh(baseURL, pluginFilter, stepKey, requestId) {
155
243
  try {
156
- return await fetch(create(baseURL, await credential.getKey()), pluginFilter);
244
+ return await fetch(create(baseURL, await credential.getKey(), requestId), baseURL, pluginFilter, stepKey);
157
245
  }
158
246
  catch (err) {
159
247
  if (!(err instanceof CredentialRefusedError))
160
248
  throw err;
161
249
  credential.invalidate();
162
250
  lambdaLog.info('AUTH', 'Re-reading the service-account key from Secrets Manager and retrying once');
163
- return fetch(create(baseURL, await credential.getKey()), pluginFilter);
251
+ return fetch(create(baseURL, await credential.getKey(), requestId), baseURL, pluginFilter, stepKey);
164
252
  }
165
253
  }
166
254
  /**
@@ -195,6 +283,7 @@ function validatePluginFilter(pluginFilter) {
195
283
  * - Failure: Returns error message in Reason
196
284
  *
197
285
  * @param event - CloudFormation custom resource event
286
+ * @param context - Lambda context; its awsRequestId rides the lookup as `X-Request-Id`
198
287
  * @returns CloudFormation response
199
288
  *
200
289
  * @example
@@ -210,7 +299,7 @@ function validatePluginFilter(pluginFilter) {
210
299
  * }
211
300
  * ```
212
301
  */
213
- export const handler = async (event) => {
302
+ export const handler = async (event, context) => {
214
303
  // NOTE: never log event.StackId here — the CloudFormation Stack ARN embeds the
215
304
  // AWS account id (arn:aws:cloudformation:<region>:<ACCOUNT_ID>:stack/…), which
216
305
  // must never be persisted to CloudWatch. requestId + logicalResourceId are
@@ -245,7 +334,8 @@ export const handler = async (event) => {
245
334
  lambdaLog.info('CONFIG', 'Configuration loaded', { baseURL, pluginFilter });
246
335
  validatePluginFilter(pluginFilter);
247
336
  lambdaLog.info('FETCH', 'Initiating plugin lookup...');
248
- const plugin = await lookupWithCredentialRefresh(baseURL, pluginFilter);
337
+ const stepKey = typeof event.ResourceProperties.stepKey === 'string' ? event.ResourceProperties.stepKey : undefined;
338
+ const plugin = await lookupWithCredentialRefresh(baseURL, pluginFilter, stepKey, context?.awsRequestId);
249
339
  lambdaLog.info('FETCH', 'Plugin retrieved successfully', {
250
340
  name: plugin.name,
251
341
  version: plugin.version,
@@ -288,11 +378,11 @@ export const handler = async (event) => {
288
378
  return {
289
379
  ...baseResponse,
290
380
  Status: 'FAILED',
291
- Reason: reason,
381
+ Reason: truncateReason(reason),
292
382
  };
293
383
  }
294
384
  finally {
295
385
  lambdaLog.info('END', 'Custom resource execution completed');
296
386
  }
297
387
  };
298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL3BsdWdpbi1sb29rdXAtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBSXRDLE9BQU8sS0FBSyxFQUFFLEVBQXNCLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5RCxtRkFBbUY7QUFDbkYsbUZBQW1GO0FBQ25GLHFGQUFxRjtBQUNyRixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsd0JBQXdCLEdBQ3pCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpGOzs7R0FHRztBQUNILFNBQVMsUUFBUSxDQUFDLEtBQWEsRUFBRSxHQUFXLEVBQUUsT0FBZSxFQUFFLElBQWM7SUFDM0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekYsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssT0FBTztZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBQyxNQUFNO1FBQ3pDLEtBQUssTUFBTTtZQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFBQyxNQUFNO1FBQ3ZDLEtBQUssT0FBTztZQUFFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssT0FBTztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElB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QU0sRUFBRSxXQUFXLE1BQU0sQ0FBQyxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sMEJBQTBCO1lBQzdFLElBQUksRUFBRTtnQkFDSixXQUFXLEVBQUUsT0FBTzthQUNyQjtTQUNzQyxDQUFDO0lBQzVDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUM7UUFDcEYsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUU7WUFDekMsTUFBTTtZQUNOLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3hELENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxHQUFHLFlBQVk7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixNQUFNLEVBQUUsTUFBTTtTQUN5QixDQUFDO0lBQzVDLENBQUM7WUFBUyxDQUFDO1FBQ1QsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luRmlsdGVyLCBQbHVnaW4gfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhJztcbmltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50LCBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2UgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCBheGlvcywgeyB0eXBlIEF4aW9zSW5zdGFuY2UsIEF4aW9zRXJyb3IgfSBmcm9tICdheGlvcyc7XG4vLyBJbXBvcnQgdGhlIGRlcGVuZGVuY3ktZnJlZSBsZWFmLCBOT1QgYGFwcC1jb25maWcuanNgL2BDb3JlQ29uc3RhbnRzYDogdGhlIGxhdHRlclxuLy8gdHJhbnNpdGl2ZWx5IHB1bGxzIGluZnJhc3RydWN0dXJlLWNvbmZpZyDihpIgYXdzLWNkay1saWIsIHdoaWNoIGVzYnVpbGQgdGhlbiB0cmllc1xuLy8gdG8gYnVuZGxlIGludG8gdGhpcyBMYW1iZGEgKGh1bmRyZWRzIG9mIE1CIOKGkiBPT00vU0lHS0lMTCBkdXJpbmcgY29sZC1zdGFydCBzeW50aCkuXG5pbXBvcnQge1xuICBIQU5ETEVSX1RJTUVPVVRfTVMsXG4gIEhBTkRMRVJfTUFYX1JFVFJJRVMsXG4gIEhBTkRMRVJfUkVUUllfREVMQVlfTVMsXG4gIEhBTkRMRVJfREVGQVVMVF9CQVNFX1VSTCxcbn0gZnJvbSAnLi4vY29uZmlnL2hhbmRsZXItY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHVud3JhcExvb2t1cCB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQbGF0Zm9ybUNyZWRlbnRpYWwsIGlzQ3JlZGVudGlhbFJlZnVzYWwgfSBmcm9tICcuL3BsYXRmb3JtLWNyZWRlbnRpYWwuanMnO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQgbG9nZ2VyIGZvciBMYW1iZGEgKG91dHB1dHMgSlNPTiB0byBDbG91ZFdhdGNoKS5cbiAqIERlYnVnIG1lc3NhZ2VzIG9ubHkgZW1pdHRlZCB3aGVuIExPR19MRVZFTD1kZWJ1Zy5cbiAqL1xuZnVuY3Rpb24gbG9nRW50cnkobGV2ZWw6IHN0cmluZywgdGFnOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pIHtcbiAgY29uc3QgbGluZSA9IEpTT04uc3RyaW5naWZ5KHsgbGV2ZWwsIHRhZywgbWVzc2FnZSwgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgc3dpdGNoIChsZXZlbCkge1xuICAgIGNhc2UgJ0VSUk9SJzogY29uc29sZS5lcnJvcihsaW5lKTsgYnJlYWs7XG4gICAgY2FzZSAnV0FSTic6IGNvbnNvbGUud2FybihsaW5lKTsgYnJlYWs7XG4gICAgY2FzZSAnREVCVUcnOiBpZiAocHJvY2Vzcy5lbnYuTE9HX0xFVkVMID09PSAnZGVidWcnKSBjb25zb2xlLmRlYnVnKGxpbmUpOyBicmVhaztcbiAgICBkZWZhdWx0OiBjb25zb2xlLmxvZyhsaW5lKTtcbiAgfVxufVxuXG5jb25zdCBsYW1iZGFMb2cgPSB7XG4gIGluZm86ICh0YWc6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gbG9nRW50cnkoJ0lORk8nLCB0YWcsIG1lc3NhZ2UsIGRhdGEpLFxuICBlcnJvcjogKHRhZzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBsb2dFbnRyeSgnRVJST1InLCB0YWcsIG1lc3NhZ2UsIGRhdGEpLFxuICB3YXJuOiAodGFnOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGxvZ0VudHJ5KCdXQVJOJywgdGFnLCBtZXNzYWdlLCBkYXRhKSxcbiAgZGVidWc6ICh0YWc6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gbG9nRW50cnkoJ0RFQlVHJywgdGFnLCBtZXNzYWdlLCBkYXRhKSxcbn07XG5cbmNvbnN0IFJFVFJZQUJMRV9TVEFUVVNFUyA9IG5ldyBTZXQoWzQyOSwgNTAyLCA1MDMsIDUwNF0pO1xuY29uc3QgUkVUUllBQkxFX0NPREVTID0gbmV3IFNldChbJ0VDT05OUkVTRVQnLCAnRUNPTk5SRUZVU0VEJywgJ0VUSU1FRE9VVCddKTtcblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKiBQbGF0Zm9ybSBzZWNyZXQgbmFtZSDigJQgaW5qZWN0ZWQgYXMgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciBieSBQbHVnaW5Mb29rdXAgY29uc3RydWN0LiAqL1xuY29uc3QgUExBVEZPUk1fU0VDUkVUX05BTUUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbmlmICghUExBVEZPUk1fU0VDUkVUX05BTUUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9TRUNSRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2aWNlLWFjY291bnQga2V5IChgcGJfc2Ff4oCmYCkgZnJvbSBTZWNyZXRzIE1hbmFnZXIsIGNhY2hlZCBmb3IgdGhlIHdhcm1cbiAqIGNvbnRhaW5lci4gVGhlIHBsdWdpbiBBUEkgdHJhZGVzIGl0IGZvciBhIHNob3J0LWxpdmVkIEpXVCBpdHNlbGYsIHNvIHRoZSBrZXlcbiAqIGdvZXMgb3V0IGFzIHRoZSBCZWFyZXIgY3JlZGVudGlhbC4gQ3JlYXRlIHRoZSBzZWNyZXQgd2l0aFxuICogYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5gLlxuICovXG5jb25zdCBjcmVkZW50aWFsID0gY3JlYXRlUGxhdGZvcm1DcmVkZW50aWFsKHsgc2VjcmV0TmFtZTogUExBVEZPUk1fU0VDUkVUX05BTUUgfSk7XG5cbi8qKiBAaW50ZXJuYWwgUmVzZXQgY2FjaGVkIGNyZWRlbnRpYWwgKGZvciB0ZXN0aW5nIG9ubHkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldENyZWRlbnRpYWxzQ2FjaGUoKTogdm9pZCB7IGNyZWRlbnRpYWwucmVzZXQoKTsgfVxuXG4vKiogVGhlIEFQSSByZWZ1c2VkIHRoZSBjcmVkZW50aWFsICg0MDEvNDAzKSDigJQgdGhlIGNhbGxlciBtYXkgcmVmcmVzaCBpdCBhbmQgcmV0cnkgb25jZS4gKi9cbmNsYXNzIENyZWRlbnRpYWxSZWZ1c2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcmUtY29uZmlndXJlZCBBeGlvcyBpbnN0YW5jZSBmb3IgQVBJIHJlcXVlc3RzLlxuICpcbiAqIEBwYXJhbSBiYXNlVVJMIC0gQmFzZSBVUkwgb2YgdGhlIHRhcmdldCBBUElcbiAqIEBwYXJhbSBrZXkgLSBzZXJ2aWNlLWFjY291bnQga2V5IHNlbnQgYXMgdGhlIEJlYXJlciBjcmVkZW50aWFsXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIEF4aW9zIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShiYXNlVVJMOiBzdHJpbmcsIGtleTogc3RyaW5nKTogQXhpb3NJbnN0YW5jZSB7XG4gIHJldHVybiBheGlvcy5jcmVhdGUoe1xuICAgIGJhc2VVUkwsXG4gICAgdGltZW91dDogSEFORExFUl9USU1FT1VUX01TLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtrZXl9YCxcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIHBsdWdpbiBjb25maWd1cmF0aW9uIGZyb20gdGhlIGV4dGVybmFsIEFQSSB3aXRoIHJldHJ5IGxvZ2ljLlxuICogUmV0cmllcyBvbiB0cmFuc2llbnQgZmFpbHVyZXMgKDQyOSwgNTAyLCA1MDMsIDUwNCwgbmV0d29yayBlcnJvcnMpXG4gKiB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQHBhcmFtIGFwaSAtIENvbmZpZ3VyZWQgQXhpb3MgaW5zdGFuY2VcbiAqIEBwYXJhbSBwbHVnaW5GaWx0ZXIgLSBGaWx0ZXIgY3JpdGVyaWEgZm9yIHRoZSBwbHVnaW4gbG9va3VwXG4gKiBAcmV0dXJucyBUaGUgcGx1Z2luIGRhdGEgcmV0dXJuZWQgYnkgdGhlIEFQSVxuICogQHRocm93cyBFcnJvciBvbiBwZXJzaXN0ZW50IGZhaWx1cmUsIHRpbWVvdXQgb3IgaW52YWxpZCByZXNwb25zZVxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaChhcGk6IEF4aW9zSW5zdGFuY2UsIHBsdWdpbkZpbHRlcjogUGx1Z2luRmlsdGVyKTogUHJvbWlzZTxQbHVnaW4+IHtcbiAgbGFtYmRhTG9nLmRlYnVnKCdGRVRDSCcsICdTdGFydGluZyBwbHVnaW4gZmV0Y2gnLCB7IGZpbHRlcjogcGx1Z2luRmlsdGVyIH0pO1xuXG4gIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IEhBTkRMRVJfTUFYX1JFVFJJRVM7IGF0dGVtcHQrKykge1xuICAgIGlmIChhdHRlbXB0ID4gMCkge1xuICAgICAgY29uc3QgZGVsYXkgPSBIQU5ETEVSX1JFVFJZX0RFTEFZX01TICogTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpO1xuICAgICAgbGFtYmRhTG9nLmluZm8oJ1JFVFJZJywgYEF0dGVtcHQgJHthdHRlbXB0ICsgMX0vJHtIQU5ETEVSX01BWF9SRVRSSUVTICsgMX0gYWZ0ZXIgJHtkZWxheX1tc2ApO1xuICAgICAgYXdhaXQgc2xlZXAoZGVsYXkpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGE6IGJvZHksIHN0YXR1cyB9ID0gYXdhaXQgYXBpLnBvc3Q8dW5rbm93bj4oJy9hcGkvcGx1Z2lucy9sb29rdXAnLCB7XG4gICAgICAgIGZpbHRlcjogcGx1Z2luRmlsdGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHsgcGx1Z2luOiBkYXRhLCB3YXJuaW5ncyB9ID0gdW53cmFwTG9va3VwKGJvZHkpO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW1wdHkgcmVzcG9uc2UgZGF0YSBmcm9tIEFQSScpO1xuICAgICAgfVxuICAgICAgLy8gTGlmZWN5Y2xlIHdhcm5pbmdzIChkZXByZWNhdGVkIC8geWFua2VkLWJ1dC1waW5uZWQpIOKAlCBzdXJmYWNlZCBpbiB0aGVcbiAgICAgIC8vIGRlcGxveSBsb2c7IHRoZSBsb29rdXAgc3RpbGwgc3VjY2VlZHMuXG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2Ygd2FybmluZ3MpIGxhbWJkYUxvZy53YXJuKCdMSUZFQ1lDTEUnLCBtZXNzYWdlLCB7IHBsdWdpbjogZGF0YS5uYW1lLCB2ZXJzaW9uOiBkYXRhLnZlcnNpb24gfSk7XG5cbiAgICAgIGxhbWJkYUxvZy5pbmZvKCdGRVRDSCcsICdQbHVnaW4gZmV0Y2hlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgcGx1Z2luOiBkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGRhdGEudmVyc2lvbixcbiAgICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEF4aW9zRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFQ09OTkFCT1JURUQnKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLmVycm9yKCdGRVRDSCcsIGBQbHVnaW4gbG9va3VwIHRpbWVkIG91dCBhZnRlciAke0hBTkRMRVJfVElNRU9VVF9NU31tc2ApO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGxvb2t1cCB0aW1lZCBvdXQgYWZ0ZXIgJHtIQU5ETEVSX1RJTUVPVVRfTVN9bXNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldHJ5YWJsZSA9IGVycm9yLnJlc3BvbnNlXG4gICAgICAgICAgPyBSRVRSWUFCTEVfU1RBVFVTRVMuaGFzKGVycm9yLnJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgICA6IFJFVFJZQUJMRV9DT0RFUy5oYXMoZXJyb3IuY29kZSA/PyAnJyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gZXJyb3IucmVzcG9uc2VcbiAgICAgICAgICA/IGBBUEkgZXJyb3IgJHtlcnJvci5yZXNwb25zZS5zdGF0dXN9OiAke2Vycm9yLnJlc3BvbnNlLnN0YXR1c1RleHR9YFxuICAgICAgICAgIDogZXJyb3IuY29kZSB8fCBlcnJvci5tZXNzYWdlO1xuXG4gICAgICAgIGlmIChpc0NyZWRlbnRpYWxSZWZ1c2FsKGVycm9yLnJlc3BvbnNlPy5zdGF0dXMpKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLndhcm4oJ0FVVEgnLCBgQ3JlZGVudGlhbCByZWZ1c2VkOiAke21zZ31gKTtcbiAgICAgICAgICB0aHJvdyBuZXcgQ3JlZGVudGlhbFJlZnVzZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHBsdWdpbjogJHttc2d9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0cnlhYmxlICYmIGF0dGVtcHQgPCBIQU5ETEVSX01BWF9SRVRSSUVTKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLmluZm8oJ1JFVFJZJywgYFJldHJ5YWJsZSBlcnJvcjogJHttc2d9YCwgeyBhdHRlbXB0OiBhdHRlbXB0ICsgMSB9KTtcbiAgICAgICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBwbHVnaW46ICR7bXNnfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgbG9nIHRoZSB1cHN0cmVhbSBib2R5IHZlcmJhdGltIOKAlCBpdCBtYXkgY2FycnkgYSBzdGFjayB0cmFjZSxcbiAgICAgICAgLy8gYSByZXF1ZXN0IHBheWxvYWQgZWNobywgb3Igb3RoZXIgc2Vuc2l0aXZlIGRhdGEgd2Ugc2hvdWxkbid0IGVjaG9cbiAgICAgICAgLy8gaW50byBMYW1iZGEgQ2xvdWRXYXRjaCBsb2dzLiBLZWVwIGp1c3QgdGhlIGhpZ2gtbGV2ZWwgc2hhcGUuXG4gICAgICAgIGNvbnN0IHNhZmVCb2R5ID0gZXJyb3IucmVzcG9uc2U/LmRhdGEgJiYgdHlwZW9mIGVycm9yLnJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyB7IGNvZGU6IChlcnJvci5yZXNwb25zZS5kYXRhIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlLCBtZXNzYWdlOiAoZXJyb3IucmVzcG9uc2UuZGF0YSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSkubWVzc2FnZSB9XG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxhbWJkYUxvZy5lcnJvcignRkVUQ0gnLCBtc2csIHsgcmVzcG9uc2VCb2R5OiBzYWZlQm9keSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggcGx1Z2luOiAke21zZ31gKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKCdVbmtub3duIGVycm9yIGR1cmluZyBwbHVnaW4gZmV0Y2gnKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBsYXN0RXJyb3IgPz8gbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggcGx1Z2luIGFmdGVyIHJldHJpZXMnKTtcbn1cblxuLyoqXG4gKiBMb29rIHRoZSBwbHVnaW4gdXAgd2l0aCB0aGUgY2FjaGVkIGNyZWRlbnRpYWwuIE9uIGEgNDAxLzQwMyB0aGUga2V5IHdhcyBtb3N0XG4gKiBsaWtlbHkgcm90YXRlZCB1bmRlcm5lYXRoIHRoaXMgd2FybSBjb250YWluZXIgKHRva2VuLXJlbmV3IHN0b3JlcyB0aGUgbmV3IGtleVxuICogYW5kIHJldm9rZXMgdGhlIG9sZCBvbmUpLCBzbyBkcm9wIHRoZSBjYWNoZSwgcmUtcmVhZCB0aGUgc2VjcmV0IGFuZCByZXRyeSBvbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb29rdXBXaXRoQ3JlZGVudGlhbFJlZnJlc2goYmFzZVVSTDogc3RyaW5nLCBwbHVnaW5GaWx0ZXI6IFBsdWdpbkZpbHRlcik6IFByb21pc2U8UGx1Z2luPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZldGNoKGNyZWF0ZShiYXNlVVJMLCBhd2FpdCBjcmVkZW50aWFsLmdldEtleSgpKSwgcGx1Z2luRmlsdGVyKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCEoZXJyIGluc3RhbmNlb2YgQ3JlZGVudGlhbFJlZnVzZWRFcnJvcikpIHRocm93IGVycjtcbiAgICBjcmVkZW50aWFsLmludmFsaWRhdGUoKTtcbiAgICBsYW1iZGFMb2cuaW5mbygnQVVUSCcsICdSZS1yZWFkaW5nIHRoZSBzZXJ2aWNlLWFjY291bnQga2V5IGZyb20gU2VjcmV0cyBNYW5hZ2VyIGFuZCByZXRyeWluZyBvbmNlJyk7XG4gICAgcmV0dXJuIGZldGNoKGNyZWF0ZShiYXNlVVJMLCBhd2FpdCBjcmVkZW50aWFsLmdldEtleSgpKSwgcGx1Z2luRmlsdGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgcGx1Z2luIGZpbHRlciBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcGx1Z2luRmlsdGVyIC0gRmlsdGVyIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkXG4gKiBAdGhyb3dzIEVycm9yIGlmIGludmFsaWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQbHVnaW5GaWx0ZXIocGx1Z2luRmlsdGVyOiB1bmtub3duKTogcGx1Z2luRmlsdGVyIGlzIFBsdWdpbkZpbHRlciB7XG4gIGlmICghcGx1Z2luRmlsdGVyIHx8IHR5cGVvZiBwbHVnaW5GaWx0ZXIgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgcGx1Z2luRmlsdGVyJyk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXIgPSBwbHVnaW5GaWx0ZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICghZmlsdGVyLm5hbWUgJiYgIWZpbHRlci5pZCAmJiAhZmlsdGVyLnZlcnNpb24gJiYgIWZpbHRlci5vcmdJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGx1Z2luRmlsdGVyIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY3JpdGVyaW9uIChuYW1lLCBpZCwgdmVyc2lvbiwgb3Igb3JnSWQpJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgaGFuZGxlciBmb3IgQ2xvdWRGb3JtYXRpb24gQ3VzdG9tIFJlc291cmNlIHRoYXQgcGVyZm9ybXMgcGx1Z2luIGxvb2t1cC5cbiAqXG4gKiBBdXRoZW50aWNhdGVzIHdpdGggdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyIChQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyKS5cbiAqIENyZWF0ZSB0aGUgc2VjcmV0IHdpdGg6IGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYFxuICpcbiAqIFJlcXVlc3QgVHlwZXM6XG4gKiAtIENyZWF0ZS9VcGRhdGU6IGZldGNoZXMgYW5kIHJldHVybnMgcGx1Z2luIGNvbmZpZ3VyYXRpb24gZnJvbSBBUElcbiAqIC0gRGVsZXRlOiBuby1vcCAoYWx3YXlzIHN1Y2NlZWRzKVxuICpcbiAqIFJlc3BvbnNlOlxuICogLSBTdWNjZXNzOiBSZXR1cm5zIGJhc2U2NC1lbmNvZGVkIHBsdWdpbiBKU09OIGluIERhdGEuUmVzdWx0VmFsdWVcbiAqIC0gRmFpbHVyZTogUmV0dXJucyBlcnJvciBtZXNzYWdlIGluIFJlYXNvblxuICpcbiAqIEBwYXJhbSBldmVudCAtIENsb3VkRm9ybWF0aW9uIGN1c3RvbSByZXNvdXJjZSBldmVudFxuICogQHJldHVybnMgQ2xvdWRGb3JtYXRpb24gcmVzcG9uc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIFJlc291cmNlIFByb3BlcnRpZXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiYmFzZVVSTFwiOiBcImh0dHBzOi8vYXBpLmV4YW1wbGUuY29tXCIsXG4gKiAgIFwicGx1Z2luRmlsdGVyXCI6IHtcbiAqICAgICBcIm5hbWVcIjogXCJub2RlanMtYnVpbGRcIixcbiAqICAgICBcInZlcnNpb25cIjogXCIxLjAuMFwiLFxuICogICAgIFwiaXNBY3RpdmVcIjogdHJ1ZVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoXG4gIGV2ZW50OiBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsXG4pOiBQcm9taXNlPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZT4gPT4ge1xuICAvLyBOT1RFOiBuZXZlciBsb2cgZXZlbnQuU3RhY2tJZCBoZXJlIOKAlCB0aGUgQ2xvdWRGb3JtYXRpb24gU3RhY2sgQVJOIGVtYmVkcyB0aGVcbiAgLy8gQVdTIGFjY291bnQgaWQgKGFybjphd3M6Y2xvdWRmb3JtYXRpb246PHJlZ2lvbj46PEFDQ09VTlRfSUQ+OnN0YWNrL+KApiksIHdoaWNoXG4gIC8vIG11c3QgbmV2ZXIgYmUgcGVyc2lzdGVkIHRvIENsb3VkV2F0Y2guIHJlcXVlc3RJZCArIGxvZ2ljYWxSZXNvdXJjZUlkIGFyZVxuICAvLyBzdWZmaWNpZW50IGZvciBjb3JyZWxhdGlvbi4gKFN0YWNrSWQgaXMgc3RpbGwgcmV0dXJuZWQgaW4gdGhlIENGTiByZXNwb25zZVxuICAvLyBib2R5IGJlbG93IOKAlCB0aGF0IGlzIHRoZSBtYW5kYXRvcnkgQ0ZOIHByb3RvY29sIGZpZWxkIGFuZCBpcyBub3QgYSBsb2cuKVxuICBsYW1iZGFMb2cuaW5mbygnU1RBUlQnLCBgJHtldmVudC5SZXF1ZXN0VHlwZX0gcmVxdWVzdCByZWNlaXZlZGAsIHtcbiAgICBsb2dpY2FsUmVzb3VyY2VJZDogZXZlbnQuTG9naWNhbFJlc291cmNlSWQsXG4gICAgcmVxdWVzdElkOiBldmVudC5SZXF1ZXN0SWQsXG4gIH0pO1xuXG4gIGNvbnN0IGJhc2VSZXNwb25zZTogUGFydGlhbDxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U+ID0ge1xuICAgIFN0YWNrSWQ6IGV2ZW50LlN0YWNrSWQsXG4gICAgUmVxdWVzdElkOiBldmVudC5SZXF1ZXN0SWQsXG4gICAgTG9naWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogZXZlbnQuTG9naWNhbFJlc291cmNlSWQsXG4gIH07XG5cbiAgdHJ5IHtcbiAgICAvLyBIYW5kbGUgRGVsZXRlIC0gYWx3YXlzIHN1Y2NlZWQgKG5vLW9wKVxuICAgIGlmIChldmVudC5SZXF1ZXN0VHlwZSA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgIGxhbWJkYUxvZy5pbmZvKCdERUxFVEUnLCAnTm8tb3AgLSByZXR1cm5pbmcgU1VDQ0VTUycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgICBTdGF0dXM6ICdTVUNDRVNTJyxcbiAgICAgICAgUmVhc29uOiAnRGVsZXRlIGNvbXBsZXRlZCAobm8tb3ApJyxcbiAgICAgIH0gYXMgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgYW5kIHZhbGlkYXRlIHByb3BlcnRpZXNcbiAgICBjb25zdCBwbHVnaW5GaWx0ZXIgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMucGx1Z2luRmlsdGVyO1xuICAgIGNvbnN0IGJhc2VVUkwgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuYmFzZVVSTCB8fCBIQU5ETEVSX0RFRkFVTFRfQkFTRV9VUkw7XG5cbiAgICBpZiAoIWJhc2VVUkwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSAmJiAhYmFzZVVSTC5zdGFydHNXaXRoKCdodHRwOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXNlVVJMOiBcIiR7YmFzZVVSTH1cIiDigJQgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly9gKTtcbiAgICB9XG5cbiAgICBsYW1iZGFMb2cuaW5mbygnQ09ORklHJywgJ0NvbmZpZ3VyYXRpb24gbG9hZGVkJywgeyBiYXNlVVJMLCBwbHVnaW5GaWx0ZXIgfSk7XG5cbiAgICB2YWxpZGF0ZVBsdWdpbkZpbHRlcihwbHVnaW5GaWx0ZXIpO1xuXG4gICAgbGFtYmRhTG9nLmluZm8oJ0ZFVENIJywgJ0luaXRpYXRpbmcgcGx1Z2luIGxvb2t1cC4uLicpO1xuICAgIGNvbnN0IHBsdWdpbiA9IGF3YWl0IGxvb2t1cFdpdGhDcmVkZW50aWFsUmVmcmVzaChiYXNlVVJMLCBwbHVnaW5GaWx0ZXIpO1xuICAgIGxhbWJkYUxvZy5pbmZvKCdGRVRDSCcsICdQbHVnaW4gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgIG5hbWU6IHBsdWdpbi5uYW1lLFxuICAgICAgdmVyc2lvbjogcGx1Z2luLnZlcnNpb24sXG4gICAgICBpZDogcGx1Z2luLmlkLFxuICAgIH0pO1xuXG4gICAgLy8gU3RyaXAgbGFyZ2UgZmllbGRzIHRvIHN0YXkgd2l0aGluIENsb3VkRm9ybWF0aW9uJ3MgNDA5Ni1ieXRlIERhdGEgbGltaXQuXG4gICAgLy8gQ0RLIGNvbnN0cnVjdHMgb25seSBuZWVkIHRoZSBmaWVsZHMgdXNlZCBieSBjcmVhdGVDb2RlQnVpbGRTdGVwKCkuXG4gICAgY29uc3Qgc2xpbSA9IHtcbiAgICAgIGlkOiBwbHVnaW4uaWQsXG4gICAgICBuYW1lOiBwbHVnaW4ubmFtZSxcbiAgICAgIHZlcnNpb246IHBsdWdpbi52ZXJzaW9uLFxuICAgICAgcGx1Z2luVHlwZTogcGx1Z2luLnBsdWdpblR5cGUsXG4gICAgICBjb21wdXRlVHlwZTogcGx1Z2luLmNvbXB1dGVUeXBlLFxuICAgICAgY29tbWFuZHM6IHBsdWdpbi5jb21tYW5kcyxcbiAgICAgIGluc3RhbGxDb21tYW5kczogcGx1Z2luLmluc3RhbGxDb21tYW5kcyxcbiAgICAgIGVudjogcGx1Z2luLmVudixcbiAgICAgIG1ldGFkYXRhOiBwbHVnaW4ubWV0YWRhdGEsXG4gICAgICBwcmltYXJ5T3V0cHV0RGlyZWN0b3J5OiBwbHVnaW4ucHJpbWFyeU91dHB1dERpcmVjdG9yeSxcbiAgICAgIHNlY3JldHM6IHBsdWdpbi5zZWNyZXRzLFxuICAgICAgZmFpbHVyZUJlaGF2aW9yOiBwbHVnaW4uZmFpbHVyZUJlaGF2aW9yLFxuICAgICAgdGltZW91dDogcGx1Z2luLnRpbWVvdXQsXG4gICAgfTtcblxuICAgIGNvbnN0IGVuY29kZWQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShzbGltKSwgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIGxhbWJkYUxvZy5kZWJ1ZygnRU5DT0RFJywgJ0VuY29kZWQgcGx1Z2luIGRhdGEnLCB7IGxlbmd0aDogZW5jb2RlZC5sZW5ndGggfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgU3RhdHVzOiAnU1VDQ0VTUycsXG4gICAgICBSZWFzb246IGBQbHVnaW4gJyR7cGx1Z2luLm5hbWV9JyAodiR7cGx1Z2luLnZlcnNpb259KSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5YCxcbiAgICAgIERhdGE6IHtcbiAgICAgICAgUmVzdWx0VmFsdWU6IGVuY29kZWQsXG4gICAgICB9LFxuICAgIH0gYXMgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1VuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnO1xuICAgIGxhbWJkYUxvZy5lcnJvcignRVJST1InLCAnSGFuZGxlciBmYWlsZWQnLCB7XG4gICAgICByZWFzb24sXG4gICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2VSZXNwb25zZSxcbiAgICAgIFN0YXR1czogJ0ZBSUxFRCcsXG4gICAgICBSZWFzb246IHJlYXNvbixcbiAgICB9IGFzIENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBsYW1iZGFMb2cuaW5mbygnRU5EJywgJ0N1c3RvbSByZXNvdXJjZSBleGVjdXRpb24gY29tcGxldGVkJyk7XG4gIH1cbn07XG4iXX0=
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZXJzL3BsdWdpbi1sb29rdXAtaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFHOUIsT0FBTyxLQUFLLEVBQUUsRUFBc0IsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlELG1GQUFtRjtBQUNuRixtRkFBbUY7QUFDbkYscUZBQXFGO0FBQ3JGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pGLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QiwwQkFBMEIsRUFDMUIsd0JBQXdCLEdBQ3pCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRTs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLE9BQWUsRUFBRSxJQUFjO0lBQzNFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFL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QUUscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFN0UsT0FBTztZQUNMLEdBQUcsWUFBWTtZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxXQUFXLE1BQU0sQ0FBQyxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sMEJBQTBCO1lBQzdFLElBQUksRUFBRTtnQkFDSixXQUFXLEVBQUUsT0FBTzthQUNyQjtTQUNzQyxDQUFDO0lBQzVDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUM7UUFDcEYsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUU7WUFDekMsTUFBTTtZQUNOLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3hELENBQUMsQ0FBQztRQUVILE9BQU87WUFDTCxHQUFHLFlBQVk7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQztTQUNTLENBQUM7SUFDNUMsQ0FBQztZQUFTLENBQUM7UUFDVCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICdodHRwcyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbkZpbHRlciwgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgdHlwZSB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlLCBDb250ZXh0IH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgYXhpb3MsIHsgdHlwZSBBeGlvc0luc3RhbmNlLCBBeGlvc0Vycm9yIH0gZnJvbSAnYXhpb3MnO1xuLy8gSW1wb3J0IHRoZSBkZXBlbmRlbmN5LWZyZWUgbGVhZiwgTk9UIGBhcHAtY29uZmlnLmpzYC9gQ29yZUNvbnN0YW50c2A6IHRoZSBsYXR0ZXJcbi8vIHRyYW5zaXRpdmVseSBwdWxscyBpbmZyYXN0cnVjdHVyZS1jb25maWcg4oaSIGF3cy1jZGstbGliLCB3aGljaCBlc2J1aWxkIHRoZW4gdHJpZXNcbi8vIHRvIGJ1bmRsZSBpbnRvIHRoaXMgTGFtYmRhIChodW5kcmVkcyBvZiBNQiDihpIgT09NL1NJR0tJTEwgZHVyaW5nIGNvbGQtc3RhcnQgc3ludGgpLlxuaW1wb3J0IHsgY3JlYXRlUGxhdGZvcm1DcmVkZW50aWFsLCBpc0NyZWRlbnRpYWxSZWZ1c2FsIH0gZnJvbSAnLi9wbGF0Zm9ybS1jcmVkZW50aWFsLmpzJztcbmltcG9ydCB7XG4gIEhBTkRMRVJfVElNRU9VVF9NUyxcbiAgSEFORExFUl9NQVhfUkVUUklFUyxcbiAgSEFORExFUl9SRVRSWV9ERUxBWV9NUyxcbiAgSEFORExFUl9SRVRSWV9BRlRFUl9NQVhfTVMsXG4gIEhBTkRMRVJfREVGQVVMVF9CQVNFX1VSTCxcbn0gZnJvbSAnLi4vY29uZmlnL2hhbmRsZXItY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGNvcnJlbGF0aW9uSGVhZGVycyB9IGZyb20gJy4uL2NvcmUvYXVkaXQtY29ycmVsYXRpb24uanMnO1xuaW1wb3J0IHsgcGxhdGZvcm1DYUxpc3QgfSBmcm9tICcuLi9jb3JlL3BsYXRmb3JtLXRscy5qcyc7XG5pbXBvcnQgeyBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZSwgbG9va3VwTm90Rm91bmRTdGF0ZSwgdW53cmFwTG9va3VwIH0gZnJvbSAnLi4vY29yZS9wbHVnaW4tbG9va3VwLWVudmVsb3BlLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlUXVvdGFFeGNlZWRlZCB9IGZyb20gJy4uL2NvcmUvcXVvdGEtZXhjZWVkZWQuanMnO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQgbG9nZ2VyIGZvciBMYW1iZGEgKG91dHB1dHMgSlNPTiB0byBDbG91ZFdhdGNoKS5cbiAqIERlYnVnIG1lc3NhZ2VzIG9ubHkgZW1pdHRlZCB3aGVuIExPR19MRVZFTD1kZWJ1Zy5cbiAqL1xuZnVuY3Rpb24gbG9nRW50cnkobGV2ZWw6IHN0cmluZywgdGFnOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pIHtcbiAgY29uc3QgbGluZSA9IEpTT04uc3RyaW5naWZ5KHsgbGV2ZWwsIHRhZywgbWVzc2FnZSwgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KTtcbiAgc3dpdGNoIChsZXZlbCkge1xuICAgIGNhc2UgJ0VSUk9SJzogY29uc29sZS5lcnJvcihsaW5lKTsgYnJlYWs7XG4gICAgY2FzZSAnV0FSTic6IGNvbnNvbGUud2FybihsaW5lKTsgYnJlYWs7XG4gICAgY2FzZSAnREVCVUcnOiBpZiAocHJvY2Vzcy5lbnYuTE9HX0xFVkVMID09PSAnZGVidWcnKSBjb25zb2xlLmRlYnVnKGxpbmUpOyBicmVhaztcbiAgICBkZWZhdWx0OiBjb25zb2xlLmxvZyhsaW5lKTtcbiAgfVxufVxuXG5jb25zdCBsYW1iZGFMb2cgPSB7XG4gIGluZm86ICh0YWc6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gbG9nRW50cnkoJ0lORk8nLCB0YWcsIG1lc3NhZ2UsIGRhdGEpLFxuICBlcnJvcjogKHRhZzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBsb2dFbnRyeSgnRVJST1InLCB0YWcsIG1lc3NhZ2UsIGRhdGEpLFxuICB3YXJuOiAodGFnOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGxvZ0VudHJ5KCdXQVJOJywgdGFnLCBtZXNzYWdlLCBkYXRhKSxcbiAgZGVidWc6ICh0YWc6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gbG9nRW50cnkoJ0RFQlVHJywgdGFnLCBtZXNzYWdlLCBkYXRhKSxcbn07XG5cbmNvbnN0IFJFVFJZQUJMRV9TVEFUVVNFUyA9IG5ldyBTZXQoWzQyOSwgNTAyLCA1MDMsIDUwNF0pO1xuY29uc3QgUkVUUllBQkxFX0NPREVTID0gbmV3IFNldChbJ0VDT05OUkVTRVQnLCAnRUNPTk5SRUZVU0VEJywgJ0VUSU1FRE9VVCddKTtcblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQSBwbGFpbiA0MjkncyBgUmV0cnktQWZ0ZXJgIChkZWx0YS1zZWNvbmRzKSBpbiBtcywgY2xpcHBlZCB0b1xuICoge0BsaW5rIEhBTkRMRVJfUkVUUllfQUZURVJfTUFYX01TfTsgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgdW5wYXJzZWFibGUgKGFuXG4gKiBIVFRQLWRhdGUgaXMgbm90IHdvcnRoIHBhcnNpbmcgZm9yIGEgd2FpdCB0aGlzIHNob3J0IOKAlCB0aGUgYmFja29mZiBhcHBsaWVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5QWZ0ZXJNcyhoZWFkZXJzOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gKGhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5bJ3JldHJ5LWFmdGVyJ107XG4gIGNvbnN0IHNlY29uZHMgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyA/IE51bWJlcihyYXcpIDogTmFOO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShzZWNvbmRzKSB8fCBzZWNvbmRzIDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGgubWluKHNlY29uZHMgKiAxMDAwLCBIQU5ETEVSX1JFVFJZX0FGVEVSX01BWF9NUyk7XG59XG5cbi8qKiBQbGF0Zm9ybSBzZWNyZXQgbmFtZSDigJQgaW5qZWN0ZWQgYXMgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciBieSBQbHVnaW5Mb29rdXAgY29uc3RydWN0LiAqL1xuY29uc3QgUExBVEZPUk1fU0VDUkVUX05BTUUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbmlmICghUExBVEZPUk1fU0VDUkVUX05BTUUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdQTEFURk9STV9TRUNSRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2aWNlLWFjY291bnQga2V5IChgcGJfc2Ff4oCmYCkgZnJvbSBTZWNyZXRzIE1hbmFnZXIsIGNhY2hlZCBmb3IgdGhlIHdhcm1cbiAqIGNvbnRhaW5lci4gVGhlIHBsdWdpbiBBUEkgdHJhZGVzIGl0IGZvciBhIHNob3J0LWxpdmVkIEpXVCBpdHNlbGYsIHNvIHRoZSBrZXlcbiAqIGdvZXMgb3V0IGFzIHRoZSBCZWFyZXIgY3JlZGVudGlhbC4gQ3JlYXRlIHRoZSBzZWNyZXQgd2l0aFxuICogYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW5gLlxuICovXG5jb25zdCBjcmVkZW50aWFsID0gY3JlYXRlUGxhdGZvcm1DcmVkZW50aWFsKHsgc2VjcmV0TmFtZTogUExBVEZPUk1fU0VDUkVUX05BTUUgfSk7XG5cbi8qKiBAaW50ZXJuYWwgUmVzZXQgY2FjaGVkIGNyZWRlbnRpYWwgKGZvciB0ZXN0aW5nIG9ubHkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldENyZWRlbnRpYWxzQ2FjaGUoKTogdm9pZCB7IGNyZWRlbnRpYWwucmVzZXQoKTsgfVxuXG4vKiogVGhlIEFQSSByZWZ1c2VkIHRoZSBjcmVkZW50aWFsICg0MDEvNDAzKSDigJQgdGhlIGNhbGxlciBtYXkgcmVmcmVzaCBpdCBhbmQgcmV0cnkgb25jZS4gKi9cbmNsYXNzIENyZWRlbnRpYWxSZWZ1c2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIENsb3VkRm9ybWF0aW9uIGNhcHMgYSBjdXN0b20gcmVzb3VyY2UncyBgUmVhc29uYCAodGhlIHJlc3BvbnNlIGJvZHkgYXMgYVxuICogd2hvbGUgbXVzdCBzdGF5IHVuZGVyIDQwOTYgYnl0ZXMsIGFuZCB0aGUgcmVhc29uIGlzIHdoYXQgdGhlIGNvbnNvbGUgYW5kXG4gKiBgY2RrIGRlcGxveWAgcHJpbnQpLiBMZWF2ZSBoZWFkcm9vbSBmb3IgdGhlIG90aGVyIHJlc3BvbnNlIGZpZWxkcy5cbiAqL1xuY29uc3QgTUFYX1JFQVNPTl9CWVRFUyA9IDM1MDA7XG5cbi8qKiBUcnVuY2F0ZSB0byBgbWF4YCBVVEYtOCBieXRlcyBvbiBhIGNoYXJhY3RlciBib3VuZGFyeSwgbWFya2luZyB0aGUgY3V0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlUmVhc29uKHJlYXNvbjogc3RyaW5nLCBtYXggPSBNQVhfUkVBU09OX0JZVEVTKTogc3RyaW5nIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbiwgJ3V0ZjgnKSA8PSBtYXgpIHJldHVybiByZWFzb247XG4gIGNvbnN0IG1hcmtlciA9ICcg4oCmW3RydW5jYXRlZF0nO1xuICBsZXQgb3V0ID0gcmVhc29uLnNsaWNlKDAsIG1heCk7XG4gIHdoaWxlIChCdWZmZXIuYnl0ZUxlbmd0aChvdXQgKyBtYXJrZXIsICd1dGY4JykgPiBtYXgpIG91dCA9IG91dC5zbGljZSgwLCAtMSk7XG4gIHJldHVybiBvdXQgKyBtYXJrZXI7XG59XG5cbi8qKlxuICogVGhlIHJlZnVzYWwgYXMgdGhlIHBsdWdpbiBzZXJ2aWNlIHdyb3RlIGl0IOKAlCBgY29kZWAsIGBtZXNzYWdlYCBhbmQgYSBjb21wYWN0XG4gKiByZW5kZXJpbmcgb2YgYGRldGFpbHNgICh0aGUgYmxvY2tpbmcgQ1ZFcywgdGhlIHBvbGljeSB0aGF0IHJlZnVzZWQgaXTigKYpIOKAlFxuICogc28gdGhlIENsb3VkRm9ybWF0aW9uIGZhaWx1cmUgc2F5cyBXSFksIG5vdCBqdXN0IFwiQVBJIGVycm9yIDQwOTogQ29uZmxpY3RcIi5cbiAqIE9ubHkgdGhvc2UgdGhyZWUgZmllbGRzIGFyZSByZWFkOiB0aGUgYm9keSBpcyBuZXZlciBlY2hvZWQgdmVyYmF0aW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZVJlZnVzYWwoc3RhdHVzOiBudW1iZXIsIHN0YXR1c1RleHQ6IHN0cmluZywgYm9keTogdW5rbm93biwgZmlsdGVyPzogUGx1Z2luRmlsdGVyKTogc3RyaW5nIHtcbiAgY29uc3QgZGF0YSA9IGJvZHkgJiYgdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnID8gYm9keSBhcyB7IGNvZGU/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93bjsgZGV0YWlscz86IHVua25vd24gfSA6IHt9O1xuICBjb25zdCBjb2RlID0gdHlwZW9mIGRhdGEuY29kZSA9PT0gJ3N0cmluZycgPyBkYXRhLmNvZGUgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBpbiA9IHR5cGVvZiBmaWx0ZXI/LnZlcnNpb24gPT09ICdzdHJpbmcnICYmIC9eXFxkK1xcLlxcZCtcXC5cXGQrKC1bMC05QS1aYS16Li1dKyk/JC8udGVzdChmaWx0ZXIudmVyc2lvbikgPyBmaWx0ZXIudmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgLy8gQW4gZXhhY3QgcGluIHRoYXQgZG9lcyBub3QgcmVzb2x2ZTogcGhyYXNlIGl0IGZyb20gZGV0YWlscy5zdGF0ZSwgYXMgdGhlIENMSSBkb2VzLlxuICBpZiAoc3RhdHVzID09PSA0MDQgJiYgcGluICYmIHR5cGVvZiBmaWx0ZXI/Lm5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGAke2NvZGUgPz8gJ05PVF9GT1VORCd9OiAke2V4YWN0UGluTm90Rm91bmRNZXNzYWdlKGZpbHRlci5uYW1lLCBwaW4sIGxvb2t1cE5vdEZvdW5kU3RhdGUoYm9keSkpfWA7XG4gIH1cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGRhdGEubWVzc2FnZS5sZW5ndGggPiAwID8gZGF0YS5tZXNzYWdlIDogYEFQSSBlcnJvciAke3N0YXR1c306ICR7c3RhdHVzVGV4dH1gO1xuICBsZXQgZGV0YWlscyA9ICcnO1xuICBpZiAoZGF0YS5kZXRhaWxzICE9PSB1bmRlZmluZWQgJiYgZGF0YS5kZXRhaWxzICE9PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGRldGFpbHMgPSBgIOKAlCBkZXRhaWxzOiAke0pTT04uc3RyaW5naWZ5KGRhdGEuZGV0YWlscyl9YDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGRldGFpbHMgPSAnJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke2NvZGUgPyBgJHtjb2RlfTogYCA6ICcnfSR7bWVzc2FnZX0ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcHJlLWNvbmZpZ3VyZWQgQXhpb3MgaW5zdGFuY2UgZm9yIEFQSSByZXF1ZXN0cy5cbiAqXG4gKiBAcGFyYW0gYmFzZVVSTCAtIEJhc2UgVVJMIG9mIHRoZSB0YXJnZXQgQVBJXG4gKiBAcGFyYW0ga2V5IC0gc2VydmljZS1hY2NvdW50IGtleSBzZW50IGFzIHRoZSBCZWFyZXIgY3JlZGVudGlhbFxuICogQHBhcmFtIHJlcXVlc3RJZCAtIHRoaXMgTGFtYmRhIGludm9jYXRpb24ncyBhd3NSZXF1ZXN0SWQsIHNlbnQgYXMgYFgtUmVxdWVzdC1JZGBcbiAqICAgc28gdGhlIHBsdWdpbiBzZXJ2aWNlJ3MgYXVkaXQgcm93IGpvaW5zIGJhY2sgdG8gdGhpcyBpbnZvY2F0aW9uJ3MgbG9nXG4gKiBAcmV0dXJucyBDb25maWd1cmVkIEF4aW9zIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZShiYXNlVVJMOiBzdHJpbmcsIGtleTogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcpOiBBeGlvc0luc3RhbmNlIHtcbiAgLy8gQSBwcml2YXRlLUNBIHBsYXRmb3JtIGlzIFZFUklGSUVEIGFnYWluc3QgUExBVEZPUk1fQ0FfQlVORExFIChzZXQgYnkgdGhlXG4gIC8vIFBsdWdpbkxvb2t1cCBjb25zdHJ1Y3Qgd2hlbiB0aGUgc3ludGggaGFkIG9uZSk7IG90aGVyd2lzZSBOb2RlJ3MgZGVmYXVsdCBzdG9yZS5cbiAgY29uc3QgY2EgPSBwbGF0Zm9ybUNhTGlzdCgpO1xuICByZXR1cm4gYXhpb3MuY3JlYXRlKHtcbiAgICBiYXNlVVJMLFxuICAgIHRpbWVvdXQ6IEhBTkRMRVJfVElNRU9VVF9NUyxcbiAgICAuLi4oY2EgJiYgeyBodHRwc0FnZW50OiBuZXcgQWdlbnQoeyBjYSB9KSB9KSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7a2V5fWAsXG4gICAgICAuLi5jb3JyZWxhdGlvbkhlYWRlcnMoeyByZXF1ZXN0SWQgfSksXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyBwbHVnaW4gY29uZmlndXJhdGlvbiBmcm9tIHRoZSBleHRlcm5hbCBBUEkgd2l0aCByZXRyeSBsb2dpYy5cbiAqIFJldHJpZXMgb24gdHJhbnNpZW50IGZhaWx1cmVzICg0MjksIDUwMiwgNTAzLCA1MDQsIG5ldHdvcmsgZXJyb3JzKVxuICogd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBDb25maWd1cmVkIEF4aW9zIGluc3RhbmNlXG4gKiBAcGFyYW0gYmFzZVVSTCAtIFRoZSBwbGF0Zm9ybSBVUkwgYGFwaWAgdGFyZ2V0cyAocHJlZml4ZXMgYSBxdW90YSByZWZ1c2FsJ3MgdXBncmFkZSBwYXRoKVxuICogQHBhcmFtIHBsdWdpbkZpbHRlciAtIEZpbHRlciBjcml0ZXJpYSBmb3IgdGhlIHBsdWdpbiBsb29rdXBcbiAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZGF0YSByZXR1cm5lZCBieSB0aGUgQVBJXG4gKiBAdGhyb3dzIEVycm9yIG9uIHBlcnNpc3RlbnQgZmFpbHVyZSwgdGltZW91dCBvciBpbnZhbGlkIHJlc3BvbnNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoKGFwaTogQXhpb3NJbnN0YW5jZSwgYmFzZVVSTDogc3RyaW5nLCBwbHVnaW5GaWx0ZXI6IFBsdWdpbkZpbHRlciwgc3RlcEtleT86IHN0cmluZyk6IFByb21pc2U8UGx1Z2luPiB7XG4gIGxhbWJkYUxvZy5kZWJ1ZygnRkVUQ0gnLCAnU3RhcnRpbmcgcGx1Z2luIGZldGNoJywgeyBmaWx0ZXI6IHBsdWdpbkZpbHRlciB9KTtcblxuICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgLy8gQSBwbGFpbiA0MjkncyBSZXRyeS1BZnRlciwgaG9ub3VyZWQgb24gdGhlIG5leHQgYXR0ZW1wdCB3aGVuIGxvbmdlciB0aGFuIHRoZSBiYWNrb2ZmLlxuICBsZXQgc2VydmVyRGVsYXk6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBIQU5ETEVSX01BWF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICBpZiAoYXR0ZW1wdCA+IDApIHtcbiAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5tYXgoSEFORExFUl9SRVRSWV9ERUxBWV9NUyAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKSwgc2VydmVyRGVsYXkgPz8gMCk7XG4gICAgICBzZXJ2ZXJEZWxheSA9IHVuZGVmaW5lZDtcbiAgICAgIGxhbWJkYUxvZy5pbmZvKCdSRVRSWScsIGBBdHRlbXB0ICR7YXR0ZW1wdCArIDF9LyR7SEFORExFUl9NQVhfUkVUUklFUyArIDF9IGFmdGVyICR7ZGVsYXl9bXNgKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ29udHJhY3QgQzE6IHdpdGggYSBrbm93biBwaXBlbGluZSArIHN0ZXAsIHRoZSBwbHVnaW4gc2VydmljZSByZWNvcmRzXG4gICAgICAvLyB0aGUgd2FybmluZ3MgaXQgcmV0dXJucyBhZ2FpbnN0IHRoZW0gKG5vdCBvbmx5IHRoaXMgTGFtYmRhJ3MgbG9nKS5cbiAgICAgIGNvbnN0IHBpcGVsaW5lSWQgPSBwcm9jZXNzLmVudi5QSVBFTElORV9JRDtcbiAgICAgIGNvbnN0IHsgZGF0YTogYm9keSwgc3RhdHVzIH0gPSBhd2FpdCBhcGkucG9zdDx1bmtub3duPignL2FwaS9wbHVnaW5zL2xvb2t1cCcsIHtcbiAgICAgICAgZmlsdGVyOiBwbHVnaW5GaWx0ZXIsXG4gICAgICAgIC4uLihwaXBlbGluZUlkICYmIHN0ZXBLZXkgPyB7IGNvbnRleHQ6IHsgcGlwZWxpbmVJZCwgc3RlcEtleXM6IFtzdGVwS2V5XSB9IH0gOiB7fSksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyBwbHVnaW46IGRhdGEsIHdhcm5pbmdzIH0gPSB1bndyYXBMb29rdXAoYm9keSk7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbXB0eSByZXNwb25zZSBkYXRhIGZyb20gQVBJJyk7XG4gICAgICB9XG4gICAgICAvLyBHcmFkZWQgd2FybmluZ3MgKGxpZmVjeWNsZSwgdnVsbmVyYWJpbGl0eSwgY29tcGxpYW5jZSkg4oCUIHN1cmZhY2VkIGluIHRoZVxuICAgICAgLy8gZGVwbG95IGxvZzsgdGhlIGxvb2t1cCBzdGlsbCBzdWNjZWVkcy4gVnVsbmVyYWJpbGl0eSBzdGF0ZSBuZXZlciBmYWlscyBhXG4gICAgICAvLyBkZXBsb3k6IGl0IGlzIHJlcG9ydGVkIChhbmQsIHdpdGggY29udGV4dCwgcmVjb3JkZWQgc2VydmVyLXNpZGUpLlxuICAgICAgZm9yIChjb25zdCB3IG9mIHdhcm5pbmdzKSB7XG4gICAgICAgIGxhbWJkYUxvZy53YXJuKCdQTFVHSU5fV0FSTklORycsIGBbJHt3LnNldmVyaXR5LnRvVXBwZXJDYXNlKCl9XSAke3cubWVzc2FnZX1gLCB7IHBsdWdpbjogZGF0YS5uYW1lLCB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sIGNvZGU6IHcuY29kZSwgc2V2ZXJpdHk6IHcuc2V2ZXJpdHkgfSk7XG4gICAgICB9XG5cbiAgICAgIGxhbWJkYUxvZy5pbmZvKCdGRVRDSCcsICdQbHVnaW4gZmV0Y2hlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgcGx1Z2luOiBkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IGRhdGEudmVyc2lvbixcbiAgICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEF4aW9zRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFQ09OTkFCT1JURUQnKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLmVycm9yKCdGRVRDSCcsIGBQbHVnaW4gbG9va3VwIHRpbWVkIG91dCBhZnRlciAke0hBTkRMRVJfVElNRU9VVF9NU31tc2ApO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGxvb2t1cCB0aW1lZCBvdXQgYWZ0ZXIgJHtIQU5ETEVSX1RJTUVPVVRfTVN9bXNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgUVVPVEEgcmVmdXNhbCBpcyBub3QgdHJhbnNpZW50OiB0aGUgY291bnRlciBvbmx5IGVtcHRpZXMgd2hlbiB0aGVcbiAgICAgICAgLy8gcGVyaW9kIHJlc2V0cywgc28gcmV0cnlpbmcganVzdCBzcGVuZHMgdHdvIG1vcmUgbG9va3Vwcycgd29ydGggb2ZcbiAgICAgICAgLy8gd2FpdGluZyBhbmQgcmVwb3J0cyB0aGUgc2FtZSB0aGluZy4gRmFpbCBmYXN0IHdpdGggdGhlIHF1b3RhLCB0aGVcbiAgICAgICAgLy8gbnVtYmVycywgdGhlIHJlc2V0IGRhdGUgYW5kIHdoZXJlIHRvIHJhaXNlIGl0LCBhcyB0aGUgQ0ZOIFJlYXNvbi5cbiAgICAgICAgY29uc3QgcXVvdGFNZXNzYWdlID0gZXJyb3IucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDI5XG4gICAgICAgICAgPyBkZXNjcmliZVF1b3RhRXhjZWVkZWQoZXJyb3IucmVzcG9uc2UuZGF0YSwgYmFzZVVSTClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHF1b3RhTWVzc2FnZSkge1xuICAgICAgICAgIGxhbWJkYUxvZy5lcnJvcignRkVUQ0gnLCBxdW90YU1lc3NhZ2UpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIHBsdWdpbjogJHtxdW90YU1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXRyeWFibGUgPSBlcnJvci5yZXNwb25zZVxuICAgICAgICAgID8gUkVUUllBQkxFX1NUQVRVU0VTLmhhcyhlcnJvci5yZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgOiBSRVRSWUFCTEVfQ09ERVMuaGFzKGVycm9yLmNvZGUgPz8gJycpO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDI5KSBzZXJ2ZXJEZWxheSA9IHJldHJ5QWZ0ZXJNcyhlcnJvci5yZXNwb25zZS5oZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBlcnJvci5yZXNwb25zZVxuICAgICAgICAgID8gZGVzY3JpYmVSZWZ1c2FsKGVycm9yLnJlc3BvbnNlLnN0YXR1cywgZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dCwgZXJyb3IucmVzcG9uc2UuZGF0YSwgcGx1Z2luRmlsdGVyKVxuICAgICAgICAgIDogZXJyb3IuY29kZSB8fCBlcnJvci5tZXNzYWdlO1xuXG4gICAgICAgIGlmIChpc0NyZWRlbnRpYWxSZWZ1c2FsKGVycm9yLnJlc3BvbnNlPy5zdGF0dXMpKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLndhcm4oJ0FVVEgnLCBgQ3JlZGVudGlhbCByZWZ1c2VkOiAke21zZ31gKTtcbiAgICAgICAgICB0aHJvdyBuZXcgQ3JlZGVudGlhbFJlZnVzZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHBsdWdpbjogJHttc2d9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0cnlhYmxlICYmIGF0dGVtcHQgPCBIQU5ETEVSX01BWF9SRVRSSUVTKSB7XG4gICAgICAgICAgbGFtYmRhTG9nLmluZm8oJ1JFVFJZJywgYFJldHJ5YWJsZSBlcnJvcjogJHttc2d9YCwgeyBhdHRlbXB0OiBhdHRlbXB0ICsgMSB9KTtcbiAgICAgICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBwbHVnaW46ICR7bXNnfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgbG9nIHRoZSB1cHN0cmVhbSBib2R5IHZlcmJhdGltIOKAlCBpdCBtYXkgY2FycnkgYSBzdGFjayB0cmFjZSxcbiAgICAgICAgLy8gYSByZXF1ZXN0IHBheWxvYWQgZWNobywgb3Igb3RoZXIgc2Vuc2l0aXZlIGRhdGEgd2Ugc2hvdWxkbid0IGVjaG9cbiAgICAgICAgLy8gaW50byBMYW1iZGEgQ2xvdWRXYXRjaCBsb2dzLiBLZWVwIGp1c3QgdGhlIGhpZ2gtbGV2ZWwgc2hhcGUuXG4gICAgICAgIGNvbnN0IHNhZmVCb2R5ID0gZXJyb3IucmVzcG9uc2U/LmRhdGEgJiYgdHlwZW9mIGVycm9yLnJlc3BvbnNlLmRhdGEgPT09ICdvYmplY3QnXG4gICAgICAgICAgPyB7IGNvZGU6IChlcnJvci5yZXNwb25zZS5kYXRhIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlLCBtZXNzYWdlOiAoZXJyb3IucmVzcG9uc2UuZGF0YSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSkubWVzc2FnZSB9XG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxhbWJkYUxvZy5lcnJvcignRkVUQ0gnLCBtc2csIHsgcmVzcG9uc2VCb2R5OiBzYWZlQm9keSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggcGx1Z2luOiAke21zZ31gKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKCdVbmtub3duIGVycm9yIGR1cmluZyBwbHVnaW4gZmV0Y2gnKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBsYXN0RXJyb3IgPz8gbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggcGx1Z2luIGFmdGVyIHJldHJpZXMnKTtcbn1cblxuLyoqXG4gKiBMb29rIHRoZSBwbHVnaW4gdXAgd2l0aCB0aGUgY2FjaGVkIGNyZWRlbnRpYWwuIE9uIGEgNDAxLzQwMyB0aGUga2V5IHdhcyBtb3N0XG4gKiBsaWtlbHkgcm90YXRlZCB1bmRlcm5lYXRoIHRoaXMgd2FybSBjb250YWluZXIgKHRva2VuLXJlbmV3IHN0b3JlcyB0aGUgbmV3IGtleVxuICogYW5kIHJldm9rZXMgdGhlIG9sZCBvbmUpLCBzbyBkcm9wIHRoZSBjYWNoZSwgcmUtcmVhZCB0aGUgc2VjcmV0IGFuZCByZXRyeSBvbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb29rdXBXaXRoQ3JlZGVudGlhbFJlZnJlc2goYmFzZVVSTDogc3RyaW5nLCBwbHVnaW5GaWx0ZXI6IFBsdWdpbkZpbHRlciwgc3RlcEtleT86IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nKTogUHJvbWlzZTxQbHVnaW4+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZmV0Y2goY3JlYXRlKGJhc2VVUkwsIGF3YWl0IGNyZWRlbnRpYWwuZ2V0S2V5KCksIHJlcXVlc3RJZCksIGJhc2VVUkwsIHBsdWdpbkZpbHRlciwgc3RlcEtleSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghKGVyciBpbnN0YW5jZW9mIENyZWRlbnRpYWxSZWZ1c2VkRXJyb3IpKSB0aHJvdyBlcnI7XG4gICAgY3JlZGVudGlhbC5pbnZhbGlkYXRlKCk7XG4gICAgbGFtYmRhTG9nLmluZm8oJ0FVVEgnLCAnUmUtcmVhZGluZyB0aGUgc2VydmljZS1hY2NvdW50IGtleSBmcm9tIFNlY3JldHMgTWFuYWdlciBhbmQgcmV0cnlpbmcgb25jZScpO1xuICAgIHJldHVybiBmZXRjaChjcmVhdGUoYmFzZVVSTCwgYXdhaXQgY3JlZGVudGlhbC5nZXRLZXkoKSwgcmVxdWVzdElkKSwgYmFzZVVSTCwgcGx1Z2luRmlsdGVyLCBzdGVwS2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgcGx1Z2luIGZpbHRlciBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcGx1Z2luRmlsdGVyIC0gRmlsdGVyIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkXG4gKiBAdGhyb3dzIEVycm9yIGlmIGludmFsaWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQbHVnaW5GaWx0ZXIocGx1Z2luRmlsdGVyOiB1bmtub3duKTogcGx1Z2luRmlsdGVyIGlzIFBsdWdpbkZpbHRlciB7XG4gIGlmICghcGx1Z2luRmlsdGVyIHx8IHR5cGVvZiBwbHVnaW5GaWx0ZXIgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIG9yIGludmFsaWQgcGx1Z2luRmlsdGVyJyk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXIgPSBwbHVnaW5GaWx0ZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmICghZmlsdGVyLm5hbWUgJiYgIWZpbHRlci5pZCAmJiAhZmlsdGVyLnZlcnNpb24gJiYgIWZpbHRlci5vcmdJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGx1Z2luRmlsdGVyIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY3JpdGVyaW9uIChuYW1lLCBpZCwgdmVyc2lvbiwgb3Igb3JnSWQpJyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMYW1iZGEgaGFuZGxlciBmb3IgQ2xvdWRGb3JtYXRpb24gQ3VzdG9tIFJlc291cmNlIHRoYXQgcGVyZm9ybXMgcGx1Z2luIGxvb2t1cC5cbiAqXG4gKiBBdXRoZW50aWNhdGVzIHdpdGggdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyIChQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyKS5cbiAqIENyZWF0ZSB0aGUgc2VjcmV0IHdpdGg6IGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuYFxuICpcbiAqIFJlcXVlc3QgVHlwZXM6XG4gKiAtIENyZWF0ZS9VcGRhdGU6IGZldGNoZXMgYW5kIHJldHVybnMgcGx1Z2luIGNvbmZpZ3VyYXRpb24gZnJvbSBBUElcbiAqIC0gRGVsZXRlOiBuby1vcCAoYWx3YXlzIHN1Y2NlZWRzKVxuICpcbiAqIFJlc3BvbnNlOlxuICogLSBTdWNjZXNzOiBSZXR1cm5zIGJhc2U2NC1lbmNvZGVkIHBsdWdpbiBKU09OIGluIERhdGEuUmVzdWx0VmFsdWVcbiAqIC0gRmFpbHVyZTogUmV0dXJucyBlcnJvciBtZXNzYWdlIGluIFJlYXNvblxuICpcbiAqIEBwYXJhbSBldmVudCAtIENsb3VkRm9ybWF0aW9uIGN1c3RvbSByZXNvdXJjZSBldmVudFxuICogQHBhcmFtIGNvbnRleHQgLSBMYW1iZGEgY29udGV4dDsgaXRzIGF3c1JlcXVlc3RJZCByaWRlcyB0aGUgbG9va3VwIGFzIGBYLVJlcXVlc3QtSWRgXG4gKiBAcmV0dXJucyBDbG91ZEZvcm1hdGlvbiByZXNwb25zZVxuICpcbiAqIEBleGFtcGxlXG4gKiBDdXN0b20gUmVzb3VyY2UgUHJvcGVydGllczpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJiYXNlVVJMXCI6IFwiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb21cIixcbiAqICAgXCJwbHVnaW5GaWx0ZXJcIjoge1xuICogICAgIFwibmFtZVwiOiBcIm5vZGVqcy1idWlsZFwiLFxuICogICAgIFwidmVyc2lvblwiOiBcIjEuMC4wXCIsXG4gKiAgICAgXCJpc0FjdGl2ZVwiOiB0cnVlXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQ6IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCxcbiAgY29udGV4dD86IFBpY2s8Q29udGV4dCwgJ2F3c1JlcXVlc3RJZCc+LFxuKTogUHJvbWlzZTxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U+ID0+IHtcbiAgLy8gTk9URTogbmV2ZXIgbG9nIGV2ZW50LlN0YWNrSWQgaGVyZSDigJQgdGhlIENsb3VkRm9ybWF0aW9uIFN0YWNrIEFSTiBlbWJlZHMgdGhlXG4gIC8vIEFXUyBhY2NvdW50IGlkIChhcm46YXdzOmNsb3VkZm9ybWF0aW9uOjxyZWdpb24+OjxBQ0NPVU5UX0lEPjpzdGFjay/igKYpLCB3aGljaFxuICAvLyBtdXN0IG5ldmVyIGJlIHBlcnNpc3RlZCB0byBDbG91ZFdhdGNoLiByZXF1ZXN0SWQgKyBsb2dpY2FsUmVzb3VyY2VJZCBhcmVcbiAgLy8gc3VmZmljaWVudCBmb3IgY29ycmVsYXRpb24uIChTdGFja0lkIGlzIHN0aWxsIHJldHVybmVkIGluIHRoZSBDRk4gcmVzcG9uc2VcbiAgLy8gYm9keSBiZWxvdyDigJQgdGhhdCBpcyB0aGUgbWFuZGF0b3J5IENGTiBwcm90b2NvbCBmaWVsZCBhbmQgaXMgbm90IGEgbG9nLilcbiAgbGFtYmRhTG9nLmluZm8oJ1NUQVJUJywgYCR7ZXZlbnQuUmVxdWVzdFR5cGV9IHJlcXVlc3QgcmVjZWl2ZWRgLCB7XG4gICAgbG9naWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkLFxuICAgIHJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLFxuICB9KTtcblxuICBjb25zdCBiYXNlUmVzcG9uc2U6IFBhcnRpYWw8Q2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlPiA9IHtcbiAgICBTdGFja0lkOiBldmVudC5TdGFja0lkLFxuICAgIFJlcXVlc3RJZDogZXZlbnQuUmVxdWVzdElkLFxuICAgIExvZ2ljYWxSZXNvdXJjZUlkOiBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICBQaHlzaWNhbFJlc291cmNlSWQ6IGV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkLFxuICB9O1xuXG4gIHRyeSB7XG4gICAgLy8gSGFuZGxlIERlbGV0ZSAtIGFsd2F5cyBzdWNjZWVkIChuby1vcClcbiAgICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09ICdEZWxldGUnKSB7XG4gICAgICBsYW1iZGFMb2cuaW5mbygnREVMRVRFJywgJ05vLW9wIC0gcmV0dXJuaW5nIFNVQ0NFU1MnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2VSZXNwb25zZSxcbiAgICAgICAgU3RhdHVzOiAnU1VDQ0VTUycsXG4gICAgICAgIFJlYXNvbjogJ0RlbGV0ZSBjb21wbGV0ZWQgKG5vLW9wKScsXG4gICAgICB9IGFzIENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGFuZCB2YWxpZGF0ZSBwcm9wZXJ0aWVzXG4gICAgY29uc3QgcGx1Z2luRmlsdGVyID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLnBsdWdpbkZpbHRlcjtcbiAgICBjb25zdCBiYXNlVVJMID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLmJhc2VVUkwgfHwgSEFORExFUl9ERUZBVUxUX0JBU0VfVVJMO1xuXG4gICAgaWYgKCFiYXNlVVJMLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykgJiYgIWJhc2VVUkwuc3RhcnRzV2l0aCgnaHR0cDovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYmFzZVVSTDogXCIke2Jhc2VVUkx9XCIg4oCUIG11c3Qgc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vYCk7XG4gICAgfVxuXG4gICAgbGFtYmRhTG9nLmluZm8oJ0NPTkZJRycsICdDb25maWd1cmF0aW9uIGxvYWRlZCcsIHsgYmFzZVVSTCwgcGx1Z2luRmlsdGVyIH0pO1xuXG4gICAgdmFsaWRhdGVQbHVnaW5GaWx0ZXIocGx1Z2luRmlsdGVyKTtcblxuICAgIGxhbWJkYUxvZy5pbmZvKCdGRVRDSCcsICdJbml0aWF0aW5nIHBsdWdpbiBsb29rdXAuLi4nKTtcbiAgICBjb25zdCBzdGVwS2V5ID0gdHlwZW9mIGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5zdGVwS2V5ID09PSAnc3RyaW5nJyA/IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5zdGVwS2V5IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBsdWdpbiA9IGF3YWl0IGxvb2t1cFdpdGhDcmVkZW50aWFsUmVmcmVzaChiYXNlVVJMLCBwbHVnaW5GaWx0ZXIsIHN0ZXBLZXksIGNvbnRleHQ/LmF3c1JlcXVlc3RJZCk7XG4gICAgbGFtYmRhTG9nLmluZm8oJ0ZFVENIJywgJ1BsdWdpbiByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgbmFtZTogcGx1Z2luLm5hbWUsXG4gICAgICB2ZXJzaW9uOiBwbHVnaW4udmVyc2lvbixcbiAgICAgIGlkOiBwbHVnaW4uaWQsXG4gICAgfSk7XG5cbiAgICAvLyBTdHJpcCBsYXJnZSBmaWVsZHMgdG8gc3RheSB3aXRoaW4gQ2xvdWRGb3JtYXRpb24ncyA0MDk2LWJ5dGUgRGF0YSBsaW1pdC5cbiAgICAvLyBDREsgY29uc3RydWN0cyBvbmx5IG5lZWQgdGhlIGZpZWxkcyB1c2VkIGJ5IGNyZWF0ZUNvZGVCdWlsZFN0ZXAoKS5cbiAgICBjb25zdCBzbGltID0ge1xuICAgICAgaWQ6IHBsdWdpbi5pZCxcbiAgICAgIG5hbWU6IHBsdWdpbi5uYW1lLFxuICAgICAgdmVyc2lvbjogcGx1Z2luLnZlcnNpb24sXG4gICAgICBwbHVnaW5UeXBlOiBwbHVnaW4ucGx1Z2luVHlwZSxcbiAgICAgIGNvbXB1dGVUeXBlOiBwbHVnaW4uY29tcHV0ZVR5cGUsXG4gICAgICBjb21tYW5kczogcGx1Z2luLmNvbW1hbmRzLFxuICAgICAgaW5zdGFsbENvbW1hbmRzOiBwbHVnaW4uaW5zdGFsbENvbW1hbmRzLFxuICAgICAgZW52OiBwbHVnaW4uZW52LFxuICAgICAgbWV0YWRhdGE6IHBsdWdpbi5tZXRhZGF0YSxcbiAgICAgIHByaW1hcnlPdXRwdXREaXJlY3Rvcnk6IHBsdWdpbi5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5LFxuICAgICAgc2VjcmV0czogcGx1Z2luLnNlY3JldHMsXG4gICAgICBmYWlsdXJlQmVoYXZpb3I6IHBsdWdpbi5mYWlsdXJlQmVoYXZpb3IsXG4gICAgICB0aW1lb3V0OiBwbHVnaW4udGltZW91dCxcbiAgICB9O1xuXG4gICAgY29uc3QgZW5jb2RlZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHNsaW0pLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgbGFtYmRhTG9nLmRlYnVnKCdFTkNPREUnLCAnRW5jb2RlZCBwbHVnaW4gZGF0YScsIHsgbGVuZ3RoOiBlbmNvZGVkLmxlbmd0aCB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlUmVzcG9uc2UsXG4gICAgICBTdGF0dXM6ICdTVUNDRVNTJyxcbiAgICAgIFJlYXNvbjogYFBsdWdpbiAnJHtwbHVnaW4ubmFtZX0nICh2JHtwbHVnaW4udmVyc2lvbn0pIHJldHJpZXZlZCBzdWNjZXNzZnVsbHlgLFxuICAgICAgRGF0YToge1xuICAgICAgICBSZXN1bHRWYWx1ZTogZW5jb2RlZCxcbiAgICAgIH0sXG4gICAgfSBhcyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCc7XG4gICAgbGFtYmRhTG9nLmVycm9yKCdFUlJPUicsICdIYW5kbGVyIGZhaWxlZCcsIHtcbiAgICAgIHJlYXNvbixcbiAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZVJlc3BvbnNlLFxuICAgICAgU3RhdHVzOiAnRkFJTEVEJyxcbiAgICAgIFJlYXNvbjogdHJ1bmNhdGVSZWFzb24ocmVhc29uKSxcbiAgICB9IGFzIENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VSZXNwb25zZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBsYW1iZGFMb2cuaW5mbygnRU5EJywgJ0N1c3RvbSByZXNvdXJjZSBleGVjdXRpb24gY29tcGxldGVkJyk7XG4gIH1cbn07XG4iXX0=
package/lib/index.d.ts CHANGED
@@ -37,8 +37,15 @@ export * from './core/role-types.js';
37
37
  export * from './core/security-group-types.js';
38
38
  export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
39
39
  export * from './core/step-manifest.js';
40
- export { type ContractValueType, type PluginContract, type ContractScope, type ContractIssue, type ContractScopeProps, pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, type PluginStepRef, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, type PluginRefIdentity, sanitizePublisher, } from './core/plugin-contract.js';
41
- export { unwrapLookup } from './core/plugin-lookup-envelope.js';
40
+ export { type ContractValueType, type PluginContract, type ContractScope, type ContractIssue, type ContractScopeProps, pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, type PluginStepRef, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, pluginStepLabel, type PluginRefIdentity, sanitizePublisher, } from './core/plugin-contract.js';
41
+ export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, type LookupWarning, type LookupWarningSeverity, lookupNotFoundState, exactPinNotFoundMessage, type LookupNotFoundState, } from './core/plugin-lookup-envelope.js';
42
+ export * from './core/synth-failure.js';
43
+ export * from './core/runtime-check.js';
44
+ export * from './core/platform-tls.js';
45
+ export * from './core/audit-correlation.js';
46
+ export * from './core/quota-exceeded.js';
47
+ export * from './core/security-reports.js';
48
+ export * from './core/pipeline-registration.js';
42
49
  export * from './pipeline/deploy-attribution.js';
43
50
  export * from './pipeline/structure-preview.js';
44
51
  export * from './pipeline/plugin-spec.js';