@creeperhost/modlens-mcp 1.6.19 → 1.6.21

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 (108) hide show
  1. package/ATTRIBUTION.md +8 -1
  2. package/README.md +82 -5
  3. package/RUNTIME.md +262 -0
  4. package/TESTING.md +8 -0
  5. package/dist/cli.js +28 -8
  6. package/dist/cli.js.map +1 -1
  7. package/dist/hosted-mod-license.d.ts +36 -0
  8. package/dist/hosted-mod-license.d.ts.map +1 -0
  9. package/dist/hosted-mod-license.js +65 -0
  10. package/dist/hosted-mod-license.js.map +1 -0
  11. package/dist/hosted-policy.d.ts +32 -0
  12. package/dist/hosted-policy.d.ts.map +1 -0
  13. package/dist/hosted-policy.js +257 -0
  14. package/dist/hosted-policy.js.map +1 -0
  15. package/dist/launcher.js +104 -89
  16. package/dist/launcher.js.map +1 -1
  17. package/dist/license-notices.d.ts +8 -0
  18. package/dist/license-notices.d.ts.map +1 -0
  19. package/dist/license-notices.js +10 -0
  20. package/dist/license-notices.js.map +1 -0
  21. package/dist/license-source-references.d.ts +12 -0
  22. package/dist/license-source-references.d.ts.map +1 -0
  23. package/dist/license-source-references.js +18 -0
  24. package/dist/license-source-references.js.map +1 -0
  25. package/dist/license-templates.d.ts +6 -0
  26. package/dist/license-templates.d.ts.map +1 -0
  27. package/dist/license-templates.js +55 -0
  28. package/dist/license-templates.js.map +1 -0
  29. package/dist/local-mod.d.ts +31 -0
  30. package/dist/local-mod.d.ts.map +1 -0
  31. package/dist/local-mod.js +71 -0
  32. package/dist/local-mod.js.map +1 -0
  33. package/dist/mod-license.d.ts +53 -0
  34. package/dist/mod-license.d.ts.map +1 -0
  35. package/dist/mod-license.js +617 -0
  36. package/dist/mod-license.js.map +1 -0
  37. package/dist/primer-catalog.d.ts +15 -0
  38. package/dist/primer-catalog.d.ts.map +1 -0
  39. package/dist/primer-catalog.js +43 -0
  40. package/dist/primer-catalog.js.map +1 -0
  41. package/dist/primer-content.d.ts +7 -0
  42. package/dist/primer-content.d.ts.map +1 -0
  43. package/dist/primer-content.js +185 -0
  44. package/dist/primer-content.js.map +1 -0
  45. package/dist/runtime/cli.d.ts +2 -0
  46. package/dist/runtime/cli.d.ts.map +1 -0
  47. package/dist/runtime/cli.js +163 -0
  48. package/dist/runtime/cli.js.map +1 -0
  49. package/dist/runtime/companion.d.ts +32 -0
  50. package/dist/runtime/companion.d.ts.map +1 -0
  51. package/dist/runtime/companion.js +135 -0
  52. package/dist/runtime/companion.js.map +1 -0
  53. package/dist/runtime/guidance.d.ts +73 -0
  54. package/dist/runtime/guidance.d.ts.map +1 -0
  55. package/dist/runtime/guidance.js +40 -0
  56. package/dist/runtime/guidance.js.map +1 -0
  57. package/dist/runtime/hub.d.ts +150 -0
  58. package/dist/runtime/hub.d.ts.map +1 -0
  59. package/dist/runtime/hub.js +561 -0
  60. package/dist/runtime/hub.js.map +1 -0
  61. package/dist/runtime/modlens-agent.jar +0 -0
  62. package/dist/runtime/protocol.d.ts +202 -0
  63. package/dist/runtime/protocol.d.ts.map +1 -0
  64. package/dist/runtime/protocol.js +91 -0
  65. package/dist/runtime/protocol.js.map +1 -0
  66. package/dist/runtime/requests.d.ts +367 -0
  67. package/dist/runtime/requests.d.ts.map +1 -0
  68. package/dist/runtime/requests.js +57 -0
  69. package/dist/runtime/requests.js.map +1 -0
  70. package/dist/server.js +141 -45
  71. package/dist/server.js.map +1 -1
  72. package/dist/setup.js +9 -4
  73. package/dist/setup.js.map +1 -1
  74. package/dist/tools/primers.d.ts +133 -22
  75. package/dist/tools/primers.d.ts.map +1 -1
  76. package/dist/tools/primers.js +391 -386
  77. package/dist/tools/primers.js.map +1 -1
  78. package/dist/tools/project.d.ts +11 -7
  79. package/dist/tools/project.d.ts.map +1 -1
  80. package/dist/tools/project.js +45 -3
  81. package/dist/tools/project.js.map +1 -1
  82. package/dist/tools/report-issue.d.ts +77 -0
  83. package/dist/tools/report-issue.d.ts.map +1 -0
  84. package/dist/tools/report-issue.js +92 -0
  85. package/dist/tools/report-issue.js.map +1 -0
  86. package/dist/tools/runtime.d.ts +6 -0
  87. package/dist/tools/runtime.d.ts.map +1 -0
  88. package/dist/tools/runtime.js +18 -0
  89. package/dist/tools/runtime.js.map +1 -0
  90. package/dist/tools/source.d.ts +1 -1
  91. package/dist/tools/source.d.ts.map +1 -1
  92. package/dist/tools/source.js +5 -1
  93. package/dist/tools/source.js.map +1 -1
  94. package/package.json +8 -1
  95. package/scripts/build-runtime-agent.mjs +64 -0
  96. package/scripts/fixtures/mod-license-corpus.json +154 -0
  97. package/scripts/gradle/modlens-runtime.init.gradle +17 -0
  98. package/scripts/runtime-test-client.mjs +36 -0
  99. package/scripts/test-hosted-policy.mjs +123 -0
  100. package/scripts/test-mod-licenses-live.mjs +86 -0
  101. package/scripts/test-package.mjs +141 -5
  102. package/scripts/test-primers-live.mjs +93 -0
  103. package/scripts/test-project-http.mjs +46 -3
  104. package/scripts/test-runtime-gradle.mjs +107 -0
  105. package/scripts/test-runtime-minecraft.mjs +190 -0
  106. package/scripts/test-runtime-native.mjs +120 -0
  107. package/scripts/test-runtime-remote.mjs +209 -0
  108. package/scripts/update-license-templates.mjs +14 -0
@@ -0,0 +1,135 @@
1
+ import { createServer } from "node:http";
2
+ import { randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
3
+ import { readFile, writeFile, rename, unlink } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { z } from "zod";
6
+ import { RuntimeHub } from "./hub.js";
7
+ import { executeRuntime, runtimeRequest } from "./requests.js";
8
+ export const companionDescriptor = z.object({
9
+ protocol: z.literal(1),
10
+ pid: z.number().int().positive(),
11
+ endpoint: z
12
+ .string()
13
+ .url()
14
+ .refine((value) => {
15
+ const url = new URL(value);
16
+ return (url.protocol === "http:" &&
17
+ url.hostname === "127.0.0.1" &&
18
+ !!url.port &&
19
+ url.pathname === "/runtime" &&
20
+ !url.username &&
21
+ !url.password &&
22
+ !url.search &&
23
+ !url.hash);
24
+ }, "Companion must use loopback HTTP"),
25
+ token: z.string().regex(/^[a-f0-9]{64}$/),
26
+ });
27
+ export const descriptorPath = (root) => join(root, "companion.json");
28
+ /** Local CLI transport, not another MCP connection or an Internet control API. */
29
+ export async function startCompanion(root, agentJar) {
30
+ const hub = new RuntimeHub(root, agentJar);
31
+ // Uses the same ownership lock as local stdio: never steal an active bridge.
32
+ await hub.startLocalCompanion();
33
+ const token = randomBytes(32).toString("hex");
34
+ let closing;
35
+ const close = () => (closing ??= (async () => {
36
+ server.closeAllConnections();
37
+ await new Promise((resolve) => server.close(() => resolve()));
38
+ try {
39
+ const saved = JSON.parse(await readFile(descriptorPath(root), "utf8"));
40
+ if (saved.token === token)
41
+ await unlink(descriptorPath(root));
42
+ }
43
+ catch (e) {
44
+ if (e.code !== "ENOENT")
45
+ console.error("[runtime] Descriptor cleanup:", String(e));
46
+ }
47
+ await hub.close();
48
+ })());
49
+ const server = createServer(async (req, res) => {
50
+ res.setHeader("Cache-Control", "no-store");
51
+ res.setHeader("Content-Type", "application/json");
52
+ const supplied = Buffer.from(req.headers.authorization ?? ""), expected = Buffer.from(`Bearer ${token}`);
53
+ if (req.headers.origin ||
54
+ req.method !== "POST" ||
55
+ req.url !== "/runtime" ||
56
+ supplied.length !== expected.length ||
57
+ !timingSafeEqual(supplied, expected)) {
58
+ res.writeHead(403).end(JSON.stringify({ error: "Forbidden" }));
59
+ return;
60
+ }
61
+ try {
62
+ let size = 0;
63
+ const chunks = [];
64
+ for await (const chunk of req) {
65
+ size += chunk.length;
66
+ if (size > 64 * 1024) {
67
+ res.writeHead(413).end(JSON.stringify({ error: "Request too large" }));
68
+ req.destroy();
69
+ return;
70
+ }
71
+ chunks.push(chunk);
72
+ }
73
+ const request = JSON.parse(Buffer.concat(chunks).toString("utf8"));
74
+ if (request?.action === "ping") {
75
+ res.end(JSON.stringify({ protocol: 1, pid: process.pid }));
76
+ return;
77
+ }
78
+ if (request?.action === "stop_helper") {
79
+ res.end(JSON.stringify({
80
+ state: "stopped",
81
+ note: "The companion stopped. Running game processes are left running; held inputs expire after loss of connection.",
82
+ }), () => {
83
+ void close().catch(console.error);
84
+ });
85
+ return;
86
+ }
87
+ const result = await executeRuntime(hub, runtimeRequest.parse(request));
88
+ // CLI callers use their local image viewer, never a screen-sized base64 blob in text.
89
+ if (result && typeof result === "object" && "mimeType" in result && "data" in result) {
90
+ const { data, ...artifact } = result;
91
+ res.end(JSON.stringify({
92
+ ...artifact,
93
+ view: "Open the local path with your image viewing tool.",
94
+ }));
95
+ }
96
+ else
97
+ res.end(JSON.stringify(result));
98
+ }
99
+ catch (e) {
100
+ if (!res.headersSent)
101
+ res.writeHead(400).end(JSON.stringify({ error: e instanceof Error ? e.message : String(e) }));
102
+ }
103
+ });
104
+ server.requestTimeout = 5000;
105
+ server.headersTimeout = 5000;
106
+ try {
107
+ await new Promise((resolve, reject) => {
108
+ server.once("error", reject);
109
+ server.listen(0, "127.0.0.1", () => {
110
+ server.off("error", reject);
111
+ resolve();
112
+ });
113
+ });
114
+ const descriptor = {
115
+ protocol: 1,
116
+ pid: process.pid,
117
+ endpoint: `http://127.0.0.1:${server.address().port}/runtime`,
118
+ token,
119
+ };
120
+ const temporary = join(root, `companion-${randomUUID()}.tmp`);
121
+ try {
122
+ await writeFile(temporary, JSON.stringify(descriptor), { mode: 0o600, flag: "wx" });
123
+ await rename(temporary, descriptorPath(root));
124
+ }
125
+ finally {
126
+ await unlink(temporary).catch(() => { });
127
+ }
128
+ return { hub, descriptor, close };
129
+ }
130
+ catch (e) {
131
+ await close();
132
+ throw e;
133
+ }
134
+ }
135
+ //# sourceMappingURL=companion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"companion.js","sourceRoot":"","sources":["../../src/runtime/companion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { RuntimeRequest } from "./requests.js";
2
+ export declare function localExecutionPlan(request: RuntimeRequest): {
3
+ execution: string;
4
+ executed: boolean;
5
+ helperVersion: string;
6
+ message: string;
7
+ steps: string[];
8
+ invocation: {
9
+ executable: string;
10
+ arguments: string[];
11
+ };
12
+ sourceCheckout: {
13
+ note: string;
14
+ executable: string;
15
+ arguments: string[];
16
+ };
17
+ request: {
18
+ action: "status" | "events" | "artifact" | "command" | "help" | "setup" | "sessions" | "launch";
19
+ mcVersion?: "26.3" | undefined;
20
+ projectId?: string | undefined;
21
+ mode?: "interactive" | "observe" | "hidden" | undefined;
22
+ command?: {
23
+ type: "mode";
24
+ mode: "interactive" | "observe" | "hidden";
25
+ } | {
26
+ type: "key";
27
+ key: string;
28
+ down: boolean;
29
+ holdMs: number;
30
+ } | {
31
+ type: "mouse_button";
32
+ button: number;
33
+ down: boolean;
34
+ holdMs: number;
35
+ } | {
36
+ type: "mouse_move";
37
+ x: number;
38
+ y: number;
39
+ relative: boolean;
40
+ } | {
41
+ type: "scroll";
42
+ x: number;
43
+ y: number;
44
+ } | {
45
+ type: "text";
46
+ text: string;
47
+ } | {
48
+ type: "release_all";
49
+ } | {
50
+ type: "screenshot";
51
+ } | {
52
+ type: "threads";
53
+ } | {
54
+ type: "recording";
55
+ } | {
56
+ type: "allocations";
57
+ limit: number;
58
+ windowSeconds: number;
59
+ packagePrefix?: string | undefined;
60
+ } | undefined;
61
+ sessionId?: string | undefined;
62
+ minecraftHooks?: boolean | undefined;
63
+ projectDir?: string | undefined;
64
+ gradleTask?: string | undefined;
65
+ javaHome?: string | undefined;
66
+ afterCursor?: number | undefined;
67
+ waitMs?: number | undefined;
68
+ artifactName?: string | undefined;
69
+ };
70
+ lifecycle: string;
71
+ limits: string;
72
+ };
73
+ //# sourceMappingURL=guidance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guidance.d.ts","sourceRoot":"","sources":["../../src/runtime/guidance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAMpD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCzD"}
@@ -0,0 +1,40 @@
1
+ import { readFileSync } from "node:fs";
2
+ const version = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
3
+ export function localExecutionPlan(request) {
4
+ return {
5
+ execution: "local_helper_required",
6
+ executed: false,
7
+ helperVersion: version,
8
+ message: "Run this workflow using your LOCAL terminal/file tools on the computer running Minecraft. This remote MCP response has not configured, launched, or controlled a JVM.",
9
+ steps: [
10
+ "Write request below as UTF-8 JSON to a temporary local file, e.g. runtime-request.json. Use paths on the user's PC, not paths on the remote MCP server.",
11
+ "Invoke the helper with the executable and separate arguments below; substitute the request file's path. Follow the local host's normal execution permissions. Do not paste JSON or project paths into an unquoted shell command.",
12
+ "Read the helper's JSON result. Setup creates ModLens Client in IntelliJ; launch starts the chosen Gradle task. Reuse this helper for sessions/status/events/command/artifact requests.",
13
+ "For a screenshot, request command screenshot, then artifact using the returned name, then view the returned local image path with your image tool. Use events with afterCursor and waitMs up to 30000 while monitoring.",
14
+ ],
15
+ invocation: {
16
+ executable: "npx",
17
+ arguments: [
18
+ "-y",
19
+ `@creeperhost/modlens-mcp@${version}`,
20
+ "--runtime",
21
+ "--request-file",
22
+ "<local-request-file>",
23
+ ],
24
+ },
25
+ sourceCheckout: {
26
+ note: "For an unpublished build, use a local checkout of this version after npm run build and npm run build:agent (JDK 25). Release packages include the agent.",
27
+ executable: "node",
28
+ arguments: [
29
+ "<local-modlens-checkout>/dist/launcher.js",
30
+ "--runtime",
31
+ "--request-file",
32
+ "<local-request-file>",
33
+ ],
34
+ },
35
+ request,
36
+ lifecycle: "The helper starts one persistent, authenticated loopback companion automatically; it collects events between CLI calls. Stop it with the same package command followed by --runtime stop. No second MCP connection or public tunnel is needed.",
37
+ limits: "Codex must have local execution access to the Minecraft PC. This does not wake an idle AI task, and does not connect a cloud-only shell to the user's computer. Do not upload local bridge tokens. Only share diagnostic content needed for the user's task.",
38
+ };
39
+ }
40
+ //# sourceMappingURL=guidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guidance.js","sourceRoot":"","sources":["../../src/runtime/guidance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,MAAM,OAAO,GACT,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAClF,CAAC,OAAO,CAAC;AAEV,MAAM,UAAU,kBAAkB,CAAC,OAAuB;IACtD,OAAO;QACH,SAAS,EAAE,uBAAuB;QAClC,QAAQ,EAAE,KAAK;QACf,aAAa,EAAE,OAAO;QACtB,OAAO,EACH,uKAAuK;QAC3K,KAAK,EAAE;YACH,yJAAyJ;YACzJ,kOAAkO;YAClO,wLAAwL;YACxL,yNAAyN;SAC5N;QACD,UAAU,EAAE;YACR,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE;gBACP,IAAI;gBACJ,4BAA4B,OAAO,EAAE;gBACrC,WAAW;gBACX,gBAAgB;gBAChB,sBAAsB;aACzB;SACJ;QACD,cAAc,EAAE;YACZ,IAAI,EAAE,0JAA0J;YAChK,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE;gBACP,2CAA2C;gBAC3C,WAAW;gBACX,gBAAgB;gBAChB,sBAAsB;aACzB;SACJ;QACD,OAAO;QACP,SAAS,EACL,gPAAgP;QACpP,MAAM,EAAE,8PAA8P;KACzQ,CAAC;AACN,CAAC"}
@@ -0,0 +1,150 @@
1
+ import { type RuntimeCommand, type RuntimeMode } from "./protocol.js";
2
+ type Event = {
3
+ cursor: number;
4
+ sessionId: string;
5
+ time: number;
6
+ type: string;
7
+ data: Record<string, unknown>;
8
+ };
9
+ export declare const RUNTIME_HELP: {
10
+ target: string;
11
+ clientJvmOptions: string;
12
+ optional: boolean;
13
+ workflow: string[];
14
+ input: string;
15
+ monitoring: string;
16
+ heapAnalysis: string;
17
+ execution: string;
18
+ limits: string;
19
+ };
20
+ /** Local-only, opt-in bridge. Remote MCP clients never gain host process/filesystem control. */
21
+ export declare class RuntimeHub {
22
+ readonly root: string;
23
+ readonly agentJar: string;
24
+ private projects;
25
+ private sessions;
26
+ private journal;
27
+ private cursor;
28
+ private server?;
29
+ private endpoint;
30
+ private init?;
31
+ private waiters;
32
+ private children;
33
+ private persistence;
34
+ private monitor?;
35
+ private dirty;
36
+ private ownsLock;
37
+ private listening?;
38
+ constructor(root: string, agentJar?: string);
39
+ private assertLocal;
40
+ initialize(): Promise<void>;
41
+ /** Explicit CLI opt-in: keep a bridge ready even before the first project setup. */
42
+ startLocalCompanion(): Promise<void>;
43
+ private load;
44
+ private listen;
45
+ private openListener;
46
+ private safeDirectory;
47
+ private managedWrite;
48
+ private connection;
49
+ setup(directory: string, mode?: RuntimeMode, task?: string, hooks?: boolean): Promise<{
50
+ state: string;
51
+ projectId: string;
52
+ mcVersion: string;
53
+ mode: "interactive" | "observe" | "hidden";
54
+ runConfiguration: string;
55
+ vmOption: string;
56
+ vmOptions: string[];
57
+ manualLaunch: string;
58
+ next: string;
59
+ files: string[];
60
+ note: string;
61
+ }>;
62
+ private accept;
63
+ private add;
64
+ private saveEvents;
65
+ status(sessionId?: string): Promise<{
66
+ sessionId: string;
67
+ projectId: string;
68
+ status: string;
69
+ lastSeen: number;
70
+ pid: number;
71
+ javaVersion: string;
72
+ capabilities: Record<string, unknown>;
73
+ state: Record<string, unknown>;
74
+ metrics: Record<string, unknown>;
75
+ } | {
76
+ enabled: boolean;
77
+ agentPackaged: boolean;
78
+ projects: {
79
+ id: string;
80
+ directory: string;
81
+ mode: RuntimeMode;
82
+ task: string;
83
+ hooks: boolean;
84
+ }[];
85
+ help: {
86
+ target: string;
87
+ clientJvmOptions: string;
88
+ optional: boolean;
89
+ workflow: string[];
90
+ input: string;
91
+ monitoring: string;
92
+ heapAnalysis: string;
93
+ execution: string;
94
+ limits: string;
95
+ };
96
+ }>;
97
+ list(): Promise<{
98
+ sessionId: string;
99
+ projectId: string;
100
+ status: string;
101
+ lastSeen: number;
102
+ pid: number;
103
+ javaVersion: string;
104
+ capabilities: Record<string, unknown>;
105
+ state: Record<string, unknown>;
106
+ metrics: Record<string, unknown>;
107
+ }[]>;
108
+ private view;
109
+ private session;
110
+ events(after?: number, waitMs?: number, sessionId?: string): Promise<{
111
+ events: Event[];
112
+ nextCursor: number;
113
+ truncated: boolean;
114
+ }>;
115
+ command(sessionId: string, command: RuntimeCommand): Promise<unknown>;
116
+ launch(projectId: string, javaHome?: string): Promise<{
117
+ state: string;
118
+ pid: number | undefined;
119
+ projectId: string;
120
+ next: string;
121
+ }>;
122
+ artifact(sessionId: string, name: string): Promise<{
123
+ path: string;
124
+ note: string;
125
+ mimeType?: undefined;
126
+ data?: undefined;
127
+ text?: undefined;
128
+ } | {
129
+ path: string;
130
+ mimeType: string;
131
+ data: string;
132
+ note?: undefined;
133
+ text?: undefined;
134
+ } | {
135
+ path: string;
136
+ text: string;
137
+ note?: undefined;
138
+ mimeType?: undefined;
139
+ data?: undefined;
140
+ } | {
141
+ path: string;
142
+ note?: undefined;
143
+ mimeType?: undefined;
144
+ data?: undefined;
145
+ text?: undefined;
146
+ }>;
147
+ close(): Promise<void>;
148
+ }
149
+ export {};
150
+ //# sourceMappingURL=hub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/runtime/hub.ts"],"names":[],"mappings":"AAMA,OAAO,EAIH,KAAK,cAAc,EACnB,KAAK,WAAW,EACnB,MAAM,eAAe,CAAC;AAYvB,KAAK,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAmB9G,eAAO,MAAM,YAAY;;;;;;;;;;CAoBxB,CAAC;AAEF,gGAAgG;AAChG,qBAAa,UAAU;IAgBf,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,QAAQ;IAhBrB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,IAAI,CAAC,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,OAAO,CAAC,CAAiB;IACjC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAC,CAAgB;gBAErB,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAuD;IAG5E,OAAO,CAAC,WAAW;IAMb,UAAU;IAOhB,oFAAoF;IAC9E,mBAAmB;YAIX,IAAI;YAqBJ,MAAM;YAON,YAAY;YAqGZ,aAAa;YAeb,YAAY;YAUZ,UAAU;IAclB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,WAA2B,EAAE,IAAI,SAAc,EAAE,KAAK,UAAO;;;;;;;;;;;;;IA2FlG,OAAO,CAAC,MAAM;IAmCd,OAAO,CAAC,GAAG;YAQG,UAAU;IAKlB,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM;;;;;;;;;;;;;;gBA1Y3B,MAAM;uBACC,MAAM;kBAEX,WAAW;kBACX,MAAM;mBACL,OAAO;;;;;;;;;;;;;;IAqZR,IAAI;;;;;;;;;;;IAIV,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,OAAO;IAKT,MAAM,CAAC,KAAK,SAAI,EAAE,MAAM,SAAI,EAAE,SAAS,CAAC,EAAE,MAAM;;;;;IAwBhD,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc;IAoBlD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;;;;;;IAuD3C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;IAkBxC,KAAK;CAiCd"}