deployable-awscdk-app-ts
Version:
A projen project for Typescript AWS CDK App
160 lines • 19.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.checkoutStep = checkoutStep;
exports.setNodeVersionStep = setNodeVersionStep;
exports.installDependenciesStep = installDependenciesStep;
exports.deploymentStep = deploymentStep;
exports.setAwsCredentialsSteps = setAwsCredentialsSteps;
exports.setNpmConfig = setNpmConfig;
exports.checkActiveDeploymentStep = checkActiveDeploymentStep;
exports.postDeploymentStep = postDeploymentStep;
exports.preDeploymentStep = preDeploymentStep;
exports.preInstallDependenciesStep = preInstallDependenciesStep;
const projen_1 = require("projen");
const javascript_1 = require("projen/lib/javascript");
function checkoutStep() {
return {
name: 'Checkout',
uses: 'actions/checkout@v4',
with: {
'ref': '${{ github.sha }}',
'fetch-depth': 0,
},
};
}
function setNodeVersionStep(nodeVersion, checkActiveDeployment) {
return {
...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
name: 'Setup Node.js',
uses: 'actions/setup-node@v4',
with: {
'node-version': nodeVersion,
},
};
}
function installDependenciesStep(command, checkActiveDeployment) {
return {
...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
name: 'Install dependencies',
run: command,
};
}
function getPackageManagerCommandPrefix(packageManager) {
if (packageManager === projen_1.javascript.NodePackageManager.NPM)
return 'npm run';
if (packageManager === projen_1.javascript.NodePackageManager.YARN)
return 'yarn';
if (packageManager === projen_1.javascript.NodePackageManager.PNPM)
return 'pnpm';
throw new Error(`Invalid package manager selected (${packageManager})`);
}
function deploymentStep(checkActiveDeployment, packageManager) {
return {
...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
name: 'Deployment',
run: `${getPackageManagerCommandPrefix(packageManager)} deploy:workflow`,
};
}
function setAwsCredentialsInEnvironment(checkActiveDeployment) {
const commands = [
'echo "AWS_ACCESS_KEY_ID=$accessKeyId" >> $GITHUB_ENV',
'echo "AWS_SECRET_ACCESS_KEY=$secretAccessKey" >> $GITHUB_ENV',
'echo "AWS_REGION=$region" >> $GITHUB_ENV',
];
const condition = checkActiveDeployment ?
`\${{ matrix.assumeRole == 'false' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
'${{ matrix.assumeRole == \'false\' }}';
return {
if: condition,
name: 'Configure AWS Credentials',
run: `${commands.join('\n')}`,
env: {
accessKeyId: '${{ secrets[matrix.accessKeyIdSecretName] }}',
secretAccessKey: '${{ secrets[matrix.secretAccessKeySecretName] }}',
region: '${{ matrix.region }}',
},
};
}
function assumeAwsRoleStep(checkActiveDeployment, authProvider) {
const condition = checkActiveDeployment ?
`\${{ matrix.assumeRole == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
'${{ matrix.assumeRole == \'true\' }}';
const secretsParams = authProvider === javascript_1.CodeArtifactAuthProvider.ACCESS_AND_SECRET_KEY_PAIR ?
{
'aws-access-key-id': '${{ secrets[matrix.accessKeyIdSecretName] }}',
'aws-secret-access-key': '${{ secrets[matrix.secretAccessKeySecretName] }}',
} : undefined;
return {
if: condition,
name: 'Assume AWS Role',
uses: 'aws-actions/configure-aws-credentials@v4',
with: {
...secretsParams,
'role-to-assume': '${{ matrix.roleToAssume }}',
'aws-region': '${{ matrix.region }}',
'role-duration-seconds': '${{ matrix.assumeRoleDurationSeconds }}',
},
};
}
function setAwsCredentialsSteps(checkActiveDeployment, authProvider = javascript_1.CodeArtifactAuthProvider.ACCESS_AND_SECRET_KEY_PAIR) {
return [
setAwsCredentialsInEnvironment(checkActiveDeployment),
assumeAwsRoleStep(checkActiveDeployment, authProvider),
];
}
function setNpmConfig(configName, configValue, checkActiveDeployment) {
const environmentVariableName = 'CONFIG_VALUE';
return {
...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
name: 'Setting NPM Config',
env: {
[environmentVariableName]: configValue,
},
run: `npm config set ${configName} $${environmentVariableName}`,
};
}
const checkActiveDeploymentStepId = 'deployment-check';
function checkActiveDeploymentStep() {
return {
id: checkActiveDeploymentStepId,
uses: 'AminFazlMondo/check-deployed-environment@v1',
with: {
environment: '${{ matrix.environment }}',
},
env: {
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
},
};
}
const skipIfAlreadyActiveDeploymentCondition = `steps.${checkActiveDeploymentStepId}.outputs.has_active_deployment != 'true'`;
function getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment) {
return checkActiveDeployment ? { if: `\${{ ${skipIfAlreadyActiveDeploymentCondition} }}` } : undefined;
}
function postDeploymentStep(checkActiveDeployment, packageManager) {
const condition = checkActiveDeployment ?
`\${{ matrix.hasPostDeployTask == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
'${{ matrix.hasPostDeployTask == \'true\' }}';
return {
if: condition,
name: 'Post Deployment',
run: `${getPackageManagerCommandPrefix(packageManager)} \${{ matrix.postDeploymentScript }}`,
};
}
function preDeploymentStep(checkActiveDeployment, packageManager) {
const condition = checkActiveDeployment ?
`\${{ matrix.hasPreDeployTask == 'true' && ${skipIfAlreadyActiveDeploymentCondition} }}` :
'${{ matrix.hasPreDeployTask == \'true\' }}';
return {
if: condition,
name: 'Pre Deployment',
run: `${getPackageManagerCommandPrefix(packageManager)} \${{ matrix.preDeploymentScript }}`,
};
}
function preInstallDependenciesStep(taskName, checkActiveDeployment) {
return {
...getSkipIfAlreadyActiveDeploymentCondition(checkActiveDeployment),
name: taskName,
run: `npx projen ${taskName}`,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSxvQ0FTQztBQUVELGdEQVNDO0FBRUQsMERBTUM7QUFlRCx3Q0FPQztBQW1ERCx3REFRQztBQUVELG9DQVVDO0FBR0QsOERBV0M7QUFRRCxnREFVQztBQUVELDhDQVVDO0FBRUQsZ0VBTUM7QUFqTEQsbUNBQWlDO0FBRWpDLHNEQUE4RDtBQUU5RCxTQUFnQixZQUFZO0lBQzFCLE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVTtRQUNoQixJQUFJLEVBQUUscUJBQXFCO1FBQzNCLElBQUksRUFBRTtZQUNKLEtBQUssRUFBRSxtQkFBbUI7WUFDMUIsYUFBYSxFQUFFLENBQUM7U0FDakI7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLFdBQW1CLEVBQUUscUJBQThCO0lBQ3BGLE9BQU87UUFDTCxHQUFHLHlDQUF5QyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksRUFBRSxlQUFlO1FBQ3JCLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsSUFBSSxFQUFFO1lBQ0osY0FBYyxFQUFFLFdBQVc7U0FDNUI7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE9BQWUsRUFBRSxxQkFBOEI7SUFDckYsT0FBTztRQUNMLEdBQUcseUNBQXlDLENBQUMscUJBQXFCLENBQUM7UUFDbkUsSUFBSSxFQUFFLHNCQUFzQjtRQUM1QixHQUFHLEVBQUUsT0FBTztLQUNiLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyw4QkFBOEIsQ0FBQyxjQUE2QztJQUNuRixJQUFJLGNBQWMsS0FBSyxtQkFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUc7UUFDdEQsT0FBTyxTQUFTLENBQUE7SUFFbEIsSUFBSSxjQUFjLEtBQUssbUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJO1FBQ3ZELE9BQU8sTUFBTSxDQUFBO0lBRWYsSUFBSSxjQUFjLEtBQUssbUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJO1FBQ3ZELE9BQU8sTUFBTSxDQUFBO0lBRWYsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsY0FBYyxHQUFHLENBQUMsQ0FBQTtBQUN6RSxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLHFCQUE4QixFQUFFLGNBQTZDO0lBRTFHLE9BQU87UUFDTCxHQUFHLHlDQUF5QyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksRUFBRSxZQUFZO1FBQ2xCLEdBQUcsRUFBRSxHQUFHLDhCQUE4QixDQUFDLGNBQWMsQ0FBQyxrQkFBa0I7S0FDekUsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLDhCQUE4QixDQUFDLHFCQUE4QjtJQUNwRSxNQUFNLFFBQVEsR0FBRztRQUNmLHNEQUFzRDtRQUN0RCw4REFBOEQ7UUFDOUQsMENBQTBDO0tBQzNDLENBQUE7SUFFRCxNQUFNLFNBQVMsR0FDYixxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JCLHdDQUF3QyxzQ0FBc0MsS0FBSyxDQUFDLENBQUM7UUFDckYsdUNBQXVDLENBQUE7SUFFM0MsT0FBTztRQUNMLEVBQUUsRUFBRSxTQUFTO1FBQ2IsSUFBSSxFQUFFLDJCQUEyQjtRQUNqQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzdCLEdBQUcsRUFBRTtZQUNILFdBQVcsRUFBRSw4Q0FBOEM7WUFDM0QsZUFBZSxFQUFFLGtEQUFrRDtZQUNuRSxNQUFNLEVBQUUsc0JBQXNCO1NBQy9CO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLHFCQUE4QixFQUFFLFlBQXNDO0lBQy9GLE1BQU0sU0FBUyxHQUNiLHFCQUFxQixDQUFDLENBQUM7UUFDckIsdUNBQXVDLHNDQUFzQyxLQUFLLENBQUMsQ0FBQztRQUNwRixzQ0FBc0MsQ0FBQTtJQUUxQyxNQUFNLGFBQWEsR0FDakIsWUFBWSxLQUFLLHFDQUF3QixDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDcEU7WUFDRSxtQkFBbUIsRUFBRSw4Q0FBOEM7WUFDbkUsdUJBQXVCLEVBQUUsa0RBQWtEO1NBQzVFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNqQixPQUFPO1FBQ0wsRUFBRSxFQUFFLFNBQVM7UUFDYixJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLElBQUksRUFBRSwwQ0FBMEM7UUFDaEQsSUFBSSxFQUFFO1lBQ0osR0FBRyxhQUFhO1lBQ2hCLGdCQUFnQixFQUFFLDRCQUE0QjtZQUM5QyxZQUFZLEVBQUUsc0JBQXNCO1lBQ3BDLHVCQUF1QixFQUFFLHlDQUF5QztTQUNuRTtLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBZ0Isc0JBQXNCLENBQ3BDLHFCQUE4QixFQUM5QixlQUF5QyxxQ0FBd0IsQ0FBQywwQkFBMEI7SUFFNUYsT0FBTztRQUNMLDhCQUE4QixDQUFDLHFCQUFxQixDQUFDO1FBQ3JELGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLFlBQVksQ0FBQztLQUN2RCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxVQUFrQixFQUFFLFdBQW1CLEVBQUUscUJBQThCO0lBQ2xHLE1BQU0sdUJBQXVCLEdBQUcsY0FBYyxDQUFBO0lBQzlDLE9BQU87UUFDTCxHQUFHLHlDQUF5QyxDQUFDLHFCQUFxQixDQUFDO1FBQ25FLElBQUksRUFBRSxvQkFBb0I7UUFDMUIsR0FBRyxFQUFFO1lBQ0gsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFdBQVc7U0FDdkM7UUFDRCxHQUFHLEVBQUUsa0JBQWtCLFVBQVUsS0FBSyx1QkFBdUIsRUFBRTtLQUNoRSxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sMkJBQTJCLEdBQUcsa0JBQWtCLENBQUE7QUFDdEQsU0FBZ0IseUJBQXlCO0lBQ3ZDLE9BQU87UUFDTCxFQUFFLEVBQUUsMkJBQTJCO1FBQy9CLElBQUksRUFBRSw2Q0FBNkM7UUFDbkQsSUFBSSxFQUFFO1lBQ0osV0FBVyxFQUFFLDJCQUEyQjtTQUN6QztRQUNELEdBQUcsRUFBRTtZQUNILFlBQVksRUFBRSw2QkFBNkI7U0FDNUM7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sc0NBQXNDLEdBQUUsU0FBUywyQkFBMkIsMENBQTBDLENBQUE7QUFFNUgsU0FBUyx5Q0FBeUMsQ0FBQyxxQkFBOEI7SUFDL0UsT0FBTyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLEVBQUUsUUFBUSxzQ0FBc0MsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtBQUN0RyxDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQUMscUJBQThCLEVBQUUsY0FBNkM7SUFDOUcsTUFBTSxTQUFTLEdBQ2YscUJBQXFCLENBQUMsQ0FBQztRQUNyQiw4Q0FBOEMsc0NBQXNDLEtBQUssQ0FBQyxDQUFDO1FBQzNGLDZDQUE2QyxDQUFBO0lBQy9DLE9BQU87UUFDTCxFQUFFLEVBQUUsU0FBUztRQUNiLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsR0FBRyxFQUFFLEdBQUcsOEJBQThCLENBQUMsY0FBYyxDQUFDLHNDQUFzQztLQUM3RixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGlCQUFpQixDQUFDLHFCQUE4QixFQUFFLGNBQTZDO0lBQzdHLE1BQU0sU0FBUyxHQUNmLHFCQUFxQixDQUFDLENBQUM7UUFDckIsNkNBQTZDLHNDQUFzQyxLQUFLLENBQUMsQ0FBQztRQUMxRiw0Q0FBNEMsQ0FBQTtJQUM5QyxPQUFPO1FBQ0wsRUFBRSxFQUFFLFNBQVM7UUFDYixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLEdBQUcsRUFBRSxHQUFHLDhCQUE4QixDQUFDLGNBQWMsQ0FBQyxxQ0FBcUM7S0FDNUYsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFnQiwwQkFBMEIsQ0FBQyxRQUFnQixFQUFFLHFCQUE4QjtJQUN6RixPQUFPO1FBQ0wsR0FBRyx5Q0FBeUMsQ0FBQyxxQkFBcUIsQ0FBQztRQUNuRSxJQUFJLEVBQUUsUUFBUTtRQUNkLEdBQUcsRUFBRSxjQUFjLFFBQVEsRUFBRTtLQUM5QixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7amF2YXNjcmlwdH0gZnJvbSAncHJvamVuJ1xuaW1wb3J0IHtKb2JTdGVwfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnXG5pbXBvcnQge0NvZGVBcnRpZmFjdEF1dGhQcm92aWRlcn0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0J1xuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tvdXRTdGVwKCk6IEpvYlN0ZXAge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjQnLFxuICAgIHdpdGg6IHtcbiAgICAgICdyZWYnOiAnJHt7IGdpdGh1Yi5zaGEgfX0nLFxuICAgICAgJ2ZldGNoLWRlcHRoJzogMCxcbiAgICB9LFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXROb2RlVmVyc2lvblN0ZXAobm9kZVZlcnNpb246IHN0cmluZywgY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NCcsXG4gICAgd2l0aDoge1xuICAgICAgJ25vZGUtdmVyc2lvbic6IG5vZGVWZXJzaW9uLFxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmNpZXNTdGVwKGNvbW1hbmQ6IHN0cmluZywgY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgIHJ1bjogY29tbWFuZCxcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmRQcmVmaXgocGFja2FnZU1hbmFnZXI6IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSBqYXZhc2NyaXB0Lk5vZGVQYWNrYWdlTWFuYWdlci5OUE0pXG4gICAgcmV0dXJuICducG0gcnVuJ1xuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIuWUFSTilcbiAgICByZXR1cm4gJ3lhcm4nXG5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSBqYXZhc2NyaXB0Lk5vZGVQYWNrYWdlTWFuYWdlci5QTlBNKVxuICAgIHJldHVybiAncG5wbSdcblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBtYW5hZ2VyIHNlbGVjdGVkICgke3BhY2thZ2VNYW5hZ2VyfSlgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95bWVudFN0ZXAoY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuLCBwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIpOiBKb2JTdGVwIHtcblxuICByZXR1cm4ge1xuICAgIC4uLmdldFNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uKGNoZWNrQWN0aXZlRGVwbG95bWVudCksXG4gICAgbmFtZTogJ0RlcGxveW1lbnQnLFxuICAgIHJ1bjogYCR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kUHJlZml4KHBhY2thZ2VNYW5hZ2VyKX0gZGVwbG95OndvcmtmbG93YCxcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRBd3NDcmVkZW50aWFsc0luRW52aXJvbm1lbnQoY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB7XG4gIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICdlY2hvIFwiQVdTX0FDQ0VTU19LRVlfSUQ9JGFjY2Vzc0tleUlkXCIgPj4gJEdJVEhVQl9FTlYnLFxuICAgICdlY2hvIFwiQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZPSRzZWNyZXRBY2Nlc3NLZXlcIiA+PiAkR0lUSFVCX0VOVicsXG4gICAgJ2VjaG8gXCJBV1NfUkVHSU9OPSRyZWdpb25cIiA+PiAkR0lUSFVCX0VOVicsXG4gIF1cblxuICBjb25zdCBjb25kaXRpb24gPVxuICAgIGNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgICBgXFwke3sgbWF0cml4LmFzc3VtZVJvbGUgPT0gJ2ZhbHNlJyAmJiAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWAgOlxuICAgICAgJyR7eyBtYXRyaXguYXNzdW1lUm9sZSA9PSBcXCdmYWxzZVxcJyB9fSdcblxuICByZXR1cm4ge1xuICAgIGlmOiBjb25kaXRpb24sXG4gICAgbmFtZTogJ0NvbmZpZ3VyZSBBV1MgQ3JlZGVudGlhbHMnLFxuICAgIHJ1bjogYCR7Y29tbWFuZHMuam9pbignXFxuJyl9YCxcbiAgICBlbnY6IHtcbiAgICAgIGFjY2Vzc0tleUlkOiAnJHt7IHNlY3JldHNbbWF0cml4LmFjY2Vzc0tleUlkU2VjcmV0TmFtZV0gfX0nLFxuICAgICAgc2VjcmV0QWNjZXNzS2V5OiAnJHt7IHNlY3JldHNbbWF0cml4LnNlY3JldEFjY2Vzc0tleVNlY3JldE5hbWVdIH19JyxcbiAgICAgIHJlZ2lvbjogJyR7eyBtYXRyaXgucmVnaW9uIH19JyxcbiAgICB9LFxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc3VtZUF3c1JvbGVTdGVwKGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbiwgYXV0aFByb3ZpZGVyOiBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIpOiBKb2JTdGVwIHtcbiAgY29uc3QgY29uZGl0aW9uID1cbiAgICBjaGVja0FjdGl2ZURlcGxveW1lbnQgP1xuICAgICAgYFxcJHt7IG1hdHJpeC5hc3N1bWVSb2xlID09ICd0cnVlJyAmJiAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWAgOlxuICAgICAgJyR7eyBtYXRyaXguYXNzdW1lUm9sZSA9PSBcXCd0cnVlXFwnIH19J1xuXG4gIGNvbnN0IHNlY3JldHNQYXJhbXMgPVxuICAgIGF1dGhQcm92aWRlciA9PT0gQ29kZUFydGlmYWN0QXV0aFByb3ZpZGVyLkFDQ0VTU19BTkRfU0VDUkVUX0tFWV9QQUlSID9cbiAgICAgIHtcbiAgICAgICAgJ2F3cy1hY2Nlc3Mta2V5LWlkJzogJyR7eyBzZWNyZXRzW21hdHJpeC5hY2Nlc3NLZXlJZFNlY3JldE5hbWVdIH19JyxcbiAgICAgICAgJ2F3cy1zZWNyZXQtYWNjZXNzLWtleSc6ICcke3sgc2VjcmV0c1ttYXRyaXguc2VjcmV0QWNjZXNzS2V5U2VjcmV0TmFtZV0gfX0nLFxuICAgICAgfSA6IHVuZGVmaW5lZFxuICByZXR1cm4ge1xuICAgIGlmOiBjb25kaXRpb24sXG4gICAgbmFtZTogJ0Fzc3VtZSBBV1MgUm9sZScsXG4gICAgdXNlczogJ2F3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAdjQnLFxuICAgIHdpdGg6IHtcbiAgICAgIC4uLnNlY3JldHNQYXJhbXMsXG4gICAgICAncm9sZS10by1hc3N1bWUnOiAnJHt7IG1hdHJpeC5yb2xlVG9Bc3N1bWUgfX0nLFxuICAgICAgJ2F3cy1yZWdpb24nOiAnJHt7IG1hdHJpeC5yZWdpb24gfX0nLFxuICAgICAgJ3JvbGUtZHVyYXRpb24tc2Vjb25kcyc6ICcke3sgbWF0cml4LmFzc3VtZVJvbGVEdXJhdGlvblNlY29uZHMgfX0nLFxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEF3c0NyZWRlbnRpYWxzU3RlcHMoXG4gIGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbixcbiAgYXV0aFByb3ZpZGVyOiBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIgPSBDb2RlQXJ0aWZhY3RBdXRoUHJvdmlkZXIuQUNDRVNTX0FORF9TRUNSRVRfS0VZX1BBSVIpXG4gIDogSm9iU3RlcFtdIHtcbiAgcmV0dXJuIFtcbiAgICBzZXRBd3NDcmVkZW50aWFsc0luRW52aXJvbm1lbnQoY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBhc3N1bWVBd3NSb2xlU3RlcChjaGVja0FjdGl2ZURlcGxveW1lbnQsIGF1dGhQcm92aWRlciksXG4gIF1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldE5wbUNvbmZpZyhjb25maWdOYW1lOiBzdHJpbmcsIGNvbmZpZ1ZhbHVlOiBzdHJpbmcsIGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbik6IEpvYlN0ZXAge1xuICBjb25zdCBlbnZpcm9ubWVudFZhcmlhYmxlTmFtZSA9ICdDT05GSUdfVkFMVUUnXG4gIHJldHVybiB7XG4gICAgLi4uZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50KSxcbiAgICBuYW1lOiAnU2V0dGluZyBOUE0gQ29uZmlnJyxcbiAgICBlbnY6IHtcbiAgICAgIFtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZV06IGNvbmZpZ1ZhbHVlLFxuICAgIH0sXG4gICAgcnVuOiBgbnBtIGNvbmZpZyBzZXQgJHtjb25maWdOYW1lfSAkJHtlbnZpcm9ubWVudFZhcmlhYmxlTmFtZX1gLFxuICB9XG59XG5cbmNvbnN0IGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXBJZCA9ICdkZXBsb3ltZW50LWNoZWNrJ1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXAoKTogSm9iU3RlcCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IGNoZWNrQWN0aXZlRGVwbG95bWVudFN0ZXBJZCxcbiAgICB1c2VzOiAnQW1pbkZhemxNb25kby9jaGVjay1kZXBsb3llZC1lbnZpcm9ubWVudEB2MScsXG4gICAgd2l0aDoge1xuICAgICAgZW52aXJvbm1lbnQ6ICcke3sgbWF0cml4LmVudmlyb25tZW50IH19JyxcbiAgICB9LFxuICAgIGVudjoge1xuICAgICAgR0lUSFVCX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyxcbiAgICB9LFxuICB9XG59XG5cbmNvbnN0IHNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uPSBgc3RlcHMuJHtjaGVja0FjdGl2ZURlcGxveW1lbnRTdGVwSWR9Lm91dHB1dHMuaGFzX2FjdGl2ZV9kZXBsb3ltZW50ICE9ICd0cnVlJ2BcblxuZnVuY3Rpb24gZ2V0U2tpcElmQWxyZWFkeUFjdGl2ZURlcGxveW1lbnRDb25kaXRpb24oY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuKTogSm9iU3RlcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjaGVja0FjdGl2ZURlcGxveW1lbnQgPyB7aWY6IGBcXCR7eyAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWB9IDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3N0RGVwbG95bWVudFN0ZXAoY2hlY2tBY3RpdmVEZXBsb3ltZW50OiBib29sZWFuLCBwYWNrYWdlTWFuYWdlcjogamF2YXNjcmlwdC5Ob2RlUGFja2FnZU1hbmFnZXIpOiBKb2JTdGVwIHtcbiAgY29uc3QgY29uZGl0aW9uID1cbiAgY2hlY2tBY3RpdmVEZXBsb3ltZW50ID9cbiAgICBgXFwke3sgbWF0cml4Lmhhc1Bvc3REZXBsb3lUYXNrID09ICd0cnVlJyAmJiAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWAgOlxuICAgICcke3sgbWF0cml4Lmhhc1Bvc3REZXBsb3lUYXNrID09IFxcJ3RydWVcXCcgfX0nXG4gIHJldHVybiB7XG4gICAgaWY6IGNvbmRpdGlvbixcbiAgICBuYW1lOiAnUG9zdCBEZXBsb3ltZW50JyxcbiAgICBydW46IGAke2dldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZFByZWZpeChwYWNrYWdlTWFuYWdlcil9IFxcJHt7IG1hdHJpeC5wb3N0RGVwbG95bWVudFNjcmlwdCB9fWAsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZURlcGxveW1lbnRTdGVwKGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbiwgcGFja2FnZU1hbmFnZXI6IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyKTogSm9iU3RlcCB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9XG4gIGNoZWNrQWN0aXZlRGVwbG95bWVudCA/XG4gICAgYFxcJHt7IG1hdHJpeC5oYXNQcmVEZXBsb3lUYXNrID09ICd0cnVlJyAmJiAke3NraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9ufSB9fWAgOlxuICAgICcke3sgbWF0cml4Lmhhc1ByZURlcGxveVRhc2sgPT0gXFwndHJ1ZVxcJyB9fSdcbiAgcmV0dXJuIHtcbiAgICBpZjogY29uZGl0aW9uLFxuICAgIG5hbWU6ICdQcmUgRGVwbG95bWVudCcsXG4gICAgcnVuOiBgJHtnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmRQcmVmaXgocGFja2FnZU1hbmFnZXIpfSBcXCR7eyBtYXRyaXgucHJlRGVwbG95bWVudFNjcmlwdCB9fWAsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZUluc3RhbGxEZXBlbmRlbmNpZXNTdGVwKHRhc2tOYW1lOiBzdHJpbmcsIGNoZWNrQWN0aXZlRGVwbG95bWVudDogYm9vbGVhbik6IEpvYlN0ZXAge1xuICByZXR1cm4ge1xuICAgIC4uLmdldFNraXBJZkFscmVhZHlBY3RpdmVEZXBsb3ltZW50Q29uZGl0aW9uKGNoZWNrQWN0aXZlRGVwbG95bWVudCksXG4gICAgbmFtZTogdGFza05hbWUsXG4gICAgcnVuOiBgbnB4IHByb2plbiAke3Rhc2tOYW1lfWAsXG4gIH1cbn0iXX0=