image-scanner-with-trivy 2.0.0 → 2.1.1
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 +24 -5
- package/API.md +22 -0
- package/CONTRIBUTION.md +6 -0
- package/README.md +33 -0
- package/assets/lambda/dist/index.js +9 -8
- package/assets/lambda/index.ts +33 -3
- package/lib/image-scanner-with-trivy.d.ts +14 -0
- package/lib/image-scanner-with-trivy.js +4 -3
- package/lib/types.d.ts +1 -0
- package/lib/types.js +1 -1
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -3962,7 +3962,7 @@
|
|
|
3962
3962
|
},
|
|
3963
3963
|
"name": "image-scanner-with-trivy",
|
|
3964
3964
|
"readme": {
|
|
3965
|
-
"markdown": "# image-scanner-with-trivy\n\n## Detail Pages\n\nThe detail blog is [here](https://dev.to/aws-builders/container-image-scanning-with-trivy-in-aws-cdk-151h).\n\nTo my surprise, this library was featured on the ecosystem page of [Trivy's official documentation](https://aquasecurity.github.io/trivy/latest/ecosystem/ide/#image-scanner-with-trivy-community)!\n\n## What is\n\nThis is an AWS CDK Construct that allows you to **scan container images with Trivy in CDK deployment layer**.\n\nIf it detects vulnerabilities, it can **prevent the image from being pushed to the ECR for the application**.\n\nSince it takes an `imageUri` for ECR as an argument, it can also be used to **simply scan an existing image in the repository**.\n\n## Trivy\n\n[Trivy](https://github.com/aquasecurity/trivy) is a comprehensive and versatile security scanner.\n\n## Usage\n\n### Install\n\n```sh\nnpm install image-scanner-with-trivy\n```\n\n### CDK Code\n\nThe following code is a minimal example.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\n// Add properties you want for trivy options (ignoreUnfixed, severity, scanners, trivyIgnore, etc).\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n});\n\n// By adding `addDependency`, if the vulnerabilities are detected by `ImageScannerWithTrivy`, the following `ECRDeployment` will not be executed, deployment will fail.\nconst ecrDeployment = new ECRDeployment(this, 'DeployImage', {\n src: new DockerImageName(image.imageUri),\n dest: new DockerImageName(`${repository.repositoryUri}:latest`),\n});\necrDeployment.node.addDependency(imageScanner);\n```\n\n### Scan Logs Output\n\nIf you output the scan logs to other than the default log group, you can specify the `scanLogsOutput` option.\n\nThis option is useful when you want to choose where to output the scan logs.\n\nCurrently, CloudWatch Logs is only supported as an output destination.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.cloudWatchLogs` method to specify the log group.\n scanLogsOutput: ScanLogsOutput.cloudWatchLogs({ logGroup: new LogGroup(this, 'LogGroup') }),\n});\n```\n\n### Default Log Group\n\nIf you customize the default log group for Scanner Lambda, you can specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options.\nCurrently, only changing the removal policy and retention days are supported.\n\nIf the default log group is already created in your AWS Account and you specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options, the deployment will fail because of a conflict with the log group name.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Change the default log group removal policy to `Destroy`.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n // Change the default log group retention days to `One Year`.\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n```\n\nIf you use ImageScannerWithTrivy construct multiple times in the same stack, you have to set the same values for `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\nWhen you set the different values for each construct, the first one will be applied to all ImageScannerWithTrivy constructs in the same stack and warning message will be displayed.\n\nThe following code will produce warning message because of the different values of `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are applied to all ImageScannerWithTrivy constructs in the same stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n\n// NG example\n// Once you specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays, you have to set the same values for each construct.\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithDifferentDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are different from the above construct, and warning message will be displayed when synthesizing the stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.RETAIN, // This should be `RemovalPolicy.DESTROY` as the above construct.\n defaultLogGroupRetentionDays: RetentionDays.ONE_MONTH, // This should be `RetentionDays.ONE_YEAR` as the above construct.\n});\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithNoDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // You should specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays if you have already set the values.\n});\n```\n\n## API Reference\n\nAPI Reference is [here](./API.md#api-reference-).\n"
|
|
3965
|
+
"markdown": "# image-scanner-with-trivy\n\n## Detail Pages\n\nThe detail blog is [here](https://dev.to/aws-builders/container-image-scanning-with-trivy-in-aws-cdk-151h).\n\nTo my surprise, this library was featured on the ecosystem page of [Trivy's official documentation](https://aquasecurity.github.io/trivy/latest/ecosystem/ide/#image-scanner-with-trivy-community)!\n\n## What is\n\nThis is an AWS CDK Construct that allows you to **scan container images with Trivy in CDK deployment layer**.\n\nIf it detects vulnerabilities, it can **prevent the image from being pushed to the ECR for the application**.\n\nSince it takes an `imageUri` for ECR as an argument, it can also be used to **simply scan an existing image in the repository**.\n\n## Trivy\n\n[Trivy](https://github.com/aquasecurity/trivy) is a comprehensive and versatile security scanner.\n\n## Usage\n\n### Install\n\n```sh\nnpm install image-scanner-with-trivy\n```\n\n### CDK Code\n\nThe following code is a minimal example.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\n// Add properties you want for trivy options (ignoreUnfixed, severity, scanners, trivyIgnore, etc).\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n});\n\n// By adding `addDependency`, if the vulnerabilities are detected by `ImageScannerWithTrivy`, the following `ECRDeployment` will not be executed, deployment will fail.\nconst ecrDeployment = new ECRDeployment(this, 'DeployImage', {\n src: new DockerImageName(image.imageUri),\n dest: new DockerImageName(`${repository.repositoryUri}:latest`),\n});\necrDeployment.node.addDependency(imageScanner);\n```\n\n### Scan Logs Output\n\nIf you output the scan logs to other than the default log group, you can specify the `scanLogsOutput` option.\n\nThis option is useful when you want to choose where to output the scan logs.\n\nCurrently, CloudWatch Logs is only supported as an output destination.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nconst imageScanner = new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.cloudWatchLogs` method to specify the log group.\n scanLogsOutput: ScanLogsOutput.cloudWatchLogs({ logGroup: new LogGroup(this, 'LogGroup') }),\n});\n```\n\n### Default Log Group\n\nIf you customize the default log group for Scanner Lambda, you can specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options.\nCurrently, only changing the removal policy and retention days are supported.\n\nIf the default log group is already created in your AWS Account and you specify the `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` options, the deployment will fail because of a conflict with the log group name.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Change the default log group removal policy to `Destroy`.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n // Change the default log group retention days to `One Year`.\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n```\n\nIf you use ImageScannerWithTrivy construct multiple times in the same stack, you have to set the same values for `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\nWhen you set the different values for each construct, the first one will be applied to all ImageScannerWithTrivy constructs in the same stack and warning message will be displayed.\n\nThe following code will produce warning message because of the different values of `defaultLogGroupRemovalPolicy` and `defaultLogGroupRetentionDays` for each construct.\n\n```ts\nimport { ImageScannerWithTrivy, ScanLogsOutput } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are applied to all ImageScannerWithTrivy constructs in the same stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n defaultLogGroupRetentionDays: RetentionDays.ONE_YEAR,\n});\n\n// NG example\n// Once you specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays, you have to set the same values for each construct.\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithDifferentDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // The following options are different from the above construct, and warning message will be displayed when synthesizing the stack.\n defaultLogGroupRemovalPolicy: RemovalPolicy.RETAIN, // This should be `RemovalPolicy.DESTROY` as the above construct.\n defaultLogGroupRetentionDays: RetentionDays.ONE_MONTH, // This should be `RetentionDays.ONE_YEAR` as the above construct.\n});\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithNoDefaultLogGroupOptions', {\n imageUri: image.imageUri,\n repository: image.repository,\n // You should specify the defaultLogGroupRemovalPolicy and defaultLogGroupRetentionDays if you have already set the values.\n});\n```\n\n### Rollback Error Suppression\n\nBy default, the `suppressErrorOnRollback` property is set to `true`.\n\nWhen image scanning fails, CloudFormation triggers a rollback and executes the previous version\nof the scanner Lambda. If this property is set to `true`, the previous version of the scanner\nLambda will not throw an error, even if the image scanning for the previous version fails.\n\nThis allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state\nwhen image scanning failures occur.\n\n```ts\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\nconst repository = new Repository(this, 'ImageRepository', {\n removalPolicy: RemovalPolicy.DESTROY,\n autoDeleteImages: true,\n});\n\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\nnew ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Default is true - suppress errors during rollback to prevent ROLLBACK_FAILED\n suppressErrorOnRollback: true,\n // Set to false if you want rollback errors to be thrown\n suppressErrorOnRollback: false,\n});\n```\n\n## API Reference\n\nAPI Reference is [here](./API.md#api-reference-).\n"
|
|
3966
3966
|
},
|
|
3967
3967
|
"repository": {
|
|
3968
3968
|
"type": "git",
|
|
@@ -4088,7 +4088,7 @@
|
|
|
4088
4088
|
},
|
|
4089
4089
|
"locationInModule": {
|
|
4090
4090
|
"filename": "src/image-scanner-with-trivy.ts",
|
|
4091
|
-
"line":
|
|
4091
|
+
"line": 330
|
|
4092
4092
|
},
|
|
4093
4093
|
"parameters": [
|
|
4094
4094
|
{
|
|
@@ -4114,7 +4114,7 @@
|
|
|
4114
4114
|
"kind": "class",
|
|
4115
4115
|
"locationInModule": {
|
|
4116
4116
|
"filename": "src/image-scanner-with-trivy.ts",
|
|
4117
|
-
"line":
|
|
4117
|
+
"line": 329
|
|
4118
4118
|
},
|
|
4119
4119
|
"name": "ImageScannerWithTrivy",
|
|
4120
4120
|
"symbolId": "src/image-scanner-with-trivy:ImageScannerWithTrivy"
|
|
@@ -4396,6 +4396,25 @@
|
|
|
4396
4396
|
}
|
|
4397
4397
|
}
|
|
4398
4398
|
},
|
|
4399
|
+
{
|
|
4400
|
+
"abstract": true,
|
|
4401
|
+
"docs": {
|
|
4402
|
+
"default": "true",
|
|
4403
|
+
"remarks": "When image scanning fails, CloudFormation triggers a rollback and executes the previous\nversion of the scanner Lambda. If this property is set to `true`, the previous version of\nthe scanner Lambda will not throw an error, even if the image scanning for the previous version\nfails.\n\nThis allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state\nwhen image scanning failures occur.",
|
|
4404
|
+
"stability": "stable",
|
|
4405
|
+
"summary": "Suppress errors during rollback scanner Lambda execution."
|
|
4406
|
+
},
|
|
4407
|
+
"immutable": true,
|
|
4408
|
+
"locationInModule": {
|
|
4409
|
+
"filename": "src/image-scanner-with-trivy.ts",
|
|
4410
|
+
"line": 323
|
|
4411
|
+
},
|
|
4412
|
+
"name": "suppressErrorOnRollback",
|
|
4413
|
+
"optional": true,
|
|
4414
|
+
"type": {
|
|
4415
|
+
"primitive": "boolean"
|
|
4416
|
+
}
|
|
4417
|
+
},
|
|
4399
4418
|
{
|
|
4400
4419
|
"abstract": true,
|
|
4401
4420
|
"docs": {
|
|
@@ -4645,6 +4664,6 @@
|
|
|
4645
4664
|
"symbolId": "src/image-scanner-with-trivy:Severity"
|
|
4646
4665
|
}
|
|
4647
4666
|
},
|
|
4648
|
-
"version": "2.
|
|
4649
|
-
"fingerprint": "
|
|
4667
|
+
"version": "2.1.1",
|
|
4668
|
+
"fingerprint": "UxJGqLDdTlaUSu2uNRizQj8PQSz6boH8jdb01Unk+3s="
|
|
4650
4669
|
}
|
package/API.md
CHANGED
|
@@ -203,6 +203,7 @@ const imageScannerWithTrivyProps: ImageScannerWithTrivyProps = { ... }
|
|
|
203
203
|
| <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.scanLogsOutput">scanLogsOutput</a></code> | <code><a href="#image-scanner-with-trivy.ScanLogsOutput">ScanLogsOutput</a></code> | Configuration for scan logs output. |
|
|
204
204
|
| <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.scanners">scanners</a></code> | <code><a href="#image-scanner-with-trivy.Scanners">Scanners</a>[]</code> | Enable/Disable Scanners. |
|
|
205
205
|
| <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.severity">severity</a></code> | <code><a href="#image-scanner-with-trivy.Severity">Severity</a>[]</code> | Severity Selection. |
|
|
206
|
+
| <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.suppressErrorOnRollback">suppressErrorOnRollback</a></code> | <code>boolean</code> | Suppress errors during rollback scanner Lambda execution. |
|
|
206
207
|
| <code><a href="#image-scanner-with-trivy.ImageScannerWithTrivyProps.property.trivyIgnore">trivyIgnore</a></code> | <code>string[]</code> | By Finding IDs. |
|
|
207
208
|
|
|
208
209
|
---
|
|
@@ -448,6 +449,27 @@ It defaults to `CRITICAL` IN THIS CONSTRUCT for safety in CI/CD, but the default
|
|
|
448
449
|
|
|
449
450
|
---
|
|
450
451
|
|
|
452
|
+
##### `suppressErrorOnRollback`<sup>Optional</sup> <a name="suppressErrorOnRollback" id="image-scanner-with-trivy.ImageScannerWithTrivyProps.property.suppressErrorOnRollback"></a>
|
|
453
|
+
|
|
454
|
+
```typescript
|
|
455
|
+
public readonly suppressErrorOnRollback: boolean;
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
- *Type:* boolean
|
|
459
|
+
- *Default:* true
|
|
460
|
+
|
|
461
|
+
Suppress errors during rollback scanner Lambda execution.
|
|
462
|
+
|
|
463
|
+
When image scanning fails, CloudFormation triggers a rollback and executes the previous
|
|
464
|
+
version of the scanner Lambda. If this property is set to `true`, the previous version of
|
|
465
|
+
the scanner Lambda will not throw an error, even if the image scanning for the previous version
|
|
466
|
+
fails.
|
|
467
|
+
|
|
468
|
+
This allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state
|
|
469
|
+
when image scanning failures occur.
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
451
473
|
##### `trivyIgnore`<sup>Optional</sup> <a name="trivyIgnore" id="image-scanner-with-trivy.ImageScannerWithTrivyProps.property.trivyIgnore"></a>
|
|
452
474
|
|
|
453
475
|
```typescript
|
package/CONTRIBUTION.md
CHANGED
package/README.md
CHANGED
|
@@ -154,6 +154,39 @@ new ImageScannerWithTrivy(this, 'ImageScannerWithTrivyWithNoDefaultLogGroupOptio
|
|
|
154
154
|
});
|
|
155
155
|
```
|
|
156
156
|
|
|
157
|
+
### Rollback Error Suppression
|
|
158
|
+
|
|
159
|
+
By default, the `suppressErrorOnRollback` property is set to `true`.
|
|
160
|
+
|
|
161
|
+
When image scanning fails, CloudFormation triggers a rollback and executes the previous version
|
|
162
|
+
of the scanner Lambda. If this property is set to `true`, the previous version of the scanner
|
|
163
|
+
Lambda will not throw an error, even if the image scanning for the previous version fails.
|
|
164
|
+
|
|
165
|
+
This allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state
|
|
166
|
+
when image scanning failures occur.
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
import { ImageScannerWithTrivy } from 'image-scanner-with-trivy';
|
|
170
|
+
|
|
171
|
+
const repository = new Repository(this, 'ImageRepository', {
|
|
172
|
+
removalPolicy: RemovalPolicy.DESTROY,
|
|
173
|
+
autoDeleteImages: true,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const image = new DockerImageAsset(this, 'DockerImage', {
|
|
177
|
+
directory: resolve(__dirname, './'),
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
new ImageScannerWithTrivy(this, 'ImageScannerWithTrivy', {
|
|
181
|
+
imageUri: image.imageUri,
|
|
182
|
+
repository: image.repository,
|
|
183
|
+
// Default is true - suppress errors during rollback to prevent ROLLBACK_FAILED
|
|
184
|
+
suppressErrorOnRollback: true,
|
|
185
|
+
// Set to false if you want rollback errors to be thrown
|
|
186
|
+
suppressErrorOnRollback: false,
|
|
187
|
+
});
|
|
188
|
+
```
|
|
189
|
+
|
|
157
190
|
## API Reference
|
|
158
191
|
|
|
159
192
|
API Reference is [here](./API.md#api-reference-).
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
"use strict";var g=Object.defineProperty;var
|
|
2
|
-
Signal: ${
|
|
3
|
-
Status: ${
|
|
4
|
-
Image Scanner returned fatal errors. You may have vulnerabilities. See logs
|
|
5
|
-
`);(
|
|
1
|
+
"use strict";var g=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var h=(e,t)=>{for(var n in t)g(e,n,{get:t[n],enumerable:!0})},L=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of C(t))!O.call(e,r)&&r!==n&&g(e,r,{get:()=>t[r],enumerable:!(o=y(t,r))||o.enumerable});return e};var R=e=>L(g({},"__esModule",{value:!0}),e);var b={};h(b,{handler:()=>k});module.exports=R(b);var d=require("child_process"),p=require("fs"),a=require("@aws-sdk/client-cloudwatch-logs"),c=require("@aws-sdk/client-cloudformation");var S="/tmp/.trivyignore",m=new a.CloudWatchLogsClient,w=new c.CloudFormationClient,k=async function(e){let t=e.RequestType,n=e.ResourceProperties;if(!n.addr||!n.imageUri)throw new Error("addr and imageUri are required.");let o={PhysicalResourceId:n.addr,Data:{}};if(t==="Create"||t==="Update"){let r=$(n);n.trivyIgnore.length&&(console.log("trivyignore: "+JSON.stringify(n.trivyIgnore)),x(n.trivyIgnore));let i=`/opt/trivy image --no-progress ${r.join(" ")} ${n.imageUri}`;console.log("command: "+i),console.log("imageUri: "+n.imageUri);let s=(0,d.spawnSync)(i,{shell:!0});if(await E(s,n.imageUri,n.output),s.status===0)return o;let u=`Error: ${s.error}
|
|
2
|
+
Signal: ${s.signal}
|
|
3
|
+
Status: ${s.status}
|
|
4
|
+
Image Scanner returned fatal errors. You may have vulnerabilities. See logs.`;if(n.suppressErrorOnRollback==="true"&&await I(e.StackId))return console.log(`Vulnerabilities may be detected, but suppressing errors during rollback (suppressErrorOnRollback=true).
|
|
5
|
+
${u}`),o;throw new Error(u)}return o},$=e=>{let t=[];return e.ignoreUnfixed==="true"&&t.push("--ignore-unfixed"),e.severity.length&&t.push(`--severity ${e.severity.join(",")}`),e.scanners.length&&t.push(`--scanners ${e.scanners.join(",")}`),e.imageConfigScanners.length&&t.push(`--image-config-scanners ${e.imageConfigScanners.join(",")}`),e.exitCode&&t.push(`--exit-code ${e.exitCode}`),e.exitOnEol&&t.push(`--exit-on-eol ${e.exitOnEol}`),e.trivyIgnore.length&&t.push(`--ignorefile ${S}`),e.platform&&t.push(`--platform ${e.platform}`),t},x=e=>{let t=e.join(`
|
|
6
|
+
`);(0,p.writeFileSync)(S,t,"utf-8")},E=async(e,t,n)=>{switch(n?.type){case"cloudWatchLogs":await v(e,n,t);break;default:console.log(`stderr:
|
|
6
7
|
`+e.stderr.toString()),console.log(`stdout:
|
|
7
|
-
`+e.stdout.toString())}},v=async(e,t,n)=>{let[
|
|
8
|
-
`+e.stderr.toString()},{timestamp:
|
|
9
|
-
`+e.stdout.toString()}]},
|
|
8
|
+
`+e.stdout.toString())}},v=async(e,t,n)=>{let[o,r]=n.split(":"),i=r?`uri=${o},tag=${r}`:`uri=${o}`;try{await m.send(new a.CreateLogStreamCommand({logGroupName:t.logGroupName,logStreamName:i}))}catch(l){if(l instanceof a.ResourceAlreadyExistsException)console.log(`Log stream ${i} already exists in log group ${t.logGroupName}.`);else throw l}let s=new Date().getTime(),u={logGroupName:t.logGroupName,logStreamName:i,logEvents:[{timestamp:s,message:`stderr:
|
|
9
|
+
`+e.stderr.toString()},{timestamp:s,message:`stdout:
|
|
10
|
+
`+e.stdout.toString()}]},f=new a.PutLogEventsCommand(u);await m.send(f),console.log(`Scan logs output to the log group: ${t.logGroupName}, log stream: ${i}`)},I=async e=>{let t=new c.DescribeStacksCommand({StackName:e}),n=await w.send(t);if(n.Stacks&&n.Stacks.length>0)return n.Stacks[0].StackStatus===c.ResourceStatus.ROLLBACK_IN_PROGRESS;throw new Error(`Stack not found or no stacks returned from DescribeStacks command, stackId: ${e}`)};0&&(module.exports={handler});
|
package/assets/lambda/index.ts
CHANGED
|
@@ -7,6 +7,11 @@ import {
|
|
|
7
7
|
PutLogEventsCommandInput,
|
|
8
8
|
ResourceAlreadyExistsException,
|
|
9
9
|
} from '@aws-sdk/client-cloudwatch-logs';
|
|
10
|
+
import {
|
|
11
|
+
CloudFormationClient,
|
|
12
|
+
DescribeStacksCommand,
|
|
13
|
+
ResourceStatus,
|
|
14
|
+
} from '@aws-sdk/client-cloudformation';
|
|
10
15
|
import { CdkCustomResourceHandler, CdkCustomResourceResponse } from 'aws-lambda';
|
|
11
16
|
import {
|
|
12
17
|
ScanLogsOutputOptions,
|
|
@@ -18,6 +23,7 @@ import {
|
|
|
18
23
|
const TRIVY_IGNORE_FILE_PATH = '/tmp/.trivyignore';
|
|
19
24
|
|
|
20
25
|
const cwClient = new CloudWatchLogsClient();
|
|
26
|
+
const cfnClient = new CloudFormationClient();
|
|
21
27
|
|
|
22
28
|
export const handler: CdkCustomResourceHandler = async function (event) {
|
|
23
29
|
const requestType = event.RequestType;
|
|
@@ -48,10 +54,18 @@ export const handler: CdkCustomResourceHandler = async function (event) {
|
|
|
48
54
|
|
|
49
55
|
await outputScanLogs(response, props.imageUri, props.output);
|
|
50
56
|
|
|
51
|
-
if (response.status
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
if (response.status === 0) return funcResponse;
|
|
58
|
+
|
|
59
|
+
const errorMessage = `Error: ${response.error}\nSignal: ${response.signal}\nStatus: ${response.status}\nImage Scanner returned fatal errors. You may have vulnerabilities. See logs.`;
|
|
60
|
+
|
|
61
|
+
if (props.suppressErrorOnRollback === 'true' && (await isRollbackInProgress(event.StackId))) {
|
|
62
|
+
console.log(
|
|
63
|
+
`Vulnerabilities may be detected, but suppressing errors during rollback (suppressErrorOnRollback=true).\n${errorMessage}`,
|
|
54
64
|
);
|
|
65
|
+
return funcResponse;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
throw new Error(errorMessage);
|
|
55
69
|
}
|
|
56
70
|
|
|
57
71
|
return funcResponse;
|
|
@@ -145,3 +159,19 @@ const outputScanLogsToCWLogs = async (
|
|
|
145
159
|
`Scan logs output to the log group: ${output.logGroupName}, log stream: ${logStreamName}`,
|
|
146
160
|
);
|
|
147
161
|
};
|
|
162
|
+
|
|
163
|
+
const isRollbackInProgress = async (stackId: string): Promise<boolean> => {
|
|
164
|
+
const command = new DescribeStacksCommand({
|
|
165
|
+
StackName: stackId,
|
|
166
|
+
});
|
|
167
|
+
const response = await cfnClient.send(command);
|
|
168
|
+
|
|
169
|
+
if (response.Stacks && response.Stacks.length > 0) {
|
|
170
|
+
const stackStatus = response.Stacks[0].StackStatus;
|
|
171
|
+
return stackStatus === ResourceStatus.ROLLBACK_IN_PROGRESS;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
throw new Error(
|
|
175
|
+
`Stack not found or no stacks returned from DescribeStacks command, stackId: ${stackId}`,
|
|
176
|
+
);
|
|
177
|
+
};
|
|
@@ -236,6 +236,20 @@ export interface ImageScannerWithTrivyProps {
|
|
|
236
236
|
* @default - scan logs output to default log group created by Scanner Lambda(`/aws/lambda/${functionName}`)
|
|
237
237
|
*/
|
|
238
238
|
readonly scanLogsOutput?: ScanLogsOutput;
|
|
239
|
+
/**
|
|
240
|
+
* Suppress errors during rollback scanner Lambda execution
|
|
241
|
+
*
|
|
242
|
+
* When image scanning fails, CloudFormation triggers a rollback and executes the previous
|
|
243
|
+
* version of the scanner Lambda. If this property is set to `true`, the previous version of
|
|
244
|
+
* the scanner Lambda will not throw an error, even if the image scanning for the previous version
|
|
245
|
+
* fails.
|
|
246
|
+
*
|
|
247
|
+
* This allows the rollback to complete successfully, avoiding ROLLBACK_FAILED state
|
|
248
|
+
* when image scanning failures occur.
|
|
249
|
+
*
|
|
250
|
+
* @default true
|
|
251
|
+
*/
|
|
252
|
+
readonly suppressErrorOnRollback?: boolean;
|
|
239
253
|
}
|
|
240
254
|
export declare class ImageScannerWithTrivy extends Construct {
|
|
241
255
|
constructor(scope: Construct, id: string, props: ImageScannerWithTrivyProps);
|
|
@@ -59,7 +59,7 @@ class ScanLogsOutput {
|
|
|
59
59
|
}
|
|
60
60
|
exports.ScanLogsOutput = ScanLogsOutput;
|
|
61
61
|
_a = JSII_RTTI_SYMBOL_1;
|
|
62
|
-
ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.
|
|
62
|
+
ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.1.1" };
|
|
63
63
|
class CloudWatchLogsOutput extends ScanLogsOutput {
|
|
64
64
|
constructor(options) {
|
|
65
65
|
super();
|
|
@@ -125,6 +125,7 @@ class ImageScannerWithTrivy extends constructs_1.Construct {
|
|
|
125
125
|
trivyIgnore: props.trivyIgnore ?? [],
|
|
126
126
|
platform: props.platform ?? '',
|
|
127
127
|
output: props.scanLogsOutput?.bind(customResourceLambda),
|
|
128
|
+
suppressErrorOnRollback: String(props.suppressErrorOnRollback ?? true),
|
|
128
129
|
};
|
|
129
130
|
new aws_cdk_lib_1.CustomResource(this, 'Resource', {
|
|
130
131
|
resourceType: 'Custom::ImageScannerWithTrivy',
|
|
@@ -181,5 +182,5 @@ class ImageScannerWithTrivy extends constructs_1.Construct {
|
|
|
181
182
|
}
|
|
182
183
|
exports.ImageScannerWithTrivy = ImageScannerWithTrivy;
|
|
183
184
|
_b = JSII_RTTI_SYMBOL_1;
|
|
184
|
-
ImageScannerWithTrivy[_b] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltYWdlLXNjYW5uZXItd2l0aC10cml2eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUE0QjtBQUM1Qiw2Q0FTcUI7QUFFckIsK0RBQXNEO0FBRXRELHVEQU1nQztBQUNoQyxtREFBdUY7QUFDdkYsbUVBQXdEO0FBQ3hELDJDQUF1QztBQUN2QyxtQ0FLaUI7QUFFakI7Ozs7R0FJRztBQUNILElBQVksUUFNWDtBQU5ELFdBQVksUUFBUTtJQUNsQiwrQkFBbUIsQ0FBQTtJQUNuQix1QkFBVyxDQUFBO0lBQ1gsNkJBQWlCLENBQUE7SUFDakIseUJBQWEsQ0FBQTtJQUNiLGlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFOVyxRQUFRLHdCQUFSLFFBQVEsUUFNbkI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2xCLHlCQUFhLENBQUE7SUFDYiw2QkFBaUIsQ0FBQTtJQUNqQiw2QkFBaUIsQ0FBQTtJQUNqQiwrQkFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsUUFBUSx3QkFBUixRQUFRLFFBS25CO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksbUJBR1g7QUFIRCxXQUFZLG1CQUFtQjtJQUM3Qix3Q0FBaUIsQ0FBQTtJQUNqQix3Q0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBSFcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFHOUI7QUFZRDs7R0FFRztBQUNILE1BQXNCLGNBQWM7SUFDbEM7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQWtDO1FBQzdELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDOztBQU5ILHdDQVlDOzs7QUFFRCxNQUFNLG9CQUFxQixTQUFRLGNBQWM7SUFNL0MsWUFBWSxPQUFrQztRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElB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SyxTQUFTLENBQUM7WUFDdEM7Z0JBQ0UsT0FBTyxhQUE2QixDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDOztBQS9JSCxzREFnSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBBbm5vdGF0aW9ucyxcbiAgQ2ZuRGVsZXRpb25Qb2xpY3ksXG4gIEN1c3RvbVJlc291cmNlLFxuICBEdXJhdGlvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU2l6ZSxcbiAgU3RhY2ssXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBJR3JhbnRhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge1xuICBBcmNoaXRlY3R1cmUsXG4gIEFzc2V0Q29kZSxcbiAgSGFuZGxlcixcbiAgUnVudGltZSxcbiAgU2luZ2xldG9uRnVuY3Rpb24sXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ2ZuTG9nR3JvdXAsIElMb2dHcm91cCwgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBDbG91ZFdhdGNoTG9nc091dHB1dE9wdGlvbnMsXG4gIFNjYW5Mb2dzT3V0cHV0T3B0aW9ucyxcbiAgU2NhbkxvZ3NPdXRwdXRUeXBlLFxuICBTY2FubmVyQ3VzdG9tUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRW51bSBmb3IgU2V2ZXJpdHkgU2VsZWN0aW9uXG4gKlxuICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyNzZXZlcml0eS1zZWxlY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gU2V2ZXJpdHkge1xuICBVTktOT1dOID0gJ1VOS05PV04nLFxuICBMT1cgPSAnTE9XJyxcbiAgTUVESVVNID0gJ01FRElVTScsXG4gIEhJR0ggPSAnSElHSCcsXG4gIENSSVRJQ0FMID0gJ0NSSVRJQ0FMJyxcbn1cblxuLyoqXG4gKiBFbnVtIGZvciBTY2FubmVyc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNlbmFibGVkaXNhYmxlLXNjYW5uZXJzXG4gKi9cbmV4cG9ydCBlbnVtIFNjYW5uZXJzIHtcbiAgVlVMTiA9ICd2dWxuJyxcbiAgQ09ORklHID0gJ2NvbmZpZycsXG4gIFNFQ1JFVCA9ICdzZWNyZXQnLFxuICBMSUNFTlNFID0gJ2xpY2Vuc2UnLFxufVxuXG4vKipcbiAqIEVudW0gZm9yIEltYWdlQ29uZmlnU2Nhbm5lcnNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy90YXJnZXQvY29udGFpbmVyX2ltYWdlLyNjb250YWluZXItaW1hZ2UtbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGVudW0gSW1hZ2VDb25maWdTY2FubmVycyB7XG4gIENPTkZJRyA9ICdjb25maWcnLFxuICBTRUNSRVQgPSAnc2VjcmV0Jyxcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzY2FuIGxvZ3Mgb3V0cHV0IHRvIENsb3VkV2F0Y2ggTG9ncyBsb2cgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ3NPdXRwdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbG9nIGdyb3VwIHRvIG91dHB1dCBzY2FuIGxvZ3MuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cDogSUxvZ0dyb3VwO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG91dHB1dCBvZiB0aGUgc2NhbiBsb2dzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2NhbkxvZ3NPdXRwdXQge1xuICAvKipcbiAgICogU2NhbiBsb2dzIG91dHB1dCB0byBDbG91ZFdhdGNoIExvZ3MgbG9nIGdyb3VwLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbG91ZFdhdGNoTG9ncyhvcHRpb25zOiBDbG91ZFdhdGNoTG9nc091dHB1dFByb3BzKTogU2NhbkxvZ3NPdXRwdXQge1xuICAgIHJldHVybiBuZXcgQ2xvdWRXYXRjaExvZ3NPdXRwdXQob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncy5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKGdyYW50ZWU6IElHcmFudGFibGUpOiBTY2FuTG9nc091dHB1dE9wdGlvbnM7XG59XG5cbmNsYXNzIENsb3VkV2F0Y2hMb2dzT3V0cHV0IGV4dGVuZHMgU2NhbkxvZ3NPdXRwdXQge1xuICAvKipcbiAgICogVGhlIGxvZyBncm91cCB0byBvdXRwdXQgc2NhbiBsb2dzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dHcm91cDogSUxvZ0dyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENsb3VkV2F0Y2hMb2dzT3V0cHV0UHJvcHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5sb2dHcm91cCA9IG9wdGlvbnMubG9nR3JvdXA7XG4gIH1cblxuICBwdWJsaWMgYmluZChncmFudGVlOiBJR3JhbnRhYmxlKTogQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zIHtcbiAgICAvLyBNb3N0IExhbWJkYXMgYXJlIGdyYW50ZWQgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGFuZCBjYW4gd3JpdGUgdG8gYW55IENsb3VkV2F0Y2ggTG9ncy5cbiAgICAvLyBIb3dldmVyLCBqdXN0IGluIGNhc2UgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGlzIG5vdCBncmFudGVkLCBhbGxvdyB3cml0aW5nIHRvIENsb3VkV2F0Y2ggTG9ncy5cbiAgICB0aGlzLmxvZ0dyb3VwLmdyYW50V3JpdGUoZ3JhbnRlZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogU2NhbkxvZ3NPdXRwdXRUeXBlLkNMT1VEV0FUQ0hfTE9HUyxcbiAgICAgIGxvZ0dyb3VwTmFtZTogdGhpcy5sb2dHcm91cC5sb2dHcm91cE5hbWUsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzIHtcbiAgLyoqXG4gICAqIEltYWdlIFVSSSBmb3Igc2NhbiB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSBpbWFnZVVyaTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IGluY2x1ZGluZyB0aGUgaW1hZ2UgVVJJIGZvciBzY2FuIHRhcmdldC5cbiAgICpcbiAgICogQmVjYXVzZSBvZiBncmFudFB1bGwgdG8gQ3VzdG9tUmVzb3VyY2VMYW1iZGEuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogVGhlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcyBtZWFuIHRoYXQgdGhlIHBhdGNoIGhhcyBub3QgeWV0IGJlZW4gcHJvdmlkZWQgb24gdGhlaXIgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBUbyBoaWRlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGAtLWlnbm9yZS11bmZpeGVkYCBmbGFnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9zY2FubmVyL3Z1bG5lcmFiaWxpdHkvI3VuZml4ZWQtdnVsbmVyYWJpbGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVVbmZpeGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V2ZXJpdHkgU2VsZWN0aW9uXG4gICAqXG4gICAqIFRoZSBzZXZlcml0eSBpcyB0YWtlbiBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNvdXJjZSBzaW5jZSB0aGUgc2V2ZXJpdHkgZnJvbSB2ZW5kb3JzIGlzIG1vcmUgYWNjdXJhdGUuXG4gICAqIFVzaW5nIENWRS0yMDIzLTA0NjQgYXMgYW4gZXhhbXBsZSwgd2hpbGUgaXQgaXMgcmF0ZWQgYXMgXCJISUdIXCIgaW4gTlZELCBSZWQgSGF0IGhhcyBtYXJrZWQgaXRzICdJbXBhY3QnIGFzIFwiTG93XCIuIEFzIGEgcmVzdWx0LCBUcml2eSB3aWxsIGRpc3BsYXkgaXQgYXMgXCJMb3dcIi5cbiAgICpcbiAgICogVGhlIHNldmVyaXR5IGRlcGVuZHMgb24gdGhlIGNvbXBpbGUgb3B0aW9uLCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBldGMuIE5WRCBkb2Vzbid0IGtub3cgaG93IHRoZSB2ZW5kb3IgZGlzdHJpYnV0ZXMgdGhlIHNvZnR3YXJlLlxuICAgKiBSZWQgSGF0IGV2YWx1YXRlcyB0aGUgc2V2ZXJpdHkgbW9yZSBhY2N1cmF0ZWx5LiBUaGF0J3Mgd2h5IFRyaXZ5IHByZWZlcnMgdmVuZG9yIHNjb3JlcyBvdmVyIE5WRC5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gYENSSVRJQ0FMYCBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELCBidXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBUcml2eSBpcyBcIkNSSVRJQ0FMLEhJR0gsTUVESVVNLExPVyxVTktOT1dOXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtTZXZlcml0eS5DUklUSUNBTF1cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyNzZXZlcml0eS1zZWxlY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHNldmVyaXR5PzogU2V2ZXJpdHlbXTtcblxuICAvKipcbiAgICogRW5hYmxlL0Rpc2FibGUgU2Nhbm5lcnNcbiAgICpcbiAgICogWW91IGNhbiBlbmFibGUvZGlzYWJsZSBzY2FubmVycyB3aXRoIHRoZSBgc2Nhbm5lcnNgLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgY29udGFpbmVyIGltYWdlIHNjYW5uaW5nIGVuYWJsZXMgdnVsbmVyYWJpbGl0eSAoVlVMTikgYW5kIHNlY3JldCBzY2FubmVycyAoU0VDUkVUKSBieSBkZWZhdWx0LlxuICAgKiBJZiB5b3UgZG9uJ3QgbmVlZCBzZWNyZXQgc2Nhbm5pbmcsIGl0IGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIFNjYW5uZXJzLlZVTE4gb25seS5cbiAgICpcbiAgICogQGRlZmF1bHQgW1NlY3VyaXR5LlZVTE4sU2Nhbm5lcnMuU0VDUkVUXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9jb25maWd1cmF0aW9uL290aGVycy8jZW5hYmxlZGlzYWJsZS1zY2FubmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgc2Nhbm5lcnM/OiBTY2FubmVyc1tdO1xuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBJbWFnZUNvbmZpZ1NjYW5uZXJzXG4gICAqXG4gICAqIENvbnRhaW5lciBpbWFnZXMgaGF2ZSBjb25maWd1cmF0aW9uLiBkb2NrZXIgaW5zcGVjdCBhbmQgYGRvY2tlciBoaXN0b3J5YCBzaG93IHRoZSBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqIFRyaXZ5IHNjYW5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGNvbnRhaW5lciBpbWFnZXMgZm9yXG4gICAqXG4gICAqIC0gTWlzY29uZmlndXJhdGlvbnNcbiAgICogLSBTZWNyZXRzXG4gICAqXG4gICAqIFRoZXkgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gZW5hYmxlIHRoZW0gd2l0aCBgaW1hZ2VDb25maWdTY2FubmVyc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3RhcmdldC9jb250YWluZXJfaW1hZ2UvI2NvbnRhaW5lci1pbWFnZS1tZXRhZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VDb25maWdTY2FubmVycz86IEltYWdlQ29uZmlnU2Nhbm5lcnNbXTtcblxuICAvKipcbiAgICogRXhpdCBDb2RlXG4gICAqXG4gICAqIFVzZSB0aGUgYGV4aXRDb2RlYCBvcHRpb24gaWYgeW91IHdhbnQgdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlLlxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgMCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZXhpdCBldmVuIHdoZW4gdnVsbmVyYWJpbGl0aWVzIGFyZSBkZXRlY3RlZC5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gMSBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtY29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdENvZGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEV4aXQgb24gRU9MXG4gICAqXG4gICAqIFNvbWV0aW1lcyB5b3UgbWF5IHN1cnByaXNpbmdseSBnZXQgMCB2dWxuZXJhYmlsaXRpZXMgaW4gYW4gb2xkIGltYWdlOlxuICAgKiAgLSBFbmFibGluZyAtLWlnbm9yZS11bmZpeGVkIG9wdGlvbiB3aGlsZSBhbGwgcGFja2FnZXMgaGF2ZSBubyBmaXhlZCB2ZXJzaW9ucy5cbiAgICogIC0gU2Nhbm5pbmcgYSByYXRoZXIgb3V0ZGF0ZWQgT1MgKGUuZy4gVWJ1bnR1IDEwLjA0KS5cbiAgICpcbiAgICogQW4gT1MgYXQgdGhlIGVuZCBvZiBzZXJ2aWNlL2xpZmUgKEVPTCkgdXN1YWxseSBnZXRzIGludG8gdGhpcyBzaXR1YXRpb24sIHdoaWNoIGlzIGRlZmluaXRlbHkgZnVsbCBvZiB2dWxuZXJhYmlsaXRpZXMuXG4gICAqIGBleGl0T25Fb2xgIGNhbiBmYWlsIHNjYW5uaW5nIG9uIEVPTCBPUyB3aXRoIGEgbm9uLXplcm8gY29kZS5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gMSBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtb24tZW9sXG4gICAqL1xuICByZWFkb25seSBleGl0T25Fb2w/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ5IEZpbmRpbmcgSURzXG4gICAqXG4gICAqIFRoZSBpZ25vcmUgcnVsZXMgd3JpdHRlbiB0byB0aGUgLnRyaXZ5aWdub3JlIGluIHRyaXZ5LlxuICAgKiBQdXQgZWFjaCBsaW5lIHlvdSB3cml0ZSBpbiB0aGUgZmlsZSBpbnRvIG9uZSBlbGVtZW50IG9mIHRoZSBhcnJheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICAgICQgY2F0IC50cml2eWlnbm9yZVxuICAgKiAgICAgIyBBY2NlcHQgdGhlIHJpc2tcbiAgICogICAgIENWRS0yMDE4LTE0NjE4XG4gICAqXG4gICAqICAgICAjIEFjY2VwdCB0aGUgcmlzayB1bnRpbCAyMDIzLTAxLTAxXG4gICAqICAgICBDVkUtMjAxOS0xNDY5NyBleHA6MjAyMy0wMS0wMVxuICAgKlxuICAgKiAgICAgIyBObyBpbXBhY3QgaW4gb3VyIHNldHRpbmdzXG4gICAqICAgICBDVkUtMjAxOS0xNTQzXG4gICAqXG4gICAqICAgICAjIElnbm9yZSBtaXNjb25maWd1cmF0aW9uc1xuICAgKiAgICAgQVZELURTLTAwMDJcbiAgICpcbiAgICogICAgICMgSWdub3JlIHNlY3JldHNcbiAgICogICAgIGdlbmVyaWMtdW53YW50ZWQtcnVsZVxuICAgKiAgICAgYXdzLWFjY291bnQtaWRcbiAgICpcbiAgICogQGRlZmF1bHQgW11cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JlXG4gICAqL1xuICByZWFkb25seSB0cml2eUlnbm9yZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZW1vcnkgU2l6ZSAoTUIpIGZvciBTY2FubmVyIExhbWJkYVxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiBgMzAwOGAgYW5kIGAxMDI0MGAuXG4gICAqXG4gICAqIElmIHRoaXMgQ29uc3RydWN0IGV4ZWN1dGlvbiB0ZXJtaW5hdGVzIGFibm9ybWFsbHkgZHVlIHRvIFNJR0tJTEwsIHRyeSBhIGxhcmdlciBzaXplLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlIChgMzAwOGAgTUIpIGlzIE1heGltdW0gTGFtYmRhIG1lbW9yeSBzaXplIGZvciBkZWZhdWx0IEFXUyBhY2NvdW50IHdpdGhvdXQgcXVvdGEgbGltaXQgaW5jcmVhc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IDMwMDhcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNjYW4gSW1hZ2Ugb24gYSBzcGVjaWZpYyBBcmNoaXRlY3R1cmUgYW5kIE9TXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFRyaXZ5IGxvYWRzIGFuIGltYWdlIG9uIGEgYGxpbnV4L2FtZDY0YCBtYWNoaW5lLlxuICAgKlxuICAgKiBUbyBjdXN0b21pemUgdGhpcywgcGFzcyBhIGBwbGF0Zm9ybWAgYXJndW1lbnQgaW4gdGhlIGZvcm1hdCBPUy9BcmNoaXRlY3R1cmUgZm9yIHRoZSBpbWFnZSwgc3VjaCBhcyBgbGludXgvYXJtNjRgXG4gICAqXG4gICAqIEBkZWZhdWx0IC1cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZhbCBwb2xpY3kgdG8gYXBwbHkgdG8gU2Nhbm5lciBMYW1iZGEncyBkZWZhdWx0IGxvZyBncm91cFxuICAgKlxuICAgKiBJZiB5b3UgdXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgc3RhY2ssIHlvdSBjYW5ub3Qgc2V0IGRpZmZlcmVudCByZW1vdmFsIHBvbGljaWVzIGZvciB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqIFNlZSBgTm90ZXNgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgbG9nIGV2ZW50cyBhcmUga2VwdCBpbiBTY2FubmVyIExhbWJkYSdzIGRlZmF1bHQgbG9nIGdyb3VwXG4gICAqXG4gICAqIElmIHlvdSB1c2UgSW1hZ2VTY2FubmVyV2l0aFRyaXZ5IGNvbnN0cnVjdCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBzdGFjaywgeW91IGNhbm5vdCBzZXQgZGlmZmVyZW50IHJldGVudGlvbiBkYXlzIGZvciB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqIFNlZSBgTm90ZXNgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKSBhbmQgbG9nIGV2ZW50cyBuZXZlciBleHBpcmUuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzPzogUmV0ZW50aW9uRGF5cztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3Igc2NhbiBsb2dzIG91dHB1dFxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzY2FuIGxvZ3MgYXJlIG91dHB1dCB0byBkZWZhdWx0IGxvZyBncm91cCBjcmVhdGVkIGJ5IFNjYW5uZXIgTGFtYmRhLlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgeW91IHdhbnQgdG8gc2VuZCBzY2FuIGxvZ3MgdG8gb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqXG4gICAqIEN1cnJlbnRseSwgb25seSBgY2xvdWRXYXRjaExvZ3NgIGlzIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzY2FuIGxvZ3Mgb3V0cHV0IHRvIGRlZmF1bHQgbG9nIGdyb3VwIGNyZWF0ZWQgYnkgU2Nhbm5lciBMYW1iZGEoYC9hd3MvbGFtYmRhLyR7ZnVuY3Rpb25OYW1lfWApXG4gICAqL1xuICByZWFkb25seSBzY2FuTG9nc091dHB1dD86IFNjYW5Mb2dzT3V0cHV0O1xufVxuXG4vLyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlXG5jb25zdCBERUZBVUxUX01FTU9SWV9TSVpFID0gMzAwODtcblxuZXhwb3J0IGNsYXNzIEltYWdlU2Nhbm5lcldpdGhUcml2eSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy5tZW1vcnlTaXplICYmXG4gICAgICAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm1lbW9yeVNpemUpICYmXG4gICAgICAocHJvcHMubWVtb3J5U2l6ZSA8IDMwMDggfHwgcHJvcHMubWVtb3J5U2l6ZSA+IDEwMjQwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gXFxgMzAwOFxcYCBhbmQgXFxgMTAyNDBcXGAgZm9yIFxcYG1lbW9yeVNpemVcXGAsIGdvdCAke3Byb3BzLm1lbW9yeVNpemV9LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGxhbWJkYVB1cnBvc2UgPSAnQ3VzdG9tOjpJbWFnZVNjYW5uZXJXaXRoVHJpdnlDdXN0b21SZXNvdXJjZUxhbWJkYSc7XG4gICAgY29uc3QgY3VzdG9tUmVzb3VyY2VMYW1iZGEgPSBuZXcgU2luZ2xldG9uRnVuY3Rpb24odGhpcywgJ0N1c3RvbVJlc291cmNlTGFtYmRhJywge1xuICAgICAgdXVpZDogJzQ3MGI2MzQzLWQyNjctZjc1My0yMjZjLTFlOTlmMDlmMzE5YScsXG4gICAgICBsYW1iZGFQdXJwb3NlLFxuICAgICAgcnVudGltZTogUnVudGltZS5GUk9NX0lNQUdFLFxuICAgICAgaGFuZGxlcjogSGFuZGxlci5GUk9NX0lNQUdFLFxuICAgICAgY29kZTogQXNzZXRDb2RlLmZyb21Bc3NldEltYWdlKGpvaW4oX19kaXJuYW1lLCAnLi4vYXNzZXRzL2xhbWJkYScpLCB7XG4gICAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybS5MSU5VWF9BUk02NCxcbiAgICAgICAgLy8gZXhjbHVkZSBub2RlX21vZHVsZXNcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgbmF0aXZlIGJpbmFyeSBvZiB0aGUgaW5zdGFsbGVkIGVzYnVpbGQgY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGNwdSBhcmNoaXRlY3R1cmVcbiAgICAgICAgLy8gYW5kIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbWFnZSBhc3NldCBjaGFuZ2VzIGRlcGVuZGluZyBvbiB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICAgICAgICBleGNsdWRlOiBbJ25vZGVfbW9kdWxlcyddLFxuICAgICAgfSksXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDkwMCksXG4gICAgICByZXRyeUF0dGVtcHRzOiAwLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyBERUZBVUxUX01FTU9SWV9TSVpFLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZVNpemU6IFNpemUuZ2liaWJ5dGVzKDEwKSwgLy8gZm9yIGNhc2VzIHRoYXQgbmVlZCB0byB1cGRhdGUgdHJpdnkgREI6IC90bXAvdHJpdnkvZGIvdHJpdnkuZGJcbiAgICB9KTtcbiAgICBwcm9wcy5yZXBvc2l0b3J5LmdyYW50UHVsbChjdXN0b21SZXNvdXJjZUxhbWJkYSk7XG5cbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZUxhbWJkYUxvZ0dyb3VwQ29uc3RydWN0TmFtZSA9IGBEZWZhdWx0TG9nR3JvdXBGb3Ike2xhbWJkYVB1cnBvc2V9YDtcblxuICAgIHRoaXMudmFsaWRhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zKGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSB8fCBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzKSB7XG4gICAgICB0aGlzLmVuc3VyZUxhbWJkYURlZmF1bHRMb2dHcm91cChcbiAgICAgICAgY3VzdG9tUmVzb3VyY2VMYW1iZGEsXG4gICAgICAgIGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lLFxuICAgICAgICBwcm9wcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1hZ2VTY2FubmVyUHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IGN1c3RvbVJlc291cmNlTGFtYmRhLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW1hZ2VTY2FubmVyUHJvcGVydGllczogU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMgPSB7XG4gICAgICBhZGRyOiB0aGlzLm5vZGUuYWRkcixcbiAgICAgIGltYWdlVXJpOiBwcm9wcy5pbWFnZVVyaSxcbiAgICAgIGlnbm9yZVVuZml4ZWQ6IFN0cmluZyhwcm9wcy5pZ25vcmVVbmZpeGVkID8/IGZhbHNlKSxcbiAgICAgIHNldmVyaXR5OiBwcm9wcy5zZXZlcml0eSA/PyBbU2V2ZXJpdHkuQ1JJVElDQUxdLFxuICAgICAgc2Nhbm5lcnM6IHByb3BzLnNjYW5uZXJzID8/IFtdLFxuICAgICAgaW1hZ2VDb25maWdTY2FubmVyczogcHJvcHMuaW1hZ2VDb25maWdTY2FubmVycyA/PyBbXSxcbiAgICAgIGV4aXRDb2RlOiBwcm9wcy5leGl0Q29kZSA/PyAxLFxuICAgICAgZXhpdE9uRW9sOiBwcm9wcy5leGl0T25Fb2wgPz8gMSxcbiAgICAgIHRyaXZ5SWdub3JlOiBwcm9wcy50cml2eUlnbm9yZSA/PyBbXSxcbiAgICAgIHBsYXRmb3JtOiBwcm9wcy5wbGF0Zm9ybSA/PyAnJyxcbiAgICAgIG91dHB1dDogcHJvcHMuc2NhbkxvZ3NPdXRwdXQ/LmJpbmQoY3VzdG9tUmVzb3VyY2VMYW1iZGEpLFxuICAgIH07XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpJbWFnZVNjYW5uZXJXaXRoVHJpdnknLFxuICAgICAgcHJvcGVydGllczogaW1hZ2VTY2FubmVyUHJvcGVydGllcyxcbiAgICAgIHNlcnZpY2VUb2tlbjogaW1hZ2VTY2FubmVyUHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHNwZWNpZmllZCBkZWZhdWx0IGxvZyBncm91cCBvcHRpb25zIGFyZSB0aGUgc2FtZSBmb3IgZXhpc3RpbmcgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTGFtYmRhRGVmYXVsdExvZ0dyb3VwT3B0aW9ucyhcbiAgICBsb2dHcm91cENvbnN0cnVjdE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW1hZ2VTY2FubmVyV2l0aFRyaXZ5UHJvcHMsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQobG9nR3JvdXBDb25zdHJ1Y3ROYW1lKSBhc1xuICAgICAgfCBMb2dHcm91cFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFleGlzdGluZykgcmV0dXJuO1xuXG4gICAgY29uc3QgY2ZuTG9nR3JvdXAgPSBleGlzdGluZy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5Mb2dHcm91cDtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzU2FtZVJlc291cmNlRGVsZXRpb25CZWhhdmlvcihcbiAgICAgICAgcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSxcbiAgICAgICAgY2ZuTG9nR3JvdXAuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSxcbiAgICAgICkgfHxcbiAgICAgIGNmbkxvZ0dyb3VwLnJldGVudGlvbkluRGF5cyAhPT0gcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5c1xuICAgICkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQGltYWdlLXNjYW5uZXItd2l0aC10cml2eTpkdXBsaWNhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zJyxcbiAgICAgICAgXCJZb3UgaGF2ZSB0byBzZXQgdGhlIHNhbWUgdmFsdWVzIGZvciAnZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeScgYW5kICdkZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzJyBmb3IgZWFjaCBJbWFnZVNjYW5uZXJXaXRoVHJpdnkgY29uc3RydWN0IGluIHRoZSBzYW1lIHN0YWNrLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAgZm9yIFNjYW5uZXIgTGFtYmRhIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBleGlzdHMgaW4gY2hpbGRyZW4gb2YgdGhlIHN0YWNrIGNvbnN0cnVjdC5cbiAgICogSWYgaXQgZG9lcyBub3QgZXhpc3QsIGl0IGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBhcyBhIGNoaWxkIG9mIHRoZSBzdGFjayBjb25zdHJ1Y3QuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUxhbWJkYURlZmF1bHRMb2dHcm91cChcbiAgICBzaW5nbGV0b25GdW5jdGlvbjogU2luZ2xldG9uRnVuY3Rpb24sXG4gICAgbG9nR3JvdXBDb25zdHJ1Y3ROYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzLFxuICApOiBMb2dHcm91cCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBTdGFjay5vZih0aGlzKS5ub2RlLnRyeUZpbmRDaGlsZChsb2dHcm91cENvbnN0cnVjdE5hbWUpIGFzXG4gICAgICB8IExvZ0dyb3VwXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExvZ0dyb3VwKFN0YWNrLm9mKHRoaXMpLCBsb2dHcm91cENvbnN0cnVjdE5hbWUsIHtcbiAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7c2luZ2xldG9uRnVuY3Rpb24uZnVuY3Rpb25OYW1lfWAsXG4gICAgICByZXRlbnRpb246IHByb3BzLmRlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXMsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVSZXNvdXJjZURlbGV0aW9uQmVoYXZpb3IoXG4gICAgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3ksXG4gICAgZGVsZXRpb25Qb2xpY3k/OiBDZm5EZWxldGlvblBvbGljeSxcbiAgKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChyZW1vdmFsUG9saWN5KSB7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuREVTVFJPWTpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuUkVUQUlOOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LlJFVEFJTjtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5TTkFQU0hPVDpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5TTkFQU0hPVDtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5SRVRBSU5fT05fVVBEQVRFX09SX0RFTEVURTpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5SRVRBSU5fRVhDRVBUX09OX0NSRUFURTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiByZW1vdmFsUG9saWN5IHNhdGlzZmllcyBuZXZlcjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
185
|
+
ImageScannerWithTrivy[_b] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.1.1" };
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltYWdlLXNjYW5uZXItd2l0aC10cml2eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUE0QjtBQUM1Qiw2Q0FTcUI7QUFFckIsK0RBQXNEO0FBRXRELHVEQU1nQztBQUNoQyxtREFBdUY7QUFDdkYsbUVBQXdEO0FBQ3hELDJDQUF1QztBQUN2QyxtQ0FLaUI7QUFFakI7Ozs7R0FJRztBQUNILElBQVksUUFNWDtBQU5ELFdBQVksUUFBUTtJQUNsQiwrQkFBbUIsQ0FBQTtJQUNuQix1QkFBVyxDQUFBO0lBQ1gsNkJBQWlCLENBQUE7SUFDakIseUJBQWEsQ0FBQTtJQUNiLGlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFOVyxRQUFRLHdCQUFSLFFBQVEsUUFNbkI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxRQUtYO0FBTEQsV0FBWSxRQUFRO0lBQ2xCLHlCQUFhLENBQUE7SUFDYiw2QkFBaUIsQ0FBQTtJQUNqQiw2QkFBaUIsQ0FBQTtJQUNqQiwrQkFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsUUFBUSx3QkFBUixRQUFRLFFBS25CO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksbUJBR1g7QUFIRCxXQUFZLG1CQUFtQjtJQUM3Qix3Q0FBaUIsQ0FBQTtJQUNqQix3Q0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBSFcsbUJBQW1CLG1DQUFuQixtQkFBbUIsUUFHOUI7QUFZRDs7R0FFRztBQUNILE1BQXNCLGNBQWM7SUFDbEM7O09BRUc7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQWtDO1FBQzdELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDOztBQU5ILHdDQVlDOzs7QUFFRCxNQUFNLG9CQUFxQixTQUFRLGNBQWM7SUFNL0MsWUFBWSxPQUFrQztRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNuQyxDQUFDO0lBRU0sSUFBSSxDQUFDLE9BQW1CO1FBQzdCLDZGQUE2RjtRQUM3RixzR0FBc0c7UUFDdEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEMsT0FBTztZQUNMLElBQUksRUFBRSwwQkFBa0IsQ0FBQyxlQUFlO1lBQ3hDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVk7U0FDekMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWtORCxrRkFBa0Y7QUFDbEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFakMsTUFBYSxxQkFBc0IsU0FBUSxzQkFBUztJQUNsRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWlDO1FBQ3pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFDRSxLQUFLLENBQUMsVUFBVTtZQUNoQixDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDckMsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUNyRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwwRUFBMEUsS0FBSyxDQUFDLFVBQVUsR0FBRyxDQUM5RixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLG1EQUFtRCxDQUFDO1FBQzFFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSw4QkFBaUIsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7WUFDL0UsSUFBSSxFQUFFLHNDQUFzQztZQUM1QyxhQUFhO1lBQ2IsT0FBTyxFQUFFLG9CQUFPLENBQUMsVUFBVTtZQUMzQixPQUFPLEVBQUUsb0JBQU8sQ0FBQyxVQUFVO1lBQzNCLElBQUksRUFBRSxzQkFBUyxDQUFDLGNBQWMsQ0FBQyxJQUFBLFdBQUksRUFBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsRUFBRTtnQkFDbEUsUUFBUSxFQUFFLHlCQUFRLENBQUMsV0FBVztnQkFDOUIsdUJBQXVCO2dCQUN2QiwrRkFBK0Y7Z0JBQy9GLHdGQUF3RjtnQkFDeEYsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQzFCLENBQUM7WUFDRixZQUFZLEVBQUUseUJBQVksQ0FBQyxNQUFNO1lBQ2pDLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDOUIsYUFBYSxFQUFFLENBQUM7WUFDaEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksbUJBQW1CO1lBQ25ELG9CQUFvQixFQUFFLGtCQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGlFQUFpRTtTQUM1RyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRWpELE1BQU0seUNBQXlDLEdBQUcscUJBQXFCLGFBQWEsRUFBRSxDQUFDO1FBRXZGLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU1RixJQUFJLEtBQUssQ0FBQyw0QkFBNEIsSUFBSSxLQUFLLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUM3RSxJQUFJLENBQUMsMkJBQTJCLENBQzlCLG9CQUFvQixFQUNwQix5Q0FBeUMsRUFDekMsS0FBSyxDQUNOLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLDJCQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUMxRCxjQUFjLEVBQUUsb0JBQW9CO1NBQ3JDLENBQUMsQ0FBQztRQUVILE1BQU0sc0JBQXNCLEdBQStCO1lBQ3pELElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFDcEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ3hCLGFBQWEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUM7WUFDbkQsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQy9DLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUU7WUFDOUIsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixJQUFJLEVBQUU7WUFDcEQsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQztZQUM3QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDO1lBQy9CLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxJQUFJLEVBQUU7WUFDcEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRTtZQUM5QixNQUFNLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDeEQsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUM7U0FDdkUsQ0FBQztRQUVGLElBQUksNEJBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ25DLFlBQVksRUFBRSwrQkFBK0I7WUFDN0MsVUFBVSxFQUFFLHNCQUFzQjtZQUNsQyxZQUFZLEVBQUUsb0JBQW9CLENBQUMsWUFBWTtTQUNoRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQ0FBb0MsQ0FDMUMscUJBQTZCLEVBQzdCLEtBQWlDO1FBRWpDLE1BQU0sUUFBUSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBRTFELENBQUM7UUFDZCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFdEIsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUEyQixDQUFDO1FBRTlELElBQ0UsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQ2xDLEtBQUssQ0FBQyw0QkFBNEIsRUFDbEMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQ3RDO1lBQ0QsV0FBVyxDQUFDLGVBQWUsS0FBSyxLQUFLLENBQUMsNEJBQTRCLEVBQ2xFLENBQUM7WUFDRCx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQy9CLGlFQUFpRSxFQUNqRSxtS0FBbUssQ0FDcEssQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSywyQkFBMkIsQ0FDakMsaUJBQW9DLEVBQ3BDLHFCQUE2QixFQUM3QixLQUFpQztRQUVqQyxNQUFNLFFBQVEsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUUxRCxDQUFDO1FBQ2QsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxPQUFPLElBQUksbUJBQVEsQ0FBQyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxxQkFBcUIsRUFBRTtZQUN6RCxZQUFZLEVBQUUsZUFBZSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUU7WUFDN0QsU0FBUyxFQUFFLEtBQUssQ0FBQyw0QkFBNEI7WUFDN0MsYUFBYSxFQUFFLEtBQUssQ0FBQyw0QkFBNEI7U0FDbEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDhCQUE4QixDQUNwQyxhQUE2QixFQUM3QixjQUFrQztRQUVsQyxRQUFRLGFBQWEsRUFBRSxDQUFDO1lBQ3RCLEtBQUssMkJBQWEsQ0FBQyxPQUFPO2dCQUN4QixPQUFPLGNBQWMsS0FBSywrQkFBaUIsQ0FBQyxNQUFNLENBQUM7WUFDckQsS0FBSywyQkFBYSxDQUFDLE1BQU07Z0JBQ3ZCLE9BQU8sY0FBYyxLQUFLLCtCQUFpQixDQUFDLE1BQU0sQ0FBQztZQUNyRCxLQUFLLDJCQUFhLENBQUMsUUFBUTtnQkFDekIsT0FBTyxjQUFjLEtBQUssK0JBQWlCLENBQUMsUUFBUSxDQUFDO1lBQ3ZELEtBQUssMkJBQWEsQ0FBQywwQkFBMEI7Z0JBQzNDLE9BQU8sY0FBYyxLQUFLLCtCQUFpQixDQUFDLHVCQUF1QixDQUFDO1lBQ3RFLEtBQUssU0FBUztnQkFDWixPQUFPLGNBQWMsS0FBSyxTQUFTLENBQUM7WUFDdEM7Z0JBQ0UsT0FBTyxhQUE2QixDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDOztBQWhKSCxzREFpSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBBbm5vdGF0aW9ucyxcbiAgQ2ZuRGVsZXRpb25Qb2xpY3ksXG4gIEN1c3RvbVJlc291cmNlLFxuICBEdXJhdGlvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU2l6ZSxcbiAgU3RhY2ssXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBJR3JhbnRhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge1xuICBBcmNoaXRlY3R1cmUsXG4gIEFzc2V0Q29kZSxcbiAgSGFuZGxlcixcbiAgUnVudGltZSxcbiAgU2luZ2xldG9uRnVuY3Rpb24sXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ2ZuTG9nR3JvdXAsIElMb2dHcm91cCwgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBDbG91ZFdhdGNoTG9nc091dHB1dE9wdGlvbnMsXG4gIFNjYW5Mb2dzT3V0cHV0T3B0aW9ucyxcbiAgU2NhbkxvZ3NPdXRwdXRUeXBlLFxuICBTY2FubmVyQ3VzdG9tUmVzb3VyY2VQcm9wcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRW51bSBmb3IgU2V2ZXJpdHkgU2VsZWN0aW9uXG4gKlxuICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyNzZXZlcml0eS1zZWxlY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gU2V2ZXJpdHkge1xuICBVTktOT1dOID0gJ1VOS05PV04nLFxuICBMT1cgPSAnTE9XJyxcbiAgTUVESVVNID0gJ01FRElVTScsXG4gIEhJR0ggPSAnSElHSCcsXG4gIENSSVRJQ0FMID0gJ0NSSVRJQ0FMJyxcbn1cblxuLyoqXG4gKiBFbnVtIGZvciBTY2FubmVyc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNlbmFibGVkaXNhYmxlLXNjYW5uZXJzXG4gKi9cbmV4cG9ydCBlbnVtIFNjYW5uZXJzIHtcbiAgVlVMTiA9ICd2dWxuJyxcbiAgQ09ORklHID0gJ2NvbmZpZycsXG4gIFNFQ1JFVCA9ICdzZWNyZXQnLFxuICBMSUNFTlNFID0gJ2xpY2Vuc2UnLFxufVxuXG4vKipcbiAqIEVudW0gZm9yIEltYWdlQ29uZmlnU2Nhbm5lcnNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy90YXJnZXQvY29udGFpbmVyX2ltYWdlLyNjb250YWluZXItaW1hZ2UtbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGVudW0gSW1hZ2VDb25maWdTY2FubmVycyB7XG4gIENPTkZJRyA9ICdjb25maWcnLFxuICBTRUNSRVQgPSAnc2VjcmV0Jyxcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzY2FuIGxvZ3Mgb3V0cHV0IHRvIENsb3VkV2F0Y2ggTG9ncyBsb2cgZ3JvdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ3NPdXRwdXRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbG9nIGdyb3VwIHRvIG91dHB1dCBzY2FuIGxvZ3MuXG4gICAqL1xuICByZWFkb25seSBsb2dHcm91cDogSUxvZ0dyb3VwO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIG91dHB1dCBvZiB0aGUgc2NhbiBsb2dzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2NhbkxvZ3NPdXRwdXQge1xuICAvKipcbiAgICogU2NhbiBsb2dzIG91dHB1dCB0byBDbG91ZFdhdGNoIExvZ3MgbG9nIGdyb3VwLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbG91ZFdhdGNoTG9ncyhvcHRpb25zOiBDbG91ZFdhdGNoTG9nc091dHB1dFByb3BzKTogU2NhbkxvZ3NPdXRwdXQge1xuICAgIHJldHVybiBuZXcgQ2xvdWRXYXRjaExvZ3NPdXRwdXQob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncy5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBiaW5kKGdyYW50ZWU6IElHcmFudGFibGUpOiBTY2FuTG9nc091dHB1dE9wdGlvbnM7XG59XG5cbmNsYXNzIENsb3VkV2F0Y2hMb2dzT3V0cHV0IGV4dGVuZHMgU2NhbkxvZ3NPdXRwdXQge1xuICAvKipcbiAgICogVGhlIGxvZyBncm91cCB0byBvdXRwdXQgc2NhbiBsb2dzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dHcm91cDogSUxvZ0dyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENsb3VkV2F0Y2hMb2dzT3V0cHV0UHJvcHMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5sb2dHcm91cCA9IG9wdGlvbnMubG9nR3JvdXA7XG4gIH1cblxuICBwdWJsaWMgYmluZChncmFudGVlOiBJR3JhbnRhYmxlKTogQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zIHtcbiAgICAvLyBNb3N0IExhbWJkYXMgYXJlIGdyYW50ZWQgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGFuZCBjYW4gd3JpdGUgdG8gYW55IENsb3VkV2F0Y2ggTG9ncy5cbiAgICAvLyBIb3dldmVyLCBqdXN0IGluIGNhc2UgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGlzIG5vdCBncmFudGVkLCBhbGxvdyB3cml0aW5nIHRvIENsb3VkV2F0Y2ggTG9ncy5cbiAgICB0aGlzLmxvZ0dyb3VwLmdyYW50V3JpdGUoZ3JhbnRlZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogU2NhbkxvZ3NPdXRwdXRUeXBlLkNMT1VEV0FUQ0hfTE9HUyxcbiAgICAgIGxvZ0dyb3VwTmFtZTogdGhpcy5sb2dHcm91cC5sb2dHcm91cE5hbWUsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzIHtcbiAgLyoqXG4gICAqIEltYWdlIFVSSSBmb3Igc2NhbiB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSBpbWFnZVVyaTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IGluY2x1ZGluZyB0aGUgaW1hZ2UgVVJJIGZvciBzY2FuIHRhcmdldC5cbiAgICpcbiAgICogQmVjYXVzZSBvZiBncmFudFB1bGwgdG8gQ3VzdG9tUmVzb3VyY2VMYW1iZGEuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogVGhlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcyBtZWFuIHRoYXQgdGhlIHBhdGNoIGhhcyBub3QgeWV0IGJlZW4gcHJvdmlkZWQgb24gdGhlaXIgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBUbyBoaWRlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGAtLWlnbm9yZS11bmZpeGVkYCBmbGFnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9zY2FubmVyL3Z1bG5lcmFiaWxpdHkvI3VuZml4ZWQtdnVsbmVyYWJpbGl0aWVzXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVVbmZpeGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2V2ZXJpdHkgU2VsZWN0aW9uXG4gICAqXG4gICAqIFRoZSBzZXZlcml0eSBpcyB0YWtlbiBmcm9tIHRoZSBzZWxlY3RlZCBkYXRhIHNvdXJjZSBzaW5jZSB0aGUgc2V2ZXJpdHkgZnJvbSB2ZW5kb3JzIGlzIG1vcmUgYWNjdXJhdGUuXG4gICAqIFVzaW5nIENWRS0yMDIzLTA0NjQgYXMgYW4gZXhhbXBsZSwgd2hpbGUgaXQgaXMgcmF0ZWQgYXMgXCJISUdIXCIgaW4gTlZELCBSZWQgSGF0IGhhcyBtYXJrZWQgaXRzICdJbXBhY3QnIGFzIFwiTG93XCIuIEFzIGEgcmVzdWx0LCBUcml2eSB3aWxsIGRpc3BsYXkgaXQgYXMgXCJMb3dcIi5cbiAgICpcbiAgICogVGhlIHNldmVyaXR5IGRlcGVuZHMgb24gdGhlIGNvbXBpbGUgb3B0aW9uLCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBldGMuIE5WRCBkb2Vzbid0IGtub3cgaG93IHRoZSB2ZW5kb3IgZGlzdHJpYnV0ZXMgdGhlIHNvZnR3YXJlLlxuICAgKiBSZWQgSGF0IGV2YWx1YXRlcyB0aGUgc2V2ZXJpdHkgbW9yZSBhY2N1cmF0ZWx5LiBUaGF0J3Mgd2h5IFRyaXZ5IHByZWZlcnMgdmVuZG9yIHNjb3JlcyBvdmVyIE5WRC5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gYENSSVRJQ0FMYCBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELCBidXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBUcml2eSBpcyBcIkNSSVRJQ0FMLEhJR0gsTUVESVVNLExPVyxVTktOT1dOXCIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtTZXZlcml0eS5DUklUSUNBTF1cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyNzZXZlcml0eS1zZWxlY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IHNldmVyaXR5PzogU2V2ZXJpdHlbXTtcblxuICAvKipcbiAgICogRW5hYmxlL0Rpc2FibGUgU2Nhbm5lcnNcbiAgICpcbiAgICogWW91IGNhbiBlbmFibGUvZGlzYWJsZSBzY2FubmVycyB3aXRoIHRoZSBgc2Nhbm5lcnNgLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgY29udGFpbmVyIGltYWdlIHNjYW5uaW5nIGVuYWJsZXMgdnVsbmVyYWJpbGl0eSAoVlVMTikgYW5kIHNlY3JldCBzY2FubmVycyAoU0VDUkVUKSBieSBkZWZhdWx0LlxuICAgKiBJZiB5b3UgZG9uJ3QgbmVlZCBzZWNyZXQgc2Nhbm5pbmcsIGl0IGNhbiBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nIFNjYW5uZXJzLlZVTE4gb25seS5cbiAgICpcbiAgICogQGRlZmF1bHQgW1NlY3VyaXR5LlZVTE4sU2Nhbm5lcnMuU0VDUkVUXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy9jb25maWd1cmF0aW9uL290aGVycy8jZW5hYmxlZGlzYWJsZS1zY2FubmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgc2Nhbm5lcnM/OiBTY2FubmVyc1tdO1xuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBJbWFnZUNvbmZpZ1NjYW5uZXJzXG4gICAqXG4gICAqIENvbnRhaW5lciBpbWFnZXMgaGF2ZSBjb25maWd1cmF0aW9uLiBkb2NrZXIgaW5zcGVjdCBhbmQgYGRvY2tlciBoaXN0b3J5YCBzaG93IHRoZSBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqIFRyaXZ5IHNjYW5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGNvbnRhaW5lciBpbWFnZXMgZm9yXG4gICAqXG4gICAqIC0gTWlzY29uZmlndXJhdGlvbnNcbiAgICogLSBTZWNyZXRzXG4gICAqXG4gICAqIFRoZXkgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gZW5hYmxlIHRoZW0gd2l0aCBgaW1hZ2VDb25maWdTY2FubmVyc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3RhcmdldC9jb250YWluZXJfaW1hZ2UvI2NvbnRhaW5lci1pbWFnZS1tZXRhZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VDb25maWdTY2FubmVycz86IEltYWdlQ29uZmlnU2Nhbm5lcnNbXTtcblxuICAvKipcbiAgICogRXhpdCBDb2RlXG4gICAqXG4gICAqIFVzZSB0aGUgYGV4aXRDb2RlYCBvcHRpb24gaWYgeW91IHdhbnQgdG8gZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlLlxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgMCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZXhpdCBldmVuIHdoZW4gdnVsbmVyYWJpbGl0aWVzIGFyZSBkZXRlY3RlZC5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gMSBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtY29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdENvZGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEV4aXQgb24gRU9MXG4gICAqXG4gICAqIFNvbWV0aW1lcyB5b3UgbWF5IHN1cnByaXNpbmdseSBnZXQgMCB2dWxuZXJhYmlsaXRpZXMgaW4gYW4gb2xkIGltYWdlOlxuICAgKiAgLSBFbmFibGluZyAtLWlnbm9yZS11bmZpeGVkIG9wdGlvbiB3aGlsZSBhbGwgcGFja2FnZXMgaGF2ZSBubyBmaXhlZCB2ZXJzaW9ucy5cbiAgICogIC0gU2Nhbm5pbmcgYSByYXRoZXIgb3V0ZGF0ZWQgT1MgKGUuZy4gVWJ1bnR1IDEwLjA0KS5cbiAgICpcbiAgICogQW4gT1MgYXQgdGhlIGVuZCBvZiBzZXJ2aWNlL2xpZmUgKEVPTCkgdXN1YWxseSBnZXRzIGludG8gdGhpcyBzaXR1YXRpb24sIHdoaWNoIGlzIGRlZmluaXRlbHkgZnVsbCBvZiB2dWxuZXJhYmlsaXRpZXMuXG4gICAqIGBleGl0T25Fb2xgIGNhbiBmYWlsIHNjYW5uaW5nIG9uIEVPTCBPUyB3aXRoIGEgbm9uLXplcm8gY29kZS5cbiAgICpcbiAgICogSXQgZGVmYXVsdHMgdG8gMSBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDFcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtb24tZW9sXG4gICAqL1xuICByZWFkb25seSBleGl0T25Fb2w/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ5IEZpbmRpbmcgSURzXG4gICAqXG4gICAqIFRoZSBpZ25vcmUgcnVsZXMgd3JpdHRlbiB0byB0aGUgLnRyaXZ5aWdub3JlIGluIHRyaXZ5LlxuICAgKiBQdXQgZWFjaCBsaW5lIHlvdSB3cml0ZSBpbiB0aGUgZmlsZSBpbnRvIG9uZSBlbGVtZW50IG9mIHRoZSBhcnJheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICAgICQgY2F0IC50cml2eWlnbm9yZVxuICAgKiAgICAgIyBBY2NlcHQgdGhlIHJpc2tcbiAgICogICAgIENWRS0yMDE4LTE0NjE4XG4gICAqXG4gICAqICAgICAjIEFjY2VwdCB0aGUgcmlzayB1bnRpbCAyMDIzLTAxLTAxXG4gICAqICAgICBDVkUtMjAxOS0xNDY5NyBleHA6MjAyMy0wMS0wMVxuICAgKlxuICAgKiAgICAgIyBObyBpbXBhY3QgaW4gb3VyIHNldHRpbmdzXG4gICAqICAgICBDVkUtMjAxOS0xNTQzXG4gICAqXG4gICAqICAgICAjIElnbm9yZSBtaXNjb25maWd1cmF0aW9uc1xuICAgKiAgICAgQVZELURTLTAwMDJcbiAgICpcbiAgICogICAgICMgSWdub3JlIHNlY3JldHNcbiAgICogICAgIGdlbmVyaWMtdW53YW50ZWQtcnVsZVxuICAgKiAgICAgYXdzLWFjY291bnQtaWRcbiAgICpcbiAgICogQGRlZmF1bHQgW11cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JlXG4gICAqL1xuICByZWFkb25seSB0cml2eUlnbm9yZT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZW1vcnkgU2l6ZSAoTUIpIGZvciBTY2FubmVyIExhbWJkYVxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiBgMzAwOGAgYW5kIGAxMDI0MGAuXG4gICAqXG4gICAqIElmIHRoaXMgQ29uc3RydWN0IGV4ZWN1dGlvbiB0ZXJtaW5hdGVzIGFibm9ybWFsbHkgZHVlIHRvIFNJR0tJTEwsIHRyeSBhIGxhcmdlciBzaXplLlxuICAgKlxuICAgKiBEZWZhdWx0IHZhbHVlIChgMzAwOGAgTUIpIGlzIE1heGltdW0gTGFtYmRhIG1lbW9yeSBzaXplIGZvciBkZWZhdWx0IEFXUyBhY2NvdW50IHdpdGhvdXQgcXVvdGEgbGltaXQgaW5jcmVhc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IDMwMDhcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNjYW4gSW1hZ2Ugb24gYSBzcGVjaWZpYyBBcmNoaXRlY3R1cmUgYW5kIE9TXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFRyaXZ5IGxvYWRzIGFuIGltYWdlIG9uIGEgYGxpbnV4L2FtZDY0YCBtYWNoaW5lLlxuICAgKlxuICAgKiBUbyBjdXN0b21pemUgdGhpcywgcGFzcyBhIGBwbGF0Zm9ybWAgYXJndW1lbnQgaW4gdGhlIGZvcm1hdCBPUy9BcmNoaXRlY3R1cmUgZm9yIHRoZSBpbWFnZSwgc3VjaCBhcyBgbGludXgvYXJtNjRgXG4gICAqXG4gICAqIEBkZWZhdWx0IC1cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZhbCBwb2xpY3kgdG8gYXBwbHkgdG8gU2Nhbm5lciBMYW1iZGEncyBkZWZhdWx0IGxvZyBncm91cFxuICAgKlxuICAgKiBJZiB5b3UgdXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgc3RhY2ssIHlvdSBjYW5ub3Qgc2V0IGRpZmZlcmVudCByZW1vdmFsIHBvbGljaWVzIGZvciB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqIFNlZSBgTm90ZXNgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgbG9nIGV2ZW50cyBhcmUga2VwdCBpbiBTY2FubmVyIExhbWJkYSdzIGRlZmF1bHQgbG9nIGdyb3VwXG4gICAqXG4gICAqIElmIHlvdSB1c2UgSW1hZ2VTY2FubmVyV2l0aFRyaXZ5IGNvbnN0cnVjdCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBzdGFjaywgeW91IGNhbm5vdCBzZXQgZGlmZmVyZW50IHJldGVudGlvbiBkYXlzIGZvciB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqIFNlZSBgTm90ZXNgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKSBhbmQgbG9nIGV2ZW50cyBuZXZlciBleHBpcmUuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzPzogUmV0ZW50aW9uRGF5cztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3Igc2NhbiBsb2dzIG91dHB1dFxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzY2FuIGxvZ3MgYXJlIG91dHB1dCB0byBkZWZhdWx0IGxvZyBncm91cCBjcmVhdGVkIGJ5IFNjYW5uZXIgTGFtYmRhLlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgeW91IHdhbnQgdG8gc2VuZCBzY2FuIGxvZ3MgdG8gb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqXG4gICAqIEN1cnJlbnRseSwgb25seSBgY2xvdWRXYXRjaExvZ3NgIGlzIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzY2FuIGxvZ3Mgb3V0cHV0IHRvIGRlZmF1bHQgbG9nIGdyb3VwIGNyZWF0ZWQgYnkgU2Nhbm5lciBMYW1iZGEoYC9hd3MvbGFtYmRhLyR7ZnVuY3Rpb25OYW1lfWApXG4gICAqL1xuICByZWFkb25seSBzY2FuTG9nc091dHB1dD86IFNjYW5Mb2dzT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBTdXBwcmVzcyBlcnJvcnMgZHVyaW5nIHJvbGxiYWNrIHNjYW5uZXIgTGFtYmRhIGV4ZWN1dGlvblxuICAgKlxuICAgKiBXaGVuIGltYWdlIHNjYW5uaW5nIGZhaWxzLCBDbG91ZEZvcm1hdGlvbiB0cmlnZ2VycyBhIHJvbGxiYWNrIGFuZCBleGVjdXRlcyB0aGUgcHJldmlvdXNcbiAgICogdmVyc2lvbiBvZiB0aGUgc2Nhbm5lciBMYW1iZGEuIElmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIHByZXZpb3VzIHZlcnNpb24gb2ZcbiAgICogdGhlIHNjYW5uZXIgTGFtYmRhIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCBldmVuIGlmIHRoZSBpbWFnZSBzY2FubmluZyBmb3IgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICogZmFpbHMuXG4gICAqXG4gICAqIFRoaXMgYWxsb3dzIHRoZSByb2xsYmFjayB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHksIGF2b2lkaW5nIFJPTExCQUNLX0ZBSUxFRCBzdGF0ZVxuICAgKiB3aGVuIGltYWdlIHNjYW5uaW5nIGZhaWx1cmVzIG9jY3VyLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzdXBwcmVzc0Vycm9yT25Sb2xsYmFjaz86IGJvb2xlYW47XG59XG5cbi8vIE1heGltdW0gTGFtYmRhIG1lbW9yeSBzaXplIGZvciBkZWZhdWx0IEFXUyBhY2NvdW50IHdpdGhvdXQgcXVvdGEgbGltaXQgaW5jcmVhc2VcbmNvbnN0IERFRkFVTFRfTUVNT1JZX1NJWkUgPSAzMDA4O1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VTY2FubmVyV2l0aFRyaXZ5IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChcbiAgICAgIHByb3BzLm1lbW9yeVNpemUgJiZcbiAgICAgICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMubWVtb3J5U2l6ZSkgJiZcbiAgICAgIChwcm9wcy5tZW1vcnlTaXplIDwgMzAwOCB8fCBwcm9wcy5tZW1vcnlTaXplID4gMTAyNDApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBZb3UgY2FuIHNwZWNpZnkgYmV0d2VlbiBcXGAzMDA4XFxgIGFuZCBcXGAxMDI0MFxcYCBmb3IgXFxgbWVtb3J5U2l6ZVxcYCwgZ290ICR7cHJvcHMubWVtb3J5U2l6ZX0uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbGFtYmRhUHVycG9zZSA9ICdDdXN0b206OkltYWdlU2Nhbm5lcldpdGhUcml2eUN1c3RvbVJlc291cmNlTGFtYmRhJztcbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZUxhbWJkYSA9IG5ldyBTaW5nbGV0b25GdW5jdGlvbih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VMYW1iZGEnLCB7XG4gICAgICB1dWlkOiAnNDcwYjYzNDMtZDI2Ny1mNzUzLTIyNmMtMWU5OWYwOWYzMTlhJyxcbiAgICAgIGxhbWJkYVB1cnBvc2UsXG4gICAgICBydW50aW1lOiBSdW50aW1lLkZST01fSU1BR0UsXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyLkZST01fSU1BR0UsXG4gICAgICBjb2RlOiBBc3NldENvZGUuZnJvbUFzc2V0SW1hZ2Uoam9pbihfX2Rpcm5hbWUsICcuLi9hc3NldHMvbGFtYmRhJyksIHtcbiAgICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLkxJTlVYX0FSTTY0LFxuICAgICAgICAvLyBleGNsdWRlIG5vZGVfbW9kdWxlc1xuICAgICAgICAvLyBiZWNhdXNlIHRoZSBuYXRpdmUgYmluYXJ5IG9mIHRoZSBpbnN0YWxsZWQgZXNidWlsZCBjaGFuZ2VzIGRlcGVuZGluZyBvbiB0aGUgY3B1IGFyY2hpdGVjdHVyZVxuICAgICAgICAvLyBhbmQgdGhlIGhhc2ggdmFsdWUgb2YgdGhlIGltYWdlIGFzc2V0IGNoYW5nZXMgZGVwZW5kaW5nIG9uIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gICAgICAgIGV4Y2x1ZGU6IFsnbm9kZV9tb2R1bGVzJ10sXG4gICAgICB9KSxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoOTAwKSxcbiAgICAgIHJldHJ5QXR0ZW1wdHM6IDAsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplID8/IERFRkFVTFRfTUVNT1JZX1NJWkUsXG4gICAgICBlcGhlbWVyYWxTdG9yYWdlU2l6ZTogU2l6ZS5naWJpYnl0ZXMoMTApLCAvLyBmb3IgY2FzZXMgdGhhdCBuZWVkIHRvIHVwZGF0ZSB0cml2eSBEQjogL3RtcC90cml2eS9kYi90cml2eS5kYlxuICAgIH0pO1xuICAgIHByb3BzLnJlcG9zaXRvcnkuZ3JhbnRQdWxsKGN1c3RvbVJlc291cmNlTGFtYmRhKTtcblxuICAgIGNvbnN0IGN1c3RvbVJlc291cmNlTGFtYmRhTG9nR3JvdXBDb25zdHJ1Y3ROYW1lID0gYERlZmF1bHRMb2dHcm91cEZvciR7bGFtYmRhUHVycG9zZX1gO1xuXG4gICAgdGhpcy52YWxpZGF0ZUxhbWJkYURlZmF1bHRMb2dHcm91cE9wdGlvbnMoY3VzdG9tUmVzb3VyY2VMYW1iZGFMb2dHcm91cENvbnN0cnVjdE5hbWUsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5IHx8IHByb3BzLmRlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXMpIHtcbiAgICAgIHRoaXMuZW5zdXJlTGFtYmRhRGVmYXVsdExvZ0dyb3VwKFxuICAgICAgICBjdXN0b21SZXNvdXJjZUxhbWJkYSxcbiAgICAgICAgY3VzdG9tUmVzb3VyY2VMYW1iZGFMb2dHcm91cENvbnN0cnVjdE5hbWUsXG4gICAgICAgIHByb3BzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbWFnZVNjYW5uZXJQcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnUHJvdmlkZXInLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogY3VzdG9tUmVzb3VyY2VMYW1iZGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbWFnZVNjYW5uZXJQcm9wZXJ0aWVzOiBTY2FubmVyQ3VzdG9tUmVzb3VyY2VQcm9wcyA9IHtcbiAgICAgIGFkZHI6IHRoaXMubm9kZS5hZGRyLFxuICAgICAgaW1hZ2VVcmk6IHByb3BzLmltYWdlVXJpLFxuICAgICAgaWdub3JlVW5maXhlZDogU3RyaW5nKHByb3BzLmlnbm9yZVVuZml4ZWQgPz8gZmFsc2UpLFxuICAgICAgc2V2ZXJpdHk6IHByb3BzLnNldmVyaXR5ID8/IFtTZXZlcml0eS5DUklUSUNBTF0sXG4gICAgICBzY2FubmVyczogcHJvcHMuc2Nhbm5lcnMgPz8gW10sXG4gICAgICBpbWFnZUNvbmZpZ1NjYW5uZXJzOiBwcm9wcy5pbWFnZUNvbmZpZ1NjYW5uZXJzID8/IFtdLFxuICAgICAgZXhpdENvZGU6IHByb3BzLmV4aXRDb2RlID8/IDEsXG4gICAgICBleGl0T25Fb2w6IHByb3BzLmV4aXRPbkVvbCA/PyAxLFxuICAgICAgdHJpdnlJZ25vcmU6IHByb3BzLnRyaXZ5SWdub3JlID8/IFtdLFxuICAgICAgcGxhdGZvcm06IHByb3BzLnBsYXRmb3JtID8/ICcnLFxuICAgICAgb3V0cHV0OiBwcm9wcy5zY2FuTG9nc091dHB1dD8uYmluZChjdXN0b21SZXNvdXJjZUxhbWJkYSksXG4gICAgICBzdXBwcmVzc0Vycm9yT25Sb2xsYmFjazogU3RyaW5nKHByb3BzLnN1cHByZXNzRXJyb3JPblJvbGxiYWNrID8/IHRydWUpLFxuICAgIH07XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpJbWFnZVNjYW5uZXJXaXRoVHJpdnknLFxuICAgICAgcHJvcGVydGllczogaW1hZ2VTY2FubmVyUHJvcGVydGllcyxcbiAgICAgIHNlcnZpY2VUb2tlbjogaW1hZ2VTY2FubmVyUHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHNwZWNpZmllZCBkZWZhdWx0IGxvZyBncm91cCBvcHRpb25zIGFyZSB0aGUgc2FtZSBmb3IgZXhpc3RpbmcgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTGFtYmRhRGVmYXVsdExvZ0dyb3VwT3B0aW9ucyhcbiAgICBsb2dHcm91cENvbnN0cnVjdE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW1hZ2VTY2FubmVyV2l0aFRyaXZ5UHJvcHMsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQobG9nR3JvdXBDb25zdHJ1Y3ROYW1lKSBhc1xuICAgICAgfCBMb2dHcm91cFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFleGlzdGluZykgcmV0dXJuO1xuXG4gICAgY29uc3QgY2ZuTG9nR3JvdXAgPSBleGlzdGluZy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBDZm5Mb2dHcm91cDtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzU2FtZVJlc291cmNlRGVsZXRpb25CZWhhdmlvcihcbiAgICAgICAgcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSxcbiAgICAgICAgY2ZuTG9nR3JvdXAuY2ZuT3B0aW9ucy5kZWxldGlvblBvbGljeSxcbiAgICAgICkgfHxcbiAgICAgIGNmbkxvZ0dyb3VwLnJldGVudGlvbkluRGF5cyAhPT0gcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5c1xuICAgICkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQGltYWdlLXNjYW5uZXItd2l0aC10cml2eTpkdXBsaWNhdGVMYW1iZGFEZWZhdWx0TG9nR3JvdXBPcHRpb25zJyxcbiAgICAgICAgXCJZb3UgaGF2ZSB0byBzZXQgdGhlIHNhbWUgdmFsdWVzIGZvciAnZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeScgYW5kICdkZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzJyBmb3IgZWFjaCBJbWFnZVNjYW5uZXJXaXRoVHJpdnkgY29uc3RydWN0IGluIHRoZSBzYW1lIHN0YWNrLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAgZm9yIFNjYW5uZXIgTGFtYmRhIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBleGlzdHMgaW4gY2hpbGRyZW4gb2YgdGhlIHN0YWNrIGNvbnN0cnVjdC5cbiAgICogSWYgaXQgZG9lcyBub3QgZXhpc3QsIGl0IGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBhcyBhIGNoaWxkIG9mIHRoZSBzdGFjayBjb25zdHJ1Y3QuXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUxhbWJkYURlZmF1bHRMb2dHcm91cChcbiAgICBzaW5nbGV0b25GdW5jdGlvbjogU2luZ2xldG9uRnVuY3Rpb24sXG4gICAgbG9nR3JvdXBDb25zdHJ1Y3ROYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzLFxuICApOiBMb2dHcm91cCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBTdGFjay5vZih0aGlzKS5ub2RlLnRyeUZpbmRDaGlsZChsb2dHcm91cENvbnN0cnVjdE5hbWUpIGFzXG4gICAgICB8IExvZ0dyb3VwXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExvZ0dyb3VwKFN0YWNrLm9mKHRoaXMpLCBsb2dHcm91cENvbnN0cnVjdE5hbWUsIHtcbiAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7c2luZ2xldG9uRnVuY3Rpb24uZnVuY3Rpb25OYW1lfWAsXG4gICAgICByZXRlbnRpb246IHByb3BzLmRlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXMsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVSZXNvdXJjZURlbGV0aW9uQmVoYXZpb3IoXG4gICAgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3ksXG4gICAgZGVsZXRpb25Qb2xpY3k/OiBDZm5EZWxldGlvblBvbGljeSxcbiAgKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChyZW1vdmFsUG9saWN5KSB7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuREVTVFJPWTpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5ERUxFVEU7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuUkVUQUlOOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IENmbkRlbGV0aW9uUG9saWN5LlJFVEFJTjtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5TTkFQU0hPVDpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5TTkFQU0hPVDtcbiAgICAgIGNhc2UgUmVtb3ZhbFBvbGljeS5SRVRBSU5fT05fVVBEQVRFX09SX0RFTEVURTpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5SRVRBSU5fRVhDRVBUX09OX0NSRUFURTtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gZGVsZXRpb25Qb2xpY3kgPT09IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiByZW1vdmFsUG9saWN5IHNhdGlzZmllcyBuZXZlcjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/lib/types.d.ts
CHANGED
package/lib/types.js
CHANGED
|
@@ -8,4 +8,4 @@ var ScanLogsOutputType;
|
|
|
8
8
|
(function (ScanLogsOutputType) {
|
|
9
9
|
ScanLogsOutputType["CLOUDWATCH_LOGS"] = "cloudWatchLogs";
|
|
10
10
|
})(ScanLogsOutputType || (exports.ScanLogsOutputType = ScanLogsOutputType = {}));
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLGtCQUVYO0FBRkQsV0FBWSxrQkFBa0I7SUFDNUIsd0RBQWtDLENBQUE7QUFDcEMsQ0FBQyxFQUZXLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBRTdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnVtIGZvciBTY2FuTG9nc091dHB1dFR5cGVcbiAqL1xuZXhwb3J0IGVudW0gU2NhbkxvZ3NPdXRwdXRUeXBlIHtcbiAgQ0xPVURXQVRDSF9MT0dTID0gJ2Nsb3VkV2F0Y2hMb2dzJyxcbn1cblxuLyoqXG4gKiBPdXRwdXQgY29uZmlndXJhdGlvbnMgZm9yIHNjYW4gbG9ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FuTG9nc091dHB1dE9wdGlvbnMge1xuICByZWFkb25seSB0eXBlOiBTY2FuTG9nc091dHB1dFR5cGU7XG59XG5cbi8qKlxuICogT3V0cHV0IGNvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncyB0byBDbG91ZFdhdGNoIExvZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zIGV4dGVuZHMgU2NhbkxvZ3NPdXRwdXRPcHRpb25zIHtcbiAgcmVhZG9ubHkgbG9nR3JvdXBOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTGFtYmRhIGZ1bmN0aW9uIGV2ZW50IG9iamVjdCBmb3IgU2Nhbm5lciBDdXN0b20gUmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMge1xuICByZWFkb25seSBhZGRyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlVXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlnbm9yZVVuZml4ZWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IHN0cmluZ1tdO1xuICByZWFkb25seSBzY2FubmVyczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGltYWdlQ29uZmlnU2Nhbm5lcnM6IHN0cmluZ1tdO1xuICByZWFkb25seSBleGl0Q29kZTogbnVtYmVyO1xuICByZWFkb25seSBleGl0T25Fb2w6IG51bWJlcjtcbiAgcmVhZG9ubHkgdHJpdnlJZ25vcmU6IHN0cmluZ1tdO1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXQ/
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDSCxJQUFZLGtCQUVYO0FBRkQsV0FBWSxrQkFBa0I7SUFDNUIsd0RBQWtDLENBQUE7QUFDcEMsQ0FBQyxFQUZXLGtCQUFrQixrQ0FBbEIsa0JBQWtCLFFBRTdCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnVtIGZvciBTY2FuTG9nc091dHB1dFR5cGVcbiAqL1xuZXhwb3J0IGVudW0gU2NhbkxvZ3NPdXRwdXRUeXBlIHtcbiAgQ0xPVURXQVRDSF9MT0dTID0gJ2Nsb3VkV2F0Y2hMb2dzJyxcbn1cblxuLyoqXG4gKiBPdXRwdXQgY29uZmlndXJhdGlvbnMgZm9yIHNjYW4gbG9ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FuTG9nc091dHB1dE9wdGlvbnMge1xuICByZWFkb25seSB0eXBlOiBTY2FuTG9nc091dHB1dFR5cGU7XG59XG5cbi8qKlxuICogT3V0cHV0IGNvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncyB0byBDbG91ZFdhdGNoIExvZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRXYXRjaExvZ3NPdXRwdXRPcHRpb25zIGV4dGVuZHMgU2NhbkxvZ3NPdXRwdXRPcHRpb25zIHtcbiAgcmVhZG9ubHkgbG9nR3JvdXBOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTGFtYmRhIGZ1bmN0aW9uIGV2ZW50IG9iamVjdCBmb3IgU2Nhbm5lciBDdXN0b20gUmVzb3VyY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Nhbm5lckN1c3RvbVJlc291cmNlUHJvcHMge1xuICByZWFkb25seSBhZGRyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlVXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlnbm9yZVVuZml4ZWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V2ZXJpdHk6IHN0cmluZ1tdO1xuICByZWFkb25seSBzY2FubmVyczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGltYWdlQ29uZmlnU2Nhbm5lcnM6IHN0cmluZ1tdO1xuICByZWFkb25seSBleGl0Q29kZTogbnVtYmVyO1xuICByZWFkb25seSBleGl0T25Fb2w6IG51bWJlcjtcbiAgcmVhZG9ubHkgdHJpdnlJZ25vcmU6IHN0cmluZ1tdO1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXQ/OiBTY2FuTG9nc091dHB1dE9wdGlvbnM7XG4gIHJlYWRvbmx5IHN1cHByZXNzRXJyb3JPblJvbGxiYWNrOiBzdHJpbmc7XG59XG4iXX0=
|