cdk-bootstrapless-synthesizer
Version:
Generate directly usable AWS CloudFormation template with aws-cdk v2.
212 lines • 25.4 kB
JavaScript
"use strict";
var _a, _b, _c, _d, _e;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CompositeECRRepositoryAspect = exports.BatchJobDefinition = exports.StepFunctionsSageMakerTrainingJob = exports.ECSTaskDefinition = exports.ECRRepositoryAspect = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const batch = require("@aws-cdk/aws-batch-alpha");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const aws_ecs_1 = require("aws-cdk-lib/aws-ecs");
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks");
const FN_SUB = 'Fn::Sub';
/**
* Abtract aspect for ECR repository.
*
* You must provide the account id in props or set BSS_IMAGE_ASSET_ACCOUNT_ID in env
*/
class ECRRepositoryAspect {
constructor(props = {}) {
this.account = props.imageAssetAccountId ?? process.env.BSS_IMAGE_ASSET_ACCOUNT_ID;
}
getRepoName(imageUri) {
const matches = /\d{12}\.dkr\.ecr\..*\/(.*):.*/g.exec(imageUri);
if (matches) {
return matches[1];
}
return undefined;
}
crossAccountECRPolicy(stack, repoName) {
const id = `${stack.stackName}-${repoName}`;
const policy = ECRRepositoryAspect._repoPolicies.get(id);
if (policy) {
return policy;
}
const newPolicy = new aws_iam_1.Policy(stack, `CrossAccountECR-${repoName}`, {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'ecr:BatchCheckLayerAvailability',
'ecr:GetDownloadUrlForLayer',
'ecr:BatchGetImage',
],
resources: [
aws_cdk_lib_1.Arn.format({
account: this.account,
service: 'ecr',
resource: 'repository',
resourceName: repoName,
}, stack),
],
}),
],
});
ECRRepositoryAspect._repoPolicies.set(id, newPolicy);
return newPolicy;
}
}
exports.ECRRepositoryAspect = ECRRepositoryAspect;
_a = JSII_RTTI_SYMBOL_1;
ECRRepositoryAspect[_a] = { fqn: "cdk-bootstrapless-synthesizer.ECRRepositoryAspect", version: "2.3.2" };
/**
* @internal
*/
ECRRepositoryAspect._repoPolicies = new Map();
/**
* Process the image assets in ECS task definition
*/
class ECSTaskDefinition extends ECRRepositoryAspect {
constructor(props = {}) {
super(props);
}
hasBeReplaced(prop) {
if (typeof prop.image === 'object' && FN_SUB in prop.image &&
prop.image[FN_SUB].indexOf(this.account) > -1) {
return prop.image[FN_SUB];
}
else if (prop.image && prop.image && prop.image.indexOf(this.account) > -1) {
return prop.image;
}
return undefined;
}
visit(construct) {
if (construct instanceof aws_ecs_1.TaskDefinition) {
const containers = construct.stack.resolve(construct.node.defaultChild.containerDefinitions);
let imageUri = undefined;
if (containers instanceof Array) {
for (const container of containers) {
if (container) {
imageUri = this.hasBeReplaced(container);
if (imageUri) {
break;
}
}
}
}
else if (containers) {
imageUri = this.hasBeReplaced(containers);
}
if (imageUri) {
const repoName = this.getRepoName(imageUri);
if (repoName) {
construct.executionRole.attachInlinePolicy(this.crossAccountECRPolicy(construct.stack, repoName));
}
}
}
}
}
exports.ECSTaskDefinition = ECSTaskDefinition;
_b = JSII_RTTI_SYMBOL_1;
ECSTaskDefinition[_b] = { fqn: "cdk-bootstrapless-synthesizer.ECSTaskDefinition", version: "2.3.2" };
/**
* Process the image assets in SageMaker training job in Step Functions
*/
class StepFunctionsSageMakerTrainingJob extends ECRRepositoryAspect {
constructor(props = {}) {
super(props);
}
visit(construct) {
if (construct instanceof aws_stepfunctions_tasks_1.SageMakerCreateTrainingJob) {
const stack = aws_cdk_lib_1.Stack.of(construct);
const state = construct.toStateJson();
const image = stack.resolve(state.Parameters.AlgorithmSpecification.TrainingImage);
if (FN_SUB in image) {
const repoName = this.getRepoName(image[FN_SUB]);
if (repoName) {
construct.role.attachInlinePolicy(this.crossAccountECRPolicy(stack, repoName));
}
}
}
}
}
exports.StepFunctionsSageMakerTrainingJob = StepFunctionsSageMakerTrainingJob;
_c = JSII_RTTI_SYMBOL_1;
StepFunctionsSageMakerTrainingJob[_c] = { fqn: "cdk-bootstrapless-synthesizer.StepFunctionsSageMakerTrainingJob", version: "2.3.2" };
/**
* Process the image assets in AWS Batch job
*/
class BatchJobDefinition extends ECRRepositoryAspect {
constructor(props = {}) {
super(props);
this._repoNames = [];
this._allRolesMap = new Map();
}
visit(construct) {
if (construct instanceof batch.JobDefinition) {
const stack = construct.stack;
this._executionRoleArn = construct.node.defaultChild
.containerProperties.executionRoleArn;
if (this._executionRoleArn && this._allRolesMap.get(this._executionRoleArn)) {
this._executionRole = this._allRolesMap.get(this._executionRoleArn);
}
const image = construct.node.defaultChild
.containerProperties.image;
const image_resolved = stack.resolve(image);
if (FN_SUB in image_resolved) {
const repoName = this.getRepoName(image_resolved[FN_SUB]);
if (repoName) {
if (this._executionRole) {
this._executionRole.attachInlinePolicy(this.crossAccountECRPolicy(stack, repoName));
}
else {
if (this._repoNames.indexOf(repoName) < 0) {
this._repoNames.push(repoName);
}
}
}
}
}
if (construct instanceof aws_iam_1.Role) {
this._allRolesMap.set(construct.roleArn, construct);
if (construct.roleArn == this._executionRoleArn) {
const stack = construct.stack;
this._executionRole = construct;
while (this._repoNames.length > 0) {
const repoName = this._repoNames.pop();
if (repoName) {
this._executionRole.attachInlinePolicy(this.crossAccountECRPolicy(stack, repoName));
}
}
}
}
}
}
exports.BatchJobDefinition = BatchJobDefinition;
_d = JSII_RTTI_SYMBOL_1;
BatchJobDefinition[_d] = { fqn: "cdk-bootstrapless-synthesizer.BatchJobDefinition", version: "2.3.2" };
/**
* Default ECR asset aspect, support using ECR assets in below services,
*
* - ECS task definition
* - SageMaker training job in Step Functions
* - AWS Batch job
* - AWS Lambda container image
*/
class CompositeECRRepositoryAspect extends ECRRepositoryAspect {
constructor(props = {}) {
super(props);
this._aspects = [
new ECSTaskDefinition(props),
new StepFunctionsSageMakerTrainingJob(props),
new BatchJobDefinition(props),
];
}
visit(construct) {
for (const _aspect of this._aspects) {
_aspect.visit(construct);
}
}
}
exports.CompositeECRRepositoryAspect = CompositeECRRepositoryAspect;
_e = JSII_RTTI_SYMBOL_1;
CompositeECRRepositoryAspect[_e] = { fqn: "cdk-bootstrapless-synthesizer.CompositeECRRepositoryAspect", version: "2.3.2" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FzcGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUFrRDtBQUNsRCw2Q0FBa0Q7QUFFbEQsaURBQXdFO0FBQ3hFLGlEQUFvRTtBQUNwRSxpRkFBaUY7QUFHakYsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBYXpCOzs7O0dBSUc7QUFDSCxNQUFzQixtQkFBbUI7SUFRdkMsWUFBWSxRQUFrQyxFQUFFO1FBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTJCLENBQUM7SUFDdEYsQ0FBQztJQUlTLFdBQVcsQ0FBQyxRQUFnQjtRQUNwQyxNQUFNLE9BQU8sR0FBRyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsSUFBSSxPQUFPLEVBQUU7WUFDWCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxLQUFZLEVBQUUsUUFBZ0I7UUFDNUQsTUFBTSxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxNQUFNLEVBQUU7WUFDVixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxnQkFBTSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsUUFBUSxFQUFFLEVBQUU7WUFDakUsVUFBVSxFQUFFO2dCQUNWLElBQUkseUJBQWUsQ0FBQztvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLGlDQUFpQzt3QkFDakMsNEJBQTRCO3dCQUM1QixtQkFBbUI7cUJBQ3BCO29CQUNELFNBQVMsRUFBRTt3QkFDVCxpQkFBRyxDQUFDLE1BQU0sQ0FBQzs0QkFDVCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87NEJBQ3JCLE9BQU8sRUFBRSxLQUFLOzRCQUNkLFFBQVEsRUFBRSxZQUFZOzRCQUN0QixZQUFZLEVBQUUsUUFBUTt5QkFDdkIsRUFBRSxLQUFLLENBQUM7cUJBQ1Y7aUJBQ0YsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsbUJBQW1CLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzs7QUFsREgsa0RBbURDOzs7QUFqREM7O0dBRUc7QUFDYSxpQ0FBYSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0FBZ0Q1RDs7R0FFRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsbUJBQW1CO0lBRXhELFlBQVksUUFBa0MsRUFBRTtRQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRVMsYUFBYSxDQUFDLElBQW1EO1FBQ3pFLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUs7WUFDdkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSyxJQUFJLENBQUMsS0FBZ0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDeEYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ25CO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFxQjtRQUNoQyxJQUFJLFNBQVMsWUFBWSx3QkFBYyxFQUFFO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3BILElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUN6QixJQUFJLFVBQVUsWUFBWSxLQUFLLEVBQUU7Z0JBQy9CLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO29CQUNsQyxJQUFJLFNBQTBELEVBQUU7d0JBQzlELFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUN6QyxJQUFJLFFBQVEsRUFBRTs0QkFDWixNQUFNO3lCQUNQO3FCQUNGO2lCQUNGO2FBQ0Y7aUJBQU0sSUFBSSxVQUEyRCxFQUFFO2dCQUN0RSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMzQztZQUVELElBQUksUUFBUSxFQUFFO2dCQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVDLElBQUksUUFBUSxFQUFFO29CQUNaLFNBQVMsQ0FBQyxhQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDcEc7YUFDRjtTQUNGO0lBQ0gsQ0FBQzs7QUF4Q0gsOENBeUNDOzs7QUFFRDs7R0FFRztBQUNILE1BQWEsaUNBQWtDLFNBQVEsbUJBQW1CO0lBQ3hFLFlBQVksUUFBa0MsRUFBRTtRQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQXFCO1FBQ2hDLElBQUksU0FBUyxZQUFZLG9EQUEwQixFQUFFO1lBQ25ELE1BQU0sS0FBSyxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBTWxDLENBQUM7WUFDRixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkYsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFO2dCQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLFFBQVEsRUFBRTtvQkFDWixTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztpQkFDaEY7YUFDRjtTQUNGO0lBQ0gsQ0FBQzs7QUF2QkgsOEVBd0JDOzs7QUFHRDs7R0FFRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsbUJBQW1CO0lBU3pELFlBQVksUUFBa0MsRUFBRTtRQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFxQjtRQUNoQyxJQUFJLFNBQVMsWUFBWSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQzVDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBMkM7aUJBQ2xGLG1CQUE4RSxDQUFDLGdCQUFnQixDQUFDO1lBRW5HLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUMzRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ3JFO1lBQ0QsTUFBTSxLQUFLLEdBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxZQUEyQztpQkFDdkUsbUJBQThFLENBQUMsS0FBSyxDQUFDO1lBQ3hGLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsSUFBSSxNQUFNLElBQUksY0FBYyxFQUFFO2dCQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLFFBQVEsRUFBRTtvQkFDWixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7d0JBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO3FCQUNyRjt5QkFBTTt3QkFDTCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ2hDO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELElBQUksU0FBUyxZQUFZLGNBQUksRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3BELElBQUksU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQy9DLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO2dCQUNoQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDdkMsSUFBSSxRQUFRLEVBQUU7d0JBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7cUJBQ3JGO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7O0FBckRILGdEQXNEQzs7O0FBR0Q7Ozs7Ozs7R0FPRztBQUNILE1BQWEsNEJBQTZCLFNBQVEsbUJBQW1CO0lBT25FLFlBQVksUUFBa0MsRUFBRTtRQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7WUFDNUIsSUFBSSxpQ0FBaUMsQ0FBQyxLQUFLLENBQUM7WUFDNUMsSUFBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBcUI7UUFDekIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDMUI7SUFDSCxDQUFDOztBQXBCSCxvRUFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXRjaCBmcm9tICdAYXdzLWNkay9hd3MtYmF0Y2gtYWxwaGEnO1xuaW1wb3J0IHsgSUFzcGVjdCwgU3RhY2ssIEFybiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGJhdGNoX2xpYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmF0Y2gnO1xuaW1wb3J0IHsgVGFza0RlZmluaXRpb24sIENmblRhc2tEZWZpbml0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjcyc7XG5pbXBvcnQgeyBQb2xpY3ksIFBvbGljeVN0YXRlbWVudCwgUm9sZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgU2FnZU1ha2VyQ3JlYXRlVHJhaW5pbmdKb2IgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrcyc7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmNvbnN0IEZOX1NVQiA9ICdGbjo6U3ViJztcbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBFQ1JSZXBvc2l0b3J5QXNwZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRUNSUmVwb3NpdG9yeUFzcGVjdFByb3BzIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBFQ1IgcmVwb3NpdG9yeSBhY2NvdW50IGlkIG9mIHRoZSBEb2NrZXIgSW1hZ2UgYXNzZXRzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvY2Vzcy5lbnYuQlNTX0lNQUdFX0FTU0VUX0FDQ09VTlRfSURcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQXNzZXRBY2NvdW50SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJ0cmFjdCBhc3BlY3QgZm9yIEVDUiByZXBvc2l0b3J5LlxuICpcbiAqIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGFjY291bnQgaWQgaW4gcHJvcHMgb3Igc2V0IEJTU19JTUFHRV9BU1NFVF9BQ0NPVU5UX0lEIGluIGVudlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRUNSUmVwb3NpdG9yeUFzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBfcmVwb1BvbGljaWVzID0gbmV3IE1hcDxzdHJpbmcsIFBvbGljeT4oKTtcbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBFQ1JSZXBvc2l0b3J5QXNwZWN0UHJvcHMgPSB7fSkge1xuICAgIHRoaXMuYWNjb3VudCA9IHByb3BzLmltYWdlQXNzZXRBY2NvdW50SWQgPz8gcHJvY2Vzcy5lbnYuQlNTX0lNQUdFX0FTU0VUX0FDQ09VTlRfSUQhO1xuICB9XG5cbiAgYWJzdHJhY3QgdmlzaXQoY29uc3RydWN0OiBJQ29uc3RydWN0KTogdm9pZDtcblxuICBwcm90ZWN0ZWQgZ2V0UmVwb05hbWUoaW1hZ2VVcmk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IC9cXGR7MTJ9XFwuZGtyXFwuZWNyXFwuLipcXC8oLiopOi4qL2cuZXhlYyhpbWFnZVVyaSk7XG4gICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgIHJldHVybiBtYXRjaGVzWzFdO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyb3NzQWNjb3VudEVDUlBvbGljeShzdGFjazogU3RhY2ssIHJlcG9OYW1lOiBzdHJpbmcpOiBQb2xpY3kge1xuICAgIGNvbnN0IGlkID0gYCR7c3RhY2suc3RhY2tOYW1lfS0ke3JlcG9OYW1lfWA7XG4gICAgY29uc3QgcG9saWN5ID0gRUNSUmVwb3NpdG9yeUFzcGVjdC5fcmVwb1BvbGljaWVzLmdldChpZCk7XG4gICAgaWYgKHBvbGljeSkge1xuICAgICAgcmV0dXJuIHBvbGljeTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQb2xpY3kgPSBuZXcgUG9saWN5KHN0YWNrLCBgQ3Jvc3NBY2NvdW50RUNSLSR7cmVwb05hbWV9YCwge1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAnZWNyOkJhdGNoQ2hlY2tMYXllckF2YWlsYWJpbGl0eScsXG4gICAgICAgICAgICAnZWNyOkdldERvd25sb2FkVXJsRm9yTGF5ZXInLFxuICAgICAgICAgICAgJ2VjcjpCYXRjaEdldEltYWdlJyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgQXJuLmZvcm1hdCh7XG4gICAgICAgICAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgICAgICAgICAgc2VydmljZTogJ2VjcicsXG4gICAgICAgICAgICAgIHJlc291cmNlOiAncmVwb3NpdG9yeScsXG4gICAgICAgICAgICAgIHJlc291cmNlTmFtZTogcmVwb05hbWUsXG4gICAgICAgICAgICB9LCBzdGFjayksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIEVDUlJlcG9zaXRvcnlBc3BlY3QuX3JlcG9Qb2xpY2llcy5zZXQoaWQsIG5ld1BvbGljeSk7XG4gICAgcmV0dXJuIG5ld1BvbGljeTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2Nlc3MgdGhlIGltYWdlIGFzc2V0cyBpbiBFQ1MgdGFzayBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBFQ1NUYXNrRGVmaW5pdGlvbiBleHRlbmRzIEVDUlJlcG9zaXRvcnlBc3BlY3Qge1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBFQ1JSZXBvc2l0b3J5QXNwZWN0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYXNCZVJlcGxhY2VkKHByb3A6IENmblRhc2tEZWZpbml0aW9uLkNvbnRhaW5lckRlZmluaXRpb25Qcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBwcm9wLmltYWdlID09PSAnb2JqZWN0JyAmJiBGTl9TVUIgaW4gcHJvcC5pbWFnZSAmJlxuICAgICAgKHByb3AuaW1hZ2VbRk5fU1VCXSBhcyBzdHJpbmcpLmluZGV4T2YodGhpcy5hY2NvdW50KSA+IC0xKSB7XG4gICAgICByZXR1cm4gcHJvcC5pbWFnZVtGTl9TVUJdO1xuICAgIH0gZWxzZSBpZiAocHJvcC5pbWFnZSAmJiAocHJvcC5pbWFnZSBhcyBzdHJpbmcpICYmIHByb3AuaW1hZ2UuaW5kZXhPZih0aGlzLmFjY291bnQpID4gLTEpIHtcbiAgICAgIHJldHVybiBwcm9wLmltYWdlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHZpc2l0KGNvbnN0cnVjdDogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChjb25zdHJ1Y3QgaW5zdGFuY2VvZiBUYXNrRGVmaW5pdGlvbikge1xuICAgICAgY29uc3QgY29udGFpbmVycyA9IGNvbnN0cnVjdC5zdGFjay5yZXNvbHZlKChjb25zdHJ1Y3Qubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuVGFza0RlZmluaXRpb24pLmNvbnRhaW5lckRlZmluaXRpb25zKTtcbiAgICAgIGxldCBpbWFnZVVyaSA9IHVuZGVmaW5lZDtcbiAgICAgIGlmIChjb250YWluZXJzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250YWluZXIgb2YgY29udGFpbmVycykge1xuICAgICAgICAgIGlmIChjb250YWluZXIgYXMgQ2ZuVGFza0RlZmluaXRpb24uQ29udGFpbmVyRGVmaW5pdGlvblByb3BlcnR5KSB7XG4gICAgICAgICAgICBpbWFnZVVyaSA9IHRoaXMuaGFzQmVSZXBsYWNlZChjb250YWluZXIpO1xuICAgICAgICAgICAgaWYgKGltYWdlVXJpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb250YWluZXJzIGFzIENmblRhc2tEZWZpbml0aW9uLkNvbnRhaW5lckRlZmluaXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICBpbWFnZVVyaSA9IHRoaXMuaGFzQmVSZXBsYWNlZChjb250YWluZXJzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGltYWdlVXJpKSB7XG4gICAgICAgIGNvbnN0IHJlcG9OYW1lID0gdGhpcy5nZXRSZXBvTmFtZShpbWFnZVVyaSk7XG4gICAgICAgIGlmIChyZXBvTmFtZSkge1xuICAgICAgICAgIGNvbnN0cnVjdC5leGVjdXRpb25Sb2xlIS5hdHRhY2hJbmxpbmVQb2xpY3kodGhpcy5jcm9zc0FjY291bnRFQ1JQb2xpY3koY29uc3RydWN0LnN0YWNrLCByZXBvTmFtZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHJvY2VzcyB0aGUgaW1hZ2UgYXNzZXRzIGluIFNhZ2VNYWtlciB0cmFpbmluZyBqb2IgaW4gU3RlcCBGdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0ZXBGdW5jdGlvbnNTYWdlTWFrZXJUcmFpbmluZ0pvYiBleHRlbmRzIEVDUlJlcG9zaXRvcnlBc3BlY3Qge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogRUNSUmVwb3NpdG9yeUFzcGVjdFByb3BzID0ge30pIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgdmlzaXQoY29uc3RydWN0OiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKGNvbnN0cnVjdCBpbnN0YW5jZW9mIFNhZ2VNYWtlckNyZWF0ZVRyYWluaW5nSm9iKSB7XG4gICAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKGNvbnN0cnVjdCk7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNvbnN0cnVjdC50b1N0YXRlSnNvbigpIGFzIHtcbiAgICAgICAgUGFyYW1ldGVyczoge1xuICAgICAgICAgIEFsZ29yaXRobVNwZWNpZmljYXRpb246IHtcbiAgICAgICAgICAgIFRyYWluaW5nSW1hZ2U6IGFueTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGltYWdlID0gc3RhY2sucmVzb2x2ZShzdGF0ZS5QYXJhbWV0ZXJzLkFsZ29yaXRobVNwZWNpZmljYXRpb24uVHJhaW5pbmdJbWFnZSk7XG4gICAgICBpZiAoRk5fU1VCIGluIGltYWdlKSB7XG4gICAgICAgIGNvbnN0IHJlcG9OYW1lID0gdGhpcy5nZXRSZXBvTmFtZShpbWFnZVtGTl9TVUJdKTtcbiAgICAgICAgaWYgKHJlcG9OYW1lKSB7XG4gICAgICAgICAgY29uc3RydWN0LnJvbGUuYXR0YWNoSW5saW5lUG9saWN5KHRoaXMuY3Jvc3NBY2NvdW50RUNSUG9saWN5KHN0YWNrLCByZXBvTmFtZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSBpbWFnZSBhc3NldHMgaW4gQVdTIEJhdGNoIGpvYlxuICovXG5leHBvcnQgY2xhc3MgQmF0Y2hKb2JEZWZpbml0aW9uIGV4dGVuZHMgRUNSUmVwb3NpdG9yeUFzcGVjdCB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5IF9yZXBvTmFtZXM6IHN0cmluZ1tdO1xuICBwcml2YXRlIF9leGVjdXRpb25Sb2xlPzogUm9sZTtcbiAgcHJpdmF0ZSBfZXhlY3V0aW9uUm9sZUFybj86IHN0cmluZztcbiAgcHJpdmF0ZSBfYWxsUm9sZXNNYXA6IE1hcDxzdHJpbmcsIFJvbGU+O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBFQ1JSZXBvc2l0b3J5QXNwZWN0UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLl9yZXBvTmFtZXMgPSBbXTtcbiAgICB0aGlzLl9hbGxSb2xlc01hcCA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdChjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAoY29uc3RydWN0IGluc3RhbmNlb2YgYmF0Y2guSm9iRGVmaW5pdGlvbikge1xuICAgICAgY29uc3Qgc3RhY2sgPSBjb25zdHJ1Y3Quc3RhY2s7XG4gICAgICB0aGlzLl9leGVjdXRpb25Sb2xlQXJuID0gKChjb25zdHJ1Y3Qubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYmF0Y2hfbGliLkNmbkpvYkRlZmluaXRpb24pXG4gICAgICAgIC5jb250YWluZXJQcm9wZXJ0aWVzIGFzIGJhdGNoX2xpYi5DZm5Kb2JEZWZpbml0aW9uLkNvbnRhaW5lclByb3BlcnRpZXNQcm9wZXJ0eSkuZXhlY3V0aW9uUm9sZUFybjtcblxuICAgICAgaWYgKHRoaXMuX2V4ZWN1dGlvblJvbGVBcm4gJiYgdGhpcy5fYWxsUm9sZXNNYXAuZ2V0KHRoaXMuX2V4ZWN1dGlvblJvbGVBcm4pKSB7XG4gICAgICAgIHRoaXMuX2V4ZWN1dGlvblJvbGUgPSB0aGlzLl9hbGxSb2xlc01hcC5nZXQodGhpcy5fZXhlY3V0aW9uUm9sZUFybik7XG4gICAgICB9XG4gICAgICBjb25zdCBpbWFnZSA9ICgoY29uc3RydWN0Lm5vZGUuZGVmYXVsdENoaWxkIGFzIGJhdGNoX2xpYi5DZm5Kb2JEZWZpbml0aW9uKVxuICAgICAgICAuY29udGFpbmVyUHJvcGVydGllcyBhcyBiYXRjaF9saWIuQ2ZuSm9iRGVmaW5pdGlvbi5Db250YWluZXJQcm9wZXJ0aWVzUHJvcGVydHkpLmltYWdlO1xuICAgICAgY29uc3QgaW1hZ2VfcmVzb2x2ZWQgPSBzdGFjay5yZXNvbHZlKGltYWdlKTtcbiAgICAgIGlmIChGTl9TVUIgaW4gaW1hZ2VfcmVzb2x2ZWQpIHtcbiAgICAgICAgY29uc3QgcmVwb05hbWUgPSB0aGlzLmdldFJlcG9OYW1lKGltYWdlX3Jlc29sdmVkW0ZOX1NVQl0pO1xuICAgICAgICBpZiAocmVwb05hbWUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fZXhlY3V0aW9uUm9sZSkge1xuICAgICAgICAgICAgdGhpcy5fZXhlY3V0aW9uUm9sZS5hdHRhY2hJbmxpbmVQb2xpY3kodGhpcy5jcm9zc0FjY291bnRFQ1JQb2xpY3koc3RhY2ssIHJlcG9OYW1lKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXBvTmFtZXMuaW5kZXhPZihyZXBvTmFtZSkgPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3JlcG9OYW1lcy5wdXNoKHJlcG9OYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbnN0cnVjdCBpbnN0YW5jZW9mIFJvbGUpIHtcbiAgICAgIHRoaXMuX2FsbFJvbGVzTWFwLnNldChjb25zdHJ1Y3Qucm9sZUFybiwgY29uc3RydWN0KTtcbiAgICAgIGlmIChjb25zdHJ1Y3Qucm9sZUFybiA9PSB0aGlzLl9leGVjdXRpb25Sb2xlQXJuKSB7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gY29uc3RydWN0LnN0YWNrO1xuICAgICAgICB0aGlzLl9leGVjdXRpb25Sb2xlID0gY29uc3RydWN0O1xuICAgICAgICB3aGlsZSAodGhpcy5fcmVwb05hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCByZXBvTmFtZSA9IHRoaXMuX3JlcG9OYW1lcy5wb3AoKTtcbiAgICAgICAgICBpZiAocmVwb05hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4ZWN1dGlvblJvbGUuYXR0YWNoSW5saW5lUG9saWN5KHRoaXMuY3Jvc3NBY2NvdW50RUNSUG9saWN5KHN0YWNrLCByZXBvTmFtZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cbi8qKlxuICogRGVmYXVsdCBFQ1IgYXNzZXQgYXNwZWN0LCBzdXBwb3J0IHVzaW5nIEVDUiBhc3NldHMgaW4gYmVsb3cgc2VydmljZXMsXG4gKlxuICogLSBFQ1MgdGFzayBkZWZpbml0aW9uXG4gKiAtIFNhZ2VNYWtlciB0cmFpbmluZyBqb2IgaW4gU3RlcCBGdW5jdGlvbnNcbiAqIC0gQVdTIEJhdGNoIGpvYlxuICogLSBBV1MgTGFtYmRhIGNvbnRhaW5lciBpbWFnZVxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlRUNSUmVwb3NpdG9yeUFzcGVjdCBleHRlbmRzIEVDUlJlcG9zaXRvcnlBc3BlY3Qge1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5IF9hc3BlY3RzOiBFQ1JSZXBvc2l0b3J5QXNwZWN0W107XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEVDUlJlcG9zaXRvcnlBc3BlY3RQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuX2FzcGVjdHMgPSBbXG4gICAgICBuZXcgRUNTVGFza0RlZmluaXRpb24ocHJvcHMpLFxuICAgICAgbmV3IFN0ZXBGdW5jdGlvbnNTYWdlTWFrZXJUcmFpbmluZ0pvYihwcm9wcyksXG4gICAgICBuZXcgQmF0Y2hKb2JEZWZpbml0aW9uKHByb3BzKSxcbiAgICBdO1xuICB9XG5cbiAgdmlzaXQoY29uc3RydWN0OiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBfYXNwZWN0IG9mIHRoaXMuX2FzcGVjdHMpIHtcbiAgICAgIF9hc3BlY3QudmlzaXQoY29uc3RydWN0KTtcbiAgICB9XG4gIH1cbn0iXX0=