@cdklabs/multi-az-observability 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (84) hide show
  1. package/.jsii +372 -115
  2. package/API.md +292 -74
  3. package/README.md +21 -14
  4. package/cdk.json +1 -1
  5. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.d.ts +6 -6
  6. package/lib/alarmsandrules/AvailabilityAndLatencyAlarmsAndRules.js +31 -28
  7. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.d.ts +0 -4
  8. package/lib/alarmsandrules/BaseOperationZonalAlarmsAndRules.js +6 -5
  9. package/lib/alarmsandrules/CanaryOperationZonalAlarmsAndRules.js +8 -6
  10. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.d.ts +0 -4
  11. package/lib/alarmsandrules/IBaseOperationZonalAlarmsAndRules.js +1 -1
  12. package/lib/alarmsandrules/OperationAlarmsAndRules.js +10 -12
  13. package/lib/alarmsandrules/ServerSideOperationZonalAlarmsAndRules.js +14 -12
  14. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.d.ts +2 -2
  15. package/lib/alarmsandrules/props/BaseOperationZonalAlarmsAndRulesProps.js +1 -1
  16. package/lib/azmapper/AvailabilityZoneMapper.js +4 -3
  17. package/lib/basic_observability/BasicServiceDashboard.d.ts +1 -2
  18. package/lib/basic_observability/BasicServiceDashboard.js +58 -78
  19. package/lib/basic_observability/BasicServiceMultiAZObservability.d.ts +8 -9
  20. package/lib/basic_observability/BasicServiceMultiAZObservability.js +100 -312
  21. package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.d.ts +50 -0
  22. package/lib/basic_observability/props/ApplicationLoadBalancerDetectionProps.js +3 -0
  23. package/lib/basic_observability/props/BasicServiceDashboardProps.d.ts +27 -13
  24. package/lib/basic_observability/props/BasicServiceDashboardProps.js +1 -1
  25. package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.d.ts +10 -38
  26. package/lib/basic_observability/props/BasicServiceMultiAZObservabilityProps.js +1 -1
  27. package/lib/basic_observability/props/NatGatewayDetectionProps.d.ts +31 -0
  28. package/lib/basic_observability/props/NatGatewayDetectionProps.js +3 -0
  29. package/lib/canaries/CanaryFunction.js +7 -6
  30. package/lib/canaries/src/canary.zip +0 -0
  31. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.d.ts +3 -6
  32. package/lib/dashboards/OperationAvailabilityAndLatencyDashboard.js +359 -498
  33. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.d.ts +0 -1
  34. package/lib/dashboards/ServiceAvailabilityAndLatencyDashboard.js +56 -113
  35. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.d.ts +4 -8
  36. package/lib/dashboards/props/OperationAvailabilityAndLatencyDashboardProps.js +1 -1
  37. package/lib/dashboards/props/OperationAvailabilityWidgetProps.d.ts +7 -2
  38. package/lib/dashboards/props/OperationAvailabilityWidgetProps.js +1 -1
  39. package/lib/dashboards/props/OperationLatencyWidgetProps.d.ts +7 -2
  40. package/lib/dashboards/props/OperationLatencyWidgetProps.js +1 -1
  41. package/lib/index.d.ts +5 -0
  42. package/lib/index.js +8 -2
  43. package/lib/metrics/ApplicationLoadBalancerMetrics.d.ts +65 -4
  44. package/lib/metrics/ApplicationLoadBalancerMetrics.js +629 -40
  45. package/lib/metrics/AvailabilityAndLatencyMetrics.d.ts +23 -0
  46. package/lib/metrics/AvailabilityAndLatencyMetrics.js +115 -24
  47. package/lib/metrics/NatGatewayMetrics.d.ts +110 -0
  48. package/lib/metrics/NatGatewayMetrics.js +300 -0
  49. package/lib/metrics/RegionalLatencyMetrics.d.ts +1 -1
  50. package/lib/metrics/RegionalLatencyMetrics.js +27 -20
  51. package/lib/metrics/ZonalAvailabilityMetrics.d.ts +2 -8
  52. package/lib/metrics/ZonalAvailabilityMetrics.js +10 -25
  53. package/lib/metrics/ZonalLatencyMetrics.d.ts +2 -1
  54. package/lib/metrics/ZonalLatencyMetrics.js +33 -23
  55. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.d.ts +4 -0
  56. package/lib/metrics/props/AvailabilityAndLatencyMetricProps.js +1 -1
  57. package/lib/metrics/props/LatencyMetricProps.d.ts +6 -0
  58. package/lib/metrics/props/LatencyMetricProps.js +1 -1
  59. package/lib/metrics/props/ZonalAvailabilityMetricProps.d.ts +4 -0
  60. package/lib/metrics/props/ZonalAvailabilityMetricProps.js +1 -1
  61. package/lib/metrics/props/ZonalLatencyMetricProps.d.ts +4 -0
  62. package/lib/metrics/props/ZonalLatencyMetricProps.js +1 -1
  63. package/lib/monitoring/src/monitoring-layer.zip +0 -0
  64. package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.d.ts +10 -0
  65. package/lib/outlier-detection/ApplicationLoadBalancerAvailabilityOutlierAlgorithm.js +15 -0
  66. package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.d.ts +18 -0
  67. package/lib/outlier-detection/ApplicationLoadBalancerLatencyOutlierAlgorithm.js +23 -0
  68. package/lib/outlier-detection/OutlierDetectionFunction.js +6 -5
  69. package/lib/outlier-detection/PacketLossOutlierAlgorithm.d.ts +10 -0
  70. package/lib/outlier-detection/PacketLossOutlierAlgorithm.js +15 -0
  71. package/lib/outlier-detection/src/outlier-detection.zip +0 -0
  72. package/lib/outlier-detection/src/scipy-layer.zip +0 -0
  73. package/lib/services/CanaryMetrics.js +1 -1
  74. package/lib/services/CanaryTestMetricsOverride.js +1 -1
  75. package/lib/services/ContributorInsightRuleDetails.js +1 -1
  76. package/lib/services/InstrumentedServiceMultiAZObservability.js +3 -3
  77. package/lib/services/Operation.js +1 -1
  78. package/lib/services/OperationMetricDetails.js +1 -1
  79. package/lib/services/Service.js +1 -1
  80. package/lib/services/ServiceMetricDetails.js +1 -1
  81. package/lib/services/props/MetricDimensions.js +1 -1
  82. package/lib/utilities/MetricsHelper.d.ts +14 -10
  83. package/lib/utilities/MetricsHelper.js +18 -11
  84. package/package.json +8 -8
@@ -6,85 +6,63 @@ exports.BasicServiceDashboard = void 0;
6
6
  const aws_cdk_lib_1 = require("aws-cdk-lib");
7
7
  const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
8
8
  const constructs_1 = require("constructs");
9
+ const NatGatewayMetrics_1 = require("../metrics/NatGatewayMetrics");
10
+ const ApplicationLoadBalancerMetrics_1 = require("../metrics/ApplicationLoadBalancerMetrics");
9
11
  class BasicServiceDashboard extends constructs_1.Construct {
10
- static createLoadBalancerWidgets(alarms, metrics, azMapper) {
12
+ static generateNatGatewayWidgets(natgws, azMapper, period, packetDropRateThreshold) {
11
13
  let widgets = [];
12
14
  widgets.push(new aws_cloudwatch_1.TextWidget({
13
- markdown: 'Load Balancer Fault Count Metrics',
15
+ markdown: 'NAT Gateway Metrics',
14
16
  height: 2,
15
17
  width: 24,
16
18
  }));
17
- let rowTracker = 0;
18
- Object.keys(alarms).forEach((azLetter, index) => {
19
- let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
20
- widgets.push(new aws_cloudwatch_1.GraphWidget({
21
- height: 6,
22
- width: 8,
23
- title: availabilityZoneId + ' Load Balancer Faults',
24
- region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
25
- left: [metrics[azLetter]],
26
- statistic: 'Sum',
27
- leftYAxis: {
28
- min: 0,
29
- label: 'Fault Count',
30
- showUnits: false,
31
- },
32
- }));
33
- //We're on the third one for this set, add 3 alarms
34
- //or if we're at the end, at the necessary amount
35
- //of alarms, 1, 2, or 3
36
- if (index % 3 == 2 || index - 1 == Object.keys(alarms).length) {
37
- for (let k = rowTracker; k <= index; k++) {
38
- let azId = Object.keys(alarms).at(k);
39
- widgets.push(new aws_cloudwatch_1.AlarmStatusWidget({
40
- height: 2,
41
- width: 8,
42
- alarms: [alarms[azId]],
43
- }));
44
- }
45
- rowTracker += index + 1;
19
+ let totalPacketsMetrics = NatGatewayMetrics_1.NatGatewayMetrics.getTotalPacketCountForEveryAZ(natgws, azMapper, period);
20
+ let packetDropMetrics = NatGatewayMetrics_1.NatGatewayMetrics.getTotalPacketDropsForEveryAZ(natgws, azMapper, period);
21
+ let packetDropRateMetrics = NatGatewayMetrics_1.NatGatewayMetrics.getTotalPacketDropRateForEveryAZ(natgws, azMapper, period);
22
+ widgets.push(new aws_cloudwatch_1.GraphWidget({
23
+ height: 6,
24
+ width: 8,
25
+ title: aws_cdk_lib_1.Aws.REGION + ' NAT Gateway Total Packets',
26
+ region: aws_cdk_lib_1.Aws.REGION,
27
+ left: Object.values(totalPacketsMetrics),
28
+ statistic: 'Sum',
29
+ leftYAxis: {
30
+ min: 0,
31
+ label: 'Count',
32
+ showUnits: false,
46
33
  }
47
- });
48
- return widgets;
49
- }
50
- static createNatGatewayWidgets(alarms, metrics, azMapper) {
51
- let widgets = [];
52
- widgets.push(new aws_cloudwatch_1.TextWidget({
53
- markdown: 'NAT Gateway Dropped Packet Metrics',
54
- height: 2,
55
- width: 24,
56
34
  }));
57
- let rowTracker = 0;
58
- Object.keys(alarms).forEach((azLetter, index) => {
59
- let availabilityZoneId = azMapper.availabilityZoneIdFromAvailabilityZoneLetter(azLetter);
60
- widgets.push(new aws_cloudwatch_1.GraphWidget({
61
- height: 6,
62
- width: 8,
63
- title: availabilityZoneId + ' NAT Gateway Dropped Packets',
64
- region: aws_cdk_lib_1.Fn.sub('${AWS::Region}'),
65
- left: [metrics[azLetter]],
66
- statistic: 'Sum',
67
- leftYAxis: {
68
- min: 0,
69
- label: 'Dropped packets',
70
- showUnits: false,
71
- },
72
- }));
73
- //We're on the third one for this set, add 3 alarms
74
- //or if we're at the end, at the necessary amount
75
- //of alarms, 1, 2, or 3
76
- if (index % 3 == 2 || index - 1 == Object.keys(alarms).length) {
77
- for (let k = rowTracker; k <= index; k++) {
78
- let azId = Object.keys(alarms).at(k);
79
- widgets.push(new aws_cloudwatch_1.AlarmStatusWidget({
80
- height: 2,
81
- width: 8,
82
- alarms: [alarms[azId]],
83
- }));
84
- }
85
- rowTracker += index + 1;
35
+ widgets.push(new aws_cloudwatch_1.GraphWidget({
36
+ height: 6,
37
+ width: 8,
38
+ title: aws_cdk_lib_1.Aws.REGION + ' NAT Gateway Dropped Packets',
39
+ region: aws_cdk_lib_1.Aws.REGION,
40
+ left: Object.values(packetDropMetrics),
41
+ statistic: 'Sum',
42
+ leftYAxis: {
43
+ min: 0,
44
+ label: 'Count',
45
+ showUnits: false,
86
46
  }
87
- });
47
+ }));
48
+ widgets.push(new aws_cloudwatch_1.GraphWidget({
49
+ height: 6,
50
+ width: 8,
51
+ title: aws_cdk_lib_1.Aws.REGION + ' NAT Gateway Dropped Packet Rate',
52
+ region: aws_cdk_lib_1.Aws.REGION,
53
+ left: Object.values(packetDropRateMetrics),
54
+ leftYAxis: {
55
+ min: 0,
56
+ label: 'Percent',
57
+ showUnits: false,
58
+ },
59
+ leftAnnotations: [
60
+ {
61
+ label: "High Severity",
62
+ value: packetDropRateThreshold
63
+ }
64
+ ]
65
+ }));
88
66
  return widgets;
89
67
  }
90
68
  static createTopLevelAlarmWidgets(alarms, azMapper) {
@@ -107,19 +85,21 @@ class BasicServiceDashboard extends constructs_1.Construct {
107
85
  }
108
86
  constructor(scope, id, props) {
109
87
  super(scope, id);
88
+ if (!(props.albs) && !(props.natgws)) {
89
+ throw new Error("You must define either ALBs or NAT Gateways for this service in order to create a dashboard.");
90
+ }
110
91
  let widgets = [];
111
92
  widgets.push(BasicServiceDashboard.createTopLevelAlarmWidgets(props.zonalAggregateIsolatedImpactAlarms, props.azMapper));
112
- if (props.zonalLoadBalancerIsolatedImpactAlarms !== undefined &&
113
- props.zonalLoadBalancerFaultRateMetrics !== undefined) {
114
- widgets.push(BasicServiceDashboard.createLoadBalancerWidgets(props.zonalLoadBalancerIsolatedImpactAlarms, props.zonalLoadBalancerFaultRateMetrics, props.azMapper));
93
+ if (props.albs) {
94
+ widgets.push([new aws_cloudwatch_1.TextWidget({ height: 2, width: 24, markdown: "Load Balancer Metrics" })]);
95
+ widgets.push(ApplicationLoadBalancerMetrics_1.ApplicationLoadBalancerMetrics.generateLoadBalancerWidgets(props.albs.applicationLoadBalancers, props.azMapper, props.period, props.albs.latencyStatistic, props.albs.latencyThreshold, props.albs.faultCountPercentThreshold));
115
96
  }
116
- if (props.zonalNatGatewayIsolatedImpactAlarms !== undefined &&
117
- props.zonalNatGatewayPacketDropMetrics !== undefined) {
118
- widgets.push(BasicServiceDashboard.createNatGatewayWidgets(props.zonalNatGatewayIsolatedImpactAlarms, props.zonalNatGatewayPacketDropMetrics, props.azMapper));
97
+ if (props.natgws) {
98
+ widgets.push(BasicServiceDashboard.generateNatGatewayWidgets(props.natgws.natGateways, props.azMapper, props.period, props.natgws.packetLossPercentThreshold ? props.natgws.packetLossPercentThreshold : 0.01));
119
99
  }
120
100
  this.dashboard = new aws_cloudwatch_1.Dashboard(this, 'BasicServiceDashboard', {
121
101
  dashboardName: props.serviceName.toLowerCase() +
122
- aws_cdk_lib_1.Fn.sub('-service-availability-${AWS::Region}'),
102
+ aws_cdk_lib_1.Fn.sub('-per-az-health-${AWS::Region}'),
123
103
  defaultInterval: props.interval,
124
104
  periodOverride: aws_cloudwatch_1.PeriodOverride.AUTO,
125
105
  widgets: widgets,
@@ -127,4 +107,4 @@ class BasicServiceDashboard extends constructs_1.Construct {
127
107
  }
128
108
  }
129
109
  exports.BasicServiceDashboard = BasicServiceDashboard;
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzaWNTZXJ2aWNlRGFzaGJvYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2ljX29ic2VydmFiaWxpdHkvQmFzaWNTZXJ2aWNlRGFzaGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFDdEMsNkNBQWlDO0FBQ2pDLCtEQVNvQztBQUNwQywyQ0FBdUM7QUFJdkMsTUFBYSxxQkFBc0IsU0FBUSxzQkFBUztJQUUxQyxNQUFNLENBQUMseUJBQXlCLENBQ3RDLE1BQWlDLEVBQ2pDLE9BQW1DLEVBQ25DLFFBQWdDO1FBRWhDLElBQUksT0FBTyxHQUFjLEVBQUUsQ0FBQztRQUU1QixPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksMkJBQVUsQ0FBQztZQUNiLFFBQVEsRUFBRSxtQ0FBbUM7WUFDN0MsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxVQUFVLEdBQVcsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQzlDLElBQUksa0JBQWtCLEdBQVcsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWpHLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSw0QkFBVyxDQUFDO2dCQUNkLE1BQU0sRUFBRSxDQUFDO2dCQUNULEtBQUssRUFBRSxDQUFDO2dCQUNSLEtBQUssRUFBRSxrQkFBa0IsR0FBRyx1QkFBdUI7Z0JBQ25ELE1BQU0sRUFBRSxnQkFBRSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDaEMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QixTQUFTLEVBQUUsS0FBSztnQkFDaEIsU0FBUyxFQUFFO29CQUNULEdB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LGtDQUFrQyxFQUN4QyxLQUFLLENBQUMsUUFBUSxDQUNmLENBQ0YsQ0FBQztRQUVGLElBQ0UsS0FBSyxDQUFDLHFDQUFxQyxLQUFLLFNBQVM7WUFDekQsS0FBSyxDQUFDLGlDQUFpQyxLQUFLLFNBQVMsRUFDckQsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQ1YscUJBQXFCLENBQUMseUJBQXlCLENBQzdDLEtBQUssQ0FBQyxxQ0FBcUMsRUFDM0MsS0FBSyxDQUFDLGlDQUFpQyxFQUN2QyxLQUFLLENBQUMsUUFBUSxDQUNmLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUNFLEtBQUssQ0FBQyxtQ0FBbUMsS0FBSyxTQUFTO1lBQ3ZELEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxTQUFTLEVBQ3BELENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUNWLHFCQUFxQixDQUFDLHVCQUF1QixDQUMzQyxLQUFLLENBQUMsbUNBQW1DLEVBQ3pDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFDdEMsS0FBSyxDQUFDLFFBQVEsQ0FDZixDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLDBCQUFTLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO1lBQzVELGFBQWEsRUFDWCxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDL0IsZ0JBQUUsQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUM7WUFDaEQsZUFBZSxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQy9CLGNBQWMsRUFBRSwrQkFBYyxDQUFDLElBQUk7WUFDbkMsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdk1ELHNEQXVNQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IEZuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQWxhcm1TdGF0dXNXaWRnZXQsXG4gIERhc2hib2FyZCxcbiAgR3JhcGhXaWRnZXQsXG4gIElBbGFybSxcbiAgSU1ldHJpYyxcbiAgSVdpZGdldCxcbiAgUGVyaW9kT3ZlcnJpZGUsXG4gIFRleHRXaWRnZXQsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzaWNTZXJ2aWNlRGFzaGJvYXJkUHJvcHMgfSBmcm9tICcuL3Byb3BzL0Jhc2ljU2VydmljZURhc2hib2FyZFByb3BzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIgfSBmcm9tICcuLi9hem1hcHBlci9BdmFpbGFiaWxpdHlab25lTWFwcGVyJztcblxuZXhwb3J0IGNsYXNzIEJhc2ljU2VydmljZURhc2hib2FyZCBleHRlbmRzIENvbnN0cnVjdCB7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlTG9hZEJhbGFuY2VyV2lkZ2V0cyhcbiAgICBhbGFybXM6IHsgW2tleTogc3RyaW5nXTogSUFsYXJtIH0sXG4gICAgbWV0cmljczogeyBba2V5OiBzdHJpbmddOiBJTWV0cmljIH0sXG4gICAgYXpNYXBwZXI6IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIsXG4gICk6IElXaWRnZXRbXSB7XG4gICAgbGV0IHdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBtYXJrZG93bjogJ0xvYWQgQmFsYW5jZXIgRmF1bHQgQ291bnQgTWV0cmljcycsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCByb3dUcmFja2VyOiBudW1iZXIgPSAwO1xuXG4gICAgT2JqZWN0LmtleXMoYWxhcm1zKS5mb3JFYWNoKChhekxldHRlciwgaW5kZXgpID0+IHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IGF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgICAgIGhlaWdodDogNixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICB0aXRsZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBMb2FkIEJhbGFuY2VyIEZhdWx0cycsXG4gICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgbGVmdDogW21ldHJpY3NbYXpMZXR0ZXJdXSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbGFiZWw6ICdGYXVsdCBDb3VudCcsXG4gICAgICAgICAgICBzaG93VW5pdHM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy9XZSdyZSBvbiB0aGUgdGhpcmQgb25lIGZvciB0aGlzIHNldCwgYWRkIDMgYWxhcm1zXG4gICAgICAvL29yIGlmIHdlJ3JlIGF0IHRoZSBlbmQsIGF0IHRoZSBuZWNlc3NhcnkgYW1vdW50XG4gICAgICAvL29mIGFsYXJtcywgMSwgMiwgb3IgM1xuICAgICAgaWYgKGluZGV4ICUgMyA9PSAyIHx8IGluZGV4IC0gMSA9PSBPYmplY3Qua2V5cyhhbGFybXMpLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGxldCBrID0gcm93VHJhY2tlcjsgayA8PSBpbmRleDsgaysrKSB7XG4gICAgICAgICAgbGV0IGF6SWQ6IHN0cmluZyA9IE9iamVjdC5rZXlzKGFsYXJtcykuYXQoaykhO1xuICAgICAgICAgIHdpZGdldHMucHVzaChcbiAgICAgICAgICAgIG5ldyBBbGFybVN0YXR1c1dpZGdldCh7XG4gICAgICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgICAgICAgIGFsYXJtczogW2FsYXJtc1theklkXV0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcm93VHJhY2tlciArPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZU5hdEdhdGV3YXlXaWRnZXRzKFxuICAgIGFsYXJtczogeyBba2V5OiBzdHJpbmddOiBJQWxhcm0gfSxcbiAgICBtZXRyaWNzOiB7IFtrZXk6IHN0cmluZ106IElNZXRyaWMgfSxcbiAgICBhek1hcHBlcjogQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcixcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIG1hcmtkb3duOiAnTkFUIEdhdGV3YXkgRHJvcHBlZCBQYWNrZXQgTWV0cmljcycsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCByb3dUcmFja2VyOiBudW1iZXIgPSAwO1xuXG4gICAgT2JqZWN0LmtleXMoYWxhcm1zKS5mb3JFYWNoKChhekxldHRlciwgaW5kZXgpID0+IHtcblxuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIE5BVCBHYXRld2F5IERyb3BwZWQgUGFja2V0cycsXG4gICAgICAgICAgcmVnaW9uOiBGbi5zdWIoJyR7QVdTOjpSZWdpb259JyksXG4gICAgICAgICAgbGVmdDogW21ldHJpY3NbYXpMZXR0ZXJdXSxcbiAgICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICAgICAgbGFiZWw6ICdEcm9wcGVkIHBhY2tldHMnLFxuICAgICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vV2UncmUgb24gdGhlIHRoaXJkIG9uZSBmb3IgdGhpcyBzZXQsIGFkZCAzIGFsYXJtc1xuICAgICAgLy9vciBpZiB3ZSdyZSBhdCB0aGUgZW5kLCBhdCB0aGUgbmVjZXNzYXJ5IGFtb3VudFxuICAgICAgLy9vZiBhbGFybXMsIDEsIDIsIG9yIDNcbiAgICAgIGlmIChpbmRleCAlIDMgPT0gMiB8fCBpbmRleCAtIDEgPT0gT2JqZWN0LmtleXMoYWxhcm1zKS5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgayA9IHJvd1RyYWNrZXI7IGsgPD0gaW5kZXg7IGsrKykge1xuICAgICAgICAgIGxldCBheklkOiBzdHJpbmcgPSBPYmplY3Qua2V5cyhhbGFybXMpLmF0KGspITtcbiAgICAgICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgICAgICBhbGFybXM6IFthbGFybXNbYXpJZF1dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvd1RyYWNrZXIgKz0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVUb3BMZXZlbEFsYXJtV2lkZ2V0cyhhbGFybXM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBJQWxhcm07XG4gIH0sXG4gIGF6TWFwcGVyOiBBdmFpbGFiaWxpdHlab25lTWFwcGVyLFxuICApOiBJV2lkZ2V0W10ge1xuICAgIGxldCB3aWRnZXRzOiBJV2lkZ2V0W10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBUZXh0V2lkZ2V0KHtcbiAgICAgICAgbWFya2Rvd246ICdBdmFpbGFiaWxpdHkgWm9uZSBJc29sYXRlZCBJbXBhY3QgQWxhcm1zJyxcbiAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICB3aWR0aDogMjQsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgT2JqZWN0LmtleXMoYWxhcm1zKS5mb3JFYWNoKChhekxldHRlcikgPT4ge1xuICAgICAgbGV0IGF2YWlsYWJpbGl0eVpvbmVJZDogc3RyaW5nID0gYXpNYXBwZXIuYXZhaWxhYmlsaXR5Wm9uZUlkRnJvbUF2YWlsYWJpbGl0eVpvbmVMZXR0ZXIoYXpMZXR0ZXIpO1xuXG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIG5ldyBBbGFybVN0YXR1c1dpZGdldCh7XG4gICAgICAgICAgYWxhcm1zOiBbYWxhcm1zW2F6TGV0dGVyXV0sXG4gICAgICAgICAgaGVpZ2h0OiAyLFxuICAgICAgICAgIHdpZHRoOiA4LFxuICAgICAgICAgIHRpdGxlOiBhdmFpbGFiaWxpdHlab25lSWQgKyAnIEFnZ3JlZ2F0ZSBJc29sYXRlZCBJbXBhY3QnLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2lkZ2V0cztcbiAgfVxuXG4gIGRhc2hib2FyZDogRGFzaGJvYXJkO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCYXNpY1NlcnZpY2VEYXNoYm9hcmRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdW10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIEJhc2ljU2VydmljZURhc2hib2FyZC5jcmVhdGVUb3BMZXZlbEFsYXJtV2lkZ2V0cyhcbiAgICAgICAgcHJvcHMuem9uYWxBZ2dyZWdhdGVJc29sYXRlZEltcGFjdEFsYXJtcyxcbiAgICAgICAgcHJvcHMuYXpNYXBwZXIsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy56b25hbExvYWRCYWxhbmNlcklzb2xhdGVkSW1wYWN0QWxhcm1zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHByb3BzLnpvbmFsTG9hZEJhbGFuY2VyRmF1bHRSYXRlTWV0cmljcyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIEJhc2ljU2VydmljZURhc2hib2FyZC5jcmVhdGVMb2FkQmFsYW5jZXJXaWRnZXRzKFxuICAgICAgICAgIHByb3BzLnpvbmFsTG9hZEJhbGFuY2VySXNvbGF0ZWRJbXBhY3RBbGFybXMsXG4gICAgICAgICAgcHJvcHMuem9uYWxMb2FkQmFsYW5jZXJGYXVsdFJhdGVNZXRyaWNzLFxuICAgICAgICAgIHByb3BzLmF6TWFwcGVyLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBwcm9wcy56b25hbE5hdEdhdGV3YXlJc29sYXRlZEltcGFjdEFsYXJtcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwcm9wcy56b25hbE5hdEdhdGV3YXlQYWNrZXREcm9wTWV0cmljcyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB3aWRnZXRzLnB1c2goXG4gICAgICAgIEJhc2ljU2VydmljZURhc2hib2FyZC5jcmVhdGVOYXRHYXRld2F5V2lkZ2V0cyhcbiAgICAgICAgICBwcm9wcy56b25hbE5hdEdhdGV3YXlJc29sYXRlZEltcGFjdEFsYXJtcyxcbiAgICAgICAgICBwcm9wcy56b25hbE5hdEdhdGV3YXlQYWNrZXREcm9wTWV0cmljcyxcbiAgICAgICAgICBwcm9wcy5hek1hcHBlcixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKHRoaXMsICdCYXNpY1NlcnZpY2VEYXNoYm9hcmQnLCB7XG4gICAgICBkYXNoYm9hcmROYW1lOlxuICAgICAgICBwcm9wcy5zZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgRm4uc3ViKCctc2VydmljZS1hdmFpbGFiaWxpdHktJHtBV1M6OlJlZ2lvbn0nKSxcbiAgICAgIGRlZmF1bHRJbnRlcnZhbDogcHJvcHMuaW50ZXJ2YWwsXG4gICAgICBwZXJpb2RPdmVycmlkZTogUGVyaW9kT3ZlcnJpZGUuQVVUTyxcbiAgICAgIHdpZGdldHM6IHdpZGdldHMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzaWNTZXJ2aWNlRGFzaGJvYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2ljX29ic2VydmFiaWxpdHkvQmFzaWNTZXJ2aWNlRGFzaGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFDdEMsNkNBQWdEO0FBQ2hELCtEQVNvQztBQUNwQywyQ0FBdUM7QUFJdkMsb0VBQWlFO0FBQ2pFLDhGQUEyRjtBQUUzRixNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBRTFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FDdEMsTUFBd0MsRUFDeEMsUUFBZ0MsRUFDaEMsTUFBZ0IsRUFDaEIsdUJBQStCO1FBRS9CLElBQUksT0FBTyxHQUFjLEVBQUUsQ0FBQztRQUU1QixPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksMkJBQVUsQ0FBQztZQUNiLFFBQVEsRUFBRSxxQkFBcUI7WUFDL0IsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxtQkFBbUIsR0FBNkIscUNBQWlCLENBQUMsNkJBQTZCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5SCxJQUFJLGlCQUFpQixHQUE2QixxQ0FBaUIsQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVILElBQUkscUJBQXFCLEdBQTZCLHFDQUFpQixDQUFDLGdDQUFnQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbkksT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLDRCQUFXLENBQUM7WUFDZCxNQUFNLEVBQUUsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLGlCQUFHLENBQUMsTUFBTSxHQUFHLDRCQUE0QjtZQUNoRCxNQUFNLEVBQUUsaUJBQUcs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QUFFLEtBQUssQ0FBQyxRQUFRO1lBQy9CLGNBQWMsRUFBRSwrQkFBYyxDQUFDLElBQUk7WUFDbkMsT0FBTyxFQUFFLE9BQU87U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBaktELHNEQWlLQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbmltcG9ydCB7IEF3cywgRHVyYXRpb24sIEZuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQWxhcm1TdGF0dXNXaWRnZXQsXG4gIERhc2hib2FyZCxcbiAgR3JhcGhXaWRnZXQsXG4gIElBbGFybSxcbiAgSU1ldHJpYyxcbiAgSVdpZGdldCxcbiAgUGVyaW9kT3ZlcnJpZGUsXG4gIFRleHRXaWRnZXQsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzaWNTZXJ2aWNlRGFzaGJvYXJkUHJvcHMgfSBmcm9tICcuL3Byb3BzL0Jhc2ljU2VydmljZURhc2hib2FyZFByb3BzJztcbmltcG9ydCB7IEF2YWlsYWJpbGl0eVpvbmVNYXBwZXIgfSBmcm9tICcuLi9hem1hcHBlci9BdmFpbGFiaWxpdHlab25lTWFwcGVyJztcbmltcG9ydCB7IENmbk5hdEdhdGV3YXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IE5hdEdhdGV3YXlNZXRyaWNzIH0gZnJvbSAnLi4vbWV0cmljcy9OYXRHYXRld2F5TWV0cmljcyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1ldHJpY3MgfSBmcm9tICcuLi9tZXRyaWNzL0FwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcyc7XG5cbmV4cG9ydCBjbGFzcyBCYXNpY1NlcnZpY2VEYXNoYm9hcmQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlTmF0R2F0ZXdheVdpZGdldHMoXG4gICAgbmF0Z3dzOiB7W2tleTogc3RyaW5nXTogQ2ZuTmF0R2F0ZXdheVtdfSxcbiAgICBhek1hcHBlcjogQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcixcbiAgICBwZXJpb2Q6IER1cmF0aW9uLFxuICAgIHBhY2tldERyb3BSYXRlVGhyZXNob2xkOiBudW1iZXIsXG4gICk6IElXaWRnZXRbXSB7XG4gICAgbGV0IHdpZGdldHM6IElXaWRnZXRbXSA9IFtdO1xuXG4gICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgbmV3IFRleHRXaWRnZXQoe1xuICAgICAgICBtYXJrZG93bjogJ05BVCBHYXRld2F5IE1ldHJpY3MnLFxuICAgICAgICBoZWlnaHQ6IDIsXG4gICAgICAgIHdpZHRoOiAyNCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBsZXQgdG90YWxQYWNrZXRzTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0gTmF0R2F0ZXdheU1ldHJpY3MuZ2V0VG90YWxQYWNrZXRDb3VudEZvckV2ZXJ5QVoobmF0Z3dzLCBhek1hcHBlciwgcGVyaW9kKTtcbiAgICBsZXQgcGFja2V0RHJvcE1ldHJpY3M6IHtba2V5OiBzdHJpbmddOiBJTWV0cmljfSA9IE5hdEdhdGV3YXlNZXRyaWNzLmdldFRvdGFsUGFja2V0RHJvcHNGb3JFdmVyeUFaKG5hdGd3cywgYXpNYXBwZXIsIHBlcmlvZCk7XG4gICAgbGV0IHBhY2tldERyb3BSYXRlTWV0cmljczoge1trZXk6IHN0cmluZ106IElNZXRyaWN9ID0gTmF0R2F0ZXdheU1ldHJpY3MuZ2V0VG90YWxQYWNrZXREcm9wUmF0ZUZvckV2ZXJ5QVoobmF0Z3dzLCBhek1hcHBlciwgcGVyaW9kKTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgIHRpdGxlOiBBd3MuUkVHSU9OICsgJyBOQVQgR2F0ZXdheSBUb3RhbCBQYWNrZXRzJyxcbiAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICBsZWZ0OiBPYmplY3QudmFsdWVzKHRvdGFsUGFja2V0c01ldHJpY3MpLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbGFiZWw6ICdDb3VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgIHRpdGxlOiBBd3MuUkVHSU9OICsgJyBOQVQgR2F0ZXdheSBEcm9wcGVkIFBhY2tldHMnLFxuICAgICAgICByZWdpb246IEF3cy5SRUdJT04sXG4gICAgICAgIGxlZnQ6IE9iamVjdC52YWx1ZXMocGFja2V0RHJvcE1ldHJpY3MpLFxuICAgICAgICBzdGF0aXN0aWM6ICdTdW0nLFxuICAgICAgICBsZWZ0WUF4aXM6IHtcbiAgICAgICAgICBtaW46IDAsXG4gICAgICAgICAgbGFiZWw6ICdDb3VudCcsXG4gICAgICAgICAgc2hvd1VuaXRzOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICAgIGhlaWdodDogNixcbiAgICAgICAgd2lkdGg6IDgsXG4gICAgICAgIHRpdGxlOiBBd3MuUkVHSU9OICsgJyBOQVQgR2F0ZXdheSBEcm9wcGVkIFBhY2tldCBSYXRlJyxcbiAgICAgICAgcmVnaW9uOiBBd3MuUkVHSU9OLFxuICAgICAgICBsZWZ0OiBPYmplY3QudmFsdWVzKHBhY2tldERyb3BSYXRlTWV0cmljcyksXG4gICAgICAgIGxlZnRZQXhpczoge1xuICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICBsYWJlbDogJ1BlcmNlbnQnLFxuICAgICAgICAgIHNob3dVbml0czogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxlZnRBbm5vdGF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiBcIkhpZ2ggU2V2ZXJpdHlcIixcbiAgICAgICAgICAgIHZhbHVlOiBwYWNrZXREcm9wUmF0ZVRocmVzaG9sZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB3aWRnZXRzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlVG9wTGV2ZWxBbGFybVdpZGdldHMoYWxhcm1zOiB7XG4gICAgW2tleTogc3RyaW5nXTogSUFsYXJtO1xuICB9LFxuICBhek1hcHBlcjogQXZhaWxhYmlsaXR5Wm9uZU1hcHBlcixcbiAgKTogSVdpZGdldFtdIHtcbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdID0gW107XG5cbiAgICB3aWRnZXRzLnB1c2goXG4gICAgICBuZXcgVGV4dFdpZGdldCh7XG4gICAgICAgIG1hcmtkb3duOiAnQXZhaWxhYmlsaXR5IFpvbmUgSXNvbGF0ZWQgSW1wYWN0IEFsYXJtcycsXG4gICAgICAgIGhlaWdodDogMixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIE9iamVjdC5rZXlzKGFsYXJtcykuZm9yRWFjaCgoYXpMZXR0ZXIpID0+IHtcbiAgICAgIGxldCBhdmFpbGFiaWxpdHlab25lSWQ6IHN0cmluZyA9IGF6TWFwcGVyLmF2YWlsYWJpbGl0eVpvbmVJZEZyb21BdmFpbGFiaWxpdHlab25lTGV0dGVyKGF6TGV0dGVyKTtcblxuICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICBuZXcgQWxhcm1TdGF0dXNXaWRnZXQoe1xuICAgICAgICAgIGFsYXJtczogW2FsYXJtc1thekxldHRlcl1dLFxuICAgICAgICAgIGhlaWdodDogMixcbiAgICAgICAgICB3aWR0aDogOCxcbiAgICAgICAgICB0aXRsZTogYXZhaWxhYmlsaXR5Wm9uZUlkICsgJyBBZ2dyZWdhdGUgSXNvbGF0ZWQgSW1wYWN0JyxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cblxuICBkYXNoYm9hcmQ6IERhc2hib2FyZDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmFzaWNTZXJ2aWNlRGFzaGJvYXJkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKCEocHJvcHMuYWxicykgJiYgIShwcm9wcy5uYXRnd3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJZb3UgbXVzdCBkZWZpbmUgZWl0aGVyIEFMQnMgb3IgTkFUIEdhdGV3YXlzIGZvciB0aGlzIHNlcnZpY2UgaW4gb3JkZXIgdG8gY3JlYXRlIGEgZGFzaGJvYXJkLlwiKTtcbiAgICB9XG5cbiAgICBsZXQgd2lkZ2V0czogSVdpZGdldFtdW10gPSBbXTtcblxuICAgIHdpZGdldHMucHVzaChcbiAgICAgIEJhc2ljU2VydmljZURhc2hib2FyZC5jcmVhdGVUb3BMZXZlbEFsYXJtV2lkZ2V0cyhcbiAgICAgICAgcHJvcHMuem9uYWxBZ2dyZWdhdGVJc29sYXRlZEltcGFjdEFsYXJtcyxcbiAgICAgICAgcHJvcHMuYXpNYXBwZXIsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBpZiAocHJvcHMuYWxicykge1xuICAgICAgd2lkZ2V0cy5wdXNoKFtuZXcgVGV4dFdpZGdldCh7IGhlaWdodDogMiwgd2lkdGg6IDI0LCBtYXJrZG93bjogXCJMb2FkIEJhbGFuY2VyIE1ldHJpY3NcIiB9KV0pO1xuICAgICAgd2lkZ2V0cy5wdXNoKCAgICAgXG4gICAgICAgIEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTWV0cmljcy5nZW5lcmF0ZUxvYWRCYWxhbmNlcldpZGdldHMoXG4gICAgICAgICAgcHJvcHMuYWxicy5hcHBsaWNhdGlvbkxvYWRCYWxhbmNlcnMsXG4gICAgICAgICAgcHJvcHMuYXpNYXBwZXIsXG4gICAgICAgICAgcHJvcHMucGVyaW9kLFxuICAgICAgICAgIHByb3BzLmFsYnMubGF0ZW5jeVN0YXRpc3RpYyxcbiAgICAgICAgICBwcm9wcy5hbGJzLmxhdGVuY3lUaHJlc2hvbGQsXG4gICAgICAgICAgcHJvcHMuYWxicy5mYXVsdENvdW50UGVyY2VudFRocmVzaG9sZFxuICAgICAgICApXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm5hdGd3cykge1xuICAgICAgd2lkZ2V0cy5wdXNoKFxuICAgICAgICBCYXNpY1NlcnZpY2VEYXNoYm9hcmQuZ2VuZXJhdGVOYXRHYXRld2F5V2lkZ2V0cyhcbiAgICAgICAgICBwcm9wcy5uYXRnd3MubmF0R2F0ZXdheXMsXG4gICAgICAgICAgcHJvcHMuYXpNYXBwZXIsXG4gICAgICAgICAgcHJvcHMucGVyaW9kLFxuICAgICAgICAgIHByb3BzLm5hdGd3cy5wYWNrZXRMb3NzUGVyY2VudFRocmVzaG9sZCA/IHByb3BzLm5hdGd3cy5wYWNrZXRMb3NzUGVyY2VudFRocmVzaG9sZCA6IDAuMDFcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKHRoaXMsICdCYXNpY1NlcnZpY2VEYXNoYm9hcmQnLCB7XG4gICAgICBkYXNoYm9hcmROYW1lOlxuICAgICAgICBwcm9wcy5zZXJ2aWNlTmFtZS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgRm4uc3ViKCctcGVyLWF6LWhlYWx0aC0ke0FXUzo6UmVnaW9ufScpLFxuICAgICAgZGVmYXVsdEludGVydmFsOiBwcm9wcy5pbnRlcnZhbCxcbiAgICAgIHBlcmlvZE92ZXJyaWRlOiBQZXJpb2RPdmVycmlkZS5BVVRPLFxuICAgICAgd2lkZ2V0czogd2lkZ2V0cyxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -54,13 +54,12 @@ export declare class BasicServiceMultiAZObservability extends Construct implemen
54
54
  */
55
55
  private _azMapper;
56
56
  constructor(scope: Construct, id: string, props: BasicServiceMultiAZObservabilityProps);
57
- private static isThereAnAZAvailabilityImpactAlb;
58
- private static isThereAZLatencyImpactAlb;
59
- private static isAZAnOutlierForAvailabilityAlb;
60
- private static isAZAnOutlierForLatencyAlb;
61
- private doAlbMetrics;
62
- private static isThereAnAZPacketLossImpactNATGW;
63
- private static isAZAnOutlierForPacketLossNATGW;
64
- private doNatGatewayMetrics;
65
- private getTotalPacketDropsPerZone;
57
+ /**
58
+ *
59
+ * @param props
60
+ * @returns A composite alarm per AZ to indicate isolated zonal impact. The dictionary
61
+ * is keyed by the az letter, like "a", "b", "c".
62
+ */
63
+ private createAlbZonalImpactAlarms;
64
+ private createNatGatewayZonalImpactAlarms;
66
65
  }