lingxios 1.0.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/README.md +54 -0
- package/db/schema.sql +306 -0
- package/dist/src/app/artifacts.d.ts +8 -0
- package/dist/src/app/artifacts.js +114 -0
- package/dist/src/app/artifacts.js.map +1 -0
- package/dist/src/app/doctor.d.ts +22 -0
- package/dist/src/app/doctor.js +44 -0
- package/dist/src/app/doctor.js.map +1 -0
- package/dist/src/app/index.d.ts +123 -0
- package/dist/src/app/index.js +291 -0
- package/dist/src/app/index.js.map +1 -0
- package/dist/src/app/input.d.ts +22 -0
- package/dist/src/app/input.js +60 -0
- package/dist/src/app/input.js.map +1 -0
- package/dist/src/app/recover-wait.d.ts +5 -0
- package/dist/src/app/recover-wait.js +59 -0
- package/dist/src/app/recover-wait.js.map +1 -0
- package/dist/src/app/resources.d.ts +5 -0
- package/dist/src/app/resources.js +9 -0
- package/dist/src/app/resources.js.map +1 -0
- package/dist/src/app/storage.d.ts +2 -0
- package/dist/src/app/storage.js +41 -0
- package/dist/src/app/storage.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +2 -0
- package/dist/src/cli/doctor.js +20 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/eval.d.ts +2 -0
- package/dist/src/cli/eval.js +44 -0
- package/dist/src/cli/eval.js.map +1 -0
- package/dist/src/config.d.ts +22 -0
- package/dist/src/config.js +56 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context/attachments.d.ts +10 -0
- package/dist/src/context/attachments.js +18 -0
- package/dist/src/context/attachments.js.map +1 -0
- package/dist/src/context/document-text.d.ts +1 -0
- package/dist/src/context/document-text.js +29 -0
- package/dist/src/context/document-text.js.map +1 -0
- package/dist/src/context/document-worker.d.ts +1 -0
- package/dist/src/context/document-worker.js +62 -0
- package/dist/src/context/document-worker.js.map +1 -0
- package/dist/src/context/evidence.d.ts +19 -0
- package/dist/src/context/evidence.js +37 -0
- package/dist/src/context/evidence.js.map +1 -0
- package/dist/src/context/request.d.ts +21 -0
- package/dist/src/context/request.js +32 -0
- package/dist/src/context/request.js.map +1 -0
- package/dist/src/context/research-evidence.d.ts +4 -0
- package/dist/src/context/research-evidence.js +24 -0
- package/dist/src/context/research-evidence.js.map +1 -0
- package/dist/src/context/resource-checks.d.ts +7 -0
- package/dist/src/context/resource-checks.js +15 -0
- package/dist/src/context/resource-checks.js.map +1 -0
- package/dist/src/context/task-contract.d.ts +11 -0
- package/dist/src/context/task-contract.js +23 -0
- package/dist/src/context/task-contract.js.map +1 -0
- package/dist/src/context/text.d.ts +2 -0
- package/dist/src/context/text.js +7 -0
- package/dist/src/context/text.js.map +1 -0
- package/dist/src/control-plane/http-server.d.ts +22 -0
- package/dist/src/control-plane/http-server.js +196 -0
- package/dist/src/control-plane/http-server.js.map +1 -0
- package/dist/src/control-plane/memory-store.d.ts +71 -0
- package/dist/src/control-plane/memory-store.js +389 -0
- package/dist/src/control-plane/memory-store.js.map +1 -0
- package/dist/src/control-plane/pg-store.d.ts +62 -0
- package/dist/src/control-plane/pg-store.js +386 -0
- package/dist/src/control-plane/pg-store.js.map +1 -0
- package/dist/src/control-plane/service.d.ts +52 -0
- package/dist/src/control-plane/service.js +630 -0
- package/dist/src/control-plane/service.js.map +1 -0
- package/dist/src/control-plane/stores.d.ts +184 -0
- package/dist/src/control-plane/stores.js +19 -0
- package/dist/src/control-plane/stores.js.map +1 -0
- package/dist/src/errors.d.ts +66 -0
- package/dist/src/errors.js +102 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/eval/calibration.d.ts +16 -0
- package/dist/src/eval/calibration.js +28 -0
- package/dist/src/eval/calibration.js.map +1 -0
- package/dist/src/eval/index.d.ts +40 -0
- package/dist/src/eval/index.js +40 -0
- package/dist/src/eval/index.js.map +1 -0
- package/dist/src/eval/review.d.ts +20 -0
- package/dist/src/eval/review.js +49 -0
- package/dist/src/eval/review.js.map +1 -0
- package/dist/src/host/http-client.d.ts +48 -0
- package/dist/src/host/http-client.js +127 -0
- package/dist/src/host/http-client.js.map +1 -0
- package/dist/src/host/port.d.ts +26 -0
- package/dist/src/host/port.js +2 -0
- package/dist/src/host/port.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/lingxiloop/actions.d.ts +25 -0
- package/dist/src/integrations/lingxiloop/actions.js +77 -0
- package/dist/src/integrations/lingxiloop/actions.js.map +1 -0
- package/dist/src/integrations/lingxiloop/app.d.ts +167 -0
- package/dist/src/integrations/lingxiloop/app.js +434 -0
- package/dist/src/integrations/lingxiloop/app.js.map +1 -0
- package/dist/src/integrations/lingxiloop/approvals.d.ts +148 -0
- package/dist/src/integrations/lingxiloop/approvals.js +540 -0
- package/dist/src/integrations/lingxiloop/approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/attachments.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/attachments.js +38 -0
- package/dist/src/integrations/lingxiloop/attachments.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.js +126 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.d.ts +15 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.js +79 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar.d.ts +19 -0
- package/dist/src/integrations/lingxiloop/calendar.js +43 -0
- package/dist/src/integrations/lingxiloop/calendar.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-events.d.ts +7 -0
- package/dist/src/integrations/lingxiloop/canvas-events.js +53 -0
- package/dist/src/integrations/lingxiloop/canvas-events.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.d.ts +5 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.js +52 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.d.ts +12 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.js +120 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-work.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/canvas-work.js +306 -0
- package/dist/src/integrations/lingxiloop/canvas-work.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas.d.ts +12 -0
- package/dist/src/integrations/lingxiloop/canvas.js +79 -0
- package/dist/src/integrations/lingxiloop/canvas.js.map +1 -0
- package/dist/src/integrations/lingxiloop/chat.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/chat.js +46 -0
- package/dist/src/integrations/lingxiloop/chat.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-approvals.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/document-approvals.js +75 -0
- package/dist/src/integrations/lingxiloop/document-approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-content.d.ts +80 -0
- package/dist/src/integrations/lingxiloop/document-content.js +195 -0
- package/dist/src/integrations/lingxiloop/document-content.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-writes.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/document-writes.js +49 -0
- package/dist/src/integrations/lingxiloop/document-writes.js.map +1 -0
- package/dist/src/integrations/lingxiloop/documents.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/documents.js +38 -0
- package/dist/src/integrations/lingxiloop/documents.js.map +1 -0
- package/dist/src/integrations/lingxiloop/event-outbox.d.ts +5 -0
- package/dist/src/integrations/lingxiloop/event-outbox.js +47 -0
- package/dist/src/integrations/lingxiloop/event-outbox.js.map +1 -0
- package/dist/src/integrations/lingxiloop/index.d.ts +3 -0
- package/dist/src/integrations/lingxiloop/index.js +3 -0
- package/dist/src/integrations/lingxiloop/index.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.d.ts +13 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.js +58 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.js +64 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.d.ts +7 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.js +88 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-missions.d.ts +18 -0
- package/dist/src/integrations/lingxiloop/learning-missions.js +95 -0
- package/dist/src/integrations/lingxiloop/learning-missions.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/learning.js +150 -0
- package/dist/src/integrations/lingxiloop/learning.js.map +1 -0
- package/dist/src/integrations/lingxiloop/memory.d.ts +14 -0
- package/dist/src/integrations/lingxiloop/memory.js +133 -0
- package/dist/src/integrations/lingxiloop/memory.js.map +1 -0
- package/dist/src/integrations/lingxiloop/polls.d.ts +9 -0
- package/dist/src/integrations/lingxiloop/polls.js +47 -0
- package/dist/src/integrations/lingxiloop/polls.js.map +1 -0
- package/dist/src/integrations/lingxiloop/presentations.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/presentations.js +34 -0
- package/dist/src/integrations/lingxiloop/presentations.js.map +1 -0
- package/dist/src/integrations/lingxiloop/questionnaire.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/questionnaire.js +57 -0
- package/dist/src/integrations/lingxiloop/questionnaire.js.map +1 -0
- package/dist/src/integrations/lingxiloop/research.d.ts +19 -0
- package/dist/src/integrations/lingxiloop/research.js +20 -0
- package/dist/src/integrations/lingxiloop/research.js.map +1 -0
- package/dist/src/integrations/lingxiloop/routines.d.ts +91 -0
- package/dist/src/integrations/lingxiloop/routines.js +198 -0
- package/dist/src/integrations/lingxiloop/routines.js.map +1 -0
- package/dist/src/integrations/lingxiloop/service-contracts.d.ts +1045 -0
- package/dist/src/integrations/lingxiloop/service-contracts.js +2 -0
- package/dist/src/integrations/lingxiloop/service-contracts.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-context.d.ts +32 -0
- package/dist/src/integrations/lingxiloop/teacher-context.js +25 -0
- package/dist/src/integrations/lingxiloop/teacher-context.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.d.ts +13 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.js +152 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.js +41 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher.d.ts +24 -0
- package/dist/src/integrations/lingxiloop/teacher.js +224 -0
- package/dist/src/integrations/lingxiloop/teacher.js.map +1 -0
- package/dist/src/kernel/manager.d.ts +52 -0
- package/dist/src/kernel/manager.js +407 -0
- package/dist/src/kernel/manager.js.map +1 -0
- package/dist/src/logging.d.ts +21 -0
- package/dist/src/logging.js +54 -0
- package/dist/src/logging.js.map +1 -0
- package/dist/src/memory/evidence.d.ts +6 -0
- package/dist/src/memory/evidence.js +43 -0
- package/dist/src/memory/evidence.js.map +1 -0
- package/dist/src/memory/processor.d.ts +3 -0
- package/dist/src/memory/processor.js +66 -0
- package/dist/src/memory/processor.js.map +1 -0
- package/dist/src/memory/semantic.d.ts +19 -0
- package/dist/src/memory/semantic.js +93 -0
- package/dist/src/memory/semantic.js.map +1 -0
- package/dist/src/memory/store.d.ts +20 -0
- package/dist/src/memory/store.js +34 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/memory/synthesis.d.ts +24 -0
- package/dist/src/memory/synthesis.js +138 -0
- package/dist/src/memory/synthesis.js.map +1 -0
- package/dist/src/metrics.d.ts +43 -0
- package/dist/src/metrics.js +130 -0
- package/dist/src/metrics.js.map +1 -0
- package/dist/src/model/driver.d.ts +60 -0
- package/dist/src/model/driver.js +2 -0
- package/dist/src/model/driver.js.map +1 -0
- package/dist/src/model/embeddings.d.ts +24 -0
- package/dist/src/model/embeddings.js +97 -0
- package/dist/src/model/embeddings.js.map +1 -0
- package/dist/src/model/openai.d.ts +45 -0
- package/dist/src/model/openai.js +340 -0
- package/dist/src/model/openai.js.map +1 -0
- package/dist/src/outcome/assessment.d.ts +16 -0
- package/dist/src/outcome/assessment.js +45 -0
- package/dist/src/outcome/assessment.js.map +1 -0
- package/dist/src/outcome/content-check.d.ts +19 -0
- package/dist/src/outcome/content-check.js +44 -0
- package/dist/src/outcome/content-check.js.map +1 -0
- package/dist/src/outcome/envelope.d.ts +34 -0
- package/dist/src/outcome/envelope.js +42 -0
- package/dist/src/outcome/envelope.js.map +1 -0
- package/dist/src/protocol/constants.d.ts +25 -0
- package/dist/src/protocol/constants.js +26 -0
- package/dist/src/protocol/constants.js.map +1 -0
- package/dist/src/protocol/kernel-wire.d.ts +74 -0
- package/dist/src/protocol/kernel-wire.js +2 -0
- package/dist/src/protocol/kernel-wire.js.map +1 -0
- package/dist/src/protocol/outcome.d.ts +16 -0
- package/dist/src/protocol/outcome.js +14 -0
- package/dist/src/protocol/outcome.js.map +1 -0
- package/dist/src/protocol/types.d.ts +266 -0
- package/dist/src/protocol/types.js +19 -0
- package/dist/src/protocol/types.js.map +1 -0
- package/dist/src/research/address.d.ts +2 -0
- package/dist/src/research/address.js +32 -0
- package/dist/src/research/address.js.map +1 -0
- package/dist/src/research/fetch.d.ts +7 -0
- package/dist/src/research/fetch.js +83 -0
- package/dist/src/research/fetch.js.map +1 -0
- package/dist/src/research/index.d.ts +26 -0
- package/dist/src/research/index.js +109 -0
- package/dist/src/research/index.js.map +1 -0
- package/dist/src/runtime/compaction.d.ts +41 -0
- package/dist/src/runtime/compaction.js +86 -0
- package/dist/src/runtime/compaction.js.map +1 -0
- package/dist/src/runtime/corrections.d.ts +20 -0
- package/dist/src/runtime/corrections.js +27 -0
- package/dist/src/runtime/corrections.js.map +1 -0
- package/dist/src/runtime/policy.d.ts +42 -0
- package/dist/src/runtime/policy.js +91 -0
- package/dist/src/runtime/policy.js.map +1 -0
- package/dist/src/runtime/resource-refresh.d.ts +8 -0
- package/dist/src/runtime/resource-refresh.js +37 -0
- package/dist/src/runtime/resource-refresh.js.map +1 -0
- package/dist/src/runtime/runtime.d.ts +51 -0
- package/dist/src/runtime/runtime.js +804 -0
- package/dist/src/runtime/runtime.js.map +1 -0
- package/dist/src/runtime/tool.d.ts +13 -0
- package/dist/src/runtime/tool.js +42 -0
- package/dist/src/runtime/tool.js.map +1 -0
- package/dist/src/ui/index.d.ts +27 -0
- package/dist/src/ui/index.js +54 -0
- package/dist/src/ui/index.js.map +1 -0
- package/dist/src/versions.d.ts +9 -0
- package/dist/src/versions.js +11 -0
- package/dist/src/versions.js.map +1 -0
- package/dist/src/worker/index.d.ts +3 -0
- package/dist/src/worker/index.js +57 -0
- package/dist/src/worker/index.js.map +1 -0
- package/dist/src/worker/main.d.ts +2 -0
- package/dist/src/worker/main.js +9 -0
- package/dist/src/worker/main.js.map +1 -0
- package/dist/src/worker/worker.d.ts +45 -0
- package/dist/src/worker/worker.js +154 -0
- package/dist/src/worker/worker.js.map +1 -0
- package/kernel/runner.py +507 -0
- package/package.json +83 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import { teacherPreview } from './teacher-preview.js';
|
|
2
|
+
import { boundedToolOutput } from '../../runtime/tool.js';
|
|
3
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
4
|
+
import { nativeWork } from './actions.js';
|
|
5
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
6
|
+
import { withTransaction } from '../../control-plane/pg-store.js';
|
|
7
|
+
import { teacherTransaction } from './teacher.js';
|
|
8
|
+
import { teacherContext } from './teacher-context.js';
|
|
9
|
+
import { RUN_SEQUENCE_SPAN } from '../../protocol/constants.js';
|
|
10
|
+
import { applyRoutineApproval, routinePreview, routineScope } from './routines.js';
|
|
11
|
+
export const TEACHER_APPROVAL_TARGETS = {
|
|
12
|
+
publish_objective: { table: 'learning_knowledge_units', key: 'objectiveId', status: 'PUBLISHED' },
|
|
13
|
+
archive_objective: { table: 'learning_knowledge_units', key: 'objectiveId', status: 'ARCHIVED' },
|
|
14
|
+
publish_activity: { table: 'learning_activities', key: 'activityId', status: 'PUBLISHED' },
|
|
15
|
+
close_activity: { table: 'learning_activities', key: 'activityId', status: 'CLOSED' },
|
|
16
|
+
review_evaluation: { table: 'learning_evaluations', key: 'evaluationId', status: 'ACCEPTED' },
|
|
17
|
+
};
|
|
18
|
+
export const TEACHER_APPROVAL_METHODS = [...Object.keys(TEACHER_APPROVAL_TARGETS), 'transition_course'];
|
|
19
|
+
export async function requestRoutineApproval(database, services, work, action) {
|
|
20
|
+
return withTransaction(database, async (client) => {
|
|
21
|
+
const preview = await routinePreview(client, services, work, action);
|
|
22
|
+
return persistApproval(client, work, action, {
|
|
23
|
+
summary: action.action === 'routines.create' ? 'Create a paused routine; activation requires separate approval' : 'Activate the reviewed routine',
|
|
24
|
+
scope: { projectId: preview.projectId, conversationId: work.sessionId }, preview,
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export async function approveRoutine(database, services, input) {
|
|
29
|
+
const reviewed = await inspectApproval(database, services, input);
|
|
30
|
+
if (!['routines.create', 'routines.activate'].includes(reviewed.action.action))
|
|
31
|
+
throw new Error('unsupported routine approval');
|
|
32
|
+
if (reviewed.status === 'EXECUTED')
|
|
33
|
+
return resumeApproved(database, input, reviewed);
|
|
34
|
+
if (reviewed.status !== 'PENDING')
|
|
35
|
+
throw new Error('routine approval is no longer pending');
|
|
36
|
+
await withTransaction(database, async (client) => {
|
|
37
|
+
await client.query("SET LOCAL lock_timeout='5s'");
|
|
38
|
+
await client.query("SET LOCAL statement_timeout='15s'");
|
|
39
|
+
const pending = await client.query(`SELECT approval.id FROM approvals approval
|
|
40
|
+
JOIN lingxios.agent_work_items work ON work.id=approval.work_id AND work.tenant_id=approval.company_id
|
|
41
|
+
WHERE approval.id=$1 AND approval.company_id=$2 AND approval.status='PENDING' AND approval.expires_at>NOW()
|
|
42
|
+
AND approval.idempotency_key=$3 AND approval.args=$4::jsonb AND approval.preview=$5::jsonb
|
|
43
|
+
AND work.status='completed' AND work.cancel_requested_at IS NULL
|
|
44
|
+
AND work.goal_outcome->>'status'='awaiting_approval' AND work.goal_outcome->>'approvalId'=$1
|
|
45
|
+
AND (work.goal_outcome->>'requestVersion')::integer=$6 AND jsonb_array_length(work.steer_inputs)+1=$6
|
|
46
|
+
FOR UPDATE OF approval,work`, [input.approvalId, input.companyId, reviewed.action.idempotencyKey,
|
|
47
|
+
JSON.stringify(reviewed.action.args), JSON.stringify(reviewed.preview), reviewed.requestVersion]);
|
|
48
|
+
if (pending.rows.length !== 1)
|
|
49
|
+
throw new Error('routine approval expired or changed before execution');
|
|
50
|
+
const native = await approvalNativeWork(client, input.companyId, reviewed.action.idempotencyKey);
|
|
51
|
+
const work = { tenantId: native.companyId, agentId: native.agentId, sessionId: native.channelId,
|
|
52
|
+
principalId: native.authorizationUserId, ...(native.threadRootClientMsgNo !== undefined ? { threadId: native.threadRootClientMsgNo } : {}) };
|
|
53
|
+
await routineScope(client, services, { ...work, principalId: input.userId });
|
|
54
|
+
const preview = await routinePreview(client, services, work, reviewed.action);
|
|
55
|
+
if (!isDeepStrictEqual(preview, reviewed.preview))
|
|
56
|
+
throw new Error('routine approval preview is stale');
|
|
57
|
+
const value = await applyRoutineApproval(client, services, work, reviewed.action, preview);
|
|
58
|
+
await client.query(`UPDATE approvals SET status='EXECUTED',resolved_at=NOW(),resolved_by=$2,executed_at=NOW(),result=$3::jsonb,error=NULL WHERE id=$1`, [input.approvalId, input.userId, JSON.stringify(value)]);
|
|
59
|
+
const receipt = await client.query(`UPDATE lingxios.agent_action_ledger SET result=$2::jsonb
|
|
60
|
+
WHERE idempotency_key=$1 AND result->'approval'->>'id'=$3 RETURNING idempotency_key`, [reviewed.action.idempotencyKey, JSON.stringify({ ok: true, value }), input.approvalId]);
|
|
61
|
+
if (receipt.rows.length !== 1)
|
|
62
|
+
throw new Error('routine approval receipt is missing');
|
|
63
|
+
});
|
|
64
|
+
return resumeApproved(database, input, reviewed);
|
|
65
|
+
}
|
|
66
|
+
/** Human-facing review only; this neither decides nor executes an approval. */
|
|
67
|
+
export async function inspectApproval(database, services, input) {
|
|
68
|
+
for (const value of [input.companyId, input.userId, input.approvalId]) {
|
|
69
|
+
if (typeof value !== 'string' || !value.trim())
|
|
70
|
+
throw new Error('approval identity is required');
|
|
71
|
+
}
|
|
72
|
+
await services.permissionService.assertCan({ actorUserId: input.userId, companyId: input.companyId,
|
|
73
|
+
action: 'agent_approval:resolve', resource: { type: 'approval', id: input.approvalId } });
|
|
74
|
+
const { rows } = await database.query(`SELECT to_jsonb(approval) AS approval, intent.intent,
|
|
75
|
+
session.request_snapshot AS request, work.steer_inputs AS revisions, work.thread_id AS thread_id
|
|
76
|
+
FROM approvals approval
|
|
77
|
+
JOIN lingxios.agent_action_intents intent ON intent.idempotency_key=approval.idempotency_key
|
|
78
|
+
JOIN lingxios.agent_work_items work ON work.id=approval.work_id
|
|
79
|
+
AND work.tenant_id=approval.company_id AND work.agent_id=approval.agent_id AND work.session_id=approval.channel_id
|
|
80
|
+
AND work.principal_id=approval.authorization_user_id
|
|
81
|
+
JOIN lingxios.agent_os_sessions session ON session.tenant_id=work.tenant_id AND session.agent_id=work.agent_id
|
|
82
|
+
AND session.session_id=work.session_id AND session.thread_id IS NOT DISTINCT FROM work.thread_id
|
|
83
|
+
WHERE approval.id=$1 AND approval.company_id=$2 AND approval.source='AGENT_OS'`, [input.approvalId, input.companyId]);
|
|
84
|
+
if (rows.length !== 1)
|
|
85
|
+
throw new Error('approval has no unique namespaced recovery record');
|
|
86
|
+
const row = rows[0];
|
|
87
|
+
const approval = row['approval'];
|
|
88
|
+
const intent = row['intent'];
|
|
89
|
+
const request = row['request'];
|
|
90
|
+
if (!intent || !request || intent.tenantId !== input.companyId || intent.workId !== approval['work_id']
|
|
91
|
+
|| intent.threadId !== row['thread_id'] || intent.action.runId !== intent.workId
|
|
92
|
+
|| intent.agentId !== approval['agent_id'] || intent.sessionId !== approval['channel_id']
|
|
93
|
+
|| intent.principalId !== approval['authorization_user_id'] || request.authorId !== intent.principalId
|
|
94
|
+
|| request.workId !== intent.workId || request.tenantId !== intent.tenantId || request.sessionId !== intent.sessionId
|
|
95
|
+
|| intent.requestVersion !== request.revisions.length + 1 || !isDeepStrictEqual(request.revisions, row['revisions'])
|
|
96
|
+
|| intent.action.idempotencyKey !== approval['idempotency_key'] || intent.action.action !== approval['action']
|
|
97
|
+
|| !isDeepStrictEqual(intent.action.args, approval['args']))
|
|
98
|
+
throw new Error('approval does not match the current request and action intent');
|
|
99
|
+
await services.permissionService.assertCan({ actorUserId: input.userId, companyId: input.companyId,
|
|
100
|
+
action: 'conversation:read', resource: { type: 'conversation', id: intent.sessionId } });
|
|
101
|
+
if (intent.action.action.startsWith('teacher.'))
|
|
102
|
+
await services.permissionService.assertCan({ actorUserId: input.userId, companyId: input.companyId,
|
|
103
|
+
action: 'learning:manage', resource: { type: 'approval', id: input.approvalId } });
|
|
104
|
+
return { approvalId: input.approvalId, status: approval['status'], requestVersion: intent.requestVersion,
|
|
105
|
+
originalInput: request.originalText, revisions: structuredClone(request.revisions), action: structuredClone(intent.action),
|
|
106
|
+
summary: approval['summary'] ?? null, preview: approval['preview'], result: approval['result'] ?? null, expiresAt: approval['expires_at'] };
|
|
107
|
+
}
|
|
108
|
+
/** Creates a domain approval; the business mutation remains unexecuted. */
|
|
109
|
+
export async function requestKnowledgeApproval(database, services, work, action) {
|
|
110
|
+
const enabledChange = action.action === 'knowledge.set_source_enabled';
|
|
111
|
+
const allowed = enabledChange ? ['sourceId', 'enabled'] : ['sourceId'];
|
|
112
|
+
if ((!enabledChange && action.action !== 'knowledge.delete_source')
|
|
113
|
+
|| Object.keys(action.args).some(key => !allowed.includes(key))
|
|
114
|
+
|| typeof action.args['sourceId'] !== 'string' || !action.args['sourceId'].trim()
|
|
115
|
+
|| (enabledChange && typeof action.args['enabled'] !== 'boolean'))
|
|
116
|
+
throw new Error('invalid knowledge approval arguments');
|
|
117
|
+
const native = nativeWork(work);
|
|
118
|
+
const sourceId = action.args['sourceId'];
|
|
119
|
+
await services.permissionService.assertCan({ actorUserId: native.authorizationUserId, companyId: native.companyId,
|
|
120
|
+
action: 'knowledge:manage', resource: { type: 'knowledge_source', id: sourceId } });
|
|
121
|
+
const sources = await services.knowledge.listKnowledgeSourcesForAgent(native);
|
|
122
|
+
const source = sources.find(item => item && typeof item === 'object' && item['id'] === sourceId);
|
|
123
|
+
if (!source)
|
|
124
|
+
throw new Error('knowledge source is outside the current workspace');
|
|
125
|
+
const preview = { sourceId, sourceStateSha256: createHash('sha256').update(JSON.stringify(source)).digest('hex'), title: typeof source['title'] === 'string' ? source['title'].slice(0, 2000) : sourceId,
|
|
126
|
+
...(enabledChange ? { enabled: action.args['enabled'] } : {}) };
|
|
127
|
+
return persistApproval(database, work, action, {
|
|
128
|
+
summary: enabledChange ? 'Change knowledge source availability' : 'Delete knowledge source',
|
|
129
|
+
scope: { risk: 'sensitive_or_destructive_action', sourceId }, preview,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
export async function requestTeacherApproval(database, services, work, action) {
|
|
133
|
+
if (work.kind === 'teacher_digest')
|
|
134
|
+
throw new Error('scheduled teacher summaries are read-only');
|
|
135
|
+
const method = action.action.slice('teacher.'.length);
|
|
136
|
+
const fields = { publish_objective: ['objectiveId'], archive_objective: ['objectiveId'], publish_activity: ['activityId'], close_activity: ['activityId'], transition_course: ['command'], set_teacher_membership: ['userId', 'enabled'], review_evaluation: ['evaluationId', 'decision', 'reason'] };
|
|
137
|
+
if (!action.action.startsWith('teacher.') || !Object.hasOwn(fields, method)
|
|
138
|
+
|| Object.keys(action.args).some(key => !fields[method].includes(key)))
|
|
139
|
+
throw new Error('invalid teacher approval action');
|
|
140
|
+
for (const key of fields[method]) {
|
|
141
|
+
const value = action.args[key];
|
|
142
|
+
if (key === 'enabled') {
|
|
143
|
+
if (typeof value !== 'boolean')
|
|
144
|
+
throw new Error('enabled must be boolean');
|
|
145
|
+
}
|
|
146
|
+
else if (typeof value !== 'string' || !value.trim() || value.length > (key === 'reason' ? 10000 : 2000))
|
|
147
|
+
throw new Error('invalid teacher approval argument');
|
|
148
|
+
}
|
|
149
|
+
if (method === 'transition_course' && !['END', 'ENTER_READ_ONLY', 'ARCHIVE'].includes(String(action.args['command'])))
|
|
150
|
+
throw new Error('invalid course transition');
|
|
151
|
+
if (method === 'review_evaluation' && action.args['decision'] !== 'accept' && action.args['decision'] !== 'reject')
|
|
152
|
+
throw new Error('invalid evaluation decision');
|
|
153
|
+
const context = await teacherContext(work, services, database);
|
|
154
|
+
if (!services.teacher?.assertTeacherApprovalFresh)
|
|
155
|
+
throw new Error('native teacher approval services are required');
|
|
156
|
+
if (method === 'set_teacher_membership' && (!services.teacher.requireLearningCourseRole || !services.teacher.setLearningCourseMembershipRecord || !services.teacher.enqueueLearningEffect))
|
|
157
|
+
throw new Error('native transactional teacher membership services are required');
|
|
158
|
+
const metadata = await teacherPreview(database, services.teacher, work.tenantId, context, action);
|
|
159
|
+
const entityId = method === 'transition_course' ? context.course.id
|
|
160
|
+
: String(action.args[fields[method][0]] ?? '').trim();
|
|
161
|
+
if (!metadata || metadata.requestedBy !== work.principalId || metadata.scope['projectId'] !== context.agent.projectId
|
|
162
|
+
|| metadata.scope['courseId'] !== context.course.id || metadata.scope['roomId'] !== work.sessionId
|
|
163
|
+
|| metadata.preview['method'] !== method || metadata.preview['entityId'] !== entityId || !isDeepStrictEqual(metadata.preview['args'], action.args)
|
|
164
|
+
|| (method === 'set_teacher_membership' ? typeof metadata.preview['currentVersion'] !== 'boolean'
|
|
165
|
+
: typeof metadata.preview['currentVersion'] !== 'string' || !metadata.preview['currentVersion'].trim())
|
|
166
|
+
|| typeof metadata.summary !== 'string' || !metadata.summary.trim())
|
|
167
|
+
throw new Error('teacher approval preview does not match the scoped request');
|
|
168
|
+
return persistApproval(database, work, action, method === 'transition_course' && action.args['command'] !== 'END'
|
|
169
|
+
? { ...metadata, summary: `${metadata.summary}. This closes the teacher room and stops continuation of this task; external archive synchronization is separate.` }
|
|
170
|
+
: metadata);
|
|
171
|
+
}
|
|
172
|
+
export async function persistApproval(database, work, action, metadata) {
|
|
173
|
+
const { rows } = await database.query(`INSERT INTO approvals
|
|
174
|
+
(id,company_id,agent_id,channel_id,source,work_id,authorization_user_id,idempotency_key,action,args,summary,requested_by,scope,preview,expires_at)
|
|
175
|
+
SELECT $1,$2,$3,$4,'AGENT_OS',$5,$6,$7,$8,$9::jsonb,$10,$6,$11::jsonb,$12::jsonb,NOW()+INTERVAL '1 hour'
|
|
176
|
+
FROM lingxios.agent_action_intents intent
|
|
177
|
+
JOIN lingxios.agent_work_items work ON work.id=$5 AND work.tenant_id=$2 AND work.agent_id=$3 AND work.session_id=$4
|
|
178
|
+
WHERE intent.idempotency_key=$7 AND work.fence=$13 AND work.status='leased'
|
|
179
|
+
AND work.cancel_requested_at IS NULL AND work.lease_expires_at>NOW()
|
|
180
|
+
AND (intent.intent->>'requestVersion')::integer=jsonb_array_length(work.steer_inputs)+1
|
|
181
|
+
AND intent.intent->>'workId'=$5 AND intent.intent->>'tenantId'=$2
|
|
182
|
+
AND intent.intent->>'principalId'=$6 AND intent.intent->'action'->'args'=$9::jsonb
|
|
183
|
+
AND intent.intent->'action'->>'action'=$8
|
|
184
|
+
ON CONFLICT(idempotency_key) DO NOTHING RETURNING id`, [randomUUID(), work.tenantId, work.agentId, work.sessionId, work.id, work.principalId, action.idempotencyKey,
|
|
185
|
+
action.action, JSON.stringify(action.args), metadata.summary,
|
|
186
|
+
JSON.stringify(metadata.scope), JSON.stringify(metadata.preview), work.fence]);
|
|
187
|
+
if (rows.length !== 1)
|
|
188
|
+
throw new Error('approval creation requires a new matching durable action intent; reconcile existing approvals');
|
|
189
|
+
return { ok: false, approval: { id: String(rows[0]['id']), status: 'PENDING' } };
|
|
190
|
+
}
|
|
191
|
+
export async function rejectApproval(database, services, input) {
|
|
192
|
+
const reviewed = await inspectApproval(database, services, input);
|
|
193
|
+
return withTransaction(database, async (client) => {
|
|
194
|
+
await client.query("SET LOCAL lock_timeout='5s'");
|
|
195
|
+
await client.query("SET LOCAL statement_timeout='15s'");
|
|
196
|
+
// ponytail: rare approval resumes briefly serialize lease writes; use per-session coordination if contention matters.
|
|
197
|
+
await client.query('LOCK TABLE lingxios.agent_os_session_leases IN SHARE ROW EXCLUSIVE MODE');
|
|
198
|
+
const { rows } = await client.query(`SELECT approval.status, work.id, session.session_key
|
|
199
|
+
FROM approvals approval JOIN lingxios.agent_work_items work ON work.id=approval.work_id
|
|
200
|
+
JOIN lingxios.agent_os_sessions session ON session.tenant_id=work.tenant_id AND session.agent_id=work.agent_id
|
|
201
|
+
AND session.session_id=work.session_id AND session.thread_id IS NOT DISTINCT FROM work.thread_id
|
|
202
|
+
WHERE approval.id=$1 AND approval.company_id=$2 AND work.tenant_id=$2
|
|
203
|
+
AND approval.idempotency_key=$3 AND approval.args=$4::jsonb AND approval.action=$5
|
|
204
|
+
AND session.request_snapshot->>'workId'=work.id
|
|
205
|
+
AND jsonb_array_length(work.steer_inputs)+1=$6
|
|
206
|
+
AND session.request_snapshot->'revisions'=work.steer_inputs
|
|
207
|
+
FOR UPDATE OF approval,work,session`, [input.approvalId, input.companyId, reviewed.action.idempotencyKey, JSON.stringify(reviewed.action.args), reviewed.action.action, reviewed.requestVersion]);
|
|
208
|
+
const row = rows[0];
|
|
209
|
+
if (rows.length !== 1 || !row)
|
|
210
|
+
throw new Error('approval changed before rejection');
|
|
211
|
+
if (row['status'] === 'REJECTED')
|
|
212
|
+
return { status: 'already_rejected', workId: String(row['id']) };
|
|
213
|
+
if (row['status'] !== 'PENDING')
|
|
214
|
+
throw new Error('approval is no longer pending');
|
|
215
|
+
const active = await client.query('SELECT work_id FROM lingxios.agent_os_session_leases WHERE session_key=$1 AND expires_at>NOW()', [row['session_key']]);
|
|
216
|
+
if (active.rows.length)
|
|
217
|
+
throw new Error('session is active; retry rejection after it pauses');
|
|
218
|
+
const resumed = await client.query(`UPDATE lingxios.agent_work_items SET status='queued', available_at=NOW(),
|
|
219
|
+
goal_outcome=NULL,finished_at=NULL,result_text=NULL,error=NULL,updated_at=NOW()
|
|
220
|
+
WHERE id=$1 AND status='completed' AND cancel_requested_at IS NULL
|
|
221
|
+
AND goal_outcome->>'status'='awaiting_approval' AND goal_outcome->>'approvalId'=$2
|
|
222
|
+
AND (goal_outcome->>'requestVersion')::integer=$3 RETURNING id`, [row['id'], input.approvalId, reviewed.requestVersion]);
|
|
223
|
+
if (resumed.rows.length !== 1)
|
|
224
|
+
throw new Error('work is not waiting for this approval');
|
|
225
|
+
const receipt = await client.query(`UPDATE lingxios.agent_action_ledger SET result=$2::jsonb
|
|
226
|
+
WHERE idempotency_key=$1 AND result->'approval'->>'id'=$3 RETURNING idempotency_key`, [reviewed.action.idempotencyKey, JSON.stringify({ ok: false, error: 'Human rejected this action; do not execute it' }), input.approvalId]);
|
|
227
|
+
if (receipt.rows.length !== 1)
|
|
228
|
+
throw new Error('pending approval receipt is missing');
|
|
229
|
+
await client.query(`UPDATE approvals SET status='REJECTED',resolved_at=NOW(),resolved_by=$2 WHERE id=$1`, [input.approvalId, input.userId]);
|
|
230
|
+
await client.query(`UPDATE lingxios.agent_os_sessions SET history=history || $2::jsonb,revision=revision+1,updated_at=NOW() WHERE session_key=$1`, [row['session_key'], JSON.stringify([{ role: 'user', content: `Approval ${input.approvalId} was rejected by the human reviewer. The proposed action was not executed by this approval. Do not repeat it or bypass the rejection; continue with the permitted parts of the original request.` }])]);
|
|
231
|
+
return { status: 'resumed', workId: String(row['id']) };
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
export async function approveTeacher(database, services, input) {
|
|
235
|
+
const reviewed = await inspectApproval(database, services, input);
|
|
236
|
+
const method = reviewed.action.action.slice('teacher.'.length);
|
|
237
|
+
const membership = method === 'set_teacher_membership';
|
|
238
|
+
const transition = method === 'transition_course';
|
|
239
|
+
if (!reviewed.action.action.startsWith('teacher.') || !membership && !TEACHER_APPROVAL_METHODS.includes(method))
|
|
240
|
+
throw new Error('unsupported teacher approval execution');
|
|
241
|
+
if (reviewed.status === 'EXECUTED')
|
|
242
|
+
return resumeApproved(database, input, reviewed);
|
|
243
|
+
if (reviewed.status !== 'PENDING')
|
|
244
|
+
throw new Error('teacher approval is no longer pending');
|
|
245
|
+
const teacher = services.teacher;
|
|
246
|
+
if (!teacher?.assertTeacherApprovalFresh)
|
|
247
|
+
throw new Error('native teacher approval services are required');
|
|
248
|
+
if (membership && (!teacher.requireLearningCourseRole || !teacher.setLearningCourseMembershipRecord || !teacher.enqueueLearningEffect))
|
|
249
|
+
throw new Error('native transactional teacher membership services are required');
|
|
250
|
+
const target = TEACHER_APPROVAL_TARGETS[method];
|
|
251
|
+
await withTransaction(database, async (client) => {
|
|
252
|
+
await client.query("SET LOCAL lock_timeout='5s'");
|
|
253
|
+
await client.query("SET LOCAL statement_timeout='15s'");
|
|
254
|
+
const pending = await client.query(`SELECT approval.id FROM approvals approval
|
|
255
|
+
JOIN lingxios.agent_work_items work ON work.id=approval.work_id AND work.tenant_id=approval.company_id
|
|
256
|
+
WHERE approval.id=$1 AND approval.company_id=$2 AND approval.status='PENDING' AND approval.expires_at>NOW()
|
|
257
|
+
AND approval.idempotency_key=$3 AND approval.args=$4::jsonb AND approval.preview=$5::jsonb
|
|
258
|
+
AND work.status='completed' AND work.cancel_requested_at IS NULL
|
|
259
|
+
AND work.goal_outcome->>'status'='awaiting_approval' AND work.goal_outcome->>'approvalId'=$1
|
|
260
|
+
AND (work.goal_outcome->>'requestVersion')::integer=$6 AND jsonb_array_length(work.steer_inputs)+1=$6
|
|
261
|
+
FOR UPDATE OF approval,work`, [input.approvalId, input.companyId, reviewed.action.idempotencyKey,
|
|
262
|
+
JSON.stringify(reviewed.action.args), JSON.stringify(reviewed.preview), reviewed.requestVersion]);
|
|
263
|
+
if (pending.rows.length !== 1)
|
|
264
|
+
throw new Error('teacher approval expired or changed before execution');
|
|
265
|
+
const native = await approvalNativeWork(client, input.companyId, reviewed.action.idempotencyKey);
|
|
266
|
+
const locked = transition ? await client.query(`SELECT project.id,course.id AS course_id,course.project_id FROM projects project
|
|
267
|
+
JOIN courses course ON course.company_id=project.company_id AND course.project_id=project.id
|
|
268
|
+
JOIN learning_course_teacher_rooms room ON room.company_id=course.company_id AND room.course_id=course.id
|
|
269
|
+
WHERE project.company_id=$1 AND course.id=$2 AND room.conversation_id=$3 AND room.status='active'
|
|
270
|
+
FOR UPDATE OF project,course,room`, [input.companyId, reviewed.preview['entityId'], native.channelId])
|
|
271
|
+
: membership ? await client.query(`SELECT course.id AS course_id,course.project_id FROM courses course
|
|
272
|
+
JOIN learning_course_teacher_rooms room ON room.company_id=course.company_id AND room.course_id=course.id
|
|
273
|
+
WHERE course.company_id=$1 AND room.conversation_id=$2 FOR UPDATE OF course,room`, [input.companyId, native.channelId])
|
|
274
|
+
: await client.query(`SELECT target.id,course.id AS course_id,course.project_id FROM ${target.table} target
|
|
275
|
+
JOIN courses course ON course.company_id=target.company_id AND course.project_id=target.project_id
|
|
276
|
+
JOIN learning_course_teacher_rooms room ON room.company_id=course.company_id AND room.course_id=course.id
|
|
277
|
+
WHERE target.company_id=$1 AND target.id=$2 AND room.conversation_id=$3
|
|
278
|
+
FOR UPDATE OF target,course,room`, [input.companyId, reviewed.action.args[target.key], native.channelId]);
|
|
279
|
+
if (locked.rows.length !== 1)
|
|
280
|
+
throw new Error('teacher approval target is outside the current course');
|
|
281
|
+
const context = await teacherContext({ tenantId: native.companyId, agentId: native.agentId, sessionId: native.channelId,
|
|
282
|
+
principalId: native.authorizationUserId, kind: 'resume' }, services, client);
|
|
283
|
+
const metadata = await teacherPreview(client, teacher, native.companyId, context, reviewed.action);
|
|
284
|
+
if (!metadata || metadata.requestedBy !== native.authorizationUserId || metadata.scope['courseId'] !== locked.rows[0]['course_id']
|
|
285
|
+
|| metadata.scope['projectId'] !== locked.rows[0]['project_id'] || metadata.scope['roomId'] !== native.channelId
|
|
286
|
+
|| !isDeepStrictEqual(metadata.preview, reviewed.preview))
|
|
287
|
+
throw new Error('teacher approval preview is stale');
|
|
288
|
+
await teacher.assertTeacherApprovalFresh({ channelId: native.channelId, companyId: input.companyId, action: reviewed.action.action, preview: metadata.preview }, client);
|
|
289
|
+
let value;
|
|
290
|
+
if (membership) {
|
|
291
|
+
const courseId = String(locked.rows[0]['course_id']);
|
|
292
|
+
await teacher.requireLearningCourseRole(client, { companyId: input.companyId, courseId, userId: native.authorizationUserId, role: 'teacher' });
|
|
293
|
+
const outcome = await teacher.setLearningCourseMembershipRecord(client, { companyId: input.companyId, courseId,
|
|
294
|
+
userId: String(reviewed.action.args['userId']), role: 'teacher', enabled: reviewed.action.args['enabled'] });
|
|
295
|
+
if (outcome !== 'updated')
|
|
296
|
+
throw new Error(`teacher membership change rejected: ${outcome}`);
|
|
297
|
+
const observed = await client.query(`SELECT 1 FROM project_memberships WHERE company_id=$1 AND project_id=$2
|
|
298
|
+
AND user_id=$3 AND status='ACTIVE' AND role IN ('OWNER','TEACHER')`, [input.companyId, locked.rows[0]['project_id'], reviewed.action.args['userId']]);
|
|
299
|
+
if (Boolean(observed.rows.length) !== reviewed.action.args['enabled'])
|
|
300
|
+
throw new Error('teacher membership postcondition was not observed');
|
|
301
|
+
await teacher.enqueueLearningEffect(client, { companyId: input.companyId, courseId, kind: 'teacher_room.sync' });
|
|
302
|
+
value = { ok: true, enabled: reviewed.action.args['enabled'], channelSync: 'queued' };
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
const scope = { companyId: input.companyId, courseId: context.course.id, teacherId: context.trigger.teacherId };
|
|
306
|
+
const transaction = teacherTransaction(client), args = reviewed.action.args;
|
|
307
|
+
if (method === 'publish_objective' || method === 'archive_objective') {
|
|
308
|
+
await teacher.setLearningObjectiveStatus(client, { ...scope, objectiveId: String(args['objectiveId']).trim(), status: method === 'publish_objective' ? 'PUBLISHED' : 'ARCHIVED' });
|
|
309
|
+
value = { ok: true };
|
|
310
|
+
}
|
|
311
|
+
else if (method === 'publish_activity') {
|
|
312
|
+
await teacher.publishLearningActivity(transaction, { ...scope, activityId: String(args['activityId']).trim() });
|
|
313
|
+
value = { ok: true };
|
|
314
|
+
}
|
|
315
|
+
else if (method === 'close_activity') {
|
|
316
|
+
await teacher.closeLearningActivity(client, { ...scope, activityId: String(args['activityId']).trim() });
|
|
317
|
+
value = { ok: true };
|
|
318
|
+
}
|
|
319
|
+
else if (method === 'review_evaluation') {
|
|
320
|
+
await teacher.reviewLearningEvaluation(client, transaction, teacher.inc, { ...scope, evaluationId: String(args['evaluationId']).trim(), decision: args['decision'], reason: String(args['reason']).trim() });
|
|
321
|
+
value = { ok: true };
|
|
322
|
+
}
|
|
323
|
+
else if (method === 'transition_course') {
|
|
324
|
+
const lifecycle = new teacher.ProjectLifecycleApplication({ transaction, auditInTransaction: teacher.auditInTransaction, projectLifecycleProjection: teacher.projectLifecycleProjection });
|
|
325
|
+
value = await lifecycle.executeInTransaction(client, { actorUserId: context.trigger.teacherId, companyId: input.companyId, projectId: context.agent.projectId, command: args['command'] });
|
|
326
|
+
}
|
|
327
|
+
else
|
|
328
|
+
throw new Error('unsupported teacher approval execution');
|
|
329
|
+
if (!value || typeof value !== 'object' || Reflect.get(value, 'ok') !== true)
|
|
330
|
+
throw new Error('teacher approval action was not acknowledged');
|
|
331
|
+
if (transition) {
|
|
332
|
+
const expectedStatus = { END: 'COURSE_ENDED', ENTER_READ_ONLY: 'READ_ONLY', ARCHIVE: 'ARCHIVED' }[String(reviewed.action.args['command'])];
|
|
333
|
+
const observed = await client.query(`SELECT project.status,room.status AS room_status FROM projects project
|
|
334
|
+
JOIN courses course ON course.company_id=project.company_id AND course.project_id=project.id
|
|
335
|
+
JOIN learning_course_teacher_rooms room ON room.company_id=course.company_id AND room.course_id=course.id
|
|
336
|
+
WHERE project.company_id=$1 AND course.id=$2 AND room.conversation_id=$3`, [input.companyId, locked.rows[0]['course_id'], native.channelId]);
|
|
337
|
+
const roomStatus = expectedStatus === 'COURSE_ENDED' ? 'active' : 'closed';
|
|
338
|
+
if (!expectedStatus || observed.rows.length !== 1 || observed.rows[0]['status'] !== expectedStatus
|
|
339
|
+
|| observed.rows[0]['room_status'] !== roomStatus || Reflect.get(value, 'status') !== expectedStatus
|
|
340
|
+
|| typeof Reflect.get(value, 'applied') !== 'boolean')
|
|
341
|
+
throw new Error('teacher course transition postcondition was not observed');
|
|
342
|
+
value = { ...value, teacherRoomStatus: roomStatus };
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
const observed = await client.query(`SELECT status FROM ${target.table} WHERE company_id=$1 AND id=$2`, [input.companyId, reviewed.action.args[target.key]]);
|
|
346
|
+
const expectedStatus = method === 'review_evaluation' && reviewed.action.args['decision'] === 'reject' ? 'REJECTED' : target.status;
|
|
347
|
+
if (observed.rows.length !== 1 || observed.rows[0]['status'] !== expectedStatus)
|
|
348
|
+
throw new Error('teacher approval postcondition was not observed');
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
await client.query(`UPDATE approvals SET status='EXECUTED',resolved_at=NOW(),resolved_by=$2,executed_at=NOW(),result=$3::jsonb,error=NULL WHERE id=$1`, [input.approvalId, input.userId, JSON.stringify(value)]);
|
|
352
|
+
const receipt = await client.query(`UPDATE lingxios.agent_action_ledger SET result=$2::jsonb
|
|
353
|
+
WHERE idempotency_key=$1 AND result->'approval'->>'id'=$3 RETURNING idempotency_key`, [reviewed.action.idempotencyKey, JSON.stringify({ ok: true, value }), input.approvalId]);
|
|
354
|
+
if (receipt.rows.length !== 1)
|
|
355
|
+
throw new Error('teacher approval receipt is missing');
|
|
356
|
+
});
|
|
357
|
+
return resumeApproved(database, input, reviewed);
|
|
358
|
+
}
|
|
359
|
+
export async function approveKnowledge(database, services, input) {
|
|
360
|
+
const reviewed = await inspectApproval(database, services, input);
|
|
361
|
+
if (reviewed.action.action !== 'knowledge.set_source_enabled' && reviewed.action.action !== 'knowledge.delete_source')
|
|
362
|
+
throw new Error('unsupported approval action');
|
|
363
|
+
if (reviewed.status === 'EXECUTED')
|
|
364
|
+
return resumeApproved(database, input, reviewed);
|
|
365
|
+
if (reviewed.status === 'APPROVED')
|
|
366
|
+
return { status: 'reconciliation_required' };
|
|
367
|
+
if (reviewed.status !== 'PENDING')
|
|
368
|
+
throw new Error('approval is no longer pending');
|
|
369
|
+
const native = await approvalNativeWork(database, input.companyId, reviewed.action.idempotencyKey);
|
|
370
|
+
const sourceId = reviewed.action.args['sourceId'];
|
|
371
|
+
const enabled = reviewed.action.args['enabled'];
|
|
372
|
+
if (typeof sourceId !== 'string' || (reviewed.action.action === 'knowledge.set_source_enabled' && typeof enabled !== 'boolean'))
|
|
373
|
+
throw new Error('invalid approved action arguments');
|
|
374
|
+
await services.permissionService.assertCan({ actorUserId: native.authorizationUserId, companyId: input.companyId,
|
|
375
|
+
action: 'knowledge:manage', resource: { type: 'knowledge_source', id: sourceId } });
|
|
376
|
+
const sources = await services.knowledge.listKnowledgeSourcesForAgent(native);
|
|
377
|
+
const source = sources.find(item => item && typeof item === 'object' && item['id'] === sourceId);
|
|
378
|
+
const preview = reviewed.preview;
|
|
379
|
+
if (!source || !preview || preview['sourceStateSha256'] !== createHash('sha256').update(JSON.stringify(source)).digest('hex'))
|
|
380
|
+
throw new Error('knowledge source changed; request a fresh approval preview');
|
|
381
|
+
const started = await withTransaction(database, async (client) => {
|
|
382
|
+
const changed = await client.query(`UPDATE approvals SET status='APPROVED',resolved_at=NOW(),resolved_by=$2
|
|
383
|
+
WHERE id=$1 AND company_id=$3 AND status='PENDING' AND expires_at>NOW()
|
|
384
|
+
AND idempotency_key=$4 AND args=$5::jsonb AND preview=$6::jsonb
|
|
385
|
+
AND EXISTS(SELECT 1 FROM lingxios.agent_work_items work WHERE work.id=approvals.work_id
|
|
386
|
+
AND work.tenant_id=$3 AND work.status='completed' AND work.cancel_requested_at IS NULL
|
|
387
|
+
AND work.goal_outcome->>'status'='awaiting_approval' AND work.goal_outcome->>'approvalId'=$1
|
|
388
|
+
AND (work.goal_outcome->>'requestVersion')::integer=$7 AND jsonb_array_length(work.steer_inputs)+1=$7)
|
|
389
|
+
RETURNING id`, [input.approvalId, input.userId, input.companyId, reviewed.action.idempotencyKey,
|
|
390
|
+
JSON.stringify(reviewed.action.args), JSON.stringify(reviewed.preview), reviewed.requestVersion]);
|
|
391
|
+
if (!changed.rows.length)
|
|
392
|
+
return false;
|
|
393
|
+
const receipt = await client.query(`UPDATE lingxios.agent_action_ledger SET result=$2::jsonb
|
|
394
|
+
WHERE idempotency_key=$1 AND result->'approval'->>'id'=$3 RETURNING idempotency_key`, [reviewed.action.idempotencyKey, JSON.stringify({ ok: false, executionState: 'unknown', error: 'Approved action execution started; reconcile before retrying' }), input.approvalId]);
|
|
395
|
+
if (receipt.rows.length !== 1)
|
|
396
|
+
throw new Error('pending approval receipt is missing');
|
|
397
|
+
return true;
|
|
398
|
+
});
|
|
399
|
+
if (!started)
|
|
400
|
+
throw new Error('approval expired or changed before execution');
|
|
401
|
+
let value;
|
|
402
|
+
try {
|
|
403
|
+
if (reviewed.action.action === 'knowledge.set_source_enabled') {
|
|
404
|
+
const result = await services.knowledge.setKnowledgeSourceEnabled(native, sourceId, enabled);
|
|
405
|
+
if (result.enabled !== enabled)
|
|
406
|
+
throw new Error('native result does not confirm the approved availability');
|
|
407
|
+
value = result;
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
const result = await services.knowledge.deleteKnowledgeSourceForAgent(native, sourceId);
|
|
411
|
+
if (result.deleted !== true)
|
|
412
|
+
throw new Error('native result does not confirm deletion');
|
|
413
|
+
value = { ...result, externalAssetCleanup: 'not_verified' };
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
return { status: 'reconciliation_required' };
|
|
418
|
+
}
|
|
419
|
+
await recordApprovedResult(database, input, reviewed.action.idempotencyKey, value);
|
|
420
|
+
return resumeApproved(database, input, reviewed);
|
|
421
|
+
}
|
|
422
|
+
export async function resumeApproved(database, input, reviewed) {
|
|
423
|
+
return withTransaction(database, async (client) => {
|
|
424
|
+
await client.query("SET LOCAL lock_timeout='5s'");
|
|
425
|
+
await client.query("SET LOCAL statement_timeout='15s'");
|
|
426
|
+
// ponytail: same brief lease-write lock as rejection; replace with per-session coordination if contention matters.
|
|
427
|
+
await client.query('LOCK TABLE lingxios.agent_os_session_leases IN SHARE ROW EXCLUSIVE MODE');
|
|
428
|
+
const { rows } = await client.query(`SELECT approval.resumed_at,approval.result,work.id,session.session_key
|
|
429
|
+
FROM approvals approval JOIN lingxios.agent_work_items work ON work.id=approval.work_id
|
|
430
|
+
JOIN lingxios.agent_action_ledger ledger ON ledger.idempotency_key=approval.idempotency_key
|
|
431
|
+
JOIN lingxios.agent_os_sessions session ON session.tenant_id=work.tenant_id AND session.agent_id=work.agent_id
|
|
432
|
+
AND session.session_id=work.session_id AND session.thread_id IS NOT DISTINCT FROM work.thread_id
|
|
433
|
+
WHERE approval.id=$1 AND approval.company_id=$2 AND work.tenant_id=$2 AND approval.status='EXECUTED'
|
|
434
|
+
AND approval.idempotency_key=$3 AND approval.args=$4::jsonb AND approval.action=$5
|
|
435
|
+
AND ledger.result=jsonb_build_object('ok',true,'value',approval.result)
|
|
436
|
+
AND session.request_snapshot->>'workId'=work.id
|
|
437
|
+
AND jsonb_array_length(work.steer_inputs)+1=$6 AND session.request_snapshot->'revisions'=work.steer_inputs
|
|
438
|
+
FOR UPDATE OF approval,work,session,ledger`, [input.approvalId, input.companyId, reviewed.action.idempotencyKey, JSON.stringify(reviewed.action.args), reviewed.action.action, reviewed.requestVersion]);
|
|
439
|
+
const row = rows[0];
|
|
440
|
+
if (rows.length !== 1 || !row)
|
|
441
|
+
throw new Error('approved execution lacks matching durable recovery records');
|
|
442
|
+
const closedCourse = reviewed.action.action === 'teacher.transition_course'
|
|
443
|
+
&& row['result']?.['teacherRoomStatus'] === 'closed';
|
|
444
|
+
const unavailable = { status: 'continuation_unavailable', workId: String(row['id']), result: row['result'] };
|
|
445
|
+
if (row['resumed_at'])
|
|
446
|
+
return closedCourse ? unavailable : { status: 'already_resumed', workId: String(row['id']) };
|
|
447
|
+
const active = await client.query('SELECT work_id FROM lingxios.agent_os_session_leases WHERE session_key=$1 AND expires_at>NOW()', [row['session_key']]);
|
|
448
|
+
if (active.rows.length)
|
|
449
|
+
throw new Error('execution recorded; session is active, retry continuation after it pauses');
|
|
450
|
+
const gap = 'The approved course transition closed the teacher room. Remaining work cannot continue in this room; overall goal acceptance and external archive synchronization are not verified.';
|
|
451
|
+
const outcome = closedCourse ? { status: 'blocked', verification: 'inconclusive', requestVersion: reviewed.requestVersion, gaps: [gap] } : null;
|
|
452
|
+
const resumed = await client.query(`UPDATE lingxios.agent_work_items SET status=CASE WHEN $4::jsonb IS NULL THEN 'queued' ELSE 'completed' END,available_at=NOW(),
|
|
453
|
+
goal_outcome=$4::jsonb,finished_at=CASE WHEN $4::jsonb IS NULL THEN NULL ELSE NOW() END,result_text=$5,error=NULL,updated_at=NOW()
|
|
454
|
+
WHERE id=$1 AND status='completed' AND cancel_requested_at IS NULL
|
|
455
|
+
AND goal_outcome->>'status'='awaiting_approval' AND goal_outcome->>'approvalId'=$2
|
|
456
|
+
AND (goal_outcome->>'requestVersion')::integer=$3 RETURNING id`, [row['id'], input.approvalId, reviewed.requestVersion, outcome ? JSON.stringify(outcome) : null, closedCourse ? gap : null]);
|
|
457
|
+
if (resumed.rows.length !== 1)
|
|
458
|
+
throw new Error('execution recorded; work is not waiting for this approval');
|
|
459
|
+
if (closedCourse) {
|
|
460
|
+
const event = await client.query(`INSERT INTO lingxios.agent_run_events(run_id,seq,tenant_id,agent_id,kind,stage,visibility,data,recorded_at)
|
|
461
|
+
SELECT work.id,GREATEST(COALESCE(MAX(event.seq),0),(work.fence::bigint-1)*$4)+1,
|
|
462
|
+
work.tenant_id,work.agent_id,'approval.continuation_stopped','completed','user',$3::jsonb,NOW()
|
|
463
|
+
FROM lingxios.agent_work_items work LEFT JOIN lingxios.agent_run_events event ON event.run_id=work.id
|
|
464
|
+
WHERE work.id=$1 AND work.tenant_id=$2
|
|
465
|
+
GROUP BY work.id,work.tenant_id,work.agent_id,work.fence
|
|
466
|
+
HAVING GREATEST(COALESCE(MAX(event.seq),0),(work.fence::bigint-1)*$4)<work.fence::bigint*$4 RETURNING seq`, [row['id'], input.companyId, JSON.stringify({ approvalId: input.approvalId, goalOutcome: outcome }), RUN_SEQUENCE_SPAN]);
|
|
467
|
+
if (event.rows.length !== 1)
|
|
468
|
+
throw new Error('execution recorded; no event sequence remains for the stopped continuation');
|
|
469
|
+
}
|
|
470
|
+
await client.query(`UPDATE lingxios.agent_os_sessions SET history=history || $2::jsonb,revision=revision+1,updated_at=NOW() WHERE session_key=$1`, [row['session_key'], JSON.stringify([{ role: 'user', content: `Approval ${input.approvalId} was granted. Recorded action result: ${boundedToolOutput(row['result'])}. Do not execute the same action again. ` + (closedCourse ? gap : 'Continue checking the original request and remaining deliverables; this receipt alone does not prove overall completion.') }])]);
|
|
471
|
+
await client.query('UPDATE approvals SET resumed_at=NOW() WHERE id=$1', [input.approvalId]);
|
|
472
|
+
return closedCourse ? unavailable : { status: 'resumed', workId: String(row['id']) };
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
async function approvalNativeWork(database, companyId, idempotencyKey) {
|
|
476
|
+
const { rows } = await database.query(`SELECT work.*,intent.intent FROM lingxios.agent_work_items work
|
|
477
|
+
JOIN lingxios.agent_action_intents intent ON intent.intent->>'workId'=work.id
|
|
478
|
+
WHERE intent.idempotency_key=$1 AND work.tenant_id=$2`, [idempotencyKey, companyId]);
|
|
479
|
+
if (rows.length !== 1)
|
|
480
|
+
throw new Error('approval action identity is missing');
|
|
481
|
+
const row = rows[0];
|
|
482
|
+
const intent = row['intent'];
|
|
483
|
+
const work = { id: intent.workId, tenantId: intent.tenantId, principalId: intent.principalId, agentId: intent.agentId,
|
|
484
|
+
sessionId: intent.sessionId, ...(intent.threadId !== null ? { threadId: intent.threadId } : {}), kind: 'resume', lane: 'approval',
|
|
485
|
+
triggerRef: String(row['trigger_ref']), fence: Number(row['fence']), homeEpoch: 1 };
|
|
486
|
+
return nativeWork(work);
|
|
487
|
+
}
|
|
488
|
+
async function recordApprovedResult(database, input, idempotencyKey, value) {
|
|
489
|
+
await withTransaction(database, async (client) => {
|
|
490
|
+
const saved = await client.query(`UPDATE approvals SET status='EXECUTED',executed_at=NOW(),result=$2::jsonb,error=NULL
|
|
491
|
+
WHERE id=$1 AND company_id=$3 AND idempotency_key=$4 AND status='APPROVED' RETURNING id`, [input.approvalId, JSON.stringify(value), input.companyId, idempotencyKey]);
|
|
492
|
+
if (saved.rows.length !== 1) {
|
|
493
|
+
const existing = await client.query("SELECT id FROM approvals WHERE id=$1 AND company_id=$2 AND idempotency_key=$3 AND status='EXECUTED'", [input.approvalId, input.companyId, idempotencyKey]);
|
|
494
|
+
if (existing.rows.length !== 1)
|
|
495
|
+
throw new Error('approval changed before execution receipt was recorded');
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
const receipt = await client.query('UPDATE lingxios.agent_action_ledger SET result=$2::jsonb WHERE idempotency_key=$1 RETURNING idempotency_key', [idempotencyKey, JSON.stringify({ ok: true, value })]);
|
|
499
|
+
if (receipt.rows.length !== 1)
|
|
500
|
+
throw new Error('approval action ledger is missing');
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
/** Observe state only. A matching postcondition does not establish which actor changed it. */
|
|
504
|
+
export async function reconcileKnowledgeApproval(database, services, input) {
|
|
505
|
+
const reviewed = await inspectApproval(database, services, input);
|
|
506
|
+
if (reviewed.status === 'EXECUTED')
|
|
507
|
+
return resumeApproved(database, input, reviewed);
|
|
508
|
+
if (reviewed.status !== 'APPROVED')
|
|
509
|
+
throw new Error('approval has no unknown approved execution');
|
|
510
|
+
if (reviewed.action.action === 'knowledge.delete_source') {
|
|
511
|
+
const native = await approvalNativeWork(database, input.companyId, reviewed.action.idempotencyKey);
|
|
512
|
+
const { rows } = await database.query(`SELECT source.project_id FROM knowledge_sources source
|
|
513
|
+
JOIN approvals approval ON approval.id=$1 AND approval.company_id=source.company_id
|
|
514
|
+
AND approval.args->>'sourceId'=source.id AND approval.status='APPROVED'
|
|
515
|
+
WHERE source.company_id=$2 AND source.deleted_at IS NOT NULL AND source.deleted_at>=approval.resolved_at
|
|
516
|
+
AND (source.visibility_scope='PROJECT' OR (source.visibility_scope='PRIVATE' AND source.owner_user_id=$3))`, [input.approvalId, input.companyId, native.authorizationUserId]);
|
|
517
|
+
if (rows.length !== 1 || typeof rows[0]['project_id'] !== 'string')
|
|
518
|
+
return { status: 'not_observed' };
|
|
519
|
+
await services.permissionService.assertCan({ actorUserId: native.authorizationUserId, companyId: input.companyId,
|
|
520
|
+
action: 'knowledge:read', resource: { type: 'project', id: rows[0]['project_id'] } });
|
|
521
|
+
await recordApprovedResult(database, input, reviewed.action.idempotencyKey, { deleted: true, externalAssetCleanup: 'not_verified', reconciliation: 'postcondition_observed', executionAttribution: 'not_verified' });
|
|
522
|
+
return resumeApproved(database, input, reviewed);
|
|
523
|
+
}
|
|
524
|
+
if (reviewed.action.action !== 'knowledge.set_source_enabled')
|
|
525
|
+
return { status: 'not_observed' };
|
|
526
|
+
const sourceId = reviewed.action.args['sourceId'];
|
|
527
|
+
const enabled = reviewed.action.args['enabled'];
|
|
528
|
+
if (typeof sourceId !== 'string' || typeof enabled !== 'boolean')
|
|
529
|
+
throw new Error('invalid approved availability action');
|
|
530
|
+
const native = await approvalNativeWork(database, input.companyId, reviewed.action.idempotencyKey);
|
|
531
|
+
await services.permissionService.assertCan({ actorUserId: native.authorizationUserId, companyId: input.companyId,
|
|
532
|
+
action: 'knowledge:read', resource: { type: 'knowledge_source', id: sourceId } });
|
|
533
|
+
const sources = (await services.knowledge.listKnowledgeSourcesForAgent(native))
|
|
534
|
+
.filter(item => item && typeof item === 'object' && item['id'] === sourceId);
|
|
535
|
+
if (sources.length !== 1 || sources[0]['enabled'] !== enabled)
|
|
536
|
+
return { status: 'not_observed' };
|
|
537
|
+
await recordApprovedResult(database, input, reviewed.action.idempotencyKey, { enabled, reconciliation: 'postcondition_observed', executionAttribution: 'not_verified' });
|
|
538
|
+
return resumeApproved(database, input, reviewed);
|
|
539
|
+
}
|
|
540
|
+
//# sourceMappingURL=approvals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../../../src/integrations/lingxiloop/approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAmC,MAAM,iCAAiC,CAAA;AAIlG,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAElF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,iBAAiB,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE;IACjG,iBAAiB,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE;IAChG,gBAAgB,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE;IAC1F,cAAc,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE;IACrF,iBAAiB,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE;CACrF,CAAA;AAEV,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,mBAAmB,CAAC,CAAA;AAEvG,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAiB,EAAE,QAAuD,EACrH,IAAkC,EAAE,MAAkB;IACtD,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC9C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QACpE,OAAO,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;YAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,gEAAgE,CAAC,CAAC,CAAC,+BAA+B;YACjJ,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO;SACjF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAiB,EAAE,QAAuD,EAC7G,KAAgE;IAChE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IACjE,IAAI,CAAC,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IAC/H,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACpF,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC3F,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC7C,MAAM,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;QACjD,MAAM,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;kCAOL,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc;YAChG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;QACnG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACtG,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QAChG,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS;YAC7F,WAAW,EAAE,MAAM,CAAC,mBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;QAC/I,MAAM,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QAC5E,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC7E,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACvG,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC1F,MAAM,MAAM,CAAC,KAAK,CAAC,mIAAmI,EACpJ,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;0FACmD,EACpF,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;QAC1F,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;IACF,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;AAClD,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAsB,EAAE,QAAuD,EACnH,KAAgE;IAChE,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACtE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAClG,CAAC;IACD,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;QAChG,MAAM,EAAE,wBAAwB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC3F,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;;;;;;;;;mFAS2C,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;IACvH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IAC3F,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;IACpB,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAA4B,CAAA;IAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAwB,CAAA;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAA2B,CAAA;IACxD,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,SAAS,CAAC;WAClG,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM;WAC7E,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,YAAY,CAAC;WACtF,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,uBAAuB,CAAC,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,WAAW;WACnG,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS;WAClH,MAAM,CAAC,cAAc,KAAK,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;WACjH,MAAM,CAAC,MAAM,CAAC,cAAc,KAAK,QAAQ,CAAC,iBAAiB,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,QAAQ,CAAC;WAC3G,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;IAC/I,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;QAChG,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC1F,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;YACjJ,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IACpF,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc;QACtG,aAAa,EAAE,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1H,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAA;AAC/I,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,QAAsB,EAAE,QAA4B,EACjG,IAAkC,EAAE,MAAkB;IACtD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,KAAK,8BAA8B,CAAA;IACtE,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IACtE,IAAI,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,KAAK,yBAAyB,CAAC;WAC9D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;WAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;WAC9E,CAAC,aAAa,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IAC5H,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACxC,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,mBAAoB,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS;QAChH,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IACrF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAA;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAK,IAAgC,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAwC,CAAA;IACpK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACjF,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ;QACtM,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACjE,OAAO,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;QAC7C,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,yBAAyB;QAC3F,KAAK,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE,QAAQ,EAAE,EAAE,OAAO;KACtE,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAsB,EAAE,QAAmE,EACtI,IAAkC,EAAE,MAAkB;IACtD,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAChG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrD,MAAM,MAAM,GAA6B,EAAE,iBAAiB,EAAE,CAAC,aAAa,CAAC,EAAE,iBAAiB,EAAE,CAAC,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,sBAAsB,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAA;IAC/T,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;WACtE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAC7H,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAE,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,OAAO,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAAC,CAAC;aAChG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAC/J,CAAC;IACD,IAAI,MAAM,KAAK,mBAAmB,IAAI,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IACnK,IAAI,MAAM,KAAK,mBAAmB,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAClK,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC9D,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,0BAA0B;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IACnH,IAAI,MAAM,KAAK,wBAAwB,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,yBAAyB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iCAAiC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;IAC5Q,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACjG,MAAM,QAAQ,GAAG,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACjE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAE,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACzD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,SAAS;WAChH,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS;WAC/F,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;WAC/I,CAAC,MAAM,KAAK,wBAAwB,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,SAAS;YAC/F,CAAC,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC;WACtG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IACpJ,OAAO,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,mBAAmB,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK;QAC/G,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,mHAAmH,EAAE;QAClK,CAAC,CAAC,QAAQ,CAAC,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAsB,EAAE,IAAkC,EAAE,MAAkB,EAClH,QAA+F;IAC/F,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;;;;;;;;;;;yDAWiB,EACrD,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,cAAc;QAC1G,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO;QAC5D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAClF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAA;IACvI,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAA;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAiB,EAAE,QAAuD,EAC7G,KAAgE;IAChE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IACjE,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC9C,MAAM,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;QACjD,MAAM,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACvD,sHAAsH;QACtH,MAAM,MAAM,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAA;QAC7F,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;;;0CASE,EACpC,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;QAC7J,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACnF,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,UAAU;YAAE,OAAO,EAAE,MAAM,EAAE,kBAA2B,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;QAC3G,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;QACjF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,gGAAgG,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;QACzJ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QAC7F,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;;uEAIgC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;QAC5H,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QACvF,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;0FACmD,EACpF,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;QAC5I,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACrF,MAAM,MAAM,CAAC,KAAK,CAAC,qFAAqF,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;QAC3I,MAAM,MAAM,CAAC,KAAK,CAAC,8HAA8H,EAC/I,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,CAAC,UAAU,kMAAkM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACpS,OAAO,EAAE,MAAM,EAAE,SAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAiB,EAAE,QAAmE,EACzH,KAAgE;IAChE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC9D,MAAM,UAAU,GAAG,MAAM,KAAK,wBAAwB,CAAA;IACtD,MAAM,UAAU,GAAG,MAAM,KAAK,mBAAmB,CAAA;IACjD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC1K,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACpF,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;IAChC,IAAI,CAAC,OAAO,EAAE,0BAA0B;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAC1G,IAAI,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,yBAAyB,IAAI,CAAC,OAAO,CAAC,iCAAiC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;IACxN,MAAM,MAAM,GAAG,wBAAwB,CAAC,MAA+C,CAAC,CAAA;IACxF,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC7C,MAAM,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;QACjD,MAAM,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACvD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;kCAOL,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc;YAChG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;QACnG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACtG,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QAChG,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC;;;;wCAIX,EAAE,CAAC,KAAK,CAAC,SAAS,EAAG,QAAQ,CAAC,OAAmC,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACnI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC;;uFAE+C,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvH,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,kEAAkE,MAAM,CAAC,KAAK;;;;uCAIlE,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAC3G,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;QACtG,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS;YACrH,WAAW,EAAE,MAAM,CAAC,mBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;QAC/E,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;QAClG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,WAAW,KAAK,MAAM,CAAC,mBAAmB,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC;eAC9H,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,SAAS;eAC9G,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACjH,MAAM,OAAO,CAAC,0BAA2B,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAA;QACzK,IAAI,KAAc,CAAA;QAClB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,CAAC,CAAA;YACrD,MAAM,OAAO,CAAC,yBAA0B,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,mBAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;YAChJ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,iCAAkC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ;gBAC7G,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAY,EAAE,CAAC,CAAA;YACzH,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAA;YAC5F,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;2EACiC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACxJ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;YAC3I,MAAM,OAAO,CAAC,qBAAsB,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAA;YACjH,KAAK,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA;QACvF,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA;YAC/G,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAA;YAC3E,IAAI,MAAM,KAAK,mBAAmB,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;gBACrE,MAAM,OAAO,CAAC,0BAA0B,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,KAAK,mBAAmB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;gBAClL,KAAK,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;YACtB,CAAC;iBAAM,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gBACzC,MAAM,OAAO,CAAC,uBAAuB,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;gBAC/G,KAAK,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;YACtB,CAAC;iBAAM,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;gBACvC,MAAM,OAAO,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;gBACxG,KAAK,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;YACtB,CAAC;iBAAM,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;gBAC1C,MAAM,OAAO,CAAC,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAwB,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;gBACnO,KAAK,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;YACtB,CAAC;iBAAM,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;gBAC1C,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,2BAA2B,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,0BAA0B,EAAE,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAAA;gBAC1L,KAAK,GAAG,MAAM,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAA0C,EAAE,CAAC,CAAA;YACrO,CAAC;;gBAAM,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;YAChE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;YAC7I,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;gBAC1I,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;mFAGuC,EACzE,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;gBACpE,MAAM,UAAU,GAAG,cAAc,KAAK,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;gBAC1E,IAAI,CAAC,cAAc,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,KAAK,cAAc;uBAC9F,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,aAAa,CAAC,KAAK,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,cAAc;uBAClG,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;gBACpI,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAA;YACrD,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,CAAC,KAAK,gCAAgC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBAC5J,MAAM,cAAc,GAAG,MAAM,KAAK,mBAAmB,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;gBACnI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,KAAK,cAAc;oBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;YACtJ,CAAC;QACH,CAAC;QACD,MAAM,MAAM,CAAC,KAAK,CAAC,mIAAmI,EACpJ,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC1D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;0FACmD,EACpF,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;QAC1F,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;IACF,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAiB,EAAE,QAA4B,EACpF,KAAgE;IAChE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IACjE,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,8BAA8B,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,yBAAyB;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACrK,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACpF,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,yBAAkC,EAAE,CAAA;IACzF,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IACnF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IAClG,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC/C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,8BAA8B,IAAI,OAAO,OAAO,KAAK,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACrL,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,mBAAoB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;QAC/G,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IACrF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAA;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAK,IAAgC,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAA;IAC7H,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAyC,CAAA;IAClE,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,mBAAmB,CAAC,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAC5M,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC7D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;mBAOpB,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc;YAC/F,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;QACnG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QACtC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;0FACmD,EACpF,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,8DAA8D,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;QACtL,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACrF,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAC7E,IAAI,KAAc,CAAA;IAClB,IAAI,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,8BAA8B,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,yBAAyB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAkB,CAAC,CAAA;YACvG,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;YAC3G,KAAK,GAAG,MAAM,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,6BAA6B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YACvF,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;YACvF,KAAK,GAAG,EAAE,GAAG,MAAM,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAA;QAC7D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,yBAAkC,EAAE,CAAA;IACvD,CAAC;IACD,MAAM,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IAClF,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAiB,EAAE,KAAgE,EACtH,QAAqD;IACrD,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC9C,MAAM,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;QACjD,MAAM,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACvD,mHAAmH;QACnH,MAAM,MAAM,CAAC,KAAK,CAAC,yEAAyE,CAAC,CAAA;QAC7F,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;;;;;iDAUS,EAC3C,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;QAC7J,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;QAC5G,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,2BAA2B;eACrE,GAAG,CAAC,QAAQ,CAAoC,EAAE,CAAC,mBAAmB,CAAC,KAAK,QAAQ,CAAA;QAC1F,MAAM,WAAW,GAAG,EAAE,MAAM,EAAE,0BAAmC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAA;QACrH,IAAI,GAAG,CAAC,YAAY,CAAC;YAAE,OAAO,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,iBAA0B,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;QAC5H,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,gGAAgG,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;QACzJ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;QACpH,MAAM,GAAG,GAAG,qLAAqL,CAAA;QACjM,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAC/I,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;;uEAIgC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACjM,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;QAC3G,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;;;;;;kHAM2E,EAC1G,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAA;YAC1H,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAA;QAC5H,CAAC;QACD,MAAM,MAAM,CAAC,KAAK,CAAC,8HAA8H,EAC/I,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,CAAC,UAAU,yCAAyC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,0CAA0C,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,0HAA0H,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACzW,MAAM,MAAM,CAAC,KAAK,CAAC,mDAAmD,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;QAC3F,OAAO,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;IAC/F,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAsB,EAAE,SAAiB,EAAE,cAAsB;IACjG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;;0DAEkB,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAA;IACtF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;IACpB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAiB,CAAA;IAC5C,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,WAAY,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO;QACpH,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAmB;QAC1I,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;IACrF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,QAAiB,EAAE,KAAgD,EAAE,cAAsB,EAAE,KAAc;IAC7I,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC7C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;8FACyD,EACxF,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;QAC7E,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,qGAAqG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;YAC/L,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;YACzG,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,6GAA6G,EAC9I,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QACxD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IACrF,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,QAAiB,EAAE,QAA4B,EAC9F,KAAgE;IAChE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACpF,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IACjG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,yBAAyB,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QAClG,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;;;;mHAIyE,EAC7G,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAClE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,KAAK,QAAQ;YAAE,OAAO,EAAE,MAAM,EAAE,cAAuB,EAAE,CAAA;QAC/G,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,mBAAoB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;YAC/G,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAA;QACxF,MAAM,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EACxE,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC,CAAA;QAC1I,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IAClD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,8BAA8B;QAAE,OAAO,EAAE,MAAM,EAAE,cAAuB,EAAE,CAAA;IACzG,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC/C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;IAClG,MAAM,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,mBAAoB,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;QAC/G,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IACnF,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;SAC5E,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAK,IAAgC,CAAC,IAAI,CAAC,KAAK,QAAQ,CAA8B,CAAA;IACxI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,KAAK,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,cAAuB,EAAE,CAAA;IAC1G,MAAM,oBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EACxE,EAAE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,cAAc,EAAE,CAAC,CAAA;IAC9F,OAAO,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;AAClD,CAAC"}
|