@volter/browser-python 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/LICENSE +21 -0
- package/README.md +14 -0
- package/dist/asgi-bridge.d.ts +3 -0
- package/dist/asgi-bridge.d.ts.map +1 -0
- package/dist/asgi-bridge.js +307 -0
- package/dist/asgi-bridge.js.map +1 -0
- package/dist/command.d.ts +20 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +154 -0
- package/dist/command.js.map +1 -0
- package/dist/filesystem.d.ts +9 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +96 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/package-manager.d.ts +8 -0
- package/dist/package-manager.d.ts.map +1 -0
- package/dist/package-manager.js +103 -0
- package/dist/package-manager.js.map +1 -0
- package/dist/process-host.d.ts +27 -0
- package/dist/process-host.d.ts.map +1 -0
- package/dist/process-host.js +326 -0
- package/dist/process-host.js.map +1 -0
- package/dist/protocol.d.ts +169 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/pyodide-runtime.d.ts +37 -0
- package/dist/pyodide-runtime.d.ts.map +1 -0
- package/dist/pyodide-runtime.js +13 -0
- package/dist/pyodide-runtime.js.map +1 -0
- package/dist/server-host.d.ts +21 -0
- package/dist/server-host.d.ts.map +1 -0
- package/dist/server-host.js +526 -0
- package/dist/server-host.js.map +1 -0
- package/dist/sqlite-coherence.d.ts +19 -0
- package/dist/sqlite-coherence.d.ts.map +1 -0
- package/dist/sqlite-coherence.js +167 -0
- package/dist/sqlite-coherence.js.map +1 -0
- package/dist/subprocess-bridge.d.ts +12 -0
- package/dist/subprocess-bridge.d.ts.map +1 -0
- package/dist/subprocess-bridge.js +407 -0
- package/dist/subprocess-bridge.js.map +1 -0
- package/dist/worker.d.ts +2 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +251 -0
- package/dist/worker.js.map +1 -0
- package/dist/wsgi-bridge.d.ts +21 -0
- package/dist/wsgi-bridge.d.ts.map +1 -0
- package/dist/wsgi-bridge.js +268 -0
- package/dist/wsgi-bridge.js.map +1 -0
- package/package.json +23 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../src/filesystem.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,mBAAmB,eAAe,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAE7B,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PyodideFileSystem, PyodideRuntime } from "./pyodide-runtime.js";
|
|
2
|
+
export interface PythonPipInvocation {
|
|
3
|
+
requirements: string[];
|
|
4
|
+
}
|
|
5
|
+
export declare function restorePythonPackages(pyodide: PyodideRuntime): Promise<void>;
|
|
6
|
+
export declare function installPythonPackages(pyodide: PyodideRuntime, invocation: PythonPipInvocation): Promise<void>;
|
|
7
|
+
export declare function parsePipInvocation(fs: PyodideFileSystem, argv: string[], cwd: string): PythonPipInvocation | undefined;
|
|
8
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM9E,MAAM,WAAW,mBAAmB;IAAG,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE;AAE/D,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlF;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,mBAAmB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,iBAAiB,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,mBAAmB,GAAG,SAAS,CAyBjC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { absolutePythonPath, pythonBasename } from "./filesystem.js";
|
|
2
|
+
const REQUIREMENTS_PATH = "/workspace/.supercode/python-requirements.txt";
|
|
3
|
+
const MAX_REQUIREMENTS = 64;
|
|
4
|
+
const MAX_REQUIREMENT_CHARS = 256;
|
|
5
|
+
export async function restorePythonPackages(pyodide) {
|
|
6
|
+
const persisted = readRequirements(pyodide.FS);
|
|
7
|
+
if (persisted.length === 0)
|
|
8
|
+
return;
|
|
9
|
+
await installRequirements(pyodide, persisted);
|
|
10
|
+
writeRequirements(pyodide.FS, await resolvedRequirements(pyodide));
|
|
11
|
+
}
|
|
12
|
+
export async function installPythonPackages(pyodide, invocation) {
|
|
13
|
+
await installRequirements(pyodide, invocation.requirements);
|
|
14
|
+
writeRequirements(pyodide.FS, await resolvedRequirements(pyodide));
|
|
15
|
+
}
|
|
16
|
+
export function parsePipInvocation(fs, argv, cwd) {
|
|
17
|
+
const executable = pythonBasename(argv[0] ?? "");
|
|
18
|
+
const args = executable === "pip" || executable === "pip3"
|
|
19
|
+
? argv.slice(1)
|
|
20
|
+
: (executable === "python" || executable === "python3") && argv[1] === "-m" && argv[2] === "pip"
|
|
21
|
+
? argv.slice(3) : undefined;
|
|
22
|
+
if (!args)
|
|
23
|
+
return;
|
|
24
|
+
if (args[0] !== "install")
|
|
25
|
+
throw new Error("browser pip currently supports: pip install <packages> [-r requirements.txt]");
|
|
26
|
+
const requirements = [];
|
|
27
|
+
for (let index = 1; index < args.length; index += 1) {
|
|
28
|
+
const argument = args[index];
|
|
29
|
+
if (argument === "--disable-pip-version-check" || argument === "-q" || argument === "--quiet")
|
|
30
|
+
continue;
|
|
31
|
+
if (argument === "-r" || argument === "--requirement") {
|
|
32
|
+
const requestedPath = args[++index];
|
|
33
|
+
if (!requestedPath)
|
|
34
|
+
throw new Error(`${argument} requires a file path.`);
|
|
35
|
+
const path = absolutePythonPath(requestedPath, cwd);
|
|
36
|
+
if (!fs.analyzePath(path).exists)
|
|
37
|
+
throw new Error(`pip: requirements file not found: ${path}`);
|
|
38
|
+
requirements.push(...parseRequirementFile(new TextDecoder().decode(fs.readFile(path))));
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (argument.startsWith("-"))
|
|
42
|
+
throw new Error(`browser pip does not support option: ${argument}`);
|
|
43
|
+
requirements.push(argument);
|
|
44
|
+
}
|
|
45
|
+
validateRequirements(requirements);
|
|
46
|
+
return { requirements };
|
|
47
|
+
}
|
|
48
|
+
async function installRequirements(pyodide, requirements) {
|
|
49
|
+
if (requirements.length === 0)
|
|
50
|
+
throw new Error("pip install requires at least one package.");
|
|
51
|
+
validateRequirements(requirements);
|
|
52
|
+
await pyodide.loadPackage("micropip");
|
|
53
|
+
await pyodide.runPythonAsync(`
|
|
54
|
+
import micropip
|
|
55
|
+
await micropip.install(${JSON.stringify(requirements)}, deps=True)
|
|
56
|
+
`);
|
|
57
|
+
}
|
|
58
|
+
async function resolvedRequirements(pyodide) {
|
|
59
|
+
const value = await pyodide.runPythonAsync(`
|
|
60
|
+
import json, micropip
|
|
61
|
+
json.dumps(sorted(
|
|
62
|
+
f"{name}=={package.version}"
|
|
63
|
+
for name, package in micropip.list().items()
|
|
64
|
+
if name.lower() != "micropip"
|
|
65
|
+
))
|
|
66
|
+
`);
|
|
67
|
+
const requirements = JSON.parse(String(value));
|
|
68
|
+
if (!Array.isArray(requirements) || requirements.some((entry) => typeof entry !== "string")) {
|
|
69
|
+
throw new Error("micropip returned an invalid package inventory.");
|
|
70
|
+
}
|
|
71
|
+
validateRequirements(requirements);
|
|
72
|
+
return requirements;
|
|
73
|
+
}
|
|
74
|
+
function readRequirements(fs) {
|
|
75
|
+
if (!fs.analyzePath(REQUIREMENTS_PATH).exists)
|
|
76
|
+
return [];
|
|
77
|
+
return parseRequirementFile(new TextDecoder().decode(fs.readFile(REQUIREMENTS_PATH)));
|
|
78
|
+
}
|
|
79
|
+
function writeRequirements(fs, requirements) {
|
|
80
|
+
validateRequirements(requirements);
|
|
81
|
+
fs.mkdirTree(REQUIREMENTS_PATH.slice(0, REQUIREMENTS_PATH.lastIndexOf("/")));
|
|
82
|
+
fs.writeFile(REQUIREMENTS_PATH, new TextEncoder().encode(`${requirements.join("\n")}\n`));
|
|
83
|
+
}
|
|
84
|
+
function parseRequirementFile(value) {
|
|
85
|
+
const requirements = value.split(/\r?\n/u)
|
|
86
|
+
.map((line) => line.replace(/\s+#.*$/u, "").trim())
|
|
87
|
+
.filter(Boolean);
|
|
88
|
+
validateRequirements(requirements);
|
|
89
|
+
return requirements;
|
|
90
|
+
}
|
|
91
|
+
function validateRequirements(requirements) {
|
|
92
|
+
if (requirements.length > MAX_REQUIREMENTS)
|
|
93
|
+
throw new Error(`Python package limit is ${MAX_REQUIREMENTS}.`);
|
|
94
|
+
for (const requirement of requirements) {
|
|
95
|
+
if (!requirement || requirement.length > MAX_REQUIREMENT_CHARS || /[\u0000-\u001f\u007f]/u.test(requirement)) {
|
|
96
|
+
throw new Error("Invalid Python package requirement.");
|
|
97
|
+
}
|
|
98
|
+
if (/^(?:https?|emfs):/iu.test(requirement) || requirement.endsWith(".whl")) {
|
|
99
|
+
throw new Error("Direct wheel URLs are not accepted; install a named package from the verified index.");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { BrowserFileSystem } from "@volter/browser-runtime/browser-filesystem.js";
|
|
2
|
+
import type { BrowserCommandBackend } from "@volter/browser-runtime/browser-process.js";
|
|
3
|
+
import type { PythonServerWorkerMessage } from "./protocol.js";
|
|
4
|
+
type ProcessMessage = Extract<PythonServerWorkerMessage, {
|
|
5
|
+
type: "process-run" | "process-cancel" | "process-start" | "process-action";
|
|
6
|
+
}>;
|
|
7
|
+
/** Owns synchronous subprocess calls and long-lived Popen handles for one Python worker. */
|
|
8
|
+
export declare class PythonChildProcessHost {
|
|
9
|
+
private readonly filesystem;
|
|
10
|
+
private readonly backend?;
|
|
11
|
+
private readonly controllers;
|
|
12
|
+
private readonly children;
|
|
13
|
+
private nextChildId;
|
|
14
|
+
private active;
|
|
15
|
+
private closed;
|
|
16
|
+
constructor(filesystem: BrowserFileSystem, backend?: BrowserCommandBackend | undefined);
|
|
17
|
+
handles(message: PythonServerWorkerMessage): message is ProcessMessage;
|
|
18
|
+
handle(message: ProcessMessage): void;
|
|
19
|
+
close(): void;
|
|
20
|
+
private run;
|
|
21
|
+
private runOnce;
|
|
22
|
+
private start;
|
|
23
|
+
private act;
|
|
24
|
+
private requiredBackend;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=process-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-host.d.ts","sourceRoot":"","sources":["../src/process-host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE/D,KAAK,cAAc,GAAG,OAAO,CAAC,yBAAyB,EAAE;IACvD,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,eAAe,GAAG,gBAAgB,CAAC;CAC7E,CAAC,CAAC;AAsBH,4FAA4F;AAC5F,qBAAa,sBAAsB;IAQ/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAR3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAS;gBAGJ,UAAU,EAAE,iBAAiB,EAC7B,OAAO,CAAC,EAAE,qBAAqB,YAAA;IAGlD,OAAO,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,IAAI,cAAc;IAKtE,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAYrC,KAAK,IAAI,IAAI;IAcb,OAAO,CAAC,GAAG;YAcG,OAAO;IAqBrB,OAAO,CAAC,KAAK;YA0DC,GAAG;IAsDjB,OAAO,CAAC,eAAe;CAIxB"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
const MAX_PROCESS_REQUESTS = 8;
|
|
2
|
+
const MAX_PROCESS_COMMAND_CHARS = 64 * 1024;
|
|
3
|
+
const MAX_PROCESS_INPUT_BYTES = 16 * 1024 * 1024;
|
|
4
|
+
const MAX_PROCESS_OUTPUT_BYTES = 16 * 1024 * 1024;
|
|
5
|
+
const MAX_PROCESS_READ_BYTES = 1024 * 1024;
|
|
6
|
+
/** Owns synchronous subprocess calls and long-lived Popen handles for one Python worker. */
|
|
7
|
+
export class PythonChildProcessHost {
|
|
8
|
+
filesystem;
|
|
9
|
+
backend;
|
|
10
|
+
controllers = new Map();
|
|
11
|
+
children = new Map();
|
|
12
|
+
nextChildId = 1;
|
|
13
|
+
active = 0;
|
|
14
|
+
closed = false;
|
|
15
|
+
constructor(filesystem, backend) {
|
|
16
|
+
this.filesystem = filesystem;
|
|
17
|
+
this.backend = backend;
|
|
18
|
+
}
|
|
19
|
+
handles(message) {
|
|
20
|
+
return message.type === "process-run" || message.type === "process-cancel"
|
|
21
|
+
|| message.type === "process-start" || message.type === "process-action";
|
|
22
|
+
}
|
|
23
|
+
handle(message) {
|
|
24
|
+
if (message.type === "process-cancel") {
|
|
25
|
+
this.controllers.get(message.requestId)?.abort(new DOMException("Python subprocess cancelled.", "AbortError"));
|
|
26
|
+
}
|
|
27
|
+
else if (message.type === "process-run") {
|
|
28
|
+
this.run(message);
|
|
29
|
+
}
|
|
30
|
+
else if (message.type === "process-start") {
|
|
31
|
+
this.start(message);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
void this.act(message);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
close() {
|
|
38
|
+
if (this.closed)
|
|
39
|
+
return;
|
|
40
|
+
this.closed = true;
|
|
41
|
+
for (const controller of this.controllers.values()) {
|
|
42
|
+
controller.abort(new DOMException("Python server process exited.", "AbortError"));
|
|
43
|
+
}
|
|
44
|
+
this.controllers.clear();
|
|
45
|
+
for (const child of this.children.values()) {
|
|
46
|
+
child.stdin?.close();
|
|
47
|
+
child.controller.abort(new DOMException("Python server process exited.", "AbortError"));
|
|
48
|
+
}
|
|
49
|
+
this.children.clear();
|
|
50
|
+
}
|
|
51
|
+
run(message) {
|
|
52
|
+
if (this.active >= MAX_PROCESS_REQUESTS) {
|
|
53
|
+
complete(message, { error: "Python subprocess concurrency exceeded." });
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.active += 1;
|
|
57
|
+
const controller = new AbortController();
|
|
58
|
+
this.controllers.set(message.requestId, controller);
|
|
59
|
+
void this.runOnce(message, controller.signal).finally(() => {
|
|
60
|
+
this.active -= 1;
|
|
61
|
+
this.controllers.delete(message.requestId);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async runOnce(message, signal) {
|
|
65
|
+
try {
|
|
66
|
+
const backend = this.requiredBackend();
|
|
67
|
+
validateRequest(message.command, message.cwd, message.env);
|
|
68
|
+
const stdin = decode(message.stdinBase64);
|
|
69
|
+
if (stdin.byteLength > MAX_PROCESS_INPUT_BYTES)
|
|
70
|
+
throw new Error("Python subprocess stdin exceeds 16 MiB.");
|
|
71
|
+
const result = await backend.run(message.command, {
|
|
72
|
+
cwd: message.cwd,
|
|
73
|
+
env: message.env,
|
|
74
|
+
signal,
|
|
75
|
+
...(stdin.byteLength > 0 ? { stdinStream: oneChunk(stdin) } : {}),
|
|
76
|
+
});
|
|
77
|
+
complete(message, { result, filesystem: this.filesystem.toSnapshot() });
|
|
78
|
+
}
|
|
79
|
+
catch (cause) {
|
|
80
|
+
complete(message, { error: errorMessage(cause) });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
start(message) {
|
|
84
|
+
try {
|
|
85
|
+
const backend = this.requiredBackend();
|
|
86
|
+
if (this.closed)
|
|
87
|
+
throw new Error("Python child-process host is closed.");
|
|
88
|
+
if (this.active >= MAX_PROCESS_REQUESTS)
|
|
89
|
+
throw new Error("Python subprocess concurrency exceeded.");
|
|
90
|
+
validateRequest(message.command, message.cwd, message.env);
|
|
91
|
+
const childId = this.nextChildId++;
|
|
92
|
+
const controller = new AbortController();
|
|
93
|
+
const stdin = message.stdinPipe ? new AsyncProcessInput() : undefined;
|
|
94
|
+
const stdout = message.stdoutPipe ? new AsyncProcessOutput() : undefined;
|
|
95
|
+
const stderr = message.stderrPipe && !message.stderrToStdout ? new AsyncProcessOutput() : undefined;
|
|
96
|
+
const child = { controller, stdin, stdout, stderr };
|
|
97
|
+
let stdoutStreamed = false;
|
|
98
|
+
let stderrStreamed = false;
|
|
99
|
+
const writeOutput = (output, chunk) => {
|
|
100
|
+
if (!output)
|
|
101
|
+
return;
|
|
102
|
+
try {
|
|
103
|
+
output.write(new TextEncoder().encode(chunk));
|
|
104
|
+
}
|
|
105
|
+
catch (cause) {
|
|
106
|
+
controller.abort(cause);
|
|
107
|
+
throw cause;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
this.active += 1;
|
|
111
|
+
child.completion = backend.run(message.command, {
|
|
112
|
+
cwd: message.cwd,
|
|
113
|
+
env: message.env,
|
|
114
|
+
signal: controller.signal,
|
|
115
|
+
...(stdin ? { stdinStream: stdin } : {}),
|
|
116
|
+
...(stdout || message.stderrToStdout ? { onStdout: (chunk) => {
|
|
117
|
+
stdoutStreamed = true;
|
|
118
|
+
writeOutput(stdout, chunk);
|
|
119
|
+
} } : {}),
|
|
120
|
+
...(stderr || message.stderrToStdout ? { onStderr: (chunk) => {
|
|
121
|
+
stderrStreamed = true;
|
|
122
|
+
writeOutput(message.stderrToStdout ? stdout : stderr, chunk);
|
|
123
|
+
} } : {}),
|
|
124
|
+
}).then((result) => {
|
|
125
|
+
if (stdout && result.stdout && !stdoutStreamed)
|
|
126
|
+
writeOutput(stdout, result.stdout);
|
|
127
|
+
if (message.stderrToStdout && result.stderr && !stderrStreamed)
|
|
128
|
+
writeOutput(stdout, result.stderr);
|
|
129
|
+
else if (stderr && result.stderr && !stderrStreamed)
|
|
130
|
+
writeOutput(stderr, result.stderr);
|
|
131
|
+
return { result, filesystem: this.filesystem.toSnapshot() };
|
|
132
|
+
}, (cause) => ({
|
|
133
|
+
error: errorMessage(cause),
|
|
134
|
+
filesystem: this.filesystem.toSnapshot(),
|
|
135
|
+
})).then((completion) => {
|
|
136
|
+
child.finished = completion;
|
|
137
|
+
stdout?.close();
|
|
138
|
+
stderr?.close();
|
|
139
|
+
this.active -= 1;
|
|
140
|
+
return completion;
|
|
141
|
+
});
|
|
142
|
+
this.children.set(childId, child);
|
|
143
|
+
complete(message, { childId });
|
|
144
|
+
}
|
|
145
|
+
catch (cause) {
|
|
146
|
+
complete(message, { error: errorMessage(cause) });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async act(message) {
|
|
150
|
+
try {
|
|
151
|
+
const child = this.children.get(message.childId);
|
|
152
|
+
if (!child)
|
|
153
|
+
throw new Error("Unknown browser subprocess.");
|
|
154
|
+
if (message.action === "poll") {
|
|
155
|
+
complete(message, { returncode: child.finished?.result?.exitCode ?? null });
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (message.action === "write") {
|
|
159
|
+
if (!child.stdin)
|
|
160
|
+
throw new Error("Browser subprocess stdin is not a pipe.");
|
|
161
|
+
const bytes = decode(message.stdinBase64 ?? "");
|
|
162
|
+
if (bytes.byteLength > MAX_PROCESS_INPUT_BYTES)
|
|
163
|
+
throw new Error("Python subprocess stdin exceeds 16 MiB.");
|
|
164
|
+
child.stdin.write(bytes);
|
|
165
|
+
complete(message, { written: bytes.byteLength });
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (message.action === "read") {
|
|
169
|
+
const output = message.stream === "stdout" ? child.stdout
|
|
170
|
+
: message.stream === "stderr" ? child.stderr : undefined;
|
|
171
|
+
if (!output)
|
|
172
|
+
throw new Error("Browser subprocess output is not a pipe.");
|
|
173
|
+
const maximum = message.maximum ?? 64 * 1024;
|
|
174
|
+
if (!Number.isSafeInteger(maximum) || maximum <= 0 || maximum > MAX_PROCESS_READ_BYTES) {
|
|
175
|
+
throw new Error("Invalid browser subprocess read size.");
|
|
176
|
+
}
|
|
177
|
+
const value = await output.read(maximum);
|
|
178
|
+
complete(message, { dataBase64: encode(value.bytes), eof: value.eof });
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (message.action === "close") {
|
|
182
|
+
child.stdin?.close();
|
|
183
|
+
complete(message, {});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (message.action === "terminate") {
|
|
187
|
+
child.stdin?.close();
|
|
188
|
+
child.controller.abort(new DOMException("Python subprocess terminated.", "AbortError"));
|
|
189
|
+
complete(message, {});
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (message.action === "release") {
|
|
193
|
+
if (!child.finished)
|
|
194
|
+
throw new Error("Cannot release a running browser subprocess.");
|
|
195
|
+
this.children.delete(message.childId);
|
|
196
|
+
complete(message, {});
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (message.stdinBase64)
|
|
200
|
+
child.stdin?.write(decode(message.stdinBase64));
|
|
201
|
+
if (message.closeStdin)
|
|
202
|
+
child.stdin?.close();
|
|
203
|
+
const completion = await child.completion;
|
|
204
|
+
complete(message, completion);
|
|
205
|
+
}
|
|
206
|
+
catch (cause) {
|
|
207
|
+
complete(message, { error: errorMessage(cause) });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
requiredBackend() {
|
|
211
|
+
if (!this.backend)
|
|
212
|
+
throw new Error("No browser child-process backend is configured.");
|
|
213
|
+
return this.backend;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
class AsyncProcessInput {
|
|
217
|
+
chunks = [];
|
|
218
|
+
readers = [];
|
|
219
|
+
closed = false;
|
|
220
|
+
[Symbol.asyncIterator]() { return this; }
|
|
221
|
+
next() {
|
|
222
|
+
const chunk = this.chunks.shift();
|
|
223
|
+
if (chunk)
|
|
224
|
+
return Promise.resolve({ value: chunk, done: false });
|
|
225
|
+
if (this.closed)
|
|
226
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
227
|
+
return new Promise((resolve) => this.readers.push(resolve));
|
|
228
|
+
}
|
|
229
|
+
write(bytes) {
|
|
230
|
+
if (this.closed)
|
|
231
|
+
throw new Error("write to closed browser subprocess stdin");
|
|
232
|
+
const chunk = bytes.slice();
|
|
233
|
+
const reader = this.readers.shift();
|
|
234
|
+
if (reader)
|
|
235
|
+
reader({ value: chunk, done: false });
|
|
236
|
+
else
|
|
237
|
+
this.chunks.push(chunk);
|
|
238
|
+
}
|
|
239
|
+
close() {
|
|
240
|
+
if (this.closed)
|
|
241
|
+
return;
|
|
242
|
+
this.closed = true;
|
|
243
|
+
for (const reader of this.readers.splice(0))
|
|
244
|
+
reader({ value: undefined, done: true });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
class AsyncProcessOutput {
|
|
248
|
+
chunks = [];
|
|
249
|
+
readers = [];
|
|
250
|
+
length = 0;
|
|
251
|
+
closed = false;
|
|
252
|
+
write(bytes) {
|
|
253
|
+
if (this.closed || bytes.byteLength === 0)
|
|
254
|
+
return;
|
|
255
|
+
if (this.length + bytes.byteLength > MAX_PROCESS_OUTPUT_BYTES) {
|
|
256
|
+
throw new Error("Python subprocess output pipe exceeded 16 MiB without being drained.");
|
|
257
|
+
}
|
|
258
|
+
this.chunks.push(bytes.slice());
|
|
259
|
+
this.length += bytes.byteLength;
|
|
260
|
+
this.wake();
|
|
261
|
+
}
|
|
262
|
+
close() {
|
|
263
|
+
if (this.closed)
|
|
264
|
+
return;
|
|
265
|
+
this.closed = true;
|
|
266
|
+
this.wake();
|
|
267
|
+
}
|
|
268
|
+
async read(maximum) {
|
|
269
|
+
while (this.length === 0 && !this.closed) {
|
|
270
|
+
await new Promise((resolve) => this.readers.push(resolve));
|
|
271
|
+
}
|
|
272
|
+
if (this.length === 0)
|
|
273
|
+
return { bytes: new Uint8Array(), eof: true };
|
|
274
|
+
const count = Math.min(maximum, this.length);
|
|
275
|
+
const bytes = new Uint8Array(count);
|
|
276
|
+
let offset = 0;
|
|
277
|
+
while (offset < count) {
|
|
278
|
+
const chunk = this.chunks[0];
|
|
279
|
+
const consumed = Math.min(chunk.byteLength, count - offset);
|
|
280
|
+
bytes.set(chunk.subarray(0, consumed), offset);
|
|
281
|
+
offset += consumed;
|
|
282
|
+
this.length -= consumed;
|
|
283
|
+
if (consumed === chunk.byteLength)
|
|
284
|
+
this.chunks.shift();
|
|
285
|
+
else
|
|
286
|
+
this.chunks[0] = chunk.subarray(consumed);
|
|
287
|
+
}
|
|
288
|
+
return { bytes, eof: this.closed && this.length === 0 };
|
|
289
|
+
}
|
|
290
|
+
wake() {
|
|
291
|
+
for (const reader of this.readers.splice(0))
|
|
292
|
+
reader();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
function validateRequest(command, cwd, env) {
|
|
296
|
+
if (!command || command.length > MAX_PROCESS_COMMAND_CHARS
|
|
297
|
+
|| !cwd.startsWith("/") || cwd.length > 16_384 || Object.keys(env).length > 256) {
|
|
298
|
+
throw new Error("Invalid Python subprocess request.");
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function complete(message, value) {
|
|
302
|
+
const control = new Int32Array(message.control);
|
|
303
|
+
const response = new Uint8Array(message.response);
|
|
304
|
+
let encoded = new TextEncoder().encode(JSON.stringify(value));
|
|
305
|
+
if (encoded.byteLength > response.byteLength) {
|
|
306
|
+
encoded = new TextEncoder().encode(JSON.stringify({ error: "Python subprocess response exceeds 16 MiB." }));
|
|
307
|
+
}
|
|
308
|
+
response.set(encoded);
|
|
309
|
+
Atomics.store(control, 1, encoded.byteLength);
|
|
310
|
+
Atomics.store(control, 0, 1);
|
|
311
|
+
Atomics.notify(control, 0);
|
|
312
|
+
}
|
|
313
|
+
function decode(value) {
|
|
314
|
+
const binary = atob(value);
|
|
315
|
+
return Uint8Array.from(binary, (character) => character.charCodeAt(0));
|
|
316
|
+
}
|
|
317
|
+
function encode(value) {
|
|
318
|
+
let binary = "";
|
|
319
|
+
for (let offset = 0; offset < value.byteLength; offset += 0x8000) {
|
|
320
|
+
binary += String.fromCharCode(...value.subarray(offset, offset + 0x8000));
|
|
321
|
+
}
|
|
322
|
+
return btoa(binary);
|
|
323
|
+
}
|
|
324
|
+
async function* oneChunk(value) { yield value; }
|
|
325
|
+
function errorMessage(cause) { return cause instanceof Error ? cause.message : String(cause); }
|
|
326
|
+
//# sourceMappingURL=process-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-host.js","sourceRoot":"","sources":["../src/process-host.ts"],"names":[],"mappings":"AAsBA,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACjD,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAClD,MAAM,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,4FAA4F;AAC5F,MAAM,OAAO,sBAAsB;IAQd;IACA;IARF,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACjD,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACpD,WAAW,GAAG,CAAC,CAAC;IAChB,MAAM,GAAG,CAAC,CAAC;IACX,MAAM,GAAG,KAAK,CAAC;IAEvB,YACmB,UAA6B,EAC7B,OAA+B;QAD/B,eAAU,GAAV,UAAU,CAAmB;QAC7B,YAAO,GAAP,OAAO,CAAwB;IAC/C,CAAC;IAEJ,OAAO,CAAC,OAAkC;QACxC,OAAO,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB;eACrE,OAAO,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,CAAC;IAC7E,CAAC;IAED,MAAM,CAAC,OAAuB;QAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,8BAA8B,EAAE,YAAY,CAAC,CAAC,CAAC;QACjH,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,+BAA+B,EAAE,YAAY,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;YACrB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,+BAA+B,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAEO,GAAG,CAAC,OAAyD;QACnE,IAAI,IAAI,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;YACxC,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACpD,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACzD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,OAAyD,EACzD,MAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,UAAU,GAAG,uBAAuB;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC3G,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE;gBAChD,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM;gBACN,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC,CAAC;YACH,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAA2D;QACvE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACzE,IAAI,IAAI,CAAC,MAAM,IAAI,oBAAoB;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACpG,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACtE,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACzE,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACpG,MAAM,KAAK,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAkB,CAAC;YACpE,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,MAAM,WAAW,GAAG,CAAC,MAAsC,EAAE,KAAa,EAAQ,EAAE;gBAClF,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACpB,IAAI,CAAC;oBAAC,MAAM,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAC,CAAC;gBACtD,OAAO,KAAK,EAAE,CAAC;oBACb,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACxB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC,CAAC;YACF,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE;gBAC9C,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;wBACnE,cAAc,GAAG,IAAI,CAAC;wBACtB,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC7B,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACT,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;wBACnE,cAAc,GAAG,IAAI,CAAC;wBACtB,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAC/D,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACV,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc;oBAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnF,IAAI,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc;oBAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;qBAC9F,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,cAAc;oBAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBACxF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC;YAC9D,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACb,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;gBAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;aACzC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;gBACtB,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;gBAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;gBAChB,MAAM,EAAE,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;gBACjB,OAAO,UAAU,CAAC;YACpB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAClC,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,OAA4D;QAC5E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,QAAQ,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC5E,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,KAAK,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBAChD,IAAI,KAAK,CAAC,UAAU,GAAG,uBAAuB;oBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC3G,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;oBACvD,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC3D,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBACzE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,GAAG,sBAAsB,EAAE,CAAC;oBACvF,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzC,QAAQ,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC/B,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;gBACrB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;gBACrB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,+BAA+B,EAAE,YAAY,CAAC,CAAC,CAAC;gBACxF,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBACrF,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACtC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,WAAW;gBAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACzE,IAAI,OAAO,CAAC,UAAU;gBAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;YAC1C,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AAED,MAAM,iBAAiB;IACJ,MAAM,GAAiB,EAAE,CAAC;IAC1B,OAAO,GAAuD,EAAE,CAAC;IAC1E,MAAM,GAAG,KAAK,CAAC;IAEvB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAwC,OAAO,IAAI,CAAC,CAAC,CAAC;IAE5E,IAAI;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,KAAiB;QACrB,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,MAAM;YAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;;YAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,CAAC;CACF;AAED,MAAM,kBAAkB;IACL,MAAM,GAAiB,EAAE,CAAC;IAC1B,OAAO,GAAsB,EAAE,CAAC;IACzC,MAAM,GAAG,CAAC,CAAC;IACX,MAAM,GAAG,KAAK,CAAC;IAEvB,KAAK,CAAC,KAAiB;QACrB,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC;YAAE,OAAO;QAClD,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,GAAG,wBAAwB,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,KAAK,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;YAC5D,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/C,MAAM,IAAI,QAAQ,CAAC;YACnB,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC;YACxB,IAAI,QAAQ,KAAK,KAAK,CAAC,UAAU;gBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;;gBAClD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC1D,CAAC;IAEO,IAAI;QACV,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,MAAM,EAAE,CAAC;IACxD,CAAC;CACF;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,GAAW,EAAE,GAA2B;IAChF,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,yBAAyB;WACrD,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,OAAwB,EAAE,KAAc;IACxD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC7C,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC,CAAC,CAAC;IAC9G,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,MAAM,CAAC,KAAiB;IAC/B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,MAAM,IAAI,MAAM,EAAE,CAAC;QACjE,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAiB,IAAgC,MAAM,KAAK,CAAC,CAAC,CAAC;AAExF,SAAS,YAAY,CAAC,KAAc,IAAY,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC"}
|