aws-cdk 0.0.0
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/CONTRIBUTING.md +276 -0
- package/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +1274 -0
- package/THIRD_PARTY_LICENSES +26821 -0
- package/bin/cdk +6 -0
- package/build-info.json +4 -0
- package/db.json.gz +0 -0
- package/generate.sh +25 -0
- package/images/garbage-collection.png +0 -0
- package/lib/api/aws-auth/account-cache.d.ts +39 -0
- package/lib/api/aws-auth/account-cache.js +102 -0
- package/lib/api/aws-auth/awscli-compatible.d.ts +42 -0
- package/lib/api/aws-auth/awscli-compatible.js +264 -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 +36 -0
- package/lib/api/aws-auth/credential-plugins.js +153 -0
- package/lib/api/aws-auth/index.d.ts +3 -0
- package/lib/api/aws-auth/index.js +20 -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/sdk-logger.d.ts +69 -0
- package/lib/api/aws-auth/sdk-logger.js +130 -0
- package/lib/api/aws-auth/sdk-provider.d.ts +207 -0
- package/lib/api/aws-auth/sdk-provider.js +359 -0
- package/lib/api/aws-auth/sdk.d.ts +223 -0
- package/lib/api/aws-auth/sdk.js +366 -0
- package/lib/api/aws-auth/tracing.d.ts +11 -0
- package/lib/api/aws-auth/tracing.js +61 -0
- package/lib/api/aws-auth/user-agent.d.ts +7 -0
- package/lib/api/aws-auth/user-agent.js +21 -0
- package/lib/api/aws-auth/util.d.ts +6 -0
- package/lib/api/aws-auth/util.js +23 -0
- package/lib/api/bootstrap/bootstrap-environment.d.ts +33 -0
- package/lib/api/bootstrap/bootstrap-environment.js +322 -0
- package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
- package/lib/api/bootstrap/bootstrap-props.js +14 -0
- package/lib/api/bootstrap/bootstrap-template.yaml +692 -0
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +37 -0
- package/lib/api/bootstrap/deploy-bootstrap.js +143 -0
- package/lib/api/bootstrap/index.d.ts +2 -0
- package/lib/api/bootstrap/index.js +19 -0
- package/lib/api/bootstrap/legacy-template.d.ts +2 -0
- package/lib/api/bootstrap/legacy-template.js +82 -0
- package/lib/api/context.d.ts +40 -0
- package/lib/api/context.js +82 -0
- package/lib/api/cxapp/cloud-assembly.d.ts +150 -0
- package/lib/api/cxapp/cloud-assembly.js +305 -0
- package/lib/api/cxapp/cloud-executable.d.ts +44 -0
- package/lib/api/cxapp/cloud-executable.js +90 -0
- package/lib/api/cxapp/environments.d.ts +9 -0
- package/lib/api/cxapp/environments.js +66 -0
- package/lib/api/cxapp/exec.d.ts +56 -0
- package/lib/api/cxapp/exec.js +275 -0
- package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
- package/lib/api/deployments/asset-manifest-builder.js +35 -0
- package/lib/api/deployments/asset-publishing.d.ts +77 -0
- package/lib/api/deployments/asset-publishing.js +163 -0
- package/lib/api/deployments/assets.d.ts +10 -0
- package/lib/api/deployments/assets.js +111 -0
- package/lib/api/deployments/checks.d.ts +8 -0
- package/lib/api/deployments/checks.js +73 -0
- package/lib/api/deployments/cloudformation.d.ts +235 -0
- package/lib/api/deployments/cloudformation.js +598 -0
- package/lib/api/deployments/deploy-stack.d.ts +177 -0
- package/lib/api/deployments/deploy-stack.js +484 -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 +340 -0
- package/lib/api/deployments/deployments.js +369 -0
- package/lib/api/deployments/hotswap-deployments.d.ts +14 -0
- package/lib/api/deployments/hotswap-deployments.js +357 -0
- package/lib/api/deployments/index.d.ts +6 -0
- package/lib/api/deployments/index.js +23 -0
- package/lib/api/deployments/nested-stack-helpers.d.ts +25 -0
- package/lib/api/deployments/nested-stack-helpers.js +88 -0
- package/lib/api/environment-access.d.ts +138 -0
- package/lib/api/environment-access.js +203 -0
- package/lib/api/environment-resources.d.ts +73 -0
- package/lib/api/environment-resources.js +208 -0
- package/lib/api/evaluate-cloudformation-template.d.ts +84 -0
- package/lib/api/evaluate-cloudformation-template.js +443 -0
- package/lib/api/garbage-collection/garbage-collector.d.ts +152 -0
- package/lib/api/garbage-collection/garbage-collector.js +607 -0
- package/lib/api/garbage-collection/progress-printer.d.ts +21 -0
- package/lib/api/garbage-collection/progress-printer.js +69 -0
- package/lib/api/garbage-collection/stack-refresh.d.ts +44 -0
- package/lib/api/garbage-collection/stack-refresh.js +154 -0
- package/lib/api/hotswap/appsync-mapping-templates.d.ts +3 -0
- package/lib/api/hotswap/appsync-mapping-templates.js +157 -0
- package/lib/api/hotswap/code-build-projects.d.ts +3 -0
- package/lib/api/hotswap/code-build-projects.js +55 -0
- package/lib/api/hotswap/common.d.ts +126 -0
- package/lib/api/hotswap/common.js +170 -0
- package/lib/api/hotswap/ecs-services.d.ts +3 -0
- package/lib/api/hotswap/ecs-services.js +140 -0
- package/lib/api/hotswap/lambda-functions.d.ts +3 -0
- package/lib/api/hotswap/lambda-functions.js +309 -0
- package/lib/api/hotswap/s3-bucket-deployments.d.ts +9 -0
- package/lib/api/hotswap/s3-bucket-deployments.js +112 -0
- package/lib/api/hotswap/stepfunctions-state-machines.d.ts +3 -0
- package/lib/api/hotswap/stepfunctions-state-machines.js +42 -0
- package/lib/api/index.d.ts +5 -0
- package/lib/api/index.js +22 -0
- package/lib/api/logs/find-cloudwatch-logs.d.ts +24 -0
- package/lib/api/logs/find-cloudwatch-logs.js +97 -0
- package/lib/api/logs/logs-monitor.d.ts +53 -0
- package/lib/api/logs/logs-monitor.js +169 -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 +63 -0
- package/lib/api/plugin/plugin.js +106 -0
- package/lib/api/settings.d.ts +29 -0
- package/lib/api/settings.js +141 -0
- package/lib/api/tags.d.ts +9 -0
- package/lib/api/tags.js +10 -0
- package/lib/api/toolkit-info.d.ts +51 -0
- package/lib/api/toolkit-info.js +156 -0
- package/lib/api/util/cloudformation/stack-activity-monitor.d.ts +237 -0
- package/lib/api/util/cloudformation/stack-activity-monitor.js +550 -0
- package/lib/api/util/cloudformation/stack-event-poller.d.ts +63 -0
- package/lib/api/util/cloudformation/stack-event-poller.js +129 -0
- package/lib/api/util/cloudformation/stack-status.d.ts +42 -0
- package/lib/api/util/cloudformation/stack-status.js +88 -0
- package/lib/api/util/display.d.ts +13 -0
- package/lib/api/util/display.js +80 -0
- package/lib/api/util/placeholders.d.ts +10 -0
- package/lib/api/util/placeholders.js +24 -0
- package/lib/api/util/rwlock.d.ts +65 -0
- package/lib/api/util/rwlock.js +179 -0
- package/lib/api/util/string-manipulation.d.ts +10 -0
- package/lib/api/util/string-manipulation.js +33 -0
- package/lib/api/util/template-body-parameter.d.ts +21 -0
- package/lib/api/util/template-body-parameter.js +104 -0
- package/lib/cli/cdk-toolkit.d.ts +594 -0
- package/lib/cli/cdk-toolkit.js +1019 -0
- package/lib/cli/cli-config.d.ts +10 -0
- package/lib/cli/cli-config.js +406 -0
- package/lib/cli/cli.d.ts +4 -0
- package/lib/cli/cli.js +538 -0
- package/lib/cli/convert-to-user-input.d.ts +3 -0
- package/lib/cli/convert-to-user-input.js +434 -0
- package/lib/cli/parse-command-line-arguments.d.ts +1 -0
- package/lib/cli/parse-command-line-arguments.js +806 -0
- package/lib/cli/platform-warnings.d.ts +2 -0
- package/lib/cli/platform-warnings.js +45 -0
- package/lib/cli/user-configuration.d.ts +90 -0
- package/lib/cli/user-configuration.js +272 -0
- package/lib/cli/user-input.d.ts +1163 -0
- package/lib/cli/user-input.js +3 -0
- package/lib/cli/util/console-formatters.d.ts +18 -0
- package/lib/cli/util/console-formatters.js +42 -0
- package/lib/cli/util/npm.d.ts +1 -0
- package/lib/cli/util/npm.js +22 -0
- package/lib/cli/util/yargs-helpers.d.ts +22 -0
- package/lib/cli/util/yargs-helpers.js +49 -0
- package/lib/cli/version.d.ts +13 -0
- package/lib/cli/version.js +120 -0
- package/lib/commands/context.d.ts +35 -0
- package/lib/commands/context.js +156 -0
- package/lib/commands/docs.d.ts +13 -0
- package/lib/commands/docs.js +32 -0
- package/lib/commands/doctor.d.ts +1 -0
- package/lib/commands/doctor.js +69 -0
- package/lib/commands/migrate.d.ts +327 -0
- package/lib/commands/migrate.js +804 -0
- package/lib/context-providers/ami.d.ts +11 -0
- package/lib/context-providers/ami.js +50 -0
- package/lib/context-providers/availability-zones.d.ts +11 -0
- package/lib/context-providers/availability-zones.js +27 -0
- package/lib/context-providers/endpoint-service-availability-zones.d.ts +11 -0
- package/lib/context-providers/endpoint-service-availability-zones.js +33 -0
- package/lib/context-providers/hosted-zones.d.ts +10 -0
- package/lib/context-providers/hosted-zones.js +67 -0
- package/lib/context-providers/index.d.ts +30 -0
- package/lib/context-providers/index.js +109 -0
- package/lib/context-providers/keys.d.ts +11 -0
- package/lib/context-providers/keys.js +52 -0
- package/lib/context-providers/load-balancers.d.ts +20 -0
- package/lib/context-providers/load-balancers.js +159 -0
- package/lib/context-providers/security-groups.d.ts +9 -0
- package/lib/context-providers/security-groups.js +70 -0
- package/lib/context-providers/ssm-parameters.d.ts +23 -0
- package/lib/context-providers/ssm-parameters.js +59 -0
- package/lib/context-providers/vpcs.d.ts +11 -0
- package/lib/context-providers/vpcs.js +288 -0
- package/lib/diff.d.ts +28 -0
- package/lib/diff.js +165 -0
- package/lib/import.d.ts +182 -0
- package/lib/import.js +335 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +348304 -0
- package/lib/index_bg.wasm +0 -0
- package/lib/init-hooks.d.ts +40 -0
- package/lib/init-hooks.js +64 -0
- package/lib/init-templates/.init-version.json +1 -0
- package/lib/init-templates/.no-packagejson-validator +0 -0
- package/lib/init-templates/.recommended-feature-flags.json +68 -0
- package/lib/init-templates/LICENSE +16 -0
- package/lib/init-templates/app/csharp/.template.gitignore +342 -0
- package/lib/init-templates/app/csharp/README.md +14 -0
- package/lib/init-templates/app/csharp/cdk.template.json +15 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +13 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/Program.template.cs +44 -0
- package/lib/init-templates/app/csharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/app/fsharp/.template.gitignore +342 -0
- package/lib/init-templates/app/fsharp/README.md +18 -0
- package/lib/init-templates/app/fsharp/cdk.template.json +14 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +8 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/app/go/%name%.template.go +70 -0
- package/lib/init-templates/app/go/%name%_test.template.go +26 -0
- package/lib/init-templates/app/go/.template.gitignore +19 -0
- package/lib/init-templates/app/go/README.md +12 -0
- package/lib/init-templates/app/go/cdk.template.json +13 -0
- package/lib/init-templates/app/go/go.template.mod +9 -0
- package/lib/init-templates/app/info.json +4 -0
- package/lib/init-templates/app/java/.template.gitignore +13 -0
- package/lib/init-templates/app/java/README.md +18 -0
- package/lib/init-templates/app/java/cdk.json +13 -0
- package/lib/init-templates/app/java/pom.xml +60 -0
- package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +42 -0
- package/lib/init-templates/app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +24 -0
- package/lib/init-templates/app/java/src/test/java/com/myorg/%name.PascalCased%Test.template.java +26 -0
- package/lib/init-templates/app/javascript/.template.gitignore +5 -0
- package/lib/init-templates/app/javascript/.template.npmignore +3 -0
- package/lib/init-templates/app/javascript/README.md +12 -0
- package/lib/init-templates/app/javascript/bin/%name%.template.js +21 -0
- package/lib/init-templates/app/javascript/cdk.template.json +15 -0
- package/lib/init-templates/app/javascript/jest.config.js +3 -0
- package/lib/init-templates/app/javascript/lib/%name%-stack.template.js +23 -0
- package/lib/init-templates/app/javascript/package.json +20 -0
- package/lib/init-templates/app/javascript/test/%name%.test.template.js +17 -0
- package/lib/init-templates/app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +19 -0
- package/lib/init-templates/app/python/%name.PythonModule%/__init__.py +0 -0
- package/lib/init-templates/app/python/.template.gitignore +10 -0
- package/lib/init-templates/app/python/README.template.md +58 -0
- package/lib/init-templates/app/python/app.template.py +28 -0
- package/lib/init-templates/app/python/cdk.template.json +15 -0
- package/lib/init-templates/app/python/requirements-dev.txt +1 -0
- package/lib/init-templates/app/python/requirements.txt +2 -0
- package/lib/init-templates/app/python/source.bat +13 -0
- package/lib/init-templates/app/python/tests/__init__.py +0 -0
- package/lib/init-templates/app/python/tests/unit/__init__.py +0 -0
- package/lib/init-templates/app/python/tests/unit/test_%name.PythonModule%_stack.template.py +15 -0
- package/lib/init-templates/app/typescript/.template.gitignore +8 -0
- package/lib/init-templates/app/typescript/.template.npmignore +6 -0
- package/lib/init-templates/app/typescript/README.md +14 -0
- package/lib/init-templates/app/typescript/bin/%name%.template.ts +20 -0
- package/lib/init-templates/app/typescript/cdk.template.json +17 -0
- package/lib/init-templates/app/typescript/jest.config.js +8 -0
- package/lib/init-templates/app/typescript/lib/%name%-stack.template.ts +16 -0
- package/lib/init-templates/app/typescript/package.json +26 -0
- package/lib/init-templates/app/typescript/test/%name%.test.template.ts +17 -0
- package/lib/init-templates/app/typescript/tsconfig.json +31 -0
- package/lib/init-templates/lib/info.json +4 -0
- package/lib/init-templates/lib/typescript/.template.gitignore +8 -0
- package/lib/init-templates/lib/typescript/.template.npmignore +6 -0
- package/lib/init-templates/lib/typescript/README.template.md +12 -0
- package/lib/init-templates/lib/typescript/jest.config.js +8 -0
- package/lib/init-templates/lib/typescript/lib/index.template.ts +21 -0
- package/lib/init-templates/lib/typescript/package.json +24 -0
- package/lib/init-templates/lib/typescript/test/%name%.test.template.ts +18 -0
- package/lib/init-templates/lib/typescript/tsconfig.json +31 -0
- package/lib/init-templates/sample-app/csharp/.template.gitignore +342 -0
- package/lib/init-templates/sample-app/csharp/README.template.md +19 -0
- package/lib/init-templates/sample-app/csharp/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +20 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.cs +24 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/GlobalSuppressions.cs +1 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/Program.template.cs +15 -0
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/sample-app/fsharp/.template.gitignore +342 -0
- package/lib/init-templates/sample-app/fsharp/README.template.md +20 -0
- package/lib/init-templates/sample-app/fsharp/cdk.template.json +14 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +25 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%Stack.template.fs +14 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/Program.template.fs +11 -0
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%.template.sln +18 -0
- package/lib/init-templates/sample-app/go/%name%.template.go +73 -0
- package/lib/init-templates/sample-app/go/%name%_test.template.go +25 -0
- package/lib/init-templates/sample-app/go/.template.gitignore +19 -0
- package/lib/init-templates/sample-app/go/README.md +12 -0
- package/lib/init-templates/sample-app/go/cdk.template.json +13 -0
- package/lib/init-templates/sample-app/go/go.template.mod +9 -0
- package/lib/init-templates/sample-app/info.json +4 -0
- package/lib/init-templates/sample-app/java/.template.gitignore +13 -0
- package/lib/init-templates/sample-app/java/README.template.md +19 -0
- package/lib/init-templates/sample-app/java/cdk.json +13 -0
- package/lib/init-templates/sample-app/java/pom.xml +55 -0
- package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%App.template.java +13 -0
- package/lib/init-templates/sample-app/java/src/main/java/com/myorg/%name.PascalCased%Stack.template.java +29 -0
- package/lib/init-templates/sample-app/java/src/test/java/com/myorg/%name.PascalCased%StackTest.template.java +27 -0
- package/lib/init-templates/sample-app/javascript/.template.gitignore +5 -0
- package/lib/init-templates/sample-app/javascript/.template.npmignore +3 -0
- package/lib/init-templates/sample-app/javascript/README.template.md +13 -0
- package/lib/init-templates/sample-app/javascript/bin/%name%.template.js +6 -0
- package/lib/init-templates/sample-app/javascript/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/javascript/jest.config.js +3 -0
- package/lib/init-templates/sample-app/javascript/lib/%name%-stack.template.js +25 -0
- package/lib/init-templates/sample-app/javascript/package.json +20 -0
- package/lib/init-templates/sample-app/javascript/test/%name%.test.template.js +16 -0
- package/lib/init-templates/sample-app/javascript/tsconfig.json +34 -0
- package/lib/init-templates/sample-app/python/%name.PythonModule%/%name.PythonModule%_stack.template.py +26 -0
- package/lib/init-templates/sample-app/python/%name.PythonModule%/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/.template.gitignore +22 -0
- package/lib/init-templates/sample-app/python/README.template.md +65 -0
- package/lib/init-templates/sample-app/python/app.template.py +11 -0
- package/lib/init-templates/sample-app/python/cdk.template.json +15 -0
- package/lib/init-templates/sample-app/python/requirements-dev.txt +1 -0
- package/lib/init-templates/sample-app/python/requirements.txt +2 -0
- package/lib/init-templates/sample-app/python/source.bat +13 -0
- package/lib/init-templates/sample-app/python/tests/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/tests/unit/__init__.py +0 -0
- package/lib/init-templates/sample-app/python/tests/unit/test_%name.PythonModule%_stack.template.py +21 -0
- package/lib/init-templates/sample-app/typescript/.template.gitignore +8 -0
- package/lib/init-templates/sample-app/typescript/.template.npmignore +6 -0
- package/lib/init-templates/sample-app/typescript/README.template.md +15 -0
- package/lib/init-templates/sample-app/typescript/bin/%name%.template.ts +6 -0
- package/lib/init-templates/sample-app/typescript/cdk.template.json +17 -0
- package/lib/init-templates/sample-app/typescript/jest.config.js +8 -0
- package/lib/init-templates/sample-app/typescript/lib/%name%-stack.template.ts +19 -0
- package/lib/init-templates/sample-app/typescript/package.json +26 -0
- package/lib/init-templates/sample-app/typescript/test/%name%.test.template.ts +17 -0
- package/lib/init-templates/sample-app/typescript/tsconfig.json +31 -0
- package/lib/init.d.ts +52 -0
- package/lib/init.js +430 -0
- package/lib/legacy-exports-source.d.ts +27 -0
- package/lib/legacy-exports-source.js +88 -0
- package/lib/legacy-exports.d.ts +10 -0
- package/lib/legacy-exports.js +28 -0
- package/lib/legacy-logging-source.d.ts +32 -0
- package/lib/legacy-logging-source.js +107 -0
- package/lib/list-stacks.d.ts +22 -0
- package/lib/list-stacks.js +23 -0
- package/lib/logging.d.ts +109 -0
- package/lib/logging.js +159 -0
- package/lib/migrator.d.ts +25 -0
- package/lib/migrator.js +67 -0
- package/lib/notices.d.ts +156 -0
- package/lib/notices.js +373 -0
- package/lib/os.d.ts +7 -0
- package/lib/os.js +92 -0
- package/lib/serialize.d.ts +27 -0
- package/lib/serialize.js +86 -0
- package/lib/toolkit/cli-io-host.d.ts +208 -0
- package/lib/toolkit/cli-io-host.js +282 -0
- package/lib/toolkit/error.d.ts +44 -0
- package/lib/toolkit/error.js +78 -0
- package/lib/tree.d.ts +31 -0
- package/lib/tree.js +40 -0
- 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/content-hash.d.ts +5 -0
- package/lib/util/content-hash.js +43 -0
- package/lib/util/directories.d.ts +23 -0
- package/lib/util/directories.js +57 -0
- package/lib/util/error.d.ts +9 -0
- package/lib/util/error.js +22 -0
- package/lib/util/index.d.ts +5 -0
- package/lib/util/index.js +22 -0
- package/lib/util/objects.d.ts +52 -0
- package/lib/util/objects.js +183 -0
- package/lib/util/parallel.d.ts +6 -0
- package/lib/util/parallel.js +44 -0
- package/lib/util/tables.d.ts +1 -0
- package/lib/util/tables.js +10 -0
- package/lib/util/type-brands.d.ts +39 -0
- package/lib/util/type-brands.js +38 -0
- package/lib/util/types.d.ts +27 -0
- package/lib/util/types.js +25 -0
- package/lib/util/validate-notification-arn.d.ts +4 -0
- package/lib/util/validate-notification-arn.js +10 -0
- package/lib/util/version-range.d.ts +2 -0
- package/lib/util/version-range.js +36 -0
- package/lib/util/work-graph-builder.d.ts +32 -0
- package/lib/util/work-graph-builder.js +167 -0
- package/lib/util/work-graph-types.d.ts +50 -0
- package/lib/util/work-graph-types.js +14 -0
- package/lib/util/work-graph.d.ts +70 -0
- package/lib/util/work-graph.js +344 -0
- package/lib/util/yaml-cfn.d.ts +15 -0
- package/lib/util/yaml-cfn.js +56 -0
- package/package.json +197 -0
- package/scripts/user-input-gen +2 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deployStack = deployStack;
|
|
4
|
+
exports.destroyStack = destroyStack;
|
|
5
|
+
const chalk = require("chalk");
|
|
6
|
+
const uuid = require("uuid");
|
|
7
|
+
const asset_manifest_builder_1 = require("./asset-manifest-builder");
|
|
8
|
+
const asset_publishing_1 = require("./asset-publishing");
|
|
9
|
+
const assets_1 = require("./assets");
|
|
10
|
+
const checks_1 = require("./checks");
|
|
11
|
+
const cloudformation_1 = require("./cloudformation");
|
|
12
|
+
const hotswap_deployments_1 = require("./hotswap-deployments");
|
|
13
|
+
const logging_1 = require("../../logging");
|
|
14
|
+
const error_1 = require("../../toolkit/error");
|
|
15
|
+
const error_2 = require("../../util/error");
|
|
16
|
+
const evaluate_cloudformation_template_1 = require("../evaluate-cloudformation-template");
|
|
17
|
+
const common_1 = require("../hotswap/common");
|
|
18
|
+
const stack_activity_monitor_1 = require("../util/cloudformation/stack-activity-monitor");
|
|
19
|
+
const template_body_parameter_1 = require("../util/template-body-parameter");
|
|
20
|
+
async function deployStack(options) {
|
|
21
|
+
var _a, _b;
|
|
22
|
+
const stackArtifact = options.stack;
|
|
23
|
+
const stackEnv = options.resolvedEnvironment;
|
|
24
|
+
options.sdk.appendCustomUserAgent(options.extraUserAgent);
|
|
25
|
+
const cfn = options.sdk.cloudFormation();
|
|
26
|
+
const deployName = options.deployName || stackArtifact.stackName;
|
|
27
|
+
let cloudFormationStack = await cloudformation_1.CloudFormationStack.lookup(cfn, deployName);
|
|
28
|
+
if (cloudFormationStack.stackStatus.isCreationFailure) {
|
|
29
|
+
(0, logging_1.debug)(`Found existing stack ${deployName} that had previously failed creation. Deleting it before attempting to re-create it.`);
|
|
30
|
+
await cfn.deleteStack({ StackName: deployName });
|
|
31
|
+
const deletedStack = await (0, cloudformation_1.waitForStackDelete)(cfn, deployName);
|
|
32
|
+
if (deletedStack && deletedStack.stackStatus.name !== 'DELETE_COMPLETE') {
|
|
33
|
+
throw new error_1.ToolkitError(`Failed deleting stack ${deployName} that had previously failed creation (current state: ${deletedStack.stackStatus})`);
|
|
34
|
+
}
|
|
35
|
+
// Update variable to mark that the stack does not exist anymore, but avoid
|
|
36
|
+
// doing an actual lookup in CloudFormation (which would be silly to do if
|
|
37
|
+
// we just deleted it).
|
|
38
|
+
cloudFormationStack = cloudformation_1.CloudFormationStack.doesNotExist(cfn, deployName);
|
|
39
|
+
}
|
|
40
|
+
// Detect "legacy" assets (which remain in the metadata) and publish them via
|
|
41
|
+
// an ad-hoc asset manifest, while passing their locations via template
|
|
42
|
+
// parameters.
|
|
43
|
+
const legacyAssets = new asset_manifest_builder_1.AssetManifestBuilder();
|
|
44
|
+
const assetParams = await (0, assets_1.addMetadataAssetsToManifest)(stackArtifact, legacyAssets, options.envResources, options.reuseAssets);
|
|
45
|
+
const finalParameterValues = { ...options.parameters, ...assetParams };
|
|
46
|
+
const templateParams = cloudformation_1.TemplateParameters.fromTemplate(stackArtifact.template);
|
|
47
|
+
const stackParams = options.usePreviousParameters
|
|
48
|
+
? templateParams.updateExisting(finalParameterValues, cloudFormationStack.parameters)
|
|
49
|
+
: templateParams.supplyAll(finalParameterValues);
|
|
50
|
+
const hotswapMode = (_a = options.hotswap) !== null && _a !== void 0 ? _a : common_1.HotswapMode.FULL_DEPLOYMENT;
|
|
51
|
+
const hotswapPropertyOverrides = (_b = options.hotswapPropertyOverrides) !== null && _b !== void 0 ? _b : new common_1.HotswapPropertyOverrides();
|
|
52
|
+
if (await canSkipDeploy(options, cloudFormationStack, stackParams.hasChanges(cloudFormationStack.parameters))) {
|
|
53
|
+
(0, logging_1.debug)(`${deployName}: skipping deployment (use --force to override)`);
|
|
54
|
+
// if we can skip deployment and we are performing a hotswap, let the user know
|
|
55
|
+
// that no hotswap deployment happened
|
|
56
|
+
if (hotswapMode !== common_1.HotswapMode.FULL_DEPLOYMENT) {
|
|
57
|
+
(0, logging_1.info)(`\n ${common_1.ICON} %s\n`, chalk.bold('hotswap deployment skipped - no changes were detected (use --force to override)'));
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
type: 'did-deploy-stack',
|
|
61
|
+
noOp: true,
|
|
62
|
+
outputs: cloudFormationStack.outputs,
|
|
63
|
+
stackArn: cloudFormationStack.stackId,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
(0, logging_1.debug)(`${deployName}: deploying...`);
|
|
68
|
+
}
|
|
69
|
+
const bodyParameter = await (0, template_body_parameter_1.makeBodyParameter)(stackArtifact, options.resolvedEnvironment, legacyAssets, options.envResources, options.overrideTemplate);
|
|
70
|
+
let bootstrapStackName;
|
|
71
|
+
try {
|
|
72
|
+
bootstrapStackName = (await options.envResources.lookupToolkit()).stackName;
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
(0, logging_1.debug)(`Could not determine the bootstrap stack name: ${e}`);
|
|
76
|
+
}
|
|
77
|
+
await (0, asset_publishing_1.publishAssets)(legacyAssets.toManifest(stackArtifact.assembly.directory), options.sdkProvider, stackEnv, {
|
|
78
|
+
parallel: options.assetParallelism,
|
|
79
|
+
allowCrossAccount: await (0, checks_1.determineAllowCrossAccountAssetPublishing)(options.sdk, bootstrapStackName),
|
|
80
|
+
});
|
|
81
|
+
if (hotswapMode !== common_1.HotswapMode.FULL_DEPLOYMENT) {
|
|
82
|
+
// attempt to short-circuit the deployment if possible
|
|
83
|
+
try {
|
|
84
|
+
const hotswapDeploymentResult = await (0, hotswap_deployments_1.tryHotswapDeployment)(options.sdkProvider, stackParams.values, cloudFormationStack, stackArtifact, hotswapMode, hotswapPropertyOverrides);
|
|
85
|
+
if (hotswapDeploymentResult) {
|
|
86
|
+
return hotswapDeploymentResult;
|
|
87
|
+
}
|
|
88
|
+
(0, logging_1.info)('Could not perform a hotswap deployment, as the stack %s contains non-Asset changes', stackArtifact.displayName);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
if (!(e instanceof evaluate_cloudformation_template_1.CfnEvaluationException)) {
|
|
92
|
+
throw e;
|
|
93
|
+
}
|
|
94
|
+
(0, logging_1.info)('Could not perform a hotswap deployment, because the CloudFormation template could not be resolved: %s', (0, error_2.formatErrorMessage)(e));
|
|
95
|
+
}
|
|
96
|
+
if (hotswapMode === common_1.HotswapMode.FALL_BACK) {
|
|
97
|
+
(0, logging_1.info)('Falling back to doing a full deployment');
|
|
98
|
+
options.sdk.appendCustomUserAgent('cdk-hotswap/fallback');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
return {
|
|
102
|
+
type: 'did-deploy-stack',
|
|
103
|
+
noOp: true,
|
|
104
|
+
stackArn: cloudFormationStack.stackId,
|
|
105
|
+
outputs: cloudFormationStack.outputs,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// could not short-circuit the deployment, perform a full CFN deploy instead
|
|
110
|
+
const fullDeployment = new FullCloudFormationDeployment(options, cloudFormationStack, stackArtifact, stackParams, bodyParameter);
|
|
111
|
+
return fullDeployment.performDeployment();
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* This class shares state and functionality between the different full deployment modes
|
|
115
|
+
*/
|
|
116
|
+
class FullCloudFormationDeployment {
|
|
117
|
+
constructor(options, cloudFormationStack, stackArtifact, stackParams, bodyParameter) {
|
|
118
|
+
var _a;
|
|
119
|
+
this.options = options;
|
|
120
|
+
this.cloudFormationStack = cloudFormationStack;
|
|
121
|
+
this.stackArtifact = stackArtifact;
|
|
122
|
+
this.stackParams = stackParams;
|
|
123
|
+
this.bodyParameter = bodyParameter;
|
|
124
|
+
this.cfn = options.sdk.cloudFormation();
|
|
125
|
+
this.stackName = (_a = options.deployName) !== null && _a !== void 0 ? _a : stackArtifact.stackName;
|
|
126
|
+
this.update = cloudFormationStack.exists && cloudFormationStack.stackStatus.name !== 'REVIEW_IN_PROGRESS';
|
|
127
|
+
this.verb = this.update ? 'update' : 'create';
|
|
128
|
+
this.uuid = uuid.v4();
|
|
129
|
+
}
|
|
130
|
+
async performDeployment() {
|
|
131
|
+
var _a;
|
|
132
|
+
const deploymentMethod = (_a = this.options.deploymentMethod) !== null && _a !== void 0 ? _a : {
|
|
133
|
+
method: 'change-set',
|
|
134
|
+
};
|
|
135
|
+
if (deploymentMethod.method === 'direct' && this.options.resourcesToImport) {
|
|
136
|
+
throw new error_1.ToolkitError('Importing resources requires a changeset deployment');
|
|
137
|
+
}
|
|
138
|
+
switch (deploymentMethod.method) {
|
|
139
|
+
case 'change-set':
|
|
140
|
+
return this.changeSetDeployment(deploymentMethod);
|
|
141
|
+
case 'direct':
|
|
142
|
+
return this.directDeployment();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async changeSetDeployment(deploymentMethod) {
|
|
146
|
+
var _a, _b, _c, _d;
|
|
147
|
+
const changeSetName = (_a = deploymentMethod.changeSetName) !== null && _a !== void 0 ? _a : 'cdk-deploy-change-set';
|
|
148
|
+
const execute = (_b = deploymentMethod.execute) !== null && _b !== void 0 ? _b : true;
|
|
149
|
+
const importExistingResources = (_c = deploymentMethod.importExistingResources) !== null && _c !== void 0 ? _c : false;
|
|
150
|
+
const changeSetDescription = await this.createChangeSet(changeSetName, execute, importExistingResources);
|
|
151
|
+
await this.updateTerminationProtection();
|
|
152
|
+
if ((0, cloudformation_1.changeSetHasNoChanges)(changeSetDescription)) {
|
|
153
|
+
(0, logging_1.debug)('No changes are to be performed on %s.', this.stackName);
|
|
154
|
+
if (execute) {
|
|
155
|
+
(0, logging_1.debug)('Deleting empty change set %s', changeSetDescription.ChangeSetId);
|
|
156
|
+
await this.cfn.deleteChangeSet({
|
|
157
|
+
StackName: this.stackName,
|
|
158
|
+
ChangeSetName: changeSetName,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (this.options.force) {
|
|
162
|
+
(0, logging_1.warning)([
|
|
163
|
+
'You used the --force flag, but CloudFormation reported that the deployment would not make any changes.',
|
|
164
|
+
'According to CloudFormation, all resources are already up-to-date with the state in your CDK app.',
|
|
165
|
+
'',
|
|
166
|
+
'You cannot use the --force flag to get rid of changes you made in the console. Try using',
|
|
167
|
+
'CloudFormation drift detection instead: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html',
|
|
168
|
+
].join('\n'));
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
type: 'did-deploy-stack',
|
|
172
|
+
noOp: true,
|
|
173
|
+
outputs: this.cloudFormationStack.outputs,
|
|
174
|
+
stackArn: changeSetDescription.StackId,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (!execute) {
|
|
178
|
+
(0, logging_1.info)('Changeset %s created and waiting in review for manual execution (--no-execute)', changeSetDescription.ChangeSetId);
|
|
179
|
+
return {
|
|
180
|
+
type: 'did-deploy-stack',
|
|
181
|
+
noOp: false,
|
|
182
|
+
outputs: this.cloudFormationStack.outputs,
|
|
183
|
+
stackArn: changeSetDescription.StackId,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// If there are replacements in the changeset, check the rollback flag and stack status
|
|
187
|
+
const replacement = hasReplacement(changeSetDescription);
|
|
188
|
+
const isPausedFailState = this.cloudFormationStack.stackStatus.isRollbackable;
|
|
189
|
+
const rollback = (_d = this.options.rollback) !== null && _d !== void 0 ? _d : true;
|
|
190
|
+
if (isPausedFailState && replacement) {
|
|
191
|
+
return { type: 'failpaused-need-rollback-first', reason: 'replacement', status: this.cloudFormationStack.stackStatus.name };
|
|
192
|
+
}
|
|
193
|
+
if (isPausedFailState && rollback) {
|
|
194
|
+
return { type: 'failpaused-need-rollback-first', reason: 'not-norollback', status: this.cloudFormationStack.stackStatus.name };
|
|
195
|
+
}
|
|
196
|
+
if (!rollback && replacement) {
|
|
197
|
+
return { type: 'replacement-requires-rollback' };
|
|
198
|
+
}
|
|
199
|
+
return this.executeChangeSet(changeSetDescription);
|
|
200
|
+
}
|
|
201
|
+
async createChangeSet(changeSetName, willExecute, importExistingResources) {
|
|
202
|
+
await this.cleanupOldChangeset(changeSetName);
|
|
203
|
+
(0, logging_1.debug)(`Attempting to create ChangeSet with name ${changeSetName} to ${this.verb} stack ${this.stackName}`);
|
|
204
|
+
(0, logging_1.info)('%s: creating CloudFormation changeset...', chalk.bold(this.stackName));
|
|
205
|
+
const changeSet = await this.cfn.createChangeSet({
|
|
206
|
+
StackName: this.stackName,
|
|
207
|
+
ChangeSetName: changeSetName,
|
|
208
|
+
ChangeSetType: this.options.resourcesToImport ? 'IMPORT' : this.update ? 'UPDATE' : 'CREATE',
|
|
209
|
+
ResourcesToImport: this.options.resourcesToImport,
|
|
210
|
+
Description: `CDK Changeset for execution ${this.uuid}`,
|
|
211
|
+
ClientToken: `create${this.uuid}`,
|
|
212
|
+
ImportExistingResources: importExistingResources,
|
|
213
|
+
...this.commonPrepareOptions(),
|
|
214
|
+
});
|
|
215
|
+
(0, logging_1.debug)('Initiated creation of changeset: %s; waiting for it to finish creating...', changeSet.Id);
|
|
216
|
+
// Fetching all pages if we'll execute, so we can have the correct change count when monitoring.
|
|
217
|
+
return (0, cloudformation_1.waitForChangeSet)(this.cfn, this.stackName, changeSetName, {
|
|
218
|
+
fetchAll: willExecute,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
async executeChangeSet(changeSet) {
|
|
222
|
+
var _a;
|
|
223
|
+
(0, logging_1.debug)('Initiating execution of changeset %s on stack %s', changeSet.ChangeSetId, this.stackName);
|
|
224
|
+
await this.cfn.executeChangeSet({
|
|
225
|
+
StackName: this.stackName,
|
|
226
|
+
ChangeSetName: changeSet.ChangeSetName,
|
|
227
|
+
ClientRequestToken: `exec${this.uuid}`,
|
|
228
|
+
...this.commonExecuteOptions(),
|
|
229
|
+
});
|
|
230
|
+
(0, logging_1.debug)('Execution of changeset %s on stack %s has started; waiting for the update to complete...', changeSet.ChangeSetId, this.stackName);
|
|
231
|
+
// +1 for the extra event emitted from updates.
|
|
232
|
+
const changeSetLength = ((_a = changeSet.Changes) !== null && _a !== void 0 ? _a : []).length + (this.update ? 1 : 0);
|
|
233
|
+
return this.monitorDeployment(changeSet.CreationTime, changeSetLength);
|
|
234
|
+
}
|
|
235
|
+
async cleanupOldChangeset(changeSetName) {
|
|
236
|
+
if (this.cloudFormationStack.exists) {
|
|
237
|
+
// Delete any existing change sets generated by CDK since change set names must be unique.
|
|
238
|
+
// The delete request is successful as long as the stack exists (even if the change set does not exist).
|
|
239
|
+
(0, logging_1.debug)(`Removing existing change set with name ${changeSetName} if it exists`);
|
|
240
|
+
await this.cfn.deleteChangeSet({
|
|
241
|
+
StackName: this.stackName,
|
|
242
|
+
ChangeSetName: changeSetName,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async updateTerminationProtection() {
|
|
247
|
+
var _a;
|
|
248
|
+
// Update termination protection only if it has changed.
|
|
249
|
+
const terminationProtection = (_a = this.stackArtifact.terminationProtection) !== null && _a !== void 0 ? _a : false;
|
|
250
|
+
if (!!this.cloudFormationStack.terminationProtection !== terminationProtection) {
|
|
251
|
+
(0, logging_1.debug)('Updating termination protection from %s to %s for stack %s', this.cloudFormationStack.terminationProtection, terminationProtection, this.stackName);
|
|
252
|
+
await this.cfn.updateTerminationProtection({
|
|
253
|
+
StackName: this.stackName,
|
|
254
|
+
EnableTerminationProtection: terminationProtection,
|
|
255
|
+
});
|
|
256
|
+
(0, logging_1.debug)('Termination protection updated to %s for stack %s', terminationProtection, this.stackName);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async directDeployment() {
|
|
260
|
+
var _a;
|
|
261
|
+
(0, logging_1.info)('%s: %s stack...', chalk.bold(this.stackName), this.update ? 'updating' : 'creating');
|
|
262
|
+
const startTime = new Date();
|
|
263
|
+
if (this.update) {
|
|
264
|
+
await this.updateTerminationProtection();
|
|
265
|
+
try {
|
|
266
|
+
await this.cfn.updateStack({
|
|
267
|
+
StackName: this.stackName,
|
|
268
|
+
ClientRequestToken: `update${this.uuid}`,
|
|
269
|
+
...this.commonPrepareOptions(),
|
|
270
|
+
...this.commonExecuteOptions(),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
if (err.message === 'No updates are to be performed.') {
|
|
275
|
+
(0, logging_1.debug)('No updates are to be performed for stack %s', this.stackName);
|
|
276
|
+
return {
|
|
277
|
+
type: 'did-deploy-stack',
|
|
278
|
+
noOp: true,
|
|
279
|
+
outputs: this.cloudFormationStack.outputs,
|
|
280
|
+
stackArn: this.cloudFormationStack.stackId,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
throw err;
|
|
284
|
+
}
|
|
285
|
+
return this.monitorDeployment(startTime, undefined);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
// Take advantage of the fact that we can set termination protection during create
|
|
289
|
+
const terminationProtection = (_a = this.stackArtifact.terminationProtection) !== null && _a !== void 0 ? _a : false;
|
|
290
|
+
await this.cfn.createStack({
|
|
291
|
+
StackName: this.stackName,
|
|
292
|
+
ClientRequestToken: `create${this.uuid}`,
|
|
293
|
+
...(terminationProtection ? { EnableTerminationProtection: true } : undefined),
|
|
294
|
+
...this.commonPrepareOptions(),
|
|
295
|
+
...this.commonExecuteOptions(),
|
|
296
|
+
});
|
|
297
|
+
return this.monitorDeployment(startTime, undefined);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
async monitorDeployment(startTime, expectedChanges) {
|
|
301
|
+
const monitor = this.options.quiet
|
|
302
|
+
? undefined
|
|
303
|
+
: stack_activity_monitor_1.StackActivityMonitor.withDefaultPrinter(this.cfn, this.stackName, this.stackArtifact, {
|
|
304
|
+
resourcesTotal: expectedChanges,
|
|
305
|
+
progress: this.options.progress,
|
|
306
|
+
changeSetCreationTime: startTime,
|
|
307
|
+
ci: this.options.ci,
|
|
308
|
+
}).start();
|
|
309
|
+
let finalState = this.cloudFormationStack;
|
|
310
|
+
try {
|
|
311
|
+
const successStack = await (0, cloudformation_1.waitForStackDeploy)(this.cfn, this.stackName);
|
|
312
|
+
// This shouldn't really happen, but catch it anyway. You never know.
|
|
313
|
+
if (!successStack) {
|
|
314
|
+
throw new error_1.ToolkitError('Stack deploy failed (the stack disappeared while we were deploying it)');
|
|
315
|
+
}
|
|
316
|
+
finalState = successStack;
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
throw new error_1.ToolkitError(suffixWithErrors((0, error_2.formatErrorMessage)(e), monitor === null || monitor === void 0 ? void 0 : monitor.errors));
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
await (monitor === null || monitor === void 0 ? void 0 : monitor.stop());
|
|
323
|
+
}
|
|
324
|
+
(0, logging_1.debug)('Stack %s has completed updating', this.stackName);
|
|
325
|
+
return {
|
|
326
|
+
type: 'did-deploy-stack',
|
|
327
|
+
noOp: false,
|
|
328
|
+
outputs: finalState.outputs,
|
|
329
|
+
stackArn: finalState.stackId,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Return the options that are shared between CreateStack, UpdateStack and CreateChangeSet
|
|
334
|
+
*/
|
|
335
|
+
commonPrepareOptions() {
|
|
336
|
+
return {
|
|
337
|
+
Capabilities: ['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND'],
|
|
338
|
+
NotificationARNs: this.options.notificationArns,
|
|
339
|
+
Parameters: this.stackParams.apiParameters,
|
|
340
|
+
RoleARN: this.options.roleArn,
|
|
341
|
+
TemplateBody: this.bodyParameter.TemplateBody,
|
|
342
|
+
TemplateURL: this.bodyParameter.TemplateURL,
|
|
343
|
+
Tags: this.options.tags,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Return the options that are shared between UpdateStack and CreateChangeSet
|
|
348
|
+
*
|
|
349
|
+
* Be careful not to add in keys for options that aren't used, as the features may not have been
|
|
350
|
+
* deployed everywhere yet.
|
|
351
|
+
*/
|
|
352
|
+
commonExecuteOptions() {
|
|
353
|
+
const shouldDisableRollback = this.options.rollback === false;
|
|
354
|
+
return {
|
|
355
|
+
StackName: this.stackName,
|
|
356
|
+
...(shouldDisableRollback ? { DisableRollback: true } : undefined),
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
async function destroyStack(options) {
|
|
361
|
+
const deployName = options.deployName || options.stack.stackName;
|
|
362
|
+
const cfn = options.sdk.cloudFormation();
|
|
363
|
+
const currentStack = await cloudformation_1.CloudFormationStack.lookup(cfn, deployName);
|
|
364
|
+
if (!currentStack.exists) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const monitor = options.quiet
|
|
368
|
+
? undefined
|
|
369
|
+
: stack_activity_monitor_1.StackActivityMonitor.withDefaultPrinter(cfn, deployName, options.stack, {
|
|
370
|
+
ci: options.ci,
|
|
371
|
+
}).start();
|
|
372
|
+
try {
|
|
373
|
+
await cfn.deleteStack({ StackName: deployName, RoleARN: options.roleArn });
|
|
374
|
+
const destroyedStack = await (0, cloudformation_1.waitForStackDelete)(cfn, deployName);
|
|
375
|
+
if (destroyedStack && destroyedStack.stackStatus.name !== 'DELETE_COMPLETE') {
|
|
376
|
+
throw new error_1.ToolkitError(`Failed to destroy ${deployName}: ${destroyedStack.stackStatus}`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
catch (e) {
|
|
380
|
+
throw new error_1.ToolkitError(suffixWithErrors((0, error_2.formatErrorMessage)(e), monitor === null || monitor === void 0 ? void 0 : monitor.errors));
|
|
381
|
+
}
|
|
382
|
+
finally {
|
|
383
|
+
if (monitor) {
|
|
384
|
+
await monitor.stop();
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Checks whether we can skip deployment
|
|
390
|
+
*
|
|
391
|
+
* We do this in a complicated way by preprocessing (instead of just
|
|
392
|
+
* looking at the changeset), because if there are nested stacks involved
|
|
393
|
+
* the changeset will always show the nested stacks as needing to be
|
|
394
|
+
* updated, and the deployment will take a long time to in effect not
|
|
395
|
+
* do anything.
|
|
396
|
+
*/
|
|
397
|
+
async function canSkipDeploy(deployStackOptions, cloudFormationStack, parameterChanges) {
|
|
398
|
+
var _a, _b, _c;
|
|
399
|
+
const deployName = deployStackOptions.deployName || deployStackOptions.stack.stackName;
|
|
400
|
+
(0, logging_1.debug)(`${deployName}: checking if we can skip deploy`);
|
|
401
|
+
// Forced deploy
|
|
402
|
+
if (deployStackOptions.force) {
|
|
403
|
+
(0, logging_1.debug)(`${deployName}: forced deployment`);
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
// Creating changeset only (default true), never skip
|
|
407
|
+
if (((_a = deployStackOptions.deploymentMethod) === null || _a === void 0 ? void 0 : _a.method) === 'change-set' &&
|
|
408
|
+
deployStackOptions.deploymentMethod.execute === false) {
|
|
409
|
+
(0, logging_1.debug)(`${deployName}: --no-execute, always creating change set`);
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
// No existing stack
|
|
413
|
+
if (!cloudFormationStack.exists) {
|
|
414
|
+
(0, logging_1.debug)(`${deployName}: no existing stack`);
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
// Template has changed (assets taken into account here)
|
|
418
|
+
if (JSON.stringify(deployStackOptions.stack.template) !== JSON.stringify(await cloudFormationStack.template())) {
|
|
419
|
+
(0, logging_1.debug)(`${deployName}: template has changed`);
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
// Tags have changed
|
|
423
|
+
if (!compareTags(cloudFormationStack.tags, (_b = deployStackOptions.tags) !== null && _b !== void 0 ? _b : [])) {
|
|
424
|
+
(0, logging_1.debug)(`${deployName}: tags have changed`);
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
// Notification arns have changed
|
|
428
|
+
if (!arrayEquals(cloudFormationStack.notificationArns, (_c = deployStackOptions.notificationArns) !== null && _c !== void 0 ? _c : [])) {
|
|
429
|
+
(0, logging_1.debug)(`${deployName}: notification arns have changed`);
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
// Termination protection has been updated
|
|
433
|
+
if (!!deployStackOptions.stack.terminationProtection !== !!cloudFormationStack.terminationProtection) {
|
|
434
|
+
(0, logging_1.debug)(`${deployName}: termination protection has been updated`);
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
// Parameters have changed
|
|
438
|
+
if (parameterChanges) {
|
|
439
|
+
if (parameterChanges === 'ssm') {
|
|
440
|
+
(0, logging_1.debug)(`${deployName}: some parameters come from SSM so we have to assume they may have changed`);
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
(0, logging_1.debug)(`${deployName}: parameters have changed`);
|
|
444
|
+
}
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
// Existing stack is in a failed state
|
|
448
|
+
if (cloudFormationStack.stackStatus.isFailure) {
|
|
449
|
+
(0, logging_1.debug)(`${deployName}: stack is in a failure state`);
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
// We can skip deploy
|
|
453
|
+
return true;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Compares two list of tags, returns true if identical.
|
|
457
|
+
*/
|
|
458
|
+
function compareTags(a, b) {
|
|
459
|
+
if (a.length !== b.length) {
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
for (const aTag of a) {
|
|
463
|
+
const bTag = b.find((tag) => tag.Key === aTag.Key);
|
|
464
|
+
if (!bTag || bTag.Value !== aTag.Value) {
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return true;
|
|
469
|
+
}
|
|
470
|
+
function suffixWithErrors(msg, errors) {
|
|
471
|
+
return errors && errors.length > 0 ? `${msg}: ${errors.join(', ')}` : msg;
|
|
472
|
+
}
|
|
473
|
+
function arrayEquals(a, b) {
|
|
474
|
+
return a.every((item) => b.includes(item)) && b.every((item) => a.includes(item));
|
|
475
|
+
}
|
|
476
|
+
function hasReplacement(cs) {
|
|
477
|
+
var _a;
|
|
478
|
+
return ((_a = cs.Changes) !== null && _a !== void 0 ? _a : []).some(c => {
|
|
479
|
+
var _a;
|
|
480
|
+
const a = (_a = c.ResourceChange) === null || _a === void 0 ? void 0 : _a.PolicyAction;
|
|
481
|
+
return a === 'ReplaceAndDelete' || a === 'ReplaceAndRetain' || a === 'ReplaceAndSnapshot';
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95LXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBK05BLGtDQXVJQztBQTJURCxvQ0EyQkM7QUFuckJELCtCQUErQjtBQUMvQiw2QkFBNkI7QUFDN0IscUVBQWdFO0FBQ2hFLHlEQUFtRDtBQUNuRCxxQ0FBdUQ7QUFDdkQscUNBQXFFO0FBQ3JFLHFEQVUwQjtBQUcxQiwrREFBNkQ7QUFDN0QsMkNBQXFEO0FBQ3JELCtDQUFtRDtBQUNuRCw0Q0FBc0Q7QUFHdEQsMEZBQTZFO0FBQzdFLDhDQUFnRjtBQUNoRiwwRkFBaUg7QUFFakgsNkVBQWdHO0FBeUx6RixLQUFLLFVBQVUsV0FBVyxDQUFDLE9BQTJCOztJQUMzRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBRXBDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztJQUU3QyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNqRSxJQUFJLG1CQUFtQixHQUFHLE1BQU0sb0NBQW1CLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUU1RSxJQUFJLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RELElBQUEsZUFBSyxFQUNILHdCQUF3QixVQUFVLHNGQUFzRixDQUN6SCxDQUFDO1FBQ0YsTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDakQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFB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TUFBTSxDQUFDLEdBQUcsTUFBQSxDQUFDLENBQUMsY0FBYywwQ0FBRSxZQUFZLENBQUM7UUFDekMsT0FBTyxDQUFDLEtBQUssa0JBQWtCLElBQUksQ0FBQyxLQUFLLGtCQUFrQixJQUFJLENBQUMsS0FBSyxvQkFBb0IsQ0FBQztJQUM1RixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHR5cGUge1xuICBDcmVhdGVDaGFuZ2VTZXRDb21tYW5kSW5wdXQsXG4gIENyZWF0ZVN0YWNrQ29tbWFuZElucHV0LFxuICBEZXNjcmliZUNoYW5nZVNldENvbW1hbmRPdXRwdXQsXG4gIEV4ZWN1dGVDaGFuZ2VTZXRDb21tYW5kSW5wdXQsXG4gIFVwZGF0ZVN0YWNrQ29tbWFuZElucHV0LFxuICBUYWcsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgQXNzZXRNYW5pZmVzdEJ1aWxkZXIgfSBmcm9tICcuL2Fzc2V0LW1hbmlmZXN0LWJ1aWxkZXInO1xuaW1wb3J0IHsgcHVibGlzaEFzc2V0cyB9IGZyb20gJy4vYXNzZXQtcHVibGlzaGluZyc7XG5pbXBvcnQgeyBhZGRNZXRhZGF0YUFzc2V0c1RvTWFuaWZlc3QgfSBmcm9tICcuL2Fzc2V0cyc7XG5pbXBvcnQgeyBkZXRlcm1pbmVBbGxvd0Nyb3NzQWNjb3VudEFzc2V0UHVibGlzaGluZyB9IGZyb20gJy4vY2hlY2tzJztcbmltcG9ydCB7XG4gIGNoYW5nZVNldEhhc05vQ2hhbmdlcyxcbiAgQ2xvdWRGb3JtYXRpb25TdGFjayxcbiAgVGVtcGxhdGVQYXJhbWV0ZXJzLFxuICB3YWl0Rm9yQ2hhbmdlU2V0LFxuICB3YWl0Rm9yU3RhY2tEZXBsb3ksXG4gIHdhaXRGb3JTdGFja0RlbGV0ZSxcbiAgUGFyYW1ldGVyVmFsdWVzLFxuICBQYXJhbWV0ZXJDaGFuZ2VzLFxuICBSZXNvdXJjZXNUb0ltcG9ydCxcbn0gZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBDaGFuZ2VTZXREZXBsb3ltZW50TWV0aG9kLCBEZXBsb3ltZW50TWV0aG9kIH0gZnJvbSAnLi9kZXBsb3ltZW50LW1ldGhvZCc7XG5pbXBvcnQgeyBEZXBsb3lTdGFja1Jlc3VsdCwgU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi9kZXBsb3ltZW50LXJlc3VsdCc7XG5pbXBvcnQgeyB0cnlIb3Rzd2FwRGVwbG95bWVudCB9IGZyb20gJy4vaG90c3dhcC1kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBkZWJ1ZywgaW5mbywgd2FybmluZyB9IGZyb20gJy4uLy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC9lcnJvcic7XG5pbXBvcnQgeyBmb3JtYXRFcnJvck1lc3NhZ2UgfSBmcm9tICcuLi8uLi91dGlsL2Vycm9yJztcbmltcG9ydCB0eXBlIHsgU0RLLCBTZGtQcm92aWRlciwgSUNsb3VkRm9ybWF0aW9uQ2xpZW50IH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudFJlc291cmNlcyB9IGZyb20gJy4uL2Vudmlyb25tZW50LXJlc291cmNlcyc7XG5pbXBvcnQgeyBDZm5FdmFsdWF0aW9uRXhjZXB0aW9uIH0gZnJvbSAnLi4vZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUnO1xuaW1wb3J0IHsgSG90c3dhcE1vZGUsIEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcywgSUNPTiB9IGZyb20gJy4uL2hvdHN3YXAvY29tbW9uJztcbmltcG9ydCB7IFN0YWNrQWN0aXZpdHlNb25pdG9yLCB0eXBlIFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB9IGZyb20gJy4uL3V0aWwvY2xvdWRmb3JtYXRpb24vc3RhY2stYWN0aXZpdHktbW9uaXRvcic7XG5pbXBvcnQgeyBTdHJpbmdXaXRob3V0UGxhY2Vob2xkZXJzIH0gZnJvbSAnLi4vdXRpbC9wbGFjZWhvbGRlcnMnO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZUJvZHlQYXJhbWV0ZXIsIG1ha2VCb2R5UGFyYW1ldGVyIH0gZnJvbSAnLi4vdXRpbC90ZW1wbGF0ZS1ib2R5LXBhcmFtZXRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95U3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBiZSBkZXBsb3llZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2s6IGN4YXBpLkNsb3VkRm9ybWF0aW9uU3RhY2tBcnRpZmFjdDtcblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IHRvIGRlcGxveSB0aGlzIHN0YWNrIGluXG4gICAqXG4gICAqIFRoZSBlbnZpcm9ubWVudCBvbiB0aGUgc3RhY2sgYXJ0aWZhY3QgbWF5IGJlIHVucmVzb2x2ZWQsIHRoaXMgb25lXG4gICAqIG11c3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZEVudmlyb25tZW50OiBjeGFwaS5FbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogVGhlIFNESyB0byB1c2UgZm9yIGRlcGxveWluZyB0aGUgc3RhY2tcbiAgICpcbiAgICogU2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSBjb3JyZWN0IHJvbGUgd2l0aCB3aGljaFxuICAgKiBzdGFjayBvcGVyYXRpb25zIHNob3VsZCBiZSBwZXJmb3JtZWQuXG4gICAqL1xuICByZWFkb25seSBzZGs6IFNESztcblxuICAvKipcbiAgICogU0RLIHByb3ZpZGVyIChzZWVkZWQgd2l0aCBkZWZhdWx0IGNyZWRlbnRpYWxzKVxuICAgKlxuICAgKiBXaWxsIGJlIHVzZWQgdG86XG4gICAqXG4gICAqIC0gUHVibGlzaCBhc3NldHMsIGVpdGhlciBsZWdhY3kgYXNzZXRzIG9yIGxhcmdlIENGTiB0ZW1wbGF0ZXNcbiAgICogICB0aGF0IGFyZW4ndCB0aGVtc2VsdmVzIGFzc2V0cyBmcm9tIGEgbWFuaWZlc3QuIChOZWVkcyBhbiBTREtcbiAgICogICBQcm92aWRlciBiZWNhdXNlIHRoZSBmaWxlIHB1Ymxpc2hpbmcgcm9sZSBpcyBkZWNsYXJlZCBhcyBwYXJ0XG4gICAqICAgb2YgdGhlIGFzc2V0KS5cbiAgICogLSBIb3Rzd2FwXG4gICAqL1xuICByZWFkb25seSBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBib290c3RyYXAgc3RhY2sgZm91bmQgaW4gdGhlIHRhcmdldCBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgZW52UmVzb3VyY2VzOiBFbnZpcm9ubWVudFJlc291cmNlcztcblxuICAvKipcbiAgICogUm9sZSB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIHRvIGV4ZWN1dGUgdGhlIGNoYW5nZSBzZXRcbiAgICpcbiAgICogVG8gb2J0YWluIGEgYFN0cmluZ1dpdGhvdXRQbGFjZWhvbGRlcnNgLCBydW4gYSByZWd1bGFyXG4gICAqIHN0cmluZyB0aG91Z2ggYFRhcmdldEVudmlyb25tZW50LnJlcGxhY2VQbGFjZWhvbGRlcnNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGV4ZWN1dGlvbiByb2xlOyBDbG91ZEZvcm1hdGlvbiBlaXRoZXIgdXNlcyB0aGUgcm9sZSBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoXG4gICAqIHRoZSBzdGFjaywgb3Igb3RoZXJ3aXNlIHVzZXMgY3VycmVudCBBV1MgY3JlZGVudGlhbHMuXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogU3RyaW5nV2l0aG91dFBsYWNlaG9sZGVycztcblxuICAvKipcbiAgICogTm90aWZpY2F0aW9uIEFSTnMgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiB0byBub3RpZnkgd2hlbiB0aGUgY2hhbmdlIHNldCBoYXMgY29tcGxldGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uQXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYW1lIHRvIGRlcGxveSB0aGUgc3RhY2sgdW5kZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOYW1lIGZyb20gYXNzZW1ibHlcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFF1aWV0IG9yIHZlcmJvc2UgZGVwbG95bWVudFxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGFzc2V0IElEcyB3aGljaCBzaG91bGRuJ3QgYmUgYnVpbHRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBCdWlsZCBhbGwgYXNzZXRzXG4gICAqL1xuICByZWFkb25seSByZXVzZUFzc2V0cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUYWdzIHRvIHBhc3MgdG8gQ2xvdWRGb3JtYXRpb24gdG8gYWRkIHRvIHN0YWNrXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFRhZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGF0IGRlcGxveW1lbnQgbWV0aG9kIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIENoYW5nZSBzZXQgd2l0aCBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudE1ldGhvZD86IERlcGxveW1lbnRNZXRob2Q7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2xsZWN0aW9uIG9mIGV4dHJhIHBhcmFtZXRlcnNcbiAgICogKGluIGFkZGl0aW9uIHRvIHRob3NlIHVzZWQgZm9yIGFzc2V0cylcbiAgICogdG8gcGFzcyB0byB0aGUgZGVwbG95ZWQgdGVtcGxhdGUuXG4gICAqIE5vdGUgdGhhdCBwYXJhbWV0ZXJzIHdpdGggYHVuZGVmaW5lZGAgb3IgZW1wdHkgdmFsdWVzIHdpbGwgYmUgaWdub3JlZCxcbiAgICogYW5kIG5vdCBwYXNzZWQgdG8gdGhlIHRlbXBsYXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuICAvKipcbiAgICogVXNlIHByZXZpb3VzIHZhbHVlcyBmb3IgdW5zcGVjaWZpZWQgcGFyYW1ldGVyc1xuICAgKlxuICAgKiBJZiBub3Qgc2V0LCBhbGwgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZXZlcnkgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHVzZVByZXZpb3VzUGFyYW1ldGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgbW9kZSBmb3Igc3RhY2sgZGVwbG95bWVudCBwcm9ncmVzcy5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhY2tBY3Rpdml0eVByb2dyZXNzLkJhciBzdGFjayBldmVudHMgd2lsbCBiZSBkaXNwbGF5ZWQgZm9yXG4gICAqICAgdGhlIHJlc291cmNlIGN1cnJlbnRseSBiZWluZyBkZXBsb3llZC5cbiAgICovXG4gIHJlYWRvbmx5IHByb2dyZXNzPzogU3RhY2tBY3Rpdml0eVByb2dyZXNzO1xuXG4gIC8qKlxuICAgKiBEZXBsb3kgZXZlbiBpZiB0aGUgZGVwbG95ZWQgdGVtcGxhdGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGRlcGxveS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgb24gYSBDSSBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNpPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUm9sbGJhY2sgZmFpbGVkIGRlcGxveW1lbnRzXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKlxuICAgKiBXaGV0aGVyIHRvIHBlcmZvcm0gYSAnaG90c3dhcCcgZGVwbG95bWVudC5cbiAgICogQSAnaG90c3dhcCcgZGVwbG95bWVudCB3aWxsIGF0dGVtcHQgdG8gc2hvcnQtY2lyY3VpdCBDbG91ZEZvcm1hdGlvblxuICAgKiBhbmQgdXBkYXRlIHRoZSBhZmZlY3RlZCByZXNvdXJjZXMgbGlrZSBMYW1iZGEgZnVuY3Rpb25zIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlRgIGZvciByZWd1bGFyIGRlcGxveW1lbnRzLCBgSG90c3dhcE1vZGUuSE9UU1dBUF9PTkxZYCBmb3IgJ3dhdGNoJyBkZXBsb3ltZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgaG90c3dhcD86IEhvdHN3YXBNb2RlO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBwcm9wZXJ0aWVzIHRoYXQgY29uZmlndXJlIGhvdHN3YXAgYmVoYXZpb3JcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcz86IEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcztcblxuICAvKipcbiAgICogVGhlIGV4dHJhIHN0cmluZyB0byBhcHBlbmQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyIHdoZW4gcGVyZm9ybWluZyBBV1MgU0RLIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdGhpbmcgZXh0cmEgaXMgYXBwZW5kZWQgdG8gdGhlIFVzZXItQWdlbnQgaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBleHRyYVVzZXJBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgc2V0LCBjaGFuZ2Ugc2V0IG9mIHR5cGUgSU1QT1JUIHdpbGwgYmUgY3JlYXRlZCwgYW5kIHJlc291cmNlc1RvSW1wb3J0XG4gICAqIHBhc3NlZCB0byBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlc1RvSW1wb3J0PzogUmVzb3VyY2VzVG9JbXBvcnQ7XG5cbiAgLyoqXG4gICAqIElmIHByZXNlbnQsIHVzZSB0aGlzIGdpdmVuIHRlbXBsYXRlIGluc3RlYWQgb2YgdGhlIHN0b3JlZCBvbmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBVc2UgdGhlIHN0b3JlZCB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVUZW1wbGF0ZT86IGFueTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBidWlsZC9wdWJsaXNoIGFzc2V0cyBpbiBwYXJhbGxlbFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlIFRvIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRQYXJhbGxlbGlzbT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXBsb3lTdGFjayhvcHRpb25zOiBEZXBsb3lTdGFja09wdGlvbnMpOiBQcm9taXNlPERlcGxveVN0YWNrUmVzdWx0PiB7XG4gIGNvbnN0IHN0YWNrQXJ0aWZhY3QgPSBvcHRpb25zLnN0YWNrO1xuXG4gIGNvbnN0IHN0YWNrRW52ID0gb3B0aW9ucy5yZXNvbHZlZEVudmlyb25tZW50O1xuXG4gIG9wdGlvbnMuc2RrLmFwcGVuZEN1c3RvbVVzZXJBZ2VudChvcHRpb25zLmV4dHJhVXNlckFnZW50KTtcbiAgY29uc3QgY2ZuID0gb3B0aW9ucy5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuZGVwbG95TmFtZSB8fCBzdGFja0FydGlmYWN0LnN0YWNrTmFtZTtcbiAgbGV0IGNsb3VkRm9ybWF0aW9uU3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuXG4gIGlmIChjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLmlzQ3JlYXRpb25GYWlsdXJlKSB7XG4gICAgZGVidWcoXG4gICAgICBgRm91bmQgZXhpc3Rpbmcgc3RhY2sgJHtkZXBsb3lOYW1lfSB0aGF0IGhhZCBwcmV2aW91c2x5IGZhaWxlZCBjcmVhdGlvbi4gRGVsZXRpbmcgaXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmUtY3JlYXRlIGl0LmAsXG4gICAgKTtcbiAgICBhd2FpdCBjZm4uZGVsZXRlU3RhY2soeyBTdGFja05hbWU6IGRlcGxveU5hbWUgfSk7XG4gICAgY29uc3QgZGVsZXRlZFN0YWNrID0gYXdhaXQgd2FpdEZvclN0YWNrRGVsZXRlKGNmbiwgZGVwbG95TmFtZSk7XG4gICAgaWYgKGRlbGV0ZWRTdGFjayAmJiBkZWxldGVkU3RhY2suc3RhY2tTdGF0dXMubmFtZSAhPT0gJ0RFTEVURV9DT01QTEVURScpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgIGBGYWlsZWQgZGVsZXRpbmcgc3RhY2sgJHtkZXBsb3lOYW1lfSB0aGF0IGhhZCBwcmV2aW91c2x5IGZhaWxlZCBjcmVhdGlvbiAoY3VycmVudCBzdGF0ZTogJHtkZWxldGVkU3RhY2suc3RhY2tTdGF0dXN9KWAsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdmFyaWFibGUgdG8gbWFyayB0aGF0IHRoZSBzdGFjayBkb2VzIG5vdCBleGlzdCBhbnltb3JlLCBidXQgYXZvaWRcbiAgICAvLyBkb2luZyBhbiBhY3R1YWwgbG9va3VwIGluIENsb3VkRm9ybWF0aW9uICh3aGljaCB3b3VsZCBiZSBzaWxseSB0byBkbyBpZlxuICAgIC8vIHdlIGp1c3QgZGVsZXRlZCBpdCkuXG4gICAgY2xvdWRGb3JtYXRpb25TdGFjayA9IENsb3VkRm9ybWF0aW9uU3RhY2suZG9lc05vdEV4aXN0KGNmbiwgZGVwbG95TmFtZSk7XG4gIH1cblxuICAvLyBEZXRlY3QgXCJsZWdhY3lcIiBhc3NldHMgKHdoaWNoIHJlbWFpbiBpbiB0aGUgbWV0YWRhdGEpIGFuZCBwdWJsaXNoIHRoZW0gdmlhXG4gIC8vIGFuIGFkLWhvYyBhc3NldCBtYW5pZmVzdCwgd2hpbGUgcGFzc2luZyB0aGVpciBsb2NhdGlvbnMgdmlhIHRlbXBsYXRlXG4gIC8vIHBhcmFtZXRlcnMuXG4gIGNvbnN0IGxlZ2FjeUFzc2V0cyA9IG5ldyBBc3NldE1hbmlmZXN0QnVpbGRlcigpO1xuICBjb25zdCBhc3NldFBhcmFtcyA9IGF3YWl0IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChcbiAgICBzdGFja0FydGlmYWN0LFxuICAgIGxlZ2FjeUFzc2V0cyxcbiAgICBvcHRpb25zLmVudlJlc291cmNlcyxcbiAgICBvcHRpb25zLnJldXNlQXNzZXRzLFxuICApO1xuXG4gIGNvbnN0IGZpbmFsUGFyYW1ldGVyVmFsdWVzID0geyAuLi5vcHRpb25zLnBhcmFtZXRlcnMsIC4uLmFzc2V0UGFyYW1zIH07XG5cbiAgY29uc3QgdGVtcGxhdGVQYXJhbXMgPSBUZW1wbGF0ZVBhcmFtZXRlcnMuZnJvbVRlbXBsYXRlKHN0YWNrQXJ0aWZhY3QudGVtcGxhdGUpO1xuICBjb25zdCBzdGFja1BhcmFtcyA9IG9wdGlvbnMudXNlUHJldmlvdXNQYXJhbWV0ZXJzXG4gICAgPyB0ZW1wbGF0ZVBhcmFtcy51cGRhdGVFeGlzdGluZyhmaW5hbFBhcmFtZXRlclZhbHVlcywgY2xvdWRGb3JtYXRpb25TdGFjay5wYXJhbWV0ZXJzKVxuICAgIDogdGVtcGxhdGVQYXJhbXMuc3VwcGx5QWxsKGZpbmFsUGFyYW1ldGVyVmFsdWVzKTtcblxuICBjb25zdCBob3Rzd2FwTW9kZSA9IG9wdGlvbnMuaG90c3dhcCA/PyBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQ7XG4gIGNvbnN0IGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyA9IG9wdGlvbnMuaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzID8/IG5ldyBIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMoKTtcblxuICBpZiAoYXdhaXQgY2FuU2tpcERlcGxveShvcHRpb25zLCBjbG91ZEZvcm1hdGlvblN0YWNrLCBzdGFja1BhcmFtcy5oYXNDaGFuZ2VzKGNsb3VkRm9ybWF0aW9uU3RhY2sucGFyYW1ldGVycykpKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IHNraXBwaW5nIGRlcGxveW1lbnQgKHVzZSAtLWZvcmNlIHRvIG92ZXJyaWRlKWApO1xuICAgIC8vIGlmIHdlIGNhbiBza2lwIGRlcGxveW1lbnQgYW5kIHdlIGFyZSBwZXJmb3JtaW5nIGEgaG90c3dhcCwgbGV0IHRoZSB1c2VyIGtub3dcbiAgICAvLyB0aGF0IG5vIGhvdHN3YXAgZGVwbG95bWVudCBoYXBwZW5lZFxuICAgIGlmIChob3Rzd2FwTW9kZSAhPT0gSG90c3dhcE1vZGUuRlVMTF9ERVBMT1lNRU5UKSB7XG4gICAgICBpbmZvKFxuICAgICAgICBgXFxuICR7SUNPTn0gJXNcXG5gLFxuICAgICAgICBjaGFsay5ib2xkKCdob3Rzd2FwIGRlcGxveW1lbnQgc2tpcHBlZCAtIG5vIGNoYW5nZXMgd2VyZSBkZXRlY3RlZCAodXNlIC0tZm9yY2UgdG8gb3ZlcnJpZGUpJyksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2RpZC1kZXBsb3ktc3RhY2snLFxuICAgICAgbm9PcDogdHJ1ZSxcbiAgICAgIG91dHB1dHM6IGNsb3VkRm9ybWF0aW9uU3RhY2sub3V0cHV0cyxcbiAgICAgIHN0YWNrQXJuOiBjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrSWQsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogZGVwbG95aW5nLi4uYCk7XG4gIH1cblxuICBjb25zdCBib2R5UGFyYW1ldGVyID0gYXdhaXQgbWFrZUJvZHlQYXJhbWV0ZXIoXG4gICAgc3RhY2tBcnRpZmFjdCxcbiAgICBvcHRpb25zLnJlc29sdmVkRW52aXJvbm1lbnQsXG4gICAgbGVnYWN5QXNzZXRzLFxuICAgIG9wdGlvbnMuZW52UmVzb3VyY2VzLFxuICAgIG9wdGlvbnMub3ZlcnJpZGVUZW1wbGF0ZSxcbiAgKTtcbiAgbGV0IGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGJvb3RzdHJhcFN0YWNrTmFtZSA9IChhd2FpdCBvcHRpb25zLmVudlJlc291cmNlcy5sb29rdXBUb29sa2l0KCkpLnN0YWNrTmFtZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRlYnVnKGBDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBib290c3RyYXAgc3RhY2sgbmFtZTogJHtlfWApO1xuICB9XG4gIGF3YWl0IHB1Ymxpc2hBc3NldHMobGVnYWN5QXNzZXRzLnRvTWFuaWZlc3Qoc3RhY2tBcnRpZmFjdC5hc3NlbWJseS5kaXJlY3RvcnkpLCBvcHRpb25zLnNka1Byb3ZpZGVyLCBzdGFja0Vudiwge1xuICAgIHBhcmFsbGVsOiBvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20sXG4gICAgYWxsb3dDcm9zc0FjY291bnQ6IGF3YWl0IGRldGVybWluZUFsbG93Q3Jvc3NBY2NvdW50QXNzZXRQdWJsaXNoaW5nKG9wdGlvbnMuc2RrLCBib290c3RyYXBTdGFja05hbWUpLFxuICB9KTtcblxuICBpZiAoaG90c3dhcE1vZGUgIT09IEhvdHN3YXBNb2RlLkZVTExfREVQTE9ZTUVOVCkge1xuICAgIC8vIGF0dGVtcHQgdG8gc2hvcnQtY2lyY3VpdCB0aGUgZGVwbG95bWVudCBpZiBwb3NzaWJsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBob3Rzd2FwRGVwbG95bWVudFJlc3VsdCA9IGF3YWl0IHRyeUhvdHN3YXBEZXBsb3ltZW50KFxuICAgICAgICBvcHRpb25zLnNka1Byb3ZpZGVyLFxuICAgICAgICBzdGFja1BhcmFtcy52YWx1ZXMsXG4gICAgICAgIGNsb3VkRm9ybWF0aW9uU3RhY2ssXG4gICAgICAgIHN0YWNrQXJ0aWZhY3QsXG4gICAgICAgIGhvdHN3YXBNb2RlLCBob3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsXG4gICAgICApO1xuICAgICAgaWYgKGhvdHN3YXBEZXBsb3ltZW50UmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBob3Rzd2FwRGVwbG95bWVudFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGluZm8oXG4gICAgICAgICdDb3VsZCBub3QgcGVyZm9ybSBhIGhvdHN3YXAgZGVwbG95bWVudCwgYXMgdGhlIHN0YWNrICVzIGNvbnRhaW5zIG5vbi1Bc3NldCBjaGFuZ2VzJyxcbiAgICAgICAgc3RhY2tBcnRpZmFjdC5kaXNwbGF5TmFtZSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENmbkV2YWx1YXRpb25FeGNlcHRpb24pKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpbmZvKFxuICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gYSBob3Rzd2FwIGRlcGxveW1lbnQsIGJlY2F1c2UgdGhlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGNvdWxkIG5vdCBiZSByZXNvbHZlZDogJXMnLFxuICAgICAgICBmb3JtYXRFcnJvck1lc3NhZ2UoZSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChob3Rzd2FwTW9kZSA9PT0gSG90c3dhcE1vZGUuRkFMTF9CQUNLKSB7XG4gICAgICBpbmZvKCdGYWxsaW5nIGJhY2sgdG8gZG9pbmcgYSBmdWxsIGRlcGxveW1lbnQnKTtcbiAgICAgIG9wdGlvbnMuc2RrLmFwcGVuZEN1c3RvbVVzZXJBZ2VudCgnY2RrLWhvdHN3YXAvZmFsbGJhY2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2RpZC1kZXBsb3ktc3RhY2snLFxuICAgICAgICBub09wOiB0cnVlLFxuICAgICAgICBzdGFja0FybjogY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja0lkLFxuICAgICAgICBvdXRwdXRzOiBjbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvdWxkIG5vdCBzaG9ydC1jaXJjdWl0IHRoZSBkZXBsb3ltZW50LCBwZXJmb3JtIGEgZnVsbCBDRk4gZGVwbG95IGluc3RlYWRcbiAgY29uc3QgZnVsbERlcGxveW1lbnQgPSBuZXcgRnVsbENsb3VkRm9ybWF0aW9uRGVwbG95bWVudChcbiAgICBvcHRpb25zLFxuICAgIGNsb3VkRm9ybWF0aW9uU3RhY2ssXG4gICAgc3RhY2tBcnRpZmFjdCxcbiAgICBzdGFja1BhcmFtcyxcbiAgICBib2R5UGFyYW1ldGVyLFxuICApO1xuICByZXR1cm4gZnVsbERlcGxveW1lbnQucGVyZm9ybURlcGxveW1lbnQoKTtcbn1cblxudHlwZSBDb21tb25QcmVwYXJlT3B0aW9ucyA9IGtleW9mIENyZWF0ZVN0YWNrQ29tbWFuZElucHV0ICZcbmtleW9mIFVwZGF0ZVN0YWNrQ29tbWFuZElucHV0ICZcbmtleW9mIENyZWF0ZUNoYW5nZVNldENvbW1hbmRJbnB1dDtcbnR5cGUgQ29tbW9uRXhlY3V0ZU9wdGlvbnMgPSBrZXlvZiBDcmVhdGVTdGFja0NvbW1hbmRJbnB1dCAmXG5rZXlvZiBVcGRhdGVTdGFja0NvbW1hbmRJbnB1dCAmXG5rZXlvZiBFeGVjdXRlQ2hhbmdlU2V0Q29tbWFuZElucHV0O1xuXG4vKipcbiAqIFRoaXMgY2xhc3Mgc2hhcmVzIHN0YXRlIGFuZCBmdW5jdGlvbmFsaXR5IGJldHdlZW4gdGhlIGRpZmZlcmVudCBmdWxsIGRlcGxveW1lbnQgbW9kZXNcbiAqL1xuY2xhc3MgRnVsbENsb3VkRm9ybWF0aW9uRGVwbG95bWVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2ZuOiBJQ2xvdWRGb3JtYXRpb25DbGllbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB1dWlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZXBsb3lTdGFja09wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbG91ZEZvcm1hdGlvblN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tQYXJhbXM6IFBhcmFtZXRlclZhbHVlcyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvZHlQYXJhbWV0ZXI6IFRlbXBsYXRlQm9keVBhcmFtZXRlcixcbiAgKSB7XG4gICAgdGhpcy5jZm4gPSBvcHRpb25zLnNkay5jbG91ZEZvcm1hdGlvbigpO1xuICAgIHRoaXMuc3RhY2tOYW1lID0gb3B0aW9ucy5kZXBsb3lOYW1lID8/IHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lO1xuXG4gICAgdGhpcy51cGRhdGUgPSBjbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cyAmJiBjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgIT09ICdSRVZJRVdfSU5fUFJPR1JFU1MnO1xuICAgIHRoaXMudmVyYiA9IHRoaXMudXBkYXRlID8gJ3VwZGF0ZScgOiAnY3JlYXRlJztcbiAgICB0aGlzLnV1aWQgPSB1dWlkLnY0KCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybURlcGxveW1lbnQoKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IGRlcGxveW1lbnRNZXRob2QgPSB0aGlzLm9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCA/PyB7XG4gICAgICBtZXRob2Q6ICdjaGFuZ2Utc2V0JyxcbiAgICB9O1xuXG4gICAgaWYgKGRlcGxveW1lbnRNZXRob2QubWV0aG9kID09PSAnZGlyZWN0JyAmJiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzVG9JbXBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0ltcG9ydGluZyByZXNvdXJjZXMgcmVxdWlyZXMgYSBjaGFuZ2VzZXQgZGVwbG95bWVudCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZGVwbG95bWVudE1ldGhvZC5tZXRob2QpIHtcbiAgICAgIGNhc2UgJ2NoYW5nZS1zZXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2VTZXREZXBsb3ltZW50KGRlcGxveW1lbnRNZXRob2QpO1xuXG4gICAgICBjYXNlICdkaXJlY3QnOlxuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3REZXBsb3ltZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2VTZXREZXBsb3ltZW50KGRlcGxveW1lbnRNZXRob2Q6IENoYW5nZVNldERlcGxveW1lbnRNZXRob2QpOiBQcm9taXNlPERlcGxveVN0YWNrUmVzdWx0PiB7XG4gICAgY29uc3QgY2hhbmdlU2V0TmFtZSA9IGRlcGxveW1lbnRNZXRob2QuY2hhbmdlU2V0TmFtZSA/PyAnY2RrLWRlcGxveS1jaGFuZ2Utc2V0JztcbiAgICBjb25zdCBleGVjdXRlID0gZGVwbG95bWVudE1ldGhvZC5leGVjdXRlID8/IHRydWU7XG4gICAgY29uc3QgaW1wb3J0RXhpc3RpbmdSZXNvdXJjZXMgPSBkZXBsb3ltZW50TWV0aG9kLmltcG9ydEV4aXN0aW5nUmVzb3VyY2VzID8/IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZVNldERlc2NyaXB0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDaGFuZ2VTZXQoY2hhbmdlU2V0TmFtZSwgZXhlY3V0ZSwgaW1wb3J0RXhpc3RpbmdSZXNvdXJjZXMpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlVGVybWluYXRpb25Qcm90ZWN0aW9uKCk7XG5cbiAgICBpZiAoY2hhbmdlU2V0SGFzTm9DaGFuZ2VzKGNoYW5nZVNldERlc2NyaXB0aW9uKSkge1xuICAgICAgZGVidWcoJ05vIGNoYW5nZXMgYXJlIHRvIGJlIHBlcmZvcm1lZCBvbiAlcy4nLCB0aGlzLnN0YWNrTmFtZSk7XG4gICAgICBpZiAoZXhlY3V0ZSkge1xuICAgICAgICBkZWJ1ZygnRGVsZXRpbmcgZW1wdHkgY2hhbmdlIHNldCAlcycsIGNoYW5nZVNldERlc2NyaXB0aW9uLkNoYW5nZVNldElkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jZm4uZGVsZXRlQ2hhbmdlU2V0KHtcbiAgICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICAgIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZvcmNlKSB7XG4gICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgW1xuICAgICAgICAgICAgJ1lvdSB1c2VkIHRoZSAtLWZvcmNlIGZsYWcsIGJ1dCBDbG91ZEZvcm1hdGlvbiByZXBvcnRlZCB0aGF0IHRoZSBkZXBsb3ltZW50IHdvdWxkIG5vdCBtYWtlIGFueSBjaGFuZ2VzLicsXG4gICAgICAgICAgICAnQWNjb3JkaW5nIHRvIENsb3VkRm9ybWF0aW9uLCBhbGwgcmVzb3VyY2VzIGFyZSBhbHJlYWR5IHVwLXRvLWRhdGUgd2l0aCB0aGUgc3RhdGUgaW4geW91ciBDREsgYXBwLicsXG4gICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICdZb3UgY2Fubm90IHVzZSB0aGUgLS1mb3JjZSBmbGFnIHRvIGdldCByaWQgb2YgY2hhbmdlcyB5b3UgbWFkZSBpbiB0aGUgY29uc29sZS4gVHJ5IHVzaW5nJyxcbiAgICAgICAgICAgICdDbG91ZEZvcm1hdGlvbiBkcmlmdCBkZXRlY3Rpb24gaW5zdGVhZDogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvdXNpbmctY2ZuLXN0YWNrLWRyaWZ0Lmh0bWwnLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdkaWQtZGVwbG95LXN0YWNrJyxcbiAgICAgICAgbm9PcDogdHJ1ZSxcbiAgICAgICAgb3V0cHV0czogdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICAgIHN0YWNrQXJuOiBjaGFuZ2VTZXREZXNjcmlwdGlvbi5TdGFja0lkISxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFleGVjdXRlKSB7XG4gICAgICBpbmZvKFxuICAgICAgICAnQ2hhbmdlc2V0ICVzIGNyZWF0ZWQgYW5kIHdhaXRpbmcgaW4gcmV2aWV3IGZvciBtYW51YWwgZXhlY3V0aW9uICgtLW5vLWV4ZWN1dGUpJyxcbiAgICAgICAgY2hhbmdlU2V0RGVzY3JpcHRpb24uQ2hhbmdlU2V0SWQsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2RpZC1kZXBsb3ktc3RhY2snLFxuICAgICAgICBub09wOiBmYWxzZSxcbiAgICAgICAgb3V0cHV0czogdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICAgIHN0YWNrQXJuOiBjaGFuZ2VTZXREZXNjcmlwdGlvbi5TdGFja0lkISxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIHJlcGxhY2VtZW50cyBpbiB0aGUgY2hhbmdlc2V0LCBjaGVjayB0aGUgcm9sbGJhY2sgZmxhZyBhbmQgc3RhY2sgc3RhdHVzXG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSBoYXNSZXBsYWNlbWVudChjaGFuZ2VTZXREZXNjcmlwdGlvbik7XG4gICAgY29uc3QgaXNQYXVzZWRGYWlsU3RhdGUgPSB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tTdGF0dXMuaXNSb2xsYmFja2FibGU7XG4gICAgY29uc3Qgcm9sbGJhY2sgPSB0aGlzLm9wdGlvbnMucm9sbGJhY2sgPz8gdHJ1ZTtcbiAgICBpZiAoaXNQYXVzZWRGYWlsU3RhdGUgJiYgcmVwbGFjZW1lbnQpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlscGF1c2VkLW5lZWQtcm9sbGJhY2stZmlyc3QnLCByZWFzb246ICdyZXBsYWNlbWVudCcsIHN0YXR1czogdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgfTtcbiAgICB9XG4gICAgaWYgKGlzUGF1c2VkRmFpbFN0YXRlICYmIHJvbGxiYWNrKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbHBhdXNlZC1uZWVkLXJvbGxiYWNrLWZpcnN0JywgcmVhc29uOiAnbm90LW5vcm9sbGJhY2snLCBzdGF0dXM6IHRoaXMuY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5uYW1lIH07XG4gICAgfVxuICAgIGlmICghcm9sbGJhY2sgJiYgcmVwbGFjZW1lbnQpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdyZXBsYWNlbWVudC1yZXF1aXJlcy1yb2xsYmFjaycgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlQ2hhbmdlU2V0KGNoYW5nZVNldERlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlQ2hhbmdlU2V0KGNoYW5nZVNldE5hbWU6IHN0cmluZywgd2lsbEV4ZWN1dGU6IGJvb2xlYW4sIGltcG9ydEV4aXN0aW5nUmVzb3VyY2VzOiBib29sZWFuKSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwT2xkQ2hhbmdlc2V0KGNoYW5nZVNldE5hbWUpO1xuXG4gICAgZGVidWcoYEF0dGVtcHRpbmcgdG8gY3JlYXRlIENoYW5nZVNldCB3aXRoIG5hbWUgJHtjaGFuZ2VTZXROYW1lfSB0byAke3RoaXMudmVyYn0gc3RhY2sgJHt0aGlzLnN0YWNrTmFtZX1gKTtcbiAgICBpbmZvKCclczogY3JlYXRpbmcgQ2xvdWRGb3JtYXRpb24gY2hhbmdlc2V0Li4uJywgY2hhbGsuYm9sZCh0aGlzLnN0YWNrTmFtZSkpO1xuICAgIGNvbnN0IGNoYW5nZVNldCA9IGF3YWl0IHRoaXMuY2ZuLmNyZWF0ZUNoYW5nZVNldCh7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0TmFtZSxcbiAgICAgIENoYW5nZVNldFR5cGU6IHRoaXMub3B0aW9ucy5yZXNvdXJjZXNUb0ltcG9ydCA/ICdJTVBPUlQnIDogdGhpcy51cGRhdGUgPyAnVVBEQVRFJyA6ICdDUkVBVEUnLFxuICAgICAgUmVzb3VyY2VzVG9JbXBvcnQ6IHRoaXMub3B0aW9ucy5yZXNvdXJjZXNUb0ltcG9ydCxcbiAgICAgIERlc2NyaXB0aW9uOiBgQ0RLIENoYW5nZXNldCBmb3IgZXhlY3V0aW9uICR7dGhpcy51dWlkfWAsXG4gICAgICBDbGllbnRUb2tlbjogYGNyZWF0ZSR7dGhpcy51dWlkfWAsXG4gICAgICBJbXBvcnRFeGlzdGluZ1Jlc291cmNlczogaW1wb3J0RXhpc3RpbmdSZXNvdXJjZXMsXG4gICAgICAuLi50aGlzLmNvbW1vblByZXBhcmVPcHRpb25zKCksXG4gICAgfSk7XG5cbiAgICBkZWJ1ZygnSW5pdGlhdGVkIGNyZWF0aW9uIG9mIGNoYW5nZXNldDogJXM7IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaCBjcmVhdGluZy4uLicsIGNoYW5nZVNldC5JZCk7XG4gICAgLy8gRmV0Y2hpbmcgYWxsIHBhZ2VzIGlmIHdlJ2xsIGV4ZWN1dGUsIHNvIHdlIGNhbiBoYXZlIHRoZSBjb3JyZWN0IGNoYW5nZSBjb3VudCB3aGVuIG1vbml0b3JpbmcuXG4gICAgcmV0dXJuIHdhaXRGb3JDaGFuZ2VTZXQodGhpcy5jZm4sIHRoaXMuc3RhY2tOYW1lLCBjaGFuZ2VTZXROYW1lLCB7XG4gICAgICBmZXRjaEFsbDogd2lsbEV4ZWN1dGUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVDaGFuZ2VTZXQoY2hhbmdlU2V0OiBEZXNjcmliZUNoYW5nZVNldENvbW1hbmRPdXRwdXQpOiBQcm9taXNlPFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGRlYnVnKCdJbml0aWF0aW5nIGV4ZWN1dGlvbiBvZiBjaGFuZ2VzZXQgJXMgb24gc3RhY2sgJXMnLCBjaGFuZ2VTZXQuQ2hhbmdlU2V0SWQsIHRoaXMuc3RhY2tOYW1lKTtcblxuICAgIGF3YWl0IHRoaXMuY2ZuLmV4ZWN1dGVDaGFuZ2VTZXQoe1xuICAgICAgU3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldC5DaGFuZ2VTZXROYW1lISxcbiAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogYGV4ZWMke3RoaXMudXVpZH1gLFxuICAgICAgLi4udGhpcy5jb21tb25FeGVjdXRlT3B0aW9ucygpLFxuICAgIH0pO1xuXG4gICAgZGVidWcoXG4gICAgICAnRXhlY3V0aW9uIG9mIGNoYW5nZXNldCAlcyBvbiBzdGFjayAlcyBoYXMgc3RhcnRlZDsgd2FpdGluZyBmb3IgdGhlIHVwZGF0ZSB0byBjb21wbGV0ZS4uLicsXG4gICAgICBjaGFuZ2VTZXQuQ2hhbmdlU2V0SWQsXG4gICAgICB0aGlzLnN0YWNrTmFtZSxcbiAgICApO1xuXG4gICAgLy8gKzEgZm9yIHRoZSBleHRyYSBldmVudCBlbWl0dGVkIGZyb20gdXBkYXRlcy5cbiAgICBjb25zdCBjaGFuZ2VTZXRMZW5ndGg6IG51bWJlciA9IChjaGFuZ2VTZXQuQ2hhbmdlcyA/PyBbXSkubGVuZ3RoICsgKHRoaXMudXBkYXRlID8gMSA6IDApO1xuICAgIHJldHVybiB0aGlzLm1vbml0b3JEZXBsb3ltZW50KGNoYW5nZVNldC5DcmVhdGlvblRpbWUhLCBjaGFuZ2VTZXRMZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwT2xkQ2hhbmdlc2V0KGNoYW5nZVNldE5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2suZXhpc3RzKSB7XG4gICAgICAvLyBEZWxldGUgYW55IGV4aXN0aW5nIGNoYW5nZSBzZXRzIGdlbmVyYXRlZCBieSBDREsgc2luY2UgY2hhbmdlIHNldCBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cbiAgICAgIC8vIFRoZSBkZWxldGUgcmVxdWVzdCBpcyBzdWNjZXNzZnVsIGFzIGxvbmcgYXMgdGhlIHN0YWNrIGV4aXN0cyAoZXZlbiBpZiB0aGUgY2hhbmdlIHNldCBkb2VzIG5vdCBleGlzdCkuXG4gICAgICBkZWJ1ZyhgUmVtb3ZpbmcgZXhpc3RpbmcgY2hhbmdlIHNldCB3aXRoIG5hbWUgJHtjaGFuZ2VTZXROYW1lfSBpZiBpdCBleGlzdHNgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2ZuLmRlbGV0ZUNoYW5nZVNldCh7XG4gICAgICAgIFN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICAgIENoYW5nZVNldE5hbWU6IGNoYW5nZVNldE5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwZGF0ZVRlcm1pbmF0aW9uUHJvdGVjdGlvbigpIHtcbiAgICAvLyBVcGRhdGUgdGVybWluYXRpb24gcHJvdGVjdGlvbiBvbmx5IGlmIGl0IGhhcyBjaGFuZ2VkLlxuICAgIGNvbnN0IHRlcm1pbmF0aW9uUHJvdGVjdGlvbiA9IHRoaXMuc3RhY2tBcnRpZmFjdC50ZXJtaW5hdGlvblByb3RlY3Rpb24gPz8gZmFsc2U7XG4gICAgaWYgKCEhdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLnRlcm1pbmF0aW9uUHJvdGVjdGlvbiAhPT0gdGVybWluYXRpb25Qcm90ZWN0aW9uKSB7XG4gICAgICBkZWJ1ZyhcbiAgICAgICAgJ1VwZGF0aW5nIHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gZnJvbSAlcyB0byAlcyBmb3Igc3RhY2sgJXMnLFxuICAgICAgICB0aGlzLmNsb3VkRm9ybWF0aW9uU3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uLFxuICAgICAgICB0ZXJtaW5hdGlvblByb3RlY3Rpb24sXG4gICAgICAgIHRoaXMuc3RhY2tOYW1lLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY2ZuLnVwZGF0ZVRlcm1pbmF0aW9uUHJvdGVjdGlvbih7XG4gICAgICAgIFN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICAgIEVuYWJsZVRlcm1pbmF0aW9uUHJvdGVjdGlvbjogdGVybWluYXRpb25Qcm90ZWN0aW9uLFxuICAgICAgfSk7XG4gICAgICBkZWJ1ZygnVGVybWluYXRpb24gcHJvdGVjdGlvbiB1cGRhdGVkIHRvICVzIGZvciBzdGFjayAlcycsIHRlcm1pbmF0aW9uUHJvdGVjdGlvbiwgdGhpcy5zdGFja05hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlyZWN0RGVwbG95bWVudCgpOiBQcm9taXNlPFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGluZm8oJyVzOiAlcyBzdGFjay4uLicsIGNoYWxrLmJvbGQodGhpcy5zdGFja05hbWUpLCB0aGlzLnVwZGF0ZSA/ICd1cGRhdGluZycgOiAnY3JlYXRpbmcnKTtcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5cbiAgICBpZiAodGhpcy51cGRhdGUpIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVGVybWluYXRpb25Qcm90ZWN0aW9uKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2ZuLnVwZGF0ZVN0YWNrKHtcbiAgICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICAgIENsaWVudFJlcXVlc3RUb2tlbjogYHVwZGF0ZSR7dGhpcy51dWlkfWAsXG4gICAgICAgICAgLi4udGhpcy5jb21tb25QcmVwYXJlT3B0aW9ucygpLFxuICAgICAgICAgIC4uLnRoaXMuY29tbW9uRXhlY3V0ZU9wdGlvbnMoKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdObyB1cGRhdGVzIGFyZSB0byBiZSBwZXJmb3JtZWQuJykge1xuICAgICAgICAgIGRlYnVnKCdObyB1cGRhdGVzIGFyZSB0byBiZSBwZXJmb3JtZWQgZm9yIHN0YWNrICVzJywgdGhpcy5zdGFja05hbWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZGlkLWRlcGxveS1zdGFjaycsXG4gICAgICAgICAgICBub09wOiB0cnVlLFxuICAgICAgICAgICAgb3V0cHV0czogdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLm91dHB1dHMsXG4gICAgICAgICAgICBzdGFja0FybjogdGhpcy5jbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm1vbml0b3JEZXBsb3ltZW50KHN0YXJ0VGltZSwgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB3ZSBjYW4gc2V0IHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gZHVyaW5nIGNyZWF0ZVxuICAgICAgY29uc3QgdGVybWluYXRpb25Qcm90ZWN0aW9uID0gdGhpcy5zdGFja0FydGlmYWN0LnRlcm1pbmF0aW9uUHJvdGVjdGlvbiA/PyBmYWxzZTtcblxuICAgICAgYXdhaXQgdGhpcy5jZm4uY3JlYXRlU3RhY2soe1xuICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICBDbGllbnRSZXF1ZXN0VG9rZW46IGBjcmVhdGUke3RoaXMudXVpZH1gLFxuICAgICAgICAuLi4odGVybWluYXRpb25Qcm90ZWN0aW9uID8geyBFbmFibGVUZXJtaW5hdGlvblByb3RlY3Rpb246IHRydWUgfSA6IHVuZGVmaW5lZCksXG4gICAgICAgIC4uLnRoaXMuY29tbW9uUHJlcGFyZU9wdGlvbnMoKSxcbiAgICAgICAgLi4udGhpcy5jb21tb25FeGVjdXRlT3B0aW9ucygpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLm1vbml0b3JEZXBsb3ltZW50KHN0YXJ0VGltZSwgdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1vbml0b3JEZXBsb3ltZW50KHN0YXJ0VGltZTogRGF0ZSwgZXhwZWN0ZWRDaGFuZ2VzOiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IG1vbml0b3IgPSB0aGlzLm9wdGlvbnMucXVpZXRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IFN0YWNrQWN0aXZpdHlNb25pdG9yLndpdGhEZWZhdWx0UHJpbnRlcih0aGlzLmNmbiwgdGhpcy5zdGFja05hbWUsIHRoaXMuc3RhY2tBcnRpZmFjdCwge1xuICAgICAgICByZXNvdXJjZXNUb3RhbDogZXhwZWN0ZWRDaGFuZ2VzLFxuICAgICAgICBwcm9ncmVzczogdGhpcy5vcHRpb25zLnByb2dyZXNzLFxuICAgICAgICBjaGFuZ2VTZXRDcmVhdGlvblRpbWU6IHN0YXJ0VGltZSxcbiAgICAgICAgY2k6IHRoaXMub3B0aW9ucy5jaSxcbiAgICAgIH0pLnN0YXJ0KCk7XG5cbiAgICBsZXQgZmluYWxTdGF0ZSA9IHRoaXMuY2xvdWRGb3JtYXRpb25TdGFjaztcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3VjY2Vzc1N0YWNrID0gYXdhaXQgd2FpdEZvclN0YWNrRGVwbG95KHRoaXMuY2ZuLCB0aGlzLnN0YWNrTmFtZSk7XG5cbiAgICAgIC8vIFRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4sIGJ1dCBjYXRjaCBpdCBhbnl3YXkuIFlvdSBuZXZlciBrbm93LlxuICAgICAgaWYgKCFzdWNjZXNzU3RhY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignU3RhY2sgZGVwbG95IGZhaWxlZCAodGhlIHN0YWNrIGRpc2FwcGVhcmVkIHdoaWxlIHdlIHdlcmUgZGVwbG95aW5nIGl0KScpO1xuICAgICAgfVxuICAgICAgZmluYWxTdGF0ZSA9IHN1Y2Nlc3NTdGFjaztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3Ioc3VmZml4V2l0aEVycm9ycyhmb3JtYXRFcnJvck1lc3NhZ2UoZSksIG1vbml0b3I/LmVycm9ycykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBtb25pdG9yPy5zdG9wKCk7XG4gICAgfVxuICAgIGRlYnVnKCdTdGFjayAlcyBoYXMgY29tcGxldGVkIHVwZGF0aW5nJywgdGhpcy5zdGFja05hbWUpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZGlkLWRlcGxveS1zdGFjaycsXG4gICAgICBub09wOiBmYWxzZSxcbiAgICAgIG91dHB1dHM6IGZpbmFsU3RhdGUub3V0cHV0cyxcbiAgICAgIHN0YWNrQXJuOiBmaW5hbFN0YXRlLnN0YWNrSWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9wdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gQ3JlYXRlU3RhY2ssIFVwZGF0ZVN0YWNrIGFuZCBDcmVhdGVDaGFuZ2VTZXRcbiAgICovXG4gIHByaXZhdGUgY29tbW9uUHJlcGFyZU9wdGlvbnMoKTogUGFydGlhbDxQaWNrPFVwZGF0ZVN0YWNrQ29tbWFuZElucHV0LCBDb21tb25QcmVwYXJlT3B0aW9ucz4+IHtcbiAgICByZXR1cm4ge1xuICAgICAgQ2FwYWJpbGl0aWVzOiBbJ0NBUEFCSUxJVFlfSUFNJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJywgJ0NBUEFCSUxJVFlfQVVUT19FWFBBTkQnXSxcbiAgICAgIE5vdGlmaWNhdGlvbkFSTnM6IHRoaXMub3B0aW9ucy5ub3RpZmljYXRpb25Bcm5zLFxuICAgICAgUGFyYW1ldGVyczogdGhpcy5zdGFja1BhcmFtcy5hcGlQYXJhbWV0ZXJzLFxuICAgICAgUm9sZUFSTjogdGhpcy5vcHRpb25zLnJvbGVBcm4sXG4gICAgICBUZW1wbGF0ZUJvZHk6IHRoaXMuYm9keVBhcmFtZXRlci5UZW1wbGF0ZUJvZHksXG4gICAgICBUZW1wbGF0ZVVSTDogdGhpcy5ib2R5UGFyYW1ldGVyLlRlbXBsYXRlVVJMLFxuICAgICAgVGFnczogdGhpcy5vcHRpb25zLnRhZ3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG9wdGlvbnMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gVXBkYXRlU3RhY2sgYW5kIENyZWF0ZUNoYW5nZVNldFxuICAgKlxuICAgKiBCZSBjYXJlZnVsIG5vdCB0byBhZGQgaW4ga2V5cyBmb3Igb3B0aW9ucyB0aGF0IGFyZW4ndCB1c2VkLCBhcyB0aGUgZmVhdHVyZXMgbWF5IG5vdCBoYXZlIGJlZW5cbiAgICogZGVwbG95ZWQgZXZlcnl3aGVyZSB5ZXQuXG4gICAqL1xuICBwcml2YXRlIGNvbW1vbkV4ZWN1dGVPcHRpb25zKCk6IFBhcnRpYWw8UGljazxVcGRhdGVTdGFja0NvbW1hbmRJbnB1dCwgQ29tbW9uRXhlY3V0ZU9wdGlvbnM+PiB7XG4gICAgY29uc3Qgc2hvdWxkRGlzYWJsZVJvbGxiYWNrID0gdGhpcy5vcHRpb25zLnJvbGxiYWNrID09PSBmYWxzZTtcblxuICAgIHJldHVybiB7XG4gICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgLi4uKHNob3VsZERpc2FibGVSb2xsYmFjayA/IHsgRGlzYWJsZVJvbGxiYWNrOiB0cnVlIH0gOiB1bmRlZmluZWQpLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXN0cm95U3RhY2tPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0byBiZSBkZXN0cm95ZWRcbiAgICovXG4gIHN0YWNrOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgc2RrOiBTREs7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG4gIGRlcGxveU5hbWU/OiBzdHJpbmc7XG4gIHF1aWV0PzogYm9vbGVhbjtcbiAgY2k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVzdHJveVN0YWNrKG9wdGlvbnM6IERlc3Ryb3lTdGFja09wdGlvbnMpIHtcbiAgY29uc3QgZGVwbG95TmFtZSA9IG9wdGlvbnMuZGVwbG95TmFtZSB8fCBvcHRpb25zLnN0YWNrLnN0YWNrTmFtZTtcbiAgY29uc3QgY2ZuID0gb3B0aW9ucy5zZGsuY2xvdWRGb3JtYXRpb24oKTtcblxuICBjb25zdCBjdXJyZW50U3RhY2sgPSBhd2FpdCBDbG91ZEZvcm1hdGlvblN0YWNrLmxvb2t1cChjZm4sIGRlcGxveU5hbWUpO1xuICBpZiAoIWN1cnJlbnRTdGFjay5leGlzdHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbW9uaXRvciA9IG9wdGlvbnMucXVpZXRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogU3RhY2tBY3Rpdml0eU1vbml0b3Iud2l0aERlZmF1bHRQcmludGVyKGNmbiwgZGVwbG95TmFtZSwgb3B0aW9ucy5zdGFjaywge1xuICAgICAgY2k6IG9wdGlvbnMuY2ksXG4gICAgfSkuc3RhcnQoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGNmbi5kZWxldGVTdGFjayh7IFN0YWNrTmFtZTogZGVwbG95TmFtZSwgUm9sZUFSTjogb3B0aW9ucy5yb2xlQXJuIH0pO1xuICAgIGNvbnN0IGRlc3Ryb3llZFN0YWNrID0gYXdhaXQgd2FpdEZvclN0YWNrRGVsZXRlKGNmbiwgZGVwbG95TmFtZSk7XG4gICAgaWYgKGRlc3Ryb3llZFN0YWNrICYmIGRlc3Ryb3llZFN0YWNrLnN0YWNrU3RhdHVzLm5hbWUgIT09ICdERUxFVEVfQ09NUExFVEUnKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGBGYWlsZWQgdG8gZGVzdHJveSAke2RlcGxveU5hbWV9OiAke2Rlc3Ryb3llZFN0YWNrLnN0YWNrU3RhdHVzfWApO1xuICAgIH1cbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihzdWZmaXhXaXRoRXJyb3JzKGZvcm1hdEVycm9yTWVzc2FnZShlKSwgbW9uaXRvcj8uZXJyb3JzKSk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG1vbml0b3IpIHtcbiAgICAgIGF3YWl0IG1vbml0b3Iuc3RvcCgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHdlIGNhbiBza2lwIGRlcGxveW1lbnRcbiAqXG4gKiBXZSBkbyB0aGlzIGluIGEgY29tcGxpY2F0ZWQgd2F5IGJ5IHByZXByb2Nlc3NpbmcgKGluc3RlYWQgb2YganVzdFxuICogbG9va2luZyBhdCB0aGUgY2hhbmdlc2V0KSwgYmVjYXVzZSBpZiB0aGVyZSBhcmUgbmVzdGVkIHN0YWNrcyBpbnZvbHZlZFxuICogdGhlIGNoYW5nZXNldCB3aWxsIGFsd2F5cyBzaG93IHRoZSBuZXN0ZWQgc3RhY2tzIGFzIG5lZWRpbmcgdG8gYmVcbiAqIHVwZGF0ZWQsIGFuZCB0aGUgZGVwbG95bWVudCB3aWxsIHRha2UgYSBsb25nIHRpbWUgdG8gaW4gZWZmZWN0IG5vdFxuICogZG8gYW55dGhpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNhblNraXBEZXBsb3koXG4gIGRlcGxveVN0YWNrT3B0aW9uczogRGVwbG95U3RhY2tPcHRpb25zLFxuICBjbG91ZEZvcm1hdGlvblN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrLFxuICBwYXJhbWV0ZXJDaGFuZ2VzOiBQYXJhbWV0ZXJDaGFuZ2VzLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlcGxveU5hbWUgPSBkZXBsb3lTdGFja09wdGlvbnMuZGVwbG95TmFtZSB8fCBkZXBsb3lTdGFja09wdGlvbnMuc3RhY2suc3RhY2tOYW1lO1xuICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogY2hlY2tpbmcgaWYgd2UgY2FuIHNraXAgZGVwbG95YCk7XG5cbiAgLy8gRm9yY2VkIGRlcGxveVxuICBpZiAoZGVwbG95U3RhY2tPcHRpb25zLmZvcmNlKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IGZvcmNlZCBkZXBsb3ltZW50YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ3JlYXRpbmcgY2hhbmdlc2V0IG9ubHkgKGRlZmF1bHQgdHJ1ZSksIG5ldmVyIHNraXBcbiAgaWYgKFxuICAgIGRlcGxveVN0YWNrT3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kPy5tZXRob2QgPT09ICdjaGFuZ2Utc2V0JyAmJlxuICAgIGRlcGxveVN0YWNrT3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLmV4ZWN1dGUgPT09IGZhbHNlXG4gICkge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiAtLW5vLWV4ZWN1dGUsIGFsd2F5cyBjcmVhdGluZyBjaGFuZ2Ugc2V0YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gTm8gZXhpc3Rpbmcgc3RhY2tcbiAgaWYgKCFjbG91ZEZvcm1hdGlvblN0YWNrLmV4aXN0cykge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiBubyBleGlzdGluZyBzdGFja2ApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlbXBsYXRlIGhhcyBjaGFuZ2VkIChhc3NldHMgdGFrZW4gaW50byBhY2NvdW50IGhlcmUpXG4gIGlmIChKU09OLnN0cmluZ2lmeShkZXBsb3lTdGFja09wdGlvbnMuc3RhY2sudGVtcGxhdGUpICE9PSBKU09OLnN0cmluZ2lmeShhd2FpdCBjbG91ZEZvcm1hdGlvblN0YWNrLnRlbXBsYXRlKCkpKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IHRlbXBsYXRlIGhhcyBjaGFuZ2VkYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGFncyBoYXZlIGNoYW5nZWRcbiAgaWYgKCFjb21wYXJlVGFncyhjbG91ZEZvcm1hdGlvblN0YWNrLnRhZ3MsIGRlcGxveVN0YWNrT3B0aW9ucy50YWdzID8/IFtdKSkge1xuICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiB0YWdzIGhhdmUgY2hhbmdlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIE5vdGlmaWNhdGlvbiBhcm5zIGhhdmUgY2hhbmdlZFxuICBpZiAoIWFycmF5RXF1YWxzKGNsb3VkRm9ybWF0aW9uU3RhY2subm90aWZpY2F0aW9uQXJucywgZGVwbG95U3RhY2tPcHRpb25zLm5vdGlmaWNhdGlvbkFybnMgPz8gW10pKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IG5vdGlmaWNhdGlvbiBhcm5zIGhhdmUgY2hhbmdlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlcm1pbmF0aW9uIHByb3RlY3Rpb24gaGFzIGJlZW4gdXBkYXRlZFxuICBpZiAoISFkZXBsb3lTdGFja09wdGlvbnMuc3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uICE9PSAhIWNsb3VkRm9ybWF0aW9uU3RhY2sudGVybWluYXRpb25Qcm90ZWN0aW9uKSB7XG4gICAgZGVidWcoYCR7ZGVwbG95TmFtZX06IHRlcm1pbmF0aW9uIHByb3RlY3Rpb24gaGFzIGJlZW4gdXBkYXRlZGApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkXG4gIGlmIChwYXJhbWV0ZXJDaGFuZ2VzKSB7XG4gICAgaWYgKHBhcmFtZXRlckNoYW5nZXMgPT09ICdzc20nKSB7XG4gICAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogc29tZSBwYXJhbWV0ZXJzIGNvbWUgZnJvbSBTU00gc28gd2UgaGF2ZSB0byBhc3N1bWUgdGhleSBtYXkgaGF2ZSBjaGFuZ2VkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKGAke2RlcGxveU5hbWV9OiBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZGApO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFeGlzdGluZyBzdGFjayBpcyBpbiBhIGZhaWxlZCBzdGF0ZVxuICBpZiAoY2xvdWRGb3JtYXRpb25TdGFjay5zdGFja1N0YXR1cy5pc0ZhaWx1cmUpIHtcbiAgICBkZWJ1ZyhgJHtkZXBsb3lOYW1lfTogc3RhY2sgaXMgaW4gYSBmYWlsdXJlIHN0YXRlYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gV2UgY2FuIHNraXAgZGVwbG95XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBsaXN0IG9mIHRhZ3MsIHJldHVybnMgdHJ1ZSBpZiBpZGVudGljYWwuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVUYWdzKGE6IFRhZ1tdLCBiOiBUYWdbXSk6IGJvb2xlYW4ge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBhVGFnIG9mIGEpIHtcbiAgICBjb25zdCBiVGFnID0gYi5maW5kKCh0YWcpID0+IHRhZy5LZXkgPT09IGFUYWcuS2V5KTtcblxuICAgIGlmICghYlRhZyB8fCBiVGFnLlZhbHVlICE9PSBhVGFnLlZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHN1ZmZpeFdpdGhFcnJvcnMobXNnOiBzdHJpbmcsIGVycm9ycz86IHN0cmluZ1tdKSB7XG4gIHJldHVybiBlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDAgPyBgJHttc2d9OiAke2Vycm9ycy5qb2luKCcsICcpfWAgOiBtc2c7XG59XG5cbmZ1bmN0aW9uIGFycmF5RXF1YWxzKGE6IGFueVtdLCBiOiBhbnlbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5ldmVyeSgoaXRlbSkgPT4gYi5pbmNsdWRlcyhpdGVtKSkgJiYgYi5ldmVyeSgoaXRlbSkgPT4gYS5pbmNsdWRlcyhpdGVtKSk7XG59XG5cbmZ1bmN0aW9uIGhhc1JlcGxhY2VtZW50KGNzOiBEZXNjcmliZUNoYW5nZVNldENvbW1hbmRPdXRwdXQpIHtcbiAgcmV0dXJuIChjcy5DaGFuZ2VzID8/IFtdKS5zb21lKGMgPT4ge1xuICAgIGNvbnN0IGEgPSBjLlJlc291cmNlQ2hhbmdlPy5Qb2xpY3lBY3Rpb247XG4gICAgcmV0dXJuIGEgPT09ICdSZXBsYWNlQW5kRGVsZXRlJyB8fCBhID09PSAnUmVwbGFjZUFuZFJldGFpbicgfHwgYSA9PT0gJ1JlcGxhY2VBbmRTbmFwc2hvdCc7XG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type DeploymentMethod = DirectDeploymentMethod | ChangeSetDeploymentMethod;
|
|
2
|
+
export interface DirectDeploymentMethod {
|
|
3
|
+
readonly method: 'direct';
|
|
4
|
+
}
|
|
5
|
+
export interface ChangeSetDeploymentMethod {
|
|
6
|
+
readonly method: 'change-set';
|
|
7
|
+
/**
|
|
8
|
+
* Whether to execute the changeset or leave it in review.
|
|
9
|
+
*
|
|
10
|
+
* @default true
|
|
11
|
+
*/
|
|
12
|
+
readonly execute?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Optional name to use for the CloudFormation change set.
|
|
15
|
+
* If not provided, a name will be generated automatically.
|
|
16
|
+
*/
|
|
17
|
+
readonly changeSetName?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Indicates if the change set imports resources that already exist.
|
|
20
|
+
*
|
|
21
|
+
* @default false
|
|
22
|
+
*/
|
|
23
|
+
readonly importExistingResources?: boolean;
|
|
24
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudC1tZXRob2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3ltZW50LW1ldGhvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRGVwbG95bWVudE1ldGhvZCA9IERpcmVjdERlcGxveW1lbnRNZXRob2QgfCBDaGFuZ2VTZXREZXBsb3ltZW50TWV0aG9kO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdERlcGxveW1lbnRNZXRob2Qge1xuICByZWFkb25seSBtZXRob2Q6ICdkaXJlY3QnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYW5nZVNldERlcGxveW1lbnRNZXRob2Qge1xuICByZWFkb25seSBtZXRob2Q6ICdjaGFuZ2Utc2V0JztcblxuICAvKipcbiAgICogV2hldGhlciB0byBleGVjdXRlIHRoZSBjaGFuZ2VzZXQgb3IgbGVhdmUgaXQgaW4gcmV2aWV3LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBleGVjdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgbmFtZSB0byB1c2UgZm9yIHRoZSBDbG91ZEZvcm1hdGlvbiBjaGFuZ2Ugc2V0LlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIGEgbmFtZSB3aWxsIGJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlU2V0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBjaGFuZ2Ugc2V0IGltcG9ydHMgcmVzb3VyY2VzIHRoYXQgYWxyZWFkeSBleGlzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydEV4aXN0aW5nUmVzb3VyY2VzPzogYm9vbGVhbjtcbn1cbiJdfQ==
|