@aws-solutions-constructs/core
Version:
Core CDK Construct for patterns library
110 lines • 15.9 kB
JavaScript
"use strict";
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
* with the License. A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildInferenceProfile = buildInferenceProfile;
exports.createAreaPrefixMapping = createAreaPrefixMapping;
exports.createAreaRegionMapping = createAreaRegionMapping;
exports.IsCrossRegionProfile = IsCrossRegionProfile;
exports.CheckBedrockInferenceProps = CheckBedrockInferenceProps;
// Imports
const cdk = require("aws-cdk-lib");
const bedrock = require("aws-cdk-lib/aws-bedrock");
const defaults = require("../index");
function buildInferenceProfile(scope, id, props) {
const areaMap = createAreaPrefixMapping(scope, id);
const regionPrefix = cdk.Fn.select(0, cdk.Fn.split('-', cdk.Aws.REGION));
const crossRegion = IsCrossRegionProfile(props.deployCrossRegionProfile);
const inferenceSourceArn = crossRegion ?
`arn:${cdk.Aws.PARTITION}:bedrock:${cdk.Aws.REGION}:${cdk.Aws.ACCOUNT_ID}:inference-profile/${areaMap.mapping.findInMap(regionPrefix, "prefix")}.${props.bedrockModelId}` :
`arn:${cdk.Aws.PARTITION}:bedrock:${cdk.Aws.REGION}:${cdk.Aws.ACCOUNT_ID}:foundation-model/${props.bedrockModelId}`;
const constructInferenceProps = {
modelSource: {
copyFrom: inferenceSourceArn
},
inferenceProfileName: defaults.generatePhysicalInferenceProfileName("", [id])
};
const finalProps = defaults.consolidateProps(constructInferenceProps, props.inferenceProfileProps);
const inferenceProfile = new bedrock.CfnApplicationInferenceProfile(scope, `${id}-inference`, finalProps);
return {
inferenceProfile,
crossRegion
};
}
function createAreaPrefixMapping(scope, id) {
const mappingName = defaults.removeNonAlphanumeric(`${id}-area-prefix-mapping`);
const newMapping = new cdk.CfnMapping(scope, `${id}-area-prefix-mapping`, {
mapping: {
'us': {
prefix: 'us',
},
'eu': {
prefix: 'eu',
},
'ap': {
prefix: 'apac',
},
}
});
newMapping.overrideLogicalId(mappingName);
return {
mapping: newMapping,
mappingName
};
}
function createAreaRegionMapping(scope, id, model) {
const mappingName = defaults.removeNonAlphanumeric(`${id}-area-region-mapping`);
const newMapping = new cdk.CfnMapping(scope, `${id}-area-region-mapping`, {
mapping: {
'eu': {
regionalModels: `arn:aws:bedrock:eu-north-1::foundation-model/${model},` +
`arn:aws:bedrock:eu-central-1::foundation-model/${model},` +
`arn:aws:bedrock:eu-west-1::foundation-model/${model},` +
`arn:aws:bedrock:eu-west-3::foundation-model/${model}`
},
'us': {
regionalModels: `arn:aws:bedrock:us-east-1::foundation-model/${model},` +
`arn:aws:bedrock:us-east-2::foundation-model/${model},` +
`arn:aws:bedrock:us-west-2::foundation-model/${model}`
},
'ap': {
regionalModels: `arn:aws:bedrock:ap-southeast-2::foundation-model/${model},` +
`arn:aws:bedrock:ap-northeast-1::foundation-model/${model},` +
`arn:aws:bedrock:ap-south-1::foundation-model/${model},` +
`arn:aws:bedrock:ap-northeast-2::foundation-model/${model},` +
`arn:aws:bedrock:ap-southeast-1::foundation-model/${model},` +
`arn:aws:bedrock:ap-northeast-3::foundation-model/${model}`
}
}
});
newMapping.overrideLogicalId(mappingName);
return {
mapping: newMapping,
mappingName
};
}
function IsCrossRegionProfile(deployCrossRegionProfile) {
return defaults.CheckBooleanWithDefault(deployCrossRegionProfile, true);
}
function CheckBedrockInferenceProps(propsObject) {
let errorMessages = '';
let errorFound = false;
if (propsObject.inferenceProfileProps?.modelSource) {
errorMessages += 'Error - The construct will create the modelSource value, it cannot be specified in the props.\n';
errorFound = true;
}
if (errorFound) {
throw new Error(errorMessages);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1pbmZlcmVuY2UtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYmVkcm9jay1pbmZlcmVuY2UtaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7QUFvQkgsc0RBc0JDO0FBT0QsMERBb0JDO0FBRUQsMERBaUNDO0FBRUQsb0RBRUM7QUFRRCxnRUFZQztBQTlIRCxVQUFVO0FBQ1YsbUNBQW1DO0FBQ25DLG1EQUFtRDtBQUNuRCxxQ0FBcUM7QUFlckMsU0FBZ0IscUJBQXFCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7SUFDbkcsTUFBTSxPQUFPLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRW5ELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDdEMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsc0JBQXNCLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMzSyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxxQkFBcUIs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Q0FBQyxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuRCxhQUFhLElBQUksaUdBQWlHLENBQUM7UUFDbkgsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogIHdpdGggdGhlIExpY2Vuc2UuIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgb3IgaW4gdGhlICdsaWNlbnNlJyBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVNcbiAqICBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuICogIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBJbXBvcnRzXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgYmVkcm9jayBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9jayc7XG5pbXBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tICcuLi9pbmRleCc7XG4vLyBOb3RlOiBUbyBlbnN1cmUgQ0RLdjIgY29tcGF0aWJpbGl0eSwga2VlcCB0aGUgaW1wb3J0IHN0YXRlbWVudCBmb3IgQ29uc3RydWN0IHNlcGFyYXRlXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZEluZmVyZW5jZVByb2ZpbGVQcm9wcyB7XG4gIHJlYWRvbmx5IGJlZHJvY2tNb2RlbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluZmVyZW5jZVByb2ZpbGVQcm9wcz86IGJlZHJvY2suQ2ZuQXBwbGljYXRpb25JbmZlcmVuY2VQcm9maWxlUHJvcHM7XG4gIHJlYWRvbmx5IGRlcGxveUNyb3NzUmVnaW9uUHJvZmlsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRJbmZlcmVuY2VQcm9maWxlUmVwb25zZSB7XG4gIHJlYWRvbmx5IGNyb3NzUmVnaW9uPzogYm9vbGVhbixcbiAgcmVhZG9ubHkgaW5mZXJlbmNlUHJvZmlsZTogYmVkcm9jay5DZm5BcHBsaWNhdGlvbkluZmVyZW5jZVByb2ZpbGUsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEluZmVyZW5jZVByb2ZpbGUoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJ1aWxkSW5mZXJlbmNlUHJvZmlsZVByb3BzKTogQnVpbGRJbmZlcmVuY2VQcm9maWxlUmVwb25zZSB7XG4gIGNvbnN0IGFyZWFNYXAgPSBjcmVhdGVBcmVhUHJlZml4TWFwcGluZyhzY29wZSwgaWQpO1xuXG4gIGNvbnN0IHJlZ2lvblByZWZpeCA9IGNkay5Gbi5zZWxlY3QoMCwgY2RrLkZuLnNwbGl0KCctJywgY2RrLkF3cy5SRUdJT04pKTtcbiAgY29uc3QgY3Jvc3NSZWdpb24gPSBJc0Nyb3NzUmVnaW9uUHJvZmlsZShwcm9wcy5kZXBsb3lDcm9zc1JlZ2lvblByb2ZpbGUpO1xuICBjb25zdCBpbmZlcmVuY2VTb3VyY2VBcm4gPSBjcm9zc1JlZ2lvbiA/XG4gICAgYGFybjoke2Nkay5Bd3MuUEFSVElUSU9OfTpiZWRyb2NrOiR7Y2RrLkF3cy5SRUdJT059OiR7Y2RrLkF3cy5BQ0NPVU5UX0lEfTppbmZlcmVuY2UtcHJvZmlsZS8ke2FyZWFNYXAubWFwcGluZy5maW5kSW5NYXAocmVnaW9uUHJlZml4LCBcInByZWZpeFwiKX0uJHtwcm9wcy5iZWRyb2NrTW9kZWxJZH1gIDpcbiAgICBgYXJuOiR7Y2RrLkF3cy5QQVJUSVRJT059OmJlZHJvY2s6JHtjZGsuQXdzLlJFR0lPTn06JHtjZGsuQXdzLkFDQ09VTlRfSUR9OmZvdW5kYXRpb24tbW9kZWwvJHtwcm9wcy5iZWRyb2NrTW9kZWxJZH1gO1xuXG4gIGNvbnN0IGNvbnN0cnVjdEluZmVyZW5jZVByb3BzOiBiZWRyb2NrLkNmbkFwcGxpY2F0aW9uSW5mZXJlbmNlUHJvZmlsZVByb3BzID0ge1xuICAgIG1vZGVsU291cmNlOiB7XG4gICAgICBjb3B5RnJvbTogaW5mZXJlbmNlU291cmNlQXJuXG4gICAgfSxcbiAgICBpbmZlcmVuY2VQcm9maWxlTmFtZTogZGVmYXVsdHMuZ2VuZXJhdGVQaHlzaWNhbEluZmVyZW5jZVByb2ZpbGVOYW1lKFwiXCIsIFtpZF0pXG4gIH07XG4gIGNvbnN0IGZpbmFsUHJvcHMgPSBkZWZhdWx0cy5jb25zb2xpZGF0ZVByb3BzKGNvbnN0cnVjdEluZmVyZW5jZVByb3BzLCBwcm9wcy5pbmZlcmVuY2VQcm9maWxlUHJvcHMpO1xuICBjb25zdCBpbmZlcmVuY2VQcm9maWxlID0gbmV3IGJlZHJvY2suQ2ZuQXBwbGljYXRpb25JbmZlcmVuY2VQcm9maWxlKHNjb3BlLCBgJHtpZH0taW5mZXJlbmNlYCwgZmluYWxQcm9wcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbmZlcmVuY2VQcm9maWxlLFxuICAgIGNyb3NzUmVnaW9uXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFwcGluZ1Jlc3BvbnNlIHtcbiAgcmVhZG9ubHkgbWFwcGluZ05hbWU6IHN0cmluZyxcbiAgcmVhZG9ubHkgbWFwcGluZzogY2RrLkNmbk1hcHBpbmcsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcmVhUHJlZml4TWFwcGluZyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKTogTWFwcGluZ1Jlc3BvbnNlIHtcbiAgY29uc3QgbWFwcGluZ05hbWUgPSBkZWZhdWx0cy5yZW1vdmVOb25BbHBoYW51bWVyaWMoYCR7aWR9LWFyZWEtcHJlZml4LW1hcHBpbmdgKTtcbiAgY29uc3QgbmV3TWFwcGluZyA9IG5ldyBjZGsuQ2ZuTWFwcGluZyhzY29wZSwgYCR7aWR9LWFyZWEtcHJlZml4LW1hcHBpbmdgLCB7XG4gICAgbWFwcGluZzoge1xuICAgICAgJ3VzJzoge1xuICAgICAgICBwcmVmaXg6ICd1cycsXG4gICAgICB9LFxuICAgICAgJ2V1Jzoge1xuICAgICAgICBwcmVmaXg6ICdldScsXG4gICAgICB9LFxuICAgICAgJ2FwJzoge1xuICAgICAgICBwcmVmaXg6ICdhcGFjJyxcbiAgICAgIH0sXG4gICAgfVxuICB9KTtcbiAgbmV3TWFwcGluZy5vdmVycmlkZUxvZ2ljYWxJZChtYXBwaW5nTmFtZSk7XG4gIHJldHVybiB7XG4gICAgbWFwcGluZzogbmV3TWFwcGluZyxcbiAgICBtYXBwaW5nTmFtZVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJlYVJlZ2lvbk1hcHBpbmcoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgbW9kZWw6IHN0cmluZyk6IE1hcHBpbmdSZXNwb25zZSB7XG4gIGNvbnN0IG1hcHBpbmdOYW1lID0gZGVmYXVsdHMucmVtb3ZlTm9uQWxwaGFudW1lcmljKGAke2lkfS1hcmVhLXJlZ2lvbi1tYXBwaW5nYCk7XG4gIGNvbnN0IG5ld01hcHBpbmcgPSBuZXcgY2RrLkNmbk1hcHBpbmcoc2NvcGUsIGAke2lkfS1hcmVhLXJlZ2lvbi1tYXBwaW5nYCwge1xuICAgIG1hcHBpbmc6IHtcbiAgICAgICdldSc6IHtcbiAgICAgICAgcmVnaW9uYWxNb2RlbHM6XG4gICAgICAgICAgYGFybjphd3M6YmVkcm9jazpldS1ub3J0aC0xOjpmb3VuZGF0aW9uLW1vZGVsLyR7bW9kZWx9LGArXG4gICAgICAgICAgYGFybjphd3M6YmVkcm9jazpldS1jZW50cmFsLTE6OmZvdW5kYXRpb24tbW9kZWwvJHttb2RlbH0sYCtcbiAgICAgICAgICBgYXJuOmF3czpiZWRyb2NrOmV1LXdlc3QtMTo6Zm91bmRhdGlvbi1tb2RlbC8ke21vZGVsfSxgK1xuICAgICAgICAgIGBhcm46YXdzOmJlZHJvY2s6ZXUtd2VzdC0zOjpmb3VuZGF0aW9uLW1vZGVsLyR7bW9kZWx9YFxuICAgICAgfSxcbiAgICAgICd1cyc6IHtcbiAgICAgICAgcmVnaW9uYWxNb2RlbHM6XG4gICAgICAgICAgYGFybjphd3M6YmVkcm9jazp1cy1lYXN0LTE6OmZvdW5kYXRpb24tbW9kZWwvJHttb2RlbH0sYCtcbiAgICAgICAgICBgYXJuOmF3czpiZWRyb2NrOnVzLWVhc3QtMjo6Zm91bmRhdGlvbi1tb2RlbC8ke21vZGVsfSxgK1xuICAgICAgICAgIGBhcm46YXdzOmJlZHJvY2s6dXMtd2VzdC0yOjpmb3VuZGF0aW9uLW1vZGVsLyR7bW9kZWx9YFxuICAgICAgICB9LFxuICAgICAgJ2FwJzoge1xuICAgICAgICByZWdpb25hbE1vZGVsczpcbiAgICAgICAgICBgYXJuOmF3czpiZWRyb2NrOmFwLXNvdXRoZWFzdC0yOjpmb3VuZGF0aW9uLW1vZGVsLyR7bW9kZWx9LGArXG4gICAgICAgICAgYGFybjphd3M6YmVkcm9jazphcC1ub3J0aGVhc3QtMTo6Zm91bmRhdGlvbi1tb2RlbC8ke21vZGVsfSxgK1xuICAgICAgICAgIGBhcm46YXdzOmJlZHJvY2s6YXAtc291dGgtMTo6Zm91bmRhdGlvbi1tb2RlbC8ke21vZGVsfSxgK1xuICAgICAgICAgIGBhcm46YXdzOmJlZHJvY2s6YXAtbm9ydGhlYXN0LTI6OmZvdW5kYXRpb24tbW9kZWwvJHttb2RlbH0sYCtcbiAgICAgICAgICBgYXJuOmF3czpiZWRyb2NrOmFwLXNvdXRoZWFzdC0xOjpmb3VuZGF0aW9uLW1vZGVsLyR7bW9kZWx9LGArXG4gICAgICAgICAgYGFybjphd3M6YmVkcm9jazphcC1ub3J0aGVhc3QtMzo6Zm91bmRhdGlvbi1tb2RlbC8ke21vZGVsfWBcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBuZXdNYXBwaW5nLm92ZXJyaWRlTG9naWNhbElkKG1hcHBpbmdOYW1lKTtcbiAgcmV0dXJuIHtcbiAgICBtYXBwaW5nOiBuZXdNYXBwaW5nLFxuICAgIG1hcHBpbmdOYW1lXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBJc0Nyb3NzUmVnaW9uUHJvZmlsZShkZXBsb3lDcm9zc1JlZ2lvblByb2ZpbGU/OiBib29sZWFuKSB7XG4gIHJldHVybiBkZWZhdWx0cy5DaGVja0Jvb2xlYW5XaXRoRGVmYXVsdChkZXBsb3lDcm9zc1JlZ2lvblByb2ZpbGUsIHRydWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJlZHJvY2tJbmZlcmVuY2VQcm9wcyB7XG4gIHJlYWRvbmx5IGJlZHJvY2tNb2RlbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluZmVyZW5jZVByb2ZpbGVQcm9wcz86IGJlZHJvY2suQ2ZuQXBwbGljYXRpb25JbmZlcmVuY2VQcm9maWxlUHJvcHM7XG4gIHJlYWRvbmx5IGRlcGxveUNyb3NzUmVnaW9uUHJvZmlsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDaGVja0JlZHJvY2tJbmZlcmVuY2VQcm9wcyhwcm9wc09iamVjdDogQmVkcm9ja0luZmVyZW5jZVByb3BzKSB7XG4gIGxldCBlcnJvck1lc3NhZ2VzID0gJyc7XG4gIGxldCBlcnJvckZvdW5kID0gZmFsc2U7XG5cbiAgaWYgKHByb3BzT2JqZWN0LmluZmVyZW5jZVByb2ZpbGVQcm9wcz8ubW9kZWxTb3VyY2UpIHtcbiAgICBlcnJvck1lc3NhZ2VzICs9ICdFcnJvciAtIFRoZSBjb25zdHJ1Y3Qgd2lsbCBjcmVhdGUgdGhlIG1vZGVsU291cmNlIHZhbHVlLCBpdCBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIHRoZSBwcm9wcy5cXG4nO1xuICAgIGVycm9yRm91bmQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yRm91bmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlcyk7XG4gIH1cbn0iXX0=