image-scanner-with-trivy 2.4.0 → 2.4.2

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
@@ -3962,7 +3962,7 @@
3962
3962
  },
3963
3963
  "name": "image-scanner-with-trivy",
3964
3964
  "readme": {
3965
- "markdown": "# image-scanner-with-trivy\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 **block deployments to ECS, Lambda, and other services, or prevent the image from being pushed to ECR**. You can also choose to **receive notifications without failing the deployment**.\n\nScan results and **SBOM (Software Bill of Materials) can be output to S3** for further analysis and compliance reporting.\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**This library is featured on the ecosystem page of [Trivy's official documentation](https://trivy.dev/docs/latest/ecosystem/ide/#image-scanner-with-trivy-community)!**\n\n## Usage\n\n### Install\n\n```sh\nnpm install image-scanner-with-trivy\n```\n\n### CDK Code\n\n**Note: We recommend using `ImageScannerWithTrivyV2`.** See the [V2 Construct](#v2-construct) section for details and migration guide.\n\nThe following code is a minimal example that scans the image and blocks the ECS deployment if vulnerabilities are detected.\n\n```ts\nimport { ImageScannerWithTrivyV2 } from 'image-scanner-with-trivy';\n\n// Target image to scan\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\n// Example of an ECS construct that uses the image\nconst ecs = new YourECSConstruct(this, 'YourECSConstruct', {\n dockerImage: image,\n // ...\n});\n\n// Scan the image before deploying to ECS\nconst imageScanner = new ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // If vulnerabilities are detected, the ECS deployment will be blocked\n // Note: This option only works when `failOnVulnerability` is `true` (default).\n blockConstructs: [ecs],\n});\n```\n\n#### Other Use Cases\n\nFor scanning the image and blocking `ECRDeployment` (copying images from `DockerImageAsset` ECR to another ECR repository) if vulnerabilities are detected:\n\n```ts\nimport { ImageScannerWithTrivyV2 } 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 ecrDeployment = new ECRDeployment(this, 'DeployImage', {\n src: new DockerImageName(image.imageUri),\n dest: new DockerImageName(`${repository.repositoryUri}:latest`),\n});\n\nconst imageScanner = new ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // If vulnerabilities are detected, the ECRDeployment will be blocked\n blockConstructs: [ecrDeployment],\n});\n```\n\n### Default Log Group\n\nIf you want to use a custom log group for the Scanner Lambda function's default log group, you can specify the `defaultLogGroup` option.\n\nIf you use ImageScannerWithTrivyV2 construct multiple times in the same stack, you have to set the same log group for `defaultLogGroup` for each construct.\nWhen you set different log groups for each construct, a warning message will be displayed.\n\n```ts\nimport { ImageScannerWithTrivyV2 } from 'image-scanner-with-trivy';\n\nconst logGroup = new LogGroup(this, 'LogGroup');\n\nnew ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Specify the log group to use as the default log group for Scanner Lambda.\n defaultLogGroup: logGroup,\n});\n\n// NG example\n// When multiple ImageScannerWithTrivyV2 constructs have different default log groups, a warning will be displayed.\nnew ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivyWithAnotherDefaultLogGroup', {\n imageUri: anotherImage.imageUri,\n repository: anotherImage.repository,\n defaultLogGroup: new LogGroup(this, 'AnotherDefaultLogGroup'), // NG example - different log group from the previous construct\n // defaultLogGroup: logGroup, // OK example - use the same log group for all constructs\n});\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\nYou can output scan logs to CloudWatch Logs or S3.\n\n#### CloudWatch Logs\n\nYou can output scan logs to a specific CloudWatch Logs log group using `ScanLogsOutput.cloudWatchLogs`.\n\n```ts\nconst scanLogsLogGroup = new LogGroup(this, 'ScanLogsLogGroup');\n\nconst imageScanner = new ImageScannerWithTrivyV2(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: scanLogsLogGroup }),\n});\n```\n\n**Note on Large Scan Results**: CloudWatch Logs has a limit of 1 MB per log event. If Trivy scan results exceed this limit, they will be automatically split into multiple log events. Each chunk will be prefixed with `[part X/Y]` to indicate the sequence, ensuring no data loss while staying within CloudWatch Logs quotas. **For large scan results, we recommend using S3 output instead** to avoid fragmentation and make it easier to view complete results.\n\n#### S3\n\nYou can output scan logs to an S3 bucket using `ScanLogsOutput.s3`.\n\n```ts\nconst scanLogsBucket = new Bucket(this, 'ScanLogsBucket');\n\nconst imageScanner = new ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.s3` method to specify the S3 bucket.\n scanLogsOutput: ScanLogsOutput.s3({\n bucket: scanLogsBucket,\n prefix: 'scan-logs/', // Optional: specify a prefix for S3 objects\n }),\n});\n```\n\nAdditionally, you can output SBOM (Software Bill of Materials) in various formats by specifying the `sbomFormat` option.\n\nAvailable SBOM formats:\n\n- `SbomFormat.CYCLONEDX` - CycloneDX JSON format\n- `SbomFormat.SPDX_JSON` - SPDX JSON format\n- `SbomFormat.SPDX` - SPDX Tag-Value format (human-readable)\n\n**Important**: SBOM generation is not a vulnerability scan. When `sbomFormat` is specified:\n\n- Trivy generates a Software Bill of Materials (SBOM) instead of performing a vulnerability scan\n- The scan will not fail regardless of the `failOnVulnerability` setting\n- SNS notifications (`vulnsNotificationTopic`) will not be sent since no vulnerabilities are detected\n- The SBOM file and stderr logs will be uploaded to S3\n\n```ts\nconst scanLogsBucket = new Bucket(this, 'ScanLogsBucket');\n\nconst imageScanner = new ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.s3` method to specify the S3 bucket.\n scanLogsOutput: ScanLogsOutput.s3({\n bucket: scanLogsBucket,\n sbomFormat: SbomFormat.CYCLONEDX, // Optional: output SBOM in CycloneDX format\n }),\n});\n```\n\n### SNS Notification for Vulnerabilities\n\nYou can configure an SNS topic to receive notifications when vulnerabilities or EOL (End of Life) OS are detected.\n\nThe notification is sent **regardless of the `failOnVulnerability` setting**. This means you can receive notifications even when you don't want the deployment to fail.\n\n```ts\nconst notificationTopic = new Topic(this, 'VulnerabilityNotificationTopic');\n\nnew ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Receive notifications for vulnerabilities and EOL detection\n vulnsNotificationTopic: notificationTopic,\n // You can choose not to fail the deployment while still receiving notifications\n failOnVulnerability: false,\n});\n```\n\nYou can specify an SNS topic associated with AWS Chatbot, as notifications are sent in AWS Chatbot message format.\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\nnew ImageScannerWithTrivyV2(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## V2 Construct\n\n### What's changed in V2?\n\nThe `ImageScannerWithTrivyV2` construct introduces several API improvements and new features while maintaining the same core functionality:\n\n1. **Improved API Design**\n - `exitCode` and `exitOnEol` → `failOnVulnerability` (boolean): More intuitive boolean property to control whether to fail on vulnerabilities or EOL\n - `platform` → `targetImagePlatform`: Uses the new `TargetImagePlatform` class for better type safety\n\n2. **Improved Trivy Ignore Configuration**\n - New `TrivyIgnore` class for more flexible ignore configuration\n - Support for both inline rules (`TrivyIgnore.fromRules()`) and file paths (`TrivyIgnore.fromFilePath()`)\n - Support for both `.trivyignore` and `.trivyignore.yaml` formats\n\n3. **Enhanced Log Management**\n - `defaultLogGroup` property for Scanner Lambda's default log group\n - Simplified log configuration by consolidating previous separate properties\n - CloudWatch Logs output now supports separate log streams for stdout and stderr\n\n4. **New Features**\n - S3 support for scan logs output with SBOM format support (`ScanLogsOutput.s3()`)\n - SNS notification support for vulnerabilities (`vulnsNotificationTopic`): Receive notifications even when you don't want the deployment to fail by setting `failOnVulnerability: false`\n - `blockConstructs` property to automatically block dependent constructs on vulnerability detection\n\n### Migration from V1 to V2\n\nTo migrate from V1 to V2, follow these steps:\n\n**Update the import statement**:\n\n```ts\n// Before (V1)\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\n// After (V2)\nimport { ImageScannerWithTrivyV2 } from 'image-scanner-with-trivy';\n```\n\n**Update to new properties**:\n\n```ts\n// Before (V1)\nnew ImageScannerWithTrivy(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n exitCode: 1, // or 0\n exitOnEol: 1, // or 0\n platform: 'linux/amd64',\n trivyIgnore: [\n 'CVE-2021-12345',\n 'CVE-2021-67890',\n ],\n});\n\n// After (V2)\nnew ImageScannerWithTrivyV2(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n failOnVulnerability: true, // or false\n // failOnEol behavior is now included in failOnVulnerability\n targetImagePlatform: TargetImagePlatform.LINUX_AMD64,\n trivyIgnore: TrivyIgnore.fromRules([\n 'CVE-2021-12345',\n 'CVE-2021-67890',\n ]),\n});\n```\n\n**Update log group configuration** (if you were using custom log settings):\n\n```ts\n// Before (V1)\nnew ImageScannerWithTrivy(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n defaultLogGroupRetentionDays: RetentionDays.ONE_WEEK,\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n});\n\n// After (V2)\n// Create a custom log group with retention and removal policy\nconst logGroup = new LogGroup(this, 'DefaultLogGroup', {\n retention: RetentionDays.ONE_WEEK,\n removalPolicy: RemovalPolicy.DESTROY,\n});\n\n// Use `defaultLogGroup` for Scanner Lambda's default log group\nnew ImageScannerWithTrivyV2(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n defaultLogGroup: logGroup,\n});\n```\n\n**Update dependencies using `blockConstructs`** (if you were using `construct.node.addDependency()` to block deployments):\n\n```ts\n// Before (V1)\nconst constructToBlock = new YourConstruct(this, 'YourConstruct');\nconst scanner = new ImageScannerWithTrivy(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n});\n\n// Manually add dependencies to block constructs on vulnerability detection\nconstructToBlock.node.addDependency(scanner);\n\n// After (V2)\nnew ImageScannerWithTrivyV2(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n blockConstructs: [constructToBlock], // Automatically block the construct on vulnerability detection\n});\n\n// constructToBlock.node.addDependency(scanner); // No longer needed - blockConstructs handles this automatically\n```\n\n### Important Notes on Migration\n\n⚠️ **CloudWatch Logs Considerations**\n\nWhen you migrate from V1 to V2, the following log behavior changes occur:\n\n1. **Different Log Group**: V2 uses a new internal Lambda function (with different UUID). As a result, **scan logs will be output to a different log group** than V1.\n\n2. **Previous Log Group Retention**: The V1 log group behavior after migration depends on your `defaultLogGroupRemovalPolicy` setting:\n\n```ts\n// V1 construct configuration\nnew ImageScannerWithTrivy(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY, // or RETAIN (default)\n});\n```\n\n- If you set `RemovalPolicy.DESTROY`, the V1 log group will be deleted when you remove the V1 construct.\n- If you used the **default** (`RemovalPolicy.RETAIN`), **the V1 log group will be retained** in your AWS account. You'll need to manually delete it if desired, or keep it for log history.\n\nIf you want to preserve your V1 scan logs, make sure to use `RemovalPolicy.RETAIN` or back them up before migration.\n\n## API Reference\n\nAPI Reference is [here](./API.md#api-reference-).\n"
3965
+ "markdown": "# image-scanner-with-trivy\n\n## What is\n\nThis is an AWS CDK Construct that allows you to **scan container images with [Trivy](https://github.com/aquasecurity/trivy) in CDK deployment layer**.\n\nIf it detects vulnerabilities, it can **block deployments** to ECS, Lambda, and other services, or prevent the image from being pushed to the application ECR. You can also choose to receive **notifications without failing the deployment**.\n\n- **Block deployments on vulnerability detection** — works with ECS, Lambda, application ECR push, or any construct\n- **Notify without failing** — get alerts via SNS without blocking deployment. Great for gradual adoption\n- **Scan logs output** — results go to CloudWatch Logs or S3\n- **SBOM generation** — output Software Bill of Materials in CycloneDX or SPDX format to S3 for compliance reporting\n- **Works with any ECR image** — not just images built in the same stack. Scan existing repository images too\n\n**This library is featured on the ecosystem page of [Trivy's official documentation](https://trivy.dev/docs/latest/ecosystem/ide/#image-scanner-with-trivy-community)!**\n\n## Why not ECR scanning?\n\nECR's basic scanning is asynchronous and does not block deployments. ECR Enhanced Scanning (Amazon Inspector) costs money per scan and still does not natively integrate with CloudFormation deployment flow.\n\nThis construct runs Trivy as a CloudFormation Custom Resource during `cdk deploy`. If vulnerabilities are found, **CloudFormation rolls back automatically** — no one can bypass the scan. It gives you **synchronous, deployment-blocking scans at no additional cost**.\n\n## Usage\n\n### Install\n\n```sh\nnpm install image-scanner-with-trivy\n```\n\n### CDK Code\n\n**Note: We recommend using `ImageScannerWithTrivyV2`.** See the [V2 Construct](#v2-construct) section for details and migration guide.\n\nThe following code is a minimal example that scans the image and blocks the ECS deployment if vulnerabilities are detected.\n\n```ts\nimport { ImageScannerWithTrivyV2 } from 'image-scanner-with-trivy';\n\n// Target image to scan\nconst image = new DockerImageAsset(this, 'DockerImage', {\n directory: resolve(__dirname, './'),\n});\n\n// Example of an ECS construct that uses the image\nconst ecs = new YourECSConstruct(this, 'YourECSConstruct', {\n dockerImage: image,\n // ...\n});\n\n// Scan the image before deploying to ECS\nconst imageScanner = new ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // If vulnerabilities are detected, the ECS deployment will be blocked\n // Note: This option only works when `failOnVulnerability` is `true` (default).\n blockConstructs: [ecs],\n});\n```\n\n#### Other Use Cases\n\nFor scanning the image and blocking `ECRDeployment` (copying images from `DockerImageAsset` ECR to another ECR repository) if vulnerabilities are detected:\n\n```ts\nimport { ImageScannerWithTrivyV2 } 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 ecrDeployment = new ECRDeployment(this, 'DeployImage', {\n src: new DockerImageName(image.imageUri),\n dest: new DockerImageName(`${repository.repositoryUri}:latest`),\n});\n\nconst imageScanner = new ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // If vulnerabilities are detected, the ECRDeployment will be blocked\n blockConstructs: [ecrDeployment],\n});\n```\n\n### Default Log Group\n\nIf you want to use a custom log group for the Scanner Lambda function's default log group, you can specify the `defaultLogGroup` option.\n\nIf you use ImageScannerWithTrivyV2 construct multiple times in the same stack, you have to set the same log group for `defaultLogGroup` for each construct.\nWhen you set different log groups for each construct, a warning message will be displayed.\n\n```ts\nimport { ImageScannerWithTrivyV2 } from 'image-scanner-with-trivy';\n\nconst logGroup = new LogGroup(this, 'LogGroup');\n\nnew ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Specify the log group to use as the default log group for Scanner Lambda.\n defaultLogGroup: logGroup,\n});\n\n// NG example\n// When multiple ImageScannerWithTrivyV2 constructs have different default log groups, a warning will be displayed.\nnew ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivyWithAnotherDefaultLogGroup', {\n imageUri: anotherImage.imageUri,\n repository: anotherImage.repository,\n defaultLogGroup: new LogGroup(this, 'AnotherDefaultLogGroup'), // NG example - different log group from the previous construct\n // defaultLogGroup: logGroup, // OK example - use the same log group for all constructs\n});\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\nYou can output scan logs to CloudWatch Logs or S3.\n\n#### CloudWatch Logs\n\nYou can output scan logs to a specific CloudWatch Logs log group using `ScanLogsOutput.cloudWatchLogs`.\n\n```ts\nconst scanLogsLogGroup = new LogGroup(this, 'ScanLogsLogGroup');\n\nconst imageScanner = new ImageScannerWithTrivyV2(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: scanLogsLogGroup }),\n});\n```\n\n**Note on Large Scan Results**: CloudWatch Logs has a limit of 1 MB per log event. If Trivy scan results exceed this limit, they will be automatically split into multiple log events. Each chunk will be prefixed with `[part X/Y]` to indicate the sequence, ensuring no data loss while staying within CloudWatch Logs quotas. **For large scan results, we recommend using S3 output instead** to avoid fragmentation and make it easier to view complete results.\n\n#### S3\n\nYou can output scan logs to an S3 bucket using `ScanLogsOutput.s3`.\n\n```ts\nconst scanLogsBucket = new Bucket(this, 'ScanLogsBucket');\n\nconst imageScanner = new ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.s3` method to specify the S3 bucket.\n scanLogsOutput: ScanLogsOutput.s3({\n bucket: scanLogsBucket,\n prefix: 'scan-logs/', // Optional: specify a prefix for S3 objects\n }),\n});\n```\n\nAdditionally, you can output SBOM (Software Bill of Materials) in various formats by specifying the `sbomFormat` option.\n\nAvailable SBOM formats:\n\n- `SbomFormat.CYCLONEDX` - CycloneDX JSON format\n- `SbomFormat.SPDX_JSON` - SPDX JSON format\n- `SbomFormat.SPDX` - SPDX Tag-Value format (human-readable)\n\n**Important**: SBOM generation is not a vulnerability scan. When `sbomFormat` is specified:\n\n- Trivy generates a Software Bill of Materials (SBOM) instead of performing a vulnerability scan\n- The scan will not fail regardless of the `failOnVulnerability` setting\n- SNS notifications (`vulnsNotificationTopic`) will not be sent since no vulnerabilities are detected\n- The SBOM file and stderr logs will be uploaded to S3\n\n```ts\nconst scanLogsBucket = new Bucket(this, 'ScanLogsBucket');\n\nconst imageScanner = new ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Use `ScanLogsOutput.s3` method to specify the S3 bucket.\n scanLogsOutput: ScanLogsOutput.s3({\n bucket: scanLogsBucket,\n sbomFormat: SbomFormat.CYCLONEDX, // Optional: output SBOM in CycloneDX format\n }),\n});\n```\n\n### SNS Notification for Vulnerabilities\n\nYou can configure an SNS topic to receive notifications when vulnerabilities or EOL (End of Life) OS are detected.\n\nThe notification is sent **regardless of the `failOnVulnerability` setting**. This means you can receive notifications even when you don't want the deployment to fail.\n\n```ts\nconst notificationTopic = new Topic(this, 'VulnerabilityNotificationTopic');\n\nnew ImageScannerWithTrivyV2(this, 'ImageScannerWithTrivy', {\n imageUri: image.imageUri,\n repository: image.repository,\n // Receive notifications for vulnerabilities and EOL detection\n vulnsNotificationTopic: notificationTopic,\n // You can choose not to fail the deployment while still receiving notifications\n failOnVulnerability: false,\n});\n```\n\nYou can specify an SNS topic associated with AWS Chatbot, as notifications are sent in AWS Chatbot message format.\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\nnew ImageScannerWithTrivyV2(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## V2 Construct\n\n### What's changed in V2?\n\nThe `ImageScannerWithTrivyV2` construct introduces several API improvements and new features while maintaining the same core functionality:\n\n1. **Improved API Design**\n - `exitCode` and `exitOnEol` → `failOnVulnerability` (boolean): More intuitive boolean property to control whether to fail on vulnerabilities or EOL\n - `platform` → `targetImagePlatform`: Uses the new `TargetImagePlatform` class for better type safety\n\n2. **Improved Trivy Ignore Configuration**\n - New `TrivyIgnore` class for more flexible ignore configuration\n - Support for both inline rules (`TrivyIgnore.fromRules()`) and file paths (`TrivyIgnore.fromFilePath()`)\n - Support for both `.trivyignore` and `.trivyignore.yaml` formats\n\n3. **Enhanced Log Management**\n - `defaultLogGroup` property for Scanner Lambda's default log group\n - Simplified log configuration by consolidating previous separate properties\n - CloudWatch Logs output now supports separate log streams for stdout and stderr\n\n4. **New Features**\n - S3 support for scan logs output with SBOM format support (`ScanLogsOutput.s3()`)\n - SNS notification support for vulnerabilities (`vulnsNotificationTopic`): Receive notifications even when you don't want the deployment to fail by setting `failOnVulnerability: false`\n - `blockConstructs` property to automatically block dependent constructs on vulnerability detection\n\n### Migration from V1 to V2\n\nTo migrate from V1 to V2, follow these steps:\n\n**Update the import statement**:\n\n```ts\n// Before (V1)\nimport { ImageScannerWithTrivy } from 'image-scanner-with-trivy';\n\n// After (V2)\nimport { ImageScannerWithTrivyV2 } from 'image-scanner-with-trivy';\n```\n\n**Update to new properties**:\n\n```ts\n// Before (V1)\nnew ImageScannerWithTrivy(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n exitCode: 1, // or 0\n exitOnEol: 1, // or 0\n platform: 'linux/amd64',\n trivyIgnore: [\n 'CVE-2021-12345',\n 'CVE-2021-67890',\n ],\n});\n\n// After (V2)\nnew ImageScannerWithTrivyV2(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n failOnVulnerability: true, // or false\n // failOnEol behavior is now included in failOnVulnerability\n targetImagePlatform: TargetImagePlatform.LINUX_AMD64,\n trivyIgnore: TrivyIgnore.fromRules([\n 'CVE-2021-12345',\n 'CVE-2021-67890',\n ]),\n});\n```\n\n**Update log group configuration** (if you were using custom log settings):\n\n```ts\n// Before (V1)\nnew ImageScannerWithTrivy(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n defaultLogGroupRetentionDays: RetentionDays.ONE_WEEK,\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY,\n});\n\n// After (V2)\n// Create a custom log group with retention and removal policy\nconst logGroup = new LogGroup(this, 'DefaultLogGroup', {\n retention: RetentionDays.ONE_WEEK,\n removalPolicy: RemovalPolicy.DESTROY,\n});\n\n// Use `defaultLogGroup` for Scanner Lambda's default log group\nnew ImageScannerWithTrivyV2(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n defaultLogGroup: logGroup,\n});\n```\n\n**Update dependencies using `blockConstructs`** (if you were using `construct.node.addDependency()` to block deployments):\n\n```ts\n// Before (V1)\nconst constructToBlock = new YourConstruct(this, 'YourConstruct');\nconst scanner = new ImageScannerWithTrivy(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n});\n\n// Manually add dependencies to block constructs on vulnerability detection\nconstructToBlock.node.addDependency(scanner);\n\n// After (V2)\nnew ImageScannerWithTrivyV2(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n blockConstructs: [constructToBlock], // Automatically block the construct on vulnerability detection\n});\n\n// constructToBlock.node.addDependency(scanner); // No longer needed - blockConstructs handles this automatically\n```\n\n### Important Notes on Migration\n\n⚠️ **CloudWatch Logs Considerations**\n\nWhen you migrate from V1 to V2, the following log behavior changes occur:\n\n1. **Different Log Group**: V2 uses a new internal Lambda function (with different UUID). As a result, **scan logs will be output to a different log group** than V1.\n\n2. **Previous Log Group Retention**: The V1 log group behavior after migration depends on your `defaultLogGroupRemovalPolicy` setting:\n\n```ts\n// V1 construct configuration\nnew ImageScannerWithTrivy(this, 'Scanner', {\n imageUri: image.imageUri,\n repository: image.repository,\n defaultLogGroupRemovalPolicy: RemovalPolicy.DESTROY, // or RETAIN (default)\n});\n```\n\n- If you set `RemovalPolicy.DESTROY`, the V1 log group will be deleted when you remove the V1 construct.\n- If you used the **default** (`RemovalPolicy.RETAIN`), **the V1 log group will be retained** in your AWS account. You'll need to manually delete it if desired, or keep it for log history.\n\nIf you want to preserve your V1 scan logs, make sure to use `RemovalPolicy.RETAIN` or back them up before migration.\n\n## API Reference\n\nAPI Reference is [here](./API.md#api-reference-).\n"
3966
3966
  },
3967
3967
  "repository": {
3968
3968
  "type": "git",
@@ -5508,6 +5508,6 @@
5508
5508
  "symbolId": "src/image-scanner-with-trivy-v2:TrivyIgnoreFileType"
5509
5509
  }
5510
5510
  },
5511
- "version": "2.4.0",
5512
- "fingerprint": "EF/SVlRMgfMGP+2Tq1Qrps4sJDgJvyLVMpC5EI3ycys="
5511
+ "version": "2.4.2",
5512
+ "fingerprint": "ZXp5q+AJ4QwC6QLS1+QUrVkR/HYHvOe3nzjybMuyQTg="
5513
5513
  }
package/README.md CHANGED
@@ -2,19 +2,23 @@
2
2
 
3
3
  ## What is
4
4
 
5
- This is an AWS CDK Construct that allows you to **scan container images with Trivy in CDK deployment layer**.
5
+ This is an AWS CDK Construct that allows you to **scan container images with [Trivy](https://github.com/aquasecurity/trivy) in CDK deployment layer**.
6
6
 
7
- If it detects vulnerabilities, it can **block deployments to ECS, Lambda, and other services, or prevent the image from being pushed to ECR**. You can also choose to **receive notifications without failing the deployment**.
7
+ If it detects vulnerabilities, it can **block deployments** to ECS, Lambda, and other services, or prevent the image from being pushed to the application ECR. You can also choose to receive **notifications without failing the deployment**.
8
8
 
9
- Scan results and **SBOM (Software Bill of Materials) can be output to S3** for further analysis and compliance reporting.
9
+ - **Block deployments on vulnerability detection** works with ECS, Lambda, application ECR push, or any construct
10
+ - **Notify without failing** — get alerts via SNS without blocking deployment. Great for gradual adoption
11
+ - **Scan logs output** — results go to CloudWatch Logs or S3
12
+ - **SBOM generation** — output Software Bill of Materials in CycloneDX or SPDX format to S3 for compliance reporting
13
+ - **Works with any ECR image** — not just images built in the same stack. Scan existing repository images too
10
14
 
11
- Since it takes an `imageUri` for ECR as an argument, it can also be used to **simply scan an existing image in the repository**.
15
+ **This library is featured on the ecosystem page of [Trivy's official documentation](https://trivy.dev/docs/latest/ecosystem/ide/#image-scanner-with-trivy-community)!**
12
16
 
13
- ## Trivy
17
+ ## Why not ECR scanning?
14
18
 
15
- [Trivy](https://github.com/aquasecurity/trivy) is a comprehensive and versatile security scanner.
19
+ ECR's basic scanning is asynchronous and does not block deployments. ECR Enhanced Scanning (Amazon Inspector) costs money per scan and still does not natively integrate with CloudFormation deployment flow.
16
20
 
17
- **This library is featured on the ecosystem page of [Trivy's official documentation](https://trivy.dev/docs/latest/ecosystem/ide/#image-scanner-with-trivy-community)!**
21
+ This construct runs Trivy as a CloudFormation Custom Resource during `cdk deploy`. If vulnerabilities are found, **CloudFormation rolls back automatically** — no one can bypass the scan. It gives you **synchronous, deployment-blocking scans at no additional cost**.
18
22
 
19
23
  ## Usage
20
24
 
@@ -4,6 +4,6 @@ WORKDIR /
4
4
 
5
5
  COPY dist/index.js /var/task/index.js
6
6
 
7
- COPY --from=aquasec/trivy:latest /usr/local/bin/trivy /opt
7
+ COPY --from=ghcr.io/aquasecurity/trivy:0.69.3@sha256:bcc376de8d77cfe086a917230e818dc9f8528e3c852f7b1aff648949b6258d1c /usr/local/bin/trivy /opt
8
8
 
9
9
  CMD ["index.handler"]
@@ -68,7 +68,7 @@ class TrivyIgnore {
68
68
  }
69
69
  exports.TrivyIgnore = TrivyIgnore;
70
70
  _a = JSII_RTTI_SYMBOL_1;
71
- TrivyIgnore[_a] = { fqn: "image-scanner-with-trivy.TrivyIgnore", version: "2.4.0" };
71
+ TrivyIgnore[_a] = { fqn: "image-scanner-with-trivy.TrivyIgnore", version: "2.4.2" };
72
72
  /**
73
73
  * Enum for Target Image Platform
74
74
  */
@@ -87,7 +87,7 @@ class TargetImagePlatform {
87
87
  }
88
88
  exports.TargetImagePlatform = TargetImagePlatform;
89
89
  _b = JSII_RTTI_SYMBOL_1;
90
- TargetImagePlatform[_b] = { fqn: "image-scanner-with-trivy.TargetImagePlatform", version: "2.4.0" };
90
+ TargetImagePlatform[_b] = { fqn: "image-scanner-with-trivy.TargetImagePlatform", version: "2.4.2" };
91
91
  /**
92
92
  * Linux AMD64 platform
93
93
  */
@@ -185,5 +185,5 @@ class ImageScannerWithTrivyV2 extends constructs_1.Construct {
185
185
  }
186
186
  exports.ImageScannerWithTrivyV2 = ImageScannerWithTrivyV2;
187
187
  _c = JSII_RTTI_SYMBOL_1;
188
- ImageScannerWithTrivyV2[_c] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivyV2", version: "2.4.0" };
188
+ ImageScannerWithTrivyV2[_c] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivyV2", version: "2.4.2" };
189
189
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5LXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltYWdlLXNjYW5uZXItd2l0aC10cml2eS12Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJCQUFrQztBQUNsQywrQkFBNEI7QUFDNUIsNkNBU3FCO0FBRXJCLCtEQUFzRDtBQUN0RCxpREFBc0Q7QUFDdEQsdURBTWdDO0FBR2hDLG1FQUF3RDtBQUN4RCwyQ0FBbUQ7QUFHbkQsbUNBQWtFO0FBRWxFOztHQUVHO0FBQ0gsSUFBWSxtQkFjWDtBQWRELFdBQVksbUJBQW1CO0lBQzdCOzs7O09BSUc7SUFDSCxrREFBMkIsQ0FBQTtJQUUzQjs7OztPQUlHO0lBQ0gsNERBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQWRXLG1CQUFtQixtQ0FBbkIsbUJBQW1CLFFBYzlCO0FBRUQ7Ozs7R0FJRztBQUNILE1BQWEsV0FBVztJQUN0Qjs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQWU7UUFDckMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUN4QixJQUFZLEVBQ1osV0FBZ0MsbUJBQW1CLENBQUMsV0FBVztRQUUvRCxNQUFNLE9BQU8sR0FBRyxJQUFBLGlCQUFZLEVBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLDZEQUE2RDtRQUM3RCwrR0FBK0c7UUFDL0csT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxZQUNrQixLQUFlLEVBQ2YsUUFBOEI7UUFEOUIsVUFBSyxHQUFMLEtBQUssQ0FBVTtRQUNmLGFBQVEsR0FBUixRQUFRLENBQXNCO0lBQzdDLENBQUM7O0FBbENOLGtDQW1DQzs7O0FB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UUFBUTtZQUNoRCxRQUFRLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hELE1BQU0sRUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUN4RCx1QkFBdUIsRUFBRSxNQUFNLENBQUMsdUJBQXVCLENBQUM7WUFDeEQsYUFBYSxFQUFFLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxRQUFRO1lBQ3JELG1CQUFtQixFQUNqQixJQUFJLENBQUMsZUFBZSxFQUFFLFlBQVksSUFBSSxlQUFlLG9CQUFvQixDQUFDLFlBQVksRUFBRTtTQUMzRixDQUFDO1FBRUYsSUFBSSw0QkFBYyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDbkMsWUFBWSxFQUFFLGlDQUFpQztZQUMvQyxVQUFVLEVBQUUsc0JBQXNCO1lBQ2xDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxZQUFZO1NBQ2hELENBQUMsQ0FBQztRQUVILG1EQUFtRDtRQUNuRCxLQUFLLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzNDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQzs7QUF6R0gsMERBMEdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGlvbnMsXG4gIEFzcGVjdHMsXG4gIEN1c3RvbVJlc291cmNlLFxuICBEdXJhdGlvbixcbiAgSWdub3JlTW9kZSxcbiAgU2l6ZSxcbiAgU3RhY2ssXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7XG4gIEFyY2hpdGVjdHVyZSxcbiAgQXNzZXRDb2RlLFxuICBIYW5kbGVyLFxuICBSdW50aW1lLFxuICBTaW5nbGV0b25GdW5jdGlvbixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBJTG9nR3JvdXAgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBJVG9waWMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFNjYW5uZXJDdXN0b21SZXNvdXJjZVByb3BzIH0gZnJvbSAnLi9jdXN0b20tcmVzb3VyY2UtcHJvcHMnO1xuaW1wb3J0IHsgU2NhbkxvZ3NPdXRwdXQgfSBmcm9tICcuL3NjYW4tbG9ncy1vdXRwdXQnO1xuaW1wb3J0IHsgU2V2ZXJpdHksIFNjYW5uZXJzLCBJbWFnZUNvbmZpZ1NjYW5uZXJzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRmlsZSB0eXBlIGZvciBUcml2eUlnbm9yZSBmaWxlIHBhdGhcbiAqL1xuZXhwb3J0IGVudW0gVHJpdnlJZ25vcmVGaWxlVHlwZSB7XG4gIC8qKlxuICAgKiAudHJpdnlpZ25vcmUgZmlsZVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vdHJpdnkuZGV2L2RvY3MvbGF0ZXN0L2NvbmZpZ3VyYXRpb24vZmlsdGVyaW5nLyN0cml2eWlnbm9yZVxuICAgKi9cbiAgVFJJVllJR05PUkUgPSAnVFJJVllJR05PUkUnLFxuXG4gIC8qKlxuICAgKiAudHJpdnlpZ25vcmUueWFtbCBmaWxlXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly90cml2eS5kZXYvZG9jcy9sYXRlc3QvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JleWFtbFxuICAgKi9cbiAgVFJJVllJR05PUkVfWUFNTCA9ICdUUklWWUlHTk9SRV9ZQU1MJyxcbn1cblxuLyoqXG4gKiBVbmlvbi1saWtlIGNsYXNzIGZvciBzcGVjaWZ5aW5nIFRyaXZ5IGlnbm9yZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIFlvdSBjYW4gZWl0aGVyIHNwZWNpZnkgaWdub3JlIHJ1bGVzIGlubGluZSwgb3IgcG9pbnQgdG8gYW4gZXhpc3RpbmcgaWdub3JlIGZpbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcml2eUlnbm9yZSB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IGlnbm9yZSBydWxlcyBpbmxpbmUgKGVxdWl2YWxlbnQgdG8gd3JpdGluZyBsaW5lcyBpbiBhIC50cml2eWlnbm9yZSBmaWxlKS5cbiAgICpcbiAgICogQHBhcmFtIHJ1bGVzIEVhY2ggZWxlbWVudCBjb3JyZXNwb25kcyB0byBvbmUgbGluZSBpbiB0aGUgLnRyaXZ5aWdub3JlIGZpbGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly90cml2eS5kZXYvZG9jcy9sYXRlc3QvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21SdWxlcyhydWxlczogc3RyaW5nW10pOiBUcml2eUlnbm9yZSB7XG4gICAgcmV0dXJuIG5ldyBUcml2eUlnbm9yZShydWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgcGF0aCB0byBhbiBleGlzdGluZyB0cml2eWlnbm9yZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBQYXRoIHRvIHRoZSBpZ25vcmUgZmlsZS5cbiAgICogQHBhcmFtIGZpbGVUeXBlIEZpbGUgZm9ybWF0LiBEZWZhdWx0cyB0byBgVHJpdnlJZ25vcmVGaWxlVHlwZS5UUklWWUlHTk9SRWAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly90cml2eS5kZXYvZG9jcy9sYXRlc3QvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JlXG4gICAqIEBzZWUgaHR0cHM6Ly90cml2eS5kZXYvZG9jcy9sYXRlc3QvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JleWFtbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmlsZVBhdGgoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGVUeXBlOiBUcml2eUlnbm9yZUZpbGVUeXBlID0gVHJpdnlJZ25vcmVGaWxlVHlwZS5UUklWWUlHTk9SRSxcbiAgKTogVHJpdnlJZ25vcmUge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0aCwgJ3V0Zi04Jyk7XG4gICAgLy8gUGFzcyBsaW5lcyBhcy1pcyB3aXRob3V0IHN0cmlwcGluZyBjb21tZW50cyBvciBlbXB0eSBsaW5lc1xuICAgIC8vIGJlY2F1c2UgVHJpdnkgaXRzZWxmIGhhbmRsZXMgY29tbWVudCBsaW5lcyAoc3RhcnRpbmcgd2l0aCBgI2ApIGFuZCBlbXB0eSBsaW5lcyB3aGVuIHJlYWRpbmcgdGhlIGlnbm9yZSBmaWxlLlxuICAgIHJldHVybiBuZXcgVHJpdnlJZ25vcmUoY29udGVudC5zcGxpdCgnXFxuJyksIGZpbGVUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHJ1bGVzOiBzdHJpbmdbXSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsZVR5cGU/OiBUcml2eUlnbm9yZUZpbGVUeXBlLFxuICApIHt9XG59XG5cbi8qKlxuICogRW51bSBmb3IgVGFyZ2V0IEltYWdlIFBsYXRmb3JtXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRJbWFnZVBsYXRmb3JtIHtcbiAgLyoqXG4gICAqIExpbnV4IEFNRDY0IHBsYXRmb3JtXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExJTlVYX0FNRDY0ID0gbmV3IFRhcmdldEltYWdlUGxhdGZvcm0oJ2xpbnV4L2FtZDY0Jyk7XG5cbiAgLyoqXG4gICAqIExpbnV4IEFSTTY0IHBsYXRmb3JtXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExJTlVYX0FSTTY0ID0gbmV3IFRhcmdldEltYWdlUGxhdGZvcm0oJ2xpbnV4L2FybTY0Jyk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB2YWx1ZSBmb3IgdGFyZ2V0IGltYWdlIHBsYXRmb3JtXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBzaG91bGQgYmUgaW4gdGhlIGZvcm1hdCBPUy9BcmNoaXRlY3R1cmUgZm9yIHRoZSBpbWFnZSwgc3VjaCBhcyBgbGludXgvYXJtNjRgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20odmFsdWU6IHN0cmluZyk6IFRhcmdldEltYWdlUGxhdGZvcm0ge1xuICAgIHJldHVybiBuZXcgVGFyZ2V0SW1hZ2VQbGF0Zm9ybSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEltYWdlU2Nhbm5lcldpdGhUcml2eVYyIENvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZVNjYW5uZXJXaXRoVHJpdnlWMlByb3BzIHtcbiAgLyoqXG4gICAqIEltYWdlIFVSSSBmb3Igc2NhbiB0YXJnZXQuXG4gICAqL1xuICByZWFkb25seSBpbWFnZVVyaTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IGluY2x1ZGluZyB0aGUgaW1hZ2UgVVJJIGZvciBzY2FuIHRhcmdldC5cbiAgICpcbiAgICogQmVjYXVzZSBvZiBncmFudFB1bGwgdG8gQ3VzdG9tUmVzb3VyY2VMYW1iZGEuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBJUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogVGhlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcyBtZWFuIHRoYXQgdGhlIHBhdGNoIGhhcyBub3QgeWV0IGJlZW4gcHJvdmlkZWQgb24gdGhlaXIgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBUbyBoaWRlIHVuZml4ZWQvdW5maXhhYmxlIHZ1bG5lcmFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGAtLWlnbm9yZS11bmZpeGVkYCBmbGFnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vdHJpdnkuZGV2L2RvY3MvbGF0ZXN0L3NjYW5uZXIvdnVsbmVyYWJpbGl0eS8jdW5maXhlZC12dWxuZXJhYmlsaXRpZXNcbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZVVuZml4ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXZlcml0eSBTZWxlY3Rpb25cbiAgICpcbiAgICogVGhlIHNldmVyaXR5IGlzIHRha2VuIGZyb20gdGhlIHNlbGVjdGVkIGRhdGEgc291cmNlIHNpbmNlIHRoZSBzZXZlcml0eSBmcm9tIHZlbmRvcnMgaXMgbW9yZSBhY2N1cmF0ZS5cbiAgICogVXNpbmcgQ1ZFLTIwMjMtMDQ2NCBhcyBhbiBleGFtcGxlLCB3aGlsZSBpdCBpcyByYXRlZCBhcyBcIkhJR0hcIiBpbiBOVkQsIFJlZCBIYXQgaGFzIG1hcmtlZCBpdHMgJ0ltcGFjdCcgYXMgXCJMb3dcIi4gQXMgYSByZXN1bHQsIFRyaXZ5IHdpbGwgZGlzcGxheSBpdCBhcyBcIkxvd1wiLlxuICAgKlxuICAgKiBUaGUgc2V2ZXJpdHkgZGVwZW5kcyBvbiB0aGUgY29tcGlsZSBvcHRpb24sIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGV0Yy4gTlZEIGRvZXNuJ3Qga25vdyBob3cgdGhlIHZlbmRvciBkaXN0cmlidXRlcyB0aGUgc29mdHdhcmUuXG4gICAqIFJlZCBIYXQgZXZhbHVhdGVzIHRoZSBzZXZlcml0eSBtb3JlIGFjY3VyYXRlbHkuIFRoYXQncyB3aHkgVHJpdnkgcHJlZmVycyB2ZW5kb3Igc2NvcmVzIG92ZXIgTlZELlxuICAgKlxuICAgKiBJdCBkZWZhdWx0cyB0byBgQ1JJVElDQUxgIElOIFRISVMgQ09OU1RSVUNUIGZvciBzYWZldHkgaW4gQ0kvQ0QsIGJ1dCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIFRyaXZ5IGlzIFwiQ1JJVElDQUwsSElHSCxNRURJVU0sTE9XLFVOS05PV05cIi5cbiAgICpcbiAgICogQGRlZmF1bHQgW1NldmVyaXR5LkNSSVRJQ0FMXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vdHJpdnkuZGV2L2RvY3MvbGF0ZXN0L3NjYW5uZXIvdnVsbmVyYWJpbGl0eS8jc2V2ZXJpdHktc2VsZWN0aW9uXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eT86IFNldmVyaXR5W107XG5cbiAgLyoqXG4gICAqIEVuYWJsZS9EaXNhYmxlIFNjYW5uZXJzXG4gICAqXG4gICAqIFlvdSBjYW4gZW5hYmxlL2Rpc2FibGUgc2Nhbm5lcnMgd2l0aCB0aGUgYHNjYW5uZXJzYC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGNvbnRhaW5lciBpbWFnZSBzY2FubmluZyBlbmFibGVzIHZ1bG5lcmFiaWxpdHkgKFZVTE4pIGFuZCBzZWNyZXQgc2Nhbm5lcnMgKFNFQ1JFVCkgYnkgZGVmYXVsdC5cbiAgICogSWYgeW91IGRvbid0IG5lZWQgc2VjcmV0IHNjYW5uaW5nLCBpdCBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBTY2FubmVycy5WVUxOIG9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtTZWN1cml0eS5WVUxOLFNjYW5uZXJzLlNFQ1JFVF1cbiAgICpcbiAgICogQHNlZSBodHRwczovL3RyaXZ5LmRldi9kb2NzL2xhdGVzdC9jb25maWd1cmF0aW9uL290aGVycy8jZW5hYmxlZGlzYWJsZS1zY2FubmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgc2Nhbm5lcnM/OiBTY2FubmVyc1tdO1xuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBJbWFnZUNvbmZpZ1NjYW5uZXJzXG4gICAqXG4gICAqIENvbnRhaW5lciBpbWFnZXMgaGF2ZSBjb25maWd1cmF0aW9uLiBkb2NrZXIgaW5zcGVjdCBhbmQgYGRvY2tlciBoaXN0b3J5YCBzaG93IHRoZSBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqIFRyaXZ5IHNjYW5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGNvbnRhaW5lciBpbWFnZXMgZm9yXG4gICAqXG4gICAqIC0gTWlzY29uZmlndXJhdGlvbnNcbiAgICogLSBTZWNyZXRzXG4gICAqXG4gICAqIFRoZXkgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuIFlvdSBjYW4gZW5hYmxlIHRoZW0gd2l0aCBgaW1hZ2VDb25maWdTY2FubmVyc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly90cml2eS5kZXYvZG9jcy9sYXRlc3QvdGFyZ2V0L2NvbnRhaW5lcl9pbWFnZS8jY29udGFpbmVyLWltYWdlLW1ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBpbWFnZUNvbmZpZ1NjYW5uZXJzPzogSW1hZ2VDb25maWdTY2FubmVyc1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZhaWwgb24gdnVsbmVyYWJpbGl0aWVzIG9yIEVPTCAoRW5kIG9mIExpZmUpIGltYWdlc1xuICAgKlxuICAgKiBJZiBzZXQgdG8gYHRydWVgLCBUcml2eSBleGl0cyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIHdoZW4gdnVsbmVyYWJpbGl0aWVzIG9yIEVPTCBpbWFnZXMgYXJlIGRldGVjdGVkLlxuICAgKlxuICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgVHJpdnkgZXhpdHMgd2l0aCBhIHplcm8gZXhpdCBjb2RlIGV2ZW4gd2hlbiB2dWxuZXJhYmlsaXRpZXMgb3IgRU9MIGltYWdlcyBhcmUgZGV0ZWN0ZWQuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIGB0cnVlYCBJTiBUSElTIENPTlNUUlVDVCBmb3Igc2FmZXR5IGluIENJL0NELiBJbiB0aGUgb3JpZ2luYWwgdHJpdnksIGl0IGlzIGBmYWxzZWAgKGV4aXQgY29kZSAwKS5cbiAgICpcbiAgICogKipOb3RlKio6IFdoZW4gYHNib21Gb3JtYXRgIGlzIHNwZWNpZmllZCBpbiBgc2NhbkxvZ3NPdXRwdXQuczMoKWAsIFNCT00gZ2VuZXJhdGlvbiBtb2RlIGlzIHVzZWQgaW5zdGVhZCBvZlxuICAgKiB2dWxuZXJhYmlsaXR5IHNjYW5uaW5nLiBJbiBTQk9NIG1vZGUsIFRyaXZ5IGFsd2F5cyBleGl0cyB3aXRoIGNvZGUgMCByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZywgYW5kXG4gICAqIG5vIFNOUyBub3RpZmljYXRpb25zIHdpbGwgYmUgc2VudCBldmVuIGlmIGB2dWxuc05vdGlmaWNhdGlvblRvcGljYCBpcyBjb25maWd1cmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly90cml2eS5kZXYvZG9jcy9sYXRlc3QvY29uZmlndXJhdGlvbi9vdGhlcnMvI2V4aXQtY29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbE9uVnVsbmVyYWJpbGl0eT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElnbm9yZSBydWxlcyBvciBpZ25vcmUgZmlsZSBmb3IgVHJpdnkuXG4gICAqXG4gICAqIFVzZSBgVHJpdnlJZ25vcmUuZnJvbVJ1bGVzKClgIHRvIHNwZWNpZnkgaW5saW5lIGlnbm9yZSBydWxlcyAoZXF1aXZhbGVudCB0byB3cml0aW5nIGxpbmVzXG4gICAqIGluIGEgYC50cml2eWlnbm9yZWAgZmlsZSksIG9yIGBUcml2eUlnbm9yZS5mcm9tRmlsZVBhdGgoKWAgdG8gcG9pbnQgdG8gYW4gZXhpc3RpbmcgaWdub3JlIGZpbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gaWdub3JlIHJ1bGVzXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly90cml2eS5kZXYvZG9jcy9sYXRlc3QvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JlXG4gICAqIEBzZWUgaHR0cHM6Ly90cml2eS5kZXYvZG9jcy9sYXRlc3QvY29uZmlndXJhdGlvbi9maWx0ZXJpbmcvI3RyaXZ5aWdub3JleWFtbFxuICAgKi9cbiAgcmVhZG9ubHkgdHJpdnlJZ25vcmU/OiBUcml2eUlnbm9yZTtcblxuICAvKipcbiAgICogTWVtb3J5IFNpemUgKE1CKSBmb3IgU2Nhbm5lciBMYW1iZGFcbiAgICpcbiAgICogWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gYDMwMDhgIGFuZCBgMTAyNDBgLlxuICAgKlxuICAgKiBJZiB0aGlzIENvbnN0cnVjdCBleGVjdXRpb24gdGVybWluYXRlcyBhYm5vcm1hbGx5IGR1ZSB0byBTSUdLSUxMLCB0cnkgYSBsYXJnZXIgc2l6ZS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZSAoYDMwMDhgIE1CKSBpcyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAzMDA4XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTY2FuIEltYWdlIG9uIGEgc3BlY2lmaWMgQXJjaGl0ZWN0dXJlIGFuZCBPU1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRyaXZ5IGxvYWRzIGFuIGltYWdlIG9uIGEgYGxpbnV4L2FtZDY0YCBtYWNoaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0SW1hZ2VQbGF0Zm9ybT86IFRhcmdldEltYWdlUGxhdGZvcm07XG5cbiAgLyoqXG4gICAqIFRoZSBTY2FubmVyIExhbWJkYSBmdW5jdGlvbidzIGRlZmF1bHQgbG9nIGdyb3VwXG4gICAqXG4gICAqIElmIHlvdSB1c2UgSW1hZ2VTY2FubmVyV2l0aFRyaXZ5VjIgY29uc3RydWN0IG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHN0YWNrLFxuICAgKiB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBzYW1lIGxvZyBncm91cCBmb3IgZWFjaCBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIFNlZSBgRGVmYXVsdCBMb2cgR3JvdXBgIHNlY3Rpb24gaW4gdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNjYW5uZXIgTGFtYmRhIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKS5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRMb2dHcm91cD86IElMb2dHcm91cDtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3Igc2NhbiBsb2dzIG91dHB1dFxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzY2FuIGxvZ3MgYXJlIG91dHB1dCB0byBkZWZhdWx0IGxvZyBncm91cCBjcmVhdGVkIGJ5IFNjYW5uZXIgTGFtYmRhLlxuICAgKlxuICAgKiBTcGVjaWZ5IHRoaXMgaWYgeW91IHdhbnQgdG8gc2VuZCBzY2FuIGxvZ3MgdG8gb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBsb2cgZ3JvdXAuXG4gICAqXG4gICAqICoqTm90ZSoqOiBDbG91ZFdhdGNoIExvZ3MgaGFzIGEgMSBNQiBwZXIgbG9nIGV2ZW50IGxpbWl0LiBMYXJnZSBzY2FuIHJlc3VsdHMgd2lsbCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IHNwbGl0IGludG8gbXVsdGlwbGUgZXZlbnRzIHdpdGggYFtwYXJ0IFgvWV1gIHByZWZpeGVzLiAqKkZvciBsYXJnZSBzY2FuXG4gICAqIHJlc3VsdHMsIHdlIHJlY29tbWVuZCB1c2luZyBTMyBvdXRwdXQqKiB0byBhdm9pZCBmcmFnbWVudGF0aW9uIGFuZCBtYWtlIGl0IGVhc2llciB0b1xuICAgKiB2aWV3IGNvbXBsZXRlIHJlc3VsdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbiBsb2dzIG91dHB1dCB0byBgZGVmYXVsdExvZ0dyb3VwYCBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZSB0byB0aGUgZGVmYXVsdFxuICAgKiBsb2cgZ3JvdXAgY3JlYXRlZCBieSBTY2FubmVyIExhbWJkYS5cbiAgICovXG4gIHJlYWRvbmx5IHNjYW5Mb2dzT3V0cHV0PzogU2NhbkxvZ3NPdXRwdXQ7XG5cbiAgLyoqXG4gICAqIFN1cHByZXNzIGVycm9ycyBkdXJpbmcgcm9sbGJhY2sgc2Nhbm5lciBMYW1iZGEgZXhlY3V0aW9uXG4gICAqXG4gICAqIFdoZW4gaW1hZ2Ugc2Nhbm5pbmcgZmFpbHMsIENsb3VkRm9ybWF0aW9uIHRyaWdnZXJzIGEgcm9sbGJhY2sgYW5kIGV4ZWN1dGVzIHRoZSBwcmV2aW91c1xuICAgKiB2ZXJzaW9uIG9mIHRoZSBzY2FubmVyIExhbWJkYS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZlxuICAgKiB0aGUgc2Nhbm5lciBMYW1iZGEgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IsIGV2ZW4gaWYgdGhlIGltYWdlIHNjYW5uaW5nIGZvciB0aGUgcHJldmlvdXMgdmVyc2lvblxuICAgKiBmYWlscy5cbiAgICpcbiAgICogVGhpcyBhbGxvd3MgdGhlIHJvbGxiYWNrIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSwgYXZvaWRpbmcgUk9MTEJBQ0tfRkFJTEVEIHN0YXRlXG4gICAqIHdoZW4gaW1hZ2Ugc2Nhbm5pbmcgZmFpbHVyZXMgb2NjdXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHN1cHByZXNzRXJyb3JPblJvbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU05TIHRvcGljIGZvciB2dWxuZXJhYmlsaXRpZXMgbm90aWZpY2F0aW9uXG4gICAqXG4gICAqIElmIHNwZWNpZmllZCwgYW4gU05TIHRvcGljIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHNlbnQgd2hlbiB2dWxuZXJhYmlsaXRpZXMgb3IgRU9MIChFbmQgb2YgTGlmZSkgT1MgYXJlIGRldGVjdGVkLlxuICAgKlxuICAgKiBUaGUgbm90aWZpY2F0aW9uIGlzIHNlbnQgcmVnYXJkbGVzcyBvZiB0aGUgYGZhaWxPblZ1bG5lcmFiaWxpdHlgIHNldHRpbmcuXG4gICAqIFRoaXMgbWVhbnMgeW91IGNhbiBjaG9vc2UgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIGV2ZW4gd2hlbiB5b3UgZG9uJ3Qgd2FudCB0aGUgZGVwbG95bWVudCB0byBmYWlsLlxuICAgKlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgYW4gU05TIHRvcGljIGFzc29jaWF0ZWQgd2l0aCBBV1MgQ2hhdGJvdCwgYXMgbm90aWZpY2F0aW9ucyBhcmUgc2VudCBpbiBBV1MgQ2hhdGJvdCBtZXNzYWdlIGZvcm1hdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBub3RpZmljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHZ1bG5zTm90aWZpY2F0aW9uVG9waWM/OiBJVG9waWM7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdG8gYmxvY2sgaWYgdnVsbmVyYWJpbGl0aWVzIGFyZSBkZXRlY3RlZC5cbiAgICpcbiAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgYGNvbnN0cnVjdC5ub2RlLmFkZERlcGVuZGVuY3koaW1hZ2VTY2FubmVyKWAgZm9yIGVhY2ggY29uc3RydWN0LlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIG9wdGlvbiBvbmx5IHdvcmtzIHdoZW4gYGZhaWxPblZ1bG5lcmFiaWxpdHlgIGlzIGB0cnVlYCAoZGVmYXVsdCkuXG4gICAqIElmIGBmYWlsT25WdWxuZXJhYmlsaXR5YCBpcyBzZXQgdG8gYGZhbHNlYCwgdGhlIHNjYW5uZXIgd2lsbCBub3QgZmFpbCBvbiB2dWxuZXJhYmlsaXRpZXMsXG4gICAqIGFuZCB0aGUgc3BlY2lmaWVkIGNvbnN0cnVjdHMgd2lsbCBub3QgYmUgYmxvY2tlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb25zdHJ1Y3RzIHRvIGJsb2NrXG4gICAqL1xuICByZWFkb25seSBibG9ja0NvbnN0cnVjdHM/OiBJQ29uc3RydWN0W107XG59XG5cbi8vIE1heGltdW0gTGFtYmRhIG1lbW9yeSBzaXplIGZvciBkZWZhdWx0IEFXUyBhY2NvdW50IHdpdGhvdXQgcXVvdGEgbGltaXQgaW5jcmVhc2VcbmNvbnN0IERFRkFVTFRfTUVNT1JZX1NJWkUgPSAzMDA4O1xuXG4vKipcbiAqIEEgQ29uc3RydWN0IHRoYXQgc2NhbnMgY29udGFpbmVyIGltYWdlcyB3aXRoIFRyaXZ5LlxuICogSXQgdXNlcyBhIExhbWJkYSBmdW5jdGlvbiBhcyBhIEN1c3RvbSBSZXNvdXJjZSBwcm92aWRlciB0byBydW4gVHJpdnkgYW5kIHNjYW4gY29udGFpbmVyIGltYWdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlU2Nhbm5lcldpdGhUcml2eVYyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0TG9nR3JvdXA/OiBJTG9nR3JvdXA7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEltYWdlU2Nhbm5lcldpdGhUcml2eVYyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMubWVtb3J5U2l6ZSAmJlxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5tZW1vcnlTaXplKSAmJlxuICAgICAgKHByb3BzLm1lbW9yeVNpemUgPCAzMDA4IHx8IHByb3BzLm1lbW9yeVNpemUgPiAxMDI0MClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW4gc3BlY2lmeSBiZXR3ZWVuIFxcYDMwMDhcXGAgYW5kIFxcYDEwMjQwXFxgIGZvciBcXGBtZW1vcnlTaXplXFxgLCBnb3QgJHtwcm9wcy5tZW1vcnlTaXplfS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmRlZmF1bHRMb2dHcm91cCA9IHByb3BzLmRlZmF1bHRMb2dHcm91cDtcbiAgICBjb25zdCBsYW1iZGFQdXJwb3NlID0gJ0N1c3RvbTo6SW1hZ2VTY2FubmVyV2l0aFRyaXZ5VjJDdXN0b21SZXNvdXJjZUxhbWJkYSc7XG5cbiAgICBjb25zdCBjdXN0b21SZXNvdXJjZUxhbWJkYSA9IG5ldyBTaW5nbGV0b25GdW5jdGlvbih0aGlzLCAnQ3VzdG9tUmVzb3VyY2VMYW1iZGEnLCB7XG4gICAgICB1dWlkOiAnY2MzYjQxYjUtNDcwMS1kODZmLWZlMjQtM2EwNGY0YTU3M2YxJyxcbiAgICAgIGxhbWJkYVB1cnBvc2UsXG4gICAgICBydW50aW1lOiBSdW50aW1lLkZST01fSU1BR0UsXG4gICAgICBoYW5kbGVyOiBIYW5kbGVyLkZST01fSU1BR0UsXG4gICAgICBjb2RlOiBBc3NldENvZGUuZnJvbUFzc2V0SW1hZ2Uoam9pbihfX2Rpcm5hbWUsICcuLi9hc3NldHMvbGFtYmRhJyksIHtcbiAgICAgICAgcGxhdGZvcm06IFBsYXRmb3JtLkxJTlVYX0FSTTY0LFxuICAgICAgICBpZ25vcmVNb2RlOiBJZ25vcmVNb2RlLkRPQ0tFUixcbiAgICAgIH0pLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg5MDApLFxuICAgICAgcmV0cnlBdHRlbXB0czogMCxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgPz8gREVGQVVMVF9NRU1PUllfU0laRSxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBTaXplLmdpYmlieXRlcygxMCksIC8vIGZvciBjYXNlcyB0aGF0IG5lZWQgdG8gdXBkYXRlIHRyaXZ5IERCOiAvdG1wL3RyaXZ5L2RiL3RyaXZ5LmRiXG4gICAgICBsb2dHcm91cDogdGhpcy5kZWZhdWx0TG9nR3JvdXAsXG4gICAgfSk7XG5cbiAgICBwcm9wcy5yZXBvc2l0b3J5LmdyYW50UHVsbChjdXN0b21SZXNvdXJjZUxhbWJkYSk7XG5cbiAgICBpZiAocHJvcHMudnVsbnNOb3RpZmljYXRpb25Ub3BpYykge1xuICAgICAgcHJvcHMudnVsbnNOb3RpZmljYXRpb25Ub3BpYy5ncmFudFB1Ymxpc2goY3VzdG9tUmVzb3VyY2VMYW1iZGEpO1xuICAgIH1cblxuICAgIC8vIEdyYW50IENsb3VkRm9ybWF0aW9uIERlc2NyaWJlU3RhY2tzIHBlcm1pc3Npb24gZm9yIHJvbGxiYWNrIGRldGVjdGlvbiB3aGVuIHN1cHByZXNzRXJyb3JPblJvbGxiYWNrIGlzIGVuYWJsZWRcbiAgICBjb25zdCBzdXBwcmVzc0Vycm9yT25Sb2xsYmFjayA9IHByb3BzLnN1cHByZXNzRXJyb3JPblJvbGxiYWNrID8/IHRydWU7XG4gICAgaWYgKHN1cHByZXNzRXJyb3JPblJvbGxiYWNrKSB7XG4gICAgICBjdXN0b21SZXNvdXJjZUxhbWJkYS5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFsnY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja3MnXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFtTdGFjay5vZih0aGlzKS5zdGFja0lkXSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIElmIG11bHRpcGxlIEltYWdlU2Nhbm5lcldpdGhUcml2eVYyIGNvbnN0cnVjdHMgaW4gdGhlIHNhbWUgc3RhY2sgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdCBsb2cgZ3JvdXBzLCBhZGQgYSB3YXJuaW5nIGFubm90YXRpb24uXG4gICAgQXNwZWN0cy5vZihTdGFjay5vZih0aGlzKSkuYWRkKHtcbiAgICAgIHZpc2l0OiAobm9kZSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbm9kZSBpbnN0YW5jZW9mIEltYWdlU2Nhbm5lcldpdGhUcml2eVYyICYmXG4gICAgICAgICAgbm9kZS5fZGVmYXVsdExvZ0dyb3VwPy5ub2RlLnBhdGggIT09IHRoaXMuZGVmYXVsdExvZ0dyb3VwPy5ub2RlLnBhdGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAgICAgJ0BpbWFnZS1zY2FubmVyLXdpdGgtdHJpdnk6ZHVwbGljYXRlTGFtYmRhRGVmYXVsdExvZ0dyb3VwJyxcbiAgICAgICAgICAgIFwiWW91IGhhdmUgdG8gc2V0IHRoZSBzYW1lIGxvZyBncm91cCBmb3IgJ2RlZmF1bHRMb2dHcm91cCcgZm9yIGVhY2ggSW1hZ2VTY2FubmVyV2l0aFRyaXZ5VjIgY29uc3RydWN0IGluIHRoZSBzYW1lIHN0YWNrLlwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbWFnZVNjYW5uZXJQcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCAnUHJvdmlkZXInLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogY3VzdG9tUmVzb3VyY2VMYW1iZGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbWFnZVNjYW5uZXJQcm9wZXJ0aWVzOiBTY2FubmVyQ3VzdG9tUmVzb3VyY2VQcm9wcyA9IHtcbiAgICAgIGFkZHI6IHRoaXMubm9kZS5hZGRyLFxuICAgICAgaW1hZ2VVcmk6IHByb3BzLmltYWdlVXJpLFxuICAgICAgaWdub3JlVW5maXhlZDogU3RyaW5nKHByb3BzLmlnbm9yZVVuZml4ZWQgPz8gZmFsc2UpLFxuICAgICAgc2V2ZXJpdHk6IHByb3BzLnNldmVyaXR5ID8/IFtTZXZlcml0eS5DUklUSUNBTF0sXG4gICAgICBzY2FubmVyczogcHJvcHMuc2Nhbm5lcnMgPz8gW10sXG4gICAgICBpbWFnZUNvbmZpZ1NjYW5uZXJzOiBwcm9wcy5pbWFnZUNvbmZpZ1NjYW5uZXJzID8/IFtdLFxuICAgICAgZmFpbE9uVnVsbmVyYWJpbGl0eTogU3RyaW5nKHByb3BzLmZhaWxPblZ1bG5lcmFiaWxpdHkgPz8gdHJ1ZSksXG4gICAgICB0cml2eUlnbm9yZTogcHJvcHMudHJpdnlJZ25vcmU/LnJ1bGVzID8/IFtdLFxuICAgICAgdHJpdnlJZ25vcmVGaWxlVHlwZTogcHJvcHMudHJpdnlJZ25vcmU/LmZpbGVUeXBlLFxuICAgICAgcGxhdGZvcm06IHByb3BzLnRhcmdldEltYWdlUGxhdGZvcm0/LnZhbHVlID8/ICcnLFxuICAgICAgb3V0cHV0OiBwcm9wcy5zY2FuTG9nc091dHB1dD8uYmluZChjdXN0b21SZXNvdXJjZUxhbWJkYSksXG4gICAgICBzdXBwcmVzc0Vycm9yT25Sb2xsYmFjazogU3RyaW5nKHN1cHByZXNzRXJyb3JPblJvbGxiYWNrKSxcbiAgICAgIHZ1bG5zVG9waWNBcm46IHByb3BzLnZ1bG5zTm90aWZpY2F0aW9uVG9waWM/LnRvcGljQXJuLFxuICAgICAgZGVmYXVsdExvZ0dyb3VwTmFtZTpcbiAgICAgICAgdGhpcy5kZWZhdWx0TG9nR3JvdXA/LmxvZ0dyb3VwTmFtZSA/PyBgL2F3cy9sYW1iZGEvJHtjdXN0b21SZXNvdXJjZUxhbWJkYS5mdW5jdGlvbk5hbWV9YCxcbiAgICB9O1xuXG4gICAgbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6SW1hZ2VTY2FubmVyV2l0aFRyaXZ5VjInLFxuICAgICAgcHJvcGVydGllczogaW1hZ2VTY2FubmVyUHJvcGVydGllcyxcbiAgICAgIHNlcnZpY2VUb2tlbjogaW1hZ2VTY2FubmVyUHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgIH0pO1xuXG4gICAgLy8gQmxvY2sgY29uc3RydWN0cyBpZiB2dWxuZXJhYmlsaXRpZXMgYXJlIGRldGVjdGVkXG4gICAgcHJvcHMuYmxvY2tDb25zdHJ1Y3RzPy5mb3JFYWNoKChjb25zdHJ1Y3QpID0+IHtcbiAgICAgIGNvbnN0cnVjdC5ub2RlLmFkZERlcGVuZGVuY3kodGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldCBfZGVmYXVsdExvZ0dyb3VwKCk6IElMb2dHcm91cCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdExvZ0dyb3VwO1xuICB9XG59XG4iXX0=
@@ -135,5 +135,5 @@ class ImageScannerWithTrivy extends constructs_1.Construct {
135
135
  }
136
136
  exports.ImageScannerWithTrivy = ImageScannerWithTrivy;
137
137
  _a = JSII_RTTI_SYMBOL_1;
138
- ImageScannerWithTrivy[_a] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.4.0" };
138
+ ImageScannerWithTrivy[_a] = { fqn: "image-scanner-with-trivy.ImageScannerWithTrivy", version: "2.4.2" };
139
139
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Utc2Nhbm5lci13aXRoLXRyaXZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltYWdlLXNjYW5uZXItd2l0aC10cml2eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUE0QjtBQUM1Qiw2Q0FTcUI7QUFFckIsK0RBQXNEO0FBQ3RELGlEQUFzRDtBQUN0RCx1REFNZ0M7QUFDaEMsbURBQTRFO0FBQzVFLG1FQUF3RDtBQUN4RCwyQ0FBdUM7QUFHdkMsbUNBQWtFO0FBdU5sRSxrRkFBa0Y7QUFDbEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFakM7Ozs7O0dBS0c7QUFDSCxNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBQ2xELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUNFLEtBQUssQ0FBQyxVQUFVO1lBQ2hCLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNyQyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQ3JELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLDBFQUEwRSxLQUFLLENBQUMsVUFBVSxHQUFHLENBQzlGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsbURBQW1ELENBQUM7UUFDMUUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLDhCQUFpQixDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUMvRSxJQUFJLEVBQUUsc0NBQXNDO1lBQzVDLGFBQWE7WUFDYixPQUFPLEVBQUUsb0JBQU8sQ0FBQyxVQUFVO1lBQzNCLE9BQU8sRUFBRSxvQkFBTyxDQUFDLFVBQVU7WUFDM0IsSUFBSSxFQUFFLHNCQUFTLENBQUMsY0FBYyxDQUFDLElBQUEsV0FBSSxF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YSxFQUFFLEtBQUssQ0FBQyw0QkFBNEI7U0FDbEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDhCQUE4QixDQUNwQyxhQUE2QixFQUM3QixjQUFrQztRQUVsQyxRQUFRLGFBQWEsRUFBRSxDQUFDO1lBQ3RCLEtBQUssMkJBQWEsQ0FBQyxPQUFPO2dCQUN4QixPQUFPLGNBQWMsS0FBSywrQkFBaUIsQ0FBQyxNQUFNLENBQUM7WUFDckQsS0FBSywyQkFBYSxDQUFDLE1BQU07Z0JBQ3ZCLE9BQU8sY0FBYyxLQUFLLCtCQUFpQixDQUFDLE1BQU0sQ0FBQztZQUNyRCxLQUFLLDJCQUFhLENBQUMsUUFBUTtnQkFDekIsT0FBTyxjQUFjLEtBQUssK0JBQWlCLENBQUMsUUFBUSxDQUFDO1lBQ3ZELEtBQUssMkJBQWEsQ0FBQywwQkFBMEI7Z0JBQzNDLE9BQU8sY0FBYyxLQUFLLCtCQUFpQixDQUFDLHVCQUF1QixDQUFDO1lBQ3RFLEtBQUssU0FBUztnQkFDWixPQUFPLGNBQWMsS0FBSyxTQUFTLENBQUM7WUFDdEM7Z0JBQ0UsT0FBTyxhQUE2QixDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDOztBQTdKSCxzREE4SkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBBbm5vdGF0aW9ucyxcbiAgQ2ZuRGVsZXRpb25Qb2xpY3ksXG4gIEN1c3RvbVJlc291cmNlLFxuICBEdXJhdGlvbixcbiAgUmVtb3ZhbFBvbGljeSxcbiAgU2l6ZSxcbiAgU3RhY2ssXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJUmVwb3NpdG9yeSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0cyc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7XG4gIEFyY2hpdGVjdHVyZSxcbiAgQXNzZXRDb2RlLFxuICBIYW5kbGVyLFxuICBSdW50aW1lLFxuICBTaW5nbGV0b25GdW5jdGlvbixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDZm5Mb2dHcm91cCwgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBTY2FubmVyQ3VzdG9tUmVzb3VyY2VQcm9wcyB9IGZyb20gJy4vY3VzdG9tLXJlc291cmNlLXByb3BzJztcbmltcG9ydCB7IFNjYW5Mb2dzT3V0cHV0IH0gZnJvbSAnLi9zY2FuLWxvZ3Mtb3V0cHV0JztcbmltcG9ydCB7IFNldmVyaXR5LCBTY2FubmVycywgSW1hZ2VDb25maWdTY2FubmVycyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIEltYWdlU2Nhbm5lcldpdGhUcml2eSBDb25zdHJ1Y3QuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eVYyUHJvcHMgaW5zdGVhZC4gVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcyB7XG4gIC8qKlxuICAgKiBJbWFnZSBVUkkgZm9yIHNjYW4gdGFyZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VVcmk6IHN0cmluZztcblxuICAvKipcbiAgICogUmVwb3NpdG9yeSBpbmNsdWRpbmcgdGhlIGltYWdlIFVSSSBmb3Igc2NhbiB0YXJnZXQuXG4gICAqXG4gICAqIEJlY2F1c2Ugb2YgZ3JhbnRQdWxsIHRvIEN1c3RvbVJlc291cmNlTGFtYmRhLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogSVJlcG9zaXRvcnk7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmZpeGVkL3VuZml4YWJsZSB2dWxuZXJhYmlsaXRpZXMgbWVhbiB0aGF0IHRoZSBwYXRjaCBoYXMgbm90IHlldCBiZWVuIHByb3ZpZGVkIG9uIHRoZWlyIGRpc3RyaWJ1dGlvbi5cbiAgICpcbiAgICogVG8gaGlkZSB1bmZpeGVkL3VuZml4YWJsZSB2dWxuZXJhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgLS1pZ25vcmUtdW5maXhlZGAgZmxhZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3Mvc2Nhbm5lci92dWxuZXJhYmlsaXR5LyN1bmZpeGVkLXZ1bG5lcmFiaWxpdGllc1xuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlVW5maXhlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldmVyaXR5IFNlbGVjdGlvblxuICAgKlxuICAgKiBUaGUgc2V2ZXJpdHkgaXMgdGFrZW4gZnJvbSB0aGUgc2VsZWN0ZWQgZGF0YSBzb3VyY2Ugc2luY2UgdGhlIHNldmVyaXR5IGZyb20gdmVuZG9ycyBpcyBtb3JlIGFjY3VyYXRlLlxuICAgKiBVc2luZyBDVkUtMjAyMy0wNDY0IGFzIGFuIGV4YW1wbGUsIHdoaWxlIGl0IGlzIHJhdGVkIGFzIFwiSElHSFwiIGluIE5WRCwgUmVkIEhhdCBoYXMgbWFya2VkIGl0cyAnSW1wYWN0JyBhcyBcIkxvd1wiLiBBcyBhIHJlc3VsdCwgVHJpdnkgd2lsbCBkaXNwbGF5IGl0IGFzIFwiTG93XCIuXG4gICAqXG4gICAqIFRoZSBzZXZlcml0eSBkZXBlbmRzIG9uIHRoZSBjb21waWxlIG9wdGlvbiwgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgZXRjLiBOVkQgZG9lc24ndCBrbm93IGhvdyB0aGUgdmVuZG9yIGRpc3RyaWJ1dGVzIHRoZSBzb2Z0d2FyZS5cbiAgICogUmVkIEhhdCBldmFsdWF0ZXMgdGhlIHNldmVyaXR5IG1vcmUgYWNjdXJhdGVseS4gVGhhdCdzIHdoeSBUcml2eSBwcmVmZXJzIHZlbmRvciBzY29yZXMgb3ZlciBOVkQuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIGBDUklUSUNBTGAgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRCwgYnV0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgVHJpdnkgaXMgXCJDUklUSUNBTCxISUdILE1FRElVTSxMT1csVU5LTk9XTlwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbU2V2ZXJpdHkuQ1JJVElDQUxdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL3NjYW5uZXIvdnVsbmVyYWJpbGl0eS8jc2V2ZXJpdHktc2VsZWN0aW9uXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eT86IFNldmVyaXR5W107XG5cbiAgLyoqXG4gICAqIEVuYWJsZS9EaXNhYmxlIFNjYW5uZXJzXG4gICAqXG4gICAqIFlvdSBjYW4gZW5hYmxlL2Rpc2FibGUgc2Nhbm5lcnMgd2l0aCB0aGUgYHNjYW5uZXJzYC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGNvbnRhaW5lciBpbWFnZSBzY2FubmluZyBlbmFibGVzIHZ1bG5lcmFiaWxpdHkgKFZVTE4pIGFuZCBzZWNyZXQgc2Nhbm5lcnMgKFNFQ1JFVCkgYnkgZGVmYXVsdC5cbiAgICogSWYgeW91IGRvbid0IG5lZWQgc2VjcmV0IHNjYW5uaW5nLCBpdCBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBTY2FubmVycy5WVUxOIG9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtTZWN1cml0eS5WVUxOLFNjYW5uZXJzLlNFQ1JFVF1cbiAgICpcbiAgICogQHNlZSBodHRwczovL2FxdWFzZWN1cml0eS5naXRodWIuaW8vdHJpdnkvbGF0ZXN0L2RvY3MvY29uZmlndXJhdGlvbi9vdGhlcnMvI2VuYWJsZWRpc2FibGUtc2Nhbm5lcnNcbiAgICovXG4gIHJlYWRvbmx5IHNjYW5uZXJzPzogU2Nhbm5lcnNbXTtcblxuICAvKipcbiAgICogRW51bSBmb3IgSW1hZ2VDb25maWdTY2FubmVyc1xuICAgKlxuICAgKiBDb250YWluZXIgaW1hZ2VzIGhhdmUgY29uZmlndXJhdGlvbi4gZG9ja2VyIGluc3BlY3QgYW5kIGBkb2NrZXIgaGlzdG9yeWAgc2hvdyB0aGUgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uLlxuICAgKiBUcml2eSBzY2FucyB0aGUgY29uZmlndXJhdGlvbiBvZiBjb250YWluZXIgaW1hZ2VzIGZvclxuICAgKlxuICAgKiAtIE1pc2NvbmZpZ3VyYXRpb25zXG4gICAqIC0gU2VjcmV0c1xuICAgKlxuICAgKiBUaGV5IGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LiBZb3UgY2FuIGVuYWJsZSB0aGVtIHdpdGggYGltYWdlQ29uZmlnU2Nhbm5lcnNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vYXF1YXNlY3VyaXR5LmdpdGh1Yi5pby90cml2eS9sYXRlc3QvZG9jcy90YXJnZXQvY29udGFpbmVyX2ltYWdlLyNjb250YWluZXItaW1hZ2UtbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlQ29uZmlnU2Nhbm5lcnM/OiBJbWFnZUNvbmZpZ1NjYW5uZXJzW107XG5cbiAgLyoqXG4gICAqIEV4aXQgQ29kZVxuICAgKlxuICAgKiBVc2UgdGhlIGBleGl0Q29kZWAgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZS5cbiAgICpcbiAgICogWW91IGNhbiBzcGVjaWZ5IDAgaWYgeW91IGRvIG5vdCB3YW50IHRvIGV4aXQgZXZlbiB3aGVuIHZ1bG5lcmFiaWxpdGllcyBhcmUgZGV0ZWN0ZWQuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIDEgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRC4gSW4gdGhlIG9yaWdpbmFsIHRyaXZ5LCBpdCBpcyAwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNleGl0LWNvZGVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFeGl0IG9uIEVPTFxuICAgKlxuICAgKiBTb21ldGltZXMgeW91IG1heSBzdXJwcmlzaW5nbHkgZ2V0IDAgdnVsbmVyYWJpbGl0aWVzIGluIGFuIG9sZCBpbWFnZTpcbiAgICogIC0gRW5hYmxpbmcgLS1pZ25vcmUtdW5maXhlZCBvcHRpb24gd2hpbGUgYWxsIHBhY2thZ2VzIGhhdmUgbm8gZml4ZWQgdmVyc2lvbnMuXG4gICAqICAtIFNjYW5uaW5nIGEgcmF0aGVyIG91dGRhdGVkIE9TIChlLmcuIFVidW50dSAxMC4wNCkuXG4gICAqXG4gICAqIEFuIE9TIGF0IHRoZSBlbmQgb2Ygc2VydmljZS9saWZlIChFT0wpIHVzdWFsbHkgZ2V0cyBpbnRvIHRoaXMgc2l0dWF0aW9uLCB3aGljaCBpcyBkZWZpbml0ZWx5IGZ1bGwgb2YgdnVsbmVyYWJpbGl0aWVzLlxuICAgKiBgZXhpdE9uRW9sYCBjYW4gZmFpbCBzY2FubmluZyBvbiBFT0wgT1Mgd2l0aCBhIG5vbi16ZXJvIGNvZGUuXG4gICAqXG4gICAqIEl0IGRlZmF1bHRzIHRvIDEgSU4gVEhJUyBDT05TVFJVQ1QgZm9yIHNhZmV0eSBpbiBDSS9DRC4gSW4gdGhlIG9yaWdpbmFsIHRyaXZ5LCBpdCBpcyAwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vb3RoZXJzLyNleGl0LW9uLWVvbFxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdE9uRW9sPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCeSBGaW5kaW5nIElEc1xuICAgKlxuICAgKiBUaGUgaWdub3JlIHJ1bGVzIHdyaXR0ZW4gdG8gdGhlIC50cml2eWlnbm9yZSBpbiB0cml2eS5cbiAgICogUHV0IGVhY2ggbGluZSB5b3Ugd3JpdGUgaW4gdGhlIGZpbGUgaW50byBvbmUgZWxlbWVudCBvZiB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgICAkIGNhdCAudHJpdnlpZ25vcmVcbiAgICogICAgICMgQWNjZXB0IHRoZSByaXNrXG4gICAqICAgICBDVkUtMjAxOC0xNDYxOFxuICAgKlxuICAgKiAgICAgIyBBY2NlcHQgdGhlIHJpc2sgdW50aWwgMjAyMy0wMS0wMVxuICAgKiAgICAgQ1ZFLTIwMTktMTQ2OTcgZXhwOjIwMjMtMDEtMDFcbiAgICpcbiAgICogICAgICMgTm8gaW1wYWN0IGluIG91ciBzZXR0aW5nc1xuICAgKiAgICAgQ1ZFLTIwMTktMTU0M1xuICAgKlxuICAgKiAgICAgIyBJZ25vcmUgbWlzY29uZmlndXJhdGlvbnNcbiAgICogICAgIEFWRC1EUy0wMDAyXG4gICAqXG4gICAqICAgICAjIElnbm9yZSBzZWNyZXRzXG4gICAqICAgICBnZW5lcmljLXVud2FudGVkLXJ1bGVcbiAgICogICAgIGF3cy1hY2NvdW50LWlkXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9hcXVhc2VjdXJpdHkuZ2l0aHViLmlvL3RyaXZ5L2xhdGVzdC9kb2NzL2NvbmZpZ3VyYXRpb24vZmlsdGVyaW5nLyN0cml2eWlnbm9yZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpdnlJZ25vcmU/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWVtb3J5IFNpemUgKE1CKSBmb3IgU2Nhbm5lciBMYW1iZGFcbiAgICpcbiAgICogWW91IGNhbiBzcGVjaWZ5IGJldHdlZW4gYDMwMDhgIGFuZCBgMTAyNDBgLlxuICAgKlxuICAgKiBJZiB0aGlzIENvbnN0cnVjdCBleGVjdXRpb24gdGVybWluYXRlcyBhYm5vcm1hbGx5IGR1ZSB0byBTSUdLSUxMLCB0cnkgYSBsYXJnZXIgc2l6ZS5cbiAgICpcbiAgICogRGVmYXVsdCB2YWx1ZSAoYDMwMDhgIE1CKSBpcyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAzMDA4XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTY2FuIEltYWdlIG9uIGEgc3BlY2lmaWMgQXJjaGl0ZWN0dXJlIGFuZCBPU1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBUcml2eSBsb2FkcyBhbiBpbWFnZSBvbiBhIGBsaW51eC9hbWQ2NGAgbWFjaGluZS5cbiAgICpcbiAgICogVG8gY3VzdG9taXplIHRoaXMsIHBhc3MgYSBgcGxhdGZvcm1gIGFyZ3VtZW50IGluIHRoZSBmb3JtYXQgT1MvQXJjaGl0ZWN0dXJlIGZvciB0aGUgaW1hZ2UsIHN1Y2ggYXMgYGxpbnV4L2FybTY0YFxuICAgKlxuICAgKiBAZGVmYXVsdCAtXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlbW92YWwgcG9saWN5IHRvIGFwcGx5IHRvIFNjYW5uZXIgTGFtYmRhJ3MgZGVmYXVsdCBsb2cgZ3JvdXBcbiAgICpcbiAgICogSWYgeW91IHVzZSBJbWFnZVNjYW5uZXJXaXRoVHJpdnkgY29uc3RydWN0IG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHN0YWNrLCB5b3UgY2Fubm90IHNldCBkaWZmZXJlbnQgcmVtb3ZhbCBwb2xpY2llcyBmb3IgdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKiBTZWUgYE5vdGVzYCBzZWN0aW9uIGluIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTY2FubmVyIExhbWJkYSBjcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cChgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCkuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0TG9nR3JvdXBSZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkYXlzIGxvZyBldmVudHMgYXJlIGtlcHQgaW4gU2Nhbm5lciBMYW1iZGEncyBkZWZhdWx0IGxvZyBncm91cFxuICAgKlxuICAgKiBJZiB5b3UgdXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eSBjb25zdHJ1Y3QgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgc3RhY2ssIHlvdSBjYW5ub3Qgc2V0IGRpZmZlcmVudCByZXRlbnRpb24gZGF5cyBmb3IgdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKiBTZWUgYE5vdGVzYCBzZWN0aW9uIGluIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTY2FubmVyIExhbWJkYSBjcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cChgL2F3cy9sYW1iZGEvJHtmdW5jdGlvbk5hbWV9YCkgYW5kIGxvZyBldmVudHMgbmV2ZXIgZXhwaXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5cz86IFJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIHNjYW4gbG9ncyBvdXRwdXRcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgc2NhbiBsb2dzIGFyZSBvdXRwdXQgdG8gZGVmYXVsdCBsb2cgZ3JvdXAgY3JlYXRlZCBieSBTY2FubmVyIExhbWJkYS5cbiAgICpcbiAgICogU3BlY2lmeSB0aGlzIGlmIHlvdSB3YW50IHRvIHNlbmQgc2NhbiBsb2dzIHRvIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKlxuICAgKiBDdXJyZW50bHksIG9ubHkgYGNsb3VkV2F0Y2hMb2dzYCBpcyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbiBsb2dzIG91dHB1dCB0byBkZWZhdWx0IGxvZyBncm91cCBjcmVhdGVkIGJ5IFNjYW5uZXIgTGFtYmRhKGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gKVxuICAgKi9cbiAgcmVhZG9ubHkgc2NhbkxvZ3NPdXRwdXQ/OiBTY2FuTG9nc091dHB1dDtcblxuICAvKipcbiAgICogU3VwcHJlc3MgZXJyb3JzIGR1cmluZyByb2xsYmFjayBzY2FubmVyIExhbWJkYSBleGVjdXRpb25cbiAgICpcbiAgICogV2hlbiBpbWFnZSBzY2FubmluZyBmYWlscywgQ2xvdWRGb3JtYXRpb24gdHJpZ2dlcnMgYSByb2xsYmFjayBhbmQgZXhlY3V0ZXMgdGhlIHByZXZpb3VzXG4gICAqIHZlcnNpb24gb2YgdGhlIHNjYW5uZXIgTGFtYmRhLiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mXG4gICAqIHRoZSBzY2FubmVyIExhbWJkYSB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciwgZXZlbiBpZiB0aGUgaW1hZ2Ugc2Nhbm5pbmcgZm9yIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqIGZhaWxzLlxuICAgKlxuICAgKiBUaGlzIGFsbG93cyB0aGUgcm9sbGJhY2sgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LCBhdm9pZGluZyBST0xMQkFDS19GQUlMRUQgc3RhdGVcbiAgICogd2hlbiBpbWFnZSBzY2FubmluZyBmYWlsdXJlcyBvY2N1ci5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc3VwcHJlc3NFcnJvck9uUm9sbGJhY2s/OiBib29sZWFuO1xufVxuXG4vLyBNYXhpbXVtIExhbWJkYSBtZW1vcnkgc2l6ZSBmb3IgZGVmYXVsdCBBV1MgYWNjb3VudCB3aXRob3V0IHF1b3RhIGxpbWl0IGluY3JlYXNlXG5jb25zdCBERUZBVUxUX01FTU9SWV9TSVpFID0gMzAwODtcblxuLyoqXG4gKiBBIENvbnN0cnVjdCB0aGF0IHNjYW5zIGNvbnRhaW5lciBpbWFnZXMgd2l0aCBUcml2eS5cbiAqIEl0IHVzZXMgYSBMYW1iZGEgZnVuY3Rpb24gYXMgYSBDdXN0b20gUmVzb3VyY2UgcHJvdmlkZXIgdG8gcnVuIFRyaXZ5IGFuZCBzY2FuIGNvbnRhaW5lciBpbWFnZXMuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIEltYWdlU2Nhbm5lcldpdGhUcml2eVYyIGluc3RlYWQuIFRoaXMgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBJbWFnZVNjYW5uZXJXaXRoVHJpdnkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSW1hZ2VTY2FubmVyV2l0aFRyaXZ5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKFxuICAgICAgcHJvcHMubWVtb3J5U2l6ZSAmJlxuICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5tZW1vcnlTaXplKSAmJlxuICAgICAgKHByb3BzLm1lbW9yeVNpemUgPCAzMDA4IHx8IHByb3BzLm1lbW9yeVNpemUgPiAxMDI0MClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFlvdSBjYW4gc3BlY2lmeSBiZXR3ZWVuIFxcYDMwMDhcXGAgYW5kIFxcYDEwMjQwXFxgIGZvciBcXGBtZW1vcnlTaXplXFxgLCBnb3QgJHtwcm9wcy5tZW1vcnlTaXplfS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBsYW1iZGFQdXJwb3NlID0gJ0N1c3RvbTo6SW1hZ2VTY2FubmVyV2l0aFRyaXZ5Q3VzdG9tUmVzb3VyY2VMYW1iZGEnO1xuICAgIGNvbnN0IGN1c3RvbVJlc291cmNlTGFtYmRhID0gbmV3IFNpbmdsZXRvbkZ1bmN0aW9uKHRoaXMsICdDdXN0b21SZXNvdXJjZUxhbWJkYScsIHtcbiAgICAgIHV1aWQ6ICc0NzBiNjM0My1kMjY3LWY3NTMtMjI2Yy0xZTk5ZjA5ZjMxOWEnLFxuICAgICAgbGFtYmRhUHVycG9zZSxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuRlJPTV9JTUFHRSxcbiAgICAgIGhhbmRsZXI6IEhhbmRsZXIuRlJPTV9JTUFHRSxcbiAgICAgIGNvZGU6IEFzc2V0Q29kZS5mcm9tQXNzZXRJbWFnZShqb2luKF9fZGlybmFtZSwgJy4uL2Fzc2V0cy9sYW1iZGEnKSwge1xuICAgICAgICBwbGF0Zm9ybTogUGxhdGZvcm0uTElOVVhfQVJNNjQsXG4gICAgICAgIC8vIGV4Y2x1ZGUgbm9kZV9tb2R1bGVzXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIG5hdGl2ZSBiaW5hcnkgb2YgdGhlIGluc3RhbGxlZCBlc2J1aWxkIGNoYW5nZXMgZGVwZW5kaW5nIG9uIHRoZSBjcHUgYXJjaGl0ZWN0dXJlXG4gICAgICAgIC8vIGFuZCB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgaW1hZ2UgYXNzZXQgY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgZXhjbHVkZTogWydub2RlX21vZHVsZXMnXSxcbiAgICAgIH0pLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg5MDApLFxuICAgICAgcmV0cnlBdHRlbXB0czogMCxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgPz8gREVGQVVMVF9NRU1PUllfU0laRSxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBTaXplLmdpYmlieXRlcygxMCksIC8vIGZvciBjYXNlcyB0aGF0IG5lZWQgdG8gdXBkYXRlIHRyaXZ5IERCOiAvdG1wL3RyaXZ5L2RiL3RyaXZ5LmRiXG4gICAgfSk7XG4gICAgcHJvcHMucmVwb3NpdG9yeS5ncmFudFB1bGwoY3VzdG9tUmVzb3VyY2VMYW1iZGEpO1xuXG4gICAgLy8gR3JhbnQgQ2xvdWRGb3JtYXRpb24gRGVzY3JpYmVTdGFja3MgcGVybWlzc2lvbiBmb3Igcm9sbGJhY2sgZGV0ZWN0aW9uIHdoZW4gc3VwcHJlc3NFcnJvck9uUm9sbGJhY2sgaXMgZW5hYmxlZFxuICAgIGNvbnN0IHN1cHByZXNzRXJyb3JPblJvbGxiYWNrID0gcHJvcHMuc3VwcHJlc3NFcnJvck9uUm9sbGJhY2sgPz8gdHJ1ZTtcbiAgICBpZiAoc3VwcHJlc3NFcnJvck9uUm9sbGJhY2spIHtcbiAgICAgIGN1c3RvbVJlc291cmNlTGFtYmRhLmFkZFRvUm9sZVBvbGljeShcbiAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogWydjbG91ZGZvcm1hdGlvbjpEZXNjcmliZVN0YWNrcyddLFxuICAgICAgICAgIHJlc291cmNlczogW1N0YWNrLm9mKHRoaXMpLnN0YWNrSWRdLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VzdG9tUmVzb3VyY2VMYW1iZGFMb2dHcm91cENvbnN0cnVjdE5hbWUgPSBgRGVmYXVsdExvZ0dyb3VwRm9yJHtsYW1iZGFQdXJwb3NlfWA7XG5cbiAgICB0aGlzLnZhbGlkYXRlTGFtYmRhRGVmYXVsdExvZ0dyb3VwT3B0aW9ucyhjdXN0b21SZXNvdXJjZUxhbWJkYUxvZ0dyb3VwQ29uc3RydWN0TmFtZSwgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3kgfHwgcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5cykge1xuICAgICAgdGhpcy5lbnN1cmVMYW1iZGFEZWZhdWx0TG9nR3JvdXAoXG4gICAgICAgIGN1c3RvbVJlc291cmNlTGFtYmRhLFxuICAgICAgICBjdXN0b21SZXNvdXJjZUxhbWJkYUxvZ0dyb3VwQ29uc3RydWN0TmFtZSxcbiAgICAgICAgcHJvcHMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGltYWdlU2Nhbm5lclByb3ZpZGVyID0gbmV3IFByb3ZpZGVyKHRoaXMsICdQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBjdXN0b21SZXNvdXJjZUxhbWJkYSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltYWdlU2Nhbm5lclByb3BlcnRpZXM6IFNjYW5uZXJDdXN0b21SZXNvdXJjZVByb3BzID0ge1xuICAgICAgYWRkcjogdGhpcy5ub2RlLmFkZHIsXG4gICAgICBpbWFnZVVyaTogcHJvcHMuaW1hZ2VVcmksXG4gICAgICBpZ25vcmVVbmZpeGVkOiBTdHJpbmcocHJvcHMuaWdub3JlVW5maXhlZCA/PyBmYWxzZSksXG4gICAgICBzZXZlcml0eTogcHJvcHMuc2V2ZXJpdHkgPz8gW1NldmVyaXR5LkNSSVRJQ0FMXSxcbiAgICAgIHNjYW5uZXJzOiBwcm9wcy5zY2FubmVycyA/PyBbXSxcbiAgICAgIGltYWdlQ29uZmlnU2Nhbm5lcnM6IHByb3BzLmltYWdlQ29uZmlnU2Nhbm5lcnMgPz8gW10sXG4gICAgICBleGl0Q29kZTogcHJvcHMuZXhpdENvZGUgPz8gMSwgLy8gVE9ETzogUmVtb3ZlIGV4aXRDb2RlIGFuZCBleGl0T25Fb2wgcHJvcGVydGllcyBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLCBhcyB0aGV5IGFyZSBub3cgY29udHJvbGxlZCBieSBmYWlsT25WdWxuZXJhYmlsaXR5LlxuICAgICAgZXhpdE9uRW9sOiBwcm9wcy5leGl0T25Fb2wgPz8gMSwgLy8gVE9ETzogUmVtb3ZlIGV4aXRDb2RlIGFuZCBleGl0T25Fb2wgcHJvcGVydGllcyBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLCBhcyB0aGV5IGFyZSBub3cgY29udHJvbGxlZCBieSBmYWlsT25WdWxuZXJhYmlsaXR5LlxuICAgICAgZmFpbE9uVnVsbmVyYWJpbGl0eTogJ3RydWUnLCAvLyBkdW1teSB2YWx1ZSBmb3IgdjIgcHJvcGVydHlcbiAgICAgIHRyaXZ5SWdub3JlOiBwcm9wcy50cml2eUlnbm9yZSA/PyBbXSxcbiAgICAgIHBsYXRmb3JtOiBwcm9wcy5wbGF0Zm9ybSA/PyAnJyxcbiAgICAgIG91dHB1dDogcHJvcHMuc2NhbkxvZ3NPdXRwdXQ/LmJpbmQoY3VzdG9tUmVzb3VyY2VMYW1iZGEpLFxuICAgICAgc3VwcHJlc3NFcnJvck9uUm9sbGJhY2s6IFN0cmluZyhzdXBwcmVzc0Vycm9yT25Sb2xsYmFjayksXG4gICAgICBkZWZhdWx0TG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHtjdXN0b21SZXNvdXJjZUxhbWJkYS5mdW5jdGlvbk5hbWV9YCxcbiAgICB9O1xuXG4gICAgbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6SW1hZ2VTY2FubmVyV2l0aFRyaXZ5JyxcbiAgICAgIHByb3BlcnRpZXM6IGltYWdlU2Nhbm5lclByb3BlcnRpZXMsXG4gICAgICBzZXJ2aWNlVG9rZW46IGltYWdlU2Nhbm5lclByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBzcGVjaWZpZWQgZGVmYXVsdCBsb2cgZ3JvdXAgb3B0aW9ucyBhcmUgdGhlIHNhbWUgZm9yIGV4aXN0aW5nIGRlZmF1bHQgbG9nIGdyb3VwLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUxhbWJkYURlZmF1bHRMb2dHcm91cE9wdGlvbnMoXG4gICAgbG9nR3JvdXBDb25zdHJ1Y3ROYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEltYWdlU2Nhbm5lcldpdGhUcml2eVByb3BzLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IFN0YWNrLm9mKHRoaXMpLm5vZGUudHJ5RmluZENoaWxkKGxvZ0dyb3VwQ29uc3RydWN0TmFtZSkgYXNcbiAgICAgIHwgTG9nR3JvdXBcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybjtcblxuICAgIGNvbnN0IGNmbkxvZ0dyb3VwID0gZXhpc3Rpbmcubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuTG9nR3JvdXA7XG5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc1NhbWVSZXNvdXJjZURlbGV0aW9uQmVoYXZpb3IoXG4gICAgICAgIHByb3BzLmRlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3ksXG4gICAgICAgIGNmbkxvZ0dyb3VwLmNmbk9wdGlvbnMuZGVsZXRpb25Qb2xpY3ksXG4gICAgICApIHx8XG4gICAgICBjZm5Mb2dHcm91cC5yZXRlbnRpb25JbkRheXMgIT09IHByb3BzLmRlZmF1bHRMb2dHcm91cFJldGVudGlvbkRheXNcbiAgICApIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0BpbWFnZS1zY2FubmVyLXdpdGgtdHJpdnk6ZHVwbGljYXRlTGFtYmRhRGVmYXVsdExvZ0dyb3VwT3B0aW9ucycsXG4gICAgICAgIFwiWW91IGhhdmUgdG8gc2V0IHRoZSBzYW1lIHZhbHVlcyBmb3IgJ2RlZmF1bHRMb2dHcm91cFJlbW92YWxQb2xpY3knIGFuZCAnZGVmYXVsdExvZ0dyb3VwUmV0ZW50aW9uRGF5cycgZm9yIGVhY2ggSW1hZ2VTY2FubmVyV2l0aFRyaXZ5IGNvbnN0cnVjdCBpbiB0aGUgc2FtZSBzdGFjay5cIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgbG9nIGdyb3VwIGZvciBTY2FubmVyIExhbWJkYSBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBkZWZhdWx0IGxvZyBncm91cCBmb3IgU2Nhbm5lciBMYW1iZGEgZXhpc3RzIGluIGNoaWxkcmVuIG9mIHRoZSBzdGFjayBjb25zdHJ1Y3QuXG4gICAqIElmIGl0IGRvZXMgbm90IGV4aXN0LCBpdCBjcmVhdGVzIHRoZSBkZWZhdWx0IGxvZyBncm91cCBmb3IgU2Nhbm5lciBMYW1iZGEgYXMgYSBjaGlsZCBvZiB0aGUgc3RhY2sgY29uc3RydWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVMYW1iZGFEZWZhdWx0TG9nR3JvdXAoXG4gICAgc2luZ2xldG9uRnVuY3Rpb246IFNpbmdsZXRvbkZ1bmN0aW9uLFxuICAgIGxvZ0dyb3VwQ29uc3RydWN0TmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBJbWFnZVNjYW5uZXJXaXRoVHJpdnlQcm9wcyxcbiAgKTogTG9nR3JvdXAge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQobG9nR3JvdXBDb25zdHJ1Y3ROYW1lKSBhc1xuICAgICAgfCBMb2dHcm91cFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBMb2dHcm91cChTdGFjay5vZih0aGlzKSwgbG9nR3JvdXBDb25zdHJ1Y3ROYW1lLCB7XG4gICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke3NpbmdsZXRvbkZ1bmN0aW9uLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgcmV0ZW50aW9uOiBwcm9wcy5kZWZhdWx0TG9nR3JvdXBSZXRlbnRpb25EYXlzLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMuZGVmYXVsdExvZ0dyb3VwUmVtb3ZhbFBvbGljeSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTYW1lUmVzb3VyY2VEZWxldGlvbkJlaGF2aW9yKFxuICAgIHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5LFxuICAgIGRlbGV0aW9uUG9saWN5PzogQ2ZuRGVsZXRpb25Qb2xpY3ksXG4gICk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAocmVtb3ZhbFBvbGljeSkge1xuICAgICAgY2FzZSBSZW1vdmFsUG9saWN5LkRFU1RST1k6XG4gICAgICAgIHJldHVybiBkZWxldGlvblBvbGljeSA9PT0gQ2ZuRGVsZXRpb25Qb2xpY3kuREVMRVRFO1xuICAgICAgY2FzZSBSZW1vdmFsUG9saWN5LlJFVEFJTjpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSBDZm5EZWxldGlvblBvbGljeS5SRVRBSU47XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuU05BUFNIT1Q6XG4gICAgICAgIHJldHVybiBkZWxldGlvblBvbGljeSA9PT0gQ2ZuRGVsZXRpb25Qb2xpY3kuU05BUFNIT1Q7XG4gICAgICBjYXNlIFJlbW92YWxQb2xpY3kuUkVUQUlOX09OX1VQREFURV9PUl9ERUxFVEU6XG4gICAgICAgIHJldHVybiBkZWxldGlvblBvbGljeSA9PT0gQ2ZuRGVsZXRpb25Qb2xpY3kuUkVUQUlOX0VYQ0VQVF9PTl9DUkVBVEU7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIGRlbGV0aW9uUG9saWN5ID09PSB1bmRlZmluZWQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcmVtb3ZhbFBvbGljeSBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -61,7 +61,7 @@ class ScanLogsOutput {
61
61
  }
62
62
  exports.ScanLogsOutput = ScanLogsOutput;
63
63
  _a = JSII_RTTI_SYMBOL_1;
64
- ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.4.0" };
64
+ ScanLogsOutput[_a] = { fqn: "image-scanner-with-trivy.ScanLogsOutput", version: "2.4.2" };
65
65
  class CloudWatchLogsOutput extends ScanLogsOutput {
66
66
  constructor(options) {
67
67
  super();
package/package.json CHANGED
@@ -60,7 +60,7 @@
60
60
  "publishConfig": {
61
61
  "access": "public"
62
62
  },
63
- "version": "2.4.0",
63
+ "version": "2.4.2",
64
64
  "types": "lib/index.d.ts",
65
65
  "stability": "stable",
66
66
  "jsii": {
package/renovate.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": ["config:recommended"],
4
+ "packageRules": [
5
+ {
6
+ "matchDatasources": ["docker"],
7
+ "matchPackageNames": ["ghcr.io/aquasecurity/trivy"],
8
+ "stabilityDays": 3,
9
+ "internalChecksFilter": "strict"
10
+ }
11
+ ]
12
+ }