@scloud/cdk-patterns
Version:
Serverless CDK patterns for common infrastructure needs
125 lines • 14 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.containerFunction = containerFunction;
exports.zipFunction = zipFunction;
exports.edgeFunction = edgeFunction;
const path = __importStar(require("path"));
const logs = __importStar(require("aws-cdk-lib/aws-logs"));
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
const cloudfront = __importStar(require("aws-cdk-lib/aws-cloudfront"));
const ecrRepositoryDeprecated_1 = require("./ecrRepositoryDeprecated");
const ghaUserDeprecated_1 = require("./ghaUserDeprecated");
/**
* @deprecated Use ContainerFunction instead
*
* A Lambda function packaged as a container.
* @param construct Parent CDK construct (typically 'this')
* @param initialPass If the infrastructure is being built from scratch: true;
* for incremental deployments: false.
* @param name The name for this function
* @param environment Environment variables for the Lambda function
* @returns The lambda, if created, and associated ECR repository
*/
function containerFunction(construct, initialPass, name, environment, lambdaProps, tagOrDigest, ecr) {
// Repository for function container image
const repository = ecr || (0, ecrRepositoryDeprecated_1.ecrRepository)(construct, name);
// Container
const code = initialPass ? aws_lambda_1.DockerImageCode.fromImageAsset(path.join(__dirname, './container')) : aws_lambda_1.DockerImageCode.fromEcr(repository, {
tagOrDigest: tagOrDigest || 'latest',
});
const lambda = new aws_lambda_1.DockerImageFunction(construct, `${name}Function`, {
code,
logRetention: logs.RetentionDays.THREE_MONTHS,
environment,
description: name,
...lambdaProps,
});
(0, ghaUserDeprecated_1.addGhaLambda)(construct, name, lambda);
return { lambda, repository };
}
/**
* @deprecated Use ZipFunction.typescript() or ZipFunction.python() instead
*
* A Lambda function packaged as a zip file.
* Key defaults are:
* - runtime: Runtime.NODEJS_18_X
* - handler: 'src/lambda.handler'
* - logRetention: logs.RetentionDays.TWO_YEARS
* @param construct Parent CDK construct (typically 'this')
* @param name The name for this function
* @param environment Environment variables for the Lambda function
* @param lambdaProps Override properties for the Lambda function. you may want to pass e.g. { runtime: Runtime.PYTHON_3_10 }
* @returns The lambda, if created, and associated ECR repository
*/
function zipFunction(construct, name, environment, lambdaProps) {
const lambda = new aws_lambda_1.Function(construct, `${name}Function`, {
runtime: aws_lambda_1.Runtime.NODEJS_18_X,
handler: 'src/lambda.handler',
code: aws_lambda_1.Code.fromInline('Placeholder code'), // Asset(path.join(__dirname, './lambda/python')),
logRetention: logs.RetentionDays.TWO_YEARS,
environment,
description: name,
...lambdaProps,
});
(0, ghaUserDeprecated_1.addGhaLambda)(construct, name, lambda);
return lambda;
}
/**
* NB: This pattern is not well developed or maintained at the time of writing.
*
* A key reason for this is that I haven't worked out how to deal well with lambda function versions in CI/CD
* which seemed to be needed when deploying an update to an edge function.
*
* A Lambda@edge function.
* @param construct Parent CDK construct (typically 'this')
* @param name The name for this function
* @param environment Environment variables for the Lambda function
* @returns The lambda, if created, and associated ECR repository
*/
function edgeFunction(construct, name, environment) {
const edge = new cloudfront.experimental.EdgeFunction(construct, `${name}EdgeFunction`, {
functionName: name, // Resolves "...the resource's physical name must be explicit set..."
runtime: aws_lambda_1.Runtime.NODEJS_14_X,
code: aws_lambda_1.Code.fromAsset(path.join(__dirname, './edge')),
handler: 'src/lambda.handler',
memorySize: 256,
logRetention: logs.RetentionDays.THREE_MONTHS,
environment,
});
(0, ghaUserDeprecated_1.addGhaLambda)(construct, name, edge);
return edge;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhRnVuY3Rpb25EZXByZWNhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlcHJlY2F0ZWQvbGFtYmRhRnVuY3Rpb25EZXByZWNhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBLDhDQTBCQztBQWdCRCxrQ0FpQkM7QUFjRCxvQ0FvQkM7QUFuSEQsMkNBQTZCO0FBQzdCLDJEQUE2QztBQUU3Qyx1REFFZ0M7QUFFaEMsdUVBQXlEO0FBQ3pELHVFQUEwRDtBQUMxRCwyREFBbUQ7QUFFbkQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixTQUFvQixFQUNwQixXQUFvQixFQUNwQixJQUFZLEVBQ1osV0FBd0MsRUFDeEMsV0FBK0MsRUFDL0MsV0FBb0IsRUFDcEIsR0FBaUI7SUFFakIsMENBQTBDO0lBQzFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsSUFBSSxJQUFBLHVDQUFhLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRXpELFlBQVk7SUFDWixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLDRCQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUFlLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUNuSSxXQUFXLEVBQUUsV0FBVyxJQUFJLFFBQVE7S0FDckMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxNQUFNLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLFVBQVUsRUFBRTtRQUNuRSxJQUFJO1FBQ0osWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWTtRQUM3QyxXQUFXO1FBQ1gsV0FBVyxFQUFFLElBQUk7UUFDakIsR0FBRyxXQUFXO0tBQ2YsQ0FBQyxDQUFDO0lBQ0gsSUFBQSxnQ0FBWSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsU0FBb0IsRUFDcEIsSUFBWSxFQUNaLFdBQXdDLEVBQ3hDLFdBQW9DO0lBRXBDLE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLFVBQVUsRUFBRTtRQUN4RCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1FBQzVCLE9BQU8sRUFBRSxvQkFBb0I7UUFDN0IsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsa0RBQWtEO1FBQzdGLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVM7UUFDMUMsV0FBVztRQUNYLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLEdBQUcsV0FBVztLQUNmLENBQUMsQ0FBQztJQUNILElBQUEsZ0NBQVksRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLFlBQVksQ0FDMUIsU0FBb0IsRUFDcEIsSUFBWSxFQUNaLFdBQXdDO0lBRXhDLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ25ELFNBQVMsRUFDVCxHQUFHLElBQUksY0FBYyxFQUNyQjtRQUNFLFlBQVksRUFBRSxJQUFJLEVBQUUscUVBQXFFO1FBQ3pGLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7UUFDNUIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sRUFBRSxvQkFBb0I7UUFDN0IsVUFBVSxFQUFFLEdBQUc7UUFDZixZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZO1FBQzdDLFdBQVc7S0FDWixDQUNGLENBQUM7SUFDRixJQUFBLGdDQUFZLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIENvZGUsIERvY2tlckltYWdlQ29kZSwgRG9ja2VySW1hZ2VGdW5jdGlvbiwgRG9ja2VySW1hZ2VGdW5jdGlvblByb3BzLCBGdW5jdGlvbiwgRnVuY3Rpb25Qcm9wcywgUnVudGltZSxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0ICogYXMgY2xvdWRmcm9udCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgeyBlY3JSZXBvc2l0b3J5IH0gZnJvbSAnLi9lY3JSZXBvc2l0b3J5RGVwcmVjYXRlZCc7XG5pbXBvcnQgeyBhZGRHaGFMYW1iZGEgfSBmcm9tICcuL2doYVVzZXJEZXByZWNhdGVkJztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ29udGFpbmVyRnVuY3Rpb24gaW5zdGVhZFxuICpcbiAqIEEgTGFtYmRhIGZ1bmN0aW9uIHBhY2thZ2VkIGFzIGEgY29udGFpbmVyLlxuICogQHBhcmFtIGNvbnN0cnVjdCBQYXJlbnQgQ0RLIGNvbnN0cnVjdCAodHlwaWNhbGx5ICd0aGlzJylcbiAqIEBwYXJhbSBpbml0aWFsUGFzcyBJZiB0aGUgaW5mcmFzdHJ1Y3R1cmUgaXMgYmVpbmcgYnVpbHQgZnJvbSBzY3JhdGNoOiB0cnVlO1xuICogZm9yIGluY3JlbWVudGFsIGRlcGxveW1lbnRzOiBmYWxzZS5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBUaGUgbGFtYmRhLCBpZiBjcmVhdGVkLCBhbmQgYXNzb2NpYXRlZCBFQ1IgcmVwb3NpdG9yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbmVyRnVuY3Rpb24oXG4gIGNvbnN0cnVjdDogQ29uc3RydWN0LFxuICBpbml0aWFsUGFzczogYm9vbGVhbixcbiAgbmFtZTogc3RyaW5nLFxuICBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9LFxuICBsYW1iZGFQcm9wcz86IFBhcnRpYWw8RG9ja2VySW1hZ2VGdW5jdGlvblByb3BzPixcbiAgdGFnT3JEaWdlc3Q/OiBzdHJpbmcsXG4gIGVjcj86IElSZXBvc2l0b3J5LFxuKTogeyBsYW1iZGE6IEZ1bmN0aW9uLCByZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTsgfSB7XG4gIC8vIFJlcG9zaXRvcnkgZm9yIGZ1bmN0aW9uIGNvbnRhaW5lciBpbWFnZVxuICBjb25zdCByZXBvc2l0b3J5ID0gZWNyIHx8IGVjclJlcG9zaXRvcnkoY29uc3RydWN0LCBuYW1lKTtcblxuICAvLyBDb250YWluZXJcbiAgY29uc3QgY29kZSA9IGluaXRpYWxQYXNzID8gRG9ja2VySW1hZ2VDb2RlLmZyb21JbWFnZUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuL2NvbnRhaW5lcicpKSA6IERvY2tlckltYWdlQ29kZS5mcm9tRWNyKHJlcG9zaXRvcnksIHtcbiAgICB0YWdPckRpZ2VzdDogdGFnT3JEaWdlc3QgfHwgJ2xhdGVzdCcsXG4gIH0pO1xuXG4gIGNvbnN0IGxhbWJkYSA9IG5ldyBEb2NrZXJJbWFnZUZ1bmN0aW9uKGNvbnN0cnVjdCwgYCR7bmFtZX1GdW5jdGlvbmAsIHtcbiAgICBjb2RlLFxuICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLlRIUkVFX01PTlRIUyxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBkZXNjcmlwdGlvbjogbmFtZSxcbiAgICAuLi5sYW1iZGFQcm9wcyxcbiAgfSk7XG4gIGFkZEdoYUxhbWJkYShjb25zdHJ1Y3QsIG5hbWUsIGxhbWJkYSk7XG4gIHJldHVybiB7IGxhbWJkYSwgcmVwb3NpdG9yeSB9O1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBaaXBGdW5jdGlvbi50eXBlc2NyaXB0KCkgb3IgWmlwRnVuY3Rpb24ucHl0aG9uKCkgaW5zdGVhZFxuICpcbiAqIEEgTGFtYmRhIGZ1bmN0aW9uIHBhY2thZ2VkIGFzIGEgemlwIGZpbGUuXG4gKiBLZXkgZGVmYXVsdHMgYXJlOlxuICogIC0gcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWFxuICogIC0gaGFuZGxlcjogJ3NyYy9sYW1iZGEuaGFuZGxlcidcbiAqICAtIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLlRXT19ZRUFSU1xuICogQHBhcmFtIGNvbnN0cnVjdCBQYXJlbnQgQ0RLIGNvbnN0cnVjdCAodHlwaWNhbGx5ICd0aGlzJylcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbGFtYmRhUHJvcHMgT3ZlcnJpZGUgcHJvcGVydGllcyBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi4geW91IG1heSB3YW50IHRvIHBhc3MgZS5nLiB7IHJ1bnRpbWU6IFJ1bnRpbWUuUFlUSE9OXzNfMTAgfVxuICogQHJldHVybnMgVGhlIGxhbWJkYSwgaWYgY3JlYXRlZCwgYW5kIGFzc29jaWF0ZWQgRUNSIHJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHppcEZ1bmN0aW9uKFxuICBjb25zdHJ1Y3Q6IENvbnN0cnVjdCxcbiAgbmFtZTogc3RyaW5nLFxuICBlbnZpcm9ubWVudD86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9LFxuICBsYW1iZGFQcm9wcz86IFBhcnRpYWw8RnVuY3Rpb25Qcm9wcz4sXG4pOiBGdW5jdGlvbiB7XG4gIGNvbnN0IGxhbWJkYSA9IG5ldyBGdW5jdGlvbihjb25zdHJ1Y3QsIGAke25hbWV9RnVuY3Rpb25gLCB7XG4gICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICBoYW5kbGVyOiAnc3JjL2xhbWJkYS5oYW5kbGVyJyxcbiAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ1BsYWNlaG9sZGVyIGNvZGUnKSwgLy8gQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4vbGFtYmRhL3B5dGhvbicpKSxcbiAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5UV09fWUVBUlMsXG4gICAgZW52aXJvbm1lbnQsXG4gICAgZGVzY3JpcHRpb246IG5hbWUsXG4gICAgLi4ubGFtYmRhUHJvcHMsXG4gIH0pO1xuICBhZGRHaGFMYW1iZGEoY29uc3RydWN0LCBuYW1lLCBsYW1iZGEpO1xuICByZXR1cm4gbGFtYmRhO1xufVxuXG4vKipcbiAqIE5COiBUaGlzIHBhdHRlcm4gaXMgbm90IHdlbGwgZGV2ZWxvcGVkIG9yIG1haW50YWluZWQgYXQgdGhlIHRpbWUgb2Ygd3JpdGluZy5cbiAqXG4gKiBBIGtleSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBJIGhhdmVuJ3Qgd29ya2VkIG91dCBob3cgdG8gZGVhbCB3ZWxsIHdpdGggbGFtYmRhIGZ1bmN0aW9uIHZlcnNpb25zIGluIENJL0NEXG4gKiB3aGljaCBzZWVtZWQgdG8gYmUgbmVlZGVkIHdoZW4gZGVwbG95aW5nIGFuIHVwZGF0ZSB0byBhbiBlZGdlIGZ1bmN0aW9uLlxuICpcbiAqIEEgTGFtYmRhQGVkZ2UgZnVuY3Rpb24uXG4gKiBAcGFyYW0gY29uc3RydWN0IFBhcmVudCBDREsgY29uc3RydWN0ICh0eXBpY2FsbHkgJ3RoaXMnKVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb25cbiAqIEBwYXJhbSBlbnZpcm9ubWVudCBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb25cbiAqIEByZXR1cm5zIFRoZSBsYW1iZGEsIGlmIGNyZWF0ZWQsIGFuZCBhc3NvY2lhdGVkIEVDUiByZXBvc2l0b3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlZGdlRnVuY3Rpb24oXG4gIGNvbnN0cnVjdDogQ29uc3RydWN0LFxuICBuYW1lOiBzdHJpbmcsXG4gIGVudmlyb25tZW50PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0sXG4pOiBjbG91ZGZyb250LmV4cGVyaW1lbnRhbC5FZGdlRnVuY3Rpb24ge1xuICBjb25zdCBlZGdlID0gbmV3IGNsb3VkZnJvbnQuZXhwZXJpbWVudGFsLkVkZ2VGdW5jdGlvbihcbiAgICBjb25zdHJ1Y3QsXG4gICAgYCR7bmFtZX1FZGdlRnVuY3Rpb25gLFxuICAgIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogbmFtZSwgLy8gUmVzb2x2ZXMgXCIuLi50aGUgcmVzb3VyY2UncyBwaHlzaWNhbCBuYW1lIG11c3QgYmUgZXhwbGljaXQgc2V0Li4uXCJcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi9lZGdlJykpLFxuICAgICAgaGFuZGxlcjogJ3NyYy9sYW1iZGEuaGFuZGxlcicsXG4gICAgICBtZW1vcnlTaXplOiAyNTYsXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5USFJFRV9NT05USFMsXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICB9LFxuICApO1xuICBhZGRHaGFMYW1iZGEoY29uc3RydWN0LCBuYW1lLCBlZGdlKTtcbiAgcmV0dXJuIGVkZ2U7XG59XG4iXX0=