@osovv/vv-opencode 1.3.8 → 1.4.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/CHANGELOG.md +8 -0
- package/README.md +42 -2
- package/dist/commands/completion.js +10 -2
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/patch-provider.d.ts +97 -1
- package/dist/commands/patch-provider.js +97 -5
- package/dist/commands/patch-provider.js.map +1 -1
- package/dist/lib/orchestration.d.ts +2 -2
- package/dist/lib/orchestration.js +31 -2
- package/dist/lib/orchestration.js.map +1 -1
- package/dist/lib/spec-lint.d.ts +71 -1
- package/dist/lib/spec-lint.js +566 -8
- package/dist/lib/spec-lint.js.map +1 -1
- package/dist/lib/vvoc-config.d.ts +3 -3
- package/dist/lib/vvoc-preset-registry.d.ts +25 -1
- package/dist/lib/vvoc-preset-registry.js +22 -2
- package/dist/lib/vvoc-preset-registry.js.map +1 -1
- package/dist/plugins/hashline-edit/index.js.map +1 -1
- package/dist/plugins/workflow/checkpoint-io.d.ts +33 -0
- package/dist/plugins/workflow/checkpoint-io.js +224 -0
- package/dist/plugins/workflow/checkpoint-io.js.map +1 -0
- package/dist/plugins/workflow/checkpoints.d.ts +182 -0
- package/dist/plugins/workflow/checkpoints.js +1067 -0
- package/dist/plugins/workflow/checkpoints.js.map +1 -0
- package/dist/plugins/workflow/delegated.d.ts +158 -0
- package/dist/plugins/workflow/delegated.js +613 -0
- package/dist/plugins/workflow/delegated.js.map +1 -0
- package/dist/plugins/workflow/index.js +368 -20
- package/dist/plugins/workflow/index.js.map +1 -1
- package/dist/plugins/workflow/persistence.d.ts +32 -3
- package/dist/plugins/workflow/persistence.js +497 -70
- package/dist/plugins/workflow/persistence.js.map +1 -1
- package/dist/plugins/workflow/repair.js +3 -1
- package/dist/plugins/workflow/repair.js.map +1 -1
- package/dist/plugins/workflow/snapshots.d.ts +59 -0
- package/dist/plugins/workflow/snapshots.js +261 -0
- package/dist/plugins/workflow/snapshots.js.map +1 -0
- package/dist/plugins/workflow/state.d.ts +20 -2
- package/dist/plugins/workflow/state.js +127 -12
- package/dist/plugins/workflow/state.js.map +1 -1
- package/dist/plugins/workflow/tooling.d.ts +45 -0
- package/dist/plugins/workflow/tooling.js +344 -12
- package/dist/plugins/workflow/tooling.js.map +1 -1
- package/dist/plugins/workflow/transitions.js +2 -2
- package/dist/plugins/workflow/transitions.js.map +1 -1
- package/dist/tui/context/analyze.js +3 -1
- package/dist/tui/context/analyze.js.map +1 -1
- package/package.json +1 -1
- package/schemas/vvoc/v3.json +5 -3
- package/templates/agents/vv-code-reviewer.md +3 -1
- package/templates/agents/vv-implementer.md +5 -2
- package/templates/agents/vv-spec-reviewer.md +3 -0
- package/templates/skills/vv-execute/SKILL.md +62 -15
- package/templates/skills/vv-plan/SKILL.md +13 -3
- package/templates/skills/vv-plan/references/plan-template.xml +45 -0
- package/templates/skills/vv-review/SKILL.md +1 -0
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
// FILE: src/plugins/workflow/delegated.ts
|
|
2
|
+
// VERSION: 1.0.0
|
|
3
|
+
// START_MODULE_CONTRACT
|
|
4
|
+
// PURPOSE: Delegated work-item attempt ledger and explicit controller acceptance decisions with a checkpoint-authorized rework path.
|
|
5
|
+
// SCOPE: Delegated attempt allocation bound to host callIDs, call-bound result application, bounded controller decisions (accept / request_changes with rationale, evidence, and concerns disposition), acceptance history with rework revocation, and the two-attempt budget extended only by authorized rework. Pure domain transitions over WorkItemStoreData; no tool, session, or filesystem authorization here.
|
|
6
|
+
// DEPENDS: [src/plugins/workflow/protocol.ts (types), src/plugins/workflow/state.ts (types and shared helpers), src/plugins/workflow/transitions.ts]
|
|
7
|
+
// LINKS: [M-WORKFLOW-DELEGATED, M-WORKFLOW-STATE, M-WORKFLOW-TRANSITIONS, M-WORKFLOW-CHECKPOINTS, V-M-WORKFLOW-DELEGATED]
|
|
8
|
+
// ROLE: RUNTIME
|
|
9
|
+
// MAP_MODE: EXPORTS
|
|
10
|
+
// END_MODULE_CONTRACT
|
|
11
|
+
//
|
|
12
|
+
// START_MODULE_MAP
|
|
13
|
+
// DELEGATED_BASE_ATTEMPTS - Initial controller-directed implementation attempt budget (initial plus one correction).
|
|
14
|
+
// DELEGATED_RATIONALE_MAX_CHARS - Maximum accepted rationale length.
|
|
15
|
+
// DELEGATED_EVIDENCE_MAX_CHARS - Maximum accepted single evidence-reference length.
|
|
16
|
+
// DELEGATED_EVIDENCE_MAX_REFS - Maximum accepted evidence-reference count.
|
|
17
|
+
// DelegatedImplementerStatus - Implementer result statuses recordable on an attempt.
|
|
18
|
+
// DelegatedAttemptStatus - Attempt lifecycle statuses (in_flight, completed).
|
|
19
|
+
// DelegatedAttempt - One host-callID-bound implementation attempt.
|
|
20
|
+
// DelegatedDecisionRecord - One recorded controller decision bound to an attempt.
|
|
21
|
+
// DelegatedAcceptanceRecord - One acceptance with optional later revocation.
|
|
22
|
+
// DelegatedReworkRecord - One checkpoint-authorized rework event.
|
|
23
|
+
// DelegatedWorkItemState - Full delegated-mode record extension.
|
|
24
|
+
// DelegatedWriteScopeValidation - Result of validating declared write-scope text inputs.
|
|
25
|
+
// BeginDelegatedLaunchInput - Delegated launch input with session, item, and host callID.
|
|
26
|
+
// BeginDelegatedLaunchResult - Launch allocation outcome.
|
|
27
|
+
// ApplyDelegatedResultInput - Call-bound delegated result payload.
|
|
28
|
+
// ApplyDelegatedResultResult - Result application outcome.
|
|
29
|
+
// DecideDelegatedWorkItemInput - Controller decision payload with attempt identity and bounded text.
|
|
30
|
+
// DecideDelegatedWorkItemResult - Controller decision outcome.
|
|
31
|
+
// ReworkDelegatedWorkItemInput - Checkpoint-authorized rework request.
|
|
32
|
+
// ReworkDelegatedWorkItemResult - Authorized rework outcome.
|
|
33
|
+
// delegatedAttemptBudget - Allowed attempt count given consumed attempts and rework history.
|
|
34
|
+
// currentDelegatedAcceptance - Currently applicable acceptance for a record.
|
|
35
|
+
// DelegatedDecisionInputValidation - Shape accepted by validateDelegatedDecisionInput.
|
|
36
|
+
// validateDelegatedWriteScope - Validates declared write-scope text into canonical normalized paths.
|
|
37
|
+
// validateDelegatedDecisionInput - Pure validation of decision text bounds.
|
|
38
|
+
// beginDelegatedLaunch - Allocate and bind one implementation attempt to a host callID.
|
|
39
|
+
// beginDelegatedLaunchInStore - Store-level delegated launch allocation.
|
|
40
|
+
// revertInFlightDelegatedLaunches - Reclaim attempts orphaned by a process restart boundary.
|
|
41
|
+
// applyDelegatedResult - Apply one implementer result to its matching in-flight attempt.
|
|
42
|
+
// applyDelegatedResultInStore - Store-level delegated result application.
|
|
43
|
+
// decideDelegatedWorkItem - Record an explicit controller accept/request_changes decision.
|
|
44
|
+
// decideDelegatedWorkItemInStore - Store-level controller decision.
|
|
45
|
+
// reworkDelegatedWorkItem - Reopen an accepted item under validated checkpoint-failure authorization.
|
|
46
|
+
// reworkDelegatedWorkItemInStore - Store-level guarded rework reducer.
|
|
47
|
+
// END_MODULE_MAP
|
|
48
|
+
//
|
|
49
|
+
// START_CHANGE_SUMMARY
|
|
50
|
+
// LAST_CHANGE: [C-DELEGATED-WORKFLOW-ASTRA-PRESETS - Initial module: callID-bound attempts, two-attempt budget, explicit acceptance decisions, and guarded rework.]
|
|
51
|
+
// END_CHANGE_SUMMARY
|
|
52
|
+
import { cloneRecord, createRecordLookupKey } from "./state.js";
|
|
53
|
+
import { getAllowedNextAgents } from "./transitions.js";
|
|
54
|
+
import { normalizeDeclaredScopePath } from "../../lib/spec-lint.js";
|
|
55
|
+
// START_BLOCK_DELEGATED_TYPES
|
|
56
|
+
export const DELEGATED_BASE_ATTEMPTS = 2;
|
|
57
|
+
export const DELEGATED_RATIONALE_MAX_CHARS = 2000;
|
|
58
|
+
export const DELEGATED_EVIDENCE_MAX_CHARS = 512;
|
|
59
|
+
export const DELEGATED_EVIDENCE_MAX_REFS = 8;
|
|
60
|
+
// END_BLOCK_DELEGATED_TYPES
|
|
61
|
+
// START_BLOCK_DELEGATED_HELPERS
|
|
62
|
+
function toIsoNow() {
|
|
63
|
+
return new Date().toISOString();
|
|
64
|
+
}
|
|
65
|
+
/** Allowed attempt count: the base budget plus one per authorized rework event. */
|
|
66
|
+
export function delegatedAttemptBudget(state) {
|
|
67
|
+
return DELEGATED_BASE_ATTEMPTS + state.reworkHistory.length;
|
|
68
|
+
}
|
|
69
|
+
/** Currently applicable acceptance for a record: the latest unrevoked acceptance. */
|
|
70
|
+
export function currentDelegatedAcceptance(record) {
|
|
71
|
+
if (!record.delegated)
|
|
72
|
+
return undefined;
|
|
73
|
+
return [...record.delegated.acceptances].reverse().find((acceptance) => !acceptance.revokedAt);
|
|
74
|
+
}
|
|
75
|
+
/** Validate declared write-scope text inputs into canonical normalized paths. */
|
|
76
|
+
export function validateDelegatedWriteScope(paths) {
|
|
77
|
+
if (!Array.isArray(paths) || paths.length === 0) {
|
|
78
|
+
return {
|
|
79
|
+
ok: false,
|
|
80
|
+
message: "writeScope must be a non-empty array of workspace-relative files",
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const normalized = [];
|
|
84
|
+
const seen = new Set();
|
|
85
|
+
for (const declared of paths) {
|
|
86
|
+
const result = normalizeDeclaredScopePath(String(declared));
|
|
87
|
+
if (!result.ok) {
|
|
88
|
+
return {
|
|
89
|
+
ok: false,
|
|
90
|
+
message: `writeScope path ${JSON.stringify(String(declared))} is malformed (${result.reason})`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (seen.has(result.path)) {
|
|
94
|
+
return {
|
|
95
|
+
ok: false,
|
|
96
|
+
message: `writeScope path ${JSON.stringify(result.path)} is declared more than once`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
seen.add(result.path);
|
|
100
|
+
normalized.push(result.path);
|
|
101
|
+
}
|
|
102
|
+
return { ok: true, paths: normalized };
|
|
103
|
+
}
|
|
104
|
+
/** Pure validation of decision text bounds shared by the tool layer and domain layer. */
|
|
105
|
+
export function validateDelegatedDecisionInput(input) {
|
|
106
|
+
const rationale = typeof input.rationale === "string" ? input.rationale.trim() : "";
|
|
107
|
+
if (rationale === "") {
|
|
108
|
+
return { ok: false, message: "rationale must be a non-empty string" };
|
|
109
|
+
}
|
|
110
|
+
if (rationale.length > DELEGATED_RATIONALE_MAX_CHARS) {
|
|
111
|
+
return { ok: false, message: `rationale exceeds ${DELEGATED_RATIONALE_MAX_CHARS} characters` };
|
|
112
|
+
}
|
|
113
|
+
if (!Array.isArray(input.evidence) || input.evidence.length === 0) {
|
|
114
|
+
return { ok: false, message: "evidence must be a non-empty array of reference strings" };
|
|
115
|
+
}
|
|
116
|
+
if (input.evidence.length > DELEGATED_EVIDENCE_MAX_REFS) {
|
|
117
|
+
return { ok: false, message: `evidence exceeds ${DELEGATED_EVIDENCE_MAX_REFS} references` };
|
|
118
|
+
}
|
|
119
|
+
for (const reference of input.evidence) {
|
|
120
|
+
const normalized = typeof reference === "string" ? reference.trim() : "";
|
|
121
|
+
if (normalized === "") {
|
|
122
|
+
return { ok: false, message: "evidence references must be non-empty strings" };
|
|
123
|
+
}
|
|
124
|
+
if (normalized.length > DELEGATED_EVIDENCE_MAX_CHARS) {
|
|
125
|
+
return {
|
|
126
|
+
ok: false,
|
|
127
|
+
message: `evidence reference exceeds ${DELEGATED_EVIDENCE_MAX_CHARS} characters`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (input.concernsDisposition !== undefined) {
|
|
132
|
+
if (typeof input.concernsDisposition !== "string" || input.concernsDisposition.trim() === "") {
|
|
133
|
+
return { ok: false, message: "concernsDisposition must be a non-empty string when provided" };
|
|
134
|
+
}
|
|
135
|
+
if (input.concernsDisposition.trim().length > DELEGATED_RATIONALE_MAX_CHARS) {
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
message: `concernsDisposition exceeds ${DELEGATED_RATIONALE_MAX_CHARS} characters`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return { ok: true };
|
|
143
|
+
}
|
|
144
|
+
function findRecord(store, sessionId, workItemId) {
|
|
145
|
+
return store.records.get(createRecordLookupKey(sessionId, workItemId));
|
|
146
|
+
}
|
|
147
|
+
// START_CONTRACT: beginDelegatedLaunch
|
|
148
|
+
// PURPOSE: Allocate one implementation attempt and bind it to the host tool-call identity.
|
|
149
|
+
// INPUTS: { store: WorkItemStore - backing store, input: BeginDelegatedLaunchInput - session, item, and host callID }
|
|
150
|
+
// OUTPUTS: { BeginDelegatedLaunchResult - allocated attempt or a coded rejection }
|
|
151
|
+
// SIDE_EFFECTS: [Mutates the delegated attempt ledger for valid launches]
|
|
152
|
+
// LINKS: [M-WORKFLOW-DELEGATED, M-WORKFLOW-STATE]
|
|
153
|
+
// END_CONTRACT: beginDelegatedLaunch
|
|
154
|
+
export function beginDelegatedLaunch(store, input) {
|
|
155
|
+
return beginDelegatedLaunchInStore(store.getStoreData(), input);
|
|
156
|
+
}
|
|
157
|
+
export function beginDelegatedLaunchInStore(store, input) {
|
|
158
|
+
const callId = input.callId?.trim() ?? "";
|
|
159
|
+
if (!callId) {
|
|
160
|
+
return { ok: false, errorCode: "INVALID_STATE", message: "callId must be a non-empty string" };
|
|
161
|
+
}
|
|
162
|
+
const existing = findRecord(store, input.sessionId, input.workItemId);
|
|
163
|
+
if (!existing) {
|
|
164
|
+
return {
|
|
165
|
+
ok: false,
|
|
166
|
+
errorCode: "WORK_ITEM_NOT_FOUND",
|
|
167
|
+
message: `WORK_ITEM_NOT_FOUND: ${input.workItemId}`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (existing.state === "closed") {
|
|
171
|
+
return {
|
|
172
|
+
ok: false,
|
|
173
|
+
errorCode: "WORK_ITEM_ALREADY_CLOSED",
|
|
174
|
+
message: `WORK_ITEM_ALREADY_CLOSED: ${input.workItemId} is already closed`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (existing.mode !== "delegated" || !existing.delegated) {
|
|
178
|
+
return {
|
|
179
|
+
ok: false,
|
|
180
|
+
errorCode: "WRONG_MODE",
|
|
181
|
+
message: `WRONG_MODE: ${input.workItemId} is ${existing.mode}, not delegated`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (!getAllowedNextAgents(existing).includes("vv-implementer")) {
|
|
185
|
+
return {
|
|
186
|
+
ok: false,
|
|
187
|
+
errorCode: "INVALID_STATE",
|
|
188
|
+
message: `INVALID_STATE: ${input.workItemId} is ${existing.state} and cannot start an implementation attempt`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const delegated = existing.delegated;
|
|
192
|
+
if (delegated.attempts.some((attempt) => attempt.status === "in_flight")) {
|
|
193
|
+
return {
|
|
194
|
+
ok: false,
|
|
195
|
+
errorCode: "ATTEMPT_IN_FLIGHT",
|
|
196
|
+
message: `ATTEMPT_IN_FLIGHT: ${input.workItemId} already has an in-flight implementation attempt`,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (delegated.attempts.length >= delegatedAttemptBudget(delegated)) {
|
|
200
|
+
return {
|
|
201
|
+
ok: false,
|
|
202
|
+
errorCode: "ATTEMPTS_EXHAUSTED",
|
|
203
|
+
message: `ATTEMPTS_EXHAUSTED: ${input.workItemId} consumed ${delegated.attempts.length} of ${delegatedAttemptBudget(delegated)} allowed attempts; explicit recovery or checkpoint-authorized rework is required`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const attemptNumber = delegated.attempts.length + 1;
|
|
207
|
+
const now = toIsoNow();
|
|
208
|
+
const updated = {
|
|
209
|
+
...existing,
|
|
210
|
+
state: "awaiting_implementer",
|
|
211
|
+
delegated: {
|
|
212
|
+
...delegated,
|
|
213
|
+
attempts: [
|
|
214
|
+
...delegated.attempts,
|
|
215
|
+
{ attempt: attemptNumber, callId, launchedAt: now, status: "in_flight" },
|
|
216
|
+
],
|
|
217
|
+
},
|
|
218
|
+
updatedAt: now,
|
|
219
|
+
};
|
|
220
|
+
store.records.set(createRecordLookupKey(input.sessionId, input.workItemId), updated);
|
|
221
|
+
return { ok: true, record: cloneRecord(updated), attempt: attemptNumber, callId };
|
|
222
|
+
}
|
|
223
|
+
const DELEGATED_RESULT_STATUSES = new Set([
|
|
224
|
+
"DONE",
|
|
225
|
+
"DONE_WITH_CONCERNS",
|
|
226
|
+
"NEEDS_CONTEXT",
|
|
227
|
+
"BLOCKED",
|
|
228
|
+
]);
|
|
229
|
+
// START_CONTRACT: applyDelegatedResult
|
|
230
|
+
// PURPOSE: Apply one implementer result to its matching in-flight attempt and move DONE or DONE_WITH_CONCERNS to awaiting_acceptance.
|
|
231
|
+
// INPUTS: { store: WorkItemStore - backing store, input: ApplyDelegatedResultInput - call-bound result payload }
|
|
232
|
+
// OUTPUTS: { ApplyDelegatedResultResult - applied transition or a coded rejection including stale callbacks }
|
|
233
|
+
// SIDE_EFFECTS: [Mutates the matching delegated attempt and the work-item state]
|
|
234
|
+
// LINKS: [M-WORKFLOW-DELEGATED, M-WORKFLOW-STATE]
|
|
235
|
+
// END_CONTRACT: applyDelegatedResult
|
|
236
|
+
export function applyDelegatedResult(store, input) {
|
|
237
|
+
return applyDelegatedResultInStore(store.getStoreData(), input);
|
|
238
|
+
}
|
|
239
|
+
export function applyDelegatedResultInStore(store, input) {
|
|
240
|
+
const existing = findRecord(store, input.sessionId, input.workItemId);
|
|
241
|
+
if (!existing) {
|
|
242
|
+
return {
|
|
243
|
+
ok: false,
|
|
244
|
+
errorCode: "WORK_ITEM_NOT_FOUND",
|
|
245
|
+
message: `WORK_ITEM_NOT_FOUND: no work item ${input.workItemId} for session ${input.sessionId}`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
if (existing.state === "closed") {
|
|
249
|
+
return {
|
|
250
|
+
ok: false,
|
|
251
|
+
errorCode: "WORK_ITEM_ALREADY_CLOSED",
|
|
252
|
+
message: `WORK_ITEM_ALREADY_CLOSED: ${input.workItemId} is already closed`,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
if (existing.mode !== "delegated" || !existing.delegated) {
|
|
256
|
+
return {
|
|
257
|
+
ok: false,
|
|
258
|
+
errorCode: "WRONG_MODE",
|
|
259
|
+
message: `WRONG_MODE: ${input.workItemId} is ${existing.mode}, not delegated`,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
if (!DELEGATED_RESULT_STATUSES.has(input.resultStatus)) {
|
|
263
|
+
return {
|
|
264
|
+
ok: false,
|
|
265
|
+
errorCode: "INVALID_RESULT_STATUS",
|
|
266
|
+
message: `INVALID_RESULT_STATUS: ${String(input.resultStatus)} is not a delegated implementer status`,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
const inFlight = existing.delegated.attempts.find((attempt) => attempt.status === "in_flight");
|
|
270
|
+
if (!inFlight || inFlight.callId !== input.callId) {
|
|
271
|
+
return {
|
|
272
|
+
ok: false,
|
|
273
|
+
errorCode: "STALE_CALLBACK",
|
|
274
|
+
message: `STALE_CALLBACK: ${input.callId} does not match the in-flight attempt ${inFlight ? inFlight.callId : "(none)"} for ${input.workItemId}`,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
const now = toIsoNow();
|
|
278
|
+
const fromState = existing.state;
|
|
279
|
+
const nextState = input.resultStatus === "DONE" || input.resultStatus === "DONE_WITH_CONCERNS"
|
|
280
|
+
? "awaiting_acceptance"
|
|
281
|
+
: input.resultStatus === "NEEDS_CONTEXT"
|
|
282
|
+
? "needs_context"
|
|
283
|
+
: "blocked";
|
|
284
|
+
const updated = {
|
|
285
|
+
...existing,
|
|
286
|
+
state: nextState,
|
|
287
|
+
...(input.resultExcerpt ? { resultExcerpt: input.resultExcerpt } : {}),
|
|
288
|
+
delegated: {
|
|
289
|
+
...existing.delegated,
|
|
290
|
+
attempts: existing.delegated.attempts.map((attempt) => attempt.attempt === inFlight.attempt
|
|
291
|
+
? {
|
|
292
|
+
...attempt,
|
|
293
|
+
status: "completed",
|
|
294
|
+
resultStatus: input.resultStatus,
|
|
295
|
+
completedAt: now,
|
|
296
|
+
...(input.resultExcerpt ? { resultExcerpt: input.resultExcerpt } : {}),
|
|
297
|
+
}
|
|
298
|
+
: attempt),
|
|
299
|
+
},
|
|
300
|
+
updatedAt: now,
|
|
301
|
+
};
|
|
302
|
+
store.records.set(createRecordLookupKey(input.sessionId, input.workItemId), updated);
|
|
303
|
+
return {
|
|
304
|
+
ok: true,
|
|
305
|
+
record: cloneRecord(updated),
|
|
306
|
+
fromState,
|
|
307
|
+
toState: nextState,
|
|
308
|
+
attempt: inFlight.attempt,
|
|
309
|
+
resultStatus: input.resultStatus,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
// START_CONTRACT: decideDelegatedWorkItem
|
|
313
|
+
// PURPOSE: Record an explicit controller accept or request_changes decision bound to the current completed attempt.
|
|
314
|
+
// INPUTS: { store: WorkItemStore - backing store, input: DecideDelegatedWorkItemInput - decision payload with attempt identity and bounded text }
|
|
315
|
+
// OUTPUTS: { DecideDelegatedWorkItemResult - applied decision or a coded rejection without mutation }
|
|
316
|
+
// SIDE_EFFECTS: [Mutates decision history, acceptance state, and the work-item lifecycle state]
|
|
317
|
+
// LINKS: [M-WORKFLOW-DELEGATED, M-WORKFLOW-STATE]
|
|
318
|
+
// END_CONTRACT: decideDelegatedWorkItem
|
|
319
|
+
export function decideDelegatedWorkItem(store, input) {
|
|
320
|
+
return decideDelegatedWorkItemInStore(store.getStoreData(), input);
|
|
321
|
+
}
|
|
322
|
+
export function decideDelegatedWorkItemInStore(store, input) {
|
|
323
|
+
if (input.decision !== "accept" && input.decision !== "request_changes") {
|
|
324
|
+
return {
|
|
325
|
+
ok: false,
|
|
326
|
+
errorCode: "INVALID_INPUT",
|
|
327
|
+
message: "INVALID_INPUT: decision must be accept or request_changes",
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
const validation = validateDelegatedDecisionInput({
|
|
331
|
+
decision: input.decision,
|
|
332
|
+
rationale: input.rationale,
|
|
333
|
+
evidence: input.evidence,
|
|
334
|
+
concernsDisposition: input.concernsDisposition,
|
|
335
|
+
});
|
|
336
|
+
if (!validation.ok) {
|
|
337
|
+
return {
|
|
338
|
+
ok: false,
|
|
339
|
+
errorCode: "INVALID_INPUT",
|
|
340
|
+
message: `INVALID_INPUT: ${validation.message}`,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
if (!Number.isInteger(input.attempt) || input.attempt < 1) {
|
|
344
|
+
return {
|
|
345
|
+
ok: false,
|
|
346
|
+
errorCode: "INVALID_INPUT",
|
|
347
|
+
message: "INVALID_INPUT: attempt must be a positive integer",
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
const existing = findRecord(store, input.sessionId, input.workItemId);
|
|
351
|
+
if (!existing) {
|
|
352
|
+
return {
|
|
353
|
+
ok: false,
|
|
354
|
+
errorCode: "WORK_ITEM_NOT_FOUND",
|
|
355
|
+
message: `WORK_ITEM_NOT_FOUND: no work item ${input.workItemId} for session ${input.sessionId}`,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
if (existing.state === "closed") {
|
|
359
|
+
return {
|
|
360
|
+
ok: false,
|
|
361
|
+
errorCode: "WORK_ITEM_ALREADY_CLOSED",
|
|
362
|
+
message: `WORK_ITEM_ALREADY_CLOSED: ${input.workItemId} is already closed`,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
if (existing.mode !== "delegated" || !existing.delegated) {
|
|
366
|
+
return {
|
|
367
|
+
ok: false,
|
|
368
|
+
errorCode: "WRONG_MODE",
|
|
369
|
+
message: `WRONG_MODE: ${input.workItemId} is ${existing.mode}; only delegated items receive controller decisions`,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
if (existing.state !== "awaiting_acceptance") {
|
|
373
|
+
return {
|
|
374
|
+
ok: false,
|
|
375
|
+
errorCode: "INVALID_STATE",
|
|
376
|
+
message: `INVALID_STATE: ${input.workItemId} is ${existing.state}, not awaiting_acceptance`,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
const completed = [...existing.delegated.attempts]
|
|
380
|
+
.filter((attempt) => attempt.status === "completed")
|
|
381
|
+
.sort((left, right) => right.attempt - left.attempt)[0];
|
|
382
|
+
if (!completed) {
|
|
383
|
+
return {
|
|
384
|
+
ok: false,
|
|
385
|
+
errorCode: "INVALID_STATE",
|
|
386
|
+
message: `INVALID_STATE: ${input.workItemId} has no completed attempt to decide`,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
if (completed.attempt !== input.attempt) {
|
|
390
|
+
return {
|
|
391
|
+
ok: false,
|
|
392
|
+
errorCode: "INVALID_ATTEMPT",
|
|
393
|
+
message: `INVALID_ATTEMPT: decision targets attempt ${input.attempt} but the current completed attempt is ${completed.attempt}`,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
if (existing.delegated.decisions.some((decision) => decision.attempt === input.attempt)) {
|
|
397
|
+
return {
|
|
398
|
+
ok: false,
|
|
399
|
+
errorCode: "DUPLICATE_DECISION",
|
|
400
|
+
message: `DUPLICATE_DECISION: attempt ${input.attempt} already received a controller decision`,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
const hasConcerns = completed.resultStatus === "DONE_WITH_CONCERNS";
|
|
404
|
+
if (hasConcerns && input.concernsDisposition === undefined) {
|
|
405
|
+
return {
|
|
406
|
+
ok: false,
|
|
407
|
+
errorCode: "CONCERNS_DISPOSITION_REQUIRED",
|
|
408
|
+
message: `CONCERNS_DISPOSITION_REQUIRED: attempt ${input.attempt} completed DONE_WITH_CONCERNS and requires an explicit disposition`,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
if (!hasConcerns && input.concernsDisposition !== undefined) {
|
|
412
|
+
return {
|
|
413
|
+
ok: false,
|
|
414
|
+
errorCode: "UNEXPECTED_CONCERNS_DISPOSITION",
|
|
415
|
+
message: `UNEXPECTED_CONCERNS_DISPOSITION: attempt ${input.attempt} completed ${completed.resultStatus}, not DONE_WITH_CONCERNS`,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
const now = toIsoNow();
|
|
419
|
+
const decisionId = `dec-${existing.workItemId}-a${input.attempt}`;
|
|
420
|
+
const decision = {
|
|
421
|
+
decisionId,
|
|
422
|
+
attempt: input.attempt,
|
|
423
|
+
decision: input.decision,
|
|
424
|
+
decidedAt: now,
|
|
425
|
+
rationale: input.rationale.trim(),
|
|
426
|
+
evidence: input.evidence.map((reference) => reference.trim()),
|
|
427
|
+
...(input.concernsDisposition !== undefined
|
|
428
|
+
? { concernsDisposition: input.concernsDisposition.trim() }
|
|
429
|
+
: {}),
|
|
430
|
+
};
|
|
431
|
+
const nextState = input.decision === "accept" ? "ready_to_close" : "awaiting_implementer";
|
|
432
|
+
const updated = {
|
|
433
|
+
...existing,
|
|
434
|
+
state: nextState,
|
|
435
|
+
delegated: {
|
|
436
|
+
...existing.delegated,
|
|
437
|
+
decisions: [...existing.delegated.decisions, decision],
|
|
438
|
+
...(input.decision === "accept"
|
|
439
|
+
? {
|
|
440
|
+
acceptances: [
|
|
441
|
+
...existing.delegated.acceptances,
|
|
442
|
+
{
|
|
443
|
+
attempt: input.attempt,
|
|
444
|
+
decisionId,
|
|
445
|
+
acceptedAt: now,
|
|
446
|
+
rationale: input.rationale.trim(),
|
|
447
|
+
evidence: input.evidence.map((reference) => reference.trim()),
|
|
448
|
+
...(input.concernsDisposition !== undefined
|
|
449
|
+
? { concernsDisposition: input.concernsDisposition.trim() }
|
|
450
|
+
: {}),
|
|
451
|
+
},
|
|
452
|
+
],
|
|
453
|
+
}
|
|
454
|
+
: {}),
|
|
455
|
+
},
|
|
456
|
+
updatedAt: now,
|
|
457
|
+
};
|
|
458
|
+
store.records.set(createRecordLookupKey(input.sessionId, input.workItemId), updated);
|
|
459
|
+
return { ok: true, record: cloneRecord(updated), decision: input.decision, decisionId };
|
|
460
|
+
}
|
|
461
|
+
// START_CONTRACT: reworkDelegatedWorkItem
|
|
462
|
+
// PURPOSE: Reopen an accepted delegated item under validated checkpoint-failure authorization without resetting attempt history.
|
|
463
|
+
// INPUTS: { store: WorkItemStore - backing store, input: ReworkDelegatedWorkItemInput - checkpoint authorization payload }
|
|
464
|
+
// OUTPUTS: { ReworkDelegatedWorkItemResult - reopened record with one extra granted attempt or a coded rejection }
|
|
465
|
+
// SIDE_EFFECTS: [Revokes the current acceptance's applicability, records the rework event, and returns the item to awaiting_implementer]
|
|
466
|
+
// LINKS: [M-WORKFLOW-DELEGATED, M-WORKFLOW-CHECKPOINTS]
|
|
467
|
+
// END_CONTRACT: reworkDelegatedWorkItem
|
|
468
|
+
export function reworkDelegatedWorkItem(store, input) {
|
|
469
|
+
return reworkDelegatedWorkItemInStore(store.getStoreData(), input);
|
|
470
|
+
}
|
|
471
|
+
export function reworkDelegatedWorkItemInStore(store, input) {
|
|
472
|
+
const reason = typeof input.reason === "string" ? input.reason.trim() : "";
|
|
473
|
+
const planRunId = typeof input.planRunId === "string" ? input.planRunId.trim() : "";
|
|
474
|
+
const failedCheckpointId = typeof input.failedCheckpointId === "string" ? input.failedCheckpointId.trim() : "";
|
|
475
|
+
if (!reason || reason.length > DELEGATED_RATIONALE_MAX_CHARS) {
|
|
476
|
+
return {
|
|
477
|
+
ok: false,
|
|
478
|
+
errorCode: "INVALID_INPUT",
|
|
479
|
+
message: `INVALID_INPUT: reason must be non-empty and at most ${DELEGATED_RATIONALE_MAX_CHARS} characters`,
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
if (!planRunId || !failedCheckpointId) {
|
|
483
|
+
return {
|
|
484
|
+
ok: false,
|
|
485
|
+
errorCode: "INVALID_INPUT",
|
|
486
|
+
message: "INVALID_INPUT: planRunId and failedCheckpointId must be non-empty",
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
const existing = findRecord(store, input.sessionId, input.workItemId);
|
|
490
|
+
if (!existing) {
|
|
491
|
+
return {
|
|
492
|
+
ok: false,
|
|
493
|
+
errorCode: "WORK_ITEM_NOT_FOUND",
|
|
494
|
+
message: `WORK_ITEM_NOT_FOUND: no work item ${input.workItemId} for session ${input.sessionId}`,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
if (existing.mode !== "delegated" || !existing.delegated) {
|
|
498
|
+
return {
|
|
499
|
+
ok: false,
|
|
500
|
+
errorCode: "WRONG_MODE",
|
|
501
|
+
message: `WRONG_MODE: ${input.workItemId} is ${existing.mode}, not delegated`,
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
if (existing.state === "needs_context" || existing.state === "blocked") {
|
|
505
|
+
return {
|
|
506
|
+
ok: false,
|
|
507
|
+
errorCode: "HARD_STOP_STATE",
|
|
508
|
+
message: `HARD_STOP_STATE: ${input.workItemId} is ${existing.state} and cannot be reopened by rework`,
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
if (existing.state !== "ready_to_close" && existing.state !== "closed") {
|
|
512
|
+
return {
|
|
513
|
+
ok: false,
|
|
514
|
+
errorCode: "INVALID_STATE",
|
|
515
|
+
message: `INVALID_STATE: ${input.workItemId} is ${existing.state}; rework targets accepted items`,
|
|
516
|
+
};
|
|
517
|
+
}
|
|
518
|
+
const delegated = existing.delegated;
|
|
519
|
+
const current = currentDelegatedAcceptance(existing);
|
|
520
|
+
if (!current || current.revokedAt) {
|
|
521
|
+
return {
|
|
522
|
+
ok: false,
|
|
523
|
+
errorCode: "NOT_ACCEPTED",
|
|
524
|
+
message: `NOT_ACCEPTED: ${input.workItemId} has no currently applicable acceptance to revoke`,
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
if (delegated.reworkHistory.some((rework) => rework.authorizedByCheckpoint === failedCheckpointId)) {
|
|
528
|
+
return {
|
|
529
|
+
ok: false,
|
|
530
|
+
errorCode: "ALREADY_REWORKED",
|
|
531
|
+
message: `ALREADY_REWORKED: checkpoint ${failedCheckpointId} already authorized one rework of ${input.workItemId}`,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
if (delegated.planRunId && delegated.planRunId !== planRunId) {
|
|
535
|
+
return {
|
|
536
|
+
ok: false,
|
|
537
|
+
errorCode: "INVALID_INPUT",
|
|
538
|
+
message: `INVALID_INPUT: ${input.workItemId} belongs to plan run ${delegated.planRunId}, not ${planRunId}`,
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
const now = toIsoNow();
|
|
542
|
+
const reworkId = `rw-${existing.workItemId}-${failedCheckpointId}`;
|
|
543
|
+
const rework = {
|
|
544
|
+
reworkId,
|
|
545
|
+
planRunId,
|
|
546
|
+
authorizedByCheckpoint: failedCheckpointId,
|
|
547
|
+
reason,
|
|
548
|
+
reworkedAt: now,
|
|
549
|
+
revokedAcceptanceAttempt: current.attempt,
|
|
550
|
+
};
|
|
551
|
+
const updated = {
|
|
552
|
+
...existing,
|
|
553
|
+
state: "awaiting_implementer",
|
|
554
|
+
closedAt: undefined,
|
|
555
|
+
delegated: {
|
|
556
|
+
...delegated,
|
|
557
|
+
reworkHistory: [...delegated.reworkHistory, rework],
|
|
558
|
+
acceptances: delegated.acceptances.map((acceptance) => acceptance === current
|
|
559
|
+
? { ...acceptance, revokedAt: now, revokedByReworkId: reworkId }
|
|
560
|
+
: acceptance),
|
|
561
|
+
},
|
|
562
|
+
updatedAt: now,
|
|
563
|
+
};
|
|
564
|
+
store.records.set(createRecordLookupKey(input.sessionId, input.workItemId), updated);
|
|
565
|
+
return {
|
|
566
|
+
ok: true,
|
|
567
|
+
record: cloneRecord(updated),
|
|
568
|
+
reworkId,
|
|
569
|
+
grantedAttempts: delegatedAttemptBudget(updated.delegated),
|
|
570
|
+
};
|
|
571
|
+
}
|
|
572
|
+
// START_CONTRACT: revertInFlightDelegatedLaunches
|
|
573
|
+
// PURPOSE: Reclaim delegated attempts that a process-restart boundary orphaned, restoring their items to a launchable state without consuming budget.
|
|
574
|
+
// INPUTS: { store: WorkItemStoreData - hydrated store data, sessionId: string - owning session }
|
|
575
|
+
// OUTPUTS: { { reverted: number; workItemIds: string[] } - reclaimed attempts and affected items }
|
|
576
|
+
// SIDE_EFFECTS: [Removes never-completed in-flight attempts from the ledger and returns items to awaiting_implementer]
|
|
577
|
+
// LINKS: [M-WORKFLOW-DELEGATED, M-WORKFLOW-PERSISTENCE, M-PLUGIN-WORKFLOW]
|
|
578
|
+
// END_CONTRACT: revertInFlightDelegatedLaunches
|
|
579
|
+
export function revertInFlightDelegatedLaunches(store, sessionId) {
|
|
580
|
+
const reverted = [];
|
|
581
|
+
for (const [lookupKey, record] of store.records) {
|
|
582
|
+
if (record.sessionId !== sessionId || record.mode !== "delegated" || !record.delegated)
|
|
583
|
+
continue;
|
|
584
|
+
const inFlight = record.delegated.attempts.filter((attempt) => attempt.status === "in_flight");
|
|
585
|
+
if (inFlight.length === 0)
|
|
586
|
+
continue;
|
|
587
|
+
// Only the plugin's first store creation for a freshly hydrated session
|
|
588
|
+
// calls this reclamation. A persisted in-flight attempt can never receive
|
|
589
|
+
// its host callback after a restart, so reverting it (without consuming
|
|
590
|
+
// budget — it never completed) is the only non-dead-end recovery. Items
|
|
591
|
+
// stay hard-stopped when they are already blocked or needs_context.
|
|
592
|
+
if (record.state === "needs_context" ||
|
|
593
|
+
record.state === "blocked" ||
|
|
594
|
+
record.state === "closed") {
|
|
595
|
+
continue;
|
|
596
|
+
}
|
|
597
|
+
const attempts = record.delegated.attempts.filter((attempt) => attempt.status !== "in_flight");
|
|
598
|
+
store.records.set(lookupKey, {
|
|
599
|
+
...record,
|
|
600
|
+
state: attempts.length > 0 || record.delegated.decisions.length > 0
|
|
601
|
+
? "awaiting_implementer"
|
|
602
|
+
: "open",
|
|
603
|
+
delegated: {
|
|
604
|
+
...record.delegated,
|
|
605
|
+
attempts,
|
|
606
|
+
},
|
|
607
|
+
updatedAt: toIsoNow(),
|
|
608
|
+
});
|
|
609
|
+
reverted.push(record.workItemId);
|
|
610
|
+
}
|
|
611
|
+
return { reverted: reverted.length, workItemIds: reverted };
|
|
612
|
+
}
|
|
613
|
+
//# sourceMappingURL=delegated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegated.js","sourceRoot":"","sources":["../../../src/plugins/workflow/delegated.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,iBAAiB;AACjB,wBAAwB;AACxB,uIAAuI;AACvI,wZAAwZ;AACxZ,uJAAuJ;AACvJ,4HAA4H;AAC5H,kBAAkB;AAClB,sBAAsB;AACtB,sBAAsB;AACtB,EAAE;AACF,mBAAmB;AACnB,uHAAuH;AACvH,uEAAuE;AACvE,sFAAsF;AACtF,6EAA6E;AAC7E,uFAAuF;AACvF,gFAAgF;AAChF,qEAAqE;AACrE,oFAAoF;AACpF,+EAA+E;AAC/E,oEAAoE;AACpE,mEAAmE;AACnE,2FAA2F;AAC3F,4FAA4F;AAC5F,4DAA4D;AAC5D,qEAAqE;AACrE,6DAA6D;AAC7D,uGAAuG;AACvG,iEAAiE;AACjE,yEAAyE;AACzE,+DAA+D;AAC/D,+FAA+F;AAC/F,+EAA+E;AAC/E,yFAAyF;AACzF,uGAAuG;AACvG,8EAA8E;AAC9E,0FAA0F;AAC1F,2EAA2E;AAC3E,+FAA+F;AAC/F,2FAA2F;AAC3F,4EAA4E;AAC5E,6FAA6F;AAC7F,sEAAsE;AACtE,wGAAwG;AACxG,yEAAyE;AACzE,iBAAiB;AACjB,EAAE;AACF,uBAAuB;AACvB,sKAAsK;AACtK,qBAAqB;AASrB,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,8BAA8B;AAC9B,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAClD,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAChD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AA2D7C,4BAA4B;AAE5B,gCAAgC;AAChC,SAAS,QAAQ;IACf,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,OAAO,uBAAuB,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;AAC9D,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,0BAA0B,CACxC,MAAsB;IAEtB,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AACjG,CAAC;AAQD,iFAAiF;AACjF,MAAM,UAAU,2BAA2B,CACzC,KAAwB;IAExB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,kEAAkE;SAC5E,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,0BAA0B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,kBAAkB,MAAM,CAAC,MAAM,GAAG;aAC/F,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,mBAAmB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B;aACrF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC;AASD,yFAAyF;AACzF,MAAM,UAAU,8BAA8B,CAC5C,KAAuC;IAEvC,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,6BAA6B,EAAE,CAAC;QACrD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,6BAA6B,aAAa,EAAE,CAAC;IACjG,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,yDAAyD,EAAE,CAAC;IAC3F,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,2BAA2B,EAAE,CAAC;QACxD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,2BAA2B,aAAa,EAAE,CAAC;IAC9F,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,+CAA+C,EAAE,CAAC;QACjF,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,GAAG,4BAA4B,EAAE,CAAC;YACrD,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,8BAA8B,4BAA4B,aAAa;aACjF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC5C,IAAI,OAAO,KAAK,CAAC,mBAAmB,KAAK,QAAQ,IAAI,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,8DAA8D,EAAE,CAAC;QAChG,CAAC;QACD,IAAI,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,6BAA6B,EAAE,CAAC;YAC5E,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,+BAA+B,6BAA6B,aAAa;aACnF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAuBD,SAAS,UAAU,CACjB,KAAwB,EACxB,SAAiB,EACjB,UAAkB;IAElB,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,uCAAuC;AACvC,6FAA6F;AAC7F,wHAAwH;AACxH,qFAAqF;AACrF,4EAA4E;AAC5E,oDAAoD;AACpD,qCAAqC;AACrC,MAAM,UAAU,oBAAoB,CAClC,KAAoB,EACpB,KAAgC;IAEhC,OAAO,2BAA2B,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAwB,EACxB,KAAgC;IAEhC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC;IACjG,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,qBAAqB;YAChC,OAAO,EAAE,wBAAwB,KAAK,CAAC,UAAU,EAAE;SACpD,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,0BAA0B;YACrC,OAAO,EAAE,6BAA6B,KAAK,CAAC,UAAU,oBAAoB;SAC3E,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACzD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,eAAe,KAAK,CAAC,UAAU,OAAO,QAAQ,CAAC,IAAI,iBAAiB;SAC9E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC/D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,kBAAkB,KAAK,CAAC,UAAU,OAAO,QAAQ,CAAC,KAAK,6CAA6C;SAC9G,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,EAAE,CAAC;QACzE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,mBAAmB;YAC9B,OAAO,EAAE,sBAAsB,KAAK,CAAC,UAAU,kDAAkD;SAClG,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;QACnE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,oBAAoB;YAC/B,OAAO,EAAE,uBAAuB,KAAK,CAAC,UAAU,aAAa,SAAS,CAAC,QAAQ,CAAC,MAAM,OAAO,sBAAsB,CAAC,SAAS,CAAC,kFAAkF;SACjN,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,MAAM,OAAO,GAAmB;QAC9B,GAAG,QAAQ;QACX,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE;YACT,GAAG,SAAS;YACZ,QAAQ,EAAE;gBACR,GAAG,SAAS,CAAC,QAAQ;gBACrB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE;aACzE;SACF;QACD,SAAS,EAAE,GAAG;KACf,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAErF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACpF,CAAC;AA8BD,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CAAC;IAC7D,MAAM;IACN,oBAAoB;IACpB,eAAe;IACf,SAAS;CACV,CAAC,CAAC;AAEH,uCAAuC;AACvC,wIAAwI;AACxI,mHAAmH;AACnH,gHAAgH;AAChH,mFAAmF;AACnF,oDAAoD;AACpD,qCAAqC;AACrC,MAAM,UAAU,oBAAoB,CAClC,KAAoB,EACpB,KAAgC;IAEhC,OAAO,2BAA2B,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAAwB,EACxB,KAAgC;IAEhC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,qBAAqB;YAChC,OAAO,EAAE,qCAAqC,KAAK,CAAC,UAAU,gBAAgB,KAAK,CAAC,SAAS,EAAE;SAChG,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,0BAA0B;YACrC,OAAO,EAAE,6BAA6B,KAAK,CAAC,UAAU,oBAAoB;SAC3E,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACzD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,eAAe,KAAK,CAAC,UAAU,OAAO,QAAQ,CAAC,IAAI,iBAAiB;SAC9E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACvD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,uBAAuB;YAClC,OAAO,EAAE,0BAA0B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,wCAAwC;SACtG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;IAC/F,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,gBAAgB;YAC3B,OAAO,EAAE,mBAAmB,KAAK,CAAC,MAAM,yCAAyC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,QAAQ,KAAK,CAAC,UAAU,EAAE;SACjJ,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC;IACjC,MAAM,SAAS,GACb,KAAK,CAAC,YAAY,KAAK,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,oBAAoB;QAC1E,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,KAAK,CAAC,YAAY,KAAK,eAAe;YACtC,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,SAAS,CAAC;IAElB,MAAM,OAAO,GAAmB;QAC9B,GAAG,QAAQ;QACX,KAAK,EAAE,SAAS;QAChB,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,SAAS,EAAE;YACT,GAAG,QAAQ,CAAC,SAAS;YACrB,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACpD,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;gBAClC,CAAC,CAAC;oBACE,GAAG,OAAO;oBACV,MAAM,EAAE,WAAoB;oBAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,WAAW,EAAE,GAAG;oBAChB,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACvE;gBACH,CAAC,CAAC,OAAO,CACZ;SACF;QACD,SAAS,EAAE,GAAG;KACf,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAErF,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;QAC5B,SAAS;QACT,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC;AACJ,CAAC;AAkCD,0CAA0C;AAC1C,sHAAsH;AACtH,oJAAoJ;AACpJ,wGAAwG;AACxG,kGAAkG;AAClG,oDAAoD;AACpD,wCAAwC;AACxC,MAAM,UAAU,uBAAuB,CACrC,KAAoB,EACpB,KAAmC;IAEnC,OAAO,8BAA8B,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,KAAwB,EACxB,KAAmC;IAEnC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QACxE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,2DAA2D;SACrE,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,8BAA8B,CAAC;QAChD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;KAC/C,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,kBAAkB,UAAU,CAAC,OAAO,EAAE;SAChD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,mDAAmD;SAC7D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,qBAAqB;YAChC,OAAO,EAAE,qCAAqC,KAAK,CAAC,UAAU,gBAAgB,KAAK,CAAC,SAAS,EAAE;SAChG,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,0BAA0B;YACrC,OAAO,EAAE,6BAA6B,KAAK,CAAC,UAAU,oBAAoB;SAC3E,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACzD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,eAAe,KAAK,CAAC,UAAU,OAAO,QAAQ,CAAC,IAAI,qDAAqD;SAClH,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,qBAAqB,EAAE,CAAC;QAC7C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,kBAAkB,KAAK,CAAC,UAAU,OAAO,QAAQ,CAAC,KAAK,2BAA2B;SAC5F,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC/C,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC;SACnD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,kBAAkB,KAAK,CAAC,UAAU,qCAAqC;SACjF,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QACxC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,iBAAiB;YAC5B,OAAO,EAAE,6CAA6C,KAAK,CAAC,OAAO,yCAAyC,SAAS,CAAC,OAAO,EAAE;SAChI,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxF,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,oBAAoB;YAC/B,OAAO,EAAE,+BAA+B,KAAK,CAAC,OAAO,yCAAyC;SAC/F,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,KAAK,oBAAoB,CAAC;IACpE,IAAI,WAAW,IAAI,KAAK,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,+BAA+B;YAC1C,OAAO,EAAE,0CAA0C,KAAK,CAAC,OAAO,oEAAoE;SACrI,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,iCAAiC;YAC5C,OAAO,EAAE,4CAA4C,KAAK,CAAC,OAAO,cAAc,SAAS,CAAC,YAAY,0BAA0B;SACjI,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,MAAM,UAAU,GAAG,OAAO,QAAQ,CAAC,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IAClE,MAAM,QAAQ,GAA4B;QACxC,UAAU;QACV,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE;QACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE;YAC3D,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,MAAM,SAAS,GACb,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAC1E,MAAM,OAAO,GAAmB;QAC9B,GAAG,QAAQ;QACX,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE;YACT,GAAG,QAAQ,CAAC,SAAS;YACrB,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAC7B,CAAC,CAAC;oBACE,WAAW,EAAE;wBACX,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW;wBACjC;4BACE,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,UAAU;4BACV,UAAU,EAAE,GAAG;4BACf,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE;4BACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;4BAC7D,GAAG,CAAC,KAAK,CAAC,mBAAmB,KAAK,SAAS;gCACzC,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE;gCAC3D,CAAC,CAAC,EAAE,CAAC;yBACR;qBACF;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;SACR;QACD,SAAS,EAAE,GAAG;KACf,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAErF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;AAC1F,CAAC;AAyBD,0CAA0C;AAC1C,mIAAmI;AACnI,6HAA6H;AAC7H,qHAAqH;AACrH,2IAA2I;AAC3I,0DAA0D;AAC1D,wCAAwC;AACxC,MAAM,UAAU,uBAAuB,CACrC,KAAoB,EACpB,KAAmC;IAEnC,OAAO,8BAA8B,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,KAAwB,EACxB,KAAmC;IAEnC,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,kBAAkB,GACtB,OAAO,KAAK,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,6BAA6B,EAAE,CAAC;QAC7D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,uDAAuD,6BAA6B,aAAa;SAC3G,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,mEAAmE;SAC7E,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,qBAAqB;YAChC,OAAO,EAAE,qCAAqC,KAAK,CAAC,UAAU,gBAAgB,KAAK,CAAC,SAAS,EAAE;SAChG,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACzD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,eAAe,KAAK,CAAC,UAAU,OAAO,QAAQ,CAAC,IAAI,iBAAiB;SAC9E,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,eAAe,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACvE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,iBAAiB;YAC5B,OAAO,EAAE,oBAAoB,KAAK,CAAC,UAAU,OAAO,QAAQ,CAAC,KAAK,mCAAmC;SACtG,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,gBAAgB,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,kBAAkB,KAAK,CAAC,UAAU,OAAO,QAAQ,CAAC,KAAK,iCAAiC;SAClG,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,MAAM,OAAO,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,iBAAiB,KAAK,CAAC,UAAU,mDAAmD;SAC9F,CAAC;IACJ,CAAC;IACD,IACE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,sBAAsB,KAAK,kBAAkB,CAAC,EAC9F,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,kBAAkB;YAC7B,OAAO,EAAE,gCAAgC,kBAAkB,qCAAqC,KAAK,CAAC,UAAU,EAAE;SACnH,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,SAAS,EAAE,eAAe;YAC1B,OAAO,EAAE,kBAAkB,KAAK,CAAC,UAAU,wBAAwB,SAAS,CAAC,SAAS,SAAS,SAAS,EAAE;SAC3G,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC;IACnE,MAAM,MAAM,GAA0B;QACpC,QAAQ;QACR,SAAS;QACT,sBAAsB,EAAE,kBAAkB;QAC1C,MAAM;QACN,UAAU,EAAE,GAAG;QACf,wBAAwB,EAAE,OAAO,CAAC,OAAO;KAC1C,CAAC;IAEF,MAAM,OAAO,GAAmB;QAC9B,GAAG,QAAQ;QACX,KAAK,EAAE,sBAAsB;QAC7B,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE;YACT,GAAG,SAAS;YACZ,aAAa,EAAE,CAAC,GAAG,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;YACnD,WAAW,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CACpD,UAAU,KAAK,OAAO;gBACpB,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE;gBAChE,CAAC,CAAC,UAAU,CACf;SACF;QACD,SAAS,EAAE,GAAG;KACf,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;IAErF,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;QAC5B,QAAQ;QACR,eAAe,EAAE,sBAAsB,CAAC,OAAO,CAAC,SAAmC,CAAC;KACrF,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,wJAAwJ;AACxJ,mGAAmG;AACnG,qGAAqG;AACrG,yHAAyH;AACzH,6EAA6E;AAC7E,gDAAgD;AAChD,MAAM,UAAU,+BAA+B,CAC7C,KAAwB,EACxB,SAAiB;IAEjB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAChD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS;YACpF,SAAS;QACX,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QAC/F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACpC,wEAAwE;QACxE,0EAA0E;QAC1E,wEAAwE;QACxE,wEAAwE;QACxE,oEAAoE;QACpE,IACE,MAAM,CAAC,KAAK,KAAK,eAAe;YAChC,MAAM,CAAC,KAAK,KAAK,SAAS;YAC1B,MAAM,CAAC,KAAK,KAAK,QAAQ,EACzB,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QAC/F,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE;YAC3B,GAAG,MAAM;YACT,KAAK,EACH,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBAC1D,CAAC,CAAC,sBAAsB;gBACxB,CAAC,CAAC,MAAM;YACZ,SAAS,EAAE;gBACT,GAAG,MAAM,CAAC,SAAS;gBACnB,QAAQ;aACT;YACD,SAAS,EAAE,QAAQ,EAAE;SACtB,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAC9D,CAAC"}
|