@fjall/components-infrastructure 0.87.20 → 0.88.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/lib/app.d.ts +13 -17
  2. package/dist/lib/app.js +56 -40
  3. package/dist/lib/config/aws/accountId.js +1 -2
  4. package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
  5. package/dist/lib/config/aws/costAllocationTags.js +3 -4
  6. package/dist/lib/config/aws/identityCenter.js +1 -2
  7. package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -6
  8. package/dist/lib/config/aws/index.d.ts +0 -1
  9. package/dist/lib/config/aws/index.js +1 -2
  10. package/dist/lib/config/aws/ipamDelegateAdmin.js +1 -2
  11. package/dist/lib/config/aws/ipamPoolId.js +1 -2
  12. package/dist/lib/config/aws/organisationId.js +1 -2
  13. package/dist/lib/config/aws/organisationsAccess.js +1 -2
  14. package/dist/lib/config/aws/ramSharing.js +1 -2
  15. package/dist/lib/patterns/aws/account.d.ts +12 -0
  16. package/dist/lib/patterns/aws/account.js +59 -0
  17. package/dist/lib/patterns/aws/buildkite.js +1 -2
  18. package/dist/lib/patterns/aws/cdn.d.ts +5 -10
  19. package/dist/lib/patterns/aws/cdn.js +5 -13
  20. package/dist/lib/patterns/aws/compute.d.ts +20 -3
  21. package/dist/lib/patterns/aws/compute.js +29 -5
  22. package/dist/lib/patterns/aws/database.d.ts +1 -1
  23. package/dist/lib/patterns/aws/database.js +16 -13
  24. package/dist/lib/patterns/aws/index.d.ts +4 -3
  25. package/dist/lib/patterns/aws/index.js +6 -4
  26. package/dist/lib/patterns/aws/interfaces/index.d.ts +2 -1
  27. package/dist/lib/patterns/aws/interfaces/index.js +8 -5
  28. package/dist/lib/patterns/aws/interfaces/organisation.d.ts +22 -0
  29. package/dist/lib/patterns/aws/interfaces/organisation.js +28 -0
  30. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +5 -5
  31. package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
  32. package/dist/lib/patterns/aws/interfaces/storage.d.ts +10 -120
  33. package/dist/lib/patterns/aws/interfaces/storage.js +6 -43
  34. package/dist/lib/patterns/aws/organisation.d.ts +51 -0
  35. package/dist/lib/patterns/aws/organisation.js +150 -0
  36. package/dist/lib/patterns/aws/organisationFactory.d.ts +20 -0
  37. package/dist/lib/patterns/aws/organisationFactory.js +24 -0
  38. package/dist/lib/patterns/aws/pattern.d.ts +1 -1
  39. package/dist/lib/patterns/aws/pattern.js +1 -1
  40. package/dist/lib/patterns/aws/payload.d.ts +6 -5
  41. package/dist/lib/patterns/aws/payload.js +92 -42
  42. package/dist/lib/patterns/aws/platform.d.ts +11 -0
  43. package/dist/lib/patterns/aws/platform.js +29 -0
  44. package/dist/lib/patterns/aws/storage.d.ts +40 -125
  45. package/dist/lib/patterns/aws/storage.js +63 -191
  46. package/dist/lib/resources/aws/compute/ec2.d.ts +1 -1
  47. package/dist/lib/resources/aws/compute/ec2.js +3 -4
  48. package/dist/lib/resources/aws/compute/ecs.d.ts +6 -9
  49. package/dist/lib/resources/aws/compute/ecs.js +58 -26
  50. package/dist/lib/resources/aws/compute/lambda.d.ts +2 -0
  51. package/dist/lib/resources/aws/compute/lambda.js +11 -6
  52. package/dist/lib/resources/aws/database/rdsAurora.d.ts +1 -0
  53. package/dist/lib/resources/aws/database/rdsAurora.js +16 -16
  54. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +1 -0
  55. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +14 -10
  56. package/dist/lib/resources/aws/database/rdsInstance.d.ts +5 -4
  57. package/dist/lib/resources/aws/database/rdsInstance.js +18 -7
  58. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -2
  59. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -2
  60. package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -4
  61. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -4
  62. package/dist/lib/resources/aws/index.d.ts +1 -0
  63. package/dist/lib/resources/aws/index.js +2 -1
  64. package/dist/lib/resources/aws/logging/cloudTrail.js +7 -4
  65. package/dist/lib/resources/aws/networking/ipamPool.js +21 -3
  66. package/dist/lib/resources/aws/organisation/index.d.ts +4 -0
  67. package/dist/lib/resources/aws/organisation/index.js +10 -0
  68. package/dist/lib/resources/aws/organisation/organisation.d.ts +12 -0
  69. package/dist/lib/resources/aws/organisation/organisation.js +14 -0
  70. package/dist/lib/resources/aws/organisation/organisationAccount.d.ts +18 -0
  71. package/dist/lib/resources/aws/organisation/organisationAccount.js +31 -0
  72. package/dist/lib/resources/aws/organisation/organisationPolicy.d.ts +13 -0
  73. package/dist/lib/resources/aws/organisation/organisationPolicy.js +32 -0
  74. package/dist/lib/resources/aws/organisation/organisationalUnit.d.ts +10 -0
  75. package/dist/lib/resources/aws/organisation/organisationalUnit.js +9 -0
  76. package/dist/lib/resources/aws/secrets/kms.js +10 -7
  77. package/dist/lib/resources/aws/secrets/parameter.js +1 -2
  78. package/dist/lib/resources/aws/storage/ecr.d.ts +3 -1
  79. package/dist/lib/resources/aws/storage/ecr.js +5 -3
  80. package/dist/lib/resources/aws/storage/s3.d.ts +6 -39
  81. package/dist/lib/resources/aws/storage/s3.js +31 -34
  82. package/dist/lib/utils/capitaliseString.d.ts +12 -0
  83. package/dist/lib/utils/capitaliseString.js +30 -0
  84. package/dist/lib/utils/capitalizeString.d.ts +11 -0
  85. package/dist/lib/utils/capitalizeString.js +24 -1
  86. package/dist/lib/utils/getConfig.d.ts +1 -0
  87. package/dist/lib/utils/getConfig.js +9 -1
  88. package/dist/lib/utils/index.d.ts +1 -0
  89. package/dist/lib/utils/index.js +2 -1
  90. package/dist/lib/utils/resourceNaming.d.ts +22 -19
  91. package/dist/lib/utils/resourceNaming.js +42 -35
  92. package/package.json +3 -4
@@ -3,158 +3,73 @@ import { type IBucket, type EventType, type IBucketNotificationDestination, type
3
3
  import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
4
4
  import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
5
5
  import type App from "../../app";
6
- import { S3Bucket, S3WebsiteBucket, S3PublicReadBucket, type BackupVaultTier } from "../../resources/aws/storage";
7
- import { type StorageType, type IPrivateStorage, type IWebsiteStorage, type IPublicStorage } from "./interfaces/storage.js";
6
+ import { type BackupVaultTier, type WebsiteHostingConfig } from "../../resources/aws/storage";
7
+ import { type IStorage } from "./interfaces/storage.js";
8
8
  import { type IStorageConnector } from "./interfaces/connector.js";
9
- export { type StorageType, type IStorage, type IPrivateStorage, type IWebsiteStorage, type IPublicStorage, type AnyStorage, isPrivateStorage, isWebsiteStorage, isPublicStorage } from "./interfaces/storage.js";
10
- export type S3BucketType = "private" | "website" | "publicRead";
11
- export interface StorageTypeConfig {
12
- supportsPublicRead: boolean;
13
- supportsWebsiteHosting: boolean;
14
- defaultPublicAccess: boolean;
9
+ export { type IStorage, isStorage } from "./interfaces/storage.js";
10
+ export { type WebsiteHostingConfig } from "../../resources/aws/storage";
11
+ export interface CorsRule {
12
+ readonly allowedOrigins: string[];
13
+ readonly allowedMethods: string[];
14
+ readonly allowedHeaders?: string[];
15
+ readonly exposedHeaders?: string[];
16
+ readonly maxAge?: number;
15
17
  }
16
- export declare const STORAGE_TYPE_CONFIG: Record<S3BucketType, StorageTypeConfig>;
17
- export declare function getStorageTypeConfig(type: S3BucketType): StorageTypeConfig;
18
- type BaseS3Props = {
19
- backupVaultTier?: BackupVaultTier;
20
- versioned?: boolean;
21
- encryption?: "AES256" | "KMS";
22
- kmsKeyArn?: string;
23
- };
24
- /**
25
- * Configuration for automatic asset deployment to S3.
26
- * When provided, creates a BucketDeployment that uploads files during CDK deploy.
27
- */
28
18
  export interface S3DeploymentConfig {
29
19
  /** Path to the asset directory (relative to CDK app root) */
30
20
  source: string;
31
- /**
32
- * Whether to remove files from bucket that aren't in the source.
33
- * Default: true for static assets, false for caches that grow at runtime.
34
- */
21
+ /** Whether to remove files from bucket that are not in the source. Default: true */
35
22
  prune?: boolean;
36
- /**
37
- * Cache control settings for uploaded files.
38
- * If not provided, no cache headers are set.
39
- */
23
+ /** Cache control settings for uploaded files */
40
24
  cacheControl?: {
41
25
  /** Max age in seconds (e.g., 31536000 for 1 year) */
42
26
  maxAge?: number;
43
- /** Mark as immutable (browser won't revalidate) */
27
+ /** Mark as immutable (browser will not revalidate) */
44
28
  immutable?: boolean;
45
29
  };
46
30
  }
47
- export interface PrivateS3Props extends BaseS3Props {
48
- bucketType: "private";
49
- publicReadAccess?: boolean;
50
- /**
51
- * Optional deployment configuration.
52
- * When provided, automatically uploads files to the bucket during CDK deploy.
53
- */
54
- deployment?: S3DeploymentConfig;
55
- }
56
- export interface WebsiteS3Props extends BaseS3Props {
57
- bucketType: "website";
58
- websiteIndexDocument?: string;
59
- websiteErrorDocument?: string;
60
- cors?: Array<{
61
- allowedOrigins: string[];
62
- allowedMethods: string[];
63
- }>;
31
+ export interface S3Props {
32
+ readonly bucketName?: string;
33
+ readonly publicReadAccess?: boolean;
34
+ readonly websiteHosting?: WebsiteHostingConfig;
35
+ readonly versioned?: boolean;
36
+ readonly encryption?: "AES256" | "KMS";
37
+ readonly kmsKeyArn?: string;
38
+ readonly backupVaultTier?: BackupVaultTier;
39
+ readonly cors?: CorsRule[];
40
+ readonly deployment?: S3DeploymentConfig;
64
41
  }
65
- export interface PublicReadS3Props extends BaseS3Props {
66
- bucketType: "publicRead";
67
- }
68
- export type IS3Props = PrivateS3Props | WebsiteS3Props | PublicReadS3Props;
69
- /**
70
- * Factory for creating S3 storage resources with type-safe return types.
71
- *
72
- * @example
73
- * // Private bucket
74
- * const assets = app.addStorage(StorageFactory.build("Assets", { bucketType: "private" }));
75
- * assets.grantPublicAccess(); // ✓ Available on PrivateStorage
76
- *
77
- * // Website bucket
78
- * const site = app.addStorage(StorageFactory.build("Site", { bucketType: "website" }));
79
- * site.getWebsiteUrl(); // ✓ Available on WebsiteStorage
80
- */
81
- export declare class StorageFactory {
82
- /** Build a private storage bucket */
83
- static build(id: string, props: PrivateS3Props): (app: App, scope: Construct) => PrivateStorage;
84
- /** Build a website storage bucket */
85
- static build(id: string, props: WebsiteS3Props): (app: App, scope: Construct) => WebsiteStorage;
86
- /** Build a public read storage bucket */
87
- static build(id: string, props: PublicReadS3Props): (app: App, scope: Construct) => PublicStorage;
42
+ export interface StorageBuildProps extends S3Props {
43
+ readonly stackPlacement?: "storage" | "cdn" | "compute";
88
44
  }
89
- /**
90
- * Base S3 storage class.
91
- * Specific storage types (PrivateStorage, WebsiteStorage, PublicStorage) extend this.
92
- */
93
- declare abstract class S3StorageBase extends Construct implements IStorageConnector {
94
- readonly id: string;
95
- readonly scope: Construct;
96
- /** The type of storage resource. Used for runtime type narrowing. */
97
- abstract readonly storageType: StorageType;
98
- /** The connector type for unified connection processing. */
45
+ export type StorageFactoryFn = ((app: App, scope: Construct) => Storage) & {
46
+ stackPlacement?: "storage" | "cdn" | "compute";
47
+ };
48
+ export declare function validateStorageProps(props: S3Props): void;
49
+ export declare class Storage extends Construct implements IStorage, IStorageConnector {
99
50
  readonly connectorType: "storage";
100
- protected bucket: S3Bucket | S3WebsiteBucket | S3PublicReadBucket;
101
- protected _bucketType: S3BucketType;
102
- constructor(scope: Construct, id: string, props: IS3Props);
103
- protected initialisePrivateBucket(props: PrivateS3Props): void;
104
- protected initialiseWebsiteBucket(props: WebsiteS3Props): void;
105
- protected initialisePublicReadBucket(props: PublicReadS3Props): void;
106
- protected addOutputs(): void;
51
+ private readonly bucket;
52
+ private readonly bucketDeployment?;
53
+ constructor(scope: Construct, id: string, props: S3Props);
54
+ private createDeployment;
55
+ private addOutputs;
107
56
  getBucket(): IBucket;
108
57
  getBucketName(): string;
109
58
  getBucketArn(): string;
110
- getBucketType(): S3BucketType;
111
59
  getBucketDomainName(): string;
112
60
  getBucketRegionalDomainName(): string;
113
- getS3Bucket(): S3Bucket | S3WebsiteBucket | S3PublicReadBucket;
61
+ getWebsiteUrl(): string | undefined;
62
+ getDeployment(): BucketDeployment | undefined;
114
63
  grantRead(grantee: IGrantable): Grant;
115
64
  grantWrite(grantee: IGrantable): Grant;
116
65
  grantReadWrite(grantee: IGrantable): Grant;
117
66
  grantDelete(grantee: IGrantable): Grant;
118
67
  grantPut(grantee: IGrantable): Grant;
68
+ grantPublicAccess(...keyPrefix: string[]): Grant;
119
69
  addEventNotification(event: EventType, dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
120
70
  addObjectCreatedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
121
71
  addObjectRemovedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
122
72
  }
123
- /**
124
- * Private S3 storage.
125
- * Standard bucket with optional encryption and versioning.
126
- */
127
- export declare class PrivateStorage extends S3StorageBase implements IPrivateStorage {
128
- readonly storageType: "private";
129
- private _deployment?;
130
- constructor(scope: Construct, id: string, props: PrivateS3Props);
131
- private createDeployment;
132
- /**
133
- * Grant public access to objects under a prefix.
134
- * Use with caution - makes objects publicly readable.
135
- */
136
- grantPublicAccess(...keyPrefix: string[]): Grant;
137
- /**
138
- * Get the BucketDeployment construct if one was created.
139
- * Returns undefined if no deployment was configured.
140
- */
141
- getDeployment(): BucketDeployment | undefined;
142
- }
143
- /**
144
- * Website S3 storage.
145
- * Bucket configured for static website hosting.
146
- */
147
- export declare class WebsiteStorage extends S3StorageBase implements IWebsiteStorage {
148
- readonly storageType: "website";
149
- constructor(scope: Construct, id: string, props: WebsiteS3Props);
150
- /** Get the website URL. */
151
- getWebsiteUrl(): string;
152
- }
153
- /**
154
- * Public read S3 storage.
155
- * Bucket with public read access enabled.
156
- */
157
- export declare class PublicStorage extends S3StorageBase implements IPublicStorage {
158
- readonly storageType: "publicRead";
159
- constructor(scope: Construct, id: string, props: PublicReadS3Props);
73
+ export declare class StorageFactory {
74
+ static build(id: string, props?: StorageBuildProps): StorageFactoryFn;
160
75
  }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PublicStorage = exports.WebsiteStorage = exports.PrivateStorage = exports.StorageFactory = exports.STORAGE_TYPE_CONFIG = exports.isPublicStorage = exports.isWebsiteStorage = exports.isPrivateStorage = void 0;
4
- exports.getStorageTypeConfig = getStorageTypeConfig;
3
+ exports.StorageFactory = exports.Storage = exports.isStorage = void 0;
4
+ exports.validateStorageProps = validateStorageProps;
5
5
  const constructs_1 = require("constructs");
6
6
  const aws_s3_1 = require("aws-cdk-lib/aws-s3");
7
7
  const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
@@ -9,11 +9,8 @@ const aws_kms_1 = require("aws-cdk-lib/aws-kms");
9
9
  const aws_cdk_lib_1 = require("aws-cdk-lib");
10
10
  const storage_1 = require("../../resources/aws/storage");
11
11
  const validationLogger_js_1 = require("../../utils/validationLogger.js");
12
- // Re-export interfaces and type guards
13
12
  var storage_js_1 = require("./interfaces/storage.js");
14
- Object.defineProperty(exports, "isPrivateStorage", { enumerable: true, get: function () { return storage_js_1.isPrivateStorage; } });
15
- Object.defineProperty(exports, "isWebsiteStorage", { enumerable: true, get: function () { return storage_js_1.isWebsiteStorage; } });
16
- Object.defineProperty(exports, "isPublicStorage", { enumerable: true, get: function () { return storage_js_1.isPublicStorage; } });
13
+ Object.defineProperty(exports, "isStorage", { enumerable: true, get: function () { return storage_js_1.isStorage; } });
17
14
  function toBucketEncryption(encryption) {
18
15
  if (!encryption)
19
16
  return undefined;
@@ -36,143 +33,74 @@ function toCorsRules(cors) {
36
33
  return undefined;
37
34
  return cors.map((rule) => ({
38
35
  allowedOrigins: rule.allowedOrigins,
39
- allowedMethods: rule.allowedMethods.map(toHttpMethod)
36
+ allowedMethods: rule.allowedMethods.map(toHttpMethod),
37
+ ...(rule.allowedHeaders && { allowedHeaders: rule.allowedHeaders }),
38
+ ...(rule.exposedHeaders && { exposedHeaders: rule.exposedHeaders }),
39
+ ...(rule.maxAge !== undefined && { maxAge: rule.maxAge })
40
40
  }));
41
41
  }
42
- exports.STORAGE_TYPE_CONFIG = {
43
- private: {
44
- supportsPublicRead: true,
45
- supportsWebsiteHosting: false,
46
- defaultPublicAccess: false
47
- },
48
- website: {
49
- supportsPublicRead: true,
50
- supportsWebsiteHosting: true,
51
- defaultPublicAccess: true
52
- },
53
- publicRead: {
54
- supportsPublicRead: true,
55
- supportsWebsiteHosting: false,
56
- defaultPublicAccess: true
57
- }
58
- };
59
- function getStorageTypeConfig(type) {
60
- return exports.STORAGE_TYPE_CONFIG[type];
61
- }
62
- /**
63
- * Validates storage props and logs warnings for ignored or misconfigured options.
64
- * These checks help catch issues when props come from dynamic sources where
65
- * TypeScript's compile-time checks may not apply.
66
- */
67
42
  function validateStorageProps(props) {
68
- // Validate encryption: KMS requires kmsKeyArn
69
43
  if (props.encryption === "KMS" && !props.kmsKeyArn) {
70
44
  validationLogger_js_1.FjallLogger.warn("'encryption' is set to 'KMS' but 'kmsKeyArn' is not provided. " +
71
45
  "The bucket will use the default AWS managed key.");
72
46
  }
73
- // Warn about kmsKeyArn when encryption is not KMS
74
47
  if (props.kmsKeyArn && props.encryption !== "KMS") {
75
48
  validationLogger_js_1.FjallLogger.warn("'kmsKeyArn' is provided but 'encryption' is not set to 'KMS'. " +
76
49
  "The KMS key will be ignored. Set encryption: 'KMS' to use the key.");
77
50
  }
78
- // Website-only options on non-website buckets
79
- // Note: Using bucketType as discriminator with "type" alias for the helper
80
- const propsWithType = { ...props, type: props.bucketType };
81
- (0, validationLogger_js_1.warnIfPropertiesIgnored)(propsWithType, ["websiteIndexDocument", "websiteErrorDocument", "cors"], "website", "website bucket");
82
- // Private-only options on non-private buckets
83
- (0, validationLogger_js_1.warnIfPropertiesIgnored)(propsWithType, ["publicReadAccess"], "private", "private bucket");
84
- }
85
- /**
86
- * Factory for creating S3 storage resources with type-safe return types.
87
- *
88
- * @example
89
- * // Private bucket
90
- * const assets = app.addStorage(StorageFactory.build("Assets", { bucketType: "private" }));
91
- * assets.grantPublicAccess(); // ✓ Available on PrivateStorage
92
- *
93
- * // Website bucket
94
- * const site = app.addStorage(StorageFactory.build("Site", { bucketType: "website" }));
95
- * site.getWebsiteUrl(); // ✓ Available on WebsiteStorage
96
- */
97
- class StorageFactory {
98
- /** Implementation - returns appropriate storage type based on props */
99
- static build(id, props) {
100
- return (_app, scope) => {
101
- validateStorageProps(props);
102
- switch (props.bucketType) {
103
- case "private":
104
- return new PrivateStorage(scope, id, props);
105
- case "website":
106
- return new WebsiteStorage(scope, id, props);
107
- case "publicRead":
108
- return new PublicStorage(scope, id, props);
109
- default: {
110
- const _exhaustive = props;
111
- throw new Error(`Unsupported bucket type: ${_exhaustive.bucketType}`);
112
- }
113
- }
114
- };
115
- }
116
51
  }
117
- exports.StorageFactory = StorageFactory;
118
- /**
119
- * Base S3 storage class.
120
- * Specific storage types (PrivateStorage, WebsiteStorage, PublicStorage) extend this.
121
- */
122
- class S3StorageBase extends constructs_1.Construct {
52
+ class Storage extends constructs_1.Construct {
123
53
  constructor(scope, id, props) {
124
54
  super(scope, id);
125
- /** The connector type for unified connection processing. */
126
55
  this.connectorType = "storage";
127
- this.id = id;
128
- this.scope = scope;
129
- this._bucketType = props.bucketType;
130
- }
131
- initialisePrivateBucket(props) {
132
56
  const encryptionKey = props.kmsKeyArn
133
- ? aws_kms_1.Key.fromKeyArn(this, `${this.id}KmsKey`, props.kmsKeyArn)
57
+ ? aws_kms_1.Key.fromKeyArn(this, `${id}KmsKey`, props.kmsKeyArn)
134
58
  : undefined;
135
- this.bucket = new storage_1.S3Bucket(this, `${this.id}Bucket`, {
136
- backupVaultTier: props.backupVaultTier,
59
+ this.bucket = new storage_1.S3Bucket(this, `${id}Bucket`, {
60
+ bucketName: props.bucketName,
137
61
  versioned: props.versioned,
138
62
  encryption: toBucketEncryption(props.encryption),
139
63
  encryptionKey,
140
- publicReadAccess: props.publicReadAccess
141
- });
142
- this.addOutputs();
143
- }
144
- initialiseWebsiteBucket(props) {
145
- this.bucket = new storage_1.S3WebsiteBucket(this, `${this.id}Bucket`, {
146
64
  backupVaultTier: props.backupVaultTier,
147
- versioned: props.versioned,
148
- encryption: toBucketEncryption(props.encryption),
149
- websiteIndexDocument: props.websiteIndexDocument,
150
- websiteErrorDocument: props.websiteErrorDocument,
151
- cors: toCorsRules(props.cors)
65
+ publicReadAccess: props.publicReadAccess,
66
+ websiteHosting: props.websiteHosting,
67
+ ...(props.cors && { cors: toCorsRules(props.cors) })
152
68
  });
153
- this.addOutputs();
69
+ if (props.deployment) {
70
+ this.bucketDeployment = this.createDeployment(id, props.deployment);
71
+ }
72
+ this.addOutputs(id);
154
73
  }
155
- initialisePublicReadBucket(props) {
156
- this.bucket = new storage_1.S3PublicReadBucket(this, `${this.id}Bucket`, {
157
- backupVaultTier: props.backupVaultTier,
158
- versioned: props.versioned,
159
- encryption: toBucketEncryption(props.encryption)
74
+ createDeployment(id, config) {
75
+ const cacheControlHeaders = [];
76
+ if (config.cacheControl?.maxAge !== undefined) {
77
+ cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(config.cacheControl.maxAge)));
78
+ }
79
+ if (config.cacheControl?.immutable) {
80
+ cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.immutable());
81
+ }
82
+ return new aws_s3_deployment_1.BucketDeployment(this, `${id}Deployment`, {
83
+ sources: [aws_s3_deployment_1.Source.asset(config.source)],
84
+ destinationBucket: this.bucket,
85
+ prune: config.prune ?? true,
86
+ ...(cacheControlHeaders.length > 0 && {
87
+ cacheControl: cacheControlHeaders
88
+ })
160
89
  });
161
- this.addOutputs();
162
90
  }
163
- addOutputs() {
91
+ addOutputs(id) {
164
92
  const stackName = aws_cdk_lib_1.Stack.of(this).stackName;
165
- new aws_cdk_lib_1.CfnOutput(this, `${this.id}BucketArn`, {
166
- key: `${stackName}${this.id}BucketArn`,
167
- exportName: `${stackName}${this.id}BucketArn`,
93
+ new aws_cdk_lib_1.CfnOutput(this, `${id}BucketArn`, {
94
+ key: `${stackName}${id}BucketArn`,
95
+ exportName: `${stackName}${id}BucketArn`,
168
96
  value: this.bucket.bucketArn,
169
- description: `S3 Bucket ARN for ${this.id}`
97
+ description: `S3 Bucket ARN for ${id}`
170
98
  });
171
- new aws_cdk_lib_1.CfnOutput(this, `${this.id}BucketName`, {
172
- key: `${stackName}${this.id}BucketName`,
173
- exportName: `${stackName}${this.id}BucketName`,
99
+ new aws_cdk_lib_1.CfnOutput(this, `${id}BucketName`, {
100
+ key: `${stackName}${id}BucketName`,
101
+ exportName: `${stackName}${id}BucketName`,
174
102
  value: this.bucket.bucketName,
175
- description: `S3 Bucket Name for ${this.id}`
103
+ description: `S3 Bucket Name for ${id}`
176
104
  });
177
105
  }
178
106
  getBucket() {
@@ -184,17 +112,17 @@ class S3StorageBase extends constructs_1.Construct {
184
112
  getBucketArn() {
185
113
  return this.bucket.bucketArn;
186
114
  }
187
- getBucketType() {
188
- return this._bucketType;
189
- }
190
115
  getBucketDomainName() {
191
116
  return this.bucket.bucketDomainName;
192
117
  }
193
118
  getBucketRegionalDomainName() {
194
119
  return this.bucket.bucketRegionalDomainName;
195
120
  }
196
- getS3Bucket() {
197
- return this.bucket;
121
+ getWebsiteUrl() {
122
+ return this.bucket.bucketWebsiteUrl;
123
+ }
124
+ getDeployment() {
125
+ return this.bucketDeployment;
198
126
  }
199
127
  grantRead(grantee) {
200
128
  return this.bucket.grantRead(grantee);
@@ -211,6 +139,9 @@ class S3StorageBase extends constructs_1.Construct {
211
139
  grantPut(grantee) {
212
140
  return this.bucket.grantPut(grantee);
213
141
  }
142
+ grantPublicAccess(...keyPrefix) {
143
+ return this.bucket.grantPublicAccess(...keyPrefix);
144
+ }
214
145
  addEventNotification(event, dest, ...filters) {
215
146
  this.bucket.addEventNotification(event, dest, ...filters);
216
147
  }
@@ -221,78 +152,19 @@ class S3StorageBase extends constructs_1.Construct {
221
152
  this.bucket.addObjectRemovedNotification(dest, ...filters);
222
153
  }
223
154
  }
224
- /**
225
- * Private S3 storage.
226
- * Standard bucket with optional encryption and versioning.
227
- */
228
- class PrivateStorage extends S3StorageBase {
229
- constructor(scope, id, props) {
230
- super(scope, id, props);
231
- this.storageType = "private";
232
- this.initialisePrivateBucket(props);
233
- if (props.deployment) {
234
- this._deployment = this.createDeployment(id, props.deployment);
155
+ exports.Storage = Storage;
156
+ class StorageFactory {
157
+ static build(id, props = {}) {
158
+ const { stackPlacement, ...s3Props } = props;
159
+ const fn = (_app, scope) => {
160
+ validateStorageProps(s3Props);
161
+ return new Storage(scope, id, s3Props);
162
+ };
163
+ if (stackPlacement) {
164
+ fn.stackPlacement = stackPlacement;
235
165
  }
236
- }
237
- createDeployment(id, config) {
238
- const cacheControlHeaders = [];
239
- if (config.cacheControl?.maxAge !== undefined) {
240
- cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(config.cacheControl.maxAge)));
241
- }
242
- if (config.cacheControl?.immutable) {
243
- cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.immutable());
244
- }
245
- return new aws_s3_deployment_1.BucketDeployment(this, `${id}Deployment`, {
246
- sources: [aws_s3_deployment_1.Source.asset(config.source)],
247
- destinationBucket: this.bucket,
248
- prune: config.prune ?? true,
249
- ...(cacheControlHeaders.length > 0 && {
250
- cacheControl: cacheControlHeaders
251
- })
252
- });
253
- }
254
- /**
255
- * Grant public access to objects under a prefix.
256
- * Use with caution - makes objects publicly readable.
257
- */
258
- grantPublicAccess(...keyPrefix) {
259
- return this.bucket.grantPublicAccess(...keyPrefix);
260
- }
261
- /**
262
- * Get the BucketDeployment construct if one was created.
263
- * Returns undefined if no deployment was configured.
264
- */
265
- getDeployment() {
266
- return this._deployment;
166
+ return fn;
267
167
  }
268
168
  }
269
- exports.PrivateStorage = PrivateStorage;
270
- /**
271
- * Website S3 storage.
272
- * Bucket configured for static website hosting.
273
- */
274
- class WebsiteStorage extends S3StorageBase {
275
- constructor(scope, id, props) {
276
- super(scope, id, props);
277
- this.storageType = "website";
278
- this.initialiseWebsiteBucket(props);
279
- }
280
- /** Get the website URL. */
281
- getWebsiteUrl() {
282
- return this.bucket.bucketWebsiteUrl ?? "";
283
- }
284
- }
285
- exports.WebsiteStorage = WebsiteStorage;
286
- /**
287
- * Public read S3 storage.
288
- * Bucket with public read access enabled.
289
- */
290
- class PublicStorage extends S3StorageBase {
291
- constructor(scope, id, props) {
292
- super(scope, id, props);
293
- this.storageType = "publicRead";
294
- this.initialisePublicReadBucket(props);
295
- }
296
- }
297
- exports.PublicStorage = PublicStorage;
298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4R0Esb0RBRUM7QUFoSEQsMkNBQXVDO0FBQ3ZDLCtDQVE0QjtBQUM1QixxRUFJdUM7QUFFdkMsaURBQTBDO0FBQzFDLDZDQUF5RDtBQUd6RCx5REFLcUM7QUFDckMseUVBR3lDO0FBVXpDLHVDQUF1QztBQUN2QyxzREFVaUM7QUFIL0IsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsNkdBQUEsZUFBZSxPQUFBO0FBS2pCLFNBQVMsa0JBQWtCLENBQ3pCLFVBQTJCO0lBRTNCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsT0FBTyxVQUFVLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMseUJBQWdCLENBQUMsVUFBVTtRQUM3QixDQUFDLENBQUMseUJBQWdCLENBQUMsR0FBRyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLE1BQU0sU0FBUyxHQUFnQztRQUM3QyxHQUFHLEVBQUUsb0JBQVcsQ0FBQyxHQUFHO1FBQ3BCLEdBQUcsRUFBRSxvQkFBVyxDQUFDLEdBQUc7UUFDcEIsSUFBSSxFQUFFLG9CQUFXLENBQUMsSUFBSTtRQUN0QixNQUFNLEVBQUUsb0JBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksRUFBRSxvQkFBVyxDQUFDLElBQUk7S0FDdkIsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFXLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsSUFBb0U7SUFFcEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJ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YTtJQUcvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSFYsZ0JBQVcsR0FBRyxTQUFrQixDQUFDO1FBSS9DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQVpELHdDQVlDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsYUFBYTtJQUc5QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdCO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSFYsZ0JBQVcsR0FBRyxZQUFxQixDQUFDO1FBSWxELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUFQRCxzQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElCdWNrZXQsXG4gIHR5cGUgRXZlbnRUeXBlLFxuICB0eXBlIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgdHlwZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIsXG4gIEJ1Y2tldEVuY3J5cHRpb24sXG4gIEh0dHBNZXRob2RzLFxuICB0eXBlIENvcnNSdWxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7XG4gIEJ1Y2tldERlcGxveW1lbnQsXG4gIFNvdXJjZSxcbiAgQ2FjaGVDb250cm9sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHtcbiAgUzNCdWNrZXQsXG4gIFMzV2Vic2l0ZUJ1Y2tldCxcbiAgUzNQdWJsaWNSZWFkQnVja2V0LFxuICB0eXBlIEJhY2t1cFZhdWx0VGllclxufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zdG9yYWdlXCI7XG5pbXBvcnQge1xuICBGamFsbExvZ2dlcixcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWRcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgU3RvcmFnZVR5cGUsXG4gIHR5cGUgSVByaXZhdGVTdG9yYWdlLFxuICB0eXBlIElXZWJzaXRlU3RvcmFnZSxcbiAgdHlwZSBJUHVibGljU3RvcmFnZSxcbiAgdHlwZSBBbnlTdG9yYWdlXG59IGZyb20gXCIuL2ludGVyZmFjZXMvc3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgdHlwZSBJU3RvcmFnZUNvbm5lY3RvciB9IGZyb20gXCIuL2ludGVyZmFjZXMvY29ubmVjdG9yLmpzXCI7XG5cbi8vIFJlLWV4cG9ydCBpbnRlcmZhY2VzIGFuZCB0eXBlIGd1YXJkc1xuZXhwb3J0IHtcbiAgdHlwZSBTdG9yYWdlVHlwZSxcbiAgdHlwZSBJU3RvcmFnZSxcbiAgdHlwZSBJUHJpdmF0ZVN0b3JhZ2UsXG4gIHR5cGUgSVdlYnNpdGVTdG9yYWdlLFxuICB0eXBlIElQdWJsaWNTdG9yYWdlLFxuICB0eXBlIEFueVN0b3JhZ2UsXG4gIGlzUHJpdmF0ZVN0b3JhZ2UsXG4gIGlzV2Vic2l0ZVN0b3JhZ2UsXG4gIGlzUHVibGljU3RvcmFnZVxufSBmcm9tIFwiLi9pbnRlcmZhY2VzL3N0b3JhZ2UuanNcIjtcblxudHlwZSBFbmNyeXB0aW9uVHlwZSA9IFwiQUVTMjU2XCIgfCBcIktNU1wiO1xuXG5mdW5jdGlvbiB0b0J1Y2tldEVuY3J5cHRpb24oXG4gIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uVHlwZVxuKTogQnVja2V0RW5jcnlwdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghZW5jcnlwdGlvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGVuY3J5cHRpb24gPT09IFwiQUVTMjU2XCJcbiAgICA/IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRFxuICAgIDogQnVja2V0RW5jcnlwdGlvbi5LTVM7XG59XG5cbmZ1bmN0aW9uIHRvSHR0cE1ldGhvZChtZXRob2Q6IHN0cmluZyk6IEh0dHBNZXRob2RzIHtcbiAgY29uc3QgbWV0aG9kTWFwOiBSZWNvcmQ8c3RyaW5nLCBIdHRwTWV0aG9kcz4gPSB7XG4gICAgR0VUOiBIdHRwTWV0aG9kcy5HRVQsXG4gICAgUFVUOiBIdHRwTWV0aG9kcy5QVVQsXG4gICAgUE9TVDogSHR0cE1ldGhvZHMuUE9TVCxcbiAgICBERUxFVEU6IEh0dHBNZXRob2RzLkRFTEVURSxcbiAgICBIRUFEOiBIdHRwTWV0aG9kcy5IRUFEXG4gIH07XG4gIHJldHVybiBtZXRob2RNYXBbbWV0aG9kXSA/PyBIdHRwTWV0aG9kcy5HRVQ7XG59XG5cbmZ1bmN0aW9uIHRvQ29yc1J1bGVzKFxuICBjb3JzPzogQXJyYXk8eyBhbGxvd2VkT3JpZ2luczogc3RyaW5nW107IGFsbG93ZWRNZXRob2RzOiBzdHJpbmdbXSB9PlxuKTogQ29yc1J1bGVbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29ycykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGNvcnMubWFwKChydWxlKSA9PiAoe1xuICAgIGFsbG93ZWRPcmlnaW5zOiBydWxlLmFsbG93ZWRPcmlnaW5zLFxuICAgIGFsbG93ZWRNZXRob2RzOiBydWxlLmFsbG93ZWRNZXRob2RzLm1hcCh0b0h0dHBNZXRob2QpXG4gIH0pKTtcbn1cblxuZXhwb3J0IHR5cGUgUzNCdWNrZXRUeXBlID0gXCJwcml2YXRlXCIgfCBcIndlYnNpdGVcIiB8IFwicHVibGljUmVhZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VUeXBlQ29uZmlnIHtcbiAgc3VwcG9ydHNQdWJsaWNSZWFkOiBib29sZWFuO1xuICBzdXBwb3J0c1dlYnNpdGVIb3N0aW5nOiBib29sZWFuO1xuICBkZWZhdWx0UHVibGljQWNjZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9UWVBFX0NPTkZJRzogUmVjb3JkPFMzQnVja2V0VHlwZSwgU3RvcmFnZVR5cGVDb25maWc+ID0ge1xuICBwcml2YXRlOiB7XG4gICAgc3VwcG9ydHNQdWJsaWNSZWFkOiB0cnVlLFxuICAgIHN1cHBvcnRzV2Vic2l0ZUhvc3Rpbmc6IGZhbHNlLFxuICAgIGRlZmF1bHRQdWJsaWNBY2Nlc3M6IGZhbHNlXG4gIH0sXG4gIHdlYnNpdGU6IHtcbiAgICBzdXBwb3J0c1B1YmxpY1JlYWQ6IHRydWUsXG4gICAgc3VwcG9ydHNXZWJzaXRlSG9zdGluZzogdHJ1ZSxcbiAgICBkZWZhdWx0UHVibGljQWNjZXNzOiB0cnVlXG4gIH0sXG4gIHB1YmxpY1JlYWQ6IHtcbiAgICBzdXBwb3J0c1B1YmxpY1JlYWQ6IHRydWUsXG4gICAgc3VwcG9ydHNXZWJzaXRlSG9zdGluZzogZmFsc2UsXG4gICAgZGVmYXVsdFB1YmxpY0FjY2VzczogdHJ1ZVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVR5cGVDb25maWcodHlwZTogUzNCdWNrZXRUeXBlKTogU3RvcmFnZVR5cGVDb25maWcge1xuICByZXR1cm4gU1RPUkFHRV9UWVBFX0NPTkZJR1t0eXBlXTtcbn1cblxudHlwZSBCYXNlUzNQcm9wcyA9IHtcbiAgYmFja3VwVmF1bHRUaWVyPzogQmFja3VwVmF1bHRUaWVyO1xuICB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuICBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCI7XG4gIGttc0tleUFybj86IHN0cmluZztcbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYXV0b21hdGljIGFzc2V0IGRlcGxveW1lbnQgdG8gUzMuXG4gKiBXaGVuIHByb3ZpZGVkLCBjcmVhdGVzIGEgQnVja2V0RGVwbG95bWVudCB0aGF0IHVwbG9hZHMgZmlsZXMgZHVyaW5nIENESyBkZXBsb3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUzNEZXBsb3ltZW50Q29uZmlnIHtcbiAgLyoqIFBhdGggdG8gdGhlIGFzc2V0IGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gQ0RLIGFwcCByb290KSAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVtb3ZlIGZpbGVzIGZyb20gYnVja2V0IHRoYXQgYXJlbid0IGluIHRoZSBzb3VyY2UuXG4gICAqIERlZmF1bHQ6IHRydWUgZm9yIHN0YXRpYyBhc3NldHMsIGZhbHNlIGZvciBjYWNoZXMgdGhhdCBncm93IGF0IHJ1bnRpbWUuXG4gICAqL1xuICBwcnVuZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWNoZSBjb250cm9sIHNldHRpbmdzIGZvciB1cGxvYWRlZCBmaWxlcy5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBubyBjYWNoZSBoZWFkZXJzIGFyZSBzZXQuXG4gICAqL1xuICBjYWNoZUNvbnRyb2w/OiB7XG4gICAgLyoqIE1heCBhZ2UgaW4gc2Vjb25kcyAoZS5nLiwgMzE1MzYwMDAgZm9yIDEgeWVhcikgKi9cbiAgICBtYXhBZ2U/OiBudW1iZXI7XG4gICAgLyoqIE1hcmsgYXMgaW1tdXRhYmxlIChicm93c2VyIHdvbid0IHJldmFsaWRhdGUpICovXG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlUzNQcm9wcyBleHRlbmRzIEJhc2VTM1Byb3BzIHtcbiAgYnVja2V0VHlwZTogXCJwcml2YXRlXCI7XG4gIHB1YmxpY1JlYWRBY2Nlc3M/OiBib29sZWFuO1xuICAvKipcbiAgICogT3B0aW9uYWwgZGVwbG95bWVudCBjb25maWd1cmF0aW9uLlxuICAgKiBXaGVuIHByb3ZpZGVkLCBhdXRvbWF0aWNhbGx5IHVwbG9hZHMgZmlsZXMgdG8gdGhlIGJ1Y2tldCBkdXJpbmcgQ0RLIGRlcGxveS5cbiAgICovXG4gIGRlcGxveW1lbnQ/OiBTM0RlcGxveW1lbnRDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2Vic2l0ZVMzUHJvcHMgZXh0ZW5kcyBCYXNlUzNQcm9wcyB7XG4gIGJ1Y2tldFR5cGU6IFwid2Vic2l0ZVwiO1xuICB3ZWJzaXRlSW5kZXhEb2N1bWVudD86IHN0cmluZztcbiAgd2Vic2l0ZUVycm9yRG9jdW1lbnQ/OiBzdHJpbmc7XG4gIGNvcnM/OiBBcnJheTx7XG4gICAgYWxsb3dlZE9yaWdpbnM6IHN0cmluZ1tdO1xuICAgIGFsbG93ZWRNZXRob2RzOiBzdHJpbmdbXTtcbiAgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljUmVhZFMzUHJvcHMgZXh0ZW5kcyBCYXNlUzNQcm9wcyB7XG4gIGJ1Y2tldFR5cGU6IFwicHVibGljUmVhZFwiO1xufVxuXG5leHBvcnQgdHlwZSBJUzNQcm9wcyA9IFByaXZhdGVTM1Byb3BzIHwgV2Vic2l0ZVMzUHJvcHMgfCBQdWJsaWNSZWFkUzNQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgc3RvcmFnZSBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgaWdub3JlZCBvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKiBUaGVzZSBjaGVja3MgaGVscCBjYXRjaCBpc3N1ZXMgd2hlbiBwcm9wcyBjb21lIGZyb20gZHluYW1pYyBzb3VyY2VzIHdoZXJlXG4gKiBUeXBlU2NyaXB0J3MgY29tcGlsZS10aW1lIGNoZWNrcyBtYXkgbm90IGFwcGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhwcm9wczogSVMzUHJvcHMpOiB2b2lkIHtcbiAgLy8gVmFsaWRhdGUgZW5jcnlwdGlvbjogS01TIHJlcXVpcmVzIGttc0tleUFyblxuICBpZiAocHJvcHMuZW5jcnlwdGlvbiA9PT0gXCJLTVNcIiAmJiAhcHJvcHMua21zS2V5QXJuKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2VuY3J5cHRpb24nIGlzIHNldCB0byAnS01TJyBidXQgJ2ttc0tleUFybicgaXMgbm90IHByb3ZpZGVkLiBcIiArXG4gICAgICAgIFwiVGhlIGJ1Y2tldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBBV1MgbWFuYWdlZCBrZXkuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gV2FybiBhYm91dCBrbXNLZXlBcm4gd2hlbiBlbmNyeXB0aW9uIGlzIG5vdCBLTVNcbiAgaWYgKHByb3BzLmttc0tleUFybiAmJiBwcm9wcy5lbmNyeXB0aW9uICE9PSBcIktNU1wiKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2ttc0tleUFybicgaXMgcHJvdmlkZWQgYnV0ICdlbmNyeXB0aW9uJyBpcyBub3Qgc2V0IHRvICdLTVMnLiBcIiArXG4gICAgICAgIFwiVGhlIEtNUyBrZXkgd2lsbCBiZSBpZ25vcmVkLiBTZXQgZW5jcnlwdGlvbjogJ0tNUycgdG8gdXNlIHRoZSBrZXkuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gV2Vic2l0ZS1vbmx5IG9wdGlvbnMgb24gbm9uLXdlYnNpdGUgYnVja2V0c1xuICAvLyBOb3RlOiBVc2luZyBidWNrZXRUeXBlIGFzIGRpc2NyaW1pbmF0b3Igd2l0aCBcInR5cGVcIiBhbGlhcyBmb3IgdGhlIGhlbHBlclxuICBjb25zdCBwcm9wc1dpdGhUeXBlID0geyAuLi5wcm9wcywgdHlwZTogcHJvcHMuYnVja2V0VHlwZSB9O1xuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wc1dpdGhUeXBlLFxuICAgIFtcIndlYnNpdGVJbmRleERvY3VtZW50XCIsIFwid2Vic2l0ZUVycm9yRG9jdW1lbnRcIiwgXCJjb3JzXCJdLFxuICAgIFwid2Vic2l0ZVwiLFxuICAgIFwid2Vic2l0ZSBidWNrZXRcIlxuICApO1xuXG4gIC8vIFByaXZhdGUtb25seSBvcHRpb25zIG9uIG5vbi1wcml2YXRlIGJ1Y2tldHNcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHNXaXRoVHlwZSxcbiAgICBbXCJwdWJsaWNSZWFkQWNjZXNzXCJdLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJpdmF0ZSBidWNrZXRcIlxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIFMzIHN0b3JhZ2UgcmVzb3VyY2VzIHdpdGggdHlwZS1zYWZlIHJldHVybiB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUHJpdmF0ZSBidWNrZXRcbiAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHsgYnVja2V0VHlwZTogXCJwcml2YXRlXCIgfSkpO1xuICogYXNzZXRzLmdyYW50UHVibGljQWNjZXNzKCk7IC8vIOKckyBBdmFpbGFibGUgb24gUHJpdmF0ZVN0b3JhZ2VcbiAqXG4gKiAvLyBXZWJzaXRlIGJ1Y2tldFxuICogY29uc3Qgc2l0ZSA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiU2l0ZVwiLCB7IGJ1Y2tldFR5cGU6IFwid2Vic2l0ZVwiIH0pKTtcbiAqIHNpdGUuZ2V0V2Vic2l0ZVVybCgpOyAvLyDinJMgQXZhaWxhYmxlIG9uIFdlYnNpdGVTdG9yYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yYWdlRmFjdG9yeSB7XG4gIC8qKiBCdWlsZCBhIHByaXZhdGUgc3RvcmFnZSBidWNrZXQgKi9cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFByaXZhdGVTM1Byb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gUHJpdmF0ZVN0b3JhZ2U7XG4gIC8qKiBCdWlsZCBhIHdlYnNpdGUgc3RvcmFnZSBidWNrZXQgKi9cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFdlYnNpdGVTM1Byb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gV2Vic2l0ZVN0b3JhZ2U7XG4gIC8qKiBCdWlsZCBhIHB1YmxpYyByZWFkIHN0b3JhZ2UgYnVja2V0ICovXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBQdWJsaWNSZWFkUzNQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFB1YmxpY1N0b3JhZ2U7XG4gIC8qKiBJbXBsZW1lbnRhdGlvbiAtIHJldHVybnMgYXBwcm9wcmlhdGUgc3RvcmFnZSB0eXBlIGJhc2VkIG9uIHByb3BzICovXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJUzNQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEFueVN0b3JhZ2Uge1xuICAgIHJldHVybiAoX2FwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiB7XG4gICAgICB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhwcm9wcyk7XG5cbiAgICAgIHN3aXRjaCAocHJvcHMuYnVja2V0VHlwZSkge1xuICAgICAgICBjYXNlIFwicHJpdmF0ZVwiOlxuICAgICAgICAgIHJldHVybiBuZXcgUHJpdmF0ZVN0b3JhZ2Uoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgICAgIGNhc2UgXCJ3ZWJzaXRlXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBXZWJzaXRlU3RvcmFnZShzY29wZSwgaWQsIHByb3BzKTtcbiAgICAgICAgY2FzZSBcInB1YmxpY1JlYWRcIjpcbiAgICAgICAgICByZXR1cm4gbmV3IFB1YmxpY1N0b3JhZ2Uoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgYnVja2V0IHR5cGU6ICR7KF9leGhhdXN0aXZlIGFzIElTM1Byb3BzKS5idWNrZXRUeXBlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgUzMgc3RvcmFnZSBjbGFzcy5cbiAqIFNwZWNpZmljIHN0b3JhZ2UgdHlwZXMgKFByaXZhdGVTdG9yYWdlLCBXZWJzaXRlU3RvcmFnZSwgUHVibGljU3RvcmFnZSkgZXh0ZW5kIHRoaXMuXG4gKi9cbmFic3RyYWN0IGNsYXNzIFMzU3RvcmFnZUJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJU3RvcmFnZUNvbm5lY3RvciB7XG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcblxuICAvKiogVGhlIHR5cGUgb2Ygc3RvcmFnZSByZXNvdXJjZS4gVXNlZCBmb3IgcnVudGltZSB0eXBlIG5hcnJvd2luZy4gKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHN0b3JhZ2VUeXBlOiBTdG9yYWdlVHlwZTtcblxuICAvKiogVGhlIGNvbm5lY3RvciB0eXBlIGZvciB1bmlmaWVkIGNvbm5lY3Rpb24gcHJvY2Vzc2luZy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RvclR5cGUgPSBcInN0b3JhZ2VcIiBhcyBjb25zdDtcblxuICBwcm90ZWN0ZWQgYnVja2V0ITogUzNCdWNrZXQgfCBTM1dlYnNpdGVCdWNrZXQgfCBTM1B1YmxpY1JlYWRCdWNrZXQ7XG4gIHByb3RlY3RlZCBfYnVja2V0VHlwZTogUzNCdWNrZXRUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLl9idWNrZXRUeXBlID0gcHJvcHMuYnVja2V0VHlwZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXNlUHJpdmF0ZUJ1Y2tldChwcm9wczogUHJpdmF0ZVMzUHJvcHMpIHtcbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcHJvcHMua21zS2V5QXJuXG4gICAgICA/IEtleS5mcm9tS2V5QXJuKHRoaXMsIGAke3RoaXMuaWR9S21zS2V5YCwgcHJvcHMua21zS2V5QXJuKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBTM0J1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbiksXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgcHVibGljUmVhZEFjY2VzczogcHJvcHMucHVibGljUmVhZEFjY2Vzc1xuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpc2VXZWJzaXRlQnVja2V0KHByb3BzOiBXZWJzaXRlUzNQcm9wcykge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzV2Vic2l0ZUJ1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbiksXG4gICAgICB3ZWJzaXRlSW5kZXhEb2N1bWVudDogcHJvcHMud2Vic2l0ZUluZGV4RG9jdW1lbnQsXG4gICAgICB3ZWJzaXRlRXJyb3JEb2N1bWVudDogcHJvcHMud2Vic2l0ZUVycm9yRG9jdW1lbnQsXG4gICAgICBjb3JzOiB0b0NvcnNSdWxlcyhwcm9wcy5jb3JzKVxuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpc2VQdWJsaWNSZWFkQnVja2V0KHByb3BzOiBQdWJsaWNSZWFkUzNQcm9wcykge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzUHVibGljUmVhZEJ1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbilcbiAgICB9KTtcbiAgICB0aGlzLmFkZE91dHB1dHMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRPdXRwdXRzKCkge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7dGhpcy5pZH1CdWNrZXRBcm5gLCB7XG4gICAgICBrZXk6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0QXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0QXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmJ1Y2tldC5idWNrZXRBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYFMzIEJ1Y2tldCBBUk4gZm9yICR7dGhpcy5pZH1gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3RoaXMuaWR9QnVja2V0TmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXROYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0TmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUzMgQnVja2V0IE5hbWUgZm9yICR7dGhpcy5pZH1gXG4gICAgfSk7XG4gIH1cblxuICBnZXRCdWNrZXQoKTogSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ2V0QnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0QXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldEFybjtcbiAgfVxuXG4gIGdldEJ1Y2tldFR5cGUoKTogUzNCdWNrZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0VHlwZTtcbiAgfVxuXG4gIGdldEJ1Y2tldERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0RG9tYWluTmFtZTtcbiAgfVxuXG4gIGdldEJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cblxuICBnZXRTM0J1Y2tldCgpOiBTM0J1Y2tldCB8IFMzV2Vic2l0ZUJ1Y2tldCB8IFMzUHVibGljUmVhZEJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ3JhbnRSZWFkKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UmVhZChncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50V3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRXcml0ZShncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnREZWxldGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnREZWxldGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFB1dChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFB1dChncmFudGVlKTtcbiAgfVxuXG4gIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKGV2ZW50LCBkZXN0LCAuLi5maWx0ZXJzKTtcbiAgfVxuXG4gIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oZGVzdCwgLi4uZmlsdGVycyk7XG4gIH1cblxuICBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldC5hZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKGRlc3QsIC4uLmZpbHRlcnMpO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBTMyBzdG9yYWdlLlxuICogU3RhbmRhcmQgYnVja2V0IHdpdGggb3B0aW9uYWwgZW5jcnlwdGlvbiBhbmQgdmVyc2lvbmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVTdG9yYWdlIGV4dGVuZHMgUzNTdG9yYWdlQmFzZSBpbXBsZW1lbnRzIElQcml2YXRlU3RvcmFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzdG9yYWdlVHlwZSA9IFwicHJpdmF0ZVwiIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgX2RlcGxveW1lbnQ/OiBCdWNrZXREZXBsb3ltZW50O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQcml2YXRlUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMuaW5pdGlhbGlzZVByaXZhdGVCdWNrZXQocHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQpIHtcbiAgICAgIHRoaXMuX2RlcGxveW1lbnQgPSB0aGlzLmNyZWF0ZURlcGxveW1lbnQoaWQsIHByb3BzLmRlcGxveW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudChcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUzNEZXBsb3ltZW50Q29uZmlnXG4gICk6IEJ1Y2tldERlcGxveW1lbnQge1xuICAgIGNvbnN0IGNhY2hlQ29udHJvbEhlYWRlcnM6IENhY2hlQ29udHJvbFtdID0gW107XG5cbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbD8ubWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChcbiAgICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy5jYWNoZUNvbnRyb2wubWF4QWdlKSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sPy5pbW11dGFibGUpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChDYWNoZUNvbnRyb2wuaW1tdXRhYmxlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHtpZH1EZXBsb3ltZW50YCwge1xuICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChjb25maWcuc291cmNlKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICBwcnVuZTogY29uZmlnLnBydW5lID8/IHRydWUsXG4gICAgICAuLi4oY2FjaGVDb250cm9sSGVhZGVycy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgY2FjaGVDb250cm9sOiBjYWNoZUNvbnRyb2xIZWFkZXJzXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHB1YmxpYyBhY2Nlc3MgdG8gb2JqZWN0cyB1bmRlciBhIHByZWZpeC5cbiAgICogVXNlIHdpdGggY2F1dGlvbiAtIG1ha2VzIG9iamVjdHMgcHVibGljbHkgcmVhZGFibGUuXG4gICAqL1xuICBncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXg6IHN0cmluZ1tdKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQnVja2V0RGVwbG95bWVudCBjb25zdHJ1Y3QgaWYgb25lIHdhcyBjcmVhdGVkLlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBkZXBsb3ltZW50IHdhcyBjb25maWd1cmVkLlxuICAgKi9cbiAgZ2V0RGVwbG95bWVudCgpOiBCdWNrZXREZXBsb3ltZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGVwbG95bWVudDtcbiAgfVxufVxuXG4vKipcbiAqIFdlYnNpdGUgUzMgc3RvcmFnZS5cbiAqIEJ1Y2tldCBjb25maWd1cmVkIGZvciBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLlxuICovXG5leHBvcnQgY2xhc3MgV2Vic2l0ZVN0b3JhZ2UgZXh0ZW5kcyBTM1N0b3JhZ2VCYXNlIGltcGxlbWVudHMgSVdlYnNpdGVTdG9yYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2VUeXBlID0gXCJ3ZWJzaXRlXCIgYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYnNpdGVTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5pbml0aWFsaXNlV2Vic2l0ZUJ1Y2tldChwcm9wcyk7XG4gIH1cblxuICAvKiogR2V0IHRoZSB3ZWJzaXRlIFVSTC4gKi9cbiAgZ2V0V2Vic2l0ZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXRXZWJzaXRlVXJsID8/IFwiXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaWMgcmVhZCBTMyBzdG9yYWdlLlxuICogQnVja2V0IHdpdGggcHVibGljIHJlYWQgYWNjZXNzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQdWJsaWNTdG9yYWdlIGV4dGVuZHMgUzNTdG9yYWdlQmFzZSBpbXBsZW1lbnRzIElQdWJsaWNTdG9yYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2VUeXBlID0gXCJwdWJsaWNSZWFkXCIgYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFB1YmxpY1JlYWRTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5pbml0aWFsaXNlUHVibGljUmVhZEJ1Y2tldChwcm9wcyk7XG4gIH1cbn1cbiJdfQ==
169
+ exports.StorageFactory = StorageFactory;
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5R0Esb0RBY0M7QUF2SEQsMkNBQXVDO0FBQ3ZDLCtDQVE0QjtBQUM1QixxRUFJdUM7QUFFdkMsaURBQTBDO0FBQzFDLDZDQUF5RDtBQUd6RCx5REFJcUM7QUFDckMseUVBQThEO0FBSTlELHNEQUFtRTtBQUEzQyx1R0FBQSxTQUFTLE9BQUE7QUE2Q2pDLFNBQVMsa0JBQWtCLENBQ3pCLFVBQTZCO0lBRTdCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsT0FBTyxVQUFVLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMseUJBQWdCLENBQUMsVUFBVTtRQUM3QixDQUFDLENBQUMseUJBQWdCLENBQUMsR0FBRyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLE1BQU0sU0FBUyxHQUFnQztRQUM3QyxHQUFHLEVBQUUsb0JBQVcsQ0FBQyxHQUFHO1FBQ3BCLEdBQUcsRUFBRSxvQkFBVyxDQUFDLEdBQUc7UUFDcEIsSUFBSSxFQUFFLG9CQUFXLENBQUMsSUFBSTtRQUN0QixNQUFNLEVBQUUsb0JBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksRUFBRSxvQkFBVyxDQUFDLElBQUk7S0FDdkIsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFXLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFpQjtJQUNwQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7UUFDbkMsY0FB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IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElCdWNrZXQsXG4gIHR5cGUgRXZlbnRUeXBlLFxuICB0eXBlIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgdHlwZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIsXG4gIEJ1Y2tldEVuY3J5cHRpb24sXG4gIEh0dHBNZXRob2RzLFxuICB0eXBlIENvcnNSdWxlIGFzIENka0NvcnNSdWxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7XG4gIEJ1Y2tldERlcGxveW1lbnQsXG4gIFNvdXJjZSxcbiAgQ2FjaGVDb250cm9sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHtcbiAgUzNCdWNrZXQsXG4gIHR5cGUgQmFja3VwVmF1bHRUaWVyLFxuICB0eXBlIFdlYnNpdGVIb3N0aW5nQ29uZmlnXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3N0b3JhZ2VcIjtcbmltcG9ydCB7IEZqYWxsTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcbmltcG9ydCB7IHR5cGUgSVN0b3JhZ2UgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL3N0b3JhZ2UuanNcIjtcbmltcG9ydCB7IHR5cGUgSVN0b3JhZ2VDb25uZWN0b3IgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Nvbm5lY3Rvci5qc1wiO1xuXG5leHBvcnQgeyB0eXBlIElTdG9yYWdlLCBpc1N0b3JhZ2UgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL3N0b3JhZ2UuanNcIjtcbmV4cG9ydCB7IHR5cGUgV2Vic2l0ZUhvc3RpbmdDb25maWcgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zdG9yYWdlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29yc1J1bGUge1xuICByZWFkb25seSBhbGxvd2VkT3JpZ2luczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGFsbG93ZWRNZXRob2RzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgYWxsb3dlZEhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZXhwb3NlZEhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbWF4QWdlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFMzRGVwbG95bWVudENvbmZpZyB7XG4gIC8qKiBQYXRoIHRvIHRoZSBhc3NldCBkaXJlY3RvcnkgKHJlbGF0aXZlIHRvIENESyBhcHAgcm9vdCkgKi9cbiAgc291cmNlOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRvIHJlbW92ZSBmaWxlcyBmcm9tIGJ1Y2tldCB0aGF0IGFyZSBub3QgaW4gdGhlIHNvdXJjZS4gRGVmYXVsdDogdHJ1ZSAqL1xuICBwcnVuZT86IGJvb2xlYW47XG4gIC8qKiBDYWNoZSBjb250cm9sIHNldHRpbmdzIGZvciB1cGxvYWRlZCBmaWxlcyAqL1xuICBjYWNoZUNvbnRyb2w/OiB7XG4gICAgLyoqIE1heCBhZ2UgaW4gc2Vjb25kcyAoZS5nLiwgMzE1MzYwMDAgZm9yIDEgeWVhcikgKi9cbiAgICBtYXhBZ2U/OiBudW1iZXI7XG4gICAgLyoqIE1hcmsgYXMgaW1tdXRhYmxlIChicm93c2VyIHdpbGwgbm90IHJldmFsaWRhdGUpICovXG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM1Byb3BzIHtcbiAgcmVhZG9ubHkgYnVja2V0TmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcHVibGljUmVhZEFjY2Vzcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHdlYnNpdGVIb3N0aW5nPzogV2Vic2l0ZUhvc3RpbmdDb25maWc7XG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBcIkFFUzI1NlwiIHwgXCJLTVNcIjtcbiAgcmVhZG9ubHkga21zS2V5QXJuPzogc3RyaW5nO1xuICByZWFkb25seSBiYWNrdXBWYXVsdFRpZXI/OiBCYWNrdXBWYXVsdFRpZXI7XG4gIHJlYWRvbmx5IGNvcnM/OiBDb3JzUnVsZVtdO1xuICByZWFkb25seSBkZXBsb3ltZW50PzogUzNEZXBsb3ltZW50Q29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VCdWlsZFByb3BzIGV4dGVuZHMgUzNQcm9wcyB7XG4gIHJlYWRvbmx5IHN0YWNrUGxhY2VtZW50PzogXCJzdG9yYWdlXCIgfCBcImNkblwiIHwgXCJjb21wdXRlXCI7XG59XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VGYWN0b3J5Rm4gPSAoKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBTdG9yYWdlKSAmIHtcbiAgc3RhY2tQbGFjZW1lbnQ/OiBcInN0b3JhZ2VcIiB8IFwiY2RuXCIgfCBcImNvbXB1dGVcIjtcbn07XG5cbmZ1bmN0aW9uIHRvQnVja2V0RW5jcnlwdGlvbihcbiAgZW5jcnlwdGlvbj86IFwiQUVTMjU2XCIgfCBcIktNU1wiXG4pOiBCdWNrZXRFbmNyeXB0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlbmNyeXB0aW9uKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZW5jcnlwdGlvbiA9PT0gXCJBRVMyNTZcIlxuICAgID8gQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEXG4gICAgOiBCdWNrZXRFbmNyeXB0aW9uLktNUztcbn1cblxuZnVuY3Rpb24gdG9IdHRwTWV0aG9kKG1ldGhvZDogc3RyaW5nKTogSHR0cE1ldGhvZHMge1xuICBjb25zdCBtZXRob2RNYXA6IFJlY29yZDxzdHJpbmcsIEh0dHBNZXRob2RzPiA9IHtcbiAgICBHRVQ6IEh0dHBNZXRob2RzLkdFVCxcbiAgICBQVVQ6IEh0dHBNZXRob2RzLlBVVCxcbiAgICBQT1NUOiBIdHRwTWV0aG9kcy5QT1NULFxuICAgIERFTEVURTogSHR0cE1ldGhvZHMuREVMRVRFLFxuICAgIEhFQUQ6IEh0dHBNZXRob2RzLkhFQURcbiAgfTtcbiAgcmV0dXJuIG1ldGhvZE1hcFttZXRob2RdID8/IEh0dHBNZXRob2RzLkdFVDtcbn1cblxuZnVuY3Rpb24gdG9Db3JzUnVsZXMoY29ycz86IENvcnNSdWxlW10pOiBDZGtDb3JzUnVsZVtdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb3JzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gY29ycy5tYXAoKHJ1bGUpID0+ICh7XG4gICAgYWxsb3dlZE9yaWdpbnM6IHJ1bGUuYWxsb3dlZE9yaWdpbnMsXG4gICAgYWxsb3dlZE1ldGhvZHM6IHJ1bGUuYWxsb3dlZE1ldGhvZHMubWFwKHRvSHR0cE1ldGhvZCksXG4gICAgLi4uKHJ1bGUuYWxsb3dlZEhlYWRlcnMgJiYgeyBhbGxvd2VkSGVhZGVyczogcnVsZS5hbGxvd2VkSGVhZGVycyB9KSxcbiAgICAuLi4ocnVsZS5leHBvc2VkSGVhZGVycyAmJiB7IGV4cG9zZWRIZWFkZXJzOiBydWxlLmV4cG9zZWRIZWFkZXJzIH0pLFxuICAgIC4uLihydWxlLm1heEFnZSAhPT0gdW5kZWZpbmVkICYmIHsgbWF4QWdlOiBydWxlLm1heEFnZSB9KVxuICB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhwcm9wczogUzNQcm9wcyk6IHZvaWQge1xuICBpZiAocHJvcHMuZW5jcnlwdGlvbiA9PT0gXCJLTVNcIiAmJiAhcHJvcHMua21zS2V5QXJuKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2VuY3J5cHRpb24nIGlzIHNldCB0byAnS01TJyBidXQgJ2ttc0tleUFybicgaXMgbm90IHByb3ZpZGVkLiBcIiArXG4gICAgICAgIFwiVGhlIGJ1Y2tldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBBV1MgbWFuYWdlZCBrZXkuXCJcbiAgICApO1xuICB9XG5cbiAgaWYgKHByb3BzLmttc0tleUFybiAmJiBwcm9wcy5lbmNyeXB0aW9uICE9PSBcIktNU1wiKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2ttc0tleUFybicgaXMgcHJvdmlkZWQgYnV0ICdlbmNyeXB0aW9uJyBpcyBub3Qgc2V0IHRvICdLTVMnLiBcIiArXG4gICAgICAgIFwiVGhlIEtNUyBrZXkgd2lsbCBiZSBpZ25vcmVkLiBTZXQgZW5jcnlwdGlvbjogJ0tNUycgdG8gdXNlIHRoZSBrZXkuXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVN0b3JhZ2UsIElTdG9yYWdlQ29ubmVjdG9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RvclR5cGUgPSBcInN0b3JhZ2VcIiBhcyBjb25zdDtcbiAgcHJpdmF0ZSByZWFkb25seSBidWNrZXQ6IFMzQnVja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldERlcGxveW1lbnQ/OiBCdWNrZXREZXBsb3ltZW50O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBwcm9wcy5rbXNLZXlBcm5cbiAgICAgID8gS2V5LmZyb21LZXlBcm4odGhpcywgYCR7aWR9S21zS2V5YCwgcHJvcHMua21zS2V5QXJuKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBTM0J1Y2tldCh0aGlzLCBgJHtpZH1CdWNrZXRgLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5idWNrZXROYW1lLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbiksXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgYmFja3VwVmF1bHRUaWVyOiBwcm9wcy5iYWNrdXBWYXVsdFRpZXIsXG4gICAgICBwdWJsaWNSZWFkQWNjZXNzOiBwcm9wcy5wdWJsaWNSZWFkQWNjZXNzLFxuICAgICAgd2Vic2l0ZUhvc3Rpbmc6IHByb3BzLndlYnNpdGVIb3N0aW5nLFxuICAgICAgLi4uKHByb3BzLmNvcnMgJiYgeyBjb3JzOiB0b0NvcnNSdWxlcyhwcm9wcy5jb3JzKSB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQpIHtcbiAgICAgIHRoaXMuYnVja2V0RGVwbG95bWVudCA9IHRoaXMuY3JlYXRlRGVwbG95bWVudChpZCwgcHJvcHMuZGVwbG95bWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRPdXRwdXRzKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudChcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUzNEZXBsb3ltZW50Q29uZmlnXG4gICk6IEJ1Y2tldERlcGxveW1lbnQge1xuICAgIGNvbnN0IGNhY2hlQ29udHJvbEhlYWRlcnM6IENhY2hlQ29udHJvbFtdID0gW107XG5cbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbD8ubWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChcbiAgICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy5jYWNoZUNvbnRyb2wubWF4QWdlKSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sPy5pbW11dGFibGUpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChDYWNoZUNvbnRyb2wuaW1tdXRhYmxlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHtpZH1EZXBsb3ltZW50YCwge1xuICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChjb25maWcuc291cmNlKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICBwcnVuZTogY29uZmlnLnBydW5lID8/IHRydWUsXG4gICAgICAuLi4oY2FjaGVDb250cm9sSGVhZGVycy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgY2FjaGVDb250cm9sOiBjYWNoZUNvbnRyb2xIZWFkZXJzXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRPdXRwdXRzKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBTdGFjay5vZih0aGlzKS5zdGFja05hbWU7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUJ1Y2tldEFybmAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7aWR9QnVja2V0QXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke2lkfUJ1Y2tldEFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5idWNrZXQuYnVja2V0QXJuLFxuICAgICAgZGVzY3JpcHRpb246IGBTMyBCdWNrZXQgQVJOIGZvciAke2lkfWBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QnVja2V0TmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7aWR9QnVja2V0TmFtZWAsXG4gICAgICBleHBvcnROYW1lOiBgJHtzdGFja05hbWV9JHtpZH1CdWNrZXROYW1lYCxcbiAgICAgIHZhbHVlOiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGBTMyBCdWNrZXQgTmFtZSBmb3IgJHtpZH1gXG4gICAgfSk7XG4gIH1cblxuICBnZXRCdWNrZXQoKTogSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ2V0QnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0QXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldEFybjtcbiAgfVxuXG4gIGdldEJ1Y2tldERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0RG9tYWluTmFtZTtcbiAgfVxuXG4gIGdldEJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cblxuICBnZXRXZWJzaXRlVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldFdlYnNpdGVVcmw7XG4gIH1cblxuICBnZXREZXBsb3ltZW50KCk6IEJ1Y2tldERlcGxveW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldERlcGxveW1lbnQ7XG4gIH1cblxuICBncmFudFJlYWQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRSZWFkKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFdyaXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudERlbGV0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudERlbGV0ZShncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50UHV0KGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UHV0KGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRQdWJsaWNBY2Nlc3MoLi4ua2V5UHJlZml4OiBzdHJpbmdbXSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRQdWJsaWNBY2Nlc3MoLi4ua2V5UHJlZml4KTtcbiAgfVxuXG4gIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKGV2ZW50LCBkZXN0LCAuLi5maWx0ZXJzKTtcbiAgfVxuXG4gIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oZGVzdCwgLi4uZmlsdGVycyk7XG4gIH1cblxuICBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldC5hZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKGRlc3QsIC4uLmZpbHRlcnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogU3RvcmFnZUJ1aWxkUHJvcHMgPSB7fSk6IFN0b3JhZ2VGYWN0b3J5Rm4ge1xuICAgIGNvbnN0IHsgc3RhY2tQbGFjZW1lbnQsIC4uLnMzUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGZuOiBTdG9yYWdlRmFjdG9yeUZuID0gKF9hcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4ge1xuICAgICAgdmFsaWRhdGVTdG9yYWdlUHJvcHMoczNQcm9wcyk7XG4gICAgICByZXR1cm4gbmV3IFN0b3JhZ2Uoc2NvcGUsIGlkLCBzM1Byb3BzKTtcbiAgICB9O1xuICAgIGlmIChzdGFja1BsYWNlbWVudCkge1xuICAgICAgZm4uc3RhY2tQbGFjZW1lbnQgPSBzdGFja1BsYWNlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG59XG4iXX0=
@@ -35,7 +35,7 @@ export declare class Ec2Instance extends Construct implements IConnectable {
35
35
  * Get the Auto Scaling Group.
36
36
  */
37
37
  getAutoScalingGroup(): AutoScalingGroup;
38
- suspendAutoScaling(props: Ec2InstanceProps): void;
38
+ suspendAutoScaling(_props: Ec2InstanceProps): void;
39
39
  }
40
40
  export declare class Ec2InstanceStack extends Stack {
41
41
  constructor(scope: Construct, id: string, props: Ec2InstanceProps);