@nanocollective/get-md 1.0.2 → 1.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +155 -1
  3. package/dist/cli.js +388 -4
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cli.spec.js +187 -0
  6. package/dist/cli.spec.js.map +1 -1
  7. package/dist/converters/llm-converter.d.ts +71 -0
  8. package/dist/converters/llm-converter.d.ts.map +1 -0
  9. package/dist/converters/llm-converter.js +191 -0
  10. package/dist/converters/llm-converter.js.map +1 -0
  11. package/dist/converters/llm-converter.spec.d.ts +2 -0
  12. package/dist/converters/llm-converter.spec.d.ts.map +1 -0
  13. package/dist/converters/llm-converter.spec.js +281 -0
  14. package/dist/converters/llm-converter.spec.js.map +1 -0
  15. package/dist/converters/llm-manager.d.ts +88 -0
  16. package/dist/converters/llm-manager.d.ts.map +1 -0
  17. package/dist/converters/llm-manager.js +277 -0
  18. package/dist/converters/llm-manager.js.map +1 -0
  19. package/dist/converters/llm-manager.spec.d.ts +2 -0
  20. package/dist/converters/llm-manager.spec.d.ts.map +1 -0
  21. package/dist/converters/llm-manager.spec.js +280 -0
  22. package/dist/converters/llm-manager.spec.js.map +1 -0
  23. package/dist/extractors/metadata-extractor.js +1 -1
  24. package/dist/extractors/metadata-extractor.js.map +1 -1
  25. package/dist/index.d.ts +14 -4
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +23 -10
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.spec.js +172 -1
  30. package/dist/index.spec.js.map +1 -1
  31. package/dist/optimizers/html-cleaner.js +1 -1
  32. package/dist/optimizers/html-cleaner.js.map +1 -1
  33. package/dist/optimizers/html-cleaner.spec.js +1 -0
  34. package/dist/optimizers/html-cleaner.spec.js.map +1 -1
  35. package/dist/optimizers/llm-formatter.js +2 -2
  36. package/dist/optimizers/llm-formatter.js.map +1 -1
  37. package/dist/optimizers/structure-enhancer.js +3 -3
  38. package/dist/optimizers/structure-enhancer.js.map +1 -1
  39. package/dist/optimizers/structure-enhancer.spec.js +1 -1
  40. package/dist/optimizers/structure-enhancer.spec.js.map +1 -1
  41. package/dist/parsers/markdown-parser.d.ts +36 -0
  42. package/dist/parsers/markdown-parser.d.ts.map +1 -1
  43. package/dist/parsers/markdown-parser.js +267 -45
  44. package/dist/parsers/markdown-parser.js.map +1 -1
  45. package/dist/parsers/markdown-parser.spec.js +106 -98
  46. package/dist/parsers/markdown-parser.spec.js.map +1 -1
  47. package/dist/types.d.ts +149 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/utils/config-loader.d.ts +62 -0
  50. package/dist/utils/config-loader.d.ts.map +1 -0
  51. package/dist/utils/config-loader.js +167 -0
  52. package/dist/utils/config-loader.js.map +1 -0
  53. package/dist/utils/config-loader.spec.d.ts +2 -0
  54. package/dist/utils/config-loader.spec.d.ts.map +1 -0
  55. package/dist/utils/config-loader.spec.js +355 -0
  56. package/dist/utils/config-loader.spec.js.map +1 -0
  57. package/dist/utils/url-fetcher.d.ts.map +1 -1
  58. package/dist/utils/url-fetcher.js +1 -1
  59. package/dist/utils/url-fetcher.js.map +1 -1
  60. package/dist/utils/validators.js +1 -1
  61. package/dist/utils/validators.js.map +1 -1
  62. package/package.json +25 -17
@@ -0,0 +1,355 @@
1
+ // src/utils/config-loader.spec.ts
2
+ import test from "ava";
3
+ import fs from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { loadConfig, loadConfigFromFile, findConfigPath, mergeConfigWithOptions, } from "./config-loader.js";
7
+ // ============================================================================
8
+ // Test Fixtures
9
+ // ============================================================================
10
+ const TEST_CONFIG_DIR = path.join(os.tmpdir(), "get-md-config-test");
11
+ const ORIGINAL_CWD = process.cwd();
12
+ // Helper to create a config file
13
+ async function createConfigFile(dir, filename, content) {
14
+ await fs.mkdir(dir, { recursive: true });
15
+ const filePath = path.join(dir, filename);
16
+ await fs.writeFile(filePath, JSON.stringify(content, null, 2));
17
+ return filePath;
18
+ }
19
+ // Helper to clean up test files
20
+ async function cleanupTestFiles() {
21
+ try {
22
+ await fs.rm(TEST_CONFIG_DIR, { recursive: true, force: true });
23
+ }
24
+ catch {
25
+ // Ignore errors
26
+ }
27
+ }
28
+ // ============================================================================
29
+ // Setup and Teardown
30
+ // ============================================================================
31
+ test.beforeEach(async () => {
32
+ await cleanupTestFiles();
33
+ await fs.mkdir(TEST_CONFIG_DIR, { recursive: true });
34
+ });
35
+ test.afterEach(async () => {
36
+ process.chdir(ORIGINAL_CWD);
37
+ await cleanupTestFiles();
38
+ });
39
+ // ============================================================================
40
+ // loadConfigFromFile Tests
41
+ // ============================================================================
42
+ test("loadConfigFromFile: loads valid config file", async (t) => {
43
+ const config = { useLLM: true, llmTemperature: 0.5 };
44
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
45
+ const loaded = loadConfigFromFile(filePath);
46
+ t.deepEqual(loaded, config);
47
+ });
48
+ test("loadConfigFromFile: loads all supported boolean options", async (t) => {
49
+ const config = {
50
+ useLLM: true,
51
+ llmFallback: false,
52
+ extractContent: true,
53
+ includeMeta: false,
54
+ includeImages: true,
55
+ includeLinks: false,
56
+ includeTables: true,
57
+ aggressiveCleanup: false,
58
+ };
59
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
60
+ const loaded = loadConfigFromFile(filePath);
61
+ t.deepEqual(loaded, config);
62
+ });
63
+ test("loadConfigFromFile: loads string options", async (t) => {
64
+ const config = { llmModelPath: "/custom/path/model.gguf" };
65
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
66
+ const loaded = loadConfigFromFile(filePath);
67
+ t.is(loaded.llmModelPath, "/custom/path/model.gguf");
68
+ });
69
+ test("loadConfigFromFile: loads number options", async (t) => {
70
+ const config = { llmTemperature: 0.3, maxLength: 50000 };
71
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
72
+ const loaded = loadConfigFromFile(filePath);
73
+ t.is(loaded.llmTemperature, 0.3);
74
+ t.is(loaded.maxLength, 50000);
75
+ });
76
+ test("loadConfigFromFile: throws for non-existent file", (t) => {
77
+ t.throws(() => loadConfigFromFile("/nonexistent/path/.getmdrc"), { message: /Failed to load config/ });
78
+ });
79
+ test("loadConfigFromFile: throws for invalid JSON", async (t) => {
80
+ await fs.mkdir(TEST_CONFIG_DIR, { recursive: true });
81
+ const filePath = path.join(TEST_CONFIG_DIR, ".getmdrc");
82
+ await fs.writeFile(filePath, "not valid json");
83
+ t.throws(() => loadConfigFromFile(filePath), { message: /Failed to load config/ });
84
+ });
85
+ test("loadConfigFromFile: throws for non-object config", async (t) => {
86
+ await fs.mkdir(TEST_CONFIG_DIR, { recursive: true });
87
+ const filePath = path.join(TEST_CONFIG_DIR, ".getmdrc");
88
+ await fs.writeFile(filePath, '"just a string"');
89
+ t.throws(() => loadConfigFromFile(filePath), { message: /Config must be a JSON object/ });
90
+ });
91
+ test("loadConfigFromFile: throws for null config", async (t) => {
92
+ await fs.mkdir(TEST_CONFIG_DIR, { recursive: true });
93
+ const filePath = path.join(TEST_CONFIG_DIR, ".getmdrc");
94
+ await fs.writeFile(filePath, "null");
95
+ t.throws(() => loadConfigFromFile(filePath), { message: /Config must be a JSON object/ });
96
+ });
97
+ // ============================================================================
98
+ // Config Validation Tests
99
+ // ============================================================================
100
+ test("loadConfigFromFile: throws for invalid boolean type", async (t) => {
101
+ const config = { useLLM: "yes" }; // Should be boolean, not string
102
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
103
+ t.throws(() => loadConfigFromFile(filePath), { message: /useLLM.*must be a boolean/ });
104
+ });
105
+ test("loadConfigFromFile: throws for invalid llmModelPath type", async (t) => {
106
+ const config = { llmModelPath: 123 }; // Should be string, not number
107
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
108
+ t.throws(() => loadConfigFromFile(filePath), { message: /llmModelPath.*must be a string/ });
109
+ });
110
+ test("loadConfigFromFile: throws for invalid llmTemperature type", async (t) => {
111
+ const config = { llmTemperature: "0.5" }; // Should be number, not string
112
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
113
+ t.throws(() => loadConfigFromFile(filePath), { message: /llmTemperature.*must be a number/ });
114
+ });
115
+ test("loadConfigFromFile: throws for llmTemperature out of range (negative)", async (t) => {
116
+ const config = { llmTemperature: -0.5 };
117
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
118
+ t.throws(() => loadConfigFromFile(filePath), { message: /llmTemperature.*between 0 and 2/ });
119
+ });
120
+ test("loadConfigFromFile: throws for llmTemperature out of range (too high)", async (t) => {
121
+ const config = { llmTemperature: 3.0 };
122
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
123
+ t.throws(() => loadConfigFromFile(filePath), { message: /llmTemperature.*between 0 and 2/ });
124
+ });
125
+ test("loadConfigFromFile: throws for invalid maxLength type", async (t) => {
126
+ const config = { maxLength: "50000" }; // Should be number, not string
127
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
128
+ t.throws(() => loadConfigFromFile(filePath), { message: /maxLength.*must be an integer/ });
129
+ });
130
+ test("loadConfigFromFile: throws for negative maxLength", async (t) => {
131
+ const config = { maxLength: -100 };
132
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
133
+ t.throws(() => loadConfigFromFile(filePath), { message: /maxLength.*must be positive/ });
134
+ });
135
+ test("loadConfigFromFile: throws for non-integer maxLength", async (t) => {
136
+ const config = { maxLength: 50.5 };
137
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
138
+ t.throws(() => loadConfigFromFile(filePath), { message: /maxLength.*must be an integer/ });
139
+ });
140
+ // ============================================================================
141
+ // findConfigPath Tests
142
+ // ============================================================================
143
+ test("findConfigPath: finds .getmdrc in current directory", async (t) => {
144
+ await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", { useLLM: true });
145
+ process.chdir(TEST_CONFIG_DIR);
146
+ const configPath = findConfigPath();
147
+ // Use realpath to resolve symlinks (e.g., /var -> /private/var on macOS)
148
+ t.true(configPath !== null);
149
+ t.true(configPath.endsWith(".getmdrc"));
150
+ });
151
+ test("findConfigPath: finds .getmdrc.json in current directory", async (t) => {
152
+ await createConfigFile(TEST_CONFIG_DIR, ".getmdrc.json", { useLLM: true });
153
+ process.chdir(TEST_CONFIG_DIR);
154
+ const configPath = findConfigPath();
155
+ t.true(configPath !== null);
156
+ t.true(configPath.endsWith(".getmdrc.json"));
157
+ });
158
+ test("findConfigPath: finds get-md.config.json in current directory", async (t) => {
159
+ await createConfigFile(TEST_CONFIG_DIR, "get-md.config.json", {
160
+ useLLM: true,
161
+ });
162
+ process.chdir(TEST_CONFIG_DIR);
163
+ const configPath = findConfigPath();
164
+ t.true(configPath !== null);
165
+ t.true(configPath.endsWith("get-md.config.json"));
166
+ });
167
+ test("findConfigPath: finds getmd.config.json in current directory", async (t) => {
168
+ await createConfigFile(TEST_CONFIG_DIR, "getmd.config.json", {
169
+ useLLM: true,
170
+ });
171
+ process.chdir(TEST_CONFIG_DIR);
172
+ const configPath = findConfigPath();
173
+ t.true(configPath !== null);
174
+ t.true(configPath.endsWith("getmd.config.json"));
175
+ });
176
+ test("findConfigPath: returns null when no config file exists", async (t) => {
177
+ // Create empty directory and change to it
178
+ const emptyDir = path.join(TEST_CONFIG_DIR, "empty");
179
+ await fs.mkdir(emptyDir, { recursive: true });
180
+ process.chdir(emptyDir);
181
+ const configPath = findConfigPath();
182
+ // May find config in home directory, so just check the function works
183
+ t.true(configPath === null || typeof configPath === "string");
184
+ });
185
+ test("findConfigPath: prefers .getmdrc over other formats", async (t) => {
186
+ await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", { useLLM: true });
187
+ await createConfigFile(TEST_CONFIG_DIR, "get-md.config.json", {
188
+ useLLM: false,
189
+ });
190
+ process.chdir(TEST_CONFIG_DIR);
191
+ const configPath = findConfigPath();
192
+ t.true(configPath !== null);
193
+ // .getmdrc should be found first (higher priority)
194
+ t.true(configPath.endsWith(".getmdrc"));
195
+ t.false(configPath.endsWith(".json"));
196
+ });
197
+ // ============================================================================
198
+ // loadConfig Tests
199
+ // ============================================================================
200
+ test("loadConfig: loads config from current directory", async (t) => {
201
+ await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", {
202
+ useLLM: true,
203
+ llmTemperature: 0.2,
204
+ });
205
+ process.chdir(TEST_CONFIG_DIR);
206
+ const config = loadConfig();
207
+ t.is(config.useLLM, true);
208
+ t.is(config.llmTemperature, 0.2);
209
+ });
210
+ test("loadConfig: returns empty object when no config exists", async (t) => {
211
+ const emptyDir = path.join(TEST_CONFIG_DIR, "empty-dir");
212
+ await fs.mkdir(emptyDir, { recursive: true });
213
+ process.chdir(emptyDir);
214
+ // Note: This might still find config in home directory
215
+ // We just verify the function doesn't crash
216
+ const config = loadConfig();
217
+ t.is(typeof config, "object");
218
+ });
219
+ // ============================================================================
220
+ // mergeConfigWithOptions Tests
221
+ // ============================================================================
222
+ test("mergeConfigWithOptions: options override config", (t) => {
223
+ const config = {
224
+ useLLM: true,
225
+ llmTemperature: 0.5,
226
+ extractContent: true,
227
+ };
228
+ const options = {
229
+ useLLM: false,
230
+ llmTemperature: 0.1,
231
+ };
232
+ const merged = mergeConfigWithOptions(config, options);
233
+ t.is(merged.useLLM, false);
234
+ t.is(merged.llmTemperature, 0.1);
235
+ t.is(merged.extractContent, true); // From config
236
+ });
237
+ test("mergeConfigWithOptions: preserves config when options are undefined", (t) => {
238
+ const config = {
239
+ useLLM: true,
240
+ llmTemperature: 0.5,
241
+ extractContent: true,
242
+ includeMeta: false,
243
+ };
244
+ const options = {
245
+ // All undefined
246
+ };
247
+ const merged = mergeConfigWithOptions(config, options);
248
+ t.is(merged.useLLM, true);
249
+ t.is(merged.llmTemperature, 0.5);
250
+ t.is(merged.extractContent, true);
251
+ t.is(merged.includeMeta, false);
252
+ });
253
+ test("mergeConfigWithOptions: empty config returns options", (t) => {
254
+ const config = {};
255
+ const options = {
256
+ useLLM: true,
257
+ llmTemperature: 0.3,
258
+ };
259
+ const merged = mergeConfigWithOptions(config, options);
260
+ t.is(merged.useLLM, true);
261
+ t.is(merged.llmTemperature, 0.3);
262
+ });
263
+ test("mergeConfigWithOptions: both empty returns empty", (t) => {
264
+ const config = {};
265
+ const options = {};
266
+ const merged = mergeConfigWithOptions(config, options);
267
+ t.deepEqual(merged, {});
268
+ });
269
+ test("mergeConfigWithOptions: handles all option types", (t) => {
270
+ const config = {
271
+ useLLM: false,
272
+ llmModelPath: "/default/path",
273
+ llmTemperature: 0.1,
274
+ maxLength: 100000,
275
+ extractContent: true,
276
+ };
277
+ const options = {
278
+ useLLM: true,
279
+ llmModelPath: "/custom/path",
280
+ onLLMEvent: () => { }, // Additional option not in config
281
+ };
282
+ const merged = mergeConfigWithOptions(config, options);
283
+ t.is(merged.useLLM, true);
284
+ t.is(merged.llmModelPath, "/custom/path");
285
+ t.is(merged.llmTemperature, 0.1); // From config
286
+ t.is(merged.maxLength, 100000); // From config
287
+ t.is(merged.extractContent, true); // From config
288
+ t.is(typeof merged.onLLMEvent, "function"); // From options
289
+ });
290
+ // ============================================================================
291
+ // Edge Cases
292
+ // ============================================================================
293
+ test("loadConfigFromFile: handles empty config object", async (t) => {
294
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", {});
295
+ const loaded = loadConfigFromFile(filePath);
296
+ t.deepEqual(loaded, {});
297
+ });
298
+ test("loadConfigFromFile: ignores unknown options", async (t) => {
299
+ const config = {
300
+ useLLM: true,
301
+ unknownOption: "value",
302
+ anotherUnknown: 123,
303
+ };
304
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
305
+ const loaded = loadConfigFromFile(filePath);
306
+ // Should only include recognized options
307
+ t.is(loaded.useLLM, true);
308
+ t.is(loaded.unknownOption, undefined);
309
+ });
310
+ test("loadConfigFromFile: handles edge temperature values", async (t) => {
311
+ // Temperature at boundaries should be valid
312
+ const config = { llmTemperature: 0 };
313
+ const filePath1 = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
314
+ t.notThrows(() => loadConfigFromFile(filePath1));
315
+ await fs.unlink(filePath1);
316
+ const config2 = { llmTemperature: 2 };
317
+ const filePath2 = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config2);
318
+ t.notThrows(() => loadConfigFromFile(filePath2));
319
+ });
320
+ test("loadConfigFromFile: handles maxLength of zero", async (t) => {
321
+ const config = { maxLength: 0 };
322
+ const filePath = await createConfigFile(TEST_CONFIG_DIR, ".getmdrc", config);
323
+ const loaded = loadConfigFromFile(filePath);
324
+ t.is(loaded.maxLength, 0);
325
+ });
326
+ // ============================================================================
327
+ // Type Tests
328
+ // ============================================================================
329
+ test("types: GetMdConfig interface is properly structured", (t) => {
330
+ const config = {
331
+ useLLM: true,
332
+ llmModelPath: "/path",
333
+ llmTemperature: 0.5,
334
+ llmFallback: true,
335
+ extractContent: true,
336
+ includeMeta: true,
337
+ includeImages: true,
338
+ includeLinks: true,
339
+ includeTables: true,
340
+ aggressiveCleanup: true,
341
+ maxLength: 100000,
342
+ };
343
+ t.is(typeof config.useLLM, "boolean");
344
+ t.is(typeof config.llmModelPath, "string");
345
+ t.is(typeof config.llmTemperature, "number");
346
+ t.is(typeof config.maxLength, "number");
347
+ });
348
+ test("types: GetMdConfig allows partial config", (t) => {
349
+ const config = {
350
+ useLLM: true,
351
+ };
352
+ t.is(config.useLLM, true);
353
+ t.is(config.llmModelPath, undefined);
354
+ });
355
+ //# sourceMappingURL=config-loader.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.spec.js","sourceRoot":"","sources":["../../src/utils/config-loader.spec.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAG5B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;AACrE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAEnC,iCAAiC;AACjC,KAAK,UAAU,gBAAgB,CAC7B,GAAW,EACX,QAAgB,EAChB,OAAe;IAEf,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gCAAgC;AAChC,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;IACzB,MAAM,gBAAgB,EAAE,CAAC;IACzB,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC5B,MAAM,gBAAgB,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,2BAA2B;AAC3B,+EAA+E;AAE/E,IAAI,CAAC,6CAA6C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CACrC,eAAe,EACf,UAAU,EACV,MAAM,CACP,CAAC;IAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE5C,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC1E,MAAM,MAAM,GAAgB;QAC1B,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,IAAI;QACnB,iBAAiB,EAAE,KAAK;KACzB,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE5C,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,yBAAyB,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE5C,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE5C,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC7D,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,EACtD,EAAE,OAAO,EAAE,uBAAuB,EAAE,CACrC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC9D,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAE/C,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CACrC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACnE,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAEhD,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAC5C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC7D,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAErC,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAC5C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,IAAI,CAAC,qDAAqD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtE,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,gCAAgC;IAClE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CACzC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC3E,MAAM,MAAM,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,+BAA+B;IACrE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAC9C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4DAA4D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC7E,MAAM,MAAM,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,+BAA+B;IACzE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAChD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uEAAuE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACxF,MAAM,MAAM,GAAG,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAC/C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uEAAuE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACxF,MAAM,MAAM,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAC/C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACxE,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,+BAA+B;IACtE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAC7C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACpE,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAC3C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACvE,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,CAAC,CAAC,MAAM,CACN,GAAG,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAClC,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAC7C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,IAAI,CAAC,qDAAqD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtE,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,yEAAyE;IACzE,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,IAAI,CAAC,UAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC3E,MAAM,gBAAgB,CAAC,eAAe,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,IAAI,CAAC,UAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAChF,MAAM,gBAAgB,CAAC,eAAe,EAAE,oBAAoB,EAAE;QAC5D,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,IAAI,CAAC,UAAW,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/E,MAAM,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,EAAE;QAC3D,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,IAAI,CAAC,UAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC1E,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAExB,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,sEAAsE;IACtE,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtE,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,gBAAgB,CAAC,eAAe,EAAE,oBAAoB,EAAE;QAC5D,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IAEpC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IAC5B,mDAAmD;IACnD,CAAC,CAAC,IAAI,CAAC,UAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,KAAK,CAAC,UAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,IAAI,CAAC,iDAAiD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClE,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE;QAClD,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,GAAG;KACpB,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAExB,uDAAuD;IACvD,4CAA4C;IAC5C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAgB;QAC1B,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,GAAG;QACnB,cAAc,EAAE,IAAI;KACrB,CAAC;IAEF,MAAM,OAAO,GAAoB;QAC/B,MAAM,EAAE,KAAK;QACb,cAAc,EAAE,GAAG;KACpB,CAAC;IAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvD,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,CAAC,CAAC,EAAE,EAAE;IAChF,MAAM,MAAM,GAAgB;QAC1B,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,GAAG;QACnB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,MAAM,OAAO,GAAoB;IAC/B,gBAAgB;KACjB,CAAC;IAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvD,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,CAAC,CAAC,EAAE,EAAE;IACjE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,MAAM,OAAO,GAAoB;QAC/B,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,GAAG;KACpB,CAAC;IAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvD,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvD,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAgB;QAC1B,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,eAAe;QAC7B,cAAc,EAAE,GAAG;QACnB,SAAS,EAAE,MAAM;QACjB,cAAc,EAAE,IAAI;KACrB,CAAC;IAEF,MAAM,OAAO,GAAoB;QAC/B,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,cAAc;QAC5B,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,kCAAkC;KACzD,CAAC;IAEF,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvD,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAC1C,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc;IAChD,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc;IAC9C,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc;IACjD,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,eAAe;AAC7D,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,IAAI,CAAC,iDAAiD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE5C,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,OAAO;QACtB,cAAc,EAAE,GAAG;KACpB,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE5C,yCAAyC;IACzC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAE,MAAkC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtE,4CAA4C;IAC5C,MAAM,MAAM,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CACtC,eAAe,EACf,UAAU,EACV,MAAM,CACP,CAAC;IACF,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAE3B,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CACtC,eAAe,EACf,UAAU,EACV,OAAO,CACR,CAAC;IACF,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAChE,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE5C,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,IAAI,CAAC,qDAAqD,EAAE,CAAC,CAAC,EAAE,EAAE;IAChE,MAAM,MAAM,GAAgB;QAC1B,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,OAAO;QACrB,cAAc,EAAE,GAAG;QACnB,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;QACnB,iBAAiB,EAAE,IAAI;QACvB,SAAS,EAAE,MAAM;KAClB,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,CAAC,CAAC,EAAE,EAAE;IACrD,MAAM,MAAM,GAAgB;QAC1B,MAAM,EAAE,IAAI;KACb,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"url-fetcher.d.ts","sourceRoot":"","sources":["../../src/utils/url-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAOrD"}
1
+ {"version":3,"file":"url-fetcher.d.ts","sourceRoot":"","sources":["../../src/utils/url-fetcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAOrD"}
@@ -1,5 +1,5 @@
1
1
  // src/utils/url-fetcher.ts
2
- import { DEFAULT_USER_AGENT, DEFAULT_FETCH_TIMEOUT } from "../config.js";
2
+ import { DEFAULT_FETCH_TIMEOUT, DEFAULT_USER_AGENT } from "../config.js";
3
3
  /**
4
4
  * Fetch HTML from a URL with timeout and redirect handling
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"url-fetcher.js","sourceRoot":"","sources":["../../src/utils/url-fetcher.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAG3B,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAEzE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,UAAwB,EAAE;IAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,qBAAqB,CAAC;IACzD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;IAExD,MAAM,OAAO,GAA2B;QACtC,YAAY,EAAE,SAAS;QACvB,MAAM,EAAE,iEAAiE;QACzE,iBAAiB,EAAE,gBAAgB;QACnC,iBAAiB,EAAE,mBAAmB;QACtC,GAAG,OAAO,CAAC,OAAO;KACnB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO;YACP,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;SAChD,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,IAAI,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"url-fetcher.js","sourceRoot":"","sources":["../../src/utils/url-fetcher.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGzE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,UAAwB,EAAE;IAE1B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,qBAAqB,CAAC;IACzD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;IAExD,MAAM,OAAO,GAA2B;QACtC,YAAY,EAAE,SAAS;QACvB,MAAM,EAAE,iEAAiE;QACzE,iBAAiB,EAAE,gBAAgB;QACnC,iBAAiB,EAAE,mBAAmB;QACtC,GAAG,OAAO,CAAC,OAAO;KACnB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,OAAO;YACP,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;SAChD,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,IAAI,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
1
  // src/utils/validators.ts
2
- import * as cheerio from "cheerio";
2
+ import * as cheerio from "cheerio/slim";
3
3
  /**
4
4
  * Validate if HTML contains extractable content
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,2CAA2C;QAC3C,CAAC,CAAC,oCAAoC,CAAC,CAAC,MAAM,EAAE,CAAC;QAEjD,mBAAmB;QACnB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAErC,qEAAqE;QACrE,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAExC;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7B,2CAA2C;QAC3C,CAAC,CAAC,oCAAoC,CAAC,CAAC,MAAM,EAAE,CAAC;QAEjD,mBAAmB;QACnB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAErC,qEAAqE;QACrE,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanocollective/get-md",
3
- "version": "1.0.2",
3
+ "version": "1.1.0-beta.1",
4
4
  "description": "Fast HTML to Markdown converter optimized for LLM consumption",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -29,12 +29,14 @@
29
29
  "test:all": "./scripts/test.sh",
30
30
  "test:ava": "ava",
31
31
  "test:ava:coverage": "c8 ava",
32
- "test:format": "prettier --check .",
32
+ "test:format": "biome check .",
33
33
  "test:types": "tsc --noEmit",
34
- "test:lint": "eslint .",
35
- "test:lint:fix": "eslint . --fix",
34
+ "test:lint": "biome lint .",
35
+ "test:lint:fix": "biome check --write .",
36
36
  "test:knip": "knip",
37
- "format": "prettier --write .",
37
+ "test:audit": "pnpm audit --audit-level=high",
38
+ "test:security": "semgrep scan --config auto --error",
39
+ "format": "biome format --write .",
38
40
  "prepublishOnly": "pnpm run build && pnpm run test:all"
39
41
  },
40
42
  "keywords": [
@@ -54,8 +56,10 @@
54
56
  "@mozilla/readability": "^0.6.0",
55
57
  "ajv": "^8.17.1",
56
58
  "cheerio": "^1.1.2",
59
+ "cli-progress": "^3.12.0",
57
60
  "commander": "^14.0.2",
58
- "jsdom": "^24.1.3",
61
+ "happy-dom-without-node": "^14.12.3",
62
+ "node-llama-cpp": "^3.15.0",
59
63
  "turndown": "^7.2.2",
60
64
  "turndown-plugin-gfm": "^1.0.2"
61
65
  },
@@ -66,21 +70,25 @@
66
70
  "license": "MIT",
67
71
  "devDependencies": {
68
72
  "@ava/typescript": "^6.0.0",
69
- "@eslint/js": "^9.38.0",
73
+ "@biomejs/biome": "^2.3.11",
74
+ "@types/cli-progress": "^3.11.6",
70
75
  "@types/jsdom": "^27.0.0",
71
- "@types/node": "^24.9.1",
76
+ "@types/node": "^25.0.6",
72
77
  "@types/turndown": "^5.0.6",
73
- "@typescript-eslint/eslint-plugin": "^8.46.2",
74
- "@typescript-eslint/parser": "^8.46.2",
75
78
  "ava": "^6.4.1",
76
79
  "c8": "^10.1.3",
77
- "eslint": "^9.38.0",
78
- "globals": "^16.4.0",
79
- "knip": "^5.66.3",
80
- "prettier": "^3.6.2",
81
- "tsx": "^4.20.6",
82
- "typescript": "^5.9.3",
83
- "typescript-eslint": "^8.46.2"
80
+ "knip": "^5.80.2",
81
+ "tsx": "^4.21.0",
82
+ "typescript": "^5.9.3"
83
+ },
84
+ "pnpm": {
85
+ "onlyBuiltDependencies": [
86
+ "node-llama-cpp"
87
+ ],
88
+ "overrides": {
89
+ "tar": ">=7.5.4",
90
+ "lodash": ">=4.17.23"
91
+ }
84
92
  },
85
93
  "ava": {
86
94
  "extensions": {