apify-test-tools 0.10.1-beta.6 → 0.10.1-beta.7
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/bin/build-from-local.ts +19 -27
- package/bin/build.ts +1 -1
- package/bin/diff-changes.ts +26 -35
- package/bin/dockerignore.ts +24 -17
- package/bin/types.ts +7 -3
- package/bin/utils/config/actor-json.ts +49 -8
- package/bin/utils/config/load-config.ts +4 -24
- package/bin/utils/path/repo-relative.ts +27 -4
- package/dist/bin/build-from-local.d.ts +3 -2
- package/dist/bin/build-from-local.d.ts.map +1 -1
- package/dist/bin/build-from-local.js +16 -23
- package/dist/bin/build-from-local.js.map +1 -1
- package/dist/bin/build.js +1 -1
- package/dist/bin/build.js.map +1 -1
- package/dist/bin/diff-changes.d.ts.map +1 -1
- package/dist/bin/diff-changes.js +26 -29
- package/dist/bin/diff-changes.js.map +1 -1
- package/dist/bin/dockerignore.d.ts +11 -10
- package/dist/bin/dockerignore.d.ts.map +1 -1
- package/dist/bin/dockerignore.js +24 -15
- package/dist/bin/dockerignore.js.map +1 -1
- package/dist/bin/types.d.ts +6 -3
- package/dist/bin/types.d.ts.map +1 -1
- package/dist/bin/utils/config/actor-json.d.ts.map +1 -1
- package/dist/bin/utils/config/actor-json.js +35 -4
- package/dist/bin/utils/config/actor-json.js.map +1 -1
- package/dist/bin/utils/config/load-config.d.ts +1 -11
- package/dist/bin/utils/config/load-config.d.ts.map +1 -1
- package/dist/bin/utils/config/load-config.js +1 -10
- package/dist/bin/utils/config/load-config.js.map +1 -1
- package/dist/bin/utils/path/repo-relative.d.ts +4 -0
- package/dist/bin/utils/path/repo-relative.d.ts.map +1 -1
- package/dist/bin/utils/path/repo-relative.js +24 -5
- package/dist/bin/utils/path/repo-relative.js.map +1 -1
- package/dist/test/unit/bin/actor-filtering.test.js +8 -2
- package/dist/test/unit/bin/actor-filtering.test.js.map +1 -1
- package/dist/test/unit/bin/build-from-local.test.js +53 -5
- package/dist/test/unit/bin/build-from-local.test.js.map +1 -1
- package/dist/test/unit/bin/diff-changes.test.js +98 -132
- package/dist/test/unit/bin/diff-changes.test.js.map +1 -1
- package/dist/test/unit/bin/dockerignore.test.js +27 -24
- package/dist/test/unit/bin/dockerignore.test.js.map +1 -1
- package/dist/test/unit/bin/utils/config/load-config.test.js +40 -4
- package/dist/test/unit/bin/utils/config/load-config.test.js.map +1 -1
- package/dist/test/unit/bin/utils/path/repo-relative.test.js +5 -0
- package/dist/test/unit/bin/utils/path/repo-relative.test.js.map +1 -1
- package/dist/test/unit/should-built-and-test.test.js +55 -116
- package/dist/test/unit/should-built-and-test.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/test/unit/bin/actor-filtering.test.ts +8 -2
- package/test/unit/bin/build-from-local.test.ts +54 -8
- package/test/unit/bin/diff-changes.test.ts +133 -133
- package/test/unit/bin/dockerignore.test.ts +28 -28
- package/test/unit/bin/utils/config/load-config.test.ts +54 -4
- package/test/unit/bin/utils/path/repo-relative.test.ts +6 -0
- package/test/unit/should-built-and-test.test.ts +98 -121
|
@@ -1,42 +1,45 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { afterAll, describe, expect, test } from 'vitest';
|
|
2
5
|
import { getChangedActors } from '../../bin/diff-changes.js';
|
|
3
|
-
import
|
|
6
|
+
import { ExistingDir, ExistingFile, RelativeDir, RelativeFile } from '../../bin/utils/path/repo-relative.js';
|
|
7
|
+
const originalCwd = process.cwd();
|
|
8
|
+
const fixtureRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'apify-should-build-'));
|
|
9
|
+
process.chdir(fixtureRoot);
|
|
10
|
+
afterAll(() => {
|
|
11
|
+
process.chdir(originalCwd);
|
|
12
|
+
fs.rmSync(fixtureRoot, { recursive: true, force: true });
|
|
13
|
+
});
|
|
14
|
+
const actorConfig = (actorFullName, folder, tokenEnvVar, dockerContextDir = '.') => {
|
|
15
|
+
const actorJsonPath = path.posix.join(folder, '.actor/actor.json');
|
|
16
|
+
fs.mkdirSync(path.posix.dirname(actorJsonPath), { recursive: true });
|
|
17
|
+
fs.writeFileSync(actorJsonPath, '{}');
|
|
18
|
+
const contextPath = new RelativeDir(dockerContextDir);
|
|
19
|
+
return {
|
|
20
|
+
actorFullName,
|
|
21
|
+
folder: new ExistingDir(folder),
|
|
22
|
+
tokenEnvVar,
|
|
23
|
+
actorJson: {
|
|
24
|
+
file: new ExistingFile(actorJsonPath),
|
|
25
|
+
dockerContextDir: contextPath,
|
|
26
|
+
changelog: new RelativeFile('CHANGELOG.md'),
|
|
27
|
+
},
|
|
28
|
+
dockerContextDir: contextPath,
|
|
29
|
+
contextPaths: [contextPath],
|
|
30
|
+
};
|
|
31
|
+
};
|
|
4
32
|
describe('Should build and test parser', () => {
|
|
5
33
|
// From https://github.com/apify-store/testing-repo-for-github-actions
|
|
6
34
|
const ACTOR_CONFIGS = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
tokenEnvVar: 'APIFY_TOKEN_LUKASKRIVKA',
|
|
11
|
-
dockerContextDir: '',
|
|
12
|
-
contextPaths: [''],
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
actorFullName: 'lukaskrivka/testing-github-integration-2',
|
|
16
|
-
folder: 'actors/lukaskrivka_testing-github-integration-2',
|
|
17
|
-
tokenEnvVar: 'APIFY_TOKEN_LUKASKRIVKA',
|
|
18
|
-
dockerContextDir: '',
|
|
19
|
-
contextPaths: [''],
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
actorFullName: 'lukaskrivka/test-standalone',
|
|
23
|
-
folder: 'standalone-actors/lukaskrivka_test-standalone',
|
|
24
|
-
tokenEnvVar: 'APIFY_TOKEN_LUKASKRIVKA',
|
|
25
|
-
dockerContextDir: 'standalone-actors/lukaskrivka_test-standalone',
|
|
26
|
-
contextPaths: ['standalone-actors/lukaskrivka_test-standalone'],
|
|
27
|
-
},
|
|
35
|
+
actorConfig('lukaskrivka/testing-github-integration-1', 'actors/lukaskrivka_testing-github-integration-1', 'APIFY_TOKEN_LUKASKRIVKA'),
|
|
36
|
+
actorConfig('lukaskrivka/testing-github-integration-2', 'actors/lukaskrivka_testing-github-integration-2', 'APIFY_TOKEN_LUKASKRIVKA'),
|
|
37
|
+
actorConfig('lukaskrivka/test-standalone', 'standalone-actors/lukaskrivka_test-standalone', 'APIFY_TOKEN_LUKASKRIVKA', 'standalone-actors/lukaskrivka_test-standalone'),
|
|
28
38
|
];
|
|
29
39
|
const commits = [
|
|
30
40
|
{ sha: 'Commit1', author: '', date: '', message: '' },
|
|
31
41
|
{ sha: 'Commit3', author: '', date: '', message: '' },
|
|
32
42
|
];
|
|
33
|
-
let isCosmeticOnlyJsonSchemaSpy;
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
// Default: JSON changes are functional (triggers build/test)
|
|
36
|
-
isCosmeticOnlyJsonSchemaSpy = vi
|
|
37
|
-
.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange')
|
|
38
|
-
.mockResolvedValue(false);
|
|
39
|
-
});
|
|
40
43
|
test('Ignores dev-only readme', async () => {
|
|
41
44
|
const FILES = ['README.md', 'code/README.md', 'shared/README.md'];
|
|
42
45
|
const actorsChanged = await getChangedActors({
|
|
@@ -48,7 +51,7 @@ describe('Should build and test parser', () => {
|
|
|
48
51
|
expect(actorsChanged).toEqual([]);
|
|
49
52
|
});
|
|
50
53
|
test('Ignores other ignored files and folders', async () => {
|
|
51
|
-
const FILES = ['.vscode/', '.gitignore', '.husky/', '.eslintrc', '.editorconfig'];
|
|
54
|
+
const FILES = ['.vscode/settings.json', '.gitignore', '.husky/pre-commit', '.eslintrc', '.editorconfig'];
|
|
52
55
|
const actorsChanged = await getChangedActors({
|
|
53
56
|
actorConfigs: ACTOR_CONFIGS,
|
|
54
57
|
isLatest: false,
|
|
@@ -67,8 +70,8 @@ describe('Should build and test parser', () => {
|
|
|
67
70
|
});
|
|
68
71
|
expect(actorsChanged).toEqual(ACTOR_CONFIGS.slice(0, 2));
|
|
69
72
|
});
|
|
70
|
-
test('
|
|
71
|
-
const FILES = ['
|
|
73
|
+
test('Configured changelog is cosmetic for every actor, only on latest', async () => {
|
|
74
|
+
const FILES = ['CHANGELOG.md'];
|
|
72
75
|
const actorsChangedNotLatest = await getChangedActors({
|
|
73
76
|
actorConfigs: ACTOR_CONFIGS,
|
|
74
77
|
isLatest: false,
|
|
@@ -84,7 +87,7 @@ describe('Should build and test parser', () => {
|
|
|
84
87
|
});
|
|
85
88
|
expect(actorsChangedLatest).toEqual(ACTOR_CONFIGS);
|
|
86
89
|
});
|
|
87
|
-
test('A changelog nested inside one actor own folder is excluded for sibling actors
|
|
90
|
+
test('A changelog nested inside one actor own folder is excluded for sibling actors', async () => {
|
|
88
91
|
const FILES = ['actors/lukaskrivka_testing-github-integration-1/CHANGELOG.md'];
|
|
89
92
|
const actorsChanged = await getChangedActors({
|
|
90
93
|
actorConfigs: ACTOR_CONFIGS,
|
|
@@ -109,7 +112,6 @@ describe('Should build and test parser', () => {
|
|
|
109
112
|
'actors/lukaskrivka_testing-github-integration-1/.actor/actor.json',
|
|
110
113
|
'standalone-actors/lukaskrivka_test-standalone/Dockerfile',
|
|
111
114
|
];
|
|
112
|
-
// Default mock returns false = functional change
|
|
113
115
|
const actorsChanged = await getChangedActors({
|
|
114
116
|
actorConfigs: ACTOR_CONFIGS,
|
|
115
117
|
isLatest: false,
|
|
@@ -134,7 +136,6 @@ describe('Should build and test parser', () => {
|
|
|
134
136
|
'code/src/main.ts',
|
|
135
137
|
'standalone-actors/lukaskrivka_test-standalone/Dockerfile',
|
|
136
138
|
];
|
|
137
|
-
// Default mock returns false = functional change for the JSON file
|
|
138
139
|
const actorsChanged = await getChangedActors({
|
|
139
140
|
actorConfigs: ACTOR_CONFIGS,
|
|
140
141
|
isLatest: false,
|
|
@@ -145,8 +146,8 @@ describe('Should build and test parser', () => {
|
|
|
145
146
|
});
|
|
146
147
|
test('Specific Actor non-functional configs updated', async () => {
|
|
147
148
|
const FILES = [
|
|
148
|
-
'actors/lukaskrivka_testing-github-integration-2
|
|
149
|
-
'standalone-actors/lukaskrivka_test-standalone/
|
|
149
|
+
'actors/lukaskrivka_testing-github-integration-2/README.md',
|
|
150
|
+
'standalone-actors/lukaskrivka_test-standalone/README.md',
|
|
150
151
|
];
|
|
151
152
|
const actorsChanged = await getChangedActors({
|
|
152
153
|
actorConfigs: ACTOR_CONFIGS,
|
|
@@ -156,20 +157,18 @@ describe('Should build and test parser', () => {
|
|
|
156
157
|
});
|
|
157
158
|
expect(actorsChanged).toEqual([]);
|
|
158
159
|
});
|
|
159
|
-
test('JSON
|
|
160
|
+
test('Actor JSON changes in PR context trigger tests', async () => {
|
|
160
161
|
const FILES = ['actors/lukaskrivka_testing-github-integration-1/.actor/actor.json'];
|
|
161
|
-
isCosmeticOnlyJsonSchemaSpy.mockResolvedValue(true);
|
|
162
162
|
const actorsChanged = await getChangedActors({
|
|
163
163
|
actorConfigs: ACTOR_CONFIGS,
|
|
164
164
|
isLatest: false,
|
|
165
165
|
filepathsChanged: FILES,
|
|
166
166
|
commits,
|
|
167
167
|
});
|
|
168
|
-
expect(actorsChanged).toEqual([]);
|
|
168
|
+
expect(actorsChanged).toEqual([ACTOR_CONFIGS[0]]);
|
|
169
169
|
});
|
|
170
|
-
test('JSON
|
|
170
|
+
test('Actor JSON changes in latest context trigger builds', async () => {
|
|
171
171
|
const FILES = ['actors/lukaskrivka_testing-github-integration-1/.actor/actor.json'];
|
|
172
|
-
isCosmeticOnlyJsonSchemaSpy.mockResolvedValue(true);
|
|
173
172
|
const actorsChanged = await getChangedActors({
|
|
174
173
|
actorConfigs: ACTOR_CONFIGS,
|
|
175
174
|
isLatest: true,
|
|
@@ -180,7 +179,6 @@ describe('Should build and test parser', () => {
|
|
|
180
179
|
});
|
|
181
180
|
test('JSON file with functional changes triggers tests', async () => {
|
|
182
181
|
const FILES = ['actors/lukaskrivka_testing-github-integration-1/.actor/actor.json'];
|
|
183
|
-
// Default mock returns false = functional change
|
|
184
182
|
const actorsChanged = await getChangedActors({
|
|
185
183
|
actorConfigs: ACTOR_CONFIGS,
|
|
186
184
|
isLatest: false,
|
|
@@ -189,32 +187,28 @@ describe('Should build and test parser', () => {
|
|
|
189
187
|
});
|
|
190
188
|
expect(actorsChanged).toEqual([ACTOR_CONFIGS[0]]);
|
|
191
189
|
});
|
|
192
|
-
test('
|
|
190
|
+
test('JSON changes in two actor folders trigger both actors', async () => {
|
|
193
191
|
const FILES = [
|
|
194
192
|
'actors/lukaskrivka_testing-github-integration-1/.actor/actor.json',
|
|
195
193
|
'actors/lukaskrivka_testing-github-integration-2/.actor/input_schema.json',
|
|
196
194
|
];
|
|
197
|
-
// Actor 1 JSON is cosmetic-only, actor 2 JSON is functional
|
|
198
|
-
isCosmeticOnlyJsonSchemaSpy.mockImplementation(async (_commits, filepath) => !filepath.includes('input_schema.json'));
|
|
199
195
|
const actorsChanged = await getChangedActors({
|
|
200
196
|
actorConfigs: ACTOR_CONFIGS,
|
|
201
197
|
isLatest: false,
|
|
202
198
|
filepathsChanged: FILES,
|
|
203
199
|
commits,
|
|
204
200
|
});
|
|
205
|
-
|
|
206
|
-
expect(actorsChanged).toEqual([ACTOR_CONFIGS[1]]);
|
|
201
|
+
expect(actorsChanged).toEqual(ACTOR_CONFIGS.slice(0, 2));
|
|
207
202
|
});
|
|
208
|
-
test('Narrow-context actor
|
|
203
|
+
test('Narrow-context actor JSON change in PR context triggers tests', async () => {
|
|
209
204
|
const FILES = ['standalone-actors/lukaskrivka_test-standalone/.actor/actor.json'];
|
|
210
|
-
isCosmeticOnlyJsonSchemaSpy.mockResolvedValue(true);
|
|
211
205
|
const actorsChanged = await getChangedActors({
|
|
212
206
|
actorConfigs: ACTOR_CONFIGS,
|
|
213
207
|
isLatest: false,
|
|
214
208
|
filepathsChanged: FILES,
|
|
215
209
|
commits,
|
|
216
210
|
});
|
|
217
|
-
expect(actorsChanged).toEqual([]);
|
|
211
|
+
expect(actorsChanged).toEqual([ACTOR_CONFIGS[2]]);
|
|
218
212
|
});
|
|
219
213
|
test('Google Maps real user-case that had undefined', async () => {
|
|
220
214
|
const FILES = [
|
|
@@ -232,70 +226,15 @@ describe('Should build and test parser', () => {
|
|
|
232
226
|
'code/src/utils/background-enqueue.ts',
|
|
233
227
|
];
|
|
234
228
|
const ACTOR_CONFIGS_GOOGLE_MAPS = [
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
actorFullName: 'compass/crawler-google-places',
|
|
245
|
-
folder: 'actors/compass_crawler-google-places',
|
|
246
|
-
tokenEnvVar: 'APIFY_TOKEN_COMPASS',
|
|
247
|
-
dockerContextDir: '',
|
|
248
|
-
contextPaths: [''],
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
actorFullName: 'compass/easy-google-maps',
|
|
252
|
-
folder: 'actors/compass_easy-google-maps',
|
|
253
|
-
tokenEnvVar: 'APIFY_TOKEN_COMPASS',
|
|
254
|
-
dockerContextDir: '',
|
|
255
|
-
contextPaths: [''],
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
actorFullName: 'compass/google-maps-extractor',
|
|
259
|
-
folder: 'actors/compass_google-maps-extractor',
|
|
260
|
-
tokenEnvVar: 'APIFY_TOKEN_COMPASS',
|
|
261
|
-
dockerContextDir: '',
|
|
262
|
-
contextPaths: [''],
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
actorFullName: 'compass/google-places-api',
|
|
266
|
-
folder: 'actors/compass_google-places-api',
|
|
267
|
-
tokenEnvVar: 'APIFY_TOKEN_COMPASS',
|
|
268
|
-
dockerContextDir: '',
|
|
269
|
-
contextPaths: [''],
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
actorFullName: 'lukaskrivka/google-maps-with-contact-details',
|
|
273
|
-
folder: 'actors/lukaskrivka_google-maps-with-contact-details',
|
|
274
|
-
tokenEnvVar: 'APIFY_TOKEN_LUKASKRIVKA',
|
|
275
|
-
dockerContextDir: '',
|
|
276
|
-
contextPaths: [''],
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
actorFullName: 'natasha.lekh/gas-prices-scraper',
|
|
280
|
-
folder: 'actors/natasha.lekh_gas-prices-scraper',
|
|
281
|
-
tokenEnvVar: 'APIFY_TOKEN_NATASHA_LEKH',
|
|
282
|
-
dockerContextDir: '',
|
|
283
|
-
contextPaths: [''],
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
actorFullName: 'natasha.lekh/vegan-places-finder',
|
|
287
|
-
folder: 'actors/natasha.lekh_vegan-places-finder',
|
|
288
|
-
tokenEnvVar: 'APIFY_TOKEN_NATASHA_LEKH',
|
|
289
|
-
dockerContextDir: '',
|
|
290
|
-
contextPaths: [''],
|
|
291
|
-
},
|
|
292
|
-
{
|
|
293
|
-
actorFullName: 'lukaskrivka/google-maps-scraper-orchestrator',
|
|
294
|
-
folder: 'standalone-actors/lukaskrivka_google-maps-scraper-orchestrator',
|
|
295
|
-
tokenEnvVar: 'APIFY_TOKEN_LUKASKRIVKA',
|
|
296
|
-
dockerContextDir: 'standalone-actors/lukaskrivka_google-maps-scraper-orchestrator',
|
|
297
|
-
contextPaths: ['standalone-actors/lukaskrivka_google-maps-scraper-orchestrator'],
|
|
298
|
-
},
|
|
229
|
+
actorConfig('compass/Google-Maps-Reviews-Scraper', 'actors/compass_Google-Maps-Reviews-Scraper', 'APIFY_TOKEN_COMPASS'),
|
|
230
|
+
actorConfig('compass/crawler-google-places', 'actors/compass_crawler-google-places', 'APIFY_TOKEN_COMPASS'),
|
|
231
|
+
actorConfig('compass/easy-google-maps', 'actors/compass_easy-google-maps', 'APIFY_TOKEN_COMPASS'),
|
|
232
|
+
actorConfig('compass/google-maps-extractor', 'actors/compass_google-maps-extractor', 'APIFY_TOKEN_COMPASS'),
|
|
233
|
+
actorConfig('compass/google-places-api', 'actors/compass_google-places-api', 'APIFY_TOKEN_COMPASS'),
|
|
234
|
+
actorConfig('lukaskrivka/google-maps-with-contact-details', 'actors/lukaskrivka_google-maps-with-contact-details', 'APIFY_TOKEN_LUKASKRIVKA'),
|
|
235
|
+
actorConfig('natasha.lekh/gas-prices-scraper', 'actors/natasha.lekh_gas-prices-scraper', 'APIFY_TOKEN_NATASHA_LEKH'),
|
|
236
|
+
actorConfig('natasha.lekh/vegan-places-finder', 'actors/natasha.lekh_vegan-places-finder', 'APIFY_TOKEN_NATASHA_LEKH'),
|
|
237
|
+
actorConfig('lukaskrivka/google-maps-scraper-orchestrator', 'standalone-actors/lukaskrivka_google-maps-scraper-orchestrator', 'APIFY_TOKEN_LUKASKRIVKA', 'standalone-actors/lukaskrivka_google-maps-scraper-orchestrator'),
|
|
299
238
|
];
|
|
300
239
|
const actorsChanged = await getChangedActors({
|
|
301
240
|
actorConfigs: ACTOR_CONFIGS_GOOGLE_MAPS,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"should-built-and-test.test.js","sourceRoot":"","sources":["../../../test/unit/should-built-and-test.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"should-built-and-test.test.js","sourceRoot":"","sources":["../../../test/unit/should-built-and-test.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAE7G,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAClC,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAClF,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAE3B,QAAQ,CAAC,GAAG,EAAE;IACV,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3B,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAChB,aAAqB,EACrB,MAAc,EACd,WAAmB,EACnB,gBAAgB,GAAG,GAAG,EACX,EAAE;IACb,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACnE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,gBAAgB,CAAC,CAAC;IACtD,OAAO;QACH,aAAa;QACb,MAAM,EAAE,IAAI,WAAW,CAAC,MAAM,CAAC;QAC/B,WAAW;QACX,SAAS,EAAE;YACP,IAAI,EAAE,IAAI,YAAY,CAAC,aAAa,CAAC;YACrC,gBAAgB,EAAE,WAAW;YAC7B,SAAS,EAAE,IAAI,YAAY,CAAC,cAAc,CAAC;SAC9C;QACD,gBAAgB,EAAE,WAAW;QAC7B,YAAY,EAAE,CAAC,WAAW,CAAC;KAC9B,CAAC;AACN,CAAC,CAAC;AAEF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC1C,sEAAsE;IACtE,MAAM,aAAa,GAAkB;QACjC,WAAW,CACP,0CAA0C,EAC1C,iDAAiD,EACjD,yBAAyB,CAC5B;QACD,WAAW,CACP,0CAA0C,EAC1C,iDAAiD,EACjD,yBAAyB,CAC5B;QACD,WAAW,CACP,6BAA6B,EAC7B,+CAA+C,EAC/C,yBAAyB,EACzB,+CAA+C,CAClD;KACJ,CAAC;IAEF,MAAM,OAAO,GAAa;QACtB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACrD,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;KACxD,CAAC;IAEF,IAAI,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QAElE,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,KAAK,GAAG,CAAC,uBAAuB,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QAEzG,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,KAAK,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAEpC,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,CAAC;QAE/B,MAAM,sBAAsB,GAAG,MAAM,gBAAgB,CAAC;YAClD,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QACH,MAAM,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE3C,MAAM,mBAAmB,GAAG,MAAM,gBAAgB,CAAC;YAC/C,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QACH,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,KAAK,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAE/E,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,KAAK,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;QAEnD,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,KAAK,GAAG;YACV,mEAAmE;YACnE,0DAA0D;SAC7D,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;QAE9B,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,KAAK,GAAG;YACV,mEAAmE;YACnE,kBAAkB;YAClB,0DAA0D;SAC7D,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,KAAK,GAAG;YACV,2DAA2D;YAC3D,yDAAyD;SAC5D,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,KAAK,GAAG,CAAC,mEAAmE,CAAC,CAAC;QAEpF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,KAAK,GAAG,CAAC,mEAAmE,CAAC,CAAC;QAEpF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,KAAK,GAAG,CAAC,mEAAmE,CAAC,CAAC;QAEpF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,KAAK,GAAG;YACV,mEAAmE;YACnE,0EAA0E;SAC7E,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,KAAK,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAElF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,aAAa;YAC3B,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,KAAK,GAAG;YACV,qEAAqE;YACrE,+DAA+D;YAC/D,oBAAoB;YACpB,qCAAqC;YACrC,gCAAgC;YAChC,4BAA4B;YAC5B,2CAA2C;YAC3C,kCAAkC;YAClC,iDAAiD;YACjD,kBAAkB;YAClB,8BAA8B;YAC9B,sCAAsC;SACzC,CAAC;QAEF,MAAM,yBAAyB,GAAkB;YAC7C,WAAW,CACP,qCAAqC,EACrC,4CAA4C,EAC5C,qBAAqB,CACxB;YACD,WAAW,CAAC,+BAA+B,EAAE,sCAAsC,EAAE,qBAAqB,CAAC;YAC3G,WAAW,CAAC,0BAA0B,EAAE,iCAAiC,EAAE,qBAAqB,CAAC;YACjG,WAAW,CAAC,+BAA+B,EAAE,sCAAsC,EAAE,qBAAqB,CAAC;YAC3G,WAAW,CAAC,2BAA2B,EAAE,kCAAkC,EAAE,qBAAqB,CAAC;YACnG,WAAW,CACP,8CAA8C,EAC9C,qDAAqD,EACrD,yBAAyB,CAC5B;YACD,WAAW,CACP,iCAAiC,EACjC,wCAAwC,EACxC,0BAA0B,CAC7B;YACD,WAAW,CACP,kCAAkC,EAClC,yCAAyC,EACzC,0BAA0B,CAC7B;YACD,WAAW,CACP,8CAA8C,EAC9C,gEAAgE,EAChE,yBAAyB,EACzB,gEAAgE,CACnE;SACJ,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC;YACzC,YAAY,EAAE,yBAAyB;YACvC,QAAQ,EAAE,KAAK;YACf,gBAAgB,EAAE,KAAK;YACvB,OAAO;SACV,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|