@fjall/components-infrastructure 0.88.1 → 0.88.4

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.
Files changed (146) hide show
  1. package/dist/lib/app.d.ts +34 -11
  2. package/dist/lib/app.js +83 -39
  3. package/dist/lib/aspects/index.d.ts +1 -0
  4. package/dist/lib/aspects/index.js +6 -0
  5. package/dist/lib/config/aws/accountAuditRole.d.ts +20 -0
  6. package/dist/lib/config/aws/accountAuditRole.js +38 -0
  7. package/dist/lib/config/aws/accountMonitoringRole.d.ts +22 -0
  8. package/dist/lib/config/aws/accountMonitoringRole.js +133 -0
  9. package/dist/lib/config/aws/cloudTrail.d.ts +0 -3
  10. package/dist/lib/config/aws/cloudTrail.js +2 -2
  11. package/dist/lib/config/aws/disasterRecovery.js +26 -14
  12. package/dist/lib/config/aws/ecrDefaultImage.js +4 -3
  13. package/dist/lib/config/aws/identityCenter.d.ts +4 -4
  14. package/dist/lib/config/aws/identityCenter.js +17 -62
  15. package/dist/lib/config/aws/identityCenterGroupMembership.js +27 -37
  16. package/dist/lib/config/aws/index.d.ts +4 -7
  17. package/dist/lib/config/aws/index.js +5 -8
  18. package/dist/lib/config/aws/oidcConnector.d.ts +8 -0
  19. package/dist/lib/config/aws/oidcConnector.js +46 -0
  20. package/dist/lib/config/aws/platform.d.ts +2 -0
  21. package/dist/lib/config/aws/platform.js +6 -0
  22. package/dist/lib/config/index.d.ts +2 -0
  23. package/dist/lib/config/index.js +21 -0
  24. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets +30 -0
  25. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  26. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets +30 -0
  27. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  28. package/dist/lib/patterns/aws/account.js +45 -19
  29. package/dist/lib/patterns/aws/cdn.d.ts +19 -40
  30. package/dist/lib/patterns/aws/cdn.js +21 -17
  31. package/dist/lib/patterns/aws/compute.d.ts +6 -7
  32. package/dist/lib/patterns/aws/compute.js +7 -9
  33. package/dist/lib/patterns/aws/database.d.ts +9 -89
  34. package/dist/lib/patterns/aws/database.js +17 -40
  35. package/dist/lib/patterns/aws/index.d.ts +1 -1
  36. package/dist/lib/patterns/aws/index.js +2 -2
  37. package/dist/lib/patterns/aws/interfaces/cdn.d.ts +26 -0
  38. package/dist/lib/patterns/aws/interfaces/cdn.js +14 -0
  39. package/dist/lib/patterns/aws/interfaces/connector.d.ts +4 -181
  40. package/dist/lib/patterns/aws/interfaces/connector.js +16 -113
  41. package/dist/lib/patterns/aws/interfaces/index.d.ts +1 -0
  42. package/dist/lib/patterns/aws/interfaces/index.js +5 -2
  43. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +6 -6
  44. package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
  45. package/dist/lib/patterns/aws/network.js +6 -9
  46. package/dist/lib/patterns/aws/organisation.d.ts +6 -17
  47. package/dist/lib/patterns/aws/organisation.js +22 -67
  48. package/dist/lib/patterns/aws/payload.js +11 -12
  49. package/dist/lib/patterns/aws/storage.d.ts +3 -2
  50. package/dist/lib/patterns/aws/storage.js +1 -1
  51. package/dist/lib/resources/aws/audit/auditRole.js +4 -4
  52. package/dist/lib/resources/aws/audit/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/audit/index.js +6 -0
  54. package/dist/lib/resources/aws/backup/backupPlan.js +3 -2
  55. package/dist/lib/resources/aws/backup/backupVault.js +5 -3
  56. package/dist/lib/resources/aws/base/awsStack.d.ts +4 -2
  57. package/dist/lib/resources/aws/base/awsStack.js +8 -2
  58. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +14 -0
  59. package/dist/lib/resources/aws/cdn/cloudFront.js +52 -18
  60. package/dist/lib/resources/aws/compute/ec2.js +18 -22
  61. package/dist/lib/resources/aws/compute/ecs.d.ts +9 -8
  62. package/dist/lib/resources/aws/compute/ecs.js +53 -41
  63. package/dist/lib/resources/aws/compute/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/compute/index.js +2 -1
  65. package/dist/lib/resources/aws/compute/lambda.d.ts +12 -3
  66. package/dist/lib/resources/aws/compute/lambda.js +48 -36
  67. package/dist/lib/resources/aws/database/dynamodb.js +3 -13
  68. package/dist/lib/resources/aws/database/index.d.ts +8 -2
  69. package/dist/lib/resources/aws/database/index.js +19 -3
  70. package/dist/lib/resources/aws/database/rdsAurora.d.ts +2 -3
  71. package/dist/lib/resources/aws/database/rdsAurora.js +33 -69
  72. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +6 -6
  73. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +25 -29
  74. package/dist/lib/resources/aws/database/rdsDefaults.d.ts +11 -0
  75. package/dist/lib/resources/aws/database/rdsDefaults.js +15 -0
  76. package/dist/lib/resources/aws/database/rdsHelpers.d.ts +39 -0
  77. package/dist/lib/resources/aws/database/rdsHelpers.js +75 -0
  78. package/dist/lib/resources/aws/database/rdsInstance.d.ts +7 -8
  79. package/dist/lib/resources/aws/database/rdsInstance.js +40 -84
  80. package/dist/lib/resources/aws/database/rdsProxyOutput.d.ts +7 -0
  81. package/dist/lib/resources/aws/database/rdsProxyOutput.js +18 -0
  82. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +0 -2
  83. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +9 -45
  84. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -3
  85. package/dist/lib/resources/aws/iam/identityCenter/group.js +7 -82
  86. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -3
  87. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +9 -93
  88. package/dist/lib/resources/aws/iam/index.d.ts +0 -1
  89. package/dist/lib/resources/aws/iam/index.js +1 -2
  90. package/dist/lib/resources/aws/index.d.ts +0 -1
  91. package/dist/lib/resources/aws/index.js +1 -2
  92. package/dist/lib/resources/aws/logging/cloudTrail.js +13 -3
  93. package/dist/lib/resources/aws/logging/index.d.ts +2 -0
  94. package/dist/lib/resources/aws/logging/index.js +19 -0
  95. package/dist/lib/resources/aws/messaging/index.d.ts +3 -2
  96. package/dist/lib/resources/aws/messaging/index.js +4 -3
  97. package/dist/lib/resources/aws/messaging/sqs.js +14 -11
  98. package/dist/lib/resources/aws/messaging/utils.d.ts +1 -2
  99. package/dist/lib/resources/aws/messaging/utils.js +3 -4
  100. package/dist/lib/resources/aws/monitoring/index.d.ts +0 -1
  101. package/dist/lib/resources/aws/monitoring/index.js +4 -17
  102. package/dist/lib/resources/aws/networking/hostedZone.d.ts +28 -0
  103. package/dist/lib/resources/aws/networking/hostedZone.js +153 -0
  104. package/dist/lib/resources/aws/networking/index.d.ts +2 -0
  105. package/dist/lib/resources/aws/networking/index.js +3 -1
  106. package/dist/lib/resources/aws/networking/ipamPool.js +110 -31
  107. package/dist/lib/resources/aws/networking/securityGroup.d.ts +5 -0
  108. package/dist/lib/resources/aws/networking/securityGroup.js +14 -0
  109. package/dist/lib/resources/aws/networking/vpc.js +9 -4
  110. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +17 -0
  111. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +66 -0
  112. package/dist/lib/resources/aws/organisation/index.d.ts +1 -0
  113. package/dist/lib/resources/aws/organisation/index.js +4 -2
  114. package/dist/lib/resources/aws/secrets/index.d.ts +0 -1
  115. package/dist/lib/resources/aws/secrets/index.js +1 -2
  116. package/dist/lib/resources/aws/secrets/parameter.js +5 -3
  117. package/dist/lib/resources/aws/storage/ecr.d.ts +0 -1
  118. package/dist/lib/resources/aws/storage/ecr.js +5 -7
  119. package/dist/lib/resources/aws/storage/s3.d.ts +3 -3
  120. package/dist/lib/resources/aws/storage/s3.js +1 -1
  121. package/dist/lib/resources/aws/utilities/index.d.ts +5 -0
  122. package/dist/lib/resources/aws/utilities/index.js +22 -0
  123. package/dist/lib/utils/backupTierMapping.d.ts +11 -0
  124. package/dist/lib/utils/backupTierMapping.js +17 -0
  125. package/dist/lib/utils/capitaliseString.d.ts +6 -0
  126. package/dist/lib/utils/capitaliseString.js +10 -1
  127. package/dist/lib/utils/connections.d.ts +46 -0
  128. package/dist/lib/utils/connections.js +159 -0
  129. package/dist/lib/utils/connector.d.ts +183 -0
  130. package/dist/lib/utils/connector.js +117 -0
  131. package/dist/lib/utils/databaseTypes.d.ts +85 -0
  132. package/dist/lib/utils/databaseTypes.js +34 -0
  133. package/dist/lib/utils/env.d.ts +42 -0
  134. package/dist/lib/utils/env.js +128 -0
  135. package/dist/lib/utils/getConfig.d.ts +0 -2
  136. package/dist/lib/utils/getConfig.js +1 -4
  137. package/dist/lib/utils/index.d.ts +6 -0
  138. package/dist/lib/utils/index.js +7 -1
  139. package/dist/lib/utils/removalPolicy.d.ts +2 -0
  140. package/dist/lib/utils/removalPolicy.js +16 -0
  141. package/dist/lib/utils/resourceNaming.js +4 -7
  142. package/dist/lib/utils/standardTagsAspect.d.ts +4 -0
  143. package/dist/lib/utils/standardTagsAspect.js +8 -8
  144. package/dist/lib/utils/vpcUtils.d.ts +14 -0
  145. package/dist/lib/utils/vpcUtils.js +28 -0
  146. package/package.json +8 -8
@@ -1,2 +1,3 @@
1
+ export * from "./ec2";
1
2
  export * from "./ecs";
2
3
  export * from "./lambda";
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ec2"), exports);
17
18
  __exportStar(require("./ecs"), exports);
18
19
  __exportStar(require("./lambda"), exports);
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9jb21wdXRlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3Q0FBc0I7QUFDdEIsMkNBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZWNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sYW1iZGFcIjtcbiJdfQ==
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9jb21wdXRlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx3Q0FBc0I7QUFDdEIsd0NBQXNCO0FBQ3RCLDJDQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2VjMlwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZWNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sYW1iZGFcIjtcbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { SingletonFunction as singletonFunction, Function, type Code, type Runtime, Architecture, FunctionUrlAuthType, type FunctionUrlCorsOptions, type InvokeMode } from "aws-cdk-lib/aws-lambda";
1
+ import { SingletonFunction as singletonFunction, Function, Code, type Runtime, Architecture, FunctionUrlAuthType, type FunctionUrlCorsOptions, type InvokeMode } from "aws-cdk-lib/aws-lambda";
2
2
  import { type Bucket } from "aws-cdk-lib/aws-s3";
3
3
  import { PolicyStatement, type IRole } from "aws-cdk-lib/aws-iam";
4
4
  import { type IVpc } from "aws-cdk-lib/aws-ec2";
@@ -46,7 +46,6 @@ export declare class SingletonFunction extends singletonFunction {
46
46
  * The Lambda's execution role (auto-generated by CDK)
47
47
  */
48
48
  get executionRole(): IRole | undefined;
49
- private addPoliciesToRole;
50
49
  }
51
50
  export declare class LambdaFunction extends Function {
52
51
  private functionUrlValue?;
@@ -103,7 +102,6 @@ export declare class LambdaFunction extends Function {
103
102
  eventPattern?: EventPattern;
104
103
  description?: string;
105
104
  }): Rule;
106
- private addPoliciesToRole;
107
105
  /**
108
106
  * Add secrets support using AWS Parameters and Secrets Lambda Extension.
109
107
  *
@@ -133,6 +131,17 @@ export declare class LambdaFunction extends Function {
133
131
  * Stores base path and secret names as env vars for consumer code.
134
132
  */
135
133
  private addSsmSecretsSupport;
134
+ /**
135
+ * Add the Fjall secrets resolver layer and set AWS_LAMBDA_EXEC_WRAPPER.
136
+ *
137
+ * The resolver is a bash wrapper + Node.js script that runs before the Lambda
138
+ * runtime. It calls the Extension HTTP API (localhost:2773) to resolve SSM
139
+ * parameters and Secrets Manager secrets, exporting them as plain environment
140
+ * variables so handler code can simply read process.env.
141
+ *
142
+ * The layer is created once per stack and shared across all Lambda functions.
143
+ */
144
+ private addSecretsResolverLayer;
136
145
  /**
137
146
  * Derive SSM secrets path for Lambda functions.
138
147
  * Pattern: /<appName>/lambda/<functionName>
@@ -4,16 +4,22 @@ exports.LambdaFunction = exports.SingletonFunction = void 0;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
6
  const region_info_1 = require("aws-cdk-lib/region-info");
7
+ const path = require("path");
7
8
  const aws_lambda_event_sources_1 = require("aws-cdk-lib/aws-lambda-event-sources");
8
9
  const aws_s3_1 = require("aws-cdk-lib/aws-s3");
9
10
  const aws_iam_1 = require("aws-cdk-lib/aws-iam");
10
- const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
11
11
  const aws_events_1 = require("aws-cdk-lib/aws-events");
12
12
  const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
13
13
  const aws_logs_1 = require("aws-cdk-lib/aws-logs");
14
14
  const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
15
15
  const uuid_1 = require("uuid");
16
- const vpc_1 = require("../networking/vpc");
16
+ const capitaliseString_1 = require("../../../utils/capitaliseString");
17
+ const vpcUtils_1 = require("../../../utils/vpcUtils");
18
+ function addPoliciesToRole(target, statements) {
19
+ for (const statement of statements) {
20
+ target.addToRolePolicy(statement);
21
+ }
22
+ }
17
23
  /**
18
24
  * AWS Parameters and Secrets Lambda Extension configuration.
19
25
  * @see https://docs.aws.amazon.com/systems-manager/latest/userguide/ps-integration-lambda-extensions.html
@@ -28,7 +34,7 @@ class SingletonFunction extends aws_lambda_1.SingletonFunction {
28
34
  constructor(scope, id, props) {
29
35
  super(scope, id, {
30
36
  ...props,
31
- uuid: (0, uuid_1.v4)(),
37
+ uuid: props.uuid ?? (0, uuid_1.v4)(),
32
38
  timeout: aws_cdk_lib_1.Duration.seconds(300),
33
39
  description: props.lambdaDescription || `${id} singleton lambda`,
34
40
  runtime: props.runtime,
@@ -36,7 +42,7 @@ class SingletonFunction extends aws_lambda_1.SingletonFunction {
36
42
  ? aws_cdk_lib_1.Size.mebibytes(props.ephemeralStorageSize)
37
43
  : undefined
38
44
  });
39
- this.addPoliciesToRole(props.inlinePolicy);
45
+ addPoliciesToRole(this, props.inlinePolicy);
40
46
  }
41
47
  /**
42
48
  * The Lambda's execution role (auto-generated by CDK)
@@ -44,27 +50,13 @@ class SingletonFunction extends aws_lambda_1.SingletonFunction {
44
50
  get executionRole() {
45
51
  return this.role;
46
52
  }
47
- addPoliciesToRole(statements) {
48
- for (const statement of statements) {
49
- this.addToRolePolicy(statement);
50
- }
51
- }
52
53
  }
53
54
  exports.SingletonFunction = SingletonFunction;
54
55
  class LambdaFunction extends aws_lambda_1.Function {
55
56
  constructor(scope, id, props) {
56
- // Explicitly set subnet selection to match VPC endpoint placement
57
- // - With NAT: PRIVATE_WITH_EGRESS (can access internet via NAT)
58
- // - Without NAT: PRIVATE_ISOLATED (can access VPC endpoints only, no internet)
59
- let vpcSubnets;
60
- if (props.vpc) {
61
- const hasNatGateways = props.vpc instanceof vpc_1.Vpc ? props.vpc.hasNatGateways : true;
62
- vpcSubnets = {
63
- subnetType: hasNatGateways
64
- ? aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
65
- : aws_ec2_1.SubnetType.PRIVATE_ISOLATED
66
- };
67
- }
57
+ const vpcSubnets = props.vpc
58
+ ? { subnetType: (0, vpcUtils_1.resolvePrivateSubnetType)(props.vpc) }
59
+ : undefined;
68
60
  super(scope, id, {
69
61
  ...props,
70
62
  vpcSubnets,
@@ -79,8 +71,10 @@ class LambdaFunction extends aws_lambda_1.Function {
79
71
  environment: props.environment,
80
72
  logRetention: aws_logs_1.RetentionDays.ONE_WEEK
81
73
  });
82
- this.addPoliciesToRole(props.inlinePolicy);
74
+ addPoliciesToRole(this, props.inlinePolicy);
83
75
  this.addSecretsSupport(props.secrets, props.ssmSecretsPath, props.secretsImport, props.appName, props.functionName, props.architecture);
76
+ // Sanitise id for CloudFormation output keys (must be alphanumeric)
77
+ const outputName = (0, capitaliseString_1.toPascalCase)(id);
84
78
  if (props.enableFunctionUrl) {
85
79
  const functionUrl = this.addFunctionUrl({
86
80
  authType: props.functionUrlAuthType || aws_lambda_1.FunctionUrlAuthType.AWS_IAM,
@@ -88,14 +82,14 @@ class LambdaFunction extends aws_lambda_1.Function {
88
82
  invokeMode: props.functionUrlInvokeMode
89
83
  });
90
84
  this.functionUrlValue = functionUrl.url;
91
- new aws_cdk_lib_1.CfnOutput(this, `${id}FunctionUrl`, {
92
- key: `${id}FunctionUrl`,
85
+ new aws_cdk_lib_1.CfnOutput(this, `${outputName}FunctionUrl`, {
86
+ key: `${outputName}FunctionUrl`,
93
87
  value: functionUrl.url,
94
88
  description: `${id} Function URL`
95
89
  });
96
90
  }
97
- new aws_cdk_lib_1.CfnOutput(this, `${id}FunctionArn`, {
98
- key: `${id}FunctionArn`,
91
+ new aws_cdk_lib_1.CfnOutput(this, `${outputName}FunctionArn`, {
92
+ key: `${outputName}FunctionArn`,
99
93
  value: this.functionArn,
100
94
  description: `${id} Function ARN`
101
95
  });
@@ -205,11 +199,6 @@ class LambdaFunction extends aws_lambda_1.Function {
205
199
  rule.addTarget(new aws_events_targets_1.LambdaFunction(this));
206
200
  return rule;
207
201
  }
208
- addPoliciesToRole(statements) {
209
- for (const statement of statements) {
210
- this.addToRolePolicy(statement);
211
- }
212
- }
213
202
  /**
214
203
  * Add secrets support using AWS Parameters and Secrets Lambda Extension.
215
204
  *
@@ -222,16 +211,16 @@ class LambdaFunction extends aws_lambda_1.Function {
222
211
  */
223
212
  addSecretsSupport(secrets, ssmSecretsPath, secretsImport, appName, functionName, architecture) {
224
213
  const hasSecretsManager = secretsImport && Object.keys(secretsImport).length > 0;
225
- const hasSsmSecrets = (secrets?.length ?? 0) > 0;
226
- if (!hasSecretsManager && !hasSsmSecrets)
214
+ if (!hasSecretsManager && !(secrets && secrets.length > 0))
227
215
  return;
228
216
  this.addSecretsExtensionLayer(architecture);
229
217
  if (hasSecretsManager) {
230
218
  this.addSecretsManagerSupport(secretsImport);
231
219
  }
232
- if (hasSsmSecrets) {
220
+ if (secrets && secrets.length > 0) {
233
221
  this.addSsmSecretsSupport(secrets, ssmSecretsPath, appName, functionName);
234
222
  }
223
+ this.addSecretsResolverLayer();
235
224
  }
236
225
  /**
237
226
  * Add the AWS Parameters and Secrets Lambda Extension layer.
@@ -281,7 +270,7 @@ class LambdaFunction extends aws_lambda_1.Function {
281
270
  const basePath = this.deriveSsmSecretsPath(ssmSecretsPath, appName, functionName);
282
271
  this.addEnvironment("SSM_SECRETS_PATH", basePath);
283
272
  this.addEnvironment("SSM_SECRET_NAMES", secrets.join(","));
284
- const scopedPath = appName ? `/${appName}/*` : `${basePath}/*`;
273
+ const scopedPath = `${basePath}/*`;
285
274
  this.addToRolePolicy(new aws_iam_1.PolicyStatement({
286
275
  effect: aws_iam_1.Effect.ALLOW,
287
276
  actions: ["ssm:GetParameter", "ssm:GetParameters"],
@@ -300,6 +289,29 @@ class LambdaFunction extends aws_lambda_1.Function {
300
289
  }
301
290
  }));
302
291
  }
292
+ /**
293
+ * Add the Fjall secrets resolver layer and set AWS_LAMBDA_EXEC_WRAPPER.
294
+ *
295
+ * The resolver is a bash wrapper + Node.js script that runs before the Lambda
296
+ * runtime. It calls the Extension HTTP API (localhost:2773) to resolve SSM
297
+ * parameters and Secrets Manager secrets, exporting them as plain environment
298
+ * variables so handler code can simply read process.env.
299
+ *
300
+ * The layer is created once per stack and shared across all Lambda functions.
301
+ */
302
+ addSecretsResolverLayer() {
303
+ const stack = aws_cdk_lib_1.Stack.of(this);
304
+ const layerId = "FjallSecretsResolverLayer";
305
+ let resolverLayer = stack.node.tryFindChild(layerId);
306
+ if (!resolverLayer) {
307
+ resolverLayer = new aws_lambda_1.LayerVersion(stack, layerId, {
308
+ code: aws_lambda_1.Code.fromAsset(path.join(__dirname, "..", "..", "..", "layers", "secrets-resolver")),
309
+ description: "Fjall secrets resolver — resolves SSM and SM secrets before handler"
310
+ });
311
+ }
312
+ this.addLayers(resolverLayer);
313
+ this.addEnvironment("AWS_LAMBDA_EXEC_WRAPPER", "/opt/bin/resolve-secrets");
314
+ }
303
315
  /**
304
316
  * Derive SSM secrets path for Lambda functions.
305
317
  * Pattern: /<appName>/lambda/<functionName>
@@ -317,4 +329,4 @@ class LambdaFunction extends aws_lambda_1.Function {
317
329
  }
318
330
  }
319
331
  exports.LambdaFunction = LambdaFunction;
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQStEO0FBQy9ELHVEQVdnQztBQUNoQyx5REFBbUQ7QUFDbkQsbUZBSzhDO0FBQzlDLCtDQUE0RDtBQUM1RCxpREFBMEU7QUFDMUUsaURBQTREO0FBQzVELHVEQUEyRTtBQUMzRSx1RUFBZ0Y7QUFDaEYsbURBQXFEO0FBQ3JELHVFQUF3RDtBQUl4RCwrQkFBa0M7QUFHbEMsMkNBQXdDO0FBRXhDOzs7R0FHRztBQUNILE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsMEZBQTBGO0lBQzFGLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLG1GQUFtRjtJQUNuRixpQkFBaUIsRUFBRSxJQUFJO0NBQ2YsQ0FBQztBQXlDWCxNQUFhLGlCQUFrQixTQUFRLDhCQUFpQjtJQUN0RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsSUFBSSxFQUFFLElBQUEsU0FBSSxHQUFFO1lBQ1osT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxtQkFBbUI7WUFDaEUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7Z0JBQzlDLENBQUMsQ0FBQyxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxTQUFTO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lB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QUFVLEVBQUU7YUFDaEU7U0FDRixDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLENBQ2xCLElBQUkseUJBQWUsQ0FBQztZQUNsQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUN4QixTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDaEIsVUFBVSxFQUFFO2dCQUNWLFlBQVksRUFBRTtvQkFDWixnQkFBZ0IsRUFBRSxPQUFPLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCO2lCQUMvRDthQUNGO1NBQ0YsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CLENBQzFCLFlBQXFCLEVBQ3JCLE9BQWdCLEVBQ2hCLFlBQXFCO1FBRXJCLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUNiLG1FQUFtRTtnQkFDakUsOENBQThDO2dCQUM5QyxnRkFBZ0YsQ0FDbkYsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksT0FBTyxXQUFXLFlBQVksRUFBRSxDQUFDO0lBQzlDLENBQUM7Q0FDRjtBQTFaRCx3Q0EwWkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjaywgU2l6ZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgU2luZ2xldG9uRnVuY3Rpb24gYXMgc2luZ2xldG9uRnVuY3Rpb24sXG4gIEZ1bmN0aW9uLFxuICB0eXBlIENvZGUsXG4gIHR5cGUgUnVudGltZSxcbiAgQXJjaGl0ZWN0dXJlLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICB0eXBlIEZ1bmN0aW9uVXJsQ29yc09wdGlvbnMsXG4gIHR5cGUgSW52b2tlTW9kZSxcbiAgU3RhcnRpbmdQb3NpdGlvbixcbiAgTGF5ZXJWZXJzaW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBGYWN0TmFtZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9yZWdpb24taW5mb1wiO1xuaW1wb3J0IHtcbiAgU3FzRXZlbnRTb3VyY2UsXG4gIER5bmFtb0V2ZW50U291cmNlLFxuICBTM0V2ZW50U291cmNlLFxuICB0eXBlIFMzRXZlbnRTb3VyY2VQcm9wc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ldmVudC1zb3VyY2VzXCI7XG5pbXBvcnQgeyB0eXBlIEJ1Y2tldCwgRXZlbnRUeXBlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCB0eXBlIElSb2xlLCBFZmZlY3QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgdHlwZSBJVnBjLCBTdWJuZXRUeXBlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IFJ1bGUsIFNjaGVkdWxlLCB0eXBlIEV2ZW50UGF0dGVybiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiBhcyBMYW1iZGFUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIElRdWV1ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3FzXCI7XG5pbXBvcnQgeyB0eXBlIElUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgdHlwZSBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4uL25ldHdvcmtpbmcvdnBjXCI7XG5cbi8qKlxuICogQVdTIFBhcmFtZXRlcnMgYW5kIFNlY3JldHMgTGFtYmRhIEV4dGVuc2lvbiBjb25maWd1cmF0aW9uLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc3lzdGVtcy1tYW5hZ2VyL2xhdGVzdC91c2VyZ3VpZGUvcHMtaW50ZWdyYXRpb24tbGFtYmRhLWV4dGVuc2lvbnMuaHRtbFxuICovXG5jb25zdCBTRUNSRVRTX0VYVEVOU0lPTiA9IHtcbiAgLyoqIEV4dGVuc2lvbiB2ZXJzaW9uIGZvciBSZWdpb25JbmZvIGxvb2t1cCAobWF0Y2hlcyBQYXJhbXNBbmRTZWNyZXRzVmVyc2lvbnMuVjFfMF8xMDMpICovXG4gIFZFUlNJT046IFwiMS4wLjEwM1wiLFxuICAvKiogQ2FjaGUgVFRMIGluIHNlY29uZHMgLSA2MHMgc3VwcG9ydHMgc2VjcmV0IHJvdGF0aW9uIHdoaWxlIHJlZHVjaW5nIEFQSSBjYWxscyAqL1xuICBDQUNIRV9UVExfU0VDT05EUzogXCI2MFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUZ1bmN0aW9uUHJvcHMge1xuICBjb2RlOiBDb2RlO1xuICBoYW5kbGVyOiBzdHJpbmc7XG4gIGxhbWJkYURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJ1bnRpbWU6IFJ1bnRpbWU7XG4gIC8qKiBMYW1iZGEgQ1BVIGFyY2hpdGVjdHVyZS4gRGVmYXVsdDogeDg2XzY0ICovXG4gIGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcbiAgdnBjPzogSVZwYztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgLyoqIEVwaGVtZXJhbCBzdG9yYWdlIHNpemUgaW4gTWlCICovXG4gIGVwaGVtZXJhbFN0b3JhZ2VTaXplPzogbnVtYmVyO1xuICBpbmxpbmVQb2xpY3k6IFBvbGljeVN0YXRlbWVudFtdO1xuXG4gIGVuYWJsZUZ1bmN0aW9uVXJsPzogYm9vbGVhbjtcbiAgZnVuY3Rpb25VcmxBdXRoVHlwZT86IEZ1bmN0aW9uVXJsQXV0aFR5cGU7XG4gIGZ1bmN0aW9uVXJsQ29ycz86IEZ1bmN0aW9uVXJsQ29yc09wdGlvbnM7XG4gIC8qKiBJbnZva2UgbW9kZSBmb3IgRnVuY3Rpb24gVVJMLiBVc2UgUkVTUE9OU0VfU1RSRUFNIGZvciBMYW1iZGEgc3RyZWFtaW5nLiAqL1xuICBmdW5jdGlvblVybEludm9rZU1vZGU/OiBJbnZva2VNb2RlO1xuXG4gIGVudmlyb25tZW50PzogS2V5VmFsdWU7XG5cbiAgdGFncz86IEtleVZhbHVlO1xuXG4gIHNjaGVkdWxlRXhwcmVzc2lvbj86IHN0cmluZztcblxuICBzZWNyZXRzPzogc3RyaW5nW107XG4gIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nO1xuICBzZWNyZXRzSW1wb3J0PzogUmVjb3JkPHN0cmluZywgU2VjcmV0SW1wb3J0PjtcbiAgYXBwTmFtZT86IHN0cmluZztcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZXRvbkZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBMYW1iZGFGdW5jdGlvblByb3BzIHtcbiAgdXVpZD86IHN0cmluZztcbiAgZXBoZW1lcmFsU3RvcmFnZVNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTaW5nbGV0b25GdW5jdGlvbiBleHRlbmRzIHNpbmdsZXRvbkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNpbmdsZXRvbkZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgdXVpZDogdXVpZCgpLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmxhbWJkYURlc2NyaXB0aW9uIHx8IGAke2lkfSBzaW5nbGV0b24gbGFtYmRhYCxcbiAgICAgIHJ1bnRpbWU6IHByb3BzLnJ1bnRpbWUsXG4gICAgICBlcGhlbWVyYWxTdG9yYWdlU2l6ZTogcHJvcHMuZXBoZW1lcmFsU3RvcmFnZVNpemVcbiAgICAgICAgPyBTaXplLm1lYmlieXRlcyhwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkUG9saWNpZXNUb1JvbGUocHJvcHMuaW5saW5lUG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhJ3MgZXhlY3V0aW9uIHJvbGUgKGF1dG8tZ2VuZXJhdGVkIGJ5IENESylcbiAgICovXG4gIHB1YmxpYyBnZXQgZXhlY3V0aW9uUm9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUG9saWNpZXNUb1JvbGUoc3RhdGVtZW50czogUG9saWN5U3RhdGVtZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb24gZXh0ZW5kcyBGdW5jdGlvbiB7XG4gIHByaXZhdGUgZnVuY3Rpb25VcmxWYWx1ZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTGFtYmRhRnVuY3Rpb25Qcm9wcykge1xuICAgIC8vIEV4cGxpY2l0bHkgc2V0IHN1Ym5ldCBzZWxlY3Rpb24gdG8gbWF0Y2ggVlBDIGVuZHBvaW50IHBsYWNlbWVudFxuICAgIC8vIC0gV2l0aCBOQVQ6IFBSSVZBVEVfV0lUSF9FR1JFU1MgKGNhbiBhY2Nlc3MgaW50ZXJuZXQgdmlhIE5BVClcbiAgICAvLyAtIFdpdGhvdXQgTkFUOiBQUklWQVRFX0lTT0xBVEVEIChjYW4gYWNjZXNzIFZQQyBlbmRwb2ludHMgb25seSwgbm8gaW50ZXJuZXQpXG4gICAgbGV0IHZwY1N1Ym5ldHM7XG4gICAgaWYgKHByb3BzLnZwYykge1xuICAgICAgY29uc3QgaGFzTmF0R2F0ZXdheXMgPVxuICAgICAgICBwcm9wcy52cGMgaW5zdGFuY2VvZiBWcGMgPyBwcm9wcy52cGMuaGFzTmF0R2F0ZXdheXMgOiB0cnVlO1xuICAgICAgdnBjU3VibmV0cyA9IHtcbiAgICAgICAgc3VibmV0VHlwZTogaGFzTmF0R2F0ZXdheXNcbiAgICAgICAgICA/IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICAgIDogU3VibmV0VHlwZS5QUklWQVRFX0lTT0xBVEVEXG4gICAgICB9O1xuICAgIH1cblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB2cGNTdWJuZXRzLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dFxuICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMocHJvcHMudGltZW91dClcbiAgICAgICAgOiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplIHx8IDEyOCxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZVxuICAgICAgICA/IFNpemUubWViaWJ5dGVzKHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5sYW1iZGFEZXNjcmlwdGlvbiB8fCBgJHtpZH0gTGFtYmRhYCxcbiAgICAgIGVudmlyb25tZW50OiBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfV0VFS1xuICAgIH0pO1xuXG4gICAgdGhpcy5hZGRQb2xpY2llc1RvUm9sZShwcm9wcy5pbmxpbmVQb2xpY3kpO1xuXG4gICAgdGhpcy5hZGRTZWNyZXRzU3VwcG9ydChcbiAgICAgIHByb3BzLnNlY3JldHMsXG4gICAgICBwcm9wcy5zc21TZWNyZXRzUGF0aCxcbiAgICAgIHByb3BzLnNlY3JldHNJbXBvcnQsXG4gICAgICBwcm9wcy5hcHBOYW1lLFxuICAgICAgcHJvcHMuZnVuY3Rpb25OYW1lLFxuICAgICAgcHJvcHMuYXJjaGl0ZWN0dXJlXG4gICAgKTtcblxuICAgIGlmIChwcm9wcy5lbmFibGVGdW5jdGlvblVybCkge1xuICAgICAgY29uc3QgZnVuY3Rpb25VcmwgPSB0aGlzLmFkZEZ1bmN0aW9uVXJsKHtcbiAgICAgICAgYXV0aFR5cGU6IHByb3BzLmZ1bmN0aW9uVXJsQXV0aFR5cGUgfHwgRnVuY3Rpb25VcmxBdXRoVHlwZS5BV1NfSUFNLFxuICAgICAgICBjb3JzOiBwcm9wcy5mdW5jdGlvblVybENvcnMsXG4gICAgICAgIGludm9rZU1vZGU6IHByb3BzLmZ1bmN0aW9uVXJsSW52b2tlTW9kZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZnVuY3Rpb25VcmxWYWx1ZSA9IGZ1bmN0aW9uVXJsLnVybDtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1GdW5jdGlvblVybGAsIHtcbiAgICAgICAga2V5OiBgJHtpZH1GdW5jdGlvblVybGAsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvblVybC51cmwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtpZH0gRnVuY3Rpb24gVVJMYFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1GdW5jdGlvbkFybmAsIHtcbiAgICAgIGtleTogYCR7aWR9RnVuY3Rpb25Bcm5gLFxuICAgICAgdmFsdWU6IHRoaXMuZnVuY3Rpb25Bcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYCR7aWR9IEZ1bmN0aW9uIEFSTmBcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5zY2hlZHVsZUV4cHJlc3Npb24pIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSBuZXcgUnVsZSh0aGlzLCBgJHtpZH1TY2hlZHVsZVJ1bGVgLCB7XG4gICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5leHByZXNzaW9uKHByb3BzLnNjaGVkdWxlRXhwcmVzc2lvbilcbiAgICAgIH0pO1xuICAgICAgcnVsZS5hZGRUYXJnZXQobmV3IExhbWJkYVRhcmdldCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEncyBleGVjdXRpb24gcm9sZSAoYXV0by1nZW5lcmF0ZWQgYnkgQ0RLKVxuICAgKi9cbiAgcHVibGljIGdldCBleGVjdXRpb25Sb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgTGFtYmRhIGZ1bmN0aW9uIFVSTCBpZiBlbmFibGVkLlxuICAgKi9cbiAgcHVibGljIGdldEZ1bmN0aW9uVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25VcmxWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gU1FTIHF1ZXVlIGFzIGFuIGV2ZW50IHNvdXJjZSBmb3IgdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBMYW1iZGEgd2hlbiBtZXNzYWdlcyBhcnJpdmUgaW4gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGFkZFNxc0V2ZW50U291cmNlKFxuICAgIHF1ZXVlOiBJUXVldWUsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgICAgIG1heEJhdGNoaW5nV2luZG93PzogbnVtYmVyO1xuICAgICAgcmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXM/OiBib29sZWFuO1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgU3FzRXZlbnRTb3VyY2UocXVldWUsIHtcbiAgICAgIGJhdGNoU2l6ZTogb3B0aW9ucz8uYmF0Y2hTaXplID8/IDEwLFxuICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c6IG9wdGlvbnM/Lm1heEJhdGNoaW5nV2luZG93XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhvcHRpb25zLm1heEJhdGNoaW5nV2luZG93KVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzOiBvcHRpb25zPy5yZXBvcnRCYXRjaEl0ZW1GYWlsdXJlcyA/PyB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudFNvdXJjZShldmVudFNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgRHluYW1vREIgdGFibGUgc3RyZWFtIGFzIGFuIGV2ZW50IHNvdXJjZSBmb3IgdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBMYW1iZGEgd2hlbiBpdGVtcyBhcmUgbW9kaWZpZWQgaW4gdGhlIHRhYmxlLlxuICAgKiBSZXF1aXJlcyBEeW5hbW9EQiBTdHJlYW1zIHRvIGJlIGVuYWJsZWQgb24gdGhlIHRhYmxlLlxuICAgKi9cbiAgcHVibGljIGFkZER5bmFtb0RiRXZlbnRTb3VyY2UoXG4gICAgdGFibGU6IElUYWJsZSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAgICAgc3RhcnRpbmdQb3NpdGlvbj86IFwiVFJJTV9IT1JJWk9OXCIgfCBcIkxBVEVTVFwiO1xuICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c/OiBudW1iZXI7XG4gICAgICByZXRyeUF0dGVtcHRzPzogbnVtYmVyO1xuICAgICAgcGFyYWxsZWxpemF0aW9uRmFjdG9yPzogbnVtYmVyO1xuICAgICAgcmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXM/OiBib29sZWFuO1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnRpbmdQb3NpdGlvbiA9XG4gICAgICBvcHRpb25zPy5zdGFydGluZ1Bvc2l0aW9uID09PSBcIlRSSU1fSE9SSVpPTlwiXG4gICAgICAgID8gU3RhcnRpbmdQb3NpdGlvbi5UUklNX0hPUklaT05cbiAgICAgICAgOiBTdGFydGluZ1Bvc2l0aW9uLkxBVEVTVDtcblxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IER5bmFtb0V2ZW50U291cmNlKHRhYmxlLCB7XG4gICAgICBzdGFydGluZ1Bvc2l0aW9uLFxuICAgICAgYmF0Y2hTaXplOiBvcHRpb25zPy5iYXRjaFNpemUgPz8gMTAwLFxuICAgICAgbWF4QmF0Y2hpbmdXaW5kb3c6IG9wdGlvbnM/Lm1heEJhdGNoaW5nV2luZG93XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhvcHRpb25zLm1heEJhdGNoaW5nV2luZG93KVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJldHJ5QXR0ZW1wdHM6IG9wdGlvbnM/LnJldHJ5QXR0ZW1wdHMsXG4gICAgICBwYXJhbGxlbGl6YXRpb25GYWN0b3I6IG9wdGlvbnM/LnBhcmFsbGVsaXphdGlvbkZhY3RvcixcbiAgICAgIHJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzOiBvcHRpb25zPy5yZXBvcnRCYXRjaEl0ZW1GYWlsdXJlcyA/PyB0cnVlXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudFNvdXJjZShldmVudFNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIFMzIGJ1Y2tldCBhcyBhbiBldmVudCBzb3VyY2UgZm9yIHRoaXMgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgTGFtYmRhIHdoZW4gb2JqZWN0cyBhcmUgY3JlYXRlZCwgbW9kaWZpZWQsIG9yIGRlbGV0ZWQuXG4gICAqIFVzZWZ1bCBmb3IgSVNSIGNhY2hlIGludmFsaWRhdGlvbiBhbmQgZmlsZSBwcm9jZXNzaW5nIHdvcmtmbG93cy5cbiAgICovXG4gIHB1YmxpYyBhZGRTM0V2ZW50U291cmNlKFxuICAgIGJ1Y2tldDogQnVja2V0LFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBldmVudHM/OiBBcnJheTxcbiAgICAgICAgfCBcIk9CSkVDVF9DUkVBVEVEXCJcbiAgICAgICAgfCBcIk9CSkVDVF9SRU1PVkVEXCJcbiAgICAgICAgfCBcIk9CSkVDVF9DUkVBVEVEX1BVVFwiXG4gICAgICAgIHwgXCJPQkpFQ1RfQ1JFQVRFRF9QT1NUXCJcbiAgICAgICAgfCBcIk9CSkVDVF9DUkVBVEVEX0NPUFlcIlxuICAgICAgICB8IFwiT0JKRUNUX1JFTU9WRURfREVMRVRFXCJcbiAgICAgID47XG4gICAgICBmaWx0ZXJzPzogQXJyYXk8eyBwcmVmaXg/OiBzdHJpbmc7IHN1ZmZpeD86IHN0cmluZyB9PjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50VHlwZXMgPSAob3B0aW9ucz8uZXZlbnRzID8/IFtcIk9CSkVDVF9DUkVBVEVEXCJdKS5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfQ1JFQVRFRFwiOlxuICAgICAgICAgIHJldHVybiBFdmVudFR5cGUuT0JKRUNUX0NSRUFURUQ7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfUkVNT1ZFRFwiOlxuICAgICAgICAgIHJldHVybiBFdmVudFR5cGUuT0JKRUNUX1JFTU9WRUQ7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfQ1JFQVRFRF9QVVRcIjpcbiAgICAgICAgICByZXR1cm4gRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVEX1BVVDtcbiAgICAgICAgY2FzZSBcIk9CSkVDVF9DUkVBVEVEX1BPU1RcIjpcbiAgICAgICAgICByZXR1cm4gRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVEX1BPU1Q7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfQ1JFQVRFRF9DT1BZXCI6XG4gICAgICAgICAgcmV0dXJuIEV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRF9DT1BZO1xuICAgICAgICBjYXNlIFwiT0JKRUNUX1JFTU9WRURfREVMRVRFXCI6XG4gICAgICAgICAgcmV0dXJuIEV2ZW50VHlwZS5PQkpFQ1RfUkVNT1ZFRF9ERUxFVEU7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBldmVudDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUzMgZXZlbnQgdHlwZTogJHtfZXhoYXVzdGl2ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgczNFdmVudFNvdXJjZVByb3BzOiBTM0V2ZW50U291cmNlUHJvcHMgPSB7XG4gICAgICBldmVudHM6IGV2ZW50VHlwZXMsXG4gICAgICBmaWx0ZXJzOiBvcHRpb25zPy5maWx0ZXJzXG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IFMzRXZlbnRTb3VyY2UoYnVja2V0LCBzM0V2ZW50U291cmNlUHJvcHMpO1xuICAgIHRoaXMuYWRkRXZlbnRTb3VyY2UoZXZlbnRTb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBFdmVudEJyaWRnZSBydWxlIGFzIGFuIGV2ZW50IHNvdXJjZSBmb3IgdGhpcyBMYW1iZGEgZnVuY3Rpb24uXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBMYW1iZGEgd2hlbiBldmVudHMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gYXJlIHB1Ymxpc2hlZC5cbiAgICogVXNlZnVsIGZvciBzY2hlZHVsZWQgam9icywgY3Jvc3Mtc2VydmljZSBldmVudCBoYW5kbGluZywgYW5kIGN1c3RvbSBldmVudCBwYXR0ZXJucy5cbiAgICovXG4gIHB1YmxpYyBhZGRFdmVudEJyaWRnZUV2ZW50U291cmNlKFxuICAgIHJ1bGVJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHNjaGVkdWxlPzogc3RyaW5nO1xuICAgICAgZXZlbnRQYXR0ZXJuPzogRXZlbnRQYXR0ZXJuO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgfVxuICApOiBSdWxlIHtcbiAgICBpZiAoIW9wdGlvbnMuc2NoZWR1bGUgJiYgIW9wdGlvbnMuZXZlbnRQYXR0ZXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRXZlbnRCcmlkZ2UgcnVsZSByZXF1aXJlcyBlaXRoZXIgc2NoZWR1bGUgb3IgZXZlbnRQYXR0ZXJuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcnVsZSA9IG5ldyBSdWxlKHRoaXMsIHJ1bGVJZCwge1xuICAgICAgc2NoZWR1bGU6IG9wdGlvbnMuc2NoZWR1bGVcbiAgICAgICAgPyBTY2hlZHVsZS5leHByZXNzaW9uKG9wdGlvbnMuc2NoZWR1bGUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnRQYXR0ZXJuOiBvcHRpb25zLmV2ZW50UGF0dGVybixcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uXG4gICAgfSk7XG5cbiAgICBydWxlLmFkZFRhcmdldChuZXcgTGFtYmRhVGFyZ2V0KHRoaXMpKTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUG9saWNpZXNUb1JvbGUoc3RhdGVtZW50czogUG9saWN5U3RhdGVtZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgc2VjcmV0cyBzdXBwb3J0IHVzaW5nIEFXUyBQYXJhbWV0ZXJzIGFuZCBTZWNyZXRzIExhbWJkYSBFeHRlbnNpb24uXG4gICAqXG4gICAqIFRoZSBleHRlbnNpb24gZmV0Y2hlcyBzZWNyZXRzIGF0IHJ1bnRpbWUgZnJvbTpcbiAgICogLSBTU00gUGFyYW1ldGVyIFN0b3JlOiB2aWEgaHR0cDovL2xvY2FsaG9zdDoyNzczL3N5c3RlbXNtYW5hZ2VyL3BhcmFtZXRlcnMvZ2V0XG4gICAqIC0gU2VjcmV0cyBNYW5hZ2VyOiB2aWEgaHR0cDovL2xvY2FsaG9zdDoyNzczL3NlY3JldHNtYW5hZ2VyL2dldFxuICAgKlxuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSBpbnNlY3VyZSB1bnNhZmVVbndyYXAoKSBwYXR0ZXJuIHdoaWNoIHJlc29sdmVkIHNlY3JldHMgYXRcbiAgICogZGVwbG95IHRpbWUgYW5kIGV4cG9zZWQgdGhlbSBpbiBMYW1iZGEgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYWRkU2VjcmV0c1N1cHBvcnQoXG4gICAgc2VjcmV0cz86IHN0cmluZ1tdLFxuICAgIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nLFxuICAgIHNlY3JldHNJbXBvcnQ/OiBSZWNvcmQ8c3RyaW5nLCBTZWNyZXRJbXBvcnQ+LFxuICAgIGFwcE5hbWU/OiBzdHJpbmcsXG4gICAgZnVuY3Rpb25OYW1lPzogc3RyaW5nLFxuICAgIGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoYXNTZWNyZXRzTWFuYWdlciA9XG4gICAgICBzZWNyZXRzSW1wb3J0ICYmIE9iamVjdC5rZXlzKHNlY3JldHNJbXBvcnQpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgaGFzU3NtU2VjcmV0cyA9IChzZWNyZXRzPy5sZW5ndGggPz8gMCkgPiAwO1xuXG4gICAgaWYgKCFoYXNTZWNyZXRzTWFuYWdlciAmJiAhaGFzU3NtU2VjcmV0cykgcmV0dXJuO1xuXG4gICAgdGhpcy5hZGRTZWNyZXRzRXh0ZW5zaW9uTGF5ZXIoYXJjaGl0ZWN0dXJlKTtcblxuICAgIGlmIChoYXNTZWNyZXRzTWFuYWdlcikge1xuICAgICAgdGhpcy5hZGRTZWNyZXRzTWFuYWdlclN1cHBvcnQoc2VjcmV0c0ltcG9ydCk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1NzbVNlY3JldHMpIHtcbiAgICAgIHRoaXMuYWRkU3NtU2VjcmV0c1N1cHBvcnQoXG4gICAgICAgIHNlY3JldHMhLFxuICAgICAgICBzc21TZWNyZXRzUGF0aCxcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgZnVuY3Rpb25OYW1lXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIEFXUyBQYXJhbWV0ZXJzIGFuZCBTZWNyZXRzIExhbWJkYSBFeHRlbnNpb24gbGF5ZXIuXG4gICAqIFVzZXMgQ0RLJ3MgcmVnaW9uYWxGYWN0KCkgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCBBUk4gYXQgZGVwbG95IHRpbWUsXG4gICAqIGhhbmRsaW5nIHRoZSBmYWN0IHRoYXQgQVdTIHB1Ymxpc2hlcyB0aGUgbGF5ZXIgZnJvbSBkaWZmZXJlbnQgYWNjb3VudHNcbiAgICogaW4gZGlmZmVyZW50IHJlZ2lvbnMuIFRoaXMgYXBwcm9hY2ggd29ya3Mgd2l0aCBDREsgdG9rZW5zLlxuICAgKiBDb25maWd1cmVzIGNhY2hlIFRUTCBmb3Igcm90YXRpb24gc3VwcG9ydC5cbiAgICovXG4gIHByaXZhdGUgYWRkU2VjcmV0c0V4dGVuc2lvbkxheWVyKGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZSk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG4gICAgY29uc3QgYXJjaFN0cmluZyA9XG4gICAgICBhcmNoaXRlY3R1cmUgPT09IEFyY2hpdGVjdHVyZS5BUk1fNjQgPyBcImFybTY0XCIgOiBcIng4Nl82NFwiO1xuXG4gICAgY29uc3QgZmFjdE5hbWUgPSBGYWN0TmFtZS5wYXJhbXNBbmRTZWNyZXRzTGFtYmRhTGF5ZXIoXG4gICAgICBTRUNSRVRTX0VYVEVOU0lPTi5WRVJTSU9OLFxuICAgICAgYXJjaFN0cmluZ1xuICAgICk7XG5cbiAgICBjb25zdCBsYXllckFybiA9IHN0YWNrLnJlZ2lvbmFsRmFjdChmYWN0TmFtZSk7XG5cbiAgICB0aGlzLmFkZExheWVycyhcbiAgICAgIExheWVyVmVyc2lvbi5mcm9tTGF5ZXJWZXJzaW9uQXJuKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHt0aGlzLm5vZGUuaWR9U2VjcmV0c0V4dGVuc2lvbmAsXG4gICAgICAgIGxheWVyQXJuXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoXG4gICAgICBcIlNFQ1JFVFNfTUFOQUdFUl9UVExcIixcbiAgICAgIFNFQ1JFVFNfRVhURU5TSU9OLkNBQ0hFX1RUTF9TRUNPTkRTXG4gICAgKTtcbiAgICB0aGlzLmFkZEVudmlyb25tZW50KFxuICAgICAgXCJTU01fUEFSQU1FVEVSX1NUT1JFX1RUTFwiLFxuICAgICAgU0VDUkVUU19FWFRFTlNJT04uQ0FDSEVfVFRMX1NFQ09ORFNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBTZWNyZXRzIE1hbmFnZXIgc3VwcG9ydCBmb3IgQ0RLLW1hbmFnZWQgc2VjcmV0cyAoZS5nLiwgZGF0YWJhc2UgY3JlZGVudGlhbHMpLlxuICAgKiBTdG9yZXMgQVJOICsgZmllbGQgYXMgZW52IHZhcnMgLSB0aGUgTGFtYmRhIEV4dGVuc2lvbiBmZXRjaGVzIGFjdHVhbCB2YWx1ZXMgYXQgcnVudGltZS5cbiAgICovXG4gIHByaXZhdGUgYWRkU2VjcmV0c01hbmFnZXJTdXBwb3J0KFxuICAgIHNlY3JldHNJbXBvcnQ6IFJlY29yZDxzdHJpbmcsIFNlY3JldEltcG9ydD5cbiAgKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzZWNyZXRJbXBvcnRdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHNJbXBvcnQpKSB7XG4gICAgICBjb25zdCBzZWNyZXQgPSBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5ub2RlLmlkfUltcG9ydGVkU2VjcmV0JHtrZXl9YCxcbiAgICAgICAgc2VjcmV0SW1wb3J0Lm5hbWVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoYCR7a2V5fV9TRUNSRVRfQVJOYCwgc2VjcmV0LnNlY3JldEFybik7XG4gICAgICBpZiAoc2VjcmV0SW1wb3J0LmZpZWxkKSB7XG4gICAgICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoYCR7a2V5fV9TRUNSRVRfRklFTERgLCBzZWNyZXRJbXBvcnQuZmllbGQpO1xuICAgICAgfVxuXG4gICAgICBzZWNyZXQuZ3JhbnRSZWFkKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXCJrbXM6RGVjcnlwdFwiLCBcImttczpEZXNjcmliZUtleVwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICBcImttczpWaWFTZXJ2aWNlXCI6IGBzZWNyZXRzbWFuYWdlci4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgU1NNIFBhcmFtZXRlciBTdG9yZSBzdXBwb3J0IGZvciB1c2VyLW1hbmFnZWQgc2VjcmV0cyAodmlhIGZqYWxsIHNlY3JldCBhZGQpLlxuICAgKiBTdG9yZXMgYmFzZSBwYXRoIGFuZCBzZWNyZXQgbmFtZXMgYXMgZW52IHZhcnMgZm9yIGNvbnN1bWVyIGNvZGUuXG4gICAqL1xuICBwcml2YXRlIGFkZFNzbVNlY3JldHNTdXBwb3J0KFxuICAgIHNlY3JldHM6IHN0cmluZ1tdLFxuICAgIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nLFxuICAgIGFwcE5hbWU/OiBzdHJpbmcsXG4gICAgZnVuY3Rpb25OYW1lPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gdGhpcy5kZXJpdmVTc21TZWNyZXRzUGF0aChcbiAgICAgIHNzbVNlY3JldHNQYXRoLFxuICAgICAgYXBwTmFtZSxcbiAgICAgIGZ1bmN0aW9uTmFtZVxuICAgICk7XG5cbiAgICB0aGlzLmFkZEVudmlyb25tZW50KFwiU1NNX1NFQ1JFVFNfUEFUSFwiLCBiYXNlUGF0aCk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudChcIlNTTV9TRUNSRVRfTkFNRVNcIiwgc2VjcmV0cy5qb2luKFwiLFwiKSk7XG5cbiAgICBjb25zdCBzY29wZWRQYXRoID0gYXBwTmFtZSA/IGAvJHthcHBOYW1lfS8qYCA6IGAke2Jhc2VQYXRofS8qYDtcbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1wic3NtOkdldFBhcmFtZXRlclwiLCBcInNzbTpHZXRQYXJhbWV0ZXJzXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBgYXJuOmF3czpzc206JHtTdGFjay5vZih0aGlzKS5yZWdpb259Oio6cGFyYW1ldGVyJHtzY29wZWRQYXRofWBcbiAgICAgICAgXVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgIFwia21zOlZpYVNlcnZpY2VcIjogYHNzbS4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgU1NNIHNlY3JldHMgcGF0aCBmb3IgTGFtYmRhIGZ1bmN0aW9ucy5cbiAgICogUGF0dGVybjogLzxhcHBOYW1lPi9sYW1iZGEvPGZ1bmN0aW9uTmFtZT5cbiAgICovXG4gIHByaXZhdGUgZGVyaXZlU3NtU2VjcmV0c1BhdGgoXG4gICAgZXhwbGljaXRQYXRoPzogc3RyaW5nLFxuICAgIGFwcE5hbWU/OiBzdHJpbmcsXG4gICAgZnVuY3Rpb25OYW1lPzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKGV4cGxpY2l0UGF0aCkge1xuICAgICAgcmV0dXJuIGV4cGxpY2l0UGF0aDtcbiAgICB9XG5cbiAgICBpZiAoIWFwcE5hbWUgfHwgIWZ1bmN0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkxhbWJkYSBmdW5jdGlvbiBoYXMgc2VjcmV0cyBkZWZpbmVkIGJ1dCBubyBzc21TZWNyZXRzUGF0aCBpcyBzZXQgXCIgK1xuICAgICAgICAgIFwiYW5kIGFwcE5hbWUvZnVuY3Rpb25OYW1lIGFyZSBub3QgYXZhaWxhYmxlLiBcIiArXG4gICAgICAgICAgXCJFaXRoZXIgc2V0IHNzbVNlY3JldHNQYXRoIGV4cGxpY2l0bHksIG9yIGVuc3VyZSBBcHAuZ2V0TmFtZSgpIHJldHVybnMgYSB2YWx1ZS5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYC8ke2FwcE5hbWV9L2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gO1xuICB9XG59XG4iXX0=
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQStEO0FBQy9ELHVEQVdnQztBQUNoQyx5REFBbUQ7QUFDbkQsNkJBQTZCO0FBQzdCLG1GQUs4QztBQUM5QywrQ0FBNEQ7QUFDNUQsaURBQTBFO0FBRTFFLHVEQUEyRTtBQUMzRSx1RUFBZ0Y7QUFDaEYsbURBQXFEO0FBQ3JELHVFQUF3RDtBQUl4RCwrQkFBa0M7QUFHbEMsc0VBQStEO0FBQy9ELHNEQUFtRTtBQUVuRSxTQUFTLGlCQUFpQixDQUN4QixNQUFpRSxFQUNqRSxVQUE2QjtJQUU3QixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLDBGQUEwRjtJQUMxRixPQUFPLEVBQUUsU0FBUztJQUNsQixtRkFBbUY7SUFDbkYsaUJBQWlCLEVBQUUsSUFBSTtDQUNmLENBQUM7QUF5Q1gsTUFBYSxpQkFBa0IsU0FBUSw4QkFBaUI7SUFDdEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE2QjtRQUNyRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEdBQUcsS0FBSztZQUNSLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUEsU0FBSSxHQUFFO1lBQzFCLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDOUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsbUJBQW1CO1lBQ2hFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixvQkFBb0IsRUFBRSxL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LE9BQU8sV0FBVyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0NBQ0Y7QUF4YUQsd0NBd2FDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgU3RhY2ssIFNpemUgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIFNpbmdsZXRvbkZ1bmN0aW9uIGFzIHNpbmdsZXRvbkZ1bmN0aW9uLFxuICBGdW5jdGlvbixcbiAgQ29kZSxcbiAgdHlwZSBSdW50aW1lLFxuICBBcmNoaXRlY3R1cmUsXG4gIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9ucyxcbiAgdHlwZSBJbnZva2VNb2RlLFxuICBTdGFydGluZ1Bvc2l0aW9uLFxuICBMYXllclZlcnNpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IEZhY3ROYW1lIH0gZnJvbSBcImF3cy1jZGstbGliL3JlZ2lvbi1pbmZvXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICBTcXNFdmVudFNvdXJjZSxcbiAgRHluYW1vRXZlbnRTb3VyY2UsXG4gIFMzRXZlbnRTb3VyY2UsXG4gIHR5cGUgUzNFdmVudFNvdXJjZVByb3BzXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXNcIjtcbmltcG9ydCB7IHR5cGUgQnVja2V0LCBFdmVudFR5cGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIHR5cGUgSVJvbGUsIEVmZmVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgUnVsZSwgU2NoZWR1bGUsIHR5cGUgRXZlbnRQYXR0ZXJuIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIGFzIExhbWJkYVRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCB7IFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgSVF1ZXVlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIjtcbmltcG9ydCB7IHR5cGUgSVRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgeyB0eXBlIEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFNlY3JldEltcG9ydCB9IGZyb20gXCIuLi9zZWNyZXRzXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvY2FwaXRhbGlzZVN0cmluZ1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVByaXZhdGVTdWJuZXRUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3ZwY1V0aWxzXCI7XG5cbmZ1bmN0aW9uIGFkZFBvbGljaWVzVG9Sb2xlKFxuICB0YXJnZXQ6IHsgYWRkVG9Sb2xlUG9saWN5OiAoc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQpID0+IHZvaWQgfSxcbiAgc3RhdGVtZW50czogUG9saWN5U3RhdGVtZW50W11cbikge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgdGFyZ2V0LmFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQpO1xuICB9XG59XG5cbi8qKlxuICogQVdTIFBhcmFtZXRlcnMgYW5kIFNlY3JldHMgTGFtYmRhIEV4dGVuc2lvbiBjb25maWd1cmF0aW9uLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc3lzdGVtcy1tYW5hZ2VyL2xhdGVzdC91c2VyZ3VpZGUvcHMtaW50ZWdyYXRpb24tbGFtYmRhLWV4dGVuc2lvbnMuaHRtbFxuICovXG5jb25zdCBTRUNSRVRTX0VYVEVOU0lPTiA9IHtcbiAgLyoqIEV4dGVuc2lvbiB2ZXJzaW9uIGZvciBSZWdpb25JbmZvIGxvb2t1cCAobWF0Y2hlcyBQYXJhbXNBbmRTZWNyZXRzVmVyc2lvbnMuVjFfMF8xMDMpICovXG4gIFZFUlNJT046IFwiMS4wLjEwM1wiLFxuICAvKiogQ2FjaGUgVFRMIGluIHNlY29uZHMgLSA2MHMgc3VwcG9ydHMgc2VjcmV0IHJvdGF0aW9uIHdoaWxlIHJlZHVjaW5nIEFQSSBjYWxscyAqL1xuICBDQUNIRV9UVExfU0VDT05EUzogXCI2MFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUZ1bmN0aW9uUHJvcHMge1xuICBjb2RlOiBDb2RlO1xuICBoYW5kbGVyOiBzdHJpbmc7XG4gIGxhbWJkYURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJ1bnRpbWU6IFJ1bnRpbWU7XG4gIC8qKiBMYW1iZGEgQ1BVIGFyY2hpdGVjdHVyZS4gRGVmYXVsdDogeDg2XzY0ICovXG4gIGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcbiAgdnBjPzogSVZwYztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgLyoqIEVwaGVtZXJhbCBzdG9yYWdlIHNpemUgaW4gTWlCICovXG4gIGVwaGVtZXJhbFN0b3JhZ2VTaXplPzogbnVtYmVyO1xuICBpbmxpbmVQb2xpY3k6IFBvbGljeVN0YXRlbWVudFtdO1xuXG4gIGVuYWJsZUZ1bmN0aW9uVXJsPzogYm9vbGVhbjtcbiAgZnVuY3Rpb25VcmxBdXRoVHlwZT86IEZ1bmN0aW9uVXJsQXV0aFR5cGU7XG4gIGZ1bmN0aW9uVXJsQ29ycz86IEZ1bmN0aW9uVXJsQ29yc09wdGlvbnM7XG4gIC8qKiBJbnZva2UgbW9kZSBmb3IgRnVuY3Rpb24gVVJMLiBVc2UgUkVTUE9OU0VfU1RSRUFNIGZvciBMYW1iZGEgc3RyZWFtaW5nLiAqL1xuICBmdW5jdGlvblVybEludm9rZU1vZGU/OiBJbnZva2VNb2RlO1xuXG4gIGVudmlyb25tZW50PzogS2V5VmFsdWU7XG5cbiAgdGFncz86IEtleVZhbHVlO1xuXG4gIHNjaGVkdWxlRXhwcmVzc2lvbj86IHN0cmluZztcblxuICBzZWNyZXRzPzogc3RyaW5nW107XG4gIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nO1xuICBzZWNyZXRzSW1wb3J0PzogUmVjb3JkPHN0cmluZywgU2VjcmV0SW1wb3J0PjtcbiAgYXBwTmFtZT86IHN0cmluZztcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZXRvbkZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBMYW1iZGFGdW5jdGlvblByb3BzIHtcbiAgdXVpZD86IHN0cmluZztcbiAgZXBoZW1lcmFsU3RvcmFnZVNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTaW5nbGV0b25GdW5jdGlvbiBleHRlbmRzIHNpbmdsZXRvbkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNpbmdsZXRvbkZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgdXVpZDogcHJvcHMudXVpZCA/PyB1dWlkKCksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMubGFtYmRhRGVzY3JpcHRpb24gfHwgYCR7aWR9IHNpbmdsZXRvbiBsYW1iZGFgLFxuICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZVxuICAgICAgICA/IFNpemUubWViaWJ5dGVzKHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgYWRkUG9saWNpZXNUb1JvbGUodGhpcywgcHJvcHMuaW5saW5lUG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhJ3MgZXhlY3V0aW9uIHJvbGUgKGF1dG8tZ2VuZXJhdGVkIGJ5IENESylcbiAgICovXG4gIHB1YmxpYyBnZXQgZXhlY3V0aW9uUm9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb24gZXh0ZW5kcyBGdW5jdGlvbiB7XG4gIHByaXZhdGUgZnVuY3Rpb25VcmxWYWx1ZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTGFtYmRhRnVuY3Rpb25Qcm9wcykge1xuICAgIGNvbnN0IHZwY1N1Ym5ldHMgPSBwcm9wcy52cGNcbiAgICAgID8geyBzdWJuZXRUeXBlOiByZXNvbHZlUHJpdmF0ZVN1Ym5ldFR5cGUocHJvcHMudnBjKSB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB2cGNTdWJuZXRzLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dFxuICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMocHJvcHMudGltZW91dClcbiAgICAgICAgOiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplIHx8IDEyOCxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZVxuICAgICAgICA/IFNpemUubWViaWJ5dGVzKHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5sYW1iZGFEZXNjcmlwdGlvbiB8fCBgJHtpZH0gTGFtYmRhYCxcbiAgICAgIGVudmlyb25tZW50OiBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfV0VFS1xuICAgIH0pO1xuXG4gICAgYWRkUG9saWNpZXNUb1JvbGUodGhpcywgcHJvcHMuaW5saW5lUG9saWN5KTtcblxuICAgIHRoaXMuYWRkU2VjcmV0c1N1cHBvcnQoXG4gICAgICBwcm9wcy5zZWNyZXRzLFxuICAgICAgcHJvcHMuc3NtU2VjcmV0c1BhdGgsXG4gICAgICBwcm9wcy5zZWNyZXRzSW1wb3J0LFxuICAgICAgcHJvcHMuYXBwTmFtZSxcbiAgICAgIHByb3BzLmZ1bmN0aW9uTmFtZSxcbiAgICAgIHByb3BzLmFyY2hpdGVjdHVyZVxuICAgICk7XG5cbiAgICAvLyBTYW5pdGlzZSBpZCBmb3IgQ2xvdWRGb3JtYXRpb24gb3V0cHV0IGtleXMgKG11c3QgYmUgYWxwaGFudW1lcmljKVxuICAgIGNvbnN0IG91dHB1dE5hbWUgPSB0b1Bhc2NhbENhc2UoaWQpO1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZUZ1bmN0aW9uVXJsKSB7XG4gICAgICBjb25zdCBmdW5jdGlvblVybCA9IHRoaXMuYWRkRnVuY3Rpb25Vcmwoe1xuICAgICAgICBhdXRoVHlwZTogcHJvcHMuZnVuY3Rpb25VcmxBdXRoVHlwZSB8fCBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICAgIGNvcnM6IHByb3BzLmZ1bmN0aW9uVXJsQ29ycyxcbiAgICAgICAgaW52b2tlTW9kZTogcHJvcHMuZnVuY3Rpb25VcmxJbnZva2VNb2RlXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5mdW5jdGlvblVybFZhbHVlID0gZnVuY3Rpb25VcmwudXJsO1xuXG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke291dHB1dE5hbWV9RnVuY3Rpb25VcmxgLCB7XG4gICAgICAgIGtleTogYCR7b3V0cHV0TmFtZX1GdW5jdGlvblVybGAsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvblVybC51cmwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtpZH0gRnVuY3Rpb24gVVJMYFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtvdXRwdXROYW1lfUZ1bmN0aW9uQXJuYCwge1xuICAgICAga2V5OiBgJHtvdXRwdXROYW1lfUZ1bmN0aW9uQXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmZ1bmN0aW9uQXJuLFxuICAgICAgZGVzY3JpcHRpb246IGAke2lkfSBGdW5jdGlvbiBBUk5gXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuc2NoZWR1bGVFeHByZXNzaW9uKSB7XG4gICAgICBjb25zdCBydWxlID0gbmV3IFJ1bGUodGhpcywgYCR7aWR9U2NoZWR1bGVSdWxlYCwge1xuICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuZXhwcmVzc2lvbihwcm9wcy5zY2hlZHVsZUV4cHJlc3Npb24pXG4gICAgICB9KTtcbiAgICAgIHJ1bGUuYWRkVGFyZ2V0KG5ldyBMYW1iZGFUYXJnZXQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhJ3MgZXhlY3V0aW9uIHJvbGUgKGF1dG8tZ2VuZXJhdGVkIGJ5IENESylcbiAgICovXG4gIHB1YmxpYyBnZXQgZXhlY3V0aW9uUm9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIExhbWJkYSBmdW5jdGlvbiBVUkwgaWYgZW5hYmxlZC5cbiAgICovXG4gIHB1YmxpYyBnZXRGdW5jdGlvblVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uVXJsVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIFNRUyBxdWV1ZSBhcyBhbiBldmVudCBzb3VyY2UgZm9yIHRoaXMgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgTGFtYmRhIHdoZW4gbWVzc2FnZXMgYXJyaXZlIGluIHRoZSBxdWV1ZS5cbiAgICovXG4gIHB1YmxpYyBhZGRTcXNFdmVudFNvdXJjZShcbiAgICBxdWV1ZTogSVF1ZXVlLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBiYXRjaFNpemU/OiBudW1iZXI7XG4gICAgICBtYXhCYXRjaGluZ1dpbmRvdz86IG51bWJlcjtcbiAgICAgIHJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzPzogYm9vbGVhbjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IFNxc0V2ZW50U291cmNlKHF1ZXVlLCB7XG4gICAgICBiYXRjaFNpemU6IG9wdGlvbnM/LmJhdGNoU2l6ZSA/PyAxMCxcbiAgICAgIG1heEJhdGNoaW5nV2luZG93OiBvcHRpb25zPy5tYXhCYXRjaGluZ1dpbmRvd1xuICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMob3B0aW9ucy5tYXhCYXRjaGluZ1dpbmRvdylcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZXBvcnRCYXRjaEl0ZW1GYWlsdXJlczogb3B0aW9ucz8ucmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXMgPz8gdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRTb3VyY2UoZXZlbnRTb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIER5bmFtb0RCIHRhYmxlIHN0cmVhbSBhcyBhbiBldmVudCBzb3VyY2UgZm9yIHRoaXMgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgTGFtYmRhIHdoZW4gaXRlbXMgYXJlIG1vZGlmaWVkIGluIHRoZSB0YWJsZS5cbiAgICogUmVxdWlyZXMgRHluYW1vREIgU3RyZWFtcyB0byBiZSBlbmFibGVkIG9uIHRoZSB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyBhZGREeW5hbW9EYkV2ZW50U291cmNlKFxuICAgIHRhYmxlOiBJVGFibGUsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgICAgIHN0YXJ0aW5nUG9zaXRpb24/OiBcIlRSSU1fSE9SSVpPTlwiIHwgXCJMQVRFU1RcIjtcbiAgICAgIG1heEJhdGNoaW5nV2luZG93PzogbnVtYmVyO1xuICAgICAgcmV0cnlBdHRlbXB0cz86IG51bWJlcjtcbiAgICAgIHBhcmFsbGVsaXphdGlvbkZhY3Rvcj86IG51bWJlcjtcbiAgICAgIHJlcG9ydEJhdGNoSXRlbUZhaWx1cmVzPzogYm9vbGVhbjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0aW5nUG9zaXRpb24gPVxuICAgICAgb3B0aW9ucz8uc3RhcnRpbmdQb3NpdGlvbiA9PT0gXCJUUklNX0hPUklaT05cIlxuICAgICAgICA/IFN0YXJ0aW5nUG9zaXRpb24uVFJJTV9IT1JJWk9OXG4gICAgICAgIDogU3RhcnRpbmdQb3NpdGlvbi5MQVRFU1Q7XG5cbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBEeW5hbW9FdmVudFNvdXJjZSh0YWJsZSwge1xuICAgICAgc3RhcnRpbmdQb3NpdGlvbixcbiAgICAgIGJhdGNoU2l6ZTogb3B0aW9ucz8uYmF0Y2hTaXplID8/IDEwMCxcbiAgICAgIG1heEJhdGNoaW5nV2luZG93OiBvcHRpb25zPy5tYXhCYXRjaGluZ1dpbmRvd1xuICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMob3B0aW9ucy5tYXhCYXRjaGluZ1dpbmRvdylcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZXRyeUF0dGVtcHRzOiBvcHRpb25zPy5yZXRyeUF0dGVtcHRzLFxuICAgICAgcGFyYWxsZWxpemF0aW9uRmFjdG9yOiBvcHRpb25zPy5wYXJhbGxlbGl6YXRpb25GYWN0b3IsXG4gICAgICByZXBvcnRCYXRjaEl0ZW1GYWlsdXJlczogb3B0aW9ucz8ucmVwb3J0QmF0Y2hJdGVtRmFpbHVyZXMgPz8gdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRTb3VyY2UoZXZlbnRTb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBTMyBidWNrZXQgYXMgYW4gZXZlbnQgc291cmNlIGZvciB0aGlzIExhbWJkYSBmdW5jdGlvbi5cbiAgICogVGhpcyB3aWxsIHRyaWdnZXIgdGhlIExhbWJkYSB3aGVuIG9iamVjdHMgYXJlIGNyZWF0ZWQsIG1vZGlmaWVkLCBvciBkZWxldGVkLlxuICAgKiBVc2VmdWwgZm9yIElTUiBjYWNoZSBpbnZhbGlkYXRpb24gYW5kIGZpbGUgcHJvY2Vzc2luZyB3b3JrZmxvd3MuXG4gICAqL1xuICBwdWJsaWMgYWRkUzNFdmVudFNvdXJjZShcbiAgICBidWNrZXQ6IEJ1Y2tldCxcbiAgICBvcHRpb25zPzoge1xuICAgICAgZXZlbnRzPzogQXJyYXk8XG4gICAgICAgIHwgXCJPQkpFQ1RfQ1JFQVRFRFwiXG4gICAgICAgIHwgXCJPQkpFQ1RfUkVNT1ZFRFwiXG4gICAgICAgIHwgXCJPQkpFQ1RfQ1JFQVRFRF9QVVRcIlxuICAgICAgICB8IFwiT0JKRUNUX0NSRUFURURfUE9TVFwiXG4gICAgICAgIHwgXCJPQkpFQ1RfQ1JFQVRFRF9DT1BZXCJcbiAgICAgICAgfCBcIk9CSkVDVF9SRU1PVkVEX0RFTEVURVwiXG4gICAgICA+O1xuICAgICAgZmlsdGVycz86IEFycmF5PHsgcHJlZml4Pzogc3RyaW5nOyBzdWZmaXg/OiBzdHJpbmcgfT47XG4gICAgfVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFR5cGVzID0gKG9wdGlvbnM/LmV2ZW50cyA/PyBbXCJPQkpFQ1RfQ1JFQVRFRFwiXSkubWFwKChldmVudCkgPT4ge1xuICAgICAgc3dpdGNoIChldmVudCkge1xuICAgICAgICBjYXNlIFwiT0JKRUNUX0NSRUFURURcIjpcbiAgICAgICAgICByZXR1cm4gRXZlbnRUeXBlLk9CSkVDVF9DUkVBVEVEO1xuICAgICAgICBjYXNlIFwiT0JKRUNUX1JFTU9WRURcIjpcbiAgICAgICAgICByZXR1cm4gRXZlbnRUeXBlLk9CSkVDVF9SRU1PVkVEO1xuICAgICAgICBjYXNlIFwiT0JKRUNUX0NSRUFURURfUFVUXCI6XG4gICAgICAgICAgcmV0dXJuIEV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRF9QVVQ7XG4gICAgICAgIGNhc2UgXCJPQkpFQ1RfQ1JFQVRFRF9QT1NUXCI6XG4gICAgICAgICAgcmV0dXJuIEV2ZW50VHlwZS5PQkpFQ1RfQ1JFQVRFRF9QT1NUO1xuICAgICAgICBjYXNlIFwiT0JKRUNUX0NSRUFURURfQ09QWVwiOlxuICAgICAgICAgIHJldHVybiBFdmVudFR5cGUuT0JKRUNUX0NSRUFURURfQ09QWTtcbiAgICAgICAgY2FzZSBcIk9CSkVDVF9SRU1PVkVEX0RFTEVURVwiOlxuICAgICAgICAgIHJldHVybiBFdmVudFR5cGUuT0JKRUNUX1JFTU9WRURfREVMRVRFO1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gZXZlbnQ7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIFMzIGV2ZW50IHR5cGU6ICR7X2V4aGF1c3RpdmV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHMzRXZlbnRTb3VyY2VQcm9wczogUzNFdmVudFNvdXJjZVByb3BzID0ge1xuICAgICAgZXZlbnRzOiBldmVudFR5cGVzLFxuICAgICAgZmlsdGVyczogb3B0aW9ucz8uZmlsdGVyc1xuICAgIH07XG5cbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBTM0V2ZW50U291cmNlKGJ1Y2tldCwgczNFdmVudFNvdXJjZVByb3BzKTtcbiAgICB0aGlzLmFkZEV2ZW50U291cmNlKGV2ZW50U291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gRXZlbnRCcmlkZ2UgcnVsZSBhcyBhbiBldmVudCBzb3VyY2UgZm9yIHRoaXMgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgTGFtYmRhIHdoZW4gZXZlbnRzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuIGFyZSBwdWJsaXNoZWQuXG4gICAqIFVzZWZ1bCBmb3Igc2NoZWR1bGVkIGpvYnMsIGNyb3NzLXNlcnZpY2UgZXZlbnQgaGFuZGxpbmcsIGFuZCBjdXN0b20gZXZlbnQgcGF0dGVybnMuXG4gICAqL1xuICBwdWJsaWMgYWRkRXZlbnRCcmlkZ2VFdmVudFNvdXJjZShcbiAgICBydWxlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBzY2hlZHVsZT86IHN0cmluZztcbiAgICAgIGV2ZW50UGF0dGVybj86IEV2ZW50UGF0dGVybjtcbiAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIH1cbiAgKTogUnVsZSB7XG4gICAgaWYgKCFvcHRpb25zLnNjaGVkdWxlICYmICFvcHRpb25zLmV2ZW50UGF0dGVybikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkV2ZW50QnJpZGdlIHJ1bGUgcmVxdWlyZXMgZWl0aGVyIHNjaGVkdWxlIG9yIGV2ZW50UGF0dGVyblwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUnVsZSh0aGlzLCBydWxlSWQsIHtcbiAgICAgIHNjaGVkdWxlOiBvcHRpb25zLnNjaGVkdWxlXG4gICAgICAgID8gU2NoZWR1bGUuZXhwcmVzc2lvbihvcHRpb25zLnNjaGVkdWxlKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGV2ZW50UGF0dGVybjogb3B0aW9ucy5ldmVudFBhdHRlcm4sXG4gICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvblxuICAgIH0pO1xuXG4gICAgcnVsZS5hZGRUYXJnZXQobmV3IExhbWJkYVRhcmdldCh0aGlzKSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHNlY3JldHMgc3VwcG9ydCB1c2luZyBBV1MgUGFyYW1ldGVycyBhbmQgU2VjcmV0cyBMYW1iZGEgRXh0ZW5zaW9uLlxuICAgKlxuICAgKiBUaGUgZXh0ZW5zaW9uIGZldGNoZXMgc2VjcmV0cyBhdCBydW50aW1lIGZyb206XG4gICAqIC0gU1NNIFBhcmFtZXRlciBTdG9yZTogdmlhIGh0dHA6Ly9sb2NhbGhvc3Q6Mjc3My9zeXN0ZW1zbWFuYWdlci9wYXJhbWV0ZXJzL2dldFxuICAgKiAtIFNlY3JldHMgTWFuYWdlcjogdmlhIGh0dHA6Ly9sb2NhbGhvc3Q6Mjc3My9zZWNyZXRzbWFuYWdlci9nZXRcbiAgICpcbiAgICogVGhpcyByZXBsYWNlcyB0aGUgaW5zZWN1cmUgdW5zYWZlVW53cmFwKCkgcGF0dGVybiB3aGljaCByZXNvbHZlZCBzZWNyZXRzIGF0XG4gICAqIGRlcGxveSB0aW1lIGFuZCBleHBvc2VkIHRoZW0gaW4gTGFtYmRhIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFkZFNlY3JldHNTdXBwb3J0KFxuICAgIHNlY3JldHM/OiBzdHJpbmdbXSxcbiAgICBzc21TZWNyZXRzUGF0aD86IHN0cmluZyxcbiAgICBzZWNyZXRzSW1wb3J0PzogUmVjb3JkPHN0cmluZywgU2VjcmV0SW1wb3J0PixcbiAgICBhcHBOYW1lPzogc3RyaW5nLFxuICAgIGZ1bmN0aW9uTmFtZT86IHN0cmluZyxcbiAgICBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmVcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGFzU2VjcmV0c01hbmFnZXIgPVxuICAgICAgc2VjcmV0c0ltcG9ydCAmJiBPYmplY3Qua2V5cyhzZWNyZXRzSW1wb3J0KS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKCFoYXNTZWNyZXRzTWFuYWdlciAmJiAhKHNlY3JldHMgJiYgc2VjcmV0cy5sZW5ndGggPiAwKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5hZGRTZWNyZXRzRXh0ZW5zaW9uTGF5ZXIoYXJjaGl0ZWN0dXJlKTtcblxuICAgIGlmIChoYXNTZWNyZXRzTWFuYWdlcikge1xuICAgICAgdGhpcy5hZGRTZWNyZXRzTWFuYWdlclN1cHBvcnQoc2VjcmV0c0ltcG9ydCk7XG4gICAgfVxuXG4gICAgaWYgKHNlY3JldHMgJiYgc2VjcmV0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmFkZFNzbVNlY3JldHNTdXBwb3J0KHNlY3JldHMsIHNzbVNlY3JldHNQYXRoLCBhcHBOYW1lLCBmdW5jdGlvbk5hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkU2VjcmV0c1Jlc29sdmVyTGF5ZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIEFXUyBQYXJhbWV0ZXJzIGFuZCBTZWNyZXRzIExhbWJkYSBFeHRlbnNpb24gbGF5ZXIuXG4gICAqIFVzZXMgQ0RLJ3MgcmVnaW9uYWxGYWN0KCkgdG8gcmVzb2x2ZSB0aGUgY29ycmVjdCBBUk4gYXQgZGVwbG95IHRpbWUsXG4gICAqIGhhbmRsaW5nIHRoZSBmYWN0IHRoYXQgQVdTIHB1Ymxpc2hlcyB0aGUgbGF5ZXIgZnJvbSBkaWZmZXJlbnQgYWNjb3VudHNcbiAgICogaW4gZGlmZmVyZW50IHJlZ2lvbnMuIFRoaXMgYXBwcm9hY2ggd29ya3Mgd2l0aCBDREsgdG9rZW5zLlxuICAgKiBDb25maWd1cmVzIGNhY2hlIFRUTCBmb3Igcm90YXRpb24gc3VwcG9ydC5cbiAgICovXG4gIHByaXZhdGUgYWRkU2VjcmV0c0V4dGVuc2lvbkxheWVyKGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZSk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG4gICAgY29uc3QgYXJjaFN0cmluZyA9XG4gICAgICBhcmNoaXRlY3R1cmUgPT09IEFyY2hpdGVjdHVyZS5BUk1fNjQgPyBcImFybTY0XCIgOiBcIng4Nl82NFwiO1xuXG4gICAgY29uc3QgZmFjdE5hbWUgPSBGYWN0TmFtZS5wYXJhbXNBbmRTZWNyZXRzTGFtYmRhTGF5ZXIoXG4gICAgICBTRUNSRVRTX0VYVEVOU0lPTi5WRVJTSU9OLFxuICAgICAgYXJjaFN0cmluZ1xuICAgICk7XG5cbiAgICBjb25zdCBsYXllckFybiA9IHN0YWNrLnJlZ2lvbmFsRmFjdChmYWN0TmFtZSk7XG5cbiAgICB0aGlzLmFkZExheWVycyhcbiAgICAgIExheWVyVmVyc2lvbi5mcm9tTGF5ZXJWZXJzaW9uQXJuKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHt0aGlzLm5vZGUuaWR9U2VjcmV0c0V4dGVuc2lvbmAsXG4gICAgICAgIGxheWVyQXJuXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoXG4gICAgICBcIlNFQ1JFVFNfTUFOQUdFUl9UVExcIixcbiAgICAgIFNFQ1JFVFNfRVhURU5TSU9OLkNBQ0hFX1RUTF9TRUNPTkRTXG4gICAgKTtcbiAgICB0aGlzLmFkZEVudmlyb25tZW50KFxuICAgICAgXCJTU01fUEFSQU1FVEVSX1NUT1JFX1RUTFwiLFxuICAgICAgU0VDUkVUU19FWFRFTlNJT04uQ0FDSEVfVFRMX1NFQ09ORFNcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBTZWNyZXRzIE1hbmFnZXIgc3VwcG9ydCBmb3IgQ0RLLW1hbmFnZWQgc2VjcmV0cyAoZS5nLiwgZGF0YWJhc2UgY3JlZGVudGlhbHMpLlxuICAgKiBTdG9yZXMgQVJOICsgZmllbGQgYXMgZW52IHZhcnMgLSB0aGUgTGFtYmRhIEV4dGVuc2lvbiBmZXRjaGVzIGFjdHVhbCB2YWx1ZXMgYXQgcnVudGltZS5cbiAgICovXG4gIHByaXZhdGUgYWRkU2VjcmV0c01hbmFnZXJTdXBwb3J0KFxuICAgIHNlY3JldHNJbXBvcnQ6IFJlY29yZDxzdHJpbmcsIFNlY3JldEltcG9ydD5cbiAgKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzZWNyZXRJbXBvcnRdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHNJbXBvcnQpKSB7XG4gICAgICBjb25zdCBzZWNyZXQgPSBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7dGhpcy5ub2RlLmlkfUltcG9ydGVkU2VjcmV0JHtrZXl9YCxcbiAgICAgICAgc2VjcmV0SW1wb3J0Lm5hbWVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoYCR7a2V5fV9TRUNSRVRfQVJOYCwgc2VjcmV0LnNlY3JldEFybik7XG4gICAgICBpZiAoc2VjcmV0SW1wb3J0LmZpZWxkKSB7XG4gICAgICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoYCR7a2V5fV9TRUNSRVRfRklFTERgLCBzZWNyZXRJbXBvcnQuZmllbGQpO1xuICAgICAgfVxuXG4gICAgICBzZWNyZXQuZ3JhbnRSZWFkKHRoaXMpO1xuICAgIH1cblxuICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXCJrbXM6RGVjcnlwdFwiLCBcImttczpEZXNjcmliZUtleVwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgICBcImttczpWaWFTZXJ2aWNlXCI6IGBzZWNyZXRzbWFuYWdlci4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgU1NNIFBhcmFtZXRlciBTdG9yZSBzdXBwb3J0IGZvciB1c2VyLW1hbmFnZWQgc2VjcmV0cyAodmlhIGZqYWxsIHNlY3JldCBhZGQpLlxuICAgKiBTdG9yZXMgYmFzZSBwYXRoIGFuZCBzZWNyZXQgbmFtZXMgYXMgZW52IHZhcnMgZm9yIGNvbnN1bWVyIGNvZGUuXG4gICAqL1xuICBwcml2YXRlIGFkZFNzbVNlY3JldHNTdXBwb3J0KFxuICAgIHNlY3JldHM6IHN0cmluZ1tdLFxuICAgIHNzbVNlY3JldHNQYXRoPzogc3RyaW5nLFxuICAgIGFwcE5hbWU/OiBzdHJpbmcsXG4gICAgZnVuY3Rpb25OYW1lPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gdGhpcy5kZXJpdmVTc21TZWNyZXRzUGF0aChcbiAgICAgIHNzbVNlY3JldHNQYXRoLFxuICAgICAgYXBwTmFtZSxcbiAgICAgIGZ1bmN0aW9uTmFtZVxuICAgICk7XG5cbiAgICB0aGlzLmFkZEVudmlyb25tZW50KFwiU1NNX1NFQ1JFVFNfUEFUSFwiLCBiYXNlUGF0aCk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudChcIlNTTV9TRUNSRVRfTkFNRVNcIiwgc2VjcmV0cy5qb2luKFwiLFwiKSk7XG5cbiAgICBjb25zdCBzY29wZWRQYXRoID0gYCR7YmFzZVBhdGh9LypgO1xuICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICBhY3Rpb25zOiBbXCJzc206R2V0UGFyYW1ldGVyXCIsIFwic3NtOkdldFBhcmFtZXRlcnNcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGBhcm46YXdzOnNzbToke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn06KjpwYXJhbWV0ZXIke3Njb3BlZFBhdGh9YFxuICAgICAgICBdXG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1wia21zOkRlY3J5cHRcIl0sXG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICAgXCJrbXM6VmlhU2VydmljZVwiOiBgc3NtLiR7U3RhY2sub2YodGhpcykucmVnaW9ufS5hbWF6b25hd3MuY29tYFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgRmphbGwgc2VjcmV0cyByZXNvbHZlciBsYXllciBhbmQgc2V0IEFXU19MQU1CREFfRVhFQ19XUkFQUEVSLlxuICAgKlxuICAgKiBUaGUgcmVzb2x2ZXIgaXMgYSBiYXNoIHdyYXBwZXIgKyBOb2RlLmpzIHNjcmlwdCB0aGF0IHJ1bnMgYmVmb3JlIHRoZSBMYW1iZGFcbiAgICogcnVudGltZS4gSXQgY2FsbHMgdGhlIEV4dGVuc2lvbiBIVFRQIEFQSSAobG9jYWxob3N0OjI3NzMpIHRvIHJlc29sdmUgU1NNXG4gICAqIHBhcmFtZXRlcnMgYW5kIFNlY3JldHMgTWFuYWdlciBzZWNyZXRzLCBleHBvcnRpbmcgdGhlbSBhcyBwbGFpbiBlbnZpcm9ubWVudFxuICAgKiB2YXJpYWJsZXMgc28gaGFuZGxlciBjb2RlIGNhbiBzaW1wbHkgcmVhZCBwcm9jZXNzLmVudi5cbiAgICpcbiAgICogVGhlIGxheWVyIGlzIGNyZWF0ZWQgb25jZSBwZXIgc3RhY2sgYW5kIHNoYXJlZCBhY3Jvc3MgYWxsIExhbWJkYSBmdW5jdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIGFkZFNlY3JldHNSZXNvbHZlckxheWVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG4gICAgY29uc3QgbGF5ZXJJZCA9IFwiRmphbGxTZWNyZXRzUmVzb2x2ZXJMYXllclwiO1xuICAgIGxldCByZXNvbHZlckxheWVyID0gc3RhY2subm9kZS50cnlGaW5kQ2hpbGQobGF5ZXJJZCkgYXNcbiAgICAgIHwgTGF5ZXJWZXJzaW9uXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghcmVzb2x2ZXJMYXllcikge1xuICAgICAgcmVzb2x2ZXJMYXllciA9IG5ldyBMYXllclZlcnNpb24oc3RhY2ssIGxheWVySWQsIHtcbiAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLi5cIiwgXCJsYXllcnNcIiwgXCJzZWNyZXRzLXJlc29sdmVyXCIpXG4gICAgICAgICksXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiRmphbGwgc2VjcmV0cyByZXNvbHZlciDigJQgcmVzb2x2ZXMgU1NNIGFuZCBTTSBzZWNyZXRzIGJlZm9yZSBoYW5kbGVyXCJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYWRkTGF5ZXJzKHJlc29sdmVyTGF5ZXIpO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoXCJBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUlwiLCBcIi9vcHQvYmluL3Jlc29sdmUtc2VjcmV0c1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgU1NNIHNlY3JldHMgcGF0aCBmb3IgTGFtYmRhIGZ1bmN0aW9ucy5cbiAgICogUGF0dGVybjogLzxhcHBOYW1lPi9sYW1iZGEvPGZ1bmN0aW9uTmFtZT5cbiAgICovXG4gIHByaXZhdGUgZGVyaXZlU3NtU2VjcmV0c1BhdGgoXG4gICAgZXhwbGljaXRQYXRoPzogc3RyaW5nLFxuICAgIGFwcE5hbWU/OiBzdHJpbmcsXG4gICAgZnVuY3Rpb25OYW1lPzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKGV4cGxpY2l0UGF0aCkge1xuICAgICAgcmV0dXJuIGV4cGxpY2l0UGF0aDtcbiAgICB9XG5cbiAgICBpZiAoIWFwcE5hbWUgfHwgIWZ1bmN0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkxhbWJkYSBmdW5jdGlvbiBoYXMgc2VjcmV0cyBkZWZpbmVkIGJ1dCBubyBzc21TZWNyZXRzUGF0aCBpcyBzZXQgXCIgK1xuICAgICAgICAgIFwiYW5kIGFwcE5hbWUvZnVuY3Rpb25OYW1lIGFyZSBub3QgYXZhaWxhYmxlLiBcIiArXG4gICAgICAgICAgXCJFaXRoZXIgc2V0IHNzbVNlY3JldHNQYXRoIGV4cGxpY2l0bHksIG9yIGVuc3VyZSBBcHAuZ2V0TmFtZSgpIHJldHVybnMgYSB2YWx1ZS5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYC8ke2FwcE5hbWV9L2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gO1xuICB9XG59XG4iXX0=
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DynamoDBTable = void 0;
4
4
  const constructs_1 = require("constructs");
5
5
  const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const removalPolicy_1 = require("../../../utils/removalPolicy");
6
7
  const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
7
8
  function toAttributeType(type) {
8
9
  switch (type) {
@@ -37,17 +38,6 @@ function toStreamViewType(stream) {
37
38
  return undefined;
38
39
  }
39
40
  }
40
- function toRemovalPolicy(policy) {
41
- switch (policy) {
42
- case "RETAIN":
43
- return aws_cdk_lib_1.RemovalPolicy.RETAIN;
44
- case "SNAPSHOT":
45
- return aws_cdk_lib_1.RemovalPolicy.SNAPSHOT;
46
- case "DESTROY":
47
- default:
48
- return aws_cdk_lib_1.RemovalPolicy.DESTROY;
49
- }
50
- }
51
41
  function toProjectionType(type) {
52
42
  switch (type) {
53
43
  case "ALL":
@@ -81,7 +71,7 @@ class DynamoDBTable extends constructs_1.Construct {
81
71
  writeCapacity: props.billingMode === "PROVISIONED" ? props.writeCapacity : undefined,
82
72
  stream: toStreamViewType(props.stream),
83
73
  pointInTimeRecovery: props.pointInTimeRecovery ?? true,
84
- removalPolicy: toRemovalPolicy(props.removalPolicy),
74
+ removalPolicy: (0, removalPolicy_1.toRemovalPolicy)(props.removalPolicy),
85
75
  timeToLiveAttribute: props.timeToLiveAttribute
86
76
  });
87
77
  if (props.globalSecondaryIndexes) {
@@ -178,4 +168,4 @@ class DynamoDBTable extends constructs_1.Construct {
178
168
  }
179
169
  }
180
170
  exports.DynamoDBTable = DynamoDBTable;
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1vZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9keW5hbW9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsNkNBQXVEO0FBQ3ZELDJEQVFrQztBQWlDbEMsU0FBUyxlQUFlLENBQUMsSUFBMkI7SUFDbEQsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssR0FBRztZQUNOLE9BQU8sNEJBQWEsQ0FBQyxNQUFNLENBQUM7UUFDOUIsS0FBSyxHQUFHO1lBQ04sT0FBTyw0QkFBYSxDQUFDLE1BQU0sQ0FBQztRQUM5QixLQUFLLEdBQUc7WUFDTixPQUFPLDRCQUFhLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsSUFBd0M7SUFDN0QsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssYUFBYTtZQUNoQixPQUFPLDBCQUFXLENBQUMsV0FBVyxDQUFDO1FBQ2pDLEtBQUssaUJBQWlCLENBQUM7UUFDdkI7WUFDRSxPQUFPLDBCQUFXLENBQUMsZUFBZSxDQUFDO0lBQ3ZDLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsTUFBdUU7SUFFdkUsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssV0FBVztZQUNkLE9BQU8sNkJBQWMsQ0FBQyxTQUFTLENBQUM7UUFDbEMsS0FBSyxXQUFXO1lBQ2QsT0FBTyw2QkFBYyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxLQUFLLG9CQUFvQjtZQUN2QixPQUFPLDZCQUFjLENBQUMsa0JBQWtCLENBQUM7UUFDM0MsS0FBSyxXQUFXO1lBQ2QsT0FBTyw2QkFBYyxDQUFDLFNBQVMsQ0FBQztRQUNsQztZQUNFLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLE1BQTBDO0lB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Q0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLE9BQW1CO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLE9BQW1CO1FBQ25DLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYyxDQUFDLE9BQW1CO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQUMsT0FBbUI7UUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlLENBQUMsT0FBbUI7UUFDeEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUF2SUQsc0NBdUlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IENmbk91dHB1dCwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgVGFibGUsXG4gIEF0dHJpYnV0ZVR5cGUsXG4gIEJpbGxpbmdNb2RlLFxuICBTdHJlYW1WaWV3VHlwZSxcbiAgUHJvamVjdGlvblR5cGUsXG4gIHR5cGUgR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgdHlwZSBJVGFibGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcblxuZXhwb3J0IHR5cGUgRHluYW1vREJBdHRyaWJ1dGVUeXBlID0gXCJTXCIgfCBcIk5cIiB8IFwiQlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCS2V5U2NoZW1hIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBEeW5hbW9EQkF0dHJpYnV0ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1vREJHbG9iYWxTZWNvbmRhcnlJbmRleCB7XG4gIGluZGV4TmFtZTogc3RyaW5nO1xuICBwYXJ0aXRpb25LZXk6IER5bmFtb0RCS2V5U2NoZW1hO1xuICBzb3J0S2V5PzogRHluYW1vREJLZXlTY2hlbWE7XG4gIHByb2plY3Rpb25UeXBlPzogXCJBTExcIiB8IFwiS0VZU19PTkxZXCIgfCBcIklOQ0xVREVcIjtcbiAgbm9uS2V5QXR0cmlidXRlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCVGFibGVQcm9wcyB7XG4gIHRhYmxlTmFtZT86IHN0cmluZztcbiAgcGFydGl0aW9uS2V5OiBEeW5hbW9EQktleVNjaGVtYTtcbiAgc29ydEtleT86IER5bmFtb0RCS2V5U2NoZW1hO1xuICBiaWxsaW5nTW9kZT86IFwiUEFZX1BFUl9SRVFVRVNUXCIgfCBcIlBST1ZJU0lPTkVEXCI7XG4gIHJlYWRDYXBhY2l0eT86IG51bWJlcjtcbiAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcz86IER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXhbXTtcbiAgdGltZVRvTGl2ZUF0dHJpYnV0ZT86IHN0cmluZztcbiAgc3RyZWFtPzogXCJORVdfSU1BR0VcIiB8IFwiT0xEX0lNQUdFXCIgfCBcIk5FV19BTkRfT0xEX0lNQUdFU1wiIHwgXCJLRVlTX09OTFlcIjtcbiAgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIGVuY3J5cHRpb24/OiBcIkFXU19PV05FRFwiIHwgXCJBV1NfTUFOQUdFRFwiIHwgXCJDVVNUT01FUl9NQU5BR0VEXCI7XG4gIHJlbW92YWxQb2xpY3k/OiBcIkRFU1RST1lcIiB8IFwiUkVUQUlOXCIgfCBcIlNOQVBTSE9UXCI7XG59XG5cbmZ1bmN0aW9uIHRvQXR0cmlidXRlVHlwZSh0eXBlOiBEeW5hbW9EQkF0dHJpYnV0ZVR5cGUpOiBBdHRyaWJ1dGVUeXBlIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIlNcIjpcbiAgICAgIHJldHVybiBBdHRyaWJ1dGVUeXBlLlNUUklORztcbiAgICBjYXNlIFwiTlwiOlxuICAgICAgcmV0dXJuIEF0dHJpYnV0ZVR5cGUuTlVNQkVSO1xuICAgIGNhc2UgXCJCXCI6XG4gICAgICByZXR1cm4gQXR0cmlidXRlVHlwZS5CSU5BUlk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CaWxsaW5nTW9kZShtb2RlPzogXCJQQVlfUEVSX1JFUVVFU1RcIiB8IFwiUFJPVklTSU9ORURcIik6IEJpbGxpbmdNb2RlIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBcIlBST1ZJU0lPTkVEXCI6XG4gICAgICByZXR1cm4gQmlsbGluZ01vZGUuUFJPVklTSU9ORUQ7XG4gICAgY2FzZSBcIlBBWV9QRVJfUkVRVUVTVFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU3RyZWFtVmlld1R5cGUoXG4gIHN0cmVhbT86IFwiTkVXX0lNQUdFXCIgfCBcIk9MRF9JTUFHRVwiIHwgXCJORVdfQU5EX09MRF9JTUFHRVNcIiB8IFwiS0VZU19PTkxZXCJcbik6IFN0cmVhbVZpZXdUeXBlIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoIChzdHJlYW0pIHtcbiAgICBjYXNlIFwiTkVXX0lNQUdFXCI6XG4gICAgICByZXR1cm4gU3RyZWFtVmlld1R5cGUuTkVXX0lNQUdFO1xuICAgIGNhc2UgXCJPTERfSU1BR0VcIjpcbiAgICAgIHJldHVybiBTdHJlYW1WaWV3VHlwZS5PTERfSU1BR0U7XG4gICAgY2FzZSBcIk5FV19BTkRfT0xEX0lNQUdFU1wiOlxuICAgICAgcmV0dXJuIFN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUztcbiAgICBjYXNlIFwiS0VZU19PTkxZXCI6XG4gICAgICByZXR1cm4gU3RyZWFtVmlld1R5cGUuS0VZU19PTkxZO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVtb3ZhbFBvbGljeShcbiAgcG9saWN5PzogXCJERVNUUk9ZXCIgfCBcIlJFVEFJTlwiIHwgXCJTTkFQU0hPVFwiXG4pOiBSZW1vdmFsUG9saWN5IHtcbiAgc3dpdGNoIChwb2xpY3kpIHtcbiAgICBjYXNlIFwiUkVUQUlOXCI6XG4gICAgICByZXR1cm4gUmVtb3ZhbFBvbGljeS5SRVRBSU47XG4gICAgY2FzZSBcIlNOQVBTSE9UXCI6XG4gICAgICByZXR1cm4gUmVtb3ZhbFBvbGljeS5TTkFQU0hPVDtcbiAgICBjYXNlIFwiREVTVFJPWVwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUHJvamVjdGlvblR5cGUoXG4gIHR5cGU/OiBcIkFMTFwiIHwgXCJLRVlTX09OTFlcIiB8IFwiSU5DTFVERVwiXG4pOiBQcm9qZWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJBTExcIjpcbiAgICAgIHJldHVybiBQcm9qZWN0aW9uVHlwZS5BTEw7XG4gICAgY2FzZSBcIktFWVNfT05MWVwiOlxuICAgICAgcmV0dXJuIFByb2plY3Rpb25UeXBlLktFWVNfT05MWTtcbiAgICBjYXNlIFwiSU5DTFVERVwiOlxuICAgICAgcmV0dXJuIFByb2plY3Rpb25UeXBlLklOQ0xVREU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIER5bmFtb0RCVGFibGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0YWJsZTogVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IER5bmFtb0RCVGFibGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBgJHtpZH1UYWJsZWAsIHtcbiAgICAgIHRhYmxlTmFtZTogcHJvcHMudGFibGVOYW1lLFxuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6IHByb3BzLnBhcnRpdGlvbktleS5uYW1lLFxuICAgICAgICB0eXBlOiB0b0F0dHJpYnV0ZVR5cGUocHJvcHMucGFydGl0aW9uS2V5LnR5cGUpXG4gICAgICB9LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG5hbWU6IHByb3BzLnNvcnRLZXkubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHRvQXR0cmlidXRlVHlwZShwcm9wcy5zb3J0S2V5LnR5cGUpXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGJpbGxpbmdNb2RlOiB0b0JpbGxpbmdNb2RlKHByb3BzLmJpbGxpbmdNb2RlKSxcbiAgICAgIHJlYWRDYXBhY2l0eTpcbiAgICAgICAgcHJvcHMuYmlsbGluZ01vZGUgPT09IFwiUFJPVklTSU9ORURcIiA/IHByb3BzLnJlYWRDYXBhY2l0eSA6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRlQ2FwYWNpdHk6XG4gICAgICAgIHByb3BzLmJpbGxpbmdNb2RlID09PSBcIlBST1ZJU0lPTkVEXCIgPyBwcm9wcy53cml0ZUNhcGFjaXR5IDogdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiB0b1N0cmVhbVZpZXdUeXBlKHByb3BzLnN0cmVhbSksXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5OiBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5ID8/IHRydWUsXG4gICAgICByZW1vdmFsUG9saWN5OiB0b1JlbW92YWxQb2xpY3kocHJvcHMucmVtb3ZhbFBvbGljeSksXG4gICAgICB0aW1lVG9MaXZlQXR0cmlidXRlOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcykge1xuICAgICAgZm9yIChjb25zdCBnc2kgb2YgcHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcykge1xuICAgICAgICBjb25zdCBnc2lQcm9wczogR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyA9IHtcbiAgICAgICAgICBpbmRleE5hbWU6IGdzaS5pbmRleE5hbWUsXG4gICAgICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgICAgICBuYW1lOiBnc2kucGFydGl0aW9uS2V5Lm5hbWUsXG4gICAgICAgICAgICB0eXBlOiB0b0F0dHJpYnV0ZVR5cGUoZ3NpLnBhcnRpdGlvbktleS50eXBlKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc29ydEtleTogZ3NpLnNvcnRLZXlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGdzaS5zb3J0S2V5Lm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogdG9BdHRyaWJ1dGVUeXBlKGdzaS5zb3J0S2V5LnR5cGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHByb2plY3Rpb25UeXBlOiB0b1Byb2plY3Rpb25UeXBlKGdzaS5wcm9qZWN0aW9uVHlwZSksXG4gICAgICAgICAgbm9uS2V5QXR0cmlidXRlczogZ3NpLm5vbktleUF0dHJpYnV0ZXNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50YWJsZS5hZGRHbG9iYWxTZWNvbmRhcnlJbmRleChnc2lQcm9wcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1UYWJsZU5hbWVgLCB7XG4gICAgICBrZXk6IGAke2lkfVRhYmxlTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYER5bmFtb0RCIHRhYmxlIG5hbWUgZm9yICR7aWR9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1UYWJsZUFybmAsIHtcbiAgICAgIGtleTogYCR7aWR9VGFibGVBcm5gLFxuICAgICAgdmFsdWU6IHRoaXMudGFibGUudGFibGVBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYER5bmFtb0RCIHRhYmxlIEFSTiBmb3IgJHtpZH1gXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuc3RyZWFtKSB7XG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfVRhYmxlU3RyZWFtQXJuYCwge1xuICAgICAgICBrZXk6IGAke2lkfVRhYmxlU3RyZWFtQXJuYCxcbiAgICAgICAgdmFsdWU6IHRoaXMudGFibGUudGFibGVTdHJlYW1Bcm4gfHwgXCJcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBEeW5hbW9EQiB0YWJsZSBzdHJlYW0gQVJOIGZvciAke2lkfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIER5bmFtb0RCIHRhYmxlIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUudGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRHluYW1vREIgdGFibGUgQVJOLlxuICAgKi9cbiAgcHVibGljIGdldFRhYmxlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUudGFibGVBcm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBEeW5hbW9EQiB0YWJsZSBzdHJlYW0gQVJOIChpZiBzdHJlYW1pbmcgaXMgZW5hYmxlZCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFibGVTdHJlYW1Bcm4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS50YWJsZVN0cmVhbUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgQ0RLIFRhYmxlIGNvbnN0cnVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXRUYWJsZSgpOiBJVGFibGUge1xuICAgIHJldHVybiB0aGlzLnRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRSZWFkRGF0YShncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgZ3JhbnRlZS5cbiAgICovXG4gIHB1YmxpYyBncmFudFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBhbmQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFJlYWRXcml0ZURhdGEoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgZnVsbCBhY2Nlc3MgKHJlYWQsIHdyaXRlLCBkZWxldGUpIHRvIHRoZSBncmFudGVlLlxuICAgKi9cbiAgcHVibGljIGdyYW50RnVsbEFjY2VzcyhncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdyYW50RnVsbEFjY2VzcyhncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBzdHJlYW0gcmVhZCBwZXJtaXNzaW9ucyB0byB0aGUgZ3JhbnRlZS5cbiAgICovXG4gIHB1YmxpYyBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFN0cmVhbVJlYWQoZ3JhbnRlZSk7XG4gIH1cbn1cbiJdfQ==
171
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1vZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9keW5hbW9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsNkNBQXdDO0FBQ3hDLGdFQUErRDtBQUMvRCwyREFRa0M7QUFpQ2xDLFNBQVMsZUFBZSxDQUFDLElBQTJCO0lBQ2xELFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLEdBQUc7WUFDTixPQUFPLDRCQUFhLENBQUMsTUFBTSxDQUFDO1FBQzlCLEtBQUssR0FBRztZQUNOLE9BQU8sNEJBQWEsQ0FBQyxNQUFNLENBQUM7UUFDOUIsS0FBSyxHQUFHO1lBQ04sT0FBTyw0QkFBYSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLElBQXdDO0lBQzdELFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLGFBQWE7WUFDaEIsT0FBTywwQkFBVyxDQUFDLFdBQVcsQ0FBQztRQUNqQyxLQUFLLGlCQUFpQixDQUFDO1FBQ3ZCO1lBQ0UsT0FBTywwQkFBVyxDQUFDLGVBQWUsQ0FBQztJQUN2QyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQ3ZCLE1BQXVFO0lBRXZFLFFBQVEsTUFBTSxFQUFFLENBQUM7UUFDZixLQUFLLFdBQVc7WUFDZCxPQUFPLDZCQUFjLENBQUMsU0FBUyxDQUFDO1FBQ2xDLEtBQUssV0FBVztZQUNkLE9BQU8sNkJBQWMsQ0FBQyxTQUFTLENBQUM7UUFDbEMsS0FBSyxvQkFBb0I7WUFDdkIsT0FBTyw2QkFBYyxDQUFDLGtCQUFrQixDQUFDO1FBQzNDLEtBQUssV0FBVztZQUNkLE9BQU8sNkJBQWMsQ0FBQyxTQUFTLENBQUM7UUFDbEM7WUFDRSxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0JBQWdC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UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsT0FBbUI7UUFDbkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjLENBQUMsT0FBbUI7UUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUFtQjtRQUN4QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUFtQjtRQUN4QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDRjtBQXZJRCxzQ0F1SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0b1JlbW92YWxQb2xpY3kgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVtb3ZhbFBvbGljeVwiO1xuaW1wb3J0IHtcbiAgVGFibGUsXG4gIEF0dHJpYnV0ZVR5cGUsXG4gIEJpbGxpbmdNb2RlLFxuICBTdHJlYW1WaWV3VHlwZSxcbiAgUHJvamVjdGlvblR5cGUsXG4gIHR5cGUgR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyxcbiAgdHlwZSBJVGFibGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1keW5hbW9kYlwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcblxuZXhwb3J0IHR5cGUgRHluYW1vREJBdHRyaWJ1dGVUeXBlID0gXCJTXCIgfCBcIk5cIiB8IFwiQlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCS2V5U2NoZW1hIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBEeW5hbW9EQkF0dHJpYnV0ZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1vREJHbG9iYWxTZWNvbmRhcnlJbmRleCB7XG4gIGluZGV4TmFtZTogc3RyaW5nO1xuICBwYXJ0aXRpb25LZXk6IER5bmFtb0RCS2V5U2NoZW1hO1xuICBzb3J0S2V5PzogRHluYW1vREJLZXlTY2hlbWE7XG4gIHByb2plY3Rpb25UeXBlPzogXCJBTExcIiB8IFwiS0VZU19PTkxZXCIgfCBcIklOQ0xVREVcIjtcbiAgbm9uS2V5QXR0cmlidXRlcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIER5bmFtb0RCVGFibGVQcm9wcyB7XG4gIHRhYmxlTmFtZT86IHN0cmluZztcbiAgcGFydGl0aW9uS2V5OiBEeW5hbW9EQktleVNjaGVtYTtcbiAgc29ydEtleT86IER5bmFtb0RCS2V5U2NoZW1hO1xuICBiaWxsaW5nTW9kZT86IFwiUEFZX1BFUl9SRVFVRVNUXCIgfCBcIlBST1ZJU0lPTkVEXCI7XG4gIHJlYWRDYXBhY2l0eT86IG51bWJlcjtcbiAgd3JpdGVDYXBhY2l0eT86IG51bWJlcjtcbiAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcz86IER5bmFtb0RCR2xvYmFsU2Vjb25kYXJ5SW5kZXhbXTtcbiAgdGltZVRvTGl2ZUF0dHJpYnV0ZT86IHN0cmluZztcbiAgc3RyZWFtPzogXCJORVdfSU1BR0VcIiB8IFwiT0xEX0lNQUdFXCIgfCBcIk5FV19BTkRfT0xEX0lNQUdFU1wiIHwgXCJLRVlTX09OTFlcIjtcbiAgcG9pbnRJblRpbWVSZWNvdmVyeT86IGJvb2xlYW47XG4gIGVuY3J5cHRpb24/OiBcIkFXU19PV05FRFwiIHwgXCJBV1NfTUFOQUdFRFwiIHwgXCJDVVNUT01FUl9NQU5BR0VEXCI7XG4gIHJlbW92YWxQb2xpY3k/OiBcIkRFU1RST1lcIiB8IFwiUkVUQUlOXCIgfCBcIlNOQVBTSE9UXCI7XG59XG5cbmZ1bmN0aW9uIHRvQXR0cmlidXRlVHlwZSh0eXBlOiBEeW5hbW9EQkF0dHJpYnV0ZVR5cGUpOiBBdHRyaWJ1dGVUeXBlIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcIlNcIjpcbiAgICAgIHJldHVybiBBdHRyaWJ1dGVUeXBlLlNUUklORztcbiAgICBjYXNlIFwiTlwiOlxuICAgICAgcmV0dXJuIEF0dHJpYnV0ZVR5cGUuTlVNQkVSO1xuICAgIGNhc2UgXCJCXCI6XG4gICAgICByZXR1cm4gQXR0cmlidXRlVHlwZS5CSU5BUlk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9CaWxsaW5nTW9kZShtb2RlPzogXCJQQVlfUEVSX1JFUVVFU1RcIiB8IFwiUFJPVklTSU9ORURcIik6IEJpbGxpbmdNb2RlIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSBcIlBST1ZJU0lPTkVEXCI6XG4gICAgICByZXR1cm4gQmlsbGluZ01vZGUuUFJPVklTSU9ORUQ7XG4gICAgY2FzZSBcIlBBWV9QRVJfUkVRVUVTVFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNUO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU3RyZWFtVmlld1R5cGUoXG4gIHN0cmVhbT86IFwiTkVXX0lNQUdFXCIgfCBcIk9MRF9JTUFHRVwiIHwgXCJORVdfQU5EX09MRF9JTUFHRVNcIiB8IFwiS0VZU19PTkxZXCJcbik6IFN0cmVhbVZpZXdUeXBlIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoIChzdHJlYW0pIHtcbiAgICBjYXNlIFwiTkVXX0lNQUdFXCI6XG4gICAgICByZXR1cm4gU3RyZWFtVmlld1R5cGUuTkVXX0lNQUdFO1xuICAgIGNhc2UgXCJPTERfSU1BR0VcIjpcbiAgICAgIHJldHVybiBTdHJlYW1WaWV3VHlwZS5PTERfSU1BR0U7XG4gICAgY2FzZSBcIk5FV19BTkRfT0xEX0lNQUdFU1wiOlxuICAgICAgcmV0dXJuIFN0cmVhbVZpZXdUeXBlLk5FV19BTkRfT0xEX0lNQUdFUztcbiAgICBjYXNlIFwiS0VZU19PTkxZXCI6XG4gICAgICByZXR1cm4gU3RyZWFtVmlld1R5cGUuS0VZU19PTkxZO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUHJvamVjdGlvblR5cGUoXG4gIHR5cGU/OiBcIkFMTFwiIHwgXCJLRVlTX09OTFlcIiB8IFwiSU5DTFVERVwiXG4pOiBQcm9qZWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJBTExcIjpcbiAgICAgIHJldHVybiBQcm9qZWN0aW9uVHlwZS5BTEw7XG4gICAgY2FzZSBcIktFWVNfT05MWVwiOlxuICAgICAgcmV0dXJuIFByb2plY3Rpb25UeXBlLktFWVNfT05MWTtcbiAgICBjYXNlIFwiSU5DTFVERVwiOlxuICAgICAgcmV0dXJuIFByb2plY3Rpb25UeXBlLklOQ0xVREU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIER5bmFtb0RCVGFibGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0YWJsZTogVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IER5bmFtb0RCVGFibGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgdGhpcy50YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBgJHtpZH1UYWJsZWAsIHtcbiAgICAgIHRhYmxlTmFtZTogcHJvcHMudGFibGVOYW1lLFxuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6IHByb3BzLnBhcnRpdGlvbktleS5uYW1lLFxuICAgICAgICB0eXBlOiB0b0F0dHJpYnV0ZVR5cGUocHJvcHMucGFydGl0aW9uS2V5LnR5cGUpXG4gICAgICB9LFxuICAgICAgc29ydEtleTogcHJvcHMuc29ydEtleVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG5hbWU6IHByb3BzLnNvcnRLZXkubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHRvQXR0cmlidXRlVHlwZShwcm9wcy5zb3J0S2V5LnR5cGUpXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGJpbGxpbmdNb2RlOiB0b0JpbGxpbmdNb2RlKHByb3BzLmJpbGxpbmdNb2RlKSxcbiAgICAgIHJlYWRDYXBhY2l0eTpcbiAgICAgICAgcHJvcHMuYmlsbGluZ01vZGUgPT09IFwiUFJPVklTSU9ORURcIiA/IHByb3BzLnJlYWRDYXBhY2l0eSA6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRlQ2FwYWNpdHk6XG4gICAgICAgIHByb3BzLmJpbGxpbmdNb2RlID09PSBcIlBST1ZJU0lPTkVEXCIgPyBwcm9wcy53cml0ZUNhcGFjaXR5IDogdW5kZWZpbmVkLFxuICAgICAgc3RyZWFtOiB0b1N0cmVhbVZpZXdUeXBlKHByb3BzLnN0cmVhbSksXG4gICAgICBwb2ludEluVGltZVJlY292ZXJ5OiBwcm9wcy5wb2ludEluVGltZVJlY292ZXJ5ID8/IHRydWUsXG4gICAgICByZW1vdmFsUG9saWN5OiB0b1JlbW92YWxQb2xpY3kocHJvcHMucmVtb3ZhbFBvbGljeSksXG4gICAgICB0aW1lVG9MaXZlQXR0cmlidXRlOiBwcm9wcy50aW1lVG9MaXZlQXR0cmlidXRlXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcykge1xuICAgICAgZm9yIChjb25zdCBnc2kgb2YgcHJvcHMuZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcykge1xuICAgICAgICBjb25zdCBnc2lQcm9wczogR2xvYmFsU2Vjb25kYXJ5SW5kZXhQcm9wcyA9IHtcbiAgICAgICAgICBpbmRleE5hbWU6IGdzaS5pbmRleE5hbWUsXG4gICAgICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgICAgICBuYW1lOiBnc2kucGFydGl0aW9uS2V5Lm5hbWUsXG4gICAgICAgICAgICB0eXBlOiB0b0F0dHJpYnV0ZVR5cGUoZ3NpLnBhcnRpdGlvbktleS50eXBlKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc29ydEtleTogZ3NpLnNvcnRLZXlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGdzaS5zb3J0S2V5Lm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogdG9BdHRyaWJ1dGVUeXBlKGdzaS5zb3J0S2V5LnR5cGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHByb2plY3Rpb25UeXBlOiB0b1Byb2plY3Rpb25UeXBlKGdzaS5wcm9qZWN0aW9uVHlwZSksXG4gICAgICAgICAgbm9uS2V5QXR0cmlidXRlczogZ3NpLm5vbktleUF0dHJpYnV0ZXNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50YWJsZS5hZGRHbG9iYWxTZWNvbmRhcnlJbmRleChnc2lQcm9wcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1UYWJsZU5hbWVgLCB7XG4gICAgICBrZXk6IGAke2lkfVRhYmxlTmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYER5bmFtb0RCIHRhYmxlIG5hbWUgZm9yICR7aWR9YFxuICAgIH0pO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1UYWJsZUFybmAsIHtcbiAgICAgIGtleTogYCR7aWR9VGFibGVBcm5gLFxuICAgICAgdmFsdWU6IHRoaXMudGFibGUudGFibGVBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYER5bmFtb0RCIHRhYmxlIEFSTiBmb3IgJHtpZH1gXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuc3RyZWFtKSB7XG4gICAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfVRhYmxlU3RyZWFtQXJuYCwge1xuICAgICAgICBrZXk6IGAke2lkfVRhYmxlU3RyZWFtQXJuYCxcbiAgICAgICAgdmFsdWU6IHRoaXMudGFibGUudGFibGVTdHJlYW1Bcm4gfHwgXCJcIixcbiAgICAgICAgZGVzY3JpcHRpb246IGBEeW5hbW9EQiB0YWJsZSBzdHJlYW0gQVJOIGZvciAke2lkfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIER5bmFtb0RCIHRhYmxlIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUudGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgRHluYW1vREIgdGFibGUgQVJOLlxuICAgKi9cbiAgcHVibGljIGdldFRhYmxlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUudGFibGVBcm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBEeW5hbW9EQiB0YWJsZSBzdHJlYW0gQVJOIChpZiBzdHJlYW1pbmcgaXMgZW5hYmxlZCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFibGVTdHJlYW1Bcm4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS50YWJsZVN0cmVhbUFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgQ0RLIFRhYmxlIGNvbnN0cnVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXRUYWJsZSgpOiBJVGFibGUge1xuICAgIHJldHVybiB0aGlzLnRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRSZWFkRGF0YShncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgZ3JhbnRlZS5cbiAgICovXG4gIHB1YmxpYyBncmFudFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMudGFibGUuZ3JhbnRXcml0ZURhdGEoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBhbmQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIGdyYW50ZWUuXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFJlYWRXcml0ZURhdGEoZ3JhbnRlZSk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgZnVsbCBhY2Nlc3MgKHJlYWQsIHdyaXRlLCBkZWxldGUpIHRvIHRoZSBncmFudGVlLlxuICAgKi9cbiAgcHVibGljIGdyYW50RnVsbEFjY2VzcyhncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLmdyYW50RnVsbEFjY2VzcyhncmFudGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBzdHJlYW0gcmVhZCBwZXJtaXNzaW9ucyB0byB0aGUgZ3JhbnRlZS5cbiAgICovXG4gIHB1YmxpYyBncmFudFN0cmVhbVJlYWQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZS5ncmFudFN0cmVhbVJlYWQoZ3JhbnRlZSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,4 +1,10 @@
1
- export * from "./database";
1
+ import { DatabaseInsightsMode, PerformanceInsightRetention } from "aws-cdk-lib/aws-rds";
2
+ export * from "./dynamodb";
2
3
  export * from "./rdsAurora";
4
+ export * from "./rdsAuroraGlobal";
5
+ export * from "./rdsDefaults";
6
+ export * from "./rdsHelpers";
3
7
  export * from "./rdsInstance";
4
- export * from "./dynamodb";
8
+ export * from "./rdsProxyOutput";
9
+ export declare function getDatabaseInsightsRetention(mode: "standard" | "advanced"): PerformanceInsightRetention;
10
+ export declare function getCdkDatabaseInsightsMode(mode: "standard" | "advanced"): DatabaseInsightsMode;
@@ -14,8 +14,24 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./database"), exports);
17
+ exports.getDatabaseInsightsRetention = getDatabaseInsightsRetention;
18
+ exports.getCdkDatabaseInsightsMode = getCdkDatabaseInsightsMode;
19
+ const aws_rds_1 = require("aws-cdk-lib/aws-rds");
20
+ __exportStar(require("./dynamodb"), exports);
18
21
  __exportStar(require("./rdsAurora"), exports);
22
+ __exportStar(require("./rdsAuroraGlobal"), exports);
23
+ __exportStar(require("./rdsDefaults"), exports);
24
+ __exportStar(require("./rdsHelpers"), exports);
19
25
  __exportStar(require("./rdsInstance"), exports);
20
- __exportStar(require("./dynamodb"), exports);
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QixnREFBOEI7QUFDOUIsNkNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jkc0F1cm9yYVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzSW5zdGFuY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2R5bmFtb2RiXCI7XG4iXX0=
26
+ __exportStar(require("./rdsProxyOutput"), exports);
27
+ function getDatabaseInsightsRetention(mode) {
28
+ return mode === "advanced"
29
+ ? aws_rds_1.PerformanceInsightRetention.MONTHS_15
30
+ : aws_rds_1.PerformanceInsightRetention.DEFAULT;
31
+ }
32
+ function getCdkDatabaseInsightsMode(mode) {
33
+ return mode === "advanced"
34
+ ? aws_rds_1.DatabaseInsightsMode.ADVANCED
35
+ : aws_rds_1.DatabaseInsightsMode.STANDARD;
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBYUEsb0VBTUM7QUFFRCxnRUFNQztBQTNCRCxpREFHNkI7QUFFN0IsNkNBQTJCO0FBQzNCLDhDQUE0QjtBQUM1QixvREFBa0M7QUFDbEMsZ0RBQThCO0FBQzlCLCtDQUE2QjtBQUM3QixnREFBOEI7QUFDOUIsbURBQWlDO0FBRWpDLFNBQWdCLDRCQUE0QixDQUMxQyxJQUE2QjtJQUU3QixPQUFPLElBQUksS0FBSyxVQUFVO1FBQ3hCLENBQUMsQ0FBQyxxQ0FBMkIsQ0FBQyxTQUFTO1FBQ3ZDLENBQUMsQ0FBQyxxQ0FBMkIsQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQWdCLDBCQUEwQixDQUN4QyxJQUE2QjtJQUU3QixPQUFPLElBQUksS0FBSyxVQUFVO1FBQ3hCLENBQUMsQ0FBQyw4QkFBb0IsQ0FBQyxRQUFRO1FBQy9CLENBQUMsQ0FBQyw4QkFBb0IsQ0FBQyxRQUFRLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERhdGFiYXNlSW5zaWdodHNNb2RlLFxuICBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb25cbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZHluYW1vZGJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jkc0F1cm9yYVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzQXVyb3JhR2xvYmFsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZHNEZWZhdWx0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzSGVscGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmRzSW5zdGFuY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jkc1Byb3h5T3V0cHV0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhYmFzZUluc2lnaHRzUmV0ZW50aW9uKFxuICBtb2RlOiBcInN0YW5kYXJkXCIgfCBcImFkdmFuY2VkXCJcbik6IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbiB7XG4gIHJldHVybiBtb2RlID09PSBcImFkdmFuY2VkXCJcbiAgICA/IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMTVcbiAgICA6IFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5ERUZBVUxUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RrRGF0YWJhc2VJbnNpZ2h0c01vZGUoXG4gIG1vZGU6IFwic3RhbmRhcmRcIiB8IFwiYWR2YW5jZWRcIlxuKTogRGF0YWJhc2VJbnNpZ2h0c01vZGUge1xuICByZXR1cm4gbW9kZSA9PT0gXCJhZHZhbmNlZFwiXG4gICAgPyBEYXRhYmFzZUluc2lnaHRzTW9kZS5BRFZBTkNFRFxuICAgIDogRGF0YWJhc2VJbnNpZ2h0c01vZGUuU1RBTkRBUkQ7XG59XG4iXX0=
@@ -3,7 +3,7 @@ import { Connections, type IConnectable, type IVpc } from "aws-cdk-lib/aws-ec2";
3
3
  import { DatabaseCluster, type CfnDBCluster, type IClusterEngine } from "aws-cdk-lib/aws-rds";
4
4
  import { Construct } from "constructs";
5
5
  import { Secret } from "../secrets";
6
- import { type EngineConfig, type ProxyConfig, type CredentialsConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig, type PerformanceInsightsConfig } from "../../../patterns/aws/database";
6
+ import { type EngineConfig, type ProxyConfig, type CredentialsConfig, type AuroraEncryptionConfig, type AuroraWriterConfig, type AuroraReadersConfig, type DatabaseInsightsConfig } from "../../../utils/databaseTypes";
7
7
  interface RdsProps {
8
8
  vpc: IVpc;
9
9
  databaseName?: string;
@@ -19,7 +19,7 @@ interface RdsProps {
19
19
  monitoringInterval?: Duration;
20
20
  preferredMaintenanceWindow?: string;
21
21
  port?: number;
22
- performanceInsights?: PerformanceInsightsConfig | false;
22
+ databaseInsights?: DatabaseInsightsConfig | false;
23
23
  /** Skips secret rotation for secondary clusters in global database */
24
24
  isGlobalSecondary?: boolean;
25
25
  secretReplicaRegions?: string[];
@@ -62,6 +62,5 @@ export declare class RdsAurora extends Construct implements IConnectable {
62
62
  getCredentials(): Secret;
63
63
  getCfnCluster(): CfnDBCluster | undefined;
64
64
  getDatabaseCluster(): DatabaseCluster;
65
- private getPerformanceInsightRetention;
66
65
  }
67
66
  export {};