@cloudsnorkel/cdk-github-runners 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/.gitattributes +10 -9
  2. package/.jsii +98 -81
  3. package/API.md +13 -2
  4. package/assets/{lambdas/delete-runner.lambda → delete-runner.lambda}/index.js +96 -56
  5. package/assets/{lambdas → providers}/build-image.lambda/index.js +3 -3
  6. package/assets/{lambdas → providers/image-builders/aws-image-builder}/delete-ami.lambda/index.js +3 -3
  7. package/assets/providers/image-builders/aws-image-builder/filter-failed-builds.lambda/index.js +39 -0
  8. package/assets/{lambdas/aws-image-builder-versioner.lambda → providers/image-builders/aws-image-builder/versioner.lambda}/index.js +98 -58
  9. package/assets/{lambdas → providers}/update-lambda.lambda/index.js +1 -1
  10. package/assets/{lambdas/setup.lambda → setup.lambda}/index.js +4 -4
  11. package/assets/{lambdas/status.lambda → status.lambda}/index.js +96 -56
  12. package/assets/{lambdas/token-retriever.lambda → token-retriever.lambda}/index.js +96 -56
  13. package/assets/{lambdas/webhook-handler.lambda → webhook-handler.lambda}/index.js +3 -3
  14. package/lib/access.js +1 -1
  15. package/lib/{lambdas/delete-runner-function.d.ts → delete-runner-function.d.ts} +1 -1
  16. package/lib/delete-runner-function.js +23 -0
  17. package/lib/delete-runner.lambda.js +69 -0
  18. package/lib/github.js +50 -0
  19. package/lib/lambda-helpers.js +66 -0
  20. package/lib/{lambdas → providers}/build-image-function.d.ts +1 -1
  21. package/lib/providers/build-image-function.js +23 -0
  22. package/lib/providers/build-image.lambda.js +92 -0
  23. package/lib/providers/codebuild.js +2 -2
  24. package/lib/providers/common.js +3 -3
  25. package/lib/providers/ec2.js +2 -2
  26. package/lib/providers/ecs.js +7 -3
  27. package/lib/providers/fargate.js +2 -2
  28. package/lib/providers/image-builders/api.js +1 -1
  29. package/lib/providers/image-builders/aws-image-builder/builder.d.ts +12 -3
  30. package/lib/providers/image-builders/aws-image-builder/builder.js +43 -11
  31. package/lib/providers/image-builders/aws-image-builder/common.js +3 -3
  32. package/lib/{lambdas → providers/image-builders/aws-image-builder}/delete-ami-function.d.ts +1 -1
  33. package/lib/providers/image-builders/aws-image-builder/delete-ami-function.js +23 -0
  34. package/lib/providers/image-builders/aws-image-builder/delete-ami.lambda.js +87 -0
  35. package/lib/providers/image-builders/aws-image-builder/deprecated/ami.d.ts +0 -1
  36. package/lib/providers/image-builders/aws-image-builder/deprecated/ami.js +6 -5
  37. package/lib/providers/image-builders/aws-image-builder/deprecated/common.js +6 -1
  38. package/lib/providers/image-builders/aws-image-builder/deprecated/container.js +3 -3
  39. package/lib/providers/image-builders/aws-image-builder/deprecated/linux-components.js +2 -10
  40. package/lib/providers/image-builders/aws-image-builder/deprecated/windows-components.js +3 -16
  41. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds-function.d.ts +13 -0
  42. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds-function.js +23 -0
  43. package/lib/providers/image-builders/aws-image-builder/filter-failed-builds.lambda.js +18 -0
  44. package/lib/providers/image-builders/aws-image-builder/versioner-function.d.ts +13 -0
  45. package/lib/providers/image-builders/aws-image-builder/versioner-function.js +23 -0
  46. package/lib/providers/image-builders/aws-image-builder/versioner.lambda.js +96 -0
  47. package/lib/providers/image-builders/codebuild-deprecated.js +3 -3
  48. package/lib/providers/image-builders/codebuild.d.ts +11 -2
  49. package/lib/providers/image-builders/codebuild.js +19 -3
  50. package/lib/providers/image-builders/components.js +1 -1
  51. package/lib/providers/image-builders/static.js +1 -1
  52. package/lib/providers/lambda.js +4 -4
  53. package/lib/{lambdas → providers}/update-lambda-function.d.ts +1 -1
  54. package/lib/providers/update-lambda-function.js +23 -0
  55. package/lib/providers/update-lambda.lambda.js +34 -0
  56. package/lib/runner.d.ts +9 -1
  57. package/lib/runner.js +24 -12
  58. package/lib/secrets.js +1 -1
  59. package/lib/{lambdas/setup-function.d.ts → setup-function.d.ts} +1 -1
  60. package/lib/setup-function.js +23 -0
  61. package/lib/setup.lambda.js +152 -0
  62. package/lib/{lambdas/status-function.d.ts → status-function.d.ts} +1 -1
  63. package/lib/status-function.js +23 -0
  64. package/lib/status.lambda.js +298 -0
  65. package/lib/{lambdas/token-retriever-function.d.ts → token-retriever-function.d.ts} +1 -1
  66. package/lib/token-retriever-function.js +23 -0
  67. package/lib/token-retriever.lambda.js +15 -0
  68. package/lib/{lambdas/webhook-handler-function.d.ts → webhook-handler-function.d.ts} +1 -1
  69. package/lib/webhook-handler-function.js +23 -0
  70. package/lib/webhook-handler.lambda.d.ts +1 -0
  71. package/lib/webhook-handler.lambda.js +116 -0
  72. package/lib/webhook.d.ts +1 -1
  73. package/lib/webhook.js +2 -2
  74. package/package.json +28 -26
  75. package/lib/lambdas/aws-image-builder-versioner-function.d.ts +0 -13
  76. package/lib/lambdas/aws-image-builder-versioner-function.js +0 -23
  77. package/lib/lambdas/aws-image-builder-versioner.lambda.js +0 -96
  78. package/lib/lambdas/build-image-function.js +0 -23
  79. package/lib/lambdas/build-image.lambda.js +0 -92
  80. package/lib/lambdas/delete-ami-function.js +0 -23
  81. package/lib/lambdas/delete-ami.lambda.js +0 -87
  82. package/lib/lambdas/delete-runner-function.js +0 -23
  83. package/lib/lambdas/delete-runner.lambda.js +0 -69
  84. package/lib/lambdas/github.js +0 -50
  85. package/lib/lambdas/helpers.js +0 -66
  86. package/lib/lambdas/setup-function.js +0 -23
  87. package/lib/lambdas/setup.lambda.js +0 -152
  88. package/lib/lambdas/status-function.js +0 -23
  89. package/lib/lambdas/status.lambda.js +0 -298
  90. package/lib/lambdas/token-retriever-function.js +0 -23
  91. package/lib/lambdas/token-retriever.lambda.js +0 -15
  92. package/lib/lambdas/update-lambda-function.js +0 -23
  93. package/lib/lambdas/update-lambda.lambda.js +0 -34
  94. package/lib/lambdas/webhook-handler-function.js +0 -23
  95. package/lib/lambdas/webhook-handler.lambda.js +0 -116
  96. /package/assets/{lambdas/setup.lambda → setup.lambda}/index.html +0 -0
  97. /package/lib/{lambdas/delete-runner.lambda.d.ts → delete-runner.lambda.d.ts} +0 -0
  98. /package/lib/{lambdas/github.d.ts → github.d.ts} +0 -0
  99. /package/lib/{lambdas/helpers.d.ts → lambda-helpers.d.ts} +0 -0
  100. /package/lib/{lambdas → providers}/build-image.lambda.d.ts +0 -0
  101. /package/lib/{lambdas → providers/image-builders/aws-image-builder}/delete-ami.lambda.d.ts +0 -0
  102. /package/lib/{lambdas/setup.lambda.d.ts → providers/image-builders/aws-image-builder/filter-failed-builds.lambda.d.ts} +0 -0
  103. /package/lib/{lambdas/aws-image-builder-versioner.lambda.d.ts → providers/image-builders/aws-image-builder/versioner.lambda.d.ts} +0 -0
  104. /package/lib/{lambdas → providers}/update-lambda.lambda.d.ts +0 -0
  105. /package/lib/{lambdas/status.lambda.d.ts → setup.lambda.d.ts} +0 -0
  106. /package/lib/{lambdas/token-retriever.lambda.d.ts → status.lambda.d.ts} +0 -0
  107. /package/lib/{lambdas/webhook-handler.lambda.d.ts → token-retriever.lambda.d.ts} +0 -0
@@ -1,298 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- /* eslint-disable import/no-extraneous-dependencies */
4
- const auth_app_1 = require("@octokit/auth-app");
5
- const core_1 = require("@octokit/core");
6
- const AWS = require("aws-sdk");
7
- const github_1 = require("./github");
8
- const helpers_1 = require("./helpers");
9
- /* eslint-disable-next-line import/no-extraneous-dependencies,import/no-unresolved */
10
- const cfn = new AWS.CloudFormation();
11
- const ec2 = new AWS.EC2();
12
- const ecr = new AWS.ECR();
13
- const sf = new AWS.StepFunctions();
14
- function secretArnToUrl(arn) {
15
- const parts = arn.split(':'); // arn:aws:secretsmanager:us-east-1:12345678:secret:secret-name-REVISION
16
- const region = parts[3];
17
- const fullName = parts[6];
18
- const name = fullName.slice(0, fullName.lastIndexOf('-'));
19
- return `https://${region}.console.aws.amazon.com/secretsmanager/home?region=${region}#!/secret?name=${name}`;
20
- }
21
- function lambdaArnToUrl(arn) {
22
- const parts = arn.split(':'); // arn:aws:lambda:us-east-1:12345678:function:name-XYZ
23
- const region = parts[3];
24
- const name = parts[6];
25
- return `https://${region}.console.aws.amazon.com/lambda/home?region=${region}#/functions/${name}?tab=monitoring`;
26
- }
27
- function stepFunctionArnToUrl(arn) {
28
- const parts = arn.split(':'); // arn:aws:states:us-east-1:12345678:stateMachine:name-XYZ
29
- const region = parts[3];
30
- return `https://${region}.console.aws.amazon.com/states/home?region=${region}#/statemachines/view/${arn}`;
31
- }
32
- async function generateProvidersStatus(stack, logicalId) {
33
- const resource = await cfn.describeStackResource({ StackName: stack, LogicalResourceId: logicalId }).promise();
34
- const providers = JSON.parse(resource.StackResourceDetail?.Metadata ?? '{}').providers;
35
- if (!providers) {
36
- return {};
37
- }
38
- return Promise.all(providers.map(async (p) => {
39
- // add ECR data, if image is from ECR
40
- if (p.image?.imageRepository?.match(/[0-9]+\.dkr\.ecr\.[a-z0-9\-]+\.amazonaws\.com\/.+/)) {
41
- const tags = await ecr.describeImages({
42
- repositoryName: p.image.imageRepository.split('/')[1],
43
- filter: {
44
- tagStatus: 'TAGGED',
45
- },
46
- maxResults: 1,
47
- }).promise();
48
- if (tags.imageDetails && tags.imageDetails?.length >= 1) {
49
- p.image.latestImage = {
50
- tags: tags.imageDetails[0].imageTags,
51
- digest: tags.imageDetails[0].imageDigest,
52
- date: tags.imageDetails[0].imagePushedAt,
53
- };
54
- }
55
- }
56
- // add AMI data, if image is AMI
57
- if (p.ami?.launchTemplate) {
58
- const versions = await ec2.describeLaunchTemplateVersions({
59
- LaunchTemplateId: p.ami.launchTemplate,
60
- Versions: ['$Default'],
61
- }).promise();
62
- if (versions.LaunchTemplateVersions && versions.LaunchTemplateVersions.length >= 1) {
63
- p.ami.latestAmi = versions.LaunchTemplateVersions[0].LaunchTemplateData?.ImageId;
64
- }
65
- }
66
- return p;
67
- }));
68
- }
69
- function safeReturnValue(event, status) {
70
- if (event.path) {
71
- return {
72
- statusCode: 200,
73
- headers: {
74
- 'Content-Type': 'application/json',
75
- },
76
- body: JSON.stringify(status),
77
- };
78
- }
79
- return status;
80
- }
81
- exports.handler = async function (event) {
82
- // confirm required environment variables
83
- if (!process.env.WEBHOOK_SECRET_ARN || !process.env.GITHUB_SECRET_ARN || !process.env.GITHUB_PRIVATE_KEY_SECRET_ARN || !process.env.LOGICAL_ID ||
84
- !process.env.WEBHOOK_HANDLER_ARN || !process.env.STEP_FUNCTION_ARN || !process.env.SETUP_SECRET_ARN || !process.env.SETUP_FUNCTION_URL ||
85
- !process.env.STACK_NAME) {
86
- throw new Error('Missing environment variables');
87
- }
88
- // base status
89
- const status = {
90
- github: {
91
- setup: {
92
- status: 'Unknown',
93
- url: '',
94
- secretArn: process.env.SETUP_SECRET_ARN,
95
- secretUrl: secretArnToUrl(process.env.SETUP_SECRET_ARN),
96
- },
97
- domain: 'Unknown',
98
- webhook: {
99
- url: process.env.WEBHOOK_URL,
100
- status: 'Unable to check',
101
- secretArn: process.env.WEBHOOK_SECRET_ARN,
102
- secretUrl: secretArnToUrl(process.env.WEBHOOK_SECRET_ARN),
103
- },
104
- auth: {
105
- type: 'Unknown',
106
- status: 'Unknown',
107
- secretArn: process.env.GITHUB_SECRET_ARN,
108
- secretUrl: secretArnToUrl(process.env.GITHUB_SECRET_ARN),
109
- privateKeySecretArn: process.env.GITHUB_PRIVATE_KEY_SECRET_ARN,
110
- privateKeySecretUrl: secretArnToUrl(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN),
111
- app: {
112
- id: '',
113
- url: '',
114
- installations: [],
115
- },
116
- personalAuthToken: '',
117
- },
118
- },
119
- providers: await generateProvidersStatus(process.env.STACK_NAME, process.env.LOGICAL_ID),
120
- troubleshooting: {
121
- webhookHandlerArn: process.env.WEBHOOK_HANDLER_ARN,
122
- webhookHandlerUrl: lambdaArnToUrl(process.env.WEBHOOK_HANDLER_ARN),
123
- stepFunctionArn: process.env.STEP_FUNCTION_ARN,
124
- stepFunctionUrl: stepFunctionArnToUrl(process.env.STEP_FUNCTION_ARN),
125
- stepFunctionLogGroup: process.env.STEP_FUNCTION_LOG_GROUP,
126
- recentRuns: [],
127
- },
128
- };
129
- // setup url
130
- const setupToken = (await (0, helpers_1.getSecretJsonValue)(process.env.SETUP_SECRET_ARN)).token;
131
- if (setupToken) {
132
- status.github.setup.status = 'Pending';
133
- status.github.setup.url = `${process.env.SETUP_FUNCTION_URL}?token=${setupToken}`;
134
- }
135
- else {
136
- status.github.setup.status = 'Complete';
137
- }
138
- // list last 10 executions and their status
139
- try {
140
- const executions = await sf.listExecutions({
141
- stateMachineArn: process.env.STEP_FUNCTION_ARN,
142
- maxResults: 10,
143
- }).promise();
144
- for (const execution of executions.executions) {
145
- const executionDetails = await sf.describeExecution({
146
- executionArn: execution.executionArn,
147
- }).promise();
148
- const input = JSON.parse(executionDetails.input || '{}');
149
- status.troubleshooting.recentRuns.push({
150
- executionArn: execution.executionArn,
151
- status: execution.status,
152
- owner: input.owner,
153
- repo: input.repo,
154
- runId: input.runId,
155
- });
156
- }
157
- }
158
- catch (e) {
159
- status.troubleshooting.recentRuns.push({ status: `Error getting executions: ${e}` });
160
- }
161
- // get secrets
162
- let githubSecrets;
163
- try {
164
- githubSecrets = await (0, helpers_1.getSecretJsonValue)(process.env.GITHUB_SECRET_ARN);
165
- }
166
- catch (e) {
167
- status.github.auth.status = `Unable to read secret: ${e}`;
168
- return safeReturnValue(event, status);
169
- }
170
- let privateKey;
171
- try {
172
- privateKey = await (0, helpers_1.getSecretValue)(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN);
173
- }
174
- catch (e) {
175
- status.github.auth.status = `Unable to read private key secret: ${e}`;
176
- return safeReturnValue(event, status);
177
- }
178
- // calculate base url
179
- let baseUrl = (0, github_1.baseUrlFromDomain)(githubSecrets.domain);
180
- status.github.domain = githubSecrets.domain;
181
- if (githubSecrets.personalAuthToken) {
182
- // try authenticating with personal authentication token
183
- status.github.auth.type = 'Personal Auth Token';
184
- status.github.auth.personalAuthToken = '*redacted*';
185
- let octokit;
186
- try {
187
- octokit = new core_1.Octokit({ baseUrl, auth: githubSecrets.personalAuthToken });
188
- }
189
- catch (e) {
190
- status.github.auth.status = `Unable to authenticate using personal auth token: ${e}`;
191
- return safeReturnValue(event, status);
192
- }
193
- try {
194
- const user = await octokit.request('GET /user');
195
- status.github.auth.personalAuthToken = `username: ${user.data.login}`;
196
- }
197
- catch (e) {
198
- status.github.auth.status = `Unable to call /user with personal auth token: ${e}`;
199
- return safeReturnValue(event, status);
200
- }
201
- status.github.auth.status = 'OK';
202
- status.github.webhook.status = 'Unable to verify automatically';
203
- }
204
- else {
205
- // try authenticating with GitHub app
206
- status.github.auth.type = 'GitHub App';
207
- status.github.auth.app.id = githubSecrets.appId;
208
- let appOctokit;
209
- try {
210
- appOctokit = new core_1.Octokit({
211
- baseUrl,
212
- authStrategy: auth_app_1.createAppAuth,
213
- auth: {
214
- appId: githubSecrets.appId,
215
- privateKey: privateKey,
216
- },
217
- });
218
- }
219
- catch (e) {
220
- status.github.auth.status = `Unable to authenticate app: ${e}`;
221
- return safeReturnValue(event, status);
222
- }
223
- // get app url
224
- try {
225
- const app = (await appOctokit.request('GET /app')).data;
226
- status.github.auth.app.url = app.html_url;
227
- }
228
- catch (e) {
229
- status.github.auth.status = `Unable to get app details: ${e}`;
230
- return safeReturnValue(event, status);
231
- }
232
- // list all app installations
233
- try {
234
- const installations = (await appOctokit.request('GET /app/installations')).data;
235
- for (const installation of installations) {
236
- let installationDetails = {
237
- id: installation.id,
238
- url: installation.html_url,
239
- status: 'Unable to query',
240
- repositories: [],
241
- };
242
- let token;
243
- try {
244
- token = (await appOctokit.auth({
245
- type: 'installation',
246
- installationId: installation.id,
247
- })).token;
248
- }
249
- catch (e) {
250
- installationDetails.status = `Unable to authenticate app installation: ${e}`;
251
- continue;
252
- }
253
- let octokit;
254
- try {
255
- octokit = new core_1.Octokit({ baseUrl, auth: token });
256
- }
257
- catch (e) {
258
- installationDetails.status = `Unable to authenticate using app: ${e}`;
259
- continue;
260
- }
261
- try {
262
- const repositories = (await octokit.request('GET /installation/repositories')).data.repositories;
263
- for (const repo of repositories) {
264
- installationDetails.repositories.push(repo.full_name);
265
- }
266
- }
267
- catch (e) {
268
- installationDetails.status = `Unable to authenticate using installation token: ${e}`;
269
- continue;
270
- }
271
- installationDetails.status = 'OK';
272
- status.github.auth.app.installations.push(installationDetails);
273
- }
274
- }
275
- catch (e) {
276
- status.github.auth.status = 'Unable to list app installations';
277
- return safeReturnValue(event, status);
278
- }
279
- status.github.auth.status = 'OK';
280
- // check webhook config
281
- try {
282
- const response = await appOctokit.request('GET /app/hook/config', {});
283
- if (response.data.url !== process.env.WEBHOOK_URL) {
284
- status.github.webhook.status = 'GitHub has wrong webhook URL configured';
285
- }
286
- else {
287
- // TODO check secret by doing a dummy delivery? force apply secret?
288
- status.github.webhook.status = 'OK (note that secret cannot be checked automatically)';
289
- }
290
- }
291
- catch (e) {
292
- status.github.webhook.status = `Unable to check app configuration: ${e}`;
293
- return safeReturnValue(event, status);
294
- }
295
- }
296
- return safeReturnValue(event, status);
297
- };
298
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL3N0YXR1cy5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsZ0RBQWtEO0FBQ2xELHdDQUF3QztBQUV4QywrQkFBK0I7QUFDL0IscUNBQTZDO0FBQzdDLHVDQUErRDtBQUMvRCxxRkFBcUY7QUFFckYsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7QUFFbkMsU0FBUyxjQUFjLENBQUMsR0FBVztJQUNqQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0VBQXdFO0lBQ3RHLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTFELE9BQU8sV0FBVyxNQUFNLHNEQUFzRCxNQUFNLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztBQUMvRyxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsR0FBVztJQUNqQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsc0RBQXNEO0lBQ3BGLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMs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cGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgY3JlYXRlQXBwQXV0aCB9IGZyb20gJ0BvY3Rva2l0L2F1dGgtYXBwJztcbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCAqIGFzIEFXU0xhbWJkYSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCB7IGJhc2VVcmxGcm9tRG9tYWluIH0gZnJvbSAnLi9naXRodWInO1xuaW1wb3J0IHsgZ2V0U2VjcmV0SnNvblZhbHVlLCBnZXRTZWNyZXRWYWx1ZSB9IGZyb20gJy4vaGVscGVycyc7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLGltcG9ydC9uby11bnJlc29sdmVkICovXG5cbmNvbnN0IGNmbiA9IG5ldyBBV1MuQ2xvdWRGb3JtYXRpb24oKTtcbmNvbnN0IGVjMiA9IG5ldyBBV1MuRUMyKCk7XG5jb25zdCBlY3IgPSBuZXcgQVdTLkVDUigpO1xuY29uc3Qgc2YgPSBuZXcgQVdTLlN0ZXBGdW5jdGlvbnMoKTtcblxuZnVuY3Rpb24gc2VjcmV0QXJuVG9VcmwoYXJuOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBhcm4uc3BsaXQoJzonKTsgLy8gYXJuOmF3czpzZWNyZXRzbWFuYWdlcjp1cy1lYXN0LTE6MTIzNDU2Nzg6c2VjcmV0OnNlY3JldC1uYW1lLVJFVklTSU9OXG4gIGNvbnN0IHJlZ2lvbiA9IHBhcnRzWzNdO1xuICBjb25zdCBmdWxsTmFtZSA9IHBhcnRzWzZdO1xuICBjb25zdCBuYW1lID0gZnVsbE5hbWUuc2xpY2UoMCwgZnVsbE5hbWUubGFzdEluZGV4T2YoJy0nKSk7XG5cbiAgcmV0dXJuIGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL3NlY3JldHNtYW5hZ2VyL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMhL3NlY3JldD9uYW1lPSR7bmFtZX1gO1xufVxuXG5mdW5jdGlvbiBsYW1iZGFBcm5Ub1VybChhcm46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGFybi5zcGxpdCgnOicpOyAvLyBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg6ZnVuY3Rpb246bmFtZS1YWVpcbiAgY29uc3QgcmVnaW9uID0gcGFydHNbM107XG4gIGNvbnN0IG5hbWUgPSBwYXJ0c1s2XTtcblxuICByZXR1cm4gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvZnVuY3Rpb25zLyR7bmFtZX0/dGFiPW1vbml0b3JpbmdgO1xufVxuXG5mdW5jdGlvbiBzdGVwRnVuY3Rpb25Bcm5Ub1VybChhcm46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGFybi5zcGxpdCgnOicpOyAvLyBhcm46YXdzOnN0YXRlczp1cy1lYXN0LTE6MTIzNDU2Nzg6c3RhdGVNYWNoaW5lOm5hbWUtWFlaXG4gIGNvbnN0IHJlZ2lvbiA9IHBhcnRzWzNdO1xuXG4gIHJldHVybiBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9zdGF0ZXMvaG9tZT9yZWdpb249JHtyZWdpb259Iy9zdGF0ZW1hY2hpbmVzL3ZpZXcvJHthcm59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcm92aWRlcnNTdGF0dXMoc3RhY2s6IHN0cmluZywgbG9naWNhbElkOiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBjZm4uZGVzY3JpYmVTdGFja1Jlc291cmNlKHsgU3RhY2tOYW1lOiBzdGFjaywgTG9naWNhbFJlc291cmNlSWQ6IGxvZ2ljYWxJZCB9KS5wcm9taXNlKCk7XG4gIGNvbnN0IHByb3ZpZGVycyA9IEpTT04ucGFyc2UocmVzb3VyY2UuU3RhY2tSZXNvdXJjZURldGFpbD8uTWV0YWRhdGEgPz8gJ3t9JykucHJvdmlkZXJzIGFzIGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gIGlmICghcHJvdmlkZXJzKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb3ZpZGVycy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAvLyBhZGQgRUNSIGRhdGEsIGlmIGltYWdlIGlzIGZyb20gRUNSXG4gICAgaWYgKHAuaW1hZ2U/LmltYWdlUmVwb3NpdG9yeT8ubWF0Y2goL1swLTldK1xcLmRrclxcLmVjclxcLlthLXowLTlcXC1dK1xcLmFtYXpvbmF3c1xcLmNvbVxcLy4rLykpIHtcbiAgICAgIGNvbnN0IHRhZ3MgPSBhd2FpdCBlY3IuZGVzY3JpYmVJbWFnZXMoe1xuICAgICAgICByZXBvc2l0b3J5TmFtZTogcC5pbWFnZS5pbWFnZVJlcG9zaXRvcnkuc3BsaXQoJy8nKVsxXSxcbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgdGFnU3RhdHVzOiAnVEFHR0VEJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWF4UmVzdWx0czogMSxcbiAgICAgIH0pLnByb21pc2UoKTtcbiAgICAgIGlmICh0YWdzLmltYWdlRGV0YWlscyAmJiB0YWdzLmltYWdlRGV0YWlscz8ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgcC5pbWFnZS5sYXRlc3RJbWFnZSA9IHtcbiAgICAgICAgICB0YWdzOiB0YWdzLmltYWdlRGV0YWlsc1swXS5pbWFnZVRhZ3MsXG4gICAgICAgICAgZGlnZXN0OiB0YWdzLmltYWdlRGV0YWlsc1swXS5pbWFnZURpZ2VzdCxcbiAgICAgICAgICBkYXRlOiB0YWdzLmltYWdlRGV0YWlsc1swXS5pbWFnZVB1c2hlZEF0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgQU1JIGRhdGEsIGlmIGltYWdlIGlzIEFNSVxuICAgIGlmIChwLmFtaT8ubGF1bmNoVGVtcGxhdGUpIHtcbiAgICAgIGNvbnN0IHZlcnNpb25zID0gYXdhaXQgZWMyLmRlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucyh7XG4gICAgICAgIExhdW5jaFRlbXBsYXRlSWQ6IHAuYW1pLmxhdW5jaFRlbXBsYXRlLFxuICAgICAgICBWZXJzaW9uczogWyckRGVmYXVsdCddLFxuICAgICAgfSkucHJvbWlzZSgpO1xuICAgICAgaWYgKHZlcnNpb25zLkxhdW5jaFRlbXBsYXRlVmVyc2lvbnMgJiYgdmVyc2lvbnMuTGF1bmNoVGVtcGxhdGVWZXJzaW9ucy5sZW5ndGggPj0gMSkge1xuICAgICAgICBwLmFtaS5sYXRlc3RBbWkgPSB2ZXJzaW9ucy5MYXVuY2hUZW1wbGF0ZVZlcnNpb25zWzBdLkxhdW5jaFRlbXBsYXRlRGF0YT8uSW1hZ2VJZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pKTtcbn1cblxuaW50ZXJmYWNlIEFwcEluc3RhbGxhdGlvbiB7XG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBzdGF0dXM6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVwb3NpdG9yaWVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFJlY2VudFJ1biB7XG4gIHJlYWRvbmx5IG93bmVyPzogc3RyaW5nO1xuICByZWFkb25seSByZXBvPzogc3RyaW5nO1xuICByZWFkb25seSBydW5JZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZXhlY3V0aW9uQXJuPzogc3RyaW5nO1xuICByZWFkb25seSBzdGF0dXM6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gc2FmZVJldHVyblZhbHVlKGV2ZW50OiBQYXJ0aWFsPEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudD4sIHN0YXR1czogYW55KSB7XG4gIGlmIChldmVudC5wYXRoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShzdGF0dXMpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdHVzO1xufVxuXG5leHBvcnRzLmhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQ6IFBhcnRpYWw8QVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUV2ZW50Pikge1xuICAvLyBjb25maXJtIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZiAoIXByb2Nlc3MuZW52LldFQkhPT0tfU0VDUkVUX0FSTiB8fCAhcHJvY2Vzcy5lbnYuR0lUSFVCX1NFQ1JFVF9BUk4gfHwgIXByb2Nlc3MuZW52LkdJVEhVQl9QUklWQVRFX0tFWV9TRUNSRVRfQVJOIHx8ICFwcm9jZXNzLmVudi5MT0dJQ0FMX0lEIHx8XG4gICAgICAhcHJvY2Vzcy5lbnYuV0VCSE9PS19IQU5ETEVSX0FSTiB8fCAhcHJvY2Vzcy5lbnYuU1RFUF9GVU5DVElPTl9BUk4gfHwgIXByb2Nlc3MuZW52LlNFVFVQX1NFQ1JFVF9BUk4gfHwgIXByb2Nlc3MuZW52LlNFVFVQX0ZVTkNUSU9OX1VSTCB8fFxuICAgICAgIXByb2Nlc3MuZW52LlNUQUNLX05BTUUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gIH1cblxuICAvLyBiYXNlIHN0YXR1c1xuICBjb25zdCBzdGF0dXMgPSB7XG4gICAgZ2l0aHViOiB7XG4gICAgICBzZXR1cDoge1xuICAgICAgICBzdGF0dXM6ICdVbmtub3duJyxcbiAgICAgICAgdXJsOiAnJyxcbiAgICAgICAgc2VjcmV0QXJuOiBwcm9jZXNzLmVudi5TRVRVUF9TRUNSRVRfQVJOLFxuICAgICAgICBzZWNyZXRVcmw6IHNlY3JldEFyblRvVXJsKHByb2Nlc3MuZW52LlNFVFVQX1NFQ1JFVF9BUk4pLFxuICAgICAgfSxcbiAgICAgIGRvbWFpbjogJ1Vua25vd24nLFxuICAgICAgd2ViaG9vazoge1xuICAgICAgICB1cmw6IHByb2Nlc3MuZW52LldFQkhPT0tfVVJMLFxuICAgICAgICBzdGF0dXM6ICdVbmFibGUgdG8gY2hlY2snLFxuICAgICAgICBzZWNyZXRBcm46IHByb2Nlc3MuZW52LldFQkhPT0tfU0VDUkVUX0FSTixcbiAgICAgICAgc2VjcmV0VXJsOiBzZWNyZXRBcm5Ub1VybChwcm9jZXNzLmVudi5XRUJIT09LX1NFQ1JFVF9BUk4pLFxuICAgICAgfSxcbiAgICAgIGF1dGg6IHtcbiAgICAgICAgdHlwZTogJ1Vua25vd24nLFxuICAgICAgICBzdGF0dXM6ICdVbmtub3duJyxcbiAgICAgICAgc2VjcmV0QXJuOiBwcm9jZXNzLmVudi5HSVRIVUJfU0VDUkVUX0FSTixcbiAgICAgICAgc2VjcmV0VXJsOiBzZWNyZXRBcm5Ub1VybChwcm9jZXNzLmVudi5HSVRIVUJfU0VDUkVUX0FSTiksXG4gICAgICAgIHByaXZhdGVLZXlTZWNyZXRBcm46IHByb2Nlc3MuZW52LkdJVEhVQl9QUklWQVRFX0tFWV9TRUNSRVRfQVJOLFxuICAgICAgICBwcml2YXRlS2V5U2VjcmV0VXJsOiBzZWNyZXRBcm5Ub1VybChwcm9jZXNzLmVudi5HSVRIVUJfUFJJVkFURV9LRVlfU0VDUkVUX0FSTiksXG4gICAgICAgIGFwcDoge1xuICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgIGluc3RhbGxhdGlvbnM6IFtdIGFzIEFwcEluc3RhbGxhdGlvbltdLFxuICAgICAgICB9LFxuICAgICAgICBwZXJzb25hbEF1dGhUb2tlbjogJycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBhd2FpdCBnZW5lcmF0ZVByb3ZpZGVyc1N0YXR1cyhwcm9jZXNzLmVudi5TVEFDS19OQU1FLCBwcm9jZXNzLmVudi5MT0dJQ0FMX0lEKSxcbiAgICB0cm91Ymxlc2hvb3Rpbmc6IHtcbiAgICAgIHdlYmhvb2tIYW5kbGVyQXJuOiBwcm9jZXNzLmVudi5XRUJIT09LX0hBTkRMRVJfQVJOLFxuICAgICAgd2ViaG9va0hhbmRsZXJVcmw6IGxhbWJkYUFyblRvVXJsKHByb2Nlc3MuZW52LldFQkhPT0tfSEFORExFUl9BUk4pLFxuICAgICAgc3RlcEZ1bmN0aW9uQXJuOiBwcm9jZXNzLmVudi5TVEVQX0ZVTkNUSU9OX0FSTixcbiAgICAgIHN0ZXBGdW5jdGlvblVybDogc3RlcEZ1bmN0aW9uQXJuVG9VcmwocHJvY2Vzcy5lbnYuU1RFUF9GVU5DVElPTl9BUk4pLFxuICAgICAgc3RlcEZ1bmN0aW9uTG9nR3JvdXA6IHByb2Nlc3MuZW52LlNURVBfRlVOQ1RJT05fTE9HX0dST1VQLFxuICAgICAgcmVjZW50UnVuczogW10gYXMgUmVjZW50UnVuW10sXG4gICAgfSxcbiAgfTtcblxuICAvLyBzZXR1cCB1cmxcbiAgY29uc3Qgc2V0dXBUb2tlbiA9IChhd2FpdCBnZXRTZWNyZXRKc29uVmFsdWUocHJvY2Vzcy5lbnYuU0VUVVBfU0VDUkVUX0FSTikpLnRva2VuO1xuICBpZiAoc2V0dXBUb2tlbikge1xuICAgIHN0YXR1cy5naXRodWIuc2V0dXAuc3RhdHVzID0gJ1BlbmRpbmcnO1xuICAgIHN0YXR1cy5naXRodWIuc2V0dXAudXJsID0gYCR7cHJvY2Vzcy5lbnYuU0VUVVBfRlVOQ1RJT05fVVJMfT90b2tlbj0ke3NldHVwVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0dXMuZ2l0aHViLnNldHVwLnN0YXR1cyA9ICdDb21wbGV0ZSc7XG4gIH1cblxuICAvLyBsaXN0IGxhc3QgMTAgZXhlY3V0aW9ucyBhbmQgdGhlaXIgc3RhdHVzXG4gIHRyeSB7XG4gICAgY29uc3QgZXhlY3V0aW9ucyA9IGF3YWl0IHNmLmxpc3RFeGVjdXRpb25zKHtcbiAgICAgIHN0YXRlTWFjaGluZUFybjogcHJvY2Vzcy5lbnYuU1RFUF9GVU5DVElPTl9BUk4sXG4gICAgICBtYXhSZXN1bHRzOiAxMCxcbiAgICB9KS5wcm9taXNlKCk7XG4gICAgZm9yIChjb25zdCBleGVjdXRpb24gb2YgZXhlY3V0aW9ucy5leGVjdXRpb25zKSB7XG4gICAgICBjb25zdCBleGVjdXRpb25EZXRhaWxzID0gYXdhaXQgc2YuZGVzY3JpYmVFeGVjdXRpb24oe1xuICAgICAgICBleGVjdXRpb25Bcm46IGV4ZWN1dGlvbi5leGVjdXRpb25Bcm4sXG4gICAgICB9KS5wcm9taXNlKCk7XG4gICAgICBjb25zdCBpbnB1dCA9IEpTT04ucGFyc2UoZXhlY3V0aW9uRGV0YWlscy5pbnB1dCB8fCAne30nKTtcblxuICAgICAgc3RhdHVzLnRyb3VibGVzaG9vdGluZy5yZWNlbnRSdW5zLnB1c2goe1xuICAgICAgICBleGVjdXRpb25Bcm46IGV4ZWN1dGlvbi5leGVjdXRpb25Bcm4sXG4gICAgICAgIHN0YXR1czogZXhlY3V0aW9uLnN0YXR1cyxcbiAgICAgICAgb3duZXI6IGlucHV0Lm93bmVyLFxuICAgICAgICByZXBvOiBpbnB1dC5yZXBvLFxuICAgICAgICBydW5JZDogaW5wdXQucnVuSWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzdGF0dXMudHJvdWJsZXNob290aW5nLnJlY2VudFJ1bnMucHVzaCh7IHN0YXR1czogYEVycm9yIGdldHRpbmcgZXhlY3V0aW9uczogJHtlfWAgfSk7XG4gIH1cblxuICAvLyBnZXQgc2VjcmV0c1xuICBsZXQgZ2l0aHViU2VjcmV0cztcbiAgdHJ5IHtcbiAgICBnaXRodWJTZWNyZXRzID0gYXdhaXQgZ2V0U2VjcmV0SnNvblZhbHVlKHByb2Nlc3MuZW52LkdJVEhVQl9TRUNSRVRfQVJOKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSBgVW5hYmxlIHRvIHJlYWQgc2VjcmV0OiAke2V9YDtcbiAgICByZXR1cm4gc2FmZVJldHVyblZhbHVlKGV2ZW50LCBzdGF0dXMpO1xuICB9XG5cbiAgbGV0IHByaXZhdGVLZXk7XG4gIHRyeSB7XG4gICAgcHJpdmF0ZUtleSA9IGF3YWl0IGdldFNlY3JldFZhbHVlKHByb2Nlc3MuZW52LkdJVEhVQl9QUklWQVRFX0tFWV9TRUNSRVRfQVJOKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSBgVW5hYmxlIHRvIHJlYWQgcHJpdmF0ZSBrZXkgc2VjcmV0OiAke2V9YDtcbiAgICByZXR1cm4gc2FmZVJldHVyblZhbHVlKGV2ZW50LCBzdGF0dXMpO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlIGJhc2UgdXJsXG4gIGxldCBiYXNlVXJsID0gYmFzZVVybEZyb21Eb21haW4oZ2l0aHViU2VjcmV0cy5kb21haW4pO1xuICBzdGF0dXMuZ2l0aHViLmRvbWFpbiA9IGdpdGh1YlNlY3JldHMuZG9tYWluO1xuXG4gIGlmIChnaXRodWJTZWNyZXRzLnBlcnNvbmFsQXV0aFRva2VuKSB7XG4gICAgLy8gdHJ5IGF1dGhlbnRpY2F0aW5nIHdpdGggcGVyc29uYWwgYXV0aGVudGljYXRpb24gdG9rZW5cbiAgICBzdGF0dXMuZ2l0aHViLmF1dGgudHlwZSA9ICdQZXJzb25hbCBBdXRoIFRva2VuJztcbiAgICBzdGF0dXMuZ2l0aHViLmF1dGgucGVyc29uYWxBdXRoVG9rZW4gPSAnKnJlZGFjdGVkKic7XG5cbiAgICBsZXQgb2N0b2tpdDtcbiAgICB0cnkge1xuICAgICAgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHsgYmFzZVVybCwgYXV0aDogZ2l0aHViU2VjcmV0cy5wZXJzb25hbEF1dGhUb2tlbiB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXMuZ2l0aHViLmF1dGguc3RhdHVzID0gYFVuYWJsZSB0byBhdXRoZW50aWNhdGUgdXNpbmcgcGVyc29uYWwgYXV0aCB0b2tlbjogJHtlfWA7XG4gICAgICByZXR1cm4gc2FmZVJldHVyblZhbHVlKGV2ZW50LCBzdGF0dXMpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VyID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3VzZXInKTtcbiAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5wZXJzb25hbEF1dGhUb2tlbiA9IGB1c2VybmFtZTogJHt1c2VyLmRhdGEubG9naW59YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXMuZ2l0aHViLmF1dGguc3RhdHVzID0gYFVuYWJsZSB0byBjYWxsIC91c2VyIHdpdGggcGVyc29uYWwgYXV0aCB0b2tlbjogJHtlfWA7XG4gICAgICByZXR1cm4gc2FmZVJldHVyblZhbHVlKGV2ZW50LCBzdGF0dXMpO1xuICAgIH1cblxuICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSAnT0snO1xuICAgIHN0YXR1cy5naXRodWIud2ViaG9vay5zdGF0dXMgPSAnVW5hYmxlIHRvIHZlcmlmeSBhdXRvbWF0aWNhbGx5JztcbiAgfSBlbHNlIHtcbiAgICAvLyB0cnkgYXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgYXBwXG4gICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnR5cGUgPSAnR2l0SHViIEFwcCc7XG4gICAgc3RhdHVzLmdpdGh1Yi5hdXRoLmFwcC5pZCA9IGdpdGh1YlNlY3JldHMuYXBwSWQ7XG5cbiAgICBsZXQgYXBwT2N0b2tpdDtcbiAgICB0cnkge1xuICAgICAgYXBwT2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICAgICAgYmFzZVVybCxcbiAgICAgICAgYXV0aFN0cmF0ZWd5OiBjcmVhdGVBcHBBdXRoLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgYXBwSWQ6IGdpdGh1YlNlY3JldHMuYXBwSWQsXG4gICAgICAgICAgcHJpdmF0ZUtleTogcHJpdmF0ZUtleSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSBgVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBhcHA6ICR7ZX1gO1xuICAgICAgcmV0dXJuIHNhZmVSZXR1cm5WYWx1ZShldmVudCwgc3RhdHVzKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgYXBwIHVybFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHAgPSAoYXdhaXQgYXBwT2N0b2tpdC5yZXF1ZXN0KCdHRVQgL2FwcCcpKS5kYXRhO1xuICAgICAgc3RhdHVzLmdpdGh1Yi5hdXRoLmFwcC51cmwgPSBhcHAuaHRtbF91cmw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnN0YXR1cyA9IGBVbmFibGUgdG8gZ2V0IGFwcCBkZXRhaWxzOiAke2V9YDtcbiAgICAgIHJldHVybiBzYWZlUmV0dXJuVmFsdWUoZXZlbnQsIHN0YXR1cyk7XG4gICAgfVxuXG4gICAgLy8gbGlzdCBhbGwgYXBwIGluc3RhbGxhdGlvbnNcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5zdGFsbGF0aW9ucyA9IChhd2FpdCBhcHBPY3Rva2l0LnJlcXVlc3QoJ0dFVCAvYXBwL2luc3RhbGxhdGlvbnMnKSkuZGF0YTtcbiAgICAgIGZvciAoY29uc3QgaW5zdGFsbGF0aW9uIG9mIGluc3RhbGxhdGlvbnMpIHtcbiAgICAgICAgbGV0IGluc3RhbGxhdGlvbkRldGFpbHMgPSB7XG4gICAgICAgICAgaWQ6IGluc3RhbGxhdGlvbi5pZCxcbiAgICAgICAgICB1cmw6IGluc3RhbGxhdGlvbi5odG1sX3VybCxcbiAgICAgICAgICBzdGF0dXM6ICdVbmFibGUgdG8gcXVlcnknLFxuICAgICAgICAgIHJlcG9zaXRvcmllczogW10gYXMgc3RyaW5nW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRva2VuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRva2VuID0gKGF3YWl0IGFwcE9jdG9raXQuYXV0aCh7XG4gICAgICAgICAgICB0eXBlOiAnaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbklkOiBpbnN0YWxsYXRpb24uaWQsXG4gICAgICAgICAgfSkgYXMgYW55KS50b2tlbjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGluc3RhbGxhdGlvbkRldGFpbHMuc3RhdHVzID0gYFVuYWJsZSB0byBhdXRoZW50aWNhdGUgYXBwIGluc3RhbGxhdGlvbjogJHtlfWA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb2N0b2tpdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvY3Rva2l0ID0gbmV3IE9jdG9raXQoeyBiYXNlVXJsLCBhdXRoOiB0b2tlbiB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGluc3RhbGxhdGlvbkRldGFpbHMuc3RhdHVzID0gYFVuYWJsZSB0byBhdXRoZW50aWNhdGUgdXNpbmcgYXBwOiAke2V9YDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVwb3NpdG9yaWVzID0gKGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9pbnN0YWxsYXRpb24vcmVwb3NpdG9yaWVzJykpLmRhdGEucmVwb3NpdG9yaWVzO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVwbyBvZiByZXBvc2l0b3JpZXMpIHtcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbkRldGFpbHMucmVwb3NpdG9yaWVzLnB1c2gocmVwby5mdWxsX25hbWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpbnN0YWxsYXRpb25EZXRhaWxzLnN0YXR1cyA9IGBVbmFibGUgdG8gYXV0aGVudGljYXRlIHVzaW5nIGluc3RhbGxhdGlvbiB0b2tlbjogJHtlfWA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0YWxsYXRpb25EZXRhaWxzLnN0YXR1cyA9ICdPSyc7XG4gICAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5hcHAuaW5zdGFsbGF0aW9ucy5wdXNoKGluc3RhbGxhdGlvbkRldGFpbHMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSAnVW5hYmxlIHRvIGxpc3QgYXBwIGluc3RhbGxhdGlvbnMnO1xuICAgICAgcmV0dXJuIHNhZmVSZXR1cm5WYWx1ZShldmVudCwgc3RhdHVzKTtcbiAgICB9XG5cbiAgICBzdGF0dXMuZ2l0aHViLmF1dGguc3RhdHVzID0gJ09LJztcblxuICAgIC8vIGNoZWNrIHdlYmhvb2sgY29uZmlnXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBwT2N0b2tpdC5yZXF1ZXN0KCdHRVQgL2FwcC9ob29rL2NvbmZpZycsIHt9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLmRhdGEudXJsICE9PSBwcm9jZXNzLmVudi5XRUJIT09LX1VSTCkge1xuICAgICAgICBzdGF0dXMuZ2l0aHViLndlYmhvb2suc3RhdHVzID0gJ0dpdEh1YiBoYXMgd3Jvbmcgd2ViaG9vayBVUkwgY29uZmlndXJlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPIGNoZWNrIHNlY3JldCBieSBkb2luZyBhIGR1bW15IGRlbGl2ZXJ5PyBmb3JjZSBhcHBseSBzZWNyZXQ/XG4gICAgICAgIHN0YXR1cy5naXRodWIud2ViaG9vay5zdGF0dXMgPSAnT0sgKG5vdGUgdGhhdCBzZWNyZXQgY2Fubm90IGJlIGNoZWNrZWQgYXV0b21hdGljYWxseSknO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1cy5naXRodWIud2ViaG9vay5zdGF0dXMgPSBgVW5hYmxlIHRvIGNoZWNrIGFwcCBjb25maWd1cmF0aW9uOiAke2V9YDtcbiAgICAgIHJldHVybiBzYWZlUmV0dXJuVmFsdWUoZXZlbnQsIHN0YXR1cyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNhZmVSZXR1cm5WYWx1ZShldmVudCwgc3RhdHVzKTtcbn07XG4iXX0=
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TokenRetrieverFunction = void 0;
4
- // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
- const path = require("path");
6
- const lambda = require("aws-cdk-lib/aws-lambda");
7
- /**
8
- * An AWS Lambda function which executes src/lambdas/token-retriever.
9
- */
10
- class TokenRetrieverFunction extends lambda.Function {
11
- constructor(scope, id, props) {
12
- super(scope, id, {
13
- description: 'src/lambdas/token-retriever.lambda.ts',
14
- ...props,
15
- runtime: new lambda.Runtime('nodejs16.x', lambda.RuntimeFamily.NODEJS),
16
- handler: 'index.handler',
17
- code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/token-retriever.lambda')),
18
- });
19
- this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
- }
21
- }
22
- exports.TokenRetrieverFunction = TokenRetrieverFunction;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV0cmlldmVyLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvdG9rZW4tcmV0cmlldmVyLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUE2RTtBQUM3RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBU2pEOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxNQUFNLENBQUMsUUFBUTtJQUN6RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1DO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLHVDQUF1QztZQUNwRCxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUN0RSxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztTQUNqRyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQVhELHdEQVdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy5qcyBhbmQgcnVuIFwibnB4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBUb2tlblJldHJpZXZlckZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXRyaWV2ZXJGdW5jdGlvblByb3BzIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uT3B0aW9ucyB7XG59XG5cbi8qKlxuICogQW4gQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaCBleGVjdXRlcyBzcmMvbGFtYmRhcy90b2tlbi1yZXRyaWV2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb2tlblJldHJpZXZlckZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBUb2tlblJldHJpZXZlckZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3JjL2xhbWJkYXMvdG9rZW4tcmV0cmlldmVyLmxhbWJkYS50cycsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJ1bnRpbWU6IG5ldyBsYW1iZGEuUnVudGltZSgnbm9kZWpzMTYueCcsIGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Fzc2V0cy9sYW1iZGFzL3Rva2VuLXJldHJpZXZlci5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const github_1 = require("./github");
4
- exports.handler = async function (event) {
5
- const { githubSecrets, octokit } = await (0, github_1.getOctokit)(event.installationId);
6
- const response = await octokit.rest.actions.createRegistrationTokenForRepo({
7
- owner: event.owner,
8
- repo: event.repo,
9
- });
10
- return {
11
- domain: githubSecrets.domain,
12
- token: response.data.token,
13
- };
14
- };
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV0cmlldmVyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL3Rva2VuLXJldHJpZXZlci5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBc0M7QUFHdEMsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLFdBQVcsS0FBOEI7SUFDOUQsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLElBQUEsbUJBQVUsRUFBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFMUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQztRQUN6RSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO0tBQ2pCLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU07UUFDNUIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSztLQUMzQixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4vZ2l0aHViJztcbmltcG9ydCB7IFN0ZXBGdW5jdGlvbkxhbWJkYUlucHV0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBTdGVwRnVuY3Rpb25MYW1iZGFJbnB1dCkge1xuICBjb25zdCB7IGdpdGh1YlNlY3JldHMsIG9jdG9raXQgfSA9IGF3YWl0IGdldE9jdG9raXQoZXZlbnQuaW5zdGFsbGF0aW9uSWQpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXN0LmFjdGlvbnMuY3JlYXRlUmVnaXN0cmF0aW9uVG9rZW5Gb3JSZXBvKHtcbiAgICBvd25lcjogZXZlbnQub3duZXIsXG4gICAgcmVwbzogZXZlbnQucmVwbyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBkb21haW46IGdpdGh1YlNlY3JldHMuZG9tYWluLFxuICAgIHRva2VuOiByZXNwb25zZS5kYXRhLnRva2VuLFxuICB9O1xufTtcbiJdfQ==
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UpdateLambdaFunction = void 0;
4
- // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
- const path = require("path");
6
- const lambda = require("aws-cdk-lib/aws-lambda");
7
- /**
8
- * An AWS Lambda function which executes src/lambdas/update-lambda.
9
- */
10
- class UpdateLambdaFunction extends lambda.Function {
11
- constructor(scope, id, props) {
12
- super(scope, id, {
13
- description: 'src/lambdas/update-lambda.lambda.ts',
14
- ...props,
15
- runtime: new lambda.Runtime('nodejs16.x', lambda.RuntimeFamily.NODEJS),
16
- handler: 'index.handler',
17
- code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/update-lambda.lambda')),
18
- });
19
- this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
- }
21
- }
22
- exports.UpdateLambdaFunction = UpdateLambdaFunction;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWxhbWJkYS1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL3VwZGF0ZS1sYW1iZGEtZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkVBQTZFO0FBQzdFLDZCQUE2QjtBQUM3QixpREFBaUQ7QUFTakQ7O0dBRUc7QUFDSCxNQUFhLG9CQUFxQixTQUFRLE1BQU0sQ0FBQyxRQUFRO0lBQ3ZELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUscUNBQXFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDO1NBQy9GLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNGO0FBWEQsb0RBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLmpzIGFuZCBydW4gXCJucHggcHJvamVuXCIuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIFVwZGF0ZUxhbWJkYUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGFtYmRhRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbk9wdGlvbnMge1xufVxuXG4vKipcbiAqIEFuIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgc3JjL2xhbWJkYXMvdXBkYXRlLWxhbWJkYS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVwZGF0ZUxhbWJkYUZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBVcGRhdGVMYW1iZGFGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NyYy9sYW1iZGFzL3VwZGF0ZS1sYW1iZGEubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMxNi54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vYXNzZXRzL2xhbWJkYXMvdXBkYXRlLWxhbWJkYS5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
4
- /* eslint-disable-next-line import/no-extraneous-dependencies */
5
- const AWS = require("aws-sdk");
6
- const lambda = new AWS.Lambda();
7
- function sleep(ms) {
8
- return new Promise(resolve => setTimeout(resolve, ms));
9
- }
10
- async function handler(event) {
11
- console.log(JSON.stringify(event));
12
- while (true) {
13
- try {
14
- await lambda.updateFunctionCode({
15
- FunctionName: event.lambdaName,
16
- ImageUri: `${event.repositoryUri}:${event.repositoryTag}`,
17
- Publish: true,
18
- }).promise();
19
- break;
20
- }
21
- catch (e) {
22
- if (e.code == 'ResourceConflictException') {
23
- // keep trying if function is already being updated by CloudFormation
24
- // this can happen if we update some settings on the function and the image code at the same time
25
- await sleep(10000);
26
- }
27
- else {
28
- throw e;
29
- }
30
- }
31
- }
32
- }
33
- exports.handler = handler;
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWxhbWJkYS5sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFtYmRhcy91cGRhdGUtbGFtYmRhLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBZ0U7QUFDaEUsK0JBQStCO0FBSS9CLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBUWhDLFNBQVMsS0FBSyxDQUFDLEVBQVU7SUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRU0sS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFZO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRW5DLE9BQU8sSUFBSSxFQUFFO1FBQ1gsSUFBSTtZQUNGLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDO2dCQUM5QixZQUFZLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzlCLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtnQkFDekQsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNO1NBQ1A7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQWUsQ0FBRSxDQUFDLElBQUksSUFBSSwyQkFBMkIsRUFBRTtnQkFDckQscUVBQXFFO2dCQUNyRSxpR0FBaUc7Z0JBQ2pHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxDQUFDO2FBQ1Q7U0FDRjtLQUNGO0FBQ0gsQ0FBQztBQXJCRCwwQkFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBBV1NFcnJvciB9IGZyb20gJ2F3cy1zZGsvbGliL2Vycm9yJztcblxuY29uc3QgbGFtYmRhID0gbmV3IEFXUy5MYW1iZGEoKTtcblxuaW50ZXJmYWNlIElucHV0IHtcbiAgcmVhZG9ubHkgbGFtYmRhTmFtZTogc3RyaW5nO1xuICByZWFkb25seSByZXBvc2l0b3J5VXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcG9zaXRvcnlUYWc6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBJbnB1dCkge1xuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShldmVudCkpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxhbWJkYS51cGRhdGVGdW5jdGlvbkNvZGUoe1xuICAgICAgICBGdW5jdGlvbk5hbWU6IGV2ZW50LmxhbWJkYU5hbWUsXG4gICAgICAgIEltYWdlVXJpOiBgJHtldmVudC5yZXBvc2l0b3J5VXJpfToke2V2ZW50LnJlcG9zaXRvcnlUYWd9YCxcbiAgICAgICAgUHVibGlzaDogdHJ1ZSxcbiAgICAgIH0pLnByb21pc2UoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICgoPEFXU0Vycm9yPmUpLmNvZGUgPT0gJ1Jlc291cmNlQ29uZmxpY3RFeGNlcHRpb24nKSB7XG4gICAgICAgIC8vIGtlZXAgdHJ5aW5nIGlmIGZ1bmN0aW9uIGlzIGFscmVhZHkgYmVpbmcgdXBkYXRlZCBieSBDbG91ZEZvcm1hdGlvblxuICAgICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gaWYgd2UgdXBkYXRlIHNvbWUgc2V0dGluZ3Mgb24gdGhlIGZ1bmN0aW9uIGFuZCB0aGUgaW1hZ2UgY29kZSBhdCB0aGUgc2FtZSB0aW1lXG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebhookHandlerFunction = void 0;
4
- // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
- const path = require("path");
6
- const lambda = require("aws-cdk-lib/aws-lambda");
7
- /**
8
- * An AWS Lambda function which executes src/lambdas/webhook-handler.
9
- */
10
- class WebhookHandlerFunction extends lambda.Function {
11
- constructor(scope, id, props) {
12
- super(scope, id, {
13
- description: 'src/lambdas/webhook-handler.lambda.ts',
14
- ...props,
15
- runtime: new lambda.Runtime('nodejs16.x', lambda.RuntimeFamily.NODEJS),
16
- handler: 'index.handler',
17
- code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/webhook-handler.lambda')),
18
- });
19
- this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
- }
21
- }
22
- exports.WebhookHandlerFunction = WebhookHandlerFunction;
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay1oYW5kbGVyLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvd2ViaG9vay1oYW5kbGVyLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUE2RTtBQUM3RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBU2pEOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxNQUFNLENBQUMsUUFBUTtJQUN6RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1DO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLHVDQUF1QztZQUNwRCxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUN0RSxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztTQUNqRyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQVhELHdEQVdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy5qcyBhbmQgcnVuIFwibnB4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBXZWJob29rSGFuZGxlckZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va0hhbmRsZXJGdW5jdGlvblByb3BzIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uT3B0aW9ucyB7XG59XG5cbi8qKlxuICogQW4gQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaCBleGVjdXRlcyBzcmMvbGFtYmRhcy93ZWJob29rLWhhbmRsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJob29rSGFuZGxlckZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBXZWJob29rSGFuZGxlckZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3JjL2xhbWJkYXMvd2ViaG9vay1oYW5kbGVyLmxhbWJkYS50cycsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJ1bnRpbWU6IG5ldyBsYW1iZGEuUnVudGltZSgnbm9kZWpzMTYueCcsIGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Fzc2V0cy9sYW1iZGFzL3dlYmhvb2staGFuZGxlci5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
@@ -1,116 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- /* eslint-disable import/no-extraneous-dependencies */
4
- const crypto = require("crypto");
5
- const AWS = require("aws-sdk");
6
- const helpers_1 = require("./helpers");
7
- const sf = new AWS.StepFunctions();
8
- // TODO use @octokit/webhooks?
9
- function getHeader(event, header) {
10
- // API Gateway doesn't lowercase headers (V1 event) but Lambda URLs do (V2 event) :(
11
- for (const headerName of Object.keys(event.headers)) {
12
- if (headerName.toLowerCase() === header.toLowerCase()) {
13
- return event.headers[headerName];
14
- }
15
- }
16
- return undefined;
17
- }
18
- function verifyBody(event, secret) {
19
- const sig = Buffer.from(getHeader(event, 'x-hub-signature-256') || '', 'utf8');
20
- if (!event.body) {
21
- throw new Error('No body');
22
- }
23
- let body;
24
- if (event.isBase64Encoded) {
25
- body = Buffer.from(event.body, 'base64');
26
- }
27
- else {
28
- body = Buffer.from(event.body || '', 'utf8');
29
- }
30
- const hmac = crypto.createHmac('sha256', secret);
31
- hmac.update(body);
32
- const expectedSig = Buffer.from(`sha256=${hmac.digest('hex')}`, 'utf8');
33
- console.log('Calculated signature: ', expectedSig.toString());
34
- if (sig.length !== expectedSig.length || !crypto.timingSafeEqual(sig, expectedSig)) {
35
- throw new Error(`Signature mismatch. Expected ${expectedSig.toString()} but got ${sig.toString()}`);
36
- }
37
- return body.toString();
38
- }
39
- exports.handler = async function (event) {
40
- if (!process.env.WEBHOOK_SECRET_ARN || !process.env.STEP_FUNCTION_ARN) {
41
- throw new Error('Missing environment variables');
42
- }
43
- const webhookSecret = (await (0, helpers_1.getSecretJsonValue)(process.env.WEBHOOK_SECRET_ARN)).webhookSecret;
44
- let body;
45
- try {
46
- body = verifyBody(event, webhookSecret);
47
- }
48
- catch (e) {
49
- console.error(e);
50
- return {
51
- statusCode: 403,
52
- body: 'Bad signature',
53
- };
54
- }
55
- if (getHeader(event, 'content-type') !== 'application/json') {
56
- console.error(`This webhook only accepts JSON payloads, got ${getHeader(event, 'content-type')}`);
57
- return {
58
- statusCode: 400,
59
- body: 'Expecting JSON payload',
60
- };
61
- }
62
- if (getHeader(event, 'x-github-event') === 'ping') {
63
- return {
64
- statusCode: 200,
65
- body: 'Pong',
66
- };
67
- }
68
- // if (getHeader(event, 'x-github-event') !== 'workflow_job' && getHeader(event, 'x-github-event') !== 'workflow_run') {
69
- // console.error(`This webhook only accepts workflow_job and workflow_run, got ${getHeader(event, 'x-github-event')}`);
70
- if (getHeader(event, 'x-github-event') !== 'workflow_job') {
71
- console.error(`This webhook only accepts workflow_job, got ${getHeader(event, 'x-github-event')}`);
72
- return {
73
- statusCode: 400,
74
- body: 'Expecting workflow_job',
75
- };
76
- }
77
- const payload = JSON.parse(body);
78
- if (payload.action !== 'queued') {
79
- console.log(`Ignoring action "${payload.action}", expecting "queued"`);
80
- return {
81
- statusCode: 200,
82
- body: 'OK. No runner started.',
83
- };
84
- }
85
- if (!payload.workflow_job.labels.includes('self-hosted')) {
86
- console.log(`Ignoring labels "${payload.workflow_job.labels}", expecting "self-hosted"`);
87
- return {
88
- statusCode: 200,
89
- body: 'OK. No runner started.',
90
- };
91
- }
92
- // it's easier to deal with maps in step functions
93
- let labels = {};
94
- payload.workflow_job.labels.forEach((l) => labels[l.toLowerCase()] = true);
95
- // set execution name which is also used as runner name which are limited to 64 characters
96
- let executionName = `${payload.repository.full_name.replace('/', '-')}-${getHeader(event, 'x-github-delivery')}`.slice(0, 64);
97
- // start execution
98
- const execution = await sf.startExecution({
99
- stateMachineArn: process.env.STEP_FUNCTION_ARN,
100
- input: JSON.stringify({
101
- owner: payload.repository.owner.login,
102
- repo: payload.repository.name,
103
- runId: payload.workflow_job.run_id,
104
- installationId: payload.installation?.id,
105
- labels: labels,
106
- }),
107
- // name is not random so multiple execution of this webhook won't cause multiple builders to start
108
- name: executionName,
109
- }).promise();
110
- console.log(`Started ${execution.executionArn}`);
111
- return {
112
- statusCode: 202,
113
- body: executionName,
114
- };
115
- };
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay1oYW5kbGVyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL3dlYmhvb2staGFuZGxlci5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsaUNBQWlDO0FBR2pDLCtCQUErQjtBQUMvQix1Q0FBK0M7QUFFL0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7QUFFbkMsOEJBQThCO0FBRTlCLFNBQVMsU0FBUyxDQUFDLEtBQXVDLEVBQUUsTUFBYztJQUN4RSxvRkFBb0Y7SUFDcEYsS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNuRCxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDckQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xDO0tBQ0Y7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBdUMsRUFBRSxNQUFXO0lBQ3RFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUUvRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDNUI7SUFFRCxJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUU7UUFDekIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUMxQztTQUFNO1FBQ0wsSUFBSSxHQUFH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TUFBTTtZQUNsQyxjQUFjLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3hDLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUNGLGtHQUFrRztRQUNsRyxJQUFJLEVBQUUsYUFBYTtLQUNwQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFFYixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFFakQsT0FBTztRQUNMLFVBQVUsRUFBRSxHQUFHO1FBQ2YsSUFBSSxFQUFFLGFBQWE7S0FDcEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzLGltcG9ydC9uby11bnJlc29sdmVkICovXG5pbXBvcnQgKiBhcyBBV1NMYW1iZGEgZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG5pbXBvcnQgeyBnZXRTZWNyZXRKc29uVmFsdWUgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBzZiA9IG5ldyBBV1MuU3RlcEZ1bmN0aW9ucygpO1xuXG4vLyBUT0RPIHVzZSBAb2N0b2tpdC93ZWJob29rcz9cblxuZnVuY3Rpb24gZ2V0SGVhZGVyKGV2ZW50OiBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5RXZlbnRWMiwgaGVhZGVyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBBUEkgR2F0ZXdheSBkb2Vzbid0IGxvd2VyY2FzZSBoZWFkZXJzIChWMSBldmVudCkgYnV0IExhbWJkYSBVUkxzIGRvIChWMiBldmVudCkgOihcbiAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIE9iamVjdC5rZXlzKGV2ZW50LmhlYWRlcnMpKSB7XG4gICAgaWYgKGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaGVhZGVyLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBldmVudC5oZWFkZXJzW2hlYWRlck5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUJvZHkoZXZlbnQ6IEFXU0xhbWJkYS5BUElHYXRld2F5UHJveHlFdmVudFYyLCBzZWNyZXQ6IGFueSk6IHN0cmluZyB7XG4gIGNvbnN0IHNpZyA9IEJ1ZmZlci5mcm9tKGdldEhlYWRlcihldmVudCwgJ3gtaHViLXNpZ25hdHVyZS0yNTYnKSB8fCAnJywgJ3V0ZjgnKTtcblxuICBpZiAoIWV2ZW50LmJvZHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJvZHknKTtcbiAgfVxuXG4gIGxldCBib2R5OiBCdWZmZXI7XG4gIGlmIChldmVudC5pc0Jhc2U2NEVuY29kZWQpIHtcbiAgICBib2R5ID0gQnVmZmVyLmZyb20oZXZlbnQuYm9keSwgJ2Jhc2U2NCcpO1xuICB9IGVsc2Uge1xuICAgIGJvZHkgPSBCdWZmZXIuZnJvbShldmVudC5ib2R5IHx8ICcnLCAndXRmOCcpO1xuICB9XG5cbiAgY29uc3QgaG1hYyA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGEyNTYnLCBzZWNyZXQpO1xuICBobWFjLnVwZGF0ZShib2R5KTtcbiAgY29uc3QgZXhwZWN0ZWRTaWcgPSBCdWZmZXIuZnJvbShgc2hhMjU2PSR7aG1hYy5kaWdlc3QoJ2hleCcpfWAsICd1dGY4Jyk7XG5cbiAgY29uc29sZS5sb2coJ0NhbGN1bGF0ZWQgc2lnbmF0dXJlOiAnLCBleHBlY3RlZFNpZy50b1N0cmluZygpKTtcblxuICBpZiAoc2lnLmxlbmd0aCAhPT0gZXhwZWN0ZWRTaWcubGVuZ3RoIHx8ICFjcnlwdG8udGltaW5nU2FmZUVxdWFsKHNpZywgZXhwZWN0ZWRTaWcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTaWduYXR1cmUgbWlzbWF0Y2guIEV4cGVjdGVkICR7ZXhwZWN0ZWRTaWcudG9TdHJpbmcoKX0gYnV0IGdvdCAke3NpZy50b1N0cmluZygpfWApO1xuICB9XG5cbiAgcmV0dXJuIGJvZHkudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5RXZlbnRWMik6IFByb21pc2U8QVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eVJlc3VsdFYyPiB7XG4gIGlmICghcHJvY2Vzcy5lbnYuV0VCSE9PS19TRUNSRVRfQVJOIHx8ICFwcm9jZXNzLmVudi5TVEVQX0ZVTkNUSU9OX0FSTikge1xuICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgfVxuXG4gIGNvbnN0IHdlYmhvb2tTZWNyZXQgPSAoYXdhaXQgZ2V0U2VjcmV0SnNvblZhbHVlKHByb2Nlc3MuZW52LldFQkhPT0tfU0VDUkVUX0FSTikpLndlYmhvb2tTZWNyZXQ7XG5cbiAgbGV0IGJvZHk7XG4gIHRyeSB7XG4gICAgYm9keSA9IHZlcmlmeUJvZHkoZXZlbnQsIHdlYmhvb2tTZWNyZXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzQ29kZTogNDAzLFxuICAgICAgYm9keTogJ0JhZCBzaWduYXR1cmUnLFxuICAgIH07XG4gIH1cblxuICBpZiAoZ2V0SGVhZGVyKGV2ZW50LCAnY29udGVudC10eXBlJykgIT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFRoaXMgd2ViaG9vayBvbmx5IGFjY2VwdHMgSlNPTiBwYXlsb2FkcywgZ290ICR7Z2V0SGVhZGVyKGV2ZW50LCAnY29udGVudC10eXBlJyl9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDQwMCxcbiAgICAgIGJvZHk6ICdFeHBlY3RpbmcgSlNPTiBwYXlsb2FkJyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGdldEhlYWRlcihldmVudCwgJ3gtZ2l0aHViLWV2ZW50JykgPT09ICdwaW5nJykge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBib2R5OiAnUG9uZycsXG4gICAgfTtcbiAgfVxuXG4gIC8vIGlmIChnZXRIZWFkZXIoZXZlbnQsICd4LWdpdGh1Yi1ldmVudCcpICE9PSAnd29ya2Zsb3dfam9iJyAmJiBnZXRIZWFkZXIoZXZlbnQsICd4LWdpdGh1Yi1ldmVudCcpICE9PSAnd29ya2Zsb3dfcnVuJykge1xuICAvLyAgICAgY29uc29sZS5lcnJvcihgVGhpcyB3ZWJob29rIG9ubHkgYWNjZXB0cyB3b3JrZmxvd19qb2IgYW5kIHdvcmtmbG93X3J1biwgZ290ICR7Z2V0SGVhZGVyKGV2ZW50LCAneC1naXRodWItZXZlbnQnKX1gKTtcbiAgaWYgKGdldEhlYWRlcihldmVudCwgJ3gtZ2l0aHViLWV2ZW50JykgIT09ICd3b3JrZmxvd19qb2InKSB7XG4gICAgY29uc29sZS5lcnJvcihgVGhpcyB3ZWJob29rIG9ubHkgYWNjZXB0cyB3b3JrZmxvd19qb2IsIGdvdCAke2dldEhlYWRlcihldmVudCwgJ3gtZ2l0aHViLWV2ZW50Jyl9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDQwMCxcbiAgICAgIGJvZHk6ICdFeHBlY3Rpbmcgd29ya2Zsb3dfam9iJyxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoYm9keSk7XG5cbiAgaWYgKHBheWxvYWQuYWN0aW9uICE9PSAncXVldWVkJykge1xuICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBhY3Rpb24gXCIke3BheWxvYWQuYWN0aW9ufVwiLCBleHBlY3RpbmcgXCJxdWV1ZWRcImApO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBib2R5OiAnT0suIE5vIHJ1bm5lciBzdGFydGVkLicsXG4gICAgfTtcbiAgfVxuXG4gIGlmICghcGF5bG9hZC53b3JrZmxvd19qb2IubGFiZWxzLmluY2x1ZGVzKCdzZWxmLWhvc3RlZCcpKSB7XG4gICAgY29uc29sZS5sb2coYElnbm9yaW5nIGxhYmVscyBcIiR7cGF5bG9hZC53b3JrZmxvd19qb2IubGFiZWxzfVwiLCBleHBlY3RpbmcgXCJzZWxmLWhvc3RlZFwiYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgIGJvZHk6ICdPSy4gTm8gcnVubmVyIHN0YXJ0ZWQuJyxcbiAgICB9O1xuICB9XG5cbiAgLy8gaXQncyBlYXNpZXIgdG8gZGVhbCB3aXRoIG1hcHMgaW4gc3RlcCBmdW5jdGlvbnNcbiAgbGV0IGxhYmVsczogYW55ID0ge307XG4gIHBheWxvYWQud29ya2Zsb3dfam9iLmxhYmVscy5mb3JFYWNoKChsOiBzdHJpbmcpID0+IGxhYmVsc1tsLnRvTG93ZXJDYXNlKCldID0gdHJ1ZSk7XG5cbiAgLy8gc2V0IGV4ZWN1dGlvbiBuYW1lIHdoaWNoIGlzIGFsc28gdXNlZCBhcyBydW5uZXIgbmFtZSB3aGljaCBhcmUgbGltaXRlZCB0byA2NCBjaGFyYWN0ZXJzXG4gIGxldCBleGVjdXRpb25OYW1lID0gYCR7cGF5bG9hZC5yZXBvc2l0b3J5LmZ1bGxfbmFtZS5yZXBsYWNlKCcvJywgJy0nKX0tJHtnZXRIZWFkZXIoZXZlbnQsICd4LWdpdGh1Yi1kZWxpdmVyeScpfWAuc2xpY2UoMCwgNjQpO1xuICAvLyBzdGFydCBleGVjdXRpb25cbiAgY29uc3QgZXhlY3V0aW9uID0gYXdhaXQgc2Yuc3RhcnRFeGVjdXRpb24oe1xuICAgIHN0YXRlTWFjaGluZUFybjogcHJvY2Vzcy5lbnYuU1RFUF9GVU5DVElPTl9BUk4sXG4gICAgaW5wdXQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIG93bmVyOiBwYXlsb2FkLnJlcG9zaXRvcnkub3duZXIubG9naW4sXG4gICAgICByZXBvOiBwYXlsb2FkLnJlcG9zaXRvcnkubmFtZSxcbiAgICAgIHJ1bklkOiBwYXlsb2FkLndvcmtmbG93X2pvYi5ydW5faWQsXG4gICAgICBpbnN0YWxsYXRpb25JZDogcGF5bG9hZC5pbnN0YWxsYXRpb24/LmlkLFxuICAgICAgbGFiZWxzOiBsYWJlbHMsXG4gICAgfSksXG4gICAgLy8gbmFtZSBpcyBub3QgcmFuZG9tIHNvIG11bHRpcGxlIGV4ZWN1dGlvbiBvZiB0aGlzIHdlYmhvb2sgd29uJ3QgY2F1c2UgbXVsdGlwbGUgYnVpbGRlcnMgdG8gc3RhcnRcbiAgICBuYW1lOiBleGVjdXRpb25OYW1lLFxuICB9KS5wcm9taXNlKCk7XG5cbiAgY29uc29sZS5sb2coYFN0YXJ0ZWQgJHtleGVjdXRpb24uZXhlY3V0aW9uQXJufWApO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdHVzQ29kZTogMjAyLFxuICAgIGJvZHk6IGV4ZWN1dGlvbk5hbWUsXG4gIH07XG59O1xuXG4iXX0=
File without changes