aws-cdk
Version:
CDK Toolkit, the command line tool for CDK apps
85 lines • 13.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.findCloudWatchLogGroups = void 0;
const aws_auth_1 = require("../aws-auth");
const deployments_1 = require("../deployments");
const evaluate_cloudformation_template_1 = require("../evaluate-cloudformation-template");
// resource types that have associated CloudWatch Log Groups that should _not_ be monitored
const IGNORE_LOGS_RESOURCE_TYPES = ['AWS::EC2::FlowLog', 'AWS::CloudTrail::Trail', 'AWS::CodeBuild::Project'];
// Resource types that will create a CloudWatch log group with a specific name if one is not provided.
// The keys are CFN resource types, and the values are the name of the physical name property of that resource
// and the service name that is used in the automatically created CloudWatch log group.
const RESOURCE_TYPES_WITH_IMPLICIT_LOGS = {
'AWS::Lambda::Function': {
PhysicalNamePropertyName: 'FunctionName',
LogGroupServiceName: 'lambda',
},
};
async function findCloudWatchLogGroups(sdkProvider, stackArtifact) {
let sdk;
const resolvedEnv = await sdkProvider.resolveEnvironment(stackArtifact.environment);
// try to assume the lookup role and fallback to the default credentials
try {
sdk = (await new deployments_1.Deployments({ sdkProvider }).prepareSdkWithLookupRoleFor(stackArtifact)).sdk;
}
catch {
sdk = (await sdkProvider.forEnvironment(resolvedEnv, aws_auth_1.Mode.ForReading)).sdk;
}
const listStackResources = new evaluate_cloudformation_template_1.LazyListStackResources(sdk, stackArtifact.stackName);
const evaluateCfnTemplate = new evaluate_cloudformation_template_1.EvaluateCloudFormationTemplate({
stackName: stackArtifact.stackName,
template: stackArtifact.template,
parameters: {},
account: resolvedEnv.account,
region: resolvedEnv.region,
partition: (await sdk.currentAccount()).partition,
urlSuffix: (region) => sdk.getEndpointSuffix(region),
sdk,
});
const stackResources = await listStackResources.listStackResources();
const logGroupNames = findAllLogGroupNames(stackResources, evaluateCfnTemplate);
return {
env: resolvedEnv,
sdk,
logGroupNames,
};
}
exports.findCloudWatchLogGroups = findCloudWatchLogGroups;
/**
* Determine if a CloudWatch Log Group is associated
* with an ignored resource
*/
function isReferencedFromIgnoredResource(logGroupResource, evaluateCfnTemplate) {
let foundReference = false;
const resourcesReferencingLogGroup = evaluateCfnTemplate.findReferencesTo(logGroupResource.LogicalResourceId);
for (const reference of resourcesReferencingLogGroup) {
if (IGNORE_LOGS_RESOURCE_TYPES.includes(reference.Type)) {
foundReference = true;
}
}
return foundReference;
}
/**
* Find all CloudWatch Log Groups in the deployed template.
* This will find both explicitely created Log Groups (excluding those associated with ignored resources)
* as well as Log Groups created implicitely (i.e. Lambda Functions)
*/
function findAllLogGroupNames(stackResources, evaluateCfnTemplate) {
return stackResources.reduce((logGroupNames, resource) => {
let logGroupName;
if (resource.ResourceType === 'AWS::Logs::LogGroup') {
if (!isReferencedFromIgnoredResource(resource, evaluateCfnTemplate)) {
logGroupName = resource.PhysicalResourceId;
}
}
else if (RESOURCE_TYPES_WITH_IMPLICIT_LOGS[resource.ResourceType]) {
const servicePart = RESOURCE_TYPES_WITH_IMPLICIT_LOGS[resource.ResourceType].LogGroupServiceName;
logGroupName = `/aws/${servicePart}/${resource.PhysicalResourceId}`;
}
if (logGroupName) {
logGroupNames.push(logGroupName);
}
return logGroupNames;
}, []);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1jbG91ZHdhdGNoLWxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaW5kLWNsb3Vkd2F0Y2gtbG9ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwwQ0FBc0Q7QUFDdEQsZ0RBQTZDO0FBQzdDLDBGQUE2RztBQUU3RywyRkFBMkY7QUFDM0YsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFFOUcsc0dBQXNHO0FBQ3RHLDhHQUE4RztBQUM5Ryx1RkFBdUY7QUFDdkYsTUFBTSxpQ0FBaUMsR0FBNkQ7SUFDbEcsdUJBQXVCLEVBQUU7UUFDdkIsd0JBQXdCLEVBQUUsY0FBYztRQUN4QyxtQkFBbUIsRUFBRSxRQUFRO0tBQzlCO0NBQ0YsQ0FBQztBQTBCSyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFdBQXdCLEVBQ3hCLGFBQWdEO0lBRWhELElBQUksR0FBUyxDQUFDO0lBQ2QsTUFBTSxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BGLHdFQUF3RTtJQUN4RSxJQUFJO1FBQ0YsR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLHlCQUFXLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0tBQy9GO0lBQUMsTUFBTTtRQUNOLEdBQUcsR0FBRyxDQUFDLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsZUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0tBQzVFO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHlEQUFzQixDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGlFQUE4QixDQUFDO1FBQzdELFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUztRQUNsQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7UUFDaEMsVUFBVSxFQUFFLEVBQUU7UUFDZCxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87UUFDNUIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1FBQzFCLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsU0FBUztRQUNqRCxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7UUFDcEQsR0FBRztLQUNKLENBQUMsQ0FBQztJQUVILE1BQU0sY0FBYyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNyRSxNQUFNLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUVoRixPQUFPO1FBQ0wsR0FBRyxFQUFFLFdBQVc7UUFDaEIsR0FBRztRQUNILGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQztBQWpDRCwwREFpQ0M7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLCtCQUErQixDQUN0QyxnQkFBcUQsRUFDckQsbUJBQW1EO0lBRW5ELElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztJQUMzQixNQUFNLDRCQUE0QixHQUFHLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDOUcsS0FBSyxNQUFNLFNBQVMsSUFBSSw0QkFBNEIsRUFBRTtRQUNwRCxJQUFJLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkQsY0FBYyxHQUFHLElBQUksQ0FBQztTQUN2QjtLQUNGO0lBQ0QsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixjQUFxRCxFQUNyRCxtQkFBbUQ7SUFFbkQsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBdUIsRUFBRSxRQUFRLEVBQUUsRUFBRTtRQUNqRSxJQUFJLFlBQVksQ0FBQztRQUNqQixJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUsscUJBQXFCLEVBQUU7WUFDbkQsSUFBSSxDQUFDLCtCQUErQixDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFO2dCQUNuRSxZQUFZLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDO2FBQzVDO1NBQ0Y7YUFBTSxJQUFJLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNuRSxNQUFNLFdBQVcsR0FBRyxpQ0FBaUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsbUJBQW1CLENBQUM7WUFDakcsWUFBWSxHQUFHLFFBQVEsV0FBVyxJQUFJLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxZQUFZLEVBQUU7WUFDaEIsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNsQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb24gfSBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCB7IE1vZGUsIFNka1Byb3ZpZGVyLCBJU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuaW1wb3J0IHsgRGVwbG95bWVudHMgfSBmcm9tICcuLi9kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsIExhenlMaXN0U3RhY2tSZXNvdXJjZXMgfSBmcm9tICcuLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5cbi8vIHJlc291cmNlIHR5cGVzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIENsb3VkV2F0Y2ggTG9nIEdyb3VwcyB0aGF0IHNob3VsZCBfbm90XyBiZSBtb25pdG9yZWRcbmNvbnN0IElHTk9SRV9MT0dTX1JFU09VUkNFX1RZUEVTID0gWydBV1M6OkVDMjo6Rmxvd0xvZycsICdBV1M6OkNsb3VkVHJhaWw6OlRyYWlsJywgJ0FXUzo6Q29kZUJ1aWxkOjpQcm9qZWN0J107XG5cbi8vIFJlc291cmNlIHR5cGVzIHRoYXQgd2lsbCBjcmVhdGUgYSBDbG91ZFdhdGNoIGxvZyBncm91cCB3aXRoIGEgc3BlY2lmaWMgbmFtZSBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuLy8gVGhlIGtleXMgYXJlIENGTiByZXNvdXJjZSB0eXBlcywgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBuYW1lIG9mIHRoZSBwaHlzaWNhbCBuYW1lIHByb3BlcnR5IG9mIHRoYXQgcmVzb3VyY2Vcbi8vIGFuZCB0aGUgc2VydmljZSBuYW1lIHRoYXQgaXMgdXNlZCBpbiB0aGUgYXV0b21hdGljYWxseSBjcmVhdGVkIENsb3VkV2F0Y2ggbG9nIGdyb3VwLlxuY29uc3QgUkVTT1VSQ0VfVFlQRVNfV0lUSF9JTVBMSUNJVF9MT0dTOiB7IFtjZm5SZXNvdXJjZVR5cGU6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHtcbiAgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbic6IHtcbiAgICBQaHlzaWNhbE5hbWVQcm9wZXJ0eU5hbWU6ICdGdW5jdGlvbk5hbWUnLFxuICAgIExvZ0dyb3VwU2VydmljZU5hbWU6ICdsYW1iZGEnLFxuICB9LFxufTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG5lZWRlZCB0byBtb25pdG9yIENsb3VkV2F0Y2ggTG9nIEdyb3Vwc1xuICogZm91bmQgaW4gYSBnaXZlbiBDbG91ZEZvcm1hdGlvbiBTdGFja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kTG9nR3JvdXBzUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCAoYWNjb3VudC9yZWdpb24pIHRoYXQgdGhlIGxvZ1xuICAgKiBncm91cHMgYXJlIGRlcGxveWVkIGluXG4gICAqL1xuICByZWFkb25seSBlbnY6IGN4YXBpLkVudmlyb25tZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgU0RLIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVhZCBldmVudHMgZnJvbSB0aGUgQ2xvdWRXYXRjaFxuICAgKiBMb2cgR3JvdXBzIGluIHRoZSBnaXZlbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgc2RrOiBJU0RLO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgb2YgdGhlIHJlbGV2YW50IENsb3VkV2F0Y2ggTG9nIEdyb3Vwc1xuICAgKiBpbiB0aGUgZ2l2ZW4gQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZXM6IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ2xvdWRXYXRjaExvZ0dyb3VwcyhcbiAgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyLFxuICBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4pOiBQcm9taXNlPEZvdW5kTG9nR3JvdXBzUmVzdWx0PiB7XG4gIGxldCBzZGs6IElTREs7XG4gIGNvbnN0IHJlc29sdmVkRW52ID0gYXdhaXQgc2RrUHJvdmlkZXIucmVzb2x2ZUVudmlyb25tZW50KHN0YWNrQXJ0aWZhY3QuZW52aXJvbm1lbnQpO1xuICAvLyB0cnkgdG8gYXNzdW1lIHRoZSBsb29rdXAgcm9sZSBhbmQgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgY3JlZGVudGlhbHNcbiAgdHJ5IHtcbiAgICBzZGsgPSAoYXdhaXQgbmV3IERlcGxveW1lbnRzKHsgc2RrUHJvdmlkZXIgfSkucHJlcGFyZVNka1dpdGhMb29rdXBSb2xlRm9yKHN0YWNrQXJ0aWZhY3QpKS5zZGs7XG4gIH0gY2F0Y2gge1xuICAgIHNkayA9IChhd2FpdCBzZGtQcm92aWRlci5mb3JFbnZpcm9ubWVudChyZXNvbHZlZEVudiwgTW9kZS5Gb3JSZWFkaW5nKSkuc2RrO1xuICB9XG5cbiAgY29uc3QgbGlzdFN0YWNrUmVzb3VyY2VzID0gbmV3IExhenlMaXN0U3RhY2tSZXNvdXJjZXMoc2RrLCBzdGFja0FydGlmYWN0LnN0YWNrTmFtZSk7XG4gIGNvbnN0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUgPSBuZXcgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKHtcbiAgICBzdGFja05hbWU6IHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lLFxuICAgIHRlbXBsYXRlOiBzdGFja0FydGlmYWN0LnRlbXBsYXRlLFxuICAgIHBhcmFtZXRlcnM6IHt9LFxuICAgIGFjY291bnQ6IHJlc29sdmVkRW52LmFjY291bnQsXG4gICAgcmVnaW9uOiByZXNvbHZlZEVudi5yZWdpb24sXG4gICAgcGFydGl0aW9uOiAoYXdhaXQgc2RrLmN1cnJlbnRBY2NvdW50KCkpLnBhcnRpdGlvbixcbiAgICB1cmxTdWZmaXg6IChyZWdpb24pID0+IHNkay5nZXRFbmRwb2ludFN1ZmZpeChyZWdpb24pLFxuICAgIHNkayxcbiAgfSk7XG5cbiAgY29uc3Qgc3RhY2tSZXNvdXJjZXMgPSBhd2FpdCBsaXN0U3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gIGNvbnN0IGxvZ0dyb3VwTmFtZXMgPSBmaW5kQWxsTG9nR3JvdXBOYW1lcyhzdGFja1Jlc291cmNlcywgZXZhbHVhdGVDZm5UZW1wbGF0ZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbnY6IHJlc29sdmVkRW52LFxuICAgIHNkayxcbiAgICBsb2dHcm91cE5hbWVzLFxuICB9O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIENsb3VkV2F0Y2ggTG9nIEdyb3VwIGlzIGFzc29jaWF0ZWRcbiAqIHdpdGggYW4gaWdub3JlZCByZXNvdXJjZVxuICovXG5mdW5jdGlvbiBpc1JlZmVyZW5jZWRGcm9tSWdub3JlZFJlc291cmNlKFxuICBsb2dHcm91cFJlc291cmNlOiBDbG91ZEZvcm1hdGlvbi5TdGFja1Jlc291cmNlU3VtbWFyeSxcbiAgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogYm9vbGVhbiB7XG4gIGxldCBmb3VuZFJlZmVyZW5jZSA9IGZhbHNlO1xuICBjb25zdCByZXNvdXJjZXNSZWZlcmVuY2luZ0xvZ0dyb3VwID0gZXZhbHVhdGVDZm5UZW1wbGF0ZS5maW5kUmVmZXJlbmNlc1RvKGxvZ0dyb3VwUmVzb3VyY2UuTG9naWNhbFJlc291cmNlSWQpO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZXNvdXJjZXNSZWZlcmVuY2luZ0xvZ0dyb3VwKSB7XG4gICAgaWYgKElHTk9SRV9MT0dTX1JFU09VUkNFX1RZUEVTLmluY2x1ZGVzKHJlZmVyZW5jZS5UeXBlKSkge1xuICAgICAgZm91bmRSZWZlcmVuY2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZm91bmRSZWZlcmVuY2U7XG59XG5cbi8qKlxuICogRmluZCBhbGwgQ2xvdWRXYXRjaCBMb2cgR3JvdXBzIGluIHRoZSBkZXBsb3llZCB0ZW1wbGF0ZS5cbiAqIFRoaXMgd2lsbCBmaW5kIGJvdGggZXhwbGljaXRlbHkgY3JlYXRlZCBMb2cgR3JvdXBzIChleGNsdWRpbmcgdGhvc2UgYXNzb2NpYXRlZCB3aXRoIGlnbm9yZWQgcmVzb3VyY2VzKVxuICogYXMgd2VsbCBhcyBMb2cgR3JvdXBzIGNyZWF0ZWQgaW1wbGljaXRlbHkgKGkuZS4gTGFtYmRhIEZ1bmN0aW9ucylcbiAqL1xuZnVuY3Rpb24gZmluZEFsbExvZ0dyb3VwTmFtZXMoXG4gIHN0YWNrUmVzb3VyY2VzOiBDbG91ZEZvcm1hdGlvbi5TdGFja1Jlc291cmNlU3VtbWFyeVtdLFxuICBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBzdGFja1Jlc291cmNlcy5yZWR1Y2UoKGxvZ0dyb3VwTmFtZXM6IHN0cmluZ1tdLCByZXNvdXJjZSkgPT4ge1xuICAgIGxldCBsb2dHcm91cE5hbWU7XG4gICAgaWYgKHJlc291cmNlLlJlc291cmNlVHlwZSA9PT0gJ0FXUzo6TG9nczo6TG9nR3JvdXAnKSB7XG4gICAgICBpZiAoIWlzUmVmZXJlbmNlZEZyb21JZ25vcmVkUmVzb3VyY2UocmVzb3VyY2UsIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpKSB7XG4gICAgICAgIGxvZ0dyb3VwTmFtZSA9IHJlc291cmNlLlBoeXNpY2FsUmVzb3VyY2VJZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFJFU09VUkNFX1RZUEVTX1dJVEhfSU1QTElDSVRfTE9HU1tyZXNvdXJjZS5SZXNvdXJjZVR5cGVdKSB7XG4gICAgICBjb25zdCBzZXJ2aWNlUGFydCA9IFJFU09VUkNFX1RZUEVTX1dJVEhfSU1QTElDSVRfTE9HU1tyZXNvdXJjZS5SZXNvdXJjZVR5cGVdLkxvZ0dyb3VwU2VydmljZU5hbWU7XG4gICAgICBsb2dHcm91cE5hbWUgPSBgL2F3cy8ke3NlcnZpY2VQYXJ0fS8ke3Jlc291cmNlLlBoeXNpY2FsUmVzb3VyY2VJZH1gO1xuICAgIH1cbiAgICBpZiAobG9nR3JvdXBOYW1lKSB7XG4gICAgICBsb2dHcm91cE5hbWVzLnB1c2gobG9nR3JvdXBOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0dyb3VwTmFtZXM7XG4gIH0sIFtdKTtcbn1cbiJdfQ==