UNPKG

@gammarers/aws-codepipeline-execution-state-change-notification-stack

Version:

This AWS CDK Construct Stack receives all state changes of CodePipeline and sends a message to the specified notification destination when the CodePipeline is tagged with a specified tag. Therefore, you can send messages simply by adding tags without need

162 lines 32.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NotificationStateMachine = void 0; const aws_cdk_lib_1 = require("aws-cdk-lib"); const sfn = require("aws-cdk-lib/aws-stepfunctions"); const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks"); class NotificationStateMachine extends sfn.StateMachine { constructor(scope, id, props) { super(scope, id, { ...props, definitionBody: (() => { // 👇 Get Account const account = aws_cdk_lib_1.Stack.of(scope).account; const initDefinition = new sfn.Pass(scope, 'InitDefinition', { resultPath: '$.Definition', parameters: { StateEmojis: [ { name: 'STARTED', emoji: '🥳' }, { name: 'SUCCEEDED', emoji: '🤩' }, { name: 'RESUMED', emoji: '🤔' }, { name: 'FAILED', emoji: '😫' }, { name: 'STOPPING', emoji: '😮' }, { name: 'STOPPED', emoji: '😌' }, { name: 'SUPERSEDED', emoji: '🧐' }, ], StateColors: [ { name: 'STARTED', color: '#00bfff' }, { name: 'SUCCEEDED', color: '#36a64f' }, { name: 'RESUMED', color: '#87cefa' }, { name: 'FAILED', color: '#ff0000' }, { name: 'STOPPING', color: '#ffff00' }, { name: 'STOPPED', color: '#ffd700' }, { name: 'SUPERSEDED', color: '#ffa500' }, ], }, }); const succeed = new sfn.Succeed(scope, 'Succeed'); // describe pipeline const getPipeline = new tasks.CallAwsService(scope, 'GetPipeline', { iamResources: [`arn:aws:codepipeline:*:${account}:*`], service: 'codepipeline', action: 'getPipeline', parameters: { Name: sfn.JsonPath.stringAt('$.event.detail.pipeline'), }, resultPath: '$.Result.Pipeline', resultSelector: { Arn: sfn.JsonPath.stringAt('$.Metadata.PipelineArn'), }, }); initDefinition.next(getPipeline); // 👇 Get Resources from resource arn list const getResourceTagMappingList = new tasks.CallAwsService(scope, 'GetResourceTagMappingList', { service: 'resourcegroupstaggingapi', action: 'getResources', parameters: { // ResourceARNList: sfn.JsonPath.listAt('$.resources'), ResourceTypeFilters: ['codepipeline:pipeline'], // ResourceTypeFilters is not allowed when providing a ResourceARNList TagFilters: [ { Key: sfn.JsonPath.stringAt('$.params.tagKey'), Values: sfn.JsonPath.stringAt('$.params.tagValues'), }, ], // TagFilters is not allowed when providing a ResourceARNList }, iamAction: 'tag:GetResources', iamResources: ['*'], resultPath: '$.Result.GetMatchTagResource', resultSelector: { Arns: sfn.JsonPath.stringAt('$..ResourceTagMappingList[*].ResourceARN'), }, }); // getTags.addCatch() getPipeline.next(getResourceTagMappingList); // 👇 Is in const checkTagFilterArnsContain = new sfn.Pass(scope, 'CheckTagFilterArnsContain', { parameters: { Is: sfn.JsonPath.arrayContains(sfn.JsonPath.stringAt('$.Result.GetMatchTagResource.Arns'), sfn.JsonPath.stringAt('$.Result.Pipeline.Arn')), }, resultPath: '$.Result.TagFilterArnsContain', }); getResourceTagMappingList.next(checkTagFilterArnsContain); // 👇 Create pipeline URL const generatePipelineUrl = new sfn.Pass(scope, 'GeneratePipelineUrl', { resultPath: '$.Generate.PipelineUrl', parameters: { Value: sfn.JsonPath.format('https://{}.console.aws.amazon.com/codesuite/codepipeline/pipelines/{}/view?region={}', sfn.JsonPath.stringAt('$.event.region'), sfn.JsonPath.stringAt('$.event.detail.pipeline'), sfn.JsonPath.stringAt('$.event.region')), }, }); const generateMessage = new sfn.Pass(scope, 'GenerateMessage', { resultPath: '$.Generate.Message', parameters: { Subject: sfn.JsonPath.format('{} [{}] AWS CodePipeline Pipeline Execution State Notification [{}][{}]', sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringAt('$.Definition.StateEmojis[?(@.name == $.event.detail.state)].emoji'), 0), sfn.JsonPath.stringAt('$.event.detail.state'), sfn.JsonPath.stringAt('$.event.account'), sfn.JsonPath.stringAt('$.event.region')), TextBody: sfn.JsonPath.format('Account : {}\nRegion : {}\nPipeline : {}\nState : {}\nTime : {}\nURL : {}\n', sfn.JsonPath.stringAt('$.event.account'), sfn.JsonPath.stringAt('$.event.region'), sfn.JsonPath.stringAt('$.event.detail.pipeline'), sfn.JsonPath.stringAt('$.event.detail.state'), sfn.JsonPath.stringAt('$.event.time'), sfn.JsonPath.stringAt('$.Generate.PipelineUrl.Value')), SlackJsonBody: { attachments: [ { color: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringAt('$.Definition.StateColors[?(@.name == $.event.detail.state)].color'), 0), // pretext: sfn.JsonPath.format('😴 Successfully stopped the automatically running RDS {} {}.', pretext: sfn.JsonPath.format('{} Pipeline {} state changed to {}', sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringAt('$.Definition.StateEmojis[?(@.name == $.event.detail.state)].emoji'), 0), sfn.JsonPath.stringAt('$.event.detail.pipeline'), sfn.JsonPath.stringAt('$.event.detail.state')), fields: [ { title: 'Account', value: sfn.JsonPath.stringAt('$.event.account'), short: true, }, { title: 'Region', value: sfn.JsonPath.stringAt('$.event.region'), short: true, }, { title: 'Pipeline', value: sfn.JsonPath.stringAt('$.event.detail.pipeline'), short: true, }, { title: 'State', value: sfn.JsonPath.stringAt('$.event.detail.state'), short: true, }, { title: 'Time', value: sfn.JsonPath.stringAt('$.event.time'), short: true, }, ], }, ], }, }, }); generatePipelineUrl.next(generateMessage); // 👇 Choice state for message const checkPipelineStateMatch = new sfn.Choice(scope, 'CheckPipelineStateMatch') .when(sfn.Condition.or(sfn.Condition.stringEquals('$.event.detail.state', 'STARTED'), sfn.Condition.stringEquals('$.event.detail.state', 'SUCCEEDED'), sfn.Condition.stringEquals('$.event.detail.state', 'RESUMED'), sfn.Condition.stringEquals('$.event.detail.state', 'FAILED'), sfn.Condition.stringEquals('$.event.detail.state', 'STOPPING'), sfn.Condition.stringEquals('$.event.detail.state', 'STOPPED'), sfn.Condition.stringEquals('$.event.detail.state', 'SUPERSEDED')), generatePipelineUrl) .otherwise(new sfn.Pass(scope, 'UnMatchStatus')); const checkFoundTagMatch = new sfn.Choice(scope, 'CheckFoundTagMatch') .when(sfn.Condition.booleanEquals('$.Result.TagFilterArnsContain.Is', true), checkPipelineStateMatch) .otherwise(new sfn.Pass(scope, 'UnMatchPipelineTagFilter')); checkTagFilterArnsContain.next(checkFoundTagMatch); // 👇 Send notification task const sendNotification = new tasks.SnsPublish(scope, 'SendNotification', { topic: props.notificationTopic, subject: sfn.JsonPath.stringAt('$.Generate.Message.Subject'), message: sfn.TaskInput.fromObject({ default: sfn.JsonPath.stringAt('$.Generate.Message.TextBody'), email: sfn.JsonPath.stringAt('$.Generate.Message.TextBody'), lambda: sfn.JsonPath.jsonToString(sfn.JsonPath.objectAt('$.Generate.Message.SlackJsonBody')), }), messagePerSubscriptionType: true, resultPath: '$.snsResult', }); generateMessage.next(sendNotification); sendNotification.next(succeed); return sfn.DefinitionBody.fromChainable(initDefinition); })(), }); } } exports.NotificationStateMachine = NotificationStateMachine; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLXN0YXRlLW1hY2hpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVzb3VyY2VzL25vdGlmaWNhdGlvbi1zdGF0ZS1tYWNoaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFvQztBQUVwQyxxREFBcUQ7QUFDckQsNkRBQTZEO0FBTzdELE1BQWEsd0JBQXlCLFNBQVEsR0FBRyxDQUFDLFlBQVk7SUFDNUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQztRQUM1RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBRTtnQkFFcEIsaUJBQWlCO2dCQUNqQixNQUFNLE9BQU8sR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBRXhDLE1BQU0sY0FBYyxHQUFhLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUU7b0JBQ3JFLFVBQVUsRUFBRSxjQUFjO29CQUMxQixVQUFVLEVBQUU7d0JBQ1YsV0FBVyxFQUFFOzRCQUNYLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFOzRCQUNoQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTs0QkFDbEMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7NEJBQ2hDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFOzRCQUMvQixFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTs0QkFDakMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7NEJBQ2hDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFB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QUNGLDBCQUEwQixFQUFFLElBQUk7b0JBQ2hDLFVBQVUsRUFBRSxhQUFhO2lCQUMxQixDQUFDLENBQUM7Z0JBRUgsZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUV2QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9CLE9BQU8sR0FBRyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFMUQsQ0FBQyxDQUFDLEVBQUU7U0FDTCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF4TUQsNERBd01DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzZm4gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMnO1xuaW1wb3J0ICogYXMgdGFza3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uU3RhdGVNYWNoaW5lUHJvcHMgZXh0ZW5kcyBzZm4uU3RhdGVNYWNoaW5lUHJvcHMge1xuICBub3RpZmljYXRpb25Ub3BpYzogc25zLklUb3BpYztcbn1cblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblN0YXRlTWFjaGluZSBleHRlbmRzIHNmbi5TdGF0ZU1hY2hpbmUge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTm90aWZpY2F0aW9uU3RhdGVNYWNoaW5lUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGVmaW5pdGlvbkJvZHk6ICgoKSA9PiB7XG5cbiAgICAgICAgLy8g8J+RhyBHZXQgQWNjb3VudFxuICAgICAgICBjb25zdCBhY2NvdW50ID0gU3RhY2sub2Yoc2NvcGUpLmFjY291bnQ7XG5cbiAgICAgICAgY29uc3QgaW5pdERlZmluaXRpb246IHNmbi5QYXNzID0gbmV3IHNmbi5QYXNzKHNjb3BlLCAnSW5pdERlZmluaXRpb24nLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuRGVmaW5pdGlvbicsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgU3RhdGVFbW9qaXM6IFtcbiAgICAgICAgICAgICAgeyBuYW1lOiAnU1RBUlRFRCcsIGVtb2ppOiAn8J+lsycgfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiAnU1VDQ0VFREVEJywgZW1vamk6ICfwn6SpJyB9LFxuICAgICAgICAgICAgICB7IG5hbWU6ICdSRVNVTUVEJywgZW1vamk6ICfwn6SUJyB9LFxuICAgICAgICAgICAgICB7IG5hbWU6ICdGQUlMRUQnLCBlbW9qaTogJ/CfmKsnIH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogJ1NUT1BQSU5HJywgZW1vamk6ICfwn5iuJyB9LFxuICAgICAgICAgICAgICB7IG5hbWU6ICdTVE9QUEVEJywgZW1vamk6ICfwn5iMJyB9LFxuICAgICAgICAgICAgICB7IG5hbWU6ICdTVVBFUlNFREVEJywgZW1vamk6ICfwn6eQJyB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFN0YXRlQ29sb3JzOiBbXG4gICAgICAgICAgICAgIHsgbmFtZTogJ1NUQVJURUQnLCBjb2xvcjogJyMwMGJmZmYnIH0sXG4gICAgICAgICAgICAgIHsgbmFtZTogJ1NVQ0NFRURFRCcsIGNvbG9yOiAnIzM2YTY0ZicgfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiAnUkVTVU1FRCcsIGNvbG9yOiAnIzg3Y2VmYScgfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiAnRkFJTEVEJywgY29sb3I6ICcjZmYwMDAwJyB9LFxuICAgICAgICAgICAgICB7IG5hbWU6ICdTVE9QUElORycsIGNvbG9yOiAnI2ZmZmYwMCcgfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiAnU1RPUFBFRCcsIGNvbG9yOiAnI2ZmZDcwMCcgfSxcbiAgICAgICAgICAgICAgeyBuYW1lOiAnU1VQRVJTRURFRCcsIGNvbG9yOiAnI2ZmYTUwMCcgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3VjY2VlZDogc2ZuLlN1Y2NlZWQgPSBuZXcgc2ZuLlN1Y2NlZWQoc2NvcGUsICdTdWNjZWVkJyk7XG5cbiAgICAgICAgLy8gZGVzY3JpYmUgcGlwZWxpbmVcbiAgICAgICAgY29uc3QgZ2V0UGlwZWxpbmUgPSBuZXcgdGFza3MuQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdHZXRQaXBlbGluZScsIHtcbiAgICAgICAgICBpYW1SZXNvdXJjZXM6IFtgYXJuOmF3czpjb2RlcGlwZWxpbmU6Kjoke2FjY291bnR9OipgXSxcbiAgICAgICAgICBzZXJ2aWNlOiAnY29kZXBpcGVsaW5lJyxcbiAgICAgICAgICBhY3Rpb246ICdnZXRQaXBlbGluZScsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgTmFtZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLmV2ZW50LmRldGFpbC5waXBlbGluZScpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuUmVzdWx0LlBpcGVsaW5lJyxcbiAgICAgICAgICByZXN1bHRTZWxlY3Rvcjoge1xuICAgICAgICAgICAgQXJuOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuTWV0YWRhdGEuUGlwZWxpbmVBcm4nKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgaW5pdERlZmluaXRpb24ubmV4dChnZXRQaXBlbGluZSk7XG5cbiAgICAgICAgLy8g8J+RhyBHZXQgUmVzb3VyY2VzIGZyb20gcmVzb3VyY2UgYXJuIGxpc3RcbiAgICAgICAgY29uc3QgZ2V0UmVzb3VyY2VUYWdNYXBwaW5nTGlzdDogdGFza3MuQ2FsbEF3c1NlcnZpY2UgPSBuZXcgdGFza3MuQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdHZXRSZXNvdXJjZVRhZ01hcHBpbmdMaXN0Jywge1xuICAgICAgICAgIHNlcnZpY2U6ICdyZXNvdXJjZWdyb3Vwc3RhZ2dpbmdhcGknLFxuICAgICAgICAgIGFjdGlvbjogJ2dldFJlc291cmNlcycsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgLy8gUmVzb3VyY2VBUk5MaXN0OiBzZm4uSnNvblBhdGgubGlzdEF0KCckLnJlc291cmNlcycpLFxuICAgICAgICAgICAgUmVzb3VyY2VUeXBlRmlsdGVyczogWydjb2RlcGlwZWxpbmU6cGlwZWxpbmUnXSwgLy8gUmVzb3VyY2VUeXBlRmlsdGVycyBpcyBub3QgYWxsb3dlZCB3aGVuIHByb3ZpZGluZyBhIFJlc291cmNlQVJOTGlzdFxuICAgICAgICAgICAgVGFnRmlsdGVyczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgS2V5OiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQucGFyYW1zLnRhZ0tleScpLFxuICAgICAgICAgICAgICAgIFZhbHVlczogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLnBhcmFtcy50YWdWYWx1ZXMnKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sIC8vIFRhZ0ZpbHRlcnMgaXMgbm90IGFsbG93ZWQgd2hlbiBwcm92aWRpbmcgYSBSZXNvdXJjZUFSTkxpc3RcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlhbUFjdGlvbjogJ3RhZzpHZXRSZXNvdXJjZXMnLFxuICAgICAgICAgIGlhbVJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuUmVzdWx0LkdldE1hdGNoVGFnUmVzb3VyY2UnLFxuICAgICAgICAgIHJlc3VsdFNlbGVjdG9yOiB7XG4gICAgICAgICAgICBBcm5zOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuLlJlc291cmNlVGFnTWFwcGluZ0xpc3RbKl0uUmVzb3VyY2VBUk4nKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZ2V0VGFncy5hZGRDYXRjaCgpXG4gICAgICAgIGdldFBpcGVsaW5lLm5leHQoZ2V0UmVzb3VyY2VUYWdNYXBwaW5nTGlzdCk7XG5cbiAgICAgICAgLy8g8J+RhyBJcyBpblxuICAgICAgICBjb25zdCBjaGVja1RhZ0ZpbHRlckFybnNDb250YWluOiBzZm4uUGFzcyA9IG5ldyBzZm4uUGFzcyhzY29wZSwgJ0NoZWNrVGFnRmlsdGVyQXJuc0NvbnRhaW4nLCB7XG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgSXM6IHNmbi5Kc29uUGF0aC5hcnJheUNvbnRhaW5zKHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQuR2V0TWF0Y2hUYWdSZXNvdXJjZS5Bcm5zJyksIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQuUGlwZWxpbmUuQXJuJykpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuUmVzdWx0LlRhZ0ZpbHRlckFybnNDb250YWluJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ2V0UmVzb3VyY2VUYWdNYXBwaW5nTGlzdC5uZXh0KGNoZWNrVGFnRmlsdGVyQXJuc0NvbnRhaW4pO1xuXG4gICAgICAgIC8vIPCfkYcgQ3JlYXRlIHBpcGVsaW5lIFVSTFxuICAgICAgICBjb25zdCBnZW5lcmF0ZVBpcGVsaW5lVXJsID0gbmV3IHNmbi5QYXNzKHNjb3BlLCAnR2VuZXJhdGVQaXBlbGluZVVybCcsIHtcbiAgICAgICAgICByZXN1bHRQYXRoOiAnJC5HZW5lcmF0ZS5QaXBlbGluZVVybCcsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgVmFsdWU6IHNmbi5Kc29uUGF0aC5mb3JtYXQoJ2h0dHBzOi8ve30uY29uc29sZS5hd3MuYW1hem9uLmNvbS9jb2Rlc3VpdGUvY29kZXBpcGVsaW5lL3BpcGVsaW5lcy97fS92aWV3P3JlZ2lvbj17fScsXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5ldmVudC5yZWdpb24nKSxcbiAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLmV2ZW50LmRldGFpbC5waXBlbGluZScpLFxuICAgICAgICAgICAgICBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQucmVnaW9uJyksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlTWVzc2FnZSA9IG5ldyBzZm4uUGFzcyhzY29wZSwgJ0dlbmVyYXRlTWVzc2FnZScsIHtcbiAgICAgICAgICByZXN1bHRQYXRoOiAnJC5HZW5lcmF0ZS5NZXNzYWdlJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBTdWJqZWN0OiBzZm4uSnNvblBhdGguZm9ybWF0KCd7fSBbe31dIEFXUyBDb2RlUGlwZWxpbmUgUGlwZWxpbmUgRXhlY3V0aW9uIFN0YXRlIE5vdGlmaWNhdGlvbiBbe31dW3t9XScsXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5hcnJheUdldEl0ZW0oc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLkRlZmluaXRpb24uU3RhdGVFbW9qaXNbPyhALm5hbWUgPT0gJC5ldmVudC5kZXRhaWwuc3RhdGUpXS5lbW9qaScpLCAwKSxcbiAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLmV2ZW50LmRldGFpbC5zdGF0ZScpLFxuICAgICAgICAgICAgICBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQuYWNjb3VudCcpLFxuICAgICAgICAgICAgICBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQucmVnaW9uJyksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgVGV4dEJvZHk6IHNmbi5Kc29uUGF0aC5mb3JtYXQoJ0FjY291bnQgOiB7fVxcblJlZ2lvbiA6IHt9XFxuUGlwZWxpbmUgOiB7fVxcblN0YXRlIDoge31cXG5UaW1lIDoge31cXG5VUkwgOiB7fVxcbicsXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5ldmVudC5hY2NvdW50JyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5ldmVudC5yZWdpb24nKSxcbiAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLmV2ZW50LmRldGFpbC5waXBlbGluZScpLFxuICAgICAgICAgICAgICBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQuZGV0YWlsLnN0YXRlJyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5ldmVudC50aW1lJyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5HZW5lcmF0ZS5QaXBlbGluZVVybC5WYWx1ZScpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFNsYWNrSnNvbkJvZHk6IHtcbiAgICAgICAgICAgICAgYXR0YWNobWVudHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBjb2xvcjogc2ZuLkpzb25QYXRoLmFycmF5R2V0SXRlbShzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuRGVmaW5pdGlvbi5TdGF0ZUNvbG9yc1s/KEAubmFtZSA9PSAkLmV2ZW50LmRldGFpbC5zdGF0ZSldLmNvbG9yJyksIDApLFxuICAgICAgICAgICAgICAgICAgLy8gcHJldGV4dDogc2ZuLkpzb25QYXRoLmZvcm1hdCgn8J+YtCBTdWNjZXNzZnVsbHkgc3RvcHBlZCB0aGUgYXV0b21hdGljYWxseSBydW5uaW5nIFJEUyB7fSB7fS4nLFxuICAgICAgICAgICAgICAgICAgcHJldGV4dDogc2ZuLkpzb25QYXRoLmZvcm1hdCgne30gUGlwZWxpbmUge30gc3RhdGUgY2hhbmdlZCB0byB7fScsXG4gICAgICAgICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5hcnJheUdldEl0ZW0oc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLkRlZmluaXRpb24uU3RhdGVFbW9qaXNbPyhALm5hbWUgPT0gJC5ldmVudC5kZXRhaWwuc3RhdGUpXS5lbW9qaScpLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLmV2ZW50LmRldGFpbC5waXBlbGluZScpLFxuICAgICAgICAgICAgICAgICAgICBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQuZGV0YWlsLnN0YXRlJyksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0FjY291bnQnLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQuYWNjb3VudCcpLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdSZWdpb24nLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZXZlbnQucmVnaW9uJyksXG4gICAgICAgICAgICAgICAgICAgICAgc2hvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1BpcGVsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLmV2ZW50LmRldGFpbC5waXBlbGluZScpLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdTdGF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5ldmVudC5kZXRhaWwuc3RhdGUnKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnVGltZScsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5ldmVudC50aW1lJyksXG4gICAgICAgICAgICAgICAgICAgICAgc2hvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBnZW5lcmF0ZVBpcGVsaW5lVXJsLm5leHQoZ2VuZXJhdGVNZXNzYWdlKTtcblxuICAgICAgICAvLyDwn5GHIENob2ljZSBzdGF0ZSBmb3IgbWVzc2FnZVxuICAgICAgICBjb25zdCBjaGVja1BpcGVsaW5lU3RhdGVNYXRjaDogc2ZuLkNob2ljZSA9IG5ldyBzZm4uQ2hvaWNlKHNjb3BlLCAnQ2hlY2tQaXBlbGluZVN0YXRlTWF0Y2gnKVxuICAgICAgICAgIC53aGVuKFxuICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5vcihcbiAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuZXZlbnQuZGV0YWlsLnN0YXRlJywgJ1NUQVJURUQnKSxcbiAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuZXZlbnQuZGV0YWlsLnN0YXRlJywgJ1NVQ0NFRURFRCcpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5ldmVudC5kZXRhaWwuc3RhdGUnLCAnUkVTVU1FRCcpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5ldmVudC5kZXRhaWwuc3RhdGUnLCAnRkFJTEVEJyksXG4gICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLmV2ZW50LmRldGFpbC5zdGF0ZScsICdTVE9QUElORycpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5ldmVudC5kZXRhaWwuc3RhdGUnLCAnU1RPUFBFRCcpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5ldmVudC5kZXRhaWwuc3RhdGUnLCAnU1VQRVJTRURFRCcpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGdlbmVyYXRlUGlwZWxpbmVVcmwsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vdGhlcndpc2UobmV3IHNmbi5QYXNzKHNjb3BlLCAnVW5NYXRjaFN0YXR1cycpKTtcblxuICAgICAgICBjb25zdCBjaGVja0ZvdW5kVGFnTWF0Y2ggPSBuZXcgc2ZuLkNob2ljZShzY29wZSwgJ0NoZWNrRm91bmRUYWdNYXRjaCcpXG4gICAgICAgICAgLndoZW4oc2ZuLkNvbmRpdGlvbi5ib29sZWFuRXF1YWxzKCckLlJlc3VsdC5UYWdGaWx0ZXJBcm5zQ29udGFpbi5JcycsIHRydWUpLCBjaGVja1BpcGVsaW5lU3RhdGVNYXRjaClcbiAgICAgICAgICAub3RoZXJ3aXNlKG5ldyBzZm4uUGFzcyhzY29wZSwgJ1VuTWF0Y2hQaXBlbGluZVRhZ0ZpbHRlcicpKTtcblxuICAgICAgICBjaGVja1RhZ0ZpbHRlckFybnNDb250YWluLm5leHQoY2hlY2tGb3VuZFRhZ01hdGNoKTtcblxuICAgICAgICAvLyDwn5GHIFNlbmQgbm90aWZpY2F0aW9uIHRhc2tcbiAgICAgICAgY29uc3Qgc2VuZE5vdGlmaWNhdGlvbjogdGFza3MuU25zUHVibGlzaCA9IG5ldyB0YXNrcy5TbnNQdWJsaXNoKHNjb3BlLCAnU2VuZE5vdGlmaWNhdGlvbicsIHtcbiAgICAgICAgICB0b3BpYzogcHJvcHMubm90aWZpY2F0aW9uVG9waWMsXG4gICAgICAgICAgc3ViamVjdDogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLkdlbmVyYXRlLk1lc3NhZ2UuU3ViamVjdCcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHNmbi5UYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICAgICBkZWZhdWx0OiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuR2VuZXJhdGUuTWVzc2FnZS5UZXh0Qm9keScpLFxuICAgICAgICAgICAgZW1haWw6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5HZW5lcmF0ZS5NZXNzYWdlLlRleHRCb2R5JyksXG4gICAgICAgICAgICBsYW1iZGE6IHNmbi5Kc29uUGF0aC5qc29uVG9TdHJpbmcoc2ZuLkpzb25QYXRoLm9iamVjdEF0KCckLkdlbmVyYXRlLk1lc3NhZ2UuU2xhY2tKc29uQm9keScpKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtZXNzYWdlUGVyU3Vic2NyaXB0aW9uVHlwZTogdHJ1ZSxcbiAgICAgICAgICByZXN1bHRQYXRoOiAnJC5zbnNSZXN1bHQnLFxuICAgICAgICB9KTtcblxuICAgICAgICBnZW5lcmF0ZU1lc3NhZ2UubmV4dChzZW5kTm90aWZpY2F0aW9uKTtcblxuICAgICAgICBzZW5kTm90aWZpY2F0aW9uLm5leHQoc3VjY2VlZCk7XG4gICAgICAgIHJldHVybiBzZm4uRGVmaW5pdGlvbkJvZHkuZnJvbUNoYWluYWJsZShpbml0RGVmaW5pdGlvbik7XG5cbiAgICAgIH0pKCksXG4gICAgfSk7XG4gIH1cbn0iXX0=