UNPKG

raindancers-network

Version:
132 lines 20.4 kB
"use strict"; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); exports.ConditionalForwarder = exports.R53Resolverendpoints = exports.ResolverDirection = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs = require("constructs"); /** * Direction of Resolver */ var ResolverDirection; (function (ResolverDirection) { /** * Resolver is Inbound */ ResolverDirection["INBOUND"] = "inbound"; /** * Resolver is outbound */ ResolverDirection["OUTBOUND"] = "outbound"; })(ResolverDirection = exports.ResolverDirection || (exports.ResolverDirection = {})); /** * Create Route53 Resolver Endpoints for MultiVPC and Hybrid DNS Resolution. */ class R53Resolverendpoints extends constructs.Construct { /** * * @param scope the scope in which these resources are craeted * @param id the id of the construct * @param props propertys for the R53Resolver Endpoints */ constructor(scope, id, props) { super(scope, id); // create inbound and outbound resolvers const dnsipAddresses = []; const selection = props.vpc.selectSubnets({ subnetGroupName: props.subnetGroup }); for (const subnetId of selection.subnetIds) { dnsipAddresses.push({ subnetId: subnetId }); } // create a security group for the route resolvers. const dnsSecurityGroup = new aws_cdk_lib_1.aws_ec2.SecurityGroup(this, 'DNSSecurityGroup', { vpc: props.vpc, allowAllOutbound: false, }); dnsSecurityGroup.addEgressRule(aws_cdk_lib_1.aws_ec2.Peer.anyIpv4(), aws_cdk_lib_1.aws_ec2.Port.udp(53)); dnsSecurityGroup.addIngressRule(aws_cdk_lib_1.aws_ec2.Peer.anyIpv4(), aws_cdk_lib_1.aws_ec2.Port.udp(53)); const outBoundResolver = new aws_cdk_lib_1.aws_route53resolver.CfnResolverEndpoint(this, 'OutboundResolver', { direction: ResolverDirection.OUTBOUND, ipAddresses: dnsipAddresses, securityGroupIds: [dnsSecurityGroup.securityGroupId], name: 'OutboundRouteResolver ', }); this.outboundResolver = outBoundResolver; const inboundResolver = new aws_cdk_lib_1.aws_route53resolver.CfnResolverEndpoint(this, 'InboundResolver', { direction: ResolverDirection.INBOUND, ipAddresses: dnsipAddresses, securityGroupIds: [dnsSecurityGroup.securityGroupId], name: 'InboundRouteResolver', }); this.inboundResolver = inboundResolver; const inboundResolverIPCR = new aws_cdk_lib_1.custom_resources.AwsCustomResource(this, 'getendpointipaddress', { onCreate: { service: 'Route53Resolver', action: 'listResolverEndpointIpAddresses', parameters: { ResolverEndpointId: inboundResolver.attrResolverEndpointId, }, physicalResourceId: aws_cdk_lib_1.custom_resources.PhysicalResourceId.of('inboundresolverip'), }, logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.ONE_DAY, policy: aws_cdk_lib_1.custom_resources.AwsCustomResourcePolicy.fromSdkCalls({ resources: aws_cdk_lib_1.custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE, }), }); // we will have the same number of ip address's as their are Az's for the vpc, so we can use that to extract the // ip address out the CR. var inboundresolvers = []; for (let index = 0; index < props.vpc.availabilityZones.length; index++) { inboundresolvers.push({ ip: inboundResolverIPCR.getResponseField((`IpAddresses.${index}.Ip`)) }); } this.inboundResolversIp = inboundresolvers; } } exports.R53Resolverendpoints = R53Resolverendpoints; _a = JSII_RTTI_SYMBOL_1; R53Resolverendpoints[_a] = { fqn: "raindancers-network.dns.R53Resolverendpoints", version: "1.29.3" }; class ConditionalForwarder extends constructs.Construct { constructor(scope, id, props) { super(scope, id); props.forwardingRules.forEach((rule) => { // we have to replace dots and dashes for the name rule. It does not like them! var name = rule.domain.replace(/\./gi, 'dot'); name = name.replace(/-/gi, 'dash'); // create a list of TargetAddress's from the prop.rule const resolverIps = []; rule.forwardTo.forEach((target) => { resolverIps.push({ ip: target }); }); // create a resolver rule for the central vpc const resolverrule = new aws_cdk_lib_1.aws_route53resolver.CfnResolverRule(this, `${name}ResolverRule`, { domainName: rule.domain, ruleType: 'FORWARD', name: name, resolverEndpointId: props.outboundResolver.attrResolverEndpointId, targetIps: resolverIps, }); // Associated the resolver rule with the vpc new aws_cdk_lib_1.aws_route53resolver.CfnResolverRuleAssociation(this, `${name}ResolverRuleAssn`, { resolverRuleId: resolverrule.attrResolverRuleId, vpcId: props.vpc.vpcId, }); // create a sharing rule for other vpcs to use, to resolve back to our inbound resolvers. const sharedresolverrule = new aws_cdk_lib_1.aws_route53resolver.CfnResolverRule(this, `${name}SharedResolverRule`, { domainName: rule.domain, ruleType: 'FORWARD', name: name, resolverEndpointId: props.outboundResolver.attrResolverEndpointId, targetIps: props.inboundResolverTargets, }); new aws_cdk_lib_1.aws_ram.CfnResourceShare(this, `ResolverRuleShare${rule.domain}`, { name: rule.domain, principals: [this.node.tryGetContext('orgArn')], resourceArns: [sharedresolverrule.attrArn], allowExternalPrincipals: false, }); }); } } exports.ConditionalForwarder = ConditionalForwarder; _b = JSII_RTTI_SYMBOL_1; ConditionalForwarder[_b] = { fqn: "raindancers-network.dns.ConditionalForwarder", version: "1.29.3" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zUmVzb2x2ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rucy9kbnNSZXNvbHZlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FPcUI7QUFDckIseUNBQXlDO0FBR3pDOztHQUVHO0FBQ0gsSUFBWSxpQkFTWDtBQVRELFdBQVksaUJBQWlCO0lBQzNCOztPQUVHO0lBQ0gsd0NBQW1CLENBQUE7SUFDbkI7O09BRUc7SUFDSCwwQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBVFcsaUJBQWlCLEdBQWpCLHlCQUFpQixLQUFqQix5QkFBaUIsUUFTNUI7QUFrQ0Q7O0dBRUc7QUFDSCxNQUFhLG9CQUFxQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBUzVEOzs7OztTQUtFO0lBQ0YsWUFBWSxLQUEyQixFQUFFLEVBQVUsRUFBRSxLQUFnQztRQUNuRixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBR2pCLHdDQUF3QztRQUN4QyxNQUFNLGNBQWMsR0FBd0QsRUFBRSxDQUFDO1FBRS9FLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRTtZQUMxQyxjQUFjLENBQUMsSUFBSSxDQUNqQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FDdkIsQ0FBQztTQUNIO1FBRUQsbURBQW1EO1FBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxxQkFBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDdkUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsZ0JBQWdCLEVBQUUsS0FBSztTQUN4QixDQUFDLENBQUM7UUFFSCxnQkFBZ0IsQ0FBQyxhQUFhLENBQzVCLHFCQUFHLENBQUMsSUFB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QUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDaEUsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNqQixVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0MsWUFBWSxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDO2dCQUMxQyx1QkFBdUIsRUFBRSxLQUFLO2FBQy9CLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFsREgsb0RBbURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYXdzX2VjMiBhcyBlYzIsXG4gIGF3c19yb3V0ZTUzcmVzb2x2ZXIgYXMgcjUzcixcbiAgY3VzdG9tX3Jlc291cmNlcyBhcyBjcixcbiAgYXdzX2xvZ3MgYXMgbG9ncyxcbiAgYXdzX3JhbSBhcyByYW0sXG59XG4gIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5cblxuLyoqXG4gKiBEaXJlY3Rpb24gb2YgUmVzb2x2ZXJcbiAqL1xuZXhwb3J0IGVudW0gUmVzb2x2ZXJEaXJlY3Rpb24ge1xuICAvKipcbiAgICogUmVzb2x2ZXIgaXMgSW5ib3VuZFxuICAgKi9cbiAgSU5CT1VORCA9ICdpbmJvdW5kJyxcbiAgLyoqXG4gICAqIFJlc29sdmVyIGlzIG91dGJvdW5kXG4gICAqL1xuICBPVVRCT1VORCA9ICdvdXRib3VuZCdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPdXRib3VuZEZvcndhcmRpbmdSdWxlIHtcbiAgLyoqXG4gICAqIGRvbWFpbiB0byBmb3J3YXJkXG4gICAqL1xuICByZWFkb25seSBkb21haW46IHN0cmluZztcbiAgLyoqIGFycmF5IG9mIGlwIGFkZHJlc3MncyB0byBmb3J3YXJkIHJlcXVlc3QgdG8gKi9cbiAgcmVhZG9ubHkgZm9yd2FyZFRvOiBzdHJpbmdbXTtcbn1cblxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZm9yIGNyZWF0aW5nIGluYm91bmQgcmVzb2x2ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFI1M1Jlc29sdmVyZW5kcG9pbnRzUHJvcHMge1xuICAvKipcblx0ICogdGhlIHZwYyB0aGF0IHRoZSByZXNvbHZlcnMgd2lsbCBiZSBwbGFjZWQgaW5cblx0ICovXG4gIHJlYWRvbmx5IHZwYzogZWMyLlZwYyB8IGVjMi5JVnBjO1xuICAvKipcblx0ICogdGhlIHN1Ym5ldGdyb3VwIHRvIHBsYWNlIHRoZSByZXNvbHZlcnMgaW5cblx0ICovXG4gIHJlYWRvbmx5IHN1Ym5ldEdyb3VwOiBzdHJpbmc7XG4gIC8qKlxuXHQgKiBBbiBhcnJheSBvZiBJbnRlcm5hbCBkb21haW5zIHRoYXQgY2FuIGJlIGNlbnRyYWxseSByZXNvbHZlZCBpbiB0aGlzIFZQQ1xuXHQgKi9cbiAgcmVhZG9ubHkgb3V0Ym91bmRGb3J3YXJkaW5nUnVsZXM/OiBPdXRib3VuZEZvcndhcmRpbmdSdWxlW10gfCB1bmRlZmluZWQ7XG4gIC8qKlxuXHQgKiBWYWx1ZSBmb3IgU2hhcmluZy5cblx0ICovXG4gIHJlYWRvbmx5IHRhZ1ZhbHVlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENyZWF0ZSBSb3V0ZTUzIFJlc29sdmVyIEVuZHBvaW50cyBmb3IgTXVsdGlWUEMgYW5kIEh5YnJpZCBETlMgUmVzb2x1dGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFI1M1Jlc29sdmVyZW5kcG9pbnRzIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuXG4gIC8qKiBpbmJvdW5kIHJlc29sdmVyICovXG4gIHB1YmxpYyBpbmJvdW5kUmVzb2x2ZXI6IHI1M3IuQ2ZuUmVzb2x2ZXJFbmRwb2ludDtcbiAgLyoqIGxpc3Qgb2YgUmVzb2x2ZXIgSVAgYWRkcmVzcydzICovXG4gIHB1YmxpYyBpbmJvdW5kUmVzb2x2ZXJzSXA6IHI1M3IuQ2ZuUmVzb2x2ZXJSdWxlLlRhcmdldEFkZHJlc3NQcm9wZXJ0eVtdO1xuICAvKiogb3V0Ym91bmQgcmVzb2x2ZXIgKi9cbiAgcHVibGljIG91dGJvdW5kUmVzb2x2ZXI6IHI1M3IuQ2ZuUmVzb2x2ZXJFbmRwb2ludDtcblxuICAvKipcblx0ICpcblx0ICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBpbiB3aGljaCB0aGVzZSByZXNvdXJjZXMgYXJlIGNyYWV0ZWRcblx0ICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgY29uc3RydWN0XG5cdCAqIEBwYXJhbSBwcm9wcyBwcm9wZXJ0eXMgZm9yIHRoZSBSNTNSZXNvbHZlciBFbmRwb2ludHNcblx0ICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFI1M1Jlc29sdmVyZW5kcG9pbnRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG5cbiAgICAvLyBjcmVhdGUgaW5ib3VuZCBhbmQgb3V0Ym91bmQgcmVzb2x2ZXJzXG4gICAgY29uc3QgZG5zaXBBZGRyZXNzZXM6IHI1M3IuQ2ZuUmVzb2x2ZXJFbmRwb2ludC5JcEFkZHJlc3NSZXF1ZXN0UHJvcGVydHlbXSA9IFtdO1xuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gcHJvcHMudnBjLnNlbGVjdFN1Ym5ldHMoeyBzdWJuZXRHcm91cE5hbWU6IHByb3BzLnN1Ym5ldEdyb3VwIH0pO1xuICAgIGZvciAoY29uc3Qgc3VibmV0SWQgb2Ygc2VsZWN0aW9uLnN1Ym5ldElkcykge1xuICAgICAgZG5zaXBBZGRyZXNzZXMucHVzaChcbiAgICAgICAgeyBzdWJuZXRJZDogc3VibmV0SWQgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgc2VjdXJpdHkgZ3JvdXAgZm9yIHRoZSByb3V0ZSByZXNvbHZlcnMuXG4gICAgY29uc3QgZG5zU2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCAnRE5TU2VjdXJpdHlHcm91cCcsIHtcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBkbnNTZWN1cml0eUdyb3VwLmFkZEVncmVzc1J1bGUoXG4gICAgICBlYzIuUGVlci5hbnlJcHY0KCksXG4gICAgICBlYzIuUG9ydC51ZHAoNTMpLFxuICAgICk7XG4gICAgZG5zU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIGVjMi5QZWVyLmFueUlwdjQoKSxcbiAgICAgIGVjMi5Qb3J0LnVkcCg1MyksXG4gICAgKTtcblxuICAgIGNvbnN0IG91dEJvdW5kUmVzb2x2ZXIgPSBuZXcgcjUzci5DZm5SZXNvbHZlckVuZHBvaW50KHRoaXMsICdPdXRib3VuZFJlc29sdmVyJywge1xuICAgICAgZGlyZWN0aW9uOiBSZXNvbHZlckRpcmVjdGlvbi5PVVRCT1VORCxcbiAgICAgIGlwQWRkcmVzc2VzOiBkbnNpcEFkZHJlc3NlcyxcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHM6IFtkbnNTZWN1cml0eUdyb3VwLnNlY3VyaXR5R3JvdXBJZF0sXG4gICAgICBuYW1lOiAnT3V0Ym91bmRSb3V0ZVJlc29sdmVyICcsXG4gICAgfSk7XG5cbiAgICB0aGlzLm91dGJvdW5kUmVzb2x2ZXIgPSBvdXRCb3VuZFJlc29sdmVyO1xuXG5cbiAgICBjb25zdCBpbmJvdW5kUmVzb2x2ZXIgPSBuZXcgcjUzci5DZm5SZXNvbHZlckVuZHBvaW50KHRoaXMsICdJbmJvdW5kUmVzb2x2ZXInLCB7XG4gICAgICBkaXJlY3Rpb246IFJlc29sdmVyRGlyZWN0aW9uLklOQk9VTkQsXG4gICAgICBpcEFkZHJlc3NlczogZG5zaXBBZGRyZXNzZXMsXG4gICAgICBzZWN1cml0eUdyb3VwSWRzOiBbZG5zU2VjdXJpdHlHcm91cC5zZWN1cml0eUdyb3VwSWRdLFxuICAgICAgbmFtZTogJ0luYm91bmRSb3V0ZVJlc29sdmVyJyxcbiAgICB9KTtcblxuICAgIHRoaXMuaW5ib3VuZFJlc29sdmVyID0gaW5ib3VuZFJlc29sdmVyO1xuXG5cbiAgICBjb25zdCBpbmJvdW5kUmVzb2x2ZXJJUENSID0gbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsICdnZXRlbmRwb2ludGlwYWRkcmVzcycsIHtcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6ICdSb3V0ZTUzUmVzb2x2ZXInLFxuICAgICAgICBhY3Rpb246ICdsaXN0UmVzb2x2ZXJFbmRwb2ludElwQWRkcmVzc2VzJyxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIFJlc29sdmVyRW5kcG9pbnRJZDogaW5ib3VuZFJlc29sdmVyLmF0dHJSZXNvbHZlckVuZHBvaW50SWQsXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKCdpbmJvdW5kcmVzb2x2ZXJpcCcpLFxuICAgICAgfSxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9EQVksXG4gICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgIHJlc291cmNlczogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuQU5ZX1JFU09VUkNFLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICAvLyB3ZSB3aWxsIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGlwIGFkZHJlc3MncyBhcyB0aGVpciBhcmUgQXoncyBmb3IgdGhlIHZwYywgc28gd2UgY2FuIHVzZSB0aGF0IHRvIGV4dHJhY3QgdGhlXG4gICAgLy8gaXAgYWRkcmVzcyBvdXQgdGhlIENSLlxuICAgIHZhciBpbmJvdW5kcmVzb2x2ZXJzOiByNTNyLkNmblJlc29sdmVyUnVsZS5UYXJnZXRBZGRyZXNzUHJvcGVydHlbXSA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwcm9wcy52cGMuYXZhaWxhYmlsaXR5Wm9uZXMubGVuZ3RoOyBpbmRleCsrICkge1xuICAgICAgaW5ib3VuZHJlc29sdmVycy5wdXNoKHsgaXA6IGluYm91bmRSZXNvbHZlcklQQ1IuZ2V0UmVzcG9uc2VGaWVsZCgoYElwQWRkcmVzc2VzLiR7aW5kZXh9LklwYCkpIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaW5ib3VuZFJlc29sdmVyc0lwID0gaW5ib3VuZHJlc29sdmVycztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvbmFsRm9yd2FyZGVyUHJvcHMge1xuICByZWFkb25seSBmb3J3YXJkaW5nUnVsZXM6IE91dGJvdW5kRm9yd2FyZGluZ1J1bGVbXTtcbiAgcmVhZG9ubHkgb3V0Ym91bmRSZXNvbHZlcjogcjUzci5DZm5SZXNvbHZlckVuZHBvaW50O1xuICByZWFkb25seSBpbmJvdW5kUmVzb2x2ZXJUYXJnZXRzOiByNTNyLkNmblJlc29sdmVyUnVsZS5UYXJnZXRBZGRyZXNzUHJvcGVydHlbXTtcbiAgcmVhZG9ubHkgdnBjOiBlYzIuVnBjIHwgZWMyLklWcGM7XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbEZvcndhcmRlciBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb25kaXRpb25hbEZvcndhcmRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHByb3BzLmZvcndhcmRpbmdSdWxlcy5mb3JFYWNoKChydWxlKSA9PiB7XG5cbiAgICAgIC8vIHdlIGhhdmUgdG8gcmVwbGFjZSBkb3RzIGFuZCBkYXNoZXMgZm9yIHRoZSBuYW1lIHJ1bGUuIEl0IGRvZXMgbm90IGxpa2UgdGhlbSFcbiAgICAgIHZhciBuYW1lOnN0cmluZyA9IHJ1bGUuZG9tYWluLnJlcGxhY2UoL1xcLi9naSwgJ2RvdCcpO1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvLS9naSwgJ2Rhc2gnKTtcblxuICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBUYXJnZXRBZGRyZXNzJ3MgZnJvbSB0aGUgcHJvcC5ydWxlXG4gICAgICBjb25zdCByZXNvbHZlcklwczogcjUzci5DZm5SZXNvbHZlclJ1bGUuVGFyZ2V0QWRkcmVzc1Byb3BlcnR5W10gPSBbXTtcbiAgICAgIHJ1bGUuZm9yd2FyZFRvLmZvckVhY2goKHRhcmdldCkgPT4ge1xuICAgICAgICByZXNvbHZlcklwcy5wdXNoKHsgaXA6IHRhcmdldCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBjcmVhdGUgYSByZXNvbHZlciBydWxlIGZvciB0aGUgY2VudHJhbCB2cGNcbiAgICAgIGNvbnN0IHJlc29sdmVycnVsZSA9IG5ldyByNTNyLkNmblJlc29sdmVyUnVsZSh0aGlzLCBgJHtuYW1lfVJlc29sdmVyUnVsZWAsIHtcbiAgICAgICAgZG9tYWluTmFtZTogcnVsZS5kb21haW4sXG4gICAgICAgIHJ1bGVUeXBlOiAnRk9SV0FSRCcsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHJlc29sdmVyRW5kcG9pbnRJZDogcHJvcHMub3V0Ym91bmRSZXNvbHZlci5hdHRyUmVzb2x2ZXJFbmRwb2ludElkLFxuICAgICAgICB0YXJnZXRJcHM6IHJlc29sdmVySXBzLCAvLyBkbnMgc2VydmVyc1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFzc29jaWF0ZWQgdGhlIHJlc29sdmVyIHJ1bGUgd2l0aCB0aGUgdnBjXG4gICAgICBuZXcgcjUzci5DZm5SZXNvbHZlclJ1bGVBc3NvY2lhdGlvbih0aGlzLCBgJHtuYW1lfVJlc29sdmVyUnVsZUFzc25gLFxuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZXJSdWxlSWQ6IHJlc29sdmVycnVsZS5hdHRyUmVzb2x2ZXJSdWxlSWQsXG4gICAgICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZCxcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIC8vIGNyZWF0ZSBhIHNoYXJpbmcgcnVsZSBmb3Igb3RoZXIgdnBjcyB0byB1c2UsIHRvIHJlc29sdmUgYmFjayB0byBvdXIgaW5ib3VuZCByZXNvbHZlcnMuXG4gICAgICBjb25zdCBzaGFyZWRyZXNvbHZlcnJ1bGUgPSBuZXcgcjUzci5DZm5SZXNvbHZlclJ1bGUodGhpcywgYCR7bmFtZX1TaGFyZWRSZXNvbHZlclJ1bGVgLCB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHJ1bGUuZG9tYWluLFxuICAgICAgICBydWxlVHlwZTogJ0ZPUldBUkQnLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZXNvbHZlckVuZHBvaW50SWQ6IHByb3BzLm91dGJvdW5kUmVzb2x2ZXIuYXR0clJlc29sdmVyRW5kcG9pbnRJZCxcbiAgICAgICAgdGFyZ2V0SXBzOiBwcm9wcy5pbmJvdW5kUmVzb2x2ZXJUYXJnZXRzLCAvLyBkbnMgc2VydmVyc1xuICAgICAgfSk7XG5cbiAgICAgIG5ldyByYW0uQ2ZuUmVzb3VyY2VTaGFyZSh0aGlzLCBgUmVzb2x2ZXJSdWxlU2hhcmUke3J1bGUuZG9tYWlufWAsIHtcbiAgICAgICAgbmFtZTogcnVsZS5kb21haW4sXG4gICAgICAgIHByaW5jaXBhbHM6IFt0aGlzLm5vZGUudHJ5R2V0Q29udGV4dCgnb3JnQXJuJyldLFxuICAgICAgICByZXNvdXJjZUFybnM6IFtzaGFyZWRyZXNvbHZlcnJ1bGUuYXR0ckFybl0sXG4gICAgICAgIGFsbG93RXh0ZXJuYWxQcmluY2lwYWxzOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=