@aws-cdk/toolkit-lib 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api-extractor.json +3 -0
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/actions/bootstrap/index.d.ts +1 -1
- package/lib/actions/bootstrap/index.js +5 -5
- package/lib/actions/bootstrap/private/helpers.js +3 -3
- package/lib/actions/deploy/index.d.ts +1 -1
- package/lib/actions/deploy/index.js +1 -1
- package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
- package/lib/actions/deploy/private/deploy-options.js +1 -1
- package/lib/actions/deploy/private/helpers.d.ts +3 -2
- package/lib/actions/deploy/private/helpers.js +3 -3
- package/lib/actions/diff/index.d.ts +1 -1
- package/lib/actions/diff/index.js +1 -1
- package/lib/actions/diff/private/helpers.d.ts +5 -9
- package/lib/actions/diff/private/helpers.js +13 -30
- package/lib/actions/refactor/index.d.ts +12 -0
- package/lib/actions/refactor/index.js +1 -1
- package/lib/api/aws-auth/account-cache.d.ts +41 -0
- package/lib/api/aws-auth/account-cache.js +108 -0
- package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
- package/lib/api/aws-auth/awscli-compatible.js +250 -0
- package/lib/api/aws-auth/cached.d.ts +11 -0
- package/lib/api/aws-auth/cached.js +26 -0
- package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
- package/lib/api/aws-auth/credential-plugins.js +154 -0
- package/lib/api/aws-auth/private/index.d.ts +11 -0
- package/lib/api/aws-auth/private/index.js +37 -0
- package/lib/api/aws-auth/provider-caching.d.ts +13 -0
- package/lib/api/aws-auth/provider-caching.js +24 -0
- package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
- package/lib/api/aws-auth/proxy-agent.js +54 -0
- package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
- package/lib/api/aws-auth/sdk-logger.js +128 -0
- package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
- package/lib/api/aws-auth/sdk-provider.js +373 -0
- package/lib/api/aws-auth/sdk.d.ts +235 -0
- package/lib/api/aws-auth/sdk.js +391 -0
- package/lib/api/aws-auth/tracing.d.ts +11 -0
- package/lib/api/aws-auth/tracing.js +60 -0
- package/lib/api/aws-auth/user-agent.d.ts +7 -0
- package/lib/api/aws-auth/user-agent.js +20 -0
- package/lib/api/aws-auth/util.d.ts +6 -0
- package/lib/api/aws-auth/util.js +21 -0
- package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
- package/lib/api/bootstrap/bootstrap-environment.js +323 -0
- package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
- package/lib/api/bootstrap/bootstrap-props.js +14 -0
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
- package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
- package/lib/api/bootstrap/index.d.ts +3 -0
- package/lib/api/bootstrap/index.js +23 -0
- package/lib/api/bootstrap/legacy-template.d.ts +2 -0
- package/lib/api/bootstrap/legacy-template.js +82 -0
- package/lib/api/cloud-assembly/environment.d.ts +43 -0
- package/lib/api/cloud-assembly/environment.js +127 -0
- package/lib/api/cloud-assembly/index.d.ts +1 -1
- package/lib/api/cloud-assembly/index.js +5 -4
- package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
- package/lib/api/cloud-assembly/private/context-aware-source.js +7 -7
- package/lib/api/cloud-assembly/private/exec.js +3 -3
- package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
- package/lib/api/cloud-assembly/private/prepare-source.js +17 -15
- package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
- package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
- package/lib/api/cloud-assembly/private/source-builder.d.ts +10 -8
- package/lib/api/cloud-assembly/private/source-builder.js +43 -24
- package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
- package/lib/api/cloud-assembly/private/stack-assembly.js +16 -15
- package/lib/api/cloud-assembly/source-builder.d.ts +19 -0
- package/lib/api/cloud-assembly/source-builder.js +1 -1
- package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
- package/lib/api/cloud-assembly/stack-assembly.js +139 -0
- package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
- package/lib/api/cloud-assembly/stack-collection.js +112 -0
- package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
- package/lib/api/cloud-assembly/stack-selector.js +62 -5
- package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
- package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
- package/lib/api/cloudformation/index.d.ts +4 -0
- package/lib/api/cloudformation/index.js +21 -0
- package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
- package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
- package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
- package/lib/api/cloudformation/stack-helpers.js +163 -0
- package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
- package/lib/api/cloudformation/template-body-parameter.js +104 -0
- package/lib/api/context.d.ts +40 -0
- package/lib/api/context.js +84 -0
- package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
- package/lib/api/deployments/asset-manifest-builder.js +33 -0
- package/lib/api/deployments/asset-publishing.d.ts +60 -0
- package/lib/api/deployments/asset-publishing.js +144 -0
- package/lib/api/deployments/assets.d.ts +11 -0
- package/lib/api/deployments/assets.js +108 -0
- package/lib/api/deployments/cfn-api.d.ts +145 -0
- package/lib/api/deployments/cfn-api.js +444 -0
- package/lib/api/deployments/checks.d.ts +9 -0
- package/lib/api/deployments/checks.js +72 -0
- package/lib/api/deployments/deploy-stack.d.ts +164 -0
- package/lib/api/deployments/deploy-stack.js +490 -0
- package/lib/api/deployments/deployment-method.d.ts +24 -0
- package/lib/api/deployments/deployment-method.js +3 -0
- package/lib/api/deployments/deployment-result.d.ts +21 -0
- package/lib/api/deployments/deployment-result.js +10 -0
- package/lib/api/deployments/deployments.d.ts +289 -0
- package/lib/api/deployments/deployments.js +355 -0
- package/lib/api/deployments/index.d.ts +6 -0
- package/lib/api/deployments/index.js +27 -0
- package/lib/api/diff/diff-formatter.d.ts +147 -0
- package/lib/api/diff/diff-formatter.js +225 -0
- package/lib/api/diff/index.d.ts +1 -0
- package/lib/api/diff/index.js +18 -0
- package/lib/api/environment/environment-access.d.ts +139 -0
- package/lib/api/environment/environment-access.js +205 -0
- package/lib/api/environment/environment-resources.d.ts +75 -0
- package/lib/api/environment/environment-resources.js +213 -0
- package/lib/api/environment/index.d.ts +3 -0
- package/lib/api/environment/index.js +20 -0
- package/lib/api/environment/placeholders.d.ts +10 -0
- package/lib/api/environment/placeholders.js +23 -0
- package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
- package/lib/api/garbage-collection/garbage-collector.js +614 -0
- package/lib/api/garbage-collection/index.d.ts +3 -0
- package/lib/api/garbage-collection/index.js +21 -0
- package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
- package/lib/api/garbage-collection/progress-printer.js +80 -0
- package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
- package/lib/api/garbage-collection/stack-refresh.js +152 -0
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
- package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
- package/lib/api/hotswap/code-build-projects.d.ts +4 -0
- package/lib/api/hotswap/code-build-projects.js +62 -0
- package/lib/api/hotswap/common.d.ts +89 -0
- package/lib/api/hotswap/common.js +137 -0
- package/lib/api/hotswap/ecs-services.d.ts +4 -0
- package/lib/api/hotswap/ecs-services.js +159 -0
- package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
- package/lib/api/hotswap/hotswap-deployments.js +441 -0
- package/lib/api/hotswap/index.d.ts +2 -0
- package/lib/api/hotswap/index.js +19 -0
- package/lib/api/hotswap/lambda-functions.d.ts +4 -0
- package/lib/api/hotswap/lambda-functions.js +297 -0
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
- package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
- package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
- package/lib/api/index.d.ts +24 -0
- package/lib/api/index.js +41 -0
- package/lib/api/io/index.d.ts +3 -1
- package/lib/api/io/index.js +18 -1
- package/lib/api/io/io-host.d.ts +15 -0
- package/lib/api/io/io-host.js +3 -0
- package/lib/api/io/io-message.d.ts +76 -0
- package/lib/api/io/io-message.js +3 -0
- package/lib/api/io/private/index.d.ts +7 -1
- package/lib/api/io/private/index.js +8 -5
- package/lib/api/io/private/io-default-messages.d.ts +21 -0
- package/lib/api/io/private/io-default-messages.js +59 -0
- package/lib/api/io/private/io-helper.d.ts +32 -0
- package/lib/api/io/private/io-helper.js +51 -0
- package/lib/api/io/private/level-priority.d.ts +11 -0
- package/lib/api/io/private/level-priority.js +33 -0
- package/lib/api/io/private/message-maker.d.ts +89 -0
- package/lib/api/io/private/message-maker.js +60 -0
- package/lib/api/io/private/messages.d.ts +178 -0
- package/lib/api/io/private/messages.js +534 -0
- package/lib/api/io/private/sdk-logger.d.ts +1 -1
- package/lib/api/io/private/sdk-logger.js +6 -6
- package/lib/api/io/private/span.d.ts +93 -0
- package/lib/api/io/private/span.js +87 -0
- package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
- package/lib/api/io/private/testing/fake-io-host.js +41 -0
- package/lib/api/io/private/testing/index.d.ts +2 -0
- package/lib/api/io/private/testing/index.js +19 -0
- package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
- package/lib/api/io/private/testing/test-io-host.js +61 -0
- package/lib/api/io/private/types.d.ts +4 -0
- package/lib/api/io/private/types.js +3 -0
- package/lib/api/io/toolkit-action.d.ts +4 -0
- package/lib/api/io/toolkit-action.js +3 -0
- package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
- package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
- package/lib/api/logs-monitor/index.d.ts +2 -0
- package/lib/api/logs-monitor/index.js +19 -0
- package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
- package/lib/api/logs-monitor/logs-monitor.js +194 -0
- package/lib/api/notices/cached-data-source.d.ts +13 -0
- package/lib/api/notices/cached-data-source.js +77 -0
- package/lib/api/notices/filter.d.ts +59 -0
- package/lib/api/notices/filter.js +189 -0
- package/lib/api/notices/index.d.ts +1 -0
- package/lib/api/notices/index.js +18 -0
- package/lib/api/notices/notices.d.ts +111 -0
- package/lib/api/notices/notices.js +131 -0
- package/lib/api/notices/types.d.ts +37 -0
- package/lib/api/notices/types.js +3 -0
- package/lib/api/notices/web-data-source.d.ts +9 -0
- package/lib/api/notices/web-data-source.js +70 -0
- package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
- package/lib/api/plugin/context-provider-plugin.js +7 -0
- package/lib/api/plugin/index.d.ts +3 -0
- package/lib/api/plugin/index.js +20 -0
- package/lib/api/plugin/mode.d.ts +4 -0
- package/lib/api/plugin/mode.js +9 -0
- package/lib/api/plugin/plugin.d.ts +70 -0
- package/lib/api/plugin/plugin.js +127 -0
- package/lib/api/private.d.ts +1 -0
- package/lib/api/private.js +18 -0
- package/lib/api/refactoring/cloudformation.d.ts +38 -0
- package/lib/api/refactoring/cloudformation.js +56 -0
- package/lib/api/refactoring/digest.d.ts +26 -0
- package/lib/api/refactoring/digest.js +175 -0
- package/lib/api/refactoring/exclude.d.ts +29 -0
- package/lib/api/refactoring/exclude.js +94 -0
- package/lib/api/refactoring/index.d.ts +32 -0
- package/lib/api/refactoring/index.js +191 -0
- package/lib/api/require-approval.d.ts +17 -0
- package/lib/api/require-approval.js +22 -0
- package/lib/api/resource-import/importer.d.ts +216 -0
- package/lib/api/resource-import/importer.js +331 -0
- package/lib/api/resource-import/index.d.ts +2 -0
- package/lib/api/resource-import/index.js +19 -0
- package/lib/api/resource-import/migrator.d.ts +26 -0
- package/lib/api/resource-import/migrator.js +73 -0
- package/lib/api/resource-metadata/index.d.ts +1 -0
- package/lib/api/resource-metadata/index.js +18 -0
- package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
- package/lib/api/resource-metadata/resource-metadata.js +42 -0
- package/lib/api/rwlock.d.ts +60 -0
- package/lib/api/rwlock.js +204 -0
- package/lib/api/settings.d.ts +26 -0
- package/lib/api/settings.js +107 -0
- package/lib/api/shared-private.d.ts +8 -6
- package/lib/api/shared-private.js +31 -12561
- package/lib/api/stack-events/index.d.ts +4 -0
- package/lib/api/stack-events/index.js +23 -0
- package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
- package/lib/api/stack-events/stack-activity-monitor.js +164 -0
- package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
- package/lib/api/stack-events/stack-event-poller.js +130 -0
- package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
- package/lib/api/stack-events/stack-progress-monitor.js +98 -0
- package/lib/api/stack-events/stack-status.d.ts +42 -0
- package/lib/api/stack-events/stack-status.js +90 -0
- package/lib/api/streams.d.ts +7 -0
- package/lib/api/streams.js +24 -0
- package/lib/api/tags.d.ts +9 -0
- package/lib/api/tags.js +10 -0
- package/lib/api/toolkit-info.d.ts +52 -0
- package/lib/api/toolkit-info.js +157 -0
- package/lib/api/tree.d.ts +31 -0
- package/lib/api/tree.js +37 -0
- package/lib/api/work-graph/index.d.ts +3 -0
- package/lib/api/work-graph/index.js +20 -0
- package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
- package/lib/api/work-graph/work-graph-builder.js +172 -0
- package/lib/api/work-graph/work-graph-types.d.ts +50 -0
- package/lib/api/work-graph/work-graph-types.js +13 -0
- package/lib/api/work-graph/work-graph.d.ts +72 -0
- package/lib/api/work-graph/work-graph.js +349 -0
- package/lib/context-providers/ami.d.ts +13 -0
- package/lib/context-providers/ami.js +52 -0
- package/lib/context-providers/availability-zones.d.ts +13 -0
- package/lib/context-providers/availability-zones.js +29 -0
- package/lib/context-providers/cc-api-provider.d.ts +30 -0
- package/lib/context-providers/cc-api-provider.js +145 -0
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
- package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
- package/lib/context-providers/hosted-zones.d.ts +12 -0
- package/lib/context-providers/hosted-zones.js +69 -0
- package/lib/context-providers/index.d.ts +44 -0
- package/lib/context-providers/index.js +128 -0
- package/lib/context-providers/keys.d.ts +13 -0
- package/lib/context-providers/keys.js +54 -0
- package/lib/context-providers/load-balancers.d.ts +20 -0
- package/lib/context-providers/load-balancers.js +161 -0
- package/lib/context-providers/security-groups.d.ts +9 -0
- package/lib/context-providers/security-groups.js +69 -0
- package/lib/context-providers/ssm-parameters.d.ts +25 -0
- package/lib/context-providers/ssm-parameters.js +61 -0
- package/lib/context-providers/vpcs.d.ts +13 -0
- package/lib/context-providers/vpcs.js +291 -0
- package/lib/index.d.ts +4 -1
- package/lib/index.js +5 -2
- package/lib/index_bg.wasm +0 -0
- package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
- package/lib/payloads/bootstrap-environment-progress.js +3 -0
- package/lib/payloads/context.d.ts +9 -0
- package/lib/payloads/context.js +3 -0
- package/lib/payloads/deploy.d.ts +50 -0
- package/lib/payloads/deploy.js +3 -0
- package/lib/payloads/destroy.d.ts +23 -0
- package/lib/payloads/destroy.js +3 -0
- package/lib/payloads/diff.d.ts +31 -0
- package/lib/payloads/diff.js +22 -0
- package/lib/payloads/hotswap.d.ts +212 -0
- package/lib/payloads/hotswap.js +43 -0
- package/lib/payloads/index.d.ts +17 -0
- package/lib/payloads/index.js +34 -0
- package/lib/payloads/list.d.ts +4 -0
- package/lib/payloads/list.js +3 -0
- package/lib/payloads/logs-monitor.d.ts +33 -0
- package/lib/payloads/logs-monitor.js +3 -0
- package/lib/payloads/progress.d.ts +14 -0
- package/lib/payloads/progress.js +3 -0
- package/lib/payloads/refactor.d.ts +14 -0
- package/lib/payloads/refactor.js +3 -0
- package/lib/payloads/rollback.d.ts +17 -0
- package/lib/payloads/rollback.js +3 -0
- package/lib/payloads/sdk-trace.d.ts +20 -0
- package/lib/payloads/sdk-trace.js +3 -0
- package/lib/payloads/stack-activity.d.ts +53 -0
- package/lib/payloads/stack-activity.js +3 -0
- package/lib/payloads/stack-details.d.ts +17 -0
- package/lib/payloads/stack-details.js +3 -0
- package/lib/payloads/synth.d.ts +7 -0
- package/lib/payloads/synth.js +3 -0
- package/lib/payloads/types.d.ts +95 -0
- package/lib/payloads/types.js +3 -0
- package/lib/payloads/watch.d.ts +27 -0
- package/lib/payloads/watch.js +3 -0
- package/lib/private/activity-printer/base.d.ts +50 -0
- package/lib/private/activity-printer/base.js +120 -0
- package/lib/private/activity-printer/current.d.ts +26 -0
- package/lib/private/activity-printer/current.js +122 -0
- package/lib/private/activity-printer/display.d.ts +13 -0
- package/lib/private/activity-printer/display.js +81 -0
- package/lib/private/activity-printer/history.d.ts +32 -0
- package/lib/private/activity-printer/history.js +109 -0
- package/lib/private/activity-printer/index.d.ts +3 -0
- package/lib/private/activity-printer/index.js +20 -0
- package/lib/private/index.d.ts +1 -0
- package/lib/private/index.js +18 -0
- package/lib/toolkit/non-interactive-io-host.js +5 -4
- package/lib/toolkit/private/index.d.ts +2 -1
- package/lib/toolkit/private/index.js +1 -1
- package/lib/toolkit/toolkit-error.d.ts +86 -0
- package/lib/toolkit/toolkit-error.js +132 -0
- package/lib/toolkit/toolkit.d.ts +2 -2
- package/lib/toolkit/toolkit.js +161 -130
- package/lib/toolkit/types.d.ts +0 -55
- package/lib/toolkit/types.js +1 -1
- package/lib/util/archive.d.ts +1 -0
- package/lib/util/archive.js +86 -0
- package/lib/util/arrays.d.ts +14 -0
- package/lib/util/arrays.js +36 -0
- package/lib/util/bool.d.ts +7 -0
- package/lib/util/bool.js +13 -0
- package/lib/util/bytes.d.ts +8 -0
- package/lib/util/bytes.js +21 -0
- package/lib/util/cloudformation.d.ts +16 -0
- package/lib/util/cloudformation.js +36 -0
- package/lib/util/content-hash.d.ts +5 -0
- package/lib/util/content-hash.js +43 -0
- package/lib/util/directories.d.ts +22 -0
- package/lib/util/directories.js +59 -0
- package/lib/util/format-error.d.ts +9 -0
- package/lib/util/format-error.js +22 -0
- package/lib/util/index.d.ts +19 -0
- package/lib/util/index.js +36 -0
- package/lib/util/json.d.ts +48 -0
- package/lib/util/json.js +68 -0
- package/lib/util/net.d.ts +9 -0
- package/lib/util/net.js +60 -0
- package/lib/util/objects.d.ts +65 -0
- package/lib/util/objects.js +230 -0
- package/lib/util/package-info.d.ts +3 -0
- package/lib/util/package-info.js +22 -0
- package/lib/util/parallel.d.ts +6 -0
- package/lib/util/parallel.js +48 -0
- package/lib/util/serialize.d.ts +27 -0
- package/lib/util/serialize.js +86 -0
- package/lib/util/string-manipulation.d.ts +18 -0
- package/lib/util/string-manipulation.js +46 -0
- package/lib/util/type-brands.d.ts +39 -0
- package/lib/util/type-brands.js +39 -0
- package/lib/util/types.d.ts +27 -0
- package/lib/util/types.js +25 -0
- package/lib/util/version-range.d.ts +2 -0
- package/lib/util/version-range.js +36 -0
- package/lib/util/yaml-cfn.d.ts +15 -0
- package/lib/util/yaml-cfn.js +58 -0
- package/package.json +26 -28
- package/tsdoc.json +15 -0
- package/lib/api/shared-private.js.map +0 -7
- package/lib/api/shared-public.d.ts +0 -2159
- package/lib/api/shared-public.js +0 -1110
- package/lib/api/shared-public.js.map +0 -7
- package/lib/private/util.d.ts +0 -1
- package/lib/private/util.js +0 -787
- package/lib/private/util.js.map +0 -7
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Deployments = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const cdk_assets = require("cdk-assets");
|
|
6
|
+
const chalk = require("chalk");
|
|
7
|
+
const asset_manifest_builder_1 = require("./asset-manifest-builder");
|
|
8
|
+
const asset_publishing_1 = require("./asset-publishing");
|
|
9
|
+
const cfn_api_1 = require("./cfn-api");
|
|
10
|
+
const checks_1 = require("./checks");
|
|
11
|
+
const deploy_stack_1 = require("./deploy-stack");
|
|
12
|
+
const toolkit_error_1 = require("../../toolkit/toolkit-error");
|
|
13
|
+
const util_1 = require("../../util");
|
|
14
|
+
const cloudformation_1 = require("../cloudformation");
|
|
15
|
+
const environment_1 = require("../environment");
|
|
16
|
+
const private_1 = require("../io/private");
|
|
17
|
+
const stack_events_1 = require("../stack-events");
|
|
18
|
+
const toolkit_info_1 = require("../toolkit-info");
|
|
19
|
+
const BOOTSTRAP_STACK_VERSION_FOR_ROLLBACK = 23;
|
|
20
|
+
/**
|
|
21
|
+
* Scope for a single set of deployments from a set of Cloud Assembly Artifacts
|
|
22
|
+
*
|
|
23
|
+
* Manages lookup of SDKs, Bootstrap stacks, etc.
|
|
24
|
+
*/
|
|
25
|
+
class Deployments {
|
|
26
|
+
props;
|
|
27
|
+
envs;
|
|
28
|
+
/**
|
|
29
|
+
* SDK provider for asset publishing (do not use for anything else).
|
|
30
|
+
*
|
|
31
|
+
* This SDK provider is only allowed to be used for that purpose, nothing else.
|
|
32
|
+
*
|
|
33
|
+
* It's not a different object, but the field name should imply that this
|
|
34
|
+
* object should not be used directly, except to pass to asset handling routines.
|
|
35
|
+
*/
|
|
36
|
+
assetSdkProvider;
|
|
37
|
+
/**
|
|
38
|
+
* SDK provider for passing to deployStack
|
|
39
|
+
*
|
|
40
|
+
* This SDK provider is only allowed to be used for that purpose, nothing else.
|
|
41
|
+
*
|
|
42
|
+
* It's not a different object, but the field name should imply that this
|
|
43
|
+
* object should not be used directly, except to pass to `deployStack`.
|
|
44
|
+
*/
|
|
45
|
+
deployStackSdkProvider;
|
|
46
|
+
publisherCache = new Map();
|
|
47
|
+
_allowCrossAccountAssetPublishing;
|
|
48
|
+
ioHelper;
|
|
49
|
+
constructor(props) {
|
|
50
|
+
this.props = props;
|
|
51
|
+
this.assetSdkProvider = props.sdkProvider;
|
|
52
|
+
this.deployStackSdkProvider = props.sdkProvider;
|
|
53
|
+
this.ioHelper = props.ioHelper;
|
|
54
|
+
this.envs = new environment_1.EnvironmentAccess(props.sdkProvider, props.toolkitStackName ?? toolkit_info_1.DEFAULT_TOOLKIT_STACK_NAME, this.ioHelper);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolves the environment for a stack.
|
|
58
|
+
*/
|
|
59
|
+
async resolveEnvironment(stack) {
|
|
60
|
+
return this.envs.resolveStackEnvironment(stack);
|
|
61
|
+
}
|
|
62
|
+
async readCurrentTemplateWithNestedStacks(rootStackArtifact, retrieveProcessedTemplate = false) {
|
|
63
|
+
const env = await this.envs.accessStackForLookupBestEffort(rootStackArtifact);
|
|
64
|
+
return (0, cloudformation_1.loadCurrentTemplateWithNestedStacks)(rootStackArtifact, env.sdk, retrieveProcessedTemplate);
|
|
65
|
+
}
|
|
66
|
+
async readCurrentTemplate(stackArtifact) {
|
|
67
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg(`Reading existing template for stack ${stackArtifact.displayName}.`));
|
|
68
|
+
const env = await this.envs.accessStackForLookupBestEffort(stackArtifact);
|
|
69
|
+
return (0, cloudformation_1.loadCurrentTemplate)(stackArtifact, env.sdk);
|
|
70
|
+
}
|
|
71
|
+
async resourceIdentifierSummaries(stackArtifact) {
|
|
72
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg(`Retrieving template summary for stack ${stackArtifact.displayName}.`));
|
|
73
|
+
// Currently, needs to use `deploy-role` since it may need to read templates in the staging
|
|
74
|
+
// bucket which have been encrypted with a KMS key (and lookup-role may not read encrypted things)
|
|
75
|
+
const env = await this.envs.accessStackForReadOnlyStackOperations(stackArtifact);
|
|
76
|
+
const cfn = env.sdk.cloudFormation();
|
|
77
|
+
await (0, cfn_api_1.uploadStackTemplateAssets)(stackArtifact, this);
|
|
78
|
+
// Upload the template, if necessary, before passing it to CFN
|
|
79
|
+
const builder = new asset_manifest_builder_1.AssetManifestBuilder();
|
|
80
|
+
const cfnParam = await (0, cloudformation_1.makeBodyParameter)(this.ioHelper, stackArtifact, env.resolvedEnvironment, builder, env.resources);
|
|
81
|
+
// If the `makeBodyParameter` before this added assets, make sure to publish them before
|
|
82
|
+
// calling the API.
|
|
83
|
+
const addedAssets = builder.toManifest(stackArtifact.assembly.directory);
|
|
84
|
+
for (const entry of addedAssets.entries) {
|
|
85
|
+
await this.buildSingleAsset('no-version-validation', addedAssets, entry, {
|
|
86
|
+
stack: stackArtifact,
|
|
87
|
+
});
|
|
88
|
+
await this.publishSingleAsset(addedAssets, entry, {
|
|
89
|
+
stack: stackArtifact,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const response = await cfn.getTemplateSummary(cfnParam);
|
|
93
|
+
if (!response.ResourceIdentifierSummaries) {
|
|
94
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg('GetTemplateSummary API call did not return "ResourceIdentifierSummaries"'));
|
|
95
|
+
}
|
|
96
|
+
return response.ResourceIdentifierSummaries ?? [];
|
|
97
|
+
}
|
|
98
|
+
async deployStack(options) {
|
|
99
|
+
let deploymentMethod = options.deploymentMethod;
|
|
100
|
+
if (options.changeSetName || options.execute !== undefined) {
|
|
101
|
+
if (deploymentMethod) {
|
|
102
|
+
throw new toolkit_error_1.ToolkitError("You cannot supply both 'deploymentMethod' and 'changeSetName/execute'. Supply one or the other.");
|
|
103
|
+
}
|
|
104
|
+
deploymentMethod = {
|
|
105
|
+
method: 'change-set',
|
|
106
|
+
changeSetName: options.changeSetName,
|
|
107
|
+
execute: options.execute,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const env = await this.envs.accessStackForMutableStackOperations(options.stack);
|
|
111
|
+
// Do a verification of the bootstrap stack version
|
|
112
|
+
await this.validateBootstrapStackVersion(options.stack.stackName, options.stack.requiresBootstrapStackVersion, options.stack.bootstrapStackVersionSsmParameter, env.resources);
|
|
113
|
+
const executionRoleArn = await env.replacePlaceholders(options.roleArn ?? options.stack.cloudFormationExecutionRoleArn);
|
|
114
|
+
return (0, deploy_stack_1.deployStack)({
|
|
115
|
+
stack: options.stack,
|
|
116
|
+
resolvedEnvironment: env.resolvedEnvironment,
|
|
117
|
+
deployName: options.deployName,
|
|
118
|
+
notificationArns: options.notificationArns,
|
|
119
|
+
sdk: env.sdk,
|
|
120
|
+
sdkProvider: this.deployStackSdkProvider,
|
|
121
|
+
roleArn: executionRoleArn,
|
|
122
|
+
reuseAssets: options.reuseAssets,
|
|
123
|
+
envResources: env.resources,
|
|
124
|
+
tags: options.tags,
|
|
125
|
+
deploymentMethod,
|
|
126
|
+
forceDeployment: options.forceDeployment,
|
|
127
|
+
parameters: options.parameters,
|
|
128
|
+
usePreviousParameters: options.usePreviousParameters,
|
|
129
|
+
rollback: options.rollback,
|
|
130
|
+
hotswap: options.hotswap,
|
|
131
|
+
hotswapPropertyOverrides: options.hotswapPropertyOverrides,
|
|
132
|
+
extraUserAgent: options.extraUserAgent,
|
|
133
|
+
resourcesToImport: options.resourcesToImport,
|
|
134
|
+
overrideTemplate: options.overrideTemplate,
|
|
135
|
+
assetParallelism: options.assetParallelism,
|
|
136
|
+
}, this.ioHelper);
|
|
137
|
+
}
|
|
138
|
+
async rollbackStack(options) {
|
|
139
|
+
let resourcesToSkip = options.orphanLogicalIds ?? [];
|
|
140
|
+
if (options.orphanFailedResources && resourcesToSkip.length > 0) {
|
|
141
|
+
throw new toolkit_error_1.ToolkitError('Cannot combine --force with --orphan');
|
|
142
|
+
}
|
|
143
|
+
const env = await this.envs.accessStackForMutableStackOperations(options.stack);
|
|
144
|
+
if (options.validateBootstrapStackVersion ?? true) {
|
|
145
|
+
// Do a verification of the bootstrap stack version
|
|
146
|
+
await this.validateBootstrapStackVersion(options.stack.stackName, BOOTSTRAP_STACK_VERSION_FOR_ROLLBACK, options.stack.bootstrapStackVersionSsmParameter, env.resources);
|
|
147
|
+
}
|
|
148
|
+
const cfn = env.sdk.cloudFormation();
|
|
149
|
+
const deployName = options.stack.stackName;
|
|
150
|
+
// We loop in case of `--force` and the stack ends up in `CONTINUE_UPDATE_ROLLBACK`.
|
|
151
|
+
let maxLoops = 10;
|
|
152
|
+
while (maxLoops--) {
|
|
153
|
+
const cloudFormationStack = await cloudformation_1.CloudFormationStack.lookup(cfn, deployName);
|
|
154
|
+
const stackArn = cloudFormationStack.stackId;
|
|
155
|
+
const executionRoleArn = await env.replacePlaceholders(options.roleArn ?? options.stack.cloudFormationExecutionRoleArn);
|
|
156
|
+
switch (cloudFormationStack.stackStatus.rollbackChoice) {
|
|
157
|
+
case stack_events_1.RollbackChoice.NONE:
|
|
158
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`Stack ${deployName} does not need a rollback: ${cloudFormationStack.stackStatus}`));
|
|
159
|
+
return { stackArn: cloudFormationStack.stackId, notInRollbackableState: true };
|
|
160
|
+
case stack_events_1.RollbackChoice.START_ROLLBACK:
|
|
161
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_DEBUG.msg(`Initiating rollback of stack ${deployName}`));
|
|
162
|
+
await cfn.rollbackStack({
|
|
163
|
+
StackName: deployName,
|
|
164
|
+
RoleARN: executionRoleArn,
|
|
165
|
+
ClientRequestToken: (0, crypto_1.randomUUID)(),
|
|
166
|
+
// Enabling this is just the better overall default, the only reason it isn't the upstream default is backwards compatibility
|
|
167
|
+
RetainExceptOnCreate: true,
|
|
168
|
+
});
|
|
169
|
+
break;
|
|
170
|
+
case stack_events_1.RollbackChoice.CONTINUE_UPDATE_ROLLBACK:
|
|
171
|
+
if (options.orphanFailedResources) {
|
|
172
|
+
// Find the failed resources from the deployment and automatically skip them
|
|
173
|
+
// (Using deployment log because we definitely have `DescribeStackEvents` permissions, and we might not have
|
|
174
|
+
// `DescribeStackResources` permissions).
|
|
175
|
+
const poller = new stack_events_1.StackEventPoller(cfn, {
|
|
176
|
+
stackName: deployName,
|
|
177
|
+
stackStatuses: ['ROLLBACK_IN_PROGRESS', 'UPDATE_ROLLBACK_IN_PROGRESS'],
|
|
178
|
+
});
|
|
179
|
+
await poller.poll();
|
|
180
|
+
resourcesToSkip = poller.resourceErrors
|
|
181
|
+
.filter((r) => !r.isStackEvent && r.parentStackLogicalIds.length === 0)
|
|
182
|
+
.map((r) => r.event.LogicalResourceId ?? '');
|
|
183
|
+
}
|
|
184
|
+
const skipDescription = resourcesToSkip.length > 0 ? ` (orphaning: ${resourcesToSkip.join(', ')})` : '';
|
|
185
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`Continuing rollback of stack ${deployName}${skipDescription}`));
|
|
186
|
+
await cfn.continueUpdateRollback({
|
|
187
|
+
StackName: deployName,
|
|
188
|
+
ClientRequestToken: (0, crypto_1.randomUUID)(),
|
|
189
|
+
RoleARN: executionRoleArn,
|
|
190
|
+
ResourcesToSkip: resourcesToSkip,
|
|
191
|
+
});
|
|
192
|
+
break;
|
|
193
|
+
case stack_events_1.RollbackChoice.ROLLBACK_FAILED:
|
|
194
|
+
await this.ioHelper.notify(private_1.IO.DEFAULT_TOOLKIT_WARN.msg(`Stack ${deployName} failed creation and rollback. This state cannot be rolled back. You can recreate this stack by running 'cdk deploy'.`));
|
|
195
|
+
return { stackArn, notInRollbackableState: true };
|
|
196
|
+
default:
|
|
197
|
+
throw new toolkit_error_1.ToolkitError(`Unexpected rollback choice: ${cloudFormationStack.stackStatus.rollbackChoice}`);
|
|
198
|
+
}
|
|
199
|
+
const monitor = new stack_events_1.StackActivityMonitor({
|
|
200
|
+
cfn,
|
|
201
|
+
stack: options.stack,
|
|
202
|
+
stackName: deployName,
|
|
203
|
+
ioHelper: this.ioHelper,
|
|
204
|
+
});
|
|
205
|
+
await monitor.start();
|
|
206
|
+
let stackErrorMessage = undefined;
|
|
207
|
+
let finalStackState = cloudFormationStack;
|
|
208
|
+
try {
|
|
209
|
+
const successStack = await (0, cfn_api_1.stabilizeStack)(cfn, this.ioHelper, deployName);
|
|
210
|
+
// This shouldn't really happen, but catch it anyway. You never know.
|
|
211
|
+
if (!successStack) {
|
|
212
|
+
throw new toolkit_error_1.ToolkitError('Stack deploy failed (the stack disappeared while we were rolling it back)');
|
|
213
|
+
}
|
|
214
|
+
finalStackState = successStack;
|
|
215
|
+
const errors = monitor.errors.join(', ');
|
|
216
|
+
if (errors) {
|
|
217
|
+
stackErrorMessage = errors;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch (e) {
|
|
221
|
+
stackErrorMessage = suffixWithErrors((0, util_1.formatErrorMessage)(e), monitor.errors);
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
await monitor.stop();
|
|
225
|
+
}
|
|
226
|
+
if (finalStackState.stackStatus.isRollbackSuccess || !stackErrorMessage) {
|
|
227
|
+
return { stackArn, success: true };
|
|
228
|
+
}
|
|
229
|
+
// Either we need to ignore some resources to continue the rollback, or something went wrong
|
|
230
|
+
if (finalStackState.stackStatus.rollbackChoice === stack_events_1.RollbackChoice.CONTINUE_UPDATE_ROLLBACK && options.orphanFailedResources) {
|
|
231
|
+
// Do another loop-de-loop
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
throw new toolkit_error_1.ToolkitError(`${stackErrorMessage} (fix problem and retry, or orphan these resources using --orphan or --force)`);
|
|
235
|
+
}
|
|
236
|
+
throw new toolkit_error_1.ToolkitError("Rollback did not finish after a large number of iterations; stopping because it looks like we're not making progress anymore. You can retry if rollback was progressing as expected.");
|
|
237
|
+
}
|
|
238
|
+
async destroyStack(options) {
|
|
239
|
+
const env = await this.envs.accessStackForMutableStackOperations(options.stack);
|
|
240
|
+
const executionRoleArn = await env.replacePlaceholders(options.roleArn ?? options.stack.cloudFormationExecutionRoleArn);
|
|
241
|
+
return (0, deploy_stack_1.destroyStack)({
|
|
242
|
+
sdk: env.sdk,
|
|
243
|
+
roleArn: executionRoleArn,
|
|
244
|
+
stack: options.stack,
|
|
245
|
+
deployName: options.deployName,
|
|
246
|
+
}, this.ioHelper);
|
|
247
|
+
}
|
|
248
|
+
async stackExists(options) {
|
|
249
|
+
let env;
|
|
250
|
+
if (options.tryLookupRole) {
|
|
251
|
+
env = await this.envs.accessStackForLookupBestEffort(options.stack);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
env = await this.envs.accessStackForReadOnlyStackOperations(options.stack);
|
|
255
|
+
}
|
|
256
|
+
const stack = await cloudformation_1.CloudFormationStack.lookup(env.sdk.cloudFormation(), options.deployName ?? options.stack.stackName);
|
|
257
|
+
return stack.exists;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Build a single asset from an asset manifest
|
|
261
|
+
*
|
|
262
|
+
* If an assert manifest artifact is given, the bootstrap stack version
|
|
263
|
+
* will be validated according to the constraints in that manifest artifact.
|
|
264
|
+
* If that is not necessary, `'no-version-validation'` can be passed.
|
|
265
|
+
*/
|
|
266
|
+
// eslint-disable-next-line @stylistic/max-len
|
|
267
|
+
async buildSingleAsset(assetArtifact, assetManifest, asset, options) {
|
|
268
|
+
if (assetArtifact !== 'no-version-validation') {
|
|
269
|
+
const env = await this.envs.accessStackForReadOnlyStackOperations(options.stack);
|
|
270
|
+
await this.validateBootstrapStackVersion(options.stack.stackName, assetArtifact.requiresBootstrapStackVersion, assetArtifact.bootstrapStackVersionSsmParameter, env.resources);
|
|
271
|
+
}
|
|
272
|
+
const resolvedEnvironment = await this.envs.resolveStackEnvironment(options.stack);
|
|
273
|
+
const publisher = this.cachedPublisher(assetManifest, resolvedEnvironment, options.stackName);
|
|
274
|
+
await publisher.buildEntry(asset);
|
|
275
|
+
if (publisher.hasFailures) {
|
|
276
|
+
throw new toolkit_error_1.ToolkitError(`Failed to build asset ${asset.displayName(false)}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Publish a single asset from an asset manifest
|
|
281
|
+
*/
|
|
282
|
+
async publishSingleAsset(assetManifest, asset, options) {
|
|
283
|
+
const stackEnv = await this.envs.resolveStackEnvironment(options.stack);
|
|
284
|
+
// No need to validate anymore, we already did that during build
|
|
285
|
+
const publisher = this.cachedPublisher(assetManifest, stackEnv, options.stackName);
|
|
286
|
+
await publisher.publishEntry(asset, {
|
|
287
|
+
allowCrossAccount: await this.allowCrossAccountAssetPublishingForEnv(options.stack),
|
|
288
|
+
force: options.forcePublish,
|
|
289
|
+
});
|
|
290
|
+
if (publisher.hasFailures) {
|
|
291
|
+
throw new toolkit_error_1.ToolkitError(`Failed to publish asset ${asset.displayName(true)}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async allowCrossAccountAssetPublishingForEnv(stack) {
|
|
295
|
+
if (this._allowCrossAccountAssetPublishing === undefined) {
|
|
296
|
+
const env = await this.envs.accessStackForReadOnlyStackOperations(stack);
|
|
297
|
+
this._allowCrossAccountAssetPublishing = await (0, checks_1.determineAllowCrossAccountAssetPublishing)(env.sdk, this.ioHelper, this.props.toolkitStackName);
|
|
298
|
+
}
|
|
299
|
+
return this._allowCrossAccountAssetPublishing;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Return whether a single asset has been published already
|
|
303
|
+
*/
|
|
304
|
+
async isSingleAssetPublished(assetManifest, asset, options) {
|
|
305
|
+
const stackEnv = await this.envs.resolveStackEnvironment(options.stack);
|
|
306
|
+
const publisher = this.cachedPublisher(assetManifest, stackEnv, options.stackName);
|
|
307
|
+
return publisher.isEntryPublished(asset);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Validate that the bootstrap stack has the right version for this stack
|
|
311
|
+
*
|
|
312
|
+
* Call into envResources.validateVersion, but prepend the stack name in case of failure.
|
|
313
|
+
*/
|
|
314
|
+
async validateBootstrapStackVersion(stackName, requiresBootstrapStackVersion, bootstrapStackVersionSsmParameter, envResources) {
|
|
315
|
+
try {
|
|
316
|
+
await envResources.validateVersion(requiresBootstrapStackVersion, bootstrapStackVersionSsmParameter);
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
throw new toolkit_error_1.ToolkitError(`${stackName}: ${(0, util_1.formatErrorMessage)(e)}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
cachedPublisher(assetManifest, env, stackName) {
|
|
323
|
+
const existing = this.publisherCache.get(assetManifest);
|
|
324
|
+
if (existing) {
|
|
325
|
+
return existing;
|
|
326
|
+
}
|
|
327
|
+
const prefix = stackName ? `${chalk.bold(stackName)}: ` : '';
|
|
328
|
+
const publisher = new cdk_assets.AssetPublishing(assetManifest, {
|
|
329
|
+
// The AssetPublishing class takes care of role assuming etc, so it's okay to
|
|
330
|
+
// give it a direct `SdkProvider`.
|
|
331
|
+
aws: new asset_publishing_1.PublishingAws(this.assetSdkProvider, env),
|
|
332
|
+
progressListener: new ParallelSafeAssetProgress(prefix, this.ioHelper),
|
|
333
|
+
});
|
|
334
|
+
this.publisherCache.set(assetManifest, publisher);
|
|
335
|
+
return publisher;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
exports.Deployments = Deployments;
|
|
339
|
+
/**
|
|
340
|
+
* Asset progress that doesn't do anything with percentages (currently)
|
|
341
|
+
*/
|
|
342
|
+
class ParallelSafeAssetProgress extends asset_publishing_1.BasePublishProgressListener {
|
|
343
|
+
prefix;
|
|
344
|
+
constructor(prefix, ioHelper) {
|
|
345
|
+
super(ioHelper);
|
|
346
|
+
this.prefix = prefix;
|
|
347
|
+
}
|
|
348
|
+
getMessage(type, event) {
|
|
349
|
+
return `${this.prefix}${type}: ${event.message}`;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
function suffixWithErrors(msg, errors) {
|
|
353
|
+
return errors && errors.length > 0 ? `${msg}: ${errors.join(', ')}` : msg;
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3ltZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBb0M7QUFFcEMseUNBQXlDO0FBQ3pDLCtCQUErQjtBQUMvQixxRUFBZ0U7QUFDaEUseURBRzRCO0FBQzVCLHVDQUdtQjtBQUNuQixxQ0FBcUU7QUFFckUsaURBQTJEO0FBRzNELCtEQUEyRDtBQUMzRCxxQ0FBZ0Q7QUFNaEQsc0RBSzJCO0FBQzNCLGdEQUE4RTtBQUU5RSwyQ0FBa0Q7QUFFbEQsa0RBQXlGO0FBRXpGLGtEQUE2RDtBQUU3RCxNQUFNLG9DQUFvQyxHQUFHLEVBQUUsQ0FBQztBQTBQaEQ7Ozs7R0FJRztBQUNILE1BQWEsV0FBVztJQTZCTztJQTVCYixJQUFJLENBQW9CO0lBRXhDOzs7Ozs7O09BT0c7SUFDYyxnQkFBZ0IsQ0FBYztJQUUvQzs7Ozs7OztPQU9HO0lBQ2Msc0JBQXNCLENBQWM7SUFFcEMsY0FBYyxHQUFHLElBQUksR0FBRyxFQUF3RCxDQUFDO0lBRTFGLGlDQUFpQyxDQUFzQjtJQUU5QyxRQUFRLENBQVc7SUFFcEMsWUFBNkIsS0FBdUI7UUFBdkIsVUFBSyxHQUFMLEtBQUssQ0FBa0I7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSwrQkFBaUIsQ0FDL0IsS0FBSyxDQUFDLFdBQVcsRUFDakIsS0FBSyxDQUFDLGdCQUFnQixJQUFJLHlDQUEwQixFQUNwRCxJQUFJLENBQUMsUUFBUSxDQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBd0M7UUFDdEUs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O0lBRWhDLFlBQVksTUFBYyxFQUFFLFFBQWtCO1FBQzVDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRVMsVUFBVSxDQUFDLElBQTBCLEVBQUUsS0FBa0M7UUFDakYsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxNQUFpQjtJQUN0RCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0ICogYXMgY2RrX2Fzc2V0cyBmcm9tICdjZGstYXNzZXRzJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IEFzc2V0TWFuaWZlc3RCdWlsZGVyIH0gZnJvbSAnLi9hc3NldC1tYW5pZmVzdC1idWlsZGVyJztcbmltcG9ydCB7XG4gIEJhc2VQdWJsaXNoUHJvZ3Jlc3NMaXN0ZW5lcixcbiAgUHVibGlzaGluZ0F3cyxcbn0gZnJvbSAnLi9hc3NldC1wdWJsaXNoaW5nJztcbmltcG9ydCB7XG4gIHN0YWJpbGl6ZVN0YWNrLFxuICB1cGxvYWRTdGFja1RlbXBsYXRlQXNzZXRzLFxufSBmcm9tICcuL2Nmbi1hcGknO1xuaW1wb3J0IHsgZGV0ZXJtaW5lQWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmcgfSBmcm9tICcuL2NoZWNrcyc7XG5cbmltcG9ydCB7IGRlcGxveVN0YWNrLCBkZXN0cm95U3RhY2sgfSBmcm9tICcuL2RlcGxveS1zdGFjayc7XG5pbXBvcnQgdHlwZSB7IERlcGxveW1lbnRNZXRob2QgfSBmcm9tICcuL2RlcGxveW1lbnQtbWV0aG9kJztcbmltcG9ydCB0eXBlIHsgRGVwbG95U3RhY2tSZXN1bHQgfSBmcm9tICcuL2RlcGxveW1lbnQtcmVzdWx0JztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uL3Rvb2xraXQvdG9vbGtpdC1lcnJvcic7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB0eXBlIHsgU2RrUHJvdmlkZXIgfSBmcm9tICcuLi9hd3MtYXV0aC9wcml2YXRlJztcbmltcG9ydCB0eXBlIHtcbiAgVGVtcGxhdGUsXG4gIFJvb3RUZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3MsXG59IGZyb20gJy4uL2Nsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7XG4gIENsb3VkRm9ybWF0aW9uU3RhY2ssXG4gIGxvYWRDdXJyZW50VGVtcGxhdGUsXG4gIGxvYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLFxuICBtYWtlQm9keVBhcmFtZXRlcixcbn0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgdHlwZSBFbnZpcm9ubWVudFJlc291cmNlcywgRW52aXJvbm1lbnRBY2Nlc3MgfSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgdHlwZSB7IEhvdHN3YXBNb2RlLCBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMgfSBmcm9tICcuLi9ob3Rzd2FwL2NvbW1vbic7XG5pbXBvcnQgeyBJTywgdHlwZSBJb0hlbHBlciB9IGZyb20gJy4uL2lvL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMsIFJlc291cmNlc1RvSW1wb3J0IH0gZnJvbSAnLi4vcmVzb3VyY2UtaW1wb3J0JztcbmltcG9ydCB7IFN0YWNrQWN0aXZpdHlNb25pdG9yLCBTdGFja0V2ZW50UG9sbGVyLCBSb2xsYmFja0Nob2ljZSB9IGZyb20gJy4uL3N0YWNrLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFRhZyB9IGZyb20gJy4uL3RhZ3MnO1xuaW1wb3J0IHsgREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUgfSBmcm9tICcuLi90b29sa2l0LWluZm8nO1xuXG5jb25zdCBCT09UU1RSQVBfU1RBQ0tfVkVSU0lPTl9GT1JfUk9MTEJBQ0sgPSAyMztcblxuZXhwb3J0IGludGVyZmFjZSBEZXBsb3lTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgdG8gZGVwbG95XG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGRlcGxveW1lbnQgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvcGljIEFSTnMgdG8gc2VuZCBhIG1lc3NhZ2Ugd2hlbiBkZXBsb3ltZW50IGZpbmlzaGVzIChwYXNzIHRocm91Z2ggdG8gQ2xvdWRGb3JtYXRpb24pXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uQXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBuYW1lIHVuZGVyIHdoaWNoIHN0YWNrIHdpbGwgYmUgZGVwbG95ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgYXJ0aWZhY3QgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjaywgaWYgbm90IHRoZSBkZWZhdWx0IG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgJ0NES1Rvb2xraXQnXG4gICAqL1xuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFzc2V0IElEcyB3aGljaCBzaG91bGQgTk9UIGJlIGJ1aWx0IG9yIHVwbG9hZGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnVpbGQgYWxsIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmV1c2VBc3NldHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3RhY2sgdGFncyAocGFzcyB0aHJvdWdoIHRvIENsb3VkRm9ybWF0aW9uKVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFRhZ1tdO1xuXG4gIC8qKlxuICAgKiBTdGFnZSB0aGUgY2hhbmdlIHNldCBidXQgZG9uJ3QgZXhlY3V0ZSBpdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWVcbiAgICogQGRlcHJlY2F0ZWQgVXNlICdkZXBsb3ltZW50TWV0aG9kJyBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBleGVjdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgbmFtZSB0byB1c2UgZm9yIHRoZSBDbG91ZEZvcm1hdGlvbiBjaGFuZ2Ugc2V0LlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgJ2RlcGxveW1lbnRNZXRob2QnIGluc3RlYWRcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlbGVjdCB0aGUgZGVwbG95bWVudCBtZXRob2QgKGRpcmVjdCBvciB1c2luZyBhIGNoYW5nZSBzZXQpXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ2hhbmdlIHNldCB3aXRoIGRlZmF1bHQgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudE1ldGhvZD86IERlcGxveW1lbnRNZXRob2Q7XG5cbiAgLyoqXG4gICAqIEZvcmNlIGRlcGxveW1lbnQsIGV2ZW4gaWYgdGhlIGRlcGxveWVkIHRlbXBsYXRlIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIHdlIGFyZSBhYm91dCB0byBkZXBsb3kuXG4gICAqIEBkZWZhdWx0IGZhbHNlIGRlcGxveW1lbnQgd2lsbCBiZSBza2lwcGVkIGlmIHRoZSB0ZW1wbGF0ZSBpcyBpZGVudGljYWxcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlRGVwbG95bWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV4dHJhIHBhcmFtZXRlcnMgZm9yIENsb3VkRm9ybWF0aW9uXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVycz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gIC8qKlxuICAgKiBVc2UgcHJldmlvdXMgdmFsdWVzIGZvciB1bnNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAqXG4gICAqIElmIG5vdCBzZXQsIGFsbCBwYXJhbWV0ZXJzIG11c3QgYmUgc3BlY2lmaWVkIGZvciBldmVyeSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB1c2VQcmV2aW91c1BhcmFtZXRlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSb2xsYmFjayBmYWlsZWQgZGVwbG95bWVudHNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qXG4gICAqIFdoZXRoZXIgdG8gcGVyZm9ybSBhICdob3Rzd2FwJyBkZXBsb3ltZW50LlxuICAgKiBBICdob3Rzd2FwJyBkZXBsb3ltZW50IHdpbGwgYXR0ZW1wdCB0byBzaG9ydC1jaXJjdWl0IENsb3VkRm9ybWF0aW9uXG4gICAqIGFuZCB1cGRhdGUgdGhlIGFmZmVjdGVkIHJlc291cmNlcyBsaWtlIExhbWJkYSBmdW5jdGlvbnMgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYEhvdHN3YXBNb2RlLkZVTExfREVQTE9ZTUVOVGAgZm9yIHJlZ3VsYXIgZGVwbG95bWVudHMsIGBIb3Rzd2FwTW9kZS5IT1RTV0FQX09OTFlgIGZvciAnd2F0Y2gnIGRlcGxveW1lbnRzXG4gICAqL1xuICByZWFkb25seSBob3Rzd2FwPzogSG90c3dhcE1vZGU7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdGhhdCBjb25maWd1cmUgaG90c3dhcCBiZWhhdmlvclxuICAgKi9cbiAgcmVhZG9ubHkgaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzPzogSG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgZXh0cmEgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgVXNlci1BZ2VudCBoZWFkZXIgd2hlbiBwZXJmb3JtaW5nIEFXUyBTREsgY2FsbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90aGluZyBleHRyYSBpcyBhcHBlbmRlZCB0byB0aGUgVXNlci1BZ2VudCBoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhVXNlckFnZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4aXN0aW5nIHJlc291cmNlcyB0byBiZSBJTVBPUlRFRCBpbnRvIHRoZSBzdGFjaywgaW5zdGVhZCBvZiBiZWluZyBDUkVBVEVEXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZXNUb0ltcG9ydD86IFJlc291cmNlc1RvSW1wb3J0O1xuXG4gIC8qKlxuICAgKiBJZiBwcmVzZW50LCB1c2UgdGhpcyBnaXZlbiB0ZW1wbGF0ZSBpbnN0ZWFkIG9mIHRoZSBzdG9yZWQgb25lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVXNlIHRoZSBzdG9yZWQgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlVGVtcGxhdGU/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYnVpbGQvcHVibGlzaCBhc3NldHMgaW4gcGFyYWxsZWxcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZSBUbyByZW1haW4gYmFja3dhcmQgY29tcGF0aWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0UGFyYWxsZWxpc20/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlcGxveSBpZiB0aGUgYXBwIGNvbnRhaW5zIG5vIHN0YWNrcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdGhpcyBvcHRpb24gc2VlbXMgdG8gYmUgdW5zZWQgaW5zaWRlIGRlcGxveW1lbnRzXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVOb1N0YWNrcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9sbGJhY2tTdGFja09wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgdG8gcm9sbCBiYWNrXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGRlcGxveW1lbnQgKHBhc3MgdGhyb3VnaCB0byBDbG91ZEZvcm1hdGlvbilcbiAgICpcbiAgICogQGRlZmF1bHQgLSBDdXJyZW50IHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2ssIGlmIG5vdCB0aGUgZGVmYXVsdCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDREtUb29sa2l0J1xuICAgKi9cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IG9ycGhhbiBhbGwgZmFpbGVkIHJlc291cmNlcyBkdXJpbmcgdGhlIHJvbGxiYWNrXG4gICAqXG4gICAqIFRoaXMgd2lsbCBmb3JjZSBhIHJvbGxiYWNrIHRoYXQgb3RoZXJ3aXNlIHdvdWxkIGhhdmUgZmFpbGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JwaGFuRmFpbGVkUmVzb3VyY2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3JwaGFuIHRoZSByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gbG9naWNhbCBJRHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBvcnBoYW5pbmdcbiAgICovXG4gIHJlYWRvbmx5IG9ycGhhbkxvZ2ljYWxJZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB2YWxpZGF0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgYm9vdHN0cmFwIHN0YWNrIHBlcm1pc3Npb25zXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUm9sbGJhY2tTdGFja1Jlc3VsdCA9IHsgcmVhZG9ubHkgc3RhY2tBcm46IHN0cmluZyB9ICYgKFxuICB8IHsgcmVhZG9ubHkgbm90SW5Sb2xsYmFja2FibGVTdGF0ZTogdHJ1ZSB9XG4gIHwgeyByZWFkb25seSBzdWNjZXNzOiB0cnVlOyBub3RJblJvbGxiYWNrYWJsZVN0YXRlPzogdW5kZWZpbmVkIH1cbik7XG5cbmludGVyZmFjZSBBc3NldE9wdGlvbnMge1xuICAvKipcbiAgICogU3RhY2sgd2l0aCBhc3NldHMgdG8gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gcm9sZSBmb3IgdGhlIGJ1aWxkaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFN0YWNrQXNzZXRzT3B0aW9ucyBleHRlbmRzIEFzc2V0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTdGFjayBuYW1lIHRoaXMgYXNzZXQgaXMgZm9yXG4gICAqL1xuICByZWFkb25seSBzdGFja05hbWU/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQdWJsaXNoU3RhY2tBc3NldHNPcHRpb25zIGV4dGVuZHMgQXNzZXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFN0YWNrIG5hbWUgdGhpcyBhc3NldCBpcyBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWx3YXlzIHB1Ymxpc2gsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlUHVibGlzaD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzdHJveVN0YWNrT3B0aW9ucyB7XG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tFeGlzdHNPcHRpb25zIHtcbiAgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcbiAgZGVwbG95TmFtZT86IHN0cmluZztcbiAgdHJ5TG9va3VwUm9sZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95bWVudHNQcm9wcyB7XG4gIHJlYWRvbmx5IHNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xufVxuXG4vKipcbiAqIFNjb3BlIGZvciBhIHNpbmdsZSBzZXQgb2YgZGVwbG95bWVudHMgZnJvbSBhIHNldCBvZiBDbG91ZCBBc3NlbWJseSBBcnRpZmFjdHNcbiAqXG4gKiBNYW5hZ2VzIGxvb2t1cCBvZiBTREtzLCBCb290c3RyYXAgc3RhY2tzLCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBsb3ltZW50cyB7XG4gIHB1YmxpYyByZWFkb25seSBlbnZzOiBFbnZpcm9ubWVudEFjY2VzcztcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIGZvciBhc3NldCBwdWJsaXNoaW5nIChkbyBub3QgdXNlIGZvciBhbnl0aGluZyBlbHNlKS5cbiAgICpcbiAgICogVGhpcyBTREsgcHJvdmlkZXIgaXMgb25seSBhbGxvd2VkIHRvIGJlIHVzZWQgZm9yIHRoYXQgcHVycG9zZSwgbm90aGluZyBlbHNlLlxuICAgKlxuICAgKiBJdCdzIG5vdCBhIGRpZmZlcmVudCBvYmplY3QsIGJ1dCB0aGUgZmllbGQgbmFtZSBzaG91bGQgaW1wbHkgdGhhdCB0aGlzXG4gICAqIG9iamVjdCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksIGV4Y2VwdCB0byBwYXNzIHRvIGFzc2V0IGhhbmRsaW5nIHJvdXRpbmVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhc3NldFNka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIGZvciBwYXNzaW5nIHRvIGRlcGxveVN0YWNrXG4gICAqXG4gICAqIFRoaXMgU0RLIHByb3ZpZGVyIGlzIG9ubHkgYWxsb3dlZCB0byBiZSB1c2VkIGZvciB0aGF0IHB1cnBvc2UsIG5vdGhpbmcgZWxzZS5cbiAgICpcbiAgICogSXQncyBub3QgYSBkaWZmZXJlbnQgb2JqZWN0LCBidXQgdGhlIGZpZWxkIG5hbWUgc2hvdWxkIGltcGx5IHRoYXQgdGhpc1xuICAgKiBvYmplY3Qgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBleGNlcHQgdG8gcGFzcyB0byBgZGVwbG95U3RhY2tgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZXBsb3lTdGFja1Nka1Byb3ZpZGVyOiBTZGtQcm92aWRlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHB1Ymxpc2hlckNhY2hlID0gbmV3IE1hcDxjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsIGNka19hc3NldHMuQXNzZXRQdWJsaXNoaW5nPigpO1xuXG4gIHByaXZhdGUgX2FsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IERlcGxveW1lbnRzUHJvcHMpIHtcbiAgICB0aGlzLmFzc2V0U2RrUHJvdmlkZXIgPSBwcm9wcy5zZGtQcm92aWRlcjtcbiAgICB0aGlzLmRlcGxveVN0YWNrU2RrUHJvdmlkZXIgPSBwcm9wcy5zZGtQcm92aWRlcjtcbiAgICB0aGlzLmlvSGVscGVyID0gcHJvcHMuaW9IZWxwZXI7XG4gICAgdGhpcy5lbnZzID0gbmV3IEVudmlyb25tZW50QWNjZXNzKFxuICAgICAgcHJvcHMuc2RrUHJvdmlkZXIsXG4gICAgICBwcm9wcy50b29sa2l0U3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLFxuICAgICAgdGhpcy5pb0hlbHBlcixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBlbnZpcm9ubWVudCBmb3IgYSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXNvbHZlRW52aXJvbm1lbnQoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8Y3hhcGkuRW52aXJvbm1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KHN0YWNrKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkQ3VycmVudFRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyhcbiAgICByb290U3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIHJldHJpZXZlUHJvY2Vzc2VkVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxSb290VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzPiB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTG9va3VwQmVzdEVmZm9ydChyb290U3RhY2tBcnRpZmFjdCk7XG4gICAgcmV0dXJuIGxvYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzKHJvb3RTdGFja0FydGlmYWN0LCBlbnYuc2RrLCByZXRyaWV2ZVByb2Nlc3NlZFRlbXBsYXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkQ3VycmVudFRlbXBsYXRlKHN0YWNrQXJ0aWZhY3Q6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfREVCVUcubXNnKGBSZWFkaW5nIGV4aXN0aW5nIHRlbXBsYXRlIGZvciBzdGFjayAke3N0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWV9LmApKTtcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JMb29rdXBCZXN0RWZmb3J0KHN0YWNrQXJ0aWZhY3QpO1xuICAgIHJldHVybiBsb2FkQ3VycmVudFRlbXBsYXRlKHN0YWNrQXJ0aWZhY3QsIGVudi5zZGspO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcyhcbiAgICBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4gICk6IFByb21pc2U8UmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzPiB7XG4gICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZyhgUmV0cmlldmluZyB0ZW1wbGF0ZSBzdW1tYXJ5IGZvciBzdGFjayAke3N0YWNrQXJ0aWZhY3QuZGlzcGxheU5hbWV9LmApKTtcbiAgICAvLyBDdXJyZW50bHksIG5lZWRzIHRvIHVzZSBgZGVwbG95LXJvbGVgIHNpbmNlIGl0IG1heSBuZWVkIHRvIHJlYWQgdGVtcGxhdGVzIGluIHRoZSBzdGFnaW5nXG4gICAgLy8gYnVja2V0IHdoaWNoIGhhdmUgYmVlbiBlbmNyeXB0ZWQgd2l0aCBhIEtNUyBrZXkgKGFuZCBsb29rdXAtcm9sZSBtYXkgbm90IHJlYWQgZW5jcnlwdGVkIHRoaW5ncylcbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JSZWFkT25seVN0YWNrT3BlcmF0aW9ucyhzdGFja0FydGlmYWN0KTtcbiAgICBjb25zdCBjZm4gPSBlbnYuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG5cbiAgICBhd2FpdCB1cGxvYWRTdGFja1RlbXBsYXRlQXNzZXRzKHN0YWNrQXJ0aWZhY3QsIHRoaXMpO1xuXG4gICAgLy8gVXBsb2FkIHRoZSB0ZW1wbGF0ZSwgaWYgbmVjZXNzYXJ5LCBiZWZvcmUgcGFzc2luZyBpdCB0byBDRk5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEFzc2V0TWFuaWZlc3RCdWlsZGVyKCk7XG4gICAgY29uc3QgY2ZuUGFyYW0gPSBhd2FpdCBtYWtlQm9keVBhcmFtZXRlcihcbiAgICAgIHRoaXMuaW9IZWxwZXIsXG4gICAgICBzdGFja0FydGlmYWN0LFxuICAgICAgZW52LnJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgICBidWlsZGVyLFxuICAgICAgZW52LnJlc291cmNlcyxcbiAgICApO1xuXG4gICAgLy8gSWYgdGhlIGBtYWtlQm9keVBhcmFtZXRlcmAgYmVmb3JlIHRoaXMgYWRkZWQgYXNzZXRzLCBtYWtlIHN1cmUgdG8gcHVibGlzaCB0aGVtIGJlZm9yZVxuICAgIC8vIGNhbGxpbmcgdGhlIEFQSS5cbiAgICBjb25zdCBhZGRlZEFzc2V0cyA9IGJ1aWxkZXIudG9NYW5pZmVzdChzdGFja0FydGlmYWN0LmFzc2VtYmx5LmRpcmVjdG9yeSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBhZGRlZEFzc2V0cy5lbnRyaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkU2luZ2xlQXNzZXQoJ25vLXZlcnNpb24tdmFsaWRhdGlvbicsIGFkZGVkQXNzZXRzLCBlbnRyeSwge1xuICAgICAgICBzdGFjazogc3RhY2tBcnRpZmFjdCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoU2luZ2xlQXNzZXQoYWRkZWRBc3NldHMsIGVudHJ5LCB7XG4gICAgICAgIHN0YWNrOiBzdGFja0FydGlmYWN0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZm4uZ2V0VGVtcGxhdGVTdW1tYXJ5KGNmblBhcmFtKTtcbiAgICBpZiAoIXJlc3BvbnNlLlJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcykge1xuICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZygnR2V0VGVtcGxhdGVTdW1tYXJ5IEFQSSBjYWxsIGRpZCBub3QgcmV0dXJuIFwiUmVzb3VyY2VJZGVudGlmaWVyU3VtbWFyaWVzXCInKSk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZS5SZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVwbG95U3RhY2sob3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGxldCBkZXBsb3ltZW50TWV0aG9kID0gb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kO1xuICAgIGlmIChvcHRpb25zLmNoYW5nZVNldE5hbWUgfHwgb3B0aW9ucy5leGVjdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChkZXBsb3ltZW50TWV0aG9kKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgXCJZb3UgY2Fubm90IHN1cHBseSBib3RoICdkZXBsb3ltZW50TWV0aG9kJyBhbmQgJ2NoYW5nZVNldE5hbWUvZXhlY3V0ZScuIFN1cHBseSBvbmUgb3IgdGhlIG90aGVyLlwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVwbG95bWVudE1ldGhvZCA9IHtcbiAgICAgICAgbWV0aG9kOiAnY2hhbmdlLXNldCcsXG4gICAgICAgIGNoYW5nZVNldE5hbWU6IG9wdGlvbnMuY2hhbmdlU2V0TmFtZSxcbiAgICAgICAgZXhlY3V0ZTogb3B0aW9ucy5leGVjdXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JNdXRhYmxlU3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuXG4gICAgLy8gRG8gYSB2ZXJpZmljYXRpb24gb2YgdGhlIGJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uXG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgIG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lLFxuICAgICAgb3B0aW9ucy5zdGFjay5yZXF1aXJlc0Jvb3RzdHJhcFN0YWNrVmVyc2lvbixcbiAgICAgIG9wdGlvbnMuc3RhY2suYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgZW52LnJlc291cmNlcyk7XG5cbiAgICBjb25zdCBleGVjdXRpb25Sb2xlQXJuID0gYXdhaXQgZW52LnJlcGxhY2VQbGFjZWhvbGRlcnMob3B0aW9ucy5yb2xlQXJuID8/IG9wdGlvbnMuc3RhY2suY2xvdWRGb3JtYXRpb25FeGVjdXRpb25Sb2xlQXJuKTtcblxuICAgIHJldHVybiBkZXBsb3lTdGFjayh7XG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIHJlc29sdmVkRW52aXJvbm1lbnQ6IGVudi5yZXNvbHZlZEVudmlyb25tZW50LFxuICAgICAgZGVwbG95TmFtZTogb3B0aW9ucy5kZXBsb3lOYW1lLFxuICAgICAgbm90aWZpY2F0aW9uQXJuczogb3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgc2RrOiBlbnYuc2RrLFxuICAgICAgc2RrUHJvdmlkZXI6IHRoaXMuZGVwbG95U3RhY2tTZGtQcm92aWRlcixcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgIGVudlJlc291cmNlczogZW52LnJlc291cmNlcyxcbiAgICAgIHRhZ3M6IG9wdGlvbnMudGFncyxcbiAgICAgIGRlcGxveW1lbnRNZXRob2QsXG4gICAgICBmb3JjZURlcGxveW1lbnQ6IG9wdGlvbnMuZm9yY2VEZXBsb3ltZW50LFxuICAgICAgcGFyYW1ldGVyczogb3B0aW9ucy5wYXJhbWV0ZXJzLFxuICAgICAgdXNlUHJldmlvdXNQYXJhbWV0ZXJzOiBvcHRpb25zLnVzZVByZXZpb3VzUGFyYW1ldGVycyxcbiAgICAgIHJvbGxiYWNrOiBvcHRpb25zLnJvbGxiYWNrLFxuICAgICAgaG90c3dhcDogb3B0aW9ucy5ob3Rzd2FwLFxuICAgICAgaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzOiBvcHRpb25zLmhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyxcbiAgICAgIGV4dHJhVXNlckFnZW50OiBvcHRpb25zLmV4dHJhVXNlckFnZW50LFxuICAgICAgcmVzb3VyY2VzVG9JbXBvcnQ6IG9wdGlvbnMucmVzb3VyY2VzVG9JbXBvcnQsXG4gICAgICBvdmVycmlkZVRlbXBsYXRlOiBvcHRpb25zLm92ZXJyaWRlVGVtcGxhdGUsXG4gICAgICBhc3NldFBhcmFsbGVsaXNtOiBvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20sXG4gICAgfSwgdGhpcy5pb0hlbHBlcik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2tTdGFjayhvcHRpb25zOiBSb2xsYmFja1N0YWNrT3B0aW9ucyk6IFByb21pc2U8Um9sbGJhY2tTdGFja1Jlc3VsdD4ge1xuICAgIGxldCByZXNvdXJjZXNUb1NraXA6IHN0cmluZ1tdID0gb3B0aW9ucy5vcnBoYW5Mb2dpY2FsSWRzID8/IFtdO1xuICAgIGlmIChvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcyAmJiByZXNvdXJjZXNUb1NraXAubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ2Fubm90IGNvbWJpbmUgLS1mb3JjZSB3aXRoIC0tb3JwaGFuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW52ID0gYXdhaXQgdGhpcy5lbnZzLmFjY2Vzc1N0YWNrRm9yTXV0YWJsZVN0YWNrT3BlcmF0aW9ucyhvcHRpb25zLnN0YWNrKTtcblxuICAgIGlmIChvcHRpb25zLnZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uID8/IHRydWUpIHtcbiAgICAgIC8vIERvIGEgdmVyaWZpY2F0aW9uIG9mIHRoZSBib290c3RyYXAgc3RhY2sgdmVyc2lvblxuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIEJPT1RTVFJBUF9TVEFDS19WRVJTSU9OX0ZPUl9ST0xMQkFDSyxcbiAgICAgICAgb3B0aW9ucy5zdGFjay5ib290c3RyYXBTdGFja1ZlcnNpb25Tc21QYXJhbWV0ZXIsXG4gICAgICAgIGVudi5yZXNvdXJjZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGNmbiA9IGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgICBjb25zdCBkZXBsb3lOYW1lID0gb3B0aW9ucy5zdGFjay5zdGFja05hbWU7XG5cbiAgICAvLyBXZSBsb29wIGluIGNhc2Ugb2YgYC0tZm9yY2VgIGFuZCB0aGUgc3RhY2sgZW5kcyB1cCBpbiBgQ09OVElOVUVfVVBEQVRFX1JPTExCQUNLYC5cbiAgICBsZXQgbWF4TG9vcHMgPSAxMDtcbiAgICB3aGlsZSAobWF4TG9vcHMtLSkge1xuICAgICAgY29uc3QgY2xvdWRGb3JtYXRpb25TdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKGNmbiwgZGVwbG95TmFtZSk7XG4gICAgICBjb25zdCBzdGFja0FybiA9IGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tJZDtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uUm9sZUFybiA9IGF3YWl0IGVudi5yZXBsYWNlUGxhY2Vob2xkZXJzKG9wdGlvbnMucm9sZUFybiA/PyBvcHRpb25zLnN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybik7XG5cbiAgICAgIHN3aXRjaCAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5yb2xsYmFja0Nob2ljZSkge1xuICAgICAgICBjYXNlIFJvbGxiYWNrQ2hvaWNlLk5PTkU6XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX1dBUk4ubXNnKGBTdGFjayAke2RlcGxveU5hbWV9IGRvZXMgbm90IG5lZWQgYSByb2xsYmFjazogJHtjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzfWApKTtcbiAgICAgICAgICByZXR1cm4geyBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLCBub3RJblJvbGxiYWNrYWJsZVN0YXRlOiB0cnVlIH07XG5cbiAgICAgICAgY2FzZSBSb2xsYmFja0Nob2ljZS5TVEFSVF9ST0xMQkFDSzpcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfREVCVUcubXNnKGBJbml0aWF0aW5nIHJvbGxiYWNrIG9mIHN0YWNrICR7ZGVwbG95TmFtZX1gKSk7XG4gICAgICAgICAgYXdhaXQgY2ZuLnJvbGxiYWNrU3RhY2soe1xuICAgICAgICAgICAgU3RhY2tOYW1lOiBkZXBsb3lOYW1lLFxuICAgICAgICAgICAgUm9sZUFSTjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgICAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgLy8gRW5hYmxpbmcgdGhpcyBpcyBqdXN0IHRoZSBiZXR0ZXIgb3ZlcmFsbCBkZWZhdWx0LCB0aGUgb25seSByZWFzb24gaXQgaXNuJ3QgdGhlIHVwc3RyZWFtIGRlZmF1bHQgaXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIFJldGFpbkV4Y2VwdE9uQ3JlYXRlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUm9sbGJhY2tDaG9pY2UuQ09OVElOVUVfVVBEQVRFX1JPTExCQUNLOlxuICAgICAgICAgIGlmIChvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcykge1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgZmFpbGVkIHJlc291cmNlcyBmcm9tIHRoZSBkZXBsb3ltZW50IGFuZCBhdXRvbWF0aWNhbGx5IHNraXAgdGhlbVxuICAgICAgICAgICAgLy8gKFVzaW5nIGRlcGxveW1lbnQgbG9nIGJlY2F1c2Ugd2UgZGVmaW5pdGVseSBoYXZlIGBEZXNjcmliZVN0YWNrRXZlbnRzYCBwZXJtaXNzaW9ucywgYW5kIHdlIG1pZ2h0IG5vdCBoYXZlXG4gICAgICAgICAgICAvLyBgRGVzY3JpYmVTdGFja1Jlc291cmNlc2AgcGVybWlzc2lvbnMpLlxuICAgICAgICAgICAgY29uc3QgcG9sbGVyID0gbmV3IFN0YWNrRXZlbnRQb2xsZXIoY2ZuLCB7XG4gICAgICAgICAgICAgIHN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgICAgICAgc3RhY2tTdGF0dXNlczogWydST0xMQkFDS19JTl9QUk9HUkVTUycsICdVUERBVEVfUk9MTEJBQ0tfSU5fUFJPR1JFU1MnXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgcG9sbGVyLnBvbGwoKTtcbiAgICAgICAgICAgIHJlc291cmNlc1RvU2tpcCA9IHBvbGxlci5yZXNvdXJjZUVycm9yc1xuICAgICAgICAgICAgICAuZmlsdGVyKChyKSA9PiAhci5pc1N0YWNrRXZlbnQgJiYgci5wYXJlbnRTdGFja0xvZ2ljYWxJZHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAubWFwKChyKSA9PiByLmV2ZW50LkxvZ2ljYWxSZXNvdXJjZUlkID8/ICcnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBza2lwRGVzY3JpcHRpb24gPSByZXNvdXJjZXNUb1NraXAubGVuZ3RoID4gMCA/IGAgKG9ycGhhbmluZzogJHtyZXNvdXJjZXNUb1NraXAuam9pbignLCAnKX0pYCA6ICcnO1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9XQVJOLm1zZyhgQ29udGludWluZyByb2xsYmFjayBvZiBzdGFjayAke2RlcGxveU5hbWV9JHtza2lwRGVzY3JpcHRpb259YCkpO1xuICAgICAgICAgIGF3YWl0IGNmbi5jb250aW51ZVVwZGF0ZVJvbGxiYWNrKHtcbiAgICAgICAgICAgIFN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgUm9sZUFSTjogZXhlY3V0aW9uUm9sZUFybixcbiAgICAgICAgICAgIFJlc291cmNlc1RvU2tpcDogcmVzb3VyY2VzVG9Ta2lwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUm9sbGJhY2tDaG9pY2UuUk9MTEJBQ0tfRkFJTEVEOlxuICAgICAgICAgIGF3YWl0IHRoaXMuaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9XQVJOLm1zZyhcbiAgICAgICAgICAgIGBTdGFjayAke2RlcGxveU5hbWV9IGZhaWxlZCBjcmVhdGlvbiBhbmQgcm9sbGJhY2suIFRoaXMgc3RhdGUgY2Fubm90IGJlIHJvbGxlZCBiYWNrLiBZb3UgY2FuIHJlY3JlYXRlIHRoaXMgc3RhY2sgYnkgcnVubmluZyAnY2RrIGRlcGxveScuYCxcbiAgICAgICAgICApKTtcbiAgICAgICAgICByZXR1cm4geyBzdGFja0Fybiwgbm90SW5Sb2xsYmFja2FibGVTdGF0ZTogdHJ1ZSB9O1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgVW5leHBlY3RlZCByb2xsYmFjayBjaG9pY2U6ICR7Y2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5yb2xsYmFja0Nob2ljZX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9uaXRvciA9IG5ldyBTdGFja0FjdGl2aXR5TW9uaXRvcih7XG4gICAgICAgIGNmbixcbiAgICAgICAgc3RhY2s6IG9wdGlvbnMuc3RhY2ssXG4gICAgICAgIHN0YWNrTmFtZTogZGVwbG95TmFtZSxcbiAgICAgICAgaW9IZWxwZXI6IHRoaXMuaW9IZWxwZXIsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IG1vbml0b3Iuc3RhcnQoKTtcblxuICAgICAgbGV0IHN0YWNrRXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgZmluYWxTdGFja1N0YXRlID0gY2xvdWRGb3JtYXRpb25TdGFjaztcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NTdGFjayA9IGF3YWl0IHN0YWJpbGl6ZVN0YWNrKGNmbiwgdGhpcy5pb0hlbHBlciwgZGVwbG95TmFtZSk7XG5cbiAgICAgICAgLy8gVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiwgYnV0IGNhdGNoIGl0IGFueXdheS4gWW91IG5ldmVyIGtub3cuXG4gICAgICAgIGlmICghc3VjY2Vzc1N0YWNrKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignU3RhY2sgZGVwbG95IGZhaWxlZCAodGhlIHN0YWNrIGRpc2FwcGVhcmVkIHdoaWxlIHdlIHdlcmUgcm9sbGluZyBpdCBiYWNrKScpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsU3RhY2tTdGF0ZSA9IHN1Y2Nlc3NTdGFjaztcblxuICAgICAgICBjb25zdCBlcnJvcnMgPSBtb25pdG9yLmVycm9ycy5qb2luKCcsICcpO1xuICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgc3RhY2tFcnJvck1lc3NhZ2UgPSBlcnJvcnM7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBzdGFja0Vycm9yTWVzc2FnZSA9IHN1ZmZpeFdpdGhFcnJvcnMoZm9ybWF0RXJyb3JNZXNzYWdlKGUpLCBtb25pdG9yLmVycm9ycyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBtb25pdG9yLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsU3RhY2tTdGF0ZS5zdGFja1N0YXR1cy5pc1JvbGxiYWNrU3VjY2VzcyB8fCAhc3RhY2tFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhY2tBcm4sIHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRWl0aGVyIHdlIG5lZWQgdG8gaWdub3JlIHNvbWUgcmVzb3VyY2VzIHRvIGNvbnRpbnVlIHRoZSByb2xsYmFjaywgb3Igc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIGlmIChmaW5hbFN0YWNrU3RhdGUuc3RhY2tTdGF0dXMucm9sbGJhY2tDaG9pY2UgPT09IFJvbGxiYWNrQ2hvaWNlLkNPTlRJTlVFX1VQREFURV9ST0xMQkFDSyAmJiBvcHRpb25zLm9ycGhhbkZhaWxlZFJlc291cmNlcykge1xuICAgICAgICAvLyBEbyBhbm90aGVyIGxvb3AtZGUtbG9vcFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgYCR7c3RhY2tFcnJvck1lc3NhZ2V9IChmaXggcHJvYmxlbSBhbmQgcmV0cnksIG9yIG9ycGhhbiB0aGVzZSByZXNvdXJjZXMgdXNpbmcgLS1vcnBoYW4gb3IgLS1mb3JjZSlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgIFwiUm9sbGJhY2sgZGlkIG5vdCBmaW5pc2ggYWZ0ZXIgYSBsYXJnZSBudW1iZXIgb2YgaXRlcmF0aW9uczsgc3RvcHBpbmcgYmVjYXVzZSBpdCBsb29rcyBsaWtlIHdlJ3JlIG5vdCBtYWtpbmcgcHJvZ3Jlc3MgYW55bW9yZS4gWW91IGNhbiByZXRyeSBpZiByb2xsYmFjayB3YXMgcHJvZ3Jlc3NpbmcgYXMgZXhwZWN0ZWQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95U3RhY2sob3B0aW9uczogRGVzdHJveVN0YWNrT3B0aW9ucykge1xuICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvck11dGFibGVTdGFja09wZXJhdGlvbnMob3B0aW9ucy5zdGFjayk7XG4gICAgY29uc3QgZXhlY3V0aW9uUm9sZUFybiA9IGF3YWl0IGVudi5yZXBsYWNlUGxhY2Vob2xkZXJzKG9wdGlvbnMucm9sZUFybiA/PyBvcHRpb25zLnN0YWNrLmNsb3VkRm9ybWF0aW9uRXhlY3V0aW9uUm9sZUFybik7XG5cbiAgICByZXR1cm4gZGVzdHJveVN0YWNrKHtcbiAgICAgIHNkazogZW52LnNkayxcbiAgICAgIHJvbGVBcm46IGV4ZWN1dGlvblJvbGVBcm4sXG4gICAgICBzdGFjazogb3B0aW9ucy5zdGFjayxcbiAgICAgIGRlcGxveU5hbWU6IG9wdGlvbnMuZGVwbG95TmFtZSxcbiAgICB9LCB0aGlzLmlvSGVscGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFja0V4aXN0cyhvcHRpb25zOiBTdGFja0V4aXN0c09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgZW52O1xuICAgIGlmIChvcHRpb25zLnRyeUxvb2t1cFJvbGUpIHtcbiAgICAgIGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0Zvckxvb2t1cEJlc3RFZmZvcnQob3B0aW9ucy5zdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgIH1cbiAgICBjb25zdCBzdGFjayA9IGF3YWl0IENsb3VkRm9ybWF0aW9uU3RhY2subG9va3VwKGVudi5zZGsuY2xvdWRGb3JtYXRpb24oKSwgb3B0aW9ucy5kZXBsb3lOYW1lID8/IG9wdGlvbnMuc3RhY2suc3RhY2tOYW1lKTtcbiAgICByZXR1cm4gc3RhY2suZXhpc3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgc2luZ2xlIGFzc2V0IGZyb20gYW4gYXNzZXQgbWFuaWZlc3RcbiAgICpcbiAgICogSWYgYW4gYXNzZXJ0IG1hbmlmZXN0IGFydGlmYWN0IGlzIGdpdmVuLCB0aGUgYm9vdHN0cmFwIHN0YWNrIHZlcnNpb25cbiAgICogd2lsbCBiZSB2YWxpZGF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb25zdHJhaW50cyBpbiB0aGF0IG1hbmlmZXN0IGFydGlmYWN0LlxuICAgKiBJZiB0aGF0IGlzIG5vdCBuZWNlc3NhcnksIGAnbm8tdmVyc2lvbi12YWxpZGF0aW9uJ2AgY2FuIGJlIHBhc3NlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgcHVibGljIGFzeW5jIGJ1aWxkU2luZ2xlQXNzZXQoXG4gICAgYXNzZXRBcnRpZmFjdDogY3hhcGkuQXNzZXRNYW5pZmVzdEFydGlmYWN0IHwgJ25vLXZlcnNpb24tdmFsaWRhdGlvbicsXG4gICAgYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LFxuICAgIGFzc2V0OiBjZGtfYXNzZXRzLklNYW5pZmVzdEVudHJ5LFxuICAgIG9wdGlvbnM6IEJ1aWxkU3RhY2tBc3NldHNPcHRpb25zLFxuICApIHtcbiAgICBpZiAoYXNzZXRBcnRpZmFjdCAhPT0gJ25vLXZlcnNpb24tdmFsaWRhdGlvbicpIHtcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZW52cy5hY2Nlc3NTdGFja0ZvclJlYWRPbmx5U3RhY2tPcGVyYXRpb25zKG9wdGlvbnMuc3RhY2spO1xuICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZUJvb3RzdHJhcFN0YWNrVmVyc2lvbihcbiAgICAgICAgb3B0aW9ucy5zdGFjay5zdGFja05hbWUsXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QucmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgIGFzc2V0QXJ0aWZhY3QuYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyLFxuICAgICAgICBlbnYucmVzb3VyY2VzKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZEVudmlyb25tZW50ID0gYXdhaXQgdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KG9wdGlvbnMuc3RhY2spO1xuXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgcmVzb2x2ZWRFbnZpcm9ubWVudCwgb3B0aW9ucy5zdGFja05hbWUpO1xuICAgIGF3YWl0IHB1Ymxpc2hlci5idWlsZEVudHJ5KGFzc2V0KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gYnVpbGQgYXNzZXQgJHthc3NldC5kaXNwbGF5TmFtZShmYWxzZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2ggYSBzaW5nbGUgYXNzZXQgZnJvbSBhbiBhc3NldCBtYW5pZmVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2hTaW5nbGVBc3NldChcbiAgICBhc3NldE1hbmlmZXN0OiBjZGtfYXNzZXRzLkFzc2V0TWFuaWZlc3QsXG4gICAgYXNzZXQ6IGNka19hc3NldHMuSU1hbmlmZXN0RW50cnksXG4gICAgb3B0aW9uczogUHVibGlzaFN0YWNrQXNzZXRzT3B0aW9ucyxcbiAgKSB7XG4gICAgY29uc3Qgc3RhY2tFbnYgPSBhd2FpdCB0aGlzLmVudnMucmVzb2x2ZVN0YWNrRW52aXJvbm1lbnQob3B0aW9ucy5zdGFjayk7XG5cbiAgICAvLyBObyBuZWVkIHRvIHZhbGlkYXRlIGFueW1vcmUsIHdlIGFscmVhZHkgZGlkIHRoYXQgZHVyaW5nIGJ1aWxkXG4gICAgY29uc3QgcHVibGlzaGVyID0gdGhpcy5jYWNoZWRQdWJsaXNoZXIoYXNzZXRNYW5pZmVzdCwgc3RhY2tFbnYsIG9wdGlvbnMuc3RhY2tOYW1lKTtcbiAgICBhd2FpdCBwdWJsaXNoZXIucHVibGlzaEVudHJ5KGFzc2V0LCB7XG4gICAgICBhbGxvd0Nyb3NzQWNjb3VudDogYXdhaXQgdGhpcy5hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZ0ZvckVudihvcHRpb25zLnN0YWNrKSxcbiAgICAgIGZvcmNlOiBvcHRpb25zLmZvcmNlUHVibGlzaCxcbiAgICB9KTtcbiAgICBpZiAocHVibGlzaGVyLmhhc0ZhaWx1cmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gcHVibGlzaCBhc3NldCAke2Fzc2V0LmRpc3BsYXlOYW1lKHRydWUpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWxsb3dDcm9zc0FjY291bnRBc3NldFB1Ymxpc2hpbmdGb3JFbnYoc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLl9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbnYgPSBhd2FpdCB0aGlzLmVudnMuYWNjZXNzU3RhY2tGb3JSZWFkT25seVN0YWNrT3BlcmF0aW9ucyhzdGFjayk7XG4gICAgICB0aGlzLl9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyA9IGF3YWl0IGRldGVybWluZUFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nKGVudi5zZGssIHRoaXMuaW9IZWxwZXIsIHRoaXMucHJvcHMudG9vbGtpdFN0YWNrTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gd2hldGhlciBhIHNpbmdsZSBhc3NldCBoYXMgYmVlbiBwdWJsaXNoZWQgYWxyZWFkeVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGlzU2luZ2xlQXNzZXRQdWJsaXNoZWQoXG4gICAgYXNzZXRNYW5pZmVzdDogY2RrX2Fzc2V0cy5Bc3NldE1hbmlmZXN0LFxuICAgIGFzc2V0OiBjZGtfYXNzZXRzLklNYW5pZmVzdEVudHJ5LFxuICAgIG9wdGlvbnM6IFB1Ymxpc2hTdGFja0Fzc2V0c09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHN0YWNrRW52ID0gYXdhaXQgdGhpcy5lbnZzLnJlc29sdmVTdGFja0Vudmlyb25tZW50KG9wdGlvbnMuc3RhY2spO1xuICAgIGNvbnN0IHB1Ymxpc2hlciA9IHRoaXMuY2FjaGVkUHVibGlzaGVyKGFzc2V0TWFuaWZlc3QsIHN0YWNrRW52LCBvcHRpb25zLnN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHB1Ymxpc2hlci5pc0VudHJ5UHVibGlzaGVkKGFzc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBib290c3RyYXAgc3RhY2sgaGFzIHRoZSByaWdodCB2ZXJzaW9uIGZvciB0aGlzIHN0YWNrXG4gICAqXG4gICAqIENhbGwgaW50byBlbnZSZXNvdXJjZXMudmFsaWRhdGVWZXJzaW9uLCBidXQgcHJlcGVuZCB0aGUgc3RhY2sgbmFtZSBpbiBjYXNlIG9mIGZhaWx1cmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQm9vdHN0cmFwU3RhY2tWZXJzaW9uKFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIHJlcXVpcmVzQm9vdHN0cmFwU3RhY2tWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgYm9vdHN0cmFwU3RhY2tWZXJzaW9uU3NtUGFyYW1ldGVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZW52UmVzb3VyY2VzOiBFbnZpcm9ubWVudFJlc291cmNlcyxcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVudlJlc291cmNlcy52YWxpZGF0ZVZlcnNpb24ocmVxdWlyZXNCb290c3RyYXBTdGFja1ZlcnNpb24sIGJvb3RzdHJhcFN0YWNrVmVyc2lvblNzbVBhcmFtZXRlcik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGAke3N0YWNrTmFtZX06ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVkUHVibGlzaGVyKGFzc2V0TWFuaWZlc3Q6IGNka19hc3NldHMuQXNzZXRNYW5pZmVzdCwgZW52OiBjeGFwaS5FbnZpcm9ubWVudCwgc3RhY2tOYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnB1Ymxpc2hlckNhY2hlLmdldChhc3NldE1hbmlmZXN0KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgY29uc3QgcHJlZml4ID0gc3RhY2tOYW1lID8gYCR7Y2hhbGsuYm9sZChzdGFja05hbWUpfTogYCA6ICcnO1xuICAgIGNvbnN0IHB1Ymxpc2hlciA9IG5ldyBjZGtfYXNzZXRzLkFzc2V0UHVibGlzaGluZyhhc3NldE1hbmlmZXN0LCB7XG4gICAgICAvLyBUaGUgQXNzZXRQdWJsaXNoaW5nIGNsYXNzIHRha2VzIGNhcmUgb2Ygcm9sZSBhc3N1bWluZyBldGMsIHNvIGl0J3Mgb2theSB0b1xuICAgICAgLy8gZ2l2ZSBpdCBhIGRpcmVjdCBgU2RrUHJvdmlkZXJgLlxuICAgICAgYXdzOiBuZXcgUHVibGlzaGluZ0F3cyh0aGlzLmFzc2V0U2RrUHJvdmlkZXIsIGVudiksXG4gICAgICBwcm9ncmVzc0xpc3RlbmVyOiBuZXcgUGFyYWxsZWxTYWZlQXNzZXRQcm9ncmVzcyhwcmVmaXgsIHRoaXMuaW9IZWxwZXIpLFxuICAgIH0pO1xuICAgIHRoaXMucHVibGlzaGVyQ2FjaGUuc2V0KGFzc2V0TWFuaWZlc3QsIHB1Ymxpc2hlcik7XG4gICAgcmV0dXJuIHB1Ymxpc2hlcjtcbiAgfVxufVxuXG4vKipcbiAqIEFzc2V0IHByb2dyZXNzIHRoYXQgZG9lc24ndCBkbyBhbnl0aGluZyB3aXRoIHBlcmNlbnRhZ2VzIChjdXJyZW50bHkpXG4gKi9cbmNsYXNzIFBhcmFsbGVsU2FmZUFzc2V0UHJvZ3Jlc3MgZXh0ZW5kcyBCYXNlUHVibGlzaFByb2dyZXNzTGlzdGVuZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByZWZpeDogc3RyaW5nLCBpb0hlbHBlcjogSW9IZWxwZXIpIHtcbiAgICBzdXBlcihpb0hlbHBlcik7XG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TWVzc2FnZSh0eXBlOiBjZGtfYXNzZXRzLkV2ZW50VHlwZSwgZXZlbnQ6IGNka19hc3NldHMuSVB1Ymxpc2hQcm9ncmVzcyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fSR7dHlwZX06ICR7ZXZlbnQubWVzc2FnZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN1ZmZpeFdpdGhFcnJvcnMobXNnOiBzdHJpbmcsIGVycm9ycz86IHN0cmluZ1tdKSB7XG4gIHJldHVybiBlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDAgPyBgJHttc2d9OiAke2Vycm9ycy5qb2luKCcsICcpfWAgOiBtc2c7XG59XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.AssetManifestBuilder = exports.addMetadataAssetsToManifest = void 0;
|
|
18
|
+
__exportStar(require("./deployments"), exports);
|
|
19
|
+
__exportStar(require("./deployment-result"), exports);
|
|
20
|
+
__exportStar(require("./deployment-method"), exports);
|
|
21
|
+
// testing exports
|
|
22
|
+
__exportStar(require("./checks"), exports);
|
|
23
|
+
var assets_1 = require("./assets");
|
|
24
|
+
Object.defineProperty(exports, "addMetadataAssetsToManifest", { enumerable: true, get: function () { return assets_1.addMetadataAssetsToManifest; } });
|
|
25
|
+
var asset_manifest_builder_1 = require("./asset-manifest-builder");
|
|
26
|
+
Object.defineProperty(exports, "AssetManifestBuilder", { enumerable: true, get: function () { return asset_manifest_builder_1.AssetManifestBuilder; } });
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUE4QjtBQUM5QixzREFBb0M7QUFDcEMsc0RBQW9DO0FBRXBDLGtCQUFrQjtBQUNsQiwyQ0FBeUI7QUFDekIsbUNBQXVEO0FBQTlDLHFIQUFBLDJCQUEyQixPQUFBO0FBQ3BDLG1FQUFnRTtBQUF2RCw4SEFBQSxvQkFBb0IsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGVwbG95bWVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXBsb3ltZW50LXJlc3VsdCc7XG5leHBvcnQgKiBmcm9tICcuL2RlcGxveW1lbnQtbWV0aG9kJztcblxuLy8gdGVzdGluZyBleHBvcnRzXG5leHBvcnQgKiBmcm9tICcuL2NoZWNrcyc7XG5leHBvcnQgeyBhZGRNZXRhZGF0YUFzc2V0c1RvTWFuaWZlc3QgfSBmcm9tICcuL2Fzc2V0cyc7XG5leHBvcnQgeyBBc3NldE1hbmlmZXN0QnVpbGRlciB9IGZyb20gJy4vYXNzZXQtbWFuaWZlc3QtYnVpbGRlcic7XG4iXX0=
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { type TemplateDiff } from '@aws-cdk/cloudformation-diff';
|
|
2
|
+
import type * as cxapi from '@aws-cdk/cx-api';
|
|
3
|
+
import { PermissionChangeType } from '../../payloads';
|
|
4
|
+
import type { NestedStackTemplates } from '../cloudformation';
|
|
5
|
+
import type { IoHelper } from '../io/private';
|
|
6
|
+
/**
|
|
7
|
+
* Output of formatSecurityDiff
|
|
8
|
+
*/
|
|
9
|
+
interface FormatSecurityDiffOutput {
|
|
10
|
+
/**
|
|
11
|
+
* Complete formatted security diff
|
|
12
|
+
*/
|
|
13
|
+
readonly formattedDiff: string;
|
|
14
|
+
/**
|
|
15
|
+
* The type of permission changes in the security diff.
|
|
16
|
+
* The IoHost will use this to decide whether or not to print.
|
|
17
|
+
*/
|
|
18
|
+
readonly permissionChangeType: PermissionChangeType;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Output of formatStackDiff
|
|
22
|
+
*/
|
|
23
|
+
interface FormatStackDiffOutput {
|
|
24
|
+
/**
|
|
25
|
+
* Number of stacks with diff changes
|
|
26
|
+
*/
|
|
27
|
+
readonly numStacksWithChanges: number;
|
|
28
|
+
/**
|
|
29
|
+
* Complete formatted diff
|
|
30
|
+
*/
|
|
31
|
+
readonly formattedDiff: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Props for the Diff Formatter
|
|
35
|
+
*/
|
|
36
|
+
interface DiffFormatterProps {
|
|
37
|
+
/**
|
|
38
|
+
* Helper for the IoHost class
|
|
39
|
+
*/
|
|
40
|
+
readonly ioHelper: IoHelper;
|
|
41
|
+
/**
|
|
42
|
+
* The relevant information for the Template that is being diffed.
|
|
43
|
+
* Includes the old/current state of the stack as well as the new state.
|
|
44
|
+
*/
|
|
45
|
+
readonly templateInfo: TemplateInfo;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* PRoperties specific to formatting the stack diff
|
|
49
|
+
*/
|
|
50
|
+
interface FormatStackDiffOptions {
|
|
51
|
+
/**
|
|
52
|
+
* do not filter out AWS::CDK::Metadata or Rules
|
|
53
|
+
*
|
|
54
|
+
* @default false
|
|
55
|
+
*/
|
|
56
|
+
readonly strict?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* lines of context to use in arbitrary JSON diff
|
|
59
|
+
*
|
|
60
|
+
* @default 3
|
|
61
|
+
*/
|
|
62
|
+
readonly context?: number;
|
|
63
|
+
/**
|
|
64
|
+
* silences \'There were no differences\' messages
|
|
65
|
+
*
|
|
66
|
+
* @default false
|
|
67
|
+
*/
|
|
68
|
+
readonly quiet?: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Information on a template's old/new state
|
|
72
|
+
* that is used for diff.
|
|
73
|
+
*/
|
|
74
|
+
export interface TemplateInfo {
|
|
75
|
+
/**
|
|
76
|
+
* The old/existing template
|
|
77
|
+
*/
|
|
78
|
+
readonly oldTemplate: any;
|
|
79
|
+
/**
|
|
80
|
+
* The new template
|
|
81
|
+
*/
|
|
82
|
+
readonly newTemplate: cxapi.CloudFormationStackArtifact;
|
|
83
|
+
/**
|
|
84
|
+
* A CloudFormation ChangeSet to help the diff operation.
|
|
85
|
+
* Probably created via `createDiffChangeSet`.
|
|
86
|
+
*
|
|
87
|
+
* @default undefined
|
|
88
|
+
*/
|
|
89
|
+
readonly changeSet?: any;
|
|
90
|
+
/**
|
|
91
|
+
* Whether or not there are any imported resources
|
|
92
|
+
*
|
|
93
|
+
* @default false
|
|
94
|
+
*/
|
|
95
|
+
readonly isImport?: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Any nested stacks included in the template
|
|
98
|
+
*
|
|
99
|
+
* @default {}
|
|
100
|
+
*/
|
|
101
|
+
readonly nestedStacks?: {
|
|
102
|
+
[nestedStackLogicalId: string]: NestedStackTemplates;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Class for formatting the diff output
|
|
107
|
+
*/
|
|
108
|
+
export declare class DiffFormatter {
|
|
109
|
+
private readonly ioHelper;
|
|
110
|
+
private readonly oldTemplate;
|
|
111
|
+
private readonly newTemplate;
|
|
112
|
+
private readonly stackName;
|
|
113
|
+
private readonly changeSet?;
|
|
114
|
+
private readonly nestedStacks;
|
|
115
|
+
private readonly isImport;
|
|
116
|
+
/**
|
|
117
|
+
* Stores the TemplateDiffs that get calculated in this DiffFormatter,
|
|
118
|
+
* indexed by the stack name.
|
|
119
|
+
*/
|
|
120
|
+
private _diffs;
|
|
121
|
+
constructor(props: DiffFormatterProps);
|
|
122
|
+
get diffs(): {
|
|
123
|
+
[name: string]: TemplateDiff;
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Get or creates the diff of a stack.
|
|
127
|
+
* If it creates the diff, it stores the result in a map for
|
|
128
|
+
* easier retreval later.
|
|
129
|
+
*/
|
|
130
|
+
private diff;
|
|
131
|
+
/**
|
|
132
|
+
* Return whether the diff has security-impacting changes that need confirmation.
|
|
133
|
+
*
|
|
134
|
+
* If no stackName is given, then the root stack name is used.
|
|
135
|
+
*/
|
|
136
|
+
private permissionType;
|
|
137
|
+
/**
|
|
138
|
+
* Format the stack diff
|
|
139
|
+
*/
|
|
140
|
+
formatStackDiff(options?: FormatStackDiffOptions): FormatStackDiffOutput;
|
|
141
|
+
private formatStackDiffHelper;
|
|
142
|
+
/**
|
|
143
|
+
* Format the security diff
|
|
144
|
+
*/
|
|
145
|
+
formatSecurityDiff(): FormatSecurityDiffOutput;
|
|
146
|
+
}
|
|
147
|
+
export {};
|