@glicogh/healthcare-cdk 0.1.87 → 0.1.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.env.example CHANGED
@@ -13,6 +13,10 @@ EC2_MYSQL_INSTANCE_TYPE=t4g.nano
13
13
  EC2_MYSQL_INSTANCE_STORAGE_SIZE=10
14
14
  EC2_MYSQL_INSTANCE_STORAGE_TYPE=gp3
15
15
 
16
+ EC2_CLICKHOUSE_INSTANCE_TYPE=t4g.nano
17
+ EC2_CLICKHOUSE_INSTANCE_STORAGE_SIZE=50
18
+ EC2_CLICKHOUSE_INSTANCE_STORAGE_TYPE=gp3
19
+
16
20
  EC2_API_GATEWAY_INSTANCE_TYPE=t4g.nano
17
21
  EC2_API_GATEWAY_INSTANCE_STORAGE_SIZE=
18
22
  EC2_API_GATEWAY_INSTANCE_STORAGE_TYPE=gp3
package/README.md CHANGED
@@ -77,6 +77,7 @@ The output looks like this
77
77
  MicroserviceNetwork
78
78
  MicroserviceRedis
79
79
  MicroserviceMySQL
80
+ MicroserviceClickHouse
80
81
  ```
81
82
 
82
83
  ## Running the CDK
@@ -89,6 +90,7 @@ The following stack are meant to be deployed once and shared across the microser
89
90
  - MicroserviceInfraAuth
90
91
  - MicroserviceRedis
91
92
  - MicroserviceMySQL
93
+ - MicroserviceClickHouse
92
94
 
93
95
  The only required option for these stack is `env`. For example, to deploy `MicroserviceNetwork` in the UAT environment, you would run the command
94
96
 
@@ -16,7 +16,7 @@ export type BuildConfig = {
16
16
  };
17
17
  };
18
18
  export type Microservice = 'account' | 'plan' | 'policy' | 'claims' | 'notification' | 'reporting';
19
- export type OtherCDKService = 'network' | 'api-gateway' | 'redis' | 'mysql' | 'portal' | 'migration';
19
+ export type OtherCDKService = 'network' | 'api-gateway' | 'redis' | 'mysql' | 'clickhouse' | 'portal' | 'migration';
20
20
  export declare const MicroserviceEnum: Record<Microservice, Microservice>;
21
21
  export declare const MicroserviceList: Microservice[];
22
22
  export declare const LaravelBasedServiceList: ("account" | "plan" | "policy" | "claims" | "reporting")[];
@@ -16,8 +16,9 @@ exports.OtherCDKServiceEnum = {
16
16
  'api-gateway': 'api-gateway',
17
17
  redis: 'redis',
18
18
  mysql: 'mysql',
19
+ clickhouse: 'clickhouse',
19
20
  portal: 'portal',
20
21
  migration: 'migration',
21
22
  };
22
23
  exports.OtherCDKServiceList = Object.values(exports.OtherCDKServiceEnum);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vQHR5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxQmEsUUFBQSxnQkFBZ0IsR0FBdUM7SUFDbEUsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsY0FBYztJQUM1QixTQUFTLEVBQUUsV0FBVztJQUN0QixNQUFNLEVBQUUsUUFBUTtDQUNqQixDQUFDO0FBRVcsUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUFnQixDQUFDLENBQUM7QUFFbkQsUUFBQSx1QkFBdUIsR0FBRyx3QkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxjQUFjLENBQUMsQ0FBQztBQUUvRSxRQUFBLG1CQUFtQixHQUE2QztJQUMzRSxPQUFPLEVBQUUsU0FBUztJQUNsQixhQUFhLEVBQUUsYUFBYTtJQUM1QixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsTUFBTSxFQUFFLFFBQVE7SUFDaEIsU0FBUyxFQUFFLFdBQVc7Q0FDdkIsQ0FBQztBQUVXLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQkFBbUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRW52TmFtZSA9ICd1YXQnIHwgJ3Byb2QnO1xuZXhwb3J0IHR5cGUgUmVwb0JyYW5jaCA9ICdtYXN0ZXInIHwgJ3JlbGVhc2UnO1xuZXhwb3J0IHR5cGUgQnVpbGRDb25maWcgPSB7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgYXBwVmVyc2lvbjogc3RyaW5nO1xuICBidWlsZElkOiBzdHJpbmc7XG4gIGZvcm1hdHRlZEJ1aWxkSWQ6IHN0cmluZztcbiAgZW52TmFtZTogRW52TmFtZTtcbiAgZW52UGF0aDogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogTWljcm9zZXJ2aWNlIHwgT3RoZXJDREtTZXJ2aWNlO1xuICBicmFuY2g/OiBzdHJpbmc7XG4gIGNvbXBhbnlOYW1lOiBzdHJpbmc7XG4gIGF3czoge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgfTtcbn07XG5leHBvcnQgdHlwZSBNaWNyb3NlcnZpY2UgPSAnYWNjb3VudCcgfCAncGxhbicgfCAncG9saWN5JyB8ICdjbGFpbXMnIHwgJ25vdGlmaWNhdGlvbicgfCAncmVwb3J0aW5nJztcblxuZXhwb3J0IHR5cGUgT3RoZXJDREtTZXJ2aWNlID0gJ25ldHdvcmsnIHwgJ2FwaS1nYXRld2F5JyB8ICdyZWRpcycgfCAnbXlzcWwnIHwgJ3BvcnRhbCcgfCAnbWlncmF0aW9uJztcblxuZXhwb3J0IGNvbnN0IE1pY3Jvc2VydmljZUVudW06IFJlY29yZDxNaWNyb3NlcnZpY2UsIE1pY3Jvc2VydmljZT4gPSB7XG4gIGFjY291bnQ6ICdhY2NvdW50JyxcbiAgcGxhbjogJ3BsYW4nLFxuICBwb2xpY3k6ICdwb2xpY3knLFxuICBub3RpZmljYXRpb246ICdub3RpZmljYXRpb24nLFxuICByZXBvcnRpbmc6ICdyZXBvcnRpbmcnLFxuICBjbGFpbXM6ICdjbGFpbXMnLFxufTtcblxuZXhwb3J0IGNvbnN0IE1pY3Jvc2VydmljZUxpc3QgPSBPYmplY3QudmFsdWVzKE1pY3Jvc2VydmljZUVudW0pO1xuXG5leHBvcnQgY29uc3QgTGFyYXZlbEJhc2VkU2VydmljZUxpc3QgPSBNaWNyb3NlcnZpY2VMaXN0LmZpbHRlcigoaSkgPT4gaSAhPT0gJ25vdGlmaWNhdGlvbicpO1xuXG5leHBvcnQgY29uc3QgT3RoZXJDREtTZXJ2aWNlRW51bTogUmVjb3JkPE90aGVyQ0RLU2VydmljZSwgT3RoZXJDREtTZXJ2aWNlPiA9IHtcbiAgbmV0d29yazogJ25ldHdvcmsnLFxuICAnYXBpLWdhdGV3YXknOiAnYXBpLWdhdGV3YXknLFxuICByZWRpczogJ3JlZGlzJyxcbiAgbXlzcWw6ICdteXNxbCcsXG4gIHBvcnRhbDogJ3BvcnRhbCcsXG4gIG1pZ3JhdGlvbjogJ21pZ3JhdGlvbicsXG59O1xuXG5leHBvcnQgY29uc3QgT3RoZXJDREtTZXJ2aWNlTGlzdCA9IE9iamVjdC52YWx1ZXMoT3RoZXJDREtTZXJ2aWNlRW51bSk7XG5cbmV4cG9ydCB0eXBlIFJlcG9VcmxzID0geyBba2V5IGluIEJ1aWxkQ29uZmlnWydzZXJ2aWNlTmFtZSddXT86IHN0cmluZyB9O1xuZXhwb3J0IHR5cGUgUmVwb0JyYW5jaGVzID0geyBba2V5IGluIEVudk5hbWVdOiBSZXBvQnJhbmNoIH07XG4iXX0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vQHR5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFxQmEsUUFBQSxnQkFBZ0IsR0FBdUM7SUFDbEUsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLE1BQU07SUFDWixNQUFNLEVBQUUsUUFBUTtJQUNoQixZQUFZLEVBQUUsY0FBYztJQUM1QixTQUFTLEVBQUUsV0FBVztJQUN0QixNQUFNLEVBQUUsUUFBUTtDQUNqQixDQUFDO0FBRVcsUUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUFnQixDQUFDLENBQUM7QUFFbkQsUUFBQSx1QkFBdUIsR0FBRyx3QkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxjQUFjLENBQUMsQ0FBQztBQUUvRSxRQUFBLG1CQUFtQixHQUE2QztJQUMzRSxPQUFPLEVBQUUsU0FBUztJQUNsQixhQUFhLEVBQUUsYUFBYTtJQUM1QixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsVUFBVSxFQUFFLFlBQVk7SUFDeEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsU0FBUyxFQUFFLFdBQVc7Q0FDdkIsQ0FBQztBQUVXLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQywyQkFBbUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRW52TmFtZSA9ICd1YXQnIHwgJ3Byb2QnO1xuZXhwb3J0IHR5cGUgUmVwb0JyYW5jaCA9ICdtYXN0ZXInIHwgJ3JlbGVhc2UnO1xuZXhwb3J0IHR5cGUgQnVpbGRDb25maWcgPSB7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgYXBwVmVyc2lvbjogc3RyaW5nO1xuICBidWlsZElkOiBzdHJpbmc7XG4gIGZvcm1hdHRlZEJ1aWxkSWQ6IHN0cmluZztcbiAgZW52TmFtZTogRW52TmFtZTtcbiAgZW52UGF0aDogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogTWljcm9zZXJ2aWNlIHwgT3RoZXJDREtTZXJ2aWNlO1xuICBicmFuY2g/OiBzdHJpbmc7XG4gIGNvbXBhbnlOYW1lOiBzdHJpbmc7XG4gIGF3czoge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgfTtcbn07XG5leHBvcnQgdHlwZSBNaWNyb3NlcnZpY2UgPSAnYWNjb3VudCcgfCAncGxhbicgfCAncG9saWN5JyB8ICdjbGFpbXMnIHwgJ25vdGlmaWNhdGlvbicgfCAncmVwb3J0aW5nJztcblxuZXhwb3J0IHR5cGUgT3RoZXJDREtTZXJ2aWNlID0gJ25ldHdvcmsnIHwgJ2FwaS1nYXRld2F5JyB8ICdyZWRpcycgfCAnbXlzcWwnIHwgJ2NsaWNraG91c2UnIHwgJ3BvcnRhbCcgfCAnbWlncmF0aW9uJztcblxuZXhwb3J0IGNvbnN0IE1pY3Jvc2VydmljZUVudW06IFJlY29yZDxNaWNyb3NlcnZpY2UsIE1pY3Jvc2VydmljZT4gPSB7XG4gIGFjY291bnQ6ICdhY2NvdW50JyxcbiAgcGxhbjogJ3BsYW4nLFxuICBwb2xpY3k6ICdwb2xpY3knLFxuICBub3RpZmljYXRpb246ICdub3RpZmljYXRpb24nLFxuICByZXBvcnRpbmc6ICdyZXBvcnRpbmcnLFxuICBjbGFpbXM6ICdjbGFpbXMnLFxufTtcblxuZXhwb3J0IGNvbnN0IE1pY3Jvc2VydmljZUxpc3QgPSBPYmplY3QudmFsdWVzKE1pY3Jvc2VydmljZUVudW0pO1xuXG5leHBvcnQgY29uc3QgTGFyYXZlbEJhc2VkU2VydmljZUxpc3QgPSBNaWNyb3NlcnZpY2VMaXN0LmZpbHRlcigoaSkgPT4gaSAhPT0gJ25vdGlmaWNhdGlvbicpO1xuXG5leHBvcnQgY29uc3QgT3RoZXJDREtTZXJ2aWNlRW51bTogUmVjb3JkPE90aGVyQ0RLU2VydmljZSwgT3RoZXJDREtTZXJ2aWNlPiA9IHtcbiAgbmV0d29yazogJ25ldHdvcmsnLFxuICAnYXBpLWdhdGV3YXknOiAnYXBpLWdhdGV3YXknLFxuICByZWRpczogJ3JlZGlzJyxcbiAgbXlzcWw6ICdteXNxbCcsXG4gIGNsaWNraG91c2U6ICdjbGlja2hvdXNlJyxcbiAgcG9ydGFsOiAncG9ydGFsJyxcbiAgbWlncmF0aW9uOiAnbWlncmF0aW9uJyxcbn07XG5cbmV4cG9ydCBjb25zdCBPdGhlckNES1NlcnZpY2VMaXN0ID0gT2JqZWN0LnZhbHVlcyhPdGhlckNES1NlcnZpY2VFbnVtKTtcblxuZXhwb3J0IHR5cGUgUmVwb1VybHMgPSB7IFtrZXkgaW4gQnVpbGRDb25maWdbJ3NlcnZpY2VOYW1lJ11dPzogc3RyaW5nIH07XG5leHBvcnQgdHlwZSBSZXBvQnJhbmNoZXMgPSB7IFtrZXkgaW4gRW52TmFtZV06IFJlcG9CcmFuY2ggfTtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ import * as cdk from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+ export declare class MicroserviceClickHouse extends cdk.Stack {
4
+ constructor(scope: Construct, id: string, props?: cdk.StackProps);
5
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MicroserviceClickHouse = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const constants_1 = require("../util/constants");
6
+ const initBuildConfig_1 = require("../util/initBuildConfig");
7
+ const getInstanceType_1 = require("../util/getInstanceType");
8
+ const getEc2UserData_1 = require("../util/getEc2UserData");
9
+ const getInstanceStorage_1 = require("../util/getInstanceStorage");
10
+ class MicroserviceClickHouse extends cdk.Stack {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, props);
13
+ if (!initBuildConfig_1.buildConfig) {
14
+ throw new Error('BuildConfig not set');
15
+ }
16
+ const vpc = cdk.aws_ec2.Vpc.fromLookup(this, 'VPCLookup', {
17
+ vpcName: (0, constants_1.getEnvConstant)('vpcId'),
18
+ });
19
+ const secGroup = cdk.aws_ec2.SecurityGroup.fromLookupByName(this, 'SecGroupLookup', (0, constants_1.getEnvConstant)('clickhouseSecurityGroupId'), vpc);
20
+ const instance = new cdk.aws_ec2.Instance(this, `ec2-clickhouse-${initBuildConfig_1.buildConfig.envName}`, {
21
+ vpc,
22
+ securityGroup: secGroup,
23
+ instanceType: new cdk.aws_ec2.InstanceType((0, getInstanceType_1.getInstanceType)('clickhouse')),
24
+ machineImage: cdk.aws_ec2.MachineImage.genericLinux({
25
+ [initBuildConfig_1.buildConfig.aws.region]: (0, constants_1.getConstant)('defaultImageAmi'),
26
+ }),
27
+ vpcSubnets: { subnetType: cdk.aws_ec2.SubnetType.PRIVATE_WITH_EGRESS },
28
+ associatePublicIpAddress: false,
29
+ userData: cdk.aws_ec2.UserData.custom((0, getEc2UserData_1.getEc2UserData)('clickhouse')),
30
+ role: cdk.aws_iam.Role.fromRoleName(this, 'BaseRoleLookup', (0, constants_1.getConstant)('baseRoleName')),
31
+ blockDevices: (0, getInstanceStorage_1.getInstanceStorage)('clickhouse'),
32
+ });
33
+ new cdk.CfnOutput(this, 'internal-domain', {
34
+ value: instance.instancePrivateDnsName,
35
+ });
36
+ new cdk.CfnOutput(this, 'internal-ip', {
37
+ value: instance.instancePrivateIp,
38
+ });
39
+ }
40
+ }
41
+ exports.MicroserviceClickHouse = MicroserviceClickHouse;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLWNsaWNraG91c2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWljcm9zZXJ2aWNlLWNsaWNraG91c2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBRW5DLGlEQUFnRTtBQUNoRSw2REFBc0Q7QUFDdEQsNkRBQTBEO0FBQzFELDJEQUF3RDtBQUN4RCxtRUFBZ0U7QUFFaEUsTUFBYSxzQkFBdUIsU0FBUSxHQUFHLENBQUMsS0FBSztJQUNuRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyw2QkFBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUN4RCxPQUFPLEVBQUUsSUFBQSwwQkFBYyxFQUFDLE9BQU8sQ0FBQztTQUNqQyxDQUFDLENBQUM7UUFFSCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBQSwwQkFBYyxFQUFDLDJCQUEyQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFdEksTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLDZCQUFXLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdkYsR0FBRztZQUNILGFBQWEsRUFBRSxRQUFRO1lBQ3ZCLFlBQVksRUFBRSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUEsaUNBQWUsRUFBQyxZQUFZLENBQUMsQ0FBQztZQUN6RSxZQUFZLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO2dCQUNsRCxDQUFDLDZCQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUEsdUJBQVcsRUFBQyxpQkFBaUIsQ0FBVzthQUNuRSxDQUFDO1lBQ0YsVUFBVSxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFO1lBQ3RFLHdCQUF3QixFQUFFLEtBQUs7WUFDL0IsUUFBUSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFBLCtCQUFjLEVBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBQSx1QkFBVyxFQUFDLGNBQWMsQ0FBVyxDQUFDO1lBQ2xHLFlBQVksRUFBRSxJQUFBLHVDQUFrQixFQUFDLFlBQVksQ0FBQztTQUMvQyxDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQ3pDLEtBQUssRUFBRSxRQUFRLENBQUMsc0JBQXNCO1NBQ3ZDLENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQ3JDLEtBQUssRUFBRSxRQUFRLENBQUMsaUJBQWlCO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXBDRCx3REFvQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBnZXRDb25zdGFudCwgZ2V0RW52Q29uc3RhbnQgfSBmcm9tICcuLi91dGlsL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBidWlsZENvbmZpZyB9IGZyb20gJy4uL3V0aWwvaW5pdEJ1aWxkQ29uZmlnJztcbmltcG9ydCB7IGdldEluc3RhbmNlVHlwZSB9IGZyb20gJy4uL3V0aWwvZ2V0SW5zdGFuY2VUeXBlJztcbmltcG9ydCB7IGdldEVjMlVzZXJEYXRhIH0gZnJvbSAnLi4vdXRpbC9nZXRFYzJVc2VyRGF0YSc7XG5pbXBvcnQgeyBnZXRJbnN0YW5jZVN0b3JhZ2UgfSBmcm9tICcuLi91dGlsL2dldEluc3RhbmNlU3RvcmFnZSc7XG5cbmV4cG9ydCBjbGFzcyBNaWNyb3NlcnZpY2VDbGlja0hvdXNlIGV4dGVuZHMgY2RrLlN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBjZGsuU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgaWYgKCFidWlsZENvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWlsZENvbmZpZyBub3Qgc2V0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgdnBjID0gY2RrLmF3c19lYzIuVnBjLmZyb21Mb29rdXAodGhpcywgJ1ZQQ0xvb2t1cCcsIHtcbiAgICAgIHZwY05hbWU6IGdldEVudkNvbnN0YW50KCd2cGNJZCcpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VjR3JvdXAgPSBjZGsuYXdzX2VjMi5TZWN1cml0eUdyb3VwLmZyb21Mb29rdXBCeU5hbWUodGhpcywgJ1NlY0dyb3VwTG9va3VwJywgZ2V0RW52Q29uc3RhbnQoJ2NsaWNraG91c2VTZWN1cml0eUdyb3VwSWQnKSwgdnBjKTtcblxuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNkay5hd3NfZWMyLkluc3RhbmNlKHRoaXMsIGBlYzItY2xpY2tob3VzZS0ke2J1aWxkQ29uZmlnLmVudk5hbWV9YCwge1xuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cDogc2VjR3JvdXAsXG4gICAgICBpbnN0YW5jZVR5cGU6IG5ldyBjZGsuYXdzX2VjMi5JbnN0YW5jZVR5cGUoZ2V0SW5zdGFuY2VUeXBlKCdjbGlja2hvdXNlJykpLFxuICAgICAgbWFjaGluZUltYWdlOiBjZGsuYXdzX2VjMi5NYWNoaW5lSW1hZ2UuZ2VuZXJpY0xpbnV4KHtcbiAgICAgICAgW2J1aWxkQ29uZmlnLmF3cy5yZWdpb25dOiBnZXRDb25zdGFudCgnZGVmYXVsdEltYWdlQW1pJykgYXMgc3RyaW5nLFxuICAgICAgfSksXG4gICAgICB2cGNTdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IGNkay5hd3NfZWMyLlN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTUyB9LFxuICAgICAgYXNzb2NpYXRlUHVibGljSXBBZGRyZXNzOiBmYWxzZSxcbiAgICAgIHVzZXJEYXRhOiBjZGsuYXdzX2VjMi5Vc2VyRGF0YS5jdXN0b20oZ2V0RWMyVXNlckRhdGEoJ2NsaWNraG91c2UnKSksXG4gICAgICByb2xlOiBjZGsuYXdzX2lhbS5Sb2xlLmZyb21Sb2xlTmFtZSh0aGlzLCAnQmFzZVJvbGVMb29rdXAnLCBnZXRDb25zdGFudCgnYmFzZVJvbGVOYW1lJykgYXMgc3RyaW5nKSxcbiAgICAgIGJsb2NrRGV2aWNlczogZ2V0SW5zdGFuY2VTdG9yYWdlKCdjbGlja2hvdXNlJyksXG4gICAgfSk7XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnaW50ZXJuYWwtZG9tYWluJywge1xuICAgICAgdmFsdWU6IGluc3RhbmNlLmluc3RhbmNlUHJpdmF0ZURuc05hbWUsXG4gICAgfSk7XG5cbiAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnaW50ZXJuYWwtaXAnLCB7XG4gICAgICB2YWx1ZTogaW5zdGFuY2UuaW5zdGFuY2VQcml2YXRlSXAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -92,6 +92,18 @@ class MicroserviceNetwork extends cdk.Stack {
92
92
  mysqlSecGrp.addIngressRule(cdk.aws_ec2.Peer.ipv4(vpc.vpcCidrBlock), cdk.aws_ec2.Port.tcp(22), 'SSH from within VPC');
93
93
  // add rule for MySQL access
94
94
  mysqlSecGrp.addIngressRule(cdk.aws_ec2.Peer.ipv4(vpc.vpcCidrBlock), cdk.aws_ec2.Port.tcp(3306), 'MySQL from within VPC');
95
+ // security group for ClickHouse server
96
+ const clickhouseSecGrp = new cdk.aws_ec2.SecurityGroup(this, (0, constants_1.getEnvConstant)('clickhouseSecurityGroupId'), {
97
+ vpc,
98
+ securityGroupName: (0, constants_1.getEnvConstant)('clickhouseSecurityGroupId'),
99
+ allowAllOutbound: true,
100
+ });
101
+ // add rule for SSH access
102
+ clickhouseSecGrp.addIngressRule(cdk.aws_ec2.Peer.ipv4(vpc.vpcCidrBlock), cdk.aws_ec2.Port.tcp(22), 'SSH from within VPC');
103
+ // add rule for ClickHouse HTTP access
104
+ clickhouseSecGrp.addIngressRule(cdk.aws_ec2.Peer.ipv4(vpc.vpcCidrBlock), cdk.aws_ec2.Port.tcp(8123), 'ClickHouse HTTP from within VPC');
105
+ // add rule for ClickHouse native access
106
+ clickhouseSecGrp.addIngressRule(cdk.aws_ec2.Peer.ipv4(vpc.vpcCidrBlock), cdk.aws_ec2.Port.tcp(9000), 'ClickHouse native from within VPC');
95
107
  // security group for Notification service
96
108
  const notificationSecGrp = new cdk.aws_ec2.SecurityGroup(this, (0, constants_1.getEnvConstant)('notificationServiceSecurityGroupId'), {
97
109
  vpc,
@@ -138,4 +150,4 @@ class MicroserviceNetwork extends cdk.Stack {
138
150
  }
139
151
  }
140
152
  exports.MicroserviceNetwork = MicroserviceNetwork;
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLW5ldHdvcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWljcm9zZXJ2aWNlLW5ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBRW5DLGlEQUFnRTtBQUNoRSw2REFBc0Q7QUFDdEQscUVBQWtFO0FBRWxFLE1BQWEsbUJBQW9CLFNBQVEsR0FBRyxDQUFDLEtBQUs7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsNkJBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzVDLFVBQVUsRUFBRSxJQUFBLHlDQUFtQixHQUFFO1lBQ2pDLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlO1lBQy9ELGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU07WUFDdkMsSUFBSSxFQUFFO2dCQUNKO29CQUNFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDckIsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7b0JBQ3hHLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDckIsY0FBYyxFQUFFLEVBQUU7aUJBQ25CO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFBLDBCQUFjLEVBQUMsT0FBTyxDQUFDLEVBQUU7WUFDN0QsT0FBTyxFQUFFLElBQUEsMEJBQWMsRUFBQyxPQUFPLENBQUM7WUFDaEMsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsV0FBVyxFQUFFLENBQUM7WUFDZCw0RUFBNEU7WUFDNUUsd0VBQXdFO1lBQ3hFLEdBQUcsQ0FBQyw2QkFBVyxDQUFDLE9BQU8sS0FBSyxNQUFNLElBQUk7Z0JBQ3BDLGtCQUFrQixFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztvQkFDeEQsWUFBWSxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2lCQUN2RCxDQUFDO2FBQ0gsQ0FBQztZQUNGLDRCQUE0QixFQUFFLElBQUk7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsOEZBQThGO1FBQzlGLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRTtZQUMxQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFO1lBQ3BELE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDdEUsQ0FBQyxDQUFDO1FBRUgsNEJBQTRCO1FBQzVCLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUEsMEJBQWMsRUFBQyx1QkFBdUIsQ0FBQyxFQUFFO1lBQ2hHLEdBQUc7WUFDSCxpQkFBaUIsRUFBRSxJQUFBLDBCQUFjLEVBQUMsdUJBQXVCLENBQUM7WUFDMUQsZ0JBQWdCLEVBQUUsSUFBSTtTQUN2QixDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUN4Ryw0QkFBNEI7UUFDNUIsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUMxRywwQkFBMEI7UUFDMUIsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBRXRILGlDQUFpQztRQUNqQyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUEsMEJBQWMsRUFBQywyQkFBMkIsQ0FBQyxFQUFFO1lBQ3hHLEdBQUc7WUFDSCxpQkFBaUIsRUFBRSxJQUFBLDBCQUFjLEVBQUMsMkJBQTJCLENBQUM7WUFDOUQsZ0JBQWdCLEVBQUUsSUFBSTtTQUN2QixDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVHLDRCQUE0QjtRQUM1QixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDOUcsMEJBQTBCO1FBQzFCLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUMzRyxzQ0FBc0M7UUFDdEMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLHFEQUFxRCxDQUFDLENBQUM7UUFFNUosa0NBQWtDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUEsMEJBQWMsRUFBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQzlGLEdBQUc7WUFDSCxpQkFBaUIsRUFBRSxJQUFBLDBCQUFjLEVBQUMsc0JBQXNCLENBQUM7WUFDekQsZ0JBQWdCLEVBQUUsSUFBSTtTQUN2QixDQUFDLENBQUM7UUFFSCwwQkFBMEI7UUFDMUIsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JILDRCQUE0QjtRQUM1QixXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFekgsa0NBQWtDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUEsMEJBQWMsRUFBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQzlGLEdBQUc7WUFDSCxpQkFBaUIsRUFBRSxJQUFBLDBCQUFjLEVBQUMsc0JBQXNCLENBQUM7WUFDekQsZ0JBQWdCLEVBQUUsSUFBSTtTQUN2QixDQUFDLENBQUM7UUFFSCwwQkFBMEI7UUFDMUIsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JILDRCQUE0QjtRQUM1QixXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFekgsMENBQTBDO1FBQzFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBQSwwQkFBYyxFQUFDLG9DQUFvQyxDQUFDLEVBQUU7WUFDbkgsR0FBRztZQUNILGlCQUFpQixFQUFFLElBQUEsMEJBQWMsRUFBQyxvQ0FBb0MsQ0FBQztZQUN2RSxnQkFBZ0IsRUFBRSxJQUFJO1NBQ3ZCLENBQUMsQ0FBQztRQUVILDBCQUEwQjtRQUMxQixrQkFBa0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUM1SCwyQkFBMkI7UUFDM0Isa0JBQWtCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFFL0gsNENBQTRDO1FBQzVDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUEsMEJBQWMsRUFBQyw2QkFBNkIsQ0FBQyxFQUFFO1lBQ3ZHLEdBQUc7WUFDSCxpQkFBaUIsRUFBRSxJQUFBLDBCQUFjLEVBQUMsNkJBQTZCLENBQUM7WUFDaEUsZ0JBQWdCLEVBQUUsSUFBSTtTQUN2QixDQUFDLENBQUM7UUFFSCwwQkFBMEI7UUFDMUIsYUFBYSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3ZILG9CQUFvQjtRQUNwQixhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDMUgsK0JBQStCO1FBQy9CLGFBQWEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUVySSxrREFBa0Q7UUFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBQSwwQkFBYyxFQUFDLDJDQUEyQyxDQUFDLEVBQUU7WUFDakgsR0FBRztZQUNILGlCQUFpQixFQUFFLElBQUEsMEJBQWMsRUFBQywyQ0FBMkMsQ0FBQztZQUM5RSxnQkFBZ0IsRUFBRSxLQUFLO1NBQ3hCLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixTQUFTLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFaEgsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFBLDBCQUFjLEVBQUMsOEJBQThCLENBQUMsRUFBRTtZQUMvRixnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7WUFDN0MsUUFBUSxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6QyxDQUFDLENBQUM7UUFFSCwyQkFBMkI7UUFDM0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUEsdUJBQVcsRUFBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM5RyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFBLHVCQUFXLEVBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFL0Usc0JBQXNCO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFBLHVCQUFXLEVBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUEsdUJBQVcsRUFBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkUsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDaEMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXpKRCxrREF5SkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBnZXRDb25zdGFudCwgZ2V0RW52Q29uc3RhbnQgfSBmcm9tICcuLi91dGlsL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBidWlsZENvbmZpZyB9IGZyb20gJy4uL3V0aWwvaW5pdEJ1aWxkQ29uZmlnJztcbmltcG9ydCB7IGdldFB1YmxpY0J1Y2tldE5hbWUgfSBmcm9tICcuLi91dGlsL2dldFB1YmxpY0J1Y2tldE5hbWUnO1xuXG5leHBvcnQgY2xhc3MgTWljcm9zZXJ2aWNlTmV0d29yayBleHRlbmRzIGNkay5TdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogY2RrLlN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIGlmICghYnVpbGRDb25maWcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRDb25maWcgbm90IHNldCcpO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBwdWJsaWMgczMgYnVja2V0XG4gICAgbmV3IGNkay5hd3NfczMuQnVja2V0KHRoaXMsICdQdWJsaWNTM0J1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IGdldFB1YmxpY0J1Y2tldE5hbWUoKSxcbiAgICAgIHB1YmxpY1JlYWRBY2Nlc3M6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogY2RrLmF3c19zMy5CbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BQ0xTX09OTFksXG4gICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBjb3JzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbGxvd2VkSGVhZGVyczogWycqJ10sXG4gICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IFtjZGsuYXdzX3MzLkh0dHBNZXRob2RzLlBPU1QsIGNkay5hd3NfczMuSHR0cE1ldGhvZHMuUFVULCBjZGsuYXdzX3MzLkh0dHBNZXRob2RzLkRFTEVURV0sXG4gICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IFsnKiddLFxuICAgICAgICAgIGV4cG9zZWRIZWFkZXJzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCB2cGMgPSBuZXcgY2RrLmF3c19lYzIuVnBjKHRoaXMsIGdldEVudkNvbnN0YW50KCd2cGNJZCcpLCB7XG4gICAgICB2cGNOYW1lOiBnZXRFbnZDb25zdGFudCgndnBjSWQnKSxcbiAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdHJ1ZSxcbiAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRydWUsXG4gICAgICBtYXhBenM6IDEsXG4gICAgICBuYXRHYXRld2F5czogMSxcbiAgICAgIC8vIHByb3Zpc2lvbiBhbmQgdXNlIGFuIEVDMiBpbnN0YW5jZSBhcyBOQVQgZ2F0ZXdheSBpbiBub24tcHJvZCBlbnZpcm9ubWVudHNcbiAgICAgIC8vIGluIHByb2QsIHRoZSBkZWZhdWx0IG1vcmUgc2NhbGFibGUvZXhwZW5zaXZlIE5BVCBnYXRld2F5IHdpbGwgYmUgdXNlZFxuICAgICAgLi4uKGJ1aWxkQ29uZmlnLmVudk5hbWUgIT09ICdwcm9kJyAmJiB7XG4gICAgICAgIG5hdEdhdGV3YXlQcm92aWRlcjogbmV3IGNkay5hd3NfZWMyLk5hdEluc3RhbmNlUHJvdmlkZXJWMih7XG4gICAgICAgICAgaW5zdGFuY2VUeXBlOiBuZXcgY2RrLmF3c19lYzIuSW5zdGFuY2VUeXBlKCd0NGcubmFubycpLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgcmVzdHJpY3REZWZhdWx0U2VjdXJpdHlHcm91cDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIHJvdXRlIFMzIHRyYWZmaWMgZnJvbSBwcml2YXRlIHN1Ym5ldHMgdGhyb3VnaCBhIGdhdGV3YXkgZW5kcG9pbnQgaW5zdGVhZCBvZiB0aGUgTkFUIGdhdGV3YXlcbiAgICB2cGMuYWRkR2F0ZXdheUVuZHBvaW50KCdTM0dhdGV3YXlFbmRwb2ludCcsIHtcbiAgICAgIHNlcnZpY2U6IGNkay5hd3NfZWMyLkdhdGV3YXlWcGNFbmRwb2ludEF3c1NlcnZpY2UuUzMsXG4gICAgICBzdWJuZXRzOiBbeyBzdWJuZXRUeXBlOiBjZGsuYXdzX2VjMi5TdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1MgfV0sXG4gICAgfSk7XG5cbiAgICAvLyBzZWN1cml0eSBncm91cCBmb3IgUG9ydGFsXG4gICAgY29uc3QgcG9ydGFsU2VjR3JwID0gbmV3IGNkay5hd3NfZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgZ2V0RW52Q29uc3RhbnQoJ3BvcnRhbFNlY3VyaXR5R3JvdXBJZCcpLCB7XG4gICAgICB2cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogZ2V0RW52Q29uc3RhbnQoJ3BvcnRhbFNlY3VyaXR5R3JvdXBJZCcpLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIGFkZCBydWxlIGZvciBIVFRQIGFjY2Vzc1xuICAgIHBvcnRhbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmFueUlwdjQoKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoODApLCAnSFRUUCBmcm9tIGFueXdoZXJlJyk7XG4gICAgLy8gYWRkIHJ1bGUgZm9yIEhUVFBTIGFjY2Vzc1xuICAgIHBvcnRhbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmFueUlwdjQoKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoNDQzKSwgJ0hUVFBTIGZyb20gYW55d2hlcmUnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgU1NIIGFjY2Vzc1xuICAgIHBvcnRhbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDIyKSwgJ1NTSCBmcm9tIHdpdGhpbiBWUEMnKTtcblxuICAgIC8vIHNlY3VyaXR5IGdyb3VwIGZvciBBUEkgR2F0ZXdheVxuICAgIGNvbnN0IGFwaUdhdGV3YXlTZWNHcnAgPSBuZXcgY2RrLmF3c19lYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBnZXRFbnZDb25zdGFudCgnYXBpR2F0ZXdheVNlY3VyaXR5R3JvdXBJZCcpLCB7XG4gICAgICB2cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogZ2V0RW52Q29uc3RhbnQoJ2FwaUdhdGV3YXlTZWN1cml0eUdyb3VwSWQnKSxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgcnVsZSBmb3IgSFRUUCBhY2Nlc3NcbiAgICBhcGlHYXRld2F5U2VjR3JwLmFkZEluZ3Jlc3NSdWxlKGNkay5hd3NfZWMyLlBlZXIuYW55SXB2NCgpLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCg4MCksICdIVFRQIGZyb20gYW55d2hlcmUnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgSFRUUFMgYWNjZXNzXG4gICAgYXBpR2F0ZXdheVNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmFueUlwdjQoKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoNDQzKSwgJ0hUVFBTIGZyb20gYW55d2hlcmUnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgU1NIIGFjY2Vzc1xuICAgIGFwaUdhdGV3YXlTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5hbnlJcHY0KCksIGNkay5hd3NfZWMyLlBvcnQudGNwKDIyKSwgJ1NTSCBmcm9tIGFueXdoZXJlJyk7XG4gICAgLy8gYWRkIHJ1bGUgZm9yIGludGVybmFsIGNvbW11bmljYXRpb25cbiAgICBhcGlHYXRld2F5U2VjR3JwLmFkZEluZ3Jlc3NSdWxlKGNkay5hd3NfZWMyLlBlZXIuaXB2NCh2cGMudnBjQ2lkckJsb2NrKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoODA4MSksICdJbnRlcm5hbCBtaWNyb3NlcnZpY2UgY29tbXVuaWNhdGlvbiBmcm9tIHdpdGhpbiBWUEMnKTtcblxuICAgIC8vIHNlY3VyaXR5IGdyb3VwIGZvciBSZWRpcyBzZXJ2ZXJcbiAgICBjb25zdCByZWRpc1NlY0dycCA9IG5ldyBjZGsuYXdzX2VjMi5TZWN1cml0eUdyb3VwKHRoaXMsIGdldEVudkNvbnN0YW50KCdyZWRpc1NlY3VyaXR5R3JvdXBJZCcpLCB7XG4gICAgICB2cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogZ2V0RW52Q29uc3RhbnQoJ3JlZGlzU2VjdXJpdHlHcm91cElkJyksXG4gICAgICBhbGxvd0FsbE91dGJvdW5kOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gYWRkIHJ1bGUgZm9yIFNTSCBhY2Nlc3NcbiAgICByZWRpc1NlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDIyKSwgJ1NTSCBmcm9tIHdpdGhpbiBWUEMnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgUmVkaXMgYWNjZXNzXG4gICAgcmVkaXNTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCg2Mzc5KSwgJ1JlZGlzIGZyb20gd2l0aGluIFZQQycpO1xuXG4gICAgLy8gc2VjdXJpdHkgZ3JvdXAgZm9yIE15U1FMIHNlcnZlclxuICAgIGNvbnN0IG15c3FsU2VjR3JwID0gbmV3IGNkay5hd3NfZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgZ2V0RW52Q29uc3RhbnQoJ215c3FsU2VjdXJpdHlHcm91cElkJyksIHtcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBOYW1lOiBnZXRFbnZDb25zdGFudCgnbXlzcWxTZWN1cml0eUdyb3VwSWQnKSxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgcnVsZSBmb3IgU1NIIGFjY2Vzc1xuICAgIG15c3FsU2VjR3JwLmFkZEluZ3Jlc3NSdWxlKGNkay5hd3NfZWMyLlBlZXIuaXB2NCh2cGMudnBjQ2lkckJsb2NrKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoMjIpLCAnU1NIIGZyb20gd2l0aGluIFZQQycpO1xuICAgIC8vIGFkZCBydWxlIGZvciBNeVNRTCBhY2Nlc3NcbiAgICBteXNxbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDMzMDYpLCAnTXlTUUwgZnJvbSB3aXRoaW4gVlBDJyk7XG5cbiAgICAvLyBzZWN1cml0eSBncm91cCBmb3IgTm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBjb25zdCBub3RpZmljYXRpb25TZWNHcnAgPSBuZXcgY2RrLmF3c19lYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBnZXRFbnZDb25zdGFudCgnbm90aWZpY2F0aW9uU2VydmljZVNlY3VyaXR5R3JvdXBJZCcpLCB7XG4gICAgICB2cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogZ2V0RW52Q29uc3RhbnQoJ25vdGlmaWNhdGlvblNlcnZpY2VTZWN1cml0eUdyb3VwSWQnKSxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgcnVsZSBmb3IgU1NIIGFjY2Vzc1xuICAgIG5vdGlmaWNhdGlvblNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDIyKSwgJ1NTSCBmcm9tIHdpdGhpbiBWUEMnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgSFRUUCBhY2Nlc3NcbiAgICBub3RpZmljYXRpb25TZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCg4MDgwKSwgJ0hUVFAgZnJvbSB3aXRoaW4gVlBDJyk7XG5cbiAgICAvLyBzZWN1cml0eSBncm91cCBmb3IgTGFyYXZlbC1iYXNlZCBzZXJ2aWNlc1xuICAgIGNvbnN0IGxhcmF2ZWxTZWNHcnAgPSBuZXcgY2RrLmF3c19lYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBnZXRFbnZDb25zdGFudCgnbGFyYXZlbEJhc2VkU2VjdXJpdHlHcm91cElkJyksIHtcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBOYW1lOiBnZXRFbnZDb25zdGFudCgnbGFyYXZlbEJhc2VkU2VjdXJpdHlHcm91cElkJyksXG4gICAgICBhbGxvd0FsbE91dGJvdW5kOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gYWRkIHJ1bGUgZm9yIFNTSCBhY2Nlc3NcbiAgICBsYXJhdmVsU2VjR3JwLmFkZEluZ3Jlc3NSdWxlKGNkay5hd3NfZWMyLlBlZXIuaXB2NCh2cGMudnBjQ2lkckJsb2NrKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoMjIpLCAnU1NIIGZyb20gd2l0aGluIFZQQycpO1xuICAgIC8vIGFkZCBydWxlIGZvciBIVFRQXG4gICAgbGFyYXZlbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDgwODApLCAnSFRUUCBmcm9tIHdpdGhpbiBWUEMnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgcHJpbnQgV2ViU29ja2V0XG4gICAgbGFyYXZlbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDgwOTApLCAnUHJpbnQgV2ViU29ja2V0IGZyb20gd2l0aGluIFZQQycpO1xuXG4gICAgLy8gc2VjdXJpdHkgZ3JvdXAgZm9yIEluc3RhbmNlIENvbm5lY3Rpb24gRW5kcG9pbnRcbiAgICBjb25zdCBpY2VTZWNHcnAgPSBuZXcgY2RrLmF3c19lYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBnZXRFbnZDb25zdGFudCgnZWMySW5zdGFuY2VDb25uZWN0RW5kcG9pbnRTZWN1cml0eUdyb3VwSWQnKSwge1xuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cE5hbWU6IGdldEVudkNvbnN0YW50KCdlYzJJbnN0YW5jZUNvbm5lY3RFbmRwb2ludFNlY3VyaXR5R3JvdXBJZCcpLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgcnVsZSBmb3Igb3V0Ym91bmQgU1NIXG4gICAgaWNlU2VjR3JwLmFkZEVncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCgyMiksICdTU0ggdG8gd2l0aGluIFZQQycpO1xuXG4gICAgbmV3IGNkay5hd3NfZWMyLkNmbkluc3RhbmNlQ29ubmVjdEVuZHBvaW50KHRoaXMsIGdldEVudkNvbnN0YW50KCdlYzJJbnN0YW5jZUNvbm5lY3RFbmRwb2ludElkJyksIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHM6IFtpY2VTZWNHcnAuc2VjdXJpdHlHcm91cElkXSxcbiAgICAgIHN1Ym5ldElkOiB2cGMucHJpdmF0ZVN1Ym5ldHNbMF0uc3VibmV0SWQsXG4gICAgfSk7XG5cbiAgICAvLyBBUEkgZ2F0ZXdheSdzIGVsYXN0aWMgSVBcbiAgICBjb25zdCBhcGlHYXRld2F5RUlQID0gbmV3IGNkay5hd3NfZWMyLkNmbkVJUCh0aGlzLCBTdHJpbmcoZ2V0Q29uc3RhbnQoJ2FwaUdhdGV3YXlFSVBJZCcpKSwgeyBkb21haW46ICd2cGMnIH0pO1xuICAgIGNkay5UYWdzLm9mKGFwaUdhdGV3YXlFSVApLmFkZCgnTmFtZScsIFN0cmluZyhnZXRDb25zdGFudCgnYXBpR2F0ZXdheUVJUElkJykpKTtcblxuICAgIC8vIFBvcnRhbCdzIGVsYXN0aWMgSVBcbiAgICBjb25zdCBwb3J0YWxFSVAgPSBuZXcgY2RrLmF3c19lYzIuQ2ZuRUlQKHRoaXMsIFN0cmluZyhnZXRDb25zdGFudCgncG9ydGFsRUlQSWQnKSksIHsgZG9tYWluOiAndnBjJyB9KTtcbiAgICBjZGsuVGFncy5vZihwb3J0YWxFSVApLmFkZCgnTmFtZScsIFN0cmluZyhnZXRDb25zdGFudCgncG9ydGFsRUlQSWQnKSkpO1xuXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ3ZwYyBJRCcsIHtcbiAgICAgIHZhbHVlOiB2cGMudnBjSWQsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLW5ldHdvcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWljcm9zZXJ2aWNlLW5ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBRW5DLGlEQUFnRTtBQUNoRSw2REFBc0Q7QUFDdEQscUVBQWtFO0FBRWxFLE1BQWEsbUJBQW9CLFNBQVEsR0FBRyxDQUFDLEtBQUs7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsNkJBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzVDLFVBQVUsRUFBRSxJQUFBLHlDQUFtQixHQUFFO1lBQ2pDLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlO1lBQy9ELGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE1BQU07WUFDdkMsSUFBSSxFQUFFO2dCQUNKO29CQUNFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDckIsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7b0JBQ3hHLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDckIsY0FBYyxFQUFFLEVBQUU7aUJBQ25CO2FBQ0Y7U0FDRixDQUFDLENB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QUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBQSx1QkFBVyxFQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFBLHVCQUFXLEVBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZFLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ2hDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF2S0Qsa0RBdUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZ2V0Q29uc3RhbnQsIGdldEVudkNvbnN0YW50IH0gZnJvbSAnLi4vdXRpbC9jb25zdGFudHMnO1xuaW1wb3J0IHsgYnVpbGRDb25maWcgfSBmcm9tICcuLi91dGlsL2luaXRCdWlsZENvbmZpZyc7XG5pbXBvcnQgeyBnZXRQdWJsaWNCdWNrZXROYW1lIH0gZnJvbSAnLi4vdXRpbC9nZXRQdWJsaWNCdWNrZXROYW1lJztcblxuZXhwb3J0IGNsYXNzIE1pY3Jvc2VydmljZU5ldHdvcmsgZXh0ZW5kcyBjZGsuU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IGNkay5TdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICBpZiAoIWJ1aWxkQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1aWxkQ29uZmlnIG5vdCBzZXQnKTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgcHVibGljIHMzIGJ1Y2tldFxuICAgIG5ldyBjZGsuYXdzX3MzLkJ1Y2tldCh0aGlzLCAnUHVibGljUzNCdWNrZXQnLCB7XG4gICAgICBidWNrZXROYW1lOiBnZXRQdWJsaWNCdWNrZXROYW1lKCksXG4gICAgICBwdWJsaWNSZWFkQWNjZXNzOiB0cnVlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IGNkay5hd3NfczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUNMU19PTkxZLFxuICAgICAgcmVtb3ZhbFBvbGljeTogY2RrLlJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgY29yczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWxsb3dlZEhlYWRlcnM6IFsnKiddLFxuICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBbY2RrLmF3c19zMy5IdHRwTWV0aG9kcy5QT1NULCBjZGsuYXdzX3MzLkh0dHBNZXRob2RzLlBVVCwgY2RrLmF3c19zMy5IdHRwTWV0aG9kcy5ERUxFVEVdLFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zOiBbJyonXSxcbiAgICAgICAgICBleHBvc2VkSGVhZGVyczogW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdnBjID0gbmV3IGNkay5hd3NfZWMyLlZwYyh0aGlzLCBnZXRFbnZDb25zdGFudCgndnBjSWQnKSwge1xuICAgICAgdnBjTmFtZTogZ2V0RW52Q29uc3RhbnQoJ3ZwY0lkJyksXG4gICAgICBlbmFibGVEbnNIb3N0bmFtZXM6IHRydWUsXG4gICAgICBlbmFibGVEbnNTdXBwb3J0OiB0cnVlLFxuICAgICAgbWF4QXpzOiAxLFxuICAgICAgbmF0R2F0ZXdheXM6IDEsXG4gICAgICAvLyBwcm92aXNpb24gYW5kIHVzZSBhbiBFQzIgaW5zdGFuY2UgYXMgTkFUIGdhdGV3YXkgaW4gbm9uLXByb2QgZW52aXJvbm1lbnRzXG4gICAgICAvLyBpbiBwcm9kLCB0aGUgZGVmYXVsdCBtb3JlIHNjYWxhYmxlL2V4cGVuc2l2ZSBOQVQgZ2F0ZXdheSB3aWxsIGJlIHVzZWRcbiAgICAgIC4uLihidWlsZENvbmZpZy5lbnZOYW1lICE9PSAncHJvZCcgJiYge1xuICAgICAgICBuYXRHYXRld2F5UHJvdmlkZXI6IG5ldyBjZGsuYXdzX2VjMi5OYXRJbnN0YW5jZVByb3ZpZGVyVjIoe1xuICAgICAgICAgIGluc3RhbmNlVHlwZTogbmV3IGNkay5hd3NfZWMyLkluc3RhbmNlVHlwZSgndDRnLm5hbm8nKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIHJlc3RyaWN0RGVmYXVsdFNlY3VyaXR5R3JvdXA6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyByb3V0ZSBTMyB0cmFmZmljIGZyb20gcHJpdmF0ZSBzdWJuZXRzIHRocm91Z2ggYSBnYXRld2F5IGVuZHBvaW50IGluc3RlYWQgb2YgdGhlIE5BVCBnYXRld2F5XG4gICAgdnBjLmFkZEdhdGV3YXlFbmRwb2ludCgnUzNHYXRld2F5RW5kcG9pbnQnLCB7XG4gICAgICBzZXJ2aWNlOiBjZGsuYXdzX2VjMi5HYXRld2F5VnBjRW5kcG9pbnRBd3NTZXJ2aWNlLlMzLFxuICAgICAgc3VibmV0czogW3sgc3VibmV0VHlwZTogY2RrLmF3c19lYzIuU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTIH1dLFxuICAgIH0pO1xuXG4gICAgLy8gc2VjdXJpdHkgZ3JvdXAgZm9yIFBvcnRhbFxuICAgIGNvbnN0IHBvcnRhbFNlY0dycCA9IG5ldyBjZGsuYXdzX2VjMi5TZWN1cml0eUdyb3VwKHRoaXMsIGdldEVudkNvbnN0YW50KCdwb3J0YWxTZWN1cml0eUdyb3VwSWQnKSwge1xuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cE5hbWU6IGdldEVudkNvbnN0YW50KCdwb3J0YWxTZWN1cml0eUdyb3VwSWQnKSxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgcnVsZSBmb3IgSFRUUCBhY2Nlc3NcbiAgICBwb3J0YWxTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5hbnlJcHY0KCksIGNkay5hd3NfZWMyLlBvcnQudGNwKDgwKSwgJ0hUVFAgZnJvbSBhbnl3aGVyZScpO1xuICAgIC8vIGFkZCBydWxlIGZvciBIVFRQUyBhY2Nlc3NcbiAgICBwb3J0YWxTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5hbnlJcHY0KCksIGNkay5hd3NfZWMyLlBvcnQudGNwKDQ0MyksICdIVFRQUyBmcm9tIGFueXdoZXJlJyk7XG4gICAgLy8gYWRkIHJ1bGUgZm9yIFNTSCBhY2Nlc3NcbiAgICBwb3J0YWxTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCgyMiksICdTU0ggZnJvbSB3aXRoaW4gVlBDJyk7XG5cbiAgICAvLyBzZWN1cml0eSBncm91cCBmb3IgQVBJIEdhdGV3YXlcbiAgICBjb25zdCBhcGlHYXRld2F5U2VjR3JwID0gbmV3IGNkay5hd3NfZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgZ2V0RW52Q29uc3RhbnQoJ2FwaUdhdGV3YXlTZWN1cml0eUdyb3VwSWQnKSwge1xuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cE5hbWU6IGdldEVudkNvbnN0YW50KCdhcGlHYXRld2F5U2VjdXJpdHlHcm91cElkJyksXG4gICAgICBhbGxvd0FsbE91dGJvdW5kOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gYWRkIHJ1bGUgZm9yIEhUVFAgYWNjZXNzXG4gICAgYXBpR2F0ZXdheVNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmFueUlwdjQoKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoODApLCAnSFRUUCBmcm9tIGFueXdoZXJlJyk7XG4gICAgLy8gYWRkIHJ1bGUgZm9yIEhUVFBTIGFjY2Vzc1xuICAgIGFwaUdhdGV3YXlTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5hbnlJcHY0KCksIGNkay5hd3NfZWMyLlBvcnQudGNwKDQ0MyksICdIVFRQUyBmcm9tIGFueXdoZXJlJyk7XG4gICAgLy8gYWRkIHJ1bGUgZm9yIFNTSCBhY2Nlc3NcbiAgICBhcGlHYXRld2F5U2VjR3JwLmFkZEluZ3Jlc3NSdWxlKGNkay5hd3NfZWMyLlBlZXIuYW55SXB2NCgpLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCgyMiksICdTU0ggZnJvbSBhbnl3aGVyZScpO1xuICAgIC8vIGFkZCBydWxlIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uXG4gICAgYXBpR2F0ZXdheVNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDgwODEpLCAnSW50ZXJuYWwgbWljcm9zZXJ2aWNlIGNvbW11bmljYXRpb24gZnJvbSB3aXRoaW4gVlBDJyk7XG5cbiAgICAvLyBzZWN1cml0eSBncm91cCBmb3IgUmVkaXMgc2VydmVyXG4gICAgY29uc3QgcmVkaXNTZWNHcnAgPSBuZXcgY2RrLmF3c19lYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBnZXRFbnZDb25zdGFudCgncmVkaXNTZWN1cml0eUdyb3VwSWQnKSwge1xuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cE5hbWU6IGdldEVudkNvbnN0YW50KCdyZWRpc1NlY3VyaXR5R3JvdXBJZCcpLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIGFkZCBydWxlIGZvciBTU0ggYWNjZXNzXG4gICAgcmVkaXNTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCgyMiksICdTU0ggZnJvbSB3aXRoaW4gVlBDJyk7XG4gICAgLy8gYWRkIHJ1bGUgZm9yIFJlZGlzIGFjY2Vzc1xuICAgIHJlZGlzU2VjR3JwLmFkZEluZ3Jlc3NSdWxlKGNkay5hd3NfZWMyLlBlZXIuaXB2NCh2cGMudnBjQ2lkckJsb2NrKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoNjM3OSksICdSZWRpcyBmcm9tIHdpdGhpbiBWUEMnKTtcblxuICAgIC8vIHNlY3VyaXR5IGdyb3VwIGZvciBNeVNRTCBzZXJ2ZXJcbiAgICBjb25zdCBteXNxbFNlY0dycCA9IG5ldyBjZGsuYXdzX2VjMi5TZWN1cml0eUdyb3VwKHRoaXMsIGdldEVudkNvbnN0YW50KCdteXNxbFNlY3VyaXR5R3JvdXBJZCcpLCB7XG4gICAgICB2cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogZ2V0RW52Q29uc3RhbnQoJ215c3FsU2VjdXJpdHlHcm91cElkJyksXG4gICAgICBhbGxvd0FsbE91dGJvdW5kOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gYWRkIHJ1bGUgZm9yIFNTSCBhY2Nlc3NcbiAgICBteXNxbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDIyKSwgJ1NTSCBmcm9tIHdpdGhpbiBWUEMnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgTXlTUUwgYWNjZXNzXG4gICAgbXlzcWxTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCgzMzA2KSwgJ015U1FMIGZyb20gd2l0aGluIFZQQycpO1xuXG4gICAgLy8gc2VjdXJpdHkgZ3JvdXAgZm9yIENsaWNrSG91c2Ugc2VydmVyXG4gICAgY29uc3QgY2xpY2tob3VzZVNlY0dycCA9IG5ldyBjZGsuYXdzX2VjMi5TZWN1cml0eUdyb3VwKHRoaXMsIGdldEVudkNvbnN0YW50KCdjbGlja2hvdXNlU2VjdXJpdHlHcm91cElkJyksIHtcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBOYW1lOiBnZXRFbnZDb25zdGFudCgnY2xpY2tob3VzZVNlY3VyaXR5R3JvdXBJZCcpLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIGFkZCBydWxlIGZvciBTU0ggYWNjZXNzXG4gICAgY2xpY2tob3VzZVNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDIyKSwgJ1NTSCBmcm9tIHdpdGhpbiBWUEMnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgQ2xpY2tIb3VzZSBIVFRQIGFjY2Vzc1xuICAgIGNsaWNraG91c2VTZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCg4MTIzKSwgJ0NsaWNrSG91c2UgSFRUUCBmcm9tIHdpdGhpbiBWUEMnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgQ2xpY2tIb3VzZSBuYXRpdmUgYWNjZXNzXG4gICAgY2xpY2tob3VzZVNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDkwMDApLCAnQ2xpY2tIb3VzZSBuYXRpdmUgZnJvbSB3aXRoaW4gVlBDJyk7XG5cbiAgICAvLyBzZWN1cml0eSBncm91cCBmb3IgTm90aWZpY2F0aW9uIHNlcnZpY2VcbiAgICBjb25zdCBub3RpZmljYXRpb25TZWNHcnAgPSBuZXcgY2RrLmF3c19lYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBnZXRFbnZDb25zdGFudCgnbm90aWZpY2F0aW9uU2VydmljZVNlY3VyaXR5R3JvdXBJZCcpLCB7XG4gICAgICB2cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogZ2V0RW52Q29uc3RhbnQoJ25vdGlmaWNhdGlvblNlcnZpY2VTZWN1cml0eUdyb3VwSWQnKSxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgcnVsZSBmb3IgU1NIIGFjY2Vzc1xuICAgIG5vdGlmaWNhdGlvblNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDIyKSwgJ1NTSCBmcm9tIHdpdGhpbiBWUEMnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgSFRUUCBhY2Nlc3NcbiAgICBub3RpZmljYXRpb25TZWNHcnAuYWRkSW5ncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCg4MDgwKSwgJ0hUVFAgZnJvbSB3aXRoaW4gVlBDJyk7XG5cbiAgICAvLyBzZWN1cml0eSBncm91cCBmb3IgTGFyYXZlbC1iYXNlZCBzZXJ2aWNlc1xuICAgIGNvbnN0IGxhcmF2ZWxTZWNHcnAgPSBuZXcgY2RrLmF3c19lYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBnZXRFbnZDb25zdGFudCgnbGFyYXZlbEJhc2VkU2VjdXJpdHlHcm91cElkJyksIHtcbiAgICAgIHZwYyxcbiAgICAgIHNlY3VyaXR5R3JvdXBOYW1lOiBnZXRFbnZDb25zdGFudCgnbGFyYXZlbEJhc2VkU2VjdXJpdHlHcm91cElkJyksXG4gICAgICBhbGxvd0FsbE91dGJvdW5kOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gYWRkIHJ1bGUgZm9yIFNTSCBhY2Nlc3NcbiAgICBsYXJhdmVsU2VjR3JwLmFkZEluZ3Jlc3NSdWxlKGNkay5hd3NfZWMyLlBlZXIuaXB2NCh2cGMudnBjQ2lkckJsb2NrKSwgY2RrLmF3c19lYzIuUG9ydC50Y3AoMjIpLCAnU1NIIGZyb20gd2l0aGluIFZQQycpO1xuICAgIC8vIGFkZCBydWxlIGZvciBIVFRQXG4gICAgbGFyYXZlbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDgwODApLCAnSFRUUCBmcm9tIHdpdGhpbiBWUEMnKTtcbiAgICAvLyBhZGQgcnVsZSBmb3IgcHJpbnQgV2ViU29ja2V0XG4gICAgbGFyYXZlbFNlY0dycC5hZGRJbmdyZXNzUnVsZShjZGsuYXdzX2VjMi5QZWVyLmlwdjQodnBjLnZwY0NpZHJCbG9jayksIGNkay5hd3NfZWMyLlBvcnQudGNwKDgwOTApLCAnUHJpbnQgV2ViU29ja2V0IGZyb20gd2l0aGluIFZQQycpO1xuXG4gICAgLy8gc2VjdXJpdHkgZ3JvdXAgZm9yIEluc3RhbmNlIENvbm5lY3Rpb24gRW5kcG9pbnRcbiAgICBjb25zdCBpY2VTZWNHcnAgPSBuZXcgY2RrLmF3c19lYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBnZXRFbnZDb25zdGFudCgnZWMySW5zdGFuY2VDb25uZWN0RW5kcG9pbnRTZWN1cml0eUdyb3VwSWQnKSwge1xuICAgICAgdnBjLFxuICAgICAgc2VjdXJpdHlHcm91cE5hbWU6IGdldEVudkNvbnN0YW50KCdlYzJJbnN0YW5jZUNvbm5lY3RFbmRwb2ludFNlY3VyaXR5R3JvdXBJZCcpLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgcnVsZSBmb3Igb3V0Ym91bmQgU1NIXG4gICAgaWNlU2VjR3JwLmFkZEVncmVzc1J1bGUoY2RrLmF3c19lYzIuUGVlci5pcHY0KHZwYy52cGNDaWRyQmxvY2spLCBjZGsuYXdzX2VjMi5Qb3J0LnRjcCgyMiksICdTU0ggdG8gd2l0aGluIFZQQycpO1xuXG4gICAgbmV3IGNkay5hd3NfZWMyLkNmbkluc3RhbmNlQ29ubmVjdEVuZHBvaW50KHRoaXMsIGdldEVudkNvbnN0YW50KCdlYzJJbnN0YW5jZUNvbm5lY3RFbmRwb2ludElkJyksIHtcbiAgICAgIHNlY3VyaXR5R3JvdXBJZHM6IFtpY2VTZWNHcnAuc2VjdXJpdHlHcm91cElkXSxcbiAgICAgIHN1Ym5ldElkOiB2cGMucHJpdmF0ZVN1Ym5ldHNbMF0uc3VibmV0SWQsXG4gICAgfSk7XG5cbiAgICAvLyBBUEkgZ2F0ZXdheSdzIGVsYXN0aWMgSVBcbiAgICBjb25zdCBhcGlHYXRld2F5RUlQID0gbmV3IGNkay5hd3NfZWMyLkNmbkVJUCh0aGlzLCBTdHJpbmcoZ2V0Q29uc3RhbnQoJ2FwaUdhdGV3YXlFSVBJZCcpKSwgeyBkb21haW46ICd2cGMnIH0pO1xuICAgIGNkay5UYWdzLm9mKGFwaUdhdGV3YXlFSVApLmFkZCgnTmFtZScsIFN0cmluZyhnZXRDb25zdGFudCgnYXBpR2F0ZXdheUVJUElkJykpKTtcblxuICAgIC8vIFBvcnRhbCdzIGVsYXN0aWMgSVBcbiAgICBjb25zdCBwb3J0YWxFSVAgPSBuZXcgY2RrLmF3c19lYzIuQ2ZuRUlQKHRoaXMsIFN0cmluZyhnZXRDb25zdGFudCgncG9ydGFsRUlQSWQnKSksIHsgZG9tYWluOiAndnBjJyB9KTtcbiAgICBjZGsuVGFncy5vZihwb3J0YWxFSVApLmFkZCgnTmFtZScsIFN0cmluZyhnZXRDb25zdGFudCgncG9ydGFsRUlQSWQnKSkpO1xuXG4gICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ3ZwYyBJRCcsIHtcbiAgICAgIHZhbHVlOiB2cGMudnBjSWQsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,240 @@
1
+ #!/bin/bash
2
+
3
+ # install ClickHouse
4
+ sudo apt install lsb-release curl gpg -yq
5
+ curl -fsSL https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg
6
+ sudo chmod 644 /usr/share/keyrings/clickhouse-keyring.gpg
7
+ echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
8
+ sudo apt update -yq
9
+ sudo DEBIAN_FRONTEND=noninteractive apt install clickhouse-server clickhouse-client -yq
10
+
11
+ # the deb postinst may write a default-user password file when it cannot prompt;
12
+ # remove it so our users.d config (from SSM) is the one applied
13
+ sudo rm -f /etc/clickhouse-server/users.d/default-password.xml
14
+
15
+ # stop the auto-started server so we can drop in configs before first run
16
+ sudo systemctl stop clickhouse-server || true
17
+
18
+ # fetch credentials from SSM
19
+ clickhouse_root_password=$(aws ssm get-parameter --name ${ssm_global_parameter_path}CLICKHOUSE_ROOT_PASSWORD --with-decryption --query "Parameter.Value" --output text)
20
+ microservices_clickhouse_password=$(aws ssm get-parameter --name ${ssm_global_parameter_path}MICROSERVICES_CLICKHOUSE_PASSWORD --with-decryption --query "Parameter.Value" --output text)
21
+
22
+ # store passwords as sha256 hashes so password content can never break the users config XML
23
+ clickhouse_root_password_sha256=$(echo -n "$clickhouse_root_password" | sha256sum | awk '{print $1}')
24
+ microservices_clickhouse_password_sha256=$(echo -n "$microservices_clickhouse_password" | sha256sum | awk '{print $1}')
25
+
26
+ # compute tuning values from instance hardware (query-optimized)
27
+ total_mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
28
+ total_cpus=$(nproc)
29
+
30
+ # server memory budget: total RAM minus 1.5GB OS headroom, but never below 50% of RAM
31
+ server_max_memory_kb=$(( total_mem_kb - 1536 * 1024 ))
32
+ half_mem_kb=$(( total_mem_kb / 2 ))
33
+ if [ $server_max_memory_kb -lt $half_mem_kb ]; then
34
+ server_max_memory_kb=$half_mem_kb
35
+ fi
36
+ server_max_memory=$(( server_max_memory_kb * 1024 ))
37
+
38
+ # per-query memory: 70% of server budget; spill to disk right before the limit
39
+ query_max_memory=$(( server_max_memory * 70 / 100 ))
40
+ spill_max_memory=$(( query_max_memory * 80 / 100 ))
41
+
42
+ # mark cache: 10% of RAM for analytic scans, capped at 25% of the server budget so it can't starve queries on small instances (min 32MB)
43
+ mark_cache_kb=$(( total_mem_kb * 10 / 100 ))
44
+ mark_cache_cap_kb=$(( server_max_memory_kb * 25 / 100 ))
45
+ if [ $mark_cache_kb -gt $mark_cache_cap_kb ]; then
46
+ mark_cache_kb=$mark_cache_cap_kb
47
+ fi
48
+ min_mark_cache_kb=$(( 32 * 1024 ))
49
+ if [ $mark_cache_kb -lt $min_mark_cache_kb ]; then
50
+ mark_cache_kb=$min_mark_cache_kb
51
+ fi
52
+ mark_cache=$(( mark_cache_kb * 1024 ))
53
+
54
+ # concurrency and background pools scale with cores
55
+ max_concurrent_queries=$(( total_cpus * 4 ))
56
+ if [ $max_concurrent_queries -lt 8 ]; then
57
+ max_concurrent_queries=8
58
+ fi
59
+ background_pool_size=$total_cpus
60
+ background_schedule_pool_size=$(( total_cpus * 2 ))
61
+ if [ $background_schedule_pool_size -lt 16 ]; then
62
+ background_schedule_pool_size=16
63
+ fi
64
+ background_buffer_flush_schedule_pool_size=16
65
+ max_part_threads=$total_cpus
66
+
67
+ # background pool task capacity and mutation/optimize thresholds derived from cores
68
+ background_merges_mutations_concurrency_ratio=2
69
+ pool_tasks=$(( background_pool_size * background_merges_mutations_concurrency_ratio ))
70
+ pool_free_entries=$(( pool_tasks / 2 ))
71
+ if [ $pool_free_entries -lt 1 ]; then
72
+ pool_free_entries=1
73
+ fi
74
+
75
+ # merge pool sizing so merges use available disk instead of stalling on small volumes
76
+ disk_free_gb=$(df -B1 / | awk 'NR==2{print int($4/1024/1024/1024)}')
77
+ disk_bytes=$(( disk_free_gb * 1024 * 1024 * 1024 ))
78
+ merge_max_space=$(( disk_bytes * 90 / 100 ))
79
+
80
+ # allow connections from all interfaces (native + HTTP)
81
+ sudo tee /etc/clickhouse-server/config.d/network.xml >/dev/null <<EOF
82
+ <clickhouse>
83
+ <listen_host>0.0.0.0</listen_host>
84
+ </clickhouse>
85
+ EOF
86
+
87
+ # server-wide performance and scalability tuning
88
+ sudo tee /etc/clickhouse-server/config.d/performance.xml >/dev/null <<EOF
89
+ <clickhouse>
90
+ <max_server_memory_usage>${server_max_memory}</max_server_memory_usage>
91
+ <max_concurrent_queries>${max_concurrent_queries}</max_concurrent_queries>
92
+ <mark_cache_size>${mark_cache}</mark_cache_size>
93
+ <background_pool_size>${background_pool_size}</background_pool_size>
94
+ <background_merges_mutations_concurrency_ratio>${background_merges_mutations_concurrency_ratio}</background_merges_mutations_concurrency_ratio>
95
+ <background_schedule_pool_size>${background_schedule_pool_size}</background_schedule_pool_size>
96
+ <background_buffer_flush_schedule_pool_size>${background_buffer_flush_schedule_pool_size}</background_buffer_flush_schedule_pool_size>
97
+ <merge_tree>
98
+ <max_part_loading_threads>${max_part_threads}</max_part_loading_threads>
99
+ <max_part_removal_threads>${max_part_threads}</max_part_removal_threads>
100
+ <max_bytes_to_merge_at_min_space_in_pool>104857600</max_bytes_to_merge_at_min_space_in_pool>
101
+ <max_bytes_to_merge_at_max_space_in_pool>${merge_max_space}</max_bytes_to_merge_at_max_space_in_pool>
102
+ <max_delay_to_insert>5</max_delay_to_insert>
103
+ <number_of_free_entries_in_pool_to_execute_mutation>${pool_free_entries}</number_of_free_entries_in_pool_to_execute_mutation>
104
+ <number_of_free_entries_in_pool_to_lower_max_size_of_merge>${pool_free_entries}</number_of_free_entries_in_pool_to_lower_max_size_of_merge>
105
+ <number_of_free_entries_in_pool_to_execute_optimize_entire_partition>${pool_free_entries}</number_of_free_entries_in_pool_to_execute_optimize_entire_partition>
106
+ </merge_tree>
107
+ <query_log>
108
+ <database>system</database>
109
+ <table>query_log</table>
110
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
111
+ </query_log>
112
+ <query_thread_log>
113
+ <database>system</database>
114
+ <table>query_thread_log</table>
115
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
116
+ </query_thread_log>
117
+ <part_log>
118
+ <database>system</database>
119
+ <table>part_log</table>
120
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
121
+ </part_log>
122
+ <metric_log>
123
+ <database>system</database>
124
+ <table>metric_log</table>
125
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
126
+ </metric_log>
127
+ <text_log>
128
+ <database>system</database>
129
+ <table>text_log</table>
130
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
131
+ </text_log>
132
+ </clickhouse>
133
+ EOF
134
+
135
+ # query-optimized default profile: keep aggregations in RAM, spill only as safety net
136
+ sudo tee /etc/clickhouse-server/users.d/profiles.xml >/dev/null <<EOF
137
+ <clickhouse>
138
+ <profiles>
139
+ <default>
140
+ <max_memory_usage>${query_max_memory}</max_memory_usage>
141
+ <max_bytes_before_external_group_by>${spill_max_memory}</max_bytes_before_external_group_by>
142
+ <max_bytes_before_external_sort>${spill_max_memory}</max_bytes_before_external_sort>
143
+ <max_partitions_per_insert_block>500</max_partitions_per_insert_block>
144
+ <parts_to_delay_insert>300</parts_to_delay_insert>
145
+ <parts_to_throw_insert>600</parts_to_throw_insert>
146
+ </default>
147
+ </profiles>
148
+ </clickhouse>
149
+ EOF
150
+
151
+ # set the ClickHouse superuser (default) password.
152
+ # `replace="replace"` replaces the packaged `default` user (which ships with an empty
153
+ # `<password>` method) instead of merging children, so only our sha256 method survives
154
+ sudo tee /etc/clickhouse-server/users.d/default-user.xml >/dev/null <<EOF
155
+ <clickhouse>
156
+ <users>
157
+ <default replace="replace">
158
+ <password_sha256_hex>${clickhouse_root_password_sha256}</password_sha256_hex>
159
+ <profile>default</profile>
160
+ <quota>default</quota>
161
+ <networks>
162
+ <ip>::/0</ip>
163
+ </networks>
164
+ <access_management>1</access_management>
165
+ <named_collection_control>1</named_collection_control>
166
+ </default>
167
+ </users>
168
+ </clickhouse>
169
+ EOF
170
+
171
+ # create the microservices application user
172
+ sudo tee /etc/clickhouse-server/users.d/microservices.xml >/dev/null <<EOF
173
+ <clickhouse>
174
+ <users>
175
+ <microservices replace="replace">
176
+ <password_sha256_hex>${microservices_clickhouse_password_sha256}</password_sha256_hex>
177
+ <profile>default</profile>
178
+ <quota>default</quota>
179
+ <networks>
180
+ <ip>::/0</ip>
181
+ </networks>
182
+ </microservices>
183
+ </users>
184
+ </clickhouse>
185
+ EOF
186
+
187
+ # OS-level tuning: THP off (systemd unit so it survives reboot)
188
+ sudo tee /etc/systemd/system/disable-transparent-huge-pages.service >/dev/null <<EOF
189
+ [Unit]
190
+ Description=Disable Transparent Huge Pages (THP)
191
+ After=multi-user.target
192
+
193
+ [Service]
194
+ Type=oneshot
195
+ RemainAfterExit=yes
196
+ ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag'
197
+
198
+ [Install]
199
+ WantedBy=multi-user.target
200
+ EOF
201
+ sudo systemctl enable --now disable-transparent-huge-pages
202
+
203
+ # kernel tuning: avoid mmap exhaustion under heavy merges
204
+ sudo tee /etc/sysctl.d/99-clickhouse.conf >/dev/null <<EOF
205
+ vm.max_map_count = 262144
206
+ EOF
207
+ sudo sysctl --system
208
+
209
+ # raise open file limits for the clickhouse server
210
+ sudo mkdir -p /etc/systemd/system/clickhouse-server.service.d
211
+ sudo tee /etc/systemd/system/clickhouse-server.service.d/limits.conf >/dev/null <<EOF
212
+ [Service]
213
+ LimitNOFILE=1048576
214
+ LimitCORE=infinity
215
+ EOF
216
+
217
+ # apply configs and start
218
+ sudo systemctl daemon-reload
219
+ sudo systemctl enable clickhouse-server
220
+
221
+ # pre-flight: run the server in the foreground briefly so config errors surface in the deployment log
222
+ # exit 124 (killed by timeout) means it started fine; anything else is a startup failure.
223
+ # wrapping the run as an if-condition suppresses both `set -e` and the global ERR trap
224
+ # on the expected non-zero exit, so it can't abort the deployment
225
+ if sudo -u clickhouse timeout 5 clickhouse-server --config-file=/etc/clickhouse-server/config.xml; then
226
+ preflight_status=0
227
+ else
228
+ preflight_status=$?
229
+ fi
230
+ if [ $preflight_status -eq 124 ] || [ $preflight_status -eq 0 ]; then
231
+ echo "ClickHouse config pre-flight: server started successfully (exit $preflight_status)"
232
+ else
233
+ echo "ClickHouse config pre-flight FAILED (exit $preflight_status); dumping error log:"
234
+ fi
235
+ sudo tail -n 30 /var/log/clickhouse-server/clickhouse-server.err.log || true
236
+
237
+ sudo systemctl restart clickhouse-server
238
+
239
+ # verify the server is up and the credentials work
240
+ sudo clickhouse-client --password "$clickhouse_root_password" --query "SELECT version()"
@@ -17,6 +17,7 @@ declare const CONSTANTS: {
17
17
  readonly laravelBasedSecurityGroupId: "Laravel-Based-SG";
18
18
  readonly notificationServiceSecurityGroupId: "Notification-Service-SG";
19
19
  readonly mysqlSecurityGroupId: "MySQL-SG";
20
+ readonly clickhouseSecurityGroupId: "ClickHouse-SG";
20
21
  readonly ec2InstanceConnectEndpointId: "Instance-Connect-Endpoint";
21
22
  readonly ec2InstanceConnectEndpointSecurityGroupId: "Instance-Connect-Endpoint-SG";
22
23
  readonly defaultImageAmi: "ami-0e182bc1c32ba03c3";
@@ -31,7 +32,7 @@ declare const CONSTANTS: {
31
32
  readonly gitBranches: RepoBranches;
32
33
  };
33
34
  };
34
- export declare function getConstant(key: keyof typeof CONSTANTS): 8 | "gp3" | "Microservice-VPC" | "API-Gateway-SG" | "API-Gateway-EIP" | "Portal-SG" | "Portal-EIP" | "Redis-SG" | "Laravel-Based-SG" | "Notification-Service-SG" | "MySQL-SG" | "Instance-Connect-Endpoint" | "Instance-Connect-Endpoint-SG" | "ami-0e182bc1c32ba03c3" | "t4g.nano" | "isa" | "EC2-Instance-Base-Role" | "glicogh-healthcare-files" | {
35
+ export declare function getConstant(key: keyof typeof CONSTANTS): 8 | "gp3" | "Microservice-VPC" | "API-Gateway-SG" | "API-Gateway-EIP" | "Portal-SG" | "Portal-EIP" | "Redis-SG" | "Laravel-Based-SG" | "Notification-Service-SG" | "MySQL-SG" | "ClickHouse-SG" | "Instance-Connect-Endpoint" | "Instance-Connect-Endpoint-SG" | "ami-0e182bc1c32ba03c3" | "t4g.nano" | "isa" | "EC2-Instance-Base-Role" | "glicogh-healthcare-files" | {
35
36
  readonly prod: "api.insurecorehub.com";
36
37
  readonly uat: "api.uat.insurecorehub.com";
37
38
  } | {
@@ -35,6 +35,7 @@ const CONSTANTS = {
35
35
  laravelBasedSecurityGroupId: 'Laravel-Based-SG',
36
36
  notificationServiceSecurityGroupId: 'Notification-Service-SG',
37
37
  mysqlSecurityGroupId: 'MySQL-SG',
38
+ clickhouseSecurityGroupId: 'ClickHouse-SG',
38
39
  ec2InstanceConnectEndpointId: 'Instance-Connect-Endpoint',
39
40
  ec2InstanceConnectEndpointSecurityGroupId: 'Instance-Connect-Endpoint-SG',
40
41
  defaultImageAmi: 'ami-0e182bc1c32ba03c3', // ARM based
@@ -55,4 +56,4 @@ function getConstant(key) {
55
56
  function getEnvConstant(key) {
56
57
  return `${getConstant(key)}-${initBuildConfig_1.buildConfig?.envName}`;
57
58
  }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXRpbC9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvREEsa0NBRUM7QUFFRCx3Q0FFQztBQXpERCx1REFBZ0Q7QUFFaEQsTUFBTSxTQUFTLEdBQWE7SUFDMUIsT0FBTyxFQUFFLDZDQUE2QztJQUN0RCxJQUFJLEVBQUUsMENBQTBDO0lBQ2hELE1BQU0sRUFBRSw0Q0FBNEM7SUFDcEQsTUFBTSxFQUFFLDRDQUE0QztJQUNwRCxTQUFTLEVBQUUsK0NBQStDO0lBQzFELFlBQVksRUFBRSxrREFBa0Q7SUFDaEUsYUFBYSxFQUFFLG9DQUFvQztJQUNuRCxNQUFNLEVBQUUsK0JBQStCO0NBQ3hDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBaUI7SUFDakMsR0FBRyxFQUFFLFFBQVE7SUFDYixJQUFJLEVBQUUsU0FBUztDQUNoQixDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDaEIsS0FBSyxFQUFFLGtCQUFrQjtJQUN6Qix5QkFBeUIsRUFBRSxnQkFBZ0I7SUFDM0MsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxvQkFBb0IsRUFBRTtRQUNwQixJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLEdBQUcsRUFBRSwyQkFBMkI7S0FDakM7SUFDRCxxQkFBcUIsRUFBRSxXQUFXO0lBQ2xDLFdBQVcsRUFBRSxZQUFZO0lBQ3pCLGdCQUFnQixFQUFFO1FBQ2hCLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsR0FBRyxFQUFFLDhCQUE4QjtLQUNwQztJQUNELG9CQUFvQixFQUFFLFVBQVU7SUFDaEMsMkJBQTJCLEVBQUUsa0JBQWtCO0lBQy9DLGtDQUFrQyxFQUFFLHlCQUF5QjtJQUM3RCxvQkFBb0IsRUFBRSxVQUFVO0lBQ2hDLDRCQUE0QixFQUFFLDJCQUEyQjtJQUN6RCx5Q0FBeUMsRUFBRSw4QkFBOEI7SUFDekUsZUFBZSxFQUFFLHVCQUF1QixFQUFFLFlBQVk7SUFDdEQsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLFlBQVk7SUFDN0Msa0JBQWtCLEVBQUUsQ0FBQztJQUNyQixrQkFBa0IsRUFBRSxLQUFLO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFlBQVksRUFBRSx3QkFBd0I7SUFDdEMsZ0JBQWdCLEVBQUUsMEJBQTBCO0lBQzVDLFVBQVUsRUFBRTtRQUNWLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFdBQVcsRUFBRSxZQUFZO0tBQzFCO0NBQ08sQ0FBQztBQUVYLFNBQWdCLFdBQVcsQ0FBQyxHQUEyQjtJQUNyRCxPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLEdBQTJCO0lBQ3hELE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksNkJBQVcsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwb0JyYW5jaGVzLCBSZXBvVXJscyB9IGZyb20gJy4uL0B0eXBlcy9jb21tb24nO1xuaW1wb3J0IHsgYnVpbGRDb25maWcgfSBmcm9tICcuL2luaXRCdWlsZENvbmZpZyc7XG5cbmNvbnN0IHJlcG9QYXRoczogUmVwb1VybHMgPSB7XG4gIGFjY291bnQ6ICdnbGljb2doL2hlYWx0aGNhcmUtbWljcm9zZXJ2aWNlLWFjY291bnQuZ2l0JyxcbiAgcGxhbjogJ2dsaWNvZ2gvaGVhbHRoY2FyZS1taWNyb3NlcnZpY2UtcGxhbi5naXQnLFxuICBwb2xpY3k6ICdnbGljb2doL2hlYWx0aGNhcmUtbWljcm9zZXJ2aWNlLXBvbGljeS5naXQnLFxuICBjbGFpbXM6ICdnbGljb2doL2hlYWx0aGNhcmUtbWljcm9zZXJ2aWNlLWNsYWltcy5naXQnLFxuICByZXBvcnRpbmc6ICdnbGljb2doL2hlYWx0aGNhcmUtbWljcm9zZXJ2aWNlLXJlcG9ydGluZy5naXQnLFxuICBub3RpZmljYXRpb246ICdnbGljb2doL2hlYWx0aGNhcmUtbWljcm9zZXJ2aWNlLW5vdGlmaWNhdGlvbi5naXQnLFxuICAnYXBpLWdhdGV3YXknOiAnZ2xpY29naC9oZWFsdGhjYXJlLWFwaS1nYXRld2F5LmdpdCcsXG4gIHBvcnRhbDogJ2dsaWNvZ2gvaGVhbHRoY2FyZS1wb3J0YWwuZ2l0Jyxcbn07XG5cbmNvbnN0IHJlcG9CcmFuY2hlczogUmVwb0JyYW5jaGVzID0ge1xuICB1YXQ6ICdtYXN0ZXInLFxuICBwcm9kOiAncmVsZWFzZScsXG59O1xuXG5jb25zdCBDT05TVEFOVFMgPSB7XG4gIHZwY0lkOiAnTWljcm9zZXJ2aWNlLVZQQycsXG4gIGFwaUdhdGV3YXlTZWN1cml0eUdyb3VwSWQ6ICdBUEktR2F0ZXdheS1TRycsXG4gIGFwaUdhdGV3YXlFSVBJZDogJ0FQSS1HYXRld2F5LUVJUCcsXG4gIGFwaUdhdGV3YXlEb21haW5OYW1lOiB7XG4gICAgcHJvZDogJ2FwaS5pbnN1cmVjb3JlaHViLmNvbScsXG4gICAgdWF0OiAnYXBpLnVhdC5pbnN1cmVjb3JlaHViLmNvbScsXG4gIH0sXG4gIHBvcnRhbFNlY3VyaXR5R3JvdXBJZDogJ1BvcnRhbC1TRycsXG4gIHBvcnRhbEVJUElkOiAnUG9ydGFsLUVJUCcsXG4gIHBvcnRhbERvbWFpbk5hbWU6IHtcbiAgICBwcm9kOiAncG9ydGFsLmluc3VyZWNvcmVodWIuY29tJyxcbiAgICB1YXQ6ICdwb3J0YWwudWF0Lmluc3VyZWNvcmVodWIuY29tJyxcbiAgfSxcbiAgcmVkaXNTZWN1cml0eUdyb3VwSWQ6ICdSZWRpcy1TRycsXG4gIGxhcmF2ZWxCYXNlZFNlY3VyaXR5R3JvdXBJZDogJ0xhcmF2ZWwtQmFzZWQtU0cnLFxuICBub3RpZmljYXRpb25TZXJ2aWNlU2VjdXJpdHlHcm91cElkOiAnTm90aWZpY2F0aW9uLVNlcnZpY2UtU0cnLFxuICBteXNxbFNlY3VyaXR5R3JvdXBJZDogJ015U1FMLVNHJyxcbiAgZWMySW5zdGFuY2VDb25uZWN0RW5kcG9pbnRJZDogJ0luc3RhbmNlLUNvbm5lY3QtRW5kcG9pbnQnLFxuICBlYzJJbnN0YW5jZUNvbm5lY3RFbmRwb2ludFNlY3VyaXR5R3JvdXBJZDogJ0luc3RhbmNlLUNvbm5lY3QtRW5kcG9pbnQtU0cnLFxuICBkZWZhdWx0SW1hZ2VBbWk6ICdhbWktMGUxODJiYzFjMzJiYTAzYzMnLCAvLyBBUk0gYmFzZWRcbiAgZGVmYXVsdEluc3RhbmNlU2l6ZTogJ3Q0Zy5uYW5vJywgLy8gQVJNIGJhc2VkXG4gIGRlZmF1bHRTdG9yYWdlU2l6ZTogOCxcbiAgZGVmYXVsdFN0b3JhZ2VUeXBlOiAnZ3AzJyxcbiAga2V5UGFpck5hbWU6ICdpc2EnLFxuICBiYXNlUm9sZU5hbWU6ICdFQzItSW5zdGFuY2UtQmFzZS1Sb2xlJyxcbiAgcHVibGljQnVja2V0TmFtZTogJ2dsaWNvZ2gtaGVhbHRoY2FyZS1maWxlcycsXG4gIGRlcGxveW1lbnQ6IHtcbiAgICBnaXRodWJSZXBvUGF0aHM6IHJlcG9QYXRocyxcbiAgICBnaXRCcmFuY2hlczogcmVwb0JyYW5jaGVzLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnN0YW50KGtleToga2V5b2YgdHlwZW9mIENPTlNUQU5UUykge1xuICByZXR1cm4gQ09OU1RBTlRTW2tleV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnZDb25zdGFudChrZXk6IGtleW9mIHR5cGVvZiBDT05TVEFOVFMpIHtcbiAgcmV0dXJuIGAke2dldENvbnN0YW50KGtleSl9LSR7YnVpbGRDb25maWc/LmVudk5hbWV9YDtcbn1cbiJdfQ==
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXRpbC9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxREEsa0NBRUM7QUFFRCx3Q0FFQztBQTFERCx1REFBZ0Q7QUFFaEQsTUFBTSxTQUFTLEdBQWE7SUFDMUIsT0FBTyxFQUFFLDZDQUE2QztJQUN0RCxJQUFJLEVBQUUsMENBQTBDO0lBQ2hELE1BQU0sRUFBRSw0Q0FBNEM7SUFDcEQsTUFBTSxFQUFFLDRDQUE0QztJQUNwRCxTQUFTLEVBQUUsK0NBQStDO0lBQzFELFlBQVksRUFBRSxrREFBa0Q7SUFDaEUsYUFBYSxFQUFFLG9DQUFvQztJQUNuRCxNQUFNLEVBQUUsK0JBQStCO0NBQ3hDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBaUI7SUFDakMsR0FBRyxFQUFFLFFBQVE7SUFDYixJQUFJLEVBQUUsU0FBUztDQUNoQixDQUFDO0FBRUYsTUFBTSxTQUFTLEdBQUc7SUFDaEIsS0FBSyxFQUFFLGtCQUFrQjtJQUN6Qix5QkFBeUIsRUFBRSxnQkFBZ0I7SUFDM0MsZUFBZSxFQUFFLGlCQUFpQjtJQUNsQyxvQkFBb0IsRUFBRTtRQUNwQixJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLEdBQUcsRUFBRSwyQkFBMkI7S0FDakM7SUFDRCxxQkFBcUIsRUFBRSxXQUFXO0lBQ2xDLFdBQVcsRUFBRSxZQUFZO0lBQ3pCLGdCQUFnQixFQUFFO1FBQ2hCLElBQUksRUFBRSwwQkFBMEI7UUFDaEMsR0FBRyxFQUFFLDhCQUE4QjtLQUNwQztJQUNELG9CQUFvQixFQUFFLFVBQVU7SUFDaEMsMkJBQTJCLEVBQUUsa0JBQWtCO0lBQy9DLGtDQUFrQyxFQUFFLHlCQUF5QjtJQUM3RCxvQkFBb0IsRUFBRSxVQUFVO0lBQ2hDLHlCQUF5QixFQUFFLGVBQWU7SUFDMUMsNEJBQTRCLEVBQUUsMkJBQTJCO0lBQ3pELHlDQUF5QyxFQUFFLDhCQUE4QjtJQUN6RSxlQUFlLEVBQUUsdUJBQXVCLEVBQUUsWUFBWTtJQUN0RCxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsWUFBWTtJQUM3QyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLGtCQUFrQixFQUFFLEtBQUs7SUFDekIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsWUFBWSxFQUFFLHdCQUF3QjtJQUN0QyxnQkFBZ0IsRUFBRSwwQkFBMEI7SUFDNUMsVUFBVSxFQUFFO1FBQ1YsZUFBZSxFQUFFLFNBQVM7UUFDMUIsV0FBVyxFQUFFLFlBQVk7S0FDMUI7Q0FDTyxDQUFDO0FBRVgsU0FBZ0IsV0FBVyxDQUFDLEdBQTJCO0lBQ3JELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsR0FBMkI7SUFDeEQsT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSw2QkFBVyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBvQnJhbmNoZXMsIFJlcG9VcmxzIH0gZnJvbSAnLi4vQHR5cGVzL2NvbW1vbic7XG5pbXBvcnQgeyBidWlsZENvbmZpZyB9IGZyb20gJy4vaW5pdEJ1aWxkQ29uZmlnJztcblxuY29uc3QgcmVwb1BhdGhzOiBSZXBvVXJscyA9IHtcbiAgYWNjb3VudDogJ2dsaWNvZ2gvaGVhbHRoY2FyZS1taWNyb3NlcnZpY2UtYWNjb3VudC5naXQnLFxuICBwbGFuOiAnZ2xpY29naC9oZWFsdGhjYXJlLW1pY3Jvc2VydmljZS1wbGFuLmdpdCcsXG4gIHBvbGljeTogJ2dsaWNvZ2gvaGVhbHRoY2FyZS1taWNyb3NlcnZpY2UtcG9saWN5LmdpdCcsXG4gIGNsYWltczogJ2dsaWNvZ2gvaGVhbHRoY2FyZS1taWNyb3NlcnZpY2UtY2xhaW1zLmdpdCcsXG4gIHJlcG9ydGluZzogJ2dsaWNvZ2gvaGVhbHRoY2FyZS1taWNyb3NlcnZpY2UtcmVwb3J0aW5nLmdpdCcsXG4gIG5vdGlmaWNhdGlvbjogJ2dsaWNvZ2gvaGVhbHRoY2FyZS1taWNyb3NlcnZpY2Utbm90aWZpY2F0aW9uLmdpdCcsXG4gICdhcGktZ2F0ZXdheSc6ICdnbGljb2doL2hlYWx0aGNhcmUtYXBpLWdhdGV3YXkuZ2l0JyxcbiAgcG9ydGFsOiAnZ2xpY29naC9oZWFsdGhjYXJlLXBvcnRhbC5naXQnLFxufTtcblxuY29uc3QgcmVwb0JyYW5jaGVzOiBSZXBvQnJhbmNoZXMgPSB7XG4gIHVhdDogJ21hc3RlcicsXG4gIHByb2Q6ICdyZWxlYXNlJyxcbn07XG5cbmNvbnN0IENPTlNUQU5UUyA9IHtcbiAgdnBjSWQ6ICdNaWNyb3NlcnZpY2UtVlBDJyxcbiAgYXBpR2F0ZXdheVNlY3VyaXR5R3JvdXBJZDogJ0FQSS1HYXRld2F5LVNHJyxcbiAgYXBpR2F0ZXdheUVJUElkOiAnQVBJLUdhdGV3YXktRUlQJyxcbiAgYXBpR2F0ZXdheURvbWFpbk5hbWU6IHtcbiAgICBwcm9kOiAnYXBpLmluc3VyZWNvcmVodWIuY29tJyxcbiAgICB1YXQ6ICdhcGkudWF0Lmluc3VyZWNvcmVodWIuY29tJyxcbiAgfSxcbiAgcG9ydGFsU2VjdXJpdHlHcm91cElkOiAnUG9ydGFsLVNHJyxcbiAgcG9ydGFsRUlQSWQ6ICdQb3J0YWwtRUlQJyxcbiAgcG9ydGFsRG9tYWluTmFtZToge1xuICAgIHByb2Q6ICdwb3J0YWwuaW5zdXJlY29yZWh1Yi5jb20nLFxuICAgIHVhdDogJ3BvcnRhbC51YXQuaW5zdXJlY29yZWh1Yi5jb20nLFxuICB9LFxuICByZWRpc1NlY3VyaXR5R3JvdXBJZDogJ1JlZGlzLVNHJyxcbiAgbGFyYXZlbEJhc2VkU2VjdXJpdHlHcm91cElkOiAnTGFyYXZlbC1CYXNlZC1TRycsXG4gIG5vdGlmaWNhdGlvblNlcnZpY2VTZWN1cml0eUdyb3VwSWQ6ICdOb3RpZmljYXRpb24tU2VydmljZS1TRycsXG4gIG15c3FsU2VjdXJpdHlHcm91cElkOiAnTXlTUUwtU0cnLFxuICBjbGlja2hvdXNlU2VjdXJpdHlHcm91cElkOiAnQ2xpY2tIb3VzZS1TRycsXG4gIGVjMkluc3RhbmNlQ29ubmVjdEVuZHBvaW50SWQ6ICdJbnN0YW5jZS1Db25uZWN0LUVuZHBvaW50JyxcbiAgZWMySW5zdGFuY2VDb25uZWN0RW5kcG9pbnRTZWN1cml0eUdyb3VwSWQ6ICdJbnN0YW5jZS1Db25uZWN0LUVuZHBvaW50LVNHJyxcbiAgZGVmYXVsdEltYWdlQW1pOiAnYW1pLTBlMTgyYmMxYzMyYmEwM2MzJywgLy8gQVJNIGJhc2VkXG4gIGRlZmF1bHRJbnN0YW5jZVNpemU6ICd0NGcubmFubycsIC8vIEFSTSBiYXNlZFxuICBkZWZhdWx0U3RvcmFnZVNpemU6IDgsXG4gIGRlZmF1bHRTdG9yYWdlVHlwZTogJ2dwMycsXG4gIGtleVBhaXJOYW1lOiAnaXNhJyxcbiAgYmFzZVJvbGVOYW1lOiAnRUMyLUluc3RhbmNlLUJhc2UtUm9sZScsXG4gIHB1YmxpY0J1Y2tldE5hbWU6ICdnbGljb2doLWhlYWx0aGNhcmUtZmlsZXMnLFxuICBkZXBsb3ltZW50OiB7XG4gICAgZ2l0aHViUmVwb1BhdGhzOiByZXBvUGF0aHMsXG4gICAgZ2l0QnJhbmNoZXM6IHJlcG9CcmFuY2hlcyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25zdGFudChrZXk6IGtleW9mIHR5cGVvZiBDT05TVEFOVFMpIHtcbiAgcmV0dXJuIENPTlNUQU5UU1trZXldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW52Q29uc3RhbnQoa2V5OiBrZXlvZiB0eXBlb2YgQ09OU1RBTlRTKSB7XG4gIHJldHVybiBgJHtnZXRDb25zdGFudChrZXkpfS0ke2J1aWxkQ29uZmlnPy5lbnZOYW1lfWA7XG59XG4iXX0=
@@ -15,6 +15,7 @@ const microservice_mysql_1 = require("../lib/microservice-mysql");
15
15
  const microservice_portal_1 = require("../lib/microservice-portal");
16
16
  const microservice_infra_auth_1 = require("../lib/microservice-infra-auth");
17
17
  const microservice_migration_1 = require("../lib/microservice-migration");
18
+ const microservice_clickhouse_1 = require("../lib/microservice-clickhouse");
18
19
  function initCdkStack() {
19
20
  const app = new cdk.App();
20
21
  const buildConfig = (0, initBuildConfig_1.initBuildConfig)(app);
@@ -65,9 +66,12 @@ function initCdkStack() {
65
66
  new microservice_mysql_1.MicroserviceMySql(app, `MicroserviceMySQL${buildConfig.formattedBuildId ? '-' + buildConfig.formattedBuildId : ''}`, {
66
67
  env: buildConfig.aws,
67
68
  });
69
+ new microservice_clickhouse_1.MicroserviceClickHouse(app, `MicroserviceClickHouse${buildConfig.formattedBuildId ? '-' + buildConfig.formattedBuildId : ''}`, {
70
+ env: buildConfig.aws,
71
+ });
68
72
  new microservice_migration_1.MicroserviceMigration(app, 'MicroserviceMigration', {
69
73
  env: buildConfig.aws,
70
74
  });
71
75
  }
72
76
  }
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdENka1N0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXRpbC9pbml0Q2RrU3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSxvQ0FzREM7QUFyRUQsdUNBQXFDO0FBQ3JDLG1DQUFtQztBQUNuQyx1REFBb0Q7QUFDcEQsMkNBQXVEO0FBQ3ZELGtGQUE2RTtBQUM3RSxzRUFBa0U7QUFDbEUsOEVBQXlFO0FBQ3pFLGtFQUE4RDtBQUM5RCxnR0FBMkY7QUFDM0YscURBQWtEO0FBQ2xELGtFQUE4RDtBQUM5RCxvRUFBZ0U7QUFDaEUsNEVBQXVFO0FBQ3ZFLDBFQUFzRTtBQUV0RSxTQUFnQixZQUFZO0lBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFCLE1BQU0sV0FBVyxHQUFHLElBQUEsaUNBQWUsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxJQUFBLHFCQUFTLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFFZixJQUFJLElBQUEsK0JBQWMsR0FBRSxFQUFFLENBQUM7UUFDckIsSUFBQSx5QkFBYSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUkscURBQXdCLENBQUMsR0FBRyxFQUFFLDRCQUE0QixXQUFXLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3ZILEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztZQUNwQjs7NkVBRWlFO1lBRWpFOytFQUNtRTtZQUNuRSw2RkFBNkY7WUFFN0Y7OENBQ2tDO1lBQ2xDLHlEQUF5RDtZQUV6RCw4RkFBOEY7U0FDL0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLElBQUksV0FBVyxDQUFDLFdBQVcsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUN0RCxJQUFBLHlCQUFhLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxtRUFBK0IsQ0FBQyxHQUFHLEVBQUUsbUNBQW1DLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQzFHLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLGFBQWEsRUFBRSxDQUFDO1FBQ3JELElBQUksaURBQXNCLENBQUMsR0FBRyxFQUFFLHlCQUF5QixXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ2pJLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hELElBQUEseUJBQWEsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLHdDQUFrQixDQUFDLEdBQUcsRUFBRSxxQkFBcUIsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUN6SCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDTixJQUFJLDBDQUFtQixDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRTtZQUNsRCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSwrQ0FBcUIsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLEVBQUU7WUFDdEQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksc0NBQWlCLENBQUMsR0FBRyxFQUFFLG9CQUFvQixXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3ZILEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLHNDQUFpQixDQUFDLEdBQUcsRUFBRSxvQkFBb0IsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUN2SCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSw4Q0FBcUIsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLEVBQUU7WUFDdEQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzb3VyY2UtbWFwLXN1cHBvcnQvcmVnaXN0ZXInO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGluaXRCdWlsZENvbmZpZyB9IGZyb20gJy4vaW5pdEJ1aWxkQ29uZmlnJztcbmltcG9ydCB7IGFkZFJlcG9Ub1RhZ3MsIGFwcGx5VGFncyB9IGZyb20gJy4vYXBwbHlUYWdzJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUxhcmF2ZWxCYXNlZCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtbGFyYXZlbC1iYXNlZCc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VOZXR3b3JrIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1uZXR3b3JrJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUFwaUdhdGV3YXkgfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLWFwaS1nYXRld2F5JztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVJlZGlzIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1yZWRpcyc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1ub3RpZmljYXRpb24tc2VydmljZSc7XG5pbXBvcnQgeyBpc0xhcmF2ZWxCYXNlZCB9IGZyb20gJy4vaXNMYXJhdmVsQmFzZWQnO1xuaW1wb3J0IHsgTWljcm9zZXJ2aWNlTXlTcWwgfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLW15c3FsJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVBvcnRhbCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtcG9ydGFsJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUluZnJhQXV0aCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtaW5mcmEtYXV0aCc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VNaWdyYXRpb24gfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLW1pZ3JhdGlvbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q2RrU3RhY2soKSB7XG4gIGNvbnN0IGFwcCA9IG5ldyBjZGsuQXBwKCk7XG4gIGNvbnN0IGJ1aWxkQ29uZmlnID0gaW5pdEJ1aWxkQ29uZmlnKGFwcCk7XG4gIGFwcGx5VGFncyhhcHApO1xuXG4gIGlmIChpc0xhcmF2ZWxCYXNlZCgpKSB7XG4gICAgYWRkUmVwb1RvVGFncyhhcHApO1xuICAgIG5ldyBNaWNyb3NlcnZpY2VMYXJhdmVsQmFzZWQoYXBwLCBgTWljcm9zZXJ2aWNlTGFyYXZlbEJhc2VkLSR7YnVpbGRDb25maWcuc2VydmljZU5hbWV9LSR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZH1gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICAgIC8qIElmIHlvdSBkb24ndCBzcGVjaWZ5ICdlbnYnLCB0aGlzIHN0YWNrIHdpbGwgYmUgZW52aXJvbm1lbnQtYWdub3N0aWMuXG4gICAgICAgKiBBY2NvdW50L1JlZ2lvbi1kZXBlbmRlbnQgZmVhdHVyZXMgYW5kIGNvbnRleHQgbG9va3VwcyB3aWxsIG5vdCB3b3JrLFxuICAgICAgICogYnV0IGEgc2luZ2xlIHN5bnRoZXNpemVkIHRlbXBsYXRlIGNhbiBiZSBkZXBsb3llZCBhbnl3aGVyZS4gKi9cblxuICAgICAgLyogVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gc3BlY2lhbGl6ZSB0aGlzIHN0YWNrIGZvciB0aGUgQVdTIEFjY291bnRcbiAgICAgICAqIGFuZCBSZWdpb24gdGhhdCBhcmUgaW1wbGllZCBieSB0aGUgY3VycmVudCBDTEkgY29uZmlndXJhdGlvbi4gKi9cbiAgICAgIC8vIGVudjogeyBhY2NvdW50OiBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9BQ0NPVU5ULCByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTiB9LFxuXG4gICAgICAvKiBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSBpZiB5b3Uga25vdyBleGFjdGx5IHdoYXQgQWNjb3VudCBhbmQgUmVnaW9uIHlvdVxuICAgICAgICogd2FudCB0byBkZXBsb3kgdGhlIHN0YWNrIHRvLiAqL1xuICAgICAgLy8gZW52OiB7IGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLCByZWdpb246ICd1cy1lYXN0LTEnIH0sXG5cbiAgICAgIC8qIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9sYXRlc3QvZ3VpZGUvZW52aXJvbm1lbnRzLmh0bWwgKi9cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChidWlsZENvbmZpZy5zZXJ2aWNlTmFtZSA9PT0gJ25vdGlmaWNhdGlvbicpIHtcbiAgICBhZGRSZXBvVG9UYWdzKGFwcCk7XG4gICAgbmV3IE1pY3Jvc2VydmljZU5vdGlmaWNhdGlvblNlcnZpY2UoYXBwLCBgTWljcm9zZXJ2aWNlTm90aWZpY2F0aW9uU2VydmljZS0ke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWR9YCwge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYnVpbGRDb25maWcuc2VydmljZU5hbWUgPT09ICdhcGktZ2F0ZXdheScpIHtcbiAgICBuZXcgTWljcm9zZXJ2aWNlQXBpR2F0ZXdheShhcHAsIGBNaWNyb3NlcnZpY2VBcGlHYXRld2F5JHtidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkID8gJy0nICsgYnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA6ICcnfWAsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGJ1aWxkQ29uZmlnLnNlcnZpY2VOYW1lID09PSAncG9ydGFsJykge1xuICAgIGFkZFJlcG9Ub1RhZ3MoYXBwKTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlUG9ydGFsKGFwcCwgYE1pY3Jvc2VydmljZVBvcnRhbCR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA/ICctJyArIGJ1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgOiAnJ31gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBuZXcgTWljcm9zZXJ2aWNlTmV0d29yayhhcHAsICdNaWNyb3NlcnZpY2VOZXR3b3JrJywge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gICAgbmV3IE1pY3Jvc2VydmljZUluZnJhQXV0aChhcHAsICdNaWNyb3NlcnZpY2VJbmZyYUF1dGgnLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlUmVkaXMoYXBwLCBgTWljcm9zZXJ2aWNlUmVkaXMke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gICAgbmV3IE1pY3Jvc2VydmljZU15U3FsKGFwcCwgYE1pY3Jvc2VydmljZU15U1FMJHtidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkID8gJy0nICsgYnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA6ICcnfWAsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICAgIG5ldyBNaWNyb3NlcnZpY2VNaWdyYXRpb24oYXBwLCAnTWljcm9zZXJ2aWNlTWlncmF0aW9uJywge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdENka1N0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdXRpbC9pbml0Q2RrU3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnQkEsb0NBeURDO0FBekVELHVDQUFxQztBQUNyQyxtQ0FBbUM7QUFDbkMsdURBQW9EO0FBQ3BELDJDQUF1RDtBQUN2RCxrRkFBNkU7QUFDN0Usc0VBQWtFO0FBQ2xFLDhFQUF5RTtBQUN6RSxrRUFBOEQ7QUFDOUQsZ0dBQTJGO0FBQzNGLHFEQUFrRDtBQUNsRCxrRUFBOEQ7QUFDOUQsb0VBQWdFO0FBQ2hFLDRFQUF1RTtBQUN2RSwwRUFBc0U7QUFDdEUsNEVBQXdFO0FBRXhFLFNBQWdCLFlBQVk7SUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDMUIsTUFBTSxXQUFXLEdBQUcsSUFBQSxpQ0FBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLElBQUEscUJBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUVmLElBQUksSUFBQSwrQkFBYyxHQUFFLEVBQUUsQ0FBQztRQUNyQixJQUFBLHlCQUFhLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxxREFBd0IsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLFdBQVcsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDdkgsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1lBQ3BCOzs2RUFFaUU7WUFFakU7K0VBQ21FO1lBQ25FLDZGQUE2RjtZQUU3Rjs4Q0FDa0M7WUFDbEMseURBQXlEO1lBRXpELDhGQUE4RjtTQUMvRixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sSUFBSSxXQUFXLENBQUMsV0FBVyxLQUFLLGNBQWMsRUFBRSxDQUFDO1FBQ3RELElBQUEseUJBQWEsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLG1FQUErQixDQUFDLEdBQUcsRUFBRSxtQ0FBbUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDMUcsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxXQUFXLEtBQUssYUFBYSxFQUFFLENBQUM7UUFDckQsSUFBSSxpREFBc0IsQ0FBQyxHQUFHLEVBQUUseUJBQXlCLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDakksR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEQsSUFBQSx5QkFBYSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksd0NBQWtCLENBQUMsR0FBRyxFQUFFLHFCQUFxQixXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3pILEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksMENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFO1lBQ2xELEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLCtDQUFxQixDQUFDLEdBQUcsRUFBRSx1QkFBdUIsRUFBRTtZQUN0RCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxzQ0FBaUIsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDdkgsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztRQUNILElBQUksc0NBQWlCLENBQUMsR0FBRyxFQUFFLG9CQUFvQixXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3ZILEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLGdEQUFzQixDQUFDLEdBQUcsRUFBRSx5QkFBeUIsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUNqSSxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUc7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSw4Q0FBcUIsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLEVBQUU7WUFDdEQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdzb3VyY2UtbWFwLXN1cHBvcnQvcmVnaXN0ZXInO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IGluaXRCdWlsZENvbmZpZyB9IGZyb20gJy4vaW5pdEJ1aWxkQ29uZmlnJztcbmltcG9ydCB7IGFkZFJlcG9Ub1RhZ3MsIGFwcGx5VGFncyB9IGZyb20gJy4vYXBwbHlUYWdzJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUxhcmF2ZWxCYXNlZCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtbGFyYXZlbC1iYXNlZCc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VOZXR3b3JrIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1uZXR3b3JrJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUFwaUdhdGV3YXkgfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLWFwaS1nYXRld2F5JztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVJlZGlzIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1yZWRpcyc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1ub3RpZmljYXRpb24tc2VydmljZSc7XG5pbXBvcnQgeyBpc0xhcmF2ZWxCYXNlZCB9IGZyb20gJy4vaXNMYXJhdmVsQmFzZWQnO1xuaW1wb3J0IHsgTWljcm9zZXJ2aWNlTXlTcWwgfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLW15c3FsJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVBvcnRhbCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtcG9ydGFsJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZUluZnJhQXV0aCB9IGZyb20gJy4uL2xpYi9taWNyb3NlcnZpY2UtaW5mcmEtYXV0aCc7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VNaWdyYXRpb24gfSBmcm9tICcuLi9saWIvbWljcm9zZXJ2aWNlLW1pZ3JhdGlvbic7XG5pbXBvcnQgeyBNaWNyb3NlcnZpY2VDbGlja0hvdXNlIH0gZnJvbSAnLi4vbGliL21pY3Jvc2VydmljZS1jbGlja2hvdXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDZGtTdGFjaygpIHtcbiAgY29uc3QgYXBwID0gbmV3IGNkay5BcHAoKTtcbiAgY29uc3QgYnVpbGRDb25maWcgPSBpbml0QnVpbGRDb25maWcoYXBwKTtcbiAgYXBwbHlUYWdzKGFwcCk7XG5cbiAgaWYgKGlzTGFyYXZlbEJhc2VkKCkpIHtcbiAgICBhZGRSZXBvVG9UYWdzKGFwcCk7XG4gICAgbmV3IE1pY3Jvc2VydmljZUxhcmF2ZWxCYXNlZChhcHAsIGBNaWNyb3NlcnZpY2VMYXJhdmVsQmFzZWQtJHtidWlsZENvbmZpZy5zZXJ2aWNlTmFtZX0tJHtidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkfWAsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgICAgLyogSWYgeW91IGRvbid0IHNwZWNpZnkgJ2VudicsIHRoaXMgc3RhY2sgd2lsbCBiZSBlbnZpcm9ubWVudC1hZ25vc3RpYy5cbiAgICAgICAqIEFjY291bnQvUmVnaW9uLWRlcGVuZGVudCBmZWF0dXJlcyBhbmQgY29udGV4dCBsb29rdXBzIHdpbGwgbm90IHdvcmssXG4gICAgICAgKiBidXQgYSBzaW5nbGUgc3ludGhlc2l6ZWQgdGVtcGxhdGUgY2FuIGJlIGRlcGxveWVkIGFueXdoZXJlLiAqL1xuXG4gICAgICAvKiBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBzcGVjaWFsaXplIHRoaXMgc3RhY2sgZm9yIHRoZSBBV1MgQWNjb3VudFxuICAgICAgICogYW5kIFJlZ2lvbiB0aGF0IGFyZSBpbXBsaWVkIGJ5IHRoZSBjdXJyZW50IENMSSBjb25maWd1cmF0aW9uLiAqL1xuICAgICAgLy8gZW52OiB7IGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQsIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfUkVHSU9OIH0sXG5cbiAgICAgIC8qIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIGlmIHlvdSBrbm93IGV4YWN0bHkgd2hhdCBBY2NvdW50IGFuZCBSZWdpb24geW91XG4gICAgICAgKiB3YW50IHRvIGRlcGxveSB0aGUgc3RhY2sgdG8uICovXG4gICAgICAvLyBlbnY6IHsgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsIHJlZ2lvbjogJ3VzLWVhc3QtMScgfSxcblxuICAgICAgLyogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL2xhdGVzdC9ndWlkZS9lbnZpcm9ubWVudHMuaHRtbCAqL1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGJ1aWxkQ29uZmlnLnNlcnZpY2VOYW1lID09PSAnbm90aWZpY2F0aW9uJykge1xuICAgIGFkZFJlcG9Ub1RhZ3MoYXBwKTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlTm90aWZpY2F0aW9uU2VydmljZShhcHAsIGBNaWNyb3NlcnZpY2VOb3RpZmljYXRpb25TZXJ2aWNlLSR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZH1gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChidWlsZENvbmZpZy5zZXJ2aWNlTmFtZSA9PT0gJ2FwaS1nYXRld2F5Jykge1xuICAgIG5ldyBNaWNyb3NlcnZpY2VBcGlHYXRld2F5KGFwcCwgYE1pY3Jvc2VydmljZUFwaUdhdGV3YXkke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoYnVpbGRDb25maWcuc2VydmljZU5hbWUgPT09ICdwb3J0YWwnKSB7XG4gICAgYWRkUmVwb1RvVGFncyhhcHApO1xuICAgIG5ldyBNaWNyb3NlcnZpY2VQb3J0YWwoYXBwLCBgTWljcm9zZXJ2aWNlUG9ydGFsJHtidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkID8gJy0nICsgYnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA6ICcnfWAsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG5ldyBNaWNyb3NlcnZpY2VOZXR3b3JrKGFwcCwgJ01pY3Jvc2VydmljZU5ldHdvcmsnLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlSW5mcmFBdXRoKGFwcCwgJ01pY3Jvc2VydmljZUluZnJhQXV0aCcsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICAgIG5ldyBNaWNyb3NlcnZpY2VSZWRpcyhhcHAsIGBNaWNyb3NlcnZpY2VSZWRpcyR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA/ICctJyArIGJ1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgOiAnJ31gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlTXlTcWwoYXBwLCBgTWljcm9zZXJ2aWNlTXlTUUwke2J1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgPyAnLScgKyBidWlsZENvbmZpZy5mb3JtYXR0ZWRCdWlsZElkIDogJyd9YCwge1xuICAgICAgZW52OiBidWlsZENvbmZpZy5hd3MsXG4gICAgfSk7XG4gICAgbmV3IE1pY3Jvc2VydmljZUNsaWNrSG91c2UoYXBwLCBgTWljcm9zZXJ2aWNlQ2xpY2tIb3VzZSR7YnVpbGRDb25maWcuZm9ybWF0dGVkQnVpbGRJZCA/ICctJyArIGJ1aWxkQ29uZmlnLmZvcm1hdHRlZEJ1aWxkSWQgOiAnJ31gLCB7XG4gICAgICBlbnY6IGJ1aWxkQ29uZmlnLmF3cyxcbiAgICB9KTtcbiAgICBuZXcgTWljcm9zZXJ2aWNlTWlncmF0aW9uKGFwcCwgJ01pY3Jvc2VydmljZU1pZ3JhdGlvbicsIHtcbiAgICAgIGVudjogYnVpbGRDb25maWcuYXdzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glicogh/healthcare-cdk",
3
- "version": "0.1.87",
3
+ "version": "0.1.88",
4
4
  "description": "CDK automations",
5
5
  "bin": {
6
6
  "cdk": "bin/cdk.js"
@@ -0,0 +1,240 @@
1
+ #!/bin/bash
2
+
3
+ # install ClickHouse
4
+ sudo apt install lsb-release curl gpg -yq
5
+ curl -fsSL https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg
6
+ sudo chmod 644 /usr/share/keyrings/clickhouse-keyring.gpg
7
+ echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list
8
+ sudo apt update -yq
9
+ sudo DEBIAN_FRONTEND=noninteractive apt install clickhouse-server clickhouse-client -yq
10
+
11
+ # the deb postinst may write a default-user password file when it cannot prompt;
12
+ # remove it so our users.d config (from SSM) is the one applied
13
+ sudo rm -f /etc/clickhouse-server/users.d/default-password.xml
14
+
15
+ # stop the auto-started server so we can drop in configs before first run
16
+ sudo systemctl stop clickhouse-server || true
17
+
18
+ # fetch credentials from SSM
19
+ clickhouse_root_password=$(aws ssm get-parameter --name ${ssm_global_parameter_path}CLICKHOUSE_ROOT_PASSWORD --with-decryption --query "Parameter.Value" --output text)
20
+ microservices_clickhouse_password=$(aws ssm get-parameter --name ${ssm_global_parameter_path}MICROSERVICES_CLICKHOUSE_PASSWORD --with-decryption --query "Parameter.Value" --output text)
21
+
22
+ # store passwords as sha256 hashes so password content can never break the users config XML
23
+ clickhouse_root_password_sha256=$(echo -n "$clickhouse_root_password" | sha256sum | awk '{print $1}')
24
+ microservices_clickhouse_password_sha256=$(echo -n "$microservices_clickhouse_password" | sha256sum | awk '{print $1}')
25
+
26
+ # compute tuning values from instance hardware (query-optimized)
27
+ total_mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
28
+ total_cpus=$(nproc)
29
+
30
+ # server memory budget: total RAM minus 1.5GB OS headroom, but never below 50% of RAM
31
+ server_max_memory_kb=$(( total_mem_kb - 1536 * 1024 ))
32
+ half_mem_kb=$(( total_mem_kb / 2 ))
33
+ if [ $server_max_memory_kb -lt $half_mem_kb ]; then
34
+ server_max_memory_kb=$half_mem_kb
35
+ fi
36
+ server_max_memory=$(( server_max_memory_kb * 1024 ))
37
+
38
+ # per-query memory: 70% of server budget; spill to disk right before the limit
39
+ query_max_memory=$(( server_max_memory * 70 / 100 ))
40
+ spill_max_memory=$(( query_max_memory * 80 / 100 ))
41
+
42
+ # mark cache: 10% of RAM for analytic scans, capped at 25% of the server budget so it can't starve queries on small instances (min 32MB)
43
+ mark_cache_kb=$(( total_mem_kb * 10 / 100 ))
44
+ mark_cache_cap_kb=$(( server_max_memory_kb * 25 / 100 ))
45
+ if [ $mark_cache_kb -gt $mark_cache_cap_kb ]; then
46
+ mark_cache_kb=$mark_cache_cap_kb
47
+ fi
48
+ min_mark_cache_kb=$(( 32 * 1024 ))
49
+ if [ $mark_cache_kb -lt $min_mark_cache_kb ]; then
50
+ mark_cache_kb=$min_mark_cache_kb
51
+ fi
52
+ mark_cache=$(( mark_cache_kb * 1024 ))
53
+
54
+ # concurrency and background pools scale with cores
55
+ max_concurrent_queries=$(( total_cpus * 4 ))
56
+ if [ $max_concurrent_queries -lt 8 ]; then
57
+ max_concurrent_queries=8
58
+ fi
59
+ background_pool_size=$total_cpus
60
+ background_schedule_pool_size=$(( total_cpus * 2 ))
61
+ if [ $background_schedule_pool_size -lt 16 ]; then
62
+ background_schedule_pool_size=16
63
+ fi
64
+ background_buffer_flush_schedule_pool_size=16
65
+ max_part_threads=$total_cpus
66
+
67
+ # background pool task capacity and mutation/optimize thresholds derived from cores
68
+ background_merges_mutations_concurrency_ratio=2
69
+ pool_tasks=$(( background_pool_size * background_merges_mutations_concurrency_ratio ))
70
+ pool_free_entries=$(( pool_tasks / 2 ))
71
+ if [ $pool_free_entries -lt 1 ]; then
72
+ pool_free_entries=1
73
+ fi
74
+
75
+ # merge pool sizing so merges use available disk instead of stalling on small volumes
76
+ disk_free_gb=$(df -B1 / | awk 'NR==2{print int($4/1024/1024/1024)}')
77
+ disk_bytes=$(( disk_free_gb * 1024 * 1024 * 1024 ))
78
+ merge_max_space=$(( disk_bytes * 90 / 100 ))
79
+
80
+ # allow connections from all interfaces (native + HTTP)
81
+ sudo tee /etc/clickhouse-server/config.d/network.xml >/dev/null <<EOF
82
+ <clickhouse>
83
+ <listen_host>0.0.0.0</listen_host>
84
+ </clickhouse>
85
+ EOF
86
+
87
+ # server-wide performance and scalability tuning
88
+ sudo tee /etc/clickhouse-server/config.d/performance.xml >/dev/null <<EOF
89
+ <clickhouse>
90
+ <max_server_memory_usage>${server_max_memory}</max_server_memory_usage>
91
+ <max_concurrent_queries>${max_concurrent_queries}</max_concurrent_queries>
92
+ <mark_cache_size>${mark_cache}</mark_cache_size>
93
+ <background_pool_size>${background_pool_size}</background_pool_size>
94
+ <background_merges_mutations_concurrency_ratio>${background_merges_mutations_concurrency_ratio}</background_merges_mutations_concurrency_ratio>
95
+ <background_schedule_pool_size>${background_schedule_pool_size}</background_schedule_pool_size>
96
+ <background_buffer_flush_schedule_pool_size>${background_buffer_flush_schedule_pool_size}</background_buffer_flush_schedule_pool_size>
97
+ <merge_tree>
98
+ <max_part_loading_threads>${max_part_threads}</max_part_loading_threads>
99
+ <max_part_removal_threads>${max_part_threads}</max_part_removal_threads>
100
+ <max_bytes_to_merge_at_min_space_in_pool>104857600</max_bytes_to_merge_at_min_space_in_pool>
101
+ <max_bytes_to_merge_at_max_space_in_pool>${merge_max_space}</max_bytes_to_merge_at_max_space_in_pool>
102
+ <max_delay_to_insert>5</max_delay_to_insert>
103
+ <number_of_free_entries_in_pool_to_execute_mutation>${pool_free_entries}</number_of_free_entries_in_pool_to_execute_mutation>
104
+ <number_of_free_entries_in_pool_to_lower_max_size_of_merge>${pool_free_entries}</number_of_free_entries_in_pool_to_lower_max_size_of_merge>
105
+ <number_of_free_entries_in_pool_to_execute_optimize_entire_partition>${pool_free_entries}</number_of_free_entries_in_pool_to_execute_optimize_entire_partition>
106
+ </merge_tree>
107
+ <query_log>
108
+ <database>system</database>
109
+ <table>query_log</table>
110
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
111
+ </query_log>
112
+ <query_thread_log>
113
+ <database>system</database>
114
+ <table>query_thread_log</table>
115
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
116
+ </query_thread_log>
117
+ <part_log>
118
+ <database>system</database>
119
+ <table>part_log</table>
120
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
121
+ </part_log>
122
+ <metric_log>
123
+ <database>system</database>
124
+ <table>metric_log</table>
125
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
126
+ </metric_log>
127
+ <text_log>
128
+ <database>system</database>
129
+ <table>text_log</table>
130
+ <flush_interval_milliseconds>7500</flush_interval_milliseconds>
131
+ </text_log>
132
+ </clickhouse>
133
+ EOF
134
+
135
+ # query-optimized default profile: keep aggregations in RAM, spill only as safety net
136
+ sudo tee /etc/clickhouse-server/users.d/profiles.xml >/dev/null <<EOF
137
+ <clickhouse>
138
+ <profiles>
139
+ <default>
140
+ <max_memory_usage>${query_max_memory}</max_memory_usage>
141
+ <max_bytes_before_external_group_by>${spill_max_memory}</max_bytes_before_external_group_by>
142
+ <max_bytes_before_external_sort>${spill_max_memory}</max_bytes_before_external_sort>
143
+ <max_partitions_per_insert_block>500</max_partitions_per_insert_block>
144
+ <parts_to_delay_insert>300</parts_to_delay_insert>
145
+ <parts_to_throw_insert>600</parts_to_throw_insert>
146
+ </default>
147
+ </profiles>
148
+ </clickhouse>
149
+ EOF
150
+
151
+ # set the ClickHouse superuser (default) password.
152
+ # `replace="replace"` replaces the packaged `default` user (which ships with an empty
153
+ # `<password>` method) instead of merging children, so only our sha256 method survives
154
+ sudo tee /etc/clickhouse-server/users.d/default-user.xml >/dev/null <<EOF
155
+ <clickhouse>
156
+ <users>
157
+ <default replace="replace">
158
+ <password_sha256_hex>${clickhouse_root_password_sha256}</password_sha256_hex>
159
+ <profile>default</profile>
160
+ <quota>default</quota>
161
+ <networks>
162
+ <ip>::/0</ip>
163
+ </networks>
164
+ <access_management>1</access_management>
165
+ <named_collection_control>1</named_collection_control>
166
+ </default>
167
+ </users>
168
+ </clickhouse>
169
+ EOF
170
+
171
+ # create the microservices application user
172
+ sudo tee /etc/clickhouse-server/users.d/microservices.xml >/dev/null <<EOF
173
+ <clickhouse>
174
+ <users>
175
+ <microservices replace="replace">
176
+ <password_sha256_hex>${microservices_clickhouse_password_sha256}</password_sha256_hex>
177
+ <profile>default</profile>
178
+ <quota>default</quota>
179
+ <networks>
180
+ <ip>::/0</ip>
181
+ </networks>
182
+ </microservices>
183
+ </users>
184
+ </clickhouse>
185
+ EOF
186
+
187
+ # OS-level tuning: THP off (systemd unit so it survives reboot)
188
+ sudo tee /etc/systemd/system/disable-transparent-huge-pages.service >/dev/null <<EOF
189
+ [Unit]
190
+ Description=Disable Transparent Huge Pages (THP)
191
+ After=multi-user.target
192
+
193
+ [Service]
194
+ Type=oneshot
195
+ RemainAfterExit=yes
196
+ ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag'
197
+
198
+ [Install]
199
+ WantedBy=multi-user.target
200
+ EOF
201
+ sudo systemctl enable --now disable-transparent-huge-pages
202
+
203
+ # kernel tuning: avoid mmap exhaustion under heavy merges
204
+ sudo tee /etc/sysctl.d/99-clickhouse.conf >/dev/null <<EOF
205
+ vm.max_map_count = 262144
206
+ EOF
207
+ sudo sysctl --system
208
+
209
+ # raise open file limits for the clickhouse server
210
+ sudo mkdir -p /etc/systemd/system/clickhouse-server.service.d
211
+ sudo tee /etc/systemd/system/clickhouse-server.service.d/limits.conf >/dev/null <<EOF
212
+ [Service]
213
+ LimitNOFILE=1048576
214
+ LimitCORE=infinity
215
+ EOF
216
+
217
+ # apply configs and start
218
+ sudo systemctl daemon-reload
219
+ sudo systemctl enable clickhouse-server
220
+
221
+ # pre-flight: run the server in the foreground briefly so config errors surface in the deployment log
222
+ # exit 124 (killed by timeout) means it started fine; anything else is a startup failure.
223
+ # wrapping the run as an if-condition suppresses both `set -e` and the global ERR trap
224
+ # on the expected non-zero exit, so it can't abort the deployment
225
+ if sudo -u clickhouse timeout 5 clickhouse-server --config-file=/etc/clickhouse-server/config.xml; then
226
+ preflight_status=0
227
+ else
228
+ preflight_status=$?
229
+ fi
230
+ if [ $preflight_status -eq 124 ] || [ $preflight_status -eq 0 ]; then
231
+ echo "ClickHouse config pre-flight: server started successfully (exit $preflight_status)"
232
+ else
233
+ echo "ClickHouse config pre-flight FAILED (exit $preflight_status); dumping error log:"
234
+ fi
235
+ sudo tail -n 30 /var/log/clickhouse-server/clickhouse-server.err.log || true
236
+
237
+ sudo systemctl restart clickhouse-server
238
+
239
+ # verify the server is up and the credentials work
240
+ sudo clickhouse-client --password "$clickhouse_root_password" --query "SELECT version()"