aws-cdk 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +7 -0
  2. package/bin/cdk.js +16 -1
  3. package/build-info.json +2 -2
  4. package/lib/api/aws-auth/sdk.d.ts +2 -0
  5. package/lib/api/aws-auth/sdk.js +4 -1
  6. package/lib/api/bootstrap/deploy-bootstrap.js +13 -2
  7. package/lib/api/cloudformation-deployments.d.ts +41 -41
  8. package/lib/api/cloudformation-deployments.js +56 -55
  9. package/lib/api/deploy-stack.d.ts +0 -1
  10. package/lib/api/deploy-stack.js +4 -5
  11. package/lib/api/{hotswap/evaluate-cloudformation-template.d.ts → evaluate-cloudformation-template.d.ts} +14 -1
  12. package/lib/api/evaluate-cloudformation-template.js +289 -0
  13. package/lib/api/hotswap/code-build-projects.d.ts +1 -1
  14. package/lib/api/hotswap/code-build-projects.js +2 -2
  15. package/lib/api/hotswap/common.d.ts +0 -6
  16. package/lib/api/hotswap/common.js +2 -19
  17. package/lib/api/hotswap/ecs-services.d.ts +1 -1
  18. package/lib/api/hotswap/ecs-services.js +2 -2
  19. package/lib/api/hotswap/lambda-functions.d.ts +1 -1
  20. package/lib/api/hotswap/lambda-functions.js +2 -2
  21. package/lib/api/hotswap/s3-bucket-deployments.d.ts +1 -1
  22. package/lib/api/hotswap/s3-bucket-deployments.js +1 -1
  23. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +1 -1
  24. package/lib/api/hotswap/stepfunctions-state-machines.js +1 -1
  25. package/lib/api/hotswap-deployments.js +5 -31
  26. package/lib/api/logs/find-cloudwatch-logs.d.ts +24 -0
  27. package/lib/api/logs/find-cloudwatch-logs.js +84 -0
  28. package/lib/api/logs/logs-monitor.d.ts +53 -0
  29. package/lib/api/logs/logs-monitor.js +162 -0
  30. package/lib/cdk-toolkit.d.ts +15 -0
  31. package/lib/cdk-toolkit.js +14 -4
  32. package/npm-shrinkwrap.json +20 -20
  33. package/package.json +14 -14
  34. package/test/api/bootstrap2.test.js +2 -3
  35. package/test/api/logs/find-cloudwatch-logs.test.d.ts +1 -0
  36. package/test/api/logs/find-cloudwatch-logs.test.js +264 -0
  37. package/test/api/logs/logs-monitor.test.d.ts +1 -0
  38. package/test/api/logs/logs-monitor.test.js +59 -0
  39. package/test/util/mock-sdk.d.ts +6 -0
  40. package/test/util/mock-sdk.js +11 -1
  41. package/lib/api/hotswap/evaluate-cloudformation-template.js +0 -247
@@ -5,10 +5,10 @@ const cfn_diff = require("@aws-cdk/cloudformation-diff");
5
5
  const chalk = require("chalk");
6
6
  const logging_1 = require("../logging");
7
7
  const aws_auth_1 = require("./aws-auth");
8
+ const evaluate_cloudformation_template_1 = require("./evaluate-cloudformation-template");
8
9
  const code_build_projects_1 = require("./hotswap/code-build-projects");
9
10
  const common_1 = require("./hotswap/common");
10
11
  const ecs_services_1 = require("./hotswap/ecs-services");
11
- const evaluate_cloudformation_template_1 = require("./hotswap/evaluate-cloudformation-template");
12
12
  const lambda_functions_1 = require("./hotswap/lambda-functions");
13
13
  const s3_bucket_deployments_1 = require("./hotswap/s3-bucket-deployments");
14
14
  const stepfunctions_state_machines_1 = require("./hotswap/stepfunctions-state-machines");
@@ -28,14 +28,14 @@ async function tryHotswapDeployment(sdkProvider, assetParams, cloudFormationStac
28
28
  // The current resources of the Stack.
29
29
  // We need them to figure out the physical name of a resource in case it wasn't specified by the user.
30
30
  // We fetch it lazily, to save a service call, in case all hotswapped resources have their physical names set.
31
- const listStackResources = new LazyListStackResources(sdk, stackArtifact.stackName);
31
+ const listStackResources = new evaluate_cloudformation_template_1.LazyListStackResources(sdk, stackArtifact.stackName);
32
32
  const evaluateCfnTemplate = new evaluate_cloudformation_template_1.EvaluateCloudFormationTemplate({
33
33
  stackArtifact,
34
34
  parameters: assetParams,
35
35
  account: resolvedEnv.account,
36
36
  region: resolvedEnv.region,
37
37
  partition: (await sdk.currentAccount()).partition,
38
- urlSuffix: sdk.getEndpointSuffix,
38
+ urlSuffix: (region) => sdk.getEndpointSuffix(region),
39
39
  listStackResources,
40
40
  });
41
41
  const currentTemplate = await cloudFormationStack.template();
@@ -47,7 +47,7 @@ async function tryHotswapDeployment(sdkProvider, assetParams, cloudFormationStac
47
47
  }
48
48
  // apply the short-circuitable changes
49
49
  await applyAllHotswappableChanges(sdk, hotswappableChanges);
50
- return { noOp: hotswappableChanges.length === 0, stackArn: cloudFormationStack.stackId, outputs: cloudFormationStack.outputs, stackArtifact };
50
+ return { noOp: hotswappableChanges.length === 0, stackArn: cloudFormationStack.stackId, outputs: cloudFormationStack.outputs };
51
51
  }
52
52
  exports.tryHotswapDeployment = tryHotswapDeployment;
53
53
  async function findAllHotswappableChanges(stackChanges, evaluateCfnTemplate) {
@@ -204,30 +204,4 @@ async function applyHotswappableChange(sdk, hotswapOperation) {
204
204
  sdk.removeCustomUserAgent(customUserAgent);
205
205
  }
206
206
  }
207
- class LazyListStackResources {
208
- constructor(sdk, stackName) {
209
- this.sdk = sdk;
210
- this.stackName = stackName;
211
- }
212
- async listStackResources() {
213
- if (this.stackResources === undefined) {
214
- this.stackResources = await this.getStackResources();
215
- }
216
- return this.stackResources;
217
- }
218
- async getStackResources() {
219
- var _a;
220
- const ret = new Array();
221
- let nextToken;
222
- do {
223
- const stackResourcesResponse = await this.sdk.cloudFormation().listStackResources({
224
- StackName: this.stackName,
225
- NextToken: nextToken,
226
- }).promise();
227
- ret.push(...((_a = stackResourcesResponse.StackResourceSummaries) !== null && _a !== void 0 ? _a : []));
228
- nextToken = stackResourcesResponse.NextToken;
229
- } while (nextToken);
230
- return ret;
231
- }
232
- }
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90c3dhcC1kZXBsb3ltZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhvdHN3YXAtZGVwbG95bWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseURBQXlEO0FBR3pELCtCQUErQjtBQUMvQix3Q0FBbUM7QUFDbkMseUNBQXFEO0FBRXJELHVFQUFxRjtBQUNyRiw2Q0FBcUo7QUFDckoseURBQXdFO0FBQ3hFLGlHQUE0RjtBQUM1RixpRUFBZ0Y7QUFDaEYsMkVBQXlGO0FBQ3pGLHlGQUEwRjtBQUcxRjs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLFdBQXdCLEVBQUUsV0FBc0MsRUFDaEUsbUJBQXdDLEVBQUUsYUFBZ0Q7SUFFMUYsMkZBQTJGO0lBQzNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwRiw4R0FBOEc7SUFDOUcsa0dBQWtHO0lBQ2xHLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxXQUFXLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxlQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDakYsc0NBQXNDO0lBQ3RDLHNHQUFzRztJQUN0Ryw4R0FBOEc7SUFDOUcsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGlFQUE4QixDQUFDO1FBQzdELGFBQWE7UUFDYixVQUFVLEVBQUUsV0FBVztRQUN2QixPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87UUFDNUIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1FBQzFCLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsU0FBUztRQUNqRCxTQUFTLEVBQUUsR0FBRyxDQUFDLGlC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O1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUF1QyxDQUFDO1FBQzdELElBQUksU0FBNkIsQ0FBQztRQUNsQyxHQUFHO1lBQ0QsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Z0JBQ2hGLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsU0FBUyxFQUFFLFNBQVM7YUFDckIsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQUMsc0JBQXNCLENBQUMsc0JBQXNCLG1DQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkUsU0FBUyxHQUFHLHNCQUFzQixDQUFDLFNBQVMsQ0FBQztTQUM5QyxRQUFRLFNBQVMsRUFBRTtRQUNwQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNmbl9kaWZmIGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uIH0gZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwcmludCB9IGZyb20gJy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgSVNESywgTW9kZSwgU2RrUHJvdmlkZXIgfSBmcm9tICcuL2F3cy1hdXRoJztcbmltcG9ydCB7IERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi9kZXBsb3ktc3RhY2snO1xuaW1wb3J0IHsgaXNIb3Rzd2FwcGFibGVDb2RlQnVpbGRQcm9qZWN0Q2hhbmdlIH0gZnJvbSAnLi9ob3Rzd2FwL2NvZGUtYnVpbGQtcHJvamVjdHMnO1xuaW1wb3J0IHsgSUNPTiwgQ2hhbmdlSG90c3dhcEltcGFjdCwgQ2hhbmdlSG90c3dhcFJlc3VsdCwgSG90c3dhcE9wZXJhdGlvbiwgSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlLCBMaXN0U3RhY2tSZXNvdXJjZXMgfSBmcm9tICcuL2hvdHN3YXAvY29tbW9uJztcbmltcG9ydCB7IGlzSG90c3dhcHBhYmxlRWNzU2VydmljZUNoYW5nZSB9IGZyb20gJy4vaG90c3dhcC9lY3Mtc2VydmljZXMnO1xuaW1wb3J0IHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlIH0gZnJvbSAnLi9ob3Rzd2FwL2V2YWx1YXRlLWNsb3VkZm9ybWF0aW9uLXRlbXBsYXRlJztcbmltcG9ydCB7IGlzSG90c3dhcHBhYmxlTGFtYmRhRnVuY3Rpb25DaGFuZ2UgfSBmcm9tICcuL2hvdHN3YXAvbGFtYmRhLWZ1bmN0aW9ucyc7XG5pbXBvcnQgeyBpc0hvdHN3YXBwYWJsZVMzQnVja2V0RGVwbG95bWVudENoYW5nZSB9IGZyb20gJy4vaG90c3dhcC9zMy1idWNrZXQtZGVwbG95bWVudHMnO1xuaW1wb3J0IHsgaXNIb3Rzd2FwcGFibGVTdGF0ZU1hY2hpbmVDaGFuZ2UgfSBmcm9tICcuL2hvdHN3YXAvc3RlcGZ1bmN0aW9ucy1zdGF0ZS1tYWNoaW5lcyc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvblN0YWNrIH0gZnJvbSAnLi91dGlsL2Nsb3VkZm9ybWF0aW9uJztcblxuLyoqXG4gKiBQZXJmb3JtIGEgaG90c3dhcCBkZXBsb3ltZW50LFxuICogc2hvcnQtY2lyY3VpdGluZyBDbG91ZEZvcm1hdGlvbiBpZiBwb3NzaWJsZS5cbiAqIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHNob3J0LWNpcmN1aXQgdGhlIGRlcGxveW1lbnRcbiAqIChiZWNhdXNlIHRoZSBDREsgU3RhY2sgY29udGFpbnMgY2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBkZXBsb3llZCB3aXRob3V0IENsb3VkRm9ybWF0aW9uKSxcbiAqIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlIb3Rzd2FwRGVwbG95bWVudChcbiAgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyLCBhc3NldFBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgY2xvdWRGb3JtYXRpb25TdGFjazogQ2xvdWRGb3JtYXRpb25TdGFjaywgc3RhY2tBcnRpZmFjdDogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuKTogUHJvbWlzZTxEZXBsb3lTdGFja1Jlc3VsdCB8IHVuZGVmaW5lZD4ge1xuICAvLyByZXNvbHZlIHRoZSBlbnZpcm9ubWVudCwgc28gd2UgY2FuIHN1YnN0aXR1dGUgdGhpbmdzIGxpa2UgQVdTOjpSZWdpb24gaW4gQ0ZOIGV4cHJlc3Npb25zXG4gIGNvbnN0IHJlc29sdmVkRW52ID0gYXdhaXQgc2RrUHJvdmlkZXIucmVzb2x2ZUVudmlyb25tZW50KHN0YWNrQXJ0aWZhY3QuZW52aXJvbm1lbnQpO1xuICAvLyBjcmVhdGUgYSBuZXcgU0RLIHVzaW5nIHRoZSBDTEkgY3JlZGVudGlhbHMsIGJlY2F1c2UgdGhlIGRlZmF1bHQgb25lIHdpbGwgbm90IHdvcmsgZm9yIG5ldy1zdHlsZSBzeW50aGVzaXMgLVxuICAvLyBpdCBhc3N1bWVzIHRoZSBib290c3RyYXAgZGVwbG95IFJvbGUsIHdoaWNoIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9ucyB0byB1cGRhdGUgTGFtYmRhIGZ1bmN0aW9uc1xuICBjb25zdCBzZGsgPSAoYXdhaXQgc2RrUHJvdmlkZXIuZm9yRW52aXJvbm1lbnQocmVzb2x2ZWRFbnYsIE1vZGUuRm9yV3JpdGluZykpLnNkaztcbiAgLy8gVGhlIGN1cnJlbnQgcmVzb3VyY2VzIG9mIHRoZSBTdGFjay5cbiAgLy8gV2UgbmVlZCB0aGVtIHRvIGZpZ3VyZSBvdXQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgYSByZXNvdXJjZSBpbiBjYXNlIGl0IHdhc24ndCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXG4gIC8vIFdlIGZldGNoIGl0IGxhemlseSwgdG8gc2F2ZSBhIHNlcnZpY2UgY2FsbCwgaW4gY2FzZSBhbGwgaG90c3dhcHBlZCByZXNvdXJjZXMgaGF2ZSB0aGVpciBwaHlzaWNhbCBuYW1lcyBzZXQuXG4gIGNvbnN0IGxpc3RTdGFja1Jlc291cmNlcyA9IG5ldyBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzKHNkaywgc3RhY2tBcnRpZmFjdC5zdGFja05hbWUpO1xuICBjb25zdCBldmFsdWF0ZUNmblRlbXBsYXRlID0gbmV3IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSh7XG4gICAgc3RhY2tBcnRpZmFjdCxcbiAgICBwYXJhbWV0ZXJzOiBhc3NldFBhcmFtcyxcbiAgICBhY2NvdW50OiByZXNvbHZlZEVudi5hY2NvdW50LFxuICAgIHJlZ2lvbjogcmVzb2x2ZWRFbnYucmVnaW9uLFxuICAgIHBhcnRpdGlvbjogKGF3YWl0IHNkay5jdXJyZW50QWNjb3VudCgpKS5wYXJ0aXRpb24sXG4gICAgdXJsU3VmZml4OiBzZGsuZ2V0RW5kcG9pbnRTdWZmaXgsXG4gICAgbGlzdFN0YWNrUmVzb3VyY2VzLFxuICB9KTtcblxuICBjb25zdCBjdXJyZW50VGVtcGxhdGUgPSBhd2FpdCBjbG91ZEZvcm1hdGlvblN0YWNrLnRlbXBsYXRlKCk7XG4gIGNvbnN0IHN0YWNrQ2hhbmdlcyA9IGNmbl9kaWZmLmRpZmZUZW1wbGF0ZShjdXJyZW50VGVtcGxhdGUsIHN0YWNrQXJ0aWZhY3QudGVtcGxhdGUpO1xuICBjb25zdCBob3Rzd2FwcGFibGVDaGFuZ2VzID0gYXdhaXQgZmluZEFsbEhvdHN3YXBwYWJsZUNoYW5nZXMoc3RhY2tDaGFuZ2VzLCBldmFsdWF0ZUNmblRlbXBsYXRlKTtcbiAgaWYgKCFob3Rzd2FwcGFibGVDaGFuZ2VzKSB7XG4gICAgLy8gdGhpcyBtZWFucyB0aGVyZSB3ZXJlIGNoYW5nZXMgdG8gdGhlIHRlbXBsYXRlIHRoYXQgY2Fubm90IGJlIHNob3J0LWNpcmN1aXRlZFxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBhcHBseSB0aGUgc2hvcnQtY2lyY3VpdGFibGUgY2hhbmdlc1xuICBhd2FpdCBhcHBseUFsbEhvdHN3YXBwYWJsZUNoYW5nZXMoc2RrLCBob3Rzd2FwcGFibGVDaGFuZ2VzKTtcblxuICByZXR1cm4geyBub09wOiBob3Rzd2FwcGFibGVDaGFuZ2VzLmxlbmd0aCA9PT0gMCwgc3RhY2tBcm46IGNsb3VkRm9ybWF0aW9uU3RhY2suc3RhY2tJZCwgb3V0cHV0czogY2xvdWRGb3JtYXRpb25TdGFjay5vdXRwdXRzLCBzdGFja0FydGlmYWN0IH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRBbGxIb3Rzd2FwcGFibGVDaGFuZ2VzKFxuICBzdGFja0NoYW5nZXM6IGNmbl9kaWZmLlRlbXBsYXRlRGlmZiwgZXZhbHVhdGVDZm5UZW1wbGF0ZTogRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLFxuKTogUHJvbWlzZTxIb3Rzd2FwT3BlcmF0aW9uW10gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzb3VyY2VEaWZmZXJlbmNlcyA9IGdldFN0YWNrUmVzb3VyY2VEaWZmZXJlbmNlcyhzdGFja0NoYW5nZXMpO1xuXG4gIGxldCBmb3VuZE5vbkhvdHN3YXBwYWJsZUNoYW5nZSA9IGZhbHNlO1xuICBjb25zdCBwcm9taXNlczogQXJyYXk8QXJyYXk8UHJvbWlzZTxDaGFuZ2VIb3Rzd2FwUmVzdWx0Pj4+ID0gW107XG4gIC8vIGdhdGhlciB0aGUgcmVzdWx0cyBvZiB0aGUgZGV0ZWN0b3IgZnVuY3Rpb25zXG4gIGZvciAoY29uc3QgW2xvZ2ljYWxJZCwgY2hhbmdlXSBvZiBPYmplY3QuZW50cmllcyhyZXNvdXJjZURpZmZlcmVuY2VzKSkge1xuICAgIGNvbnN0IHJlc291cmNlSG90c3dhcEV2YWx1YXRpb24gPSBpc0NhbmRpZGF0ZUZvckhvdHN3YXBwaW5nKGNoYW5nZSk7XG5cbiAgICBpZiAocmVzb3VyY2VIb3Rzd2FwRXZhbHVhdGlvbiA9PT0gQ2hhbmdlSG90c3dhcEltcGFjdC5SRVFVSVJFU19GVUxMX0RFUExPWU1FTlQpIHtcbiAgICAgIGZvdW5kTm9uSG90c3dhcHBhYmxlQ2hhbmdlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJlc291cmNlSG90c3dhcEV2YWx1YXRpb24gPT09IENoYW5nZUhvdHN3YXBJbXBhY3QuSVJSRUxFVkFOVCkge1xuICAgICAgLy8gZW1wdHkgJ2lmJyBqdXN0IGZvciBmbG93LWF3YXJlIHR5cGluZyB0byBraWNrIGluLi4uXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2VzLnB1c2goW1xuICAgICAgICBpc0hvdHN3YXBwYWJsZUxhbWJkYUZ1bmN0aW9uQ2hhbmdlKGxvZ2ljYWxJZCwgcmVzb3VyY2VIb3Rzd2FwRXZhbHVhdGlvbiwgZXZhbHVhdGVDZm5UZW1wbGF0ZSksXG4gICAgICAgIGlzSG90c3dhcHBhYmxlU3RhdGVNYWNoaW5lQ2hhbmdlKGxvZ2ljYWxJZCwgcmVzb3VyY2VIb3Rzd2FwRXZhbHVhdGlvbiwgZXZhbHVhdGVDZm5UZW1wbGF0ZSksXG4gICAgICAgIGlzSG90c3dhcHBhYmxlRWNzU2VydmljZUNoYW5nZShsb2dpY2FsSWQsIHJlc291cmNlSG90c3dhcEV2YWx1YXRpb24sIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpLFxuICAgICAgICBpc0hvdHN3YXBwYWJsZVMzQnVja2V0RGVwbG95bWVudENoYW5nZShsb2dpY2FsSWQsIHJlc291cmNlSG90c3dhcEV2YWx1YXRpb24sIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpLFxuICAgICAgICBpc0hvdHN3YXBwYWJsZUNvZGVCdWlsZFByb2plY3RDaGFuZ2UobG9naWNhbElkLCByZXNvdXJjZUhvdHN3YXBFdmFsdWF0aW9uLCBldmFsdWF0ZUNmblRlbXBsYXRlKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlc29sdmUgYWxsIGRldGVjdG9yIHJlc3VsdHNcbiAgY29uc3QgY2hhbmdlc0RldGVjdGlvblJlc3VsdHM6IEFycmF5PEFycmF5PENoYW5nZUhvdHN3YXBSZXN1bHQ+PiA9IFtdO1xuICBmb3IgKGNvbnN0IGRldGVjdG9yUmVzdWx0UHJvbWlzZXMgb2YgcHJvbWlzZXMpIHtcbiAgICBjb25zdCBob3Rzd2FwRGV0ZWN0aW9uUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRldGVjdG9yUmVzdWx0UHJvbWlzZXMpO1xuICAgIGNoYW5nZXNEZXRlY3Rpb25SZXN1bHRzLnB1c2goaG90c3dhcERldGVjdGlvblJlc3VsdHMpO1xuICB9XG5cbiAgY29uc3QgaG90c3dhcHBhYmxlUmVzb3VyY2VzID0gbmV3IEFycmF5PEhvdHN3YXBPcGVyYXRpb24+KCk7XG4gIGZvciAoY29uc3QgaG90c3dhcERldGVjdGlvblJlc3VsdHMgb2YgY2hhbmdlc0RldGVjdGlvblJlc3VsdHMpIHtcbiAgICBjb25zdCBwZXJDaGFuZ2VIb3Rzd2FwcGFibGVSZXNvdXJjZXMgPSBuZXcgQXJyYXk8SG90c3dhcE9wZXJhdGlvbj4oKTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGhvdHN3YXBEZXRlY3Rpb25SZXN1bHRzKSB7XG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGVyQ2hhbmdlSG90c3dhcHBhYmxlUmVzb3VyY2VzLnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBmb3VuZCBhbnkgaG90c3dhcHBhYmxlIGNoYW5nZXMsIHJldHVybiBub3dcbiAgICBpZiAocGVyQ2hhbmdlSG90c3dhcHBhYmxlUmVzb3VyY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGhvdHN3YXBwYWJsZVJlc291cmNlcy5wdXNoKC4uLnBlckNoYW5nZUhvdHN3YXBwYWJsZVJlc291cmNlcyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBubyBob3Rzd2FwcGFibGUgY2hhbmdlcyBmb3VuZCwgc28gYXQgbGVhc3Qgb25lIElSUkVMRVZBTlQgbWVhbnMgd2UgY2FuIGlnbm9yZSB0aGlzIGNoYW5nZTtcbiAgICAvLyBvdGhlcndpc2UsIGFsbCBhbnN3ZXJzIGFyZSBSRVFVSVJFU19GVUxMX0RFUExPWU1FTlQsIHNvIHRoaXMgbWVhbnMgd2UgY2FuJ3QgaG90c3dhcCB0aGlzIGNoYW5nZSxcbiAgICAvLyBhbmQgaGF2ZSB0byBkbyBhIGZ1bGwgZGVwbG95bWVudCBpbnN0ZWFkXG4gICAgaWYgKCFob3Rzd2FwRGV0ZWN0aW9uUmVzdWx0cy5zb21lKGhkciA9PiBoZHIgPT09IENoYW5nZUhvdHN3YXBJbXBhY3QuSVJSRUxFVkFOVCkpIHtcbiAgICAgIGZvdW5kTm9uSG90c3dhcHBhYmxlQ2hhbmdlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm91bmROb25Ib3Rzd2FwcGFibGVDaGFuZ2UgPyB1bmRlZmluZWQgOiBob3Rzd2FwcGFibGVSZXNvdXJjZXM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhbGwgY2hhbmdlcyB0byByZXNvdXJjZXMgaW4gdGhlIGdpdmVuIFN0YWNrLlxuICpcbiAqIEBwYXJhbSBzdGFja0NoYW5nZXMgdGhlIGNvbGxlY3Rpb24gb2YgYWxsIGNoYW5nZXMgdG8gYSBnaXZlbiBTdGFja1xuICovXG5mdW5jdGlvbiBnZXRTdGFja1Jlc291cmNlRGlmZmVyZW5jZXMoc3RhY2tDaGFuZ2VzOiBjZm5fZGlmZi5UZW1wbGF0ZURpZmYpOiB7IFtsb2dpY2FsSWQ6IHN0cmluZ106IGNmbl9kaWZmLlJlc291cmNlRGlmZmVyZW5jZSB9IHtcbiAgLy8gd2UgbmVlZCB0byBjb2xsYXBzZSBsb2dpY2FsIElEIHJlbmFtZSBjaGFuZ2VzIGludG8gb25lIGNoYW5nZSxcbiAgLy8gYXMgdGhleSBhcmUgcmVwcmVzZW50ZWQgaW4gc3RhY2tDaGFuZ2VzIGFzIGEgcGFpciBvZiB0d28gY2hhbmdlczogb25lIGFkZGl0aW9uIGFuZCBvbmUgcmVtb3ZhbFxuICBjb25zdCBhbGxSZXNvdXJjZUNoYW5nZXM6IHsgW2xvZ0lkOiBzdHJpbmddOiBjZm5fZGlmZi5SZXNvdXJjZURpZmZlcmVuY2UgfSA9IHN0YWNrQ2hhbmdlcy5yZXNvdXJjZXMuY2hhbmdlcztcbiAgY29uc3QgYWxsUmVtb3ZhbENoYW5nZXMgPSBmaWx0ZXJEaWN0KGFsbFJlc291cmNlQ2hhbmdlcywgcmVzQ2hhbmdlID0+IHJlc0NoYW5nZS5pc1JlbW92YWwpO1xuICBjb25zdCBhbGxOb25SZW1vdmFsQ2hhbmdlcyA9IGZpbHRlckRpY3QoYWxsUmVzb3VyY2VDaGFuZ2VzLCByZXNDaGFuZ2UgPT4gIXJlc0NoYW5nZS5pc1JlbW92YWwpO1xuICBmb3IgKGNvbnN0IFtsb2dJZCwgbm9uUmVtb3ZhbENoYW5nZV0gb2YgT2JqZWN0LmVudHJpZXMoYWxsTm9uUmVtb3ZhbENoYW5nZXMpKSB7XG4gICAgaWYgKG5vblJlbW92YWxDaGFuZ2UuaXNBZGRpdGlvbikge1xuICAgICAgY29uc3QgYWRkQ2hhbmdlID0gbm9uUmVtb3ZhbENoYW5nZTtcbiAgICAgIC8vIHNlYXJjaCBmb3IgYW4gaWRlbnRpY2FsIHJlbW92YWwgY2hhbmdlXG4gICAgICBjb25zdCBpZGVudGljYWxSZW1vdmFsQ2hhbmdlID0gT2JqZWN0LmVudHJpZXMoYWxsUmVtb3ZhbENoYW5nZXMpLmZpbmQoKFtfLCByZW1DaGFuZ2VdKSA9PiB7XG4gICAgICAgIHJldHVybiBjaGFuZ2VzQXJlRm9yU2FtZVJlc291cmNlKHJlbUNoYW5nZSwgYWRkQ2hhbmdlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gaWYgd2UgZm91bmQgb25lLCB0aGVuIHRoaXMgbWVhbnMgdGhpcyBpcyBhIHJlbmFtZSBjaGFuZ2VcbiAgICAgIGlmIChpZGVudGljYWxSZW1vdmFsQ2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IFtyZW1vdmVkTG9nSWQsIHJlbW92ZWRSZXNvdXJjZUNoYW5nZV0gPSBpZGVudGljYWxSZW1vdmFsQ2hhbmdlO1xuICAgICAgICBhbGxOb25SZW1vdmFsQ2hhbmdlc1tsb2dJZF0gPSBtYWtlUmVuYW1lRGlmZmVyZW5jZShyZW1vdmVkUmVzb3VyY2VDaGFuZ2UsIGFkZENoYW5nZSk7XG4gICAgICAgIC8vIGRlbGV0ZSB0aGUgcmVtb3ZhbCBjaGFuZ2UgdGhhdCBmb3JtcyB0aGUgcmVuYW1lIHBhaXJcbiAgICAgICAgZGVsZXRlIGFsbFJlbW92YWxDaGFuZ2VzW3JlbW92ZWRMb2dJZF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgYXJlIGFsbCBvZiB0aGUgcmVtYWluaW5nIHJlbW92YWwgY2hhbmdlcyxcbiAgLy8gcGx1cyBhbGwgb2YgdGhlIG5vbi1yZW1vdmFsIGNoYW5nZXNcbiAgLy8gKHdlIHNhdmVkIHRoZSByZW5hbWUgY2hhbmdlcyBpbiB0aGF0IG9iamVjdCBhbHJlYWR5KVxuICByZXR1cm4ge1xuICAgIC4uLmFsbFJlbW92YWxDaGFuZ2VzLFxuICAgIC4uLmFsbE5vblJlbW92YWxDaGFuZ2VzLFxuICB9O1xufVxuXG4vKiogRmlsdGVycyBhbiBvYmplY3Qgd2l0aCBzdHJpbmcga2V5cyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjYWxsYmFjayByZXR1cm5zICd0cnVlJyBmb3IgdGhlIGdpdmVuIHZhbHVlIGluIHRoZSBvYmplY3QuICovXG5mdW5jdGlvbiBmaWx0ZXJEaWN0PFQ+KGRpY3Q6IHsgW2tleTogc3RyaW5nXTogVCB9LCBmdW5jOiAodDogVCkgPT4gYm9vbGVhbik6IHsgW2tleTogc3RyaW5nXTogVCB9IHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRpY3QpLnJlZHVjZSgoYWNjLCBba2V5LCB0XSkgPT4ge1xuICAgIGlmIChmdW5jKHQpKSB7XG4gICAgICBhY2Nba2V5XSA9IHQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIHsgW2tleTogc3RyaW5nXTogVCB9KTtcbn1cblxuLyoqIFJldHVybnMgJ3RydWUnIGlmIGEgcGFpciBvZiBjaGFuZ2VzIGlzIGZvciB0aGUgc2FtZSByZXNvdXJjZS4gKi9cbmZ1bmN0aW9uIGNoYW5nZXNBcmVGb3JTYW1lUmVzb3VyY2Uob2xkQ2hhbmdlOiBjZm5fZGlmZi5SZXNvdXJjZURpZmZlcmVuY2UsIG5ld0NoYW5nZTogY2ZuX2RpZmYuUmVzb3VyY2VEaWZmZXJlbmNlKTogYm9vbGVhbiB7XG4gIHJldHVybiBvbGRDaGFuZ2Uub2xkUmVzb3VyY2VUeXBlID09PSBuZXdDaGFuZ2UubmV3UmVzb3VyY2VUeXBlICYmXG4gICAgICAvLyB0aGlzIGlzbid0IGdyZWF0LCBidXQgSSBkb24ndCB3YW50IHRvIGJyaW5nIGluIHNvbWV0aGluZyBsaWtlIHVuZGVyc2NvcmUganVzdCBmb3IgdGhpcyBjb21wYXJpc29uXG4gICAgICBKU09OLnN0cmluZ2lmeShvbGRDaGFuZ2Uub2xkUHJvcGVydGllcykgPT09IEpTT04uc3RyaW5naWZ5KG5ld0NoYW5nZS5uZXdQcm9wZXJ0aWVzKTtcbn1cblxuZnVuY3Rpb24gbWFrZVJlbmFtZURpZmZlcmVuY2UoXG4gIHJlbUNoYW5nZTogY2ZuX2RpZmYuUmVzb3VyY2VEaWZmZXJlbmNlLFxuICBhZGRDaGFuZ2U6IGNmbl9kaWZmLlJlc291cmNlRGlmZmVyZW5jZSxcbik6IGNmbl9kaWZmLlJlc291cmNlRGlmZmVyZW5jZSB7XG4gIHJldHVybiBuZXcgY2ZuX2RpZmYuUmVzb3VyY2VEaWZmZXJlbmNlKFxuICAgIC8vIHdlIGhhdmUgdG8gZmlsbCBpbiB0aGUgb2xkIHZhbHVlLCBiZWNhdXNlIG90aGVyd2lzZSB0aGlzIHdpbGwgYmUgY2xhc3NpZmllZCBhcyBhIG5vbi1ob3Rzd2FwcGFibGUgY2hhbmdlXG4gICAgcmVtQ2hhbmdlLm9sZFZhbHVlLFxuICAgIGFkZENoYW5nZS5uZXdWYWx1ZSxcbiAgICB7XG4gICAgICByZXNvdXJjZVR5cGU6IHtcbiAgICAgICAgb2xkVHlwZTogcmVtQ2hhbmdlLm9sZFJlc291cmNlVHlwZSxcbiAgICAgICAgbmV3VHlwZTogYWRkQ2hhbmdlLm5ld1Jlc291cmNlVHlwZSxcbiAgICAgIH0sXG4gICAgICBwcm9wZXJ0eURpZmZzOiAoYWRkQ2hhbmdlIGFzIGFueSkucHJvcGVydHlEaWZmcyxcbiAgICAgIG90aGVyRGlmZnM6IChhZGRDaGFuZ2UgYXMgYW55KS5vdGhlckRpZmZzLFxuICAgIH0sXG4gICk7XG59XG5cbi8qKlxuICogcmV0dXJucyBgQ2hhbmdlSG90c3dhcEltcGFjdC5SRVFVSVJFU19GVUxMX0RFUExPWU1FTlRgIGlmIGEgcmVzb3VyY2Ugd2FzIGRlbGV0ZWQsIG9yIGEgY2hhbmdlIHRoYXQgd2UgY2Fubm90IHNob3J0LWNpcmN1aXQgb2NjdXJlZC5cbiAqIFJldHVybnMgYENoYW5nZUhvdHN3YXBJbXBhY3QuSVJSRUxFVkFOVGAgaWYgYSBjaGFuZ2UgdGhhdCBkb2VzIG5vdCBpbXBhY3Qgc2hvcnRjaXJjdWl0aW5nIG9jY3VyZWQsIHN1Y2ggYXMgYSBtZXRhZGF0YSBjaGFuZ2UuXG4gKi9cbmZ1bmN0aW9uIGlzQ2FuZGlkYXRlRm9ySG90c3dhcHBpbmcoY2hhbmdlOiBjZm5fZGlmZi5SZXNvdXJjZURpZmZlcmVuY2UpOiBIb3Rzd2FwcGFibGVDaGFuZ2VDYW5kaWRhdGUgfCBDaGFuZ2VIb3Rzd2FwSW1wYWN0IHtcbiAgLy8gYSByZXNvdXJjZSBoYXMgYmVlbiByZW1vdmVkIE9SIGEgcmVzb3VyY2UgaGFzIGJlZW4gYWRkZWQ7IHdlIGNhbid0IHNob3J0LWNpcmN1aXQgdGhhdCBjaGFuZ2VcbiAgaWYgKCFjaGFuZ2UubmV3VmFsdWUgfHwgIWNoYW5nZS5vbGRWYWx1ZSkge1xuICAgIHJldHVybiBDaGFuZ2VIb3Rzd2FwSW1wYWN0LlJFUVVJUkVTX0ZVTExfREVQTE9ZTUVOVDtcbiAgfVxuXG4gIC8vIElnbm9yZSBNZXRhZGF0YSBjaGFuZ2VzXG4gIGlmIChjaGFuZ2UubmV3VmFsdWUuVHlwZSA9PT0gJ0FXUzo6Q0RLOjpNZXRhZGF0YScpIHtcbiAgICByZXR1cm4gQ2hhbmdlSG90c3dhcEltcGFjdC5JUlJFTEVWQU5UO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuZXdWYWx1ZTogY2hhbmdlLm5ld1ZhbHVlLFxuICAgIHByb3BlcnR5VXBkYXRlczogY2hhbmdlLnByb3BlcnR5VXBkYXRlcyxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlBbGxIb3Rzd2FwcGFibGVDaGFuZ2VzKFxuICBzZGs6IElTREssIGhvdHN3YXBwYWJsZUNoYW5nZXM6IEhvdHN3YXBPcGVyYXRpb25bXSxcbik6IFByb21pc2U8dm9pZFtdPiB7XG4gIHByaW50KGBcXG4ke0lDT059IGhvdHN3YXBwaW5nIHJlc291cmNlczpgKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGhvdHN3YXBwYWJsZUNoYW5nZXMubWFwKGhvdHN3YXBPcGVyYXRpb24gPT4ge1xuICAgIHJldHVybiBhcHBseUhvdHN3YXBwYWJsZUNoYW5nZShzZGssIGhvdHN3YXBPcGVyYXRpb24pO1xuICB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5SG90c3dhcHBhYmxlQ2hhbmdlKHNkazogSVNESywgaG90c3dhcE9wZXJhdGlvbjogSG90c3dhcE9wZXJhdGlvbik6IFByb21pc2U8YW55PiB7XG4gIC8vIG5vdGUgdGhlIHR5cGUgb2Ygc2VydmljZSB0aGF0IHdhcyBzdWNjZXNzZnVsbHkgaG90c3dhcHBlZCBpbiB0aGUgVXNlci1BZ2VudFxuICBjb25zdCBjdXN0b21Vc2VyQWdlbnQgPSBgY2RrLWhvdHN3YXAvc3VjY2Vzcy0ke2hvdHN3YXBPcGVyYXRpb24uc2VydmljZX1gO1xuICBzZGsuYXBwZW5kQ3VzdG9tVXNlckFnZW50KGN1c3RvbVVzZXJBZ2VudCk7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgaG90c3dhcE9wZXJhdGlvbi5yZXNvdXJjZU5hbWVzKSB7XG4gICAgICBwcmludChgICAgJHtJQ09OfSAlc2AsIGNoYWxrLmJvbGQobmFtZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgaG90c3dhcE9wZXJhdGlvbi5hcHBseShzZGspO1xuICB9IGZpbmFsbHkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBob3Rzd2FwT3BlcmF0aW9uLnJlc291cmNlTmFtZXMpIHtcbiAgICAgIHByaW50KGAke0lDT059ICVzICVzYCwgY2hhbGsuYm9sZChuYW1lKSwgY2hhbGsuZ3JlZW4oJ2hvdHN3YXBwZWQhJykpO1xuICAgIH1cbiAgICBzZGsucmVtb3ZlQ3VzdG9tVXNlckFnZW50KGN1c3RvbVVzZXJBZ2VudCk7XG4gIH1cbn1cblxuY2xhc3MgTGF6eUxpc3RTdGFja1Jlc291cmNlcyBpbXBsZW1lbnRzIExpc3RTdGFja1Jlc291cmNlcyB7XG4gIHByaXZhdGUgc3RhY2tSZXNvdXJjZXM6IENsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzZGs6IElTREssIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmcpIHtcbiAgfVxuXG4gIGFzeW5jIGxpc3RTdGFja1Jlc291cmNlcygpOiBQcm9taXNlPENsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10+IHtcbiAgICBpZiAodGhpcy5zdGFja1Jlc291cmNlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrUmVzb3VyY2VzID0gYXdhaXQgdGhpcy5nZXRTdGFja1Jlc291cmNlcygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGFja1Jlc291cmNlcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U3RhY2tSZXNvdXJjZXMoKTogUHJvbWlzZTxDbG91ZEZvcm1hdGlvbi5TdGFja1Jlc291cmNlU3VtbWFyeVtdPiB7XG4gICAgY29uc3QgcmV0ID0gbmV3IEFycmF5PENsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5PigpO1xuICAgIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBkbyB7XG4gICAgICBjb25zdCBzdGFja1Jlc291cmNlc1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5zZGsuY2xvdWRGb3JtYXRpb24oKS5saXN0U3RhY2tSZXNvdXJjZXMoe1xuICAgICAgICBTdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICBOZXh0VG9rZW46IG5leHRUb2tlbixcbiAgICAgIH0pLnByb21pc2UoKTtcbiAgICAgIHJldC5wdXNoKC4uLihzdGFja1Jlc291cmNlc1Jlc3BvbnNlLlN0YWNrUmVzb3VyY2VTdW1tYXJpZXMgPz8gW10pKTtcbiAgICAgIG5leHRUb2tlbiA9IHN0YWNrUmVzb3VyY2VzUmVzcG9uc2UuTmV4dFRva2VuO1xuICAgIH0gd2hpbGUgKG5leHRUb2tlbik7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxufVxuIl19
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90c3dhcC1kZXBsb3ltZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhvdHN3YXAtZGVwbG95bWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseURBQXlEO0FBRXpELCtCQUErQjtBQUMvQix3Q0FBbUM7QUFDbkMseUNBQXFEO0FBRXJELHlGQUE0RztBQUM1Ryx1RUFBcUY7QUFDckYsNkNBQWlJO0FBQ2pJLHlEQUF3RTtBQUN4RSxpRUFBZ0Y7QUFDaEYsMkVBQXlGO0FBQ3pGLHlGQUEwRjtBQUcxRjs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLFdBQXdCLEVBQUUsV0FBc0MsRUFDaEUsbUJBQXdDLEVBQUUsYUFBZ0Q7SUFFMUYsMkZBQTJGO0lBQzNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwRiw4R0FBOEc7SUFDOUcsa0dBQWtHO0lBQ2xHLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxXQUFXLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxlQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDakYsc0NBQXNDO0lBQ3RDLHNHQUFzRztJQUN0Ryw4R0FBOEc7SUFDOUcsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHlEQUFzQixDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGlFQUE4QixDQUFDO1FBQzdELGFBQWE7UUFDYixVQUFVLEVBQUUsV0FBVztRQUN2QixPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87UUFDNUIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1FBQzFCLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsU0FBUztRQUNqRCxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVB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QWdCLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxHQUFTLEVBQUUsZ0JBQWtDO0lBQ2xGLDhFQUE4RTtJQUM5RSxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUUsR0FBRyxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRTNDLElBQUk7UUFDRixLQUFLLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixDQUFDLGFBQWEsRUFBRTtZQUNqRCxlQUFLLENBQUMsTUFBTSxhQUFJLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDMUM7UUFDRCxPQUFPLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzFDO1lBQVM7UUFDUixLQUFLLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixDQUFDLGFBQWEsRUFBRTtZQUNqRCxlQUFLLENBQUMsR0FBRyxhQUFJLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztTQUN0RTtRQUNELEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUM1QztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZm5fZGlmZiBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwcmludCB9IGZyb20gJy4uL2xvZ2dpbmcnO1xuaW1wb3J0IHsgSVNESywgTW9kZSwgU2RrUHJvdmlkZXIgfSBmcm9tICcuL2F3cy1hdXRoJztcbmltcG9ydCB7IERlcGxveVN0YWNrUmVzdWx0IH0gZnJvbSAnLi9kZXBsb3ktc3RhY2snO1xuaW1wb3J0IHsgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlLCBMYXp5TGlzdFN0YWNrUmVzb3VyY2VzIH0gZnJvbSAnLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBpc0hvdHN3YXBwYWJsZUNvZGVCdWlsZFByb2plY3RDaGFuZ2UgfSBmcm9tICcuL2hvdHN3YXAvY29kZS1idWlsZC1wcm9qZWN0cyc7XG5pbXBvcnQgeyBJQ09OLCBDaGFuZ2VIb3Rzd2FwSW1wYWN0LCBDaGFuZ2VIb3Rzd2FwUmVzdWx0LCBIb3Rzd2FwT3BlcmF0aW9uLCBIb3Rzd2FwcGFibGVDaGFuZ2VDYW5kaWRhdGUgfSBmcm9tICcuL2hvdHN3YXAvY29tbW9uJztcbmltcG9ydCB7IGlzSG90c3dhcHBhYmxlRWNzU2VydmljZUNoYW5nZSB9IGZyb20gJy4vaG90c3dhcC9lY3Mtc2VydmljZXMnO1xuaW1wb3J0IHsgaXNIb3Rzd2FwcGFibGVMYW1iZGFGdW5jdGlvbkNoYW5nZSB9IGZyb20gJy4vaG90c3dhcC9sYW1iZGEtZnVuY3Rpb25zJztcbmltcG9ydCB7IGlzSG90c3dhcHBhYmxlUzNCdWNrZXREZXBsb3ltZW50Q2hhbmdlIH0gZnJvbSAnLi9ob3Rzd2FwL3MzLWJ1Y2tldC1kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBpc0hvdHN3YXBwYWJsZVN0YXRlTWFjaGluZUNoYW5nZSB9IGZyb20gJy4vaG90c3dhcC9zdGVwZnVuY3Rpb25zLXN0YXRlLW1hY2hpbmVzJztcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uU3RhY2sgfSBmcm9tICcuL3V0aWwvY2xvdWRmb3JtYXRpb24nO1xuXG4vKipcbiAqIFBlcmZvcm0gYSBob3Rzd2FwIGRlcGxveW1lbnQsXG4gKiBzaG9ydC1jaXJjdWl0aW5nIENsb3VkRm9ybWF0aW9uIGlmIHBvc3NpYmxlLlxuICogSWYgaXQncyBub3QgcG9zc2libGUgdG8gc2hvcnQtY2lyY3VpdCB0aGUgZGVwbG95bWVudFxuICogKGJlY2F1c2UgdGhlIENESyBTdGFjayBjb250YWlucyBjaGFuZ2VzIHRoYXQgY2Fubm90IGJlIGRlcGxveWVkIHdpdGhvdXQgQ2xvdWRGb3JtYXRpb24pLFxuICogcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeUhvdHN3YXBEZXBsb3ltZW50KFxuICBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXIsIGFzc2V0UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LFxuICBjbG91ZEZvcm1hdGlvblN0YWNrOiBDbG91ZEZvcm1hdGlvblN0YWNrLCBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4pOiBQcm9taXNlPERlcGxveVN0YWNrUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gIC8vIHJlc29sdmUgdGhlIGVudmlyb25tZW50LCBzbyB3ZSBjYW4gc3Vic3RpdHV0ZSB0aGluZ3MgbGlrZSBBV1M6OlJlZ2lvbiBpbiBDRk4gZXhwcmVzc2lvbnNcbiAgY29uc3QgcmVzb2x2ZWRFbnYgPSBhd2FpdCBzZGtQcm92aWRlci5yZXNvbHZlRW52aXJvbm1lbnQoc3RhY2tBcnRpZmFjdC5lbnZpcm9ubWVudCk7XG4gIC8vIGNyZWF0ZSBhIG5ldyBTREsgdXNpbmcgdGhlIENMSSBjcmVkZW50aWFscywgYmVjYXVzZSB0aGUgZGVmYXVsdCBvbmUgd2lsbCBub3Qgd29yayBmb3IgbmV3LXN0eWxlIHN5bnRoZXNpcyAtXG4gIC8vIGl0IGFzc3VtZXMgdGhlIGJvb3RzdHJhcCBkZXBsb3kgUm9sZSwgd2hpY2ggZG9lc24ndCBoYXZlIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBMYW1iZGEgZnVuY3Rpb25zXG4gIGNvbnN0IHNkayA9IChhd2FpdCBzZGtQcm92aWRlci5mb3JFbnZpcm9ubWVudChyZXNvbHZlZEVudiwgTW9kZS5Gb3JXcml0aW5nKSkuc2RrO1xuICAvLyBUaGUgY3VycmVudCByZXNvdXJjZXMgb2YgdGhlIFN0YWNrLlxuICAvLyBXZSBuZWVkIHRoZW0gdG8gZmlndXJlIG91dCB0aGUgcGh5c2ljYWwgbmFtZSBvZiBhIHJlc291cmNlIGluIGNhc2UgaXQgd2Fzbid0IHNwZWNpZmllZCBieSB0aGUgdXNlci5cbiAgLy8gV2UgZmV0Y2ggaXQgbGF6aWx5LCB0byBzYXZlIGEgc2VydmljZSBjYWxsLCBpbiBjYXNlIGFsbCBob3Rzd2FwcGVkIHJlc291cmNlcyBoYXZlIHRoZWlyIHBoeXNpY2FsIG5hbWVzIHNldC5cbiAgY29uc3QgbGlzdFN0YWNrUmVzb3VyY2VzID0gbmV3IExhenlMaXN0U3RhY2tSZXNvdXJjZXMoc2RrLCBzdGFja0FydGlmYWN0LnN0YWNrTmFtZSk7XG4gIGNvbnN0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUgPSBuZXcgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKHtcbiAgICBzdGFja0FydGlmYWN0LFxuICAgIHBhcmFtZXRlcnM6IGFzc2V0UGFyYW1zLFxuICAgIGFjY291bnQ6IHJlc29sdmVkRW52LmFjY291bnQsXG4gICAgcmVnaW9uOiByZXNvbHZlZEVudi5yZWdpb24sXG4gICAgcGFydGl0aW9uOiAoYXdhaXQgc2RrLmN1cnJlbnRBY2NvdW50KCkpLnBhcnRpdGlvbixcbiAgICB1cmxTdWZmaXg6IChyZWdpb24pID0+IHNkay5nZXRFbmRwb2ludFN1ZmZpeChyZWdpb24pLFxuICAgIGxpc3RTdGFja1Jlc291cmNlcyxcbiAgfSk7XG5cbiAgY29uc3QgY3VycmVudFRlbXBsYXRlID0gYXdhaXQgY2xvdWRGb3JtYXRpb25TdGFjay50ZW1wbGF0ZSgpO1xuICBjb25zdCBzdGFja0NoYW5nZXMgPSBjZm5fZGlmZi5kaWZmVGVtcGxhdGUoY3VycmVudFRlbXBsYXRlLCBzdGFja0FydGlmYWN0LnRlbXBsYXRlKTtcbiAgY29uc3QgaG90c3dhcHBhYmxlQ2hhbmdlcyA9IGF3YWl0IGZpbmRBbGxIb3Rzd2FwcGFibGVDaGFuZ2VzKHN0YWNrQ2hhbmdlcywgZXZhbHVhdGVDZm5UZW1wbGF0ZSk7XG4gIGlmICghaG90c3dhcHBhYmxlQ2hhbmdlcykge1xuICAgIC8vIHRoaXMgbWVhbnMgdGhlcmUgd2VyZSBjaGFuZ2VzIHRvIHRoZSB0ZW1wbGF0ZSB0aGF0IGNhbm5vdCBiZSBzaG9ydC1jaXJjdWl0ZWRcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gYXBwbHkgdGhlIHNob3J0LWNpcmN1aXRhYmxlIGNoYW5nZXNcbiAgYXdhaXQgYXBwbHlBbGxIb3Rzd2FwcGFibGVDaGFuZ2VzKHNkaywgaG90c3dhcHBhYmxlQ2hhbmdlcyk7XG5cbiAgcmV0dXJuIHsgbm9PcDogaG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGggPT09IDAsIHN0YWNrQXJuOiBjbG91ZEZvcm1hdGlvblN0YWNrLnN0YWNrSWQsIG91dHB1dHM6IGNsb3VkRm9ybWF0aW9uU3RhY2sub3V0cHV0cyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kQWxsSG90c3dhcHBhYmxlQ2hhbmdlcyhcbiAgc3RhY2tDaGFuZ2VzOiBjZm5fZGlmZi5UZW1wbGF0ZURpZmYsIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbik6IFByb21pc2U8SG90c3dhcE9wZXJhdGlvbltdIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc291cmNlRGlmZmVyZW5jZXMgPSBnZXRTdGFja1Jlc291cmNlRGlmZmVyZW5jZXMoc3RhY2tDaGFuZ2VzKTtcblxuICBsZXQgZm91bmROb25Ib3Rzd2FwcGFibGVDaGFuZ2UgPSBmYWxzZTtcbiAgY29uc3QgcHJvbWlzZXM6IEFycmF5PEFycmF5PFByb21pc2U8Q2hhbmdlSG90c3dhcFJlc3VsdD4+PiA9IFtdO1xuICAvLyBnYXRoZXIgdGhlIHJlc3VsdHMgb2YgdGhlIGRldGVjdG9yIGZ1bmN0aW9uc1xuICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIGNoYW5nZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VEaWZmZXJlbmNlcykpIHtcbiAgICBjb25zdCByZXNvdXJjZUhvdHN3YXBFdmFsdWF0aW9uID0gaXNDYW5kaWRhdGVGb3JIb3Rzd2FwcGluZyhjaGFuZ2UpO1xuXG4gICAgaWYgKHJlc291cmNlSG90c3dhcEV2YWx1YXRpb24gPT09IENoYW5nZUhvdHN3YXBJbXBhY3QuUkVRVUlSRVNfRlVMTF9ERVBMT1lNRU5UKSB7XG4gICAgICBmb3VuZE5vbkhvdHN3YXBwYWJsZUNoYW5nZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZUhvdHN3YXBFdmFsdWF0aW9uID09PSBDaGFuZ2VIb3Rzd2FwSW1wYWN0LklSUkVMRVZBTlQpIHtcbiAgICAgIC8vIGVtcHR5ICdpZicganVzdCBmb3IgZmxvdy1hd2FyZSB0eXBpbmcgdG8ga2ljayBpbi4uLlxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlcy5wdXNoKFtcbiAgICAgICAgaXNIb3Rzd2FwcGFibGVMYW1iZGFGdW5jdGlvbkNoYW5nZShsb2dpY2FsSWQsIHJlc291cmNlSG90c3dhcEV2YWx1YXRpb24sIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpLFxuICAgICAgICBpc0hvdHN3YXBwYWJsZVN0YXRlTWFjaGluZUNoYW5nZShsb2dpY2FsSWQsIHJlc291cmNlSG90c3dhcEV2YWx1YXRpb24sIGV2YWx1YXRlQ2ZuVGVtcGxhdGUpLFxuICAgICAgICBpc0hvdHN3YXBwYWJsZUVjc1NlcnZpY2VDaGFuZ2UobG9naWNhbElkLCByZXNvdXJjZUhvdHN3YXBFdmFsdWF0aW9uLCBldmFsdWF0ZUNmblRlbXBsYXRlKSxcbiAgICAgICAgaXNIb3Rzd2FwcGFibGVTM0J1Y2tldERlcGxveW1lbnRDaGFuZ2UobG9naWNhbElkLCByZXNvdXJjZUhvdHN3YXBFdmFsdWF0aW9uLCBldmFsdWF0ZUNmblRlbXBsYXRlKSxcbiAgICAgICAgaXNIb3Rzd2FwcGFibGVDb2RlQnVpbGRQcm9qZWN0Q2hhbmdlKGxvZ2ljYWxJZCwgcmVzb3VyY2VIb3Rzd2FwRXZhbHVhdGlvbiwgZXZhbHVhdGVDZm5UZW1wbGF0ZSksXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXNvbHZlIGFsbCBkZXRlY3RvciByZXN1bHRzXG4gIGNvbnN0IGNoYW5nZXNEZXRlY3Rpb25SZXN1bHRzOiBBcnJheTxBcnJheTxDaGFuZ2VIb3Rzd2FwUmVzdWx0Pj4gPSBbXTtcbiAgZm9yIChjb25zdCBkZXRlY3RvclJlc3VsdFByb21pc2VzIG9mIHByb21pc2VzKSB7XG4gICAgY29uc3QgaG90c3dhcERldGVjdGlvblJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChkZXRlY3RvclJlc3VsdFByb21pc2VzKTtcbiAgICBjaGFuZ2VzRGV0ZWN0aW9uUmVzdWx0cy5wdXNoKGhvdHN3YXBEZXRlY3Rpb25SZXN1bHRzKTtcbiAgfVxuXG4gIGNvbnN0IGhvdHN3YXBwYWJsZVJlc291cmNlcyA9IG5ldyBBcnJheTxIb3Rzd2FwT3BlcmF0aW9uPigpO1xuICBmb3IgKGNvbnN0IGhvdHN3YXBEZXRlY3Rpb25SZXN1bHRzIG9mIGNoYW5nZXNEZXRlY3Rpb25SZXN1bHRzKSB7XG4gICAgY29uc3QgcGVyQ2hhbmdlSG90c3dhcHBhYmxlUmVzb3VyY2VzID0gbmV3IEFycmF5PEhvdHN3YXBPcGVyYXRpb24+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBob3Rzd2FwRGV0ZWN0aW9uUmVzdWx0cykge1xuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBlckNoYW5nZUhvdHN3YXBwYWJsZVJlc291cmNlcy5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZm91bmQgYW55IGhvdHN3YXBwYWJsZSBjaGFuZ2VzLCByZXR1cm4gbm93XG4gICAgaWYgKHBlckNoYW5nZUhvdHN3YXBwYWJsZVJlc291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBob3Rzd2FwcGFibGVSZXNvdXJjZXMucHVzaCguLi5wZXJDaGFuZ2VIb3Rzd2FwcGFibGVSZXNvdXJjZXMpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gbm8gaG90c3dhcHBhYmxlIGNoYW5nZXMgZm91bmQsIHNvIGF0IGxlYXN0IG9uZSBJUlJFTEVWQU5UIG1lYW5zIHdlIGNhbiBpZ25vcmUgdGhpcyBjaGFuZ2U7XG4gICAgLy8gb3RoZXJ3aXNlLCBhbGwgYW5zd2VycyBhcmUgUkVRVUlSRVNfRlVMTF9ERVBMT1lNRU5ULCBzbyB0aGlzIG1lYW5zIHdlIGNhbid0IGhvdHN3YXAgdGhpcyBjaGFuZ2UsXG4gICAgLy8gYW5kIGhhdmUgdG8gZG8gYSBmdWxsIGRlcGxveW1lbnQgaW5zdGVhZFxuICAgIGlmICghaG90c3dhcERldGVjdGlvblJlc3VsdHMuc29tZShoZHIgPT4gaGRyID09PSBDaGFuZ2VIb3Rzd2FwSW1wYWN0LklSUkVMRVZBTlQpKSB7XG4gICAgICBmb3VuZE5vbkhvdHN3YXBwYWJsZUNoYW5nZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZvdW5kTm9uSG90c3dhcHBhYmxlQ2hhbmdlID8gdW5kZWZpbmVkIDogaG90c3dhcHBhYmxlUmVzb3VyY2VzO1xufVxuXG4vKipcbiAqIFJldHVybnMgYWxsIGNoYW5nZXMgdG8gcmVzb3VyY2VzIGluIHRoZSBnaXZlbiBTdGFjay5cbiAqXG4gKiBAcGFyYW0gc3RhY2tDaGFuZ2VzIHRoZSBjb2xsZWN0aW9uIG9mIGFsbCBjaGFuZ2VzIHRvIGEgZ2l2ZW4gU3RhY2tcbiAqL1xuZnVuY3Rpb24gZ2V0U3RhY2tSZXNvdXJjZURpZmZlcmVuY2VzKHN0YWNrQ2hhbmdlczogY2ZuX2RpZmYuVGVtcGxhdGVEaWZmKTogeyBbbG9naWNhbElkOiBzdHJpbmddOiBjZm5fZGlmZi5SZXNvdXJjZURpZmZlcmVuY2UgfSB7XG4gIC8vIHdlIG5lZWQgdG8gY29sbGFwc2UgbG9naWNhbCBJRCByZW5hbWUgY2hhbmdlcyBpbnRvIG9uZSBjaGFuZ2UsXG4gIC8vIGFzIHRoZXkgYXJlIHJlcHJlc2VudGVkIGluIHN0YWNrQ2hhbmdlcyBhcyBhIHBhaXIgb2YgdHdvIGNoYW5nZXM6IG9uZSBhZGRpdGlvbiBhbmQgb25lIHJlbW92YWxcbiAgY29uc3QgYWxsUmVzb3VyY2VDaGFuZ2VzOiB7IFtsb2dJZDogc3RyaW5nXTogY2ZuX2RpZmYuUmVzb3VyY2VEaWZmZXJlbmNlIH0gPSBzdGFja0NoYW5nZXMucmVzb3VyY2VzLmNoYW5nZXM7XG4gIGNvbnN0IGFsbFJlbW92YWxDaGFuZ2VzID0gZmlsdGVyRGljdChhbGxSZXNvdXJjZUNoYW5nZXMsIHJlc0NoYW5nZSA9PiByZXNDaGFuZ2UuaXNSZW1vdmFsKTtcbiAgY29uc3QgYWxsTm9uUmVtb3ZhbENoYW5nZXMgPSBmaWx0ZXJEaWN0KGFsbFJlc291cmNlQ2hhbmdlcywgcmVzQ2hhbmdlID0+ICFyZXNDaGFuZ2UuaXNSZW1vdmFsKTtcbiAgZm9yIChjb25zdCBbbG9nSWQsIG5vblJlbW92YWxDaGFuZ2VdIG9mIE9iamVjdC5lbnRyaWVzKGFsbE5vblJlbW92YWxDaGFuZ2VzKSkge1xuICAgIGlmIChub25SZW1vdmFsQ2hhbmdlLmlzQWRkaXRpb24pIHtcbiAgICAgIGNvbnN0IGFkZENoYW5nZSA9IG5vblJlbW92YWxDaGFuZ2U7XG4gICAgICAvLyBzZWFyY2ggZm9yIGFuIGlkZW50aWNhbCByZW1vdmFsIGNoYW5nZVxuICAgICAgY29uc3QgaWRlbnRpY2FsUmVtb3ZhbENoYW5nZSA9IE9iamVjdC5lbnRyaWVzKGFsbFJlbW92YWxDaGFuZ2VzKS5maW5kKChbXywgcmVtQ2hhbmdlXSkgPT4ge1xuICAgICAgICByZXR1cm4gY2hhbmdlc0FyZUZvclNhbWVSZXNvdXJjZShyZW1DaGFuZ2UsIGFkZENoYW5nZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIGlmIHdlIGZvdW5kIG9uZSwgdGhlbiB0aGlzIG1lYW5zIHRoaXMgaXMgYSByZW5hbWUgY2hhbmdlXG4gICAgICBpZiAoaWRlbnRpY2FsUmVtb3ZhbENoYW5nZSkge1xuICAgICAgICBjb25zdCBbcmVtb3ZlZExvZ0lkLCByZW1vdmVkUmVzb3VyY2VDaGFuZ2VdID0gaWRlbnRpY2FsUmVtb3ZhbENoYW5nZTtcbiAgICAgICAgYWxsTm9uUmVtb3ZhbENoYW5nZXNbbG9nSWRdID0gbWFrZVJlbmFtZURpZmZlcmVuY2UocmVtb3ZlZFJlc291cmNlQ2hhbmdlLCBhZGRDaGFuZ2UpO1xuICAgICAgICAvLyBkZWxldGUgdGhlIHJlbW92YWwgY2hhbmdlIHRoYXQgZm9ybXMgdGhlIHJlbmFtZSBwYWlyXG4gICAgICAgIGRlbGV0ZSBhbGxSZW1vdmFsQ2hhbmdlc1tyZW1vdmVkTG9nSWRdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyB0aGUgZmluYWwgcmVzdWx0IGFyZSBhbGwgb2YgdGhlIHJlbWFpbmluZyByZW1vdmFsIGNoYW5nZXMsXG4gIC8vIHBsdXMgYWxsIG9mIHRoZSBub24tcmVtb3ZhbCBjaGFuZ2VzXG4gIC8vICh3ZSBzYXZlZCB0aGUgcmVuYW1lIGNoYW5nZXMgaW4gdGhhdCBvYmplY3QgYWxyZWFkeSlcbiAgcmV0dXJuIHtcbiAgICAuLi5hbGxSZW1vdmFsQ2hhbmdlcyxcbiAgICAuLi5hbGxOb25SZW1vdmFsQ2hhbmdlcyxcbiAgfTtcbn1cblxuLyoqIEZpbHRlcnMgYW4gb2JqZWN0IHdpdGggc3RyaW5nIGtleXMgYmFzZWQgb24gd2hldGhlciB0aGUgY2FsbGJhY2sgcmV0dXJucyAndHJ1ZScgZm9yIHRoZSBnaXZlbiB2YWx1ZSBpbiB0aGUgb2JqZWN0LiAqL1xuZnVuY3Rpb24gZmlsdGVyRGljdDxUPihkaWN0OiB7IFtrZXk6IHN0cmluZ106IFQgfSwgZnVuYzogKHQ6IFQpID0+IGJvb2xlYW4pOiB7IFtrZXk6IHN0cmluZ106IFQgfSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhkaWN0KS5yZWR1Y2UoKGFjYywgW2tleSwgdF0pID0+IHtcbiAgICBpZiAoZnVuYyh0KSkge1xuICAgICAgYWNjW2tleV0gPSB0O1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyB7IFtrZXk6IHN0cmluZ106IFQgfSk7XG59XG5cbi8qKiBSZXR1cm5zICd0cnVlJyBpZiBhIHBhaXIgb2YgY2hhbmdlcyBpcyBmb3IgdGhlIHNhbWUgcmVzb3VyY2UuICovXG5mdW5jdGlvbiBjaGFuZ2VzQXJlRm9yU2FtZVJlc291cmNlKG9sZENoYW5nZTogY2ZuX2RpZmYuUmVzb3VyY2VEaWZmZXJlbmNlLCBuZXdDaGFuZ2U6IGNmbl9kaWZmLlJlc291cmNlRGlmZmVyZW5jZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2xkQ2hhbmdlLm9sZFJlc291cmNlVHlwZSA9PT0gbmV3Q2hhbmdlLm5ld1Jlc291cmNlVHlwZSAmJlxuICAgICAgLy8gdGhpcyBpc24ndCBncmVhdCwgYnV0IEkgZG9uJ3Qgd2FudCB0byBicmluZyBpbiBzb21ldGhpbmcgbGlrZSB1bmRlcnNjb3JlIGp1c3QgZm9yIHRoaXMgY29tcGFyaXNvblxuICAgICAgSlNPTi5zdHJpbmdpZnkob2xkQ2hhbmdlLm9sZFByb3BlcnRpZXMpID09PSBKU09OLnN0cmluZ2lmeShuZXdDaGFuZ2UubmV3UHJvcGVydGllcyk7XG59XG5cbmZ1bmN0aW9uIG1ha2VSZW5hbWVEaWZmZXJlbmNlKFxuICByZW1DaGFuZ2U6IGNmbl9kaWZmLlJlc291cmNlRGlmZmVyZW5jZSxcbiAgYWRkQ2hhbmdlOiBjZm5fZGlmZi5SZXNvdXJjZURpZmZlcmVuY2UsXG4pOiBjZm5fZGlmZi5SZXNvdXJjZURpZmZlcmVuY2Uge1xuICByZXR1cm4gbmV3IGNmbl9kaWZmLlJlc291cmNlRGlmZmVyZW5jZShcbiAgICAvLyB3ZSBoYXZlIHRvIGZpbGwgaW4gdGhlIG9sZCB2YWx1ZSwgYmVjYXVzZSBvdGhlcndpc2UgdGhpcyB3aWxsIGJlIGNsYXNzaWZpZWQgYXMgYSBub24taG90c3dhcHBhYmxlIGNoYW5nZVxuICAgIHJlbUNoYW5nZS5vbGRWYWx1ZSxcbiAgICBhZGRDaGFuZ2UubmV3VmFsdWUsXG4gICAge1xuICAgICAgcmVzb3VyY2VUeXBlOiB7XG4gICAgICAgIG9sZFR5cGU6IHJlbUNoYW5nZS5vbGRSZXNvdXJjZVR5cGUsXG4gICAgICAgIG5ld1R5cGU6IGFkZENoYW5nZS5uZXdSZXNvdXJjZVR5cGUsXG4gICAgICB9LFxuICAgICAgcHJvcGVydHlEaWZmczogKGFkZENoYW5nZSBhcyBhbnkpLnByb3BlcnR5RGlmZnMsXG4gICAgICBvdGhlckRpZmZzOiAoYWRkQ2hhbmdlIGFzIGFueSkub3RoZXJEaWZmcyxcbiAgICB9LFxuICApO1xufVxuXG4vKipcbiAqIHJldHVybnMgYENoYW5nZUhvdHN3YXBJbXBhY3QuUkVRVUlSRVNfRlVMTF9ERVBMT1lNRU5UYCBpZiBhIHJlc291cmNlIHdhcyBkZWxldGVkLCBvciBhIGNoYW5nZSB0aGF0IHdlIGNhbm5vdCBzaG9ydC1jaXJjdWl0IG9jY3VyZWQuXG4gKiBSZXR1cm5zIGBDaGFuZ2VIb3Rzd2FwSW1wYWN0LklSUkVMRVZBTlRgIGlmIGEgY2hhbmdlIHRoYXQgZG9lcyBub3QgaW1wYWN0IHNob3J0Y2lyY3VpdGluZyBvY2N1cmVkLCBzdWNoIGFzIGEgbWV0YWRhdGEgY2hhbmdlLlxuICovXG5mdW5jdGlvbiBpc0NhbmRpZGF0ZUZvckhvdHN3YXBwaW5nKGNoYW5nZTogY2ZuX2RpZmYuUmVzb3VyY2VEaWZmZXJlbmNlKTogSG90c3dhcHBhYmxlQ2hhbmdlQ2FuZGlkYXRlIHwgQ2hhbmdlSG90c3dhcEltcGFjdCB7XG4gIC8vIGEgcmVzb3VyY2UgaGFzIGJlZW4gcmVtb3ZlZCBPUiBhIHJlc291cmNlIGhhcyBiZWVuIGFkZGVkOyB3ZSBjYW4ndCBzaG9ydC1jaXJjdWl0IHRoYXQgY2hhbmdlXG4gIGlmICghY2hhbmdlLm5ld1ZhbHVlIHx8ICFjaGFuZ2Uub2xkVmFsdWUpIHtcbiAgICByZXR1cm4gQ2hhbmdlSG90c3dhcEltcGFjdC5SRVFVSVJFU19GVUxMX0RFUExPWU1FTlQ7XG4gIH1cblxuICAvLyBJZ25vcmUgTWV0YWRhdGEgY2hhbmdlc1xuICBpZiAoY2hhbmdlLm5ld1ZhbHVlLlR5cGUgPT09ICdBV1M6OkNESzo6TWV0YWRhdGEnKSB7XG4gICAgcmV0dXJuIENoYW5nZUhvdHN3YXBJbXBhY3QuSVJSRUxFVkFOVDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmV3VmFsdWU6IGNoYW5nZS5uZXdWYWx1ZSxcbiAgICBwcm9wZXJ0eVVwZGF0ZXM6IGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5QWxsSG90c3dhcHBhYmxlQ2hhbmdlcyhzZGs6IElTREssIGhvdHN3YXBwYWJsZUNoYW5nZXM6IEhvdHN3YXBPcGVyYXRpb25bXSk6IFByb21pc2U8dm9pZFtdPiB7XG4gIHByaW50KGBcXG4ke0lDT059IGhvdHN3YXBwaW5nIHJlc291cmNlczpgKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGhvdHN3YXBwYWJsZUNoYW5nZXMubWFwKGhvdHN3YXBPcGVyYXRpb24gPT4ge1xuICAgIHJldHVybiBhcHBseUhvdHN3YXBwYWJsZUNoYW5nZShzZGssIGhvdHN3YXBPcGVyYXRpb24pO1xuICB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5SG90c3dhcHBhYmxlQ2hhbmdlKHNkazogSVNESywgaG90c3dhcE9wZXJhdGlvbjogSG90c3dhcE9wZXJhdGlvbik6IFByb21pc2U8YW55PiB7XG4gIC8vIG5vdGUgdGhlIHR5cGUgb2Ygc2VydmljZSB0aGF0IHdhcyBzdWNjZXNzZnVsbHkgaG90c3dhcHBlZCBpbiB0aGUgVXNlci1BZ2VudFxuICBjb25zdCBjdXN0b21Vc2VyQWdlbnQgPSBgY2RrLWhvdHN3YXAvc3VjY2Vzcy0ke2hvdHN3YXBPcGVyYXRpb24uc2VydmljZX1gO1xuICBzZGsuYXBwZW5kQ3VzdG9tVXNlckFnZW50KGN1c3RvbVVzZXJBZ2VudCk7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgaG90c3dhcE9wZXJhdGlvbi5yZXNvdXJjZU5hbWVzKSB7XG4gICAgICBwcmludChgICAgJHtJQ09OfSAlc2AsIGNoYWxrLmJvbGQobmFtZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgaG90c3dhcE9wZXJhdGlvbi5hcHBseShzZGspO1xuICB9IGZpbmFsbHkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBob3Rzd2FwT3BlcmF0aW9uLnJlc291cmNlTmFtZXMpIHtcbiAgICAgIHByaW50KGAke0lDT059ICVzICVzYCwgY2hhbGsuYm9sZChuYW1lKSwgY2hhbGsuZ3JlZW4oJ2hvdHN3YXBwZWQhJykpO1xuICAgIH1cbiAgICBzZGsucmVtb3ZlQ3VzdG9tVXNlckFnZW50KGN1c3RvbVVzZXJBZ2VudCk7XG4gIH1cbn1cblxuIl19
@@ -0,0 +1,24 @@
1
+ import * as cxapi from '@aws-cdk/cx-api';
2
+ import { SdkProvider, ISDK } from '../aws-auth';
3
+ /**
4
+ * Configuration needed to monitor CloudWatch Log Groups
5
+ * found in a given CloudFormation Stack
6
+ */
7
+ export interface FoundLogGroupsResult {
8
+ /**
9
+ * The resolved environment (account/region) that the log
10
+ * groups are deployed in
11
+ */
12
+ readonly env: cxapi.Environment;
13
+ /**
14
+ * The SDK that can be used to read events from the CloudWatch
15
+ * Log Groups in the given environment
16
+ */
17
+ readonly sdk: ISDK;
18
+ /**
19
+ * The names of the relevant CloudWatch Log Groups
20
+ * in the given CloudFormation template
21
+ */
22
+ readonly logGroupNames: string[];
23
+ }
24
+ export declare function findCloudWatchLogGroups(sdkProvider: SdkProvider, stackArtifact: cxapi.CloudFormationStackArtifact): Promise<FoundLogGroupsResult>;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findCloudWatchLogGroups = void 0;
4
+ const aws_auth_1 = require("../aws-auth");
5
+ const cloudformation_deployments_1 = require("../cloudformation-deployments");
6
+ const evaluate_cloudformation_template_1 = require("../evaluate-cloudformation-template");
7
+ // resource types that have associated CloudWatch Log Groups that should _not_ be monitored
8
+ const IGNORE_LOGS_RESOURCE_TYPES = ['AWS::EC2::FlowLog', 'AWS::CloudTrail::Trail', 'AWS::CodeBuild::Project'];
9
+ // Resource types that will create a CloudWatch log group with a specific name if one is not provided.
10
+ // The keys are CFN resource types, and the values are the name of the physical name property of that resource
11
+ // and the service name that is used in the automatically created CloudWatch log group.
12
+ const RESOURCE_TYPES_WITH_IMPLICIT_LOGS = {
13
+ 'AWS::Lambda::Function': {
14
+ PhysicalNamePropertyName: 'FunctionName',
15
+ LogGroupServiceName: 'lambda',
16
+ },
17
+ };
18
+ async function findCloudWatchLogGroups(sdkProvider, stackArtifact) {
19
+ let sdk;
20
+ const resolvedEnv = await sdkProvider.resolveEnvironment(stackArtifact.environment);
21
+ // try to assume the lookup role and fallback to the default credentials
22
+ try {
23
+ sdk = (await cloudformation_deployments_1.prepareSdkWithLookupRoleFor(sdkProvider, stackArtifact)).sdk;
24
+ }
25
+ catch (e) {
26
+ sdk = (await sdkProvider.forEnvironment(resolvedEnv, aws_auth_1.Mode.ForReading)).sdk;
27
+ }
28
+ const listStackResources = new evaluate_cloudformation_template_1.LazyListStackResources(sdk, stackArtifact.stackName);
29
+ const evaluateCfnTemplate = new evaluate_cloudformation_template_1.EvaluateCloudFormationTemplate({
30
+ stackArtifact,
31
+ parameters: {},
32
+ account: resolvedEnv.account,
33
+ region: resolvedEnv.region,
34
+ partition: (await sdk.currentAccount()).partition,
35
+ urlSuffix: (region) => sdk.getEndpointSuffix(region),
36
+ listStackResources,
37
+ });
38
+ const stackResources = await listStackResources.listStackResources();
39
+ const logGroupNames = findAllLogGroupNames(stackResources, evaluateCfnTemplate);
40
+ return {
41
+ env: resolvedEnv,
42
+ sdk,
43
+ logGroupNames,
44
+ };
45
+ }
46
+ exports.findCloudWatchLogGroups = findCloudWatchLogGroups;
47
+ /**
48
+ * Determine if a CloudWatch Log Group is associated
49
+ * with an ignored resource
50
+ */
51
+ function isReferencedFromIgnoredResource(logGroupResource, evaluateCfnTemplate) {
52
+ let foundReference = false;
53
+ const resourcesReferencingLogGroup = evaluateCfnTemplate.findReferencesTo(logGroupResource.LogicalResourceId);
54
+ for (const reference of resourcesReferencingLogGroup) {
55
+ if (IGNORE_LOGS_RESOURCE_TYPES.includes(reference.Type)) {
56
+ foundReference = true;
57
+ }
58
+ }
59
+ return foundReference;
60
+ }
61
+ /**
62
+ * Find all CloudWatch Log Groups in the deployed template.
63
+ * This will find both explicitely created Log Groups (excluding those associated with ignored resources)
64
+ * as well as Log Groups created implicitely (i.e. Lambda Functions)
65
+ */
66
+ function findAllLogGroupNames(stackResources, evaluateCfnTemplate) {
67
+ return stackResources.reduce((logGroupNames, resource) => {
68
+ let logGroupName;
69
+ if (resource.ResourceType === 'AWS::Logs::LogGroup') {
70
+ if (!isReferencedFromIgnoredResource(resource, evaluateCfnTemplate)) {
71
+ logGroupName = resource.PhysicalResourceId;
72
+ }
73
+ }
74
+ else if (RESOURCE_TYPES_WITH_IMPLICIT_LOGS[resource.ResourceType]) {
75
+ const servicePart = RESOURCE_TYPES_WITH_IMPLICIT_LOGS[resource.ResourceType].LogGroupServiceName;
76
+ logGroupName = `/aws/${servicePart}/${resource.PhysicalResourceId}`;
77
+ }
78
+ if (logGroupName) {
79
+ logGroupNames.push(logGroupName);
80
+ }
81
+ return logGroupNames;
82
+ }, []);
83
+ }
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1jbG91ZHdhdGNoLWxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmaW5kLWNsb3Vkd2F0Y2gtbG9ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwwQ0FBc0Q7QUFDdEQsOEVBQTRFO0FBQzVFLDBGQUE2RztBQUU3RywyRkFBMkY7QUFDM0YsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFFOUcsc0dBQXNHO0FBQ3RHLDhHQUE4RztBQUM5Ryx1RkFBdUY7QUFDdkYsTUFBTSxpQ0FBaUMsR0FBNkQ7SUFDbEcsdUJBQXVCLEVBQUU7UUFDdkIsd0JBQXdCLEVBQUUsY0FBYztRQUN4QyxtQkFBbUIsRUFBRSxRQUFRO0tBQzlCO0NBQ0YsQ0FBQztBQTBCSyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFdBQXdCLEVBQ3hCLGFBQWdEO0lBRWhELElBQUksR0FBUyxDQUFDO0lBQ2QsTUFBTSxXQUFXLEdBQUcsTUFBTSxXQUFXLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BGLHdFQUF3RTtJQUN4RSxJQUFJO1FBQ0YsR0FBRyxHQUFHLENBQUMsTUFBTSx3REFBMkIsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7S0FDM0U7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLEdBQUcsR0FBRyxDQUFDLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsZUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0tBQzVFO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHlEQUFzQixDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLGlFQUE4QixDQUFDO1FBQzdELGFBQWE7UUFDYixVQUFVLEVBQUUsRUFBRTtRQUNkLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztRQUM1QixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07UUFDMUIsU0FBUyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxTQUFTO1FBQ2pELFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUNwRCxrQkFBa0I7S0FDbkIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxjQUFjLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3JFLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUFDLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRWhGLE9BQU87UUFDTCxHQUFHLEVBQUUsV0FBVztRQUNoQixHQUFHO1FBQ0gsYUFBYTtLQUNkLENBQUM7QUFDSixDQUFDO0FBaENELDBEQWdDQztBQUVEOzs7R0FHRztBQUNILFNBQVMsK0JBQStCLENBQ3RDLGdCQUFxRCxFQUNyRCxtQkFBbUQ7SUFFbkQsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQzNCLE1BQU0sNEJBQTRCLEdBQUcsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5RyxLQUFLLE1BQU0sU0FBUyxJQUFJLDRCQUE0QixFQUFFO1FBQ3BELElBQUksMEJBQTBCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2RCxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQ3ZCO0tBQ0Y7SUFDRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLGNBQXFELEVBQ3JELG1CQUFtRDtJQUVuRCxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUF1QixFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ2pFLElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxxQkFBcUIsRUFBRTtZQUNuRCxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLEVBQUU7Z0JBQ25FLFlBQVksR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUM7YUFDNUM7U0FDRjthQUFNLElBQUksaUNBQWlDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ25FLE1BQU0sV0FBVyxHQUFHLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQztZQUNqRyxZQUFZLEdBQUcsUUFBUSxXQUFXLElBQUksUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDckU7UUFDRCxJQUFJLFlBQVksRUFBRTtZQUNoQixhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbiB9IGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0IHsgTW9kZSwgU2RrUHJvdmlkZXIsIElTREsgfSBmcm9tICcuLi9hd3MtYXV0aCc7XG5pbXBvcnQgeyBwcmVwYXJlU2RrV2l0aExvb2t1cFJvbGVGb3IgfSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbi1kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsIExhenlMaXN0U3RhY2tSZXNvdXJjZXMgfSBmcm9tICcuLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5cbi8vIHJlc291cmNlIHR5cGVzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIENsb3VkV2F0Y2ggTG9nIEdyb3VwcyB0aGF0IHNob3VsZCBfbm90XyBiZSBtb25pdG9yZWRcbmNvbnN0IElHTk9SRV9MT0dTX1JFU09VUkNFX1RZUEVTID0gWydBV1M6OkVDMjo6Rmxvd0xvZycsICdBV1M6OkNsb3VkVHJhaWw6OlRyYWlsJywgJ0FXUzo6Q29kZUJ1aWxkOjpQcm9qZWN0J107XG5cbi8vIFJlc291cmNlIHR5cGVzIHRoYXQgd2lsbCBjcmVhdGUgYSBDbG91ZFdhdGNoIGxvZyBncm91cCB3aXRoIGEgc3BlY2lmaWMgbmFtZSBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuLy8gVGhlIGtleXMgYXJlIENGTiByZXNvdXJjZSB0eXBlcywgYW5kIHRoZSB2YWx1ZXMgYXJlIHRoZSBuYW1lIG9mIHRoZSBwaHlzaWNhbCBuYW1lIHByb3BlcnR5IG9mIHRoYXQgcmVzb3VyY2Vcbi8vIGFuZCB0aGUgc2VydmljZSBuYW1lIHRoYXQgaXMgdXNlZCBpbiB0aGUgYXV0b21hdGljYWxseSBjcmVhdGVkIENsb3VkV2F0Y2ggbG9nIGdyb3VwLlxuY29uc3QgUkVTT1VSQ0VfVFlQRVNfV0lUSF9JTVBMSUNJVF9MT0dTOiB7IFtjZm5SZXNvdXJjZVR5cGU6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHtcbiAgJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbic6IHtcbiAgICBQaHlzaWNhbE5hbWVQcm9wZXJ0eU5hbWU6ICdGdW5jdGlvbk5hbWUnLFxuICAgIExvZ0dyb3VwU2VydmljZU5hbWU6ICdsYW1iZGEnLFxuICB9LFxufTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG5lZWRlZCB0byBtb25pdG9yIENsb3VkV2F0Y2ggTG9nIEdyb3Vwc1xuICogZm91bmQgaW4gYSBnaXZlbiBDbG91ZEZvcm1hdGlvbiBTdGFja1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kTG9nR3JvdXBzUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBlbnZpcm9ubWVudCAoYWNjb3VudC9yZWdpb24pIHRoYXQgdGhlIGxvZ1xuICAgKiBncm91cHMgYXJlIGRlcGxveWVkIGluXG4gICAqL1xuICByZWFkb25seSBlbnY6IGN4YXBpLkVudmlyb25tZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgU0RLIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVhZCBldmVudHMgZnJvbSB0aGUgQ2xvdWRXYXRjaFxuICAgKiBMb2cgR3JvdXBzIGluIHRoZSBnaXZlbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgc2RrOiBJU0RLO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgb2YgdGhlIHJlbGV2YW50IENsb3VkV2F0Y2ggTG9nIEdyb3Vwc1xuICAgKiBpbiB0aGUgZ2l2ZW4gQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZXM6IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ2xvdWRXYXRjaExvZ0dyb3VwcyhcbiAgc2RrUHJvdmlkZXI6IFNka1Byb3ZpZGVyLFxuICBzdGFja0FydGlmYWN0OiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3QsXG4pOiBQcm9taXNlPEZvdW5kTG9nR3JvdXBzUmVzdWx0PiB7XG4gIGxldCBzZGs6IElTREs7XG4gIGNvbnN0IHJlc29sdmVkRW52ID0gYXdhaXQgc2RrUHJvdmlkZXIucmVzb2x2ZUVudmlyb25tZW50KHN0YWNrQXJ0aWZhY3QuZW52aXJvbm1lbnQpO1xuICAvLyB0cnkgdG8gYXNzdW1lIHRoZSBsb29rdXAgcm9sZSBhbmQgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQgY3JlZGVudGlhbHNcbiAgdHJ5IHtcbiAgICBzZGsgPSAoYXdhaXQgcHJlcGFyZVNka1dpdGhMb29rdXBSb2xlRm9yKHNka1Byb3ZpZGVyLCBzdGFja0FydGlmYWN0KSkuc2RrO1xuICB9IGNhdGNoIChlKSB7XG4gICAgc2RrID0gKGF3YWl0IHNka1Byb3ZpZGVyLmZvckVudmlyb25tZW50KHJlc29sdmVkRW52LCBNb2RlLkZvclJlYWRpbmcpKS5zZGs7XG4gIH1cblxuICBjb25zdCBsaXN0U3RhY2tSZXNvdXJjZXMgPSBuZXcgTGF6eUxpc3RTdGFja1Jlc291cmNlcyhzZGssIHN0YWNrQXJ0aWZhY3Quc3RhY2tOYW1lKTtcbiAgY29uc3QgZXZhbHVhdGVDZm5UZW1wbGF0ZSA9IG5ldyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUoe1xuICAgIHN0YWNrQXJ0aWZhY3QsXG4gICAgcGFyYW1ldGVyczoge30sXG4gICAgYWNjb3VudDogcmVzb2x2ZWRFbnYuYWNjb3VudCxcbiAgICByZWdpb246IHJlc29sdmVkRW52LnJlZ2lvbixcbiAgICBwYXJ0aXRpb246IChhd2FpdCBzZGsuY3VycmVudEFjY291bnQoKSkucGFydGl0aW9uLFxuICAgIHVybFN1ZmZpeDogKHJlZ2lvbikgPT4gc2RrLmdldEVuZHBvaW50U3VmZml4KHJlZ2lvbiksXG4gICAgbGlzdFN0YWNrUmVzb3VyY2VzLFxuICB9KTtcblxuICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IGxpc3RTdGFja1Jlc291cmNlcy5saXN0U3RhY2tSZXNvdXJjZXMoKTtcbiAgY29uc3QgbG9nR3JvdXBOYW1lcyA9IGZpbmRBbGxMb2dHcm91cE5hbWVzKHN0YWNrUmVzb3VyY2VzLCBldmFsdWF0ZUNmblRlbXBsYXRlKTtcblxuICByZXR1cm4ge1xuICAgIGVudjogcmVzb2x2ZWRFbnYsXG4gICAgc2RrLFxuICAgIGxvZ0dyb3VwTmFtZXMsXG4gIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgQ2xvdWRXYXRjaCBMb2cgR3JvdXAgaXMgYXNzb2NpYXRlZFxuICogd2l0aCBhbiBpZ25vcmVkIHJlc291cmNlXG4gKi9cbmZ1bmN0aW9uIGlzUmVmZXJlbmNlZEZyb21JZ25vcmVkUmVzb3VyY2UoXG4gIGxvZ0dyb3VwUmVzb3VyY2U6IENsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5LFxuICBldmFsdWF0ZUNmblRlbXBsYXRlOiBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUsXG4pOiBib29sZWFuIHtcbiAgbGV0IGZvdW5kUmVmZXJlbmNlID0gZmFsc2U7XG4gIGNvbnN0IHJlc291cmNlc1JlZmVyZW5jaW5nTG9nR3JvdXAgPSBldmFsdWF0ZUNmblRlbXBsYXRlLmZpbmRSZWZlcmVuY2VzVG8obG9nR3JvdXBSZXNvdXJjZS5Mb2dpY2FsUmVzb3VyY2VJZCk7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlc291cmNlc1JlZmVyZW5jaW5nTG9nR3JvdXApIHtcbiAgICBpZiAoSUdOT1JFX0xPR1NfUkVTT1VSQ0VfVFlQRVMuaW5jbHVkZXMocmVmZXJlbmNlLlR5cGUpKSB7XG4gICAgICBmb3VuZFJlZmVyZW5jZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3VuZFJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBGaW5kIGFsbCBDbG91ZFdhdGNoIExvZyBHcm91cHMgaW4gdGhlIGRlcGxveWVkIHRlbXBsYXRlLlxuICogVGhpcyB3aWxsIGZpbmQgYm90aCBleHBsaWNpdGVseSBjcmVhdGVkIExvZyBHcm91cHMgKGV4Y2x1ZGluZyB0aG9zZSBhc3NvY2lhdGVkIHdpdGggaWdub3JlZCByZXNvdXJjZXMpXG4gKiBhcyB3ZWxsIGFzIExvZyBHcm91cHMgY3JlYXRlZCBpbXBsaWNpdGVseSAoaS5lLiBMYW1iZGEgRnVuY3Rpb25zKVxuICovXG5mdW5jdGlvbiBmaW5kQWxsTG9nR3JvdXBOYW1lcyhcbiAgc3RhY2tSZXNvdXJjZXM6IENsb3VkRm9ybWF0aW9uLlN0YWNrUmVzb3VyY2VTdW1tYXJ5W10sXG4gIGV2YWx1YXRlQ2ZuVGVtcGxhdGU6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZSxcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzLnJlZHVjZSgobG9nR3JvdXBOYW1lczogc3RyaW5nW10sIHJlc291cmNlKSA9PiB7XG4gICAgbGV0IGxvZ0dyb3VwTmFtZTtcbiAgICBpZiAocmVzb3VyY2UuUmVzb3VyY2VUeXBlID09PSAnQVdTOjpMb2dzOjpMb2dHcm91cCcpIHtcbiAgICAgIGlmICghaXNSZWZlcmVuY2VkRnJvbUlnbm9yZWRSZXNvdXJjZShyZXNvdXJjZSwgZXZhbHVhdGVDZm5UZW1wbGF0ZSkpIHtcbiAgICAgICAgbG9nR3JvdXBOYW1lID0gcmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoUkVTT1VSQ0VfVFlQRVNfV0lUSF9JTVBMSUNJVF9MT0dTW3Jlc291cmNlLlJlc291cmNlVHlwZV0pIHtcbiAgICAgIGNvbnN0IHNlcnZpY2VQYXJ0ID0gUkVTT1VSQ0VfVFlQRVNfV0lUSF9JTVBMSUNJVF9MT0dTW3Jlc291cmNlLlJlc291cmNlVHlwZV0uTG9nR3JvdXBTZXJ2aWNlTmFtZTtcbiAgICAgIGxvZ0dyb3VwTmFtZSA9IGAvYXdzLyR7c2VydmljZVBhcnR9LyR7cmVzb3VyY2UuUGh5c2ljYWxSZXNvdXJjZUlkfWA7XG4gICAgfVxuICAgIGlmIChsb2dHcm91cE5hbWUpIHtcbiAgICAgIGxvZ0dyb3VwTmFtZXMucHVzaChsb2dHcm91cE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gbG9nR3JvdXBOYW1lcztcbiAgfSwgW10pO1xufVxuIl19
@@ -0,0 +1,53 @@
1
+ import * as cxapi from '@aws-cdk/cx-api';
2
+ import { ISDK } from '../aws-auth';
3
+ export declare class CloudWatchLogEventMonitor {
4
+ /**
5
+ * Determines which events not to display
6
+ */
7
+ private startTime;
8
+ /**
9
+ * Map of environment (account:region) to LogGroupsAccessSettings
10
+ */
11
+ private readonly envsLogGroupsAccessSettings;
12
+ private active;
13
+ constructor(startTime?: Date);
14
+ /**
15
+ * resume reading/printing events
16
+ */
17
+ activate(): void;
18
+ /**
19
+ * deactivates the monitor so no new events are read
20
+ * use case for this is when we are in the middle of performing a deployment
21
+ * and don't want to interweave all the logs together with the CFN
22
+ * deployment logs
23
+ *
24
+ * Also resets the start time to be when the new deployment was triggered
25
+ * and clears the list of tracked log groups
26
+ */
27
+ deactivate(): void;
28
+ /**
29
+ * Adds CloudWatch log groups to read log events from.
30
+ * Since we could be watching multiple stacks that deploy to
31
+ * multiple environments (account+region), we need to store a list of log groups
32
+ * per env along with the SDK object that has access to read from
33
+ * that environment.
34
+ */
35
+ addLogGroups(env: cxapi.Environment, sdk: ISDK, logGroupNames: string[]): void;
36
+ private scheduleNextTick;
37
+ private tick;
38
+ /**
39
+ * Reads all new log events from a set of CloudWatch Log Groups
40
+ * in parallel
41
+ */
42
+ private readNewEvents;
43
+ /**
44
+ * Print out a cloudwatch event
45
+ */
46
+ private print;
47
+ /**
48
+ * Reads all new log events from a CloudWatch Log Group
49
+ * starting at either the time the hotswap was triggered or
50
+ * when the last event was read on the previous tick
51
+ */
52
+ private readEventsFromLogGroup;
53
+ }
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CloudWatchLogEventMonitor = void 0;
4
+ const util = require("util");
5
+ const chalk = require("chalk");
6
+ const logging_1 = require("../../logging");
7
+ const arrays_1 = require("../../util/arrays");
8
+ /**
9
+ * After reading events from all CloudWatch log groups
10
+ * how long should we wait to read more events.
11
+ *
12
+ * If there is some error with reading events (i.e. Throttle)
13
+ * then this is also how long we wait until we try again
14
+ */
15
+ const SLEEP = 2000;
16
+ class CloudWatchLogEventMonitor {
17
+ constructor(startTime) {
18
+ var _a;
19
+ /**
20
+ * Map of environment (account:region) to LogGroupsAccessSettings
21
+ */
22
+ this.envsLogGroupsAccessSettings = new Map();
23
+ this.active = false;
24
+ this.startTime = (_a = startTime === null || startTime === void 0 ? void 0 : startTime.getTime()) !== null && _a !== void 0 ? _a : Date.now();
25
+ }
26
+ /**
27
+ * resume reading/printing events
28
+ */
29
+ activate() {
30
+ this.active = true;
31
+ this.scheduleNextTick(0);
32
+ }
33
+ /**
34
+ * deactivates the monitor so no new events are read
35
+ * use case for this is when we are in the middle of performing a deployment
36
+ * and don't want to interweave all the logs together with the CFN
37
+ * deployment logs
38
+ *
39
+ * Also resets the start time to be when the new deployment was triggered
40
+ * and clears the list of tracked log groups
41
+ */
42
+ deactivate() {
43
+ this.active = false;
44
+ this.startTime = Date.now();
45
+ this.envsLogGroupsAccessSettings.clear();
46
+ }
47
+ /**
48
+ * Adds CloudWatch log groups to read log events from.
49
+ * Since we could be watching multiple stacks that deploy to
50
+ * multiple environments (account+region), we need to store a list of log groups
51
+ * per env along with the SDK object that has access to read from
52
+ * that environment.
53
+ */
54
+ addLogGroups(env, sdk, logGroupNames) {
55
+ var _a;
56
+ const awsEnv = `${env.account}:${env.region}`;
57
+ const logGroupsStartTimes = logGroupNames.reduce((acc, groupName) => {
58
+ acc[groupName] = this.startTime;
59
+ return acc;
60
+ }, {});
61
+ this.envsLogGroupsAccessSettings.set(awsEnv, {
62
+ sdk,
63
+ logGroupsStartTimes: {
64
+ ...(_a = this.envsLogGroupsAccessSettings.get(awsEnv)) === null || _a === void 0 ? void 0 : _a.logGroupsStartTimes,
65
+ ...logGroupsStartTimes,
66
+ },
67
+ });
68
+ }
69
+ scheduleNextTick(sleep) {
70
+ setTimeout(() => void (this.tick()), sleep);
71
+ }
72
+ async tick() {
73
+ if (!this.active) {
74
+ return;
75
+ }
76
+ try {
77
+ const events = arrays_1.flatten(await this.readNewEvents());
78
+ events.forEach(event => {
79
+ this.print(event);
80
+ });
81
+ }
82
+ catch (e) {
83
+ logging_1.error('Error occurred while monitoring logs: %s', e);
84
+ }
85
+ this.scheduleNextTick(SLEEP);
86
+ }
87
+ /**
88
+ * Reads all new log events from a set of CloudWatch Log Groups
89
+ * in parallel
90
+ */
91
+ async readNewEvents() {
92
+ const promises = [];
93
+ for (const settings of this.envsLogGroupsAccessSettings.values()) {
94
+ for (const group of Object.keys(settings.logGroupsStartTimes)) {
95
+ promises.push(this.readEventsFromLogGroup(settings, group));
96
+ }
97
+ }
98
+ return Promise.all(promises);
99
+ }
100
+ /**
101
+ * Print out a cloudwatch event
102
+ */
103
+ print(event) {
104
+ logging_1.print(util.format('[%s] %s %s', chalk.blue(event.logGroupName), chalk.yellow(event.timestamp.toLocaleTimeString()), event.message.trim()));
105
+ }
106
+ /**
107
+ * Reads all new log events from a CloudWatch Log Group
108
+ * starting at either the time the hotswap was triggered or
109
+ * when the last event was read on the previous tick
110
+ */
111
+ async readEventsFromLogGroup(logGroupsAccessSettings, logGroupName) {
112
+ var _a, _b;
113
+ const events = [];
114
+ // log events from some service are ingested faster than others
115
+ // so we need to track the start/end time for each log group individually
116
+ // to make sure that we process all events from each log group
117
+ const startTime = (_a = logGroupsAccessSettings.logGroupsStartTimes[logGroupName]) !== null && _a !== void 0 ? _a : this.startTime;
118
+ let endTime = startTime;
119
+ try {
120
+ const response = await logGroupsAccessSettings.sdk.cloudWatchLogs().filterLogEvents({
121
+ logGroupName: logGroupName,
122
+ limit: 100,
123
+ startTime: startTime,
124
+ }).promise();
125
+ for (const event of (_b = response.events) !== null && _b !== void 0 ? _b : []) {
126
+ if (event.message) {
127
+ events.push({
128
+ message: event.message,
129
+ logGroupName,
130
+ timestamp: event.timestamp ? new Date(event.timestamp) : new Date(),
131
+ });
132
+ if (event.timestamp && endTime < event.timestamp) {
133
+ endTime = event.timestamp;
134
+ }
135
+ }
136
+ }
137
+ // if we have > 100 events let the user know some
138
+ // messages have been supressed. We are essentially
139
+ // showing them a sampling (10000 events printed out is not very useful)
140
+ if (response.nextToken) {
141
+ events.push({
142
+ message: '(...messages supressed...)',
143
+ logGroupName,
144
+ timestamp: new Date(endTime),
145
+ });
146
+ }
147
+ }
148
+ catch (e) {
149
+ // with Lambda functions the CloudWatch is not created
150
+ // until something is logged, so just keep polling until
151
+ // there is somthing to find
152
+ if (e.code === 'ResourceNotFoundException') {
153
+ return [];
154
+ }
155
+ throw e;
156
+ }
157
+ logGroupsAccessSettings.logGroupsStartTimes[logGroupName] = endTime + 1;
158
+ return events;
159
+ }
160
+ }
161
+ exports.CloudWatchLogEventMonitor = CloudWatchLogEventMonitor;
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9ncy1tb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9ncy1tb25pdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUU3QiwrQkFBK0I7QUFDL0IsMkNBQTZDO0FBQzdDLDhDQUE0QztBQUc1Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLEtBQUssR0FBRyxJQUFLLENBQUM7QUEwQ3BCLE1BQWEseUJBQXlCO0lBYXBDLFlBQVksU0FBZ0I7O1FBUDVCOztXQUVHO1FBQ2MsZ0NBQTJCLEdBQUcsSUFBSSxHQUFHLEVBQW1DLENBQUM7UUFFbEYsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdyQixJQUFJLENBQUMsU0FBUyxTQUFHLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxPQUFPLHFDQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLFVBQVU7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFlBQVksQ0FBQyxHQUFzQixFQUFFLEdBQVMsRUFBRSxhQUF1Qjs7UUFDNUUsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5QyxNQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEVB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b3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ0Bhd3MtY2RrL2N4LWFwaSc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBwcmludCwgZXJyb3IgfSBmcm9tICcuLi8uLi9sb2dnaW5nJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi8uLi91dGlsL2FycmF5cyc7XG5pbXBvcnQgeyBJU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuXG4vKipcbiAqIEFmdGVyIHJlYWRpbmcgZXZlbnRzIGZyb20gYWxsIENsb3VkV2F0Y2ggbG9nIGdyb3Vwc1xuICogaG93IGxvbmcgc2hvdWxkIHdlIHdhaXQgdG8gcmVhZCBtb3JlIGV2ZW50cy5cbiAqXG4gKiBJZiB0aGVyZSBpcyBzb21lIGVycm9yIHdpdGggcmVhZGluZyBldmVudHMgKGkuZS4gVGhyb3R0bGUpXG4gKiB0aGVuIHRoaXMgaXMgYWxzbyBob3cgbG9uZyB3ZSB3YWl0IHVudGlsIHdlIHRyeSBhZ2FpblxuICovXG5jb25zdCBTTEVFUCA9IDJfMDAwO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBDbG91ZFdhdGNoIExvZyBFdmVudCB0aGF0IHdpbGwgYmVcbiAqIHByaW50ZWQgdG8gdGhlIHRlcm1pbmFsXG4gKi9cbmludGVyZmFjZSBDbG91ZFdhdGNoTG9nRXZlbnQge1xuICAvKipcbiAgICogVGhlIGxvZyBldmVudCBtZXNzYWdlXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBsb2cgZ3JvdXBcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0dyb3VwTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVzdGFtcDogRGF0ZTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uIG9uIHRoZSBsb2cgZ3JvdXBzIHRoYXQgYXJlXG4gKiBiZWluZyBtb25pdG9yZWRcbiAqL1xuaW50ZXJmYWNlIExvZ0dyb3Vwc0FjY2Vzc1NldHRpbmdzIHtcbiAgLyoqXG4gICAqIFRoZSBTREsgZm9yIGEgZ2l2ZW4gZW52aXJvbm1lbnQgKGFjY291bnQvcmVnaW9uKVxuICAgKi9cbiAgcmVhZG9ubHkgc2RrOiBJU0RLO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBsb2cgZ3JvdXBzIGFuZCBhc3NvY2lhdGVkIHN0YXJ0VGltZSBpbiBhIGdpdmVuIGFjY291bnQuXG4gICAqXG4gICAqIFRoZSBtb25pdG9yIHdpbGwgcmVhZCBldmVudHMgZnJvbSB0aGUgbG9nIGdyb3VwIHN0YXJ0aW5nIGF0IHRoZVxuICAgKiBhc3NvY2lhdGVkIHN0YXJ0VGltZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9nR3JvdXBzU3RhcnRUaW1lczogeyBbbG9nR3JvdXBOYW1lOiBzdHJpbmddOiBudW1iZXIgfTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3Ige1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGljaCBldmVudHMgbm90IHRvIGRpc3BsYXlcbiAgICovXG4gIHByaXZhdGUgc3RhcnRUaW1lOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1hcCBvZiBlbnZpcm9ubWVudCAoYWNjb3VudDpyZWdpb24pIHRvIExvZ0dyb3Vwc0FjY2Vzc1NldHRpbmdzXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVudnNMb2dHcm91cHNBY2Nlc3NTZXR0aW5ncyA9IG5ldyBNYXA8c3RyaW5nLCBMb2dHcm91cHNBY2Nlc3NTZXR0aW5ncz4oKTtcblxuICBwcml2YXRlIGFjdGl2ZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHN0YXJ0VGltZT86IERhdGUpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZT8uZ2V0VGltZSgpID8/IERhdGUubm93KCk7XG4gIH1cblxuICAvKipcbiAgICogcmVzdW1lIHJlYWRpbmcvcHJpbnRpbmcgZXZlbnRzXG4gICAqL1xuICBwdWJsaWMgYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuc2NoZWR1bGVOZXh0VGljaygwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWFjdGl2YXRlcyB0aGUgbW9uaXRvciBzbyBubyBuZXcgZXZlbnRzIGFyZSByZWFkXG4gICAqIHVzZSBjYXNlIGZvciB0aGlzIGlzIHdoZW4gd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgcGVyZm9ybWluZyBhIGRlcGxveW1lbnRcbiAgICogYW5kIGRvbid0IHdhbnQgdG8gaW50ZXJ3ZWF2ZSBhbGwgdGhlIGxvZ3MgdG9nZXRoZXIgd2l0aCB0aGUgQ0ZOXG4gICAqIGRlcGxveW1lbnQgbG9nc1xuICAgKlxuICAgKiBBbHNvIHJlc2V0cyB0aGUgc3RhcnQgdGltZSB0byBiZSB3aGVuIHRoZSBuZXcgZGVwbG95bWVudCB3YXMgdHJpZ2dlcmVkXG4gICAqIGFuZCBjbGVhcnMgdGhlIGxpc3Qgb2YgdHJhY2tlZCBsb2cgZ3JvdXBzXG4gICAqL1xuICBwdWJsaWMgZGVhY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmVudnNMb2dHcm91cHNBY2Nlc3NTZXR0aW5ncy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgQ2xvdWRXYXRjaCBsb2cgZ3JvdXBzIHRvIHJlYWQgbG9nIGV2ZW50cyBmcm9tLlxuICAgKiBTaW5jZSB3ZSBjb3VsZCBiZSB3YXRjaGluZyBtdWx0aXBsZSBzdGFja3MgdGhhdCBkZXBsb3kgdG9cbiAgICogbXVsdGlwbGUgZW52aXJvbm1lbnRzIChhY2NvdW50K3JlZ2lvbiksIHdlIG5lZWQgdG8gc3RvcmUgYSBsaXN0IG9mIGxvZyBncm91cHNcbiAgICogcGVyIGVudiBhbG9uZyB3aXRoIHRoZSBTREsgb2JqZWN0IHRoYXQgaGFzIGFjY2VzcyB0byByZWFkIGZyb21cbiAgICogdGhhdCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHB1YmxpYyBhZGRMb2dHcm91cHMoZW52OiBjeGFwaS5FbnZpcm9ubWVudCwgc2RrOiBJU0RLLCBsb2dHcm91cE5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGF3c0VudiA9IGAke2Vudi5hY2NvdW50fToke2Vudi5yZWdpb259YDtcbiAgICBjb25zdCBsb2dHcm91cHNTdGFydFRpbWVzID0gbG9nR3JvdXBOYW1lcy5yZWR1Y2UoKGFjYywgZ3JvdXBOYW1lKSA9PiB7XG4gICAgICBhY2NbZ3JvdXBOYW1lXSA9IHRoaXMuc3RhcnRUaW1lO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyB7IFtsb2dHcm91cE5hbWU6IHN0cmluZ106IG51bWJlciB9KTtcbiAgICB0aGlzLmVudnNMb2dHcm91cHNBY2Nlc3NTZXR0aW5ncy5zZXQoYXdzRW52LCB7XG4gICAgICBzZGssXG4gICAgICBsb2dHcm91cHNTdGFydFRpbWVzOiB7XG4gICAgICAgIC4uLnRoaXMuZW52c0xvZ0dyb3Vwc0FjY2Vzc1NldHRpbmdzLmdldChhd3NFbnYpPy5sb2dHcm91cHNTdGFydFRpbWVzLFxuICAgICAgICAuLi5sb2dHcm91cHNTdGFydFRpbWVzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVOZXh0VGljayhzbGVlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB2b2lkKHRoaXMudGljaygpKSwgc2xlZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0aWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IGZsYXR0ZW4oYXdhaXQgdGhpcy5yZWFkTmV3RXZlbnRzKCkpO1xuICAgICAgZXZlbnRzLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICB0aGlzLnByaW50KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yKCdFcnJvciBvY2N1cnJlZCB3aGlsZSBtb25pdG9yaW5nIGxvZ3M6ICVzJywgZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zY2hlZHVsZU5leHRUaWNrKFNMRUVQKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbGwgbmV3IGxvZyBldmVudHMgZnJvbSBhIHNldCBvZiBDbG91ZFdhdGNoIExvZyBHcm91cHNcbiAgICogaW4gcGFyYWxsZWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZE5ld0V2ZW50cygpOiBQcm9taXNlPEFycmF5PEFycmF5PENsb3VkV2F0Y2hMb2dFdmVudD4+PiB7XG4gICAgY29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8QXJyYXk8Q2xvdWRXYXRjaExvZ0V2ZW50Pj4+ID0gW107XG4gICAgZm9yIChjb25zdCBzZXR0aW5ncyBvZiB0aGlzLmVudnNMb2dHcm91cHNBY2Nlc3NTZXR0aW5ncy52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBPYmplY3Qua2V5cyhzZXR0aW5ncy5sb2dHcm91cHNTdGFydFRpbWVzKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMucmVhZEV2ZW50c0Zyb21Mb2dHcm91cChzZXR0aW5ncywgZ3JvdXApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmludCBvdXQgYSBjbG91ZHdhdGNoIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIHByaW50KGV2ZW50OiBDbG91ZFdhdGNoTG9nRXZlbnQpOiB2b2lkIHtcbiAgICBwcmludCh1dGlsLmZvcm1hdCgnWyVzXSAlcyAlcycsXG4gICAgICBjaGFsay5ibHVlKGV2ZW50LmxvZ0dyb3VwTmFtZSksXG4gICAgICBjaGFsay55ZWxsb3coZXZlbnQudGltZXN0YW1wLnRvTG9jYWxlVGltZVN0cmluZygpKSxcbiAgICAgIGV2ZW50Lm1lc3NhZ2UudHJpbSgpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYWxsIG5ldyBsb2cgZXZlbnRzIGZyb20gYSBDbG91ZFdhdGNoIExvZyBHcm91cFxuICAgKiBzdGFydGluZyBhdCBlaXRoZXIgdGhlIHRpbWUgdGhlIGhvdHN3YXAgd2FzIHRyaWdnZXJlZCBvclxuICAgKiB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyByZWFkIG9uIHRoZSBwcmV2aW91cyB0aWNrXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWRFdmVudHNGcm9tTG9nR3JvdXAoXG4gICAgbG9nR3JvdXBzQWNjZXNzU2V0dGluZ3M6IExvZ0dyb3Vwc0FjY2Vzc1NldHRpbmdzLFxuICAgIGxvZ0dyb3VwTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPEFycmF5PENsb3VkV2F0Y2hMb2dFdmVudD4+IHtcbiAgICBjb25zdCBldmVudHM6IENsb3VkV2F0Y2hMb2dFdmVudFtdID0gW107XG5cbiAgICAvLyBsb2cgZXZlbnRzIGZyb20gc29tZSBzZXJ2aWNlIGFyZSBpbmdlc3RlZCBmYXN0ZXIgdGhhbiBvdGhlcnNcbiAgICAvLyBzbyB3ZSBuZWVkIHRvIHRyYWNrIHRoZSBzdGFydC9lbmQgdGltZSBmb3IgZWFjaCBsb2cgZ3JvdXAgaW5kaXZpZHVhbGx5XG4gICAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgd2UgcHJvY2VzcyBhbGwgZXZlbnRzIGZyb20gZWFjaCBsb2cgZ3JvdXBcbiAgICBjb25zdCBzdGFydFRpbWUgPSBsb2dHcm91cHNBY2Nlc3NTZXR0aW5ncy5sb2dHcm91cHNTdGFydFRpbWVzW2xvZ0dyb3VwTmFtZV0gPz8gdGhpcy5zdGFydFRpbWU7XG4gICAgbGV0IGVuZFRpbWUgPSBzdGFydFRpbWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbG9nR3JvdXBzQWNjZXNzU2V0dGluZ3Muc2RrLmNsb3VkV2F0Y2hMb2dzKCkuZmlsdGVyTG9nRXZlbnRzKHtcbiAgICAgICAgbG9nR3JvdXBOYW1lOiBsb2dHcm91cE5hbWUsXG4gICAgICAgIGxpbWl0OiAxMDAsXG4gICAgICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLFxuICAgICAgfSkucHJvbWlzZSgpO1xuXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIHJlc3BvbnNlLmV2ZW50cyA/PyBbXSkge1xuICAgICAgICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgICAgICAgIGV2ZW50cy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGV2ZW50Lm1lc3NhZ2UsXG4gICAgICAgICAgICBsb2dHcm91cE5hbWUsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGV2ZW50LnRpbWVzdGFtcCA/IG5ldyBEYXRlKGV2ZW50LnRpbWVzdGFtcCkgOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGV2ZW50LnRpbWVzdGFtcCAmJiBlbmRUaW1lIDwgZXZlbnQudGltZXN0YW1wKSB7XG4gICAgICAgICAgICBlbmRUaW1lID0gZXZlbnQudGltZXN0YW1wO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBpZiB3ZSBoYXZlID4gMTAwIGV2ZW50cyBsZXQgdGhlIHVzZXIga25vdyBzb21lXG4gICAgICAvLyBtZXNzYWdlcyBoYXZlIGJlZW4gc3VwcmVzc2VkLiBXZSBhcmUgZXNzZW50aWFsbHlcbiAgICAgIC8vIHNob3dpbmcgdGhlbSBhIHNhbXBsaW5nICgxMDAwMCBldmVudHMgcHJpbnRlZCBvdXQgaXMgbm90IHZlcnkgdXNlZnVsKVxuICAgICAgaWYgKHJlc3BvbnNlLm5leHRUb2tlbikge1xuICAgICAgICBldmVudHMucHVzaCh7XG4gICAgICAgICAgbWVzc2FnZTogJyguLi5tZXNzYWdlcyBzdXByZXNzZWQuLi4pJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWUsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZShlbmRUaW1lKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gd2l0aCBMYW1iZGEgZnVuY3Rpb25zIHRoZSBDbG91ZFdhdGNoIGlzIG5vdCBjcmVhdGVkXG4gICAgICAvLyB1bnRpbCBzb21ldGhpbmcgaXMgbG9nZ2VkLCBzbyBqdXN0IGtlZXAgcG9sbGluZyB1bnRpbFxuICAgICAgLy8gdGhlcmUgaXMgc29tdGhpbmcgdG8gZmluZFxuICAgICAgaWYgKGUuY29kZSA9PT0gJ1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24nKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZ0dyb3Vwc0FjY2Vzc1NldHRpbmdzLmxvZ0dyb3Vwc1N0YXJ0VGltZXNbbG9nR3JvdXBOYW1lXSA9IGVuZFRpbWUgKyAxO1xuICAgIHJldHVybiBldmVudHM7XG4gIH1cbn1cbiJdfQ==
@@ -5,6 +5,7 @@ import { Bootstrapper, BootstrapEnvironmentOptions } from './api/bootstrap';
5
5
  import { CloudFormationDeployments } from './api/cloudformation-deployments';
6
6
  import { StackSelector } from './api/cxapp/cloud-assembly';
7
7
  import { CloudExecutable } from './api/cxapp/cloud-executable';
8
+ import { CloudWatchLogEventMonitor } from './api/logs/logs-monitor';
8
9
  import { StackActivityProgress } from './api/util/cloudformation/stack-activity-monitor';
9
10
  import { RequireApproval } from './diff';
10
11
  import { Configuration } from './settings';
@@ -216,6 +217,13 @@ interface WatchOptions {
216
217
  * @default - nothing extra is appended to the User-Agent header
217
218
  */
218
219
  readonly extraUserAgent?: string;
220
+ /**
221
+ * Whether to show CloudWatch logs for hotswapped resources
222
+ * locally in the users terminal
223
+ *
224
+ * @default - false
225
+ */
226
+ readonly traceLogs?: boolean;
219
227
  }
220
228
  export interface DeployOptions extends WatchOptions {
221
229
  /**
@@ -278,6 +286,13 @@ export interface DeployOptions extends WatchOptions {
278
286
  * @default true
279
287
  */
280
288
  readonly cacheCloudAssembly?: boolean;
289
+ /**
290
+ * Allows adding CloudWatch log groups to the log monitor via
291
+ * cloudWatchLogMonitor.setLogGroups();
292
+ *
293
+ * @default - not monitoring CloudWatch logs
294
+ */
295
+ readonly cloudWatchLogMonitor?: CloudWatchLogEventMonitor;
281
296
  }
282
297
  export interface DestroyOptions {
283
298
  /**