@pipeline-builder/pipeline-core 4.4.3 → 4.4.5

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
package/lib/index.js CHANGED
@@ -41,8 +41,15 @@ export * from './core/role-types.js';
41
41
  export * from './core/security-group-types.js';
42
42
  export { replaceNonAlphanumeric, extractMetadataEnv, resolveFailureBehavior, wrapCommandsForFailureBehavior, STEP_BOOTSTRAP_CMD } from './core/metadata-helpers.js';
43
43
  export * from './core/step-manifest.js';
44
- export { pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, sanitizePublisher, } from './core/plugin-contract.js';
45
- export { unwrapLookup } from './core/plugin-lookup-envelope.js';
44
+ export { pipelineScopeMetadata, pipelineContractScope, contractScopeFromTemplateScope, isContractValueOfType, checkPluginContract, collectPluginSteps, pluginLookupFilter, pluginArtifactAlias, pluginStepLabel, sanitizePublisher, } from './core/plugin-contract.js';
45
+ export { unwrapLookup, summarizeLookupWarnings, LOOKUP_WARNING_SEVERITIES, lookupNotFoundState, exactPinNotFoundMessage, } from './core/plugin-lookup-envelope.js';
46
+ export * from './core/synth-failure.js';
47
+ export * from './core/runtime-check.js';
48
+ export * from './core/platform-tls.js';
49
+ export * from './core/audit-correlation.js';
50
+ export * from './core/quota-exceeded.js';
51
+ export * from './core/security-reports.js';
52
+ export * from './core/pipeline-registration.js';
46
53
  // Plugin domain type (the synth-time authoring types live in the `/cdk` entry)
47
54
  // CDK-free: the DORA deploy attribution the API reports in create/validate
48
55
  // responses. The construct that stamps the tag reads the same function.
@@ -55,4 +62,4 @@ export * from './pipeline/plugin-spec.js';
55
62
  export { tokenize, hasTemplate, MAX_FIELD_SIZE_BYTES, MAX_PATH_DEPTH, resolve, dependencies, validateTemplates, detectCycles, allowedScopeRoots, resolveSelfReferencing, validateTemplateDraft, formatTemplateDraftProblems, } from './template/index.js';
56
63
  // A plugin's `{{ … }}` resolution against a pipeline scope (synth, `plugin test`)
57
64
  export { resolvePluginTemplates } from './template/plugin-resolver.js';
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSCxnQkFBZ0I7QUFDaEIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFekUsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFzQyxXQUFXLEVBQUUsWUFBWSxFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BKLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwSyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLE9BQU8sRUFNTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBRW5CLGlCQUFpQixHQUNsQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVoRSwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBQzNFLHdFQUF3RTtBQUN4RSxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELG1GQUFtRjtBQUNuRix3RUFBd0U7QUFDeEUsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDJCQUEyQixDQUFDO0FBRTFDLDRFQUE0RTtBQUM1RSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsY0FBYyxFQUtkLE9BQU8sRUFDUCxZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixpQkFBaUIsRUFJakIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiwyQkFBMkIsR0FNNUIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixrRkFBa0Y7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBAbW9kdWxlIEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmVcbiAqXG4gKiBBcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLCBwaXBlbGluZSBkb21haW4gdHlwZXMsIGFuZCB0aGUgdGVtcGxhdGUgZW5naW5lLlxuICpcbiAqIFRoaXMgZW50cnkgcG9pbnQgaXMgZGVsaWJlcmF0ZWx5IEZSRUUgb2YgYGF3cy1jZGstbGliYC4gVGhlIENESyBjb25zdHJ1Y3RzIGxpdmVcbiAqIGJlaGluZCBhIHNlcGFyYXRlIHN1YnBhdGgg4oCUIGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlL2Nka2Ag4oCUIGJlY2F1c2UgdGhlXG4gKiBBUEkgc2VydmljZXMgY29uc3VtZSB0aGlzIHBhY2thZ2UgZm9yIGNvbmZpZyBhbmQgZG9tYWluIHR5cGVzIG9ubHksIGFuZCBhblxuICogYGV4cG9ydCAqYCBvZiB0aGUgY29uc3RydWN0cyBmcm9tIGhlcmUgcHV0IHRoZSB3aG9sZSBvZiBgYXdzLWNkay1saWJgIG9uIHRoZVxuICogaW1wb3J0IGdyYXBoIG9mIGV2ZXJ5IHNlcnZpY2UgdGhhdCByZWFkIHNvIG11Y2ggYXMgYSBwb3J0IG51bWJlci4gQW55dGhpbmcgdGhhdFxuICogaW1wb3J0cyBgYXdzLWNkay1saWJgLCBhdCB0eXBlIGxldmVsIG9yIHZhbHVlIGxldmVsLCBiZWxvbmdzIGluIGBjZGsudHNgLlxuICpcbiAqICoqQ29uZmlnKipcbiAqIC0gQ29uZmlnIOKAlCBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIHNpbmdsZXRvbiAoZW52aXJvbm1lbnQtZHJpdmVuKVxuICogLSBDb25maWdUeXBlcyDigJQgdHlwZWQgY29uZmlndXJhdGlvbiBpbnRlcmZhY2VzXG4gKlxuICogKipUeXBlcyoqXG4gKiAtIFBpcGVsaW5lVHlwZSwgQ29tcHV0ZVR5cGUsIFBsdWdpblR5cGUsIFZpc2liaWxpdHkg4oCUIHBpcGVsaW5lIGRvbWFpbiBlbnVtc1xuICogLSBSb2xlVHlwZXMsIFNlY3VyaXR5R3JvdXBUeXBlcyDigJQgaW5mcmFzdHJ1Y3R1cmUgdHlwZSBkZWZpbml0aW9uc1xuICogLSBQbHVnaW5TcGVjIOKAlCBhIHBsdWdpbidzIGRlY2xhcmVkIGNvbnRyYWN0XG4gKiAtIElkR2VuZXJhdG9yIOKAlCBkZXRlcm1pbmlzdGljIElEIGdlbmVyYXRpb25cbiAqXG4gKiAqKkhlbHBlcnMqKlxuICogLSByZXBsYWNlTm9uQWxwaGFudW1lcmljLCBleHRyYWN0TWV0YWRhdGFFbnYg4oCUIHN0cmluZyBhbmQgbWV0YWRhdGEgdXRpbGl0aWVzXG4gKiAtIHJlc29sdmVGYWlsdXJlQmVoYXZpb3IsIHdyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvciDigJQgYSBzdGVwJ3MgZmFpbHVyZUJlaGF2aW9yLCBhcyBDb2RlQnVpbGQgcnVucyBpdFxuICpcbiAqIFRoZSBQb3N0Z3Jlcy9Ecml6emxlIGRhdGEgbGF5ZXIgKGRiLCBzY2hlbWEsIENydWRTZXJ2aWNlLCBxdWVyeSBidWlsZGVycyxcbiAqIGZpbHRlci9jb21wbGlhbmNlIHR5cGVzLCBldGMuKSBpcyBOT1QgcmUtZXhwb3J0ZWQgaGVyZSDigJQgaW1wb3J0IHRob3NlXG4gKiBkaXJlY3RseSBmcm9tIGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1kYXRhYC5cbiAqL1xuXG4vLyBDb25maWd1cmF0aW9uXG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uZmlnL2NvbmZpZy10eXBlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9zZXJ2aWNlLWNsaWVudC5qcyc7XG5leHBvcnQgeyBwYXJzZVBsYXRmb3JtQmFzZVVybCB9IGZyb20gJy4vY29uZmlnL2luZnJhc3RydWN0dXJlLWNvbmZpZy5qcyc7XG5cbi8vIENvcmUgdHlwZXMgKHB1YmxpYyBzdXJmYWNlKVxuZXhwb3J0IHsgQ29tcHV0ZVR5cGUsIFBsdWdpblR5cGUsIHR5cGUgTWV0YURhdGFUeXBlLCB0eXBlIFZpc2liaWxpdHksIFRyaWdnZXJUeXBlLCBNZXRhZGF0YUtleXMsIHR5cGUgTWV0YWRhdGFLZXkgfSBmcm9tICcuL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3JvbGUtdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3NlY3VyaXR5LWdyb3VwLXR5cGVzLmpzJztcbmV4cG9ydCB7IHJlcGxhY2VOb25BbHBoYW51bWVyaWMsIGV4dHJhY3RNZXRhZGF0YUVudiwgcmVzb2x2ZUZhaWx1cmVCZWhhdmlvciwgd3JhcENvbW1hbmRzRm9yRmFpbHVyZUJlaGF2aW9yLCBTVEVQX0JPT1RTVFJBUF9DTUQgfSBmcm9tICcuL2NvcmUvbWV0YWRhdGEtaGVscGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvc3RlcC1tYW5pZmVzdC5qcyc7XG5leHBvcnQge1xuICB0eXBlIENvbnRyYWN0VmFsdWVUeXBlLFxuICB0eXBlIFBsdWdpbkNvbnRyYWN0LFxuICB0eXBlIENvbnRyYWN0U2NvcGUsXG4gIHR5cGUgQ29udHJhY3RJc3N1ZSxcbiAgdHlwZSBDb250cmFjdFNjb3BlUHJvcHMsXG4gIHBpcGVsaW5lU2NvcGVNZXRhZGF0YSxcbiAgcGlwZWxpbmVDb250cmFjdFNjb3BlLFxuICBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUsXG4gIGlzQ29udHJhY3RWYWx1ZU9mVHlwZSxcbiAgY2hlY2tQbHVnaW5Db250cmFjdCxcbiAgdHlwZSBQbHVnaW5TdGVwUmVmLFxuICBjb2xsZWN0UGx1Z2luU3RlcHMsXG4gIHBsdWdpbkxvb2t1cEZpbHRlcixcbiAgcGx1Z2luQXJ0aWZhY3RBbGlhcyxcbiAgdHlwZSBQbHVnaW5SZWZJZGVudGl0eSxcbiAgc2FuaXRpemVQdWJsaXNoZXIsXG59IGZyb20gJy4vY29yZS9wbHVnaW4tY29udHJhY3QuanMnO1xuZXhwb3J0IHsgdW53cmFwTG9va3VwIH0gZnJvbSAnLi9jb3JlL3BsdWdpbi1sb29rdXAtZW52ZWxvcGUuanMnO1xuXG4vLyBQbHVnaW4gZG9tYWluIHR5cGUgKHRoZSBzeW50aC10aW1lIGF1dGhvcmluZyB0eXBlcyBsaXZlIGluIHRoZSBgL2Nka2AgZW50cnkpXG4vLyBDREstZnJlZTogdGhlIERPUkEgZGVwbG95IGF0dHJpYnV0aW9uIHRoZSBBUEkgcmVwb3J0cyBpbiBjcmVhdGUvdmFsaWRhdGVcbi8vIHJlc3BvbnNlcy4gVGhlIGNvbnN0cnVjdCB0aGF0IHN0YW1wcyB0aGUgdGFnIHJlYWRzIHRoZSBzYW1lIGZ1bmN0aW9uLlxuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9kZXBsb3ktYXR0cmlidXRpb24uanMnO1xuLy8gQ0RLLWZyZWU6IHRoZSBzdGFnZS9wbHVnaW4vSUFNIHByb2plY3Rpb24gdGhlIGNyZWF0ZSArIHZhbGlkYXRlIHJlc3BvbnNlcyByZXR1cm5cbi8vIHNvIGEgcmV2aWV3ZXIgYXBwcm92ZXMgc29tZXRoaW5nIGNvbmNyZXRlIHJhdGhlciB0aGFuIHJhdyBwcm9wcyBKU09OLlxuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9zdHJ1Y3R1cmUtcHJldmlldy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL3BsdWdpbi1zcGVjLmpzJztcblxuLy8gVGVtcGxhdGUgZW5naW5lIOKAlCBzeW50aC10aW1lIHNjcmlwdGluZyBmb3IgcGlwZWxpbmUgY29uZmlnICsgcGx1Z2luIHNwZWNzXG5leHBvcnQge1xuICB0b2tlbml6ZSxcbiAgaGFzVGVtcGxhdGUsXG4gIE1BWF9GSUVMRF9TSVpFX0JZVEVTLFxuICBNQVhfUEFUSF9ERVBUSCxcbiAgdHlwZSBUb2tlbixcbiAgdHlwZSBMaXRlcmFsVG9rZW4sXG4gIHR5cGUgRXhwclRva2VuLFxuICB0eXBlIFNvdXJjZVBvc2l0aW9uLFxuICByZXNvbHZlLFxuICBkZXBlbmRlbmNpZXMsXG4gIHR5cGUgU2NvcGUsXG4gIHR5cGUgRmllbGRQcmVkaWNhdGUsXG4gIHZhbGlkYXRlVGVtcGxhdGVzLFxuICBkZXRlY3RDeWNsZXMsXG4gIGFsbG93ZWRTY29wZVJvb3RzLFxuICB0eXBlIFRlbXBsYXRlRXJyb3IsXG4gIHR5cGUgVGVtcGxhdGVWYWxpZGF0aW9uUmVzdWx0LFxuICB0eXBlIFJlc29sdmVSZXN1bHQsXG4gIHJlc29sdmVTZWxmUmVmZXJlbmNpbmcsXG4gIHZhbGlkYXRlVGVtcGxhdGVEcmFmdCxcbiAgZm9ybWF0VGVtcGxhdGVEcmFmdFByb2JsZW1zLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRJbnB1dCxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0TGlrZSxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0UHJvYmxlbSxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0UHJvYmxlbUtpbmQsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdFZhbGlkYXRpb24sXG59IGZyb20gJy4vdGVtcGxhdGUvaW5kZXguanMnO1xuLy8gQSBwbHVnaW4ncyBge3sg4oCmIH19YCByZXNvbHV0aW9uIGFnYWluc3QgYSBwaXBlbGluZSBzY29wZSAoc3ludGgsIGBwbHVnaW4gdGVzdGApXG5leHBvcnQgeyByZXNvbHZlUGx1Z2luVGVtcGxhdGVzIH0gZnJvbSAnLi90ZW1wbGF0ZS9wbHVnaW4tcmVzb2x2ZXIuanMnO1xuIl19
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSCxnQkFBZ0I7QUFDaEIsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFekUsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFzQyxXQUFXLEVBQUUsWUFBWSxFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BKLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwSyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLE9BQU8sRUFNTCxxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGVBQWUsRUFFZixpQkFBaUIsR0FDbEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFHekIsbUJBQW1CLEVBQ25CLHVCQUF1QixHQUV4QixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsaUNBQWlDLENBQUM7QUFFaEQsK0VBQStFO0FBQy9FLDJFQUEyRTtBQUMzRSx3RUFBd0U7QUFDeEUsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxtRkFBbUY7QUFDbkYsd0VBQXdFO0FBQ3hFLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywyQkFBMkIsQ0FBQztBQUUxQyw0RUFBNEU7QUFDNUUsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLGNBQWMsRUFLZCxPQUFPLEVBQ1AsWUFBWSxFQUdaLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osaUJBQWlCLEVBSWpCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsMkJBQTJCLEdBTTVCLE1BQU0scUJBQXFCLENBQUM7QUFDN0Isa0ZBQWtGO0FBQ2xGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogQG1vZHVsZSBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlXG4gKlxuICogQXBwbGljYXRpb24gY29uZmlndXJhdGlvbiwgcGlwZWxpbmUgZG9tYWluIHR5cGVzLCBhbmQgdGhlIHRlbXBsYXRlIGVuZ2luZS5cbiAqXG4gKiBUaGlzIGVudHJ5IHBvaW50IGlzIGRlbGliZXJhdGVseSBGUkVFIG9mIGBhd3MtY2RrLWxpYmAuIFRoZSBDREsgY29uc3RydWN0cyBsaXZlXG4gKiBiZWhpbmQgYSBzZXBhcmF0ZSBzdWJwYXRoIOKAlCBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZS9jZGtgIOKAlCBiZWNhdXNlIHRoZVxuICogQVBJIHNlcnZpY2VzIGNvbnN1bWUgdGhpcyBwYWNrYWdlIGZvciBjb25maWcgYW5kIGRvbWFpbiB0eXBlcyBvbmx5LCBhbmQgYW5cbiAqIGBleHBvcnQgKmAgb2YgdGhlIGNvbnN0cnVjdHMgZnJvbSBoZXJlIHB1dCB0aGUgd2hvbGUgb2YgYGF3cy1jZGstbGliYCBvbiB0aGVcbiAqIGltcG9ydCBncmFwaCBvZiBldmVyeSBzZXJ2aWNlIHRoYXQgcmVhZCBzbyBtdWNoIGFzIGEgcG9ydCBudW1iZXIuIEFueXRoaW5nIHRoYXRcbiAqIGltcG9ydHMgYGF3cy1jZGstbGliYCwgYXQgdHlwZSBsZXZlbCBvciB2YWx1ZSBsZXZlbCwgYmVsb25ncyBpbiBgY2RrLnRzYC5cbiAqXG4gKiAqKkNvbmZpZyoqXG4gKiAtIENvbmZpZyDigJQgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBzaW5nbGV0b24gKGVudmlyb25tZW50LWRyaXZlbilcbiAqIC0gQ29uZmlnVHlwZXMg4oCUIHR5cGVkIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlc1xuICpcbiAqICoqVHlwZXMqKlxuICogLSBQaXBlbGluZVR5cGUsIENvbXB1dGVUeXBlLCBQbHVnaW5UeXBlLCBWaXNpYmlsaXR5IOKAlCBwaXBlbGluZSBkb21haW4gZW51bXNcbiAqIC0gUm9sZVR5cGVzLCBTZWN1cml0eUdyb3VwVHlwZXMg4oCUIGluZnJhc3RydWN0dXJlIHR5cGUgZGVmaW5pdGlvbnNcbiAqIC0gUGx1Z2luU3BlYyDigJQgYSBwbHVnaW4ncyBkZWNsYXJlZCBjb250cmFjdFxuICogLSBJZEdlbmVyYXRvciDigJQgZGV0ZXJtaW5pc3RpYyBJRCBnZW5lcmF0aW9uXG4gKlxuICogKipIZWxwZXJzKipcbiAqIC0gcmVwbGFjZU5vbkFscGhhbnVtZXJpYywgZXh0cmFjdE1ldGFkYXRhRW52IOKAlCBzdHJpbmcgYW5kIG1ldGFkYXRhIHV0aWxpdGllc1xuICogLSByZXNvbHZlRmFpbHVyZUJlaGF2aW9yLCB3cmFwQ29tbWFuZHNGb3JGYWlsdXJlQmVoYXZpb3Ig4oCUIGEgc3RlcCdzIGZhaWx1cmVCZWhhdmlvciwgYXMgQ29kZUJ1aWxkIHJ1bnMgaXRcbiAqXG4gKiBUaGUgUG9zdGdyZXMvRHJpenpsZSBkYXRhIGxheWVyIChkYiwgc2NoZW1hLCBDcnVkU2VydmljZSwgcXVlcnkgYnVpbGRlcnMsXG4gKiBmaWx0ZXIvY29tcGxpYW5jZSB0eXBlcywgZXRjLikgaXMgTk9UIHJlLWV4cG9ydGVkIGhlcmUg4oCUIGltcG9ydCB0aG9zZVxuICogZGlyZWN0bHkgZnJvbSBgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YWAuXG4gKi9cblxuLy8gQ29uZmlndXJhdGlvblxuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvYXBwLWNvbmZpZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9jb25maWctdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvc2VydmljZS1jbGllbnQuanMnO1xuZXhwb3J0IHsgcGFyc2VQbGF0Zm9ybUJhc2VVcmwgfSBmcm9tICcuL2NvbmZpZy9pbmZyYXN0cnVjdHVyZS1jb25maWcuanMnO1xuXG4vLyBDb3JlIHR5cGVzIChwdWJsaWMgc3VyZmFjZSlcbmV4cG9ydCB7IENvbXB1dGVUeXBlLCBQbHVnaW5UeXBlLCB0eXBlIE1ldGFEYXRhVHlwZSwgdHlwZSBWaXNpYmlsaXR5LCBUcmlnZ2VyVHlwZSwgTWV0YWRhdGFLZXlzLCB0eXBlIE1ldGFkYXRhS2V5IH0gZnJvbSAnLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9yb2xlLXR5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9zZWN1cml0eS1ncm91cC10eXBlcy5qcyc7XG5leHBvcnQgeyByZXBsYWNlTm9uQWxwaGFudW1lcmljLCBleHRyYWN0TWV0YWRhdGFFbnYsIHJlc29sdmVGYWlsdXJlQmVoYXZpb3IsIHdyYXBDb21tYW5kc0ZvckZhaWx1cmVCZWhhdmlvciwgU1RFUF9CT09UU1RSQVBfQ01EIH0gZnJvbSAnLi9jb3JlL21ldGFkYXRhLWhlbHBlcnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3N0ZXAtbWFuaWZlc3QuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBDb250cmFjdFZhbHVlVHlwZSxcbiAgdHlwZSBQbHVnaW5Db250cmFjdCxcbiAgdHlwZSBDb250cmFjdFNjb3BlLFxuICB0eXBlIENvbnRyYWN0SXNzdWUsXG4gIHR5cGUgQ29udHJhY3RTY29wZVByb3BzLFxuICBwaXBlbGluZVNjb3BlTWV0YWRhdGEsXG4gIHBpcGVsaW5lQ29udHJhY3RTY29wZSxcbiAgY29udHJhY3RTY29wZUZyb21UZW1wbGF0ZVNjb3BlLFxuICBpc0NvbnRyYWN0VmFsdWVPZlR5cGUsXG4gIGNoZWNrUGx1Z2luQ29udHJhY3QsXG4gIHR5cGUgUGx1Z2luU3RlcFJlZixcbiAgY29sbGVjdFBsdWdpblN0ZXBzLFxuICBwbHVnaW5Mb29rdXBGaWx0ZXIsXG4gIHBsdWdpbkFydGlmYWN0QWxpYXMsXG4gIHBsdWdpblN0ZXBMYWJlbCxcbiAgdHlwZSBQbHVnaW5SZWZJZGVudGl0eSxcbiAgc2FuaXRpemVQdWJsaXNoZXIsXG59IGZyb20gJy4vY29yZS9wbHVnaW4tY29udHJhY3QuanMnO1xuZXhwb3J0IHtcbiAgdW53cmFwTG9va3VwLFxuICBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyxcbiAgTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUyxcbiAgdHlwZSBMb29rdXBXYXJuaW5nLFxuICB0eXBlIExvb2t1cFdhcm5pbmdTZXZlcml0eSxcbiAgbG9va3VwTm90Rm91bmRTdGF0ZSxcbiAgZXhhY3RQaW5Ob3RGb3VuZE1lc3NhZ2UsXG4gIHR5cGUgTG9va3VwTm90Rm91bmRTdGF0ZSxcbn0gZnJvbSAnLi9jb3JlL3BsdWdpbi1sb29rdXAtZW52ZWxvcGUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3N5bnRoLWZhaWx1cmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3J1bnRpbWUtY2hlY2suanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3BsYXRmb3JtLXRscy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvYXVkaXQtY29ycmVsYXRpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3F1b3RhLWV4Y2VlZGVkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9zZWN1cml0eS1yZXBvcnRzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9waXBlbGluZS1yZWdpc3RyYXRpb24uanMnO1xuXG4vLyBQbHVnaW4gZG9tYWluIHR5cGUgKHRoZSBzeW50aC10aW1lIGF1dGhvcmluZyB0eXBlcyBsaXZlIGluIHRoZSBgL2Nka2AgZW50cnkpXG4vLyBDREstZnJlZTogdGhlIERPUkEgZGVwbG95IGF0dHJpYnV0aW9uIHRoZSBBUEkgcmVwb3J0cyBpbiBjcmVhdGUvdmFsaWRhdGVcbi8vIHJlc3BvbnNlcy4gVGhlIGNvbnN0cnVjdCB0aGF0IHN0YW1wcyB0aGUgdGFnIHJlYWRzIHRoZSBzYW1lIGZ1bmN0aW9uLlxuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9kZXBsb3ktYXR0cmlidXRpb24uanMnO1xuLy8gQ0RLLWZyZWU6IHRoZSBzdGFnZS9wbHVnaW4vSUFNIHByb2plY3Rpb24gdGhlIGNyZWF0ZSArIHZhbGlkYXRlIHJlc3BvbnNlcyByZXR1cm5cbi8vIHNvIGEgcmV2aWV3ZXIgYXBwcm92ZXMgc29tZXRoaW5nIGNvbmNyZXRlIHJhdGhlciB0aGFuIHJhdyBwcm9wcyBKU09OLlxuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS9zdHJ1Y3R1cmUtcHJldmlldy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lL3BsdWdpbi1zcGVjLmpzJztcblxuLy8gVGVtcGxhdGUgZW5naW5lIOKAlCBzeW50aC10aW1lIHNjcmlwdGluZyBmb3IgcGlwZWxpbmUgY29uZmlnICsgcGx1Z2luIHNwZWNzXG5leHBvcnQge1xuICB0b2tlbml6ZSxcbiAgaGFzVGVtcGxhdGUsXG4gIE1BWF9GSUVMRF9TSVpFX0JZVEVTLFxuICBNQVhfUEFUSF9ERVBUSCxcbiAgdHlwZSBUb2tlbixcbiAgdHlwZSBMaXRlcmFsVG9rZW4sXG4gIHR5cGUgRXhwclRva2VuLFxuICB0eXBlIFNvdXJjZVBvc2l0aW9uLFxuICByZXNvbHZlLFxuICBkZXBlbmRlbmNpZXMsXG4gIHR5cGUgU2NvcGUsXG4gIHR5cGUgRmllbGRQcmVkaWNhdGUsXG4gIHZhbGlkYXRlVGVtcGxhdGVzLFxuICBkZXRlY3RDeWNsZXMsXG4gIGFsbG93ZWRTY29wZVJvb3RzLFxuICB0eXBlIFRlbXBsYXRlRXJyb3IsXG4gIHR5cGUgVGVtcGxhdGVWYWxpZGF0aW9uUmVzdWx0LFxuICB0eXBlIFJlc29sdmVSZXN1bHQsXG4gIHJlc29sdmVTZWxmUmVmZXJlbmNpbmcsXG4gIHZhbGlkYXRlVGVtcGxhdGVEcmFmdCxcbiAgZm9ybWF0VGVtcGxhdGVEcmFmdFByb2JsZW1zLFxuICB0eXBlIFRlbXBsYXRlRHJhZnRJbnB1dCxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0TGlrZSxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0UHJvYmxlbSxcbiAgdHlwZSBUZW1wbGF0ZURyYWZ0UHJvYmxlbUtpbmQsXG4gIHR5cGUgVGVtcGxhdGVEcmFmdFZhbGlkYXRpb24sXG59IGZyb20gJy4vdGVtcGxhdGUvaW5kZXguanMnO1xuLy8gQSBwbHVnaW4ncyBge3sg4oCmIH19YCByZXNvbHV0aW9uIGFnYWluc3QgYSBwaXBlbGluZSBzY29wZSAoc3ludGgsIGBwbHVnaW4gdGVzdGApXG5leHBvcnQgeyByZXNvbHZlUGx1Z2luVGVtcGxhdGVzIH0gZnJvbSAnLi90ZW1wbGF0ZS9wbHVnaW4tcmVzb2x2ZXIuanMnO1xuIl19
@@ -5,8 +5,8 @@ import { Duration, RemovalPolicy, Tags } from 'aws-cdk-lib';
5
5
  import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
6
6
  import { PipelineNotificationEvents, PipelineType, Variable } from 'aws-cdk-lib/aws-codepipeline';
7
7
  import * as events from 'aws-cdk-lib/aws-events';
8
- import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam';
9
8
  import * as targets from 'aws-cdk-lib/aws-events-targets';
9
+ import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam';
10
10
  import * as kms from 'aws-cdk-lib/aws-kms';
11
11
  import * as s3 from 'aws-cdk-lib/aws-s3';
12
12
  import * as sns from 'aws-cdk-lib/aws-sns';
@@ -25,9 +25,12 @@ import { UniqueId } from '../core/id-generator.js';
25
25
  import { asInt, isTrue, metadataForCodePipeline, networkConfigFromMetadata, parsePipelineVariables, roleConfigFromMetadata, securityGroupConfigFromMetadata, } from '../core/metadata-builder.js';
26
26
  import { resolveNetwork, networkConfigFromEnv } from '../core/network.js';
27
27
  import { createCodeBuildStep, getComputeType, resolveDefaultBuildImage } from '../core/pipeline-helpers.js';
28
+ import { PIPELINE_REGISTRATION_SECRET_ENV, PIPELINE_REGISTRATION_SECRET_LEAF } from '../core/pipeline-registration.js';
28
29
  import { MetadataKeys, TriggerType } from '../core/pipeline-types.js';
29
- import { assertPluginContract, contractScopeFromTemplateScope, pluginArtifactAlias } from '../core/plugin-contract.js';
30
+ import { PLATFORM_CA_BUNDLE_ENV, PLATFORM_TLS_VERIFY_ENV, platformCaBundle, platformTlsVerify } from '../core/platform-tls.js';
31
+ import { assertPluginContract, contractScopeFromTemplateScope, pluginArtifactAlias, pluginStepLabel } from '../core/plugin-contract.js';
30
32
  import { resolveRole } from '../core/role.js';
33
+ import { isRuntimeVulnCheckEnabled, RUNTIME_VULN_CHECK_KEY } from '../core/runtime-check.js';
31
34
  import { resolveSecurityGroup } from '../core/security-group.js';
32
35
  const PIPELINE_EVENT_MAP = {
33
36
  FAILED: PipelineNotificationEvents.PIPELINE_EXECUTION_FAILED,
@@ -126,6 +129,7 @@ export class PipelineBuilder extends Construct {
126
129
  platformUrl: serverConfig.platformUrl,
127
130
  uniqueId,
128
131
  orgId: props.orgId,
132
+ pipelineId: props.pipelineId,
129
133
  runtime: lambdaRuntime(awsConfig.lambda.runtime),
130
134
  timeout: lambdaTimeout(awsConfig.lambda.timeoutSeconds),
131
135
  architecture: lambdaArchitecture(awsConfig.lambda.architecture),
@@ -149,7 +153,7 @@ export class PipelineBuilder extends Construct {
149
153
  // bootstrap() when pre-resolution succeeded.
150
154
  const synthCacheKey = pluginArtifactAlias(this.config.plugin);
151
155
  const plugin = props.resolvedPlugins?.[synthCacheKey]
152
- ? pluginLookup.plugin(this.config.plugin)
156
+ ? pluginLookup.plugin(this.config.plugin, pluginStepLabel(null, this.config.plugin))
153
157
  : pluginLookup.bootstrap();
154
158
  const defaultComputeType = getComputeType(awsConfig.codeBuild.computeType);
155
159
  const artifactManager = new ArtifactManager();
@@ -180,12 +184,17 @@ export class PipelineBuilder extends Construct {
180
184
  orgId: props.orgId,
181
185
  pipelineScope,
182
186
  });
183
- stepManifest.record(synth, plugin);
187
+ stepManifest.record(synth, plugin, pluginStepLabel(null, this.config.plugin));
184
188
  // Resolve pipeline-level defaults into codeBuildDefaults
185
189
  // Build the per-org platform secret name for CodeBuild env vars
186
190
  const platformSecretName = props.orgId
187
191
  ? CoreConstants.secretPath(props.orgId, 'platform')
188
192
  : undefined;
193
+ // The registration key the synth posts its step manifest with — a
194
+ // separate credential from the platform one (core/pipeline-registration.ts).
195
+ const registrationSecretName = props.orgId
196
+ ? CoreConstants.secretPath(props.orgId, PIPELINE_REGISTRATION_SECRET_LEAF)
197
+ : undefined;
189
198
  const codeBuildDefaults = this.resolveDefaults(this.config.defaults, uniqueId, props.pipelineId, platformSecretName, serverConfig.platformUrl, props.orgId);
190
199
  // Resolve IAM role: explicit prop wins, else `iam:role` metadata, else let
191
200
  // CDK auto-create the pipeline role (codepipeline.amazonaws.com principal).
@@ -215,6 +224,16 @@ export class PipelineBuilder extends Construct {
215
224
  synth,
216
225
  ...metadataForCodePipeline(this.config.metadata.merged),
217
226
  });
227
+ // Run-time vulnerability check (opt-in metadata flag, report-only). It
228
+ // needs the pipeline id (the check is per pipeline) and the org platform
229
+ // secret (the verify step authenticates with it); without either it is
230
+ // skipped with a warning — a visibility feature never fails a synth.
231
+ let runtimeVulnCheck = isRuntimeVulnCheckEnabled(this.config.metadata.merged);
232
+ if (runtimeVulnCheck && (!props.pipelineId || !platformSecretName)) {
233
+ createLogger('pipeline-builder').warn(`${RUNTIME_VULN_CHECK_KEY} is enabled but the pipeline has no ${!props.pipelineId ? 'pipelineId' : 'orgId'} — `
234
+ + 'skipping the run-time check steps. Synthesize through `pipeline-manager pipeline synth/deploy --id`.');
235
+ runtimeVulnCheck = false;
236
+ }
218
237
  if (props.stages) {
219
238
  const stageBuilder = new StageBuilder({
220
239
  scope: this,
@@ -226,6 +245,7 @@ export class PipelineBuilder extends Construct {
226
245
  orgId: props.orgId,
227
246
  pipelineScope,
228
247
  stepManifest,
248
+ ...(runtimeVulnCheck && platformSecretName && { runtimeVulnCheck: { platformSecretName } }),
229
249
  });
230
250
  stageBuilder.addStages(this.pipeline, props.stages);
231
251
  }
@@ -297,6 +317,19 @@ export class PipelineBuilder extends Construct {
297
317
  resources: [`arn:aws:secretsmanager:*:*:secret:${platformSecretName}-*`],
298
318
  }));
299
319
  }
320
+ // Same grant for the registration key, and on the SYNTH project only: it
321
+ // is the one step that registers. Its NAME rides the pipeline-wide
322
+ // environment (resolveDefaults), not a SECRETS_MANAGER variable, so a
323
+ // missing key skips the registration with a warning instead of failing
324
+ // the build at DOWNLOAD_SOURCE — and a step without this grant cannot
325
+ // read it.
326
+ if (registrationSecretName) {
327
+ this.pipeline.synthProject.addToRolePolicy(new PolicyStatement({
328
+ effect: Effect.ALLOW,
329
+ actions: ['secretsmanager:GetSecretValue'],
330
+ resources: [`arn:aws:secretsmanager:*:*:secret:${registrationSecretName}-*`],
331
+ }));
332
+ }
300
333
  const cdkPipeline = this.pipeline.pipeline;
301
334
  this.stepManifest = stepManifest.entries(cdkPipeline);
302
335
  const meta = this.config.metadata.merged;
@@ -416,6 +449,8 @@ export class PipelineBuilder extends Construct {
416
449
  const standaloneSecurityGroups = securityGroupConfig
417
450
  ? resolveSecurityGroup(this, id, securityGroupConfig)
418
451
  : undefined;
452
+ const caBundle = platformCaBundle();
453
+ const { CODEBUILD_DEFAULT_IMAGE: defaultImage, CODEBUILD_DEFAULT_IMAGE_DIGEST: defaultImageDigest } = process.env;
419
454
  // Pipeline-level env vars available to all CodeBuild actions
420
455
  // Note: #{codepipeline.*} resolved variables must go through CodeBuildStep.env
421
456
  // (action-level), not buildEnvironment.environmentVariables (project-level).
@@ -423,11 +458,23 @@ export class PipelineBuilder extends Construct {
423
458
  PLATFORM_BASE_URL: { value: platformUrl },
424
459
  ...(pipelineId && { PIPELINE_ID: { value: pipelineId } }),
425
460
  ...(platformSecretName && { PLATFORM_SECRET_NAME: { value: platformSecretName } }),
426
- // Propagate TLS verification setting so all CodeBuild steps can reach
427
- // the platform API when using self-signed certificates
428
- ...(process.env.NODE_TLS_REJECT_UNAUTHORIZED === '0' && {
461
+ // The registration key's secret NAME (only the synth role may read it).
462
+ ...(orgId && { [PIPELINE_REGISTRATION_SECRET_ENV]: { value: CoreConstants.secretPath(orgId, PIPELINE_REGISTRATION_SECRET_LEAF) } }),
463
+ // PLATFORM_TLS_VERIFY=false (dev self-signed platform): every CodeBuild
464
+ // step reaches the platform unverified. See core/platform-tls.ts.
465
+ ...(!platformTlsVerify() && {
429
466
  NODE_TLS_REJECT_UNAUTHORIZED: { value: '0' },
467
+ [PLATFORM_TLS_VERIFY_ENV]: { value: 'false' },
430
468
  }),
469
+ // A private-CA platform: the CA travels with the pipeline so the
470
+ // self-mutating synth (and any step calling the platform) VERIFIES the
471
+ // certificate instead of needing `--no-verify-ssl`. See core/platform-tls.ts.
472
+ ...(caBundle && { [PLATFORM_CA_BUNDLE_ENV]: { value: caBundle } }),
473
+ // The self-mutating synth re-resolves the default build image inside
474
+ // CodeBuild, where the operator's env is absent; carry the image and its
475
+ // digest so the re-synthesized template keeps the same pin.
476
+ ...(defaultImage && { CODEBUILD_DEFAULT_IMAGE: { value: defaultImage } }),
477
+ ...(defaultImageDigest && { CODEBUILD_DEFAULT_IMAGE_DIGEST: { value: defaultImageDigest } }),
431
478
  };
432
479
  const securityGroups = [
433
480
  ...(networkProps?.securityGroups ?? []),
@@ -449,4 +496,4 @@ export class PipelineBuilder extends Construct {
449
496
  };
450
497
  }
451
498
  }
452
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9waXBlbGluZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEcsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlELE9BQU8sS0FBSyxPQUFPLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUQsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFN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RSxDQUFDO1NBQ3BDLENBQUM7UUFFRixPQUFPO1lBQ0wsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0YsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDcEQscUVBQXFFO1lBQ3JFLHdEQUF3RDtZQUN4RCx1RUFBdUU7WUFDdkUsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCxpRUFBaUU7WUFDakUsZ0JBQWdCLEVBQUU7Z0JBQ2hCLFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO2dCQUNqRCxvQkFBb0IsRUFBRSxlQUFlO2FBQ3RDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLCBQaXBlbGluZVR5cGUsIFZhcmlhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZSc7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHNucyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7IENvZGVQaXBlbGluZSwgdHlwZSBDb2RlQnVpbGRPcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbiB9IGZyb20gJy4vZGVwbG95LWF0dHJpYnV0aW9uLmpzJztcbmltcG9ydCB7IFBpcGVsaW5lQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vcGlwZWxpbmUtY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgeyBQbHVnaW5Mb29rdXAgfSBmcm9tICcuL3BsdWdpbi1sb29rdXAuanMnO1xuaW1wb3J0IHsgU291cmNlQnVpbGRlciB9IGZyb20gJy4vc291cmNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgU3RhZ2VCdWlsZGVyIH0gZnJvbSAnLi9zdGFnZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFN0ZXBNYW5pZmVzdFJlY29yZGVyIH0gZnJvbSAnLi9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VPcHRpb25zLCBTeW50aE9wdGlvbnMgfSBmcm9tICcuL3N0ZXAtdHlwZXMuanMnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzLCBpc1Jlc2VydmVkVGFnS2V5IH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcuanMnO1xuaW1wb3J0IHsgbGFtYmRhQXJjaGl0ZWN0dXJlLCBsYW1iZGFSdW50aW1lLCBsYW1iZGFUaW1lb3V0IH0gZnJvbSAnLi4vY29uZmlnL2F3cy1jb25maWctY2RrLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0cnlDb25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnLXR5cGVzLmpzJztcbmltcG9ydCB7IEFydGlmYWN0TWFuYWdlciB9IGZyb20gJy4uL2NvcmUvYXJ0aWZhY3QtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBVbmlxdWVJZCB9IGZyb20gJy4uL2NvcmUvaWQtZ2VuZXJhdG9yLmpzJztcbmltcG9ydCB7XG4gIGFzSW50LFxuICBpc1RydWUsXG4gIG1ldGFkYXRhRm9yQ29kZVBpcGVsaW5lLFxuICBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhLFxuICBwYXJzZVBpcGVsaW5lVmFyaWFibGVzLFxuICByb2xlQ29uZmlnRnJvbU1ldGFkYXRhLFxuICBzZWN1cml0eUdyb3VwQ29uZmlnRnJvbU1ldGFkYXRhLFxufSBmcm9tICcuLi9jb3JlL21ldGFkYXRhLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQnVpbGREZWZhdWx0cyB9IGZyb20gJy4uL2NvcmUvbmV0d29yay10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlTmV0d29yaywgbmV0d29ya0NvbmZpZ0Zyb21FbnYgfSBmcm9tICcuLi9jb3JlL25ldHdvcmsuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ29kZUJ1aWxkU3RlcCwgZ2V0Q29tcHV0ZVR5cGUsIHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUtleXMsIFRyaWdnZXJUeXBlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGFEYXRhVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UGx1Z2luQ29udHJhY3QsIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZSwgcGx1Z2luQXJ0aWZhY3RBbGlhcyB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWNvbnRyYWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUm9sZUNvbmZpZyB9IGZyb20gJy4uL2NvcmUvcm9sZS10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUm9sZSB9IGZyb20gJy4uL2NvcmUvcm9sZS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlU2VjdXJpdHlHcm91cCB9IGZyb20gJy4uL2NvcmUvc2VjdXJpdHktZ3JvdXAuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2NvcmUvc3RlcC1tYW5pZmVzdC5qcyc7XG5cbmNvbnN0IFBJUEVMSU5FX0VWRU5UX01BUDogUmVjb3JkPHN0cmluZywgUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHM+ID0ge1xuICBGQUlMRUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9GQUlMRUQsXG4gIFNVQ0NFRURFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NVQ0NFRURFRCxcbiAgU1RBUlRFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NUQVJURUQsXG4gIENBTkNFTEVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fQ0FOQ0VMRUQsXG4gIFNVUEVSU0VERUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9TVVBFUlNFREVELFxufTtcblxuZnVuY3Rpb24gcGFyc2VOb3RpZmljYXRpb25FdmVudHModmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpO1xuICByZXR1cm4gWydGQUlMRUQnLCAnU1VDQ0VFREVEJ107XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGBwYi5kZXBsb3lzYCB0YWcgdmFsdWUgYW5kIGVtaXQgdGhlIHN5bnRoLXRpbWUgd2FybmluZ3MgdGhhdCBjb21lXG4gKiB3aXRoIGl0LiBUaGUgZGVyaXZhdGlvbiBpdHNlbGYgaXMgQ0RLLWZyZWUgYW5kIGxpdmVzIGluXG4gKiB7QGxpbmsgZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbn0sIHNvIGBQT1NUIC9waXBlbGluZXNgIGFuZFxuICogYFBPU1QgL3BpcGVsaW5lcy92YWxpZGF0ZWAgcmVwb3J0IHRoZSBzYW1lIGF0dHJpYnV0aW9uIHdpdGhvdXQgc3ludGhlc2l6aW5nLlxuICpcbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBkZWNsYXJlcyBhbiBlbnZpcm9ubWVudCAobm8gZGVwbG95IHNpZ25hbCkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95c1RhZyhwcm9wczogQnVpbGRlclByb3BzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBkZXBsb3lzVGFnLCB3YXJuaW5ncyB9ID0gZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbihwcm9wcyk7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigncGlwZWxpbmUtYnVpbGRlcicpO1xuICBmb3IgKGNvbnN0IHcgb2Ygd2FybmluZ3MpIGxvZy53YXJuKHcubWVzc2FnZSk7XG4gIHJldHVybiBkZXBsb3lzVGFnO1xufVxuXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgUGlwZWxpbmVCdWlsZGVyIGNvbnN0cnVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJQcm9wcyB7XG4gIC8qKiBQcm9qZWN0IGlkZW50aWZpZXIgKHdpbGwgYmUgc2FuaXRpemVkIHRvIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aCB1bmRlcnNjb3JlcykgKi9cbiAgcmVhZG9ubHkgcHJvamVjdDogc3RyaW5nO1xuXG4gIC8qKiBPcmdhbml6YXRpb24gaWRlbnRpZmllciAod2lsbCBiZSBzYW5pdGl6ZWQgdG8gbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIHVuZGVyc2NvcmVzKSAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVwbG95IGVudmlyb25tZW50IChlLmcuIGBwcm9kdWN0aW9uYCwgYHN0YWdpbmdgKSBmb3IgdGhlXG4gICAqIHNpbmdsZS1lbnZpcm9ubWVudCBjYXNlLiBXaGVuIHNldCAoYW5kIG5vIHN0YWdlIGRlY2xhcmVzIGl0cyBvd25cbiAgICogYGVudmlyb25tZW50YCksIHBpcGVsaW5lLWNvcmUgZGVyaXZlcyB0aGUgYHBiLmRlcGxveXNgIHRhZyBmcm9tIGl0LCBtYXJraW5nXG4gICAqIHRoZSBzb2xlIHN0YWdlIOKAlCBvciB0aGUgTEFTVCBzdGFnZSBvZiBhIG11bHRpLXN0YWdlIHBpcGVsaW5lICh3aXRoIGEgc3ludGhcbiAgICogd2FybmluZyksIG9yIGEgbGl0ZXJhbCBgRGVwbG95YCBzdGFnZSB3aGVuIHRoZXJlIGFyZSBubyBzdGFnZXMgdG8gbmFtZSDigJQgYXNcbiAgICogdGhlIGRlcGxveSBmb3IgRE9SQSBtZXRyaWNzLiBGb3IgbXVsdGktZW52aXJvbm1lbnQgcGlwZWxpbmVzLCBkZWNsYXJlXG4gICAqIGBlbnZpcm9ubWVudGAgcGVyIHN0YWdlIGluc3RlYWQgKHNlZSBgU3RhZ2VPcHRpb25zLmVudmlyb25tZW50YCkuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudD86IHN0cmluZztcblxuICAvKiogVGVuYW50IGlkZW50aWZpZXIgZm9yIHJlc29sdmluZyBwZXItb3JnIHNlY3JldHMgZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyICovXG4gIHJlYWRvbmx5IG9yZ0lkPzogc3RyaW5nO1xuXG4gIC8qKiBQaXBlbGluZSBkYXRhYmFzZSByZWNvcmQgSUQg4oCUIGluamVjdGVkIGFzIFBJUEVMSU5FX0lEIGVudiB2YXIgZm9yIGF1dG9ub21vdXMgc3ludGggKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVJZD86IHN0cmluZztcblxuICAvKiogT3B0aW9uYWwgY3VzdG9tIHBpcGVsaW5lIG5hbWUuIERlZmF1bHRzIHRvOiB7b3JnYW5pemF0aW9ufS17cHJvamVjdH0tcGlwZWxpbmUgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBHbG9iYWwgbWV0YWRhdGEgaW5oZXJpdGVkIGJ5IGFsbCBwaXBlbGluZSBzdGVwcyAqL1xuICByZWFkb25seSBnbG9iYWw/OiBNZXRhRGF0YVR5cGU7XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lLWxldmVsIHRlbXBsYXRlIHZhcmlhYmxlcywgZXhwb3NlZCB0byBge3sgcGlwZWxpbmUudmFycy4qIH19YCBpblxuICAgKiBwaXBlbGluZSBjb25maWdzIGFuZCBwbHVnaW4gc3BlY3MgKHNlZSBgUGx1Z2luU3BlYy5yZXF1aXJlZFZhcnNgKS4gRGVjbGFyZWRcbiAgICogaGVyZSBzbyB0aGUgYHBpcGVsaW5lLnZhcnNgIHRlbXBsYXRlIHNjb3BlIGlzIHR5cGUtY2hlY2tlZCBlbmQtdG8tZW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZS1sZXZlbCBDb2RlQnVpbGQgZGVmYXVsdHMgYXBwbGllZCB0byBhbGwgQ29kZUJ1aWxkIGFjdGlvbnNcbiAgICogKHN5bnRoLCBzZWxmLW11dGF0aW9uLCBhc3NldCBwdWJsaXNoaW5nKSB2aWEgYGNvZGVCdWlsZERlZmF1bHRzYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRzPzogQ29kZUJ1aWxkRGVmYXVsdHM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIElBTSByb2xlIGZvciB0aGUgQ29kZVBpcGVsaW5lLlxuICAgKiBXaGVuIHByb3ZpZGVkLCByZXNvbHZlcyB0byBhIENESyBJUm9sZSBhbmQgaXMgcGFzc2VkIHRvIHRoZSBDb2RlUGlwZWxpbmUgY29uc3RydWN0LlxuICAgKiBXaGVuIG9taXR0ZWQsIENESyBhdXRvLWNyZWF0ZXMgYSByb2xlIHdpdGggdGhlIGNvcnJlY3QgY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20gcHJpbmNpcGFsLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IFJvbGVDb25maWc7XG5cbiAgLyoqIFN5bnRoZXNpcyBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBzb3VyY2UgYW5kIHBsdWdpbiBkZXRhaWxzICovXG4gIHJlYWRvbmx5IHN5bnRoOiBTeW50aE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHBpcGVsaW5lIHN0YWdlcywgZWFjaCBjb250YWluaW5nIG9uZSBvciBtb3JlIENvZGVCdWlsZCBzdGVwcy5cbiAgICogU3RhZ2VzIGFyZSBhZGRlZCBhcyB3YXZlcyB0byB0aGUgQ29kZVBpcGVsaW5lIGFmdGVyIHRoZSBzeW50aCBzdGVwLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2VzPzogU3RhZ2VPcHRpb25zW107XG5cbiAgLyoqIE9wdGlvbmFsIGNyb24vcmF0ZSBleHByZXNzaW9uIGZvciBzY2hlZHVsZWQgcGlwZWxpbmUgZXhlY3V0aW9uLiAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IHN0cmluZztcblxuICAvKiogQ3VzdG9tIHRhZ3MgYXBwbGllZCB0byBhbGwgcGlwZWxpbmUgcmVzb3VyY2VzLiAqL1xuICByZWFkb25seSB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogUGx1Z2lucyBwcmUtcmVzb2x2ZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGhgIGZyb20gdGhlIHBsYXRmb3JtIEFQSSxcbiAgICoga2V5ZWQgYnkgYGFsaWFzIHx8IG5hbWVgLiBXaGVuIHByZXNlbnQsIGBQbHVnaW5Mb29rdXAucGx1Z2luKClgIHJldHVybnNcbiAgICogdGhlIG1hdGNoaW5nIGVudHJ5IGRpcmVjdGx5IGFuZCBza2lwcyB0aGUgY3VzdG9tIHJlc291cmNlIOKAlCBzbyB0aGVcbiAgICogc3ludGhlc2l6ZWQgQ0ZOIHRlbXBsYXRlIHNoaXBzIHdpdGggdGhlIHJlYWwgQ29kZUJ1aWxkIGltYWdlIGJha2VkIGluLlxuICAgKiBQb3B1bGF0ZWQgYnkgdGhlIENMSSBiZWZvcmUgaW52b2tpbmcgdGhlIGJvaWxlcnBsYXRlIGFwcDsgQ0RLIGNvbnN1bWVyc1xuICAgKiB3aG8gY29uc3RydWN0IFBpcGVsaW5lQnVpbGRlciBkaXJlY3RseSBub3JtYWxseSBsZWF2ZSB0aGlzIHVuc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRQbHVnaW5zPzogUmVjb3JkPHN0cmluZywgUGx1Z2luPjtcblxuICAvKipcbiAgICogUGxhdGZvcm0tc291cmNlZCByZWdpc3RyeSBvdmVycmlkZXMsIGFwcGxpZWQgb3ZlciB0aGUgZW52LWxvYWRlZCBgcmVnaXN0cnlgXG4gICAqIGNvbmZpZyBhdCBzeW50aCBzdGFydC4gcGlwZWxpbmUtbWFuYWdlciBwb3B1bGF0ZXMgdGhpcyBmcm9tIHRoZSBwbGF0Zm9ybSBVUkxcbiAgICogaXQgZGVwbG95cyBhZ2FpbnN0IHNvIHRoZSBDb2RlQnVpbGQgaW1hZ2UgVVJJcyB1c2UgYSBwdWxsIGhvc3QgQVdTIENvZGVCdWlsZFxuICAgKiBjYW4gcmVzb2x2ZSAoaW5zdGVhZCBvZiB0aGUgaW4tY2x1c3RlciBgcmVnaXN0cnk6NTAwMGAgZGVmYXVsdCkuIENES1xuICAgKiBjb25zdW1lcnMgY29uc3RydWN0aW5nIFBpcGVsaW5lQnVpbGRlciBkaXJlY3RseSBub3JtYWxseSBsZWF2ZSB0aGlzIHVuc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaXN0cnk/OiBQYXJ0aWFsPFJlZ2lzdHJ5Q29uZmlnPjtcbn1cblxuLyoqXG4gKiBDREsgY29uc3RydWN0IHRoYXQgY3JlYXRlcyBhbmQgY29uZmlndXJlcyBhIENvZGVQaXBlbGluZSBmb3IgY29udGludW91cyBkZXBsb3ltZW50LlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBNdWx0aS1zb3VyY2Ugc3VwcG9ydCAoUzMsIEdpdEh1YiwgQ29kZVN0YXIpXG4gKiAtIFBsdWdpbi1iYXNlZCBidWlsZCBzdGVwc1xuICogLSBNZXRhZGF0YS1kcml2ZW4gY29uZmlndXJhdGlvblxuICogLSBBdXRvbWF0aWMgdGFnZ2luZ1xuICogLSBBdXRvbWF0aWMgc2FuaXRpemF0aW9uIG9mIHByb2plY3QgYW5kIG9yZ2FuaXphdGlvbiBuYW1lc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBuZXcgUGlwZWxpbmVCdWlsZGVyKHRoaXMsICdNeVBpcGVsaW5lJywge1xuICogICBwcm9qZWN0OiAnbXktYXBwJyxcbiAqICAgb3JnYW5pemF0aW9uOiAnbXktb3JnJyxcbiAqICAgc3ludGg6IHtcbiAqICAgICBzb3VyY2U6IHtcbiAqICAgICAgIHR5cGU6ICdnaXRodWInLFxuICogICAgICAgb3B0aW9uczogeyByZXBvOiAnb3duZXIvcmVwbycsIGJyYW5jaDogJ21haW4nIH1cbiAqICAgICB9LFxuICogICAgIHBsdWdpbjogeyBuYW1lOiAnc3ludGgnIH1cbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVsaW5lQnVpbGRlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBwaXBlbGluZTogQ29kZVBpcGVsaW5lO1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBQaXBlbGluZUNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBXaGljaCBwbHVnaW4gZWFjaCBDb2RlUGlwZWxpbmUgYWN0aW9uIHJ1bnMsIHJlYWQgb2ZmIHRoZSBidWlsdFxuICAgKiBwaXBlbGluZS4gVGhlIENMSSBzaGlwcyBpdCB3aXRoIHRoZSByZWdpc3RyeSByZWdpc3RyYXRpb24gc28gZXZlbnQgaW5nZXN0XG4gICAqIGNhbiBhdHRyaWJ1dGUgYWN0aW9uIG91dGNvbWVzIHRvIGEgcGx1Z2luIHZlcnNpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RlcE1hbmlmZXN0OiBTdGVwTWFuaWZlc3RFbnRyeVtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCdWlsZGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gQXBwbHkgcGxhdGZvcm0tc291cmNlZCByZWdpc3RyeSBvdmVycmlkZXMgQkVGT1JFIGFueSBDb25maWcuZ2V0KCdyZWdpc3RyeScpXG4gICAgLy8gKHBsdWdpbi9kZWZhdWx0IGJ1aWxkLWltYWdlIHJlc29sdXRpb24gYmVsb3cpIHNvIHRoZSBzeW50aCB1c2VzIHRoZSBwdWxsXG4gICAgLy8gaG9zdCB0aGUgcGxhdGZvcm0gZGVwbG95cyBhZ2FpbnN0LCBub3QgdGhlIGluLWNsdXN0ZXIgZW52IGRlZmF1bHQuIFRoZSBDTElcbiAgICAvLyBvbmx5IHNldHMgcHJvcHMucmVnaXN0cnkgd2hlbiBJTUFHRV9SRUdJU1RSWV9QVUxMX0hPU1QgaXMgdW5zZXQsIHNvIGFuXG4gICAgLy8gZXhwbGljaXQgb3BlcmF0b3IgcHVsbCBob3N0IGlzIG5ldmVyIGNsb2JiZXJlZCAoc2VlIGJha2VQbGF0Zm9ybVJlZ2lzdHJ5KS5cbiAgICAvL1xuICAgIC8vIFNjb3BlZCArIHJlc3RvcmVkIHNvIHRoZSBvdmVycmlkZSBkb2VzIE5PVCBsZWFrIGludG8gdGhlIHByb2Nlc3Mtd2lkZVxuICAgIC8vIENvbmZpZyBjYWNoZTogaW4gYSBtdWx0aS1waXBlbGluZSBDREsgYXBwLCBwaXBlbGluZSBCJ3MgcmVnaXN0cnkgbXVzdCBub3RcbiAgICAvLyBibGVlZCBpbnRvIHBpcGVsaW5lIEEncyBpbWFnZSByZXNvbHV0aW9uLiBBbGwgcmVnaXN0cnkgcmVhZHMgaGFwcGVuXG4gICAgLy8gc3luY2hyb25vdXNseSBiZWxvdyAoYnVpbGQtaW1hZ2UgcmVzb2x1dGlvbiksIHNvIHJlc3RvcmluZyBhdCB0aGUgZW5kIG9mXG4gICAgLy8gdGhlIGNvbnN0cnVjdG9yIGtlZXBzIHNpbmdsZS1waXBlbGluZSBiZWhhdmlvciBpZGVudGljYWwuXG4gICAgY29uc3QgcmVzdG9yZVJlZ2lzdHJ5ID0gcHJvcHMucmVnaXN0cnlcbiAgICAgID8gQ29uZmlnLm92ZXJyaWRlU2NvcGVkKCdyZWdpc3RyeScsIHByb3BzLnJlZ2lzdHJ5KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBQaXBlbGluZUNvbmZpZ3VyYXRpb24gZm9yIGFsbCBidXNpbmVzcyBsb2dpYyAodmFsaWRhdGlvbiwgc2FuaXRpemF0aW9uLCBtZXRhZGF0YSBtZXJnaW5nKVxuICAgICAgdGhpcy5jb25maWcgPSBuZXcgUGlwZWxpbmVDb25maWd1cmF0aW9uKHByb3BzKTtcblxuICAgICAgY29uc3Qgc2VydmVyQ29uZmlnID0gQ29uZmlnLmdldCgnc2VydmVyJyk7XG4gICAgICBjb25zdCBhd3NDb25maWcgPSBDb25maWcuZ2V0KCdhd3MnKTtcbiAgICAgIC8vIFBhc3Mgb3JnK3Byb2plY3Qgc28gbG9nIGdyb3VwIC8gSUFNIHJvbGUgbmFtZXMgZ2V0IGEgc3RhYmxlIGhhc2hcbiAgICAgIC8vIHN1ZmZpeCBwZXIgcGlwZWxpbmUuIFByZXZlbnRzIGBSZXNvdXJjZSBhbHJlYWR5IGV4aXN0c2AgY29sbGlzaW9uc1xuICAgICAgLy8gYWNyb3NzIHN0YWNrcyBkZXBsb3llZCB0byB0aGUgc2FtZSBBV1MgYWNjb3VudC5cbiAgICAgIGNvbnN0IHVuaXF1ZUlkID0gbmV3IFVuaXF1ZUlkKHtcbiAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5vcmdhbml6YXRpb24sXG4gICAgICAgIHByb2plY3Q6IHRoaXMuY29uZmlnLnByb2plY3QsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBsdWdpbkxvb2t1cCA9IG5ldyBQbHVnaW5Mb29rdXAoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHVuaXF1ZUlkLmdlbmVyYXRlKCdwbHVnaW46bG9va3VwJyksXG4gICAgICAgIHtcbiAgICAgICAgICBvcmdhbml6YXRpb246IHRoaXMuY29uZmlnLm9yZ2FuaXphdGlvbixcbiAgICAgICAgICBwcm9qZWN0OiB0aGlzLmNvbmZpZy5wcm9qZWN0LFxuICAgICAgICAgIHBsYXRmb3JtVXJsOiBzZXJ2ZXJDb25maWcucGxhdGZvcm1VcmwsXG4gICAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgICAgb3JnSWQ6IHByb3BzLm9yZ0lkLFxuICAgICAgICAgIHJ1bnRpbWU6IGxhbWJkYVJ1bnRpbWUoYXdzQ29uZmlnLmxhbWJkYS5ydW50aW1lKSxcbiAgICAgICAgICB0aW1lb3V0OiBsYW1iZGFUaW1lb3V0KGF3c0NvbmZpZy5sYW1iZGEudGltZW91dFNlY29uZHMpLFxuICAgICAgICAgIGFyY2hpdGVjdHVyZTogbGFtYmRhQXJjaGl0ZWN0dXJlKGF3c0NvbmZpZy5sYW1iZGEuYXJjaGl0ZWN0dXJlKSxcbiAgICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBhd3NDb25maWcubGFtYmRhLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMsXG4gICAgICAgICAgcmVzb2x2ZWRQbHVnaW5zOiBwcm9wcy5yZXNvbHZlZFBsdWdpbnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBDcmVhdGUgc291cmNlIGFuZCBidWlsZCBzdGVwXG4gICAgICBjb25zdCBzb3VyY2VCdWlsZGVyID0gbmV3IFNvdXJjZUJ1aWxkZXIodGhpcywgdGhpcy5jb25maWcpO1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQnVpbGRlci5jcmVhdGUodW5pcXVlSWQpO1xuXG4gICAgICAvLyBTeW50aC1wbHVnaW4gcmVzb2x1dGlvbjpcbiAgICAgIC8vICAgMS4gUHJlLXJlc29sdmVkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoL2RlcGxveWAgZnJvbSB0aGUgcGxhdGZvcm1cbiAgICAgIC8vICAgICAgQVBJIOKGkiB1c2UgaXQuIFN5bnRoIHN0ZXAgcnVucyBvbiB0aGUgcmVhbCBgY2RrLXN5bnRoYCBpbWFnZSB3aXRoXG4gICAgICAvLyAgICAgIHJlYWwgY29tbWFuZHMgYmFrZWQgaW50byB0aGUgdGVtcGxhdGUuXG4gICAgICAvLyAgIDIuIE90aGVyd2lzZSDihpIgYGJvb3RzdHJhcCgpYDogY29sZC1zdGFydCBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGBcbiAgICAgIC8vICAgICAgb24gdGhlIGNvbmZpZ3VyZWQgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0UgKGRlZmF1bHRcbiAgICAgIC8vICAgICAgcGlwZWxpbmUtYm9vdHN0cmFwOjEuMCkuIFVzZWQgd2hlbiB0aGUgcGxhdGZvcm0gaXNuJ3QgcmVhY2hhYmxlXG4gICAgICAvLyAgICAgIGF0IHN5bnRoIHRpbWUgKENMSSBsb2dzIGEgd2FybmluZyBwZXIgbWlzc2VkIHBsdWdpbikuXG4gICAgICAvL1xuICAgICAgLy8gcGx1Z2luTG9va3VwLnBsdWdpbigpIHJlYWRzIGByZXNvbHZlZFBsdWdpbnNgIGludGVybmFsbHkgYW5kIHJldHVybnNcbiAgICAgIC8vIHRoZSBjYWNoZWQgZW50cnkgd2hlbiBwcmVzZW50IOKAlCBzbyBjYWxsaW5nIGl0IGFsd2F5cyB3aW5zIG92ZXJcbiAgICAgIC8vIGJvb3RzdHJhcCgpIHdoZW4gcHJlLXJlc29sdXRpb24gc3VjY2VlZGVkLlxuICAgICAgY29uc3Qgc3ludGhDYWNoZUtleSA9IHBsdWdpbkFydGlmYWN0QWxpYXModGhpcy5jb25maWcucGx1Z2luKTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IHByb3BzLnJlc29sdmVkUGx1Z2lucz8uW3N5bnRoQ2FjaGVLZXldXG4gICAgICAgID8gcGx1Z2luTG9va3VwLnBsdWdpbih0aGlzLmNvbmZpZy5wbHVnaW4pXG4gICAgICAgIDogcGx1Z2luTG9va3VwLmJvb3RzdHJhcCgpO1xuICAgICAgY29uc3QgZGVmYXVsdENvbXB1dGVUeXBlID0gZ2V0Q29tcHV0ZVR5cGUoYXdzQ29uZmlnLmNvZGVCdWlsZC5jb21wdXRlVHlwZSk7XG4gICAgICBjb25zdCBhcnRpZmFjdE1hbmFnZXIgPSBuZXcgQXJ0aWZhY3RNYW5hZ2VyKCk7XG5cbiAgICAgIC8vIFNjb3BlIGV4cG9zZWQgdG8gcGx1Z2luLXNwZWMgdGVtcGxhdGVzIGFzIGBwaXBlbGluZS4qYC4gU291cmNlZCBmcm9tIHRoZVxuICAgICAgLy8gY29uZmlnIHNvIHRoZSBzeW50aCBzdGVwLCBldmVyeSBzdGFnZSBzdGVwLCBhbmQgdGhlIHNvdXJjZSB0b2tlbiBhbGxcbiAgICAgIC8vIHJlc29sdmUgYWdhaW5zdCB0aGUgc2FtZSBzbmFwc2hvdCAoc2VlIFBpcGVsaW5lQ29uZmlndXJhdGlvbi5nZXRQaXBlbGluZVNjb3BlKS5cbiAgICAgIGNvbnN0IHBpcGVsaW5lU2NvcGUgPSB0aGlzLmNvbmZpZy5nZXRQaXBlbGluZVNjb3BlKCk7XG4gICAgICAvLyBDb250cmFjdCDigJQgc2VlIFN0YWdlQnVpbGRlci5yZXNvbHZlU3RlcC5cbiAgICAgIGFzc2VydFBsdWdpbkNvbnRyYWN0KHBsdWdpbiwgY29udHJhY3RTY29wZUZyb21UZW1wbGF0ZVNjb3BlKHBpcGVsaW5lU2NvcGUpLCAnc3ludGgnKTtcblxuICAgICAgY29uc3Qgc3RlcE1hbmlmZXN0ID0gbmV3IFN0ZXBNYW5pZmVzdFJlY29yZGVyKCk7XG4gICAgICBjb25zdCBzeW50aCA9IGNyZWF0ZUNvZGVCdWlsZFN0ZXAoe1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5zeW50aEN1c3RvbWl6YXRpb24sXG4gICAgICAgIGlkOiB1bmlxdWVJZC5nZW5lcmF0ZSgnY2RrOnN5bnRoJyksXG4gICAgICAgIHVuaXF1ZUlkLFxuICAgICAgICBwbHVnaW4sXG4gICAgICAgIGlucHV0OiBzb3VyY2UsXG4gICAgICAgIG1ldGFkYXRhOiB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQsXG4gICAgICAgIG5ldHdvcms6IHRoaXMuY29uZmlnLm5ldHdvcmssXG4gICAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgICBkZWZhdWx0Q29tcHV0ZVR5cGUsXG4gICAgICAgIGFydGlmYWN0TWFuYWdlcixcbiAgICAgICAgc3RhZ2VOYW1lOiAnbm8tc3RhZ2UnLFxuICAgICAgICBzdGFnZUFsaWFzOiAnbm8tc3RhZ2UtYWxpYXMnLFxuICAgICAgICAvLyBUaGUgY2Fub25pY2FsIGtleSBzZWdtZW50LiBgJHthbGlhcyA/PyBuYW1lfS1hbGlhc2Agc3VmZml4ZWQgYW5cbiAgICAgICAgLy8gRVhQTElDSVQgYWxpYXMgdG9vIChgbXktc3ludGhgIOKGkiBgbXktc3ludGgtYWxpYXNgKSwgc28gYSBzdGFnZSB0aGF0XG4gICAgICAgIC8vIHBpY2tlZCB0aGUgc3ludGggb3V0cHV0IGluIHRoZSBVSSBhc2tlZCBmb3IgYSBrZXkgbmV2ZXIgcmVnaXN0ZXJlZC5cbiAgICAgICAgcGx1Z2luQWxpYXM6IHBsdWdpbkFydGlmYWN0QWxpYXModGhpcy5jb25maWcucGx1Z2luKSxcbiAgICAgICAgb3JnSWQ6IHByb3BzLm9yZ0lkLFxuICAgICAgICBwaXBlbGluZVNjb3BlLFxuICAgICAgfSk7XG4gICAgICBzdGVwTWFuaWZlc3QucmVjb3JkKHN5bnRoLCBwbHVnaW4pO1xuXG4gICAgICAvLyBSZXNvbHZlIHBpcGVsaW5lLWxldmVsIGRlZmF1bHRzIGludG8gY29kZUJ1aWxkRGVmYXVsdHNcbiAgICAgIC8vIEJ1aWxkIHRoZSBwZXItb3JnIHBsYXRmb3JtIHNlY3JldCBuYW1lIGZvciBDb2RlQnVpbGQgZW52IHZhcnNcbiAgICAgIGNvbnN0IHBsYXRmb3JtU2VjcmV0TmFtZSA9IHByb3BzLm9yZ0lkXG4gICAgICAgID8gQ29yZUNvbnN0YW50cy5zZWNyZXRQYXRoKHByb3BzLm9yZ0lkLCAncGxhdGZvcm0nKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgY29kZUJ1aWxkRGVmYXVsdHMgPSB0aGlzLnJlc29sdmVEZWZhdWx0cyh0aGlzLmNvbmZpZy5kZWZhdWx0cywgdW5pcXVlSWQsIHByb3BzLnBpcGVsaW5lSWQsIHBsYXRmb3JtU2VjcmV0TmFtZSwgc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsLCBwcm9wcy5vcmdJZCk7XG5cbiAgICAgIC8vIFJlc29sdmUgSUFNIHJvbGU6IGV4cGxpY2l0IHByb3Agd2lucywgZWxzZSBgaWFtOnJvbGVgIG1ldGFkYXRhLCBlbHNlIGxldFxuICAgICAgLy8gQ0RLIGF1dG8tY3JlYXRlIHRoZSBwaXBlbGluZSByb2xlIChjb2RlcGlwZWxpbmUuYW1hem9uYXdzLmNvbSBwcmluY2lwYWwpLlxuICAgICAgY29uc3Qgcm9sZUNvbmZpZyA9IHByb3BzLnJvbGUgPz8gcm9sZUNvbmZpZ0Zyb21NZXRhZGF0YSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpO1xuICAgICAgaWYgKHJvbGVDb25maWc/LnR5cGUgPT09ICdjb2RlQnVpbGREZWZhdWx0Jykge1xuICAgICAgICBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWJ1aWxkZXInKS53YXJuKFxuICAgICAgICAgICdjb2RlQnVpbGREZWZhdWx0IHJvbGUgdHlwZSB1c2VzIGNvZGVidWlsZC5hbWF6b25hd3MuY29tIHRydXN0IHByaW5jaXBhbCDigJQgJyArXG4gICAgICAgICd0aGlzIGlzIG5vdCBzdWl0YWJsZSBhcyB0aGUgcGlwZWxpbmUtbGV2ZWwgcm9sZS4gQ29uc2lkZXIgdXNpbmcgcm9sZUFybi9yb2xlTmFtZSAnICtcbiAgICAgICAgJ29yIG9taXR0aW5nIHRoZSByb2xlIHRvIGxldCBDREsgYXV0by1jcmVhdGUgb25lIHdpdGggY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20uJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvbGUgPSByb2xlQ29uZmlnXG4gICAgICAgID8gcmVzb2x2ZVJvbGUodGhpcywgdW5pcXVlSWQsIHJvbGVDb25maWcpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyDilIDilIAgQXJ0aWZhY3QgYnVja2V0IChLTVMgZW5jcnlwdGlvbiArIHJldGVudGlvbikg4pSA4pSAXG4gICAgICAvLyBXaGVuIGBlbmNyeXB0aW9uLmttc0tleUFybmAgYW5kL29yIGBvcGVyYXRpb25zLmFydGlmYWN0UmV0ZW50aW9uRGF5c2AgYXJlXG4gICAgICAvLyBzZXQgd2UgY3JlYXRlIGEgY3VzdG9tIGFydGlmYWN0IGJ1Y2tldCBhbmQgcGFzcyBpdCB0byBDb2RlUGlwZWxpbmU7IHRoYXRcbiAgICAgIC8vIGlzIHRoZSBvbmx5IHdheSB0byBhdHRhY2ggYSBjdXN0b21lci1tYW5hZ2VkIGtleSAodGhlIEwzIGNvbnN0cnVjdCBleHBvc2VzXG4gICAgICAvLyBgYXJ0aWZhY3RCdWNrZXRgLCBub3QgYGVuY3J5cHRpb25LZXlgKS4gQWJzZW50IGJvdGgga2V5cywgQ0RLIGF1dG8tY3JlYXRlc1xuICAgICAgLy8gdGhlIGJ1Y2tldCBhbmQgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkLlxuICAgICAgY29uc3QgYXJ0aWZhY3RCdWNrZXQgPSB0aGlzLmJ1aWxkQXJ0aWZhY3RCdWNrZXQoKTtcblxuICAgICAgLy8gQ3JlYXRlIENvZGVQaXBlbGluZSBjb25zdHJ1Y3RcbiAgICAgIHRoaXMucGlwZWxpbmUgPSBuZXcgQ29kZVBpcGVsaW5lKHRoaXMsIHVuaXF1ZUlkLmdlbmVyYXRlKCdwaXBlbGluZXM6Y29kZXBpcGVsaW5lJyksIHtcbiAgICAgICAgLi4uKGNvZGVCdWlsZERlZmF1bHRzICYmIHsgY29kZUJ1aWxkRGVmYXVsdHMgfSksXG4gICAgICAgIC4uLihyb2xlICYmIHsgcm9sZSB9KSxcbiAgICAgICAgLi4uKGFydGlmYWN0QnVja2V0ICYmIHsgYXJ0aWZhY3RCdWNrZXQgfSksXG4gICAgICAgIHBpcGVsaW5lVHlwZTogUGlwZWxpbmVUeXBlLlYyLFxuICAgICAgICBwaXBlbGluZU5hbWU6IHRoaXMuY29uZmlnLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgc3ludGgsXG4gICAgICAgIC4uLm1ldGFkYXRhRm9yQ29kZVBpcGVsaW5lKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLnN0YWdlcykge1xuICAgICAgICBjb25zdCBzdGFnZUJ1aWxkZXIgPSBuZXcgU3RhZ2VCdWlsZGVyKHtcbiAgICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgICBwbHVnaW5Mb29rdXAsXG4gICAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgICAgZ2xvYmFsTWV0YWRhdGE6IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCxcbiAgICAgICAgICBkZWZhdWx0Q29tcHV0ZVR5cGUsXG4gICAgICAgICAgYXJ0aWZhY3RNYW5hZ2VyLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBwaXBlbGluZVNjb3BlLFxuICAgICAgICAgIHN0ZXBNYW5pZmVzdCxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YWdlQnVpbGRlci5hZGRTdGFnZXModGhpcy5waXBlbGluZSwgcHJvcHMuc3RhZ2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIFRhZ3Mg4pSA4pSAXG4gICAgICAvLyBUaGUgZmlyc3QgdGhyZWUgYXJlIG9wZXJhdGlvbnMtZXNzZW50aWFsIGFuZCB1c2VkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyXG4gICAgICAvLyBhdWRpdCBzdGFja3NgIHRvIGRpZmYgQ0ZOIHN0YWNrcyBhZ2FpbnN0IHRoZSBwaXBlbGluZV9yZWdpc3RyeSB0YWJsZS5cbiAgICAgIC8vIGBPcmdJZGAgaXMgdGhlIGNhbm9uaWNhbCBrZXkgZm9yIGNvc3QgYXR0cmlidXRpb24gKEFXUyBDb3N0IEV4cGxvcmVyXG4gICAgICAvLyBncm91cHMgYnkgdGFnIGtleS92YWx1ZSB3aGVuIGFjdGl2YXRlZCBpbiBCaWxsaW5nIHNldHRpbmdzKS5cbiAgICAgIC8vIFVTRVIgVEFHUyBGSVJTVCwgc28gdGhlIHBsYXRmb3JtIHRhZ3MgYmVsb3cgb3ZlcndyaXRlIHJhdGhlciB0aGFuIGFyZVxuICAgICAgLy8gb3ZlcndyaXR0ZW4uIGBUYWdzLm9mYCBsZXRzIGEgbGF0ZXIgYWRkIHJlcGxhY2UgYW4gZWFybGllciBvbmUsIGFuZFxuICAgICAgLy8gdGhlc2UgdXNlZCB0byBiZSBhcHBsaWVkIExBU1Qg4oCUIHdoaWNoIGxldCBhIGNhbGxlciByZWRlZmluZVxuICAgICAgLy8gcGIucGlwZWxpbmUtaWQsIE9yZ0lkIG9yIHBiLmRlcGxveXMgYW5kIHBvaW50IGFub3RoZXIgb3JnJ3MgZXhlY3V0aW9uc1xuICAgICAgLy8gYXQgdGhlaXIgb3duIHBpcGVsaW5lLCBzaW5jZSB0aGUgZXZlbnRzIExhbWJkYSByZWFkcyBleGFjdGx5IHRob3NlIHRhZ3NcbiAgICAgIC8vIHRvIGRlY2lkZSB3aG9zZSByZXBvcnRzIGFuIGV4ZWN1dGlvbiBiZWxvbmdzIHRvLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSByZXNlcnZlZC1rZXkgZmlsdGVyIGlzIHRoZSBzZWNvbmQgaGFsZjogb3JkZXJpbmcgYWxvbmUgd291bGQgbGV0IGFcbiAgICAgIC8vIGNhbGxlciBzZXQgYHBiLmRlcGxveXNgIG9uIGEgcGlwZWxpbmUgdGhhdCBkZWNsYXJlcyBubyBlbnZpcm9ubWVudCAobm9cbiAgICAgIC8vIHBsYXRmb3JtIHRhZyB0byBvdmVyd3JpdGUgaXQpLiBUaGUgQVBJIHJlZnVzZXMgdGhlc2Uga2V5cyB0b28sIGJ1dCBhXG4gICAgICAvLyB0ZWFtIHVzaW5nIHRoaXMgY29uc3RydWN0IGRpcmVjdGx5IG5ldmVyIHBhc3NlcyB0aHJvdWdoIHRoZSBBUEksIHNvXG4gICAgICAvLyB0aGlzIGlzIHRoZSBjaGVjayB0aGF0IGFsd2F5cyBydW5zLlxuICAgICAgaWYgKHByb3BzLnRhZ3MpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMudGFncykpIHtcbiAgICAgICAgICBpZiAoaXNSZXNlcnZlZFRhZ0tleShrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3BpcGVsaW5lLWJ1aWxkZXInLCAndHJ1ZScpO1xuICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3Byb2plY3QnLCB0aGlzLmNvbmZpZy5wcm9qZWN0KTtcbiAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdvcmdhbml6YXRpb24nLCB0aGlzLmNvbmZpZy5vcmdhbml6YXRpb24pO1xuICAgICAgaWYgKHByb3BzLm9yZ0lkKSB7XG4gICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdPcmdJZCcsIHByb3BzLm9yZ0lkKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0YWJsZSBldmVudC1yZXBvcnRpbmcga2V5LiBBcHBsaWVkIGF0IHN5bnRoICh0aGUgcGlwZWxpbmVJZCBpcyBrbm93blxuICAgICAgLy8gaGVyZSksIHNvIGl0J3MgcHJlc2VudCBmcm9tIHN0YWNrIGNyZWF0aW9uIOKAlCB0aGUgZXZlbnRzIExhbWJkYSByZWFkcyB0aGlzXG4gICAgICAvLyB0YWcgdG8gYXR0cmlidXRlIENvZGVQaXBlbGluZSBzdGF0ZS1jaGFuZ2UgZXZlbnRzIHRvIHRoZSBwaXBlbGluZSB3aXRob3V0XG4gICAgICAvLyBldmVyIGhhbmRsaW5nIHRoZSBBUk4vYWNjb3VudC4gU2VlIHBhY2thZ2VzL3BpcGVsaW5lLWV2ZW50cy5cbiAgICAgIGlmIChwcm9wcy5waXBlbGluZUlkKSB7XG4gICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwYi5waXBlbGluZS1pZCcsIHByb3BzLnBpcGVsaW5lSWQpO1xuICAgICAgfVxuICAgICAgLy8gRGVwbG95LWVudmlyb25tZW50IGF0dHJpYnV0aW9uIGZvciBET1JBIG1ldHJpY3MuIGBwYi5kZXBsb3lzYCBsaXN0cyBldmVyeVxuICAgICAgLy8gZGVwbG95IHN0YWdlIGFzIGA8c3RhZ2VOYW1lPjo8ZW52aXJvbm1lbnQ+YCBwYWlycyBqb2luZWQgYnkgYCtgLCByZWFkIGJ5XG4gICAgICAvLyB0aGUgZXZlbnRzIExhbWJkYSBmcm9tIHRoZSBzYW1lIExpc3RUYWdzIGNhbGwgdG8gbWFyayB3aGljaCBzdGFnZXMgYXJlXG4gICAgICAvLyBkZXBsb3lzIGFuZCB0byB3aGljaCBlbnZpcm9ubWVudC4gQWJzZW50IHdoZW4gbm8gZW52aXJvbm1lbnQgaXMgZGVjbGFyZWRcbiAgICAgIC8vIOKAlCBzdWNoIHBpcGVsaW5lcyBwcm9kdWNlIG5vIERPUkEgZGVwbG95IHNpZ25hbCB1bnRpbCB0aGV5IHJlLXN5bnRoLlxuICAgICAgY29uc3QgZGVwbG95c1RhZyA9IGJ1aWxkRGVwbG95c1RhZyhwcm9wcyk7XG4gICAgICBpZiAoZGVwbG95c1RhZykge1xuICAgICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncGIuZGVwbG95cycsIGRlcGxveXNUYWcpO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCB0aGUgaW50ZXJuYWwgcGlwZWxpbmUgYmVmb3JlIGFjY2Vzc2luZyBpdHMgcHJvcGVydGllc1xuICAgICAgdGhpcy5waXBlbGluZS5idWlsZFBpcGVsaW5lKCk7XG5cbiAgICAgIC8vIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGlzIGluamVjdGVkIGludG8gdGhlIENvZGVCdWlsZCBlbnZpcm9ubWVudCBhYm92ZSxcbiAgICAgIC8vIGJ1dCB0aGUgc3ludGggcHJvY2VzcyByZWFkcyB0aGF0IHNlY3JldCBpdHNlbGYgd2l0aCB0aGUgQVdTIFNES1xuICAgICAgLy8gKGhhbmRsZXJzL3BsYXRmb3JtLWNyZWRlbnRpYWwudHMgR2V0U2VjcmV0VmFsdWUpIOKAlCBzbyB0aGUgcm9sZSBuZWVkcyBhblxuICAgICAgLy8gZXhwbGljaXQgZ3JhbnQuIE5vdGhpbmcgd2FzIGdyYW50aW5nIGl0OiB0aGUgUkVHSVNUUlkgc2VjcmV0IHdvcmtzIG9ubHlcbiAgICAgIC8vIGJlY2F1c2UgYExpbnV4QnVpbGRJbWFnZS5mcm9tRG9ja2VyUmVnaXN0cnkoeyBzZWNyZXRzTWFuYWdlckNyZWRlbnRpYWxzIH0pYFxuICAgICAgLy8gbWFrZXMgQ0RLIGdyYW50IHRoYXQgb25lIGludGVybmFsbHksIHdoaWNoIGRvZXMgbm90IGdlbmVyYWxpc2UgdG8gYVxuICAgICAgLy8gc2VjcmV0IHRoZSBidWlsZCByZWFkcyBmb3IgaXRzZWxmLiBXaXRob3V0IHRoaXMgZXZlcnkgc3ludGggZmFpbHMgd2l0aFxuICAgICAgLy8gQWNjZXNzRGVuaWVkRXhjZXB0aW9uIG9uIEdldFNlY3JldFZhbHVlLCBhbmQgdGhlIHBpcGVsaW5lIHJvbGUgaGFzIHRvIGJlXG4gICAgICAvLyBwYXRjaGVkIGJ5IGhhbmQgaW4gZWFjaCBhY2NvdW50LlxuICAgICAgLy9cbiAgICAgIC8vIFNjb3BlZCB0byB0aGlzIG9yZydzIHBsYXRmb3JtIHNlY3JldCBhbmQgbWlycm9yaW5nIHRoZSBwbHVnaW4tbG9va3VwXG4gICAgICAvLyBMYW1iZGEncyBncmFudCAocGlwZWxpbmUvcGx1Z2luLWxvb2t1cC50cyksIGluY2x1ZGluZyB0aGUgYC0qYCBzdWZmaXgg4oCUXG4gICAgICAvLyBTZWNyZXRzIE1hbmFnZXIgYXBwZW5kcyBzaXggcmFuZG9tIGNoYXJhY3RlcnMgdG8gZXZlcnkgQVJOLlxuICAgICAgaWYgKHBsYXRmb3JtU2VjcmV0TmFtZSkge1xuICAgICAgICB0aGlzLnBpcGVsaW5lLnN5bnRoUHJvamVjdC5hZGRUb1JvbGVQb2xpY3kobmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgYWN0aW9uczogWydzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZSddLFxuICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOnNlY3JldHNtYW5hZ2VyOio6KjpzZWNyZXQ6JHtwbGF0Zm9ybVNlY3JldE5hbWV9LSpgXSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZGtQaXBlbGluZSA9IHRoaXMucGlwZWxpbmUucGlwZWxpbmU7XG4gICAgICB0aGlzLnN0ZXBNYW5pZmVzdCA9IHN0ZXBNYW5pZmVzdC5lbnRyaWVzKGNka1BpcGVsaW5lKTtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQ7XG5cbiAgICAgIC8vIOKUgOKUgCBQaXBlbGluZS1sZXZlbCBWYXJpYWJsZXMgKENvZGVQaXBlbGluZSBWMikg4pSA4pSAXG4gICAgICBmb3IgKGNvbnN0IHYgb2YgcGFyc2VQaXBlbGluZVZhcmlhYmxlcyhtZXRhW01ldGFkYXRhS2V5cy5QSVBFTElORV9WQVJJQUJMRVNdKSkge1xuICAgICAgICBjZGtQaXBlbGluZS5hZGRWYXJpYWJsZShuZXcgVmFyaWFibGUoe1xuICAgICAgICAgIHZhcmlhYmxlTmFtZTogdi5uYW1lLFxuICAgICAgICAgIC4uLih2LmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVmYXVsdFZhbHVlOiB2LmRlZmF1bHRWYWx1ZSB9KSxcbiAgICAgICAgICAuLi4odi5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgZGVzY3JpcHRpb246IHYuZGVzY3JpcHRpb24gfSksXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIFNOUyBOb3RpZmljYXRpb25zIOKUgOKUgFxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uVG9waWNBcm4gPSBtZXRhW01ldGFkYXRhS2V5cy5OT1RJRklDQVRJT05fVE9QSUNfQVJOXTtcbiAgICAgIGlmICh0eXBlb2Ygbm90aWZpY2F0aW9uVG9waWNBcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHRvcGljID0gc25zLlRvcGljLmZyb21Ub3BpY0Fybih0aGlzLCAnTm90aWZpY2F0aW9uVG9waWMnLCBub3RpZmljYXRpb25Ub3BpY0Fybik7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkV2ZW50cyA9IHBhcnNlTm90aWZpY2F0aW9uRXZlbnRzKG1ldGFbTWV0YWRhdGFLZXlzLk5PVElGSUNBVElPTl9FVkVOVFNdKVxuICAgICAgICAgIC5tYXAoZSA9PiBQSVBFTElORV9FVkVOVF9NQVBbZS50b1VwcGVyQ2FzZSgpXSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjZGtQaXBlbGluZS5ub3RpZnlPbignUGlwZWxpbmVOb3RpZmljYXRpb24nLCB0b3BpYywgeyBldmVudHM6IG5vdGlmaWNhdGlvbkV2ZW50cyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgU2NoZWR1bGVkIEV4ZWN1dGlvbiDilIDilIBcbiAgICAgIGlmIChwcm9wcy5zeW50aC5zb3VyY2Uub3B0aW9ucz8udHJpZ2dlciA9PT0gVHJpZ2dlclR5cGUuU0NIRURVTEUgfHwgcHJvcHMuc2NoZWR1bGUpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IHByb3BzLnNjaGVkdWxlIHx8IChwcm9wcy5zeW50aC5zb3VyY2Uub3B0aW9ucyBhcyB7IHNjaGVkdWxlPzogc3RyaW5nIH0pPy5zY2hlZHVsZSB8fCAncmF0ZSgxIGRheSknO1xuICAgICAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ1NjaGVkdWxlUnVsZScsIHtcbiAgICAgICAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLmV4cHJlc3Npb24oZXhwciksXG4gICAgICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkNvZGVQaXBlbGluZShjZGtQaXBlbGluZSldLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIEV4ZWN1dGlvbiBFdmVudCBUcmFja2luZyAoZm9yd2FyZCBwaXBlbGluZSBzdGF0ZSBjaGFuZ2VzIHRvIFNOUykg4pSA4pSAXG4gICAgICAvLyBgaXNUcnVlYCwgbm90IHRydXRoaW5lc3M6IGBcImZhbHNlXCJgIGlzIGEgdHJ1dGh5IHN0cmluZywgc28gdGhlIG1ldGFkYXRhXG4gICAgICAvLyBgXCJhd3M6Y2RrOm9wZXJhdGlvbnM6ZXhlY3V0aW9uZXZlbnRzXCI6IFwiZmFsc2VcImAgdXNlZCB0byBDUkVBVEUgdGhlIHJ1bGUuXG4gICAgICBpZiAoaXNUcnVlKG1ldGFbTWV0YWRhdGFLZXlzLkVOQUJMRV9FWEVDVVRJT05fRVZFTlRTXSkgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblRvcGljQXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ0V4ZWN1dGlvbkV2ZW50UnVsZScsIHtcbiAgICAgICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgICAgIHNvdXJjZTogWydhd3MuY29kZXBpcGVsaW5lJ10sXG4gICAgICAgICAgICBkZXRhaWxUeXBlOiBbJ0NvZGVQaXBlbGluZSBQaXBlbGluZSBFeGVjdXRpb24gU3RhdGUgQ2hhbmdlJ10sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFtjZGtQaXBlbGluZS5waXBlbGluZUFybl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuU25zVG9waWMoXG4gICAgICAgICAgICBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdFeGVjdXRpb25FdmVudFRvcGljJywgbm90aWZpY2F0aW9uVG9waWNBcm4pLFxuICAgICAgICAgICldLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIFBpcGVsaW5lIE1ldHJpY3MgJiBBbGFybXMg4pSA4pSAXG4gICAgICAvLyBTYW1lIHRyYXA6IGBcImF3czpjZGs6b3BlcmF0aW9uczptZXRyaWNzXCI6IFwiZmFsc2VcImAgY3JlYXRlZCB0aGUgYWxhcm0uXG4gICAgICBjb25zdCBlbmFibGVNZXRyaWNzID0gaXNUcnVlKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZFtNZXRhZGF0YUtleXMuRU5BQkxFX01FVFJJQ1NdKTtcbiAgICAgIGlmIChlbmFibGVNZXRyaWNzKSB7XG4gICAgICAgIG5ldyBjbG91ZHdhdGNoLkFsYXJtKHRoaXMsICdQaXBlbGluZUZhaWx1cmVBbGFybScsIHtcbiAgICAgICAgICBtZXRyaWM6IG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICAgICAgICBuYW1lc3BhY2U6ICdBV1MvQ29kZVBpcGVsaW5lJyxcbiAgICAgICAgICAgIG1ldHJpY05hbWU6ICdGYWlsZWRQaXBlbGluZUV4ZWN1dGlvbkNvdW50JyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHsgUGlwZWxpbmVOYW1lOiB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUgfSxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBQaXBlbGluZSAke3RoaXMuY29uZmlnLnBpcGVsaW5lTmFtZX0gZXhlY3V0aW9uIGZhaWxlZGAsXG4gICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxuICAgICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBwZXItYnVpbGRlciByZWdpc3RyeSBvdmVycmlkZSBzbyBpdCBuZXZlciBsZWFrcyBpbnRvIHRoZVxuICAgICAgLy8gcHJvY2Vzcy13aWRlIENvbmZpZyBjYWNoZSAoc2VlIHRoZSBvdmVycmlkZSBhdCB0aGUgdG9wIG9mIHRoZSBjb25zdHJ1Y3RvcikuXG4gICAgICByZXN0b3JlUmVnaXN0cnk/LigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGN1c3RvbSBhcnRpZmFjdCBidWNrZXQgd2hlbiBgZW5jcnlwdGlvbi5rbXNLZXlBcm5gIGFuZC9vclxuICAgKiBgb3BlcmF0aW9ucy5hcnRpZmFjdFJldGVudGlvbkRheXNgIGFyZSBzZXQuIFJldHVybnMgdW5kZWZpbmVkIG90aGVyd2lzZSBzb1xuICAgKiBDREsgYXV0by1jcmVhdGVzIHRoZSBkZWZhdWx0IGFydGlmYWN0IGJ1Y2tldCAodW5jaGFuZ2VkIGJlaGF2aW9yKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBcnRpZmFjdEJ1Y2tldCgpOiBzMy5JQnVja2V0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkO1xuICAgIGNvbnN0IGttc0tleUFybiA9IHR5cGVvZiBtZXRhW01ldGFkYXRhS2V5cy5LTVNfS0VZX0FSTl0gPT09ICdzdHJpbmcnXG4gICAgICA/IChtZXRhW01ldGFkYXRhS2V5cy5LTVNfS0VZX0FSTl0gYXMgc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmV0ZW50aW9uRGF5cyA9IGFzSW50KG1ldGFbTWV0YWRhdGFLZXlzLkFSVElGQUNUX1JFVEVOVElPTl9EQVlTXSk7XG5cbiAgICBpZiAoIWttc0tleUFybiAmJiByZXRlbnRpb25EYXlzID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0ga21zS2V5QXJuXG4gICAgICA/IGttcy5LZXkuZnJvbUtleUFybih0aGlzLCAnQXJ0aWZhY3RLZXknLCBrbXNLZXlBcm4pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ0FydGlmYWN0QnVja2V0Jywge1xuICAgICAgZW5jcnlwdGlvbjogZW5jcnlwdGlvbktleSA/IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TIDogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgLi4uKGVuY3J5cHRpb25LZXkgJiYgeyBlbmNyeXB0aW9uS2V5IH0pLFxuICAgICAgLi4uKHJldGVudGlvbkRheXMgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbeyBleHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKHJldGVudGlvbkRheXMpIH1dLFxuICAgICAgfSksXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IHMzLkJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgIH0pO1xuICAgIFRhZ3Mub2YoYnVja2V0KS5hZGQoJ3BpcGVsaW5lJywgdGhpcy5jb25maWcucGlwZWxpbmVOYW1lKTtcbiAgICByZXR1cm4gYnVja2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIENvZGVCdWlsZERlZmF1bHRzIGludG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IENESydzIGNvZGVCdWlsZERlZmF1bHRzLlxuICAgKiBDb21iaW5lcyBuZXR3b3JrIGNvbmZpZywgc2VjdXJpdHkgZ3JvdXBzLCBhbmQgcGlwZWxpbmUtbGV2ZWwgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIChQSVBFTElORV9JRCwgRVhFQ1VUSU9OX0lELCBQTEFURk9STV9CQVNFX1VSTCkgYXZhaWxhYmxlIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZURlZmF1bHRzKFxuICAgIGRlZmF1bHRzOiBDb2RlQnVpbGREZWZhdWx0cyB8IHVuZGVmaW5lZCxcbiAgICBpZDogVW5pcXVlSWQsXG4gICAgcGlwZWxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHBsYXRmb3JtU2VjcmV0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHBsYXRmb3JtVXJsOiBzdHJpbmcsXG4gICAgb3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKTogQ29kZUJ1aWxkT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gUGVyLXBpcGVsaW5lIG5ldHdvcmsgY29uZmlnIHdpbnM7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gYW4gZW52LWRyaXZlblxuICAgIC8vIGdsb2JhbCBWUEMgKGludGVybmFsIC8gaW5zaWRlLUFXUy1vbmx5IG1vZGUpIHNvIGV2ZXJ5IHBpcGVsaW5lJ3NcbiAgICAvLyBDb2RlQnVpbGQgcnVucyBpbiB0aGUgVlBDIGFuZCBjYW4gcmVhY2ggdGhlIHByaXZhdGUgZ2F0ZXdheS4gVW5zZXQgaW5cbiAgICAvLyBwdWJsaWMgZGVwbG95cyDihpIgQ29kZUJ1aWxkIHN0YXlzIGluIHRoZSBBV1MtbWFuYWdlZCBuZXR3b3JrLlxuICAgIC8vIFByZWNlZGVuY2U6IGV4cGxpY2l0IHByb3AgPiBgZWMyOm5ldHdvcmtgIG1ldGFkYXRhID4gZW52LWRyaXZlbiBnbG9iYWwgVlBDLlxuICAgIGNvbnN0IG5ldHdvcmsgPSBkZWZhdWx0cz8ubmV0d29yayA/PyBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCkgPz8gbmV0d29ya0NvbmZpZ0Zyb21FbnYoKTtcbiAgICBjb25zdCBuZXR3b3JrUHJvcHMgPSBuZXR3b3JrXG4gICAgICA/IHJlc29sdmVOZXR3b3JrKHRoaXMsIGlkLCBuZXR3b3JrKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBTYW1lIHByZWNlZGVuY2UgZm9yIHN0YW5kYWxvbmUgc2VjdXJpdHkgZ3JvdXBzIChwcm9wID4gYGVjMjpzZWN1cml0eWdyb3VwYCBtZXRhZGF0YSkuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cENvbmZpZyA9IGRlZmF1bHRzPy5zZWN1cml0eUdyb3VwcyA/PyBzZWN1cml0eUdyb3VwQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCk7XG4gICAgY29uc3Qgc3RhbmRhbG9uZVNlY3VyaXR5R3JvdXBzID0gc2VjdXJpdHlHcm91cENvbmZpZ1xuICAgICAgPyByZXNvbHZlU2VjdXJpdHlHcm91cCh0aGlzLCBpZCwgc2VjdXJpdHlHcm91cENvbmZpZylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gUGlwZWxpbmUtbGV2ZWwgZW52IHZhcnMgYXZhaWxhYmxlIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9uc1xuICAgIC8vIE5vdGU6ICN7Y29kZXBpcGVsaW5lLip9IHJlc29sdmVkIHZhcmlhYmxlcyBtdXN0IGdvIHRocm91Z2ggQ29kZUJ1aWxkU3RlcC5lbnZcbiAgICAvLyAoYWN0aW9uLWxldmVsKSwgbm90IGJ1aWxkRW52aXJvbm1lbnQuZW52aXJvbm1lbnRWYXJpYWJsZXMgKHByb2plY3QtbGV2ZWwpLlxuICAgIGNvbnN0IHBpcGVsaW5lRW52VmFyczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nIH0+ID0ge1xuICAgICAgUExBVEZPUk1fQkFTRV9VUkw6IHsgdmFsdWU6IHBsYXRmb3JtVXJsIH0sXG4gICAgICAuLi4ocGlwZWxpbmVJZCAmJiB7IFBJUEVMSU5FX0lEOiB7IHZhbHVlOiBwaXBlbGluZUlkIH0gfSksXG4gICAgICAuLi4ocGxhdGZvcm1TZWNyZXROYW1lICYmIHsgUExBVEZPUk1fU0VDUkVUX05BTUU6IHsgdmFsdWU6IHBsYXRmb3JtU2VjcmV0TmFtZSB9IH0pLFxuICAgICAgLy8gUHJvcGFnYXRlIFRMUyB2ZXJpZmljYXRpb24gc2V0dGluZyBzbyBhbGwgQ29kZUJ1aWxkIHN0ZXBzIGNhbiByZWFjaFxuICAgICAgLy8gdGhlIHBsYXRmb3JtIEFQSSB3aGVuIHVzaW5nIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlc1xuICAgICAgLi4uKHByb2Nlc3MuZW52Lk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQgPT09ICcwJyAmJiB7XG4gICAgICAgIE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ6IHsgdmFsdWU6ICcwJyB9LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gW1xuICAgICAgLi4uKG5ldHdvcmtQcm9wcz8uc2VjdXJpdHlHcm91cHMgPz8gW10pLFxuICAgICAgLi4uKHN0YW5kYWxvbmVTZWN1cml0eUdyb3VwcyA/PyBbXSksXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi4obmV0d29ya1Byb3BzICYmIHsgdnBjOiBuZXR3b3JrUHJvcHMudnBjLCBzdWJuZXRTZWxlY3Rpb246IG5ldHdvcmtQcm9wcy5zdWJuZXRTZWxlY3Rpb24gfSksXG4gICAgICAuLi4oc2VjdXJpdHlHcm91cHMubGVuZ3RoID4gMCAmJiB7IHNlY3VyaXR5R3JvdXBzIH0pLFxuICAgICAgLy8gYnVpbGRJbWFnZSBhdCB0aGlzIGxldmVsIHJlYWNoZXMgQ0RLIFBpcGVsaW5lcycgaW50ZXJuYWxseS13cmFwcGVkXG4gICAgICAvLyBTaGVsbFN0ZXAgQ29kZUJ1aWxkIGFjdGlvbiwgd2hpY2ggb3RoZXJ3aXNlIGhhcmRjb2Rlc1xuICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBjdXJhdGVkIHN0YW5kYXJkIGltYWdlLiBTZXR0aW5nIGl0IGhlcmUgY2xvc2VzIHRoZSBnYXBcbiAgICAgIC8vIGV4cG9zZWQgaW4gdGhlIHNhbWUgZW52IHZhciAoYENPREVCVUlMRF9ERUZBVUxUX0lNQUdFYCkgdGhhdCB0aGVcbiAgICAgIC8vIENvZGVCdWlsZFN0ZXAgcGF0aCBhbHJlYWR5IGhvbm9ycyB2aWEgcmVzb2x2ZVBsdWdpbkltYWdlKCknc1xuICAgICAgLy8gZmFsbGJhY2suIFBlci1zdGVwIGBidWlsZEltYWdlYCBvbiBhIENvZGVCdWlsZFN0ZXAgc3RpbGwgd2lucy5cbiAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgYnVpbGRJbWFnZTogcmVzb2x2ZURlZmF1bHRCdWlsZEltYWdlKHRoaXMsIG9yZ0lkKSxcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHBpcGVsaW5lRW52VmFycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl19
499
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9waXBlbGluZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEcsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssT0FBTyxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFN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a0IsRUFBRSxFQUFFLENBQUM7U0FDN0YsQ0FBQztRQUVGLE1BQU0sY0FBYyxHQUFHO1lBQ3JCLEdBQUcsQ0FBQyxZQUFZLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxHQUFHLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDO1NBQ3BDLENBQUM7UUFFRixPQUFPO1lBQ0wsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0YsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDcEQscUVBQXFFO1lBQ3JFLHdEQUF3RDtZQUN4RCx1RUFBdUU7WUFDdkUsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCxpRUFBaUU7WUFDakUsZ0JBQWdCLEVBQUU7Z0JBQ2hCLFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO2dCQUNqRCxvQkFBb0IsRUFBRSxlQUFlO2FBQ3RDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLCBQaXBlbGluZVR5cGUsIFZhcmlhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZSc7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgeyBFZmZlY3QsIFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHNucyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7IENvZGVQaXBlbGluZSwgdHlwZSBDb2RlQnVpbGRPcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvcGlwZWxpbmVzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZGVzY3JpYmVEZXBsb3lBdHRyaWJ1dGlvbiB9IGZyb20gJy4vZGVwbG95LWF0dHJpYnV0aW9uLmpzJztcbmltcG9ydCB7IFBpcGVsaW5lQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vcGlwZWxpbmUtY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgeyBQbHVnaW5Mb29rdXAgfSBmcm9tICcuL3BsdWdpbi1sb29rdXAuanMnO1xuaW1wb3J0IHsgU291cmNlQnVpbGRlciB9IGZyb20gJy4vc291cmNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgU3RhZ2VCdWlsZGVyIH0gZnJvbSAnLi9zdGFnZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFN0ZXBNYW5pZmVzdFJlY29yZGVyIH0gZnJvbSAnLi9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VPcHRpb25zLCBTeW50aE9wdGlvbnMgfSBmcm9tICcuL3N0ZXAtdHlwZXMuanMnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzLCBpc1Jlc2VydmVkVGFnS2V5IH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcuanMnO1xuaW1wb3J0IHsgbGFtYmRhQXJjaGl0ZWN0dXJlLCBsYW1iZGFSdW50aW1lLCBsYW1iZGFUaW1lb3V0IH0gZnJvbSAnLi4vY29uZmlnL2F3cy1jb25maWctY2RrLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0cnlDb25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnLXR5cGVzLmpzJztcbmltcG9ydCB7IEFydGlmYWN0TWFuYWdlciB9IGZyb20gJy4uL2NvcmUvYXJ0aWZhY3QtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBVbmlxdWVJZCB9IGZyb20gJy4uL2NvcmUvaWQtZ2VuZXJhdG9yLmpzJztcbmltcG9ydCB7XG4gIGFzSW50LFxuICBpc1RydWUsXG4gIG1ldGFkYXRhRm9yQ29kZVBpcGVsaW5lLFxuICBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhLFxuICBwYXJzZVBpcGVsaW5lVmFyaWFibGVzLFxuICByb2xlQ29uZmlnRnJvbU1ldGFkYXRhLFxuICBzZWN1cml0eUdyb3VwQ29uZmlnRnJvbU1ldGFkYXRhLFxufSBmcm9tICcuLi9jb3JlL21ldGFkYXRhLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQnVpbGREZWZhdWx0cyB9IGZyb20gJy4uL2NvcmUvbmV0d29yay10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlTmV0d29yaywgbmV0d29ya0NvbmZpZ0Zyb21FbnYgfSBmcm9tICcuLi9jb3JlL25ldHdvcmsuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ29kZUJ1aWxkU3RlcCwgZ2V0Q29tcHV0ZVR5cGUsIHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0VOViwgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS1yZWdpc3RyYXRpb24uanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFLZXlzLCBUcmlnZ2VyVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRhRGF0YVR5cGUgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmltcG9ydCB7IFBMQVRGT1JNX0NBX0JVTkRMRV9FTlYsIFBMQVRGT1JNX1RMU19WRVJJRllfRU5WLCBwbGF0Zm9ybUNhQnVuZGxlLCBwbGF0Zm9ybVRsc1ZlcmlmeSB9IGZyb20gJy4uL2NvcmUvcGxhdGZvcm0tdGxzLmpzJztcbmltcG9ydCB7IGFzc2VydFBsdWdpbkNvbnRyYWN0LCBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUsIHBsdWdpbkFydGlmYWN0QWxpYXMsIHBsdWdpblN0ZXBMYWJlbCB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWNvbnRyYWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUm9sZUNvbmZpZyB9IGZyb20gJy4uL2NvcmUvcm9sZS10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUm9sZSB9IGZyb20gJy4uL2NvcmUvcm9sZS5qcyc7XG5pbXBvcnQgeyBpc1J1bnRpbWVWdWxuQ2hlY2tFbmFibGVkLCBSVU5USU1FX1ZVTE5fQ0hFQ0tfS0VZIH0gZnJvbSAnLi4vY29yZS9ydW50aW1lLWNoZWNrLmpzJztcbmltcG9ydCB7IHJlc29sdmVTZWN1cml0eUdyb3VwIH0gZnJvbSAnLi4vY29yZS9zZWN1cml0eS1ncm91cC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0ZXBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vY29yZS9zdGVwLW1hbmlmZXN0LmpzJztcblxuY29uc3QgUElQRUxJTkVfRVZFTlRfTUFQOiBSZWNvcmQ8c3RyaW5nLCBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cz4gPSB7XG4gIEZBSUxFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX0ZBSUxFRCxcbiAgU1VDQ0VFREVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fU1VDQ0VFREVELFxuICBTVEFSVEVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fU1RBUlRFRCxcbiAgQ0FOQ0VMRUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9DQU5DRUxFRCxcbiAgU1VQRVJTRURFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NVUEVSU0VERUQsXG59O1xuXG5mdW5jdGlvbiBwYXJzZU5vdGlmaWNhdGlvbkV2ZW50cyh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSk7XG4gIHJldHVybiBbJ0ZBSUxFRCcsICdTVUNDRUVERUQnXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHBiLmRlcGxveXNgIHRhZyB2YWx1ZSBhbmQgZW1pdCB0aGUgc3ludGgtdGltZSB3YXJuaW5ncyB0aGF0IGNvbWVcbiAqIHdpdGggaXQuIFRoZSBkZXJpdmF0aW9uIGl0c2VsZiBpcyBDREstZnJlZSBhbmQgbGl2ZXMgaW5cbiAqIHtAbGluayBkZXNjcmliZURlcGxveUF0dHJpYnV0aW9ufSwgc28gYFBPU1QgL3BpcGVsaW5lc2AgYW5kXG4gKiBgUE9TVCAvcGlwZWxpbmVzL3ZhbGlkYXRlYCByZXBvcnQgdGhlIHNhbWUgYXR0cmlidXRpb24gd2l0aG91dCBzeW50aGVzaXppbmcuXG4gKlxuICogUmV0dXJucyB1bmRlZmluZWQgd2hlbiBub3RoaW5nIGRlY2xhcmVzIGFuIGVudmlyb25tZW50IChubyBkZXBsb3kgc2lnbmFsKS5cbiAqL1xuZnVuY3Rpb24gYnVpbGREZXBsb3lzVGFnKHByb3BzOiBCdWlsZGVyUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGRlcGxveXNUYWcsIHdhcm5pbmdzIH0gPSBkZXNjcmliZURlcGxveUF0dHJpYnV0aW9uKHByb3BzKTtcbiAgY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1idWlsZGVyJyk7XG4gIGZvciAoY29uc3QgdyBvZiB3YXJuaW5ncykgbG9nLndhcm4ody5tZXNzYWdlKTtcbiAgcmV0dXJuIGRlcGxveXNUYWc7XG59XG5cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBQaXBlbGluZUJ1aWxkZXIgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlclByb3BzIHtcbiAgLyoqIFByb2plY3QgaWRlbnRpZmllciAod2lsbCBiZSBzYW5pdGl6ZWQgdG8gbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIHVuZGVyc2NvcmVzKSAqL1xuICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgLyoqIE9yZ2FuaXphdGlvbiBpZGVudGlmaWVyICh3aWxsIGJlIHNhbml0aXplZCB0byBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMpICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gYHByb2R1Y3Rpb25gLCBgc3RhZ2luZ2ApIGZvciB0aGVcbiAgICogc2luZ2xlLWVudmlyb25tZW50IGNhc2UuIFdoZW4gc2V0IChhbmQgbm8gc3RhZ2UgZGVjbGFyZXMgaXRzIG93blxuICAgKiBgZW52aXJvbm1lbnRgKSwgcGlwZWxpbmUtY29yZSBkZXJpdmVzIHRoZSBgcGIuZGVwbG95c2AgdGFnIGZyb20gaXQsIG1hcmtpbmdcbiAgICogdGhlIHNvbGUgc3RhZ2Ug4oCUIG9yIHRoZSBMQVNUIHN0YWdlIG9mIGEgbXVsdGktc3RhZ2UgcGlwZWxpbmUgKHdpdGggYSBzeW50aFxuICAgKiB3YXJuaW5nKSwgb3IgYSBsaXRlcmFsIGBEZXBsb3lgIHN0YWdlIHdoZW4gdGhlcmUgYXJlIG5vIHN0YWdlcyB0byBuYW1lIOKAlCBhc1xuICAgKiB0aGUgZGVwbG95IGZvciBET1JBIG1ldHJpY3MuIEZvciBtdWx0aS1lbnZpcm9ubWVudCBwaXBlbGluZXMsIGRlY2xhcmVcbiAgICogYGVudmlyb25tZW50YCBwZXIgc3RhZ2UgaW5zdGVhZCAoc2VlIGBTdGFnZU9wdGlvbnMuZW52aXJvbm1lbnRgKS5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzogc3RyaW5nO1xuXG4gIC8qKiBUZW5hbnQgaWRlbnRpZmllciBmb3IgcmVzb2x2aW5nIHBlci1vcmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIgKi9cbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFBpcGVsaW5lIGRhdGFiYXNlIHJlY29yZCBJRCDigJQgaW5qZWN0ZWQgYXMgUElQRUxJTkVfSUQgZW52IHZhciBmb3IgYXV0b25vbW91cyBzeW50aCAqL1xuICByZWFkb25seSBwaXBlbGluZUlkPzogc3RyaW5nO1xuXG4gIC8qKiBPcHRpb25hbCBjdXN0b20gcGlwZWxpbmUgbmFtZS4gRGVmYXVsdHMgdG86IHtvcmdhbml6YXRpb259LXtwcm9qZWN0fS1waXBlbGluZSAqL1xuICByZWFkb25seSBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEdsb2JhbCBtZXRhZGF0YSBpbmhlcml0ZWQgYnkgYWxsIHBpcGVsaW5lIHN0ZXBzICovXG4gIHJlYWRvbmx5IGdsb2JhbD86IE1ldGFEYXRhVHlwZTtcblxuICAvKipcbiAgICogUGlwZWxpbmUtbGV2ZWwgdGVtcGxhdGUgdmFyaWFibGVzLCBleHBvc2VkIHRvIGB7eyBwaXBlbGluZS52YXJzLiogfX1gIGluXG4gICAqIHBpcGVsaW5lIGNvbmZpZ3MgYW5kIHBsdWdpbiBzcGVjcyAoc2VlIGBQbHVnaW5TcGVjLnJlcXVpcmVkVmFyc2ApLiBEZWNsYXJlZFxuICAgKiBoZXJlIHNvIHRoZSBgcGlwZWxpbmUudmFyc2AgdGVtcGxhdGUgc2NvcGUgaXMgdHlwZS1jaGVja2VkIGVuZC10by1lbmQuXG4gICAqL1xuICByZWFkb25seSB2YXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lLWxldmVsIENvZGVCdWlsZCBkZWZhdWx0cyBhcHBsaWVkIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9uc1xuICAgKiAoc3ludGgsIHNlbGYtbXV0YXRpb24sIGFzc2V0IHB1Ymxpc2hpbmcpIHZpYSBgY29kZUJ1aWxkRGVmYXVsdHNgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdHM/OiBDb2RlQnVpbGREZWZhdWx0cztcblxuICAvKipcbiAgICogT3B0aW9uYWwgSUFNIHJvbGUgZm9yIHRoZSBDb2RlUGlwZWxpbmUuXG4gICAqIFdoZW4gcHJvdmlkZWQsIHJlc29sdmVzIHRvIGEgQ0RLIElSb2xlIGFuZCBpcyBwYXNzZWQgdG8gdGhlIENvZGVQaXBlbGluZSBjb25zdHJ1Y3QuXG4gICAqIFdoZW4gb21pdHRlZCwgQ0RLIGF1dG8tY3JlYXRlcyBhIHJvbGUgd2l0aCB0aGUgY29ycmVjdCBjb2RlcGlwZWxpbmUuYW1hem9uYXdzLmNvbSBwcmluY2lwYWwuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogUm9sZUNvbmZpZztcblxuICAvKiogU3ludGhlc2lzIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIHNvdXJjZSBhbmQgcGx1Z2luIGRldGFpbHMgKi9cbiAgcmVhZG9ubHkgc3ludGg6IFN5bnRoT3B0aW9ucztcblxuICAvKipcbiAgICogT3B0aW9uYWwgcGlwZWxpbmUgc3RhZ2VzLCBlYWNoIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgQ29kZUJ1aWxkIHN0ZXBzLlxuICAgKiBTdGFnZXMgYXJlIGFkZGVkIGFzIHdhdmVzIHRvIHRoZSBDb2RlUGlwZWxpbmUgYWZ0ZXIgdGhlIHN5bnRoIHN0ZXAuXG4gICAqL1xuICByZWFkb25seSBzdGFnZXM/OiBTdGFnZU9wdGlvbnNbXTtcblxuICAvKiogT3B0aW9uYWwgY3Jvbi9yYXRlIGV4cHJlc3Npb24gZm9yIHNjaGVkdWxlZCBwaXBlbGluZSBleGVjdXRpb24uICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKiBDdXN0b20gdGFncyBhcHBsaWVkIHRvIGFsbCBwaXBlbGluZSByZXNvdXJjZXMuICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQbHVnaW5zIHByZS1yZXNvbHZlZCBieSBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGAgZnJvbSB0aGUgcGxhdGZvcm0gQVBJLFxuICAgKiBrZXllZCBieSBgYWxpYXMgfHwgbmFtZWAuIFdoZW4gcHJlc2VudCwgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgcmV0dXJuc1xuICAgKiB0aGUgbWF0Y2hpbmcgZW50cnkgZGlyZWN0bHkgYW5kIHNraXBzIHRoZSBjdXN0b20gcmVzb3VyY2Ug4oCUIHNvIHRoZVxuICAgKiBzeW50aGVzaXplZCBDRk4gdGVtcGxhdGUgc2hpcHMgd2l0aCB0aGUgcmVhbCBDb2RlQnVpbGQgaW1hZ2UgYmFrZWQgaW4uXG4gICAqIFBvcHVsYXRlZCBieSB0aGUgQ0xJIGJlZm9yZSBpbnZva2luZyB0aGUgYm9pbGVycGxhdGUgYXBwOyBDREsgY29uc3VtZXJzXG4gICAqIHdobyBjb25zdHJ1Y3QgUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IG5vcm1hbGx5IGxlYXZlIHRoaXMgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZFBsdWdpbnM/OiBSZWNvcmQ8c3RyaW5nLCBQbHVnaW4+O1xuXG4gIC8qKlxuICAgKiBQbGF0Zm9ybS1zb3VyY2VkIHJlZ2lzdHJ5IG92ZXJyaWRlcywgYXBwbGllZCBvdmVyIHRoZSBlbnYtbG9hZGVkIGByZWdpc3RyeWBcbiAgICogY29uZmlnIGF0IHN5bnRoIHN0YXJ0LiBwaXBlbGluZS1tYW5hZ2VyIHBvcHVsYXRlcyB0aGlzIGZyb20gdGhlIHBsYXRmb3JtIFVSTFxuICAgKiBpdCBkZXBsb3lzIGFnYWluc3Qgc28gdGhlIENvZGVCdWlsZCBpbWFnZSBVUklzIHVzZSBhIHB1bGwgaG9zdCBBV1MgQ29kZUJ1aWxkXG4gICAqIGNhbiByZXNvbHZlIChpbnN0ZWFkIG9mIHRoZSBpbi1jbHVzdGVyIGByZWdpc3RyeTo1MDAwYCBkZWZhdWx0KS4gQ0RLXG4gICAqIGNvbnN1bWVycyBjb25zdHJ1Y3RpbmcgUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IG5vcm1hbGx5IGxlYXZlIHRoaXMgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSByZWdpc3RyeT86IFBhcnRpYWw8UmVnaXN0cnlDb25maWc+O1xufVxuXG4vKipcbiAqIENESyBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIGFuZCBjb25maWd1cmVzIGEgQ29kZVBpcGVsaW5lIGZvciBjb250aW51b3VzIGRlcGxveW1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIE11bHRpLXNvdXJjZSBzdXBwb3J0IChTMywgR2l0SHViLCBDb2RlU3RhcilcbiAqIC0gUGx1Z2luLWJhc2VkIGJ1aWxkIHN0ZXBzXG4gKiAtIE1ldGFkYXRhLWRyaXZlbiBjb25maWd1cmF0aW9uXG4gKiAtIEF1dG9tYXRpYyB0YWdnaW5nXG4gKiAtIEF1dG9tYXRpYyBzYW5pdGl6YXRpb24gb2YgcHJvamVjdCBhbmQgb3JnYW5pemF0aW9uIG5hbWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ldyBQaXBlbGluZUJ1aWxkZXIodGhpcywgJ015UGlwZWxpbmUnLCB7XG4gKiAgIHByb2plY3Q6ICdteS1hcHAnLFxuICogICBvcmdhbml6YXRpb246ICdteS1vcmcnLFxuICogICBzeW50aDoge1xuICogICAgIHNvdXJjZToge1xuICogICAgICAgdHlwZTogJ2dpdGh1YicsXG4gKiAgICAgICBvcHRpb25zOiB7IHJlcG86ICdvd25lci9yZXBvJywgYnJhbmNoOiAnbWFpbicgfVxuICogICAgIH0sXG4gKiAgICAgcGx1Z2luOiB7IG5hbWU6ICdzeW50aCcgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVCdWlsZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBpcGVsaW5lOiBDb2RlUGlwZWxpbmU7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IFBpcGVsaW5lQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICAqIFdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb24gcnVucywgcmVhZCBvZmYgdGhlIGJ1aWx0XG4gICAqIHBpcGVsaW5lLiBUaGUgQ0xJIHNoaXBzIGl0IHdpdGggdGhlIHJlZ2lzdHJ5IHJlZ2lzdHJhdGlvbiBzbyBldmVudCBpbmdlc3RcbiAgICogY2FuIGF0dHJpYnV0ZSBhY3Rpb24gb3V0Y29tZXMgdG8gYSBwbHVnaW4gdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGVwTWFuaWZlc3Q6IFN0ZXBNYW5pZmVzdEVudHJ5W107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJ1aWxkZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBBcHBseSBwbGF0Zm9ybS1zb3VyY2VkIHJlZ2lzdHJ5IG92ZXJyaWRlcyBCRUZPUkUgYW55IENvbmZpZy5nZXQoJ3JlZ2lzdHJ5JylcbiAgICAvLyAocGx1Z2luL2RlZmF1bHQgYnVpbGQtaW1hZ2UgcmVzb2x1dGlvbiBiZWxvdykgc28gdGhlIHN5bnRoIHVzZXMgdGhlIHB1bGxcbiAgICAvLyBob3N0IHRoZSBwbGF0Zm9ybSBkZXBsb3lzIGFnYWluc3QsIG5vdCB0aGUgaW4tY2x1c3RlciBlbnYgZGVmYXVsdC4gVGhlIENMSVxuICAgIC8vIG9ubHkgc2V0cyBwcm9wcy5yZWdpc3RyeSB3aGVuIElNQUdFX1JFR0lTVFJZX1BVTExfSE9TVCBpcyB1bnNldCwgc28gYW5cbiAgICAvLyBleHBsaWNpdCBvcGVyYXRvciBwdWxsIGhvc3QgaXMgbmV2ZXIgY2xvYmJlcmVkIChzZWUgYmFrZVBsYXRmb3JtUmVnaXN0cnkpLlxuICAgIC8vXG4gICAgLy8gU2NvcGVkICsgcmVzdG9yZWQgc28gdGhlIG92ZXJyaWRlIGRvZXMgTk9UIGxlYWsgaW50byB0aGUgcHJvY2Vzcy13aWRlXG4gICAgLy8gQ29uZmlnIGNhY2hlOiBpbiBhIG11bHRpLXBpcGVsaW5lIENESyBhcHAsIHBpcGVsaW5lIEIncyByZWdpc3RyeSBtdXN0IG5vdFxuICAgIC8vIGJsZWVkIGludG8gcGlwZWxpbmUgQSdzIGltYWdlIHJlc29sdXRpb24uIEFsbCByZWdpc3RyeSByZWFkcyBoYXBwZW5cbiAgICAvLyBzeW5jaHJvbm91c2x5IGJlbG93IChidWlsZC1pbWFnZSByZXNvbHV0aW9uKSwgc28gcmVzdG9yaW5nIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgY29uc3RydWN0b3Iga2VlcHMgc2luZ2xlLXBpcGVsaW5lIGJlaGF2aW9yIGlkZW50aWNhbC5cbiAgICBjb25zdCByZXN0b3JlUmVnaXN0cnkgPSBwcm9wcy5yZWdpc3RyeVxuICAgICAgPyBDb25maWcub3ZlcnJpZGVTY29wZWQoJ3JlZ2lzdHJ5JywgcHJvcHMucmVnaXN0cnkpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIFBpcGVsaW5lQ29uZmlndXJhdGlvbiBmb3IgYWxsIGJ1c2luZXNzIGxvZ2ljICh2YWxpZGF0aW9uLCBzYW5pdGl6YXRpb24sIG1ldGFkYXRhIG1lcmdpbmcpXG4gICAgICB0aGlzLmNvbmZpZyA9IG5ldyBQaXBlbGluZUNvbmZpZ3VyYXRpb24ocHJvcHMpO1xuXG4gICAgICBjb25zdCBzZXJ2ZXJDb25maWcgPSBDb25maWcuZ2V0KCdzZXJ2ZXInKTtcbiAgICAgIGNvbnN0IGF3c0NvbmZpZyA9IENvbmZpZy5nZXQoJ2F3cycpO1xuICAgICAgLy8gUGFzcyBvcmcrcHJvamVjdCBzbyBsb2cgZ3JvdXAgLyBJQU0gcm9sZSBuYW1lcyBnZXQgYSBzdGFibGUgaGFzaFxuICAgICAgLy8gc3VmZml4IHBlciBwaXBlbGluZS4gUHJldmVudHMgYFJlc291cmNlIGFscmVhZHkgZXhpc3RzYCBjb2xsaXNpb25zXG4gICAgICAvLyBhY3Jvc3Mgc3RhY2tzIGRlcGxveWVkIHRvIHRoZSBzYW1lIEFXUyBhY2NvdW50LlxuICAgICAgY29uc3QgdW5pcXVlSWQgPSBuZXcgVW5pcXVlSWQoe1xuICAgICAgICBvcmdhbml6YXRpb246IHRoaXMuY29uZmlnLm9yZ2FuaXphdGlvbixcbiAgICAgICAgcHJvamVjdDogdGhpcy5jb25maWcucHJvamVjdCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGx1Z2luTG9va3VwID0gbmV3IFBsdWdpbkxvb2t1cChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdW5pcXVlSWQuZ2VuZXJhdGUoJ3BsdWdpbjpsb29rdXAnKSxcbiAgICAgICAge1xuICAgICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcub3JnYW5pemF0aW9uLFxuICAgICAgICAgIHByb2plY3Q6IHRoaXMuY29uZmlnLnByb2plY3QsXG4gICAgICAgICAgcGxhdGZvcm1Vcmw6IHNlcnZlckNvbmZpZy5wbGF0Zm9ybVVybCxcbiAgICAgICAgICB1bmlxdWVJZCxcbiAgICAgICAgICBvcmdJZDogcHJvcHMub3JnSWQsXG4gICAgICAgICAgcGlwZWxpbmVJZDogcHJvcHMucGlwZWxpbmVJZCxcbiAgICAgICAgICBydW50aW1lOiBsYW1iZGFSdW50aW1lKGF3c0NvbmZpZy5sYW1iZGEucnVudGltZSksXG4gICAgICAgICAgdGltZW91dDogbGFtYmRhVGltZW91dChhd3NDb25maWcubGFtYmRhLnRpbWVvdXRTZWNvbmRzKSxcbiAgICAgICAgICBhcmNoaXRlY3R1cmU6IGxhbWJkYUFyY2hpdGVjdHVyZShhd3NDb25maWcubGFtYmRhLmFyY2hpdGVjdHVyZSksXG4gICAgICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogYXdzQ29uZmlnLmxhbWJkYS5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgICAgICAgIHJlc29sdmVkUGx1Z2luczogcHJvcHMucmVzb2x2ZWRQbHVnaW5zLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIHNvdXJjZSBhbmQgYnVpbGQgc3RlcFxuICAgICAgY29uc3Qgc291cmNlQnVpbGRlciA9IG5ldyBTb3VyY2VCdWlsZGVyKHRoaXMsIHRoaXMuY29uZmlnKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUJ1aWxkZXIuY3JlYXRlKHVuaXF1ZUlkKTtcblxuICAgICAgLy8gU3ludGgtcGx1Z2luIHJlc29sdXRpb246XG4gICAgICAvLyAgIDEuIFByZS1yZXNvbHZlZCBieSBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3lgIGZyb20gdGhlIHBsYXRmb3JtXG4gICAgICAvLyAgICAgIEFQSSDihpIgdXNlIGl0LiBTeW50aCBzdGVwIHJ1bnMgb24gdGhlIHJlYWwgYGNkay1zeW50aGAgaW1hZ2Ugd2l0aFxuICAgICAgLy8gICAgICByZWFsIGNvbW1hbmRzIGJha2VkIGludG8gdGhlIHRlbXBsYXRlLlxuICAgICAgLy8gICAyLiBPdGhlcndpc2Ug4oaSIGBib290c3RyYXAoKWA6IGNvbGQtc3RhcnQgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGhgXG4gICAgICAvLyAgICAgIG9uIHRoZSBjb25maWd1cmVkIENPREVCVUlMRF9ERUZBVUxUX0lNQUdFIChkZWZhdWx0XG4gICAgICAvLyAgICAgIHBpcGVsaW5lLWJvb3RzdHJhcDoxLjApLiBVc2VkIHdoZW4gdGhlIHBsYXRmb3JtIGlzbid0IHJlYWNoYWJsZVxuICAgICAgLy8gICAgICBhdCBzeW50aCB0aW1lIChDTEkgbG9ncyBhIHdhcm5pbmcgcGVyIG1pc3NlZCBwbHVnaW4pLlxuICAgICAgLy9cbiAgICAgIC8vIHBsdWdpbkxvb2t1cC5wbHVnaW4oKSByZWFkcyBgcmVzb2x2ZWRQbHVnaW5zYCBpbnRlcm5hbGx5IGFuZCByZXR1cm5zXG4gICAgICAvLyB0aGUgY2FjaGVkIGVudHJ5IHdoZW4gcHJlc2VudCDigJQgc28gY2FsbGluZyBpdCBhbHdheXMgd2lucyBvdmVyXG4gICAgICAvLyBib290c3RyYXAoKSB3aGVuIHByZS1yZXNvbHV0aW9uIHN1Y2NlZWRlZC5cbiAgICAgIGNvbnN0IHN5bnRoQ2FjaGVLZXkgPSBwbHVnaW5BcnRpZmFjdEFsaWFzKHRoaXMuY29uZmlnLnBsdWdpbik7XG4gICAgICBjb25zdCBwbHVnaW4gPSBwcm9wcy5yZXNvbHZlZFBsdWdpbnM/LltzeW50aENhY2hlS2V5XVxuICAgICAgICA/IHBsdWdpbkxvb2t1cC5wbHVnaW4odGhpcy5jb25maWcucGx1Z2luLCBwbHVnaW5TdGVwTGFiZWwobnVsbCwgdGhpcy5jb25maWcucGx1Z2luKSlcbiAgICAgICAgOiBwbHVnaW5Mb29rdXAuYm9vdHN0cmFwKCk7XG4gICAgICBjb25zdCBkZWZhdWx0Q29tcHV0ZVR5cGUgPSBnZXRDb21wdXRlVHlwZShhd3NDb25maWcuY29kZUJ1aWxkLmNvbXB1dGVUeXBlKTtcbiAgICAgIGNvbnN0IGFydGlmYWN0TWFuYWdlciA9IG5ldyBBcnRpZmFjdE1hbmFnZXIoKTtcblxuICAgICAgLy8gU2NvcGUgZXhwb3NlZCB0byBwbHVnaW4tc3BlYyB0ZW1wbGF0ZXMgYXMgYHBpcGVsaW5lLipgLiBTb3VyY2VkIGZyb20gdGhlXG4gICAgICAvLyBjb25maWcgc28gdGhlIHN5bnRoIHN0ZXAsIGV2ZXJ5IHN0YWdlIHN0ZXAsIGFuZCB0aGUgc291cmNlIHRva2VuIGFsbFxuICAgICAgLy8gcmVzb2x2ZSBhZ2FpbnN0IHRoZSBzYW1lIHNuYXBzaG90IChzZWUgUGlwZWxpbmVDb25maWd1cmF0aW9uLmdldFBpcGVsaW5lU2NvcGUpLlxuICAgICAgY29uc3QgcGlwZWxpbmVTY29wZSA9IHRoaXMuY29uZmlnLmdldFBpcGVsaW5lU2NvcGUoKTtcbiAgICAgIC8vIENvbnRyYWN0IOKAlCBzZWUgU3RhZ2VCdWlsZGVyLnJlc29sdmVTdGVwLlxuICAgICAgYXNzZXJ0UGx1Z2luQ29udHJhY3QocGx1Z2luLCBjb250cmFjdFNjb3BlRnJvbVRlbXBsYXRlU2NvcGUocGlwZWxpbmVTY29wZSksICdzeW50aCcpO1xuXG4gICAgICBjb25zdCBzdGVwTWFuaWZlc3QgPSBuZXcgU3RlcE1hbmlmZXN0UmVjb3JkZXIoKTtcbiAgICAgIGNvbnN0IHN5bnRoID0gY3JlYXRlQ29kZUJ1aWxkU3RlcCh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLnN5bnRoQ3VzdG9taXphdGlvbixcbiAgICAgICAgaWQ6IHVuaXF1ZUlkLmdlbmVyYXRlKCdjZGs6c3ludGgnKSxcbiAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgIHBsdWdpbixcbiAgICAgICAgaW5wdXQ6IHNvdXJjZSxcbiAgICAgICAgbWV0YWRhdGE6IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCxcbiAgICAgICAgbmV0d29yazogdGhpcy5jb25maWcubmV0d29yayxcbiAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgIGRlZmF1bHRDb21wdXRlVHlwZSxcbiAgICAgICAgYXJ0aWZhY3RNYW5hZ2VyLFxuICAgICAgICBzdGFnZU5hbWU6ICduby1zdGFnZScsXG4gICAgICAgIHN0YWdlQWxpYXM6ICduby1zdGFnZS1hbGlhcycsXG4gICAgICAgIC8vIFRoZSBjYW5vbmljYWwga2V5IHNlZ21lbnQuIGAke2FsaWFzID8/IG5hbWV9LWFsaWFzYCBzdWZmaXhlZCBhblxuICAgICAgICAvLyBFWFBMSUNJVCBhbGlhcyB0b28gKGBteS1zeW50aGAg4oaSIGBteS1zeW50aC1hbGlhc2ApLCBzbyBhIHN0YWdlIHRoYXRcbiAgICAgICAgLy8gcGlja2VkIHRoZSBzeW50aCBvdXRwdXQgaW4gdGhlIFVJIGFza2VkIGZvciBhIGtleSBuZXZlciByZWdpc3RlcmVkLlxuICAgICAgICBwbHVnaW5BbGlhczogcGx1Z2luQXJ0aWZhY3RBbGlhcyh0aGlzLmNvbmZpZy5wbHVnaW4pLFxuICAgICAgICBvcmdJZDogcHJvcHMub3JnSWQsXG4gICAgICAgIHBpcGVsaW5lU2NvcGUsXG4gICAgICB9KTtcbiAgICAgIHN0ZXBNYW5pZmVzdC5yZWNvcmQoc3ludGgsIHBsdWdpbiwgcGx1Z2luU3RlcExhYmVsKG51bGwsIHRoaXMuY29uZmlnLnBsdWdpbikpO1xuXG4gICAgICAvLyBSZXNvbHZlIHBpcGVsaW5lLWxldmVsIGRlZmF1bHRzIGludG8gY29kZUJ1aWxkRGVmYXVsdHNcbiAgICAgIC8vIEJ1aWxkIHRoZSBwZXItb3JnIHBsYXRmb3JtIHNlY3JldCBuYW1lIGZvciBDb2RlQnVpbGQgZW52IHZhcnNcbiAgICAgIGNvbnN0IHBsYXRmb3JtU2VjcmV0TmFtZSA9IHByb3BzLm9yZ0lkXG4gICAgICAgID8gQ29yZUNvbnN0YW50cy5zZWNyZXRQYXRoKHByb3BzLm9yZ0lkLCAncGxhdGZvcm0nKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSByZWdpc3RyYXRpb24ga2V5IHRoZSBzeW50aCBwb3N0cyBpdHMgc3RlcCBtYW5pZmVzdCB3aXRoIOKAlCBhXG4gICAgICAvLyBzZXBhcmF0ZSBjcmVkZW50aWFsIGZyb20gdGhlIHBsYXRmb3JtIG9uZSAoY29yZS9waXBlbGluZS1yZWdpc3RyYXRpb24udHMpLlxuICAgICAgY29uc3QgcmVnaXN0cmF0aW9uU2VjcmV0TmFtZSA9IHByb3BzLm9yZ0lkXG4gICAgICAgID8gQ29yZUNvbnN0YW50cy5zZWNyZXRQYXRoKHByb3BzLm9yZ0lkLCBQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0xFQUYpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBjb2RlQnVpbGREZWZhdWx0cyA9IHRoaXMucmVzb2x2ZURlZmF1bHRzKHRoaXMuY29uZmlnLmRlZmF1bHRzLCB1bmlxdWVJZCwgcHJvcHMucGlwZWxpbmVJZCwgcGxhdGZvcm1TZWNyZXROYW1lLCBzZXJ2ZXJDb25maWcucGxhdGZvcm1VcmwsIHByb3BzLm9yZ0lkKTtcblxuICAgICAgLy8gUmVzb2x2ZSBJQU0gcm9sZTogZXhwbGljaXQgcHJvcCB3aW5zLCBlbHNlIGBpYW06cm9sZWAgbWV0YWRhdGEsIGVsc2UgbGV0XG4gICAgICAvLyBDREsgYXV0by1jcmVhdGUgdGhlIHBpcGVsaW5lIHJvbGUgKGNvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tIHByaW5jaXBhbCkuXG4gICAgICBjb25zdCByb2xlQ29uZmlnID0gcHJvcHMucm9sZSA/PyByb2xlQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCk7XG4gICAgICBpZiAocm9sZUNvbmZpZz8udHlwZSA9PT0gJ2NvZGVCdWlsZERlZmF1bHQnKSB7XG4gICAgICAgIGNyZWF0ZUxvZ2dlcigncGlwZWxpbmUtYnVpbGRlcicpLndhcm4oXG4gICAgICAgICAgJ2NvZGVCdWlsZERlZmF1bHQgcm9sZSB0eXBlIHVzZXMgY29kZWJ1aWxkLmFtYXpvbmF3cy5jb20gdHJ1c3QgcHJpbmNpcGFsIOKAlCAnICtcbiAgICAgICAgJ3RoaXMgaXMgbm90IHN1aXRhYmxlIGFzIHRoZSBwaXBlbGluZS1sZXZlbCByb2xlLiBDb25zaWRlciB1c2luZyByb2xlQXJuL3JvbGVOYW1lICcgK1xuICAgICAgICAnb3Igb21pdHRpbmcgdGhlIHJvbGUgdG8gbGV0IENESyBhdXRvLWNyZWF0ZSBvbmUgd2l0aCBjb2RlcGlwZWxpbmUuYW1hem9uYXdzLmNvbS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm9sZSA9IHJvbGVDb25maWdcbiAgICAgICAgPyByZXNvbHZlUm9sZSh0aGlzLCB1bmlxdWVJZCwgcm9sZUNvbmZpZylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIOKUgOKUgCBBcnRpZmFjdCBidWNrZXQgKEtNUyBlbmNyeXB0aW9uICsgcmV0ZW50aW9uKSDilIDilIBcbiAgICAgIC8vIFdoZW4gYGVuY3J5cHRpb24ua21zS2V5QXJuYCBhbmQvb3IgYG9wZXJhdGlvbnMuYXJ0aWZhY3RSZXRlbnRpb25EYXlzYCBhcmVcbiAgICAgIC8vIHNldCB3ZSBjcmVhdGUgYSBjdXN0b20gYXJ0aWZhY3QgYnVja2V0IGFuZCBwYXNzIGl0IHRvIENvZGVQaXBlbGluZTsgdGhhdFxuICAgICAgLy8gaXMgdGhlIG9ubHkgd2F5IHRvIGF0dGFjaCBhIGN1c3RvbWVyLW1hbmFnZWQga2V5ICh0aGUgTDMgY29uc3RydWN0IGV4cG9zZXNcbiAgICAgIC8vIGBhcnRpZmFjdEJ1Y2tldGAsIG5vdCBgZW5jcnlwdGlvbktleWApLiBBYnNlbnQgYm90aCBrZXlzLCBDREsgYXV0by1jcmVhdGVzXG4gICAgICAvLyB0aGUgYnVja2V0IGFuZCBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAgICBjb25zdCBhcnRpZmFjdEJ1Y2tldCA9IHRoaXMuYnVpbGRBcnRpZmFjdEJ1Y2tldCgpO1xuXG4gICAgICAvLyBDcmVhdGUgQ29kZVBpcGVsaW5lIGNvbnN0cnVjdFxuICAgICAgdGhpcy5waXBlbGluZSA9IG5ldyBDb2RlUGlwZWxpbmUodGhpcywgdW5pcXVlSWQuZ2VuZXJhdGUoJ3BpcGVsaW5lczpjb2RlcGlwZWxpbmUnKSwge1xuICAgICAgICAuLi4oY29kZUJ1aWxkRGVmYXVsdHMgJiYgeyBjb2RlQnVpbGREZWZhdWx0cyB9KSxcbiAgICAgICAgLi4uKHJvbGUgJiYgeyByb2xlIH0pLFxuICAgICAgICAuLi4oYXJ0aWZhY3RCdWNrZXQgJiYgeyBhcnRpZmFjdEJ1Y2tldCB9KSxcbiAgICAgICAgcGlwZWxpbmVUeXBlOiBQaXBlbGluZVR5cGUuVjIsXG4gICAgICAgIHBpcGVsaW5lTmFtZTogdGhpcy5jb25maWcucGlwZWxpbmVOYW1lLFxuICAgICAgICBzeW50aCxcbiAgICAgICAgLi4ubWV0YWRhdGFGb3JDb2RlUGlwZWxpbmUodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSdW4tdGltZSB2dWxuZXJhYmlsaXR5IGNoZWNrIChvcHQtaW4gbWV0YWRhdGEgZmxhZywgcmVwb3J0LW9ubHkpLiBJdFxuICAgICAgLy8gbmVlZHMgdGhlIHBpcGVsaW5lIGlkICh0aGUgY2hlY2sgaXMgcGVyIHBpcGVsaW5lKSBhbmQgdGhlIG9yZyBwbGF0Zm9ybVxuICAgICAgLy8gc2VjcmV0ICh0aGUgdmVyaWZ5IHN0ZXAgYXV0aGVudGljYXRlcyB3aXRoIGl0KTsgd2l0aG91dCBlaXRoZXIgaXQgaXNcbiAgICAgIC8vIHNraXBwZWQgd2l0aCBhIHdhcm5pbmcg4oCUIGEgdmlzaWJpbGl0eSBmZWF0dXJlIG5ldmVyIGZhaWxzIGEgc3ludGguXG4gICAgICBsZXQgcnVudGltZVZ1bG5DaGVjayA9IGlzUnVudGltZVZ1bG5DaGVja0VuYWJsZWQodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICAgIGlmIChydW50aW1lVnVsbkNoZWNrICYmICghcHJvcHMucGlwZWxpbmVJZCB8fCAhcGxhdGZvcm1TZWNyZXROYW1lKSkge1xuICAgICAgICBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWJ1aWxkZXInKS53YXJuKFxuICAgICAgICAgIGAke1JVTlRJTUVfVlVMTl9DSEVDS19LRVl9IGlzIGVuYWJsZWQgYnV0IHRoZSBwaXBlbGluZSBoYXMgbm8gJHshcHJvcHMucGlwZWxpbmVJZCA/ICdwaXBlbGluZUlkJyA6ICdvcmdJZCd9IOKAlCBgXG4gICAgICAgICAgKyAnc2tpcHBpbmcgdGhlIHJ1bi10aW1lIGNoZWNrIHN0ZXBzLiBTeW50aGVzaXplIHRocm91Z2ggYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGgvZGVwbG95IC0taWRgLicsXG4gICAgICAgICk7XG4gICAgICAgIHJ1bnRpbWVWdWxuQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLnN0YWdlcykge1xuICAgICAgICBjb25zdCBzdGFnZUJ1aWxkZXIgPSBuZXcgU3RhZ2VCdWlsZGVyKHtcbiAgICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgICBwbHVnaW5Mb29rdXAsXG4gICAgICAgICAgdW5pcXVlSWQsXG4gICAgICAgICAgZ2xvYmFsTWV0YWRhdGE6IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCxcbiAgICAgICAgICBkZWZhdWx0Q29tcHV0ZVR5cGUsXG4gICAgICAgICAgYXJ0aWZhY3RNYW5hZ2VyLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBwaXBlbGluZVNjb3BlLFxuICAgICAgICAgIHN0ZXBNYW5pZmVzdCxcbiAgICAgICAgICAuLi4ocnVudGltZVZ1bG5DaGVjayAmJiBwbGF0Zm9ybVNlY3JldE5hbWUgJiYgeyBydW50aW1lVnVsbkNoZWNrOiB7IHBsYXRmb3JtU2VjcmV0TmFtZSB9IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhZ2VCdWlsZGVyLmFkZFN0YWdlcyh0aGlzLnBpcGVsaW5lLCBwcm9wcy5zdGFnZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgVGFncyDilIDilIBcbiAgICAgIC8vIFRoZSBmaXJzdCB0aHJlZSBhcmUgb3BlcmF0aW9ucy1lc3NlbnRpYWwgYW5kIHVzZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXJcbiAgICAgIC8vIGF1ZGl0IHN0YWNrc2AgdG8gZGlmZiBDRk4gc3RhY2tzIGFnYWluc3QgdGhlIHBpcGVsaW5lX3JlZ2lzdHJ5IHRhYmxlLlxuICAgICAgLy8gYE9yZ0lkYCBpcyB0aGUgY2Fub25pY2FsIGtleSBmb3IgY29zdCBhdHRyaWJ1dGlvbiAoQVdTIENvc3QgRXhwbG9yZXJcbiAgICAgIC8vIGdyb3VwcyBieSB0YWcga2V5L3ZhbHVlIHdoZW4gYWN0aXZhdGVkIGluIEJpbGxpbmcgc2V0dGluZ3MpLlxuICAgICAgLy8gVVNFUiBUQUdTIEZJUlNULCBzbyB0aGUgcGxhdGZvcm0gdGFncyBiZWxvdyBvdmVyd3JpdGUgcmF0aGVyIHRoYW4gYXJlXG4gICAgICAvLyBvdmVyd3JpdHRlbi4gYFRhZ3Mub2ZgIGxldHMgYSBsYXRlciBhZGQgcmVwbGFjZSBhbiBlYXJsaWVyIG9uZSwgYW5kXG4gICAgICAvLyB0aGVzZSB1c2VkIHRvIGJlIGFwcGxpZWQgTEFTVCDigJQgd2hpY2ggbGV0IGEgY2FsbGVyIHJlZGVmaW5lXG4gICAgICAvLyBwYi5waXBlbGluZS1pZCwgT3JnSWQgb3IgcGIuZGVwbG95cyBhbmQgcG9pbnQgYW5vdGhlciBvcmcncyBleGVjdXRpb25zXG4gICAgICAvLyBhdCB0aGVpciBvd24gcGlwZWxpbmUsIHNpbmNlIHRoZSBldmVudHMgTGFtYmRhIHJlYWRzIGV4YWN0bHkgdGhvc2UgdGFnc1xuICAgICAgLy8gdG8gZGVjaWRlIHdob3NlIHJlcG9ydHMgYW4gZXhlY3V0aW9uIGJlbG9uZ3MgdG8uXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHJlc2VydmVkLWtleSBmaWx0ZXIgaXMgdGhlIHNlY29uZCBoYWxmOiBvcmRlcmluZyBhbG9uZSB3b3VsZCBsZXQgYVxuICAgICAgLy8gY2FsbGVyIHNldCBgcGIuZGVwbG95c2Agb24gYSBwaXBlbGluZSB0aGF0IGRlY2xhcmVzIG5vIGVudmlyb25tZW50IChub1xuICAgICAgLy8gcGxhdGZvcm0gdGFnIHRvIG92ZXJ3cml0ZSBpdCkuIFRoZSBBUEkgcmVmdXNlcyB0aGVzZSBrZXlzIHRvbywgYnV0IGFcbiAgICAgIC8vIHRlYW0gdXNpbmcgdGhpcyBjb25zdHJ1Y3QgZGlyZWN0bHkgbmV2ZXIgcGFzc2VzIHRocm91Z2ggdGhlIEFQSSwgc29cbiAgICAgIC8vIHRoaXMgaXMgdGhlIGNoZWNrIHRoYXQgYWx3YXlzIHJ1bnMuXG4gICAgICBpZiAocHJvcHMudGFncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcy50YWdzKSkge1xuICAgICAgICAgIGlmIChpc1Jlc2VydmVkVGFnS2V5KGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncGlwZWxpbmUtYnVpbGRlcicsICd0cnVlJyk7XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncHJvamVjdCcsIHRoaXMuY29uZmlnLnByb2plY3QpO1xuICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ29yZ2FuaXphdGlvbicsIHRoaXMuY29uZmlnLm9yZ2FuaXphdGlvbik7XG4gICAgICBpZiAocHJvcHMub3JnSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ09yZ0lkJywgcHJvcHMub3JnSWQpO1xuICAgICAgfVxuICAgICAgLy8gU3RhYmxlIGV2ZW50LXJlcG9ydGluZyBrZXkuIEFwcGxpZWQgYXQgc3ludGggKHRoZSBwaXBlbGluZUlkIGlzIGtub3duXG4gICAgICAvLyBoZXJlKSwgc28gaXQncyBwcmVzZW50IGZyb20gc3RhY2sgY3JlYXRpb24g4oCUIHRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoaXNcbiAgICAgIC8vIHRhZyB0byBhdHRyaWJ1dGUgQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgdG8gdGhlIHBpcGVsaW5lIHdpdGhvdXRcbiAgICAgIC8vIGV2ZXIgaGFuZGxpbmcgdGhlIEFSTi9hY2NvdW50LiBTZWUgcGFja2FnZXMvcGlwZWxpbmUtZXZlbnRzLlxuICAgICAgaWYgKHByb3BzLnBpcGVsaW5lSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3BiLnBpcGVsaW5lLWlkJywgcHJvcHMucGlwZWxpbmVJZCk7XG4gICAgICB9XG4gICAgICAvLyBEZXBsb3ktZW52aXJvbm1lbnQgYXR0cmlidXRpb24gZm9yIERPUkEgbWV0cmljcy4gYHBiLmRlcGxveXNgIGxpc3RzIGV2ZXJ5XG4gICAgICAvLyBkZXBsb3kgc3RhZ2UgYXMgYDxzdGFnZU5hbWU+OjxlbnZpcm9ubWVudD5gIHBhaXJzIGpvaW5lZCBieSBgK2AsIHJlYWQgYnlcbiAgICAgIC8vIHRoZSBldmVudHMgTGFtYmRhIGZyb20gdGhlIHNhbWUgTGlzdFRhZ3MgY2FsbCB0byBtYXJrIHdoaWNoIHN0YWdlcyBhcmVcbiAgICAgIC8vIGRlcGxveXMgYW5kIHRvIHdoaWNoIGVudmlyb25tZW50LiBBYnNlbnQgd2hlbiBubyBlbnZpcm9ubWVudCBpcyBkZWNsYXJlZFxuICAgICAgLy8g4oCUIHN1Y2ggcGlwZWxpbmVzIHByb2R1Y2Ugbm8gRE9SQSBkZXBsb3kgc2lnbmFsIHVudGlsIHRoZXkgcmUtc3ludGguXG4gICAgICBjb25zdCBkZXBsb3lzVGFnID0gYnVpbGREZXBsb3lzVGFnKHByb3BzKTtcbiAgICAgIGlmIChkZXBsb3lzVGFnKSB7XG4gICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwYi5kZXBsb3lzJywgZGVwbG95c1RhZyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHRoZSBpbnRlcm5hbCBwaXBlbGluZSBiZWZvcmUgYWNjZXNzaW5nIGl0cyBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLnBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcblxuICAgICAgLy8gUExBVEZPUk1fU0VDUkVUX05BTUUgaXMgaW5qZWN0ZWQgaW50byB0aGUgQ29kZUJ1aWxkIGVudmlyb25tZW50IGFib3ZlLFxuICAgICAgLy8gYnV0IHRoZSBzeW50aCBwcm9jZXNzIHJlYWRzIHRoYXQgc2VjcmV0IGl0c2VsZiB3aXRoIHRoZSBBV1MgU0RLXG4gICAgICAvLyAoaGFuZGxlcnMvcGxhdGZvcm0tY3JlZGVudGlhbC50cyBHZXRTZWNyZXRWYWx1ZSkg4oCUIHNvIHRoZSByb2xlIG5lZWRzIGFuXG4gICAgICAvLyBleHBsaWNpdCBncmFudC4gTm90aGluZyB3YXMgZ3JhbnRpbmcgaXQ6IHRoZSBSRUdJU1RSWSBzZWNyZXQgd29ya3Mgb25seVxuICAgICAgLy8gYmVjYXVzZSBgTGludXhCdWlsZEltYWdlLmZyb21Eb2NrZXJSZWdpc3RyeSh7IHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHMgfSlgXG4gICAgICAvLyBtYWtlcyBDREsgZ3JhbnQgdGhhdCBvbmUgaW50ZXJuYWxseSwgd2hpY2ggZG9lcyBub3QgZ2VuZXJhbGlzZSB0byBhXG4gICAgICAvLyBzZWNyZXQgdGhlIGJ1aWxkIHJlYWRzIGZvciBpdHNlbGYuIFdpdGhvdXQgdGhpcyBldmVyeSBzeW50aCBmYWlscyB3aXRoXG4gICAgICAvLyBBY2Nlc3NEZW5pZWRFeGNlcHRpb24gb24gR2V0U2VjcmV0VmFsdWUsIGFuZCB0aGUgcGlwZWxpbmUgcm9sZSBoYXMgdG8gYmVcbiAgICAgIC8vIHBhdGNoZWQgYnkgaGFuZCBpbiBlYWNoIGFjY291bnQuXG4gICAgICAvL1xuICAgICAgLy8gU2NvcGVkIHRvIHRoaXMgb3JnJ3MgcGxhdGZvcm0gc2VjcmV0IGFuZCBtaXJyb3JpbmcgdGhlIHBsdWdpbi1sb29rdXBcbiAgICAgIC8vIExhbWJkYSdzIGdyYW50IChwaXBlbGluZS9wbHVnaW4tbG9va3VwLnRzKSwgaW5jbHVkaW5nIHRoZSBgLSpgIHN1ZmZpeCDigJRcbiAgICAgIC8vIFNlY3JldHMgTWFuYWdlciBhcHBlbmRzIHNpeCByYW5kb20gY2hhcmFjdGVycyB0byBldmVyeSBBUk4uXG4gICAgICBpZiAocGxhdGZvcm1TZWNyZXROYW1lKSB7XG4gICAgICAgIHRoaXMucGlwZWxpbmUuc3ludGhQcm9qZWN0LmFkZFRvUm9sZVBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICBhY3Rpb25zOiBbJ3NlY3JldHNtYW5hZ2VyOkdldFNlY3JldFZhbHVlJ10sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6c2VjcmV0c21hbmFnZXI6KjoqOnNlY3JldDoke3BsYXRmb3JtU2VjcmV0TmFtZX0tKmBdLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgICAvLyBTYW1lIGdyYW50IGZvciB0aGUgcmVnaXN0cmF0aW9uIGtleSwgYW5kIG9uIHRoZSBTWU5USCBwcm9qZWN0IG9ubHk6IGl0XG4gICAgICAvLyBpcyB0aGUgb25lIHN0ZXAgdGhhdCByZWdpc3RlcnMuIEl0cyBOQU1FIHJpZGVzIHRoZSBwaXBlbGluZS13aWRlXG4gICAgICAvLyBlbnZpcm9ubWVudCAocmVzb2x2ZURlZmF1bHRzKSwgbm90IGEgU0VDUkVUU19NQU5BR0VSIHZhcmlhYmxlLCBzbyBhXG4gICAgICAvLyBtaXNzaW5nIGtleSBza2lwcyB0aGUgcmVnaXN0cmF0aW9uIHdpdGggYSB3YXJuaW5nIGluc3RlYWQgb2YgZmFpbGluZ1xuICAgICAgLy8gdGhlIGJ1aWxkIGF0IERPV05MT0FEX1NPVVJDRSDigJQgYW5kIGEgc3RlcCB3aXRob3V0IHRoaXMgZ3JhbnQgY2Fubm90XG4gICAgICAvLyByZWFkIGl0LlxuICAgICAgaWYgKHJlZ2lzdHJhdGlvblNlY3JldE5hbWUpIHtcbiAgICAgICAgdGhpcy5waXBlbGluZS5zeW50aFByb2plY3QuYWRkVG9Sb2xlUG9saWN5KG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czpzZWNyZXRzbWFuYWdlcjoqOio6c2VjcmV0OiR7cmVnaXN0cmF0aW9uU2VjcmV0TmFtZX0tKmBdLFxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNka1BpcGVsaW5lID0gdGhpcy5waXBlbGluZS5waXBlbGluZTtcbiAgICAgIHRoaXMuc3RlcE1hbmlmZXN0ID0gc3RlcE1hbmlmZXN0LmVudHJpZXMoY2RrUGlwZWxpbmUpO1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZDtcblxuICAgICAgLy8g4pSA4pSAIFBpcGVsaW5lLWxldmVsIFZhcmlhYmxlcyAoQ29kZVBpcGVsaW5lIFYyKSDilIDilIBcbiAgICAgIGZvciAoY29uc3QgdiBvZiBwYXJzZVBpcGVsaW5lVmFyaWFibGVzKG1ldGFbTWV0YWRhdGFLZXlzLlBJUEVMSU5FX1ZBUklBQkxFU10pKSB7XG4gICAgICAgIGNka1BpcGVsaW5lLmFkZFZhcmlhYmxlKG5ldyBWYXJpYWJsZSh7XG4gICAgICAgICAgdmFyaWFibGVOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgLi4uKHYuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0VmFsdWU6IHYuZGVmYXVsdFZhbHVlIH0pLFxuICAgICAgICAgIC4uLih2LmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgeyBkZXNjcmlwdGlvbjogdi5kZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgU05TIE5vdGlmaWNhdGlvbnMg4pSA4pSAXG4gICAgICBjb25zdCBub3RpZmljYXRpb25Ub3BpY0FybiA9IG1ldGFbTWV0YWRhdGFLZXlzLk5PVElGSUNBVElPTl9UT1BJQ19BUk5dO1xuICAgICAgaWYgKHR5cGVvZiBub3RpZmljYXRpb25Ub3BpY0FybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgdG9waWMgPSBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdOb3RpZmljYXRpb25Ub3BpYycsIG5vdGlmaWNhdGlvblRvcGljQXJuKTtcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uRXZlbnRzID0gcGFyc2VOb3RpZmljYXRpb25FdmVudHMobWV0YVtNZXRhZGF0YUtleXMuTk9USUZJQ0FUSU9OX0VWRU5UU10pXG4gICAgICAgICAgLm1hcChlID0+IFBJUEVMSU5FX0VWRU5UX01BUFtlLnRvVXBwZXJDYXNlKCldKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmIChub3RpZmljYXRpb25FdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNka1BpcGVsaW5lLm5vdGlmeU9uKCdQaXBlbGluZU5vdGlmaWNhdGlvbicsIHRvcGljLCB7IGV2ZW50czogbm90aWZpY2F0aW9uRXZlbnRzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBTY2hlZHVsZWQgRXhlY3V0aW9uIOKUgOKUgFxuICAgICAgaWYgKHByb3BzLnN5bnRoLnNvdXJjZS5vcHRpb25zPy50cmlnZ2VyID09PSBUcmlnZ2VyVHlwZS5TQ0hFRFVMRSB8fCBwcm9wcy5zY2hlZHVsZSkge1xuICAgICAgICBjb25zdCBleHByID0gcHJvcHMuc2NoZWR1bGUgfHwgKHByb3BzLnN5bnRoLnNvdXJjZS5vcHRpb25zIGFzIHsgc2NoZWR1bGU/OiBzdHJpbmcgfSk/LnNjaGVkdWxlIHx8ICdyYXRlKDEgZGF5KSc7XG4gICAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnU2NoZWR1bGVSdWxlJywge1xuICAgICAgICAgIHNjaGVkdWxlOiBldmVudHMuU2NoZWR1bGUuZXhwcmVzc2lvbihleHByKSxcbiAgICAgICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKGNka1BpcGVsaW5lKV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgRXhlY3V0aW9uIEV2ZW50IFRyYWNraW5nIChmb3J3YXJkIHBpcGVsaW5lIHN0YXRlIGNoYW5nZXMgdG8gU05TKSDilIDilIBcbiAgICAgIC8vIGBpc1RydWVgLCBub3QgdHJ1dGhpbmVzczogYFwiZmFsc2VcImAgaXMgYSB0cnV0aHkgc3RyaW5nLCBzbyB0aGUgbWV0YWRhdGFcbiAgICAgIC8vIGBcImF3czpjZGs6b3BlcmF0aW9uczpleGVjdXRpb25ldmVudHNcIjogXCJmYWxzZVwiYCB1c2VkIHRvIENSRUFURSB0aGUgcnVsZS5cbiAgICAgIGlmIChpc1RydWUobWV0YVtNZXRhZGF0YUtleXMuRU5BQkxFX0VYRUNVVElPTl9FVkVOVFNdKSAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVG9waWNBcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnRXhlY3V0aW9uRXZlbnRSdWxlJywge1xuICAgICAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICAgICAgc291cmNlOiBbJ2F3cy5jb2RlcGlwZWxpbmUnXSxcbiAgICAgICAgICAgIGRldGFpbFR5cGU6IFsnQ29kZVBpcGVsaW5lIFBpcGVsaW5lIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2Nka1BpcGVsaW5lLnBpcGVsaW5lQXJuXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRhcmdldHM6IFtuZXcgdGFyZ2V0cy5TbnNUb3BpYyhcbiAgICAgICAgICAgIHNucy5Ub3BpYy5mcm9tVG9waWNBcm4odGhpcywgJ0V4ZWN1dGlvbkV2ZW50VG9waWMnLCBub3RpZmljYXRpb25Ub3BpY0FybiksXG4gICAgICAgICAgKV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgUGlwZWxpbmUgTWV0cmljcyAmIEFsYXJtcyDilIDilIBcbiAgICAgIC8vIFNhbWUgdHJhcDogYFwiYXdzOmNkazpvcGVyYXRpb25zOm1ldHJpY3NcIjogXCJmYWxzZVwiYCBjcmVhdGVkIHRoZSBhbGFybS5cbiAgICAgIGNvbnN0IGVuYWJsZU1ldHJpY3MgPSBpc1RydWUodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkW01ldGFkYXRhS2V5cy5FTkFCTEVfTUVUUklDU10pO1xuICAgICAgaWYgKGVuYWJsZU1ldHJpY3MpIHtcbiAgICAgICAgbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgJ1BpcGVsaW5lRmFpbHVyZUFsYXJtJywge1xuICAgICAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9Db2RlUGlwZWxpbmUnLFxuICAgICAgICAgICAgbWV0cmljTmFtZTogJ0ZhaWxlZFBpcGVsaW5lRXhlY3V0aW9uQ291bnQnLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDogeyBQaXBlbGluZU5hbWU6IHRoaXMuY29uZmlnLnBpcGVsaW5lTmFtZSB9LFxuICAgICAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYFBpcGVsaW5lICR7dGhpcy5jb25maWcucGlwZWxpbmVOYW1lfSBleGVjdXRpb24gZmFpbGVkYCxcbiAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHBlci1idWlsZGVyIHJlZ2lzdHJ5IG92ZXJyaWRlIHNvIGl0IG5ldmVyIGxlYWtzIGludG8gdGhlXG4gICAgICAvLyBwcm9jZXNzLXdpZGUgQ29uZmlnIGNhY2hlIChzZWUgdGhlIG92ZXJyaWRlIGF0IHRoZSB0b3Agb2YgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIHJlc3RvcmVSZWdpc3RyeT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY3VzdG9tIGFydGlmYWN0IGJ1Y2tldCB3aGVuIGBlbmNyeXB0aW9uLmttc0tleUFybmAgYW5kL29yXG4gICAqIGBvcGVyYXRpb25zLmFydGlmYWN0UmV0ZW50aW9uRGF5c2AgYXJlIHNldC4gUmV0dXJucyB1bmRlZmluZWQgb3RoZXJ3aXNlIHNvXG4gICAqIENESyBhdXRvLWNyZWF0ZXMgdGhlIGRlZmF1bHQgYXJ0aWZhY3QgYnVja2V0ICh1bmNoYW5nZWQgYmVoYXZpb3IpLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFydGlmYWN0QnVja2V0KCk6IHMzLklCdWNrZXQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQ7XG4gICAgY29uc3Qga21zS2V5QXJuID0gdHlwZW9mIG1ldGFbTWV0YWRhdGFLZXlzLktNU19LRVlfQVJOXSA9PT0gJ3N0cmluZydcbiAgICAgID8gKG1ldGFbTWV0YWRhdGFLZXlzLktNU19LRVlfQVJOXSBhcyBzdHJpbmcpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXRlbnRpb25EYXlzID0gYXNJbnQobWV0YVtNZXRhZGF0YUtleXMuQVJUSUZBQ1RfUkVURU5USU9OX0RBWVNdKTtcblxuICAgIGlmICgha21zS2V5QXJuICYmIHJldGVudGlvbkRheXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBrbXNLZXlBcm5cbiAgICAgID8ga21zLktleS5mcm9tS2V5QXJuKHRoaXMsICdBcnRpZmFjdEtleScsIGttc0tleUFybilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQXJ0aWZhY3RCdWNrZXQnLCB7XG4gICAgICBlbmNyeXB0aW9uOiBlbmNyeXB0aW9uS2V5ID8gczMuQnVja2V0RW5jcnlwdGlvbi5LTVMgOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAuLi4oZW5jcnlwdGlvbktleSAmJiB7IGVuY3J5cHRpb25LZXkgfSksXG4gICAgICAuLi4ocmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7IGV4cGlyYXRpb246IER1cmF0aW9uLmRheXMocmV0ZW50aW9uRGF5cykgfV0sXG4gICAgICB9KSxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgfSk7XG4gICAgVGFncy5vZihidWNrZXQpLmFkZCgncGlwZWxpbmUnLCB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUpO1xuICAgIHJldHVybiBidWNrZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgQ29kZUJ1aWxkRGVmYXVsdHMgaW50byB0aGUgc2hhcGUgZXhwZWN0ZWQgYnkgQ0RLJ3MgY29kZUJ1aWxkRGVmYXVsdHMuXG4gICAqIENvbWJpbmVzIG5ldHdvcmsgY29uZmlnLCBzZWN1cml0eSBncm91cHMsIGFuZCBwaXBlbGluZS1sZXZlbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogKFBJUEVMSU5FX0lELCBFWEVDVVRJT05fSUQsIFBMQVRGT1JNX0JBU0VfVVJMKSBhdmFpbGFibGUgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdHMoXG4gICAgZGVmYXVsdHM6IENvZGVCdWlsZERlZmF1bHRzIHwgdW5kZWZpbmVkLFxuICAgIGlkOiBVbmlxdWVJZCxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGxhdGZvcm1TZWNyZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGxhdGZvcm1Vcmw6IHN0cmluZyxcbiAgICBvcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApOiBDb2RlQnVpbGRPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBQZXItcGlwZWxpbmUgbmV0d29yayBjb25maWcgd2luczsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBhbiBlbnYtZHJpdmVuXG4gICAgLy8gZ2xvYmFsIFZQQyAoaW50ZXJuYWwgLyBpbnNpZGUtQVdTLW9ubHkgbW9kZSkgc28gZXZlcnkgcGlwZWxpbmUnc1xuICAgIC8vIENvZGVCdWlsZCBydW5zIGluIHRoZSBWUEMgYW5kIGNhbiByZWFjaCB0aGUgcHJpdmF0ZSBnYXRld2F5LiBVbnNldCBpblxuICAgIC8vIHB1YmxpYyBkZXBsb3lzIOKGkiBDb2RlQnVpbGQgc3RheXMgaW4gdGhlIEFXUy1tYW5hZ2VkIG5ldHdvcmsuXG4gICAgLy8gUHJlY2VkZW5jZTogZXhwbGljaXQgcHJvcCA+IGBlYzI6bmV0d29ya2AgbWV0YWRhdGEgPiBlbnYtZHJpdmVuIGdsb2JhbCBWUEMuXG4gICAgY29uc3QgbmV0d29yayA9IGRlZmF1bHRzPy5uZXR3b3JrID8/IG5ldHdvcmtDb25maWdGcm9tTWV0YWRhdGEodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKSA/PyBuZXR3b3JrQ29uZmlnRnJvbUVudigpO1xuICAgIGNvbnN0IG5ldHdvcmtQcm9wcyA9IG5ldHdvcmtcbiAgICAgID8gcmVzb2x2ZU5ldHdvcmsodGhpcywgaWQsIG5ldHdvcmspXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIFNhbWUgcHJlY2VkZW5jZSBmb3Igc3RhbmRhbG9uZSBzZWN1cml0eSBncm91cHMgKHByb3AgPiBgZWMyOnNlY3VyaXR5Z3JvdXBgIG1ldGFkYXRhKS5cbiAgICBjb25zdCBzZWN1cml0eUdyb3VwQ29uZmlnID0gZGVmYXVsdHM/LnNlY3VyaXR5R3JvdXBzID8/IHNlY3VyaXR5R3JvdXBDb25maWdGcm9tTWV0YWRhdGEodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICBjb25zdCBzdGFuZGFsb25lU2VjdXJpdHlHcm91cHMgPSBzZWN1cml0eUdyb3VwQ29uZmlnXG4gICAgICA/IHJlc29sdmVTZWN1cml0eUdyb3VwKHRoaXMsIGlkLCBzZWN1cml0eUdyb3VwQ29uZmlnKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjYUJ1bmRsZSA9IHBsYXRmb3JtQ2FCdW5kbGUoKTtcbiAgICBjb25zdCB7IENPREVCVUlMRF9ERUZBVUxUX0lNQUdFOiBkZWZhdWx0SW1hZ2UsIENPREVCVUlMRF9ERUZBVUxUX0lNQUdFX0RJR0VTVDogZGVmYXVsdEltYWdlRGlnZXN0IH0gPSBwcm9jZXNzLmVudjtcblxuICAgIC8vIFBpcGVsaW5lLWxldmVsIGVudiB2YXJzIGF2YWlsYWJsZSB0byBhbGwgQ29kZUJ1aWxkIGFjdGlvbnNcbiAgICAvLyBOb3RlOiAje2NvZGVwaXBlbGluZS4qfSByZXNvbHZlZCB2YXJpYWJsZXMgbXVzdCBnbyB0aHJvdWdoIENvZGVCdWlsZFN0ZXAuZW52XG4gICAgLy8gKGFjdGlvbi1sZXZlbCksIG5vdCBidWlsZEVudmlyb25tZW50LmVudmlyb25tZW50VmFyaWFibGVzIChwcm9qZWN0LWxldmVsKS5cbiAgICBjb25zdCBwaXBlbGluZUVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHN0cmluZyB9PiA9IHtcbiAgICAgIFBMQVRGT1JNX0JBU0VfVVJMOiB7IHZhbHVlOiBwbGF0Zm9ybVVybCB9LFxuICAgICAgLi4uKHBpcGVsaW5lSWQgJiYgeyBQSVBFTElORV9JRDogeyB2YWx1ZTogcGlwZWxpbmVJZCB9IH0pLFxuICAgICAgLi4uKHBsYXRmb3JtU2VjcmV0TmFtZSAmJiB7IFBMQVRGT1JNX1NFQ1JFVF9OQU1FOiB7IHZhbHVlOiBwbGF0Zm9ybVNlY3JldE5hbWUgfSB9KSxcbiAgICAgIC8vIFRoZSByZWdpc3RyYXRpb24ga2V5J3Mgc2VjcmV0IE5BTUUgKG9ubHkgdGhlIHN5bnRoIHJvbGUgbWF5IHJlYWQgaXQpLlxuICAgICAgLi4uKG9yZ0lkICYmIHsgW1BJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfRU5WXTogeyB2YWx1ZTogQ29yZUNvbnN0YW50cy5zZWNyZXRQYXRoKG9yZ0lkLCBQSVBFTElORV9SRUdJU1RSQVRJT05fU0VDUkVUX0xFQUYpIH0gfSksXG4gICAgICAvLyBQTEFURk9STV9UTFNfVkVSSUZZPWZhbHNlIChkZXYgc2VsZi1zaWduZWQgcGxhdGZvcm0pOiBldmVyeSBDb2RlQnVpbGRcbiAgICAgIC8vIHN0ZXAgcmVhY2hlcyB0aGUgcGxhdGZvcm0gdW52ZXJpZmllZC4gU2VlIGNvcmUvcGxhdGZvcm0tdGxzLnRzLlxuICAgICAgLi4uKCFwbGF0Zm9ybVRsc1ZlcmlmeSgpICYmIHtcbiAgICAgICAgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRDogeyB2YWx1ZTogJzAnIH0sXG4gICAgICAgIFtQTEFURk9STV9UTFNfVkVSSUZZX0VOVl06IHsgdmFsdWU6ICdmYWxzZScgfSxcbiAgICAgIH0pLFxuICAgICAgLy8gQSBwcml2YXRlLUNBIHBsYXRmb3JtOiB0aGUgQ0EgdHJhdmVscyB3aXRoIHRoZSBwaXBlbGluZSBzbyB0aGVcbiAgICAgIC8vIHNlbGYtbXV0YXRpbmcgc3ludGggKGFuZCBhbnkgc3RlcCBjYWxsaW5nIHRoZSBwbGF0Zm9ybSkgVkVSSUZJRVMgdGhlXG4gICAgICAvLyBjZXJ0aWZpY2F0ZSBpbnN0ZWFkIG9mIG5lZWRpbmcgYC0tbm8tdmVyaWZ5LXNzbGAuIFNlZSBjb3JlL3BsYXRmb3JtLXRscy50cy5cbiAgICAgIC4uLihjYUJ1bmRsZSAmJiB7IFtQTEFURk9STV9DQV9CVU5ETEVfRU5WXTogeyB2YWx1ZTogY2FCdW5kbGUgfSB9KSxcbiAgICAgIC8vIFRoZSBzZWxmLW11dGF0aW5nIHN5bnRoIHJlLXJlc29sdmVzIHRoZSBkZWZhdWx0IGJ1aWxkIGltYWdlIGluc2lkZVxuICAgICAgLy8gQ29kZUJ1aWxkLCB3aGVyZSB0aGUgb3BlcmF0b3IncyBlbnYgaXMgYWJzZW50OyBjYXJyeSB0aGUgaW1hZ2UgYW5kIGl0c1xuICAgICAgLy8gZGlnZXN0IHNvIHRoZSByZS1zeW50aGVzaXplZCB0ZW1wbGF0ZSBrZWVwcyB0aGUgc2FtZSBwaW4uXG4gICAgICAuLi4oZGVmYXVsdEltYWdlICYmIHsgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0U6IHsgdmFsdWU6IGRlZmF1bHRJbWFnZSB9IH0pLFxuICAgICAgLi4uKGRlZmF1bHRJbWFnZURpZ2VzdCAmJiB7IENPREVCVUlMRF9ERUZBVUxUX0lNQUdFX0RJR0VTVDogeyB2YWx1ZTogZGVmYXVsdEltYWdlRGlnZXN0IH0gfSksXG4gICAgfTtcblxuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gW1xuICAgICAgLi4uKG5ldHdvcmtQcm9wcz8uc2VjdXJpdHlHcm91cHMgPz8gW10pLFxuICAgICAgLi4uKHN0YW5kYWxvbmVTZWN1cml0eUdyb3VwcyA/PyBbXSksXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi4obmV0d29ya1Byb3BzICYmIHsgdnBjOiBuZXR3b3JrUHJvcHMudnBjLCBzdWJuZXRTZWxlY3Rpb246IG5ldHdvcmtQcm9wcy5zdWJuZXRTZWxlY3Rpb24gfSksXG4gICAgICAuLi4oc2VjdXJpdHlHcm91cHMubGVuZ3RoID4gMCAmJiB7IHNlY3VyaXR5R3JvdXBzIH0pLFxuICAgICAgLy8gYnVpbGRJbWFnZSBhdCB0aGlzIGxldmVsIHJlYWNoZXMgQ0RLIFBpcGVsaW5lcycgaW50ZXJuYWxseS13cmFwcGVkXG4gICAgICAvLyBTaGVsbFN0ZXAgQ29kZUJ1aWxkIGFjdGlvbiwgd2hpY2ggb3RoZXJ3aXNlIGhhcmRjb2Rlc1xuICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBjdXJhdGVkIHN0YW5kYXJkIGltYWdlLiBTZXR0aW5nIGl0IGhlcmUgY2xvc2VzIHRoZSBnYXBcbiAgICAgIC8vIGV4cG9zZWQgaW4gdGhlIHNhbWUgZW52IHZhciAoYENPREVCVUlMRF9ERUZBVUxUX0lNQUdFYCkgdGhhdCB0aGVcbiAgICAgIC8vIENvZGVCdWlsZFN0ZXAgcGF0aCBhbHJlYWR5IGhvbm9ycyB2aWEgcmVzb2x2ZVBsdWdpbkltYWdlKCknc1xuICAgICAgLy8gZmFsbGJhY2suIFBlci1zdGVwIGBidWlsZEltYWdlYCBvbiBhIENvZGVCdWlsZFN0ZXAgc3RpbGwgd2lucy5cbiAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgYnVpbGRJbWFnZTogcmVzb2x2ZURlZmF1bHRCdWlsZEltYWdlKHRoaXMsIG9yZ0lkKSxcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHBpcGVsaW5lRW52VmFycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -14,6 +14,11 @@ export interface PluginLookupProps {
14
14
  readonly uniqueId: UniqueId;
15
15
  /** Organization ID for resolving per-org secrets from Secrets Manager */
16
16
  readonly orgId?: string;
17
+ /**
18
+ * Platform pipeline id. Sent as lookup `context` so the plugin service records
19
+ * the warnings it returns against each (pipeline, step); omitted when unknown.
20
+ */
21
+ readonly pipelineId?: string;
17
22
  readonly runtime?: Runtime;
18
23
  /** Lambda timeout (default: 30s) */
19
24
  readonly timeout?: Duration;
@@ -65,6 +70,7 @@ export declare class PluginLookup extends Construct {
65
70
  private readonly _architecture;
66
71
  private readonly _reservedConcurrentExecutions?;
67
72
  private readonly _orgId?;
73
+ private readonly _pipelineId?;
68
74
  private readonly _resolvedPlugins?;
69
75
  constructor(scope: Construct, id: string, props: PluginLookupProps);
70
76
  /**
@@ -72,9 +78,12 @@ export declare class PluginLookup extends Construct {
72
78
  * During synthesis, if the value is unresolved (token), returns fallback plugin
73
79
  * During deployment, attempts to parse the actual value returned by the custom resource
74
80
  * @param plugin - Plugin name (string) or complete PluginOptions configuration
81
+ * @param stepKey - The step's label (`pluginStepLabel`: `synth` or
82
+ * `<stage>/<alias ?? name>`). The deploy-time lookup reports its warnings
83
+ * against it, so it must match the step manifest's and the security view's key.
75
84
  * @returns Resolved Plugin object or fallback default configuration
76
85
  */
77
- plugin(plugin: string | PluginOptions): Plugin;
86
+ plugin(plugin: string | PluginOptions, stepKey?: string): Plugin;
78
87
  /**
79
88
  * Creates the Lambda function that serves as the event handler for the custom resource provider.
80
89
  *
@@ -125,6 +134,14 @@ export declare class PluginLookup extends Construct {
125
134
  * vanilla aws/codebuild/standard:7.0), this step exits 127 — fix that
126
135
  * by using an image with pipeline-manager rather than papering over it
127
136
  * with a per-build `npm install -g`.
137
+ *
138
+ * TLS is VERIFIED by default: this lookup returns the image digests every
139
+ * step is pinned to, so an unverified connection would let a MITM choose what
140
+ * runs. A private-CA platform is trusted through `PLATFORM_CA_BUNDLE`, which
141
+ * the synth propagates into every CodeBuild step. Only an explicit
142
+ * `PLATFORM_TLS_VERIFY=false` at synth time (a dev platform on a self-signed
143
+ * certificate) adds `--no-verify-ssl` — and the CLI refuses that in
144
+ * production. See core/platform-tls.ts.
128
145
  */
129
146
  bootstrap(): Plugin;
130
147
  }