@ddse/acm-runtime 0.5.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 +393 -0
- package/dist/src/checkpoint.d.ts +97 -0
- package/dist/src/checkpoint.d.ts.map +1 -0
- package/dist/src/checkpoint.js +200 -0
- package/dist/src/checkpoint.js.map +1 -0
- package/dist/src/execution-transcript.d.ts +30 -0
- package/dist/src/execution-transcript.d.ts.map +1 -0
- package/dist/src/execution-transcript.js +70 -0
- package/dist/src/execution-transcript.js.map +1 -0
- package/dist/src/executor.d.ts +49 -0
- package/dist/src/executor.d.ts.map +1 -0
- package/dist/src/executor.js +390 -0
- package/dist/src/executor.js.map +1 -0
- package/dist/src/guards.d.ts +7 -0
- package/dist/src/guards.d.ts.map +1 -0
- package/dist/src/guards.js +13 -0
- package/dist/src/guards.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ledger.d.ts +12 -0
- package/dist/src/ledger.d.ts.map +1 -0
- package/dist/src/ledger.js +53 -0
- package/dist/src/ledger.js.map +1 -0
- package/dist/src/resumable-executor.d.ts +39 -0
- package/dist/src/resumable-executor.d.ts.map +1 -0
- package/dist/src/resumable-executor.js +354 -0
- package/dist/src/resumable-executor.js.map +1 -0
- package/dist/src/retry.d.ts +7 -0
- package/dist/src/retry.d.ts.map +1 -0
- package/dist/src/retry.js +25 -0
- package/dist/src/retry.js.map +1 -0
- package/dist/src/tool-envelope.d.ts +14 -0
- package/dist/src/tool-envelope.d.ts.map +1 -0
- package/dist/src/tool-envelope.js +84 -0
- package/dist/src/tool-envelope.js.map +1 -0
- package/dist/tests/resumable.test.d.ts +2 -0
- package/dist/tests/resumable.test.d.ts.map +1 -0
- package/dist/tests/resumable.test.js +337 -0
- package/dist/tests/resumable.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +29 -0
- package/src/checkpoint.ts +311 -0
- package/src/execution-transcript.ts +108 -0
- package/src/executor.ts +540 -0
- package/src/guards.ts +21 -0
- package/src/index.ts +9 -0
- package/src/ledger.ts +63 -0
- package/src/resumable-executor.ts +471 -0
- package/src/retry.ts +37 -0
- package/src/tool-envelope.ts +113 -0
- package/tests/resumable.test.ts +421 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema version for checkpoint compatibility
|
|
3
|
+
*/
|
|
4
|
+
export const CHECKPOINT_VERSION = '1.0.0';
|
|
5
|
+
/**
|
|
6
|
+
* Create a checkpoint from current execution state
|
|
7
|
+
*/
|
|
8
|
+
export function createCheckpoint(runId, state) {
|
|
9
|
+
const id = `checkpoint-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
10
|
+
return {
|
|
11
|
+
id,
|
|
12
|
+
runId,
|
|
13
|
+
ts: Date.now(),
|
|
14
|
+
version: CHECKPOINT_VERSION,
|
|
15
|
+
state: {
|
|
16
|
+
...state,
|
|
17
|
+
// Ensure executed is a plain array (not Set)
|
|
18
|
+
executed: Array.isArray(state.executed) ? state.executed : Array.from(state.executed),
|
|
19
|
+
// Deep clone to prevent mutation
|
|
20
|
+
outputs: JSON.parse(JSON.stringify(state.outputs)),
|
|
21
|
+
executionRecords: state.executionRecords
|
|
22
|
+
? JSON.parse(JSON.stringify(state.executionRecords))
|
|
23
|
+
: undefined,
|
|
24
|
+
ledger: JSON.parse(JSON.stringify(state.ledger)),
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate checkpoint compatibility
|
|
30
|
+
*/
|
|
31
|
+
export function validateCheckpoint(checkpoint) {
|
|
32
|
+
if (!checkpoint.version) {
|
|
33
|
+
console.warn('Checkpoint missing version field');
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const [major] = checkpoint.version.split('.');
|
|
37
|
+
const [currentMajor] = CHECKPOINT_VERSION.split('.');
|
|
38
|
+
if (major !== currentMajor) {
|
|
39
|
+
console.error(`Checkpoint version ${checkpoint.version} incompatible with current version ${CHECKPOINT_VERSION}`);
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
// Validate required fields
|
|
43
|
+
if (!checkpoint.id || !checkpoint.runId || !checkpoint.state) {
|
|
44
|
+
console.error('Checkpoint missing required fields');
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const { state } = checkpoint;
|
|
48
|
+
if (!state.goal || !state.context || !state.plan || !state.ledger) {
|
|
49
|
+
console.error('Checkpoint state missing required fields');
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* In-memory checkpoint store (for testing and simple use cases)
|
|
56
|
+
*/
|
|
57
|
+
export class MemoryCheckpointStore {
|
|
58
|
+
checkpoints = new Map();
|
|
59
|
+
async put(runId, checkpoint) {
|
|
60
|
+
if (!this.checkpoints.has(runId)) {
|
|
61
|
+
this.checkpoints.set(runId, []);
|
|
62
|
+
}
|
|
63
|
+
this.checkpoints.get(runId).push(checkpoint);
|
|
64
|
+
}
|
|
65
|
+
async get(runId, checkpointId) {
|
|
66
|
+
const checkpoints = this.checkpoints.get(runId);
|
|
67
|
+
if (!checkpoints || checkpoints.length === 0) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
if (checkpointId) {
|
|
71
|
+
return checkpoints.find(c => c.id === checkpointId) || null;
|
|
72
|
+
}
|
|
73
|
+
// Return latest checkpoint
|
|
74
|
+
return checkpoints[checkpoints.length - 1];
|
|
75
|
+
}
|
|
76
|
+
async list(runId) {
|
|
77
|
+
const checkpoints = this.checkpoints.get(runId) || [];
|
|
78
|
+
return checkpoints.map(c => ({
|
|
79
|
+
id: c.id,
|
|
80
|
+
runId: c.runId,
|
|
81
|
+
ts: c.ts,
|
|
82
|
+
version: c.version,
|
|
83
|
+
tasksCompleted: c.state.executed.length,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
async prune(runId, keepLast) {
|
|
87
|
+
const checkpoints = this.checkpoints.get(runId);
|
|
88
|
+
if (!checkpoints || checkpoints.length <= keepLast) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Sort by timestamp and keep only the last N
|
|
92
|
+
checkpoints.sort((a, b) => a.ts - b.ts);
|
|
93
|
+
this.checkpoints.set(runId, checkpoints.slice(-keepLast));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Clear all checkpoints (for testing)
|
|
97
|
+
*/
|
|
98
|
+
clear() {
|
|
99
|
+
this.checkpoints.clear();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* File-based checkpoint store
|
|
104
|
+
*/
|
|
105
|
+
export class FileCheckpointStore {
|
|
106
|
+
basePath;
|
|
107
|
+
constructor(basePath) {
|
|
108
|
+
this.basePath = basePath;
|
|
109
|
+
}
|
|
110
|
+
async put(runId, checkpoint) {
|
|
111
|
+
const fs = await import('fs/promises');
|
|
112
|
+
const path = await import('path');
|
|
113
|
+
const dirPath = path.join(this.basePath, runId);
|
|
114
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
115
|
+
const filePath = path.join(dirPath, `${checkpoint.id}.json`);
|
|
116
|
+
await fs.writeFile(filePath, JSON.stringify(checkpoint, null, 2), 'utf-8');
|
|
117
|
+
}
|
|
118
|
+
async get(runId, checkpointId) {
|
|
119
|
+
const fs = await import('fs/promises');
|
|
120
|
+
const path = await import('path');
|
|
121
|
+
const dirPath = path.join(this.basePath, runId);
|
|
122
|
+
try {
|
|
123
|
+
if (checkpointId) {
|
|
124
|
+
const filePath = path.join(dirPath, `${checkpointId}.json`);
|
|
125
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
126
|
+
return JSON.parse(content);
|
|
127
|
+
}
|
|
128
|
+
// Get latest checkpoint
|
|
129
|
+
const files = await fs.readdir(dirPath);
|
|
130
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
131
|
+
if (jsonFiles.length === 0) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
// Sort by timestamp in filename
|
|
135
|
+
jsonFiles.sort();
|
|
136
|
+
const latestFile = jsonFiles[jsonFiles.length - 1];
|
|
137
|
+
const filePath = path.join(dirPath, latestFile);
|
|
138
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
139
|
+
return JSON.parse(content);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
if (err.code === 'ENOENT') {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
throw err;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async list(runId) {
|
|
149
|
+
const fs = await import('fs/promises');
|
|
150
|
+
const path = await import('path');
|
|
151
|
+
const dirPath = path.join(this.basePath, runId);
|
|
152
|
+
try {
|
|
153
|
+
const files = await fs.readdir(dirPath);
|
|
154
|
+
const jsonFiles = files.filter(f => f.endsWith('.json'));
|
|
155
|
+
const metadata = [];
|
|
156
|
+
for (const file of jsonFiles) {
|
|
157
|
+
const filePath = path.join(dirPath, file);
|
|
158
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
159
|
+
const checkpoint = JSON.parse(content);
|
|
160
|
+
metadata.push({
|
|
161
|
+
id: checkpoint.id,
|
|
162
|
+
runId: checkpoint.runId,
|
|
163
|
+
ts: checkpoint.ts,
|
|
164
|
+
version: checkpoint.version,
|
|
165
|
+
tasksCompleted: checkpoint.state.executed.length,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return metadata.sort((a, b) => a.ts - b.ts);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
if (err.code === 'ENOENT') {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
throw err;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async prune(runId, keepLast) {
|
|
178
|
+
const fs = await import('fs/promises');
|
|
179
|
+
const path = await import('path');
|
|
180
|
+
const dirPath = path.join(this.basePath, runId);
|
|
181
|
+
try {
|
|
182
|
+
const metadata = await this.list(runId);
|
|
183
|
+
if (metadata.length <= keepLast) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// Delete oldest checkpoints
|
|
187
|
+
const toDelete = metadata.slice(0, metadata.length - keepLast);
|
|
188
|
+
for (const meta of toDelete) {
|
|
189
|
+
const filePath = path.join(dirPath, `${meta.id}.json`);
|
|
190
|
+
await fs.unlink(filePath);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
if (err.code !== 'ENOENT') {
|
|
195
|
+
throw err;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { StreamSink } from '@ddse/acm-sdk';
|
|
2
|
+
import type { MemoryLedger } from './ledger.js';
|
|
3
|
+
import type { TaskNarrative } from './executor.js';
|
|
4
|
+
export type ExecutionTranscriptEvent = {
|
|
5
|
+
type: 'nucleus-reasoning';
|
|
6
|
+
taskId?: string;
|
|
7
|
+
planId?: string;
|
|
8
|
+
reasoning: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'task-completed';
|
|
11
|
+
taskId: string;
|
|
12
|
+
output: any;
|
|
13
|
+
narrative?: TaskNarrative;
|
|
14
|
+
} | {
|
|
15
|
+
type: 'goal-summary';
|
|
16
|
+
goalId: string;
|
|
17
|
+
planId: string;
|
|
18
|
+
summary?: string;
|
|
19
|
+
};
|
|
20
|
+
export declare class ExecutionTranscript {
|
|
21
|
+
private stream?;
|
|
22
|
+
private onEvent?;
|
|
23
|
+
constructor(options?: {
|
|
24
|
+
stream?: StreamSink;
|
|
25
|
+
onEvent?: (event: ExecutionTranscriptEvent) => void;
|
|
26
|
+
});
|
|
27
|
+
attach(ledger: MemoryLedger): void;
|
|
28
|
+
private handleEntry;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=execution-transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-transcript.d.ts","sourceRoot":"","sources":["../../src/execution-transcript.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,wBAAwB,GAChC;IACE,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAQN,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,OAAO,CAAC,CAA4C;gBAEhD,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,CAAA;KAAO;IAKtG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAmBlC,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export class ExecutionTranscript {
|
|
2
|
+
stream;
|
|
3
|
+
onEvent;
|
|
4
|
+
constructor(options = {}) {
|
|
5
|
+
this.stream = options.stream;
|
|
6
|
+
this.onEvent = options.onEvent;
|
|
7
|
+
}
|
|
8
|
+
attach(ledger) {
|
|
9
|
+
const target = ledger;
|
|
10
|
+
if (!target.__executionTranscriptHandlers) {
|
|
11
|
+
target.__executionTranscriptHandlers = [];
|
|
12
|
+
const originalAppend = ledger.append.bind(ledger);
|
|
13
|
+
ledger.append = (type, details, computeDigest = true) => {
|
|
14
|
+
const entry = originalAppend(type, details, computeDigest);
|
|
15
|
+
for (const handler of target.__executionTranscriptHandlers) {
|
|
16
|
+
handler(entry);
|
|
17
|
+
}
|
|
18
|
+
return entry;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
target.__executionTranscriptHandlers.push(entry => this.handleEntry(entry));
|
|
22
|
+
}
|
|
23
|
+
handleEntry(entry) {
|
|
24
|
+
const event = mapLedgerEntry(entry);
|
|
25
|
+
if (!event) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.stream?.emit('transcript', event);
|
|
29
|
+
this.onEvent?.(event);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function mapLedgerEntry(entry) {
|
|
33
|
+
switch (entry.type) {
|
|
34
|
+
case 'NUCLEUS_INFERENCE': {
|
|
35
|
+
const reasoning = typeof entry.details?.reasoning === 'string' ? entry.details.reasoning.trim() : '';
|
|
36
|
+
if (!reasoning) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
type: 'nucleus-reasoning',
|
|
41
|
+
taskId: entry.details?.nucleus?.taskId,
|
|
42
|
+
planId: entry.details?.nucleus?.planId,
|
|
43
|
+
reasoning,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
case 'TASK_END': {
|
|
47
|
+
const taskId = entry.details?.taskId;
|
|
48
|
+
if (!taskId) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
type: 'task-completed',
|
|
53
|
+
taskId,
|
|
54
|
+
output: entry.details?.output,
|
|
55
|
+
narrative: entry.details?.narrative,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
case 'GOAL_SUMMARY': {
|
|
59
|
+
return {
|
|
60
|
+
type: 'goal-summary',
|
|
61
|
+
goalId: entry.details?.goalId,
|
|
62
|
+
planId: entry.details?.planId,
|
|
63
|
+
summary: entry.details?.summary,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
default:
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=execution-transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-transcript.js","sourceRoot":"","sources":["../../src/execution-transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type CapabilityRegistry, type Context, type Goal, type LedgerEntry, ExternalContextProviderAdapter, type NucleusConfig, type NucleusFactory, type PostcheckResult, type Plan, type PolicyEngine, type StreamSink, type ToolRegistry } from '@ddse/acm-sdk';
|
|
2
|
+
import { MemoryLedger } from './ledger.js';
|
|
3
|
+
export type TaskNarrative = {
|
|
4
|
+
reasoning?: string[];
|
|
5
|
+
postcheck?: {
|
|
6
|
+
status: PostcheckResult['status'];
|
|
7
|
+
reason?: string;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export type TaskExecutionRecord = {
|
|
11
|
+
output: any;
|
|
12
|
+
narrative?: TaskNarrative;
|
|
13
|
+
};
|
|
14
|
+
export type ExecutePlanOptions = {
|
|
15
|
+
goal: Goal;
|
|
16
|
+
context: Context;
|
|
17
|
+
plan: Plan;
|
|
18
|
+
capabilityRegistry: CapabilityRegistry;
|
|
19
|
+
toolRegistry: ToolRegistry;
|
|
20
|
+
policy?: PolicyEngine;
|
|
21
|
+
verify?: (taskId: string, output: any, expressions: string[]) => Promise<boolean>;
|
|
22
|
+
stream?: StreamSink;
|
|
23
|
+
ledger?: MemoryLedger;
|
|
24
|
+
nucleusFactory: NucleusFactory;
|
|
25
|
+
nucleusConfig: {
|
|
26
|
+
llmCall: NucleusConfig['llmCall'];
|
|
27
|
+
hooks?: NucleusConfig['hooks'];
|
|
28
|
+
allowedTools?: string[];
|
|
29
|
+
};
|
|
30
|
+
contextProvider?: ExternalContextProviderAdapter;
|
|
31
|
+
};
|
|
32
|
+
export type ExecutePlanResult = {
|
|
33
|
+
outputsByTask: Record<string, TaskExecutionRecord>;
|
|
34
|
+
ledger: readonly LedgerEntry[];
|
|
35
|
+
goalSummary?: string;
|
|
36
|
+
};
|
|
37
|
+
export declare function executePlan(options: ExecutePlanOptions): Promise<ExecutePlanResult>;
|
|
38
|
+
export declare function buildTaskNarrative(ledger: MemoryLedger, baselineIndex: number, taskId: string, postcheck: PostcheckResult): TaskNarrative | undefined;
|
|
39
|
+
export declare function synthesizeGoalSummary(options: {
|
|
40
|
+
goal: Goal;
|
|
41
|
+
plan: Plan;
|
|
42
|
+
executionRecords: Record<string, TaskExecutionRecord>;
|
|
43
|
+
context: Context;
|
|
44
|
+
nucleusFactory: NucleusFactory;
|
|
45
|
+
nucleusConfig: ExecutePlanOptions['nucleusConfig'];
|
|
46
|
+
ledger: MemoryLedger;
|
|
47
|
+
stream?: StreamSink;
|
|
48
|
+
}): Promise<string | undefined>;
|
|
49
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/executor.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,OAAO,EACZ,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,8BAA8B,EAC9B,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,IAAI,EACT,KAAK,YAAY,EAEjB,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE;QACV,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE;QACb,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;QAClC,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,eAAe,CAAC,EAAE,8BAA8B,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACnD,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiTzF;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,eAAe,GACzB,aAAa,GAAG,SAAS,CA0B3B;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2D9B"}
|