UNPKG

@softchef/cdk-restapi

Version:
168 lines 23.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.RestApi = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway"); const constructs_1 = require("constructs"); class RestApi extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.resources = {}; let restApiProps = {}; if (props.enableCors !== false) { restApiProps.defaultCorsPreflightOptions = { allowMethods: aws_apigateway_1.Cors.ALL_METHODS, allowOrigins: aws_apigateway_1.Cors.ALL_ORIGINS, allowHeaders: [ 'Origin', 'Content-Type', 'Fetch-Mode', 'Accept', 'X-Amz-Date', 'Accept-Encoding', 'Authorization', 'cache-control', 'SyncCenter', 'X-Api-Key', 'X-Amz-Security-Token', 'X-Amz-User-Agent', ], }; } if (props.authorizationType) { this.globalAuthorizationType = props.authorizationType; } if (props.authorizer) { this.globalAuthorizer = props.authorizer; } // Use custom or create new this.awsRestApi = props.restApi ?? new aws_apigateway_1.RestApi(this, this.node.id, { ...props, ...restApiProps, }); // Define resources this.addResources(props.resources); } get restApi() { return this.awsRestApi; } get restApiId() { return this.awsRestApi.restApiId; } get url() { return this.awsRestApi.url; } addResources(resources) { for (const resource of resources) { this.addResource(resource); } return this; } addResource(resource) { const path = `/${resource.path.replace(/^\/{1}/, '')}`.replace(/\?.*/, '').split('/'); const lastPath = path.reduce((previous, current, index) => { const part = `${previous}/${current}`; if (!this.resources[part]) { if (index === 1) { if (current === '') { this.resources[part] = this.awsRestApi.root; } else { this.resources[part] = this.awsRestApi.root.addResource(current); } } else { this.resources[part] = this.resources[previous].addResource(current); } } return part; }); const authorizationType = resource.authorizationType ?? this.globalAuthorizationType ?? aws_apigateway_1.AuthorizationType.NONE; let integration; let methodOptions = {}; if (resource.lambdaFunction) { integration = new aws_apigateway_1.LambdaIntegration(resource.lambdaFunction); } else if (resource.networkLoadBalancer) { const pathParameters = resource.path.match(/\/\{[\w]*\}/g) ?? []; const queryParameters = resource.path.match(/[\w]*=\{[\w]*\}/g) ?? []; const methodRequestParameters = {}; const integrationRequestParameters = {}; for (const pathParameter of pathParameters) { const [, key] = pathParameter.match(/\/\{([\w]*)\}/) ?? []; methodRequestParameters[`method.request.path.${key}`] = true; integrationRequestParameters[`integration.request.path.${key}`] = `method.request.path.${key}`; } for (const queryParameter of queryParameters) { const [, key] = queryParameter.match(/[\w]*=\{([\w]*[\?]?)\}/) ?? []; const keyName = key.replace(/\?$/, ''); methodRequestParameters[`method.request.querystring.${keyName}`] = /\?$/.test(key); integrationRequestParameters[`integration.request.querystring.${keyName}`] = `method.request.querystring.${keyName}`; } methodOptions.requestParameters = { ...methodRequestParameters, ...resource.methodOptions?.requestParameters, }; integration = new aws_apigateway_1.Integration({ type: resource.vpcLink ? aws_apigateway_1.IntegrationType.HTTP : aws_apigateway_1.IntegrationType.HTTP_PROXY, integrationHttpMethod: resource.httpMethod.toString(), uri: `http://${resource.networkLoadBalancer.loadBalancerDnsName}${resource.path.replace(/\?.*/, '')}`, options: { connectionType: aws_apigateway_1.ConnectionType.VPC_LINK, vpcLink: resource.vpcLink ?? resource.vpcLinkProxy, integrationResponses: [{ statusCode: '200', }], requestParameters: integrationRequestParameters, ...resource.vpcLinkIntegrationOptions, }, }); methodOptions.methodResponses = [ { statusCode: '200', }, ...(resource.methodOptions?.methodResponses ? resource.methodOptions?.methodResponses : []), ]; } else if (resource.integration) { integration = resource.integration; } else { throw new Error('Must provide integration props, support lambdaFunction, API Gateway Integration types'); } switch (authorizationType) { case aws_apigateway_1.AuthorizationType.COGNITO: case aws_apigateway_1.AuthorizationType.CUSTOM: let authorizer; if (resource.authorizer) { authorizer = resource.authorizer; } else if (this.globalAuthorizer) { authorizer = this.globalAuthorizer; } else { throw new Error('You specify authorization type is COGNITO, but not specify authorizer.'); } methodOptions.authorizationType = aws_apigateway_1.AuthorizationType.COGNITO; methodOptions.authorizer = authorizer; break; case aws_apigateway_1.AuthorizationType.IAM: methodOptions.authorizationType = aws_apigateway_1.AuthorizationType.IAM; break; case aws_apigateway_1.AuthorizationType.NONE: default: } this.resources[lastPath].addMethod(resource.httpMethod.toString(), integration, { ...resource.methodOptions, ...methodOptions, }); return this; } } exports.RestApi = RestApi; _a = JSII_RTTI_SYMBOL_1; RestApi[_a] = { fqn: "@softchef/cdk-restapi.RestApi", version: "2.0.183" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVzdC1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFZb0M7QUFDcEMsMkNBRW9CO0FBNEJwQixNQUFhLE9BQVEsU0FBUSxzQkFBUztJQVlwQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1CO1FBQzNELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFMWCxjQUFTLEdBRWIsRUFBRSxDQUFDO1FBS0wsSUFBSSxZQUFZLEdBRVosRUFBRSxDQUFDO1FBRVAsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRTtZQUM5QixZQUFZLENBQUMsMkJBQTJCLEdBQUc7Z0JBQ3pDLFlBQVksRUFBRSxxQkFBSSxDQUFDLFdBQVc7Z0JBQzlCLFlBQVksRUFBRSxxQkFBSSxDQUFDLFdBQVc7Z0JBQzlCLFlBQVksRUFBRTtvQkFDWixRQUFRO29CQUNSLGNBQWM7b0JBQ2QsWUFBWTtvQkFDWixRQUFRO29CQUNSLFlBQVk7b0JBQ1osaUJBQWlCO29CQUNqQixlQUFlO29CQUNmLGVBQWU7b0JBQ2YsWUFBWTtvQkFDWixXQUFXO29CQUNYLHNCQUFzQjtvQkFDdEIsa0JBQWtCO2lCQUNuQjthQUNGLENBQUM7U0FDSDtRQUVELElBQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7U0FDeEQ7UUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7U0FDMUM7UUFDRCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksd0JBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFD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RyxVQUFVLENBQUM7Z0JBQ3RDLE1BQU07WUFDUixLQUFLLGtDQUFpQixDQUFDLEdBQUc7Z0JBQ3hCLGFBQWEsQ0FBQyxpQkFBaUIsR0FBRyxrQ0FBaUIsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hELE1BQU07WUFDUixLQUFLLGtDQUFpQixDQUFDLElBQUksQ0FBQztZQUM1QixRQUFRO1NBQ1Q7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FDaEMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFDOUIsV0FBVyxFQUNYO1lBQ0UsR0FBRyxRQUFRLENBQUMsYUFBYTtZQUN6QixHQUFtQixhQUFhO1NBQ2pDLENBQ0YsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUFuTEgsMEJBb0xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblR5cGUsXG4gIENvbm5lY3Rpb25UeXBlLFxuICBDb3JzLFxuICBJQXV0aG9yaXplcixcbiAgSW50ZWdyYXRpb24sXG4gIEludGVncmF0aW9uVHlwZSxcbiAgTGFtYmRhSW50ZWdyYXRpb24sXG4gIE1ldGhvZE9wdGlvbnMsXG4gIFJlc291cmNlLFxuICBSZXN0QXBpIGFzIEF3c1Jlc3RBcGksXG4gIFJlc3RBcGlQcm9wcyBhcyBBd3NSZXN0QXBpUHJvcHMsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCB7XG4gIENvbnN0cnVjdCxcbn0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBSZXN0QXBpUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSAnLi9yZXNvdXJjZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdEFwaVByb3BzIGV4dGVuZHMgQXdzUmVzdEFwaVByb3BzIHtcbiAgLyoqXG4gICAqIEN1c3RvbSBSZXN0QXBpXG4gICAqL1xuICByZWFkb25seSByZXN0QXBpPzogQXdzUmVzdEFwaTtcbiAgLyoqXG4gICAqIERlZmluZSBSZXN0IEFQSSByZXNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlczogUmVzdEFwaVJlc291cmNlUHJvcHNbXTtcbiAgLyoqXG4gICAqIEVuYWJsZSBjb3JzLCBkZWZhdWx0IGlzIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNvcnM/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmeSBnbG9iYWxseSBBdXRob3JpemF0aW9uVHlwZSBieSBhd3MtYXBpZ2F0ZXdheS5BdXRob3JpemF0aW9uVHlwZSwgZGVmYXVsdCBpcyBOT05FXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemF0aW9uVHlwZT86IEF1dGhvcml6YXRpb25UeXBlO1xuICAvKipcbiAgICogU3BlY2lmeSBnbG9iYWxseSBBdXRob3JpemVyIGJ5IGF3cy1BdXRob3JpemVyLCBkZWZhdWx0IGlzIG51bGxcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6ZXI/OiBJQXV0aG9yaXplciB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIFJlc3RBcGkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuXG4gIHByaXZhdGUgZ2xvYmFsQXV0aG9yaXphdGlvblR5cGU/OiBBdXRob3JpemF0aW9uVHlwZSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGdsb2JhbEF1dGhvcml6ZXI/OiBJQXV0aG9yaXplciB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGF3c1Jlc3RBcGk6IEF3c1Jlc3RBcGk7XG5cbiAgcHJpdmF0ZSByZXNvdXJjZXM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZXNvdXJjZTtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSZXN0QXBpUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbGV0IHJlc3RBcGlQcm9wczoge1xuICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIH0gPSB7fTtcblxuICAgIGlmIChwcm9wcy5lbmFibGVDb3JzICE9PSBmYWxzZSkge1xuICAgICAgcmVzdEFwaVByb3BzLmRlZmF1bHRDb3JzUHJlZmxpZ2h0T3B0aW9ucyA9IHtcbiAgICAgICAgYWxsb3dNZXRob2RzOiBDb3JzLkFMTF9NRVRIT0RTLFxuICAgICAgICBhbGxvd09yaWdpbnM6IENvcnMuQUxMX09SSUdJTlMsXG4gICAgICAgIGFsbG93SGVhZGVyczogW1xuICAgICAgICAgICdPcmlnaW4nLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnLFxuICAgICAgICAgICdGZXRjaC1Nb2RlJyxcbiAgICAgICAgICAnQWNjZXB0JyxcbiAgICAgICAgICAnWC1BbXotRGF0ZScsXG4gICAgICAgICAgJ0FjY2VwdC1FbmNvZGluZycsXG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nLFxuICAgICAgICAgICdjYWNoZS1jb250cm9sJyxcbiAgICAgICAgICAnU3luY0NlbnRlcicsXG4gICAgICAgICAgJ1gtQXBpLUtleScsXG4gICAgICAgICAgJ1gtQW16LVNlY3VyaXR5LVRva2VuJyxcbiAgICAgICAgICAnWC1BbXotVXNlci1BZ2VudCcsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hdXRob3JpemF0aW9uVHlwZSkge1xuICAgICAgdGhpcy5nbG9iYWxBdXRob3JpemF0aW9uVHlwZSA9IHByb3BzLmF1dGhvcml6YXRpb25UeXBlO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5hdXRob3JpemVyKSB7XG4gICAgICB0aGlzLmdsb2JhbEF1dGhvcml6ZXIgPSBwcm9wcy5hdXRob3JpemVyO1xuICAgIH1cbiAgICAvLyBVc2UgY3VzdG9tIG9yIGNyZWF0ZSBuZXdcbiAgICB0aGlzLmF3c1Jlc3RBcGkgPSBwcm9wcy5yZXN0QXBpID8/IG5ldyBBd3NSZXN0QXBpKHRoaXMsIHRoaXMubm9kZS5pZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICAuLi5yZXN0QXBpUHJvcHMsXG4gICAgfSk7XG4gICAgLy8gRGVmaW5lIHJlc291cmNlc1xuICAgIHRoaXMuYWRkUmVzb3VyY2VzKHByb3BzLnJlc291cmNlcyk7XG4gIH1cblxuICBnZXQgcmVzdEFwaSgpOiBBd3NSZXN0QXBpIHtcbiAgICByZXR1cm4gdGhpcy5hd3NSZXN0QXBpO1xuICB9XG5cbiAgZ2V0IHJlc3RBcGlJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmF3c1Jlc3RBcGkucmVzdEFwaUlkO1xuICB9XG5cbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmF3c1Jlc3RBcGkudXJsO1xuICB9XG5cbiAgcHVibGljIGFkZFJlc291cmNlcyhyZXNvdXJjZXM6IFJlc3RBcGlSZXNvdXJjZVByb3BzW10pOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuICAgICAgdGhpcy5hZGRSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGFkZFJlc291cmNlKHJlc291cmNlOiBSZXN0QXBpUmVzb3VyY2VQcm9wcyk6IHRoaXMge1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gYC8ke3Jlc291cmNlLnBhdGgucmVwbGFjZSgvXlxcL3sxfS8sICcnKX1gLnJlcGxhY2UoL1xcPy4qLywgJycpLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgbGFzdFBhdGggPSBwYXRoLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwYXJ0OiBzdHJpbmcgPSBgJHtwcmV2aW91c30vJHtjdXJyZW50fWA7XG4gICAgICBpZiAoIXRoaXMucmVzb3VyY2VzW3BhcnRdKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMSkge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNbcGFydF0gPSA8UmVzb3VyY2U+IHRoaXMuYXdzUmVzdEFwaS5yb290O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlc1twYXJ0XSA9IHRoaXMuYXdzUmVzdEFwaS5yb290LmFkZFJlc291cmNlKGN1cnJlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlc291cmNlc1twYXJ0XSA9IHRoaXMucmVzb3VyY2VzW3ByZXZpb3VzXS5hZGRSZXNvdXJjZShjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfSk7XG4gICAgY29uc3QgYXV0aG9yaXphdGlvblR5cGU6IEF1dGhvcml6YXRpb25UeXBlID0gcmVzb3VyY2UuYXV0aG9yaXphdGlvblR5cGVcbiAgICAgID8/IHRoaXMuZ2xvYmFsQXV0aG9yaXphdGlvblR5cGVcbiAgICAgID8/IEF1dGhvcml6YXRpb25UeXBlLk5PTkU7XG4gICAgbGV0IGludGVncmF0aW9uOiBJbnRlZ3JhdGlvbjtcbiAgICBsZXQgbWV0aG9kT3B0aW9uczoge1xuICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIH0gPSB7fTtcbiAgICBpZiAocmVzb3VyY2UubGFtYmRhRnVuY3Rpb24pIHtcbiAgICAgIGludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKHJlc291cmNlLmxhbWJkYUZ1bmN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHJlc291cmNlLm5ldHdvcmtMb2FkQmFsYW5jZXIpIHtcbiAgICAgIGNvbnN0IHBhdGhQYXJhbWV0ZXJzID0gcmVzb3VyY2UucGF0aC5tYXRjaCgvXFwvXFx7W1xcd10qXFx9L2cpID8/IFtdO1xuICAgICAgY29uc3QgcXVlcnlQYXJhbWV0ZXJzID0gcmVzb3VyY2UucGF0aC5tYXRjaCgvW1xcd10qPVxce1tcXHddKlxcfS9nKSA/PyBbXTtcbiAgICAgIGNvbnN0IG1ldGhvZFJlcXVlc3RQYXJhbWV0ZXJzOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG4gICAgICB9ID0ge307XG4gICAgICBjb25zdCBpbnRlZ3JhdGlvblJlcXVlc3RQYXJhbWV0ZXJzOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICAgIH0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgcGF0aFBhcmFtZXRlciBvZiBwYXRoUGFyYW1ldGVycykge1xuICAgICAgICBjb25zdCBbLCBrZXldID0gcGF0aFBhcmFtZXRlci5tYXRjaCgvXFwvXFx7KFtcXHddKilcXH0vKSA/PyBbXTtcbiAgICAgICAgbWV0aG9kUmVxdWVzdFBhcmFtZXRlcnNbYG1ldGhvZC5yZXF1ZXN0LnBhdGguJHtrZXl9YF0gPSB0cnVlO1xuICAgICAgICBpbnRlZ3JhdGlvblJlcXVlc3RQYXJhbWV0ZXJzW2BpbnRlZ3JhdGlvbi5yZXF1ZXN0LnBhdGguJHtrZXl9YF0gPSBgbWV0aG9kLnJlcXVlc3QucGF0aC4ke2tleX1gO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBxdWVyeVBhcmFtZXRlciBvZiBxdWVyeVBhcmFtZXRlcnMpIHtcbiAgICAgICAgY29uc3QgWywga2V5XSA9IHF1ZXJ5UGFyYW1ldGVyLm1hdGNoKC9bXFx3XSo9XFx7KFtcXHddKltcXD9dPylcXH0vKSA/PyBbXTtcbiAgICAgICAgY29uc3Qga2V5TmFtZSA9IGtleS5yZXBsYWNlKC9cXD8kLywgJycpO1xuICAgICAgICBtZXRob2RSZXF1ZXN0UGFyYW1ldGVyc1tgbWV0aG9kLnJlcXVlc3QucXVlcnlzdHJpbmcuJHtrZXlOYW1lfWBdID0gL1xcPyQvLnRlc3Qoa2V5KTtcbiAgICAgICAgaW50ZWdyYXRpb25SZXF1ZXN0UGFyYW1ldGVyc1tgaW50ZWdyYXRpb24ucmVxdWVzdC5xdWVyeXN0cmluZy4ke2tleU5hbWV9YF0gPSBgbWV0aG9kLnJlcXVlc3QucXVlcnlzdHJpbmcuJHtrZXlOYW1lfWA7XG4gICAgICB9XG4gICAgICBtZXRob2RPcHRpb25zLnJlcXVlc3RQYXJhbWV0ZXJzID0ge1xuICAgICAgICAuLi5tZXRob2RSZXF1ZXN0UGFyYW1ldGVycyxcbiAgICAgICAgLi4ucmVzb3VyY2UubWV0aG9kT3B0aW9ucz8ucmVxdWVzdFBhcmFtZXRlcnMsXG4gICAgICB9O1xuICAgICAgaW50ZWdyYXRpb24gPSBuZXcgSW50ZWdyYXRpb24oe1xuICAgICAgICB0eXBlOiByZXNvdXJjZS52cGNMaW5rID8gSW50ZWdyYXRpb25UeXBlLkhUVFAgOiBJbnRlZ3JhdGlvblR5cGUuSFRUUF9QUk9YWSxcbiAgICAgICAgaW50ZWdyYXRpb25IdHRwTWV0aG9kOiByZXNvdXJjZS5odHRwTWV0aG9kLnRvU3RyaW5nKCksXG4gICAgICAgIHVyaTogYGh0dHA6Ly8ke3Jlc291cmNlLm5ldHdvcmtMb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZX0ke3Jlc291cmNlLnBhdGgucmVwbGFjZSgvXFw/LiovLCAnJyl9YCxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNvbm5lY3Rpb25UeXBlOiBDb25uZWN0aW9uVHlwZS5WUENfTElOSyxcbiAgICAgICAgICB2cGNMaW5rOiByZXNvdXJjZS52cGNMaW5rID8/IHJlc291cmNlLnZwY0xpbmtQcm94eSxcbiAgICAgICAgICBpbnRlZ3JhdGlvblJlc3BvbnNlczogW3tcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6ICcyMDAnLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiBpbnRlZ3JhdGlvblJlcXVlc3RQYXJhbWV0ZXJzLFxuICAgICAgICAgIC4uLnJlc291cmNlLnZwY0xpbmtJbnRlZ3JhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIG1ldGhvZE9wdGlvbnMubWV0aG9kUmVzcG9uc2VzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogJzIwMCcsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihyZXNvdXJjZS5tZXRob2RPcHRpb25zPy5tZXRob2RSZXNwb25zZXMgPyByZXNvdXJjZS5tZXRob2RPcHRpb25zPy5tZXRob2RSZXNwb25zZXMgOiBbXSksXG4gICAgICBdO1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UuaW50ZWdyYXRpb24pIHtcbiAgICAgIGludGVncmF0aW9uID0gcmVzb3VyY2UuaW50ZWdyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGludGVncmF0aW9uIHByb3BzLCBzdXBwb3J0IGxhbWJkYUZ1bmN0aW9uLCBBUEkgR2F0ZXdheSBJbnRlZ3JhdGlvbiB0eXBlcycpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGF1dGhvcml6YXRpb25UeXBlKSB7XG4gICAgICBjYXNlIEF1dGhvcml6YXRpb25UeXBlLkNPR05JVE86XG4gICAgICBjYXNlIEF1dGhvcml6YXRpb25UeXBlLkNVU1RPTTpcbiAgICAgICAgbGV0IGF1dGhvcml6ZXI6IElBdXRob3JpemVyO1xuICAgICAgICBpZiAocmVzb3VyY2UuYXV0aG9yaXplcikge1xuICAgICAgICAgIGF1dGhvcml6ZXIgPSByZXNvdXJjZS5hdXRob3JpemVyO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2xvYmFsQXV0aG9yaXplcikge1xuICAgICAgICAgIGF1dGhvcml6ZXIgPSB0aGlzLmdsb2JhbEF1dGhvcml6ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3Ugc3BlY2lmeSBhdXRob3JpemF0aW9uIHR5cGUgaXMgQ09HTklUTywgYnV0IG5vdCBzcGVjaWZ5IGF1dGhvcml6ZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kT3B0aW9ucy5hdXRob3JpemF0aW9uVHlwZSA9IEF1dGhvcml6YXRpb25UeXBlLkNPR05JVE87XG4gICAgICAgIG1ldGhvZE9wdGlvbnMuYXV0aG9yaXplciA9IGF1dGhvcml6ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdXRob3JpemF0aW9uVHlwZS5JQU06XG4gICAgICAgIG1ldGhvZE9wdGlvbnMuYXV0aG9yaXphdGlvblR5cGUgPSBBdXRob3JpemF0aW9uVHlwZS5JQU07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdXRob3JpemF0aW9uVHlwZS5OT05FOlxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gICAgdGhpcy5yZXNvdXJjZXNbbGFzdFBhdGhdLmFkZE1ldGhvZChcbiAgICAgIHJlc291cmNlLmh0dHBNZXRob2QudG9TdHJpbmcoKSxcbiAgICAgIGludGVncmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5yZXNvdXJjZS5tZXRob2RPcHRpb25zLFxuICAgICAgICAuLi48TWV0aG9kT3B0aW9ucz4gbWV0aG9kT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufSJdfQ==