@cdklabs/cdk-ecs-codedeploy
Version:
CDK Constructs for performing ECS Deployments with CodeDeploy
109 lines • 18.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeploymentStatus = void 0;
exports.handler = handler;
const client_codedeploy_1 = require("@aws-sdk/client-codedeploy");
const logger_1 = require("./logger");
var DeploymentStatus;
(function (DeploymentStatus) {
DeploymentStatus["CREATED"] = "Created";
DeploymentStatus["QUEUED"] = "Queued";
DeploymentStatus["IN_PROGRESS"] = "InProgress";
DeploymentStatus["BAKING"] = "Baking";
DeploymentStatus["SUCCEEDED"] = "Succeeded";
DeploymentStatus["FAILED"] = "Failed";
DeploymentStatus["STOPPED"] = "Stopped";
DeploymentStatus["READY"] = "Ready";
})(DeploymentStatus || (exports.DeploymentStatus = DeploymentStatus = {}));
/**
* The lambda function called from CloudFormation for this custom resource.
*
* @param event
* @returns whether the deployment is complete
*/
async function handler(event) {
const logger = new logger_1.Logger();
const codedeployClient = new client_codedeploy_1.CodeDeployClient({});
try {
const resp = await codedeployClient.send(new client_codedeploy_1.GetDeploymentCommand({ deploymentId: event.PhysicalResourceId }));
let rollbackResp = {};
if (resp.deploymentInfo?.rollbackInfo?.rollbackDeploymentId) {
rollbackResp = await codedeployClient.send(new client_codedeploy_1.GetDeploymentCommand({ deploymentId: resp.deploymentInfo?.rollbackInfo?.rollbackDeploymentId }));
}
logger.appendKeys({
stackEvent: event.RequestType,
deploymentId: event.PhysicalResourceId,
deploymentStatus: resp.deploymentInfo?.status,
rollbackStatus: rollbackResp?.deploymentInfo?.status,
});
logger.info('Checking deployment');
// check if deployment id is complete
switch (event.RequestType) {
case 'Create':
case 'Update':
switch (resp.deploymentInfo?.status) {
case DeploymentStatus.SUCCEEDED:
logger.info('Deployment finished successfully', { complete: true });
return { IsComplete: true };
case DeploymentStatus.FAILED:
case DeploymentStatus.STOPPED:
if (rollbackResp.deploymentInfo?.status) {
if (rollbackResp.deploymentInfo?.status == DeploymentStatus.SUCCEEDED ||
rollbackResp.deploymentInfo?.status == DeploymentStatus.FAILED ||
rollbackResp.deploymentInfo?.status == DeploymentStatus.STOPPED) {
const errInfo = resp.deploymentInfo.errorInformation;
const error = new Error(`Deployment ${resp.deploymentInfo.status}: [${errInfo?.code}] ${errInfo?.message}`);
logger.error('Deployment failed', { complete: true, error });
throw error;
}
logger.info('Waiting for final status from a rollback', { complete: false });
return { IsComplete: false }; // waiting for final status from rollback
}
else {
const errInfo = resp.deploymentInfo.errorInformation;
const error = new Error(`Deployment ${resp.deploymentInfo.status}: [${errInfo?.code}] ${errInfo?.message}`);
logger.error('No rollback to wait for', { complete: true, error });
throw error;
}
default:
logger.info('Waiting for final status from deployment', { complete: false });
return { IsComplete: false };
}
case 'Delete':
switch (resp.deploymentInfo?.status) {
case DeploymentStatus.SUCCEEDED:
logger.info('Deployment finished successfully - nothing to delete', { complete: true });
return { IsComplete: true };
case DeploymentStatus.FAILED:
case DeploymentStatus.STOPPED:
if (rollbackResp.deploymentInfo?.status) {
if (rollbackResp.deploymentInfo?.status == DeploymentStatus.SUCCEEDED ||
rollbackResp.deploymentInfo?.status == DeploymentStatus.FAILED ||
rollbackResp.deploymentInfo?.status == DeploymentStatus.STOPPED) {
logger.info('Rollback in final status', { complete: true });
return { IsComplete: true }; // rollback finished, we're deleted
}
logger.info('Waiting for final status from a rollback', { complete: false });
return { IsComplete: false }; // waiting for rollback
}
logger.info('No rollback to wait for', { complete: true });
return { IsComplete: true };
default:
logger.info('Waiting for final status from deployment', { complete: false });
return { IsComplete: false };
}
default:
logger.error('Unknown request type');
throw new Error(`Unknown request type: ${event.RequestType}`);
}
}
catch (e) {
logger.error('Unable to determine deployment status', { error: e });
if (event.RequestType === 'Delete') {
logger.warn('Ignoring error - nothing to do', { complete: true });
return { IsComplete: true };
}
throw e;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtY29tcGxldGUubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vjcy1kZXBsb3ltZW50LXByb3ZpZGVyL2lzLWNvbXBsZXRlLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2Q0EsMEJBNEZDO0FBeklELGtFQUF5RztBQUN6RyxxQ0FBa0M7QUFFbEMsSUFBWSxnQkFTWDtBQVRELFdBQVksZ0JBQWdCO0lBQzFCLHVDQUFtQixDQUFBO0lBQ25CLHFDQUFpQixDQUFBO0lBQ2pCLDhDQUEwQixDQUFBO0lBQzFCLHFDQUFpQixDQUFBO0lBQ2pCLDJDQUF1QixDQUFBO0lBQ3ZCLHFDQUFpQixDQUFBO0lBQ2pCLHVDQUFtQixDQUFBO0lBQ25CLG1DQUFlLENBQUE7QUFDakIsQ0FBQyxFQVRXLGdCQUFnQixnQ0FBaEIsZ0JBQWdCLFFBUzNCO0FBMkJEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUF3QjtJQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sRUFBRSxDQUFDO0lBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxvQ0FBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLHdDQUFvQixDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRyxJQUFJLFlBQVksR0FBd0IsRUFBRSxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztZQUM1RCxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSx3Q0FBb0IsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxDQUFD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Q0FBQztZQUNIO2dCQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUM7SUFDVixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvZGVEZXBsb3lDbGllbnQsIEdldERlcGxveW1lbnRDb21tYW5kLCBHZXREZXBsb3ltZW50T3V0cHV0IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNvZGVkZXBsb3knO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5leHBvcnQgZW51bSBEZXBsb3ltZW50U3RhdHVzIHtcbiAgQ1JFQVRFRCA9ICdDcmVhdGVkJyxcbiAgUVVFVUVEID0gJ1F1ZXVlZCcsXG4gIElOX1BST0dSRVNTID0gJ0luUHJvZ3Jlc3MnLFxuICBCQUtJTkcgPSAnQmFraW5nJyxcbiAgU1VDQ0VFREVEID0gJ1N1Y2NlZWRlZCcsXG4gIEZBSUxFRCA9ICdGYWlsZWQnLFxuICBTVE9QUEVEID0gJ1N0b3BwZWQnLFxuICBSRUFEWSA9ICdSZWFkeScsXG59XG5cbi8qKlxuICogVGhlIHJlcXVlc3Qgb2JqZWN0IHRoYXQgdGhlIGN1c3RvbSByZXNvdXJjZSBsYW1iYSBmdW5jdGlvbiByZWNlaXZlcyBmcm9tIENsb3VkRm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ29tcGxldGVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIENsb3VkRm9ybWF0aW9uIHJlcXVlc3QgKGUuZy4gJ0NyZWF0ZScsICdVcGRhdGUnLCBvciAnRGVsZXRlJylcbiAgICovXG4gIFJlcXVlc3RUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwaHlzaWNhbCByZXNvdXJjZSBpZC5cbiAgICovXG4gIFBoeXNpY2FsUmVzb3VyY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSByZXNwb25zZSBvYmplY3QgdGhhdCB0aGUgY3VzdG9tIHJlc291cmNlIGxhbWJkYSBmdW5jdGlvbiByZXR1cm5zIHRvIENsb3VkRm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzQ29tcGxldGVSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBkZXBsb3ltZW50IGlzIGluIGEgZmluYWwgc3RhdGUuXG4gICAqL1xuICBJc0NvbXBsZXRlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBsYW1iZGEgZnVuY3Rpb24gY2FsbGVkIGZyb20gQ2xvdWRGb3JtYXRpb24gZm9yIHRoaXMgY3VzdG9tIHJlc291cmNlLlxuICpcbiAqIEBwYXJhbSBldmVudFxuICogQHJldHVybnMgd2hldGhlciB0aGUgZGVwbG95bWVudCBpcyBjb21wbGV0ZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogSXNDb21wbGV0ZVJlcXVlc3QpOiBQcm9taXNlPElzQ29tcGxldGVSZXNwb25zZT4ge1xuICBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4gIGNvbnN0IGNvZGVkZXBsb3lDbGllbnQgPSBuZXcgQ29kZURlcGxveUNsaWVudCh7fSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IGNvZGVkZXBsb3lDbGllbnQuc2VuZChuZXcgR2V0RGVwbG95bWVudENvbW1hbmQoeyBkZXBsb3ltZW50SWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB9KSk7XG4gICAgbGV0IHJvbGxiYWNrUmVzcDogR2V0RGVwbG95bWVudE91dHB1dCA9IHt9O1xuICAgIGlmIChyZXNwLmRlcGxveW1lbnRJbmZvPy5yb2xsYmFja0luZm8/LnJvbGxiYWNrRGVwbG95bWVudElkKSB7XG4gICAgICByb2xsYmFja1Jlc3AgPSBhd2FpdCBjb2RlZGVwbG95Q2xpZW50LnNlbmQobmV3IEdldERlcGxveW1lbnRDb21tYW5kKHsgZGVwbG95bWVudElkOiByZXNwLmRlcGxveW1lbnRJbmZvPy5yb2xsYmFja0luZm8/LnJvbGxiYWNrRGVwbG95bWVudElkIH0pKTtcbiAgICB9XG4gICAgbG9nZ2VyLmFwcGVuZEtleXMoe1xuICAgICAgc3RhY2tFdmVudDogZXZlbnQuUmVxdWVzdFR5cGUsXG4gICAgICBkZXBsb3ltZW50SWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCxcbiAgICAgIGRlcGxveW1lbnRTdGF0dXM6IHJlc3AuZGVwbG95bWVudEluZm8/LnN0YXR1cyxcbiAgICAgIHJvbGxiYWNrU3RhdHVzOiByb2xsYmFja1Jlc3A/LmRlcGxveW1lbnRJbmZvPy5zdGF0dXMsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oJ0NoZWNraW5nIGRlcGxveW1lbnQnKTtcblxuICAgIC8vIGNoZWNrIGlmIGRlcGxveW1lbnQgaWQgaXMgY29tcGxldGVcbiAgICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgICBjYXNlICdDcmVhdGUnOlxuICAgICAgY2FzZSAnVXBkYXRlJzpcbiAgICAgICAgc3dpdGNoIChyZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMpIHtcbiAgICAgICAgICBjYXNlIERlcGxveW1lbnRTdGF0dXMuU1VDQ0VFREVEOlxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0RlcGxveW1lbnQgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5JywgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogdHJ1ZSB9O1xuICAgICAgICAgIGNhc2UgRGVwbG95bWVudFN0YXR1cy5GQUlMRUQ6XG4gICAgICAgICAgY2FzZSBEZXBsb3ltZW50U3RhdHVzLlNUT1BQRUQ6XG4gICAgICAgICAgICBpZiAocm9sbGJhY2tSZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgaWYgKHJvbGxiYWNrUmVzcC5kZXBsb3ltZW50SW5mbz8uc3RhdHVzID09IERlcGxveW1lbnRTdGF0dXMuU1VDQ0VFREVEIHx8XG4gICAgICAgICAgICAgICAgcm9sbGJhY2tSZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMgPT0gRGVwbG95bWVudFN0YXR1cy5GQUlMRUQgfHxcbiAgICAgICAgICAgICAgICByb2xsYmFja1Jlc3AuZGVwbG95bWVudEluZm8/LnN0YXR1cyA9PSBEZXBsb3ltZW50U3RhdHVzLlNUT1BQRUQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJJbmZvID0gcmVzcC5kZXBsb3ltZW50SW5mby5lcnJvckluZm9ybWF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBEZXBsb3ltZW50ICR7cmVzcC5kZXBsb3ltZW50SW5mby5zdGF0dXN9OiBbJHtlcnJJbmZvPy5jb2RlfV0gJHtlcnJJbmZvPy5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRGVwbG95bWVudCBmYWlsZWQnLCB7IGNvbXBsZXRlOiB0cnVlLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnV2FpdGluZyBmb3IgZmluYWwgc3RhdHVzIGZyb20gYSByb2xsYmFjaycsIHsgY29tcGxldGU6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7IElzQ29tcGxldGU6IGZhbHNlIH07IC8vIHdhaXRpbmcgZm9yIGZpbmFsIHN0YXR1cyBmcm9tIHJvbGxiYWNrXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBlcnJJbmZvID0gcmVzcC5kZXBsb3ltZW50SW5mby5lcnJvckluZm9ybWF0aW9uO1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgRGVwbG95bWVudCAke3Jlc3AuZGVwbG95bWVudEluZm8uc3RhdHVzfTogWyR7ZXJySW5mbz8uY29kZX1dICR7ZXJySW5mbz8ubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdObyByb2xsYmFjayB0byB3YWl0IGZvcicsIHsgY29tcGxldGU6IHRydWUsIGVycm9yIH0pO1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1dhaXRpbmcgZm9yIGZpbmFsIHN0YXR1cyBmcm9tIGRlcGxveW1lbnQnLCB7IGNvbXBsZXRlOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgc3dpdGNoIChyZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMpIHtcbiAgICAgICAgICBjYXNlIERlcGxveW1lbnRTdGF0dXMuU1VDQ0VFREVEOlxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0RlcGxveW1lbnQgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5IC0gbm90aGluZyB0byBkZWxldGUnLCB7IGNvbXBsZXRlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4geyBJc0NvbXBsZXRlOiB0cnVlIH07XG4gICAgICAgICAgY2FzZSBEZXBsb3ltZW50U3RhdHVzLkZBSUxFRDpcbiAgICAgICAgICBjYXNlIERlcGxveW1lbnRTdGF0dXMuU1RPUFBFRDpcbiAgICAgICAgICAgIGlmIChyb2xsYmFja1Jlc3AuZGVwbG95bWVudEluZm8/LnN0YXR1cykge1xuICAgICAgICAgICAgICBpZiAocm9sbGJhY2tSZXNwLmRlcGxveW1lbnRJbmZvPy5zdGF0dXMgPT0gRGVwbG95bWVudFN0YXR1cy5TVUNDRUVERUQgfHxcbiAgICAgICAgICAgICAgICByb2xsYmFja1Jlc3AuZGVwbG95bWVudEluZm8/LnN0YXR1cyA9PSBEZXBsb3ltZW50U3RhdHVzLkZBSUxFRCB8fFxuICAgICAgICAgICAgICAgIHJvbGxiYWNrUmVzcC5kZXBsb3ltZW50SW5mbz8uc3RhdHVzID09IERlcGxveW1lbnRTdGF0dXMuU1RPUFBFRCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdSb2xsYmFjayBpbiBmaW5hbCBzdGF0dXMnLCB7IGNvbXBsZXRlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogdHJ1ZSB9OyAvLyByb2xsYmFjayBmaW5pc2hlZCwgd2UncmUgZGVsZXRlZFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdXYWl0aW5nIGZvciBmaW5hbCBzdGF0dXMgZnJvbSBhIHJvbGxiYWNrJywgeyBjb21wbGV0ZTogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogZmFsc2UgfTsgLy8gd2FpdGluZyBmb3Igcm9sbGJhY2tcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdObyByb2xsYmFjayB0byB3YWl0IGZvcicsIHsgY29tcGxldGU6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IElzQ29tcGxldGU6IHRydWUgfTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1dhaXRpbmcgZm9yIGZpbmFsIHN0YXR1cyBmcm9tIGRlcGxveW1lbnQnLCB7IGNvbXBsZXRlOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgSXNDb21wbGV0ZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdVbmtub3duIHJlcXVlc3QgdHlwZScpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVxdWVzdCB0eXBlOiAke2V2ZW50LlJlcXVlc3RUeXBlfWApO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIGRldGVybWluZSBkZXBsb3ltZW50IHN0YXR1cycsIHsgZXJyb3I6IGUgYXMgRXJyb3IgfSk7XG4gICAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSAnRGVsZXRlJykge1xuICAgICAgbG9nZ2VyLndhcm4oJ0lnbm9yaW5nIGVycm9yIC0gbm90aGluZyB0byBkbycsIHsgY29tcGxldGU6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiB7IElzQ29tcGxldGU6IHRydWUgfTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufSJdfQ==