@rio-cloud/cdk-v2-constructs 8.3.0 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -21,6 +21,7 @@ $ npm install --save @rio-cloud/cdk-v2-constructs
21
21
  * [How to contribute](./docs/contribution.md)
22
22
  * [Changelog](./docs/changelog.md)
23
23
  * [brief API description](./docs/API.md)
24
+ * [Agent documentation](./docs/AGENTS_DOCUMENTATION.md)
24
25
 
25
26
  ## Internal documentation for library devs
26
27
  [Documentation](./docs/developers-readme.md)
@@ -0,0 +1,64 @@
1
+ # Agents Documentation for `@rio-cloud/cdk-v2-constructs`
2
+
3
+ ## Purpose
4
+
5
+ Use this document as the entry point when an agent needs to understand or apply the npm package `@rio-cloud/cdk-v2-constructs` from an installed project. Prefer package-owned documentation in `.d.ts` files and generated type artifacts over memory or guesses.
6
+
7
+ This package provides RIO-specific AWS CDK v2 constructs and helpers for:
8
+
9
+ - Watchful and Datadog monitoring for RIO-standard service alerting and observability
10
+ - ECS/Fargate services as the paved road for running backend workloads on RIO
11
+ - Kafka topics and event sources
12
+ - Codified AWS account defaults such as VPC properties and well-known SSM parameters
13
+ - Pipeline tagging and delivery monitoring
14
+ - Backup policy helpers
15
+ - SES observability
16
+
17
+ ## Reference Order
18
+
19
+ After reaching this document, use these package artifacts as the primary references:
20
+
21
+ 1. Read this file first.
22
+ 2. Check the installed package's `package.json` exports before using any subpath import or package-local artifact.
23
+ 3. Read `README.md` for the package-level overview and `docs/AGENTS_RIO_INFRASTRUCTURE_GUIDE.md` for infrastructure-specific project structure, pipeline guardrails, or pipeline-oriented work.
24
+
25
+ Use `lib/**/*.d.ts` for generated type information and JSDoc-derived annotations. When guidance in this document conflicts with generated package annotations such as `lib/**/*.d.ts`, or `.jsii`, trust the generated package annotations.
26
+
27
+ ## Import And Edit Workflow
28
+
29
+ Prefer `import * as rio from '@rio-cloud/cdk-v2-constructs';` unless an exported subpath is explicitly available in the installed `package.json`.
30
+
31
+ Read the relevant declaration comments and examples before writing or changing infrastructure code.
32
+
33
+ ## Usage Guidance
34
+
35
+ ### General
36
+
37
+ Prefer RIO constructs over raw AWS CDK constructs when the use case matches. These constructs encode RIO infrastructure defaults, Datadog tags, shared secrets, team and account SSM parameters, and monitoring conventions.
38
+
39
+ Do not set construct attributes explicitly when the value you plan to set is already the construct default. Prefer relying on defaults unless you are intentionally changing behavior and that intent is clear in the code.
40
+
41
+ Preserve the target repository's existing stack boundaries and scripts when maintaining an existing project.
42
+
43
+ ### Observability
44
+
45
+ Watchful is RIO's monitoring and alerting abstraction. Prefer `rio.watchfulv2.Watchful` and `rio.datadogv2`. Use legacy `watchful` or `datadog` only when maintaining existing code that already depends on those APIs.
46
+
47
+ Do not add raw CloudWatch metrics, alarms, or monitoring resources for agent-generated changes. Use RIO monitoring constructs and Datadog-based abstractions for observability.
48
+
49
+ Treat `rio.SesObservability` logs as PII. Do not forward those logs to third-party services and do not extend retention beyond the construct default.
50
+
51
+ ### RIO Infrastructure Defaults
52
+
53
+ RIO infrastructure defaults are the baseline VPC, hosted zone, and team/account values provided by the RIO environment. Use `rio.RioLandingZone` helpers for default VPC, hosted zone, team name, team identifier, team email, team alert Slack channel, and account name. Avoid hard-coded VPC IDs, hosted-zone IDs, or parameter names when a helper exists.
54
+
55
+ ### Services
56
+
57
+ Use `rio.RioFargateService` for ECS/Fargate services when possible.
58
+ ### Kafka
59
+
60
+ Use `rio.KafkaTopicV4` for new Kafka topics. Set audience and recovery policy deliberately.
61
+
62
+ ### Backup And Delivery
63
+
64
+ Use `rio.BackupPolicy`, `rio.ClassifyPipelineType`, and `rio.DeliveryPerformanceMonitoringOverride` for backup and pipeline metadata instead of manually adding equivalent tags. Branch pipelines validate contributions or Renovate updates; vulnerability pipelines run vulnerability-focused checks.
@@ -0,0 +1,56 @@
1
+ # RIO Infrastructure Guide
2
+
3
+ Use this guide when consuming `@rio-cloud/cdk-v2-constructs` from RIO CDK v2
4
+ infrastructure projects.
5
+
6
+ This guide covers infrastructure-specific structure and pipeline conventions.
7
+
8
+ ## Recommended Structure
9
+
10
+ A typical RIO infrastructure package often uses a structure like:
11
+
12
+ - `bin/infrastructure.ts`: CDK app entrypoint and deployment environment.
13
+ - `lib/app-stack.ts`: runtime service resources and service monitoring.
14
+ - `lib/data-stack.ts`: stateful or shared data resources.
15
+ - `lib/pipeline-stack.ts`: trigger bucket sources, CodePipeline definitions,
16
+ CodeBuild steps, deployment stages, and pipeline metadata.
17
+ - `test/`: synthesized template assertions.
18
+
19
+ ## Infrastructure-Specific Usage
20
+
21
+ Use `rio.ClassifyPipelineType.apply(...)` with `rio.RioPipelineType.DEPLOY`,
22
+ `BRANCH`, or `VULNERABILITY` for pipeline metadata instead of manually
23
+ recreating equivalent tags.
24
+
25
+ Use `rio.TriggerKey.MASTER_REPO` and `rio.TriggerKey.BRANCH_REPO` for RIO
26
+ Bitbucket trigger bucket keys. Standard RIO pipelines use the imported
27
+ `bitbucket-integration-s3-bucket` trigger bucket and S3 source events.
28
+
29
+ ## Pipeline Guardrails
30
+
31
+ Use the trigger bucket source pattern for standard RIO pipelines. Do not use
32
+ CodeStar Connections, GitHub source actions, `CodeStarConnectionsSourceAction`,
33
+ or `ConnectionArn` parameters unless the service intentionally needs a
34
+ non-standard pipeline.
35
+
36
+ Include the main deployment pipeline by default. Add branch and vulnerability
37
+ pipelines only when the project needs them or the user requests them.
38
+
39
+ Prefer the target project's current CodeBuild defaults for new pipeline code.
40
+ Fall back to another architecture or build image only when the project
41
+ toolchain requires it, and document that reason.
42
+
43
+ ## Project Setup
44
+
45
+ When creating or extending a RIO infrastructure package, keep the project
46
+ layout intentional and replace any placeholder service names, account IDs,
47
+ build commands, and stack contents with project-specific values before
48
+ synthesis.
49
+
50
+ When using `node` or `npm` commands for this package, read the project's
51
+ `.nvmrc` or `package.json` to determine the expected Node.js version, and keep
52
+ `npm` aligned with the versions declared there. Align local development, CI,
53
+ and any generated pipeline steps with those project-specific settings.
54
+
55
+ If a project already has infrastructure, preserve its stack boundaries and
56
+ validation scripts unless the change explicitly updates them.
@@ -10,6 +10,13 @@ export declare enum Criticality {
10
10
  /**
11
11
  * Helper function to tag constructs with correct backup values to be picked
12
12
  * up by the rio landing zone backup solution.
13
+ *
14
+ * Apply this to stateful resources that must be discovered by the RIO landing-zone backup solution.
15
+ *
16
+ * Example:
17
+ * ```ts
18
+ * BackupPolicy.apply(table, Criticality.HIGH);
19
+ * ```
13
20
  */
14
21
  export declare class BackupPolicy {
15
22
  static apply(target: IConstruct, criticality: Criticality): void;
@@ -16,6 +16,13 @@ var Criticality;
16
16
  /**
17
17
  * Helper function to tag constructs with correct backup values to be picked
18
18
  * up by the rio landing zone backup solution.
19
+ *
20
+ * Apply this to stateful resources that must be discovered by the RIO landing-zone backup solution.
21
+ *
22
+ * Example:
23
+ * ```ts
24
+ * BackupPolicy.apply(table, Criticality.HIGH);
25
+ * ```
19
26
  */
20
27
  class BackupPolicy {
21
28
  static apply(target, criticality) {
@@ -25,4 +32,4 @@ class BackupPolicy {
25
32
  exports.BackupPolicy = BackupPolicy;
26
33
  _a = JSII_RTTI_SYMBOL_1;
27
34
  BackupPolicy[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.BackupPolicy", version: "0.0.0" };
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYWNrdXAvYmFja3VwLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFtQztBQUduQzs7R0FFRztBQUNILElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUNyQiwwQkFBVyxDQUFBO0lBQ1gsZ0NBQWlCLENBQUE7SUFDakIsNEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFKVyxXQUFXLDJCQUFYLFdBQVcsUUFJdEI7QUFFRDs7O0dBR0c7QUFDSCxNQUFhLFlBQVk7SUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFrQixFQUFFLFdBQXdCO1FBQ3ZELGtCQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0RSxDQUFDOztBQUhILG9DQUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBUaGUgYWxsb3dlZCB2YWx1ZXMgZm9yIGJhY2t1cCBjcml0aWNhbGl0eSBsZXZlbHNcbiAqL1xuZXhwb3J0IGVudW0gQ3JpdGljYWxpdHkge1xuICBMT1cgPSAnbG93JyxcbiAgTUVESVVNID0gJ21lZGl1bScsXG4gIEhJR0ggPSAnaGlnaCcsXG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHRhZyBjb25zdHJ1Y3RzIHdpdGggY29ycmVjdCBiYWNrdXAgdmFsdWVzIHRvIGJlIHBpY2tlZFxuICogdXAgYnkgdGhlIHJpbyBsYW5kaW5nIHpvbmUgYmFja3VwIHNvbHV0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQmFja3VwUG9saWN5IHtcbiAgc3RhdGljIGFwcGx5KHRhcmdldDogSUNvbnN0cnVjdCwgY3JpdGljYWxpdHk6IENyaXRpY2FsaXR5KSB7XG4gICAgVGFncy5vZih0YXJnZXQpLmFkZCgncmlvLWx6LWJhY2t1cC1jcml0aWNhbGl0eS1sZXZlbCcsIGNyaXRpY2FsaXR5KTtcbiAgfVxufVxuIl19
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYWNrdXAvYmFja3VwLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFtQztBQUduQzs7R0FFRztBQUNILElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUNyQiwwQkFBVyxDQUFBO0lBQ1gsZ0NBQWlCLENBQUE7SUFDakIsNEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFKVyxXQUFXLDJCQUFYLFdBQVcsUUFJdEI7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxZQUFZO0lBQ3ZCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBa0IsRUFBRSxXQUF3QjtRQUN2RCxrQkFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsaUNBQWlDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEUsQ0FBQzs7QUFISCxvQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogVGhlIGFsbG93ZWQgdmFsdWVzIGZvciBiYWNrdXAgY3JpdGljYWxpdHkgbGV2ZWxzXG4gKi9cbmV4cG9ydCBlbnVtIENyaXRpY2FsaXR5IHtcbiAgTE9XID0gJ2xvdycsXG4gIE1FRElVTSA9ICdtZWRpdW0nLFxuICBISUdIID0gJ2hpZ2gnLFxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB0YWcgY29uc3RydWN0cyB3aXRoIGNvcnJlY3QgYmFja3VwIHZhbHVlcyB0byBiZSBwaWNrZWRcbiAqIHVwIGJ5IHRoZSByaW8gbGFuZGluZyB6b25lIGJhY2t1cCBzb2x1dGlvbi5cbiAqXG4gKiBBcHBseSB0aGlzIHRvIHN0YXRlZnVsIHJlc291cmNlcyB0aGF0IG11c3QgYmUgZGlzY292ZXJlZCBieSB0aGUgUklPIGxhbmRpbmctem9uZSBiYWNrdXAgc29sdXRpb24uXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBCYWNrdXBQb2xpY3kuYXBwbHkodGFibGUsIENyaXRpY2FsaXR5LkhJR0gpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBCYWNrdXBQb2xpY3kge1xuICBzdGF0aWMgYXBwbHkodGFyZ2V0OiBJQ29uc3RydWN0LCBjcml0aWNhbGl0eTogQ3JpdGljYWxpdHkpIHtcbiAgICBUYWdzLm9mKHRhcmdldCkuYWRkKCdyaW8tbHotYmFja3VwLWNyaXRpY2FsaXR5LWxldmVsJywgY3JpdGljYWxpdHkpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,64 @@
1
+ import * as codebuild from 'aws-cdk-lib/aws-codebuild';
2
+ import type * as ecr from 'aws-cdk-lib/aws-ecr';
3
+ import type { Construct } from 'constructs';
4
+ /**
5
+ * Properties for a CodeBuild project that is injected as a parallel CodePipeline action.
6
+ */
7
+ export interface ParallelBuildProjectProps {
8
+ /**
9
+ * Path to the buildspec yaml file, resolved from the consuming CDK app's current working directory.
10
+ */
11
+ readonly buildSpecPath: string;
12
+ /**
13
+ * Name of the service.
14
+ */
15
+ readonly serviceName: string;
16
+ /**
17
+ * Name of the hosted zone.
18
+ */
19
+ readonly hostedZoneName: string;
20
+ /**
21
+ * Repository used by image build steps.
22
+ *
23
+ * When provided, its URI is exposed as `REPO_URI`.
24
+ */
25
+ readonly repo?: ecr.IRepository;
26
+ /**
27
+ * Action-level environment values used when calculating `projectConfigHash`.
28
+ */
29
+ readonly env?: Record<string, string>;
30
+ /**
31
+ * Caching strategy to use.
32
+ */
33
+ readonly cache?: codebuild.Cache;
34
+ /**
35
+ * Build image for the project.
36
+ *
37
+ * Defaults to the ARM Amazon Linux 2023 standard image used by WebEDI-style services.
38
+ */
39
+ readonly buildImage?: codebuild.IBuildImage;
40
+ /**
41
+ * Compute type for the project.
42
+ *
43
+ * Defaults to `BUILD_GENERAL1_LARGE`.
44
+ */
45
+ readonly computeType?: codebuild.ComputeType;
46
+ /**
47
+ * Additional project-level environment variables.
48
+ */
49
+ readonly additionalEnvironmentVariables?: Record<string, codebuild.BuildEnvironmentVariable>;
50
+ }
51
+ /**
52
+ * Converts action-level string environment values to CodeBuild action environment variables.
53
+ */
54
+ export declare function getCodeBuildActionEnvironmentVariables(env?: Record<string, string>, projectConfigHash?: string): Record<string, codebuild.BuildEnvironmentVariable>;
55
+ /**
56
+ * CodeBuild project for parallel pipeline build work.
57
+ */
58
+ export declare class ParallelBuildProject extends codebuild.PipelineProject {
59
+ /**
60
+ * Hash of buildspec, project environment, and action-level environment inputs.
61
+ */
62
+ readonly projectConfigHash: string;
63
+ constructor(scope: Construct, id: string, props: ParallelBuildProjectProps);
64
+ }
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ParallelBuildProject = void 0;
5
+ exports.getCodeBuildActionEnvironmentVariables = getCodeBuildActionEnvironmentVariables;
6
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
+ const crypto = require("node:crypto");
8
+ const fs = require("node:fs");
9
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
10
+ const codebuild = require("aws-cdk-lib/aws-codebuild");
11
+ const codepipeline = require("aws-cdk-lib/aws-codepipeline");
12
+ const yaml = require("js-yaml");
13
+ const DEFAULT_BUILD_IMAGE = codebuild.LinuxArmBuildImage.AMAZON_LINUX_2023_STANDARD_3_0;
14
+ const DEFAULT_COMPUTE_TYPE = codebuild.ComputeType.LARGE;
15
+ const RESERVED_ACTION_ENVIRONMENT_NAMES = ['PIPELINE_EXECUTION_ID', '_PROJECT_CONFIG_HASH'];
16
+ function getProjectEnvironmentVariables(scope, props) {
17
+ const environmentVariables = {
18
+ AWS_ACCOUNT_ID: { value: aws_cdk_lib_1.Stack.of(scope).account },
19
+ SERVICE_NAME: { value: props.serviceName },
20
+ HOSTED_ZONE_NAME: { value: props.hostedZoneName },
21
+ };
22
+ if (props.repo?.repositoryUri) {
23
+ Object.assign(environmentVariables, { REPO_URI: { value: props.repo.repositoryUri } });
24
+ }
25
+ const additionalEnvironmentVariables = props.additionalEnvironmentVariables ?? {};
26
+ const overriddenStandardVariables = Object.keys(additionalEnvironmentVariables).filter(name => name in environmentVariables);
27
+ if (overriddenStandardVariables.length > 0) {
28
+ throw new Error(`additionalEnvironmentVariables must not override standard environment variables: ${overriddenStandardVariables.join(', ')}.`);
29
+ }
30
+ return {
31
+ ...environmentVariables,
32
+ ...additionalEnvironmentVariables,
33
+ };
34
+ }
35
+ function loadBuildSpec(buildSpecPath) {
36
+ const buildSpec = yaml.load(fs.readFileSync(buildSpecPath, { encoding: 'utf-8' }));
37
+ if (buildSpec === null || typeof buildSpec !== 'object' || Array.isArray(buildSpec)) {
38
+ throw new Error(`Buildspec at ${buildSpecPath} must contain a YAML object.`);
39
+ }
40
+ return buildSpec;
41
+ }
42
+ /**
43
+ * Converts action-level string environment values to CodeBuild action environment variables.
44
+ */
45
+ function getCodeBuildActionEnvironmentVariables(env = {}, projectConfigHash) {
46
+ const overriddenReservedVariables = RESERVED_ACTION_ENVIRONMENT_NAMES.filter(name => name in env);
47
+ if (overriddenReservedVariables.length > 0) {
48
+ throw new Error(`Action environment variables must not override reserved variables: ${overriddenReservedVariables.join(', ')}.`);
49
+ }
50
+ return Object.fromEntries(Object.entries({
51
+ ...env,
52
+ PIPELINE_EXECUTION_ID: codepipeline.GlobalVariables.executionId,
53
+ ...(projectConfigHash ? { _PROJECT_CONFIG_HASH: projectConfigHash } : {}),
54
+ }).map(([name, value]) => [name, { value }]));
55
+ }
56
+ /**
57
+ * CodeBuild project for parallel pipeline build work.
58
+ */
59
+ class ParallelBuildProject extends codebuild.PipelineProject {
60
+ constructor(scope, id, props) {
61
+ const buildSpec = loadBuildSpec(props.buildSpecPath);
62
+ const environmentVariables = getProjectEnvironmentVariables(scope, props);
63
+ const buildImage = props.buildImage ?? DEFAULT_BUILD_IMAGE;
64
+ const computeType = props.computeType ?? DEFAULT_COMPUTE_TYPE;
65
+ const environment = {
66
+ buildImage,
67
+ computeType,
68
+ environmentVariables,
69
+ };
70
+ super(scope, id, {
71
+ buildSpec: codebuild.BuildSpec.fromObject(buildSpec),
72
+ cache: props.cache,
73
+ environment,
74
+ });
75
+ this.projectConfigHash = crypto
76
+ .createHash('sha256')
77
+ .update(JSON.stringify(aws_cdk_lib_1.Stack.of(scope).resolve({
78
+ buildSpec,
79
+ projectEnvironment: environment,
80
+ actionEnvironment: props.env,
81
+ })))
82
+ .digest('hex');
83
+ }
84
+ }
85
+ exports.ParallelBuildProject = ParallelBuildProject;
86
+ _a = JSII_RTTI_SYMBOL_1;
87
+ ParallelBuildProject[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.ParallelBuildProject", version: "0.0.0" };
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1idWlsZC1wcm9qZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbnRyaWJ1dGlvbnMvdGVhbS1zaGlwcGVyLWluYm91bmQtYmx1ZS9waXBlbGluZS9jb2RlLWJ1aWxkLXByb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQWdIQSx3RkFrQkM7O0FBbElELHNDQUFzQztBQUN0Qyw4QkFBOEI7QUFDOUIsNkNBQW9DO0FBQ3BDLHVEQUF1RDtBQUN2RCw2REFBNkQ7QUFHN0QsZ0NBQWdDO0FBRWhDLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLDhCQUE4QixDQUFDO0FBQ3hGLE1BQU0sb0JBQW9CLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7QUFDekQsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLHNCQUFzQixDQUFDLENBQUM7QUEwRDVGLFNBQVMsOEJBQThCLENBQ3JDLEtBQWdCLEVBQ2hCLEtBQWdDO0lBRWhDLE1BQU0sb0JBQW9CLEdBQXVEO1FBQy9FLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUU7UUFDbEQsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUU7UUFDMUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLGNBQWMsRUFBRTtLQUNsRCxDQUFDO0lBRUYsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELE1BQU0sOEJBQThCLEdBQUcsS0FB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Q2xCLFdBQVc7U0FDWixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTTthQUM1QixVQUFVLENBQUMsUUFBUSxDQUFDO2FBQ3BCLE1BQU0sQ0FDTCxJQUFJLENBQUMsU0FBUyxDQUNaLG1CQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUN0QixTQUFTO1lBQ1Qsa0JBQWtCLEVBQUUsV0FBVztZQUMvQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsR0FBRztTQUM3QixDQUFDLENBQ0gsQ0FDRjthQUNBLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixDQUFDOztBQW5DSCxvREFvQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNvZGVidWlsZCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lJztcbmltcG9ydCB0eXBlICogYXMgZWNyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3InO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmNvbnN0IERFRkFVTFRfQlVJTERfSU1BR0UgPSBjb2RlYnVpbGQuTGludXhBcm1CdWlsZEltYWdlLkFNQVpPTl9MSU5VWF8yMDIzX1NUQU5EQVJEXzNfMDtcbmNvbnN0IERFRkFVTFRfQ09NUFVURV9UWVBFID0gY29kZWJ1aWxkLkNvbXB1dGVUeXBlLkxBUkdFO1xuY29uc3QgUkVTRVJWRURfQUNUSU9OX0VOVklST05NRU5UX05BTUVTID0gWydQSVBFTElORV9FWEVDVVRJT05fSUQnLCAnX1BST0pFQ1RfQ09ORklHX0hBU0gnXTtcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIENvZGVCdWlsZCBwcm9qZWN0IHRoYXQgaXMgaW5qZWN0ZWQgYXMgYSBwYXJhbGxlbCBDb2RlUGlwZWxpbmUgYWN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFsbGVsQnVpbGRQcm9qZWN0UHJvcHMge1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgYnVpbGRzcGVjIHlhbWwgZmlsZSwgcmVzb2x2ZWQgZnJvbSB0aGUgY29uc3VtaW5nIENESyBhcHAncyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRTcGVjUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBzZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgaG9zdGVkIHpvbmUuXG4gICAqL1xuICByZWFkb25seSBob3N0ZWRab25lTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXBvc2l0b3J5IHVzZWQgYnkgaW1hZ2UgYnVpbGQgc3RlcHMuXG4gICAqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGl0cyBVUkkgaXMgZXhwb3NlZCBhcyBgUkVQT19VUklgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbz86IGVjci5JUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogQWN0aW9uLWxldmVsIGVudmlyb25tZW50IHZhbHVlcyB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgYHByb2plY3RDb25maWdIYXNoYC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIENhY2hpbmcgc3RyYXRlZ3kgdG8gdXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU/OiBjb2RlYnVpbGQuQ2FjaGU7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGltYWdlIGZvciB0aGUgcHJvamVjdC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIEFSTSBBbWF6b24gTGludXggMjAyMyBzdGFuZGFyZCBpbWFnZSB1c2VkIGJ5IFdlYkVESS1zdHlsZSBzZXJ2aWNlcy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkSW1hZ2U/OiBjb2RlYnVpbGQuSUJ1aWxkSW1hZ2U7XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdHlwZSBmb3IgdGhlIHByb2plY3QuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBCVUlMRF9HRU5FUkFMMV9MQVJHRWAuXG4gICAqL1xuICByZWFkb25seSBjb21wdXRlVHlwZT86IGNvZGVidWlsZC5Db21wdXRlVHlwZTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBwcm9qZWN0LWxldmVsIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxFbnZpcm9ubWVudFZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIGNvZGVidWlsZC5CdWlsZEVudmlyb25tZW50VmFyaWFibGU+O1xufVxuXG5mdW5jdGlvbiBnZXRQcm9qZWN0RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIHByb3BzOiBQYXJhbGxlbEJ1aWxkUHJvamVjdFByb3BzXG4pOiBSZWNvcmQ8c3RyaW5nLCBjb2RlYnVpbGQuQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlPiB7XG4gIGNvbnN0IGVudmlyb25tZW50VmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBjb2RlYnVpbGQuQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlPiA9IHtcbiAgICBBV1NfQUNDT1VOVF9JRDogeyB2YWx1ZTogU3RhY2sub2Yoc2NvcGUpLmFjY291bnQgfSxcbiAgICBTRVJWSUNFX05BTUU6IHsgdmFsdWU6IHByb3BzLnNlcnZpY2VOYW1lIH0sXG4gICAgSE9TVEVEX1pPTkVfTkFNRTogeyB2YWx1ZTogcHJvcHMuaG9zdGVkWm9uZU5hbWUgfSxcbiAgfTtcblxuICBpZiAocHJvcHMucmVwbz8ucmVwb3NpdG9yeVVyaSkge1xuICAgIE9iamVjdC5hc3NpZ24oZW52aXJvbm1lbnRWYXJpYWJsZXMsIHsgUkVQT19VUkk6IHsgdmFsdWU6IHByb3BzLnJlcG8ucmVwb3NpdG9yeVVyaSB9IH0pO1xuICB9XG5cbiAgY29uc3QgYWRkaXRpb25hbEVudmlyb25tZW50VmFyaWFibGVzID0gcHJvcHMuYWRkaXRpb25hbEVudmlyb25tZW50VmFyaWFibGVzID8/IHt9O1xuICBjb25zdCBvdmVycmlkZGVuU3RhbmRhcmRWYXJpYWJsZXMgPSBPYmplY3Qua2V5cyhhZGRpdGlvbmFsRW52aXJvbm1lbnRWYXJpYWJsZXMpLmZpbHRlcihcbiAgICBuYW1lID0+IG5hbWUgaW4gZW52aXJvbm1lbnRWYXJpYWJsZXNcbiAgKTtcbiAgaWYgKG92ZXJyaWRkZW5TdGFuZGFyZFZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGFkZGl0aW9uYWxFbnZpcm9ubWVudFZhcmlhYmxlcyBtdXN0IG5vdCBvdmVycmlkZSBzdGFuZGFyZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6ICR7b3ZlcnJpZGRlblN0YW5kYXJkVmFyaWFibGVzLmpvaW4oJywgJyl9LmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5lbnZpcm9ubWVudFZhcmlhYmxlcyxcbiAgICAuLi5hZGRpdGlvbmFsRW52aXJvbm1lbnRWYXJpYWJsZXMsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvYWRCdWlsZFNwZWMoYnVpbGRTcGVjUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBidWlsZFNwZWMgPSB5YW1sLmxvYWQoZnMucmVhZEZpbGVTeW5jKGJ1aWxkU3BlY1BhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkpO1xuXG4gIGlmIChidWlsZFNwZWMgPT09IG51bGwgfHwgdHlwZW9mIGJ1aWxkU3BlYyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShidWlsZFNwZWMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCdWlsZHNwZWMgYXQgJHtidWlsZFNwZWNQYXRofSBtdXN0IGNvbnRhaW4gYSBZQU1MIG9iamVjdC5gKTtcbiAgfVxuXG4gIHJldHVybiBidWlsZFNwZWMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogQ29udmVydHMgYWN0aW9uLWxldmVsIHN0cmluZyBlbnZpcm9ubWVudCB2YWx1ZXMgdG8gQ29kZUJ1aWxkIGFjdGlvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2RlQnVpbGRBY3Rpb25FbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4gIHByb2plY3RDb25maWdIYXNoPzogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBjb2RlYnVpbGQuQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlPiB7XG4gIGNvbnN0IG92ZXJyaWRkZW5SZXNlcnZlZFZhcmlhYmxlcyA9IFJFU0VSVkVEX0FDVElPTl9FTlZJUk9OTUVOVF9OQU1FUy5maWx0ZXIobmFtZSA9PiBuYW1lIGluIGVudik7XG4gIGlmIChvdmVycmlkZGVuUmVzZXJ2ZWRWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBY3Rpb24gZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgbm90IG92ZXJyaWRlIHJlc2VydmVkIHZhcmlhYmxlczogJHtvdmVycmlkZGVuUmVzZXJ2ZWRWYXJpYWJsZXMuam9pbignLCAnKX0uYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKHtcbiAgICAgIC4uLmVudixcbiAgICAgIFBJUEVMSU5FX0VYRUNVVElPTl9JRDogY29kZXBpcGVsaW5lLkdsb2JhbFZhcmlhYmxlcy5leGVjdXRpb25JZCxcbiAgICAgIC4uLihwcm9qZWN0Q29uZmlnSGFzaCA/IHsgX1BST0pFQ1RfQ09ORklHX0hBU0g6IHByb2plY3RDb25maWdIYXNoIH0gOiB7fSksXG4gICAgfSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBbbmFtZSwgeyB2YWx1ZSB9XSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDb2RlQnVpbGQgcHJvamVjdCBmb3IgcGFyYWxsZWwgcGlwZWxpbmUgYnVpbGQgd29yay5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhcmFsbGVsQnVpbGRQcm9qZWN0IGV4dGVuZHMgY29kZWJ1aWxkLlBpcGVsaW5lUHJvamVjdCB7XG4gIC8qKlxuICAgKiBIYXNoIG9mIGJ1aWxkc3BlYywgcHJvamVjdCBlbnZpcm9ubWVudCwgYW5kIGFjdGlvbi1sZXZlbCBlbnZpcm9ubWVudCBpbnB1dHMuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0Q29uZmlnSGFzaDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQYXJhbGxlbEJ1aWxkUHJvamVjdFByb3BzKSB7XG4gICAgY29uc3QgYnVpbGRTcGVjID0gbG9hZEJ1aWxkU3BlYyhwcm9wcy5idWlsZFNwZWNQYXRoKTtcbiAgICBjb25zdCBlbnZpcm9ubWVudFZhcmlhYmxlcyA9IGdldFByb2plY3RFbnZpcm9ubWVudFZhcmlhYmxlcyhzY29wZSwgcHJvcHMpO1xuICAgIGNvbnN0IGJ1aWxkSW1hZ2UgPSBwcm9wcy5idWlsZEltYWdlID8/IERFRkFVTFRfQlVJTERfSU1BR0U7XG4gICAgY29uc3QgY29tcHV0ZVR5cGUgPSBwcm9wcy5jb21wdXRlVHlwZSA/PyBERUZBVUxUX0NPTVBVVEVfVFlQRTtcbiAgICBjb25zdCBlbnZpcm9ubWVudDogY29kZWJ1aWxkLkJ1aWxkRW52aXJvbm1lbnQgPSB7XG4gICAgICBidWlsZEltYWdlLFxuICAgICAgY29tcHV0ZVR5cGUsXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlcyxcbiAgICB9O1xuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBidWlsZFNwZWM6IGNvZGVidWlsZC5CdWlsZFNwZWMuZnJvbU9iamVjdChidWlsZFNwZWMpLFxuICAgICAgY2FjaGU6IHByb3BzLmNhY2hlLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2plY3RDb25maWdIYXNoID0gY3J5cHRvXG4gICAgICAuY3JlYXRlSGFzaCgnc2hhMjU2JylcbiAgICAgIC51cGRhdGUoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIFN0YWNrLm9mKHNjb3BlKS5yZXNvbHZlKHtcbiAgICAgICAgICAgIGJ1aWxkU3BlYyxcbiAgICAgICAgICAgIHByb2plY3RFbnZpcm9ubWVudDogZW52aXJvbm1lbnQsXG4gICAgICAgICAgICBhY3Rpb25FbnZpcm9ubWVudDogcHJvcHMuZW52LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './code-build-project';
2
+ export * from './pipeline-build-stage-actions';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./code-build-project"), exports);
18
+ __exportStar(require("./pipeline-build-stage-actions"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29udHJpYnV0aW9ucy90ZWFtLXNoaXBwZXItaW5ib3VuZC1ibHVlL3BpcGVsaW5lL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1REFBcUM7QUFDckMsaUVBQStDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jb2RlLWJ1aWxkLXByb2plY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS1idWlsZC1zdGFnZS1hY3Rpb25zJztcbiJdfQ==
@@ -0,0 +1,81 @@
1
+ import * as codebuild from 'aws-cdk-lib/aws-codebuild';
2
+ import * as codepipeline from 'aws-cdk-lib/aws-codepipeline';
3
+ import * as codepipelineActions from 'aws-cdk-lib/aws-codepipeline-actions';
4
+ import { Construct } from 'constructs';
5
+ /**
6
+ * Properties for locating an existing generated CodePipeline action.
7
+ */
8
+ export interface PipelineBuildStageActionsProps {
9
+ /**
10
+ * The underlying CodePipeline generated by `aws-cdk-lib/pipelines.CodePipeline`.
11
+ */
12
+ readonly pipeline: codepipeline.Pipeline;
13
+ /**
14
+ * Name of the action whose input artifact should be reused.
15
+ */
16
+ readonly actionName: string;
17
+ }
18
+ /**
19
+ * Properties for a CodeBuild action added by `PipelineBuildStageActions`.
20
+ */
21
+ export interface PipelineBuildActionProps extends codepipeline.CommonAwsActionProps {
22
+ /**
23
+ * The list of additional input artifacts for this action.
24
+ */
25
+ readonly extraInputs?: codepipeline.Artifact[];
26
+ /**
27
+ * The list of output artifacts for this action.
28
+ */
29
+ readonly outputs?: codepipeline.Artifact[];
30
+ /**
31
+ * The action's CodeBuild project.
32
+ */
33
+ readonly project: codebuild.IProject;
34
+ /**
35
+ * The type of CodeBuild action.
36
+ *
37
+ * @default CodeBuildActionType.BUILD
38
+ */
39
+ readonly actionType?: codepipelineActions.CodeBuildActionType;
40
+ /**
41
+ * Environment variables to pass to the CodeBuild project when this action executes.
42
+ */
43
+ readonly environmentVariables?: Record<string, codebuild.BuildEnvironmentVariable>;
44
+ /**
45
+ * Whether to check for secrets in plaintext environment variables.
46
+ *
47
+ * @default true
48
+ */
49
+ readonly checkSecretsInPlainTextEnvVariables?: boolean;
50
+ /**
51
+ * Trigger a batch build.
52
+ *
53
+ * @default false
54
+ */
55
+ readonly executeBatchBuild?: boolean;
56
+ /**
57
+ * Combine build artifacts for batch builds.
58
+ *
59
+ * @default false
60
+ */
61
+ readonly combineBatchBuildArtifacts?: boolean;
62
+ }
63
+ /**
64
+ * Adds CodeBuild actions next to an existing action in the same pipeline stage.
65
+ */
66
+ export declare class PipelineBuildStageActions extends Construct {
67
+ /**
68
+ * Stage that contains the located action.
69
+ */
70
+ readonly stage: codepipeline.IStage;
71
+ /**
72
+ * First input artifact of the located action.
73
+ */
74
+ readonly sourceArtifact: codepipeline.Artifact;
75
+ constructor(scope: Construct, id: string, props: PipelineBuildStageActionsProps);
76
+ /**
77
+ * Adds a CodeBuild action using the located action's first input artifact.
78
+ */
79
+ addBuildAction(props: PipelineBuildActionProps): void;
80
+ private findPipelineActionContext;
81
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PipelineBuildStageActions = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const codepipelineActions = require("aws-cdk-lib/aws-codepipeline-actions");
7
+ const constructs_1 = require("constructs");
8
+ const rio_claidometer_1 = require("../../../rio-claidometer");
9
+ /**
10
+ * Adds CodeBuild actions next to an existing action in the same pipeline stage.
11
+ */
12
+ class PipelineBuildStageActions extends constructs_1.Construct {
13
+ constructor(scope, id, props) {
14
+ super(scope, id);
15
+ const context = this.findPipelineActionContext(props.pipeline, props.actionName);
16
+ this.stage = context.stage;
17
+ this.sourceArtifact = context.sourceArtifact;
18
+ new rio_claidometer_1.Claidometer(this, 'Claidometer', {
19
+ product: rio_claidometer_1.ClaidometerProduct.CDK_CONTRIBUTION,
20
+ packageName: 'team-shipper-inbound-blue',
21
+ feature: 'pipeline',
22
+ version: '0.0.1',
23
+ });
24
+ }
25
+ /**
26
+ * Adds a CodeBuild action using the located action's first input artifact.
27
+ */
28
+ addBuildAction(props) {
29
+ const { actionType, ...actionProps } = props;
30
+ this.stage.addAction(new codepipelineActions.CodeBuildAction({
31
+ ...actionProps,
32
+ type: actionType,
33
+ input: this.sourceArtifact,
34
+ }));
35
+ }
36
+ findPipelineActionContext(pipeline, actionName) {
37
+ for (const stage of pipeline.stages) {
38
+ const action = stage.actions.find(candidate => candidate.actionProperties.actionName === actionName);
39
+ if (action === undefined) {
40
+ continue;
41
+ }
42
+ const sourceArtifact = action.actionProperties.inputs?.[0];
43
+ if (sourceArtifact === undefined) {
44
+ throw new Error(`Unable to locate the source artifact used by the ${actionName} action.`);
45
+ }
46
+ return {
47
+ stage,
48
+ sourceArtifact,
49
+ };
50
+ }
51
+ throw new Error(`Unable to locate the ${actionName} action in the generated pipeline.`);
52
+ }
53
+ }
54
+ exports.PipelineBuildStageActions = PipelineBuildStageActions;
55
+ _a = JSII_RTTI_SYMBOL_1;
56
+ PipelineBuildStageActions[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.PipelineBuildStageActions", version: "0.0.0" };
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGQtc3RhZ2UtYWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb250cmlidXRpb25zL3RlYW0tc2hpcHBlci1pbmJvdW5kLWJsdWUvcGlwZWxpbmUvcGlwZWxpbmUtYnVpbGQtc3RhZ2UtYWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLDRFQUE0RTtBQUM1RSwyQ0FBdUM7QUFDdkMsOERBQTJFO0FBc0UzRTs7R0FFRztBQUNILE1BQWEseUJBQTBCLFNBQVEsc0JBQVM7SUFXdEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFxQztRQUM3RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1FBRTdDLElBQUksNkJBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQ25DLE9BQU8sRUFBRSxvQ0FBa0IsQ0FBQyxnQkFBZ0I7WUFDNUMsV0FBVyxFQUFFLDJCQUEyQjtZQUN4QyxPQUFPLEVBQUUsVUFBVTtZQUNuQixPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsS0FBK0I7UUFDNUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUU3QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDbEIsSUFBSSxtQkFBbUIsQ0FBQyxlQUFlLENBQUM7WUFDdEMsR0FBRyxXQUFXO1lBQ2QsSUFBSSxFQUFFLFVBQVU7WUFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjO1NBQzNCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLHlCQUF5QixDQUMvQixRQUErQixFQUMvQixVQUFrQjtRQUtsQixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUM7WUFDckcsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxVQUFVLFVBQVUsQ0FBQyxDQUFDO1lBQzVGLENBQUM7WUFFRCxPQUFPO2dCQUNMLEtBQUs7Z0JBQ0wsY0FBYzthQUNmLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsVUFBVSxvQ0FBb0MsQ0FBQyxDQUFDO0lBQzFGLENBQUM7O0FBbEVILDhEQW1FQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvZGVidWlsZCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZWJ1aWxkJztcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lJztcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZUFjdGlvbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZS1hY3Rpb25zJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2xhaWRvbWV0ZXIsIENsYWlkb21ldGVyUHJvZHVjdCB9IGZyb20gJy4uLy4uLy4uL3Jpby1jbGFpZG9tZXRlcic7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgbG9jYXRpbmcgYW4gZXhpc3RpbmcgZ2VuZXJhdGVkIENvZGVQaXBlbGluZSBhY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVCdWlsZFN0YWdlQWN0aW9uc1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSB1bmRlcmx5aW5nIENvZGVQaXBlbGluZSBnZW5lcmF0ZWQgYnkgYGF3cy1jZGstbGliL3BpcGVsaW5lcy5Db2RlUGlwZWxpbmVgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlwZWxpbmU6IGNvZGVwaXBlbGluZS5QaXBlbGluZTtcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgYWN0aW9uIHdob3NlIGlucHV0IGFydGlmYWN0IHNob3VsZCBiZSByZXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhY3Rpb25OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBDb2RlQnVpbGQgYWN0aW9uIGFkZGVkIGJ5IGBQaXBlbGluZUJ1aWxkU3RhZ2VBY3Rpb25zYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUJ1aWxkQWN0aW9uUHJvcHMgZXh0ZW5kcyBjb2RlcGlwZWxpbmUuQ29tbW9uQXdzQWN0aW9uUHJvcHMge1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgYWRkaXRpb25hbCBpbnB1dCBhcnRpZmFjdHMgZm9yIHRoaXMgYWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFJbnB1dHM/OiBjb2RlcGlwZWxpbmUuQXJ0aWZhY3RbXTtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Ygb3V0cHV0IGFydGlmYWN0cyBmb3IgdGhpcyBhY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRzPzogY29kZXBpcGVsaW5lLkFydGlmYWN0W107XG5cbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24ncyBDb2RlQnVpbGQgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3Q6IGNvZGVidWlsZC5JUHJvamVjdDtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgQ29kZUJ1aWxkIGFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgQ29kZUJ1aWxkQWN0aW9uVHlwZS5CVUlMRFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uVHlwZT86IGNvZGVwaXBlbGluZUFjdGlvbnMuQ29kZUJ1aWxkQWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIENvZGVCdWlsZCBwcm9qZWN0IHdoZW4gdGhpcyBhY3Rpb24gZXhlY3V0ZXMuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudFZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIGNvZGVidWlsZC5CdWlsZEVudmlyb25tZW50VmFyaWFibGU+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNoZWNrIGZvciBzZWNyZXRzIGluIHBsYWludGV4dCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNoZWNrU2VjcmV0c0luUGxhaW5UZXh0RW52VmFyaWFibGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVHJpZ2dlciBhIGJhdGNoIGJ1aWxkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0ZUJhdGNoQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb21iaW5lIGJ1aWxkIGFydGlmYWN0cyBmb3IgYmF0Y2ggYnVpbGRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY29tYmluZUJhdGNoQnVpbGRBcnRpZmFjdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFkZHMgQ29kZUJ1aWxkIGFjdGlvbnMgbmV4dCB0byBhbiBleGlzdGluZyBhY3Rpb24gaW4gdGhlIHNhbWUgcGlwZWxpbmUgc3RhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZUJ1aWxkU3RhZ2VBY3Rpb25zIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFN0YWdlIHRoYXQgY29udGFpbnMgdGhlIGxvY2F0ZWQgYWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2U6IGNvZGVwaXBlbGluZS5JU3RhZ2U7XG5cbiAgLyoqXG4gICAqIEZpcnN0IGlucHV0IGFydGlmYWN0IG9mIHRoZSBsb2NhdGVkIGFjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUFydGlmYWN0OiBjb2RlcGlwZWxpbmUuQXJ0aWZhY3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQnVpbGRTdGFnZUFjdGlvbnNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5maW5kUGlwZWxpbmVBY3Rpb25Db250ZXh0KHByb3BzLnBpcGVsaW5lLCBwcm9wcy5hY3Rpb25OYW1lKTtcbiAgICB0aGlzLnN0YWdlID0gY29udGV4dC5zdGFnZTtcbiAgICB0aGlzLnNvdXJjZUFydGlmYWN0ID0gY29udGV4dC5zb3VyY2VBcnRpZmFjdDtcblxuICAgIG5ldyBDbGFpZG9tZXRlcih0aGlzLCAnQ2xhaWRvbWV0ZXInLCB7XG4gICAgICBwcm9kdWN0OiBDbGFpZG9tZXRlclByb2R1Y3QuQ0RLX0NPTlRSSUJVVElPTixcbiAgICAgIHBhY2thZ2VOYW1lOiAndGVhbS1zaGlwcGVyLWluYm91bmQtYmx1ZScsXG4gICAgICBmZWF0dXJlOiAncGlwZWxpbmUnLFxuICAgICAgdmVyc2lvbjogJzAuMC4xJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgQ29kZUJ1aWxkIGFjdGlvbiB1c2luZyB0aGUgbG9jYXRlZCBhY3Rpb24ncyBmaXJzdCBpbnB1dCBhcnRpZmFjdC5cbiAgICovXG4gIGFkZEJ1aWxkQWN0aW9uKHByb3BzOiBQaXBlbGluZUJ1aWxkQWN0aW9uUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGFjdGlvblR5cGUsIC4uLmFjdGlvblByb3BzIH0gPSBwcm9wcztcblxuICAgIHRoaXMuc3RhZ2UuYWRkQWN0aW9uKFxuICAgICAgbmV3IGNvZGVwaXBlbGluZUFjdGlvbnMuQ29kZUJ1aWxkQWN0aW9uKHtcbiAgICAgICAgLi4uYWN0aW9uUHJvcHMsXG4gICAgICAgIHR5cGU6IGFjdGlvblR5cGUsXG4gICAgICAgIGlucHV0OiB0aGlzLnNvdXJjZUFydGlmYWN0LFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGlwZWxpbmVBY3Rpb25Db250ZXh0KFxuICAgIHBpcGVsaW5lOiBjb2RlcGlwZWxpbmUuUGlwZWxpbmUsXG4gICAgYWN0aW9uTmFtZTogc3RyaW5nXG4gICk6IHtcbiAgICBzdGFnZTogY29kZXBpcGVsaW5lLklTdGFnZTtcbiAgICBzb3VyY2VBcnRpZmFjdDogY29kZXBpcGVsaW5lLkFydGlmYWN0O1xuICB9IHtcbiAgICBmb3IgKGNvbnN0IHN0YWdlIG9mIHBpcGVsaW5lLnN0YWdlcykge1xuICAgICAgY29uc3QgYWN0aW9uID0gc3RhZ2UuYWN0aW9ucy5maW5kKGNhbmRpZGF0ZSA9PiBjYW5kaWRhdGUuYWN0aW9uUHJvcGVydGllcy5hY3Rpb25OYW1lID09PSBhY3Rpb25OYW1lKTtcbiAgICAgIGlmIChhY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlQXJ0aWZhY3QgPSBhY3Rpb24uYWN0aW9uUHJvcGVydGllcy5pbnB1dHM/LlswXTtcbiAgICAgIGlmIChzb3VyY2VBcnRpZmFjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvY2F0ZSB0aGUgc291cmNlIGFydGlmYWN0IHVzZWQgYnkgdGhlICR7YWN0aW9uTmFtZX0gYWN0aW9uLmApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFnZSxcbiAgICAgICAgc291cmNlQXJ0aWZhY3QsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvY2F0ZSB0aGUgJHthY3Rpb25OYW1lfSBhY3Rpb24gaW4gdGhlIGdlbmVyYXRlZCBwaXBlbGluZS5gKTtcbiAgfVxufVxuIl19
@@ -61,6 +61,13 @@ export declare const DATADOG_SLO_TIMEFRAMES: readonly ["7d", "30d", "90d"];
61
61
  export type DatadogSloTimeframe = (typeof DATADOG_SLO_TIMEFRAMES)[number];
62
62
  /**
63
63
  * Generate default SLO thresholds for a given criticality level.
64
+ *
65
+ * Prefer this helper unless a specific target has been agreed for the service.
66
+ *
67
+ * Example:
68
+ * ```ts
69
+ * thresholds: defaultThresholds('medium')
70
+ * ```
64
71
  */
65
72
  export declare function defaultThresholds(level: CriticalityLevel): DatadogSloThreshold[];
66
73
  /**
@@ -10,6 +10,13 @@ const rio_landing_zone_1 = require("../rio-landing-zone");
10
10
  exports.DATADOG_SLO_TIMEFRAMES = ['7d', '30d', '90d'];
11
11
  /**
12
12
  * Generate default SLO thresholds for a given criticality level.
13
+ *
14
+ * Prefer this helper unless a specific target has been agreed for the service.
15
+ *
16
+ * Example:
17
+ * ```ts
18
+ * thresholds: defaultThresholds('medium')
19
+ * ```
13
20
  */
14
21
  function defaultThresholds(level) {
15
22
  // [Capabilities - RIO Tech Platform Docs - MAN Confluence PRD](https://confluence.collaboration-man.com/x/nLUSEw)
@@ -106,4 +113,4 @@ function validateCustomTags(customTags) {
106
113
  throw new Error('DatadogSlo customTags must follow the "key:value" format.');
107
114
  }
108
115
  }
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy1zbG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWRvZ3YyL2RhdGFkb2ctc2xvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFnRkEsOENBWUM7O0FBNUZELG1DQUFtQztBQUNuQywyQ0FBdUM7QUFDdkMsMERBQXFEO0FBdUV4QyxRQUFBLHNCQUFzQixHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQVUsQ0FBQztBQUlwRTs7R0FFRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLEtBQXVCO0lBQ3ZELGtIQUFrSDtJQUNsSCxNQUFNLE9BQU8sR0FBcUM7UUFDaEQsSUFBSSxFQUFFLElBQUk7UUFDVixNQUFNLEVBQUUsRUFBRTtRQUNWLEdBQUcsRUFBRSxFQUFFO0tBQ1IsQ0FBQztJQUVGLE9BQU8sOEJBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2hDLFNBQVMsRUFBRSxTQUFTO0tBQ3JCLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQUd2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixtQkFBbUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxLQUFL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LGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLFVBQXFCO0lBQy9DLElBQUksVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELElBQUksVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQy9FLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgUmlvTGFuZGluZ1pvbmUgfSBmcm9tICcuLi9yaW8tbGFuZGluZy16b25lJztcblxuLyoqXG4gKiBTTE8gY3JpdGljYWxpdHkgbGV2ZWxzIHVzZWQgdG8gc2VsZWN0IGRlZmF1bHQgdGhyZXNob2xkIHRhcmdldHMuXG4gKi9cbmV4cG9ydCB0eXBlIENyaXRpY2FsaXR5TGV2ZWwgPSAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnO1xuXG4vKipcbiAqIFRoZSBwcm9kdWN0IHN0cmVhbXMuXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmVhbSA9ICdwbGF0Zm9ybScgfCAnc2hpcHBlcicgfCAndHJhbnNwb3J0JztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIG9mIHtAbGluayBEYXRhZG9nU2xvfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFkb2dTbG9Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgU0xPIGluIERhdGFkb2cuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEYXRhZG9nIG1vbml0b3IgSURzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBTTE8uXG4gICAqXG4gICAqIEVhY2ggZW50cnkgbXVzdCBiZSBhIG51bWVyaWMgc3RyaW5nIChmb3IgZXhhbXBsZSBcIjEyMzQ1NjdcIikuXG4gICAqL1xuICByZWFkb25seSBtb25pdG9ySWRzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHByb2R1Y3Qgc3RyZWFtIHRoYXQgdGhpcyBTTE8gYmVsb25ncyB0by4gVGhpcyBpcyB1c2VkIGZvciBmaWx0ZXJpbmcgU0xPcyBpbiBkYXNoYm9hcmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyZWFtOiBTdHJlYW07XG5cbiAgLyoqXG4gICAqIFRoZSBjcml0aWNhbGl0eSBsZXZlbCBmb3IgdGhlIFNMTyBhcyBkZWZpbmVkIGF0IFtDYXBhYmlsaXRpZXMgLSBSSU8gVGVjaCBQbGF0Zm9ybSBEb2NzIC0gTUFOIENvbmZsdWVuY2UgUFJEXShodHRwczovL2NvbmZsdWVuY2UuY29sbGFib3JhdGlvbi1tYW4uY29tL3gvbkxVU0V3KS5cbiAgICovXG4gIHJlYWRvbmx5IGNyaXRpY2FsaXR5OiBDcml0aWNhbGl0eUxldmVsO1xuXG4gIC8qKlxuICAgKiBUaHJlc2hvbGQgZGVmaW5pdGlvbnMgYXBwbGllZCB0byB0aGUgU0xPLlxuICAgKlxuICAgKiBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyB1c2UgY2FzZSBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgZGVmYXVsdFRocmVzaG9sZHMoLi4uKS5cbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZHM6IERhdGFkb2dTbG9UaHJlc2hvbGRbXTtcblxuICAvKipcbiAgICogVGhlIFNMTyB0eXBlLiBPbmx5IFwibW9uaXRvclwiIGlzIHN1cHBvcnRlZCBmb3Igbm93LlxuICAgKiBTdGlsbCB0aGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkIHRvIG1ha2UgZnV0dXJlIGV4dGVuc2lvbnMgbW9yZSBzZWFtbGVzcy5cbiAgICovXG4gIHJlYWRvbmx5IHNsb1R5cGU6ICdtb25pdG9yJztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCB0YWdzIHRvIGFwcGx5IHRvIHRoZSBTTE8uXG4gICAqXG4gICAqIEVhY2ggZW50cnkgbXVzdCBmb2xsb3cgdGhlIFwia2V5OnZhbHVlXCIgZm9ybWF0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFUYWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWRvZ1Nsb1RocmVzaG9sZCB7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHBlcmNlbnRhZ2UgZm9yIHRoZSBTTE8gKGZvciBleGFtcGxlIDk5LjUpLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGVyY2VudGFnZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZWZyYW1lIGZvciB0aGUgdGFyZ2V0IChmb3IgZXhhbXBsZSBcIjdkXCIsIFwiMzBkXCIsIFwiOTBkXCIpLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZWZyYW1lOiBEYXRhZG9nU2xvVGltZWZyYW1lO1xufVxuXG5leHBvcnQgY29uc3QgREFUQURPR19TTE9fVElNRUZSQU1FUyA9IFsnN2QnLCAnMzBkJywgJzkwZCddIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBEYXRhZG9nU2xvVGltZWZyYW1lID0gKHR5cGVvZiBEQVRBRE9HX1NMT19USU1FRlJBTUVTKVtudW1iZXJdO1xuXG4vKipcbiAqIEdlbmVyYXRlIGRlZmF1bHQgU0xPIHRocmVzaG9sZHMgZm9yIGEgZ2l2ZW4gY3JpdGljYWxpdHkgbGV2ZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0VGhyZXNob2xkcyhsZXZlbDogQ3JpdGljYWxpdHlMZXZlbCk6IERhdGFkb2dTbG9UaHJlc2hvbGRbXSB7XG4gIC8vIFtDYXBhYmlsaXRpZXMgLSBSSU8gVGVjaCBQbGF0Zm9ybSBEb2NzIC0gTUFOIENvbmZsdWVuY2UgUFJEXShodHRwczovL2NvbmZsdWVuY2UuY29sbGFib3JhdGlvbi1tYW4uY29tL3gvbkxVU0V3KVxuICBjb25zdCB0YXJnZXRzOiBSZWNvcmQ8Q3JpdGljYWxpdHlMZXZlbCwgbnVtYmVyPiA9IHtcbiAgICBoaWdoOiA5OS41LFxuICAgIG1lZGl1bTogOTgsXG4gICAgbG93OiA5NSxcbiAgfTtcblxuICByZXR1cm4gREFUQURPR19TTE9fVElNRUZSQU1FUy5tYXAodGltZWZyYW1lID0+ICh7XG4gICAgdGFyZ2V0UGVyY2VudGFnZTogdGFyZ2V0c1tsZXZlbF0sXG4gICAgdGltZWZyYW1lOiB0aW1lZnJhbWUsXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCBEYXRhZG9nJ3MgQ2xvdWRGb3JtYXRpb24gYERhdGFkb2c6OlNMT3M6OlNMT2Agd2l0aCBzb21lIFJJTyBkZWZhdWx0cyBhcHBsaWVkLlxuICpcbiAqIEN1cnJlbnRseSBvbmx5IFNMT3Mgb2YgVHlwZSBNb25pdG9yIGFyZSBpbXBsZW1lbnRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFkb2dTbG8gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHNsbzogY2RrLkNmblJlc291cmNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhZG9nU2xvUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdmFsaWRhdGVOYW1lKHByb3BzLm5hbWUpO1xuICAgIHZhbGlkYXRlTW9uaXRvcnNJZHMocHJvcHMubW9uaXRvcklkcyk7XG4gICAgdmFsaWRhdGVUaHJlc2hvbGRzKHByb3BzLnRocmVzaG9sZHMpO1xuICAgIHZhbGlkYXRlVHlwZShwcm9wcy5zbG9UeXBlKTtcbiAgICB2YWxpZGF0ZUN1c3RvbVRhZ3MocHJvcHMuZXh0cmFUYWdzKTtcblxuICAgIGlmICghbWF0Y2hlc0RlZmF1bHRUaHJlc2hvbGRzRm9yQ3JpdGljYWxpdHkocHJvcHMuY3JpdGljYWxpdHksIHByb3BzLnRocmVzaG9sZHMpKSB7XG4gICAgICBjZGsuQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgJ0RhdGFkb2dTbG8gdGhyZXNob2xkcyBkbyBub3QgbWF0Y2ggdGhlIGRlZmF1bHRzIGZvciB0aGUgc3BlY2lmaWVkIGNyaXRpY2FsaXR5IGxldmVsLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVhbU5hbWUgPSBSaW9MYW5kaW5nWm9uZS5nZXRUZWFtTmFtZVBhcmFtZXRlcih0aGlzKTtcbiAgICBjb25zdCB0ZWFtSWRlbnRpZmllciA9IFJpb0xhbmRpbmdab25lLmdldFRlYW1JZGVudGlmaWVyUGFyYW1ldGVyKHRoaXMpO1xuICAgIGNvbnN0IGFjY291bnROYW1lID0gUmlvTGFuZGluZ1pvbmUuZ2V0QWNjb3VudE5hbWVQYXJhbWV0ZXIodGhpcyk7XG5cbiAgICAvLyBDbG91ZGZvcm1hdGlvbiBleHBlY3RzIHVwcGVyY2FzZSBwcm9wZXJ0eSBrZXlzXG4gICAgY29uc3QgdGhyZXNob2xkc0ZvckNmbiA9IHByb3BzLnRocmVzaG9sZHMubWFwKCh7IHRhcmdldFBlcmNlbnRhZ2UsIHRpbWVmcmFtZSB9KSA9PiAoe1xuICAgICAgVGFyZ2V0OiB0YXJnZXRQZXJjZW50YWdlLFxuICAgICAgVGltZWZyYW1lOiB0aW1lZnJhbWUsXG4gICAgfSkpO1xuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdGFEb2cvZGF0YWRvZy1jbG91ZGZvcm1hdGlvbi1yZXNvdXJjZXMvdHJlZS9tYXN0ZXIvZGF0YWRvZy1zbG9zLXNsby1oYW5kbGVyXG4gICAgdGhpcy5zbG8gPSBuZXcgY2RrLkNmblJlc291cmNlKHRoaXMsICdTTE8nLCB7XG4gICAgICB0eXBlOiAnRGF0YWRvZzo6U0xPczo6U0xPJyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgTmFtZTogcHJvcHMubmFtZSxcbiAgICAgICAgVHlwZTogcHJvcHMuc2xvVHlwZSxcbiAgICAgICAgTW9uaXRvcklkczogcHJvcHMubW9uaXRvcklkcyxcbiAgICAgICAgVGhyZXNob2xkczogdGhyZXNob2xkc0ZvckNmbixcbiAgICAgICAgVGFnczogW1xuICAgICAgICAgIC4uLihwcm9wcy5leHRyYVRhZ3MgPz8gW10pLFxuICAgICAgICAgIGBjcml0aWNhbGl0eToke3Byb3BzLmNyaXRpY2FsaXR5fWAsXG4gICAgICAgICAgYHN0cmVhbToke3Byb3BzLnN0cmVhbX1gLFxuICAgICAgICAgIGBhY2NvdW50X2lkOiR7Y2RrLlN0YWNrLm9mKHRoaXMpLmFjY291bnR9YCxcbiAgICAgICAgICBgYWNjb3VudF9uYW1lOiR7YWNjb3VudE5hbWUuc3RyaW5nVmFsdWV9YCxcbiAgICAgICAgICBgdGVhbToke3RlYW1OYW1lLnN0cmluZ1ZhbHVlfWAsXG4gICAgICAgICAgYHRlYW1faWRlbnRpZmllcjoke3RlYW1JZGVudGlmaWVyLnN0cmluZ1ZhbHVlfWAsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNsb0lkKCkge1xuICAgIHJldHVybiBjZGsuRm4ucmVmKHRoaXMuc2xvLmxvZ2ljYWxJZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZykge1xuICBpZiAoIW5hbWUudHJpbSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhZG9nU2xvIG5hbWUgbXVzdCBiZSBub24tZW1wdHkuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNb25pdG9yc0lkcyhtb25pdG9yc0lkczogc3RyaW5nW10pIHtcbiAgaWYgKG1vbml0b3JzSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGF0YWRvZ1NsbyBtb25pdG9yc0lkcyBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG1vbml0b3IgSUQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUaHJlc2hvbGRzKHRocmVzaG9sZHM6IERhdGFkb2dTbG9UaHJlc2hvbGRbXSkge1xuICBpZiAodGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFkb2dTbG8gdGhyZXNob2xkcyBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIHRocmVzaG9sZC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVR5cGUodHlwZT86ICdtb25pdG9yJykge1xuICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUgIT09ICdtb25pdG9yJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRGF0YWRvZ1NsbyB0eXBlIG11c3QgYmUgXCJtb25pdG9yXCIuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF0Y2hlc0RlZmF1bHRUaHJlc2hvbGRzRm9yQ3JpdGljYWxpdHkobGV2ZWw6IENyaXRpY2FsaXR5TGV2ZWwsIHRocmVzaG9sZHM6IERhdGFkb2dTbG9UaHJlc2hvbGRbXSkge1xuICBjb25zdCBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFRocmVzaG9sZHMobGV2ZWwpO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGVmYXVsdFZhbHVlcykgPT09IEpTT04uc3RyaW5naWZ5KHRocmVzaG9sZHMpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUN1c3RvbVRhZ3MoY3VzdG9tVGFncz86IHN0cmluZ1tdKSB7XG4gIGlmIChjdXN0b21UYWdzPy5zb21lKHRhZyA9PiAhdGFnLnRyaW0oKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFkb2dTbG8gY3VzdG9tVGFncyBtdXN0IG5vdCBjb250YWluIGVtcHR5IHZhbHVlcy4nKTtcbiAgfVxuICBpZiAoY3VzdG9tVGFncz8uc29tZSh0YWcgPT4gIS9eW146XSs6LiskLy50ZXN0KHRhZykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhZG9nU2xvIGN1c3RvbVRhZ3MgbXVzdCBmb2xsb3cgdGhlIFwia2V5OnZhbHVlXCIgZm9ybWF0LicpO1xuICB9XG59XG4iXX0=
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy1zbG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWRvZ3YyL2RhdGFkb2ctc2xvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUF1RkEsOENBWUM7O0FBbkdELG1DQUFtQztBQUNuQywyQ0FBdUM7QUFDdkMsMERBQXFEO0FBdUV4QyxRQUFBLHNCQUFzQixHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQVUsQ0FBQztBQUlwRTs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxLQUF1QjtJQUN2RCxrSEFBa0g7SUFDbEgsTUFBTSxPQUFPLEdBQXFDO1FBQ2hELElBQUksRUFBRSxJQUFJO1FBQ1YsTUFBTSxFQUFFLEVBQUU7UUFDVixHQUFHLEVBQUUsRUFBRTtLQUNSLENBQUM7SUFFRixPQUFPLDhCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNoQyxTQUFTLEVBQUUsU0FBUztLQUNyQixDQUFDLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsc0JBQVM7SUFHdkMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsc0NBQXNDLENB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QWEsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxVQUFxQjtJQUMvQyxJQUFJLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxJQUFJLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUMvRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFJpb0xhbmRpbmdab25lIH0gZnJvbSAnLi4vcmlvLWxhbmRpbmctem9uZSc7XG5cbi8qKlxuICogU0xPIGNyaXRpY2FsaXR5IGxldmVscyB1c2VkIHRvIHNlbGVjdCBkZWZhdWx0IHRocmVzaG9sZCB0YXJnZXRzLlxuICovXG5leHBvcnQgdHlwZSBDcml0aWNhbGl0eUxldmVsID0gJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JztcblxuLyoqXG4gKiBUaGUgcHJvZHVjdCBzdHJlYW1zLlxuICovXG5leHBvcnQgdHlwZSBTdHJlYW0gPSAncGxhdGZvcm0nIHwgJ3NoaXBwZXInIHwgJ3RyYW5zcG9ydCc7XG5cbi8qKlxuICogUHJvcGVydGllcyBvZiB7QGxpbmsgRGF0YWRvZ1Nsb31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhZG9nU2xvUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIFNMTyBpbiBEYXRhZG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRGF0YWRvZyBtb25pdG9yIElEcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgU0xPLlxuICAgKlxuICAgKiBFYWNoIGVudHJ5IG11c3QgYmUgYSBudW1lcmljIHN0cmluZyAoZm9yIGV4YW1wbGUgXCIxMjM0NTY3XCIpLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9uaXRvcklkczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9kdWN0IHN0cmVhbSB0aGF0IHRoaXMgU0xPIGJlbG9uZ3MgdG8uIFRoaXMgaXMgdXNlZCBmb3IgZmlsdGVyaW5nIFNMT3MgaW4gZGFzaGJvYXJkcy5cbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbTogU3RyZWFtO1xuXG4gIC8qKlxuICAgKiBUaGUgY3JpdGljYWxpdHkgbGV2ZWwgZm9yIHRoZSBTTE8gYXMgZGVmaW5lZCBhdCBbQ2FwYWJpbGl0aWVzIC0gUklPIFRlY2ggUGxhdGZvcm0gRG9jcyAtIE1BTiBDb25mbHVlbmNlIFBSRF0oaHR0cHM6Ly9jb25mbHVlbmNlLmNvbGxhYm9yYXRpb24tbWFuLmNvbS94L25MVVNFdykuXG4gICAqL1xuICByZWFkb25seSBjcml0aWNhbGl0eTogQ3JpdGljYWxpdHlMZXZlbDtcblxuICAvKipcbiAgICogVGhyZXNob2xkIGRlZmluaXRpb25zIGFwcGxpZWQgdG8gdGhlIFNMTy5cbiAgICpcbiAgICogVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgdXNlIGNhc2UgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGRlZmF1bHRUaHJlc2hvbGRzKC4uLikuXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGRzOiBEYXRhZG9nU2xvVGhyZXNob2xkW107XG5cbiAgLyoqXG4gICAqIFRoZSBTTE8gdHlwZS4gT25seSBcIm1vbml0b3JcIiBpcyBzdXBwb3J0ZWQgZm9yIG5vdy5cbiAgICogU3RpbGwgdGhpcyBwcm9wZXJ0eSBpcyByZXF1aXJlZCB0byBtYWtlIGZ1dHVyZSBleHRlbnNpb25zIG1vcmUgc2VhbWxlc3MuXG4gICAqL1xuICByZWFkb25seSBzbG9UeXBlOiAnbW9uaXRvcic7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgdGFncyB0byBhcHBseSB0byB0aGUgU0xPLlxuICAgKlxuICAgKiBFYWNoIGVudHJ5IG11c3QgZm9sbG93IHRoZSBcImtleTp2YWx1ZVwiIGZvcm1hdC5cbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhVGFncz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFkb2dTbG9UaHJlc2hvbGQge1xuICAvKipcbiAgICogVGhlIHRhcmdldCBwZXJjZW50YWdlIGZvciB0aGUgU0xPIChmb3IgZXhhbXBsZSA5OS41KS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBlcmNlbnRhZ2U6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHRpbWVmcmFtZSBmb3IgdGhlIHRhcmdldCAoZm9yIGV4YW1wbGUgXCI3ZFwiLCBcIjMwZFwiLCBcIjkwZFwiKS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVmcmFtZTogRGF0YWRvZ1Nsb1RpbWVmcmFtZTtcbn1cblxuZXhwb3J0IGNvbnN0IERBVEFET0dfU0xPX1RJTUVGUkFNRVMgPSBbJzdkJywgJzMwZCcsICc5MGQnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRGF0YWRvZ1Nsb1RpbWVmcmFtZSA9ICh0eXBlb2YgREFUQURPR19TTE9fVElNRUZSQU1FUylbbnVtYmVyXTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBkZWZhdWx0IFNMTyB0aHJlc2hvbGRzIGZvciBhIGdpdmVuIGNyaXRpY2FsaXR5IGxldmVsLlxuICpcbiAqIFByZWZlciB0aGlzIGhlbHBlciB1bmxlc3MgYSBzcGVjaWZpYyB0YXJnZXQgaGFzIGJlZW4gYWdyZWVkIGZvciB0aGUgc2VydmljZS5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIHRocmVzaG9sZHM6IGRlZmF1bHRUaHJlc2hvbGRzKCdtZWRpdW0nKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0VGhyZXNob2xkcyhsZXZlbDogQ3JpdGljYWxpdHlMZXZlbCk6IERhdGFkb2dTbG9UaHJlc2hvbGRbXSB7XG4gIC8vIFtDYXBhYmlsaXRpZXMgLSBSSU8gVGVjaCBQbGF0Zm9ybSBEb2NzIC0gTUFOIENvbmZsdWVuY2UgUFJEXShodHRwczovL2NvbmZsdWVuY2UuY29sbGFib3JhdGlvbi1tYW4uY29tL3gvbkxVU0V3KVxuICBjb25zdCB0YXJnZXRzOiBSZWNvcmQ8Q3JpdGljYWxpdHlMZXZlbCwgbnVtYmVyPiA9IHtcbiAgICBoaWdoOiA5OS41LFxuICAgIG1lZGl1bTogOTgsXG4gICAgbG93OiA5NSxcbiAgfTtcblxuICByZXR1cm4gREFUQURPR19TTE9fVElNRUZSQU1FUy5tYXAodGltZWZyYW1lID0+ICh7XG4gICAgdGFyZ2V0UGVyY2VudGFnZTogdGFyZ2V0c1tsZXZlbF0sXG4gICAgdGltZWZyYW1lOiB0aW1lZnJhbWUsXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCBEYXRhZG9nJ3MgQ2xvdWRGb3JtYXRpb24gYERhdGFkb2c6OlNMT3M6OlNMT2Agd2l0aCBzb21lIFJJTyBkZWZhdWx0cyBhcHBsaWVkLlxuICpcbiAqIEN1cnJlbnRseSBvbmx5IFNMT3Mgb2YgVHlwZSBNb25pdG9yIGFyZSBpbXBsZW1lbnRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFkb2dTbG8gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHNsbzogY2RrLkNmblJlc291cmNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhZG9nU2xvUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdmFsaWRhdGVOYW1lKHByb3BzLm5hbWUpO1xuICAgIHZhbGlkYXRlTW9uaXRvcnNJZHMocHJvcHMubW9uaXRvcklkcyk7XG4gICAgdmFsaWRhdGVUaHJlc2hvbGRzKHByb3BzLnRocmVzaG9sZHMpO1xuICAgIHZhbGlkYXRlVHlwZShwcm9wcy5zbG9UeXBlKTtcbiAgICB2YWxpZGF0ZUN1c3RvbVRhZ3MocHJvcHMuZXh0cmFUYWdzKTtcblxuICAgIGlmICghbWF0Y2hlc0RlZmF1bHRUaHJlc2hvbGRzRm9yQ3JpdGljYWxpdHkocHJvcHMuY3JpdGljYWxpdHksIHByb3BzLnRocmVzaG9sZHMpKSB7XG4gICAgICBjZGsuQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhcbiAgICAgICAgJ0RhdGFkb2dTbG8gdGhyZXNob2xkcyBkbyBub3QgbWF0Y2ggdGhlIGRlZmF1bHRzIGZvciB0aGUgc3BlY2lmaWVkIGNyaXRpY2FsaXR5IGxldmVsLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVhbU5hbWUgPSBSaW9MYW5kaW5nWm9uZS5nZXRUZWFtTmFtZVBhcmFtZXRlcih0aGlzKTtcbiAgICBjb25zdCB0ZWFtSWRlbnRpZmllciA9IFJpb0xhbmRpbmdab25lLmdldFRlYW1JZGVudGlmaWVyUGFyYW1ldGVyKHRoaXMpO1xuICAgIGNvbnN0IGFjY291bnROYW1lID0gUmlvTGFuZGluZ1pvbmUuZ2V0QWNjb3VudE5hbWVQYXJhbWV0ZXIodGhpcyk7XG5cbiAgICAvLyBDbG91ZGZvcm1hdGlvbiBleHBlY3RzIHVwcGVyY2FzZSBwcm9wZXJ0eSBrZXlzXG4gICAgY29uc3QgdGhyZXNob2xkc0ZvckNmbiA9IHByb3BzLnRocmVzaG9sZHMubWFwKCh7IHRhcmdldFBlcmNlbnRhZ2UsIHRpbWVmcmFtZSB9KSA9PiAoe1xuICAgICAgVGFyZ2V0OiB0YXJnZXRQZXJjZW50YWdlLFxuICAgICAgVGltZWZyYW1lOiB0aW1lZnJhbWUsXG4gICAgfSkpO1xuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdGFEb2cvZGF0YWRvZy1jbG91ZGZvcm1hdGlvbi1yZXNvdXJjZXMvdHJlZS9tYXN0ZXIvZGF0YWRvZy1zbG9zLXNsby1oYW5kbGVyXG4gICAgdGhpcy5zbG8gPSBuZXcgY2RrLkNmblJlc291cmNlKHRoaXMsICdTTE8nLCB7XG4gICAgICB0eXBlOiAnRGF0YWRvZzo6U0xPczo6U0xPJyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgTmFtZTogcHJvcHMubmFtZSxcbiAgICAgICAgVHlwZTogcHJvcHMuc2xvVHlwZSxcbiAgICAgICAgTW9uaXRvcklkczogcHJvcHMubW9uaXRvcklkcyxcbiAgICAgICAgVGhyZXNob2xkczogdGhyZXNob2xkc0ZvckNmbixcbiAgICAgICAgVGFnczogW1xuICAgICAgICAgIC4uLihwcm9wcy5leHRyYVRhZ3MgPz8gW10pLFxuICAgICAgICAgIGBjcml0aWNhbGl0eToke3Byb3BzLmNyaXRpY2FsaXR5fWAsXG4gICAgICAgICAgYHN0cmVhbToke3Byb3BzLnN0cmVhbX1gLFxuICAgICAgICAgIGBhY2NvdW50X2lkOiR7Y2RrLlN0YWNrLm9mKHRoaXMpLmFjY291bnR9YCxcbiAgICAgICAgICBgYWNjb3VudF9uYW1lOiR7YWNjb3VudE5hbWUuc3RyaW5nVmFsdWV9YCxcbiAgICAgICAgICBgdGVhbToke3RlYW1OYW1lLnN0cmluZ1ZhbHVlfWAsXG4gICAgICAgICAgYHRlYW1faWRlbnRpZmllcjoke3RlYW1JZGVudGlmaWVyLnN0cmluZ1ZhbHVlfWAsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHNsb0lkKCkge1xuICAgIHJldHVybiBjZGsuRm4ucmVmKHRoaXMuc2xvLmxvZ2ljYWxJZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOYW1lKG5hbWU6IHN0cmluZykge1xuICBpZiAoIW5hbWUudHJpbSgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhZG9nU2xvIG5hbWUgbXVzdCBiZSBub24tZW1wdHkuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNb25pdG9yc0lkcyhtb25pdG9yc0lkczogc3RyaW5nW10pIHtcbiAgaWYgKG1vbml0b3JzSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGF0YWRvZ1NsbyBtb25pdG9yc0lkcyBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIG1vbml0b3IgSUQuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUaHJlc2hvbGRzKHRocmVzaG9sZHM6IERhdGFkb2dTbG9UaHJlc2hvbGRbXSkge1xuICBpZiAodGhyZXNob2xkcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFkb2dTbG8gdGhyZXNob2xkcyBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIHRocmVzaG9sZC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVR5cGUodHlwZT86ICdtb25pdG9yJykge1xuICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUgIT09ICdtb25pdG9yJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRGF0YWRvZ1NsbyB0eXBlIG11c3QgYmUgXCJtb25pdG9yXCIuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF0Y2hlc0RlZmF1bHRUaHJlc2hvbGRzRm9yQ3JpdGljYWxpdHkobGV2ZWw6IENyaXRpY2FsaXR5TGV2ZWwsIHRocmVzaG9sZHM6IERhdGFkb2dTbG9UaHJlc2hvbGRbXSkge1xuICBjb25zdCBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFRocmVzaG9sZHMobGV2ZWwpO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGVmYXVsdFZhbHVlcykgPT09IEpTT04uc3RyaW5naWZ5KHRocmVzaG9sZHMpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUN1c3RvbVRhZ3MoY3VzdG9tVGFncz86IHN0cmluZ1tdKSB7XG4gIGlmIChjdXN0b21UYWdzPy5zb21lKHRhZyA9PiAhdGFnLnRyaW0oKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGFkb2dTbG8gY3VzdG9tVGFncyBtdXN0IG5vdCBjb250YWluIGVtcHR5IHZhbHVlcy4nKTtcbiAgfVxuICBpZiAoY3VzdG9tVGFncz8uc29tZSh0YWcgPT4gIS9eW146XSs6LiskLy50ZXN0KHRhZykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhZG9nU2xvIGN1c3RvbVRhZ3MgbXVzdCBmb2xsb3cgdGhlIFwia2V5OnZhbHVlXCIgZm9ybWF0LicpO1xuICB9XG59XG4iXX0=