@aws-cdk/aws-msk-alpha 2.221.1-alpha.0 → 2.223.0-alpha.0

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/.jsii CHANGED
@@ -8,7 +8,7 @@
8
8
  "url": "https://aws.amazon.com"
9
9
  },
10
10
  "dependencies": {
11
- "aws-cdk-lib": "^2.221.1",
11
+ "aws-cdk-lib": "^2.223.0",
12
12
  "constructs": "^10.0.0"
13
13
  },
14
14
  "dependencyClosure": {
@@ -3217,6 +3217,19 @@
3217
3217
  }
3218
3218
  }
3219
3219
  },
3220
+ "aws-cdk-lib.aws_rtbfabric": {
3221
+ "targets": {
3222
+ "dotnet": {
3223
+ "package": "Amazon.CDK.AWS.RTBFabric"
3224
+ },
3225
+ "java": {
3226
+ "package": "software.amazon.awscdk.services.rtbfabric"
3227
+ },
3228
+ "python": {
3229
+ "module": "aws_cdk.aws_rtbfabric"
3230
+ }
3231
+ }
3232
+ },
3220
3233
  "aws-cdk-lib.aws_rum": {
3221
3234
  "targets": {
3222
3235
  "dotnet": {
@@ -3334,6 +3347,19 @@
3334
3347
  }
3335
3348
  }
3336
3349
  },
3350
+ "aws-cdk-lib.aws_s3vectors": {
3351
+ "targets": {
3352
+ "dotnet": {
3353
+ "package": "Amazon.CDK.AWS.S3Vectors"
3354
+ },
3355
+ "java": {
3356
+ "package": "software.amazon.awscdk.services.s3vectors"
3357
+ },
3358
+ "python": {
3359
+ "module": "aws_cdk.aws_s3vectors"
3360
+ }
3361
+ }
3362
+ },
3337
3363
  "aws-cdk-lib.aws_sagemaker": {
3338
3364
  "targets": {
3339
3365
  "dotnet": {
@@ -4104,7 +4130,7 @@
4104
4130
  },
4105
4131
  "name": "@aws-cdk/aws-msk-alpha",
4106
4132
  "readme": {
4107
- "markdown": "# Amazon Managed Streaming for Apache Kafka Construct Library\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\n[Amazon MSK](https://aws.amazon.com/msk/) is a fully managed service that makes it easy for you to build and run applications that use Apache Kafka to process streaming data.\n\nThe following example creates an MSK Cluster.\n\n```ts\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'Cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n});\n```\n\n## Allowing Connections\n\nTo control who can access the Cluster, use the `.connections` attribute. For a list of ports used by MSK, refer to the [MSK documentation](https://docs.aws.amazon.com/msk/latest/developerguide/client-access.html#port-info).\n\n```ts\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'Cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n});\n\ncluster.connections.allowFrom(\n ec2.Peer.ipv4('1.2.3.4/8'),\n ec2.Port.tcp(2181),\n);\ncluster.connections.allowFrom(\n ec2.Peer.ipv4('1.2.3.4/8'),\n ec2.Port.tcp(9094),\n);\n```\n\n## Cluster Endpoints\n\nYou can use the following attributes to get a list of the Kafka broker or ZooKeeper node endpoints\n\n```ts\ndeclare const cluster: msk.Cluster;\nnew CfnOutput(this, 'BootstrapBrokers', { value: cluster.bootstrapBrokers });\nnew CfnOutput(this, 'BootstrapBrokersTls', { value: cluster.bootstrapBrokersTls });\nnew CfnOutput(this, 'BootstrapBrokersSaslScram', { value: cluster.bootstrapBrokersSaslScram });\nnew CfnOutput(this, 'BootstrapBrokerStringSaslIam', { value: cluster.bootstrapBrokersSaslIam });\nnew CfnOutput(this, 'ZookeeperConnection', { value: cluster.zookeeperConnectionString });\nnew CfnOutput(this, 'ZookeeperConnectionTls', { value: cluster.zookeeperConnectionStringTls });\n```\n\n## Importing an existing Cluster\n\nTo import an existing MSK cluster into your CDK app use the `.fromClusterArn()` method.\n\n```ts\nconst cluster = msk.Cluster.fromClusterArn(this, 'Cluster',\n 'arn:aws:kafka:us-west-2:1234567890:cluster/a-cluster/11111111-1111-1111-1111-111111111111-1',\n);\n```\n\n## Client Authentication\n\n[MSK supports](https://docs.aws.amazon.com/msk/latest/developerguide/kafka_apis_iam.html) the following authentication mechanisms.\n\n### TLS\n\nTo enable client authentication with TLS set the `certificateAuthorityArns` property to reference your ACM Private CA. [More info on Private CAs.](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)\n\n```ts\nimport * as acmpca from 'aws-cdk-lib/aws-acmpca';\n\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'Cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n encryptionInTransit: {\n clientBroker: msk.ClientBrokerEncryption.TLS,\n },\n clientAuthentication: msk.ClientAuthentication.tls({\n certificateAuthorities: [\n acmpca.CertificateAuthority.fromCertificateAuthorityArn(\n this,\n 'CertificateAuthority',\n 'arn:aws:acm-pca:us-west-2:1234567890:certificate-authority/11111111-1111-1111-1111-111111111111',\n ),\n ],\n }),\n});\n```\n\n### SASL/SCRAM\n\nEnable client authentication with [SASL/SCRAM](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html):\n\n```ts\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n encryptionInTransit: {\n clientBroker: msk.ClientBrokerEncryption.TLS,\n },\n clientAuthentication: msk.ClientAuthentication.sasl({\n scram: true,\n }),\n});\n```\n\n### IAM\n\nEnable client authentication with [IAM](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html):\n\n```ts\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n encryptionInTransit: {\n clientBroker: msk.ClientBrokerEncryption.TLS,\n },\n clientAuthentication: msk.ClientAuthentication.sasl({\n iam: true,\n }),\n});\n```\n\n\n### SASL/IAM + TLS\n\nEnable client authentication with [IAM](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html)\nas well as enable client authentication with TLS by setting the `certificateAuthorityArns` property to reference your ACM Private CA. [More info on Private CAs.](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)\n\n```ts\nimport * as acmpca from 'aws-cdk-lib/aws-acmpca';\n\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'Cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n encryptionInTransit: {\n clientBroker: msk.ClientBrokerEncryption.TLS,\n },\n clientAuthentication: msk.ClientAuthentication.saslTls({\n iam: true,\n certificateAuthorities: [\n acmpca.CertificateAuthority.fromCertificateAuthorityArn(\n this,\n 'CertificateAuthority',\n 'arn:aws:acm-pca:us-west-2:1234567890:certificate-authority/11111111-1111-1111-1111-111111111111',\n ),\n ],\n }),\n});\n```\n\n\n## Logging\n\nYou can deliver Apache Kafka broker logs to one or more of the following destination types:\nAmazon CloudWatch Logs, Amazon S3, Amazon Data Firehose.\n\nTo configure logs to be sent to an S3 bucket, provide a bucket in the `logging` config.\n\n```ts\ndeclare const vpc: ec2.Vpc;\ndeclare const bucket: s3.IBucket;\nconst cluster = new msk.Cluster(this, 'cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n logging: {\n s3: {\n bucket,\n },\n },\n});\n```\n\nWhen the S3 destination is configured, AWS will automatically create an S3 bucket policy\nthat allows the service to write logs to the bucket. This makes it impossible to later update\nthat bucket policy. To have CDK create the bucket policy so that future updates can be made,\nthe `@aws-cdk/aws-s3:createDefaultLoggingPolicy` [feature flag](https://docs.aws.amazon.com/cdk/v2/guide/featureflags.html) can be used. This can be set\nin the `cdk.json` file.\n\n```json\n{\n \"context\": {\n \"@aws-cdk/aws-s3:createDefaultLoggingPolicy\": true\n }\n}\n```\n\n## Storage Mode\n\nYou can configure an MSK cluster storage mode using the `storageMode` property.\n\nTiered storage is a low-cost storage tier for Amazon MSK that scales to virtually unlimited storage,\nmaking it cost-effective to build streaming data applications.\n\n> Visit [Tiered storage](https://docs.aws.amazon.com/msk/latest/developerguide/msk-tiered-storage.html)\nto see the list of compatible Kafka versions and for more details.\n\n```ts\ndeclare const vpc: ec2.Vpc;\ndeclare const bucket: s3.IBucket;\n\nconst cluster = new msk.Cluster(this, 'cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n storageMode: msk.StorageMode.TIERED,\n});\n```\n\n## MSK Serverless\n\nYou can also use MSK Serverless by using `ServerlessCluster` class.\n\nMSK Serverless is a cluster type for Amazon MSK that makes it possible for you to run Apache Kafka without having to manage and scale cluster capacity.\n\nMSK Serverless requires IAM access control for all clusters.\n\nFor more infomation, see [Use MSK Serverless clusters](https://docs.aws.amazon.com/msk/latest/developerguide/serverless-getting-started.html).\n\n```ts\ndeclare const vpc: ec2.Vpc;\n\nconst serverlessCluster = new msk.ServerlessCluster(this, 'ServerlessCluster', {\n clusterName: 'MyServerlessCluster',\n vpcConfigs: [\n { vpc },\n ],\n});\n```\n"
4133
+ "markdown": "# Amazon Managed Streaming for Apache Kafka Construct Library\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\n[Amazon MSK](https://aws.amazon.com/msk/) is a fully managed service that makes it easy for you to build and run applications that use Apache Kafka to process streaming data.\n\nThe following example creates an MSK Cluster.\n\n```ts\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'Cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n});\n```\n\n## Allowing Connections\n\nTo control who can access the Cluster, use the `.connections` attribute. For a list of ports used by MSK, refer to the [MSK documentation](https://docs.aws.amazon.com/msk/latest/developerguide/client-access.html#port-info).\n\n```ts\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'Cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n});\n\ncluster.connections.allowFrom(\n ec2.Peer.ipv4('1.2.3.4/8'),\n ec2.Port.tcp(2181),\n);\ncluster.connections.allowFrom(\n ec2.Peer.ipv4('1.2.3.4/8'),\n ec2.Port.tcp(9094),\n);\n```\n\n## Cluster Endpoints\n\nYou can use the following attributes to get a list of the Kafka broker or ZooKeeper node endpoints\n\n```ts\ndeclare const cluster: msk.Cluster;\nnew CfnOutput(this, 'BootstrapBrokers', { value: cluster.bootstrapBrokers });\nnew CfnOutput(this, 'BootstrapBrokersTls', { value: cluster.bootstrapBrokersTls });\nnew CfnOutput(this, 'BootstrapBrokersSaslScram', { value: cluster.bootstrapBrokersSaslScram });\nnew CfnOutput(this, 'BootstrapBrokerStringSaslIam', { value: cluster.bootstrapBrokersSaslIam });\nnew CfnOutput(this, 'ZookeeperConnection', { value: cluster.zookeeperConnectionString });\nnew CfnOutput(this, 'ZookeeperConnectionTls', { value: cluster.zookeeperConnectionStringTls });\n```\n\n## Importing an existing Cluster\n\nTo import an existing MSK cluster into your CDK app use the `.fromClusterArn()` method.\n\n```ts\nconst cluster = msk.Cluster.fromClusterArn(this, 'Cluster',\n 'arn:aws:kafka:us-west-2:1234567890:cluster/a-cluster/11111111-1111-1111-1111-111111111111-1',\n);\n```\n\n## Client Authentication\n\n[MSK supports](https://docs.aws.amazon.com/msk/latest/developerguide/kafka_apis_iam.html) the following authentication mechanisms.\n\n### TLS\n\nTo enable client authentication with TLS set the `certificateAuthorityArns` property to reference your ACM Private CA. [More info on Private CAs.](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)\n\n```ts\nimport * as acmpca from 'aws-cdk-lib/aws-acmpca';\n\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'Cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n encryptionInTransit: {\n clientBroker: msk.ClientBrokerEncryption.TLS,\n },\n clientAuthentication: msk.ClientAuthentication.tls({\n certificateAuthorities: [\n acmpca.CertificateAuthority.fromCertificateAuthorityArn(\n this,\n 'CertificateAuthority',\n 'arn:aws:acm-pca:us-west-2:1234567890:certificate-authority/11111111-1111-1111-1111-111111111111',\n ),\n ],\n }),\n});\n```\n\n### SASL/SCRAM\n\nEnable client authentication with [SASL/SCRAM](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html):\n\n```ts\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n encryptionInTransit: {\n clientBroker: msk.ClientBrokerEncryption.TLS,\n },\n clientAuthentication: msk.ClientAuthentication.sasl({\n scram: true,\n }),\n});\n```\n\n### IAM\n\nEnable client authentication with [IAM](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html):\n\n```ts\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n encryptionInTransit: {\n clientBroker: msk.ClientBrokerEncryption.TLS,\n },\n clientAuthentication: msk.ClientAuthentication.sasl({\n iam: true,\n }),\n});\n```\n\n\n### SASL/IAM + TLS\n\nEnable client authentication with [IAM](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html)\nas well as enable client authentication with TLS by setting the `certificateAuthorityArns` property to reference your ACM Private CA. [More info on Private CAs.](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html)\n\n```ts\nimport * as acmpca from 'aws-cdk-lib/aws-acmpca';\n\ndeclare const vpc: ec2.Vpc;\nconst cluster = new msk.Cluster(this, 'Cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n encryptionInTransit: {\n clientBroker: msk.ClientBrokerEncryption.TLS,\n },\n clientAuthentication: msk.ClientAuthentication.saslTls({\n iam: true,\n certificateAuthorities: [\n acmpca.CertificateAuthority.fromCertificateAuthorityArn(\n this,\n 'CertificateAuthority',\n 'arn:aws:acm-pca:us-west-2:1234567890:certificate-authority/11111111-1111-1111-1111-111111111111',\n ),\n ],\n }),\n});\n```\n\n\n## Logging\n\nYou can deliver Apache Kafka broker logs to one or more of the following destination types:\nAmazon CloudWatch Logs, Amazon S3, Amazon Data Firehose.\n\nTo configure logs to be sent to an S3 bucket, provide a bucket in the `logging` config.\n\n```ts\ndeclare const vpc: ec2.Vpc;\ndeclare const bucket: s3.IBucket;\nconst cluster = new msk.Cluster(this, 'cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n logging: {\n s3: {\n bucket,\n },\n },\n});\n```\n\nWhen the S3 destination is configured, AWS will automatically create an S3 bucket policy\nthat allows the service to write logs to the bucket. This makes it impossible to later update\nthat bucket policy. To have CDK create the bucket policy so that future updates can be made,\nthe `@aws-cdk/aws-s3:createDefaultLoggingPolicy` [feature flag](https://docs.aws.amazon.com/cdk/v2/guide/featureflags.html) can be used. This can be set\nin the `cdk.json` file.\n\n```json\n{\n \"context\": {\n \"@aws-cdk/aws-s3:createDefaultLoggingPolicy\": true\n }\n}\n```\n\n## Storage Mode\n\nYou can configure an MSK cluster storage mode using the `storageMode` property.\n\nTiered storage is a low-cost storage tier for Amazon MSK that scales to virtually unlimited storage,\nmaking it cost-effective to build streaming data applications.\n\n> Visit [Tiered storage](https://docs.aws.amazon.com/msk/latest/developerguide/msk-tiered-storage.html)\nto see the list of compatible Kafka versions and for more details.\n\n```ts\ndeclare const vpc: ec2.Vpc;\ndeclare const bucket: s3.IBucket;\n\nconst cluster = new msk.Cluster(this, 'cluster', {\n clusterName: 'myCluster',\n kafkaVersion: msk.KafkaVersion.V4_1_X_KRAFT,\n vpc,\n storageMode: msk.StorageMode.TIERED,\n});\n```\n\n## MSK Express Brokers\n\nYou can create an MSK cluster with Express Brokers by setting the `brokerType` property to `BrokerType.EXPRESS`. Express Brokers are a low-cost option for development, testing, and workloads that don't require the high availability guarantees of standard MSK cluster.\nFor more information, see [Amazon MSK Express Brokers](https://docs.aws.amazon.com/msk/latest/developerguide/msk-broker-types-express.html).\n\n**Note:** When using Express Brokers, the following constraints apply:\n\n- Apache Kafka version must be 3.6.x or 3.8.x\n- You must specify the `instanceType`\n- The VPC must have at least 3 subnets (across 3 AZs)\n- `ebsStorageInfo` is not supported\n- `storageMode` is not supported\n- `logging` is not supported\n- Supported broker sizes: `m7g.xlarge`, `m7g.2xlarge`, `m7g.4xlarge`, `m7g.8xlarge`, `m7g.12xlarge`, `m7g.16xlarge`\n\n```ts\ndeclare const vpc: ec2.Vpc;\n\nconst expressCluster = new msk.Cluster(this, 'ExpressCluster', {\n clusterName: 'MyExpressCluster',\n kafkaVersion: msk.KafkaVersion.V3_8_X,\n vpc,\n brokerType: msk.BrokerType.EXPRESS,\n instanceType: ec2.InstanceType.of(\n ec2.InstanceClass.M7G,\n ec2.InstanceSize.XLARGE,\n ),\n});\n```\n\n## MSK Serverless\n\nYou can also use MSK Serverless by using `ServerlessCluster` class.\n\nMSK Serverless is a cluster type for Amazon MSK that makes it possible for you to run Apache Kafka without having to manage and scale cluster capacity.\n\nMSK Serverless requires IAM access control for all clusters.\n\nFor more infomation, see [Use MSK Serverless clusters](https://docs.aws.amazon.com/msk/latest/developerguide/serverless-getting-started.html).\n\n```ts\ndeclare const vpc: ec2.Vpc;\n\nconst serverlessCluster = new msk.ServerlessCluster(this, 'ServerlessCluster', {\n clusterName: 'MyServerlessCluster',\n vpcConfigs: [\n { vpc },\n ],\n});\n```\n"
4108
4134
  },
4109
4135
  "repository": {
4110
4136
  "directory": "packages/@aws-cdk/aws-msk-alpha",
@@ -4157,7 +4183,7 @@
4157
4183
  "kind": "interface",
4158
4184
  "locationInModule": {
4159
4185
  "filename": "lib/cluster.ts",
4160
- "line": 277
4186
+ "line": 301
4161
4187
  },
4162
4188
  "name": "BrokerLogging",
4163
4189
  "properties": [
@@ -4171,7 +4197,7 @@
4171
4197
  "immutable": true,
4172
4198
  "locationInModule": {
4173
4199
  "filename": "lib/cluster.ts",
4174
- "line": 290
4200
+ "line": 314
4175
4201
  },
4176
4202
  "name": "cloudwatchLogGroup",
4177
4203
  "optional": true,
@@ -4189,7 +4215,7 @@
4189
4215
  "immutable": true,
4190
4216
  "locationInModule": {
4191
4217
  "filename": "lib/cluster.ts",
4192
- "line": 283
4218
+ "line": 307
4193
4219
  },
4194
4220
  "name": "firehoseDeliveryStreamName",
4195
4221
  "optional": true,
@@ -4207,7 +4233,7 @@
4207
4233
  "immutable": true,
4208
4234
  "locationInModule": {
4209
4235
  "filename": "lib/cluster.ts",
4210
- "line": 297
4236
+ "line": 321
4211
4237
  },
4212
4238
  "name": "s3",
4213
4239
  "optional": true,
@@ -4218,6 +4244,41 @@
4218
4244
  ],
4219
4245
  "symbolId": "lib/cluster:BrokerLogging"
4220
4246
  },
4247
+ "@aws-cdk/aws-msk-alpha.BrokerType": {
4248
+ "assembly": "@aws-cdk/aws-msk-alpha",
4249
+ "docs": {
4250
+ "stability": "experimental",
4251
+ "summary": "The broker type for the cluster.",
4252
+ "example": "declare const vpc: ec2.Vpc;\n\nconst expressCluster = new msk.Cluster(this, 'ExpressCluster', {\n clusterName: 'MyExpressCluster',\n kafkaVersion: msk.KafkaVersion.V3_8_X,\n vpc,\n brokerType: msk.BrokerType.EXPRESS,\n instanceType: ec2.InstanceType.of(\n ec2.InstanceClass.M7G,\n ec2.InstanceSize.XLARGE,\n ),\n});",
4253
+ "custom": {
4254
+ "exampleMetadata": "infused"
4255
+ }
4256
+ },
4257
+ "fqn": "@aws-cdk/aws-msk-alpha.BrokerType",
4258
+ "kind": "enum",
4259
+ "locationInModule": {
4260
+ "filename": "lib/cluster.ts",
4261
+ "line": 214
4262
+ },
4263
+ "members": [
4264
+ {
4265
+ "docs": {
4266
+ "stability": "experimental",
4267
+ "summary": "Standard brokers provide high-availability guarantees."
4268
+ },
4269
+ "name": "STANDARD"
4270
+ },
4271
+ {
4272
+ "docs": {
4273
+ "stability": "experimental",
4274
+ "summary": "Express brokers are a low-cost option for development, testing, and workloads that don't require the high availability guarantees of standard MSK cluster."
4275
+ },
4276
+ "name": "EXPRESS"
4277
+ }
4278
+ ],
4279
+ "name": "BrokerType",
4280
+ "symbolId": "lib/cluster:BrokerType"
4281
+ },
4221
4282
  "@aws-cdk/aws-msk-alpha.ClientAuthentication": {
4222
4283
  "assembly": "@aws-cdk/aws-msk-alpha",
4223
4284
  "docs": {
@@ -4232,7 +4293,7 @@
4232
4293
  "kind": "class",
4233
4294
  "locationInModule": {
4234
4295
  "filename": "lib/cluster.ts",
4235
- "line": 407
4296
+ "line": 431
4236
4297
  },
4237
4298
  "methods": [
4238
4299
  {
@@ -4242,7 +4303,7 @@
4242
4303
  },
4243
4304
  "locationInModule": {
4244
4305
  "filename": "lib/cluster.ts",
4245
- "line": 411
4306
+ "line": 435
4246
4307
  },
4247
4308
  "name": "sasl",
4248
4309
  "parameters": [
@@ -4267,7 +4328,7 @@
4267
4328
  },
4268
4329
  "locationInModule": {
4269
4330
  "filename": "lib/cluster.ts",
4270
- "line": 425
4331
+ "line": 449
4271
4332
  },
4272
4333
  "name": "saslTls",
4273
4334
  "parameters": [
@@ -4292,7 +4353,7 @@
4292
4353
  },
4293
4354
  "locationInModule": {
4294
4355
  "filename": "lib/cluster.ts",
4295
- "line": 418
4356
+ "line": 442
4296
4357
  },
4297
4358
  "name": "tls",
4298
4359
  "parameters": [
@@ -4321,7 +4382,7 @@
4321
4382
  "immutable": true,
4322
4383
  "locationInModule": {
4323
4384
  "filename": "lib/cluster.ts",
4324
- "line": 434
4385
+ "line": 458
4325
4386
  },
4326
4387
  "name": "saslProps",
4327
4388
  "optional": true,
@@ -4337,7 +4398,7 @@
4337
4398
  "immutable": true,
4338
4399
  "locationInModule": {
4339
4400
  "filename": "lib/cluster.ts",
4340
- "line": 435
4401
+ "line": 459
4341
4402
  },
4342
4403
  "name": "tlsProps",
4343
4404
  "optional": true,
@@ -4362,7 +4423,7 @@
4362
4423
  "kind": "enum",
4363
4424
  "locationInModule": {
4364
4425
  "filename": "lib/cluster.ts",
4365
- "line": 320
4426
+ "line": 344
4366
4427
  },
4367
4428
  "members": [
4368
4429
  {
@@ -4409,7 +4470,7 @@
4409
4470
  },
4410
4471
  "locationInModule": {
4411
4472
  "filename": "lib/cluster.ts",
4412
- "line": 468
4473
+ "line": 492
4413
4474
  },
4414
4475
  "parameters": [
4415
4476
  {
@@ -4435,7 +4496,7 @@
4435
4496
  "kind": "class",
4436
4497
  "locationInModule": {
4437
4498
  "filename": "lib/cluster.ts",
4438
- "line": 444
4499
+ "line": 468
4439
4500
  },
4440
4501
  "methods": [
4441
4502
  {
@@ -4445,7 +4506,7 @@
4445
4506
  },
4446
4507
  "locationInModule": {
4447
4508
  "filename": "lib/cluster.ts",
4448
- "line": 452
4509
+ "line": 476
4449
4510
  },
4450
4511
  "name": "fromClusterArn",
4451
4512
  "parameters": [
@@ -4483,7 +4544,7 @@
4483
4544
  },
4484
4545
  "locationInModule": {
4485
4546
  "filename": "lib/cluster.ts",
4486
- "line": 850
4547
+ "line": 903
4487
4548
  },
4488
4549
  "name": "addUser",
4489
4550
  "parameters": [
@@ -4512,7 +4573,7 @@
4512
4573
  "immutable": true,
4513
4574
  "locationInModule": {
4514
4575
  "filename": "lib/cluster.ts",
4515
- "line": 447
4576
+ "line": 471
4516
4577
  },
4517
4578
  "name": "PROPERTY_INJECTION_ID",
4518
4579
  "static": true,
@@ -4530,7 +4591,7 @@
4530
4591
  "immutable": true,
4531
4592
  "locationInModule": {
4532
4593
  "filename": "lib/cluster.ts",
4533
- "line": 805
4594
+ "line": 858
4534
4595
  },
4535
4596
  "name": "bootstrapBrokers",
4536
4597
  "type": {
@@ -4547,7 +4608,7 @@
4547
4608
  "immutable": true,
4548
4609
  "locationInModule": {
4549
4610
  "filename": "lib/cluster.ts",
4550
- "line": 838
4611
+ "line": 891
4551
4612
  },
4552
4613
  "name": "bootstrapBrokersSaslIam",
4553
4614
  "type": {
@@ -4564,7 +4625,7 @@
4564
4625
  "immutable": true,
4565
4626
  "locationInModule": {
4566
4627
  "filename": "lib/cluster.ts",
4567
- "line": 827
4628
+ "line": 880
4568
4629
  },
4569
4630
  "name": "bootstrapBrokersSaslScram",
4570
4631
  "type": {
@@ -4581,7 +4642,7 @@
4581
4642
  "immutable": true,
4582
4643
  "locationInModule": {
4583
4644
  "filename": "lib/cluster.ts",
4584
- "line": 816
4645
+ "line": 869
4585
4646
  },
4586
4647
  "name": "bootstrapBrokersTls",
4587
4648
  "type": {
@@ -4596,7 +4657,7 @@
4596
4657
  "immutable": true,
4597
4658
  "locationInModule": {
4598
4659
  "filename": "lib/cluster.ts",
4599
- "line": 461
4660
+ "line": 485
4600
4661
  },
4601
4662
  "name": "clusterArn",
4602
4663
  "overrides": "@aws-cdk/aws-msk-alpha.ClusterBase",
@@ -4612,7 +4673,7 @@
4612
4673
  "immutable": true,
4613
4674
  "locationInModule": {
4614
4675
  "filename": "lib/cluster.ts",
4615
- "line": 462
4676
+ "line": 486
4616
4677
  },
4617
4678
  "name": "clusterName",
4618
4679
  "overrides": "@aws-cdk/aws-msk-alpha.ClusterBase",
@@ -4630,7 +4691,7 @@
4630
4691
  "immutable": true,
4631
4692
  "locationInModule": {
4632
4693
  "filename": "lib/cluster.ts",
4633
- "line": 755
4694
+ "line": 808
4634
4695
  },
4635
4696
  "name": "zookeeperConnectionString",
4636
4697
  "type": {
@@ -4647,7 +4708,7 @@
4647
4708
  "immutable": true,
4648
4709
  "locationInModule": {
4649
4710
  "filename": "lib/cluster.ts",
4650
- "line": 766
4711
+ "line": 819
4651
4712
  },
4652
4713
  "name": "zookeeperConnectionStringTls",
4653
4714
  "type": {
@@ -4662,7 +4723,7 @@
4662
4723
  "immutable": true,
4663
4724
  "locationInModule": {
4664
4725
  "filename": "lib/cluster.ts",
4665
- "line": 464
4726
+ "line": 488
4666
4727
  },
4667
4728
  "name": "saslScramAuthenticationKey",
4668
4729
  "optional": true,
@@ -4688,7 +4749,7 @@
4688
4749
  },
4689
4750
  "locationInModule": {
4690
4751
  "filename": "core/lib/resource.ts",
4691
- "line": 156
4752
+ "line": 122
4692
4753
  },
4693
4754
  "parameters": [
4694
4755
  {
@@ -4791,7 +4852,7 @@
4791
4852
  "kind": "interface",
4792
4853
  "locationInModule": {
4793
4854
  "filename": "lib/cluster.ts",
4794
- "line": 206
4855
+ "line": 230
4795
4856
  },
4796
4857
  "name": "ClusterConfigurationInfo",
4797
4858
  "properties": [
@@ -4805,7 +4866,7 @@
4805
4866
  "immutable": true,
4806
4867
  "locationInModule": {
4807
4868
  "filename": "lib/cluster.ts",
4808
- "line": 211
4869
+ "line": 235
4809
4870
  },
4810
4871
  "name": "arn",
4811
4872
  "type": {
@@ -4821,7 +4882,7 @@
4821
4882
  "immutable": true,
4822
4883
  "locationInModule": {
4823
4884
  "filename": "lib/cluster.ts",
4824
- "line": 216
4885
+ "line": 240
4825
4886
  },
4826
4887
  "name": "revision",
4827
4888
  "type": {
@@ -4842,7 +4903,7 @@
4842
4903
  "kind": "enum",
4843
4904
  "locationInModule": {
4844
4905
  "filename": "lib/cluster.ts",
4845
- "line": 224
4906
+ "line": 248
4846
4907
  },
4847
4908
  "members": [
4848
4909
  {
@@ -4945,6 +5006,25 @@
4945
5006
  "fqn": "aws-cdk-lib.aws_ec2.IVpc"
4946
5007
  }
4947
5008
  },
5009
+ {
5010
+ "abstract": true,
5011
+ "docs": {
5012
+ "default": "BrokerType.STANDARD",
5013
+ "remarks": "When set to EXPRESS, the cluster will be created with Express Brokers.\nWhen this is set to EXPRESS, instanceType must also be specified.",
5014
+ "stability": "experimental",
5015
+ "summary": "The broker type for the cluster."
5016
+ },
5017
+ "immutable": true,
5018
+ "locationInModule": {
5019
+ "filename": "lib/cluster.ts",
5020
+ "line": 108
5021
+ },
5022
+ "name": "brokerType",
5023
+ "optional": true,
5024
+ "type": {
5025
+ "fqn": "@aws-cdk/aws-msk-alpha.BrokerType"
5026
+ }
5027
+ },
4948
5028
  {
4949
5029
  "abstract": true,
4950
5030
  "docs": {
@@ -4956,7 +5036,7 @@
4956
5036
  "immutable": true,
4957
5037
  "locationInModule": {
4958
5038
  "filename": "lib/cluster.ts",
4959
- "line": 158
5039
+ "line": 167
4960
5040
  },
4961
5041
  "name": "clientAuthentication",
4962
5042
  "optional": true,
@@ -4974,7 +5054,7 @@
4974
5054
  "immutable": true,
4975
5055
  "locationInModule": {
4976
5056
  "filename": "lib/cluster.ts",
4977
- "line": 129
5057
+ "line": 138
4978
5058
  },
4979
5059
  "name": "configurationInfo",
4980
5060
  "optional": true,
@@ -4992,7 +5072,7 @@
4992
5072
  "immutable": true,
4993
5073
  "locationInModule": {
4994
5074
  "filename": "lib/cluster.ts",
4995
- "line": 114
5075
+ "line": 123
4996
5076
  },
4997
5077
  "name": "ebsStorageInfo",
4998
5078
  "optional": true,
@@ -5010,7 +5090,7 @@
5010
5090
  "immutable": true,
5011
5091
  "locationInModule": {
5012
5092
  "filename": "lib/cluster.ts",
5013
- "line": 150
5093
+ "line": 159
5014
5094
  },
5015
5095
  "name": "encryptionInTransit",
5016
5096
  "optional": true,
@@ -5047,7 +5127,7 @@
5047
5127
  "immutable": true,
5048
5128
  "locationInModule": {
5049
5129
  "filename": "lib/cluster.ts",
5050
- "line": 143
5130
+ "line": 152
5051
5131
  },
5052
5132
  "name": "logging",
5053
5133
  "optional": true,
@@ -5065,7 +5145,7 @@
5065
5145
  "immutable": true,
5066
5146
  "locationInModule": {
5067
5147
  "filename": "lib/cluster.ts",
5068
- "line": 136
5148
+ "line": 145
5069
5149
  },
5070
5150
  "name": "monitoring",
5071
5151
  "optional": true,
@@ -5101,7 +5181,7 @@
5101
5181
  "immutable": true,
5102
5182
  "locationInModule": {
5103
5183
  "filename": "lib/cluster.ts",
5104
- "line": 165
5184
+ "line": 174
5105
5185
  },
5106
5186
  "name": "removalPolicy",
5107
5187
  "optional": true,
@@ -5119,7 +5199,7 @@
5119
5199
  "immutable": true,
5120
5200
  "locationInModule": {
5121
5201
  "filename": "lib/cluster.ts",
5122
- "line": 107
5202
+ "line": 116
5123
5203
  },
5124
5204
  "name": "securityGroups",
5125
5205
  "optional": true,
@@ -5143,7 +5223,7 @@
5143
5223
  "immutable": true,
5144
5224
  "locationInModule": {
5145
5225
  "filename": "lib/cluster.ts",
5146
- "line": 122
5226
+ "line": 131
5147
5227
  },
5148
5228
  "name": "storageMode",
5149
5229
  "optional": true,
@@ -5188,7 +5268,7 @@
5188
5268
  "kind": "interface",
5189
5269
  "locationInModule": {
5190
5270
  "filename": "lib/cluster.ts",
5191
- "line": 171
5271
+ "line": 180
5192
5272
  },
5193
5273
  "name": "EbsStorageInfo",
5194
5274
  "properties": [
@@ -5202,7 +5282,7 @@
5202
5282
  "immutable": true,
5203
5283
  "locationInModule": {
5204
5284
  "filename": "lib/cluster.ts",
5205
- "line": 184
5285
+ "line": 193
5206
5286
  },
5207
5287
  "name": "encryptionKey",
5208
5288
  "optional": true,
@@ -5220,7 +5300,7 @@
5220
5300
  "immutable": true,
5221
5301
  "locationInModule": {
5222
5302
  "filename": "lib/cluster.ts",
5223
- "line": 177
5303
+ "line": 186
5224
5304
  },
5225
5305
  "name": "volumeSize",
5226
5306
  "optional": true,
@@ -5247,7 +5327,7 @@
5247
5327
  "kind": "interface",
5248
5328
  "locationInModule": {
5249
5329
  "filename": "lib/cluster.ts",
5250
- "line": 342
5330
+ "line": 366
5251
5331
  },
5252
5332
  "name": "EncryptionInTransitConfig",
5253
5333
  "properties": [
@@ -5261,7 +5341,7 @@
5261
5341
  "immutable": true,
5262
5342
  "locationInModule": {
5263
5343
  "filename": "lib/cluster.ts",
5264
- "line": 348
5344
+ "line": 372
5265
5345
  },
5266
5346
  "name": "clientBroker",
5267
5347
  "optional": true,
@@ -5279,7 +5359,7 @@
5279
5359
  "immutable": true,
5280
5360
  "locationInModule": {
5281
5361
  "filename": "lib/cluster.ts",
5282
- "line": 355
5362
+ "line": 379
5283
5363
  },
5284
5364
  "name": "enableInCluster",
5285
5365
  "optional": true,
@@ -6086,7 +6166,7 @@
6086
6166
  "kind": "interface",
6087
6167
  "locationInModule": {
6088
6168
  "filename": "lib/cluster.ts",
6089
- "line": 249
6169
+ "line": 273
6090
6170
  },
6091
6171
  "name": "MonitoringConfiguration",
6092
6172
  "properties": [
@@ -6100,7 +6180,7 @@
6100
6180
  "immutable": true,
6101
6181
  "locationInModule": {
6102
6182
  "filename": "lib/cluster.ts",
6103
- "line": 255
6183
+ "line": 279
6104
6184
  },
6105
6185
  "name": "clusterMonitoringLevel",
6106
6186
  "optional": true,
@@ -6118,7 +6198,7 @@
6118
6198
  "immutable": true,
6119
6199
  "locationInModule": {
6120
6200
  "filename": "lib/cluster.ts",
6121
- "line": 262
6201
+ "line": 286
6122
6202
  },
6123
6203
  "name": "enablePrometheusJmxExporter",
6124
6204
  "optional": true,
@@ -6137,7 +6217,7 @@
6137
6217
  "immutable": true,
6138
6218
  "locationInModule": {
6139
6219
  "filename": "lib/cluster.ts",
6140
- "line": 271
6220
+ "line": 295
6141
6221
  },
6142
6222
  "name": "enablePrometheusNodeExporter",
6143
6223
  "optional": true,
@@ -6163,7 +6243,7 @@
6163
6243
  "kind": "interface",
6164
6244
  "locationInModule": {
6165
6245
  "filename": "lib/cluster.ts",
6166
- "line": 303
6246
+ "line": 327
6167
6247
  },
6168
6248
  "name": "S3LoggingConfiguration",
6169
6249
  "properties": [
@@ -6176,7 +6256,7 @@
6176
6256
  "immutable": true,
6177
6257
  "locationInModule": {
6178
6258
  "filename": "lib/cluster.ts",
6179
- "line": 307
6259
+ "line": 331
6180
6260
  },
6181
6261
  "name": "bucket",
6182
6262
  "type": {
@@ -6193,7 +6273,7 @@
6193
6273
  "immutable": true,
6194
6274
  "locationInModule": {
6195
6275
  "filename": "lib/cluster.ts",
6196
- "line": 314
6276
+ "line": 338
6197
6277
  },
6198
6278
  "name": "prefix",
6199
6279
  "optional": true,
@@ -6219,7 +6299,7 @@
6219
6299
  "kind": "interface",
6220
6300
  "locationInModule": {
6221
6301
  "filename": "lib/cluster.ts",
6222
- "line": 361
6302
+ "line": 385
6223
6303
  },
6224
6304
  "name": "SaslAuthProps",
6225
6305
  "properties": [
@@ -6233,7 +6313,7 @@
6233
6313
  "immutable": true,
6234
6314
  "locationInModule": {
6235
6315
  "filename": "lib/cluster.ts",
6236
- "line": 374
6316
+ "line": 398
6237
6317
  },
6238
6318
  "name": "iam",
6239
6319
  "optional": true,
@@ -6252,7 +6332,7 @@
6252
6332
  "immutable": true,
6253
6333
  "locationInModule": {
6254
6334
  "filename": "lib/cluster.ts",
6255
- "line": 384
6335
+ "line": 408
6256
6336
  },
6257
6337
  "name": "key",
6258
6338
  "optional": true,
@@ -6270,7 +6350,7 @@
6270
6350
  "immutable": true,
6271
6351
  "locationInModule": {
6272
6352
  "filename": "lib/cluster.ts",
6273
- "line": 367
6353
+ "line": 391
6274
6354
  },
6275
6355
  "name": "scram",
6276
6356
  "optional": true,
@@ -6300,7 +6380,7 @@
6300
6380
  "kind": "interface",
6301
6381
  "locationInModule": {
6302
6382
  "filename": "lib/cluster.ts",
6303
- "line": 402
6383
+ "line": 426
6304
6384
  },
6305
6385
  "name": "SaslTlsAuthProps",
6306
6386
  "symbolId": "lib/cluster:SaslTlsAuthProps"
@@ -6521,7 +6601,7 @@
6521
6601
  "kind": "enum",
6522
6602
  "locationInModule": {
6523
6603
  "filename": "lib/cluster.ts",
6524
- "line": 190
6604
+ "line": 199
6525
6605
  },
6526
6606
  "members": [
6527
6607
  {
@@ -6557,7 +6637,7 @@
6557
6637
  "kind": "interface",
6558
6638
  "locationInModule": {
6559
6639
  "filename": "lib/cluster.ts",
6560
- "line": 390
6640
+ "line": 414
6561
6641
  },
6562
6642
  "name": "TlsAuthProps",
6563
6643
  "properties": [
@@ -6571,7 +6651,7 @@
6571
6651
  "immutable": true,
6572
6652
  "locationInModule": {
6573
6653
  "filename": "lib/cluster.ts",
6574
- "line": 396
6654
+ "line": 420
6575
6655
  },
6576
6656
  "name": "certificateAuthorities",
6577
6657
  "optional": true,
@@ -6669,6 +6749,6 @@
6669
6749
  "symbolId": "lib/serverless-cluster:VpcConfig"
6670
6750
  }
6671
6751
  },
6672
- "version": "2.221.1-alpha.0",
6752
+ "version": "2.223.0-alpha.0",
6673
6753
  "fingerprint": "**********"
6674
6754
  }
Binary file
package/.warnings.jsii.js CHANGED
@@ -9,6 +9,8 @@ function _aws_cdk_aws_msk_alpha_ClusterProps(p) {
9
9
  try {
10
10
  if (!visitedObjects.has(p.kafkaVersion))
11
11
  _aws_cdk_aws_msk_alpha_KafkaVersion(p.kafkaVersion);
12
+ if (!visitedObjects.has(p.brokerType))
13
+ _aws_cdk_aws_msk_alpha_BrokerType(p.brokerType);
12
14
  if (!visitedObjects.has(p.clientAuthentication))
13
15
  _aws_cdk_aws_msk_alpha_ClientAuthentication(p.clientAuthentication);
14
16
  if (!visitedObjects.has(p.configurationInfo))
@@ -36,6 +38,8 @@ function _aws_cdk_aws_msk_alpha_EbsStorageInfo(p) {
36
38
  }
37
39
  function _aws_cdk_aws_msk_alpha_StorageMode(p) {
38
40
  }
41
+ function _aws_cdk_aws_msk_alpha_BrokerType(p) {
42
+ }
39
43
  function _aws_cdk_aws_msk_alpha_ClusterConfigurationInfo(p) {
40
44
  }
41
45
  function _aws_cdk_aws_msk_alpha_ClusterMonitoringLevel(p) {
@@ -184,4 +188,4 @@ class DeprecationError extends Error {
184
188
  });
185
189
  }
186
190
  }
187
- module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_aws_msk_alpha_ICluster, _aws_cdk_aws_msk_alpha_ClusterBase, _aws_cdk_aws_msk_alpha_ClusterProps, _aws_cdk_aws_msk_alpha_EbsStorageInfo, _aws_cdk_aws_msk_alpha_StorageMode, _aws_cdk_aws_msk_alpha_ClusterConfigurationInfo, _aws_cdk_aws_msk_alpha_ClusterMonitoringLevel, _aws_cdk_aws_msk_alpha_MonitoringConfiguration, _aws_cdk_aws_msk_alpha_BrokerLogging, _aws_cdk_aws_msk_alpha_S3LoggingConfiguration, _aws_cdk_aws_msk_alpha_ClientBrokerEncryption, _aws_cdk_aws_msk_alpha_EncryptionInTransitConfig, _aws_cdk_aws_msk_alpha_SaslAuthProps, _aws_cdk_aws_msk_alpha_TlsAuthProps, _aws_cdk_aws_msk_alpha_SaslTlsAuthProps, _aws_cdk_aws_msk_alpha_ClientAuthentication, _aws_cdk_aws_msk_alpha_Cluster, _aws_cdk_aws_msk_alpha_KafkaVersionFeatures, _aws_cdk_aws_msk_alpha_KafkaVersion, _aws_cdk_aws_msk_alpha_ServerlessClusterProps, _aws_cdk_aws_msk_alpha_VpcConfig, _aws_cdk_aws_msk_alpha_ServerlessCluster };
191
+ module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_aws_msk_alpha_ICluster, _aws_cdk_aws_msk_alpha_ClusterBase, _aws_cdk_aws_msk_alpha_ClusterProps, _aws_cdk_aws_msk_alpha_EbsStorageInfo, _aws_cdk_aws_msk_alpha_StorageMode, _aws_cdk_aws_msk_alpha_BrokerType, _aws_cdk_aws_msk_alpha_ClusterConfigurationInfo, _aws_cdk_aws_msk_alpha_ClusterMonitoringLevel, _aws_cdk_aws_msk_alpha_MonitoringConfiguration, _aws_cdk_aws_msk_alpha_BrokerLogging, _aws_cdk_aws_msk_alpha_S3LoggingConfiguration, _aws_cdk_aws_msk_alpha_ClientBrokerEncryption, _aws_cdk_aws_msk_alpha_EncryptionInTransitConfig, _aws_cdk_aws_msk_alpha_SaslAuthProps, _aws_cdk_aws_msk_alpha_TlsAuthProps, _aws_cdk_aws_msk_alpha_SaslTlsAuthProps, _aws_cdk_aws_msk_alpha_ClientAuthentication, _aws_cdk_aws_msk_alpha_Cluster, _aws_cdk_aws_msk_alpha_KafkaVersionFeatures, _aws_cdk_aws_msk_alpha_KafkaVersion, _aws_cdk_aws_msk_alpha_ServerlessClusterProps, _aws_cdk_aws_msk_alpha_VpcConfig, _aws_cdk_aws_msk_alpha_ServerlessCluster };
package/README.md CHANGED
@@ -232,6 +232,36 @@ const cluster = new msk.Cluster(this, 'cluster', {
232
232
  });
233
233
  ```
234
234
 
235
+ ## MSK Express Brokers
236
+
237
+ You can create an MSK cluster with Express Brokers by setting the `brokerType` property to `BrokerType.EXPRESS`. Express Brokers are a low-cost option for development, testing, and workloads that don't require the high availability guarantees of standard MSK cluster.
238
+ For more information, see [Amazon MSK Express Brokers](https://docs.aws.amazon.com/msk/latest/developerguide/msk-broker-types-express.html).
239
+
240
+ **Note:** When using Express Brokers, the following constraints apply:
241
+
242
+ - Apache Kafka version must be 3.6.x or 3.8.x
243
+ - You must specify the `instanceType`
244
+ - The VPC must have at least 3 subnets (across 3 AZs)
245
+ - `ebsStorageInfo` is not supported
246
+ - `storageMode` is not supported
247
+ - `logging` is not supported
248
+ - Supported broker sizes: `m7g.xlarge`, `m7g.2xlarge`, `m7g.4xlarge`, `m7g.8xlarge`, `m7g.12xlarge`, `m7g.16xlarge`
249
+
250
+ ```ts
251
+ declare const vpc: ec2.Vpc;
252
+
253
+ const expressCluster = new msk.Cluster(this, 'ExpressCluster', {
254
+ clusterName: 'MyExpressCluster',
255
+ kafkaVersion: msk.KafkaVersion.V3_8_X,
256
+ vpc,
257
+ brokerType: msk.BrokerType.EXPRESS,
258
+ instanceType: ec2.InstanceType.of(
259
+ ec2.InstanceClass.M7G,
260
+ ec2.InstanceSize.XLARGE,
261
+ ),
262
+ });
263
+ ```
264
+
235
265
  ## MSK Serverless
236
266
 
237
267
  You can also use MSK Serverless by using `ServerlessCluster` class.
@@ -9,7 +9,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
9
9
  class KafkaVersion {
10
10
  version;
11
11
  features;
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.KafkaVersion", version: "2.221.1-alpha.0" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.KafkaVersion", version: "2.223.0-alpha.0" };
13
13
  /**
14
14
  * **Deprecated by Amazon MSK. You can't create a Kafka cluster with a deprecated version.**
15
15
  *
package/lib/cluster.d.ts CHANGED
@@ -73,6 +73,14 @@ export interface ClusterProps {
73
73
  * @default kafka.m5.large
74
74
  */
75
75
  readonly instanceType?: ec2.InstanceType;
76
+ /**
77
+ * The broker type for the cluster.
78
+ * When set to EXPRESS, the cluster will be created with Express Brokers.
79
+ * When this is set to EXPRESS, instanceType must also be specified.
80
+ *
81
+ * @default BrokerType.STANDARD
82
+ */
83
+ readonly brokerType?: BrokerType;
76
84
  /**
77
85
  * The AWS security groups to associate with the elastic network interfaces in order to specify who can
78
86
  * connect to and communicate with the Amazon MSK cluster.
@@ -161,6 +169,19 @@ export declare enum StorageMode {
161
169
  */
162
170
  TIERED = "TIERED"
163
171
  }
172
+ /**
173
+ * The broker type for the cluster.
174
+ */
175
+ export declare enum BrokerType {
176
+ /**
177
+ * Standard brokers provide high-availability guarantees.
178
+ */
179
+ STANDARD = "STANDARD",
180
+ /**
181
+ * Express brokers are a low-cost option for development, testing, and workloads that don't require the high availability guarantees of standard MSK cluster.
182
+ */
183
+ EXPRESS = "EXPRESS"
184
+ }
164
185
  /**
165
186
  * The Amazon MSK configuration to use for the cluster.
166
187
  * Note: There is currently no Cloudformation Resource to create a Configuration
package/lib/cluster.js CHANGED
@@ -34,7 +34,7 @@ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn,
34
34
  done = true;
35
35
  };
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
- exports.Cluster = exports.ClientAuthentication = exports.ClientBrokerEncryption = exports.ClusterMonitoringLevel = exports.StorageMode = exports.ClusterBase = void 0;
37
+ exports.Cluster = exports.ClientAuthentication = exports.ClientBrokerEncryption = exports.ClusterMonitoringLevel = exports.BrokerType = exports.StorageMode = exports.ClusterBase = void 0;
38
38
  const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
39
39
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
40
  const ec2 = require("aws-cdk-lib/aws-ec2");
@@ -53,7 +53,7 @@ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
53
53
  * A new or imported MSK Cluster.
54
54
  */
55
55
  class ClusterBase extends core.Resource {
56
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.ClusterBase", version: "2.221.1-alpha.0" };
56
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.ClusterBase", version: "2.223.0-alpha.0" };
57
57
  /** @internal */
58
58
  _connections;
59
59
  /** Manages connections for the cluster */
@@ -79,6 +79,20 @@ var StorageMode;
79
79
  */
80
80
  StorageMode["TIERED"] = "TIERED";
81
81
  })(StorageMode || (exports.StorageMode = StorageMode = {}));
82
+ /**
83
+ * The broker type for the cluster.
84
+ */
85
+ var BrokerType;
86
+ (function (BrokerType) {
87
+ /**
88
+ * Standard brokers provide high-availability guarantees.
89
+ */
90
+ BrokerType["STANDARD"] = "STANDARD";
91
+ /**
92
+ * Express brokers are a low-cost option for development, testing, and workloads that don't require the high availability guarantees of standard MSK cluster.
93
+ */
94
+ BrokerType["EXPRESS"] = "EXPRESS";
95
+ })(BrokerType || (exports.BrokerType = BrokerType = {}));
82
96
  /**
83
97
  * The level of monitoring for the MSK cluster
84
98
  *
@@ -127,7 +141,7 @@ var ClientBrokerEncryption;
127
141
  class ClientAuthentication {
128
142
  saslProps;
129
143
  tlsProps;
130
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.ClientAuthentication", version: "2.221.1-alpha.0" };
144
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.ClientAuthentication", version: "2.223.0-alpha.0" };
131
145
  /**
132
146
  * SASL authentication
133
147
  */
@@ -206,7 +220,7 @@ let Cluster = (() => {
206
220
  Cluster = _classThis = _classDescriptor.value;
207
221
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
208
222
  }
209
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.Cluster", version: "2.221.1-alpha.0" };
223
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.Cluster", version: "2.223.0-alpha.0" };
210
224
  /** Uniquely identifies this class. */
211
225
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-msk-alpha.Cluster';
212
226
  /**
@@ -264,8 +278,33 @@ let Cluster = (() => {
264
278
  if (volumeSize < 1 || volumeSize > 16384) {
265
279
  throw new core.ValidationError('EBS volume size should be in the range 1-16384', this);
266
280
  }
281
+ const isExpress = props.brokerType === BrokerType.EXPRESS;
282
+ if (isExpress) {
283
+ // Validate Kafka version compatibility
284
+ const supportedVersions = ['3.6', '3.8'];
285
+ const kafkaVersionString = props.kafkaVersion.version;
286
+ const isCompatibleVersion = supportedVersions.some(version => kafkaVersionString.includes(version));
287
+ if (!isCompatibleVersion) {
288
+ throw new core.ValidationError(`Express brokers are only supported with Apache Kafka 3.6.x and 3.8.x, got ${kafkaVersionString}`, this);
289
+ }
290
+ if (!props.instanceType) {
291
+ throw new core.ValidationError('`instanceType` must also be specified when `brokerType` is `BrokerType.EXPRESS`.', this);
292
+ }
293
+ if (props.ebsStorageInfo) {
294
+ throw new core.ValidationError('`ebsStorageInfo` is not supported when `brokerType` is `BrokerType.EXPRESS`.', this);
295
+ }
296
+ if (props.storageMode) {
297
+ throw new core.ValidationError('`storageMode` is not supported when `brokerType` is `BrokerType.EXPRESS`.', this);
298
+ }
299
+ if (props.logging) {
300
+ throw new core.ValidationError('`logging` is not supported when `brokerType` is `BrokerType.EXPRESS`.', this);
301
+ }
302
+ if (subnetSelection.subnets.length < 3) {
303
+ throw new core.ValidationError(`Express cluster requires at least 3 subnets, got ${subnetSelection.subnets.length}`, this);
304
+ }
305
+ }
267
306
  const instanceType = props.instanceType
268
- ? this.mskInstanceType(props.instanceType)
307
+ ? this.mskInstanceType(props.instanceType, isExpress)
269
308
  : this.mskInstanceType(ec2.InstanceType.of(ec2.InstanceClass.M5, ec2.InstanceSize.LARGE));
270
309
  if (props.storageMode && props.storageMode === StorageMode.TIERED) {
271
310
  if (!props.kafkaVersion.isTieredStorageCompatible()) {
@@ -347,7 +386,7 @@ let Cluster = (() => {
347
386
  },
348
387
  }));
349
388
  }
350
- const loggingInfo = {
389
+ const loggingInfo = isExpress ? undefined : {
351
390
  brokerLogs: {
352
391
  cloudWatchLogs: {
353
392
  enabled: props.logging?.cloudwatchLogGroup !== undefined,
@@ -413,7 +452,7 @@ let Cluster = (() => {
413
452
  instanceType,
414
453
  clientSubnets: subnetSelection.subnetIds,
415
454
  securityGroups: this.connections.securityGroups.map((group) => group.securityGroupId),
416
- storageInfo: {
455
+ storageInfo: isExpress ? undefined : {
417
456
  ebsStorageInfo: {
418
457
  volumeSize: volumeSize,
419
458
  },
@@ -426,7 +465,7 @@ let Cluster = (() => {
426
465
  configurationInfo: props.configurationInfo,
427
466
  enhancedMonitoring: props.monitoring?.clusterMonitoringLevel,
428
467
  openMonitoring: openMonitoring,
429
- storageMode: props.storageMode,
468
+ storageMode: isExpress ? undefined : props.storageMode,
430
469
  loggingInfo: loggingInfo,
431
470
  clientAuthentication,
432
471
  });
@@ -436,8 +475,9 @@ let Cluster = (() => {
436
475
  default: core.RemovalPolicy.RETAIN,
437
476
  });
438
477
  }
439
- mskInstanceType(instanceType) {
440
- return `kafka.${instanceType.toString()}`;
478
+ mskInstanceType(instanceType, express) {
479
+ const prefix = express ? 'express.' : 'kafka.';
480
+ return `${prefix}${instanceType.toString()}`;
441
481
  }
442
482
  /**
443
483
  * Get the ZooKeeper Connection string
@@ -612,4 +652,4 @@ let Cluster = (() => {
612
652
  return Cluster = _classThis;
613
653
  })();
614
654
  exports.Cluster = Cluster;
615
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsdXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFHM0MsaUVBQWlFO0FBQ2pFLHlDQUF5QztBQUN6QywyQ0FBZ0Q7QUFDaEQsbURBQW1EO0FBQ25ELCtDQUFzRTtBQUV0RSw4REFBNEQ7QUFFNUQsaURBQWlEO0FBQ2pELDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFxQjFFOztHQUVHO0FBQ0gsTUFBc0IsV0FBWSxTQUFRLElBQUksQ0FBQyxRQUFROztJQUdyRCxnQkFBZ0I7SUFDTixZQUFZLENBQThCO0lBRXBELDBDQUEwQztJQUMxQyxJQUFXLFdBQVc7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyx1REFBdUQsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzFCOztBQVpILGtDQWFDO0FBcUlEOztHQUVHO0FBQ0gsSUFBWSxXQVVYO0FBVkQsV0FBWSxXQUFXO0lBQ3JCOztPQUVHO0lBQ0gsOEJBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gsZ0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVZXLFdBQVcsMkJBQVgsV0FBVyxRQVV0QjtBQW1CRDs7OztHQUlHO0FBQ0gsSUFBWSxzQkFvQlg7QUFwQkQsV0FBWSxzQkFBc0I7SUFDaEM7O09BRUc7SUFDSCw2Q0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILG1EQUF5QixDQUFBO0lBRXpCOztPQUVHO0lBQ0gsdUVBQTZDLENBQUE7SUFFN0M7O09BRUc7SUFDSCw2RUFBbUQsQ0FBQTtBQUNyRCxDQUFDLEVBcEJXLHNCQUFzQixzQ0FBdEIsc0JBQXNC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QUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQzs0QkFDNUIsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLE1BQU0sQ0FBQzt5QkFDckQsQ0FBQzt3QkFDRixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7NEJBQ3RCLE9BQU8sRUFBRSxDQUFDLGlDQUFpQyxDQUFDOzRCQUM1QyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO3lCQUM3QixDQUFDO3FCQUNILENBQUM7b0JBQ0YsbUJBQW1CLEVBQUUsS0FBSztpQkFDM0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGlGQUFpRixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFILENBQUM7U0FDRjs7WUE5YlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhY21wY2EgZnJvbSAnYXdzLWNkay1saWIvYXdzLWFjbXBjYSc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IEZlYXR1cmVGbGFncyB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBTM19DUkVBVEVfREVGQVVMVF9MT0dHSU5HX1BPTElDWSB9IGZyb20gJ2F3cy1jZGstbGliL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgYWRkcmVzc09mIH0gZnJvbSAnY29uc3RydWN0cy9saWIvcHJpdmF0ZS91bmlxdWVpZCc7XG5pbXBvcnQgeyBLYWZrYVZlcnNpb24gfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBDZm5DbHVzdGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1zayc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBNU0sgQ2x1c3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDbHVzdGVyIGV4dGVuZHMgY29yZS5JUmVzb3VyY2UsIGVjMi5JQ29ubmVjdGFibGUge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiBjbHVzdGVyLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbmV3IG9yIGltcG9ydGVkIE1TSyBDbHVzdGVyLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2x1c3RlckJhc2UgZXh0ZW5kcyBjb3JlLlJlc291cmNlIGltcGxlbWVudHMgSUNsdXN0ZXIge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY2x1c3RlckFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY2x1c3Rlck5hbWU6IHN0cmluZztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX2Nvbm5lY3Rpb25zOiBlYzIuQ29ubmVjdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIE1hbmFnZXMgY29ubmVjdGlvbnMgZm9yIHRoZSBjbHVzdGVyICovXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbnMoKTogZWMyLkNvbm5lY3Rpb25zIHtcbiAgICBpZiAoIXRoaXMuX2Nvbm5lY3Rpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgY29yZS5WYWxpZGF0aW9uRXJyb3IoJ0FuIGltcG9ydGVkIENsdXN0ZXIgY2Fubm90IG1hbmFnZSBpdHMgc2VjdXJpdHkgZ3JvdXBzJywgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9ucztcbiAgfVxufVxuXG4vKipcbiAqICBQcm9wZXJ0aWVzIGZvciBhIE1TSyBDbHVzdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2x1c3RlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBjbHVzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3Rlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgQXBhY2hlIEthZmthLlxuICAgKi9cbiAgcmVhZG9ubHkga2Fma2FWZXJzaW9uOiBLYWZrYVZlcnNpb247XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBBcGFjaGUgS2Fma2EgYnJva2VycyBkZXBsb3llZCBpbiBlYWNoIEF2YWlsYWJpbGl0eSBab25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBudW1iZXJPZkJyb2tlck5vZGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSB2aXJ0dWFsIG5ldHdvcmtpbmcgZW52aXJvbm1lbnQgZm9yIHRoaXMgY2x1c3Rlci5cbiAgICogTXVzdCBoYXZlIGF0IGxlYXN0IDIgc3VibmV0cyBpbiB0d28gZGlmZmVyZW50IEFacy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBub2RlcyB3aXRoaW4gdGhlIFZQQy5cbiAgICogQW1hem9uIE1TSyBkaXN0cmlidXRlcyB0aGUgYnJva2VyIG5vZGVzIGV2ZW5seSBhY3Jvc3MgdGhlIHN1Ym5ldHMgdGhhdCB5b3Ugc3BlY2lmeS5cbiAgICogVGhlIHN1Ym5ldHMgdGhhdCB5b3Ugc3BlY2lmeSBtdXN0IGJlIGluIGRpc3RpbmN0IEF2YWlsYWJpbGl0eSBab25lcy5cbiAgICogQ2xpZW50IHN1Ym5ldHMgY2FuJ3QgYmUgaW4gQXZhaWxhYmlsaXR5IFpvbmUgdXMtZWFzdC0xZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgVnBjIGRlZmF1bHQgc3RyYXRlZ3kgaWYgbm90IHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgRUMyIGluc3RhbmNlIHR5cGUgdGhhdCB5b3Ugd2FudCBBbWF6b24gTVNLIHRvIHVzZSB3aGVuIGl0IGNyZWF0ZXMgeW91ciBicm9rZXJzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tc2svbGF0ZXN0L2RldmVsb3Blcmd1aWRlL21zay1jcmVhdGUtY2x1c3Rlci5odG1sI2Jyb2tlci1pbnN0YW5jZS10eXBlc1xuICAgKiBAZGVmYXVsdCBrYWZrYS5tNS5sYXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VUeXBlPzogZWMyLkluc3RhbmNlVHlwZTtcblxuICAvKipcbiAgICogVGhlIEFXUyBzZWN1cml0eSBncm91cHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGVsYXN0aWMgbmV0d29yayBpbnRlcmZhY2VzIGluIG9yZGVyIHRvIHNwZWNpZnkgd2hvIGNhblxuICAgKiBjb25uZWN0IHRvIGFuZCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBbWF6b24gTVNLIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY3JlYXRlIG5ldyBzZWN1cml0eSBncm91cFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgc3RvcmFnZSB2b2x1bWVzIGF0dGFjaGVkIHRvIE1TSyBicm9rZXIgbm9kZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gMTAwMCBHaUIgRUJTIHZvbHVtZVxuICAgKi9cbiAgcmVhZG9ubHkgZWJzU3RvcmFnZUluZm8/OiBFYnNTdG9yYWdlSW5mbztcblxuICAvKipcbiAgICogVGhpcyBjb250cm9scyBzdG9yYWdlIG1vZGUgZm9yIHN1cHBvcnRlZCBzdG9yYWdlIHRpZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFN0b3JhZ2VNb2RlLkxPQ0FMXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21zay9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvbXNrLXRpZXJlZC1zdG9yYWdlLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VNb2RlPzogU3RvcmFnZU1vZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gTVNLIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBjb25maWd1cmF0aW9uSW5mbz86IENsdXN0ZXJDb25maWd1cmF0aW9uSW5mbztcblxuICAvKipcbiAgICogQ2x1c3RlciBtb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gREVGQVVMVCBtb25pdG9yaW5nIGxldmVsXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogTW9uaXRvcmluZ0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB5b3VyIE1TSyBjbHVzdGVyIHRvIHNlbmQgYnJva2VyIGxvZ3MgdG8gZGlmZmVyZW50IGRlc3RpbmF0aW9uIHR5cGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nPzogQnJva2VyTG9nZ2luZztcblxuICAvKipcbiAgICogQ29uZmlnIGRldGFpbHMgZm9yIGVuY3J5cHRpb24gaW4gdHJhbnNpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uSW5UcmFuc2l0PzogRW5jcnlwdGlvbkluVHJhbnNpdENvbmZpZztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBjbGllbnQgYXV0aGVudGljYXRpb24uXG4gICAqIE1TSyBzdXBwb3J0cyB1c2luZyBwcml2YXRlIFRMUyBjZXJ0aWZpY2F0ZXMgb3IgU0FTTC9TQ1JBTSB0byBhdXRoZW50aWNhdGUgdGhlIGlkZW50aXR5IG9mIGNsaWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudEF1dGhlbnRpY2F0aW9uPzogQ2xpZW50QXV0aGVudGljYXRpb247XG5cbiAgLyoqXG4gICAqIFdoYXQgdG8gZG8gd2hlbiB0aGlzIHJlc291cmNlIGlzIGRlbGV0ZWQgZnJvbSBhIHN0YWNrLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IGNvcmUuUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBFQlMgdm9sdW1lIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVic1N0b3JhZ2VJbmZvIHtcbiAgLyoqXG4gICAqIFRoZSBzaXplIGluIEdpQiBvZiB0aGUgRUJTIHZvbHVtZSBmb3IgdGhlIGRhdGEgZHJpdmUgb24gZWFjaCBicm9rZXIgbm9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAwMFxuICAgKi9cbiAgcmVhZG9ubHkgdm9sdW1lU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFXUyBLTVMga2V5IGZvciBlbmNyeXB0aW5nIGRhdGEgYXQgcmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgVXNlcyBBV1MgbWFuYWdlZCBDTUsgKGF3cy9rYWZrYSlcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleVJlZjtcbn1cblxuLyoqXG4gKiBUaGUgc3RvcmFnZSBtb2RlIGZvciB0aGUgY2x1c3RlciBicm9rZXJzLlxuICovXG5leHBvcnQgZW51bSBTdG9yYWdlTW9kZSB7XG4gIC8qKlxuICAgKiBMb2NhbCBzdG9yYWdlIG1vZGUgdXRpbGl6ZXMgbmV0d29yayBhdHRhY2hlZCBFQlMgc3RvcmFnZS5cbiAgICovXG4gIExPQ0FMID0gJ0xPQ0FMJyxcblxuICAvKipcbiAgICogVGllcmVkIHN0b3JhZ2UgbW9kZSB1dGlsaXplcyBFQlMgc3RvcmFnZSBhbmQgVGllcmVkIHN0b3JhZ2UuXG4gICAqL1xuICBUSUVSRUQgPSAnVElFUkVEJyxcbn1cblxuLyoqXG4gKiBUaGUgQW1hem9uIE1TSyBjb25maWd1cmF0aW9uIHRvIHVzZSBmb3IgdGhlIGNsdXN0ZXIuXG4gKiBOb3RlOiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gQ2xvdWRmb3JtYXRpb24gUmVzb3VyY2UgdG8gY3JlYXRlIGEgQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsdXN0ZXJDb25maWd1cmF0aW9uSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIE1TSyBjb25maWd1cmF0aW9uIHRvIHVzZS5cbiAgICogRm9yIGV4YW1wbGUsIGFybjphd3M6a2Fma2E6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpjb25maWd1cmF0aW9uL2V4YW1wbGUtY29uZmlndXJhdGlvbi1uYW1lL2FiY2RhYmNkLTEyMzQtYWJjZC0xMjM0LWFiY2QxMjNlOGU4ZS0xLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXZpc2lvbiBvZiB0aGUgQW1hem9uIE1TSyBjb25maWd1cmF0aW9uIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IHJldmlzaW9uOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGxldmVsIG9mIG1vbml0b3JpbmcgZm9yIHRoZSBNU0sgY2x1c3RlclxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21zay9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvbW9uaXRvcmluZy5odG1sI21ldHJpY3MtZGV0YWlsc1xuICovXG5leHBvcnQgZW51bSBDbHVzdGVyTW9uaXRvcmluZ0xldmVsIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgbWV0cmljcyBhcmUgdGhlIGVzc2VudGlhbCBtZXRyaWNzIHRvIG1vbml0b3IuXG4gICAqL1xuICBERUZBVUxUID0gJ0RFRkFVTFQnLFxuXG4gIC8qKlxuICAgKiBQZXIgQnJva2VyIG1ldHJpY3MgZ2l2ZSB5b3UgbWV0cmljcyBhdCB0aGUgYnJva2VyIGxldmVsLlxuICAgKi9cbiAgUEVSX0JST0tFUiA9ICdQRVJfQlJPS0VSJyxcblxuICAvKipcbiAgICogUGVyIFRvcGljIFBlciBCcm9rZXIgbWV0cmljcyBoZWxwIHlvdSB1bmRlcnN0YW5kIHZvbHVtZSBhdCB0aGUgdG9waWMgbGV2ZWwuXG4gICAqL1xuICBQRVJfVE9QSUNfUEVSX0JST0tFUiA9ICdQRVJfVE9QSUNfUEVSX0JST0tFUicsXG5cbiAgLyoqXG4gICAqIFBlciBUb3BpYyBQZXIgUGFydGl0aW9uIG1ldHJpY3MgaGVscCB5b3UgdW5kZXJzdGFuZCBjb25zdW1lciBncm91cCBsYWcgYXQgdGhlIHRvcGljIHBhcnRpdGlvbiBsZXZlbC5cbiAgICovXG4gIFBFUl9UT1BJQ19QRVJfUEFSVElUSU9OID0gJ1BFUl9UT1BJQ19QRVJfUEFSVElUSU9OJyxcbn1cblxuLyoqXG4gKiBNb25pdG9yaW5nIENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGxldmVsIG9mIG1vbml0b3JpbmcgZm9yIHRoZSBNU0sgY2x1c3Rlci5cbiAgICpcbiAgICogQGRlZmF1bHQgREVGQVVMVFxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3Rlck1vbml0b3JpbmdMZXZlbD86IENsdXN0ZXJNb25pdG9yaW5nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHlvdSB3YW50IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBKTVggRXhwb3J0ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVQcm9tZXRoZXVzSm14RXhwb3J0ZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB5b3Ugd2FudCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgUHJvbWV0aGV1cyBOb2RlIEV4cG9ydGVyLlxuICAgKlxuICAgKiBZb3UgY2FuIHVzZSB0aGUgUHJvbWV0aGV1cyBOb2RlIEV4cG9ydGVyIHRvIGdldCBDUFUgYW5kIGRpc2sgbWV0cmljcyBmb3IgdGhlIGJyb2tlciBub2Rlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVByb21ldGhldXNOb2RlRXhwb3J0ZXI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZGV0YWlscyByZWxhdGVkIHRvIGJyb2tlciBsb2dzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyb2tlckxvZ2dpbmcge1xuICAvKipcbiAgICogVGhlIEFtYXpvbiBEYXRhIEZpcmVob3NlIGRlbGl2ZXJ5IHN0cmVhbSB0aGF0IGlzIHRoZSBkZXN0aW5hdGlvbiBmb3IgYnJva2VyIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGZpcmVob3NlRGVsaXZlcnlTdHJlYW1OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ2xvdWRXYXRjaCBMb2dzIGdyb3VwIHRoYXQgaXMgdGhlIGRlc3RpbmF0aW9uIGZvciBicm9rZXIgbG9ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgY2xvdWR3YXRjaExvZ0dyb3VwPzogbG9ncy5JTG9nR3JvdXA7XG5cbiAgLyoqXG4gICAqIERldGFpbHMgb2YgdGhlIEFtYXpvbiBTMyBkZXN0aW5hdGlvbiBmb3IgYnJva2VyIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IHMzPzogUzNMb2dnaW5nQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIHRoZSBBbWF6b24gUzMgZGVzdGluYXRpb24gZm9yIGJyb2tlciBsb2dzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFMzTG9nZ2luZ0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIFMzIGJ1Y2tldCB0aGF0IGlzIHRoZSBkZXN0aW5hdGlvbiBmb3IgYnJva2VyIGxvZ3MuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ6IHMzLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBTMyBwcmVmaXggdGhhdCBpcyB0aGUgZGVzdGluYXRpb24gZm9yIGJyb2tlciBsb2dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgZW5jcnlwdGlvbiBzZXR0aW5nIGZvciBkYXRhIGluIHRyYW5zaXQgYmV0d2VlbiBjbGllbnRzIGFuZCBicm9rZXJzLlxuICovXG5leHBvcnQgZW51bSBDbGllbnRCcm9rZXJFbmNyeXB0aW9uIHtcbiAgLyoqXG4gICAqIFRMUyBtZWFucyB0aGF0IGNsaWVudC1icm9rZXIgY29tbXVuaWNhdGlvbiBpcyBlbmFibGVkIHdpdGggVExTIG9ubHkuXG4gICAqL1xuICBUTFMgPSAnVExTJyxcblxuICAvKipcbiAgICogVExTX1BMQUlOVEVYVCBtZWFucyB0aGF0IGNsaWVudC1icm9rZXIgY29tbXVuaWNhdGlvbiBpcyBlbmFibGVkIGZvciBib3RoIFRMUy1lbmNyeXB0ZWQsIGFzIHdlbGwgYXMgcGxhaW50ZXh0IGRhdGEuXG4gICAqL1xuICBUTFNfUExBSU5URVhUID0gJ1RMU19QTEFJTlRFWFQnLFxuXG4gIC8qKlxuICAgKiBQTEFJTlRFWFQgbWVhbnMgdGhhdCBjbGllbnQtYnJva2VyIGNvbW11bmljYXRpb24gaXMgZW5hYmxlZCBpbiBwbGFpbnRleHQgb25seS5cbiAgICovXG4gIFBMQUlOVEVYVCA9ICdQTEFJTlRFWFQnLFxufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyBmb3IgZW5jcnlwdGluZyBkYXRhIGluIHRyYW5zaXQuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbXNrL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9tc2stZW5jcnlwdGlvbi5odG1sI21zay1lbmNyeXB0aW9uLWluLXRyYW5zaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmNyeXB0aW9uSW5UcmFuc2l0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgZW5jcnlwdGlvbiBzZXR0aW5nIGZvciBkYXRhIGluIHRyYW5zaXQgYmV0d2VlbiBjbGllbnRzIGFuZCBicm9rZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRMU1xuICAgKi9cbiAgcmVhZG9ubHkgY2xpZW50QnJva2VyPzogQ2xpZW50QnJva2VyRW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgZGF0YSBjb21tdW5pY2F0aW9uIGFtb25nIHRoZSBicm9rZXIgbm9kZXMgb2YgdGhlIGNsdXN0ZXIgaXMgZW5jcnlwdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVJbkNsdXN0ZXI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNBU0wgYXV0aGVudGljYXRpb24gcHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhc2xBdXRoUHJvcHMge1xuICAvKipcbiAgICogRW5hYmxlIFNBU0wvU0NSQU0gYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzY3JhbT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBJQU0gYWNjZXNzIGNvbnRyb2wuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpYW0/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBLTVMgS2V5IHRvIGVuY3J5cHQgU0FTTC9TQ1JBTSBzZWNyZXRzLlxuICAgKlxuICAgKiBZb3UgbXVzdCB1c2UgYSBjdXN0b21lciBtYXN0ZXIga2V5IChDTUspIHdoZW4gY3JlYXRpbmcgdXNlcnMgaW4gc2VjcmV0cyBtYW5hZ2VyLlxuICAgKiBZb3UgY2Fubm90IHVzZSBhIFNlY3JldCB3aXRoIEFtYXpvbiBNU0sgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IFNlY3JldHMgTWFuYWdlciBlbmNyeXB0aW9uIGtleS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBDTUsgd2lsbCBiZSBjcmVhdGVkIHdpdGggYWxpYXMgbXNrL3tjbHVzdGVyTmFtZX0vc2FzbC9zY3JhbVxuICAgKi9cbiAgcmVhZG9ubHkga2V5Pzoga21zLklLZXlSZWY7XG59XG5cbi8qKlxuICogVExTIGF1dGhlbnRpY2F0aW9uIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUbHNBdXRoUHJvcHMge1xuICAvKipcbiAgICogTGlzdCBvZiBBQ00gQ2VydGlmaWNhdGUgQXV0aG9yaXRpZXMgdG8gZW5hYmxlIFRMUyBhdXRoZW50aWNhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZUF1dGhvcml0aWVzPzogYWNtcGNhLklDZXJ0aWZpY2F0ZUF1dGhvcml0eVtdO1xufVxuXG4vKipcbiAqIFNBU0wgKyBUTFMgYXV0aGVudGljYXRpb24gcHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhc2xUbHNBdXRoUHJvcHMgZXh0ZW5kcyBTYXNsQXV0aFByb3BzLCBUbHNBdXRoUHJvcHMgeyB9XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBjbGllbnQgYXV0aGVudGljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGllbnRBdXRoZW50aWNhdGlvbiB7XG4gIC8qKlxuICAgKiBTQVNMIGF1dGhlbnRpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNhc2wocHJvcHM6IFNhc2xBdXRoUHJvcHMpOiBDbGllbnRBdXRoZW50aWNhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBDbGllbnRBdXRoZW50aWNhdGlvbihwcm9wcywgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUTFMgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGxzKHByb3BzOiBUbHNBdXRoUHJvcHMpOiBDbGllbnRBdXRoZW50aWNhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBDbGllbnRBdXRoZW50aWNhdGlvbih1bmRlZmluZWQsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTQVNMICsgVExTIGF1dGhlbnRpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNhc2xUbHMoc2FzbFRsc1Byb3BzOiBTYXNsVGxzQXV0aFByb3BzKTogQ2xpZW50QXV0aGVudGljYXRpb24ge1xuICAgIHJldHVybiBuZXcgQ2xpZW50QXV0aGVudGljYXRpb24oc2FzbFRsc1Byb3BzLCBzYXNsVGxzUHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzYXNsUHJvcHMgLSBwcm9wZXJ0aWVzIGZvciBTQVNMIGF1dGhlbnRpY2F0aW9uXG4gICAqIEBwYXJhbSB0bHNQcm9wcyAtIHByb3BlcnRpZXMgZm9yIFRMUyBhdXRoZW50aWNhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2FzbFByb3BzPzogU2FzbEF1dGhQcm9wcyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdGxzUHJvcHM/OiBUbHNBdXRoUHJvcHMsXG4gICkge31cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBNU0sgQ2x1c3Rlci5cbiAqXG4gKiBAcmVzb3VyY2UgQVdTOjpNU0s6OkNsdXN0ZXJcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIENsdXN0ZXIgZXh0ZW5kcyBDbHVzdGVyQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1zay1hbHBoYS5DbHVzdGVyJztcblxuICAvKipcbiAgICogUmVmZXJlbmNlIGFuIGV4aXN0aW5nIGNsdXN0ZXIsIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgQ0RLIGNvZGUsIGJ5IG5hbWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21DbHVzdGVyQXJuKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgY2x1c3RlckFybjogc3RyaW5nKTogSUNsdXN0ZXIge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIENsdXN0ZXJCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjbHVzdGVyQXJuID0gY2x1c3RlckFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjbHVzdGVyTmFtZSA9IGNvcmUuRm4uc2VsZWN0KDEsIGNvcmUuRm4uc3BsaXQoJy8nLCBjbHVzdGVyQXJuKSk7IC8vIFsnYXJuOnBhcnRpdGlvbjprYWZrYTpyZWdpb246YWNjb3VudC1pZCcsIGNsdXN0ZXJOYW1lLCBjbHVzdGVySWRdXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBjbHVzdGVyQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBjbHVzdGVyTmFtZTogc3RyaW5nO1xuICAvKiogS2V5IHVzZWQgdG8gZW5jcnlwdCBTQVNML1NDUkFNIHVzZXJzICovXG4gIHB1YmxpYyByZWFkb25seSBzYXNsU2NyYW1BdXRoZW50aWNhdGlvbktleT86IGttcy5JS2V5O1xuICBwcml2YXRlIF9jbHVzdGVyRGVzY3JpcHRpb24/OiBjci5Bd3NDdXN0b21SZXNvdXJjZTtcbiAgcHJpdmF0ZSBfY2x1c3RlckJvb3RzdHJhcEJyb2tlcnM/OiBjci5Bd3NDdXN0b21SZXNvdXJjZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDbHVzdGVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHsgcGh5c2ljYWxOYW1lOiBwcm9wcy5jbHVzdGVyTmFtZSB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIGNvbnN0IHN1Ym5ldFNlbGVjdGlvbiA9IHByb3BzLnZwYy5zZWxlY3RTdWJuZXRzKHByb3BzLnZwY1N1Ym5ldHMpO1xuXG4gICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgZWMyLkNvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBwcm9wcy5zZWN1cml0eUdyb3VwcyA/PyBbXG4gICAgICAgIG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCAnU2VjdXJpdHlHcm91cCcsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ01TSyBzZWN1cml0eSBncm91cCcsXG4gICAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGlmIChzdWJuZXRTZWxlY3Rpb24uc3VibmV0cy5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgY29yZS5WYWxpZGF0aW9uRXJyb3IoYENsdXN0ZXIgcmVxdWlyZXMgYXQgbGVhc3QgMiBzdWJuZXRzLCBnb3QgJHtzdWJuZXRTZWxlY3Rpb24uc3VibmV0cy5sZW5ndGh9YCwgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmVuY3J5cHRpb25JblRyYW5zaXQ/LmNsaWVudEJyb2tlciA9PT0gQ2xpZW50QnJva2VyRW5jcnlwdGlvbi5QTEFJTlRFWFQgJiYgcHJvcHMuY2xpZW50QXV0aGVudGljYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBjb3JlLlZhbGlkYXRpb25FcnJvcignVG8gZW5hYmxlIGNsaWVudCBhdXRoZW50aWNhdGlvbiwgeW91IG11c3QgZW5hYmxlZCBUTFMtZW5jcnlwdGVkIHRyYWZmaWMgYmV0d2VlbiBjbGllbnRzIGFuZCBicm9rZXJzLicsIHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBwcm9wcy5lbmNyeXB0aW9uSW5UcmFuc2l0Py5jbGllbnRCcm9rZXIgPT09XG4gICAgICAgIENsaWVudEJyb2tlckVuY3J5cHRpb24uVExTX1BMQUlOVEVYVCAmJlxuICAgICAgKHByb3BzLmNsaWVudEF1dGhlbnRpY2F0aW9uPy5zYXNsUHJvcHM/LnNjcmFtIHx8XG4gICAgICAgIHByb3BzLmNsaWVudEF1dGhlbnRpY2F0aW9uPy5zYXNsUHJvcHM/LmlhbSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBjb3JlLlZhbGlkYXRpb25FcnJvcignVG8gZW5hYmxlIFNBU0wvU0NSQU0gb3IgSUFNIGF1dGhlbnRpY2F0aW9uLCB5b3UgbXVzdCBvbmx5IGFsbG93IFRMUy1lbmNyeXB0ZWQgdHJhZmZpYyBiZXR3ZWVuIGNsaWVudHMgYW5kIGJyb2tlcnMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgdm9sdW1lU2l6ZSA9IHByb3BzLmVic1N0b3JhZ2VJbmZvPy52b2x1bWVTaXplID8/IDEwMDA7XG4gICAgLy8gTWluaW11bTogMSBHaUIsIG1heGltdW06IDE2Mzg0IEdpQlxuICAgIGlmICh2b2x1bWVTaXplIDwgMSB8fCB2b2x1bWVTaXplID4gMTYzODQpIHtcbiAgICAgIHRocm93IG5ldyBjb3JlLlZhbGlkYXRpb25FcnJvcignRUJTIHZvbHVtZSBzaXplIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgMS0xNjM4NCcsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IHByb3BzLmluc3RhbmNlVHlwZVxuICAgICAgPyB0aGlzLm1za0luc3RhbmNlVHlwZShwcm9wcy5pbnN0YW5jZVR5cGUpXG4gICAgICA6IHRoaXMubXNrSW5zdGFuY2VUeXBlKFxuICAgICAgICBlYzIuSW5zdGFuY2VUeXBlLm9mKGVjMi5JbnN0YW5jZUNsYXNzLk01LCBlYzIuSW5zdGFuY2VTaXplLkxBUkdFKSxcbiAgICAgICk7XG5cbiAgICBpZiAocHJvcHMuc3RvcmFnZU1vZGUgJiYgcHJvcHMuc3RvcmFnZU1vZGUgPT09IFN0b3JhZ2VNb2RlLlRJRVJFRCkge1xuICAgICAgaWYgKCFwcm9wcy5rYWZrYVZlcnNpb24uaXNUaWVyZWRTdG9yYWdlQ29tcGF0aWJsZSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBjb3JlLlZhbGlkYXRpb25FcnJvcihgVG8gZGVwbG95IGEgdGllcmVkIGNsdXN0ZXIgeW91IG11c3Qgc2VsZWN0IGEgY29tcGF0aWJsZSBLYWZrYSB2ZXJzaW9uLCBnb3QgJHtwcm9wcy5rYWZrYVZlcnNpb24udmVyc2lvbn1gLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnN0YW5jZVR5cGUgPT09IHRoaXMubXNrSW5zdGFuY2VUeXBlKFxuICAgICAgICBlYzIuSW5zdGFuY2VUeXBlLm9mKGVjMi5JbnN0YW5jZUNsYXNzLlQzLCBlYzIuSW5zdGFuY2VTaXplLlNNQUxMKSxcbiAgICAgICkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGNvcmUuVmFsaWRhdGlvbkVycm9yKCdUaWVyZWQgc3RvcmFnZSBkb2VzblxcJ3Qgc3VwcG9ydCBicm9rZXIgdHlwZSB0My5zbWFsbCcsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHRpb25BdFJlc3QgPSBwcm9wcy5lYnNTdG9yYWdlSW5mbz8uZW5jcnlwdGlvbktleVxuICAgICAgPyB7XG4gICAgICAgIGRhdGFWb2x1bWVLbXNLZXlJZDpcbiAgICAgICAgICAgIHByb3BzLmVic1N0b3JhZ2VJbmZvLmVuY3J5cHRpb25LZXkua2V5UmVmLmtleUlkLFxuICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7IC8vIE1TSyB3aWxsIGNyZWF0ZSB0aGUgbWFuYWdlZCBrZXlcblxuICAgIGNvbnN0IGVuY3J5cHRpb25JblRyYW5zaXQgPSB7XG4gICAgICBjbGllbnRCcm9rZXI6XG4gICAgICAgIHByb3BzLmVuY3J5cHRpb25JblRyYW5zaXQ/LmNsaWVudEJyb2tlciA/P1xuICAgICAgICBDbGllbnRCcm9rZXJFbmNyeXB0aW9uLlRMUyxcbiAgICAgIGluQ2x1c3RlcjogcHJvcHMuZW5jcnlwdGlvbkluVHJhbnNpdD8uZW5hYmxlSW5DbHVzdGVyID8/IHRydWUsXG4gICAgfTtcblxuICAgIGNvbnN0IG9wZW5Nb25pdG9yaW5nID1cbiAgICAgIHByb3BzLm1vbml0b3Jpbmc/LmVuYWJsZVByb21ldGhldXNKbXhFeHBvcnRlciB8fFxuICAgICAgcHJvcHMubW9uaXRvcmluZz8uZW5hYmxlUHJvbWV0aGV1c05vZGVFeHBvcnRlclxuICAgICAgICA/IHtcbiAgICAgICAgICBwcm9tZXRoZXVzOiB7XG4gICAgICAgICAgICBqbXhFeHBvcnRlcjogcHJvcHMubW9uaXRvcmluZz8uZW5hYmxlUHJvbWV0aGV1c0pteEV4cG9ydGVyXG4gICAgICAgICAgICAgID8geyBlbmFibGVkSW5Ccm9rZXI6IHRydWUgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vZGVFeHBvcnRlcjogcHJvcHMubW9uaXRvcmluZ1xuICAgICAgICAgICAgICA/LmVuYWJsZVByb21ldGhldXNOb2RlRXhwb3J0ZXJcbiAgICAgICAgICAgICAgPyB7IGVuYWJsZWRJbkJyb2tlcjogdHJ1ZSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBsb2dnaW5nQnVja2V0ID0gcHJvcHMubG9nZ2luZz8uczM/LmJ1Y2tldDtcbiAgICBpZiAobG9nZ2luZ0J1Y2tldCAmJiBGZWF0dXJlRmxhZ3Mub2YodGhpcykuaXNFbmFibGVkKFMzX0NSRUFURV9ERUZBVUxUX0xPR0dJTkdfUE9MSUNZKSkge1xuICAgICAgY29uc3Qgc3RhY2sgPSBjb3JlLlN0YWNrLm9mKHRoaXMpO1xuICAgICAgbG9nZ2luZ0J1Y2tldC5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdkZWxpdmVyeS5sb2dzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgbG9nZ2luZ0J1Y2tldC5hcm5Gb3JPYmplY3RzKGBBV1NMb2dzLyR7c3RhY2suYWNjb3VudH0vKmApLFxuICAgICAgICBdLFxuICAgICAgICBhY3Rpb25zOiBbJ3MzOlB1dE9iamVjdCddLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAnczM6eC1hbXotYWNsJzogJ2J1Y2tldC1vd25lci1mdWxsLWNvbnRyb2wnLFxuICAgICAgICAgICAgJ2F3czpTb3VyY2VBY2NvdW50Jzogc3RhY2suYWNjb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEFybkxpa2U6IHtcbiAgICAgICAgICAgICdhd3M6U291cmNlQXJuJzogc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgICAgICAgc2VydmljZTogJ2xvZ3MnLFxuICAgICAgICAgICAgICByZXNvdXJjZTogJyonLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgbG9nZ2luZ0J1Y2tldC5hZGRUb1Jlc291cmNlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICBwcmluY2lwYWxzOiBbXG4gICAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdkZWxpdmVyeS5sb2dzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbbG9nZ2luZ0J1Y2tldC5idWNrZXRBcm5dLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3MzOkdldEJ1Y2tldEFjbCcsXG4gICAgICAgICAgJ3MzOkxpc3RCdWNrZXQnLFxuICAgICAgICBdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAnYXdzOlNvdXJjZUFjY291bnQnOiBzdGFjay5hY2NvdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgQXJuTGlrZToge1xuICAgICAgICAgICAgJ2F3czpTb3VyY2VBcm4nOiBzdGFjay5mb3JtYXRBcm4oe1xuICAgICAgICAgICAgICBzZXJ2aWNlOiAnbG9ncycsXG4gICAgICAgICAgICAgIHJlc291cmNlOiAnKicsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCBsb2dnaW5nSW5mbyA9IHtcbiAgICAgIGJyb2tlckxvZ3M6IHtcbiAgICAgICAgY2xvdWRXYXRjaExvZ3M6IHtcbiAgICAgICAgICBlbmFibGVkOlxuICAgICAgICAgICAgcHJvcHMubG9nZ2luZz8uY2xvdWR3YXRjaExvZ0dyb3VwICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgbG9nR3JvdXA6XG4gICAgICAgICAgICBwcm9wcy5sb2dnaW5nPy5jbG91ZHdhdGNoTG9nR3JvdXA/LmxvZ0dyb3VwTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgZmlyZWhvc2U6IHtcbiAgICAgICAgICBlbmFibGVkOlxuICAgICAgICAgICAgcHJvcHMubG9nZ2luZz8uZmlyZWhvc2VEZWxpdmVyeVN0cmVhbU5hbWUgIT09XG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgZGVsaXZlcnlTdHJlYW06XG4gICAgICAgICAgICBwcm9wcy5sb2dnaW5nPy5maXJlaG9zZURlbGl2ZXJ5U3RyZWFtTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgczM6IHtcbiAgICAgICAgICBlbmFibGVkOiBsb2dnaW5nQnVja2V0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgYnVja2V0OiBsb2dnaW5nQnVja2V0Py5idWNrZXROYW1lLFxuICAgICAgICAgIHByZWZpeDogcHJvcHMubG9nZ2luZz8uczM/LnByZWZpeCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy5jbGllbnRBdXRoZW50aWNhdGlvbj8uc2FzbFByb3BzPy5zY3JhbSAmJiBwcm9wcy5jbGllbnRBdXRoZW50aWNhdGlvbj8uc2FzbFByb3BzPy5rZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zYXNsU2NyYW1BdXRoZW50aWNhdGlvbktleSA9IG5ldyBrbXMuS2V5KHRoaXMsICdTQVNMS2V5Jywge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZWQgZm9yIGVuY3J5cHRpbmcgTVNLIHNlY3JldHMgZm9yIFNBU0wvU0NSQU0gYXV0aGVudGljYXRpb24uJyxcbiAgICAgICAgYWxpYXM6IGBtc2svJHtwcm9wcy5jbHVzdGVyTmFtZX0vc2FzbC9zY3JhbWAsXG4gICAgICB9KTtcblxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2ttcy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VydmljZXMtc2VjcmV0cy1tYW5hZ2VyLmh0bWwjYXNtLXBvbGljaWVzXG4gICAgICB0aGlzLnNhc2xTY3JhbUF1dGhlbnRpY2F0aW9uS2V5LmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBzaWQ6XG4gICAgICAgICAgICAnQWxsb3cgYWNjZXNzIHRocm91Z2ggQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgYWxsIHByaW5jaXBhbHMgaW4gdGhlIGFjY291bnQgdGhhdCBhcmUgYXV0aG9yaXplZCB0byB1c2UgQVdTIFNlY3JldHMgTWFuYWdlcicsXG4gICAgICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uQW55UHJpbmNpcGFsKCldLFxuICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICdrbXM6RW5jcnlwdCcsXG4gICAgICAgICAgICAna21zOkRlY3J5cHQnLFxuICAgICAgICAgICAgJ2ttczpSZUVuY3J5cHQqJyxcbiAgICAgICAgICAgICdrbXM6R2VuZXJhdGVEYXRhS2V5KicsXG4gICAgICAgICAgICAna21zOkNyZWF0ZUdyYW50JyxcbiAgICAgICAgICAgICdrbXM6RGVzY3JpYmVLZXknLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgJ2ttczpWaWFTZXJ2aWNlJzogYHNlY3JldHNtYW5hZ2VyLiR7Y29yZS5TdGFjay5vZih0aGlzKS5yZWdpb259LmFtYXpvbmF3cy5jb21gLFxuICAgICAgICAgICAgICAna21zOkNhbGxlckFjY291bnQnOiBjb3JlLlN0YWNrLm9mKHRoaXMpLmFjY291bnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgY2xpZW50QXV0aGVudGljYXRpb246IENmbkNsdXN0ZXIuQ2xpZW50QXV0aGVudGljYXRpb25Qcm9wZXJ0eSB8IHVuZGVmaW5lZDtcbiAgICBpZiAocHJvcHMuY2xpZW50QXV0aGVudGljYXRpb24pIHtcbiAgICAgIGNvbnN0IHsgc2FzbFByb3BzLCB0bHNQcm9wcyB9ID0gcHJvcHMuY2xpZW50QXV0aGVudGljYXRpb247XG4gICAgICBjbGllbnRBdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgc2FzbDogc2FzbFByb3BzID8ge1xuICAgICAgICAgIGlhbTogc2FzbFByb3BzLmlhbSA/IHsgZW5hYmxlZDogdHJ1ZSB9OiB1bmRlZmluZWQsXG4gICAgICAgICAgc2NyYW06IHNhc2xQcm9wcy5zY3JhbSA/IHsgZW5hYmxlZDogdHJ1ZSB9OiB1bmRlZmluZWQsXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIHRsczogdGxzUHJvcHM/LmNlcnRpZmljYXRlQXV0aG9yaXRpZXMgPyB7XG4gICAgICAgICAgY2VydGlmaWNhdGVBdXRob3JpdHlBcm5MaXN0OiB0bHNQcm9wcy5jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzPy5tYXAoKGNhKSA9PiBjYS5jZXJ0aWZpY2F0ZUF1dGhvcml0eUFybiksXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlID0gbmV3IENmbkNsdXN0ZXIodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgY2x1c3Rlck5hbWU6IHByb3BzLmNsdXN0ZXJOYW1lLFxuICAgICAga2Fma2FWZXJzaW9uOiBwcm9wcy5rYWZrYVZlcnNpb24udmVyc2lvbixcbiAgICAgIG51bWJlck9mQnJva2VyTm9kZXM6XG4gICAgICAgIHByb3BzLm51bWJlck9mQnJva2VyTm9kZXMgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgc3VibmV0U2VsZWN0aW9uLmF2YWlsYWJpbGl0eVpvbmVzLmxlbmd0aCAqIHByb3BzLm51bWJlck9mQnJva2VyTm9kZXMgOiBzdWJuZXRTZWxlY3Rpb24uYXZhaWxhYmlsaXR5Wm9uZXMubGVuZ3RoLFxuICAgICAgYnJva2VyTm9kZUdyb3VwSW5mbzoge1xuICAgICAgICBpbnN0YW5jZVR5cGUsXG4gICAgICAgIGNsaWVudFN1Ym5ldHM6IHN1Ym5ldFNlbGVjdGlvbi5zdWJuZXRJZHMsXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiB0aGlzLmNvbm5lY3Rpb25zLnNlY3VyaXR5R3JvdXBzLm1hcChcbiAgICAgICAgICAoZ3JvdXApID0+IGdyb3VwLnNlY3VyaXR5R3JvdXBJZCxcbiAgICAgICAgKSxcbiAgICAgICAgc3RvcmFnZUluZm86IHtcbiAgICAgICAgICBlYnNTdG9yYWdlSW5mbzoge1xuICAgICAgICAgICAgdm9sdW1lU2l6ZTogdm9sdW1lU2l6ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25JbmZvOiB7XG4gICAgICAgIGVuY3J5cHRpb25BdFJlc3QsXG4gICAgICAgIGVuY3J5cHRpb25JblRyYW5zaXQsXG4gICAgICB9LFxuICAgICAgY29uZmlndXJhdGlvbkluZm86IHByb3BzLmNvbmZpZ3VyYXRpb25JbmZvLFxuICAgICAgZW5oYW5jZWRNb25pdG9yaW5nOiBwcm9wcy5tb25pdG9yaW5nPy5jbHVzdGVyTW9uaXRvcmluZ0xldmVsLFxuICAgICAgb3Blbk1vbml0b3Jpbmc6IG9wZW5Nb25pdG9yaW5nLFxuICAgICAgc3RvcmFnZU1vZGU6IHByb3BzLnN0b3JhZ2VNb2RlLFxuICAgICAgbG9nZ2luZ0luZm86IGxvZ2dpbmdJbmZvLFxuICAgICAgY2xpZW50QXV0aGVudGljYXRpb24sXG4gICAgfSk7XG5cbiAgICB0aGlzLmNsdXN0ZXJOYW1lID0gdGhpcy5nZXRSZXNvdXJjZU5hbWVBdHRyaWJ1dGUoXG4gICAgICBjb3JlLkZuLnNlbGVjdCgxLCBjb3JlLkZuLnNwbGl0KCcvJywgcmVzb3VyY2UucmVmKSksXG4gICAgKTtcbiAgICB0aGlzLmNsdXN0ZXJBcm4gPSByZXNvdXJjZS5yZWY7XG5cbiAgICByZXNvdXJjZS5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMucmVtb3ZhbFBvbGljeSwge1xuICAgICAgZGVmYXVsdDogY29yZS5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbXNrSW5zdGFuY2VUeXBlKGluc3RhbmNlVHlwZTogZWMyLkluc3RhbmNlVHlwZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBrYWZrYS4ke2luc3RhbmNlVHlwZS50b1N0cmluZygpfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBab29LZWVwZXIgQ29ubmVjdGlvbiBzdHJpbmdcbiAgICpcbiAgICogVXNlcyBhIEN1c3RvbSBSZXNvdXJjZSB0byBtYWtlIGFuIEFQSSBjYWxsIHRvIGBkZXNjcmliZUNsdXN0ZXJgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2VGaWVsZCBGaWVsZCB0byByZXR1cm4gZnJvbSBBUEkgY2FsbC4gZWcuIFpvb2tlZXBlckNvbm5lY3RTdHJpbmcsIFpvb2tlZXBlckNvbm5lY3RTdHJpbmdUbHNcbiAgICogQHJldHVybnMgLSBUaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIEFwYWNoZSBab29LZWVwZXIgY2x1c3Rlci5cbiAgICovXG4gIHByaXZhdGUgX3pvb2tlZXBlckNvbm5lY3Rpb25TdHJpbmcocmVzcG9uc2VGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2NsdXN0ZXJEZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fY2x1c3RlckRlc2NyaXB0aW9uID0gbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsICdab29rZWVwZXJDb25uZWN0Jywge1xuICAgICAgICBvblVwZGF0ZToge1xuICAgICAgICAgIHNlcnZpY2U6ICdLYWZrYScsXG4gICAgICAgICAgYWN0aW9uOiAnZGVzY3JpYmVDbHVzdGVyJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBDbHVzdGVyQXJuOiB0aGlzLmNsdXN0ZXJBcm4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGNyLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgICdab29LZWVwZXJDb25uZWN0aW9uU3RyaW5nJyxcbiAgICAgICAgICApLFxuICAgICAgICAgIC8vIExpbWl0IHRoZSBvdXRwdXQgb2YgZGVzY3JpYmVDbHVzdGVyIHRoYXQgaXMgb3RoZXJ3aXNlIHRvbyBsYXJnZVxuICAgICAgICAgIG91dHB1dFBhdGhzOiBbXG4gICAgICAgICAgICAnQ2x1c3RlckluZm8uWm9va2VlcGVyQ29ubmVjdFN0cmluZycsXG4gICAgICAgICAgICAnQ2x1c3RlckluZm8uWm9va2VlcGVyQ29ubmVjdFN0cmluZ1RscycsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICAgIHJlc291cmNlczogW3RoaXMuY2x1c3RlckFybl0sXG4gICAgICAgIH0pLFxuICAgICAgICBpbnN0YWxsTGF0ZXN0QXdzU2RrOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2x1c3RlckRlc2NyaXB0aW9uLmdldFJlc3BvbnNlRmllbGQoYENsdXN0ZXJJbmZvLiR7cmVzcG9uc2VGaWVsZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFpvb0tlZXBlciBDb25uZWN0aW9uIHN0cmluZ1xuICAgKlxuICAgKiBVc2VzIGEgQ3VzdG9tIFJlc291cmNlIHRvIG1ha2UgYW4gQVBJIGNhbGwgdG8gYGRlc2NyaWJlQ2x1c3RlcmAgdXNpbmcgdGhlIEphdmFzY3JpcHQgU0RLXG4gICAqXG4gICAqIEByZXR1cm5zIC0gVGhlIGNvbm5lY3Rpb24gc3RyaW5nIHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSBBcGFjaGUgWm9vS2VlcGVyIGNsdXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHpvb2tlZXBlckNvbm5lY3Rpb25TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fem9va2VlcGVyQ29ubmVjdGlvblN0cmluZygnWm9va2VlcGVyQ29ubmVjdFN0cmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgWm9vS2VlcGVyIENvbm5lY3Rpb24gc3RyaW5nIGZvciBhIFRMUyBlbmFibGVkIGNsdXN0ZXJcbiAgICpcbiAgICogVXNlcyBhIEN1c3RvbSBSZXNvdXJjZSB0byBtYWtlIGFuIEFQSSBjYWxsIHRvIGBkZXNjcmliZUNsdXN0ZXJgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcmV0dXJucyAtIFRoZSBjb25uZWN0aW9uIHN0cmluZyB0byB1c2UgdG8gY29ubmVjdCB0byB6b29rZWVwZXIgY2x1c3RlciBvbiBUTFMgcG9ydC5cbiAgICovXG4gIHB1YmxpYyBnZXQgem9va2VlcGVyQ29ubmVjdGlvblN0cmluZ1RscygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl96b29rZWVwZXJDb25uZWN0aW9uU3RyaW5nKCdab29rZWVwZXJDb25uZWN0U3RyaW5nVGxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIGJyb2tlcnMgdGhhdCBhIGNsaWVudCBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIGJvb3RzdHJhcFxuICAgKlxuICAgKiBVc2VzIGEgQ3VzdG9tIFJlc291cmNlIHRvIG1ha2UgYW4gQVBJIGNhbGwgdG8gYGdldEJvb3RzdHJhcEJyb2tlcnNgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2VGaWVsZCBGaWVsZCB0byByZXR1cm4gZnJvbSBBUEkgY2FsbC4gZWcuIEJvb3RzdHJhcEJyb2tlclN0cmluZ1Nhc2xTY3JhbSwgQm9vdHN0cmFwQnJva2VyU3RyaW5nXG4gICAqIEByZXR1cm5zIC0gQSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBob3N0bmFtZTpwb3J0IHBhaXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBfYm9vdHN0cmFwQnJva2VycyhyZXNwb25zZUZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fY2x1c3RlckJvb3RzdHJhcEJyb2tlcnMpIHtcbiAgICAgIHRoaXMuX2NsdXN0ZXJCb290c3RyYXBCcm9rZXJzID0gbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsIGBCb290c3RyYXBCcm9rZXJzJHtyZXNwb25zZUZpZWxkfWAsIHtcbiAgICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiAnS2Fma2EnLFxuICAgICAgICAgIGFjdGlvbjogJ2dldEJvb3RzdHJhcEJyb2tlcnMnLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIENsdXN0ZXJBcm46IHRoaXMuY2x1c3RlckFybixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKCdCb290c3RyYXBCcm9rZXJzJyksXG4gICAgICAgIH0sXG4gICAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmNsdXN0ZXJBcm5dLFxuICAgICAgICB9KSxcbiAgICAgICAgLy8gQVBJcyBhcmUgYXZhaWxhYmxlIGluIDIuMTA1NS4wXG4gICAgICAgIGluc3RhbGxMYXRlc3RBd3NTZGs6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbHVzdGVyQm9vdHN0cmFwQnJva2Vycy5nZXRSZXNwb25zZUZpZWxkKHJlc3BvbnNlRmllbGQpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgYnJva2VycyB0aGF0IGEgY2xpZW50IGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gYm9vdHN0cmFwXG4gICAqXG4gICAqIFVzZXMgYSBDdXN0b20gUmVzb3VyY2UgdG8gbWFrZSBhbiBBUEkgY2FsbCB0byBgZ2V0Qm9vdHN0cmFwQnJva2Vyc2AgdXNpbmcgdGhlIEphdmFzY3JpcHQgU0RLXG4gICAqXG4gICAqIEByZXR1cm5zIC0gQSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBob3N0bmFtZTpwb3J0IHBhaXJzLlxuICAgKi9cbiAgcHVibGljIGdldCBib290c3RyYXBCcm9rZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Jvb3RzdHJhcEJyb2tlcnMoJ0Jvb3RzdHJhcEJyb2tlclN0cmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBicm9rZXJzIHRoYXQgYSBUTFMgYXV0aGVudGljYXRlZCBjbGllbnQgYXBwbGljYXRpb24gY2FuIHVzZSB0byBib290c3RyYXBcbiAgICpcbiAgICogVXNlcyBhIEN1c3RvbSBSZXNvdXJjZSB0byBtYWtlIGFuIEFQSSBjYWxsIHRvIGBnZXRCb290c3RyYXBCcm9rZXJzYCB1c2luZyB0aGUgSmF2YXNjcmlwdCBTREtcbiAgICpcbiAgICogQHJldHVybnMgLSBBIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlIEROUyBuYW1lcyAob3IgSVApIGFuZCBUTFMgcG9ydCBwYWlycy5cbiAgICovXG4gIHB1YmxpYyBnZXQgYm9vdHN0cmFwQnJva2Vyc1RscygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9ib290c3RyYXBCcm9rZXJzKCdCb290c3RyYXBCcm9rZXJTdHJpbmdUbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgYnJva2VycyB0aGF0IGEgU0FTTC9TQ1JBTSBhdXRoZW50aWNhdGVkIGNsaWVudCBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIGJvb3RzdHJhcFxuICAgKlxuICAgKiBVc2VzIGEgQ3VzdG9tIFJlc291cmNlIHRvIG1ha2UgYW4gQVBJIGNhbGwgdG8gYGdldEJvb3RzdHJhcEJyb2tlcnNgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcmV0dXJucyAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgZG5zIG5hbWUgKG9yIElQKSBhbmQgU0FTTCBTQ1JBTSBwb3J0IHBhaXJzLlxuICAgKi9cbiAgcHVibGljIGdldCBib290c3RyYXBCcm9rZXJzU2FzbFNjcmFtKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Jvb3RzdHJhcEJyb2tlcnMoJ0Jvb3RzdHJhcEJyb2tlclN0cmluZ1Nhc2xTY3JhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBicm9rZXJzIHRoYXQgYSBTQVNML0lBTSBhdXRoZW50aWNhdGVkIGNsaWVudCBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIGJvb3RzdHJhcFxuICAgKlxuICAgKiBVc2VzIGEgQ3VzdG9tIFJlc291cmNlIHRvIG1ha2UgYW4gQVBJIGNhbGwgdG8gYGdldEJvb3RzdHJhcEJyb2tlcnNgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcmV0dXJucyAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgRE5TIG5hbWVzIChvciBJUCkgYW5kIFRMUyBwb3J0IHBhaXJzLlxuICAgKi9cbiAgcHVibGljIGdldCBib290c3RyYXBCcm9rZXJzU2FzbElhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYm9vdHN0cmFwQnJva2VycygnQm9vdHN0cmFwQnJva2VyU3RyaW5nU2FzbElhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB1c2Vyc25hbWVzIHRvIHJlZ2lzdGVyIHdpdGggdGhlIGNsdXN0ZXIuIFRoZSBwYXNzd29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZ2VuZXJhdGVkIHVzaW5nIFNlY3JldHNcbiAgICogTWFuYWdlciBhbmQgdGhlIHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gSlNPTiBvYmplY3Qgc3RvcmVkIGluIFNlY3JldHMgTWFuYWdlciBhcyBgQW1hem9uTVNLX3VzZXJuYW1lYC5cbiAgICpcbiAgICogTXVzdCBiZSB1c2luZyB0aGUgU0FTTC9TQ1JBTSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VybmFtZXMgLSB1c2VybmFtZShzKSB0byByZWdpc3RlciB3aXRoIHRoZSBjbHVzdGVyXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkVXNlciguLi51c2VybmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2FzbFNjcmFtQXV0aGVudGljYXRpb25LZXkpIHtcbiAgICAgIGNvbnN0IE1TS19TRUNSRVRfUFJFRklYID0gJ0FtYXpvbk1TS18nOyAvLyBSZXF1aXJlZFxuICAgICAgY29uc3Qgc2VjcmV0cyA9IHVzZXJuYW1lcy5tYXAoXG4gICAgICAgICh1c2VybmFtZSkgPT5cbiAgICAgICAgICBuZXcgc2VjcmV0c21hbmFnZXIuU2VjcmV0KHRoaXMsIGBLYWZrYVVzZXIke3VzZXJuYW1lfWAsIHtcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IGAke01TS19TRUNSRVRfUFJFRklYfSR7dGhpcy5jbHVzdGVyTmFtZX1fJHt1c2VybmFtZX1gLFxuICAgICAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHsgdXNlcm5hbWUgfSksXG4gICAgICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXk6IHRoaXMuc2FzbFNjcmFtQXV0aGVudGljYXRpb25LZXksXG4gICAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBuZXcgY3IuQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYEJhdGNoQXNzb2NpYXRlU2NyYW1TZWNyZXRzJHthZGRyZXNzT2YodXNlcm5hbWVzKX1gLCB7XG4gICAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogJ0thZmthJyxcbiAgICAgICAgICBhY3Rpb246ICdiYXRjaEFzc29jaWF0ZVNjcmFtU2VjcmV0JyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBDbHVzdGVyQXJuOiB0aGlzLmNsdXN0ZXJBcm4sXG4gICAgICAgICAgICBTZWNyZXRBcm5MaXN0OiBzZWNyZXRzLm1hcCgoc2VjcmV0KSA9PiBzZWNyZXQuc2VjcmV0QXJuKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKCdDcmVhdGVVc2VycycpLFxuICAgICAgICB9LFxuICAgICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbJ2ttczpDcmVhdGVHcmFudCddLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5zYXNsU2NyYW1BdXRoZW50aWNhdGlvbktleT8ua2V5QXJuXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbJ2thZmthOkJhdGNoQXNzb2NpYXRlU2NyYW1TZWNyZXQnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW3RoaXMuY2x1c3RlckFybl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgICBpbnN0YWxsTGF0ZXN0QXdzU2RrOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgY29yZS5WYWxpZGF0aW9uRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgdXNlcnMgaWYgYW4gYXV0aGVudGljYXRpb24gS01TIGtleSBoYXMgbm90IGJlZW4gY3JlYXRlZC9wcm92aWRlZC4nLCB0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
655
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2x1c3Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsdXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFHM0MsaUVBQWlFO0FBQ2pFLHlDQUF5QztBQUN6QywyQ0FBZ0Q7QUFDaEQsbURBQW1EO0FBQ25ELCtDQUFzRTtBQUV0RSw4REFBNEQ7QUFFNUQsaURBQWlEO0FBQ2pELDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFxQjFFOztHQUVHO0FBQ0gsTUFBc0IsV0FBWSxTQUFRLElBQUksQ0FBQyxRQUFROztJQUdyRCxnQkFBZ0I7SUFDTixZQUFZLENBQThCO0lBRXBELDBDQUEwQztJQUMxQyxJQUFXLFdBQVc7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyx1REFBdUQsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzFCOztBQVpILGtDQWFDO0FBOElEOztHQUVHO0FBQ0gsSUFBWSxXQVVYO0FBVkQsV0FBWSxXQUFXO0lBQ3JCOztPQUVHO0lBQ0gsOEJBQWUsQ0FBQTtJQUVmOztPQUVHO0lBQ0gsZ0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVZXLFdBQVcsMkJBQVgsV0FBVyxRQVV0QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxVQVVYO0FBVkQsV0FBWSxVQUFVO0lBQ3BCOztPQUVHO0lBQ0gsbUNBQXFCLENBQUE7SUFFckI7O09BRUc7SUFDSCxpQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBVlcsVUFBVSwwQkFBVixVQUFVLFFBVXJCO0FBbUJEOzs7O0dBSUc7QUFDSCxJQUFZLHNCQW9CWDtBQXBCRCxXQUFZLHNCQUFzQjtJQUNoQzs7T0FFRztJQUNI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O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhY21wY2EgZnJvbSAnYXdzLWNkay1saWIvYXdzLWFjbXBjYSc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0ICogYXMgY29yZSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IEZlYXR1cmVGbGFncyB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBTM19DUkVBVEVfREVGQVVMVF9MT0dHSU5HX1BPTElDWSB9IGZyb20gJ2F3cy1jZGstbGliL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgYWRkcmVzc09mIH0gZnJvbSAnY29uc3RydWN0cy9saWIvcHJpdmF0ZS91bmlxdWVpZCc7XG5pbXBvcnQgeyBLYWZrYVZlcnNpb24gfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBDZm5DbHVzdGVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1zayc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBNU0sgQ2x1c3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDbHVzdGVyIGV4dGVuZHMgY29yZS5JUmVzb3VyY2UsIGVjMi5JQ29ubmVjdGFibGUge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiBjbHVzdGVyLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBjbHVzdGVyLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbmV3IG9yIGltcG9ydGVkIE1TSyBDbHVzdGVyLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2x1c3RlckJhc2UgZXh0ZW5kcyBjb3JlLlJlc291cmNlIGltcGxlbWVudHMgSUNsdXN0ZXIge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY2x1c3RlckFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY2x1c3Rlck5hbWU6IHN0cmluZztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcm90ZWN0ZWQgX2Nvbm5lY3Rpb25zOiBlYzIuQ29ubmVjdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIE1hbmFnZXMgY29ubmVjdGlvbnMgZm9yIHRoZSBjbHVzdGVyICovXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbnMoKTogZWMyLkNvbm5lY3Rpb25zIHtcbiAgICBpZiAoIXRoaXMuX2Nvbm5lY3Rpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgY29yZS5WYWxpZGF0aW9uRXJyb3IoJ0FuIGltcG9ydGVkIENsdXN0ZXIgY2Fubm90IG1hbmFnZSBpdHMgc2VjdXJpdHkgZ3JvdXBzJywgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9ucztcbiAgfVxufVxuXG4vKipcbiAqICBQcm9wZXJ0aWVzIGZvciBhIE1TSyBDbHVzdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2x1c3RlclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBjbHVzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2x1c3Rlck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgQXBhY2hlIEthZmthLlxuICAgKi9cbiAgcmVhZG9ubHkga2Fma2FWZXJzaW9uOiBLYWZrYVZlcnNpb247XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBBcGFjaGUgS2Fma2EgYnJva2VycyBkZXBsb3llZCBpbiBlYWNoIEF2YWlsYWJpbGl0eSBab25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBudW1iZXJPZkJyb2tlck5vZGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSB2aXJ0dWFsIG5ldHdvcmtpbmcgZW52aXJvbm1lbnQgZm9yIHRoaXMgY2x1c3Rlci5cbiAgICogTXVzdCBoYXZlIGF0IGxlYXN0IDIgc3VibmV0cyBpbiB0d28gZGlmZmVyZW50IEFacy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBub2RlcyB3aXRoaW4gdGhlIFZQQy5cbiAgICogQW1hem9uIE1TSyBkaXN0cmlidXRlcyB0aGUgYnJva2VyIG5vZGVzIGV2ZW5seSBhY3Jvc3MgdGhlIHN1Ym5ldHMgdGhhdCB5b3Ugc3BlY2lmeS5cbiAgICogVGhlIHN1Ym5ldHMgdGhhdCB5b3Ugc3BlY2lmeSBtdXN0IGJlIGluIGRpc3RpbmN0IEF2YWlsYWJpbGl0eSBab25lcy5cbiAgICogQ2xpZW50IHN1Ym5ldHMgY2FuJ3QgYmUgaW4gQXZhaWxhYmlsaXR5IFpvbmUgdXMtZWFzdC0xZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgVnBjIGRlZmF1bHQgc3RyYXRlZ3kgaWYgbm90IHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgRUMyIGluc3RhbmNlIHR5cGUgdGhhdCB5b3Ugd2FudCBBbWF6b24gTVNLIHRvIHVzZSB3aGVuIGl0IGNyZWF0ZXMgeW91ciBicm9rZXJzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tc2svbGF0ZXN0L2RldmVsb3Blcmd1aWRlL21zay1jcmVhdGUtY2x1c3Rlci5odG1sI2Jyb2tlci1pbnN0YW5jZS10eXBlc1xuICAgKiBAZGVmYXVsdCBrYWZrYS5tNS5sYXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VUeXBlPzogZWMyLkluc3RhbmNlVHlwZTtcblxuICAvKipcbiAgICogVGhlIGJyb2tlciB0eXBlIGZvciB0aGUgY2x1c3Rlci5cbiAgICogV2hlbiBzZXQgdG8gRVhQUkVTUywgdGhlIGNsdXN0ZXIgd2lsbCBiZSBjcmVhdGVkIHdpdGggRXhwcmVzcyBCcm9rZXJzLlxuICAgKiBXaGVuIHRoaXMgaXMgc2V0IHRvIEVYUFJFU1MsIGluc3RhbmNlVHlwZSBtdXN0IGFsc28gYmUgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBCcm9rZXJUeXBlLlNUQU5EQVJEXG4gICAqL1xuICByZWFkb25seSBicm9rZXJUeXBlPzogQnJva2VyVHlwZTtcblxuICAvKipcbiAgICogVGhlIEFXUyBzZWN1cml0eSBncm91cHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGVsYXN0aWMgbmV0d29yayBpbnRlcmZhY2VzIGluIG9yZGVyIHRvIHNwZWNpZnkgd2hvIGNhblxuICAgKiBjb25uZWN0IHRvIGFuZCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBbWF6b24gTVNLIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY3JlYXRlIG5ldyBzZWN1cml0eSBncm91cFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgc3RvcmFnZSB2b2x1bWVzIGF0dGFjaGVkIHRvIE1TSyBicm9rZXIgbm9kZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gMTAwMCBHaUIgRUJTIHZvbHVtZVxuICAgKi9cbiAgcmVhZG9ubHkgZWJzU3RvcmFnZUluZm8/OiBFYnNTdG9yYWdlSW5mbztcblxuICAvKipcbiAgICogVGhpcyBjb250cm9scyBzdG9yYWdlIG1vZGUgZm9yIHN1cHBvcnRlZCBzdG9yYWdlIHRpZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFN0b3JhZ2VNb2RlLkxPQ0FMXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21zay9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvbXNrLXRpZXJlZC1zdG9yYWdlLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VNb2RlPzogU3RvcmFnZU1vZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gTVNLIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBjb25maWd1cmF0aW9uSW5mbz86IENsdXN0ZXJDb25maWd1cmF0aW9uSW5mbztcblxuICAvKipcbiAgICogQ2x1c3RlciBtb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gREVGQVVMVCBtb25pdG9yaW5nIGxldmVsXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogTW9uaXRvcmluZ0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB5b3VyIE1TSyBjbHVzdGVyIHRvIHNlbmQgYnJva2VyIGxvZ3MgdG8gZGlmZmVyZW50IGRlc3RpbmF0aW9uIHR5cGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBsb2dnaW5nPzogQnJva2VyTG9nZ2luZztcblxuICAvKipcbiAgICogQ29uZmlnIGRldGFpbHMgZm9yIGVuY3J5cHRpb24gaW4gdHJhbnNpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uSW5UcmFuc2l0PzogRW5jcnlwdGlvbkluVHJhbnNpdENvbmZpZztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBjbGllbnQgYXV0aGVudGljYXRpb24uXG4gICAqIE1TSyBzdXBwb3J0cyB1c2luZyBwcml2YXRlIFRMUyBjZXJ0aWZpY2F0ZXMgb3IgU0FTTC9TQ1JBTSB0byBhdXRoZW50aWNhdGUgdGhlIGlkZW50aXR5IG9mIGNsaWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudEF1dGhlbnRpY2F0aW9uPzogQ2xpZW50QXV0aGVudGljYXRpb247XG5cbiAgLyoqXG4gICAqIFdoYXQgdG8gZG8gd2hlbiB0aGlzIHJlc291cmNlIGlzIGRlbGV0ZWQgZnJvbSBhIHN0YWNrLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IGNvcmUuUmVtb3ZhbFBvbGljeTtcbn1cblxuLyoqXG4gKiBFQlMgdm9sdW1lIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVic1N0b3JhZ2VJbmZvIHtcbiAgLyoqXG4gICAqIFRoZSBzaXplIGluIEdpQiBvZiB0aGUgRUJTIHZvbHVtZSBmb3IgdGhlIGRhdGEgZHJpdmUgb24gZWFjaCBicm9rZXIgbm9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAwMFxuICAgKi9cbiAgcmVhZG9ubHkgdm9sdW1lU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFXUyBLTVMga2V5IGZvciBlbmNyeXB0aW5nIGRhdGEgYXQgcmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgVXNlcyBBV1MgbWFuYWdlZCBDTUsgKGF3cy9rYWZrYSlcbiAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleVJlZjtcbn1cblxuLyoqXG4gKiBUaGUgc3RvcmFnZSBtb2RlIGZvciB0aGUgY2x1c3RlciBicm9rZXJzLlxuICovXG5leHBvcnQgZW51bSBTdG9yYWdlTW9kZSB7XG4gIC8qKlxuICAgKiBMb2NhbCBzdG9yYWdlIG1vZGUgdXRpbGl6ZXMgbmV0d29yayBhdHRhY2hlZCBFQlMgc3RvcmFnZS5cbiAgICovXG4gIExPQ0FMID0gJ0xPQ0FMJyxcblxuICAvKipcbiAgICogVGllcmVkIHN0b3JhZ2UgbW9kZSB1dGlsaXplcyBFQlMgc3RvcmFnZSBhbmQgVGllcmVkIHN0b3JhZ2UuXG4gICAqL1xuICBUSUVSRUQgPSAnVElFUkVEJyxcbn1cblxuLyoqXG4gKiBUaGUgYnJva2VyIHR5cGUgZm9yIHRoZSBjbHVzdGVyLlxuICovXG5leHBvcnQgZW51bSBCcm9rZXJUeXBlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIGJyb2tlcnMgcHJvdmlkZSBoaWdoLWF2YWlsYWJpbGl0eSBndWFyYW50ZWVzLlxuICAgKi9cbiAgU1RBTkRBUkQgPSAnU1RBTkRBUkQnLFxuXG4gIC8qKlxuICAgKiBFeHByZXNzIGJyb2tlcnMgYXJlIGEgbG93LWNvc3Qgb3B0aW9uIGZvciBkZXZlbG9wbWVudCwgdGVzdGluZywgYW5kIHdvcmtsb2FkcyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGhpZ2ggYXZhaWxhYmlsaXR5IGd1YXJhbnRlZXMgb2Ygc3RhbmRhcmQgTVNLIGNsdXN0ZXIuXG4gICAqL1xuICBFWFBSRVNTID0gJ0VYUFJFU1MnLFxufVxuXG4vKipcbiAqIFRoZSBBbWF6b24gTVNLIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciB0aGUgY2x1c3Rlci5cbiAqIE5vdGU6IFRoZXJlIGlzIGN1cnJlbnRseSBubyBDbG91ZGZvcm1hdGlvbiBSZXNvdXJjZSB0byBjcmVhdGUgYSBDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2x1c3RlckNvbmZpZ3VyYXRpb25JbmZvIHtcbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgTVNLIGNvbmZpZ3VyYXRpb24gdG8gdXNlLlxuICAgKiBGb3IgZXhhbXBsZSwgYXJuOmF3czprYWZrYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmNvbmZpZ3VyYXRpb24vZXhhbXBsZS1jb25maWd1cmF0aW9uLW5hbWUvYWJjZGFiY2QtMTIzNC1hYmNkLTEyMzQtYWJjZDEyM2U4ZThlLTEuXG4gICAqL1xuICByZWFkb25seSBhcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJldmlzaW9uIG9mIHRoZSBBbWF6b24gTVNLIGNvbmZpZ3VyYXRpb24gdG8gdXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV2aXNpb246IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgbGV2ZWwgb2YgbW9uaXRvcmluZyBmb3IgdGhlIE1TSyBjbHVzdGVyXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbXNrL2xhdGVzdC9kZXZlbG9wZXJndWlkZS9tb25pdG9yaW5nLmh0bWwjbWV0cmljcy1kZXRhaWxzXG4gKi9cbmV4cG9ydCBlbnVtIENsdXN0ZXJNb25pdG9yaW5nTGV2ZWwge1xuICAvKipcbiAgICogRGVmYXVsdCBtZXRyaWNzIGFyZSB0aGUgZXNzZW50aWFsIG1ldHJpY3MgdG8gbW9uaXRvci5cbiAgICovXG4gIERFRkFVTFQgPSAnREVGQVVMVCcsXG5cbiAgLyoqXG4gICAqIFBlciBCcm9rZXIgbWV0cmljcyBnaXZlIHlvdSBtZXRyaWNzIGF0IHRoZSBicm9rZXIgbGV2ZWwuXG4gICAqL1xuICBQRVJfQlJPS0VSID0gJ1BFUl9CUk9LRVInLFxuXG4gIC8qKlxuICAgKiBQZXIgVG9waWMgUGVyIEJyb2tlciBtZXRyaWNzIGhlbHAgeW91IHVuZGVyc3RhbmQgdm9sdW1lIGF0IHRoZSB0b3BpYyBsZXZlbC5cbiAgICovXG4gIFBFUl9UT1BJQ19QRVJfQlJPS0VSID0gJ1BFUl9UT1BJQ19QRVJfQlJPS0VSJyxcblxuICAvKipcbiAgICogUGVyIFRvcGljIFBlciBQYXJ0aXRpb24gbWV0cmljcyBoZWxwIHlvdSB1bmRlcnN0YW5kIGNvbnN1bWVyIGdyb3VwIGxhZyBhdCB0aGUgdG9waWMgcGFydGl0aW9uIGxldmVsLlxuICAgKi9cbiAgUEVSX1RPUElDX1BFUl9QQVJUSVRJT04gPSAnUEVSX1RPUElDX1BFUl9QQVJUSVRJT04nLFxufVxuXG4vKipcbiAqIE1vbml0b3JpbmcgQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbGV2ZWwgb2YgbW9uaXRvcmluZyBmb3IgdGhlIE1TSyBjbHVzdGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBERUZBVUxUXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyTW9uaXRvcmluZ0xldmVsPzogQ2x1c3Rlck1vbml0b3JpbmdMZXZlbDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgeW91IHdhbnQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEpNWCBFeHBvcnRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZVByb21ldGhldXNKbXhFeHBvcnRlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHlvdSB3YW50IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBQcm9tZXRoZXVzIE5vZGUgRXhwb3J0ZXIuXG4gICAqXG4gICAqIFlvdSBjYW4gdXNlIHRoZSBQcm9tZXRoZXVzIE5vZGUgRXhwb3J0ZXIgdG8gZ2V0IENQVSBhbmQgZGlzayBtZXRyaWNzIGZvciB0aGUgYnJva2VyIG5vZGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUHJvbWV0aGV1c05vZGVFeHBvcnRlcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBkZXRhaWxzIHJlbGF0ZWQgdG8gYnJva2VyIGxvZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJva2VyTG9nZ2luZyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIERhdGEgRmlyZWhvc2UgZGVsaXZlcnkgc3RyZWFtIHRoYXQgaXMgdGhlIGRlc3RpbmF0aW9uIGZvciBicm9rZXIgbG9ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmlyZWhvc2VEZWxpdmVyeVN0cmVhbU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBDbG91ZFdhdGNoIExvZ3MgZ3JvdXAgdGhhdCBpcyB0aGUgZGVzdGluYXRpb24gZm9yIGJyb2tlciBsb2dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBjbG91ZHdhdGNoTG9nR3JvdXA/OiBsb2dzLklMb2dHcm91cDtcblxuICAvKipcbiAgICogRGV0YWlscyBvZiB0aGUgQW1hem9uIFMzIGRlc3RpbmF0aW9uIGZvciBicm9rZXIgbG9ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgczM/OiBTM0xvZ2dpbmdDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlIEFtYXpvbiBTMyBkZXN0aW5hdGlvbiBmb3IgYnJva2VyIGxvZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUzNMb2dnaW5nQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IHRoYXQgaXMgdGhlIGRlc3RpbmF0aW9uIGZvciBicm9rZXIgbG9ncy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldDogczMuSUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIFMzIHByZWZpeCB0aGF0IGlzIHRoZSBkZXN0aW5hdGlvbiBmb3IgYnJva2VyIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJlZml4XG4gICAqL1xuICByZWFkb25seSBwcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBlbmNyeXB0aW9uIHNldHRpbmcgZm9yIGRhdGEgaW4gdHJhbnNpdCBiZXR3ZWVuIGNsaWVudHMgYW5kIGJyb2tlcnMuXG4gKi9cbmV4cG9ydCBlbnVtIENsaWVudEJyb2tlckVuY3J5cHRpb24ge1xuICAvKipcbiAgICogVExTIG1lYW5zIHRoYXQgY2xpZW50LWJyb2tlciBjb21tdW5pY2F0aW9uIGlzIGVuYWJsZWQgd2l0aCBUTFMgb25seS5cbiAgICovXG4gIFRMUyA9ICdUTFMnLFxuXG4gIC8qKlxuICAgKiBUTFNfUExBSU5URVhUIG1lYW5zIHRoYXQgY2xpZW50LWJyb2tlciBjb21tdW5pY2F0aW9uIGlzIGVuYWJsZWQgZm9yIGJvdGggVExTLWVuY3J5cHRlZCwgYXMgd2VsbCBhcyBwbGFpbnRleHQgZGF0YS5cbiAgICovXG4gIFRMU19QTEFJTlRFWFQgPSAnVExTX1BMQUlOVEVYVCcsXG5cbiAgLyoqXG4gICAqIFBMQUlOVEVYVCBtZWFucyB0aGF0IGNsaWVudC1icm9rZXIgY29tbXVuaWNhdGlvbiBpcyBlbmFibGVkIGluIHBsYWludGV4dCBvbmx5LlxuICAgKi9cbiAgUExBSU5URVhUID0gJ1BMQUlOVEVYVCcsXG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIGZvciBlbmNyeXB0aW5nIGRhdGEgaW4gdHJhbnNpdC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tc2svbGF0ZXN0L2RldmVsb3Blcmd1aWRlL21zay1lbmNyeXB0aW9uLmh0bWwjbXNrLWVuY3J5cHRpb24taW4tdHJhbnNpdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuY3J5cHRpb25JblRyYW5zaXRDb25maWcge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBlbmNyeXB0aW9uIHNldHRpbmcgZm9yIGRhdGEgaW4gdHJhbnNpdCBiZXR3ZWVuIGNsaWVudHMgYW5kIGJyb2tlcnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVExTXG4gICAqL1xuICByZWFkb25seSBjbGllbnRCcm9rZXI/OiBDbGllbnRCcm9rZXJFbmNyeXB0aW9uO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhhdCBkYXRhIGNvbW11bmljYXRpb24gYW1vbmcgdGhlIGJyb2tlciBub2RlcyBvZiB0aGUgY2x1c3RlciBpcyBlbmNyeXB0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUluQ2x1c3Rlcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU0FTTCBhdXRoZW50aWNhdGlvbiBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FzbEF1dGhQcm9wcyB7XG4gIC8qKlxuICAgKiBFbmFibGUgU0FTTC9TQ1JBTSBhdXRoZW50aWNhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNjcmFtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIElBTSBhY2Nlc3MgY29udHJvbC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlhbT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEtNUyBLZXkgdG8gZW5jcnlwdCBTQVNML1NDUkFNIHNlY3JldHMuXG4gICAqXG4gICAqIFlvdSBtdXN0IHVzZSBhIGN1c3RvbWVyIG1hc3RlciBrZXkgKENNSykgd2hlbiBjcmVhdGluZyB1c2VycyBpbiBzZWNyZXRzIG1hbmFnZXIuXG4gICAqIFlvdSBjYW5ub3QgdXNlIGEgU2VjcmV0IHdpdGggQW1hem9uIE1TSyB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgU2VjcmV0cyBNYW5hZ2VyIGVuY3J5cHRpb24ga2V5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIENNSyB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhbGlhcyBtc2sve2NsdXN0ZXJOYW1lfS9zYXNsL3NjcmFtXG4gICAqL1xuICByZWFkb25seSBrZXk/OiBrbXMuSUtleVJlZjtcbn1cblxuLyoqXG4gKiBUTFMgYXV0aGVudGljYXRpb24gcHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRsc0F1dGhQcm9wcyB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIEFDTSBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyB0byBlbmFibGUgVExTIGF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlQXV0aG9yaXRpZXM/OiBhY21wY2EuSUNlcnRpZmljYXRlQXV0aG9yaXR5W107XG59XG5cbi8qKlxuICogU0FTTCArIFRMUyBhdXRoZW50aWNhdGlvbiBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FzbFRsc0F1dGhQcm9wcyBleHRlbmRzIFNhc2xBdXRoUHJvcHMsIFRsc0F1dGhQcm9wcyB7IH1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudEF1dGhlbnRpY2F0aW9uIHtcbiAgLyoqXG4gICAqIFNBU0wgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2FzbChwcm9wczogU2FzbEF1dGhQcm9wcyk6IENsaWVudEF1dGhlbnRpY2F0aW9uIHtcbiAgICByZXR1cm4gbmV3IENsaWVudEF1dGhlbnRpY2F0aW9uKHByb3BzLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRMUyBhdXRoZW50aWNhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0bHMocHJvcHM6IFRsc0F1dGhQcm9wcyk6IENsaWVudEF1dGhlbnRpY2F0aW9uIHtcbiAgICByZXR1cm4gbmV3IENsaWVudEF1dGhlbnRpY2F0aW9uKHVuZGVmaW5lZCwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNBU0wgKyBUTFMgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2FzbFRscyhzYXNsVGxzUHJvcHM6IFNhc2xUbHNBdXRoUHJvcHMpOiBDbGllbnRBdXRoZW50aWNhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBDbGllbnRBdXRoZW50aWNhdGlvbihzYXNsVGxzUHJvcHMsIHNhc2xUbHNQcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHNhc2xQcm9wcyAtIHByb3BlcnRpZXMgZm9yIFNBU0wgYXV0aGVudGljYXRpb25cbiAgICogQHBhcmFtIHRsc1Byb3BzIC0gcHJvcGVydGllcyBmb3IgVExTIGF1dGhlbnRpY2F0aW9uXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBzYXNsUHJvcHM/OiBTYXNsQXV0aFByb3BzLFxuICAgIHB1YmxpYyByZWFkb25seSB0bHNQcm9wcz86IFRsc0F1dGhQcm9wcyxcbiAgKSB7fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIE1TSyBDbHVzdGVyLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6Ok1TSzo6Q2x1c3RlclxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgQ2x1c3RlciBleHRlbmRzIENsdXN0ZXJCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtbXNrLWFscGhhLkNsdXN0ZXInO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgYW4gZXhpc3RpbmcgY2x1c3RlciwgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBDREsgY29kZSwgYnkgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNsdXN0ZXJBcm4oc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjbHVzdGVyQXJuOiBzdHJpbmcpOiBJQ2x1c3RlciB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQ2x1c3RlckJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXJBcm4gPSBjbHVzdGVyQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXJOYW1lID0gY29yZS5Gbi5zZWxlY3QoMSwgY29yZS5Gbi5zcGxpdCgnLycsIGNsdXN0ZXJBcm4pKTsgLy8gWydhcm46cGFydGl0aW9uOmthZmthOnJlZ2lvbjphY2NvdW50LWlkJywgY2x1c3Rlck5hbWUsIGNsdXN0ZXJJZF1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXJBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXJOYW1lOiBzdHJpbmc7XG4gIC8qKiBLZXkgdXNlZCB0byBlbmNyeXB0IFNBU0wvU0NSQU0gdXNlcnMgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNhc2xTY3JhbUF1dGhlbnRpY2F0aW9uS2V5Pzoga21zLklLZXk7XG4gIHByaXZhdGUgX2NsdXN0ZXJEZXNjcmlwdGlvbj86IGNyLkF3c0N1c3RvbVJlc291cmNlO1xuICBwcml2YXRlIF9jbHVzdGVyQm9vdHN0cmFwQnJva2Vycz86IGNyLkF3c0N1c3RvbVJlc291cmNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENsdXN0ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgeyBwaHlzaWNhbE5hbWU6IHByb3BzLmNsdXN0ZXJOYW1lIH0pO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgY29uc3Qgc3VibmV0U2VsZWN0aW9uID0gcHJvcHMudnBjLnNlbGVjdFN1Ym5ldHMocHJvcHMudnBjU3VibmV0cyk7XG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucyA9IG5ldyBlYzIuQ29ubmVjdGlvbnMoe1xuICAgICAgc2VjdXJpdHlHcm91cHM6IHByb3BzLnNlY3VyaXR5R3JvdXBzID8/IFtcbiAgICAgICAgbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdTZWN1cml0eUdyb3VwJywge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTVNLIHNlY3VyaXR5IGdyb3VwJyxcbiAgICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaWYgKHN1Ym5ldFNlbGVjdGlvbi5zdWJuZXRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBjb3JlLlZhbGlkYXRpb25FcnJvcihgQ2x1c3RlciByZXF1aXJlcyBhdCBsZWFzdCAyIHN1Ym5ldHMsIGdvdCAke3N1Ym5ldFNlbGVjdGlvbi5zdWJuZXRzLmxlbmd0aH1gLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZW5jcnlwdGlvbkluVHJhbnNpdD8uY2xpZW50QnJva2VyID09PSBDbGllbnRCcm9rZXJFbmNyeXB0aW9uLlBMQUlOVEVYVCAmJiBwcm9wcy5jbGllbnRBdXRoZW50aWNhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IGNvcmUuVmFsaWRhdGlvbkVycm9yKCdUbyBlbmFibGUgY2xpZW50IGF1dGhlbnRpY2F0aW9uLCB5b3UgbXVzdCBlbmFibGVkIFRMUy1lbmNyeXB0ZWQgdHJhZmZpYyBiZXR3ZWVuIGNsaWVudHMgYW5kIGJyb2tlcnMuJywgdGhpcyk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHByb3BzLmVuY3J5cHRpb25JblRyYW5zaXQ/LmNsaWVudEJyb2tlciA9PT1cbiAgICAgICAgQ2xpZW50QnJva2VyRW5jcnlwdGlvbi5UTFNfUExBSU5URVhUICYmXG4gICAgICAocHJvcHMuY2xpZW50QXV0aGVudGljYXRpb24/LnNhc2xQcm9wcz8uc2NyYW0gfHxcbiAgICAgICAgcHJvcHMuY2xpZW50QXV0aGVudGljYXRpb24/LnNhc2xQcm9wcz8uaWFtKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IGNvcmUuVmFsaWRhdGlvbkVycm9yKCdUbyBlbmFibGUgU0FTTC9TQ1JBTSBvciBJQU0gYXV0aGVudGljYXRpb24sIHlvdSBtdXN0IG9ubHkgYWxsb3cgVExTLWVuY3J5cHRlZCB0cmFmZmljIGJldHdlZW4gY2xpZW50cyBhbmQgYnJva2Vycy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBjb25zdCB2b2x1bWVTaXplID0gcHJvcHMuZWJzU3RvcmFnZUluZm8/LnZvbHVtZVNpemUgPz8gMTAwMDtcbiAgICAvLyBNaW5pbXVtOiAxIEdpQiwgbWF4aW11bTogMTYzODQgR2lCXG4gICAgaWYgKHZvbHVtZVNpemUgPCAxIHx8IHZvbHVtZVNpemUgPiAxNjM4NCkge1xuICAgICAgdGhyb3cgbmV3IGNvcmUuVmFsaWRhdGlvbkVycm9yKCdFQlMgdm9sdW1lIHNpemUgc2hvdWxkIGJlIGluIHRoZSByYW5nZSAxLTE2Mzg0JywgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNFeHByZXNzID0gcHJvcHMuYnJva2VyVHlwZSA9PT0gQnJva2VyVHlwZS5FWFBSRVNTO1xuXG4gICAgaWYgKGlzRXhwcmVzcykge1xuICAgICAgLy8gVmFsaWRhdGUgS2Fma2EgdmVyc2lvbiBjb21wYXRpYmlsaXR5XG4gICAgICBjb25zdCBzdXBwb3J0ZWRWZXJzaW9ucyA9IFsnMy42JywgJzMuOCddO1xuICAgICAgY29uc3Qga2Fma2FWZXJzaW9uU3RyaW5nID0gcHJvcHMua2Fma2FWZXJzaW9uLnZlcnNpb247XG4gICAgICBjb25zdCBpc0NvbXBhdGlibGVWZXJzaW9uID0gc3VwcG9ydGVkVmVyc2lvbnMuc29tZSh2ZXJzaW9uID0+IGthZmthVmVyc2lvblN0cmluZy5pbmNsdWRlcyh2ZXJzaW9uKSk7XG4gICAgICBpZiAoIWlzQ29tcGF0aWJsZVZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IGNvcmUuVmFsaWRhdGlvbkVycm9yKGBFeHByZXNzIGJyb2tlcnMgYXJlIG9ubHkgc3VwcG9ydGVkIHdpdGggQXBhY2hlIEthZmthIDMuNi54IGFuZCAzLjgueCwgZ290ICR7a2Fma2FWZXJzaW9uU3RyaW5nfWAsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3BzLmluc3RhbmNlVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgY29yZS5WYWxpZGF0aW9uRXJyb3IoJ2BpbnN0YW5jZVR5cGVgIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQgd2hlbiBgYnJva2VyVHlwZWAgaXMgYEJyb2tlclR5cGUuRVhQUkVTU2AuJywgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuZWJzU3RvcmFnZUluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IGNvcmUuVmFsaWRhdGlvbkVycm9yKCdgZWJzU3RvcmFnZUluZm9gIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBgYnJva2VyVHlwZWAgaXMgYEJyb2tlclR5cGUuRVhQUkVTU2AuJywgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuc3RvcmFnZU1vZGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IGNvcmUuVmFsaWRhdGlvbkVycm9yKCdgc3RvcmFnZU1vZGVgIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBgYnJva2VyVHlwZWAgaXMgYEJyb2tlclR5cGUuRVhQUkVTU2AuJywgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMubG9nZ2luZykge1xuICAgICAgICB0aHJvdyBuZXcgY29yZS5WYWxpZGF0aW9uRXJyb3IoJ2Bsb2dnaW5nYCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gYGJyb2tlclR5cGVgIGlzIGBCcm9rZXJUeXBlLkVYUFJFU1NgLicsIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKHN1Ym5ldFNlbGVjdGlvbi5zdWJuZXRzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IGNvcmUuVmFsaWRhdGlvbkVycm9yKGBFeHByZXNzIGNsdXN0ZXIgcmVxdWlyZXMgYXQgbGVhc3QgMyBzdWJuZXRzLCBnb3QgJHtzdWJuZXRTZWxlY3Rpb24uc3VibmV0cy5sZW5ndGh9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VUeXBlID0gcHJvcHMuaW5zdGFuY2VUeXBlXG4gICAgICA/IHRoaXMubXNrSW5zdGFuY2VUeXBlKHByb3BzLmluc3RhbmNlVHlwZSwgaXNFeHByZXNzKVxuICAgICAgOiB0aGlzLm1za0luc3RhbmNlVHlwZShcbiAgICAgICAgZWMyLkluc3RhbmNlVHlwZS5vZihlYzIuSW5zdGFuY2VDbGFzcy5NNSwgZWMyLkluc3RhbmNlU2l6ZS5MQVJHRSksXG4gICAgICApO1xuXG4gICAgaWYgKHByb3BzLnN0b3JhZ2VNb2RlICYmIHByb3BzLnN0b3JhZ2VNb2RlID09PSBTdG9yYWdlTW9kZS5USUVSRUQpIHtcbiAgICAgIGlmICghcHJvcHMua2Fma2FWZXJzaW9uLmlzVGllcmVkU3RvcmFnZUNvbXBhdGlibGUoKSkge1xuICAgICAgICB0aHJvdyBuZXcgY29yZS5WYWxpZGF0aW9uRXJyb3IoYFRvIGRlcGxveSBhIHRpZXJlZCBjbHVzdGVyIHlvdSBtdXN0IHNlbGVjdCBhIGNvbXBhdGlibGUgS2Fma2EgdmVyc2lvbiwgZ290ICR7cHJvcHMua2Fma2FWZXJzaW9uLnZlcnNpb259YCwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdGFuY2VUeXBlID09PSB0aGlzLm1za0luc3RhbmNlVHlwZShcbiAgICAgICAgZWMyLkluc3RhbmNlVHlwZS5vZihlYzIuSW5zdGFuY2VDbGFzcy5UMywgZWMyLkluc3RhbmNlU2l6ZS5TTUFMTCksXG4gICAgICApKSB7XG4gICAgICAgIHRocm93IG5ldyBjb3JlLlZhbGlkYXRpb25FcnJvcignVGllcmVkIHN0b3JhZ2UgZG9lc25cXCd0IHN1cHBvcnQgYnJva2VyIHR5cGUgdDMuc21hbGwnLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uQXRSZXN0ID0gcHJvcHMuZWJzU3RvcmFnZUluZm8/LmVuY3J5cHRpb25LZXlcbiAgICAgID8ge1xuICAgICAgICBkYXRhVm9sdW1lS21zS2V5SWQ6XG4gICAgICAgICAgICBwcm9wcy5lYnNTdG9yYWdlSW5mby5lbmNyeXB0aW9uS2V5LmtleVJlZi5rZXlJZCxcbiAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkOyAvLyBNU0sgd2lsbCBjcmVhdGUgdGhlIG1hbmFnZWQga2V5XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uSW5UcmFuc2l0ID0ge1xuICAgICAgY2xpZW50QnJva2VyOlxuICAgICAgICBwcm9wcy5lbmNyeXB0aW9uSW5UcmFuc2l0Py5jbGllbnRCcm9rZXIgPz9cbiAgICAgICAgQ2xpZW50QnJva2VyRW5jcnlwdGlvbi5UTFMsXG4gICAgICBpbkNsdXN0ZXI6IHByb3BzLmVuY3J5cHRpb25JblRyYW5zaXQ/LmVuYWJsZUluQ2x1c3RlciA/PyB0cnVlLFxuICAgIH07XG5cbiAgICBjb25zdCBvcGVuTW9uaXRvcmluZyA9XG4gICAgICBwcm9wcy5tb25pdG9yaW5nPy5lbmFibGVQcm9tZXRoZXVzSm14RXhwb3J0ZXIgfHxcbiAgICAgIHByb3BzLm1vbml0b3Jpbmc/LmVuYWJsZVByb21ldGhldXNOb2RlRXhwb3J0ZXJcbiAgICAgICAgPyB7XG4gICAgICAgICAgcHJvbWV0aGV1czoge1xuICAgICAgICAgICAgam14RXhwb3J0ZXI6IHByb3BzLm1vbml0b3Jpbmc/LmVuYWJsZVByb21ldGhldXNKbXhFeHBvcnRlclxuICAgICAgICAgICAgICA/IHsgZW5hYmxlZEluQnJva2VyOiB0cnVlIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBub2RlRXhwb3J0ZXI6IHByb3BzLm1vbml0b3JpbmdcbiAgICAgICAgICAgICAgPy5lbmFibGVQcm9tZXRoZXVzTm9kZUV4cG9ydGVyXG4gICAgICAgICAgICAgID8geyBlbmFibGVkSW5Ccm9rZXI6IHRydWUgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgbG9nZ2luZ0J1Y2tldCA9IHByb3BzLmxvZ2dpbmc/LnMzPy5idWNrZXQ7XG4gICAgaWYgKGxvZ2dpbmdCdWNrZXQgJiYgRmVhdHVyZUZsYWdzLm9mKHRoaXMpLmlzRW5hYmxlZChTM19DUkVBVEVfREVGQVVMVF9MT0dHSU5HX1BPTElDWSkpIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gY29yZS5TdGFjay5vZih0aGlzKTtcbiAgICAgIGxvZ2dpbmdCdWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZGVsaXZlcnkubG9ncy5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGxvZ2dpbmdCdWNrZXQuYXJuRm9yT2JqZWN0cyhgQVdTTG9ncy8ke3N0YWNrLmFjY291bnR9LypgKSxcbiAgICAgICAgXSxcbiAgICAgICAgYWN0aW9uczogWydzMzpQdXRPYmplY3QnXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgJ3MzOngtYW16LWFjbCc6ICdidWNrZXQtb3duZXItZnVsbC1jb250cm9sJyxcbiAgICAgICAgICAgICdhd3M6U291cmNlQWNjb3VudCc6IHN0YWNrLmFjY291bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBBcm5MaWtlOiB7XG4gICAgICAgICAgICAnYXdzOlNvdXJjZUFybic6IHN0YWNrLmZvcm1hdEFybih7XG4gICAgICAgICAgICAgIHNlcnZpY2U6ICdsb2dzJyxcbiAgICAgICAgICAgICAgcmVzb3VyY2U6ICcqJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGxvZ2dpbmdCdWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZGVsaXZlcnkubG9ncy5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW2xvZ2dpbmdCdWNrZXQuYnVja2V0QXJuXSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICdzMzpHZXRCdWNrZXRBY2wnLFxuICAgICAgICAgICdzMzpMaXN0QnVja2V0JyxcbiAgICAgICAgXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgJ2F3czpTb3VyY2VBY2NvdW50Jzogc3RhY2suYWNjb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIEFybkxpa2U6IHtcbiAgICAgICAgICAgICdhd3M6U291cmNlQXJuJzogc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgICAgICAgICAgc2VydmljZTogJ2xvZ3MnLFxuICAgICAgICAgICAgICByZXNvdXJjZTogJyonLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgY29uc3QgbG9nZ2luZ0luZm8gPSBpc0V4cHJlc3MgPyB1bmRlZmluZWQgOiB7XG4gICAgICBicm9rZXJMb2dzOiB7XG4gICAgICAgIGNsb3VkV2F0Y2hMb2dzOiB7XG4gICAgICAgICAgZW5hYmxlZDpcbiAgICAgICAgICAgIHByb3BzLmxvZ2dpbmc/LmNsb3Vkd2F0Y2hMb2dHcm91cCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIGxvZ0dyb3VwOlxuICAgICAgICAgICAgcHJvcHMubG9nZ2luZz8uY2xvdWR3YXRjaExvZ0dyb3VwPy5sb2dHcm91cE5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIGZpcmVob3NlOiB7XG4gICAgICAgICAgZW5hYmxlZDpcbiAgICAgICAgICAgIHByb3BzLmxvZ2dpbmc/LmZpcmVob3NlRGVsaXZlcnlTdHJlYW1OYW1lICE9PVxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGRlbGl2ZXJ5U3RyZWFtOlxuICAgICAgICAgICAgcHJvcHMubG9nZ2luZz8uZmlyZWhvc2VEZWxpdmVyeVN0cmVhbU5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHMzOiB7XG4gICAgICAgICAgZW5hYmxlZDogbG9nZ2luZ0J1Y2tldCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIGJ1Y2tldDogbG9nZ2luZ0J1Y2tldD8uYnVja2V0TmFtZSxcbiAgICAgICAgICBwcmVmaXg6IHByb3BzLmxvZ2dpbmc/LnMzPy5wcmVmaXgsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAocHJvcHMuY2xpZW50QXV0aGVudGljYXRpb24/LnNhc2xQcm9wcz8uc2NyYW0gJiYgcHJvcHMuY2xpZW50QXV0aGVudGljYXRpb24/LnNhc2xQcm9wcz8ua2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2FzbFNjcmFtQXV0aGVudGljYXRpb25LZXkgPSBuZXcga21zLktleSh0aGlzLCAnU0FTTEtleScsIHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VkIGZvciBlbmNyeXB0aW5nIE1TSyBzZWNyZXRzIGZvciBTQVNML1NDUkFNIGF1dGhlbnRpY2F0aW9uLicsXG4gICAgICAgIGFsaWFzOiBgbXNrLyR7cHJvcHMuY2x1c3Rlck5hbWV9L3Nhc2wvc2NyYW1gLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9rbXMvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlcnZpY2VzLXNlY3JldHMtbWFuYWdlci5odG1sI2FzbS1wb2xpY2llc1xuICAgICAgdGhpcy5zYXNsU2NyYW1BdXRoZW50aWNhdGlvbktleS5hZGRUb1Jlc291cmNlUG9saWN5KFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgc2lkOlxuICAgICAgICAgICAgJ0FsbG93IGFjY2VzcyB0aHJvdWdoIEFXUyBTZWNyZXRzIE1hbmFnZXIgZm9yIGFsbCBwcmluY2lwYWxzIGluIHRoZSBhY2NvdW50IHRoYXQgYXJlIGF1dGhvcml6ZWQgdG8gdXNlIEFXUyBTZWNyZXRzIE1hbmFnZXInLFxuICAgICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFueVByaW5jaXBhbCgpXSxcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAna21zOkVuY3J5cHQnLFxuICAgICAgICAgICAgJ2ttczpEZWNyeXB0JyxcbiAgICAgICAgICAgICdrbXM6UmVFbmNyeXB0KicsXG4gICAgICAgICAgICAna21zOkdlbmVyYXRlRGF0YUtleSonLFxuICAgICAgICAgICAgJ2ttczpDcmVhdGVHcmFudCcsXG4gICAgICAgICAgICAna21zOkRlc2NyaWJlS2V5JyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICAgICdrbXM6VmlhU2VydmljZSc6IGBzZWNyZXRzbWFuYWdlci4ke2NvcmUuU3RhY2sub2YodGhpcykucmVnaW9ufS5hbWF6b25hd3MuY29tYCxcbiAgICAgICAgICAgICAgJ2ttczpDYWxsZXJBY2NvdW50JzogY29yZS5TdGFjay5vZih0aGlzKS5hY2NvdW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGNsaWVudEF1dGhlbnRpY2F0aW9uOiBDZm5DbHVzdGVyLkNsaWVudEF1dGhlbnRpY2F0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHByb3BzLmNsaWVudEF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICBjb25zdCB7IHNhc2xQcm9wcywgdGxzUHJvcHMgfSA9IHByb3BzLmNsaWVudEF1dGhlbnRpY2F0aW9uO1xuICAgICAgY2xpZW50QXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgIHNhc2w6IHNhc2xQcm9wcyA/IHtcbiAgICAgICAgICBpYW06IHNhc2xQcm9wcy5pYW0gPyB7IGVuYWJsZWQ6IHRydWUgfTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNjcmFtOiBzYXNsUHJvcHMuc2NyYW0gPyB7IGVuYWJsZWQ6IHRydWUgfTogdW5kZWZpbmVkLFxuICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICB0bHM6IHRsc1Byb3BzPy5jZXJ0aWZpY2F0ZUF1dGhvcml0aWVzID8ge1xuICAgICAgICAgIGNlcnRpZmljYXRlQXV0aG9yaXR5QXJuTGlzdDogdGxzUHJvcHMuY2VydGlmaWNhdGVBdXRob3JpdGllcz8ubWFwKChjYSkgPT4gY2EuY2VydGlmaWNhdGVBdXRob3JpdHlBcm4pLFxuICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5DbHVzdGVyKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGNsdXN0ZXJOYW1lOiBwcm9wcy5jbHVzdGVyTmFtZSxcbiAgICAgIGthZmthVmVyc2lvbjogcHJvcHMua2Fma2FWZXJzaW9uLnZlcnNpb24sXG4gICAgICBudW1iZXJPZkJyb2tlck5vZGVzOlxuICAgICAgICBwcm9wcy5udW1iZXJPZkJyb2tlck5vZGVzICE9PSB1bmRlZmluZWQgP1xuICAgICAgICAgIHN1Ym5ldFNlbGVjdGlvbi5hdmFpbGFiaWxpdHlab25lcy5sZW5ndGggKiBwcm9wcy5udW1iZXJPZkJyb2tlck5vZGVzIDogc3VibmV0U2VsZWN0aW9uLmF2YWlsYWJpbGl0eVpvbmVzLmxlbmd0aCxcbiAgICAgIGJyb2tlck5vZGVHcm91cEluZm86IHtcbiAgICAgICAgaW5zdGFuY2VUeXBlLFxuICAgICAgICBjbGllbnRTdWJuZXRzOiBzdWJuZXRTZWxlY3Rpb24uc3VibmV0SWRzLFxuICAgICAgICBzZWN1cml0eUdyb3VwczogdGhpcy5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3Vwcy5tYXAoXG4gICAgICAgICAgKGdyb3VwKSA9PiBncm91cC5zZWN1cml0eUdyb3VwSWQsXG4gICAgICAgICksXG4gICAgICAgIHN0b3JhZ2VJbmZvOiBpc0V4cHJlc3MgPyB1bmRlZmluZWQgOiB7XG4gICAgICAgICAgZWJzU3RvcmFnZUluZm86IHtcbiAgICAgICAgICAgIHZvbHVtZVNpemU6IHZvbHVtZVNpemUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlbmNyeXB0aW9uSW5mbzoge1xuICAgICAgICBlbmNyeXB0aW9uQXRSZXN0LFxuICAgICAgICBlbmNyeXB0aW9uSW5UcmFuc2l0LFxuICAgICAgfSxcbiAgICAgIGNvbmZpZ3VyYXRpb25JbmZvOiBwcm9wcy5jb25maWd1cmF0aW9uSW5mbyxcbiAgICAgIGVuaGFuY2VkTW9uaXRvcmluZzogcHJvcHMubW9uaXRvcmluZz8uY2x1c3Rlck1vbml0b3JpbmdMZXZlbCxcbiAgICAgIG9wZW5Nb25pdG9yaW5nOiBvcGVuTW9uaXRvcmluZyxcbiAgICAgIHN0b3JhZ2VNb2RlOiBpc0V4cHJlc3MgPyB1bmRlZmluZWQgOiBwcm9wcy5zdG9yYWdlTW9kZSxcbiAgICAgIGxvZ2dpbmdJbmZvOiBsb2dnaW5nSW5mbyxcbiAgICAgIGNsaWVudEF1dGhlbnRpY2F0aW9uLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jbHVzdGVyTmFtZSA9IHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKFxuICAgICAgY29yZS5Gbi5zZWxlY3QoMSwgY29yZS5Gbi5zcGxpdCgnLycsIHJlc291cmNlLnJlZikpLFxuICAgICk7XG4gICAgdGhpcy5jbHVzdGVyQXJuID0gcmVzb3VyY2UucmVmO1xuXG4gICAgcmVzb3VyY2UuYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLnJlbW92YWxQb2xpY3ksIHtcbiAgICAgIGRlZmF1bHQ6IGNvcmUuUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1za0luc3RhbmNlVHlwZShpbnN0YW5jZVR5cGU6IGVjMi5JbnN0YW5jZVR5cGUsIGV4cHJlc3M/OmJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IGV4cHJlc3MgPyAnZXhwcmVzcy4nIDogJ2thZmthLic7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke2luc3RhbmNlVHlwZS50b1N0cmluZygpfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBab29LZWVwZXIgQ29ubmVjdGlvbiBzdHJpbmdcbiAgICpcbiAgICogVXNlcyBhIEN1c3RvbSBSZXNvdXJjZSB0byBtYWtlIGFuIEFQSSBjYWxsIHRvIGBkZXNjcmliZUNsdXN0ZXJgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2VGaWVsZCBGaWVsZCB0byByZXR1cm4gZnJvbSBBUEkgY2FsbC4gZWcuIFpvb2tlZXBlckNvbm5lY3RTdHJpbmcsIFpvb2tlZXBlckNvbm5lY3RTdHJpbmdUbHNcbiAgICogQHJldHVybnMgLSBUaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIEFwYWNoZSBab29LZWVwZXIgY2x1c3Rlci5cbiAgICovXG4gIHByaXZhdGUgX3pvb2tlZXBlckNvbm5lY3Rpb25TdHJpbmcocmVzcG9uc2VGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2NsdXN0ZXJEZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fY2x1c3RlckRlc2NyaXB0aW9uID0gbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsICdab29rZWVwZXJDb25uZWN0Jywge1xuICAgICAgICBvblVwZGF0ZToge1xuICAgICAgICAgIHNlcnZpY2U6ICdLYWZrYScsXG4gICAgICAgICAgYWN0aW9uOiAnZGVzY3JpYmVDbHVzdGVyJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBDbHVzdGVyQXJuOiB0aGlzLmNsdXN0ZXJBcm4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGNyLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICAgICdab29LZWVwZXJDb25uZWN0aW9uU3RyaW5nJyxcbiAgICAgICAgICApLFxuICAgICAgICAgIC8vIExpbWl0IHRoZSBvdXRwdXQgb2YgZGVzY3JpYmVDbHVzdGVyIHRoYXQgaXMgb3RoZXJ3aXNlIHRvbyBsYXJnZVxuICAgICAgICAgIG91dHB1dFBhdGhzOiBbXG4gICAgICAgICAgICAnQ2x1c3RlckluZm8uWm9va2VlcGVyQ29ubmVjdFN0cmluZycsXG4gICAgICAgICAgICAnQ2x1c3RlckluZm8uWm9va2VlcGVyQ29ubmVjdFN0cmluZ1RscycsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgcG9saWN5OiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICAgIHJlc291cmNlczogW3RoaXMuY2x1c3RlckFybl0sXG4gICAgICAgIH0pLFxuICAgICAgICBpbnN0YWxsTGF0ZXN0QXdzU2RrOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2x1c3RlckRlc2NyaXB0aW9uLmdldFJlc3BvbnNlRmllbGQoYENsdXN0ZXJJbmZvLiR7cmVzcG9uc2VGaWVsZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFpvb0tlZXBlciBDb25uZWN0aW9uIHN0cmluZ1xuICAgKlxuICAgKiBVc2VzIGEgQ3VzdG9tIFJlc291cmNlIHRvIG1ha2UgYW4gQVBJIGNhbGwgdG8gYGRlc2NyaWJlQ2x1c3RlcmAgdXNpbmcgdGhlIEphdmFzY3JpcHQgU0RLXG4gICAqXG4gICAqIEByZXR1cm5zIC0gVGhlIGNvbm5lY3Rpb24gc3RyaW5nIHRvIHVzZSB0byBjb25uZWN0IHRvIHRoZSBBcGFjaGUgWm9vS2VlcGVyIGNsdXN0ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHpvb2tlZXBlckNvbm5lY3Rpb25TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fem9va2VlcGVyQ29ubmVjdGlvblN0cmluZygnWm9va2VlcGVyQ29ubmVjdFN0cmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgWm9vS2VlcGVyIENvbm5lY3Rpb24gc3RyaW5nIGZvciBhIFRMUyBlbmFibGVkIGNsdXN0ZXJcbiAgICpcbiAgICogVXNlcyBhIEN1c3RvbSBSZXNvdXJjZSB0byBtYWtlIGFuIEFQSSBjYWxsIHRvIGBkZXNjcmliZUNsdXN0ZXJgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcmV0dXJucyAtIFRoZSBjb25uZWN0aW9uIHN0cmluZyB0byB1c2UgdG8gY29ubmVjdCB0byB6b29rZWVwZXIgY2x1c3RlciBvbiBUTFMgcG9ydC5cbiAgICovXG4gIHB1YmxpYyBnZXQgem9va2VlcGVyQ29ubmVjdGlvblN0cmluZ1RscygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl96b29rZWVwZXJDb25uZWN0aW9uU3RyaW5nKCdab29rZWVwZXJDb25uZWN0U3RyaW5nVGxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIGJyb2tlcnMgdGhhdCBhIGNsaWVudCBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIGJvb3RzdHJhcFxuICAgKlxuICAgKiBVc2VzIGEgQ3VzdG9tIFJlc291cmNlIHRvIG1ha2UgYW4gQVBJIGNhbGwgdG8gYGdldEJvb3RzdHJhcEJyb2tlcnNgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2VGaWVsZCBGaWVsZCB0byByZXR1cm4gZnJvbSBBUEkgY2FsbC4gZWcuIEJvb3RzdHJhcEJyb2tlclN0cmluZ1Nhc2xTY3JhbSwgQm9vdHN0cmFwQnJva2VyU3RyaW5nXG4gICAqIEByZXR1cm5zIC0gQSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBob3N0bmFtZTpwb3J0IHBhaXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBfYm9vdHN0cmFwQnJva2VycyhyZXNwb25zZUZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5fY2x1c3RlckJvb3RzdHJhcEJyb2tlcnMpIHtcbiAgICAgIHRoaXMuX2NsdXN0ZXJCb290c3RyYXBCcm9rZXJzID0gbmV3IGNyLkF3c0N1c3RvbVJlc291cmNlKHRoaXMsIGBCb290c3RyYXBCcm9rZXJzJHtyZXNwb25zZUZpZWxkfWAsIHtcbiAgICAgICAgb25VcGRhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiAnS2Fma2EnLFxuICAgICAgICAgIGFjdGlvbjogJ2dldEJvb3RzdHJhcEJyb2tlcnMnLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIENsdXN0ZXJBcm46IHRoaXMuY2x1c3RlckFybixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKCdCb290c3RyYXBCcm9rZXJzJyksXG4gICAgICAgIH0sXG4gICAgICAgIHBvbGljeTogY3IuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmNsdXN0ZXJBcm5dLFxuICAgICAgICB9KSxcbiAgICAgICAgLy8gQVBJcyBhcmUgYXZhaWxhYmxlIGluIDIuMTA1NS4wXG4gICAgICAgIGluc3RhbGxMYXRlc3RBd3NTZGs6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jbHVzdGVyQm9vdHN0cmFwQnJva2Vycy5nZXRSZXNwb25zZUZpZWxkKHJlc3BvbnNlRmllbGQpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgYnJva2VycyB0aGF0IGEgY2xpZW50IGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gYm9vdHN0cmFwXG4gICAqXG4gICAqIFVzZXMgYSBDdXN0b20gUmVzb3VyY2UgdG8gbWFrZSBhbiBBUEkgY2FsbCB0byBgZ2V0Qm9vdHN0cmFwQnJva2Vyc2AgdXNpbmcgdGhlIEphdmFzY3JpcHQgU0RLXG4gICAqXG4gICAqIEByZXR1cm5zIC0gQSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZSBob3N0bmFtZTpwb3J0IHBhaXJzLlxuICAgKi9cbiAgcHVibGljIGdldCBib290c3RyYXBCcm9rZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Jvb3RzdHJhcEJyb2tlcnMoJ0Jvb3RzdHJhcEJyb2tlclN0cmluZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBicm9rZXJzIHRoYXQgYSBUTFMgYXV0aGVudGljYXRlZCBjbGllbnQgYXBwbGljYXRpb24gY2FuIHVzZSB0byBib290c3RyYXBcbiAgICpcbiAgICogVXNlcyBhIEN1c3RvbSBSZXNvdXJjZSB0byBtYWtlIGFuIEFQSSBjYWxsIHRvIGBnZXRCb290c3RyYXBCcm9rZXJzYCB1c2luZyB0aGUgSmF2YXNjcmlwdCBTREtcbiAgICpcbiAgICogQHJldHVybnMgLSBBIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlIEROUyBuYW1lcyAob3IgSVApIGFuZCBUTFMgcG9ydCBwYWlycy5cbiAgICovXG4gIHB1YmxpYyBnZXQgYm9vdHN0cmFwQnJva2Vyc1RscygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9ib290c3RyYXBCcm9rZXJzKCdCb290c3RyYXBCcm9rZXJTdHJpbmdUbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgYnJva2VycyB0aGF0IGEgU0FTTC9TQ1JBTSBhdXRoZW50aWNhdGVkIGNsaWVudCBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIGJvb3RzdHJhcFxuICAgKlxuICAgKiBVc2VzIGEgQ3VzdG9tIFJlc291cmNlIHRvIG1ha2UgYW4gQVBJIGNhbGwgdG8gYGdldEJvb3RzdHJhcEJyb2tlcnNgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcmV0dXJucyAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgZG5zIG5hbWUgKG9yIElQKSBhbmQgU0FTTCBTQ1JBTSBwb3J0IHBhaXJzLlxuICAgKi9cbiAgcHVibGljIGdldCBib290c3RyYXBCcm9rZXJzU2FzbFNjcmFtKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Jvb3RzdHJhcEJyb2tlcnMoJ0Jvb3RzdHJhcEJyb2tlclN0cmluZ1Nhc2xTY3JhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBicm9rZXJzIHRoYXQgYSBTQVNML0lBTSBhdXRoZW50aWNhdGVkIGNsaWVudCBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIGJvb3RzdHJhcFxuICAgKlxuICAgKiBVc2VzIGEgQ3VzdG9tIFJlc291cmNlIHRvIG1ha2UgYW4gQVBJIGNhbGwgdG8gYGdldEJvb3RzdHJhcEJyb2tlcnNgIHVzaW5nIHRoZSBKYXZhc2NyaXB0IFNES1xuICAgKlxuICAgKiBAcmV0dXJucyAtIEEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgRE5TIG5hbWVzIChvciBJUCkgYW5kIFRMUyBwb3J0IHBhaXJzLlxuICAgKi9cbiAgcHVibGljIGdldCBib290c3RyYXBCcm9rZXJzU2FzbElhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYm9vdHN0cmFwQnJva2VycygnQm9vdHN0cmFwQnJva2VyU3RyaW5nU2FzbElhbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiB1c2Vyc25hbWVzIHRvIHJlZ2lzdGVyIHdpdGggdGhlIGNsdXN0ZXIuIFRoZSBwYXNzd29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZ2VuZXJhdGVkIHVzaW5nIFNlY3JldHNcbiAgICogTWFuYWdlciBhbmQgdGhlIHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gSlNPTiBvYmplY3Qgc3RvcmVkIGluIFNlY3JldHMgTWFuYWdlciBhcyBgQW1hem9uTVNLX3VzZXJuYW1lYC5cbiAgICpcbiAgICogTXVzdCBiZSB1c2luZyB0aGUgU0FTTC9TQ1JBTSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VybmFtZXMgLSB1c2VybmFtZShzKSB0byByZWdpc3RlciB3aXRoIHRoZSBjbHVzdGVyXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkVXNlciguLi51c2VybmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2FzbFNjcmFtQXV0aGVudGljYXRpb25LZXkpIHtcbiAgICAgIGNvbnN0IE1TS19TRUNSRVRfUFJFRklYID0gJ0FtYXpvbk1TS18nOyAvLyBSZXF1aXJlZFxuICAgICAgY29uc3Qgc2VjcmV0cyA9IHVzZXJuYW1lcy5tYXAoXG4gICAgICAgICh1c2VybmFtZSkgPT5cbiAgICAgICAgICBuZXcgc2VjcmV0c21hbmFnZXIuU2VjcmV0KHRoaXMsIGBLYWZrYVVzZXIke3VzZXJuYW1lfWAsIHtcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IGAke01TS19TRUNSRVRfUFJFRklYfSR7dGhpcy5jbHVzdGVyTmFtZX1fJHt1c2VybmFtZX1gLFxuICAgICAgICAgICAgZ2VuZXJhdGVTZWNyZXRTdHJpbmc6IHtcbiAgICAgICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHsgdXNlcm5hbWUgfSksXG4gICAgICAgICAgICAgIGdlbmVyYXRlU3RyaW5nS2V5OiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXk6IHRoaXMuc2FzbFNjcmFtQXV0aGVudGljYXRpb25LZXksXG4gICAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBuZXcgY3IuQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgYEJhdGNoQXNzb2NpYXRlU2NyYW1TZWNyZXRzJHthZGRyZXNzT2YodXNlcm5hbWVzKX1gLCB7XG4gICAgICAgIG9uVXBkYXRlOiB7XG4gICAgICAgICAgc2VydmljZTogJ0thZmthJyxcbiAgICAgICAgICBhY3Rpb246ICdiYXRjaEFzc29jaWF0ZVNjcmFtU2VjcmV0JyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBDbHVzdGVyQXJuOiB0aGlzLmNsdXN0ZXJBcm4sXG4gICAgICAgICAgICBTZWNyZXRBcm5MaXN0OiBzZWNyZXRzLm1hcCgoc2VjcmV0KSA9PiBzZWNyZXQuc2VjcmV0QXJuKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3IuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKCdDcmVhdGVVc2VycycpLFxuICAgICAgICB9LFxuICAgICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbJ2ttczpDcmVhdGVHcmFudCddLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbdGhpcy5zYXNsU2NyYW1BdXRoZW50aWNhdGlvbktleT8ua2V5QXJuXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbJ2thZmthOkJhdGNoQXNzb2NpYXRlU2NyYW1TZWNyZXQnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW3RoaXMuY2x1c3RlckFybl0sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0pLFxuICAgICAgICBpbnN0YWxsTGF0ZXN0QXdzU2RrOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgY29yZS5WYWxpZGF0aW9uRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgdXNlcnMgaWYgYW4gYXV0aGVudGljYXRpb24gS01TIGtleSBoYXMgbm90IGJlZW4gY3JlYXRlZC9wcm92aWRlZC4nLCB0aGlzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -62,7 +62,7 @@ let ServerlessCluster = (() => {
62
62
  ServerlessCluster = _classThis = _classDescriptor.value;
63
63
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
64
64
  }
65
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.ServerlessCluster", version: "2.221.1-alpha.0" };
65
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-msk-alpha.ServerlessCluster", version: "2.223.0-alpha.0" };
66
66
  /** Uniquely identifies this class. */
67
67
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-msk-alpha.ServerlessCluster';
68
68
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-cdk/aws-msk-alpha",
3
- "version": "2.221.1-alpha.0",
3
+ "version": "2.223.0-alpha.0",
4
4
  "private": false,
5
5
  "description": "The CDK Construct Library for AWS::MSK",
6
6
  "main": "lib/index.js",
@@ -84,18 +84,18 @@
84
84
  },
85
85
  "license": "Apache-2.0",
86
86
  "devDependencies": {
87
- "@aws-cdk/cdk-build-tools": "2.221.1-alpha.0",
87
+ "@aws-cdk/cdk-build-tools": "2.223.0-alpha.0",
88
88
  "@aws-cdk/integ-runner": "^2.190.2",
89
- "@aws-cdk/pkglint": "2.221.1-alpha.0",
89
+ "@aws-cdk/pkglint": "2.223.0-alpha.0",
90
90
  "@types/jest": "^29.5.14",
91
91
  "jest": "^29.7.0",
92
- "aws-cdk-lib": "2.221.1",
92
+ "aws-cdk-lib": "2.223.0",
93
93
  "constructs": "^10.0.0",
94
- "@aws-cdk/integ-tests-alpha": "2.221.1-alpha.0"
94
+ "@aws-cdk/integ-tests-alpha": "2.223.0-alpha.0"
95
95
  },
96
96
  "dependencies": {},
97
97
  "peerDependencies": {
98
- "aws-cdk-lib": "^2.221.1",
98
+ "aws-cdk-lib": "^2.223.0",
99
99
  "constructs": "^10.0.0"
100
100
  },
101
101
  "engines": {