@gammarers/aws-rds-database-running-schedule-stack 2.3.11 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +206 -142
- package/API.md +147 -108
- package/lib/index.d.ts +6 -2
- package/lib/index.js +13 -181
- package/lib/resources/running-control-state-machine.d.ts +9 -0
- package/lib/resources/running-control-state-machine.js +233 -0
- package/package.json +7 -5
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunningControlStateMachine = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const sfn = require("aws-cdk-lib/aws-stepfunctions");
|
|
6
|
+
const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks");
|
|
7
|
+
class RunningControlStateMachine extends sfn.StateMachine {
|
|
8
|
+
constructor(scope, id, props) {
|
|
9
|
+
super(scope, id, {
|
|
10
|
+
...props,
|
|
11
|
+
definitionBody: (() => {
|
|
12
|
+
// 👇 Get account
|
|
13
|
+
const account = aws_cdk_lib_1.Stack.of(scope).account;
|
|
14
|
+
const initStateListDefinition = new sfn.Pass(scope, 'InitStateListDefinition', {
|
|
15
|
+
result: sfn.Result.fromObject([
|
|
16
|
+
{ name: 'AVAILABLE', emoji: '🤩', state: 'available' },
|
|
17
|
+
{ name: 'STOPPED', emoji: '😴', state: 'stopped' },
|
|
18
|
+
]),
|
|
19
|
+
resultPath: '$.definition.stateList',
|
|
20
|
+
});
|
|
21
|
+
// 👇 Succeed
|
|
22
|
+
const stateChangeSucceed = new sfn.Succeed(scope, 'StateChangeSucceed');
|
|
23
|
+
const prepareTopicValue = new sfn.Pass(scope, 'PrepareTopicValue', {
|
|
24
|
+
resultPath: '$.prepare.topic.values',
|
|
25
|
+
parameters: {
|
|
26
|
+
emoji: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringAt('$.definition.stateList[?(@.state == $.Result.status.current)].emoji'), 0),
|
|
27
|
+
status: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringAt('$.definition.stateList[?(@.state == $.Result.status.current)].name'), 0),
|
|
28
|
+
account: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.TargetResource'), ':'), 4), // account
|
|
29
|
+
region: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.TargetResource'), ':'), 3), // region
|
|
30
|
+
},
|
|
31
|
+
}).next(new sfn.Pass(scope, 'GenerateTopic', {
|
|
32
|
+
resultPath: '$.Generate.Topic',
|
|
33
|
+
parameters: {
|
|
34
|
+
Subject: sfn.JsonPath.format('{} [{}] AWS RDS DB {} Running Notification [{}][{}]', sfn.JsonPath.stringAt('$.prepare.topic.values.emoji'), sfn.JsonPath.stringAt('$.prepare.topic.values.status'), sfn.JsonPath.stringAt('$.params.Mode'), sfn.JsonPath.stringAt('$.prepare.topic.values.account'), sfn.JsonPath.stringAt('$.prepare.topic.values.region')),
|
|
35
|
+
TextMessage: sfn.JsonPath.format('Account : {}\nRegion : {}\nType : {}\nIdentifier : {}\nStatus : {}', sfn.JsonPath.stringAt('$.prepare.topic.values.account'), sfn.JsonPath.stringAt('$.prepare.topic.values.region'), sfn.JsonPath.stringAt('$.Result.target.type'), sfn.JsonPath.stringAt('$.Result.target.identifier'), sfn.JsonPath.stringAt('$.prepare.topic.values.status')),
|
|
36
|
+
SlackJsonMessage: {
|
|
37
|
+
attachments: [
|
|
38
|
+
{
|
|
39
|
+
color: '#36a64f',
|
|
40
|
+
pretext: sfn.JsonPath.format('{} The status of the RDS {} changed to {} due to the schedule.', sfn.JsonPath.stringAt('$.prepare.topic.values.emoji'), sfn.JsonPath.stringAt('$.Result.target.type'), sfn.JsonPath.stringAt('$.prepare.topic.values.status')),
|
|
41
|
+
fields: [
|
|
42
|
+
{
|
|
43
|
+
title: 'Account',
|
|
44
|
+
value: sfn.JsonPath.stringAt('$.prepare.topic.values.account'),
|
|
45
|
+
short: true,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
title: 'Region',
|
|
49
|
+
value: sfn.JsonPath.stringAt('$.prepare.topic.values.region'),
|
|
50
|
+
short: true,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
title: 'Type',
|
|
54
|
+
value: sfn.JsonPath.stringAt('$.Result.target.type'),
|
|
55
|
+
short: true,
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
title: 'Identifier',
|
|
59
|
+
value: sfn.JsonPath.stringAt('$.Result.target.identifier'),
|
|
60
|
+
short: true,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
title: 'Status',
|
|
64
|
+
value: sfn.JsonPath.stringAt('$.prepare.topic.values.status'),
|
|
65
|
+
short: true,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
}).next(new tasks.SnsPublish(scope, 'SendNotification', {
|
|
73
|
+
topic: props.notificationTopic,
|
|
74
|
+
subject: sfn.JsonPath.stringAt('$.Generate.Topic.Subject'),
|
|
75
|
+
message: sfn.TaskInput.fromObject({
|
|
76
|
+
default: sfn.JsonPath.stringAt('$.Generate.Topic.TextMessage'),
|
|
77
|
+
email: sfn.JsonPath.stringAt('$.Generate.Topic.TextMessage'),
|
|
78
|
+
lambda: sfn.JsonPath.jsonToString(sfn.JsonPath.objectAt('$.Generate.Topic.SlackJsonMessage')),
|
|
79
|
+
}),
|
|
80
|
+
messagePerSubscriptionType: true,
|
|
81
|
+
resultPath: '$.snsResult',
|
|
82
|
+
}).next(stateChangeSucceed)));
|
|
83
|
+
// 👇 Get DB Instance Resources (Filter by Tag)
|
|
84
|
+
const getResources = new tasks.CallAwsService(scope, 'GetResources', {
|
|
85
|
+
iamResources: ['*'],
|
|
86
|
+
iamAction: 'tag:GetResources',
|
|
87
|
+
service: 'resourcegroupstaggingapi',
|
|
88
|
+
action: 'getResources',
|
|
89
|
+
parameters: {
|
|
90
|
+
ResourceTypeFilters: [
|
|
91
|
+
'rds:db',
|
|
92
|
+
'rds:cluster',
|
|
93
|
+
],
|
|
94
|
+
TagFilters: [
|
|
95
|
+
{
|
|
96
|
+
Key: sfn.JsonPath.stringAt('$.Params.TagKey'),
|
|
97
|
+
Values: sfn.JsonPath.stringAt('$.Params.TagValues'),
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
resultPath: '$.Result',
|
|
102
|
+
resultSelector: {
|
|
103
|
+
TargetResources: sfn.JsonPath.stringAt('$..ResourceTagMappingList[*].ResourceARN'),
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
initStateListDefinition.next(getResources);
|
|
107
|
+
// 👇 Describe DB Instance Task
|
|
108
|
+
const describeDBInstancesTask = new tasks.CallAwsService(scope, 'DescribeDBInstances', {
|
|
109
|
+
iamResources: [`arn:aws:rds:*:${account}:db:*`],
|
|
110
|
+
service: 'rds',
|
|
111
|
+
action: 'describeDBInstances',
|
|
112
|
+
parameters: {
|
|
113
|
+
DbInstanceIdentifier: sfn.JsonPath.stringAt('$.Result.target.identifier'),
|
|
114
|
+
},
|
|
115
|
+
resultPath: '$.Result.status',
|
|
116
|
+
resultSelector: {
|
|
117
|
+
current: sfn.JsonPath.stringAt('$.DbInstances[0].DbInstanceStatus'),
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
// 👇 Stop DB Instance Task
|
|
121
|
+
const stopDBInstanceTask = new tasks.CallAwsService(scope, 'StopDBInstance', {
|
|
122
|
+
iamResources: [`arn:aws:rds:*:${account}:db:*`],
|
|
123
|
+
service: 'rds',
|
|
124
|
+
action: 'stopDBInstance',
|
|
125
|
+
parameters: {
|
|
126
|
+
DbInstanceIdentifier: sfn.JsonPath.stringAt('$.Result.target.identifier'),
|
|
127
|
+
},
|
|
128
|
+
resultPath: '$.Result.StopDBInstance',
|
|
129
|
+
});
|
|
130
|
+
// 👇 Start DB Instance Task
|
|
131
|
+
const startDBInstanceTask = new tasks.CallAwsService(scope, 'StartDBInstance', {
|
|
132
|
+
iamResources: [`arn:aws:rds:*:${account}:db:*`],
|
|
133
|
+
service: 'rds',
|
|
134
|
+
action: 'startDBInstance',
|
|
135
|
+
parameters: {
|
|
136
|
+
DbInstanceIdentifier: sfn.JsonPath.stringAt('$.Result.target.identifier'),
|
|
137
|
+
},
|
|
138
|
+
resultPath: '$.Result.StartDBInstance',
|
|
139
|
+
});
|
|
140
|
+
// 👇 Describe DB Cluster Task
|
|
141
|
+
const describeDBClustersTask = new tasks.CallAwsService(scope, 'DescribeDBClusters', {
|
|
142
|
+
iamResources: [`arn:aws:rds:*:${account}:cluster:*`],
|
|
143
|
+
service: 'rds',
|
|
144
|
+
action: 'describeDBClusters',
|
|
145
|
+
parameters: {
|
|
146
|
+
DbClusterIdentifier: sfn.JsonPath.stringAt('$.Result.target.identifier'),
|
|
147
|
+
},
|
|
148
|
+
resultPath: '$.Result.status',
|
|
149
|
+
resultSelector: {
|
|
150
|
+
current: sfn.JsonPath.stringAt('$.DbClusters[0].Status'),
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
const handleDbClusterNotFound = new sfn.Pass(scope, 'HandleDbClusterNotFound', {
|
|
154
|
+
result: sfn.Result.fromObject({
|
|
155
|
+
message: 'DB Cluster not found, but continuing...',
|
|
156
|
+
}),
|
|
157
|
+
});
|
|
158
|
+
describeDBClustersTask.addCatch(handleDbClusterNotFound, {
|
|
159
|
+
errors: ['Rds.DbClusterNotFoundException'],
|
|
160
|
+
});
|
|
161
|
+
// 👇 Stop DB Cluster Task
|
|
162
|
+
const stopDBClusterTask = new tasks.CallAwsService(scope, 'StopDBCluster', {
|
|
163
|
+
iamResources: [`arn:aws:rds:*:${account}:cluster:*`],
|
|
164
|
+
service: 'rds',
|
|
165
|
+
action: 'stopDBCluster',
|
|
166
|
+
parameters: {
|
|
167
|
+
DbClusterIdentifier: sfn.JsonPath.stringAt('$.Result.target.identifier'),
|
|
168
|
+
},
|
|
169
|
+
resultPath: '$.Result.StopDBCluster',
|
|
170
|
+
});
|
|
171
|
+
// 👇 Stop DB Cluster Task
|
|
172
|
+
const startDBClusterTask = new tasks.CallAwsService(scope, 'StartDBCluster', {
|
|
173
|
+
iamResources: [`arn:aws:rds:*:${account}:cluster:*`],
|
|
174
|
+
service: 'rds',
|
|
175
|
+
action: 'startDBCluster',
|
|
176
|
+
parameters: {
|
|
177
|
+
DbClusterIdentifier: sfn.JsonPath.stringAt('$.Result.target.identifier'),
|
|
178
|
+
},
|
|
179
|
+
resultPath: '$.Result.StartDBCluster',
|
|
180
|
+
});
|
|
181
|
+
const describeTypeChoice = new sfn.Choice(scope, 'DescribeTypeChoice')
|
|
182
|
+
.when(sfn.Condition.stringEquals('$.Result.target.type', 'db'), describeDBInstancesTask)
|
|
183
|
+
.when(sfn.Condition.stringEquals('$.Result.target.type', 'cluster'), describeDBClustersTask)
|
|
184
|
+
.otherwise(new sfn.Fail(scope, 'UnknownType'));
|
|
185
|
+
const statusChangeWait = new sfn.Wait(scope, 'StatusChangeWait', {
|
|
186
|
+
time: sfn.WaitTime.duration(aws_cdk_lib_1.Duration.minutes(1)),
|
|
187
|
+
});
|
|
188
|
+
statusChangeWait.next(describeTypeChoice);
|
|
189
|
+
startDBInstanceTask.next(statusChangeWait);
|
|
190
|
+
stopDBInstanceTask.next(statusChangeWait);
|
|
191
|
+
startDBClusterTask.next(statusChangeWait);
|
|
192
|
+
stopDBClusterTask.next(statusChangeWait);
|
|
193
|
+
const statusChoice = new sfn.Choice(scope, 'StatusChoice')
|
|
194
|
+
// db instance start on status.stopped
|
|
195
|
+
.when(sfn.Condition.and(sfn.Condition.stringEquals('$.params.Mode', 'Start'), sfn.Condition.stringEquals('$.Result.target.type', 'db'), sfn.Condition.stringEquals('$.Result.status.current', 'stopped')), startDBInstanceTask)
|
|
196
|
+
// db instance stop on status.available
|
|
197
|
+
.when(sfn.Condition.and(sfn.Condition.stringEquals('$.params.Mode', 'Stop'), sfn.Condition.stringEquals('$.Result.target.type', 'db'), sfn.Condition.stringEquals('$.Result.status.current', 'available')), stopDBInstanceTask)
|
|
198
|
+
// start on status.stopped
|
|
199
|
+
.when(sfn.Condition.and(sfn.Condition.stringEquals('$.params.Mode', 'Start'), sfn.Condition.stringEquals('$.Result.target.type', 'cluster'), sfn.Condition.stringEquals('$.Result.status.current', 'stopped')), startDBClusterTask)
|
|
200
|
+
// stop on status.available
|
|
201
|
+
.when(sfn.Condition.and(sfn.Condition.stringEquals('$.params.Mode', 'Stop'), sfn.Condition.stringEquals('$.Result.target.type', 'cluster'), sfn.Condition.stringEquals('$.Result.status.current', 'available')), stopDBClusterTask)
|
|
202
|
+
// status change succeed, generate topic
|
|
203
|
+
.when(sfn.Condition.or(sfn.Condition.and(sfn.Condition.stringEquals('$.params.Mode', 'Start'), sfn.Condition.or(sfn.Condition.stringEquals('$.Result.target.type', 'db'), sfn.Condition.stringEquals('$.Result.target.type', 'cluster')), sfn.Condition.stringEquals('$.Result.status.current', 'available')), sfn.Condition.and(sfn.Condition.stringEquals('$.params.Mode', 'Stop'), sfn.Condition.or(sfn.Condition.stringEquals('$.Result.target.type', 'db'), sfn.Condition.stringEquals('$.Result.target.type', 'cluster')), sfn.Condition.stringEquals('$.Result.status.current', 'stopped'))), prepareTopicValue)
|
|
204
|
+
.when(
|
|
205
|
+
// start & starting/configuring-enhanced-monitoring/backing-up or stop modifying/stopping
|
|
206
|
+
sfn.Condition.or(sfn.Condition.and(sfn.Condition.and(sfn.Condition.stringEquals('$.params.Mode', 'Start'), sfn.Condition.or(sfn.Condition.stringEquals('$.Result.target.type', 'db'), sfn.Condition.stringEquals('$.Result.target.type', 'cluster')), sfn.Condition.or(sfn.Condition.stringEquals('$.Result.status.current', 'starting'), sfn.Condition.stringEquals('$.Result.status.current', 'configuring-enhanced-monitoring'), sfn.Condition.stringEquals('$.Result.status.current', 'backing-up'), sfn.Condition.stringEquals('$.Result.status.current', 'modifying')))), sfn.Condition.and(sfn.Condition.and(sfn.Condition.stringEquals('$.params.Mode', 'Stop'), sfn.Condition.or(sfn.Condition.stringEquals('$.Result.target.type', 'db'), sfn.Condition.stringEquals('$.Result.target.type', 'cluster')), sfn.Condition.or(sfn.Condition.stringEquals('$.Result.status.current', 'modifying'), sfn.Condition.stringEquals('$.Result.status.current', 'stopping'))))), statusChangeWait)
|
|
207
|
+
.otherwise(new sfn.Fail(scope, 'StatusFail', {
|
|
208
|
+
cause: 'db instance or cluster status fail.',
|
|
209
|
+
}));
|
|
210
|
+
getResources.next(new sfn.Map(scope, 'ResourceProcessingMap', {
|
|
211
|
+
itemsPath: sfn.JsonPath.stringAt('$.Result.TargetResources'),
|
|
212
|
+
parameters: {
|
|
213
|
+
TargetResource: sfn.JsonPath.stringAt('$$.Map.Item.Value'),
|
|
214
|
+
params: sfn.JsonPath.stringAt('$.Params'),
|
|
215
|
+
definition: sfn.JsonPath.stringAt('$.definition'),
|
|
216
|
+
},
|
|
217
|
+
maxConcurrency: 10,
|
|
218
|
+
}).itemProcessor(new sfn.Pass(scope, 'GetIdentifier', {
|
|
219
|
+
resultPath: '$.Result.target',
|
|
220
|
+
parameters: {
|
|
221
|
+
identifier: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.TargetResource'), ':'), 6),
|
|
222
|
+
type: sfn.JsonPath.arrayGetItem(sfn.JsonPath.stringSplit(sfn.JsonPath.stringAt('$.TargetResource'), ':'), 5), // db or cluster
|
|
223
|
+
},
|
|
224
|
+
}).next(describeTypeChoice)));
|
|
225
|
+
describeDBInstancesTask.next(statusChoice);
|
|
226
|
+
describeDBClustersTask.next(statusChoice);
|
|
227
|
+
return sfn.DefinitionBody.fromChainable(initStateListDefinition);
|
|
228
|
+
})(),
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
exports.RunningControlStateMachine = RunningControlStateMachine;
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1jb250cm9sLXN0YXRlLW1hY2hpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVzb3VyY2VzL3J1bm5pbmctY29udHJvbC1zdGF0ZS1tYWNoaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4QztBQUU5QyxxREFBcUQ7QUFDckQsNkRBQTZEO0FBTzdELE1BQWEsMEJBQTJCLFNBQVEsR0FBRyxDQUFDLFlBQVk7SUFDOUQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQztRQUM5RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxDQUFDLEdBQUcsRUFBRTtnQkFFcEIsaUJBQWlCO2dCQUNqQixNQUFNLE9BQU8sR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBRXhDLE1BQU0sdUJBQXVCLEdBQWEsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSx5QkFBeUIsRUFBRTtvQkFDdkYsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO3dCQUM1QixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO3dCQUN0RCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO3FCQUNuRCxDQUFDO29CQUNGLFVBQVUsRUFBRSx3QkFBd0I7aUJBQ3JDLENBQUMsQ0FBQztnQkFFSCxhQUFhO2dCQUNiLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO2dCQUV4RSxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUs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QyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFbEMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMzQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRTFDLE9BQU8sR0FBRyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNuRSxDQUFDLENBQUMsRUFBRTtTQUNMLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTdWRCxnRUE2VkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBzbnMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXNucyc7XG5pbXBvcnQgKiBhcyBzZm4gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMnO1xuaW1wb3J0ICogYXMgdGFza3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmluZ0NvbnRyb2xTdGF0ZU1hY2hpbmVQcm9wcyBleHRlbmRzIHNmbi5TdGF0ZU1hY2hpbmVQcm9wcyB7XG4gIG5vdGlmaWNhdGlvblRvcGljOiBzbnMuSVRvcGljO1xufVxuXG5leHBvcnQgY2xhc3MgUnVubmluZ0NvbnRyb2xTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBzZm4uU3RhdGVNYWNoaW5lIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJ1bm5pbmdDb250cm9sU3RhdGVNYWNoaW5lUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGVmaW5pdGlvbkJvZHk6ICgoKSA9PiB7XG5cbiAgICAgICAgLy8g8J+RhyBHZXQgYWNjb3VudFxuICAgICAgICBjb25zdCBhY2NvdW50ID0gU3RhY2sub2Yoc2NvcGUpLmFjY291bnQ7XG5cbiAgICAgICAgY29uc3QgaW5pdFN0YXRlTGlzdERlZmluaXRpb246IHNmbi5QYXNzID0gbmV3IHNmbi5QYXNzKHNjb3BlLCAnSW5pdFN0YXRlTGlzdERlZmluaXRpb24nLCB7XG4gICAgICAgICAgcmVzdWx0OiBzZm4uUmVzdWx0LmZyb21PYmplY3QoW1xuICAgICAgICAgICAgeyBuYW1lOiAnQVZBSUxBQkxFJywgZW1vamk6ICfwn6SpJywgc3RhdGU6ICdhdmFpbGFibGUnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdTVE9QUEVEJywgZW1vamk6ICfwn5i0Jywgc3RhdGU6ICdzdG9wcGVkJyB9LFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHJlc3VsdFBhdGg6ICckLmRlZmluaXRpb24uc3RhdGVMaXN0JyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g8J+RhyBTdWNjZWVkXG4gICAgICAgIGNvbnN0IHN0YXRlQ2hhbmdlU3VjY2VlZCA9IG5ldyBzZm4uU3VjY2VlZChzY29wZSwgJ1N0YXRlQ2hhbmdlU3VjY2VlZCcpO1xuXG4gICAgICAgIGNvbnN0IHByZXBhcmVUb3BpY1ZhbHVlID0gbmV3IHNmbi5QYXNzKHNjb3BlLCAnUHJlcGFyZVRvcGljVmFsdWUnLCB7XG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQucHJlcGFyZS50b3BpYy52YWx1ZXMnLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIGVtb2ppOiBzZm4uSnNvblBhdGguYXJyYXlHZXRJdGVtKHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5kZWZpbml0aW9uLnN0YXRlTGlzdFs/KEAuc3RhdGUgPT0gJC5SZXN1bHQuc3RhdHVzLmN1cnJlbnQpXS5lbW9qaScpLCAwKSxcbiAgICAgICAgICAgIHN0YXR1czogc2ZuLkpzb25QYXRoLmFycmF5R2V0SXRlbShzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuZGVmaW5pdGlvbi5zdGF0ZUxpc3RbPyhALnN0YXRlID09ICQuUmVzdWx0LnN0YXR1cy5jdXJyZW50KV0ubmFtZScpLCAwKSxcbiAgICAgICAgICAgIGFjY291bnQ6IHNmbi5Kc29uUGF0aC5hcnJheUdldEl0ZW0oc2ZuLkpzb25QYXRoLnN0cmluZ1NwbGl0KHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5UYXJnZXRSZXNvdXJjZScpLCAnOicpLCA0KSwgLy8gYWNjb3VudFxuICAgICAgICAgICAgcmVnaW9uOiBzZm4uSnNvblBhdGguYXJyYXlHZXRJdGVtKHNmbi5Kc29uUGF0aC5zdHJpbmdTcGxpdChzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuVGFyZ2V0UmVzb3VyY2UnKSwgJzonKSwgMyksIC8vIHJlZ2lvblxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLm5leHQobmV3IHNmbi5QYXNzKHNjb3BlLCAnR2VuZXJhdGVUb3BpYycsIHtcbiAgICAgICAgICByZXN1bHRQYXRoOiAnJC5HZW5lcmF0ZS5Ub3BpYycsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgU3ViamVjdDogc2ZuLkpzb25QYXRoLmZvcm1hdCgne30gW3t9XSBBV1MgUkRTIERCIHt9IFJ1bm5pbmcgTm90aWZpY2F0aW9uIFt7fV1be31dJyxcbiAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLnByZXBhcmUudG9waWMudmFsdWVzLmVtb2ppJyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwYXJlLnRvcGljLnZhbHVlcy5zdGF0dXMnKSxcbiAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLnBhcmFtcy5Nb2RlJyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwYXJlLnRvcGljLnZhbHVlcy5hY2NvdW50JyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwYXJlLnRvcGljLnZhbHVlcy5yZWdpb24nKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBUZXh0TWVzc2FnZTogc2ZuLkpzb25QYXRoLmZvcm1hdCgnQWNjb3VudCA6IHt9XFxuUmVnaW9uIDoge31cXG5UeXBlIDoge31cXG5JZGVudGlmaWVyIDoge31cXG5TdGF0dXMgOiB7fScsXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwYXJlLnRvcGljLnZhbHVlcy5hY2NvdW50JyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwYXJlLnRvcGljLnZhbHVlcy5yZWdpb24nKSxcbiAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC50YXJnZXQudHlwZScpLFxuICAgICAgICAgICAgICBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LnRhcmdldC5pZGVudGlmaWVyJyksXG4gICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5wcmVwYXJlLnRvcGljLnZhbHVlcy5zdGF0dXMnKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBTbGFja0pzb25NZXNzYWdlOiB7XG4gICAgICAgICAgICAgIGF0dGFjaG1lbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY29sb3I6ICcjMzZhNjRmJyxcbiAgICAgICAgICAgICAgICAgIHByZXRleHQ6IHNmbi5Kc29uUGF0aC5mb3JtYXQoJ3t9IFRoZSBzdGF0dXMgb2YgdGhlIFJEUyB7fSBjaGFuZ2VkIHRvIHt9IGR1ZSB0byB0aGUgc2NoZWR1bGUuJyxcbiAgICAgICAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLnByZXBhcmUudG9waWMudmFsdWVzLmVtb2ppJyksXG4gICAgICAgICAgICAgICAgICAgIHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQudGFyZ2V0LnR5cGUnKSxcbiAgICAgICAgICAgICAgICAgICAgc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLnByZXBhcmUudG9waWMudmFsdWVzLnN0YXR1cycpLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdBY2NvdW50JyxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLnByZXBhcmUudG9waWMudmFsdWVzLmFjY291bnQnKSxcbiAgICAgICAgICAgICAgICAgICAgICBzaG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUmVnaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLnByZXBhcmUudG9waWMudmFsdWVzLnJlZ2lvbicpLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdUeXBlJyxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC50YXJnZXQudHlwZScpLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdJZGVudGlmaWVyJyxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC50YXJnZXQuaWRlbnRpZmllcicpLFxuICAgICAgICAgICAgICAgICAgICAgIHNob3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdTdGF0dXMnLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQucHJlcGFyZS50b3BpYy52YWx1ZXMuc3RhdHVzJyksXG4gICAgICAgICAgICAgICAgICAgICAgc2hvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLm5leHQobmV3IHRhc2tzLlNuc1B1Ymxpc2goc2NvcGUsICdTZW5kTm90aWZpY2F0aW9uJywge1xuICAgICAgICAgIHRvcGljOiBwcm9wcy5ub3RpZmljYXRpb25Ub3BpYyxcbiAgICAgICAgICBzdWJqZWN0OiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuR2VuZXJhdGUuVG9waWMuU3ViamVjdCcpLFxuICAgICAgICAgIG1lc3NhZ2U6IHNmbi5UYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICAgICBkZWZhdWx0OiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuR2VuZXJhdGUuVG9waWMuVGV4dE1lc3NhZ2UnKSxcbiAgICAgICAgICAgIGVtYWlsOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuR2VuZXJhdGUuVG9waWMuVGV4dE1lc3NhZ2UnKSxcbiAgICAgICAgICAgIGxhbWJkYTogc2ZuLkpzb25QYXRoLmpzb25Ub1N0cmluZyhzZm4uSnNvblBhdGgub2JqZWN0QXQoJyQuR2VuZXJhdGUuVG9waWMuU2xhY2tKc29uTWVzc2FnZScpKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtZXNzYWdlUGVyU3Vic2NyaXB0aW9uVHlwZTogdHJ1ZSxcbiAgICAgICAgICByZXN1bHRQYXRoOiAnJC5zbnNSZXN1bHQnLFxuICAgICAgICB9KS5uZXh0KHN0YXRlQ2hhbmdlU3VjY2VlZCkpKTtcblxuICAgICAgICAvLyDwn5GHIEdldCBEQiBJbnN0YW5jZSBSZXNvdXJjZXMgKEZpbHRlciBieSBUYWcpXG4gICAgICAgIGNvbnN0IGdldFJlc291cmNlcyA9IG5ldyB0YXNrcy5DYWxsQXdzU2VydmljZShzY29wZSwgJ0dldFJlc291cmNlcycsIHtcbiAgICAgICAgICBpYW1SZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIGlhbUFjdGlvbjogJ3RhZzpHZXRSZXNvdXJjZXMnLFxuICAgICAgICAgIHNlcnZpY2U6ICdyZXNvdXJjZWdyb3Vwc3RhZ2dpbmdhcGknLFxuICAgICAgICAgIGFjdGlvbjogJ2dldFJlc291cmNlcycsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgUmVzb3VyY2VUeXBlRmlsdGVyczogW1xuICAgICAgICAgICAgICAncmRzOmRiJyxcbiAgICAgICAgICAgICAgJ3JkczpjbHVzdGVyJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBUYWdGaWx0ZXJzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBLZXk6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5QYXJhbXMuVGFnS2V5JyksXG4gICAgICAgICAgICAgICAgVmFsdWVzOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUGFyYW1zLlRhZ1ZhbHVlcycpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6ICckLlJlc3VsdCcsXG4gICAgICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgICAgIFRhcmdldFJlc291cmNlczogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLi5SZXNvdXJjZVRhZ01hcHBpbmdMaXN0WypdLlJlc291cmNlQVJOJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5pdFN0YXRlTGlzdERlZmluaXRpb24ubmV4dChnZXRSZXNvdXJjZXMpO1xuXG4gICAgICAgIC8vIPCfkYcgRGVzY3JpYmUgREIgSW5zdGFuY2UgVGFza1xuICAgICAgICBjb25zdCBkZXNjcmliZURCSW5zdGFuY2VzVGFzayA9IG5ldyB0YXNrcy5DYWxsQXdzU2VydmljZShzY29wZSwgJ0Rlc2NyaWJlREJJbnN0YW5jZXMnLCB7XG4gICAgICAgICAgaWFtUmVzb3VyY2VzOiBbYGFybjphd3M6cmRzOio6JHthY2NvdW50fTpkYjoqYF0sXG4gICAgICAgICAgc2VydmljZTogJ3JkcycsXG4gICAgICAgICAgYWN0aW9uOiAnZGVzY3JpYmVEQkluc3RhbmNlcycsXG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgRGJJbnN0YW5jZUlkZW50aWZpZXI6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQudGFyZ2V0LmlkZW50aWZpZXInKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6ICckLlJlc3VsdC5zdGF0dXMnLFxuICAgICAgICAgIHJlc3VsdFNlbGVjdG9yOiB7XG4gICAgICAgICAgICBjdXJyZW50OiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuRGJJbnN0YW5jZXNbMF0uRGJJbnN0YW5jZVN0YXR1cycpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIPCfkYcgU3RvcCBEQiBJbnN0YW5jZSBUYXNrXG4gICAgICAgIGNvbnN0IHN0b3BEQkluc3RhbmNlVGFzayA9IG5ldyB0YXNrcy5DYWxsQXdzU2VydmljZShzY29wZSwgJ1N0b3BEQkluc3RhbmNlJywge1xuICAgICAgICAgIGlhbVJlc291cmNlczogW2Bhcm46YXdzOnJkczoqOiR7YWNjb3VudH06ZGI6KmBdLFxuICAgICAgICAgIHNlcnZpY2U6ICdyZHMnLFxuICAgICAgICAgIGFjdGlvbjogJ3N0b3BEQkluc3RhbmNlJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBEYkluc3RhbmNlSWRlbnRpZmllcjogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC50YXJnZXQuaWRlbnRpZmllcicpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuUmVzdWx0LlN0b3BEQkluc3RhbmNlJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g8J+RhyBTdGFydCBEQiBJbnN0YW5jZSBUYXNrXG4gICAgICAgIGNvbnN0IHN0YXJ0REJJbnN0YW5jZVRhc2sgPSBuZXcgdGFza3MuQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdTdGFydERCSW5zdGFuY2UnLCB7XG4gICAgICAgICAgaWFtUmVzb3VyY2VzOiBbYGFybjphd3M6cmRzOio6JHthY2NvdW50fTpkYjoqYF0sXG4gICAgICAgICAgc2VydmljZTogJ3JkcycsXG4gICAgICAgICAgYWN0aW9uOiAnc3RhcnREQkluc3RhbmNlJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBEYkluc3RhbmNlSWRlbnRpZmllcjogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlJlc3VsdC50YXJnZXQuaWRlbnRpZmllcicpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzdWx0UGF0aDogJyQuUmVzdWx0LlN0YXJ0REJJbnN0YW5jZScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIPCfkYcgRGVzY3JpYmUgREIgQ2x1c3RlciBUYXNrXG4gICAgICAgIGNvbnN0IGRlc2NyaWJlREJDbHVzdGVyc1Rhc2sgPSBuZXcgdGFza3MuQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdEZXNjcmliZURCQ2x1c3RlcnMnLCB7XG4gICAgICAgICAgaWFtUmVzb3VyY2VzOiBbYGFybjphd3M6cmRzOio6JHthY2NvdW50fTpjbHVzdGVyOipgXSxcbiAgICAgICAgICBzZXJ2aWNlOiAncmRzJyxcbiAgICAgICAgICBhY3Rpb246ICdkZXNjcmliZURCQ2x1c3RlcnMnLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIERiQ2x1c3RlcklkZW50aWZpZXI6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQudGFyZ2V0LmlkZW50aWZpZXInKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6ICckLlJlc3VsdC5zdGF0dXMnLFxuICAgICAgICAgIHJlc3VsdFNlbGVjdG9yOiB7XG4gICAgICAgICAgICBjdXJyZW50OiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuRGJDbHVzdGVyc1swXS5TdGF0dXMnKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYW5kbGVEYkNsdXN0ZXJOb3RGb3VuZCA9IG5ldyBzZm4uUGFzcyhzY29wZSwgJ0hhbmRsZURiQ2x1c3Rlck5vdEZvdW5kJywge1xuICAgICAgICAgIHJlc3VsdDogc2ZuLlJlc3VsdC5mcm9tT2JqZWN0KHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdEQiBDbHVzdGVyIG5vdCBmb3VuZCwgYnV0IGNvbnRpbnVpbmcuLi4nLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZURCQ2x1c3RlcnNUYXNrLmFkZENhdGNoKGhhbmRsZURiQ2x1c3Rlck5vdEZvdW5kLCB7XG4gICAgICAgICAgZXJyb3JzOiBbJ1Jkcy5EYkNsdXN0ZXJOb3RGb3VuZEV4Y2VwdGlvbiddLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDwn5GHIFN0b3AgREIgQ2x1c3RlciBUYXNrXG4gICAgICAgIGNvbnN0IHN0b3BEQkNsdXN0ZXJUYXNrID0gbmV3IHRhc2tzLkNhbGxBd3NTZXJ2aWNlKHNjb3BlLCAnU3RvcERCQ2x1c3RlcicsIHtcbiAgICAgICAgICBpYW1SZXNvdXJjZXM6IFtgYXJuOmF3czpyZHM6Kjoke2FjY291bnR9OmNsdXN0ZXI6KmBdLFxuICAgICAgICAgIHNlcnZpY2U6ICdyZHMnLFxuICAgICAgICAgIGFjdGlvbjogJ3N0b3BEQkNsdXN0ZXInLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIERiQ2x1c3RlcklkZW50aWZpZXI6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5SZXN1bHQudGFyZ2V0LmlkZW50aWZpZXInKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3VsdFBhdGg6ICckLlJlc3VsdC5TdG9wREJDbHVzdGVyJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g8J+RhyBTdG9wIERCIENsdXN0ZXIgVGFza1xuICAgICAgICBjb25zdCBzdGFydERCQ2x1c3RlclRhc2sgPSBuZXcgdGFza3MuQ2FsbEF3c1NlcnZpY2Uoc2NvcGUsICdTdGFydERCQ2x1c3RlcicsIHtcbiAgICAgICAgICBpYW1SZXNvdXJjZXM6IFtgYXJuOmF3czpyZHM6Kjoke2FjY291bnR9OmNsdXN0ZXI6KmBdLFxuICAgICAgICAgIHNlcnZpY2U6ICdyZHMnLFxuICAgICAgICAgIGFjdGlvbjogJ3N0YXJ0REJDbHVzdGVyJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBEYkNsdXN0ZXJJZGVudGlmaWVyOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LnRhcmdldC5pZGVudGlmaWVyJyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXN1bHRQYXRoOiAnJC5SZXN1bHQuU3RhcnREQkNsdXN0ZXInLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkZXNjcmliZVR5cGVDaG9pY2UgPSBuZXcgc2ZuLkNob2ljZShzY29wZSwgJ0Rlc2NyaWJlVHlwZUNob2ljZScpXG4gICAgICAgICAgLndoZW4oXG4gICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQudGFyZ2V0LnR5cGUnLCAnZGInKSxcbiAgICAgICAgICAgIGRlc2NyaWJlREJJbnN0YW5jZXNUYXNrLFxuICAgICAgICAgIClcbiAgICAgICAgICAud2hlbihcbiAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLlJlc3VsdC50YXJnZXQudHlwZScsICdjbHVzdGVyJyksXG4gICAgICAgICAgICBkZXNjcmliZURCQ2x1c3RlcnNUYXNrLFxuICAgICAgICAgIClcbiAgICAgICAgICAub3RoZXJ3aXNlKG5ldyBzZm4uRmFpbChzY29wZSwgJ1Vua25vd25UeXBlJykpO1xuXG4gICAgICAgIGNvbnN0IHN0YXR1c0NoYW5nZVdhaXQgPSBuZXcgc2ZuLldhaXQoc2NvcGUsICdTdGF0dXNDaGFuZ2VXYWl0Jywge1xuICAgICAgICAgIHRpbWU6IHNmbi5XYWl0VGltZS5kdXJhdGlvbihEdXJhdGlvbi5taW51dGVzKDEpKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXR1c0NoYW5nZVdhaXQubmV4dChkZXNjcmliZVR5cGVDaG9pY2UpO1xuXG4gICAgICAgIHN0YXJ0REJJbnN0YW5jZVRhc2submV4dChzdGF0dXNDaGFuZ2VXYWl0KTtcbiAgICAgICAgc3RvcERCSW5zdGFuY2VUYXNrLm5leHQoc3RhdHVzQ2hhbmdlV2FpdCk7XG5cbiAgICAgICAgc3RhcnREQkNsdXN0ZXJUYXNrLm5leHQoc3RhdHVzQ2hhbmdlV2FpdCk7XG4gICAgICAgIHN0b3BEQkNsdXN0ZXJUYXNrLm5leHQoc3RhdHVzQ2hhbmdlV2FpdCk7XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzQ2hvaWNlID0gbmV3IHNmbi5DaG9pY2Uoc2NvcGUsICdTdGF0dXNDaG9pY2UnKVxuICAgICAgICAgIC8vIGRiIGluc3RhbmNlIHN0YXJ0IG9uIHN0YXR1cy5zdG9wcGVkXG4gICAgICAgICAgLndoZW4oXG4gICAgICAgICAgICBzZm4uQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQucGFyYW1zLk1vZGUnLCAnU3RhcnQnKSxcbiAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuUmVzdWx0LnRhcmdldC50eXBlJywgJ2RiJyksXG4gICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLlJlc3VsdC5zdGF0dXMuY3VycmVudCcsICdzdG9wcGVkJyksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhcnREQkluc3RhbmNlVGFzayxcbiAgICAgICAgICApXG4gICAgICAgICAgLy8gZGIgaW5zdGFuY2Ugc3RvcCBvbiBzdGF0dXMuYXZhaWxhYmxlXG4gICAgICAgICAgLndoZW4oXG4gICAgICAgICAgICBzZm4uQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQucGFyYW1zLk1vZGUnLCAnU3RvcCcpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQudGFyZ2V0LnR5cGUnLCAnZGInKSxcbiAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuUmVzdWx0LnN0YXR1cy5jdXJyZW50JywgJ2F2YWlsYWJsZScpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0b3BEQkluc3RhbmNlVGFzayxcbiAgICAgICAgICApXG4gICAgICAgICAgLy8gc3RhcnQgb24gc3RhdHVzLnN0b3BwZWRcbiAgICAgICAgICAud2hlbihcbiAgICAgICAgICAgIHNmbi5Db25kaXRpb24uYW5kKFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5wYXJhbXMuTW9kZScsICdTdGFydCcpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQudGFyZ2V0LnR5cGUnLCAnY2x1c3RlcicpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQuc3RhdHVzLmN1cnJlbnQnLCAnc3RvcHBlZCcpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXJ0REJDbHVzdGVyVGFzayxcbiAgICAgICAgICApXG4gICAgICAgICAgLy8gc3RvcCBvbiBzdGF0dXMuYXZhaWxhYmxlXG4gICAgICAgICAgLndoZW4oXG4gICAgICAgICAgICBzZm4uQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQucGFyYW1zLk1vZGUnLCAnU3RvcCcpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQudGFyZ2V0LnR5cGUnLCAnY2x1c3RlcicpLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQuc3RhdHVzLmN1cnJlbnQnLCAnYXZhaWxhYmxlJyksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RvcERCQ2x1c3RlclRhc2ssXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIHN0YXR1cyBjaGFuZ2Ugc3VjY2VlZCwgZ2VuZXJhdGUgdG9waWNcbiAgICAgICAgICAud2hlbihcbiAgICAgICAgICAgIHNmbi5Db25kaXRpb24ub3IoXG4gICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uYW5kKFxuICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLnBhcmFtcy5Nb2RlJywgJ1N0YXJ0JyksXG4gICAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5vcihcbiAgICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLlJlc3VsdC50YXJnZXQudHlwZScsICdkYicpLFxuICAgICAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuUmVzdWx0LnRhcmdldC50eXBlJywgJ2NsdXN0ZXInKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLlJlc3VsdC5zdGF0dXMuY3VycmVudCcsICdhdmFpbGFibGUnKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5hbmQoXG4gICAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQucGFyYW1zLk1vZGUnLCAnU3RvcCcpLFxuICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24ub3IoXG4gICAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQudGFyZ2V0LnR5cGUnLCAnZGInKSxcbiAgICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLlJlc3VsdC50YXJnZXQudHlwZScsICdjbHVzdGVyJyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQuc3RhdHVzLmN1cnJlbnQnLCAnc3RvcHBlZCcpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHByZXBhcmVUb3BpY1ZhbHVlLFxuICAgICAgICAgIClcbiAgICAgICAgICAud2hlbihcbiAgICAgICAgICAgIC8vIHN0YXJ0ICYgc3RhcnRpbmcvY29uZmlndXJpbmctZW5oYW5jZWQtbW9uaXRvcmluZy9iYWNraW5nLXVwIG9yIHN0b3AgbW9kaWZ5aW5nL3N0b3BwaW5nXG4gICAgICAgICAgICBzZm4uQ29uZGl0aW9uLm9yKFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLnBhcmFtcy5Nb2RlJywgJ1N0YXJ0JyksXG4gICAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLm9yKFxuICAgICAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQudGFyZ2V0LnR5cGUnLCAnZGInKSxcbiAgICAgICAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuUmVzdWx0LnRhcmdldC50eXBlJywgJ2NsdXN0ZXInKSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLm9yKFxuICAgICAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQuc3RhdHVzLmN1cnJlbnQnLCAnc3RhcnRpbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuUmVzdWx0LnN0YXR1cy5jdXJyZW50JywgJ2NvbmZpZ3VyaW5nLWVuaGFuY2VkLW1vbml0b3JpbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuUmVzdWx0LnN0YXR1cy5jdXJyZW50JywgJ2JhY2tpbmctdXAnKSxcbiAgICAgICAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuUmVzdWx0LnN0YXR1cy5jdXJyZW50JywgJ21vZGlmeWluZycpLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLmFuZChcbiAgICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLnBhcmFtcy5Nb2RlJywgJ1N0b3AnKSxcbiAgICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24ub3IoXG4gICAgICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLlJlc3VsdC50YXJnZXQudHlwZScsICdkYicpLFxuICAgICAgICAgICAgICAgICAgICBzZm4uQ29uZGl0aW9uLnN0cmluZ0VxdWFscygnJC5SZXN1bHQudGFyZ2V0LnR5cGUnLCAnY2x1c3RlcicpLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24ub3IoXG4gICAgICAgICAgICAgICAgICAgIHNmbi5Db25kaXRpb24uc3RyaW5nRXF1YWxzKCckLlJlc3VsdC5zdGF0dXMuY3VycmVudCcsICdtb2RpZnlpbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgc2ZuLkNvbmRpdGlvbi5zdHJpbmdFcXVhbHMoJyQuUmVzdWx0LnN0YXR1cy5jdXJyZW50JywgJ3N0b3BwaW5nJyksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhdHVzQ2hhbmdlV2FpdCxcbiAgICAgICAgICApXG4gICAgICAgICAgLm90aGVyd2lzZShuZXcgc2ZuLkZhaWwoc2NvcGUsICdTdGF0dXNGYWlsJywge1xuICAgICAgICAgICAgY2F1c2U6ICdkYiBpbnN0YW5jZSBvciBjbHVzdGVyIHN0YXR1cyBmYWlsLicsXG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgIGdldFJlc291cmNlcy5uZXh0KFxuICAgICAgICAgIG5ldyBzZm4uTWFwKHNjb3BlLCAnUmVzb3VyY2VQcm9jZXNzaW5nTWFwJywge1xuICAgICAgICAgICAgaXRlbXNQYXRoOiBzZm4uSnNvblBhdGguc3RyaW5nQXQoJyQuUmVzdWx0LlRhcmdldFJlc291cmNlcycpLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBUYXJnZXRSZXNvdXJjZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckJC5NYXAuSXRlbS5WYWx1ZScpLFxuICAgICAgICAgICAgICBwYXJhbXM6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5QYXJhbXMnKSxcbiAgICAgICAgICAgICAgZGVmaW5pdGlvbjogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLmRlZmluaXRpb24nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXhDb25jdXJyZW5jeTogMTAsXG4gICAgICAgICAgfSkuaXRlbVByb2Nlc3NvcihcbiAgICAgICAgICAgIG5ldyBzZm4uUGFzcyhzY29wZSwgJ0dldElkZW50aWZpZXInLCB7XG4gICAgICAgICAgICAgIHJlc3VsdFBhdGg6ICckLlJlc3VsdC50YXJnZXQnLFxuICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogc2ZuLkpzb25QYXRoLmFycmF5R2V0SXRlbShzZm4uSnNvblBhdGguc3RyaW5nU3BsaXQoc2ZuLkpzb25QYXRoLnN0cmluZ0F0KCckLlRhcmdldFJlc291cmNlJyksICc6JyksIDYpLFxuICAgICAgICAgICAgICAgIHR5cGU6IHNmbi5Kc29uUGF0aC5hcnJheUdldEl0ZW0oc2ZuLkpzb25QYXRoLnN0cmluZ1NwbGl0KHNmbi5Kc29uUGF0aC5zdHJpbmdBdCgnJC5UYXJnZXRSZXNvdXJjZScpLCAnOicpLCA1KSwgLy8gZGIgb3IgY2x1c3RlclxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkubmV4dChkZXNjcmliZVR5cGVDaG9pY2UpKSk7XG5cbiAgICAgICAgZGVzY3JpYmVEQkluc3RhbmNlc1Rhc2submV4dChzdGF0dXNDaG9pY2UpO1xuICAgICAgICBkZXNjcmliZURCQ2x1c3RlcnNUYXNrLm5leHQoc3RhdHVzQ2hvaWNlKTtcblxuICAgICAgICByZXR1cm4gc2ZuLkRlZmluaXRpb25Cb2R5LmZyb21DaGFpbmFibGUoaW5pdFN0YXRlTGlzdERlZmluaXRpb24pO1xuICAgICAgfSkoKSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -50,23 +50,25 @@
|
|
|
50
50
|
"eslint-plugin-import": "^2.31.0",
|
|
51
51
|
"jest": "^29.7.0",
|
|
52
52
|
"jest-junit": "^16",
|
|
53
|
-
"jsii": "5.
|
|
53
|
+
"jsii": "5.7.x",
|
|
54
54
|
"jsii-diff": "^1.106.0",
|
|
55
55
|
"jsii-docgen": "^10.5.0",
|
|
56
56
|
"jsii-pacmak": "^1.106.0",
|
|
57
|
-
"jsii-rosetta": "5.
|
|
57
|
+
"jsii-rosetta": "5.7.x",
|
|
58
58
|
"projen": "^0.91.6",
|
|
59
59
|
"ts-jest": "^29.2.5",
|
|
60
60
|
"ts-node": "^10.9.2",
|
|
61
|
-
"typescript": "5.
|
|
61
|
+
"typescript": "5.7.x"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
64
|
"@gammarers/aws-resource-naming": "^0.10.1",
|
|
65
|
+
"@gammarers/aws-sns-slack-message-lambda-subscription": "^0.2.4",
|
|
65
66
|
"aws-cdk-lib": "^2.120.0",
|
|
66
67
|
"constructs": "^10.0.5"
|
|
67
68
|
},
|
|
68
69
|
"dependencies": {
|
|
69
|
-
"@gammarers/aws-resource-naming": "^0.10.1"
|
|
70
|
+
"@gammarers/aws-resource-naming": "^0.10.1",
|
|
71
|
+
"@gammarers/aws-sns-slack-message-lambda-subscription": "^0.2.4"
|
|
70
72
|
},
|
|
71
73
|
"keywords": [
|
|
72
74
|
"aws",
|
|
@@ -85,7 +87,7 @@
|
|
|
85
87
|
"publishConfig": {
|
|
86
88
|
"access": "public"
|
|
87
89
|
},
|
|
88
|
-
"version": "2.
|
|
90
|
+
"version": "2.4.1",
|
|
89
91
|
"jest": {
|
|
90
92
|
"coverageProvider": "v8",
|
|
91
93
|
"testMatch": [
|