cursortoys-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +233 -0
- package/dist/assertionParser.d.ts +24 -0
- package/dist/assertionParser.d.ts.map +1 -0
- package/dist/assertionParser.js +234 -0
- package/dist/assertionParser.js.map +1 -0
- package/dist/assertionTypes.d.ts +36 -0
- package/dist/assertionTypes.d.ts.map +1 -0
- package/dist/assertionTypes.js +6 -0
- package/dist/assertionTypes.js.map +1 -0
- package/dist/assertionValidator.d.ts +16 -0
- package/dist/assertionValidator.d.ts.map +1 -0
- package/dist/assertionValidator.js +268 -0
- package/dist/assertionValidator.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +270 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/http-test.d.ts +34 -0
- package/dist/commands/http-test.d.ts.map +1 -0
- package/dist/commands/http-test.js +339 -0
- package/dist/commands/http-test.js.map +1 -0
- package/dist/commands/skill-add.d.ts +28 -0
- package/dist/commands/skill-add.d.ts.map +1 -0
- package/dist/commands/skill-add.js +145 -0
- package/dist/commands/skill-add.js.map +1 -0
- package/dist/httpRunner.d.ts +63 -0
- package/dist/httpRunner.d.ts.map +1 -0
- package/dist/httpRunner.js +576 -0
- package/dist/httpRunner.js.map +1 -0
- package/llms.txt +197 -0
- package/package.json +62 -0
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseHttpRequest = parseHttpRequest;
|
|
37
|
+
exports.parseBlockAll = parseBlockAll;
|
|
38
|
+
exports.parseHttpRequestAll = parseHttpRequestAll;
|
|
39
|
+
exports.loadEnvFile = loadEnvFile;
|
|
40
|
+
exports.extractFileVariables = extractFileVariables;
|
|
41
|
+
exports.extractBlockVariables = extractBlockVariables;
|
|
42
|
+
exports.getEnvNameFromContent = getEnvNameFromContent;
|
|
43
|
+
exports.substituteVariables = substituteVariables;
|
|
44
|
+
exports.applyVariableOverrides = applyVariableOverrides;
|
|
45
|
+
exports.executeHttpRequest = executeHttpRequest;
|
|
46
|
+
const child_process = __importStar(require("child_process"));
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
/**
|
|
49
|
+
* Parses REST Client format (first request only).
|
|
50
|
+
* Stops at: ###, /*, ##, or next HTTP method line.
|
|
51
|
+
* Matches logic from CursorToys extension httpRequestExecutor.
|
|
52
|
+
*/
|
|
53
|
+
function parseRestClientFormat(content) {
|
|
54
|
+
const trimmed = content.trim();
|
|
55
|
+
// Split by ### first
|
|
56
|
+
const beforeSeparator = trimmed.split('###')[0].trim();
|
|
57
|
+
if (!beforeSeparator)
|
|
58
|
+
return null;
|
|
59
|
+
// Find where the request ends (stop at /*, ##, or next HTTP method)
|
|
60
|
+
const allLines = beforeSeparator.split('\n');
|
|
61
|
+
let requestEndIndex = allLines.length;
|
|
62
|
+
let foundFirstMethod = false;
|
|
63
|
+
for (let i = 0; i < allLines.length; i++) {
|
|
64
|
+
const line = allLines[i].trim();
|
|
65
|
+
// Skip comments and variable declarations
|
|
66
|
+
if (line.startsWith('#')) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
// Check if this is an HTTP method line
|
|
70
|
+
const isHttpMethod = /^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+/i.test(line);
|
|
71
|
+
if (isHttpMethod) {
|
|
72
|
+
if (foundFirstMethod) {
|
|
73
|
+
// Found a second HTTP method, stop here
|
|
74
|
+
requestEndIndex = i;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
foundFirstMethod = true;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Stop at assertion comments or ## headers (after finding first method)
|
|
81
|
+
if (foundFirstMethod) {
|
|
82
|
+
if (line.startsWith('/*') || line.startsWith('##')) {
|
|
83
|
+
requestEndIndex = i;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Extract only the lines for this request
|
|
89
|
+
const requestLines = allLines.slice(0, requestEndIndex);
|
|
90
|
+
const firstRequest = requestLines.join('\n').trim();
|
|
91
|
+
if (!firstRequest)
|
|
92
|
+
return null;
|
|
93
|
+
const rawLines = firstRequest.split('\n');
|
|
94
|
+
const lines = rawLines.map((line) => line.trim());
|
|
95
|
+
let methodLineIndex = -1;
|
|
96
|
+
let method = null;
|
|
97
|
+
let url = null;
|
|
98
|
+
for (let i = 0; i < lines.length; i++) {
|
|
99
|
+
const line = lines[i];
|
|
100
|
+
if (line && !line.startsWith('#')) {
|
|
101
|
+
const methodUrlMatch = line.match(/^(\w+)\s+(.+)$/);
|
|
102
|
+
if (methodUrlMatch) {
|
|
103
|
+
const potentialMethod = methodUrlMatch[1].toUpperCase();
|
|
104
|
+
const potentialUrl = methodUrlMatch[2].trim().replace(/^["']|["']$/g, '');
|
|
105
|
+
if (['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'].includes(potentialMethod) &&
|
|
106
|
+
(potentialUrl.match(/^https?:\/\//i) || potentialUrl.match(/\{\{/))) {
|
|
107
|
+
methodLineIndex = i;
|
|
108
|
+
method = potentialMethod;
|
|
109
|
+
url = potentialUrl;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (!method || !url || methodLineIndex === -1)
|
|
116
|
+
return null;
|
|
117
|
+
const headers = {};
|
|
118
|
+
let bodyStartIndex = -1;
|
|
119
|
+
for (let i = methodLineIndex + 1; i < lines.length; i++) {
|
|
120
|
+
const line = lines[i];
|
|
121
|
+
if (line === '') {
|
|
122
|
+
bodyStartIndex = i + 1;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
const colonIndex = line.indexOf(':');
|
|
126
|
+
if (colonIndex > 0) {
|
|
127
|
+
const headerKey = line.substring(0, colonIndex).trim();
|
|
128
|
+
const headerValue = line.substring(colonIndex + 1).trim();
|
|
129
|
+
if (headerKey && headerValue)
|
|
130
|
+
headers[headerKey] = headerValue;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
if (!line.match(/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+https?:\/\/.+$/i)) {
|
|
134
|
+
bodyStartIndex = i;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
let body;
|
|
140
|
+
if (bodyStartIndex >= 0 && bodyStartIndex < rawLines.length) {
|
|
141
|
+
const bodyLines = rawLines.slice(bodyStartIndex);
|
|
142
|
+
body = bodyLines.join('\n').trim();
|
|
143
|
+
if (body === '')
|
|
144
|
+
body = undefined;
|
|
145
|
+
}
|
|
146
|
+
return { method, url, headers, body };
|
|
147
|
+
}
|
|
148
|
+
function isRestClientFormat(content) {
|
|
149
|
+
const trimmed = content.trim();
|
|
150
|
+
for (const line of trimmed.split('\n')) {
|
|
151
|
+
const t = line.trim();
|
|
152
|
+
if (t && !t.startsWith('#')) {
|
|
153
|
+
if (t.match(/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+(https?:\/\/|\{\{).+$/i))
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Extracts the first curl command from a block (stops at ##, ###, or next curl at line start).
|
|
161
|
+
*/
|
|
162
|
+
function extractFirstCurlCommand(block) {
|
|
163
|
+
const all = extractAllCurlCommands(block);
|
|
164
|
+
return all.length > 0 ? all[0] : null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Extracts all curl commands from a block (each stops at ##, ###, or next curl at line start).
|
|
168
|
+
*/
|
|
169
|
+
function extractAllCurlCommands(block) {
|
|
170
|
+
const lines = block.split(/\r?\n/);
|
|
171
|
+
const commands = [];
|
|
172
|
+
let i = 0;
|
|
173
|
+
while (i < lines.length) {
|
|
174
|
+
const trimmed = lines[i].trim();
|
|
175
|
+
if (!trimmed || trimmed.startsWith('#')) {
|
|
176
|
+
i++;
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (trimmed.toLowerCase().startsWith('curl')) {
|
|
180
|
+
const parts = [];
|
|
181
|
+
while (i < lines.length) {
|
|
182
|
+
const t = lines[i].trim();
|
|
183
|
+
if (parts.length > 0 && (t.startsWith('##') || t.startsWith('###') || t.toLowerCase().startsWith('curl')))
|
|
184
|
+
break;
|
|
185
|
+
if (t && !t.startsWith('#')) {
|
|
186
|
+
parts.push(t.replace(/\\\s*$/, '').trim());
|
|
187
|
+
}
|
|
188
|
+
i++;
|
|
189
|
+
}
|
|
190
|
+
const joined = parts.join(' ').trim();
|
|
191
|
+
if (joined)
|
|
192
|
+
commands.push(joined);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
i++;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return commands;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Parses a curl command string (supports --request, --url, --header, -H, -d, --data).
|
|
202
|
+
* URL may be https?:// or {{VAR}} after substitution.
|
|
203
|
+
*/
|
|
204
|
+
function parseCurlCommand(curlCommand) {
|
|
205
|
+
let command = curlCommand.trim();
|
|
206
|
+
if (command.toLowerCase().startsWith('curl')) {
|
|
207
|
+
command = command.substring(4).trim();
|
|
208
|
+
}
|
|
209
|
+
command = command.replace(/\s+/g, ' ').trim();
|
|
210
|
+
let url = null;
|
|
211
|
+
const urlWithQuotes = command.match(/(?:--url|-u)\s+(['"])([^'"]+)\1/i);
|
|
212
|
+
if (urlWithQuotes) {
|
|
213
|
+
url = urlWithQuotes[2].trim();
|
|
214
|
+
}
|
|
215
|
+
if (!url) {
|
|
216
|
+
const urlUnquoted = command.match(/(?:--url|-u)\s+([^\s]+)/i);
|
|
217
|
+
if (urlUnquoted)
|
|
218
|
+
url = urlUnquoted[1].trim();
|
|
219
|
+
}
|
|
220
|
+
if (!url) {
|
|
221
|
+
const urlPatterns = [
|
|
222
|
+
/['"]?(https?:\/\/[^'"\s]+)['"]?/i,
|
|
223
|
+
/['"]?(\{\{[^}]+\}\}[^'"\s]*)['"]?/,
|
|
224
|
+
];
|
|
225
|
+
for (const p of urlPatterns) {
|
|
226
|
+
const m = command.match(p);
|
|
227
|
+
if (m) {
|
|
228
|
+
url = m[1].replace(/^['"]|['"]$/g, '');
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (!url)
|
|
234
|
+
return null;
|
|
235
|
+
let method = 'GET';
|
|
236
|
+
const methodMatch = command.match(/(?:-X|--request)\s+(\w+)/i);
|
|
237
|
+
if (methodMatch)
|
|
238
|
+
method = methodMatch[1].toUpperCase();
|
|
239
|
+
const headers = {};
|
|
240
|
+
const headerRegex = /(?:-H|--header)\s+(["'])((?:(?:\\.|(?!\1)[^\\])*))\1/gi;
|
|
241
|
+
let headerMatch;
|
|
242
|
+
while ((headerMatch = headerRegex.exec(command)) !== null) {
|
|
243
|
+
const headerLine = headerMatch[2];
|
|
244
|
+
const colonIndex = headerLine.indexOf(':');
|
|
245
|
+
if (colonIndex > 0) {
|
|
246
|
+
const key = headerLine.substring(0, colonIndex).trim();
|
|
247
|
+
const value = headerLine.substring(colonIndex + 1).trim();
|
|
248
|
+
headers[key] = value;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
let body;
|
|
252
|
+
const bodyPatterns = [
|
|
253
|
+
/(?:--data-raw|--data-binary)\s+(["'])((?:(?:\\.|(?!\1)[^\\])*))\1/i,
|
|
254
|
+
/(?:-d|--data)\s+(["'])((?:(?:\\.|(?!\1)[^\\])*))\1/i,
|
|
255
|
+
/(?:--data-raw|--data-binary)\s+([^\s]+)/i,
|
|
256
|
+
/(?:-d|--data)\s+([^\s]+)/i,
|
|
257
|
+
];
|
|
258
|
+
for (const pattern of bodyPatterns) {
|
|
259
|
+
const bodyMatch = command.match(pattern);
|
|
260
|
+
if (bodyMatch) {
|
|
261
|
+
body = (bodyMatch[2] || bodyMatch[1]).trim();
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return { method, url, headers, body };
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Parses HTTP request content (REST Client or curl format). Returns the first request only.
|
|
269
|
+
*/
|
|
270
|
+
function parseHttpRequest(content) {
|
|
271
|
+
const all = parseHttpRequestAll(content);
|
|
272
|
+
return all.length > 0 ? all[0] : null;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Parses all HTTP requests in a single block (REST: one request; curl: all curl commands in block).
|
|
276
|
+
*/
|
|
277
|
+
function parseBlockAll(block) {
|
|
278
|
+
const trimmed = block.trim();
|
|
279
|
+
if (!trimmed)
|
|
280
|
+
return [];
|
|
281
|
+
if (isRestClientFormat(trimmed)) {
|
|
282
|
+
const one = parseRestClientFormat(trimmed);
|
|
283
|
+
return one ? [one] : [];
|
|
284
|
+
}
|
|
285
|
+
const curlCommands = extractAllCurlCommands(trimmed);
|
|
286
|
+
return curlCommands
|
|
287
|
+
.map((cmd) => parseCurlCommand(cmd))
|
|
288
|
+
.filter((c) => c !== null);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Parses all HTTP requests in content (REST Client: split by ###; curl: all curl commands in every block).
|
|
292
|
+
*/
|
|
293
|
+
function parseHttpRequestAll(content) {
|
|
294
|
+
const trimmed = content.trim();
|
|
295
|
+
const blocks = trimmed.split('###').map((b) => b.trim()).filter(Boolean);
|
|
296
|
+
const configs = [];
|
|
297
|
+
for (const block of blocks) {
|
|
298
|
+
configs.push(...parseBlockAll(block));
|
|
299
|
+
}
|
|
300
|
+
return configs;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Loads variables from a .env file (KEY=VALUE, same format as extension).
|
|
304
|
+
*/
|
|
305
|
+
function loadEnvFile(envPath) {
|
|
306
|
+
const variables = new Map();
|
|
307
|
+
if (!fs.existsSync(envPath))
|
|
308
|
+
return variables;
|
|
309
|
+
try {
|
|
310
|
+
const content = fs.readFileSync(envPath, 'utf8');
|
|
311
|
+
for (const line of content.split('\n')) {
|
|
312
|
+
const trimmed = line.trim();
|
|
313
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
314
|
+
continue;
|
|
315
|
+
const sep = trimmed.indexOf('=');
|
|
316
|
+
if (sep === -1)
|
|
317
|
+
continue;
|
|
318
|
+
const key = trimmed.substring(0, sep).trim();
|
|
319
|
+
let value = trimmed.substring(sep + 1).trim();
|
|
320
|
+
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'")))
|
|
321
|
+
value = value.slice(1, -1);
|
|
322
|
+
if (key)
|
|
323
|
+
variables.set(key.toLowerCase(), value);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
// ignore
|
|
328
|
+
}
|
|
329
|
+
return variables;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Processes helper functions like {{@randomIn(1,10)}}, {{@randomString(10)}}, {{@lorem(20)}}
|
|
333
|
+
*/
|
|
334
|
+
function processHelperFunctions(text) {
|
|
335
|
+
// {{@randomIn(min, max)}} - random integer between min and max (inclusive)
|
|
336
|
+
text = text.replace(/\{\{\s*@randomIn\s*\(\s*(\d+)\s*,\s*(\d+)\s*\)\s*\}\}/g, (match, min, max) => {
|
|
337
|
+
const minNum = parseInt(min, 10);
|
|
338
|
+
const maxNum = parseInt(max, 10);
|
|
339
|
+
return String(Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);
|
|
340
|
+
});
|
|
341
|
+
// {{@randomString(length)}} - random alphanumeric string
|
|
342
|
+
text = text.replace(/\{\{\s*@randomString\s*\(\s*(\d+)\s*\)\s*\}\}/g, (match, length) => {
|
|
343
|
+
const len = parseInt(length, 10);
|
|
344
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
345
|
+
let result = '';
|
|
346
|
+
for (let i = 0; i < len; i++) {
|
|
347
|
+
result += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
348
|
+
}
|
|
349
|
+
return result;
|
|
350
|
+
});
|
|
351
|
+
// {{@randomFrom("opt1", "opt2", "opt3")}} - random choice from options
|
|
352
|
+
text = text.replace(/\{\{\s*@randomFrom\s*\(\s*([^)]+)\s*\)\s*\}\}/g, (match, optionsStr) => {
|
|
353
|
+
// Parse comma-separated quoted strings
|
|
354
|
+
const options = optionsStr.match(/"([^"]*)"/g);
|
|
355
|
+
if (options && options.length > 0) {
|
|
356
|
+
const cleanOptions = options.map((opt) => opt.slice(1, -1)); // Remove quotes
|
|
357
|
+
const randomIndex = Math.floor(Math.random() * cleanOptions.length);
|
|
358
|
+
return cleanOptions[randomIndex];
|
|
359
|
+
}
|
|
360
|
+
return match; // If parsing fails, return original
|
|
361
|
+
});
|
|
362
|
+
// {{@lorem(words)}} - lorem ipsum text with N words
|
|
363
|
+
text = text.replace(/\{\{\s*@lorem\s*\(\s*(\d+)\s*\)\s*\}\}/g, (match, words) => {
|
|
364
|
+
const loremWords = [
|
|
365
|
+
'lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit',
|
|
366
|
+
'sed', 'do', 'eiusmod', 'tempor', 'incididunt', 'ut', 'labore', 'et', 'dolore',
|
|
367
|
+
'magna', 'aliqua', 'enim', 'ad', 'minim', 'veniam', 'quis', 'nostrud', 'exercitation',
|
|
368
|
+
'ullamco', 'laboris', 'nisi', 'aliquip', 'ex', 'ea', 'commodo', 'consequat'
|
|
369
|
+
];
|
|
370
|
+
const count = parseInt(words, 10);
|
|
371
|
+
const result = [];
|
|
372
|
+
for (let i = 0; i < count; i++) {
|
|
373
|
+
result.push(loremWords[i % loremWords.length]);
|
|
374
|
+
}
|
|
375
|
+
return result.join(' ');
|
|
376
|
+
});
|
|
377
|
+
// {{@uuid()}} or {{@uuid}} - random UUID v4
|
|
378
|
+
text = text.replace(/\{\{\s*@uuid\s*(?:\(\s*\))?\s*\}\}/g, () => {
|
|
379
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
380
|
+
const r = Math.random() * 16 | 0;
|
|
381
|
+
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
382
|
+
return v.toString(16);
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
// {{@timestamp()}} or {{@timestamp}} - current Unix timestamp
|
|
386
|
+
text = text.replace(/\{\{\s*@timestamp\s*(?:\(\s*\))?\s*\}\}/g, () => {
|
|
387
|
+
return String(Math.floor(Date.now() / 1000));
|
|
388
|
+
});
|
|
389
|
+
// {{@datetime()}} or {{@datetime}} or {{@datetime("ISO")}} - current datetime
|
|
390
|
+
text = text.replace(/\{\{\s*@datetime\s*(?:\(\s*(?:"[^"]*")?\s*\))?\s*\}\}/g, () => {
|
|
391
|
+
return new Date().toISOString();
|
|
392
|
+
});
|
|
393
|
+
return text;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Replaces {{VAR_NAME}} in text. Values map: key can be original or lowercase.
|
|
397
|
+
*/
|
|
398
|
+
function replaceVariables(text, values, caseInsensitive) {
|
|
399
|
+
// First, process helper functions (they start with @)
|
|
400
|
+
text = processHelperFunctions(text);
|
|
401
|
+
// Then process regular variables
|
|
402
|
+
const variableRegex = /\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\}\}/g;
|
|
403
|
+
return text.replace(variableRegex, (match, varName) => {
|
|
404
|
+
let value = values.get(varName);
|
|
405
|
+
if (value === undefined && caseInsensitive)
|
|
406
|
+
value = values.get(varName.toLowerCase());
|
|
407
|
+
return value !== undefined ? value : match;
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Extracts file-level # @var VAR=value (or VAR value) from content (global, before first ### separator).
|
|
412
|
+
* Note: ### with text (decorative) is ignored. Only ### alone on a line is treated as separator.
|
|
413
|
+
*/
|
|
414
|
+
function extractFileVariables(content) {
|
|
415
|
+
const variables = new Map();
|
|
416
|
+
// Find the first real ### separator (### alone on a line)
|
|
417
|
+
const lines = content.trim().split('\n');
|
|
418
|
+
let endIndex = lines.length;
|
|
419
|
+
for (let i = 0; i < lines.length; i++) {
|
|
420
|
+
if (lines[i].trim() === '###') {
|
|
421
|
+
endIndex = i;
|
|
422
|
+
break;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// Extract variables from lines before the first real separator
|
|
426
|
+
for (let i = 0; i < endIndex; i++) {
|
|
427
|
+
const t = lines[i].trim();
|
|
428
|
+
const match = t.match(/^#\s*@var\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*(?:=\s*)?(.+)?$/i);
|
|
429
|
+
if (match) {
|
|
430
|
+
const varName = match[1];
|
|
431
|
+
const value = (match[2] || '').trim().replace(/^["']|["']$/g, '');
|
|
432
|
+
variables.set(varName, value);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
return variables;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Extracts block-level # @var variables from a specific block content.
|
|
439
|
+
* Used for variables defined after ### separators (cascade effect).
|
|
440
|
+
*/
|
|
441
|
+
function extractBlockVariables(blockContent) {
|
|
442
|
+
const variables = new Map();
|
|
443
|
+
for (const line of blockContent.split('\n')) {
|
|
444
|
+
const t = line.trim();
|
|
445
|
+
const match = t.match(/^#\s*@var\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*(?:=\s*)?(.+)?$/i);
|
|
446
|
+
if (match) {
|
|
447
|
+
const varName = match[1];
|
|
448
|
+
const value = (match[2] || '').trim().replace(/^["']|["']$/g, '');
|
|
449
|
+
variables.set(varName, value);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return variables;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Finds # @env name in content (global: before first ## or ###).
|
|
456
|
+
*/
|
|
457
|
+
function getEnvNameFromContent(content) {
|
|
458
|
+
const firstBlock = content.trim().split('###')[0];
|
|
459
|
+
for (const line of firstBlock.split('\n')) {
|
|
460
|
+
const t = line.trim();
|
|
461
|
+
const match = t.match(/^#\s*@env\s+(\w+)/i);
|
|
462
|
+
if (match)
|
|
463
|
+
return match[1];
|
|
464
|
+
}
|
|
465
|
+
return null;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Applies file variables first, then env variables (env case-insensitive).
|
|
469
|
+
*/
|
|
470
|
+
function substituteVariables(content, fileVars, envVars) {
|
|
471
|
+
let result = content;
|
|
472
|
+
result = replaceVariables(result, fileVars, false);
|
|
473
|
+
result = replaceVariables(result, envVars, true);
|
|
474
|
+
return result;
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Applies CLI overrides (KEY=value) to content. Overrides take precedence over file/env vars.
|
|
478
|
+
*/
|
|
479
|
+
function applyVariableOverrides(content, overrides) {
|
|
480
|
+
return replaceVariables(content, overrides, false);
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Builds curl command from config (same logic as extension).
|
|
484
|
+
*/
|
|
485
|
+
function buildCurlCommand(config) {
|
|
486
|
+
let curlCmd = 'curl -i -s -S';
|
|
487
|
+
curlCmd += ' -w "\\nHTTPSTATUS:%{http_code}"';
|
|
488
|
+
if (config.method && config.method !== 'GET')
|
|
489
|
+
curlCmd += ` -X ${config.method}`;
|
|
490
|
+
if (config.headers) {
|
|
491
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
492
|
+
const escaped = value.replace(/"/g, '\\"');
|
|
493
|
+
curlCmd += ` -H "${key}: ${escaped}"`;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
if (config.body) {
|
|
497
|
+
const bodyStr = typeof config.body === 'string' ? config.body : JSON.stringify(config.body);
|
|
498
|
+
const escaped = bodyStr.replace(/'/g, "'\\''");
|
|
499
|
+
curlCmd += ` -d '${escaped}'`;
|
|
500
|
+
}
|
|
501
|
+
curlCmd += ` "${config.url.replace(/"/g, '\\"')}"`;
|
|
502
|
+
return curlCmd;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Executes HTTP request via curl and returns status/body.
|
|
506
|
+
*/
|
|
507
|
+
function executeHttpRequest(config, timeoutSeconds = 10) {
|
|
508
|
+
return new Promise((resolve) => {
|
|
509
|
+
const curlCommand = buildCurlCommand(config);
|
|
510
|
+
child_process.exec(curlCommand, { timeout: timeoutSeconds * 1000, maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {
|
|
511
|
+
const statusMatch = (stdout || '').match(/HTTPSTATUS:(\d{3})/);
|
|
512
|
+
const statusCode = statusMatch ? parseInt(statusMatch[1], 10) : 0;
|
|
513
|
+
const statusTexts = {
|
|
514
|
+
200: 'OK',
|
|
515
|
+
201: 'Created',
|
|
516
|
+
204: 'No Content',
|
|
517
|
+
400: 'Bad Request',
|
|
518
|
+
401: 'Unauthorized',
|
|
519
|
+
403: 'Forbidden',
|
|
520
|
+
404: 'Not Found',
|
|
521
|
+
500: 'Internal Server Error',
|
|
522
|
+
};
|
|
523
|
+
const statusText = statusTexts[statusCode] || 'Unknown';
|
|
524
|
+
if (error) {
|
|
525
|
+
if (error.signal === 'SIGTERM') {
|
|
526
|
+
resolve({
|
|
527
|
+
statusCode: 0,
|
|
528
|
+
statusText: 'Timeout',
|
|
529
|
+
body: `Request timeout after ${timeoutSeconds} seconds`,
|
|
530
|
+
error: `Request timeout after ${timeoutSeconds} seconds`,
|
|
531
|
+
});
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
if (error.message.includes('curl: command not found') ||
|
|
535
|
+
error.message.includes('curl: not found')) {
|
|
536
|
+
resolve({
|
|
537
|
+
statusCode: 0,
|
|
538
|
+
statusText: 'Error',
|
|
539
|
+
body: 'curl command not found. Please install curl.',
|
|
540
|
+
error: 'curl command not found.',
|
|
541
|
+
});
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
const body = [stdout, stderr].filter(Boolean).join('\n').replace(/HTTPSTATUS:\d{3}\s*/g, '').trim();
|
|
545
|
+
resolve({
|
|
546
|
+
statusCode: statusCode || 0,
|
|
547
|
+
statusText: 'Error',
|
|
548
|
+
body: body || error.message,
|
|
549
|
+
error: error.message,
|
|
550
|
+
});
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
// Parse headers from curl output
|
|
554
|
+
const headers = {};
|
|
555
|
+
const fullOutput = stdout || '';
|
|
556
|
+
const headerSection = fullOutput.split(/\r?\n\r?\n/)[0];
|
|
557
|
+
if (headerSection) {
|
|
558
|
+
const headerLines = headerSection.split(/\r?\n/);
|
|
559
|
+
for (const line of headerLines) {
|
|
560
|
+
const colonIndex = line.indexOf(':');
|
|
561
|
+
if (colonIndex > 0) {
|
|
562
|
+
const key = line.substring(0, colonIndex).trim().toLowerCase();
|
|
563
|
+
const value = line.substring(colonIndex + 1).trim();
|
|
564
|
+
headers[key] = value;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
const body = (stdout || '')
|
|
569
|
+
.replace(/HTTPSTATUS:\d{3}\s*/g, '')
|
|
570
|
+
.replace(/^[\s\S]*?\r?\n\r?\n/, '')
|
|
571
|
+
.trim();
|
|
572
|
+
resolve({ statusCode, statusText, body, headers });
|
|
573
|
+
});
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
//# sourceMappingURL=httpRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpRunner.js","sourceRoot":"","sources":["../src/httpRunner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyQA,4CAGC;AAKD,sCAWC;AAKD,kDAQC;AAKD,kCAoBC;AAkGD,oDA0BC;AAMD,sDAYC;AAKD,sDAQC;AAKD,kDASC;AAKD,wDAKC;AA2BD,gDAgFC;AAhmBD,6DAA+C;AAC/C,uCAAyB;AAyBzB;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,OAAe;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,qBAAqB;IACrB,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAElC,oEAAoE;IACpE,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC;IACtC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhC,0CAA0C;QAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhF,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,gBAAgB,EAAE,CAAC;gBACrB,wCAAwC;gBACxC,eAAe,GAAG,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,gBAAgB,GAAG,IAAI,CAAC;YACxB,SAAS;QACX,CAAC;QAED,wEAAwE;QACxE,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,eAAe,GAAG,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAE/B,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAElD,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC;IACzB,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,GAAG,GAAkB,IAAI,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACpD,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,eAAe,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBACxD,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBAC1E,IACE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;oBACtF,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EACnE,CAAC;oBACD,eAAe,GAAG,CAAC,CAAC;oBACpB,MAAM,GAAG,eAAe,CAAC;oBACzB,GAAG,GAAG,YAAY,CAAC;oBACnB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,eAAe,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,eAAe,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,SAAS,IAAI,WAAW;gBAAE,OAAO,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,6DAA6D,CAAC,EAAE,CAAC;gBAC/E,cAAc,GAAG,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAwB,CAAC;IAC7B,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,EAAE;YAAE,IAAI,GAAG,SAAS,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,KAAK,CAAC,oEAAoE,CAAC;gBAC/E,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,KAAa;IAC5C,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,KAAa;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBACvG,MAAM;gBACR,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBACD,CAAC,EAAE,CAAC;YACN,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,MAAM;gBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,IAAI,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAE9C,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACxE,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9D,IAAI,WAAW;YAAE,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,WAAW,GAAG;YAClB,kCAAkC;YAClC,mCAAmC;SACpC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,EAAE,CAAC;gBACN,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBACvC,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/D,IAAI,WAAW;QAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAEvD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,wDAAwD,CAAC;IAC7E,IAAI,WAAW,CAAC;IAChB,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,IAAwB,CAAC;IAC7B,MAAM,YAAY,GAAG;QACnB,oEAAoE;QACpE,qDAAqD;QACrD,0CAA0C;QAC1C,2BAA2B;KAC5B,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,YAAY,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,YAAY;SAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,EAA0B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAe;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,OAAe;IACzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,SAAS;YACzB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAClG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,GAAG;gBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAY;IAC1C,2EAA2E;IAC3E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wDAAwD,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAChG,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gDAAgD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACtF,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,gEAAgE,CAAC;QAC/E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gDAAgD,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;QAC1F,uCAAuC;QACvC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB;YACrF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACpE,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,oCAAoC;IACpD,CAAC,CAAC,CAAC;IAEH,oDAAoD;IACpD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yCAAyC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9E,MAAM,UAAU,GAAG;YACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM;YAC7E,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ;YAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc;YACrF,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW;SAC5E,CAAC;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,4CAA4C;IAC5C,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC9D,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACnE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,8DAA8D;IAC9D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACnE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjF,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,IAAY,EACZ,MAA2B,EAC3B,eAAwB;IAExB,sDAAsD;IACtD,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAEpC,iCAAiC;IACjC,MAAM,aAAa,GAAG,yCAAyC,CAAC;IAChE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACpD,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,IAAI,eAAe;YAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,OAAe;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,0DAA0D;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YAC9B,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACjF,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAClE,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,YAAoB;IACxD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACjF,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAClE,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5C,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,OAAe,EACf,QAA6B,EAC7B,OAA4B;IAE5B,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CACpC,OAAe,EACf,SAA8B;IAE9B,OAAO,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAyB;IACjD,IAAI,OAAO,GAAG,eAAe,CAAC;IAC9B,OAAO,IAAI,kCAAkC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,IAAI,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC;IAChF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO,IAAI,QAAQ,GAAG,KAAK,OAAO,GAAG,CAAC;QACxC,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,QAAQ,OAAO,GAAG,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;IACnD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,MAAyB,EACzB,iBAAyB,EAAE;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7C,aAAa,CAAC,IAAI,CAChB,WAAW,EACX,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAC/D,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,WAAW,GAA2B;gBAC1C,GAAG,EAAE,IAAI;gBACT,GAAG,EAAE,SAAS;gBACd,GAAG,EAAE,YAAY;gBACjB,GAAG,EAAE,aAAa;gBAClB,GAAG,EAAE,cAAc;gBACnB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,uBAAuB;aAC7B,CAAC;YACF,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;YAExD,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,CAAC;wBACN,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,SAAS;wBACrB,IAAI,EAAE,yBAAyB,cAAc,UAAU;wBACvD,KAAK,EAAE,yBAAyB,cAAc,UAAU;qBACzD,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,IACE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC;oBACjD,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EACzC,CAAC;oBACD,OAAO,CAAC;wBACN,UAAU,EAAE,CAAC;wBACb,UAAU,EAAE,OAAO;wBACnB,IAAI,EAAE,8CAA8C;wBACpD,KAAK,EAAE,yBAAyB;qBACjC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpG,OAAO,CAAC;oBACN,UAAU,EAAE,UAAU,IAAI,CAAC;oBAC3B,UAAU,EAAE,OAAO;oBACnB,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO;oBAC3B,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,iCAAiC;YACjC,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,MAAM,IAAI,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;oBAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACrC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;wBACnB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;wBAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACpD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;iBACxB,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;iBACnC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;iBAClC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|