@yefengr/remote-pi 0.7.9 → 0.7.11
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/dist/actions/session_new_bridge.d.ts +35 -0
- package/dist/actions/session_new_bridge.js +88 -0
- package/dist/actions/session_new_bridge.js.map +1 -0
- package/dist/bin/supervisord.js +1 -8
- package/dist/bin/supervisord.js.map +1 -1
- package/dist/daemon/commands.d.ts +5 -2
- package/dist/daemon/commands.js +22 -6
- package/dist/daemon/commands.js.map +1 -1
- package/dist/daemon/rpc_child.d.ts +3 -8
- package/dist/daemon/rpc_child.js +27 -17
- package/dist/daemon/rpc_child.js.map +1 -1
- package/dist/daemon/status.js +1 -1
- package/dist/daemon/status.js.map +1 -1
- package/dist/daemon/supervisor.d.ts +6 -6
- package/dist/daemon/supervisor.js +164 -133
- package/dist/daemon/supervisor.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +100 -191
- package/dist/index.js.map +1 -1
- package/dist/pairing/qr.d.ts +2 -2
- package/dist/pairing/qr.js +11 -3
- package/dist/pairing/qr.js.map +1 -1
- package/dist/runtime/relay_lifecycle.d.ts +58 -0
- package/dist/runtime/relay_lifecycle.js +241 -0
- package/dist/runtime/relay_lifecycle.js.map +1 -0
- package/dist/transport/relay_client.d.ts +13 -0
- package/dist/transport/relay_client.js +163 -38
- package/dist/transport/relay_client.js.map +1 -1
- package/docs/daemon.md +3 -1
- package/package.json +5 -3
- package/dist/daemon/preflight.d.ts +0 -51
- package/dist/daemon/preflight.js +0 -136
- package/dist/daemon/preflight.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yefengr/remote-pi",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.11",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -70,6 +70,7 @@
|
|
|
70
70
|
]
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
|
+
"@earendil-works/pi-coding-agent": "0.84.4",
|
|
73
74
|
"@types/node": "^25.8.0",
|
|
74
75
|
"@types/ws": "^8.18.1",
|
|
75
76
|
"tsx": "^4.22.0",
|
|
@@ -77,9 +78,10 @@
|
|
|
77
78
|
"vite": "^8.0.16",
|
|
78
79
|
"vitest": "^4.1.6"
|
|
79
80
|
},
|
|
81
|
+
"peerDependencies": {
|
|
82
|
+
"@earendil-works/pi-coding-agent": "*"
|
|
83
|
+
},
|
|
80
84
|
"dependencies": {
|
|
81
|
-
"@earendil-works/pi-coding-agent": "^0.79.10",
|
|
82
|
-
"@earendil-works/pi-tui": "^0.79.10",
|
|
83
85
|
"@napi-rs/keyring": "^1.3.0",
|
|
84
86
|
"@noble/ed25519": "^3.1.0",
|
|
85
87
|
"croner": "^10.0.1",
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { type AgentSessionRuntimeDiagnostic, type Extension } from "@earendil-works/pi-coding-agent";
|
|
2
|
-
export type PreflightBlockedCode = "remote_pi_extension_missing" | "duplicate_remote_pi_extension" | "extension_diagnostic" | "preflight_failed";
|
|
3
|
-
export type DaemonPreflightResult = {
|
|
4
|
-
ok: true;
|
|
5
|
-
} | {
|
|
6
|
-
ok: false;
|
|
7
|
-
code: PreflightBlockedCode;
|
|
8
|
-
message: string;
|
|
9
|
-
/** Safe package identities only; never raw paths, URLs, or diagnostics. */
|
|
10
|
-
sources?: string[];
|
|
11
|
-
};
|
|
12
|
-
export interface PreflightServices {
|
|
13
|
-
diagnostics: readonly AgentSessionRuntimeDiagnostic[];
|
|
14
|
-
resourceLoader: {
|
|
15
|
-
getExtensions(): {
|
|
16
|
-
extensions: readonly Extension[];
|
|
17
|
-
errors: readonly {
|
|
18
|
-
path: string;
|
|
19
|
-
error: string;
|
|
20
|
-
}[];
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
|
-
settingsManager?: {
|
|
24
|
-
drainErrors(): readonly unknown[];
|
|
25
|
-
};
|
|
26
|
-
modelRegistry?: {
|
|
27
|
-
getError(): string | undefined;
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
export interface DaemonPreflightOptions {
|
|
31
|
-
cwd: string;
|
|
32
|
-
agentDir?: string;
|
|
33
|
-
/** Tests inject discovery; production always uses Pi's SDK service factory. */
|
|
34
|
-
discover?: (options: {
|
|
35
|
-
cwd: string;
|
|
36
|
-
agentDir: string;
|
|
37
|
-
}) => Promise<PreflightServices>;
|
|
38
|
-
/** Tests may substitute the installed Remote Pi package root. */
|
|
39
|
-
packageRoot?: string;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Classifies already-discovered Pi services. Kept pure with injected service
|
|
43
|
-
* data so source identity and blocked-state rules have deterministic tests.
|
|
44
|
-
*/
|
|
45
|
-
export declare function evaluateDaemonPreflight(services: PreflightServices, packageRoot?: string): DaemonPreflightResult;
|
|
46
|
-
/**
|
|
47
|
-
* Runs the same SettingsManager/package/resource discovery Pi performs before
|
|
48
|
-
* RPC startup. It creates services only: no AgentSession or model runtime is
|
|
49
|
-
* created, and the SDK exposes no service-level dispose operation to call.
|
|
50
|
-
*/
|
|
51
|
-
export declare function runDaemonPreflight(options: DaemonPreflightOptions): Promise<DaemonPreflightResult>;
|
package/dist/daemon/preflight.js
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
-
import { dirname, relative, resolve } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { createAgentSessionServices, getAgentDir, } from "@earendil-works/pi-coding-agent";
|
|
5
|
-
const REMOTE_PI_PACKAGE = "@yefengr/remote-pi";
|
|
6
|
-
let offlineDiscoveryDepth = 0;
|
|
7
|
-
let previousOfflineValue;
|
|
8
|
-
/**
|
|
9
|
-
* Pi 0.79's resource loader can install missing configured packages unless
|
|
10
|
-
* PI_OFFLINE is set. The guard is reference-counted because supervisors can
|
|
11
|
-
* preflight separate entries concurrently. Discovery remains local-only.
|
|
12
|
-
*/
|
|
13
|
-
async function withOfflineDiscovery(action) {
|
|
14
|
-
if (offlineDiscoveryDepth === 0) {
|
|
15
|
-
previousOfflineValue = process.env["PI_OFFLINE"];
|
|
16
|
-
process.env["PI_OFFLINE"] = "1";
|
|
17
|
-
}
|
|
18
|
-
offlineDiscoveryDepth += 1;
|
|
19
|
-
try {
|
|
20
|
-
return await action();
|
|
21
|
-
}
|
|
22
|
-
finally {
|
|
23
|
-
offlineDiscoveryDepth -= 1;
|
|
24
|
-
if (offlineDiscoveryDepth === 0) {
|
|
25
|
-
if (previousOfflineValue === undefined)
|
|
26
|
-
delete process.env["PI_OFFLINE"];
|
|
27
|
-
else
|
|
28
|
-
process.env["PI_OFFLINE"] = previousOfflineValue;
|
|
29
|
-
previousOfflineValue = undefined;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function packageNameAt(path) {
|
|
34
|
-
let current = path;
|
|
35
|
-
try {
|
|
36
|
-
if (!statSync(current).isDirectory())
|
|
37
|
-
current = dirname(current);
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
current = dirname(current);
|
|
41
|
-
}
|
|
42
|
-
while (true) {
|
|
43
|
-
const manifest = resolve(current, "package.json");
|
|
44
|
-
if (existsSync(manifest)) {
|
|
45
|
-
try {
|
|
46
|
-
const parsed = JSON.parse(readFileSync(manifest, "utf8"));
|
|
47
|
-
return typeof parsed.name === "string" ? parsed.name : undefined;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
const parent = dirname(current);
|
|
54
|
-
if (parent === current)
|
|
55
|
-
return undefined;
|
|
56
|
-
current = parent;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
function isRemotePiPackageSource(source) {
|
|
60
|
-
if (!source)
|
|
61
|
-
return false;
|
|
62
|
-
const spec = source.startsWith("npm:") ? source.slice("npm:".length) : source;
|
|
63
|
-
return spec === REMOTE_PI_PACKAGE || spec.startsWith(`${REMOTE_PI_PACKAGE}@`);
|
|
64
|
-
}
|
|
65
|
-
function isPathWithin(path, root) {
|
|
66
|
-
const child = resolve(path);
|
|
67
|
-
const parent = resolve(root);
|
|
68
|
-
const remainder = relative(parent, child);
|
|
69
|
-
return remainder === "" || (!remainder.startsWith("..") && !remainder.includes("../"));
|
|
70
|
-
}
|
|
71
|
-
function installedPackageRoot() {
|
|
72
|
-
return resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
73
|
-
}
|
|
74
|
-
function isRemotePiExtension(extension, packageRoot) {
|
|
75
|
-
if (isRemotePiPackageSource(extension.sourceInfo.source))
|
|
76
|
-
return true;
|
|
77
|
-
if (extension.sourceInfo.baseDir && packageNameAt(extension.sourceInfo.baseDir) === REMOTE_PI_PACKAGE)
|
|
78
|
-
return true;
|
|
79
|
-
if (packageNameAt(extension.resolvedPath) === REMOTE_PI_PACKAGE)
|
|
80
|
-
return true;
|
|
81
|
-
return isPathWithin(extension.resolvedPath, packageRoot) && packageNameAt(packageRoot) === REMOTE_PI_PACKAGE;
|
|
82
|
-
}
|
|
83
|
-
function safeSource(extension) {
|
|
84
|
-
const scope = extension.sourceInfo.scope === "project" || extension.sourceInfo.scope === "user"
|
|
85
|
-
? extension.sourceInfo.scope
|
|
86
|
-
: "temporary";
|
|
87
|
-
return `${scope}:package:${REMOTE_PI_PACKAGE}`;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Classifies already-discovered Pi services. Kept pure with injected service
|
|
91
|
-
* data so source identity and blocked-state rules have deterministic tests.
|
|
92
|
-
*/
|
|
93
|
-
export function evaluateDaemonPreflight(services, packageRoot = installedPackageRoot()) {
|
|
94
|
-
const extensions = services.resourceLoader.getExtensions();
|
|
95
|
-
const diagnosticErrors = services.diagnostics.filter((diagnostic) => diagnostic.type === "error");
|
|
96
|
-
if (extensions.errors.length > 0 || diagnosticErrors.length > 0) {
|
|
97
|
-
return {
|
|
98
|
-
ok: false,
|
|
99
|
-
code: "extension_diagnostic",
|
|
100
|
-
message: `Pi reported ${extensions.errors.length + diagnosticErrors.length} extension diagnostic error(s)`,
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
if ((services.settingsManager?.drainErrors().length ?? 0) > 0 || services.modelRegistry?.getError()) {
|
|
104
|
-
return { ok: false, code: "preflight_failed", message: "Pi settings or model configuration is invalid" };
|
|
105
|
-
}
|
|
106
|
-
const remoteExtensions = extensions.extensions.filter((extension) => isRemotePiExtension(extension, packageRoot));
|
|
107
|
-
if (remoteExtensions.length === 0) {
|
|
108
|
-
return { ok: false, code: "remote_pi_extension_missing", message: "No configured Remote Pi Extension was discovered" };
|
|
109
|
-
}
|
|
110
|
-
if (remoteExtensions.length > 1) {
|
|
111
|
-
return {
|
|
112
|
-
ok: false,
|
|
113
|
-
code: "duplicate_remote_pi_extension",
|
|
114
|
-
message: `Found ${remoteExtensions.length} configured Remote Pi Extension sources`,
|
|
115
|
-
sources: remoteExtensions.map(safeSource),
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
return { ok: true };
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Runs the same SettingsManager/package/resource discovery Pi performs before
|
|
122
|
-
* RPC startup. It creates services only: no AgentSession or model runtime is
|
|
123
|
-
* created, and the SDK exposes no service-level dispose operation to call.
|
|
124
|
-
*/
|
|
125
|
-
export async function runDaemonPreflight(options) {
|
|
126
|
-
try {
|
|
127
|
-
const agentDir = options.agentDir ?? getAgentDir();
|
|
128
|
-
const discover = options.discover ?? (async ({ cwd, agentDir: resolvedAgentDir }) => createAgentSessionServices({ cwd, agentDir: resolvedAgentDir }));
|
|
129
|
-
const services = await withOfflineDiscovery(() => discover({ cwd: options.cwd, agentDir }));
|
|
130
|
-
return evaluateDaemonPreflight(services, options.packageRoot);
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
return { ok: false, code: "preflight_failed", message: "Pi SDK resource discovery failed" };
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=preflight.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/daemon/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,WAAW,GAIZ,MAAM,iCAAiC,CAAC;AAEzC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAuC/C,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAC9B,IAAI,oBAAwC,CAAC;AAE7C;;;;GAIG;AACH,KAAK,UAAU,oBAAoB,CAAI,MAAwB;IAC7D,IAAI,qBAAqB,KAAK,CAAC,EAAE,CAAC;QAChC,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC;IAClC,CAAC;IACD,qBAAqB,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,qBAAqB,IAAI,CAAC,CAAC;QAC3B,IAAI,qBAAqB,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,oBAAoB,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;;gBACpE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAAC;YACtD,oBAAoB,GAAG,SAAS,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAuB,CAAC;gBAChF,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YACnE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,MAA0B;IACzD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,OAAO,IAAI,KAAK,iBAAiB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,iBAAiB,GAAG,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,SAAS,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAoB,EAAE,WAAmB;IACpE,IAAI,uBAAuB,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,IAAI,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IACnH,IAAI,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO,YAAY,CAAC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC,KAAK,iBAAiB,CAAC;AAC/G,CAAC;AAED,SAAS,UAAU,CAAC,SAAoB;IACtC,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,KAAK,MAAM;QAC7F,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK;QAC5B,CAAC,CAAC,WAAW,CAAC;IAChB,OAAO,GAAG,KAAK,YAAY,iBAAiB,EAAE,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAA2B,EAAE,WAAW,GAAG,oBAAoB,EAAE;IACvG,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;IAC3D,MAAM,gBAAgB,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAClG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,eAAe,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,gCAAgC;SAC3G,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC;QACpG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,+CAA+C,EAAE,CAAC;IAC3G,CAAC;IAED,MAAM,gBAAgB,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAClH,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,kDAAkD,EAAE,CAAC;IACzH,CAAC;IACD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,+BAA+B;YACrC,OAAO,EAAE,SAAS,gBAAgB,CAAC,MAAM,yCAAyC;YAClF,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;SAC1C,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA+B;IACtE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAClF,0BAA0B,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;IAC9F,CAAC;AACH,CAAC"}
|