@mavogel/cdk-vscode-server 0.0.62 → 0.0.64
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/.jsii +124 -178
- package/API.md +105 -200
- package/CLAUDE.md +288 -58
- package/README.md +40 -2
- package/assets/idle-monitor-enabler/idle-monitor-enabler.lambda/index.js +67 -0
- package/assets/installer/installer.lambda/index.js +67 -30
- package/awslint.json +5 -0
- package/examples/auto-stop/main.ts +1 -1
- package/examples/custom/main.ts +1 -1
- package/examples/git-repo/main.ts +30 -0
- package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.assets.json +2 -2
- package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.template.json +1 -1
- package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.assets.json +8 -8
- package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.template.json +257 -94
- package/integ-tests/{integ.stop-on-idle.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.al2023.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.ubuntu.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.al2023.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.al2023.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.al2023.ts.snapshot/manifest.json +19 -3
- package/integ-tests/integ.al2023.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.assets.json +2 -2
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.template.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.assets.json +8 -8
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.template.json +273 -97
- package/integ-tests/{integ.ubuntu.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.custom-domain.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.al2023.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.custom-domain.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.custom-domain.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/manifest.json +25 -6
- package/integ-tests/integ.custom-domain.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.stop-on-idle.ts +1 -4
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.assets.json +2 -2
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.template.json +4 -4
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.assets.json +23 -9
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.template.json +758 -197
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.22c8a6c357b704e370bef317ae1b52c59f684aa7640422a3d1dfe813d1f77853.lambda/index.js +67 -0
- package/integ-tests/{integ.custom-domain.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.stop-on-idle.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/integ.stop-on-idle.ts.snapshot/manifest.json +363 -76
- package/integ-tests/integ.stop-on-idle.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +2 -2
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.assets.json +8 -8
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.template.json +273 -97
- package/integ-tests/{integ.al2023.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.ubuntu.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.custom-domain.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.ubuntu.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.ubuntu.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/manifest.json +25 -6
- package/integ-tests/integ.ubuntu.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.ubuntu24.ts +69 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +33 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +337 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.assets.json +118 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.template.json +2725 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/integ.json +23 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/manifest.json +1473 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/tree.json +1 -0
- package/integ-tests/integ.ubuntu25.ts +69 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/IntegSetupVSCodeOnUbuntu25DefaultTestDeployAssert48DBCF35.assets.json +33 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/IntegSetupVSCodeOnUbuntu25DefaultTestDeployAssert48DBCF35.template.json +337 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/IntegTestStackUbuntu25.assets.json +118 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/IntegTestStackUbuntu25.template.json +2725 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/integ.json +23 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/manifest.json +1473 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/tree.json +1 -0
- package/lib/idle-monitor/idle-monitor-function.js +2 -2
- package/lib/idle-monitor/idle-monitor.js +5 -2
- package/lib/idle-monitor-enabler/idle-monitor-enabler-function.d.ts +13 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler-function.js +22 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.d.ts +25 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.js +76 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.d.ts +9 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.js +48 -0
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -2
- package/lib/installer/installer-function.js +2 -2
- package/lib/installer/installer.d.ts +105 -0
- package/lib/installer/installer.js +659 -301
- package/lib/installer/installer.lambda.js +64 -30
- package/lib/mappings.js +11 -3
- package/lib/secret-retriever/secret-retriever-function.js +2 -2
- package/lib/vscode-server.d.ts +45 -1
- package/lib/vscode-server.js +35 -5
- package/package.json +12 -12
- package/.claude/hooks/file_checker.sh +0 -178
- package/.qlty/.gitignore +0 -7
- package/.qlty/configs/.yamllint.yaml +0 -21
- package/.qlty/qlty.toml +0 -115
- package/assets/status-check/status-check.lambda/index.js +0 -123
- package/integ-tests/integ.al2023.ts.snapshot/cdk.out +0 -1
- package/integ-tests/integ.al2023.ts.snapshot/read.13497.1.lock +0 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/read.13497.1.lock +0 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/cdk.out +0 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/read.13497.1.lock +0 -1
- package/lib/status-check/status-check-function.d.ts +0 -13
- package/lib/status-check/status-check-function.js +0 -22
- package/lib/status-check/status-check.d.ts +0 -36
- package/lib/status-check/status-check.js +0 -109
- package/lib/status-check/status-check.lambda.d.ts +0 -2
- package/lib/status-check/status-check.lambda.js +0 -104
|
@@ -19,7 +19,7 @@ class Installer {
|
|
|
19
19
|
documentName = options.documentName;
|
|
20
20
|
}
|
|
21
21
|
else {
|
|
22
|
-
const document = this.createSSMDocument(scope, devServerBasePath, devServerPort, options.vsCodeUser, options.homeFolder,
|
|
22
|
+
const document = this.createSSMDocument(scope, devServerBasePath, devServerPort, options.vsCodeUser, options.homeFolder, options.linuxFlavorType, options.customDomainName, options.repoUrl, options.assetZipS3Path, options.branchZipS3Path, options.folderZipS3Path);
|
|
23
23
|
documentName = document.name;
|
|
24
24
|
}
|
|
25
25
|
const cloudWatchLogGroupName = options.cloudWatchLogGroupName ?? `/aws/ssm/${documentName}`;
|
|
@@ -45,7 +45,7 @@ class Installer {
|
|
|
45
45
|
documentName = options.documentName;
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
|
-
const document = this.createSSMDocument(scope, devServerBasePath, devServerPort, options.vsCodeUser, options.homeFolder, vscode_server_1.LinuxFlavorType.AMAZON_LINUX_2023, options.customDomainName);
|
|
48
|
+
const document = this.createSSMDocument(scope, devServerBasePath, devServerPort, options.vsCodeUser, options.homeFolder, vscode_server_1.LinuxFlavorType.AMAZON_LINUX_2023, options.customDomainName, options.repoUrl, options.assetZipS3Path, options.branchZipS3Path, options.folderZipS3Path);
|
|
49
49
|
documentName = document.name;
|
|
50
50
|
}
|
|
51
51
|
const cloudWatchLogGroupName = options.cloudWatchLogGroupName ?? `/aws/ssm/${documentName}`;
|
|
@@ -65,7 +65,403 @@ class Installer {
|
|
|
65
65
|
* @internal
|
|
66
66
|
*/
|
|
67
67
|
constructor() { }
|
|
68
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Creates the InstallCloudWatchAgent step for SSM document
|
|
70
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
71
|
+
*/
|
|
72
|
+
createInstallCloudWatchAgentStep() {
|
|
73
|
+
return {
|
|
74
|
+
action: 'aws:configurePackage',
|
|
75
|
+
name: 'InstallCloudWatchAgent',
|
|
76
|
+
inputs: {
|
|
77
|
+
name: 'AmazonCloudWatchAgent',
|
|
78
|
+
action: 'Install',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Creates the ConfigureCloudWatchAgent step for SSM document
|
|
84
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
85
|
+
*/
|
|
86
|
+
createConfigureCloudWatchAgentStep() {
|
|
87
|
+
return {
|
|
88
|
+
action: 'aws:runDocument',
|
|
89
|
+
name: 'ConfigureCloudWatchAgent',
|
|
90
|
+
inputs: {
|
|
91
|
+
documentType: 'SSMDocument',
|
|
92
|
+
documentPath: 'AmazonCloudWatch-ManageAgent',
|
|
93
|
+
documentParameters: {
|
|
94
|
+
action: 'configure',
|
|
95
|
+
mode: 'ec2',
|
|
96
|
+
optionalConfigurationSource: 'default',
|
|
97
|
+
optionalRestart: 'yes',
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Creates the UpdateProfile step for SSM document
|
|
104
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
105
|
+
*/
|
|
106
|
+
createUpdateProfileStep(vsCodeUser, region, account) {
|
|
107
|
+
return {
|
|
108
|
+
action: 'aws:runShellScript',
|
|
109
|
+
name: 'UpdateProfile',
|
|
110
|
+
inputs: {
|
|
111
|
+
runCommand: [
|
|
112
|
+
'#!/bin/bash',
|
|
113
|
+
'echo LANG=en_US.utf-8 >> /etc/environment',
|
|
114
|
+
'echo LC_ALL=en_US.UTF-8 >> /etc/environment',
|
|
115
|
+
`echo 'PATH=$PATH:/home/${vsCodeUser}/.local/bin' >> /home/${vsCodeUser}/.bashrc`,
|
|
116
|
+
`echo 'export PATH' >> /home/${vsCodeUser}/.bashrc`,
|
|
117
|
+
`echo 'export AWS_REGION=${region}' >> /home/${vsCodeUser}/.bashrc`,
|
|
118
|
+
`echo 'export AWS_ACCOUNTID=${account}' >> /home/${vsCodeUser}/.bashrc`,
|
|
119
|
+
`echo 'export NEXT_TELEMETRY_DISABLED=1' >> /home/${vsCodeUser}/.bashrc`,
|
|
120
|
+
`echo "export PS1='\\[\\033[01;32m\\]\\u:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '" >> /home/${vsCodeUser}/.bashrc`,
|
|
121
|
+
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Creates the InstallAWSCLI step for SSM document
|
|
128
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
129
|
+
*/
|
|
130
|
+
createInstallAWSCLIStep(vsCodeUser) {
|
|
131
|
+
return {
|
|
132
|
+
action: 'aws:runShellScript',
|
|
133
|
+
name: 'InstallAWSCLI',
|
|
134
|
+
inputs: {
|
|
135
|
+
runCommand: [
|
|
136
|
+
'#!/bin/bash',
|
|
137
|
+
'mkdir -p /tmp',
|
|
138
|
+
'curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip -o /tmp/aws-cli.zip',
|
|
139
|
+
`chown -R ${vsCodeUser}:${vsCodeUser} /tmp/aws-cli.zip`,
|
|
140
|
+
'unzip -q -d /tmp /tmp/aws-cli.zip',
|
|
141
|
+
'sudo /tmp/aws/install',
|
|
142
|
+
'rm -rf /tmp/aws',
|
|
143
|
+
'echo "AWS CLI installed. Checking configuration"',
|
|
144
|
+
'aws --version',
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Creates the CloneRepo step for SSM document
|
|
151
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
152
|
+
*/
|
|
153
|
+
createCloneRepoStep(vsCodeUser, homeFolder) {
|
|
154
|
+
return {
|
|
155
|
+
action: 'aws:runShellScript',
|
|
156
|
+
name: 'CloneRepo',
|
|
157
|
+
inputs: {
|
|
158
|
+
runCommand: [
|
|
159
|
+
'#!/bin/bash',
|
|
160
|
+
`if [[ -z "{{ RepoUrl }}" ]]
|
|
161
|
+
then
|
|
162
|
+
echo "No Repo"
|
|
163
|
+
else
|
|
164
|
+
mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
|
|
165
|
+
sudo -u ${vsCodeUser} git clone {{ RepoUrl }} ${homeFolder}
|
|
166
|
+
echo "Repo {{ RepoUrl }} cloned. Checking configuration"
|
|
167
|
+
ls -la ${homeFolder}
|
|
168
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} remote -v
|
|
169
|
+
fi`,
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Creates the DownloadAssets step for SSM document
|
|
176
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
177
|
+
*/
|
|
178
|
+
createDownloadAssetsStep(vsCodeUser, homeFolder) {
|
|
179
|
+
return {
|
|
180
|
+
action: 'aws:runShellScript',
|
|
181
|
+
name: 'DownloadAssets',
|
|
182
|
+
inputs: {
|
|
183
|
+
runCommand: [
|
|
184
|
+
'#!/bin/bash',
|
|
185
|
+
`if [[ -z "{{ AssetZipS3Path }}" ]]
|
|
186
|
+
then
|
|
187
|
+
echo "No assets"
|
|
188
|
+
else
|
|
189
|
+
mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
|
|
190
|
+
mkdir -p /tmp
|
|
191
|
+
aws s3 cp s3://{{ AssetZipS3Path }} /tmp/asset.zip
|
|
192
|
+
chown -R ${vsCodeUser}:${vsCodeUser} /tmp/asset.zip
|
|
193
|
+
unzip -o /tmp/asset.zip -d ${homeFolder}
|
|
194
|
+
chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
|
|
195
|
+
if [[ -d ${homeFolder}/.git ]]
|
|
196
|
+
then
|
|
197
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} add .
|
|
198
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} commit -m 'chore: workshop commit'
|
|
199
|
+
else
|
|
200
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} init
|
|
201
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} add .
|
|
202
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} commit -m 'chore: initial commit'
|
|
203
|
+
fi
|
|
204
|
+
echo "Assets downloaded. Checking configuration: ${homeFolder}"
|
|
205
|
+
ls -la ${homeFolder}
|
|
206
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} branch
|
|
207
|
+
fi`,
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Creates the DownloadFolders step for SSM document
|
|
214
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
215
|
+
*/
|
|
216
|
+
createDownloadFoldersStep(vsCodeUser, homeFolder) {
|
|
217
|
+
return {
|
|
218
|
+
action: 'aws:runShellScript',
|
|
219
|
+
name: 'DownloadFolders',
|
|
220
|
+
inputs: {
|
|
221
|
+
runCommand: [
|
|
222
|
+
'#!/bin/bash',
|
|
223
|
+
`if [[ -z "{{ FolderZipS3Path }}" ]]
|
|
224
|
+
then
|
|
225
|
+
echo "No folders"
|
|
226
|
+
else
|
|
227
|
+
rm -rf /tmp/folder
|
|
228
|
+
mkdir -p /tmp/folder && chown -R ${vsCodeUser}:${vsCodeUser} /tmp/folder
|
|
229
|
+
aws s3 cp s3://{{ FolderZipS3Path }} /tmp/asset-folder.zip
|
|
230
|
+
chown -R ${vsCodeUser}:${vsCodeUser} /tmp/asset-folder.zip
|
|
231
|
+
unzip -o /tmp/asset-folder.zip -d /tmp/folder
|
|
232
|
+
chown -R ${vsCodeUser}:${vsCodeUser} /tmp/folder
|
|
233
|
+
mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
|
|
234
|
+
cd "${homeFolder}" && cd ..
|
|
235
|
+
if [[ $(pwd) == "/" ]]
|
|
236
|
+
then
|
|
237
|
+
targetRootFolder=""
|
|
238
|
+
else
|
|
239
|
+
targetRootFolder=$(pwd)
|
|
240
|
+
chown -R ${vsCodeUser}:${vsCodeUser} .
|
|
241
|
+
fi
|
|
242
|
+
find "/tmp/folder" -maxdepth 1 -mindepth 1 -type d | while read sourceFolder; do
|
|
243
|
+
folder="$(basename $sourceFolder)"
|
|
244
|
+
echo "Processing folder: $folder"
|
|
245
|
+
targetFolder=$targetRootFolder/$folder
|
|
246
|
+
if [[ $targetRootFolder == "" ]]
|
|
247
|
+
then
|
|
248
|
+
mv $sourceFolder /
|
|
249
|
+
else
|
|
250
|
+
mv $sourceFolder $targetRootFolder
|
|
251
|
+
fi
|
|
252
|
+
chown -R ${vsCodeUser}:${vsCodeUser} $targetFolder
|
|
253
|
+
sudo -u ${vsCodeUser} git -C $targetFolder init
|
|
254
|
+
sudo -u ${vsCodeUser} git -C $targetFolder add .
|
|
255
|
+
sudo -u ${vsCodeUser} git -C $targetFolder commit -m "chore: initial commit"
|
|
256
|
+
echo "Folder downloaded. Checking configuration: $targetFolder"
|
|
257
|
+
ls -la $targetFolder
|
|
258
|
+
done
|
|
259
|
+
rm -rf /tmp/folder
|
|
260
|
+
fi`,
|
|
261
|
+
],
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Creates the InstallCDK step for SSM document
|
|
267
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
268
|
+
*/
|
|
269
|
+
createInstallCDKStep() {
|
|
270
|
+
return {
|
|
271
|
+
action: 'aws:runShellScript',
|
|
272
|
+
name: 'InstallCDK',
|
|
273
|
+
inputs: {
|
|
274
|
+
runCommand: [
|
|
275
|
+
'#!/bin/bash',
|
|
276
|
+
'npm install -g aws-cdk',
|
|
277
|
+
'echo "AWS CDK installed. Checking configuration"',
|
|
278
|
+
'cdk --version',
|
|
279
|
+
],
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Creates the InstallQCLI step for SSM document
|
|
285
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
286
|
+
*/
|
|
287
|
+
createInstallQCLIStep(vsCodeUser) {
|
|
288
|
+
return {
|
|
289
|
+
action: 'aws:runShellScript',
|
|
290
|
+
name: 'InstallQCLI',
|
|
291
|
+
inputs: {
|
|
292
|
+
runCommand: [
|
|
293
|
+
'#!/bin/bash',
|
|
294
|
+
'curl --proto \'=https\' --tlsv1.2 -sSf "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-$(uname -m)-linux.zip" -o /tmp/q.zip',
|
|
295
|
+
`chown -R ${vsCodeUser}:${vsCodeUser} /tmp/q.zip`,
|
|
296
|
+
'unzip -q -d /tmp /tmp/q.zip',
|
|
297
|
+
`chown -R ${vsCodeUser}:${vsCodeUser} /tmp/q`,
|
|
298
|
+
'chmod +x /tmp/q/install.sh',
|
|
299
|
+
`sudo -u ${vsCodeUser} /tmp/q/install.sh --no-confirm`,
|
|
300
|
+
'rm -rf /tmp/q',
|
|
301
|
+
'q --version',
|
|
302
|
+
'echo "Amazon Q CLI installed"',
|
|
303
|
+
],
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Creates the Installuv step for SSM document
|
|
309
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
310
|
+
*/
|
|
311
|
+
createInstalluvStep(vsCodeUser) {
|
|
312
|
+
return {
|
|
313
|
+
action: 'aws:runShellScript',
|
|
314
|
+
name: 'Installuv',
|
|
315
|
+
inputs: {
|
|
316
|
+
runCommand: [
|
|
317
|
+
'#!/bin/bash',
|
|
318
|
+
`sudo -u ${vsCodeUser} --login curl -fsSL https://astral.sh/uv/install.sh -o /tmp/uv_install.sh`,
|
|
319
|
+
`sudo -u ${vsCodeUser} --login bash /tmp/uv_install.sh`,
|
|
320
|
+
`if uv generate-shell-completion bash &>/dev/null; then
|
|
321
|
+
echo 'eval "$(uv generate-shell-completion bash)"' >> /home/${vsCodeUser}/.bashrc
|
|
322
|
+
fi`,
|
|
323
|
+
`if uvx generate-shell-completion bash &>/dev/null; then
|
|
324
|
+
echo 'eval "$(uvx generate-shell-completion bash)"' >> /home/${vsCodeUser}/.bashrc
|
|
325
|
+
fi`,
|
|
326
|
+
'echo "uv installed. Checking configuration"',
|
|
327
|
+
`sudo -u ${vsCodeUser} --login uv --version`,
|
|
328
|
+
],
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Creates the ConfigureCodeServer step for SSM document
|
|
334
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
335
|
+
*/
|
|
336
|
+
createConfigureCodeServerStep(vsCodeUser, homeFolder, devServerBasePath, devServerPort, serverNameDirective) {
|
|
337
|
+
return {
|
|
338
|
+
action: 'aws:runShellScript',
|
|
339
|
+
name: 'ConfigureCodeServer',
|
|
340
|
+
inputs: {
|
|
341
|
+
runCommand: [
|
|
342
|
+
'#!/bin/bash',
|
|
343
|
+
`export HOME=/home/${vsCodeUser}`,
|
|
344
|
+
'curl -fsSL https://code-server.dev/install.sh | sh -s -- --version 4.100.3',
|
|
345
|
+
`systemctl enable --now code-server@${vsCodeUser} 2>&1`,
|
|
346
|
+
`tee /etc/nginx/conf.d/code-server.conf <<EOF
|
|
347
|
+
server {
|
|
348
|
+
listen 80;
|
|
349
|
+
listen [::]:80;
|
|
350
|
+
# server_name \\$\\{CloudFrontDistribution.DomainName\\};
|
|
351
|
+
${serverNameDirective}
|
|
352
|
+
location / {
|
|
353
|
+
proxy_pass http://localhost:8080/;
|
|
354
|
+
proxy_set_header Host \\$host;
|
|
355
|
+
proxy_set_header Upgrade \\$http_upgrade;
|
|
356
|
+
proxy_set_header Connection upgrade;
|
|
357
|
+
proxy_set_header Accept-Encoding gzip;
|
|
358
|
+
}
|
|
359
|
+
location /${devServerBasePath} {
|
|
360
|
+
proxy_pass http://localhost:${devServerPort}/${devServerBasePath};
|
|
361
|
+
proxy_set_header Host \\$host;
|
|
362
|
+
proxy_set_header Upgrade \\$http_upgrade;
|
|
363
|
+
proxy_set_header Connection upgrade;
|
|
364
|
+
proxy_set_header Accept-Encoding gzip;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
EOF`,
|
|
368
|
+
`mkdir -p /home/${vsCodeUser}/.config/code-server`,
|
|
369
|
+
`tee /home/${vsCodeUser}/.config/code-server/config.yaml <<EOF
|
|
370
|
+
cert: false
|
|
371
|
+
auth: password
|
|
372
|
+
hashed-password: "$(echo -n {{ VSCodePassword }} | argon2 $(openssl rand -base64 12) -e)"
|
|
373
|
+
EOF`,
|
|
374
|
+
`mkdir -p /home/${vsCodeUser}/.local/share/code-server/User/`,
|
|
375
|
+
`touch /home/${vsCodeUser}/.hushlogin`,
|
|
376
|
+
`mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}`,
|
|
377
|
+
`tee /home/${vsCodeUser}/.local/share/code-server/User/settings.json <<EOF
|
|
378
|
+
{
|
|
379
|
+
"extensions.autoUpdate": false,
|
|
380
|
+
"extensions.autoCheckUpdates": false,
|
|
381
|
+
"telemetry.telemetryLevel": "off",
|
|
382
|
+
"security.workspace.trust.startupPrompt": "never",
|
|
383
|
+
"security.workspace.trust.enabled": false,
|
|
384
|
+
"security.workspace.trust.banner": "never",
|
|
385
|
+
"security.workspace.trust.emptyWindow": false,
|
|
386
|
+
"auto-run-command.rules": [
|
|
387
|
+
{
|
|
388
|
+
"command": "workbench.action.terminal.new"
|
|
389
|
+
}
|
|
390
|
+
]
|
|
391
|
+
}
|
|
392
|
+
EOF`,
|
|
393
|
+
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
394
|
+
`systemctl restart code-server@${vsCodeUser}`,
|
|
395
|
+
'systemctl restart nginx',
|
|
396
|
+
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force`,
|
|
397
|
+
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force`,
|
|
398
|
+
`sudo -u ${vsCodeUser} --login code-server --install-extension ms-vscode.live-server --force`,
|
|
399
|
+
`sudo -u ${vsCodeUser} --login code-server --install-extension synedra.auto-run-command --force`,
|
|
400
|
+
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
401
|
+
'echo "Nginx installed. Checking configuration"',
|
|
402
|
+
'nginx -t 2>&1',
|
|
403
|
+
'systemctl status nginx',
|
|
404
|
+
'echo "CodeServer installed. Checking configuration"',
|
|
405
|
+
'code-server -v',
|
|
406
|
+
`systemctl status code-server@${vsCodeUser}`,
|
|
407
|
+
],
|
|
408
|
+
},
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Creates the DownloadBranches step for SSM document
|
|
413
|
+
* This step is identical for both Ubuntu and Amazon Linux
|
|
414
|
+
*/
|
|
415
|
+
createDownloadBranchesStep(vsCodeUser, homeFolder) {
|
|
416
|
+
return {
|
|
417
|
+
action: 'aws:runShellScript',
|
|
418
|
+
name: 'DownloadBranches',
|
|
419
|
+
inputs: {
|
|
420
|
+
runCommand: [
|
|
421
|
+
'#!/bin/bash',
|
|
422
|
+
`if [[ -z "{{ BranchZipS3Path }}" ]]
|
|
423
|
+
then
|
|
424
|
+
echo "No branches"
|
|
425
|
+
else
|
|
426
|
+
rm -rf /tmp/branch
|
|
427
|
+
rm -rf /tmp/git
|
|
428
|
+
mkdir -p /tmp/branch && chown -R ${vsCodeUser}:${vsCodeUser} /tmp/branch
|
|
429
|
+
mkdir -p /tmp/git && chown -R ${vsCodeUser}:${vsCodeUser} /tmp/git
|
|
430
|
+
aws s3 cp s3://{{ BranchZipS3Path }} /tmp/asset-branch.zip
|
|
431
|
+
chown -R ${vsCodeUser}:${vsCodeUser} /tmp/asset-branch.zip
|
|
432
|
+
unzip -o /tmp/asset-branch.zip -d /tmp/branch
|
|
433
|
+
chown -R ${vsCodeUser}:${vsCodeUser} /tmp/branch
|
|
434
|
+
mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
|
|
435
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} init
|
|
436
|
+
mv ${homeFolder}/.git /tmp/git
|
|
437
|
+
rm -rf ${homeFolder}
|
|
438
|
+
mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
|
|
439
|
+
mv /tmp/git/.git ${homeFolder}
|
|
440
|
+
find /tmp/branch -maxdepth 1 -mindepth 1 -type d | while read sourceFolder; do
|
|
441
|
+
branch="$(basename $sourceFolder)"
|
|
442
|
+
echo "Processing branch: $branch"
|
|
443
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} checkout -b $branch 2>&1
|
|
444
|
+
cp -a $sourceFolder/. ${homeFolder}
|
|
445
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} add .
|
|
446
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} commit -m "chore: initial commit $branch"
|
|
447
|
+
mv ${homeFolder}/.git /tmp/git
|
|
448
|
+
rm -rf ${homeFolder}
|
|
449
|
+
mkdir ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
|
|
450
|
+
mv /tmp/git/.git ${homeFolder}
|
|
451
|
+
done
|
|
452
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} checkout main 2>&1
|
|
453
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} restore .
|
|
454
|
+
rm -rf /tmp/branch
|
|
455
|
+
rm -rf /tmp/git
|
|
456
|
+
echo "Branches downloaded. Checking configuration: ${homeFolder}"
|
|
457
|
+
sudo -u ${vsCodeUser} git -C ${homeFolder} branch
|
|
458
|
+
ls -la ${homeFolder}
|
|
459
|
+
fi`,
|
|
460
|
+
],
|
|
461
|
+
},
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
createSSMDocument(scope, devServerBasePath, devServerPort, vsCodeUser, homeFolder, linuxFlavor, customDomainName, repoUrl, assetZipS3Path, branchZipS3Path, folderZipS3Path) {
|
|
69
465
|
// Generate nginx server_name directive based on custom domain
|
|
70
466
|
const serverNameDirective = customDomainName
|
|
71
467
|
? `server_name *.cloudfront.net ${customDomainName};`
|
|
@@ -74,6 +470,7 @@ class Installer {
|
|
|
74
470
|
switch (linuxFlavor) {
|
|
75
471
|
case vscode_server_1.LinuxFlavorType.UBUNTU_22:
|
|
76
472
|
case vscode_server_1.LinuxFlavorType.UBUNTU_24:
|
|
473
|
+
case vscode_server_1.LinuxFlavorType.UBUNTU_25:
|
|
77
474
|
// Create an SSM document with multiple actions to install the software
|
|
78
475
|
ssmDocument = new ssm.CfnDocument(scope, 'ssm-document-ubuntu', {
|
|
79
476
|
name: `vscode-server-ubuntu-${core_1.Stack.of(scope).stackName}`,
|
|
@@ -88,45 +485,37 @@ class Installer {
|
|
|
88
485
|
},
|
|
89
486
|
NodeVersion: {
|
|
90
487
|
type: 'String',
|
|
91
|
-
default: '
|
|
92
|
-
allowedValues: ['22', '20', '18'],
|
|
488
|
+
default: '22',
|
|
489
|
+
allowedValues: ['24', '22', '20', '18'],
|
|
490
|
+
},
|
|
491
|
+
RepoUrl: {
|
|
492
|
+
type: 'String',
|
|
493
|
+
default: repoUrl ?? '',
|
|
494
|
+
},
|
|
495
|
+
AssetZipS3Path: {
|
|
496
|
+
type: 'String',
|
|
497
|
+
default: assetZipS3Path ?? '',
|
|
93
498
|
},
|
|
94
|
-
|
|
499
|
+
BranchZipS3Path: {
|
|
95
500
|
type: 'String',
|
|
96
|
-
default: '
|
|
97
|
-
|
|
501
|
+
default: branchZipS3Path ?? '',
|
|
502
|
+
},
|
|
503
|
+
FolderZipS3Path: {
|
|
504
|
+
type: 'String',
|
|
505
|
+
default: folderZipS3Path ?? '',
|
|
98
506
|
},
|
|
99
507
|
},
|
|
100
508
|
// all mainSteps scripts are in in /var/lib/amazon/ssm/<instanceid>/document/orchestration/<uuid>/<StepName>/_script.sh
|
|
101
509
|
mainSteps: [
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
name: 'InstallCloudWatchAgent',
|
|
105
|
-
inputs: {
|
|
106
|
-
name: 'AmazonCloudWatchAgent',
|
|
107
|
-
action: 'Install',
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
action: 'aws:runDocument',
|
|
112
|
-
name: 'ConfigureCloudWatchAgent',
|
|
113
|
-
inputs: {
|
|
114
|
-
documentType: 'SSMDocument',
|
|
115
|
-
documentPath: 'AmazonCloudWatch-ManageAgent',
|
|
116
|
-
documentParameters: {
|
|
117
|
-
action: 'configure',
|
|
118
|
-
mode: 'ec2',
|
|
119
|
-
optionalConfigurationSource: 'default',
|
|
120
|
-
optionalRestart: 'yes',
|
|
121
|
-
},
|
|
122
|
-
},
|
|
123
|
-
},
|
|
510
|
+
this.createInstallCloudWatchAgentStep(),
|
|
511
|
+
this.createConfigureCloudWatchAgentStep(),
|
|
124
512
|
{
|
|
125
513
|
action: 'aws:runShellScript',
|
|
126
514
|
name: 'InstallAptPackagesApt',
|
|
127
515
|
inputs: {
|
|
128
516
|
runCommand: [
|
|
129
517
|
'#!/bin/bash',
|
|
518
|
+
'dpkg --configure -a',
|
|
130
519
|
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q apt-utils',
|
|
131
520
|
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q needrestart unattended-upgrades',
|
|
132
521
|
"sed -i 's/#$nrconf{kernelhints} = -1;/$nrconf{kernelhints} = 0;/' /etc/needrestart/needrestart.conf",
|
|
@@ -143,7 +532,8 @@ class Installer {
|
|
|
143
532
|
inputs: {
|
|
144
533
|
runCommand: [
|
|
145
534
|
'#!/bin/bash',
|
|
146
|
-
'
|
|
535
|
+
'dpkg --configure -a',
|
|
536
|
+
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl gnupg whois argon2 unzip nginx openssl locales locales-all apt-transport-https ca-certificates software-properties-common',
|
|
147
537
|
],
|
|
148
538
|
},
|
|
149
539
|
},
|
|
@@ -153,68 +543,69 @@ class Installer {
|
|
|
153
543
|
inputs: {
|
|
154
544
|
runCommand: [
|
|
155
545
|
'#!/bin/bash',
|
|
156
|
-
|
|
157
|
-
`
|
|
158
|
-
|
|
159
|
-
|
|
546
|
+
'dpkg --configure -a',
|
|
547
|
+
`if [[ "${vsCodeUser}" == "ubuntu" ]]
|
|
548
|
+
then
|
|
549
|
+
echo 'Using existing user: ${vsCodeUser}'
|
|
550
|
+
else
|
|
551
|
+
echo 'Adding user: ${vsCodeUser}'
|
|
552
|
+
adduser --disabled-password --gecos '' ${vsCodeUser}
|
|
553
|
+
echo "${vsCodeUser}:{{ VSCodePassword }}" | chpasswd
|
|
554
|
+
usermod -aG sudo ${vsCodeUser}
|
|
555
|
+
fi`,
|
|
160
556
|
`tee /etc/sudoers.d/91-vscode-user <<EOF
|
|
161
557
|
${vsCodeUser} ALL=(ALL) NOPASSWD:ALL
|
|
162
558
|
EOF`,
|
|
163
559
|
`mkdir -p /home/${vsCodeUser} && chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
560
|
+
`mkdir -p /home/${vsCodeUser}/.local/bin && chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
164
561
|
'echo "User added. Checking configuration"',
|
|
165
562
|
`getent passwd ${vsCodeUser}`,
|
|
166
563
|
],
|
|
167
564
|
},
|
|
168
565
|
},
|
|
566
|
+
this.createUpdateProfileStep(vsCodeUser, core_1.Stack.of(scope).region, core_1.Stack.of(scope).account),
|
|
567
|
+
this.createInstallAWSCLIStep(vsCodeUser),
|
|
169
568
|
{
|
|
170
569
|
action: 'aws:runShellScript',
|
|
171
|
-
name: '
|
|
172
|
-
inputs: {
|
|
173
|
-
runCommand: [
|
|
174
|
-
'#!/bin/bash',
|
|
175
|
-
'curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg',
|
|
176
|
-
'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_{{ NodeVersion }}.x nodistro main" > /etc/apt/sources.list.d/nodesource.list',
|
|
177
|
-
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q nodejs',
|
|
178
|
-
'npm install -g npm@latest',
|
|
179
|
-
'echo "Node and npm installed. Checking configuration"',
|
|
180
|
-
'node -v',
|
|
181
|
-
'npm -v',
|
|
182
|
-
],
|
|
183
|
-
},
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
action: 'aws:runShellScript',
|
|
187
|
-
name: 'InstallDockerApt',
|
|
570
|
+
name: 'InstallGitApt',
|
|
188
571
|
inputs: {
|
|
189
572
|
runCommand: [
|
|
190
573
|
'#!/bin/bash',
|
|
191
|
-
'
|
|
192
|
-
'
|
|
193
|
-
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q
|
|
194
|
-
`
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
'
|
|
198
|
-
'
|
|
574
|
+
'dpkg --configure -a',
|
|
575
|
+
'add-apt-repository ppa:git-core/ppa',
|
|
576
|
+
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q git',
|
|
577
|
+
`sudo -u ${vsCodeUser} git config --global user.email "participant@example.com"`,
|
|
578
|
+
`sudo -u ${vsCodeUser} git config --global user.name "Workshop Participant"`,
|
|
579
|
+
`sudo -u ${vsCodeUser} git config --global init.defaultBranch "main"`,
|
|
580
|
+
'echo "Git installed. Checking configuration"',
|
|
581
|
+
'git --version',
|
|
199
582
|
],
|
|
200
583
|
},
|
|
201
584
|
},
|
|
585
|
+
this.createCloneRepoStep(vsCodeUser, homeFolder),
|
|
586
|
+
this.createDownloadAssetsStep(vsCodeUser, homeFolder),
|
|
587
|
+
this.createDownloadFoldersStep(vsCodeUser, homeFolder),
|
|
588
|
+
this.createDownloadBranchesStep(vsCodeUser, homeFolder),
|
|
589
|
+
this.createConfigureCodeServerStep(vsCodeUser, homeFolder, devServerBasePath, devServerPort, serverNameDirective),
|
|
202
590
|
{
|
|
203
591
|
action: 'aws:runShellScript',
|
|
204
|
-
name: '
|
|
592
|
+
name: 'InstallNodeApt',
|
|
205
593
|
inputs: {
|
|
206
594
|
runCommand: [
|
|
207
595
|
'#!/bin/bash',
|
|
208
|
-
'
|
|
209
|
-
'
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
'
|
|
214
|
-
'
|
|
596
|
+
'curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg',
|
|
597
|
+
'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_{{ NodeVersion }}.x nodistro main" > /etc/apt/sources.list.d/nodesource.list',
|
|
598
|
+
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q nodejs',
|
|
599
|
+
'npm install -g npm@latest',
|
|
600
|
+
'echo "Node and npm installed. Checking configuration"',
|
|
601
|
+
'node -v',
|
|
602
|
+
'npm -v',
|
|
215
603
|
],
|
|
216
604
|
},
|
|
217
605
|
},
|
|
606
|
+
this.createInstallCDKStep(),
|
|
607
|
+
this.createInstallQCLIStep(vsCodeUser),
|
|
608
|
+
this.createInstalluvStep(vsCodeUser),
|
|
218
609
|
{
|
|
219
610
|
action: 'aws:runShellScript',
|
|
220
611
|
name: 'InstallPythonApt',
|
|
@@ -224,11 +615,20 @@ EOF`,
|
|
|
224
615
|
// Ubuntu 24 default is Python 3.12
|
|
225
616
|
// The default installed Python version will map to Python3
|
|
226
617
|
'#!/bin/bash',
|
|
618
|
+
'dpkg --configure -a',
|
|
227
619
|
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q python3-pip python3-venv python3-boto3 python3-pytest',
|
|
228
620
|
`echo 'alias pytest=pytest-3' >> /home/${vsCodeUser}/.bashrc`,
|
|
229
|
-
`systemctl restart code-server@${vsCodeUser}.service`,
|
|
230
621
|
'systemctl start multipathd.service packagekit.service',
|
|
231
622
|
'systemctl restart unattended-upgrades.service',
|
|
623
|
+
'systemctl restart networkd-dispatcher.service',
|
|
624
|
+
`sudo -u ${vsCodeUser} --login code-server --install-extension ms-python.python --force`,
|
|
625
|
+
`if [ -f /home/${vsCodeUser}/.local/share/code-server/User/settings.json ]; then
|
|
626
|
+
sed -i "2i\\\\ \\"python.testing.pytestEnabled\\": true," /home/${vsCodeUser}/.local/share/code-server/User/settings.json
|
|
627
|
+
else
|
|
628
|
+
echo '{
|
|
629
|
+
"python.testing.pytestEnabled": true
|
|
630
|
+
}' > /home/${vsCodeUser}/.local/share/code-server/User/settings.json
|
|
631
|
+
fi`,
|
|
232
632
|
'echo "Python and Pip installed. Checking configuration"',
|
|
233
633
|
'python3 --version',
|
|
234
634
|
'pip3 --version',
|
|
@@ -237,121 +637,75 @@ EOF`,
|
|
|
237
637
|
},
|
|
238
638
|
{
|
|
239
639
|
action: 'aws:runShellScript',
|
|
240
|
-
name: '
|
|
640
|
+
name: 'InstallJavaApt',
|
|
241
641
|
inputs: {
|
|
242
642
|
runCommand: [
|
|
243
643
|
'#!/bin/bash',
|
|
244
|
-
'
|
|
245
|
-
'
|
|
246
|
-
'
|
|
247
|
-
'
|
|
248
|
-
'
|
|
249
|
-
'
|
|
644
|
+
'dpkg --configure -a',
|
|
645
|
+
'curl -fsSL https://apt.corretto.aws/corretto.key | gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg',
|
|
646
|
+
'echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" > /etc/apt/sources.list.d/corretto.list',
|
|
647
|
+
'DEBIAN_FRONTEND=noninteractive apt-get update',
|
|
648
|
+
'DEBIAN_FRONTEND=noninteractive apt-get install -y -q java-21-amazon-corretto-jdk java-17-amazon-corretto-jdk java-1.8.0-amazon-corretto-jdk maven',
|
|
649
|
+
`echo 'export JAVA_8_HOME=$(update-alternatives --list java | grep "java-1.8.0-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
|
|
650
|
+
`echo 'export JAVA_8_PATH=$(update-alternatives --list java | grep "java-1.8.0-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
|
|
651
|
+
`echo 'export JAVA_17_PATH=$(update-alternatives --list java | grep "java-17-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
|
|
652
|
+
`echo 'export JAVA_17_HOME=$(update-alternatives --list java | grep "java-17-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
|
|
653
|
+
`echo 'export JAVA_21_PATH=$(update-alternatives --list java | grep "java-21-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
|
|
654
|
+
`echo 'export JAVA_21_HOME=$(update-alternatives --list java | grep "java-21-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
|
|
655
|
+
`echo 'export JAVA_HOME=$(update-alternatives --list java | grep "java-21-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
|
|
656
|
+
`echo 'export PATH=$PATH:$JAVA_HOME/bin:/usr/share/maven/bin' >> /home/${vsCodeUser}/.bashrc`,
|
|
657
|
+
`sudo -u ${vsCodeUser} --login code-server --install-extension vscjava.vscode-java-pack --force`,
|
|
658
|
+
'echo "Java and Maven installed. Checking configuration"',
|
|
659
|
+
'java -version 2>&1',
|
|
660
|
+
'mvn --version',
|
|
661
|
+
'update-alternatives --list java',
|
|
250
662
|
],
|
|
251
663
|
},
|
|
252
664
|
},
|
|
253
665
|
{
|
|
254
666
|
action: 'aws:runShellScript',
|
|
255
|
-
name: '
|
|
667
|
+
name: 'InstallDotnetApt',
|
|
256
668
|
inputs: {
|
|
257
669
|
runCommand: [
|
|
258
670
|
'#!/bin/bash',
|
|
259
|
-
|
|
260
|
-
'
|
|
261
|
-
|
|
262
|
-
`
|
|
263
|
-
server {
|
|
264
|
-
listen 80;
|
|
265
|
-
listen [::]:80;
|
|
266
|
-
# server_name distribution.distributionDomainName;
|
|
267
|
-
${serverNameDirective}
|
|
268
|
-
location / {
|
|
269
|
-
proxy_pass http://localhost:8080/;
|
|
270
|
-
proxy_set_header Host \\$host;
|
|
271
|
-
proxy_set_header Upgrade \\$http_upgrade;
|
|
272
|
-
proxy_set_header Connection upgrade;
|
|
273
|
-
proxy_set_header Accept-Encoding gzip;
|
|
274
|
-
}
|
|
275
|
-
location /${devServerBasePath} {
|
|
276
|
-
proxy_pass http://localhost:${devServerPort}/${devServerBasePath};
|
|
277
|
-
proxy_set_header Host \\$host;
|
|
278
|
-
proxy_set_header Upgrade \\$http_upgrade;
|
|
279
|
-
proxy_set_header Connection upgrade;
|
|
280
|
-
proxy_set_header Accept-Encoding gzip;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
EOF`,
|
|
284
|
-
`mkdir -p /home/${vsCodeUser}/.config/code-server`,
|
|
285
|
-
`tee /home/${vsCodeUser}/.config/code-server/config.yaml <<EOF
|
|
286
|
-
cert: false
|
|
287
|
-
auth: password
|
|
288
|
-
hashed-password: "$(echo -n {{ VSCodePassword }} | argon2 $(openssl rand -base64 12) -e)"
|
|
289
|
-
EOF`,
|
|
290
|
-
`mkdir -p /home/${vsCodeUser}/.local/share/code-server/User/`,
|
|
291
|
-
`touch /home/${vsCodeUser}/.hushlogin`,
|
|
292
|
-
`mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}`,
|
|
293
|
-
`tee /home/${vsCodeUser}/.local/share/code-server/User/settings.json <<EOF
|
|
294
|
-
{
|
|
295
|
-
"extensions.autoUpdate": false,
|
|
296
|
-
"extensions.autoCheckUpdates": false,
|
|
297
|
-
"telemetry.telemetryLevel": "off",
|
|
298
|
-
"security.workspace.trust.startupPrompt": "never",
|
|
299
|
-
"security.workspace.trust.enabled": false,
|
|
300
|
-
"security.workspace.trust.banner": "never",
|
|
301
|
-
"security.workspace.trust.emptyWindow": false,
|
|
302
|
-
"python.testing.pytestEnabled": true,
|
|
303
|
-
"auto-run-command.rules": [
|
|
304
|
-
{
|
|
305
|
-
"command": "workbench.action.terminal.new"
|
|
306
|
-
}
|
|
307
|
-
]
|
|
308
|
-
}
|
|
309
|
-
EOF`,
|
|
310
|
-
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
311
|
-
`systemctl restart code-server@${vsCodeUser}`,
|
|
312
|
-
'systemctl restart nginx',
|
|
313
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force`,
|
|
314
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force`,
|
|
315
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension synedra.auto-run-command --force`,
|
|
316
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension vscjava.vscode-java-pack --force`,
|
|
317
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension ms-vscode.live-server --force`,
|
|
671
|
+
'dpkg --configure -a',
|
|
672
|
+
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q dotnet-sdk-8.0',
|
|
673
|
+
'dotnet tool install -g Microsoft.Web.LibraryManager.Cli',
|
|
674
|
+
`echo 'PATH=$PATH:/home/${vsCodeUser}/.dotnet/tools' >> /home/${vsCodeUser}/.bashrc`,
|
|
318
675
|
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
319
|
-
'echo "
|
|
320
|
-
'
|
|
321
|
-
'systemctl status nginx',
|
|
322
|
-
'echo "CodeServer installed. Checking configuration"',
|
|
323
|
-
'code-server -v',
|
|
324
|
-
`systemctl status code-server@${vsCodeUser}`,
|
|
676
|
+
'echo "Dotnet installed. Checking configuration"',
|
|
677
|
+
'dotnet --list-sdks',
|
|
325
678
|
],
|
|
326
679
|
},
|
|
327
680
|
},
|
|
328
681
|
{
|
|
329
682
|
action: 'aws:runShellScript',
|
|
330
|
-
name: '
|
|
683
|
+
name: 'InstallDockerApt',
|
|
331
684
|
inputs: {
|
|
332
685
|
runCommand: [
|
|
333
686
|
'#!/bin/bash',
|
|
334
|
-
'
|
|
335
|
-
'echo
|
|
336
|
-
|
|
337
|
-
`
|
|
338
|
-
`
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
687
|
+
'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg',
|
|
688
|
+
'echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release --codename --short) stable" > /etc/apt/sources.list.d/docker.list',
|
|
689
|
+
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q docker-ce docker-ce-cli containerd.io',
|
|
690
|
+
`usermod -aG docker ${vsCodeUser}`,
|
|
691
|
+
`systemctl restart code-server@${vsCodeUser}.service`,
|
|
692
|
+
'systemctl start docker.service',
|
|
693
|
+
'echo "Docker installed. Checking configuration"',
|
|
694
|
+
'docker --version',
|
|
695
|
+
'systemctl status docker.service',
|
|
343
696
|
],
|
|
344
697
|
},
|
|
345
698
|
},
|
|
346
699
|
{
|
|
347
700
|
action: 'aws:runShellScript',
|
|
348
|
-
name: '
|
|
701
|
+
name: 'InstallGolangApt',
|
|
349
702
|
inputs: {
|
|
350
703
|
runCommand: [
|
|
351
704
|
'#!/bin/bash',
|
|
352
|
-
'
|
|
353
|
-
|
|
354
|
-
'
|
|
705
|
+
'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q golang',
|
|
706
|
+
`echo 'PATH=$PATH:/home/${vsCodeUser}/go/bin' >> /home/${vsCodeUser}/.bashrc`,
|
|
707
|
+
'echo "Golang installed. Checking configuration"',
|
|
708
|
+
'go version',
|
|
355
709
|
],
|
|
356
710
|
},
|
|
357
711
|
},
|
|
@@ -373,39 +727,30 @@ EOF`,
|
|
|
373
727
|
},
|
|
374
728
|
NodeVersion: {
|
|
375
729
|
type: 'String',
|
|
376
|
-
default: '
|
|
377
|
-
allowedValues: ['22', '20', '18'],
|
|
730
|
+
default: '22',
|
|
731
|
+
allowedValues: ['24', '22', '20', '18'],
|
|
732
|
+
},
|
|
733
|
+
RepoUrl: {
|
|
734
|
+
type: 'String',
|
|
735
|
+
default: repoUrl ?? '',
|
|
378
736
|
},
|
|
379
|
-
|
|
737
|
+
AssetZipS3Path: {
|
|
380
738
|
type: 'String',
|
|
381
|
-
default: '
|
|
382
|
-
|
|
739
|
+
default: assetZipS3Path ?? '',
|
|
740
|
+
},
|
|
741
|
+
BranchZipS3Path: {
|
|
742
|
+
type: 'String',
|
|
743
|
+
default: branchZipS3Path ?? '',
|
|
744
|
+
},
|
|
745
|
+
FolderZipS3Path: {
|
|
746
|
+
type: 'String',
|
|
747
|
+
default: folderZipS3Path ?? '',
|
|
383
748
|
},
|
|
384
749
|
},
|
|
385
750
|
// all mainSteps scripts are in in /var/lib/amazon/ssm/<instanceid>/document/orchestration/<uuid>/<StepName>/_script.sh
|
|
386
751
|
mainSteps: [
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
name: 'InstallCloudWatchAgent',
|
|
390
|
-
inputs: {
|
|
391
|
-
name: 'AmazonCloudWatchAgent',
|
|
392
|
-
action: 'Install',
|
|
393
|
-
},
|
|
394
|
-
},
|
|
395
|
-
{
|
|
396
|
-
action: 'aws:runDocument',
|
|
397
|
-
name: 'ConfigureCloudWatchAgent',
|
|
398
|
-
inputs: {
|
|
399
|
-
documentType: 'SSMDocument',
|
|
400
|
-
documentPath: 'AmazonCloudWatch-ManageAgent',
|
|
401
|
-
documentParameters: {
|
|
402
|
-
action: 'configure',
|
|
403
|
-
mode: 'ec2',
|
|
404
|
-
optionalConfigurationSource: 'default',
|
|
405
|
-
optionalRestart: 'yes',
|
|
406
|
-
},
|
|
407
|
-
},
|
|
408
|
-
},
|
|
752
|
+
this.createInstallCloudWatchAgentStep(),
|
|
753
|
+
this.createConfigureCloudWatchAgentStep(),
|
|
409
754
|
{
|
|
410
755
|
action: 'aws:runShellScript',
|
|
411
756
|
name: 'InstallBasePackagesDnf',
|
|
@@ -422,24 +767,55 @@ EOF`,
|
|
|
422
767
|
inputs: {
|
|
423
768
|
runCommand: [
|
|
424
769
|
'#!/bin/bash',
|
|
425
|
-
`
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
770
|
+
`if [[ "${vsCodeUser}" == "ec2-user" ]]
|
|
771
|
+
then
|
|
772
|
+
echo 'Using existing user: ${vsCodeUser}'
|
|
773
|
+
else
|
|
774
|
+
echo 'Adding user: ${vsCodeUser}'
|
|
775
|
+
adduser -c '' ${vsCodeUser}
|
|
776
|
+
passwd -l ${vsCodeUser}
|
|
777
|
+
echo "${vsCodeUser}:{{ VSCodePassword }}" | chpasswd
|
|
778
|
+
usermod -aG wheel ${vsCodeUser}
|
|
779
|
+
fi`,
|
|
780
|
+
`tee /etc/sudoers.d/91-vscode-user <<EOF
|
|
781
|
+
${vsCodeUser} ALL=(ALL) NOPASSWD:ALL
|
|
782
|
+
EOF`,
|
|
783
|
+
`mkdir -p /home/${vsCodeUser} && chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
784
|
+
`mkdir -p /home/${vsCodeUser}/.local/bin && chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
430
785
|
'echo "User added. Checking configuration"',
|
|
431
786
|
`getent passwd ${vsCodeUser}`,
|
|
432
787
|
],
|
|
433
788
|
},
|
|
434
789
|
},
|
|
790
|
+
this.createUpdateProfileStep(vsCodeUser, core_1.Stack.of(scope).region, core_1.Stack.of(scope).account),
|
|
791
|
+
this.createInstallAWSCLIStep(vsCodeUser),
|
|
792
|
+
{
|
|
793
|
+
action: 'aws:runShellScript',
|
|
794
|
+
name: 'InstallGitDnf',
|
|
795
|
+
inputs: {
|
|
796
|
+
runCommand: [
|
|
797
|
+
'#!/bin/bash',
|
|
798
|
+
'dnf install -y git',
|
|
799
|
+
`sudo -u ${vsCodeUser} git config --global user.email "participant@example.com"`,
|
|
800
|
+
`sudo -u ${vsCodeUser} git config --global user.name "Workshop Participant"`,
|
|
801
|
+
`sudo -u ${vsCodeUser} git config --global init.defaultBranch "main"`,
|
|
802
|
+
'echo "Git installed. Checking configuration"',
|
|
803
|
+
'git --version',
|
|
804
|
+
],
|
|
805
|
+
},
|
|
806
|
+
},
|
|
807
|
+
this.createCloneRepoStep(vsCodeUser, homeFolder),
|
|
808
|
+
this.createDownloadAssetsStep(vsCodeUser, homeFolder),
|
|
809
|
+
this.createDownloadFoldersStep(vsCodeUser, homeFolder),
|
|
810
|
+
this.createDownloadBranchesStep(vsCodeUser, homeFolder),
|
|
811
|
+
this.createConfigureCodeServerStep(vsCodeUser, homeFolder, devServerBasePath, devServerPort, serverNameDirective),
|
|
435
812
|
{
|
|
436
813
|
action: 'aws:runShellScript',
|
|
437
814
|
name: 'InstallNodeDnf',
|
|
438
815
|
inputs: {
|
|
439
816
|
runCommand: [
|
|
440
817
|
'#!/bin/bash',
|
|
441
|
-
'dnf install -y
|
|
442
|
-
'ln -s -f /usr/bin/node-20 /usr/bin/node',
|
|
818
|
+
'dnf install -y nodejs npm',
|
|
443
819
|
'npm install -g npm@latest',
|
|
444
820
|
'echo "Node and npm installed. Checking configuration"',
|
|
445
821
|
'node -v',
|
|
@@ -449,32 +825,49 @@ EOF`,
|
|
|
449
825
|
},
|
|
450
826
|
{
|
|
451
827
|
action: 'aws:runShellScript',
|
|
452
|
-
name: '
|
|
828
|
+
name: 'InstallCDK',
|
|
453
829
|
inputs: {
|
|
454
830
|
runCommand: [
|
|
455
831
|
'#!/bin/bash',
|
|
456
|
-
'
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
'systemctl start docker.service',
|
|
460
|
-
'echo "Docker installed. Checking configuration"',
|
|
461
|
-
'docker --version',
|
|
462
|
-
'systemctl status docker.service',
|
|
832
|
+
'npm install -g aws-cdk',
|
|
833
|
+
'echo "AWS CDK installed. Checking configuration"',
|
|
834
|
+
'cdk --version',
|
|
463
835
|
],
|
|
464
836
|
},
|
|
465
837
|
},
|
|
466
838
|
{
|
|
467
839
|
action: 'aws:runShellScript',
|
|
468
|
-
name: '
|
|
840
|
+
name: 'InstallQCLI',
|
|
469
841
|
inputs: {
|
|
470
842
|
runCommand: [
|
|
471
843
|
'#!/bin/bash',
|
|
472
|
-
'
|
|
473
|
-
`
|
|
474
|
-
|
|
475
|
-
`
|
|
476
|
-
'
|
|
477
|
-
|
|
844
|
+
'curl --proto \'=https\' --tlsv1.2 -sSf "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-$(uname -m)-linux.zip" -o /tmp/q.zip',
|
|
845
|
+
`chown -R ${vsCodeUser}:${vsCodeUser} /tmp/q.zip`,
|
|
846
|
+
'unzip -q -d /tmp /tmp/q.zip',
|
|
847
|
+
`chown -R ${vsCodeUser}:${vsCodeUser} /tmp/q`,
|
|
848
|
+
'chmod +x /tmp/q/install.sh',
|
|
849
|
+
`sudo -u ${vsCodeUser} /tmp/q/install.sh --no-confirm`,
|
|
850
|
+
'rm -rf /tmp/q',
|
|
851
|
+
'echo "Amazon Q CLI installed"',
|
|
852
|
+
],
|
|
853
|
+
},
|
|
854
|
+
},
|
|
855
|
+
{
|
|
856
|
+
action: 'aws:runShellScript',
|
|
857
|
+
name: 'Installuv',
|
|
858
|
+
inputs: {
|
|
859
|
+
runCommand: [
|
|
860
|
+
'#!/bin/bash',
|
|
861
|
+
`sudo -u ${vsCodeUser} --login curl -fsSL https://astral.sh/uv/install.sh -o /tmp/uv_install.sh`,
|
|
862
|
+
`sudo -u ${vsCodeUser} --login bash /tmp/uv_install.sh`,
|
|
863
|
+
`if uv generate-shell-completion bash &>/dev/null; then
|
|
864
|
+
echo 'eval "$(uv generate-shell-completion bash)"' >> /home/${vsCodeUser}/.bashrc
|
|
865
|
+
fi`,
|
|
866
|
+
`if uvx generate-shell-completion bash &>/dev/null; then
|
|
867
|
+
echo 'eval "$(uvx generate-shell-completion bash)"' >> /home/${vsCodeUser}/.bashrc
|
|
868
|
+
fi`,
|
|
869
|
+
'echo "uv installed. Checking configuration"',
|
|
870
|
+
`sudo -u ${vsCodeUser} --login uv --version`,
|
|
478
871
|
],
|
|
479
872
|
},
|
|
480
873
|
},
|
|
@@ -494,130 +887,83 @@ EOF`,
|
|
|
494
887
|
"echo 'alias=python3=python3.11' >> ~/.bashrc",
|
|
495
888
|
"echo 'alias pip3=pip3.11' >> ~/.bashrc",
|
|
496
889
|
'python3.11 -m pip install --upgrade pip 2>&1',
|
|
890
|
+
`sudo -u ${vsCodeUser} --login code-server --install-extension ms-python.python --force`,
|
|
891
|
+
`if [ -f /home/${vsCodeUser}/.local/share/code-server/User/settings.json ]; then
|
|
892
|
+
sed -i "2i\\\\ \\"python.testing.pytestEnabled\\": true," /home/${vsCodeUser}/.local/share/code-server/User/settings.json
|
|
893
|
+
else
|
|
894
|
+
echo '{
|
|
895
|
+
"python.testing.pytestEnabled": true
|
|
896
|
+
}' > /home/${vsCodeUser}/.local/share/code-server/User/settings.json
|
|
897
|
+
fi`,
|
|
497
898
|
'echo "Python and Pip installed. Checking configuration"',
|
|
498
899
|
'python3.11 --version',
|
|
499
900
|
'python3.11 -m pip --version 2>&1',
|
|
500
901
|
],
|
|
501
902
|
},
|
|
502
903
|
},
|
|
503
|
-
// add go, dotnet
|
|
504
904
|
{
|
|
505
905
|
action: 'aws:runShellScript',
|
|
506
|
-
name: '
|
|
906
|
+
name: 'InstallJavaDnf',
|
|
507
907
|
inputs: {
|
|
508
908
|
runCommand: [
|
|
509
909
|
'#!/bin/bash',
|
|
510
|
-
'
|
|
511
|
-
'
|
|
512
|
-
'
|
|
513
|
-
'
|
|
514
|
-
|
|
515
|
-
'
|
|
910
|
+
'dnf install -y java-21-amazon-corretto java-17-amazon-corretto java-1.8.0-amazon-corretto maven',
|
|
911
|
+
`echo 'export JAVA_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
|
|
912
|
+
`echo 'export JAVA_8_PATH=/usr/lib/jvm/java-1.8.0-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
|
|
913
|
+
`echo 'export JAVA_17_PATH=/usr/lib/jvm/java-17-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
|
|
914
|
+
`echo 'export JAVA_17_HOME=/usr/lib/jvm/java-17-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
|
|
915
|
+
`echo 'export JAVA_21_PATH=/usr/lib/jvm/java-21-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
|
|
916
|
+
`echo 'export JAVA_21_HOME=/usr/lib/jvm/java-21-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
|
|
917
|
+
`echo 'export JAVA_HOME=/usr/lib/jvm/java-21-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
|
|
918
|
+
`echo 'export PATH=$PATH:$JAVA_HOME/bin:/usr/share/maven/bin' >> /home/${vsCodeUser}/.bashrc`,
|
|
919
|
+
`sudo -u ${vsCodeUser} --login code-server --install-extension vscjava.vscode-java-pack --force`,
|
|
920
|
+
'echo "Java and Maven installed. Checking configuration"',
|
|
921
|
+
'java -version 2>&1',
|
|
922
|
+
'mvn --version',
|
|
516
923
|
],
|
|
517
924
|
},
|
|
518
925
|
},
|
|
519
926
|
{
|
|
520
927
|
action: 'aws:runShellScript',
|
|
521
|
-
name: '
|
|
928
|
+
name: 'InstallDotnetDnf',
|
|
522
929
|
inputs: {
|
|
523
930
|
runCommand: [
|
|
524
931
|
'#!/bin/bash',
|
|
525
|
-
|
|
526
|
-
'
|
|
527
|
-
`
|
|
528
|
-
`tee /etc/nginx/conf.d/code-server.conf <<EOF
|
|
529
|
-
server {
|
|
530
|
-
listen 80;
|
|
531
|
-
listen [::]:80;
|
|
532
|
-
# server_name distribution.distributionDomainName;
|
|
533
|
-
${serverNameDirective}
|
|
534
|
-
location / {
|
|
535
|
-
proxy_pass http://localhost:8080/;
|
|
536
|
-
proxy_set_header Host \\$host;
|
|
537
|
-
proxy_set_header Upgrade \\$http_upgrade;
|
|
538
|
-
proxy_set_header Connection upgrade;
|
|
539
|
-
proxy_set_header Accept-Encoding gzip;
|
|
540
|
-
}
|
|
541
|
-
location /${devServerBasePath} {
|
|
542
|
-
proxy_pass http://localhost:${devServerPort}/${devServerBasePath};
|
|
543
|
-
proxy_set_header Host \\$host;
|
|
544
|
-
proxy_set_header Upgrade \\$http_upgrade;
|
|
545
|
-
proxy_set_header Connection upgrade;
|
|
546
|
-
proxy_set_header Accept-Encoding gzip;
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
EOF`,
|
|
550
|
-
`mkdir -p /home/${vsCodeUser}/.config/code-server`,
|
|
551
|
-
`tee /home/${vsCodeUser}/.config/code-server/config.yaml <<EOF
|
|
552
|
-
cert: false
|
|
553
|
-
auth: password
|
|
554
|
-
hashed-password: "$(echo -n {{ VSCodePassword }} | argon2 $(openssl rand -base64 12) -e)"
|
|
555
|
-
EOF`,
|
|
556
|
-
`mkdir -p /home/${vsCodeUser}/.local/share/code-server/User/`,
|
|
557
|
-
`touch /home/${vsCodeUser}/.hushlogin`,
|
|
558
|
-
`mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}`,
|
|
559
|
-
`tee /home/${vsCodeUser}/.local/share/code-server/User/settings.json <<EOF
|
|
560
|
-
{
|
|
561
|
-
"extensions.autoUpdate": false,
|
|
562
|
-
"extensions.autoCheckUpdates": false,
|
|
563
|
-
"telemetry.telemetryLevel": "off",
|
|
564
|
-
"security.workspace.trust.startupPrompt": "never",
|
|
565
|
-
"security.workspace.trust.enabled": false,
|
|
566
|
-
"security.workspace.trust.banner": "never",
|
|
567
|
-
"security.workspace.trust.emptyWindow": false,
|
|
568
|
-
"python.testing.pytestEnabled": true,
|
|
569
|
-
"auto-run-command.rules": [
|
|
570
|
-
{
|
|
571
|
-
"command": "workbench.action.terminal.new"
|
|
572
|
-
}
|
|
573
|
-
]
|
|
574
|
-
}
|
|
575
|
-
EOF`,
|
|
576
|
-
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
577
|
-
`systemctl restart code-server@${vsCodeUser}`,
|
|
578
|
-
'systemctl restart nginx',
|
|
579
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force`,
|
|
580
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force`,
|
|
581
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension synedra.auto-run-command --force`,
|
|
582
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension vscjava.vscode-java-pack --force`,
|
|
583
|
-
`sudo -u ${vsCodeUser} --login code-server --install-extension ms-vscode.live-server --force`,
|
|
932
|
+
'dnf install -y dotnet-sdk-8.0',
|
|
933
|
+
'dotnet tool install -g Microsoft.Web.LibraryManager.Cli',
|
|
934
|
+
`echo 'PATH=$PATH:/home/${vsCodeUser}/.dotnet/tools' >> /home/${vsCodeUser}/.bashrc`,
|
|
584
935
|
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
585
|
-
'echo "
|
|
586
|
-
'
|
|
587
|
-
'systemctl status nginx',
|
|
588
|
-
'echo "CodeServer installed. Checking configuration"',
|
|
589
|
-
'code-server -v',
|
|
590
|
-
`systemctl status code-server@${vsCodeUser}`,
|
|
936
|
+
'echo "Dotnet installed. Checking configuration"',
|
|
937
|
+
'dotnet --list-sdks',
|
|
591
938
|
],
|
|
592
939
|
},
|
|
593
940
|
},
|
|
594
941
|
{
|
|
595
942
|
action: 'aws:runShellScript',
|
|
596
|
-
name: '
|
|
943
|
+
name: 'InstallDockerDnf',
|
|
597
944
|
inputs: {
|
|
598
945
|
runCommand: [
|
|
599
946
|
'#!/bin/bash',
|
|
600
|
-
'
|
|
601
|
-
|
|
602
|
-
`
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
`echo "export PS1='\\[\\033[01;32m\\]\\u:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '" >> /home/${vsCodeUser}/.bashrc`,
|
|
608
|
-
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
947
|
+
'dnf install -y docker',
|
|
948
|
+
`usermod -aG docker ${vsCodeUser}`,
|
|
949
|
+
`systemctl restart code-server@${vsCodeUser}.service`,
|
|
950
|
+
'systemctl start docker.service',
|
|
951
|
+
'echo "Docker installed. Checking configuration"',
|
|
952
|
+
'docker --version',
|
|
953
|
+
'systemctl status docker.service',
|
|
609
954
|
],
|
|
610
955
|
},
|
|
611
956
|
},
|
|
612
957
|
{
|
|
613
958
|
action: 'aws:runShellScript',
|
|
614
|
-
name: '
|
|
959
|
+
name: 'InstallGolangDnf',
|
|
615
960
|
inputs: {
|
|
616
961
|
runCommand: [
|
|
617
962
|
'#!/bin/bash',
|
|
618
|
-
'
|
|
619
|
-
|
|
620
|
-
'
|
|
963
|
+
'dnf install -y golang',
|
|
964
|
+
`echo 'PATH=$PATH:/home/${vsCodeUser}/go/bin' >> /home/${vsCodeUser}/.bashrc`,
|
|
965
|
+
'echo "Golang installed. Checking configuration"',
|
|
966
|
+
'go version',
|
|
621
967
|
],
|
|
622
968
|
},
|
|
623
969
|
},
|
|
@@ -636,7 +982,7 @@ class CustomResourceInstaller extends Installer {
|
|
|
636
982
|
constructor(scope, options) {
|
|
637
983
|
super();
|
|
638
984
|
const onEvent = new installer_function_1.InstallerFunction(scope, 'InstallerOnEventHandler', {
|
|
639
|
-
timeout: core_1.Duration.
|
|
985
|
+
timeout: core_1.Duration.minutes(15), // 15 minutes to allow for VS Code Server installation
|
|
640
986
|
memorySize: 512, // TODO configurable
|
|
641
987
|
});
|
|
642
988
|
cdk_nag_1.NagSuppressions.addResourceSuppressions([onEvent], [
|
|
@@ -664,14 +1010,26 @@ class CustomResourceInstaller extends Installer {
|
|
|
664
1010
|
resource: 'instance',
|
|
665
1011
|
resourceName: options.instanceId,
|
|
666
1012
|
}, core_1.Stack.of(scope));
|
|
1013
|
+
// SendCommand supports resource-level permissions
|
|
667
1014
|
onEvent.addToRolePolicy(new aws_iam_1.PolicyStatement({
|
|
668
|
-
actions: [
|
|
669
|
-
'ssm:SendCommand',
|
|
670
|
-
'ssm:GetCommandInvocation',
|
|
671
|
-
'ssm:ListCommandInvocations',
|
|
672
|
-
],
|
|
1015
|
+
actions: ['ssm:SendCommand'],
|
|
673
1016
|
resources: [documentArn, cwManageAgentArn, targetEc2InstanceArn],
|
|
674
1017
|
}));
|
|
1018
|
+
// GetCommandInvocation and ListCommandInvocations require wildcard resources
|
|
1019
|
+
// They don't support resource-level permissions
|
|
1020
|
+
onEvent.addToRolePolicy(new aws_iam_1.PolicyStatement({
|
|
1021
|
+
actions: ['ssm:GetCommandInvocation', 'ssm:ListCommandInvocations'],
|
|
1022
|
+
resources: ['*'],
|
|
1023
|
+
}));
|
|
1024
|
+
// Suppress cdk-nag warning for wildcard permissions on GetCommandInvocation
|
|
1025
|
+
// These SSM actions don't support resource-level permissions per AWS documentation
|
|
1026
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions(onEvent, [
|
|
1027
|
+
{
|
|
1028
|
+
id: 'AwsSolutions-IAM5',
|
|
1029
|
+
reason: 'ssm:GetCommandInvocation and ssm:ListCommandInvocations do not support resource-level permissions and require wildcard resources',
|
|
1030
|
+
appliesTo: ['Resource::*'],
|
|
1031
|
+
},
|
|
1032
|
+
], true);
|
|
675
1033
|
const provider = new custom_resources_1.Provider(scope, 'InstallerProvider', {
|
|
676
1034
|
onEventHandler: onEvent,
|
|
677
1035
|
});
|
|
@@ -692,7 +1050,7 @@ class CustomResourceInstaller extends Installer {
|
|
|
692
1050
|
new core_1.CustomResource(scope, 'SSMInstallerCustomResource', {
|
|
693
1051
|
serviceToken: provider.serviceToken,
|
|
694
1052
|
properties: {
|
|
695
|
-
ServiceTimeout:
|
|
1053
|
+
ServiceTimeout: core_1.Duration.minutes(15).toSeconds() + 5, // Lambda timeout + 5 seconds buffer
|
|
696
1054
|
InstanceId: options.instanceId,
|
|
697
1055
|
DocumentName: options.documentName,
|
|
698
1056
|
CloudWatchLogGroupName: options.cloudWatchLogGroupName,
|
|
@@ -702,4 +1060,4 @@ class CustomResourceInstaller extends Installer {
|
|
|
702
1060
|
}
|
|
703
1061
|
_bind() { }
|
|
704
1062
|
}
|
|
705
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3RhbGxlci9pbnN0YWxsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXNEO0FBRXRELDJDQUEyQztBQUMzQywyQ0FBd0U7QUFDeEUsbUVBQXdEO0FBQ3hELHFDQUEwQztBQUUxQyw2REFBeUQ7QUFDekQsb0RBQW1EO0FBOERuRCxNQUFzQixTQUFTO0lBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBeUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFNBQVM7WUFDMUIsS0FBSyxDQUFDLEtBQWdCO2dCQUMzQixJQUFJLFlBQVksQ0FBQztnQkFDakIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDO2dCQUM3RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQztnQkFDcEQsSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3ZELFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUN0QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUNyQyxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixPQUFPLENBQUMsVUFBVSxFQUNsQixPQUFPLENBQUMsVUFBVSxFQUNsQiwrQkFBZSxDQUFDLFNBQVMsRUFDekIsT0FBTyxDQUFDLGdCQUFnQixDQUN6QixDQUFDO29CQUNGLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSyxDQUFDO2dCQUNoQyxDQUFDO2dCQUVELE1BQU0sc0JBQXNCLEdBQzFCLE9BQU8sQ0FBQyxzQkFBc0IsSUFBSSxZQUFZLFlBQVksRUFBRSxDQUFDO2dCQUUvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHVCQUF1QixDQUFD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Yi9hd3MtaWFtJztcbmltcG9ydCB7IEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBBcm4sIEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tICdjZGstbmFnJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW5zdGFsbGVyRnVuY3Rpb24gfSBmcm9tICcuL2luc3RhbGxlci1mdW5jdGlvbic7XG5pbXBvcnQgeyBMaW51eEZsYXZvclR5cGUgfSBmcm9tICcuLi92c2NvZGUtc2VydmVyJztcblxuaW50ZXJmYWNlIEluc3RhbGxlck9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBlYzIgaW5zdGFuY2UgaWQgdG8gaW5zdGFsbCB0aGUgc3NtIGRvY3VtZW50IG9uXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gc3NtIGRvY3VtZW50IHRvIGluc3RhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBzc20gZG9jdW1lbnQgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xvdWR3YXRjaCBsb2cgZ3JvdXAgZm9yIHRoZSBpbnN0YWxsIGxvZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgL2F3cy9zc20vJHtkb2N1bWVudE5hbWV9XG4gICAqL1xuICByZWFkb25seSBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVVc2VyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVQYXNzd29yZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9tZSBmb2xkZXIgb2YgdGhlIHVzZXIgdW5kZXIgd2hpY2ggdGhlIHZzY29kZSBzZXJ2ZXIgcnVuc1xuICAgKi9cbiAgcmVhZG9ubHkgaG9tZUZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSByZXN0IHBhdGggdnMgY29kZSBzZXJ2ZXIgd2lsbCBydW5cbiAgICpcbiAgICogQGRlZmF1bHQgYXBwXG4gICAqL1xuICByZWFkb25seSBkZXZTZXJ2ZXJCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdnNjb2RlciBzZXJ2ZXIgd2lsbCBiZSBzZXJ2ZWQgaW4gdGhlIGluc3RhbmNlXG4gICAqXG4gICAqIEBkZWZhdWx0IDgwODFcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlclBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gZG9tYWluIG5hbWUgZm9yIHRoZSBWUyBDb2RlIHNlcnZlclxuICAgKiBVc2VkIHRvIGNvbmZpZ3VyZSBuZ2lueCBzZXJ2ZXJfbmFtZSBkaXJlY3RpdmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2VzICouY2xvdWRmcm9udC5uZXQgb25seVxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRG9tYWluTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsZXJPcHRpb25zIGV4dGVuZHMgSW5zdGFsbGVyT3B0aW9uc0Jhc2Uge31cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluc3RhbGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgdWJ1bnR1KG9wdGlvbnM6IEluc3RhbGxlck9wdGlvbnMpOiBJbnN0YWxsZXIge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgICAgIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogSW5zdGFsbGVyIHtcbiAgICAgICAgbGV0IGRvY3VtZW50TmFtZTtcbiAgICAgICAgY29uc3QgZGV2U2VydmVyQmFzZVBhdGggPSBvcHRpb25zLmRldlNlcnZlckJhc2VQYXRoID8/ICdhcHAnO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJQb3J0ID0gb3B0aW9ucy5kZXZTZXJ2ZXJQb3J0ID8/IDgwODE7XG4gICAgICAgIGlmIChvcHRpb25zLmRvY3VtZW50TmFtZSAmJiBvcHRpb25zLmRvY3VtZW50TmFtZSAhPSAnJykge1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IG9wdGlvbnMuZG9jdW1lbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVTU01Eb2N1bWVudChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgICAgb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICAgICAgTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMixcbiAgICAgICAgICAgIG9wdGlvbnMuY3VzdG9tRG9tYWluTmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IGRvY3VtZW50Lm5hbWUhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xvdWRXYXRjaExvZ0dyb3VwTmFtZSA9XG4gICAgICAgICAgb3B0aW9ucy5jbG91ZFdhdGNoTG9nR3JvdXBOYW1lID8/IGAvYXdzL3NzbS8ke2RvY3VtZW50TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IGluc3RhbGxlciA9IG5ldyBDdXN0b21SZXNvdXJjZUluc3RhbGxlcihzY29wZSwge1xuICAgICAgICAgIGluc3RhbmNlSWQ6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgICAgICBkb2N1bWVudE5hbWU6IGRvY3VtZW50TmFtZSxcbiAgICAgICAgICBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lOiBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lLFxuICAgICAgICAgIHZzQ29kZVVzZXI6IG9wdGlvbnMudnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogb3B0aW9ucy52c0NvZGVQYXNzd29yZCxcbiAgICAgICAgICBob21lRm9sZGVyOiBvcHRpb25zLmhvbWVGb2xkZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpbnN0YWxsZXI7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYW1hem9uTGludXgyMDIzKG9wdGlvbnM6IEluc3RhbGxlck9wdGlvbnMpOiBJbnN0YWxsZXIge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgICAgIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogSW5zdGFsbGVyIHtcbiAgICAgICAgbGV0IGRvY3VtZW50TmFtZTtcbiAgICAgICAgY29uc3QgZGV2U2VydmVyQmFzZVBhdGggPSBvcHRpb25zLmRldlNlcnZlckJhc2VQYXRoID8/ICdhcHAnO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJQb3J0ID0gb3B0aW9ucy5kZXZTZXJ2ZXJQb3J0ID8/IDgwODE7XG4gICAgICAgIGlmIChvcHRpb25zLmRvY3VtZW50TmFtZSAmJiBvcHRpb25zLmRvY3VtZW50TmFtZSAhPSAnJykge1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IG9wdGlvbnMuZG9jdW1lbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVTU01Eb2N1bWVudChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgICAgb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICAgICAgTGludXhGbGF2b3JUeXBlLkFNQVpPTl9MSU5VWF8yMDIzLFxuICAgICAgICAgICAgb3B0aW9ucy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gZG9jdW1lbnQubmFtZSE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lID1cbiAgICAgICAgICBvcHRpb25zLmNsb3VkV2F0Y2hMb2dHcm91cE5hbWUgPz8gYC9hd3Mvc3NtLyR7ZG9jdW1lbnROYW1lfWA7XG5cbiAgICAgICAgY29uc3QgaW5zdGFsbGVyID0gbmV3IEN1c3RvbVJlc291cmNlSW5zdGFsbGVyKHNjb3BlLCB7XG4gICAgICAgICAgaW5zdGFuY2VJZDogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgICAgIGRvY3VtZW50TmFtZTogZG9jdW1lbnROYW1lLFxuICAgICAgICAgIGNsb3VkV2F0Y2hMb2dHcm91cE5hbWU6IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWUsXG4gICAgICAgICAgdnNDb2RlVXNlcjogb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgIHZzQ29kZVBhc3N3b3JkOiBvcHRpb25zLnZzQ29kZVBhc3N3b3JkLFxuICAgICAgICAgIGhvbWVGb2xkZXI6IG9wdGlvbnMuaG9tZUZvbGRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcHVibGljIGluc3RhbmNlSWQhOiBzdHJpbmc7XG4gIHB1YmxpYyBkb2N1bWVudE5hbWUhOiBzdHJpbmc7XG4gIHB1YmxpYyBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lITogc3RyaW5nO1xuICBwdWJsaWMgdnNDb2RlUGFzc3dvcmQhOiBzdHJpbmc7XG4gIHB1YmxpYyB2c0NvZGVQYXNzd29yZFRlc3QhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCk6IGFueTtcblxuICBwcml2YXRlIGNyZWF0ZVNTTURvY3VtZW50KFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgZGV2U2VydmVyQmFzZVBhdGg6IHN0cmluZyxcbiAgICBkZXZTZXJ2ZXJQb3J0OiBudW1iZXIsXG4gICAgdnNDb2RlVXNlcjogc3RyaW5nLFxuICAgIGhvbWVGb2xkZXI6IHN0cmluZyxcbiAgICBsaW51eEZsYXZvcjogTGludXhGbGF2b3JUeXBlLFxuICAgIGN1c3RvbURvbWFpbk5hbWU/OiBzdHJpbmcsXG4gICk6IHNzbS5DZm5Eb2N1bWVudCB7XG4gICAgLy8gR2VuZXJhdGUgbmdpbnggc2VydmVyX25hbWUgZGlyZWN0aXZlIGJhc2VkIG9uIGN1c3RvbSBkb21haW5cbiAgICBjb25zdCBzZXJ2ZXJOYW1lRGlyZWN0aXZlID0gY3VzdG9tRG9tYWluTmFtZVxuICAgICAgPyBgc2VydmVyX25hbWUgKi5jbG91ZGZyb250Lm5ldCAke2N1c3RvbURvbWFpbk5hbWV9O2BcbiAgICAgIDogJ3NlcnZlcl9uYW1lICouY2xvdWRmcm9udC5uZXQ7JztcblxuICAgIGxldCBzc21Eb2N1bWVudDogc3NtLkNmbkRvY3VtZW50O1xuICAgIHN3aXRjaCAobGludXhGbGF2b3IpIHtcbiAgICAgIGNhc2UgTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMjpcbiAgICAgIGNhc2UgTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yNDpcbiAgICAgICAgLy8gQ3JlYXRlIGFuIFNTTSBkb2N1bWVudCB3aXRoIG11bHRpcGxlIGFjdGlvbnMgdG8gaW5zdGFsbCB0aGUgc29mdHdhcmVcbiAgICAgICAgc3NtRG9jdW1lbnQgPSBuZXcgc3NtLkNmbkRvY3VtZW50KHNjb3BlLCAnc3NtLWRvY3VtZW50LXVidW50dScsIHtcbiAgICAgICAgICBuYW1lOiBgdnNjb2RlLXNlcnZlci11YnVudHUtJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfWAsXG4gICAgICAgICAgZG9jdW1lbnRUeXBlOiAnQ29tbWFuZCcsXG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgc2NoZW1hVmVyc2lvbjogJzIuMicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jvb3RzdHJhcCBWU0NvZGUgY29kZS1zZXJ2ZXIgaW5zdGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBWU0NvZGVQYXNzd29yZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFN0YWNrLm9mKHNjb3BlKS5zdGFja0lkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBOb2RlVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICcyMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWycyMicsICcyMCcsICcxOCddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBEb3ROZXRWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJzguMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWyc4LjAnLCAnNy4wJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYWxsIG1haW5TdGVwcyBzY3JpcHRzIGFyZSBpbiBpbiAvdmFyL2xpYi9hbWF6b24vc3NtLzxpbnN0YW5jZWlkPi9kb2N1bWVudC9vcmNoZXN0cmF0aW9uLzx1dWlkPi88U3RlcE5hbWU+L19zY3JpcHQuc2hcbiAgICAgICAgICAgIG1haW5TdGVwczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOmNvbmZpZ3VyZVBhY2thZ2UnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdBbWF6b25DbG91ZFdhdGNoQWdlbnQnLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnSW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5Eb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFR5cGU6ICdTU01Eb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFBhdGg6ICdBbWF6b25DbG91ZFdhdGNoLU1hbmFnZUFnZW50JyxcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50UGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjb25maWd1cmUnLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAnZWMyJyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxDb25maWd1cmF0aW9uU291cmNlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsUmVzdGFydDogJ3llcycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQXB0UGFja2FnZXNBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBhcHQtdXRpbHMnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBuZWVkcmVzdGFydCB1bmF0dGVuZGVkLXVwZ3JhZGVzJyxcbiAgICAgICAgICAgICAgICAgICAgXCJzZWQgLWkgJ3MvIyRucmNvbmZ7a2VybmVsaGludHN9ID0gLTE7LyRucmNvbmZ7a2VybmVsaGludHN9ID0gMDsvJyAvZXRjL25lZWRyZXN0YXJ0L25lZWRyZXN0YXJ0LmNvbmZcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzZWQgLWkgJ3MvIyRucmNvbmZ7dmVyYm9zaXR5fSA9IDI7LyRucmNvbmZ7dmVyYm9zaXR5fSA9IDA7LycgL2V0Yy9uZWVkcmVzdGFydC9uZWVkcmVzdGFydC5jb25mXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic2VkIC1pIFxcXCJzLyNcXCRucmNvbmZ7cmVzdGFydH0gPSAnaSc7L1xcJG5yY29uZntyZXN0YXJ0fSA9ICdhJzsvXFxcIiAvZXRjL25lZWRyZXN0YXJ0L25lZWRyZXN0YXJ0LmNvbmZcIixcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBcHQgaGVscGVyIHBhY2thZ2VzIGFkZGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnY2F0IC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQmFzZVBhY2thZ2VzQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgY3VybCBnbnVwZyB3aG9pcyBhcmdvbjIgb3BlbnNzbCBsb2NhbGVzIGxvY2FsZXMtYWxsIHVuemlwIGFwdC10cmFuc3BvcnQtaHR0cHMgY2EtY2VydGlmaWNhdGVzIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIG5naW54JyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0FkZFVzZXJBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICBcImVjaG8gJ0FkZGluZyB1c2VyOiAke1ZTQ29kZVVzZXJ9J1wiLFxuICAgICAgICAgICAgICAgICAgICBgYWRkdXNlciAtLWRpc2FibGVkLXBhc3N3b3JkIC0tZ2Vjb3MgJycgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiJHt2c0NvZGVVc2VyfTp7eyBWU0NvZGVQYXNzd29yZCB9fVwiIHwgY2hwYXNzd2RgLFxuICAgICAgICAgICAgICAgICAgICBgdXNlcm1vZCAtYUcgc3VkbyAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL3N1ZG9lcnMuZC85MS12c2NvZGUtdXNlciA8PEVPRlxuJHt2c0NvZGVVc2VyfSBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiVXNlciBhZGRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgYGdldGVudCBwYXNzd2QgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsTm9kZUFwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdjdXJsIC1mc1NMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLXJlcG8uZ3BnLmtleSB8IGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9ub2Rlc291cmNlLmdwZycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFthcmNoPSQoZHBrZyAtLXByaW50LWFyY2hpdGVjdHVyZSkgc2lnbmVkLWJ5PS91c3Ivc2hhcmUva2V5cmluZ3Mvbm9kZXNvdXJjZS5ncGddIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfe3sgTm9kZVZlcnNpb24gfX0ueCBub2Rpc3RybyBtYWluXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBub2RlanMnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgbnBtQGxhdGVzdCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiTm9kZSBhbmQgbnBtIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ25vZGUgLXYnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIC12JyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb2NrZXJBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2Rvd25sb2FkLmRvY2tlci5jb20vbGludXgvdWJ1bnR1L2dwZyB8IGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFtzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL2xpbnV4L3VidW50dSAkKGxzYl9yZWxlYXNlIC0tY29kZW5hbWUgLS1zaG9ydCkgc3RhYmxlXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb2NrZXIubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGRvY2tlci1jZSBkb2NrZXItY2UtY2xpIGNvbnRhaW5lcmQuaW8nLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfS5zZXJ2aWNlYCxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGFydCBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiRG9ja2VyIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RvY2tlciAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHN0YXR1cyBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsR2l0QXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FkZC1hcHQtcmVwb3NpdG9yeSBwcGE6Z2l0LWNvcmUvcHBhJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCIke3ZzQ29kZVVzZXJ9QGV4YW1wbGUuY29tXCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwiV29ya3Nob3AgJHt2c0NvZGVVc2VyfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBcIm1haW5cImAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR2l0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dpdCAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFB5dGhvbkFwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIFVidW50dSAyMiBkZWZhdWx0IGlzIFB5dGhvbiAzLjEwXG4gICAgICAgICAgICAgICAgICAgIC8vIFVidW50dSAyNCBkZWZhdWx0IGlzIFB5dGhvbiAzLjEyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGluc3RhbGxlZCBQeXRob24gdmVyc2lvbiB3aWxsIG1hcCB0byBQeXRob24zXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIHB5dGhvbjMtcGlwIHB5dGhvbjMtdmVudiBweXRob24zLWJvdG8zIHB5dGhvbjMtcHl0ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHB5dGVzdD1weXRlc3QtMycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0uc2VydmljZWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhcnQgbXVsdGlwYXRoZC5zZXJ2aWNlIHBhY2thZ2VraXQuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgcmVzdGFydCB1bmF0dGVuZGVkLXVwZ3JhZGVzLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIlB5dGhvbiBhbmQgUGlwIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3BpcDMgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxBV1NDTEknLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2F3c2NsaS5hbWF6b25hd3MuY29tL2F3c2NsaS1leGUtbGludXgtJCh1bmFtZSAtbSkuemlwIC1vIC90bXAvYXdzLWNsaS56aXAnLFxuICAgICAgICAgICAgICAgICAgICAndW56aXAgLXEgLWQgL3RtcCAvdG1wL2F3cy1jbGkuemlwJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N1ZG8gL3RtcC9hd3MvaW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgICAgICdybSAtcmYgL3RtcC9hd3MnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkFXUyBDTEkgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnYXdzIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmVDb2RlU2VydmVyJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgYGV4cG9ydCBIT01FPS9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2NvZGUtc2VydmVyLmRldi9pbnN0YWxsLnNoIHwgYmFzaCAtcyAtLSAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfSAyPiYxYCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL25naW54L2NvbmYuZC9jb2RlLXNlcnZlci5jb25mIDw8RU9GXG5zZXJ2ZXIge1xuICAgIGxpc3RlbiA4MDtcbiAgICBsaXN0ZW4gWzo6XTo4MDtcbiAgICAjIHNlcnZlcl9uYW1lIGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lO1xuICAgICR7c2VydmVyTmFtZURpcmVjdGl2ZX1cbiAgICBsb2NhdGlvbiAvIHtcbiAgICAgIHByb3h5X3Bhc3MgaHR0cDovL2xvY2FsaG9zdDo4MDgwLztcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCBcXFxcJGhvc3Q7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIFVwZ3JhZGUgXFxcXCRodHRwX3VwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIENvbm5lY3Rpb24gdXBncmFkZTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgQWNjZXB0LUVuY29kaW5nIGd6aXA7XG4gICAgfVxuICAgIGxvY2F0aW9uIC8ke2RldlNlcnZlckJhc2VQYXRofSB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6JHtkZXZTZXJ2ZXJQb3J0fS8ke2RldlNlcnZlckJhc2VQYXRofTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCBcXFxcJGhvc3Q7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIFVwZ3JhZGUgXFxcXCRodHRwX3VwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIENvbm5lY3Rpb24gdXBncmFkZTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgQWNjZXB0LUVuY29kaW5nIGd6aXA7XG4gICAgfVxufVxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlcmAsXG4gICAgICAgICAgICAgICAgICAgIGB0ZWUgL2hvbWUvJHt2c0NvZGVVc2VyfS8uY29uZmlnL2NvZGUtc2VydmVyL2NvbmZpZy55YW1sIDw8RU9GXG5jZXJ0OiBmYWxzZVxuYXV0aDogcGFzc3dvcmRcbmhhc2hlZC1wYXNzd29yZDogXCIkKGVjaG8gLW4ge3sgVlNDb2RlUGFzc3dvcmQgfX0gfCBhcmdvbjIgJChvcGVuc3NsIHJhbmQgLWJhc2U2NCAxMikgLWUpXCJcbkVPRmAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL2AsXG4gICAgICAgICAgICAgICAgICAgIGB0b3VjaCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5odXNobG9naW5gLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfWAsXG4gICAgICAgICAgICAgICAgICAgIGB0ZWUgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9zZXR0aW5ncy5qc29uIDw8RU9GXG57XG4gIFwiZXh0ZW5zaW9ucy5hdXRvVXBkYXRlXCI6IGZhbHNlLFxuICBcImV4dGVuc2lvbnMuYXV0b0NoZWNrVXBkYXRlc1wiOiBmYWxzZSxcbiAgXCJ0ZWxlbWV0cnkudGVsZW1ldHJ5TGV2ZWxcIjogXCJvZmZcIixcbiAgXCJzZWN1cml0eS53b3Jrc3BhY2UudHJ1c3Quc3RhcnR1cFByb21wdFwiOiBcIm5ldmVyXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmVuYWJsZWRcIjogZmFsc2UsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmJhbm5lclwiOiBcIm5ldmVyXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmVtcHR5V2luZG93XCI6IGZhbHNlLFxuICBcInB5dGhvbi50ZXN0aW5nLnB5dGVzdEVuYWJsZWRcIjogdHJ1ZSxcbiAgXCJhdXRvLXJ1bi1jb21tYW5kLnJ1bGVzXCI6IFtcbiAgICB7XG4gICAgICBcImNvbW1hbmRcIjogXCJ3b3JrYmVuY2guYWN0aW9uLnRlcm1pbmFsLm5ld1wiXG4gICAgfVxuICBdXG59XG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgcmVzdGFydCBuZ2lueCcsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmF3cy10b29sa2l0LXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gQW1hem9uV2ViU2VydmljZXMuYW1hem9uLXEtdnNjb2RlIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBzeW5lZHJhLmF1dG8tcnVuLWNvbW1hbmQgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIHZzY2phdmEudnNjb2RlLWphdmEtcGFjayAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gbXMtdnNjb2RlLmxpdmUtc2VydmVyIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIk5naW54IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ25naW54IC10IDI+JjEnLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHN0YXR1cyBuZ2lueCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQ29kZVNlcnZlciBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdjb2RlLXNlcnZlciAtdicsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgc3RhdHVzIGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnVXBkYXRlUHJvZmlsZScsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIExBTkc9ZW5fVVMudXRmLTggPj4gL2V0Yy9lbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIExDX0FMTD1lbl9VUy5VVEYtOCA+PiAvZXRjL2Vudmlyb25tZW50JyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ1BBVEg9JFBBVEg6L2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvYmluJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IFBBVEgnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgQVdTX1JFR0lPTj0ke1N0YWNrLm9mKHNjb3BlKS5yZWdpb259JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19BQ0NPVU5USUQ9JHtTdGFjay5vZihzY29wZSkuYWNjb3VudH0nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgTkVYVF9URUxFTUVUUllfRElTQUJMRUQ9MScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gXCJleHBvcnQgUFMxPSdcXFxcW1xcXFwwMzNbMDE7MzJtXFxcXF1cXFxcdTpcXFxcW1xcXFwwMzNbMDE7MzRtXFxcXF1cXFxcd1xcXFxbXFxcXDAzM1swMG1cXFxcXVxcXFwkICdcIiA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbENESycsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICducG0gaW5zdGFsbCAtZyBhd3MtY2RrJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBV1MgQ0RLIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2NkayAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5BTUFaT05fTElOVVhfMjAyMzpcbiAgICAgICAgc3NtRG9jdW1lbnQgPSBuZXcgc3NtLkNmbkRvY3VtZW50KHNjb3BlLCAnc3NtLWRvY3VtZW50LWFsMjAyMycsIHtcbiAgICAgICAgICBuYW1lOiBgdnNjb2RlLXNlcnZlci1hbDIwMjMtJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfWAsXG4gICAgICAgICAgZG9jdW1lbnRUeXBlOiAnQ29tbWFuZCcsXG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgc2NoZW1hVmVyc2lvbjogJzIuMicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jvb3RzdHJhcCBWU0NvZGUgY29kZS1zZXJ2ZXIgaW5zdGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBWU0NvZGVQYXNzd29yZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFN0YWNrLm9mKHNjb3BlKS5zdGFja0lkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBOb2RlVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICcyMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWycyMicsICcyMCcsICcxOCddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBEb3ROZXRWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJzguMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWyc4LjAnLCAnNy4wJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYWxsIG1haW5TdGVwcyBzY3JpcHRzIGFyZSBpbiBpbiAvdmFyL2xpYi9hbWF6b24vc3NtLzxpbnN0YW5jZWlkPi9kb2N1bWVudC9vcmNoZXN0cmF0aW9uLzx1dWlkPi88U3RlcE5hbWU+L19zY3JpcHQuc2hcbiAgICAgICAgICAgIG1haW5TdGVwczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOmNvbmZpZ3VyZVBhY2thZ2UnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdBbWF6b25DbG91ZFdhdGNoQWdlbnQnLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnSW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5Eb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFR5cGU6ICdTU01Eb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFBhdGg6ICdBbWF6b25DbG91ZFdhdGNoLU1hbmFnZUFnZW50JyxcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50UGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjb25maWd1cmUnLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAnZWMyJyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxDb25maWd1cmF0aW9uU291cmNlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsUmVzdGFydDogJ3llcycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQmFzZVBhY2thZ2VzRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IC0tYWxsb3dlcmFzaW5nIHdob2lzIGFyZ29uMiB1bnppcCBuZ2lueCBjdXJsIGdudXBnIG9wZW5zc2wnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQWRkVXNlckRuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdBZGRpbmcgdXNlcjogJHt2c0NvZGVVc2VyfSdgLFxuICAgICAgICAgICAgICAgICAgICBgYWRkdXNlciAtYyAnJyAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHBhc3N3ZCAtbCAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gXCIke3ZzQ29kZVVzZXJ9Ont7IFZTQ29kZVBhc3N3b3JkIH19XCIgfCBjaHBhc3N3ZGAsXG4gICAgICAgICAgICAgICAgICAgIGB1c2VybW9kIC1hRyB3aGVlbCAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJVc2VyIGFkZGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBgZ2V0ZW50IHBhc3N3ZCAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxOb2RlRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IG5vZGVqczIwIG5wbScsXG4gICAgICAgICAgICAgICAgICAgICdsbiAtcyAtZiAvdXNyL2Jpbi9ub2RlLTIwIC91c3IvYmluL25vZGUnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgbnBtQGxhdGVzdCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiTm9kZSBhbmQgbnBtIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ25vZGUgLXYnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIC12JyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb2NrZXJEbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgZG9ja2VyJyxcbiAgICAgICAgICAgICAgICAgICAgYHVzZXJtb2QgLWFHIGRvY2tlciAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0uc2VydmljZWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhcnQgZG9ja2VyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkRvY2tlciBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdkb2NrZXIgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgZG9ja2VyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEdpdERuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBnaXQnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCBcIiR7dnNDb2RlVXNlcn1AZXhhbXBsZS5jb21cImAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgXCJXb3Jrc2hvcCAke3ZzQ29kZVVzZXJ9XCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgaW5pdC5kZWZhdWx0QnJhbmNoIFwibWFpblwiYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJHaXQgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnZ2l0IC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsUHl0aG9uRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gQUwyMDIzIGN1cnJlbnRseSBzaGlwcyB3aXRoIFB5dGhvbiAzLjkgcHJlaW5zdGFsbGVkLCBidXQgMy4xMSBpcyBhdmFpbGFibGUgaW4gdGhlIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGFsbCAzLjExIGFsb25nc2lkZSAzLjkgYW5kIHNldHVwIHNvbWUgYWxpYXMgc28gdGhhdCAzLjExIGlzIGxvYWRlZCB3aGVuIHBhcnRpY2lwYW50IHJ1bnMgUHl0aG9uM1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBQeXRob24gMy4xMiBiZWNvbWUgYXZhaWxhYmxlLCB1cGRhdGUgYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IHB5dGhvbjMuMTEgcHl0aG9uMy4xMS1waXAgcHl0aG9uMy12aXJ0dWFsZW52IHB5dGhvbjMtcHl0ZXN0IHB5dGhvbjMtYm90bzMnLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnYWxpYXMgcHl0ZXN0PXB5dGVzdC0zJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnYWxpYXMgcHl0aG9uMz1weXRob24zLjExJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnYWxpYXMgcGlwMz1waXAzLjExJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBcImVjaG8gJ2FsaWFzPXB5dGhvbjM9cHl0aG9uMy4xMScgPj4gfi8uYmFzaHJjXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWNobyAnYWxpYXMgcGlwMz1waXAzLjExJyA+PiB+Ly5iYXNocmNcIixcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMuMTEgLW0gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJQeXRob24gYW5kIFBpcCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdweXRob24zLjExIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICdweXRob24zLjExIC1tIHBpcCAtLXZlcnNpb24gMj4mMScsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIGFkZCBnbywgZG90bmV0XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQVdTQ0xJJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9hd3NjbGkuYW1hem9uYXdzLmNvbS9hd3NjbGktZXhlLWxpbnV4LSQodW5hbWUgLW0pLnppcCAtbyAvdG1wL2F3cy1jbGkuemlwJyxcbiAgICAgICAgICAgICAgICAgICAgJ3VuemlwIC1xIC1kIC90bXAgL3RtcC9hd3MtY2xpLnppcCcsXG4gICAgICAgICAgICAgICAgICAgICdzdWRvIC90bXAvYXdzL2luc3RhbGwnLFxuICAgICAgICAgICAgICAgICAgICAncm0gLXJmIC90bXAvYXdzJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBV1MgQ0xJIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2F3cyAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29uZmlndXJlQ29kZVNlcnZlcicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgIGBleHBvcnQgSE9NRT0vaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9jb2RlLXNlcnZlci5kZXYvaW5zdGFsbC5zaCB8IGJhc2ggLXMgLS0gMj4mMScsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0gMj4mMWAsXG4gICAgICAgICAgICAgICAgICAgIGB0ZWUgL2V0Yy9uZ2lueC9jb25mLmQvY29kZS1zZXJ2ZXIuY29uZiA8PEVPRlxuc2VydmVyIHtcbiAgICBsaXN0ZW4gODA7XG4gICAgbGlzdGVuIFs6Ol06ODA7XG4gICAgIyBzZXJ2ZXJfbmFtZSBkaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uRG9tYWluTmFtZTtcbiAgICAke3NlcnZlck5hbWVEaXJlY3RpdmV9XG4gICAgbG9jYXRpb24gLyB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC87XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbiAgICBsb2NhdGlvbiAvJHtkZXZTZXJ2ZXJCYXNlUGF0aH0ge1xuICAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OiR7ZGV2U2VydmVyUG9ydH0vJHtkZXZTZXJ2ZXJCYXNlUGF0aH07XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbn1cbkVPRmAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5jb25maWcvY29kZS1zZXJ2ZXJgLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlci9jb25maWcueWFtbCA8PEVPRlxuY2VydDogZmFsc2VcbmF1dGg6IHBhc3N3b3JkXG5oYXNoZWQtcGFzc3dvcmQ6IFwiJChlY2hvIC1uIHt7IFZTQ29kZVBhc3N3b3JkIH19IHwgYXJnb24yICQob3BlbnNzbCByYW5kIC1iYXNlNjQgMTIpIC1lKVwiXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9gLFxuICAgICAgICAgICAgICAgICAgICBgdG91Y2ggL2hvbWUvJHt2c0NvZGVVc2VyfS8uaHVzaGxvZ2luYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvbiA8PEVPRlxue1xuICBcImV4dGVuc2lvbnMuYXV0b1VwZGF0ZVwiOiBmYWxzZSxcbiAgXCJleHRlbnNpb25zLmF1dG9DaGVja1VwZGF0ZXNcIjogZmFsc2UsXG4gIFwidGVsZW1ldHJ5LnRlbGVtZXRyeUxldmVsXCI6IFwib2ZmXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LnN0YXJ0dXBQcm9tcHRcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbmFibGVkXCI6IGZhbHNlLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5iYW5uZXJcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbXB0eVdpbmRvd1wiOiBmYWxzZSxcbiAgXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXCI6IHRydWUsXG4gIFwiYXV0by1ydW4tY29tbWFuZC5ydWxlc1wiOiBbXG4gICAge1xuICAgICAgXCJjb21tYW5kXCI6IFwid29ya2JlbmNoLmFjdGlvbi50ZXJtaW5hbC5uZXdcIlxuICAgIH1cbiAgXVxufVxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHJlc3RhcnQgbmdpbngnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBBbWF6b25XZWJTZXJ2aWNlcy5hd3MtdG9vbGtpdC12c2NvZGUgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmFtYXpvbi1xLXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gc3luZWRyYS5hdXRvLXJ1bi1jb21tYW5kIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiB2c2NqYXZhLnZzY29kZS1qYXZhLXBhY2sgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIG1zLXZzY29kZS5saXZlLXNlcnZlciAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJOZ2lueCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICduZ2lueCAtdCAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgbmdpbngnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkNvZGVTZXJ2ZXIgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnY29kZS1zZXJ2ZXIgLXYnLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHN0YXR1cyBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ1VwZGF0ZVByb2ZpbGUnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBMQU5HPWVuX1VTLnV0Zi04ID4+IC9ldGMvZW52aXJvbm1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBMQ19BTEw9ZW5fVVMuVVRGLTggPj4gL2V0Yy9lbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBQQVRIJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19SRUdJT049JHtTdGFjay5vZihzY29wZSkucmVnaW9ufScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBBV1NfQUNDT1VOVElEPSR7U3RhY2sub2Yoc2NvcGUpLmFjY291bnR9JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IE5FWFRfVEVMRU1FVFJZX0RJU0FCTEVEPTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiZXhwb3J0IFBTMT0nXFxcXFtcXFxcMDMzWzAxOzMybVxcXFxdXFxcXHU6XFxcXFtcXFxcMDMzWzAxOzM0bVxcXFxdXFxcXHdcXFxcW1xcXFwwMzNbMDBtXFxcXF1cXFxcJCAnXCIgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxDREsnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgYXdzLWNkaycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQVdTIENESyBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdjZGsgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBMaW51eCBmbGF2b3I6ICR7bGludXhGbGF2b3J9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNzbURvY3VtZW50O1xuICB9XG59XG5cbmludGVyZmFjZSBDdXN0b21SZXNvdXJjZUluc3RhbGxlck9wdGlvbnMgZXh0ZW5kcyBJbnN0YWxsZXJPcHRpb25zIHt9XG5cbmNsYXNzIEN1c3RvbVJlc291cmNlSW5zdGFsbGVyIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgb3B0aW9uczogQ3VzdG9tUmVzb3VyY2VJbnN0YWxsZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IG9uRXZlbnQ6IEZ1bmN0aW9uID0gbmV3IEluc3RhbGxlckZ1bmN0aW9uKFxuICAgICAgc2NvcGUsXG4gICAgICAnSW5zdGFsbGVyT25FdmVudEhhbmRsZXInLFxuICAgICAge1xuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgICAgIG1lbW9yeVNpemU6IDUxMiwgLy8gVE9ETyBjb25maWd1cmFibGVcbiAgICAgIH0sXG4gICAgKTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbb25FdmVudF0sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAnRm9yIHRoaXMgZXZlbnQgaGFuZGxlciB3ZSBkbyBub3QgbmVlZCB0byByZXN0cmljdCBtYW5hZ2VkIHBvbGljaWVzJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUwxJyxcbiAgICAgICAgICByZWFzb246ICdGb3IgdGhpcyBsYW1iZGEgdGhlIGxhdGVzdCBydW50aW1lIGlzIG5vdCBuZWVkZWQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIGNvbnN0IGRvY3VtZW50QXJuID0gQXJuLmZvcm1hdChcbiAgICAgIHtcbiAgICAgICAgc2VydmljZTogJ3NzbScsXG4gICAgICAgIHJlc291cmNlOiAnZG9jdW1lbnQnLFxuICAgICAgICByZXNvdXJjZU5hbWU6IG9wdGlvbnMuZG9jdW1lbnROYW1lLFxuICAgICAgfSxcbiAgICAgIFN0YWNrLm9mKHNjb3BlKSxcbiAgICApO1xuXG4gICAgY29uc3QgY3dNYW5hZ2VBZ2VudEFybiA9IEFybi5mb3JtYXQoXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2U6ICdzc20nLFxuICAgICAgICByZXNvdXJjZTogJ2RvY3VtZW50JyxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiAnQW1hem9uQ2xvdWRXYXRjaC1NYW5hZ2VBZ2VudCcsXG4gICAgICB9LFxuICAgICAgU3RhY2sub2Yoc2NvcGUpLFxuICAgICk7XG5cbiAgICBjb25zdCB0YXJnZXRFYzJJbnN0YW5jZUFybiA9IEFybi5mb3JtYXQoXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2U6ICdlYzInLFxuICAgICAgICByZXNvdXJjZTogJ2luc3RhbmNlJyxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiBvcHRpb25zLmluc3RhbmNlSWQsXG4gICAgICB9LFxuICAgICAgU3RhY2sub2Yoc2NvcGUpLFxuICAgICk7XG5cbiAgICBvbkV2ZW50LmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3NzbTpTZW5kQ29tbWFuZCcsXG4gICAgICAgICAgJ3NzbTpHZXRDb21tYW5kSW52b2NhdGlvbicsXG4gICAgICAgICAgJ3NzbTpMaXN0Q29tbWFuZEludm9jYXRpb25zJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbZG9jdW1lbnRBcm4sIGN3TWFuYWdlQWdlbnRBcm4sIHRhcmdldEVjMkluc3RhbmNlQXJuXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcihzY29wZSwgJ0luc3RhbGxlclByb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IG9uRXZlbnQsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW3Byb3ZpZGVyXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdGb3IgdGhpcyBwcm92aWRlciB3ZSBkbyBub3QgbmVlZCB0byByZXN0cmljdCBtYW5hZ2VkIHBvbGljaWVzJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICAgIHJlYXNvbjogJ0ZvciB0aGlzIHByb3ZpZGVyIHdpbGRjYXJkcyBhcmUgZmluZScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1MMScsXG4gICAgICAgICAgcmVhc29uOiAnRm9yIHRoaXMgcHJvdmlkZXIgdGhlIGxhdGVzdCBydW50aW1lIGlzIG5vdCBuZWVkZWQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIG5ldyBDdXN0b21SZXNvdXJjZShzY29wZSwgJ1NTTUluc3RhbGxlckN1c3RvbVJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFNlcnZpY2VUaW1lb3V0OiAzMDUsIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgICAgIEluc3RhbmNlSWQ6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgICAgRG9jdW1lbnROYW1lOiBvcHRpb25zLmRvY3VtZW50TmFtZSxcbiAgICAgICAgQ2xvdWRXYXRjaExvZ0dyb3VwTmFtZTogb3B0aW9ucy5jbG91ZFdhdGNoTG9nR3JvdXBOYW1lLFxuICAgICAgICBWU0NvZGVQYXNzd29yZDogb3B0aW9ucy52c0NvZGVQYXNzd29yZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoKSB7fVxufVxuIl19
|
|
1063
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3RhbGxlci9pbnN0YWxsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXNEO0FBRXRELDJDQUEyQztBQUMzQywyQ0FBd0U7QUFDeEUsbUVBQXdEO0FBQ3hELHFDQUEwQztBQUUxQyw2REFBeUQ7QUFDekQsb0RBQW1EO0FBK0duRCxNQUFzQixTQUFTO0lBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBeUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFNBQVM7WUFDMUIsS0FBSyxDQUFDLEtBQWdCO2dCQUMzQixJQUFJLFlBQVksQ0FBQztnQkFDakIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDO2dCQUM3RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQztnQkFDcEQsSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3ZELFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUN0QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUNyQyxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixPQUFPLENBQUMsVUFBVSxFQUNsQixPQUFPLENBQUMsVUFBVSxFQUNsQixPQUFPLENBQUMsZUFBZSxFQUN2QixPQUFPLENBQUMsZ0JBQWdCLEVBQ3hCLE9BQU8sQ0FBQyxPQUFPLEVBQ2YsT0FBTyxDQUFDLGNBQWMsRUFDdEIsT0FBTyxDQUFDLGVBQWUsRUFDdkIsT0FBTyxDQUFDLGVBQWUsQ0FDeEIsQ0FBQztvQkFDRixZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUssQ0FBQztnQkFDaEMsQ0FBQztnQkFFRCxNQUFNLHNCQUFzQixHQUMx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QyxFQUFFLG9DQUFvQztnQkFDMUYsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO2dCQUM5QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7Z0JBQ2xDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxzQkFBc0I7Z0JBQ3RELGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYzthQUN2QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLEtBQUksQ0FBQztDQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIHNzbSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3NtJztcbmltcG9ydCB7IEFybiwgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzJztcbmltcG9ydCB7IE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJbnN0YWxsZXJGdW5jdGlvbiB9IGZyb20gJy4vaW5zdGFsbGVyLWZ1bmN0aW9uJztcbmltcG9ydCB7IExpbnV4Rmxhdm9yVHlwZSB9IGZyb20gJy4uL3ZzY29kZS1zZXJ2ZXInO1xuXG5pbnRlcmZhY2UgSW5zdGFsbGVyT3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGVjMiBpbnN0YW5jZSBpZCB0byBpbnN0YWxsIHRoZSBzc20gZG9jdW1lbnQgb25cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBzc20gZG9jdW1lbnQgdG8gaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHNzbSBkb2N1bWVudCBvZiB0aGUgY29uc3RydWN0XG4gICAqL1xuICByZWFkb25seSBkb2N1bWVudE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjbG91ZHdhdGNoIGxvZyBncm91cCBmb3IgdGhlIGluc3RhbGwgbG9nc1xuICAgKlxuICAgKiBAZGVmYXVsdCAvYXdzL3NzbS8ke2RvY3VtZW50TmFtZX1cbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB1c2VyIHVuZGVyIHdoaWNoIHRoZSB2c2NvZGUgc2VydmVyIHJ1bnNcbiAgICovXG4gIHJlYWRvbmx5IHZzQ29kZVVzZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhc3N3b3JkIG9mIHRoZSB1c2VyIHVuZGVyIHdoaWNoIHRoZSB2c2NvZGUgc2VydmVyIHJ1bnNcbiAgICovXG4gIHJlYWRvbmx5IHZzQ29kZVBhc3N3b3JkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBob21lIGZvbGRlciBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSBob21lRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIHJlc3QgcGF0aCB2cyBjb2RlIHNlcnZlciB3aWxsIHJ1blxuICAgKlxuICAgKiBAZGVmYXVsdCBhcHBcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlckJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9ydCB2c2NvZGVyIHNlcnZlciB3aWxsIGJlIHNlcnZlZCBpbiB0aGUgaW5zdGFuY2VcbiAgICpcbiAgICogQGRlZmF1bHQgODA4MVxuICAgKi9cbiAgcmVhZG9ubHkgZGV2U2VydmVyUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGN1c3RvbSBkb21haW4gbmFtZSBmb3IgdGhlIFZTIENvZGUgc2VydmVyXG4gICAqIFVzZWQgdG8gY29uZmlndXJlIG5naW54IHNlcnZlcl9uYW1lIGRpcmVjdGl2ZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZXMgKi5jbG91ZGZyb250Lm5ldCBvbmx5XG4gICAqL1xuICByZWFkb25seSBjdXN0b21Eb21haW5OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgTGludXggZmxhdm9yIHR5cGUgZm9yIHRoZSBpbnN0YW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgbGludXhGbGF2b3JUeXBlOiBMaW51eEZsYXZvclR5cGU7XG5cbiAgLyoqXG4gICAqIFJlbW90ZSBnaXQgcmVwb3NpdG9yeSBVUkwgdG8gY2xvbmUgaW50byB0aGUgaG9tZSBmb2xkZXIuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCB0aGUgcmVwb3NpdG9yeSB3aWxsIGJlIGNsb25lZCBpbnRvIHRoZSB1c2VyJ3MgaG9tZSBmb2xkZXIgZHVyaW5nIGluc3RhbmNlIHNldHVwLlxuICAgKiBVc2VmdWwgZm9yIHByZS1wb3B1bGF0aW5nIHdvcmtzaG9wIGVudmlyb25tZW50cyB3aXRoIHN0YXJ0ZXIgY29kZS5cbiAgICpcbiAgICogQGV4YW1wbGUgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hd3Mtc2FtcGxlcy9teS13b3Jrc2hvcC1yZXBvLmdpdCdcbiAgICogQGRlZmF1bHQgLSBubyByZXBvIGNsb25lZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb1VybD86IHN0cmluZztcblxuICAvKipcbiAgICogUzMgcGF0aCB0byBhIHppcCBmaWxlIGNvbnRhaW5pbmcgYXNzZXRzIHRvIGV4dHJhY3QgaW50byB0aGUgaG9tZSBmb2xkZXIuXG4gICAqXG4gICAqIFRoZSB6aXAgY29udGVudHMgd2lsbCBiZSBleHRyYWN0ZWQgdG8gdGhlIHVzZXIncyBob21lIGZvbGRlciBhbmQgY29tbWl0dGVkIHRvIGdpdC5cbiAgICogVXNlIHRoaXMgdG8gcHJvdmlkZSB3b3Jrc2hvcCBtYXRlcmlhbHMsIHNhbXBsZSBkYXRhLCBvciBjb25maWd1cmF0aW9uIGZpbGVzLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnbXktd29ya3Nob3AtYnVja2V0L2Fzc2V0cy93b3Jrc2hvcC1tYXRlcmlhbHMuemlwJ1xuICAgKiBAZGVmYXVsdCAtIG5vIGFzc2V0cyBkb3dubG9hZGVkXG4gICAqL1xuICByZWFkb25seSBhc3NldFppcFMzUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUzMgcGF0aCB0byBhIHppcCBmaWxlIGNvbnRhaW5pbmcgZ2l0IGJyYW5jaGVzIHRvIGNyZWF0ZSBpbiB0aGUgaG9tZSBmb2xkZXIgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogRWFjaCB0b3AtbGV2ZWwgZm9sZGVyIGluIHRoZSB6aXAgYmVjb21lcyBhIHNlcGFyYXRlIGdpdCBicmFuY2ggd2l0aCB0aGF0IGZvbGRlcidzIGNvbnRlbnRzLlxuICAgKiBJZGVhbCBmb3IgY3JlYXRpbmcgc3RlcC1ieS1zdGVwIHdvcmtzaG9wIGJyYW5jaGVzIChlLmcuLCBzdGVwLTEsIHN0ZXAtMiwgc29sdXRpb24pLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnbXktd29ya3Nob3AtYnVja2V0L2JyYW5jaGVzL2xhYi1icmFuY2hlcy56aXAnIChjb250YWluaW5nIGZvbGRlcnM6IHN0ZXAtMS8sIHN0ZXAtMi8sIHNvbHV0aW9uLylcbiAgICogQGRlZmF1bHQgLSBubyBicmFuY2hlcyBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBicmFuY2haaXBTM1BhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFMzIHBhdGggdG8gYSB6aXAgZmlsZSBjb250YWluaW5nIG11bHRpcGxlIGZvbGRlcnMgdG8gY3JlYXRlIGFzIHNlcGFyYXRlIGdpdCByZXBvc2l0b3JpZXMuXG4gICAqXG4gICAqIEVhY2ggdG9wLWxldmVsIGZvbGRlciBpbiB0aGUgemlwIGJlY29tZXMgYSBzZXBhcmF0ZSBzdWJmb2xkZXIgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnksXG4gICAqIGluaXRpYWxpemVkIGFzIGl0cyBvd24gZ2l0IHJlcG9zaXRvcnkuIFVzZWZ1bCBmb3IgbXVsdGktcHJvamVjdCB3b3Jrc2hvcHMuXG4gICAqXG4gICAqIEBleGFtcGxlICdteS13b3Jrc2hvcC1idWNrZXQvZm9sZGVycy93b3Jrc2hvcC1wcm9qZWN0cy56aXAnIChjb250YWluaW5nIGZvbGRlcnM6IGZyb250ZW5kLywgYmFja2VuZC8sIGluZnJhc3RydWN0dXJlLylcbiAgICogQGRlZmF1bHQgLSBubyBmb2xkZXJzIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlclppcFMzUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsZXJPcHRpb25zIGV4dGVuZHMgSW5zdGFsbGVyT3B0aW9uc0Jhc2Uge31cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluc3RhbGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgdWJ1bnR1KG9wdGlvbnM6IEluc3RhbGxlck9wdGlvbnMpOiBJbnN0YWxsZXIge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgICAgIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogSW5zdGFsbGVyIHtcbiAgICAgICAgbGV0IGRvY3VtZW50TmFtZTtcbiAgICAgICAgY29uc3QgZGV2U2VydmVyQmFzZVBhdGggPSBvcHRpb25zLmRldlNlcnZlckJhc2VQYXRoID8/ICdhcHAnO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJQb3J0ID0gb3B0aW9ucy5kZXZTZXJ2ZXJQb3J0ID8/IDgwODE7XG4gICAgICAgIGlmIChvcHRpb25zLmRvY3VtZW50TmFtZSAmJiBvcHRpb25zLmRvY3VtZW50TmFtZSAhPSAnJykge1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IG9wdGlvbnMuZG9jdW1lbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVTU01Eb2N1bWVudChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgICAgb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5saW51eEZsYXZvclR5cGUsXG4gICAgICAgICAgICBvcHRpb25zLmN1c3RvbURvbWFpbk5hbWUsXG4gICAgICAgICAgICBvcHRpb25zLnJlcG9VcmwsXG4gICAgICAgICAgICBvcHRpb25zLmFzc2V0WmlwUzNQYXRoLFxuICAgICAgICAgICAgb3B0aW9ucy5icmFuY2haaXBTM1BhdGgsXG4gICAgICAgICAgICBvcHRpb25zLmZvbGRlclppcFMzUGF0aCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IGRvY3VtZW50Lm5hbWUhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xvdWRXYXRjaExvZ0dyb3VwTmFtZSA9XG4gICAgICAgICAgb3B0aW9ucy5jbG91ZFdhdGNoTG9nR3JvdXBOYW1lID8/IGAvYXdzL3NzbS8ke2RvY3VtZW50TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IGluc3RhbGxlciA9IG5ldyBDdXN0b21SZXNvdXJjZUluc3RhbGxlcihzY29wZSwge1xuICAgICAgICAgIGluc3RhbmNlSWQ6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgICAgICBkb2N1bWVudE5hbWU6IGRvY3VtZW50TmFtZSxcbiAgICAgICAgICBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lOiBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lLFxuICAgICAgICAgIHZzQ29kZVVzZXI6IG9wdGlvbnMudnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogb3B0aW9ucy52c0NvZGVQYXNzd29yZCxcbiAgICAgICAgICBob21lRm9sZGVyOiBvcHRpb25zLmhvbWVGb2xkZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpbnN0YWxsZXI7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYW1hem9uTGludXgyMDIzKG9wdGlvbnM6IEluc3RhbGxlck9wdGlvbnMpOiBJbnN0YWxsZXIge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgICAgIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogSW5zdGFsbGVyIHtcbiAgICAgICAgbGV0IGRvY3VtZW50TmFtZTtcbiAgICAgICAgY29uc3QgZGV2U2VydmVyQmFzZVBhdGggPSBvcHRpb25zLmRldlNlcnZlckJhc2VQYXRoID8/ICdhcHAnO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJQb3J0ID0gb3B0aW9ucy5kZXZTZXJ2ZXJQb3J0ID8/IDgwODE7XG4gICAgICAgIGlmIChvcHRpb25zLmRvY3VtZW50TmFtZSAmJiBvcHRpb25zLmRvY3VtZW50TmFtZSAhPSAnJykge1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IG9wdGlvbnMuZG9jdW1lbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVTU01Eb2N1bWVudChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgICAgb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICAgICAgTGludXhGbGF2b3JUeXBlLkFNQVpPTl9MSU5VWF8yMDIzLFxuICAgICAgICAgICAgb3B0aW9ucy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgICAgICAgb3B0aW9ucy5yZXBvVXJsLFxuICAgICAgICAgICAgb3B0aW9ucy5hc3NldFppcFMzUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnMuYnJhbmNoWmlwUzNQYXRoLFxuICAgICAgICAgICAgb3B0aW9ucy5mb2xkZXJaaXBTM1BhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkb2N1bWVudE5hbWUgPSBkb2N1bWVudC5uYW1lITtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWUgPVxuICAgICAgICAgIG9wdGlvbnMuY2xvdWRXYXRjaExvZ0dyb3VwTmFtZSA/PyBgL2F3cy9zc20vJHtkb2N1bWVudE5hbWV9YDtcblxuICAgICAgICBjb25zdCBpbnN0YWxsZXIgPSBuZXcgQ3VzdG9tUmVzb3VyY2VJbnN0YWxsZXIoc2NvcGUsIHtcbiAgICAgICAgICBpbnN0YW5jZUlkOiBvcHRpb25zLmluc3RhbmNlSWQsXG4gICAgICAgICAgZG9jdW1lbnROYW1lOiBkb2N1bWVudE5hbWUsXG4gICAgICAgICAgY2xvdWRXYXRjaExvZ0dyb3VwTmFtZTogY2xvdWRXYXRjaExvZ0dyb3VwTmFtZSxcbiAgICAgICAgICB2c0NvZGVVc2VyOiBvcHRpb25zLnZzQ29kZVVzZXIsXG4gICAgICAgICAgdnNDb2RlUGFzc3dvcmQ6IG9wdGlvbnMudnNDb2RlUGFzc3dvcmQsXG4gICAgICAgICAgaG9tZUZvbGRlcjogb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaW5zdGFsbGVyO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICBwdWJsaWMgaW5zdGFuY2VJZCE6IHN0cmluZztcbiAgcHVibGljIGRvY3VtZW50TmFtZSE6IHN0cmluZztcbiAgcHVibGljIGNsb3VkV2F0Y2hMb2dHcm91cE5hbWUhOiBzdHJpbmc7XG4gIHB1YmxpYyB2c0NvZGVQYXNzd29yZCE6IHN0cmluZztcbiAgcHVibGljIHZzQ29kZVBhc3N3b3JkVGVzdCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZChzY29wZTogQ29uc3RydWN0KTogYW55O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBJbnN0YWxsQ2xvdWRXYXRjaEFnZW50IHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUluc3RhbGxDbG91ZFdhdGNoQWdlbnRTdGVwKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpjb25maWd1cmVQYWNrYWdlJyxcbiAgICAgIG5hbWU6ICdJbnN0YWxsQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBuYW1lOiAnQW1hem9uQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgICAgYWN0aW9uOiAnSW5zdGFsbCcsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgQ29uZmlndXJlQ2xvdWRXYXRjaEFnZW50IHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudFN0ZXAoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnYXdzOnJ1bkRvY3VtZW50JyxcbiAgICAgIG5hbWU6ICdDb25maWd1cmVDbG91ZFdhdGNoQWdlbnQnLFxuICAgICAgaW5wdXRzOiB7XG4gICAgICAgIGRvY3VtZW50VHlwZTogJ1NTTURvY3VtZW50JyxcbiAgICAgICAgZG9jdW1lbnRQYXRoOiAnQW1hem9uQ2xvdWRXYXRjaC1NYW5hZ2VBZ2VudCcsXG4gICAgICAgIGRvY3VtZW50UGFyYW1ldGVyczoge1xuICAgICAgICAgIGFjdGlvbjogJ2NvbmZpZ3VyZScsXG4gICAgICAgICAgbW9kZTogJ2VjMicsXG4gICAgICAgICAgb3B0aW9uYWxDb25maWd1cmF0aW9uU291cmNlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgb3B0aW9uYWxSZXN0YXJ0OiAneWVzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBVcGRhdGVQcm9maWxlIHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZVByb2ZpbGVTdGVwKHZzQ29kZVVzZXI6IHN0cmluZywgcmVnaW9uOiBzdHJpbmcsIGFjY291bnQ6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICBuYW1lOiAnVXBkYXRlUHJvZmlsZScsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgJ2VjaG8gTEFORz1lbl9VUy51dGYtOCA+PiAvZXRjL2Vudmlyb25tZW50JyxcbiAgICAgICAgICAnZWNobyBMQ19BTEw9ZW5fVVMuVVRGLTggPj4gL2V0Yy9lbnZpcm9ubWVudCcsXG4gICAgICAgICAgYGVjaG8gJ1BBVEg9JFBBVEg6L2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvYmluJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgIGBlY2hvICdleHBvcnQgUEFUSCcgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19SRUdJT049JHtyZWdpb259JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgIGBlY2hvICdleHBvcnQgQVdTX0FDQ09VTlRJRD0ke2FjY291bnR9JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgIGBlY2hvICdleHBvcnQgTkVYVF9URUxFTUVUUllfRElTQUJMRUQ9MScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICBgZWNobyBcImV4cG9ydCBQUzE9J1xcXFxbXFxcXDAzM1swMTszMm1cXFxcXVxcXFx1OlxcXFxbXFxcXDAzM1swMTszNG1cXFxcXVxcXFx3XFxcXFtcXFxcMDMzWzAwbVxcXFxdXFxcXCQgJ1wiID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBJbnN0YWxsQVdTQ0xJIHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUluc3RhbGxBV1NDTElTdGVwKHZzQ29kZVVzZXI6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICBuYW1lOiAnSW5zdGFsbEFXU0NMSScsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgJ21rZGlyIC1wIC90bXAnLFxuICAgICAgICAgICdjdXJsIC1mc1NMIGh0dHBzOi8vYXdzY2xpLmFtYXpvbmF3cy5jb20vYXdzY2xpLWV4ZS1saW51eC0kKHVuYW1lIC1tKS56aXAgLW8gL3RtcC9hd3MtY2xpLnppcCcsXG4gICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvdG1wL2F3cy1jbGkuemlwYCxcbiAgICAgICAgICAndW56aXAgLXEgLWQgL3RtcCAvdG1wL2F3cy1jbGkuemlwJyxcbiAgICAgICAgICAnc3VkbyAvdG1wL2F3cy9pbnN0YWxsJyxcbiAgICAgICAgICAncm0gLXJmIC90bXAvYXdzJyxcbiAgICAgICAgICAnZWNobyBcIkFXUyBDTEkgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICdhd3MgLS12ZXJzaW9uJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBDbG9uZVJlcG8gc3RlcCBmb3IgU1NNIGRvY3VtZW50XG4gICAqIFRoaXMgc3RlcCBpcyBpZGVudGljYWwgZm9yIGJvdGggVWJ1bnR1IGFuZCBBbWF6b24gTGludXhcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ2xvbmVSZXBvU3RlcCh2c0NvZGVVc2VyOiBzdHJpbmcsIGhvbWVGb2xkZXI6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICBuYW1lOiAnQ2xvbmVSZXBvJyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICBgaWYgW1sgLXogXCJ7eyBSZXBvVXJsIH19XCIgXV1cbnRoZW5cbiAgZWNobyBcIk5vIFJlcG9cIlxuZWxzZVxuICBta2RpciAtcCAke2hvbWVGb2xkZXJ9ICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAke2hvbWVGb2xkZXJ9XG4gIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY2xvbmUge3sgUmVwb1VybCB9fSAke2hvbWVGb2xkZXJ9XG4gIGVjaG8gXCJSZXBvIHt7IFJlcG9VcmwgfX0gY2xvbmVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCJcbiAgbHMgLWxhICR7aG9tZUZvbGRlcn1cbiAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IHJlbW90ZSAtdlxuZmlgLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIERvd25sb2FkQXNzZXRzIHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURvd25sb2FkQXNzZXRzU3RlcCh2c0NvZGVVc2VyOiBzdHJpbmcsIGhvbWVGb2xkZXI6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICBuYW1lOiAnRG93bmxvYWRBc3NldHMnLFxuICAgICAgaW5wdXRzOiB7XG4gICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgIGBpZiBbWyAteiBcInt7IEFzc2V0WmlwUzNQYXRoIH19XCIgXV1cbnRoZW5cbiAgZWNobyBcIk5vIGFzc2V0c1wiXG5lbHNlXG4gIG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1cbiAgbWtkaXIgLXAgL3RtcFxuICBhd3MgczMgY3AgczM6Ly97eyBBc3NldFppcFMzUGF0aCB9fSAvdG1wL2Fzc2V0LnppcFxuICBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9hc3NldC56aXBcbiAgdW56aXAgLW8gL3RtcC9hc3NldC56aXAgLWQgJHtob21lRm9sZGVyfVxuICBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICBpZiAgW1sgLWQgJHtob21lRm9sZGVyfS8uZ2l0IF1dXG4gIHRoZW5cbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gYWRkIC5cbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gY29tbWl0IC1tICdjaG9yZTogd29ya3Nob3AgY29tbWl0J1xuICBlbHNlXG4gICAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IGluaXRcbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gYWRkIC5cbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gY29tbWl0IC1tICdjaG9yZTogaW5pdGlhbCBjb21taXQnXG4gIGZpXG4gIGVjaG8gXCJBc3NldHMgZG93bmxvYWRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvbjogJHtob21lRm9sZGVyfVwiXG4gIGxzIC1sYSAke2hvbWVGb2xkZXJ9XG4gIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHtob21lRm9sZGVyfSBicmFuY2hcbmZpYCxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBEb3dubG9hZEZvbGRlcnMgc3RlcCBmb3IgU1NNIGRvY3VtZW50XG4gICAqIFRoaXMgc3RlcCBpcyBpZGVudGljYWwgZm9yIGJvdGggVWJ1bnR1IGFuZCBBbWF6b24gTGludXhcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRG93bmxvYWRGb2xkZXJzU3RlcCh2c0NvZGVVc2VyOiBzdHJpbmcsIGhvbWVGb2xkZXI6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICBuYW1lOiAnRG93bmxvYWRGb2xkZXJzJyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICBgaWYgW1sgLXogXCJ7eyBGb2xkZXJaaXBTM1BhdGggfX1cIiBdXVxudGhlblxuICBlY2hvIFwiTm8gZm9sZGVyc1wiXG5lbHNlXG4gIHJtIC1yZiAvdG1wL2ZvbGRlclxuICBta2RpciAtcCAvdG1wL2ZvbGRlciAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9mb2xkZXJcbiAgYXdzIHMzIGNwIHMzOi8ve3sgRm9sZGVyWmlwUzNQYXRoIH19IC90bXAvYXNzZXQtZm9sZGVyLnppcFxuICBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9hc3NldC1mb2xkZXIuemlwXG4gIHVuemlwIC1vIC90bXAvYXNzZXQtZm9sZGVyLnppcCAtZCAvdG1wL2ZvbGRlclxuICBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9mb2xkZXJcbiAgbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICBjZCBcIiR7aG9tZUZvbGRlcn1cIiAmJiBjZCAuLlxuICBpZiBbWyAkKHB3ZCkgPT0gIFwiL1wiIF1dXG4gIHRoZW5cbiAgICB0YXJnZXRSb290Rm9sZGVyPVwiXCJcbiAgZWxzZVxuICAgIHRhcmdldFJvb3RGb2xkZXI9JChwd2QpXG4gICAgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC5cbiAgZmlcbiAgZmluZCBcIi90bXAvZm9sZGVyXCIgLW1heGRlcHRoIDEgLW1pbmRlcHRoIDEgLXR5cGUgZCB8IHdoaWxlIHJlYWQgc291cmNlRm9sZGVyOyBkb1xuICAgIGZvbGRlcj1cIiQoYmFzZW5hbWUgJHNvdXJjZUZvbGRlcilcIlxuICAgIGVjaG8gXCJQcm9jZXNzaW5nIGZvbGRlcjogJGZvbGRlclwiXG4gICAgdGFyZ2V0Rm9sZGVyPSR0YXJnZXRSb290Rm9sZGVyLyRmb2xkZXJcbiAgICBpZiBbWyAkdGFyZ2V0Um9vdEZvbGRlciA9PSBcIlwiIF1dXG4gICAgdGhlblxuICAgICAgbXYgJHNvdXJjZUZvbGRlciAvXG4gICAgZWxzZVxuICAgICAgbXYgJHNvdXJjZUZvbGRlciAkdGFyZ2V0Um9vdEZvbGRlclxuICAgIGZpXG4gICAgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR0YXJnZXRGb2xkZXJcbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR0YXJnZXRGb2xkZXIgaW5pdFxuICAgIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHRhcmdldEZvbGRlciBhZGQgLlxuICAgIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHRhcmdldEZvbGRlciBjb21taXQgLW0gXCJjaG9yZTogaW5pdGlhbCBjb21taXRcIlxuICAgIGVjaG8gXCJGb2xkZXIgZG93bmxvYWRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvbjogJHRhcmdldEZvbGRlclwiXG4gICAgbHMgLWxhICR0YXJnZXRGb2xkZXJcbiAgZG9uZVxuICBybSAtcmYgL3RtcC9mb2xkZXJcbmZpYCxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBJbnN0YWxsQ0RLIHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUluc3RhbGxDREtTdGVwKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICBuYW1lOiAnSW5zdGFsbENESycsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgJ25wbSBpbnN0YWxsIC1nIGF3cy1jZGsnLFxuICAgICAgICAgICdlY2hvIFwiQVdTIENESyBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgJ2NkayAtLXZlcnNpb24nLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIEluc3RhbGxRQ0xJIHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUluc3RhbGxRQ0xJU3RlcCh2c0NvZGVVc2VyOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ0luc3RhbGxRQ0xJJyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAnY3VybCAtLXByb3RvIFxcJz1odHRwc1xcJyAtLXRsc3YxLjIgLXNTZiBcImh0dHBzOi8vZGVza3RvcC1yZWxlYXNlLnEudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vbGF0ZXN0L3EtJCh1bmFtZSAtbSktbGludXguemlwXCIgLW8gL3RtcC9xLnppcCcsXG4gICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvdG1wL3EuemlwYCxcbiAgICAgICAgICAndW56aXAgLXEgLWQgL3RtcCAvdG1wL3EuemlwJyxcbiAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC90bXAvcWAsXG4gICAgICAgICAgJ2NobW9kICt4IC90bXAvcS9pbnN0YWxsLnNoJyxcbiAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC90bXAvcS9pbnN0YWxsLnNoIC0tbm8tY29uZmlybWAsXG4gICAgICAgICAgJ3JtIC1yZiAvdG1wL3EnLFxuICAgICAgICAgICdxIC0tdmVyc2lvbicsXG4gICAgICAgICAgJ2VjaG8gXCJBbWF6b24gUSBDTEkgaW5zdGFsbGVkXCInLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIEluc3RhbGx1diBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbnN0YWxsdXZTdGVwKHZzQ29kZVVzZXI6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICBuYW1lOiAnSW5zdGFsbHV2JyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY3VybCAtZnNTTCBodHRwczovL2FzdHJhbC5zaC91di9pbnN0YWxsLnNoIC1vIC90bXAvdXZfaW5zdGFsbC5zaGAsXG4gICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGJhc2ggL3RtcC91dl9pbnN0YWxsLnNoYCxcbiAgICAgICAgICBgaWYgdXYgZ2VuZXJhdGUtc2hlbGwtY29tcGxldGlvbiBiYXNoICY+L2Rldi9udWxsOyB0aGVuXG4gIGVjaG8gJ2V2YWwgXCIkKHV2IGdlbmVyYXRlLXNoZWxsLWNvbXBsZXRpb24gYmFzaClcIicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjXG5maWAsXG4gICAgICAgICAgYGlmIHV2eCBnZW5lcmF0ZS1zaGVsbC1jb21wbGV0aW9uIGJhc2ggJj4vZGV2L251bGw7IHRoZW5cbiAgZWNobyAnZXZhbCBcIiQodXZ4IGdlbmVyYXRlLXNoZWxsLWNvbXBsZXRpb24gYmFzaClcIicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjXG5maWAsXG4gICAgICAgICAgJ2VjaG8gXCJ1diBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIHV2IC0tdmVyc2lvbmAsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgQ29uZmlndXJlQ29kZVNlcnZlciBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb25maWd1cmVDb2RlU2VydmVyU3RlcChcbiAgICB2c0NvZGVVc2VyOiBzdHJpbmcsXG4gICAgaG9tZUZvbGRlcjogc3RyaW5nLFxuICAgIGRldlNlcnZlckJhc2VQYXRoOiBzdHJpbmcsXG4gICAgZGV2U2VydmVyUG9ydDogbnVtYmVyLFxuICAgIHNlcnZlck5hbWVEaXJlY3RpdmU6IHN0cmluZyxcbiAgKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgIG5hbWU6ICdDb25maWd1cmVDb2RlU2VydmVyJyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICBgZXhwb3J0IEhPTUU9L2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9jb2RlLXNlcnZlci5kZXYvaW5zdGFsbC5zaCB8IHNoIC1zIC0tIC0tdmVyc2lvbiA0LjEwMC4zJyxcbiAgICAgICAgICBgc3lzdGVtY3RsIGVuYWJsZSAtLW5vdyBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9IDI+JjFgLFxuICAgICAgICAgIGB0ZWUgL2V0Yy9uZ2lueC9jb25mLmQvY29kZS1zZXJ2ZXIuY29uZiA8PEVPRlxuc2VydmVyIHtcbiAgICBsaXN0ZW4gODA7XG4gICAgbGlzdGVuIFs6Ol06ODA7XG4gICAgIyBzZXJ2ZXJfbmFtZSBcXFxcJFxcXFx7Q2xvdWRGcm9udERpc3RyaWJ1dGlvbi5Eb21haW5OYW1lXFxcXH07XG4gICAgJHtzZXJ2ZXJOYW1lRGlyZWN0aXZlfVxuICAgIGxvY2F0aW9uIC8ge1xuICAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OjgwODAvO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBIb3N0IFxcXFwkaG9zdDtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgVXBncmFkZSBcXFxcJGh0dHBfdXBncmFkZTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgQ29ubmVjdGlvbiB1cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBBY2NlcHQtRW5jb2RpbmcgZ3ppcDtcbiAgICB9XG4gICAgbG9jYXRpb24gLyR7ZGV2U2VydmVyQmFzZVBhdGh9IHtcbiAgICAgIHByb3h5X3Bhc3MgaHR0cDovL2xvY2FsaG9zdDoke2RldlNlcnZlclBvcnR9LyR7ZGV2U2VydmVyQmFzZVBhdGh9O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBIb3N0IFxcXFwkaG9zdDtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgVXBncmFkZSBcXFxcJGh0dHBfdXBncmFkZTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgQ29ubmVjdGlvbiB1cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBBY2NlcHQtRW5jb2RpbmcgZ3ppcDtcbiAgICB9XG59XG5FT0ZgLFxuICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5jb25maWcvY29kZS1zZXJ2ZXJgLFxuICAgICAgICAgIGB0ZWUgL2hvbWUvJHt2c0NvZGVVc2VyfS8uY29uZmlnL2NvZGUtc2VydmVyL2NvbmZpZy55YW1sIDw8RU9GXG5jZXJ0OiBmYWxzZVxuYXV0aDogcGFzc3dvcmRcbmhhc2hlZC1wYXNzd29yZDogXCIkKGVjaG8gLW4ge3sgVlNDb2RlUGFzc3dvcmQgfX0gfCBhcmdvbjIgJChvcGVuc3NsIHJhbmQgLWJhc2U2NCAxMikgLWUpXCJcbkVPRmAsXG4gICAgICAgICAgYG1rZGlyIC1wIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvYCxcbiAgICAgICAgICBgdG91Y2ggL2hvbWUvJHt2c0NvZGVVc2VyfS8uaHVzaGxvZ2luYCxcbiAgICAgICAgICBgbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfWAsXG4gICAgICAgICAgYHRlZSAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL3NldHRpbmdzLmpzb24gPDxFT0ZcbntcbiAgXCJleHRlbnNpb25zLmF1dG9VcGRhdGVcIjogZmFsc2UsXG4gIFwiZXh0ZW5zaW9ucy5hdXRvQ2hlY2tVcGRhdGVzXCI6IGZhbHNlLFxuICBcInRlbGVtZXRyeS50ZWxlbWV0cnlMZXZlbFwiOiBcIm9mZlwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5zdGFydHVwUHJvbXB0XCI6IFwibmV2ZXJcIixcbiAgXCJzZWN1cml0eS53b3Jrc3BhY2UudHJ1c3QuZW5hYmxlZFwiOiBmYWxzZSxcbiAgXCJzZWN1cml0eS53b3Jrc3BhY2UudHJ1c3QuYmFubmVyXCI6IFwibmV2ZXJcIixcbiAgXCJzZWN1cml0eS53b3Jrc3BhY2UudHJ1c3QuZW1wdHlXaW5kb3dcIjogZmFsc2UsXG4gIFwiYXV0by1ydW4tY29tbWFuZC5ydWxlc1wiOiBbXG4gICAge1xuICAgICAgXCJjb21tYW5kXCI6IFwid29ya2JlbmNoLmFjdGlvbi50ZXJtaW5hbC5uZXdcIlxuICAgIH1cbiAgXVxufVxuRU9GYCxcbiAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgIGBzeXN0ZW1jdGwgcmVzdGFydCBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAnc3lzdGVtY3RsIHJlc3RhcnQgbmdpbngnLFxuICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmF3cy10b29sa2l0LXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBBbWF6b25XZWJTZXJ2aWNlcy5hbWF6b24tcS12c2NvZGUgLS1mb3JjZWAsXG4gICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gbXMtdnNjb2RlLmxpdmUtc2VydmVyIC0tZm9yY2VgLFxuICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIHN5bmVkcmEuYXV0by1ydW4tY29tbWFuZCAtLWZvcmNlYCxcbiAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICdlY2hvIFwiTmdpbnggaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICduZ2lueCAtdCAyPiYxJyxcbiAgICAgICAgICAnc3lzdGVtY3RsIHN0YXR1cyBuZ2lueCcsXG4gICAgICAgICAgJ2VjaG8gXCJDb2RlU2VydmVyIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAnY29kZS1zZXJ2ZXIgLXYnLFxuICAgICAgICAgIGBzeXN0ZW1jdGwgc3RhdHVzIGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIERvd25sb2FkQnJhbmNoZXMgc3RlcCBmb3IgU1NNIGRvY3VtZW50XG4gICAqIFRoaXMgc3RlcCBpcyBpZGVudGljYWwgZm9yIGJvdGggVWJ1bnR1IGFuZCBBbWF6b24gTGludXhcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRG93bmxvYWRCcmFuY2hlc1N0ZXAodnNDb2RlVXNlcjogc3RyaW5nLCBob21lRm9sZGVyOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ0Rvd25sb2FkQnJhbmNoZXMnLFxuICAgICAgaW5wdXRzOiB7XG4gICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgIGBpZiBbWyAteiBcInt7IEJyYW5jaFppcFMzUGF0aCB9fVwiIF1dXG50aGVuXG4gIGVjaG8gXCJObyBicmFuY2hlc1wiXG5lbHNlXG4gIHJtIC1yZiAvdG1wL2JyYW5jaFxuICBybSAtcmYgL3RtcC9naXRcbiAgbWtkaXIgLXAgL3RtcC9icmFuY2ggJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC90bXAvYnJhbmNoXG4gIG1rZGlyIC1wIC90bXAvZ2l0ICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvdG1wL2dpdFxuICBhd3MgczMgY3AgczM6Ly97eyBCcmFuY2haaXBTM1BhdGggfX0gL3RtcC9hc3NldC1icmFuY2guemlwXG4gIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvdG1wL2Fzc2V0LWJyYW5jaC56aXBcbiAgdW56aXAgLW8gL3RtcC9hc3NldC1icmFuY2guemlwIC1kIC90bXAvYnJhbmNoXG4gIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvdG1wL2JyYW5jaFxuICBta2RpciAtcCAke2hvbWVGb2xkZXJ9ICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAke2hvbWVGb2xkZXJ9XG4gIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHtob21lRm9sZGVyfSBpbml0XG4gIG12ICR7aG9tZUZvbGRlcn0vLmdpdCAvdG1wL2dpdFxuICBybSAtcmYgJHtob21lRm9sZGVyfVxuICBta2RpciAtcCAke2hvbWVGb2xkZXJ9ICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAke2hvbWVGb2xkZXJ9XG4gIG12IC90bXAvZ2l0Ly5naXQgJHtob21lRm9sZGVyfVxuICBmaW5kIC90bXAvYnJhbmNoIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgfCB3aGlsZSByZWFkIHNvdXJjZUZvbGRlcjsgZG9cbiAgICBicmFuY2g9XCIkKGJhc2VuYW1lICRzb3VyY2VGb2xkZXIpXCJcbiAgICBlY2hvIFwiUHJvY2Vzc2luZyBicmFuY2g6ICRicmFuY2hcIlxuICAgIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHtob21lRm9sZGVyfSBjaGVja291dCAtYiAkYnJhbmNoIDI+JjFcbiAgICBjcCAtYSAkc291cmNlRm9sZGVyLy4gJHtob21lRm9sZGVyfVxuICAgIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHtob21lRm9sZGVyfSBhZGQgLlxuICAgIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHtob21lRm9sZGVyfSBjb21taXQgLW0gXCJjaG9yZTogaW5pdGlhbCBjb21taXQgJGJyYW5jaFwiXG4gICAgbXYgJHtob21lRm9sZGVyfS8uZ2l0IC90bXAvZ2l0XG4gICAgcm0gLXJmICR7aG9tZUZvbGRlcn1cbiAgICBta2RpciAke2hvbWVGb2xkZXJ9ICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAke2hvbWVGb2xkZXJ9XG4gICAgbXYgL3RtcC9naXQvLmdpdCAke2hvbWVGb2xkZXJ9XG4gIGRvbmVcbiAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IGNoZWNrb3V0IG1haW4gMj4mMVxuICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gcmVzdG9yZSAuXG4gIHJtIC1yZiAvdG1wL2JyYW5jaFxuICBybSAtcmYgL3RtcC9naXRcbiAgZWNobyBcIkJyYW5jaGVzIGRvd25sb2FkZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb246ICR7aG9tZUZvbGRlcn1cIlxuICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gYnJhbmNoXG4gIGxzIC1sYSAke2hvbWVGb2xkZXJ9XG5maWAsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNTTURvY3VtZW50KFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgZGV2U2VydmVyQmFzZVBhdGg6IHN0cmluZyxcbiAgICBkZXZTZXJ2ZXJQb3J0OiBudW1iZXIsXG4gICAgdnNDb2RlVXNlcjogc3RyaW5nLFxuICAgIGhvbWVGb2xkZXI6IHN0cmluZyxcbiAgICBsaW51eEZsYXZvcjogTGludXhGbGF2b3JUeXBlLFxuICAgIGN1c3RvbURvbWFpbk5hbWU/OiBzdHJpbmcsXG4gICAgcmVwb1VybD86IHN0cmluZyxcbiAgICBhc3NldFppcFMzUGF0aD86IHN0cmluZyxcbiAgICBicmFuY2haaXBTM1BhdGg/OiBzdHJpbmcsXG4gICAgZm9sZGVyWmlwUzNQYXRoPzogc3RyaW5nLFxuICApOiBzc20uQ2ZuRG9jdW1lbnQge1xuICAgIC8vIEdlbmVyYXRlIG5naW54IHNlcnZlcl9uYW1lIGRpcmVjdGl2ZSBiYXNlZCBvbiBjdXN0b20gZG9tYWluXG4gICAgY29uc3Qgc2VydmVyTmFtZURpcmVjdGl2ZSA9IGN1c3RvbURvbWFpbk5hbWVcbiAgICAgID8gYHNlcnZlcl9uYW1lICouY2xvdWRmcm9udC5uZXQgJHtjdXN0b21Eb21haW5OYW1lfTtgXG4gICAgICA6ICdzZXJ2ZXJfbmFtZSAqLmNsb3VkZnJvbnQubmV0Oyc7XG5cbiAgICBsZXQgc3NtRG9jdW1lbnQ6IHNzbS5DZm5Eb2N1bWVudDtcbiAgICBzd2l0Y2ggKGxpbnV4Rmxhdm9yKSB7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjI6XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjQ6XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjU6XG4gICAgICAgIC8vIENyZWF0ZSBhbiBTU00gZG9jdW1lbnQgd2l0aCBtdWx0aXBsZSBhY3Rpb25zIHRvIGluc3RhbGwgdGhlIHNvZnR3YXJlXG4gICAgICAgIHNzbURvY3VtZW50ID0gbmV3IHNzbS5DZm5Eb2N1bWVudChzY29wZSwgJ3NzbS1kb2N1bWVudC11YnVudHUnLCB7XG4gICAgICAgICAgbmFtZTogYHZzY29kZS1zZXJ2ZXItdWJ1bnR1LSR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX1gLFxuICAgICAgICAgIGRvY3VtZW50VHlwZTogJ0NvbW1hbmQnLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHNjaGVtYVZlcnNpb246ICcyLjInLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdCb290c3RyYXAgVlNDb2RlIGNvZGUtc2VydmVyIGluc3RhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgVlNDb2RlUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBTdGFjay5vZihzY29wZSkuc3RhY2tJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgTm9kZVZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiAnMjInLFxuICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFsnMjQnLCAnMjInLCAnMjAnLCAnMTgnXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgUmVwb1VybDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJlcG9VcmwgPz8gJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIEFzc2V0WmlwUzNQYXRoOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYXNzZXRaaXBTM1BhdGggPz8gJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIEJyYW5jaFppcFMzUGF0aDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyYW5jaFppcFMzUGF0aCA/PyAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgRm9sZGVyWmlwUzNQYXRoOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZm9sZGVyWmlwUzNQYXRoID8/ICcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGFsbCBtYWluU3RlcHMgc2NyaXB0cyBhcmUgaW4gaW4gL3Zhci9saWIvYW1hem9uL3NzbS88aW5zdGFuY2VpZD4vZG9jdW1lbnQvb3JjaGVzdHJhdGlvbi88dXVpZD4vPFN0ZXBOYW1lPi9fc2NyaXB0LnNoXG4gICAgICAgICAgICBtYWluU3RlcHM6IFtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnN0YWxsQ2xvdWRXYXRjaEFnZW50U3RlcCgpLFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudFN0ZXAoKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxBcHRQYWNrYWdlc0FwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkcGtnIC0tY29uZmlndXJlIC1hJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgYXB0LXV0aWxzJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgbmVlZHJlc3RhcnQgdW5hdHRlbmRlZC11cGdyYWRlcycsXG4gICAgICAgICAgICAgICAgICAgIFwic2VkIC1pICdzLyMkbnJjb25me2tlcm5lbGhpbnRzfSA9IC0xOy8kbnJjb25me2tlcm5lbGhpbnRzfSA9IDA7LycgL2V0Yy9uZWVkcmVzdGFydC9uZWVkcmVzdGFydC5jb25mXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic2VkIC1pICdzLyMkbnJjb25me3ZlcmJvc2l0eX0gPSAyOy8kbnJjb25me3ZlcmJvc2l0eX0gPSAwOy8nIC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZlwiLFxuICAgICAgICAgICAgICAgICAgICBcInNlZCAtaSBcXFwicy8jXFwkbnJjb25me3Jlc3RhcnR9ID0gJ2knOy9cXCRucmNvbmZ7cmVzdGFydH0gPSAnYSc7L1xcXCIgL2V0Yy9uZWVkcmVzdGFydC9uZWVkcmVzdGFydC5jb25mXCIsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQXB0IGhlbHBlciBwYWNrYWdlcyBhZGRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2NhdCAvZXRjL25lZWRyZXN0YXJ0L25lZWRyZXN0YXJ0LmNvbmYnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEJhc2VQYWNrYWdlc0FwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkcGtnIC0tY29uZmlndXJlIC1hJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgY3VybCBnbnVwZyB3aG9pcyBhcmdvbjIgdW56aXAgbmdpbnggb3BlbnNzbCBsb2NhbGVzIGxvY2FsZXMtYWxsIGFwdC10cmFuc3BvcnQtaHR0cHMgY2EtY2VydGlmaWNhdGVzIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0FkZFVzZXJBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZHBrZyAtLWNvbmZpZ3VyZSAtYScsXG4gICAgICAgICAgICAgICAgICAgIGBpZiBbWyBcIiR7dnNDb2RlVXNlcn1cIiA9PSBcInVidW50dVwiIF1dXG50aGVuXG4gIGVjaG8gJ1VzaW5nIGV4aXN0aW5nIHVzZXI6ICR7dnNDb2RlVXNlcn0nXG5lbHNlXG4gIGVjaG8gJ0FkZGluZyB1c2VyOiAke3ZzQ29kZVVzZXJ9J1xuICBhZGR1c2VyIC0tZGlzYWJsZWQtcGFzc3dvcmQgLS1nZWNvcyAnJyAke3ZzQ29kZVVzZXJ9XG4gIGVjaG8gXCIke3ZzQ29kZVVzZXJ9Ont7IFZTQ29kZVBhc3N3b3JkIH19XCIgfCBjaHBhc3N3ZFxuICB1c2VybW9kIC1hRyBzdWRvICR7dnNDb2RlVXNlcn1cbmZpYCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL3N1ZG9lcnMuZC85MS12c2NvZGUtdXNlciA8PEVPRlxuJHt2c0NvZGVVc2VyfSBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9iaW4gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIlVzZXIgYWRkZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgIGBnZXRlbnQgcGFzc3dkICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVVwZGF0ZVByb2ZpbGVTdGVwKHZzQ29kZVVzZXIsIFN0YWNrLm9mKHNjb3BlKS5yZWdpb24sIFN0YWNrLm9mKHNjb3BlKS5hY2NvdW50KSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnN0YWxsQVdTQ0xJU3RlcCh2c0NvZGVVc2VyKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxHaXRBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZHBrZyAtLWNvbmZpZ3VyZSAtYScsXG4gICAgICAgICAgICAgICAgICAgICdhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOmdpdC1jb3JlL3BwYScsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGdpdCcsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsIFwicGFydGljaXBhbnRAZXhhbXBsZS5jb21cImAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgXCJXb3Jrc2hvcCBQYXJ0aWNpcGFudFwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBcIm1haW5cImAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR2l0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dpdCAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNsb25lUmVwb1N0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRG93bmxvYWRBc3NldHNTdGVwKHZzQ29kZVVzZXIsIGhvbWVGb2xkZXIpLFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURvd25sb2FkRm9sZGVyc1N0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRG93bmxvYWRCcmFuY2hlc1N0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29uZmlndXJlQ29kZVNlcnZlclN0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciwgZGV2U2VydmVyQmFzZVBhdGgsIGRldlNlcnZlclBvcnQsIHNlcnZlck5hbWVEaXJlY3RpdmUpLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbE5vZGVBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS1yZXBvLmdwZy5rZXkgfCBncGcgLS1kZWFybW9yIC1vIC91c3Ivc2hhcmUva2V5cmluZ3Mvbm9kZXNvdXJjZS5ncGcnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcImRlYiBbYXJjaD0kKGRwa2cgLS1wcmludC1hcmNoaXRlY3R1cmUpIHNpZ25lZC1ieT0vdXNyL3NoYXJlL2tleXJpbmdzL25vZGVzb3VyY2UuZ3BnXSBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlX3t7IE5vZGVWZXJzaW9uIH19Lnggbm9kaXN0cm8gbWFpblwiID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0JyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgbm9kZWpzJyxcbiAgICAgICAgICAgICAgICAgICAgJ25wbSBpbnN0YWxsIC1nIG5wbUBsYXRlc3QnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIk5vZGUgYW5kIG5wbSBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdub2RlIC12JyxcbiAgICAgICAgICAgICAgICAgICAgJ25wbSAtdicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5zdGFsbENES1N0ZXAoKSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnN0YWxsUUNMSVN0ZXAodnNDb2RlVXNlciksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5zdGFsbHV2U3RlcCh2c0NvZGVVc2VyKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxQeXRob25BcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAvLyBVYnVudHUgMjIgZGVmYXVsdCBpcyBQeXRob24gMy4xMFxuICAgICAgICAgICAgICAgICAgICAvLyBVYnVudHUgMjQgZGVmYXVsdCBpcyBQeXRob24gMy4xMlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBpbnN0YWxsZWQgUHl0aG9uIHZlcnNpb24gd2lsbCBtYXAgdG8gUHl0aG9uM1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZHBrZyAtLWNvbmZpZ3VyZSAtYScsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIHB5dGhvbjMtcGlwIHB5dGhvbjMtdmVudiBweXRob24zLWJvdG8zIHB5dGhvbjMtcHl0ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHB5dGVzdD1weXRlc3QtMycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGFydCBtdWx0aXBhdGhkLnNlcnZpY2UgcGFja2FnZWtpdC5zZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCByZXN0YXJ0IHVuYXR0ZW5kZWQtdXBncmFkZXMuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgcmVzdGFydCBuZXR3b3JrZC1kaXNwYXRjaGVyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBtcy1weXRob24ucHl0aG9uIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgaWYgWyAtZiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL3NldHRpbmdzLmpzb24gXTsgdGhlblxuICBzZWQgLWkgXCIyaVxcXFxcXFxcICBcXFxcXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXFxcXFwiOiB0cnVlLFwiIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvblxuZWxzZVxuICBlY2hvICd7XG4gICAgXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXCI6IHRydWVcbiAgfScgPiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL3NldHRpbmdzLmpzb25cbmZpYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJQeXRob24gYW5kIFBpcCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdweXRob24zIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICdwaXAzIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsSmF2YUFwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkcGtnIC0tY29uZmlndXJlIC1hJyxcbiAgICAgICAgICAgICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9hcHQuY29ycmV0dG8uYXdzL2NvcnJldHRvLmtleSB8IGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9jb3JyZXR0by1rZXlyaW5nLmdwZycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFtzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9jb3JyZXR0by1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9hcHQuY29ycmV0dG8uYXdzIHN0YWJsZSBtYWluXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9jb3JyZXR0by5saXN0JyxcbiAgICAgICAgICAgICAgICAgICAgJ0RFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IHVwZGF0ZScsXG4gICAgICAgICAgICAgICAgICAgICdERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGphdmEtMjEtYW1hem9uLWNvcnJldHRvLWpkayBqYXZhLTE3LWFtYXpvbi1jb3JyZXR0by1qZGsgamF2YS0xLjguMC1hbWF6b24tY29ycmV0dG8tamRrIG1hdmVuJyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBKQVZBXzhfSE9NRT0kKHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEgfCBncmVwIFwiamF2YS0xLjguMC1hbWF6b24tY29ycmV0dG9cIiB8IGhlYWQgLTEpJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfOF9QQVRIPSQodXBkYXRlLWFsdGVybmF0aXZlcyAtLWxpc3QgamF2YSB8IGdyZXAgXCJqYXZhLTEuOC4wLWFtYXpvbi1jb3JyZXR0b1wiIHwgaGVhZCAtMSknID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV8xN19QQVRIPSQodXBkYXRlLWFsdGVybmF0aXZlcyAtLWxpc3QgamF2YSB8IGdyZXAgXCJqYXZhLTE3LWFtYXpvbi1jb3JyZXR0b1wiIHwgaGVhZCAtMSknID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV8xN19IT01FPSQodXBkYXRlLWFsdGVybmF0aXZlcyAtLWxpc3QgamF2YSB8IGdyZXAgXCJqYXZhLTE3LWFtYXpvbi1jb3JyZXR0b1wiIHwgaGVhZCAtMSknID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV8yMV9QQVRIPSQodXBkYXRlLWFsdGVybmF0aXZlcyAtLWxpc3QgamF2YSB8IGdyZXAgXCJqYXZhLTIxLWFtYXpvbi1jb3JyZXR0b1wiIHwgaGVhZCAtMSknID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV8yMV9IT01FPSQodXBkYXRlLWFsdGVybmF0aXZlcyAtLWxpc3QgamF2YSB8IGdyZXAgXCJqYXZhLTIxLWFtYXpvbi1jb3JyZXR0b1wiIHwgaGVhZCAtMSknID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV9IT01FPSQodXBkYXRlLWFsdGVybmF0aXZlcyAtLWxpc3QgamF2YSB8IGdyZXAgXCJqYXZhLTIxLWFtYXpvbi1jb3JyZXR0b1wiIHwgaGVhZCAtMSknID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgUEFUSD0kUEFUSDokSkFWQV9IT01FL2JpbjovdXNyL3NoYXJlL21hdmVuL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gdnNjamF2YS52c2NvZGUtamF2YS1wYWNrIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkphdmEgYW5kIE1hdmVuIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2phdmEgLXZlcnNpb24gMj4mMScsXG4gICAgICAgICAgICAgICAgICAgICdtdm4gLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3VwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbERvdG5ldEFwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkcGtnIC0tY29uZmlndXJlIC1hJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgZG90bmV0LXNkay04LjAnLFxuICAgICAgICAgICAgICAgICAgICAnZG90bmV0IHRvb2wgaW5zdGFsbCAtZyBNaWNyb3NvZnQuV2ViLkxpYnJhcnlNYW5hZ2VyLkNsaScsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmRvdG5ldC90b29scycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJEb3RuZXQgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnZG90bmV0IC0tbGlzdC1zZGtzJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb2NrZXJBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2Rvd25sb2FkLmRvY2tlci5jb20vbGludXgvdWJ1bnR1L2dwZyB8IGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFtzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL2xpbnV4L3VidW50dSAkKGxzYl9yZWxlYXNlIC0tY29kZW5hbWUgLS1zaG9ydCkgc3RhYmxlXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb2NrZXIubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGRvY2tlci1jZSBkb2NrZXItY2UtY2xpIGNvbnRhaW5lcmQuaW8nLFxuICAgICAgICAgICAgICAgICAgICBgdXNlcm1vZCAtYUcgZG9ja2VyICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfS5zZXJ2aWNlYCxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGFydCBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiRG9ja2VyIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RvY2tlciAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHN0YXR1cyBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsR29sYW5nQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgZ29sYW5nJyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ1BBVEg9JFBBVEg6L2hvbWUvJHt2c0NvZGVVc2VyfS9nby9iaW4nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR29sYW5nIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dvIHZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5BTUFaT05fTElOVVhfMjAyMzpcbiAgICAgICAgc3NtRG9jdW1lbnQgPSBuZXcgc3NtLkNmbkRvY3VtZW50KHNjb3BlLCAnc3NtLWRvY3VtZW50LWFsMjAyMycsIHtcbiAgICAgICAgICBuYW1lOiBgdnNjb2RlLXNlcnZlci1hbDIwMjMtJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfWAsXG4gICAgICAgICAgZG9jdW1lbnRUeXBlOiAnQ29tbWFuZCcsXG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgc2NoZW1hVmVyc2lvbjogJzIuMicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jvb3RzdHJhcCBWU0NvZGUgY29kZS1zZXJ2ZXIgaW5zdGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBWU0NvZGVQYXNzd29yZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFN0YWNrLm9mKHNjb3BlKS5zdGFja0lkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBOb2RlVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICcyMicsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWycyNCcsICcyMicsICcyMCcsICcxOCddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBSZXBvVXJsOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmVwb1VybCA/PyAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgQXNzZXRaaXBTM1BhdGg6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBhc3NldFppcFMzUGF0aCA/PyAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgQnJhbmNoWmlwUzNQYXRoOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJhbmNoWmlwUzNQYXRoID8/ICcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBGb2xkZXJaaXBTM1BhdGg6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmb2xkZXJaaXBTM1BhdGggPz8gJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYWxsIG1haW5TdGVwcyBzY3JpcHRzIGFyZSBpbiBpbiAvdmFyL2xpYi9hbWF6b24vc3NtLzxpbnN0YW5jZWlkPi9kb2N1bWVudC9vcmNoZXN0cmF0aW9uLzx1dWlkPi88U3RlcE5hbWU+L19zY3JpcHQuc2hcbiAgICAgICAgICAgIG1haW5TdGVwczogW1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbGxDbG91ZFdhdGNoQWdlbnRTdGVwKCksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29uZmlndXJlQ2xvdWRXYXRjaEFnZW50U3RlcCgpLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEJhc2VQYWNrYWdlc0RuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSAtLWFsbG93ZXJhc2luZyB3aG9pcyBhcmdvbjIgdW56aXAgbmdpbnggY3VybCBnbnVwZyBvcGVuc3NsJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0FkZFVzZXJEbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICBgaWYgW1sgXCIke3ZzQ29kZVVzZXJ9XCIgPT0gXCJlYzItdXNlclwiIF1dXG50aGVuXG4gIGVjaG8gJ1VzaW5nIGV4aXN0aW5nIHVzZXI6ICR7dnNDb2RlVXNlcn0nXG5lbHNlXG4gIGVjaG8gJ0FkZGluZyB1c2VyOiAke3ZzQ29kZVVzZXJ9J1xuICBhZGR1c2VyIC1jICcnICR7dnNDb2RlVXNlcn1cbiAgcGFzc3dkIC1sICR7dnNDb2RlVXNlcn1cbiAgZWNobyBcIiR7dnNDb2RlVXNlcn06e3sgVlNDb2RlUGFzc3dvcmQgfX1cIiB8IGNocGFzc3dkXG4gIHVzZXJtb2QgLWFHIHdoZWVsICR7dnNDb2RlVXNlcn1cbmZpYCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL3N1ZG9lcnMuZC85MS12c2NvZGUtdXNlciA8PEVPRlxuJHt2c0NvZGVVc2VyfSBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9iaW4gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIlVzZXIgYWRkZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgIGBnZXRlbnQgcGFzc3dkICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVVwZGF0ZVByb2ZpbGVTdGVwKHZzQ29kZVVzZXIsIFN0YWNrLm9mKHNjb3BlKS5yZWdpb24sIFN0YWNrLm9mKHNjb3BlKS5hY2NvdW50KSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnN0YWxsQVdTQ0xJU3RlcCh2c0NvZGVVc2VyKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxHaXREbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCJwYXJ0aWNpcGFudEBleGFtcGxlLmNvbVwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSBcIldvcmtzaG9wIFBhcnRpY2lwYW50XCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgaW5pdC5kZWZhdWx0QnJhbmNoIFwibWFpblwiYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJHaXQgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnZ2l0IC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ2xvbmVSZXBvU3RlcCh2c0NvZGVVc2VyLCBob21lRm9sZGVyKSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEb3dubG9hZEFzc2V0c1N0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRG93bmxvYWRGb2xkZXJzU3RlcCh2c0NvZGVVc2VyLCBob21lRm9sZGVyKSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEb3dubG9hZEJyYW5jaGVzU3RlcCh2c0NvZGVVc2VyLCBob21lRm9sZGVyKSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDb25maWd1cmVDb2RlU2VydmVyU3RlcCh2c0NvZGVVc2VyLCBob21lRm9sZGVyLCBkZXZTZXJ2ZXJCYXNlUGF0aCwgZGV2U2VydmVyUG9ydCwgc2VydmVyTmFtZURpcmVjdGl2ZSksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsTm9kZURuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBub2RlanMgbnBtJyxcbiAgICAgICAgICAgICAgICAgICAgJ25wbSBpbnN0YWxsIC1nIG5wbUBsYXRlc3QnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIk5vZGUgYW5kIG5wbSBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdub2RlIC12JyxcbiAgICAgICAgICAgICAgICAgICAgJ25wbSAtdicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQ0RLJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ25wbSBpbnN0YWxsIC1nIGF3cy1jZGsnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkFXUyBDREsgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnY2RrIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsUUNMSScsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdjdXJsIC0tcHJvdG8gXFwnPWh0dHBzXFwnIC0tdGxzdjEuMiAtc1NmIFwiaHR0cHM6Ly9kZXNrdG9wLXJlbGVhc2UucS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS9sYXRlc3QvcS0kKHVuYW1lIC1tKS1saW51eC56aXBcIiAtbyAvdG1wL3EuemlwJyxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvdG1wL3EuemlwYCxcbiAgICAgICAgICAgICAgICAgICAgJ3VuemlwIC1xIC1kIC90bXAgL3RtcC9xLnppcCcsXG4gICAgICAgICAgICAgICAgICAgIGBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9xYCxcbiAgICAgICAgICAgICAgICAgICAgJ2NobW9kICt4IC90bXAvcS9pbnN0YWxsLnNoJyxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAvdG1wL3EvaW5zdGFsbC5zaCAtLW5vLWNvbmZpcm1gLFxuICAgICAgICAgICAgICAgICAgICAncm0gLXJmIC90bXAvcScsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQW1hem9uIFEgQ0xJIGluc3RhbGxlZFwiJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGx1dicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjdXJsIC1mc1NMIGh0dHBzOi8vYXN0cmFsLnNoL3V2L2luc3RhbGwuc2ggLW8gL3RtcC91dl9pbnN0YWxsLnNoYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGJhc2ggL3RtcC91dl9pbnN0YWxsLnNoYCxcbiAgICAgICAgICAgICAgICAgICAgYGlmIHV2IGdlbmVyYXRlLXNoZWxsLWNvbXBsZXRpb24gYmFzaCAmPi9kZXYvbnVsbDsgdGhlblxuICBlY2hvICdldmFsIFwiJCh1diBnZW5lcmF0ZS1zaGVsbC1jb21wbGV0aW9uIGJhc2gpXCInID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY1xuZmlgLFxuICAgICAgICAgICAgICAgICAgICBgaWYgdXZ4IGdlbmVyYXRlLXNoZWxsLWNvbXBsZXRpb24gYmFzaCAmPi9kZXYvbnVsbDsgdGhlblxuICBlY2hvICdldmFsIFwiJCh1dnggZ2VuZXJhdGUtc2hlbGwtY29tcGxldGlvbiBiYXNoKVwiJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNcbmZpYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJ1diBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiB1diAtLXZlcnNpb25gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFB5dGhvbkRuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIEFMMjAyMyBjdXJyZW50bHkgc2hpcHMgd2l0aCBQeXRob24gMy45IHByZWluc3RhbGxlZCwgYnV0IDMuMTEgaXMgYXZhaWxhYmxlIGluIHRoZSByZXBvc2l0b3J5XG4gICAgICAgICAgICAgICAgICAgIC8vIEluc3RhbGwgMy4xMSBhbG9uZ3NpZGUgMy45IGFuZCBzZXR1cCBzb21lIGFsaWFzIHNvIHRoYXQgMy4xMSBpcyBsb2FkZWQgd2hlbiBwYXJ0aWNpcGFudCBydW5zIFB5dGhvbjNcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgUHl0aG9uIDMuMTIgYmVjb21lIGF2YWlsYWJsZSwgdXBkYXRlIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBweXRob24zLjExIHB5dGhvbjMuMTEtcGlwIHB5dGhvbjMtdmlydHVhbGVudiBweXRob24zLXB5dGVzdCBweXRob24zLWJvdG8zJyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHB5dGVzdD1weXRlc3QtMycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHB5dGhvbjM9cHl0aG9uMy4xMScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHBpcDM9cGlwMy4xMScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgXCJlY2hvICdhbGlhcz1weXRob24zPXB5dGhvbjMuMTEnID4+IH4vLmJhc2hyY1wiLFxuICAgICAgICAgICAgICAgICAgICBcImVjaG8gJ2FsaWFzIHBpcDM9cGlwMy4xMScgPj4gfi8uYmFzaHJjXCIsXG4gICAgICAgICAgICAgICAgICAgICdweXRob24zLjExIC1tIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgMj4mMScsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIG1zLXB5dGhvbi5weXRob24gLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBpZiBbIC1mIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvbiBdOyB0aGVuXG4gIHNlZCAtaSBcIjJpXFxcXFxcXFwgIFxcXFxcInB5dGhvbi50ZXN0aW5nLnB5dGVzdEVuYWJsZWRcXFxcXCI6IHRydWUsXCIgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9zZXR0aW5ncy5qc29uXG5lbHNlXG4gIGVjaG8gJ3tcbiAgICBcInB5dGhvbi50ZXN0aW5nLnB5dGVzdEVuYWJsZWRcIjogdHJ1ZVxuICB9JyA+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvblxuZmlgLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIlB5dGhvbiBhbmQgUGlwIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMuMTEgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMuMTEgLW0gcGlwIC0tdmVyc2lvbiAyPiYxJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxKYXZhRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IGphdmEtMjEtYW1hem9uLWNvcnJldHRvIGphdmEtMTctYW1hem9uLWNvcnJldHRvIGphdmEtMS44LjAtYW1hem9uLWNvcnJldHRvIG1hdmVuJyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBKQVZBXzhfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0xLjguMC1hbWF6b24tY29ycmV0dG8nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV84X1BBVEg9L3Vzci9saWIvanZtL2phdmEtMS44LjAtYW1hem9uLWNvcnJldHRvJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfMTdfUEFUSD0vdXNyL2xpYi9qdm0vamF2YS0xNy1hbWF6b24tY29ycmV0dG8nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV8xN19IT01FPS91c3IvbGliL2p2bS9qYXZhLTE3LWFtYXpvbi1jb3JyZXR0bycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBKQVZBXzIxX1BBVEg9L3Vzci9saWIvanZtL2phdmEtMjEtYW1hem9uLWNvcnJldHRvJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfMjFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0yMS1hbWF6b24tY29ycmV0dG8nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV9IT01FPS91c3IvbGliL2p2bS9qYXZhLTIxLWFtYXpvbi1jb3JyZXR0bycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBQQVRIPSRQQVRIOiRKQVZBX0hPTUUvYmluOi91c3Ivc2hhcmUvbWF2ZW4vYmluJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiB2c2NqYXZhLnZzY29kZS1qYXZhLXBhY2sgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiSmF2YSBhbmQgTWF2ZW4gaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnamF2YSAtdmVyc2lvbiAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgJ212biAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbERvdG5ldERuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBkb3RuZXQtc2RrLTguMCcsXG4gICAgICAgICAgICAgICAgICAgICdkb3RuZXQgdG9vbCBpbnN0YWxsIC1nIE1pY3Jvc29mdC5XZWIuTGlicmFyeU1hbmFnZXIuQ2xpJyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ1BBVEg9JFBBVEg6L2hvbWUvJHt2c0NvZGVVc2VyfS8uZG90bmV0L3Rvb2xzJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkRvdG5ldCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdkb3RuZXQgLS1saXN0LXNka3MnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbERvY2tlckRuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBkb2NrZXInLFxuICAgICAgICAgICAgICAgICAgICBgdXNlcm1vZCAtYUcgZG9ja2VyICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfS5zZXJ2aWNlYCxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGFydCBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiRG9ja2VyIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RvY2tlciAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHN0YXR1cyBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsR29sYW5nRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IGdvbGFuZycsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vZ28vYmluJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkdvbGFuZyBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdnbyB2ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBMaW51eCBmbGF2b3I6ICR7bGludXhGbGF2b3J9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNzbURvY3VtZW50O1xuICB9XG59XG5cbmludGVyZmFjZSBDdXN0b21SZXNvdXJjZUluc3RhbGxlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGVjMiBpbnN0YW5jZSBpZCB0byBpbnN0YWxsIHRoZSBzc20gZG9jdW1lbnQgb25cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBzc20gZG9jdW1lbnQgdG8gaW5zdGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3VtZW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xvdWR3YXRjaCBsb2cgZ3JvdXAgZm9yIHRoZSBpbnN0YWxsIGxvZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHVzZXIgdW5kZXIgd2hpY2ggdGhlIHZzY29kZSBzZXJ2ZXIgcnVuc1xuICAgKi9cbiAgcmVhZG9ubHkgdnNDb2RlVXNlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFzc3dvcmQgb2YgdGhlIHVzZXIgdW5kZXIgd2hpY2ggdGhlIHZzY29kZSBzZXJ2ZXIgcnVuc1xuICAgKi9cbiAgcmVhZG9ubHkgdnNDb2RlUGFzc3dvcmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGhvbWUgZm9sZGVyIG9mIHRoZSB1c2VyIHVuZGVyIHdoaWNoIHRoZSB2c2NvZGUgc2VydmVyIHJ1bnNcbiAgICovXG4gIHJlYWRvbmx5IGhvbWVGb2xkZXI6IHN0cmluZztcbn1cblxuY2xhc3MgQ3VzdG9tUmVzb3VyY2VJbnN0YWxsZXIgZXh0ZW5kcyBJbnN0YWxsZXIge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBvcHRpb25zOiBDdXN0b21SZXNvdXJjZUluc3RhbGxlck9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3Qgb25FdmVudDogRnVuY3Rpb24gPSBuZXcgSW5zdGFsbGVyRnVuY3Rpb24oXG4gICAgICBzY29wZSxcbiAgICAgICdJbnN0YWxsZXJPbkV2ZW50SGFuZGxlcicsXG4gICAgICB7XG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLCAvLyAxNSBtaW51dGVzIHRvIGFsbG93IGZvciBWUyBDb2RlIFNlcnZlciBpbnN0YWxsYXRpb25cbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLCAvLyBUT0RPIGNvbmZpZ3VyYWJsZVxuICAgICAgfSxcbiAgICApO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIFtvbkV2ZW50XSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdGb3IgdGhpcyBldmVudCBoYW5kbGVyIHdlIGRvIG5vdCBuZWVkIHRvIHJlc3RyaWN0IG1hbmFnZWQgcG9saWNpZXMnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLFxuICAgICAgICAgIHJlYXNvbjogJ0ZvciB0aGlzIGxhbWJkYSB0aGUgbGF0ZXN0IHJ1bnRpbWUgaXMgbm90IG5lZWRlZCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZG9jdW1lbnRBcm4gPSBBcm4uZm9ybWF0KFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlOiAnc3NtJyxcbiAgICAgICAgcmVzb3VyY2U6ICdkb2N1bWVudCcsXG4gICAgICAgIHJlc291cmNlTmFtZTogb3B0aW9ucy5kb2N1bWVudE5hbWUsXG4gICAgICB9LFxuICAgICAgU3RhY2sub2Yoc2NvcGUpLFxuICAgICk7XG5cbiAgICBjb25zdCBjd01hbmFnZUFnZW50QXJuID0gQXJuLmZvcm1hdChcbiAgICAgIHtcbiAgICAgICAgc2VydmljZTogJ3NzbScsXG4gICAgICAgIHJlc291cmNlOiAnZG9jdW1lbnQnLFxuICAgICAgICByZXNvdXJjZU5hbWU6ICdBbWF6b25DbG91ZFdhdGNoLU1hbmFnZUFnZW50JyxcbiAgICAgIH0sXG4gICAgICBTdGFjay5vZihzY29wZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHRhcmdldEVjMkluc3RhbmNlQXJuID0gQXJuLmZvcm1hdChcbiAgICAgIHtcbiAgICAgICAgc2VydmljZTogJ2VjMicsXG4gICAgICAgIHJlc291cmNlOiAnaW5zdGFuY2UnLFxuICAgICAgICByZXNvdXJjZU5hbWU6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgIH0sXG4gICAgICBTdGFjay5vZihzY29wZSksXG4gICAgKTtcblxuICAgIC8vIFNlbmRDb21tYW5kIHN1cHBvcnRzIHJlc291cmNlLWxldmVsIHBlcm1pc3Npb25zXG4gICAgb25FdmVudC5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogWydzc206U2VuZENvbW1hbmQnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbZG9jdW1lbnRBcm4sIGN3TWFuYWdlQWdlbnRBcm4sIHRhcmdldEVjMkluc3RhbmNlQXJuXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBHZXRDb21tYW5kSW52b2NhdGlvbiBhbmQgTGlzdENvbW1hbmRJbnZvY2F0aW9ucyByZXF1aXJlIHdpbGRjYXJkIHJlc291cmNlc1xuICAgIC8vIFRoZXkgZG9uJ3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9uc1xuICAgIG9uRXZlbnQuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFsnc3NtOkdldENvbW1hbmRJbnZvY2F0aW9uJywgJ3NzbTpMaXN0Q29tbWFuZEludm9jYXRpb25zJ10sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gU3VwcHJlc3MgY2RrLW5hZyB3YXJuaW5nIGZvciB3aWxkY2FyZCBwZXJtaXNzaW9ucyBvbiBHZXRDb21tYW5kSW52b2NhdGlvblxuICAgIC8vIFRoZXNlIFNTTSBhY3Rpb25zIGRvbid0IHN1cHBvcnQgcmVzb3VyY2UtbGV2ZWwgcGVybWlzc2lvbnMgcGVyIEFXUyBkb2N1bWVudGF0aW9uXG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgb25FdmVudCxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdzc206R2V0Q29tbWFuZEludm9jYXRpb24gYW5kIHNzbTpMaXN0Q29tbWFuZEludm9jYXRpb25zIGRvIG5vdCBzdXBwb3J0IHJlc291cmNlLWxldmVsIHBlcm1pc3Npb25zIGFuZCByZXF1aXJlIHdpbGRjYXJkIHJlc291cmNlcycsXG4gICAgICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjoqJ10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIoc2NvcGUsICdJbnN0YWxsZXJQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBvbkV2ZW50LFxuICAgIH0pO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIFtwcm92aWRlcl0sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAnRm9yIHRoaXMgcHJvdmlkZXIgd2UgZG8gbm90IG5lZWQgdG8gcmVzdHJpY3QgbWFuYWdlZCBwb2xpY2llcycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgICAgICByZWFzb246ICdGb3IgdGhpcyBwcm92aWRlciB3aWxkY2FyZHMgYXJlIGZpbmUnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLFxuICAgICAgICAgIHJlYXNvbjogJ0ZvciB0aGlzIHByb3ZpZGVyIHRoZSBsYXRlc3QgcnVudGltZSBpcyBub3QgbmVlZGVkJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2Uoc2NvcGUsICdTU01JbnN0YWxsZXJDdXN0b21SZXNvdXJjZScsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBTZXJ2aWNlVGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSkudG9TZWNvbmRzKCkgKyA1LCAvLyBMYW1iZGEgdGltZW91dCArIDUgc2Vjb25kcyBidWZmZXJcbiAgICAgICAgSW5zdGFuY2VJZDogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgICBEb2N1bWVudE5hbWU6IG9wdGlvbnMuZG9jdW1lbnROYW1lLFxuICAgICAgICBDbG91ZFdhdGNoTG9nR3JvdXBOYW1lOiBvcHRpb25zLmNsb3VkV2F0Y2hMb2dHcm91cE5hbWUsXG4gICAgICAgIFZTQ29kZVBhc3N3b3JkOiBvcHRpb25zLnZzQ29kZVBhc3N3b3JkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBfYmluZCgpIHt9XG59XG4iXX0=
|