@x12i/memorix-service 3.12.4 → 3.14.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.
Files changed (171) hide show
  1. package/README.md +1 -1
  2. package/dist/analytics/host.d.ts +2 -2
  3. package/dist/analytics/host.d.ts.map +1 -1
  4. package/dist/analytics/host.js.map +1 -1
  5. package/dist/analytics/read-row.d.ts +33 -0
  6. package/dist/analytics/read-row.d.ts.map +1 -0
  7. package/dist/analytics/read-row.js +76 -0
  8. package/dist/analytics/read-row.js.map +1 -0
  9. package/dist/analytics/tracker.d.ts +14 -0
  10. package/dist/analytics/tracker.d.ts.map +1 -1
  11. package/dist/analytics/tracker.js +55 -17
  12. package/dist/analytics/tracker.js.map +1 -1
  13. package/dist/anomaly/catalog.d.ts +4 -0
  14. package/dist/anomaly/catalog.d.ts.map +1 -0
  15. package/dist/anomaly/catalog.js +315 -0
  16. package/dist/anomaly/catalog.js.map +1 -0
  17. package/dist/anomaly/descriptors.d.ts +11 -0
  18. package/dist/anomaly/descriptors.d.ts.map +1 -0
  19. package/dist/anomaly/descriptors.js +113 -0
  20. package/dist/anomaly/descriptors.js.map +1 -0
  21. package/dist/anomaly/index.d.ts +6 -0
  22. package/dist/anomaly/index.d.ts.map +1 -0
  23. package/dist/anomaly/index.js +5 -0
  24. package/dist/anomaly/index.js.map +1 -0
  25. package/dist/anomaly/records.d.ts +28 -0
  26. package/dist/anomaly/records.d.ts.map +1 -0
  27. package/dist/anomaly/records.js +384 -0
  28. package/dist/anomaly/records.js.map +1 -0
  29. package/dist/anomaly/types.d.ts +116 -0
  30. package/dist/anomaly/types.d.ts.map +1 -0
  31. package/dist/anomaly/types.js +24 -0
  32. package/dist/anomaly/types.js.map +1 -0
  33. package/dist/anomaly/values.d.ts +31 -0
  34. package/dist/anomaly/values.d.ts.map +1 -0
  35. package/dist/anomaly/values.js +171 -0
  36. package/dist/anomaly/values.js.map +1 -0
  37. package/dist/app.d.ts.map +1 -1
  38. package/dist/app.js +12 -0
  39. package/dist/app.js.map +1 -1
  40. package/dist/catalog-bridge.d.ts +21 -3
  41. package/dist/catalog-bridge.d.ts.map +1 -1
  42. package/dist/catalog-bridge.js +148 -34
  43. package/dist/catalog-bridge.js.map +1 -1
  44. package/dist/errors.d.ts +5 -0
  45. package/dist/errors.d.ts.map +1 -1
  46. package/dist/errors.js +18 -0
  47. package/dist/errors.js.map +1 -1
  48. package/dist/knowledge-upstream.d.ts +32 -0
  49. package/dist/knowledge-upstream.d.ts.map +1 -1
  50. package/dist/knowledge-upstream.js +86 -2
  51. package/dist/knowledge-upstream.js.map +1 -1
  52. package/dist/mcp/nexum-tools.d.ts +1 -1
  53. package/dist/mcp/nexum-tools.d.ts.map +1 -1
  54. package/dist/mcp/nexum-tools.js +39 -22
  55. package/dist/mcp/nexum-tools.js.map +1 -1
  56. package/dist/metadata-view.d.ts +30 -0
  57. package/dist/metadata-view.d.ts.map +1 -0
  58. package/dist/metadata-view.js +67 -0
  59. package/dist/metadata-view.js.map +1 -0
  60. package/dist/nexum-analysis/enqueue.d.ts +1 -1
  61. package/dist/nexum-analysis/enqueue.d.ts.map +1 -1
  62. package/dist/nexum-analysis/enqueue.js +4 -2
  63. package/dist/nexum-analysis/enqueue.js.map +1 -1
  64. package/dist/nexum-analysis/knowledge-read.d.ts +45 -0
  65. package/dist/nexum-analysis/knowledge-read.d.ts.map +1 -0
  66. package/dist/nexum-analysis/knowledge-read.js +26 -0
  67. package/dist/nexum-analysis/knowledge-read.js.map +1 -0
  68. package/dist/openapi/openapi.json +18458 -17718
  69. package/dist/patches/access.d.ts +15 -0
  70. package/dist/patches/access.d.ts.map +1 -0
  71. package/dist/patches/access.js +27 -0
  72. package/dist/patches/access.js.map +1 -0
  73. package/dist/patches/engine.d.ts +67 -0
  74. package/dist/patches/engine.d.ts.map +1 -0
  75. package/dist/patches/engine.js +966 -0
  76. package/dist/patches/engine.js.map +1 -0
  77. package/dist/patches/guards.d.ts +23 -0
  78. package/dist/patches/guards.d.ts.map +1 -0
  79. package/dist/patches/guards.js +77 -0
  80. package/dist/patches/guards.js.map +1 -0
  81. package/dist/patches/legacy-rows.d.ts +56 -0
  82. package/dist/patches/legacy-rows.d.ts.map +1 -0
  83. package/dist/patches/legacy-rows.js +162 -0
  84. package/dist/patches/legacy-rows.js.map +1 -0
  85. package/dist/patches/ops.d.ts +24 -0
  86. package/dist/patches/ops.d.ts.map +1 -0
  87. package/dist/patches/ops.js +204 -0
  88. package/dist/patches/ops.js.map +1 -0
  89. package/dist/patches/parse.d.ts +5 -0
  90. package/dist/patches/parse.d.ts.map +1 -0
  91. package/dist/patches/parse.js +323 -0
  92. package/dist/patches/parse.js.map +1 -0
  93. package/dist/patches/paths.d.ts +38 -0
  94. package/dist/patches/paths.d.ts.map +1 -0
  95. package/dist/patches/paths.js +204 -0
  96. package/dist/patches/paths.js.map +1 -0
  97. package/dist/patches/service.d.ts +16 -0
  98. package/dist/patches/service.d.ts.map +1 -0
  99. package/dist/patches/service.js +128 -0
  100. package/dist/patches/service.js.map +1 -0
  101. package/dist/patches/store.d.ts +87 -0
  102. package/dist/patches/store.d.ts.map +1 -0
  103. package/dist/patches/store.js +27 -0
  104. package/dist/patches/store.js.map +1 -0
  105. package/dist/patches/types.d.ts +112 -0
  106. package/dist/patches/types.d.ts.map +1 -0
  107. package/dist/patches/types.js +5 -0
  108. package/dist/patches/types.js.map +1 -0
  109. package/dist/platform.d.ts +15 -0
  110. package/dist/platform.d.ts.map +1 -1
  111. package/dist/platform.js +141 -8
  112. package/dist/platform.js.map +1 -1
  113. package/dist/routes/anomaly.d.ts +5 -0
  114. package/dist/routes/anomaly.d.ts.map +1 -0
  115. package/dist/routes/anomaly.js +308 -0
  116. package/dist/routes/anomaly.js.map +1 -0
  117. package/dist/routes/data.d.ts.map +1 -1
  118. package/dist/routes/data.js +297 -198
  119. package/dist/routes/data.js.map +1 -1
  120. package/dist/routes/knowledge.d.ts.map +1 -1
  121. package/dist/routes/knowledge.js +6 -22
  122. package/dist/routes/knowledge.js.map +1 -1
  123. package/dist/routes/metadata.d.ts.map +1 -1
  124. package/dist/routes/metadata.js +28 -1
  125. package/dist/routes/metadata.js.map +1 -1
  126. package/dist/routes/patches.d.ts +7 -0
  127. package/dist/routes/patches.d.ts.map +1 -0
  128. package/dist/routes/patches.js +111 -0
  129. package/dist/routes/patches.js.map +1 -0
  130. package/dist/routes/subject-roots-backfill.d.ts +4 -0
  131. package/dist/routes/subject-roots-backfill.d.ts.map +1 -0
  132. package/dist/routes/subject-roots-backfill.js +15 -0
  133. package/dist/routes/subject-roots-backfill.js.map +1 -0
  134. package/dist/single-read-discriminator.d.ts +17 -0
  135. package/dist/single-read-discriminator.d.ts.map +1 -0
  136. package/dist/single-read-discriminator.js +67 -0
  137. package/dist/single-read-discriminator.js.map +1 -0
  138. package/dist/subject-roots-backfill.d.ts +24 -0
  139. package/dist/subject-roots-backfill.d.ts.map +1 -0
  140. package/dist/subject-roots-backfill.js +133 -0
  141. package/dist/subject-roots-backfill.js.map +1 -0
  142. package/dist/write-precondition.d.ts +5 -1
  143. package/dist/write-precondition.d.ts.map +1 -1
  144. package/dist/write-precondition.js +11 -3
  145. package/dist/write-precondition.js.map +1 -1
  146. package/dist/writes/content-write.d.ts +207 -0
  147. package/dist/writes/content-write.d.ts.map +1 -0
  148. package/dist/writes/content-write.js +629 -0
  149. package/dist/writes/content-write.js.map +1 -0
  150. package/dist/writes/effects.d.ts +13 -0
  151. package/dist/writes/effects.d.ts.map +1 -0
  152. package/dist/writes/effects.js +28 -0
  153. package/dist/writes/effects.js.map +1 -0
  154. package/dist/writes/error-shape.d.ts +11 -0
  155. package/dist/writes/error-shape.d.ts.map +1 -0
  156. package/dist/writes/error-shape.js +107 -0
  157. package/dist/writes/error-shape.js.map +1 -0
  158. package/dist/writes/queued-write.d.ts +38 -0
  159. package/dist/writes/queued-write.d.ts.map +1 -0
  160. package/dist/writes/queued-write.js +288 -0
  161. package/dist/writes/queued-write.js.map +1 -0
  162. package/dist/writes/receipt-store.d.ts +131 -0
  163. package/dist/writes/receipt-store.d.ts.map +1 -0
  164. package/dist/writes/receipt-store.js +360 -0
  165. package/dist/writes/receipt-store.js.map +1 -0
  166. package/dist/writes/worker.d.ts +30 -0
  167. package/dist/writes/worker.d.ts.map +1 -0
  168. package/dist/writes/worker.js +100 -0
  169. package/dist/writes/worker.js.map +1 -0
  170. package/openapi/openapi.json +18458 -17718
  171. package/package.json +4 -4
@@ -0,0 +1,629 @@
1
+ /**
2
+ * Guaranteed content write: one receipt or one rejection per row.
3
+ */
4
+ import { createHash } from "node:crypto";
5
+ import { canonicalJson, fillExplicitRecordIdentity, parseContentSubject, } from "@x12i/memorix-data";
6
+ import { mapErrorToHttp, ServiceError } from "../errors.js";
7
+ import { assertAddressMatchesEnvelope } from "../identity-alias.js";
8
+ import { runHookTrigger } from "../hooks/request-trigger.js";
9
+ import { normalizeWritePrecondition } from "../write-precondition.js";
10
+ import { classifyFailure } from "./error-shape.js";
11
+ import { newReceiptId, rejectedExpiry, WRITE_ATTEMPT_LEASE_MS, } from "./receipt-store.js";
12
+ export const CONTENT_BATCH_LIMIT = 500;
13
+ export async function runContentWrite(deps, body, replay) {
14
+ if (replay)
15
+ return finish(deps, replay, replay.request);
16
+ const now = (deps.now ?? (() => new Date().toISOString()))();
17
+ let prepared;
18
+ try {
19
+ prepared = prepareWrite(deps, body, now);
20
+ await deps.checkWrite?.(prepared.request);
21
+ }
22
+ catch (err) {
23
+ const error = asServiceError(err);
24
+ await rememberRejection(deps, body, error, now);
25
+ return { kind: "rejected", error };
26
+ }
27
+ if (prepared.writeId) {
28
+ const existing = await deps.receipts.findByWriteId(deps.scope.orgId, deps.caller, prepared.writeId);
29
+ if (existing)
30
+ return answerExisting(deps, existing, prepared.contentHash);
31
+ }
32
+ const row = await insertPending(deps, prepared, now);
33
+ if (!row) {
34
+ const existing = await deps.receipts.findByWriteId(deps.scope.orgId, deps.caller, prepared.writeId ?? "");
35
+ if (existing)
36
+ return answerExisting(deps, existing, prepared.contentHash);
37
+ return {
38
+ kind: "rejected",
39
+ error: new ServiceError("WRITE_ID_REUSED", "writeId was already used", 409, {
40
+ field: "writeId",
41
+ retryable: false,
42
+ }),
43
+ };
44
+ }
45
+ return finish(deps, row, prepared.request, prepared.wirePrecondition);
46
+ }
47
+ export async function runContentBatch(deps, body, datasourceFor) {
48
+ if (!body || typeof body !== "object" || Array.isArray(body) || !Array.isArray(body.writes)) {
49
+ throw new ServiceError("VALIDATION", "writes must be an array", 400, { field: "writes", retryable: false });
50
+ }
51
+ const writes = body.writes;
52
+ if (writes.length > CONTENT_BATCH_LIMIT) {
53
+ throw new ServiceError("VALIDATION", `writes accepts at most ${CONTENT_BATCH_LIMIT} rows`, 400, {
54
+ field: "writes",
55
+ retryable: false,
56
+ });
57
+ }
58
+ const results = [];
59
+ for (const item of writes) {
60
+ if (!item || typeof item !== "object" || Array.isArray(item)) {
61
+ results.push({
62
+ error: { code: "VALIDATION", field: "writes", message: "each write must be an object", retryable: false },
63
+ });
64
+ continue;
65
+ }
66
+ const row = item;
67
+ if (row.queue !== undefined) {
68
+ results.push({
69
+ error: {
70
+ code: "VALIDATION",
71
+ field: "queue",
72
+ message: "queue is set on the batch body, not on a row",
73
+ retryable: false,
74
+ },
75
+ });
76
+ continue;
77
+ }
78
+ let datasource = deps.datasource;
79
+ try {
80
+ datasource = datasourceFor(row);
81
+ }
82
+ catch (err) {
83
+ results.push(batchError(err));
84
+ continue;
85
+ }
86
+ try {
87
+ const outcome = await runContentWrite({ ...deps, datasource }, row);
88
+ if (outcome.kind === "stored") {
89
+ results.push({ receipt: outcome.body.receipt });
90
+ }
91
+ else if (outcome.kind === "pending" || outcome.kind === "queued") {
92
+ results.push(outcome.body);
93
+ }
94
+ else {
95
+ results.push(batchError(outcome.error));
96
+ }
97
+ }
98
+ catch (err) {
99
+ results.push(batchError(err));
100
+ }
101
+ }
102
+ return { results };
103
+ }
104
+ async function finish(deps, row, request, wirePrecondition) {
105
+ const now = (deps.now ?? (() => new Date().toISOString()))();
106
+ try {
107
+ const performed = await performWrite(deps, request);
108
+ const receipt = performed.receipt;
109
+ row.status = "stored";
110
+ row.receipt = receipt;
111
+ row.error = undefined;
112
+ // A queued receipt is the run's only record of the row. It stays readable as long as a rejected one.
113
+ row.expireAt = row.queue ? rejectedExpiry(now) : undefined;
114
+ row.updatedAt = now;
115
+ row.request = request;
116
+ await deps.receipts.save(row);
117
+ let indexing;
118
+ if (deps.onCommitted && receipt.operation !== "unchanged") {
119
+ try {
120
+ indexing = await deps.onCommitted({
121
+ operation: receipt.operation,
122
+ objectType: receipt.storageKey.objectType,
123
+ contentType: receipt.storageKey.contentType,
124
+ recordId: receipt.storageKey.recordId,
125
+ revision: receipt.revision,
126
+ data: performed.data,
127
+ hooks: performed.hooks,
128
+ });
129
+ }
130
+ catch {
131
+ indexing = { status: "failed" };
132
+ }
133
+ }
134
+ return {
135
+ kind: "stored",
136
+ httpStatus: 200,
137
+ body: {
138
+ scope: deps.scope,
139
+ written: true,
140
+ outcome: receipt.operation,
141
+ receipt,
142
+ receiptId: row.receiptId,
143
+ result: performed.result,
144
+ currentRevision: receipt.operation === "removed" ? null : receipt.revision,
145
+ precondition: wirePrecondition ?? request.precondition,
146
+ ...(indexing !== undefined ? { indexing } : {}),
147
+ },
148
+ };
149
+ }
150
+ catch (err) {
151
+ const error = asServiceError(err);
152
+ const shape = classifyFailure(error, error.statusCode);
153
+ row.updatedAt = now;
154
+ row.request = request;
155
+ if (row.queue)
156
+ return finishQueuedFailure(deps, row, error, shape, now);
157
+ if (shape.retryable) {
158
+ row.status = "pending";
159
+ row.nextAttemptAt = new Date(Date.parse(now) + (shape.retryAfterMs ?? 1_000)).toISOString();
160
+ row.error = publicError(error, shape);
161
+ await deps.receipts.save(row);
162
+ return {
163
+ kind: "pending",
164
+ httpStatus: 202,
165
+ body: { receiptId: row.receiptId, status: "pending", retryAfterMs: shape.retryAfterMs ?? 1_000 },
166
+ };
167
+ }
168
+ row.status = "rejected";
169
+ row.error = publicError(error, shape);
170
+ row.expireAt = rejectedExpiry(now);
171
+ await deps.receipts.save(row);
172
+ return { kind: "rejected", error };
173
+ }
174
+ }
175
+ /** A queued row that cannot be applied after this many tries is rejected, so it cannot block its key forever. */
176
+ export const QUEUE_MAX_ATTEMPTS = 50;
177
+ const QUEUE_BACKOFF_CAP_MS = 60_000;
178
+ /** A concurrent writer moved the row. The next try reads it again, so a short wait is enough. */
179
+ const QUEUE_STALE_RETRY_MS = 250;
180
+ /**
181
+ * A queued write that failed.
182
+ * A failure a retry can fix leaves the receipt `queued`, with a later due time.
183
+ * Any other failure, or too many tries, makes it `rejected` with the error a synchronous write would return.
184
+ */
185
+ async function finishQueuedFailure(deps, row, error, shape, now) {
186
+ const stale = error.code === "WRITE_STALE_REVISION";
187
+ const retryable = shape.retryable || stale;
188
+ if (retryable && row.attempts < QUEUE_MAX_ATTEMPTS) {
189
+ const base = stale ? QUEUE_STALE_RETRY_MS : (shape.retryAfterMs ?? 1_000);
190
+ const delay = Math.min(QUEUE_BACKOFF_CAP_MS, base * 2 ** Math.min(Math.max(row.attempts - 1, 0), 6));
191
+ row.status = "queued";
192
+ row.nextAttemptAt = new Date(Date.parse(now) + delay).toISOString();
193
+ row.error = publicError(error, { ...shape, retryable: true, retryAfterMs: delay });
194
+ await deps.receipts.save(row);
195
+ return { kind: "queued", httpStatus: 202, body: queuedBody(row) };
196
+ }
197
+ const exhausted = retryable;
198
+ row.status = "rejected";
199
+ row.error = publicError(exhausted
200
+ ? new ServiceError(error.code, `gave up after ${row.attempts} attempts: ${error.message}`, error.statusCode, {
201
+ field: shape.field,
202
+ retryable: false,
203
+ })
204
+ : error, { ...shape, retryable: false });
205
+ row.expireAt = rejectedExpiry(now);
206
+ await deps.receipts.save(row);
207
+ return { kind: "rejected", error };
208
+ }
209
+ export function queuedBody(row) {
210
+ const queue = row.queue;
211
+ if (!queue)
212
+ throw new Error("queuedBody needs a queued receipt");
213
+ return {
214
+ receiptId: row.receiptId,
215
+ status: "queued",
216
+ storageKey: queue.storageKey,
217
+ runId: queue.runId,
218
+ stepId: queue.stepId,
219
+ };
220
+ }
221
+ async function answerExisting(deps, existing, contentHash) {
222
+ if (existing.contentHash !== contentHash) {
223
+ return {
224
+ kind: "rejected",
225
+ error: new ServiceError("WRITE_ID_REUSED", "writeId was already used for different content", 409, { field: "writeId", retryable: false }),
226
+ };
227
+ }
228
+ if (existing.status === "stored" && existing.receipt) {
229
+ const result = await replayResult(deps, existing);
230
+ return {
231
+ kind: "stored",
232
+ httpStatus: 200,
233
+ body: {
234
+ scope: deps.scope,
235
+ written: true,
236
+ outcome: existing.receipt.operation,
237
+ receipt: existing.receipt,
238
+ receiptId: existing.receiptId,
239
+ result,
240
+ currentRevision: existing.receipt.operation === "removed" ? null : existing.receipt.revision,
241
+ precondition: existing.request.precondition,
242
+ },
243
+ };
244
+ }
245
+ if (existing.status === "pending") {
246
+ return {
247
+ kind: "pending",
248
+ httpStatus: 202,
249
+ body: { receiptId: existing.receiptId, status: "pending", retryAfterMs: 1_000 },
250
+ };
251
+ }
252
+ const error = existing.error;
253
+ return {
254
+ kind: "rejected",
255
+ error: new ServiceError(error?.code ?? "VALIDATION", error?.message ?? "write was rejected", error?.status ?? 400, {
256
+ field: error?.field,
257
+ retryable: false,
258
+ receiptId: existing.receiptId,
259
+ }),
260
+ };
261
+ }
262
+ async function rememberRejection(deps, body, error, now) {
263
+ if (!body.objectType || !body.contentType)
264
+ return;
265
+ const shape = classifyFailure(error, error.statusCode);
266
+ const row = {
267
+ receiptId: newReceiptId(),
268
+ orgId: deps.scope.orgId,
269
+ caller: deps.caller,
270
+ contentHash: createHash("sha256").update(canonicalJson(body)).digest("hex"),
271
+ status: "rejected",
272
+ error: publicError(error, shape),
273
+ request: {
274
+ scope: { orgId: deps.scope.orgId, agentIds: [...deps.scope.agentIds] },
275
+ caller: deps.caller,
276
+ op: body.op ?? "upsert",
277
+ objectType: body.objectType,
278
+ contentType: body.contentType,
279
+ precondition: "none",
280
+ suppressHooks: false,
281
+ datasourceDeclared: deps.datasource.declared,
282
+ },
283
+ attempts: 1,
284
+ nextAttemptAt: now,
285
+ createdAt: now,
286
+ updatedAt: now,
287
+ expireAt: rejectedExpiry(now),
288
+ };
289
+ try {
290
+ await deps.receipts.insert(row);
291
+ }
292
+ catch {
293
+ /* the rejection still returns to the caller */
294
+ }
295
+ }
296
+ async function insertPending(deps, prepared, now) {
297
+ const row = {
298
+ receiptId: newReceiptId(),
299
+ orgId: deps.scope.orgId,
300
+ caller: deps.caller,
301
+ ...(prepared.writeId ? { writeId: prepared.writeId } : {}),
302
+ contentHash: prepared.contentHash,
303
+ status: "pending",
304
+ request: prepared.request,
305
+ attempts: 0,
306
+ nextAttemptAt: new Date(Date.parse(now) + WRITE_ATTEMPT_LEASE_MS).toISOString(),
307
+ createdAt: now,
308
+ updatedAt: now,
309
+ };
310
+ const inserted = await deps.receipts.insert(row);
311
+ return inserted === "inserted" ? row : null;
312
+ }
313
+ export function prepareWrite(deps, body, now) {
314
+ if (!body.objectType || !body.contentType) {
315
+ throw new ServiceError("VALIDATION", "objectType, contentType required", 400, {
316
+ field: body.objectType ? "contentType" : "objectType",
317
+ retryable: false,
318
+ });
319
+ }
320
+ assertAddressMatchesEnvelope({
321
+ objectType: body.objectType,
322
+ contentType: body.contentType,
323
+ record: body.record,
324
+ });
325
+ const precondition = normalizeWritePrecondition(body.precondition, body.expectedRevision);
326
+ const op = body.op ?? (precondition.form === "absent" ? "add" : "upsert");
327
+ if (precondition.form === "none" && op !== "upsert") {
328
+ throw new ServiceError("VALIDATION", "precondition none is only valid for op upsert", 400, {
329
+ field: "precondition",
330
+ retryable: false,
331
+ });
332
+ }
333
+ if (op === "remove" && precondition.form !== "exact-revision") {
334
+ throw new ServiceError("VALIDATION", "remove requires precondition exact-revision", 400, {
335
+ field: "precondition",
336
+ retryable: false,
337
+ });
338
+ }
339
+ const writeId = readWriteId(body.writeId);
340
+ const discriminatorValue = typeof body.discriminatorValue === "string" && body.discriminatorValue.trim()
341
+ ? body.discriminatorValue.trim()
342
+ : undefined;
343
+ const suppressHooks = readSuppressHooks(body.suppressHooks);
344
+ const callerRecord = body.record && typeof body.record === "object" && !Array.isArray(body.record)
345
+ ? { ...body.record }
346
+ : undefined;
347
+ const subject = resolveSubject(body.subject, callerRecord?.subject);
348
+ if (callerRecord && subject)
349
+ callerRecord.subject = subject;
350
+ const contentHash = createHash("sha256")
351
+ .update(canonicalJson({
352
+ op,
353
+ objectType: body.objectType,
354
+ contentType: body.contentType,
355
+ precondition: precondition.form,
356
+ expectedRevision: precondition.form === "exact-revision" ? precondition.expectedRevision : null,
357
+ discriminatorValue: discriminatorValue ?? null,
358
+ subject: subject ?? null,
359
+ record: callerRecord ?? null,
360
+ patch: body.patch ?? null,
361
+ }))
362
+ .digest("hex");
363
+ let record = callerRecord;
364
+ if (op !== "remove") {
365
+ if (!record)
366
+ throw new ServiceError("VALIDATION", "record required", 400, { field: "record", retryable: false });
367
+ const filled = fillExplicitRecordIdentity({
368
+ draft: {
369
+ ...record,
370
+ objectType: body.objectType,
371
+ contentType: body.contentType,
372
+ },
373
+ caller: deps.caller,
374
+ catalog: deps.ports.catalog,
375
+ now,
376
+ discriminatorValue,
377
+ });
378
+ record = filled;
379
+ if (record._system && typeof record._system === "object") {
380
+ const system = { ...record._system };
381
+ delete system._datasource;
382
+ record._system = system;
383
+ }
384
+ }
385
+ const request = {
386
+ scope: { orgId: deps.scope.orgId, agentIds: [...deps.scope.agentIds] },
387
+ caller: deps.caller,
388
+ op,
389
+ objectType: body.objectType,
390
+ contentType: body.contentType,
391
+ precondition: precondition.form,
392
+ ...(precondition.form === "exact-revision" ? { expectedRevision: precondition.expectedRevision } : {}),
393
+ ...(discriminatorValue ? { discriminatorValue } : {}),
394
+ suppressHooks,
395
+ ...(record ? { record } : {}),
396
+ ...(body.patch !== undefined ? { patch: body.patch } : {}),
397
+ ...(subject ? { subject } : {}),
398
+ datasourceDeclared: deps.datasource.declared,
399
+ ...(deps.datasource.declaration !== undefined ? { datasourceDeclaration: deps.datasource.declaration } : {}),
400
+ };
401
+ return { request, contentHash, writeId, wirePrecondition: body.precondition };
402
+ }
403
+ async function performWrite(deps, request) {
404
+ const datasource = {
405
+ service: request.caller,
406
+ declared: request.datasourceDeclared,
407
+ declaration: request.datasourceDeclaration,
408
+ };
409
+ const scope = request.scope;
410
+ if (request.op === "remove") {
411
+ const recordId = readRecordId(request.record);
412
+ const expectedRevision = requireRevision(request);
413
+ const pinned = await deps.ports.publications.list();
414
+ const blocking = pinned.filter((publication) => (publication.status === "committed" || publication.status === "draft") &&
415
+ publication.members.some((member) => member.recordId === recordId &&
416
+ member.objectType === request.objectType &&
417
+ member.contentType === request.contentType));
418
+ if (blocking.length) {
419
+ throw new ServiceError("PUBLICATION_PINNED", "cannot remove a content instance referenced by a draft or committed publication", 409, { publicationIds: blocking.map((publication) => publication.publicationId), field: "recordId", retryable: false });
420
+ }
421
+ const noted = await runHookTrigger(() => deps.ports.writer.remove({
422
+ scope,
423
+ objectType: request.objectType,
424
+ contentType: request.contentType,
425
+ recordId,
426
+ ...(request.discriminatorValue ? { discriminatorValue: request.discriminatorValue } : {}),
427
+ precondition: { kind: "revision", revision: expectedRevision },
428
+ datasource,
429
+ suppressHooks: request.suppressHooks,
430
+ }));
431
+ const removed = noted.value;
432
+ return {
433
+ result: removed,
434
+ hooks: noted.hooks,
435
+ receipt: {
436
+ storageKey: storageKey(request, removed.recordId),
437
+ revision: removed.previousRevision,
438
+ writtenAt: new Date().toISOString(),
439
+ operation: "removed",
440
+ },
441
+ };
442
+ }
443
+ const record = {
444
+ ...request.record,
445
+ objectType: request.objectType,
446
+ contentType: request.contentType,
447
+ };
448
+ const noted = await runHookTrigger(() => dispatchWrite(deps, request, record, datasource));
449
+ const written = noted.value;
450
+ const operation = written.unchanged ? "unchanged" : written.created ? "created" : "updated";
451
+ const data = written.record.data && typeof written.record.data === "object" && !Array.isArray(written.record.data)
452
+ ? written.record.data
453
+ : undefined;
454
+ return {
455
+ result: written,
456
+ data,
457
+ hooks: noted.hooks,
458
+ receipt: {
459
+ storageKey: storageKey(request, written.record.recordId),
460
+ revision: written.record.revision,
461
+ writtenAt: written.record._system.writtenAt ?? written.record._system.modifiedAt,
462
+ operation,
463
+ },
464
+ };
465
+ }
466
+ async function dispatchWrite(deps, request, record, datasource) {
467
+ const scope = request.scope;
468
+ if (request.op === "add" || request.precondition === "absent") {
469
+ return deps.ports.writer.add({
470
+ scope,
471
+ precondition: { kind: "absent" },
472
+ record,
473
+ datasource,
474
+ suppressHooks: request.suppressHooks,
475
+ });
476
+ }
477
+ if (request.op === "patch") {
478
+ return deps.ports.writer.patch({
479
+ scope,
480
+ precondition: { kind: "revision", revision: requireRevision(request) },
481
+ objectType: request.objectType,
482
+ contentType: request.contentType,
483
+ recordId: readRecordId(request.record),
484
+ ...(request.discriminatorValue ? { discriminatorValue: request.discriminatorValue } : {}),
485
+ ops: request.patch ?? [],
486
+ datasource,
487
+ suppressHooks: request.suppressHooks,
488
+ });
489
+ }
490
+ if (request.op === "replace") {
491
+ return deps.ports.writer.replace({
492
+ scope,
493
+ precondition: { kind: "revision", revision: requireRevision(request) },
494
+ record,
495
+ datasource,
496
+ suppressHooks: request.suppressHooks,
497
+ });
498
+ }
499
+ if (request.precondition === "none") {
500
+ return deps.ports.writer.upsert({
501
+ scope,
502
+ precondition: { kind: "none" },
503
+ record,
504
+ datasource,
505
+ suppressHooks: request.suppressHooks,
506
+ });
507
+ }
508
+ return deps.ports.writer.upsert({
509
+ scope,
510
+ precondition: { kind: "revision", revision: requireRevision(request) },
511
+ record,
512
+ datasource,
513
+ suppressHooks: request.suppressHooks,
514
+ });
515
+ }
516
+ async function replayResult(deps, row) {
517
+ const receipt = row.receipt;
518
+ if (!receipt)
519
+ return undefined;
520
+ if (receipt.operation === "removed") {
521
+ return {
522
+ recordId: receipt.storageKey.recordId,
523
+ objectType: receipt.storageKey.objectType,
524
+ contentType: receipt.storageKey.contentType,
525
+ removed: true,
526
+ previousRevision: receipt.revision,
527
+ };
528
+ }
529
+ try {
530
+ const record = await deps.ports.reader.getContent(row.request.scope, {
531
+ objectType: receipt.storageKey.objectType,
532
+ contentType: receipt.storageKey.contentType,
533
+ recordId: receipt.storageKey.recordId,
534
+ ...(receipt.storageKey.discriminator ? { discriminatorValue: receipt.storageKey.discriminator } : {}),
535
+ });
536
+ return { record, created: receipt.operation === "created", unchanged: receipt.operation === "unchanged" };
537
+ }
538
+ catch {
539
+ return undefined;
540
+ }
541
+ }
542
+ export function storageKey(request, recordId) {
543
+ return {
544
+ objectType: request.objectType,
545
+ contentType: request.contentType,
546
+ recordId,
547
+ ...(request.discriminatorValue ? { discriminator: request.discriminatorValue } : {}),
548
+ };
549
+ }
550
+ function resolveSubject(bodySubject, recordSubject) {
551
+ const fromBody = bodySubject === undefined ? undefined : parseContentSubject(bodySubject, "subject");
552
+ const fromRecord = recordSubject === undefined ? undefined : parseContentSubject(recordSubject, "record.subject");
553
+ if (fromBody && fromRecord && canonicalJson(fromBody) !== canonicalJson(fromRecord)) {
554
+ throw new ServiceError("VALIDATION", "subject and record.subject must match", 400, {
555
+ field: "subject",
556
+ retryable: false,
557
+ });
558
+ }
559
+ return fromBody ?? fromRecord;
560
+ }
561
+ function readWriteId(value) {
562
+ if (value === undefined || value === null || value === "")
563
+ return undefined;
564
+ if (typeof value !== "string" || !value.trim() || value.trim().length > 200) {
565
+ throw new ServiceError("VALIDATION", "writeId must be a string of at most 200 characters", 400, {
566
+ field: "writeId",
567
+ retryable: false,
568
+ });
569
+ }
570
+ return value.trim();
571
+ }
572
+ function readSuppressHooks(value) {
573
+ if (value === undefined)
574
+ return false;
575
+ if (typeof value !== "boolean") {
576
+ throw new ServiceError("VALIDATION", "suppressHooks must be a boolean", 400, {
577
+ field: "suppressHooks",
578
+ retryable: false,
579
+ });
580
+ }
581
+ return value;
582
+ }
583
+ function readRecordId(record) {
584
+ const recordId = record && typeof record.recordId === "string" ? record.recordId.trim() : "";
585
+ if (!recordId) {
586
+ throw new ServiceError("VALIDATION", "record.recordId is required", 400, { field: "record.recordId", retryable: false });
587
+ }
588
+ return recordId;
589
+ }
590
+ function requireRevision(request) {
591
+ if (request.expectedRevision === undefined) {
592
+ throw new ServiceError("VALIDATION", "expectedRevision required when precondition is exact-revision", 400, {
593
+ field: "expectedRevision",
594
+ retryable: false,
595
+ });
596
+ }
597
+ return request.expectedRevision;
598
+ }
599
+ export function asServiceError(err) {
600
+ if (err instanceof ServiceError)
601
+ return err;
602
+ const mapped = mapErrorToHttp(err, "write");
603
+ const shape = classifyFailure(err, mapped.status);
604
+ const details = mapped.body.error.details && typeof mapped.body.error.details === "object"
605
+ ? { ...mapped.body.error.details }
606
+ : {};
607
+ return new ServiceError(mapped.body.error.code, mapped.body.error.message, mapped.status, {
608
+ ...details,
609
+ field: shape.field,
610
+ retryable: shape.retryable,
611
+ ...(shape.retryAfterMs !== undefined ? { retryAfterMs: shape.retryAfterMs } : {}),
612
+ });
613
+ }
614
+ export function publicError(error, shape) {
615
+ return {
616
+ code: error.code,
617
+ field: shape.field,
618
+ message: error.message,
619
+ retryable: shape.retryable,
620
+ status: error.statusCode,
621
+ ...(shape.retryAfterMs !== undefined ? { retryAfterMs: shape.retryAfterMs } : {}),
622
+ };
623
+ }
624
+ export function batchError(err) {
625
+ const error = asServiceError(err);
626
+ const shape = classifyFailure(error, error.statusCode);
627
+ return { error: publicError(error, shape) };
628
+ }
629
+ //# sourceMappingURL=content-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-write.js","sourceRoot":"","sources":["../../src/writes/content-write.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,mBAAmB,GAKpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAqB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,sBAAsB,GAOvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AA6IvC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAsB,EACtB,IAAsB,EACtB,MAAwB;IAExB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;IAC7D,IAAI,QAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpG,IAAI,QAAQ;YAAE,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAChD,IAAI,CAAC,KAAK,CAAC,KAAK,EAChB,IAAI,CAAC,MAAM,EACX,QAAQ,CAAC,OAAO,IAAI,EAAE,CACvB,CAAC;QACF,IAAI,QAAQ;YAAE,OAAO,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1E,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI,YAAY,CAAC,iBAAiB,EAAE,0BAA0B,EAAE,GAAG,EAAE;gBAC1E,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,KAAK;aACjB,CAAC;SACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAsB,EACtB,IAAa,EACb,aAA+D;IAE/D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,IAA6B,CAAC,MAAM,CAAC,EAAE,CAAC;QACtH,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,yBAAyB,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,MAAM,MAAM,GAAI,IAA8B,CAAC,MAAM,CAAC;IACtD,IAAI,MAAM,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACxC,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,0BAA0B,mBAAmB,OAAO,EAAE,GAAG,EAAE;YAC9F,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,8BAA8B,EAAE,SAAS,EAAE,KAAK,EAAE;aAC1G,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,IAAwB,CAAC;QACrC,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE;oBACL,IAAI,EAAE,YAAY;oBAClB,KAAK,EAAE,OAAO;oBACd,OAAO,EAAE,8CAA8C;oBACvD,SAAS,EAAE,KAAK;iBACjB;aACF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,CAAC;YACH,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;YACpE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAG,OAAO,CAAC,IAAI,CAAC,OAAwB,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,IAAsB,EACtB,GAAoB,EACpB,OAA2B,EAC3B,gBAA0B;IAE1B,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAClC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;QACtB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;QACtB,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC;QACtB,qGAAqG;QACrG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;QACtB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,QAAiB,CAAC;QACtB,IAAI,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC;oBAChC,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU;oBACzC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;oBAC3C,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ;oBACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,KAAK,EAAE,SAAS,CAAC,KAAK;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,GAAG;YACf,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,OAAO,CAAC,SAAS;gBAC1B,OAAO;gBACP,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,eAAe,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ;gBAC1E,YAAY,EAAE,gBAAgB,IAAI,OAAO,CAAC,YAAY;gBACtD,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACvD,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;QACpB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;QACtB,IAAI,GAAG,CAAC,KAAK;YAAE,OAAO,mBAAmB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACxE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;YACvB,GAAG,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5F,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,GAAG;gBACf,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,KAAK,EAAE;aACjG,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;QACxB,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,GAAG,CAAC,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,iHAAiH;AACjH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,iGAAiG;AACjG,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAEjC;;;;GAIG;AACH,KAAK,UAAU,mBAAmB,CAChC,IAAsB,EACtB,GAAoB,EACpB,KAAmB,EACnB,KAAmB,EACnB,GAAW;IAEX,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,sBAAsB,CAAC;IACpD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,IAAI,SAAS,IAAI,GAAG,CAAC,QAAQ,GAAG,kBAAkB,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrG,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;QACtB,GAAG,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACpE,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC;IAC5B,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;IACxB,GAAG,CAAC,KAAK,GAAG,WAAW,CACrB,SAAS;QACP,CAAC,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,GAAG,CAAC,QAAQ,cAAc,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE;YACzG,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK;SACjB,CAAC;QACJ,CAAC,CAAC,KAAK,EACT,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAC/B,CAAC;IACF,GAAG,CAAC,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAoB;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACjE,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,MAAM,EAAE,QAAQ;QAChB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAsB,EACtB,QAAyB,EACzB,WAAmB;IAEnB,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,IAAI,YAAY,CACrB,iBAAiB,EACjB,gDAAgD,EAChD,GAAG,EACH,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CACvC;SACF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,GAAG;YACf,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS;gBACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,MAAM;gBACN,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ;gBAC5F,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY;aAC5C;SACF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO;YACL,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE;SAChF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,IAAI,YAAY,CACrB,KAAK,EAAE,IAAI,IAAI,YAAY,EAC3B,KAAK,EAAE,OAAO,IAAI,oBAAoB,EACtC,KAAK,EAAE,MAAM,IAAI,GAAG,EACpB;YACE,KAAK,EAAE,KAAK,EAAE,KAAK;YACnB,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CACF;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAsB,EACtB,IAAsB,EACtB,KAAmB,EACnB,GAAW;IAEX,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO;IAClD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,GAAG,GAAoB;QAC3B,SAAS,EAAE,YAAY,EAAE;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3E,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;QAChC,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YACtE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,MAAM;YACpB,aAAa,EAAE,KAAK;YACpB,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;SAC7C;QACD,QAAQ,EAAE,CAAC;QACX,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC;KAC9B,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAsB,EACtB,QAAuB,EACvB,GAAW;IAEX,MAAM,GAAG,GAAoB;QAC3B,SAAS,EAAE,YAAY,EAAE;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,QAAQ,EAAE,CAAC;QACX,aAAa,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,CAAC,WAAW,EAAE;QAC/E,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjD,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAsB,EAAE,IAAsB,EAAE,GAAW;IACtF,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,kCAAkC,EAAE,GAAG,EAAE;YAC5E,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY;YACrD,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,4BAA4B,CAAC;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAsF;KACpG,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,0BAA0B,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1F,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1E,IAAI,YAAY,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,+CAA+C,EAAE,GAAG,EAAE;YACzF,KAAK,EAAE,cAAc;YACrB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,EAAE,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9D,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,6CAA6C,EAAE,GAAG,EAAE;YACvF,KAAK,EAAE,cAAc;YACrB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,kBAAkB,GACtB,OAAO,IAAI,CAAC,kBAAkB,KAAK,QAAQ,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;QAC3E,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE;QAChC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,YAAY,GAChB,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3E,CAAC,CAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAA8B;QACjD,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACpE,IAAI,YAAY,IAAI,OAAO;QAAE,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;IAE5D,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;SACrC,MAAM,CACL,aAAa,CAAC;QACZ,EAAE;QACF,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,YAAY,CAAC,IAAI;QAC/B,gBAAgB,EAAE,YAAY,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;QAC/F,kBAAkB,EAAE,kBAAkB,IAAI,IAAI;QAC9C,OAAO,EAAE,OAAO,IAAI,IAAI;QACxB,MAAM,EAAE,YAAY,IAAI,IAAI;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;KAC1B,CAAC,CACH;SACA,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjB,IAAI,MAAM,GAAG,YAAY,CAAC;IAC1B,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,iBAAiB,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACjH,MAAM,MAAM,GAAG,0BAA0B,CAAC;YACxC,KAAK,EAAE;gBACL,GAAI,MAAsC;gBAC1C,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B;YACD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;YAC3B,GAAG;YACH,kBAAkB;SACnB,CAAC,CAAC;QACH,MAAM,GAAG,MAA4C,CAAC;QACtD,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,EAAE,GAAI,MAAM,CAAC,OAAmC,EAAE,CAAC;YAClE,OAAO,MAAM,CAAC,WAAW,CAAC;YAC1B,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAuB;QAClC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;QACtE,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,EAAE;QACF,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,YAAY,CAAC,IAAI;QAC/B,GAAG,CAAC,YAAY,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtG,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,aAAa;QACb,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ;QAC5C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7G,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAsB,EACtB,OAA2B;IAO3B,MAAM,UAAU,GAAyB;QACvC,OAAO,EAAE,OAAO,CAAC,MAAM;QACvB,QAAQ,EAAE,OAAO,CAAC,kBAAkB;QACpC,WAAW,EAAE,OAAO,CAAC,qBAAqB;KAC3C,CAAC;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,OAAO,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,gBAAgB,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,WAAW,EAAE,EAAE,CACd,CAAC,WAAW,CAAC,MAAM,KAAK,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,CAAC;YACtE,WAAW,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,QAAQ,KAAK,QAAQ;gBAC5B,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU;gBACxC,MAAM,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAC7C,CACJ,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,YAAY,CACpB,oBAAoB,EACpB,iFAAiF,EACjF,GAAG,EACH,EAAE,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,CAClH,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,CACtC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YACvB,KAAK;YACL,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ;YACR,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YAC9D,UAAU;YACV,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CACH,CAAC;QACF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5B,OAAO;YACL,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE;gBACP,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC;gBACjD,QAAQ,EAAE,OAAO,CAAC,gBAAgB;gBAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EAAE,SAAS;aACrB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG;QACb,GAAI,OAAO,CAAC,MAA6B;QACzC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;IAC5B,MAAM,SAAS,GAAmB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5G,MAAM,IAAI,GACR,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACnG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;QACrB,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO;QACL,MAAM,EAAE,OAAO;QACf,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE;YACP,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;YACxD,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ;YACjC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU;YAChF,SAAS;SACV;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAsB,EACtB,OAA2B,EAC3B,MAA0B,EAC1B,UAAgC;IAEhC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,IAAI,OAAO,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;YAC3B,KAAK;YACL,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAChC,MAAM;YACN,UAAU;YACV,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7B,KAAK;YACL,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE;YACtE,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;YACtC,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,GAAG,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;YACxB,UAAU;YACV,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;YAC/B,KAAK;YACL,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE;YACtE,MAAM;YACN,UAAU;YACV,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;YAC9B,KAAK;YACL,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YAC9B,MAAM;YACN,UAAU;YACV,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9B,KAAK;QACL,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE;QACtE,MAAM;QACN,UAAU;QACV,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAsB,EAAE,GAAoB;IACtE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ;YACrC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU;YACzC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;YAC3C,OAAO,EAAE,IAAI;YACb,gBAAgB,EAAE,OAAO,CAAC,QAAQ;SACnC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE;YACnE,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU;YACzC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;YAC3C,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ;YACrC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtG,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;IAC5G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA2B,EAAE,QAAgB;IACtE,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ;QACR,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrF,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,WAAoB,EAAE,aAAsB;IAClE,MAAM,QAAQ,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACrG,MAAM,UAAU,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAClH,IAAI,QAAQ,IAAI,UAAU,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,uCAAuC,EAAE,GAAG,EAAE;YACjF,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,IAAI,UAAU,CAAC;AAChC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC5E,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,oDAAoD,EAAE,GAAG,EAAE;YAC9F,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,iCAAiC,EAAE,GAAG,EAAE;YAC3E,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,MAA2C;IAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,6BAA6B,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3H,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,OAA2B;IAClD,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,+DAA+D,EAAE,GAAG,EAAE;YACzG,KAAK,EAAE,kBAAkB;YACzB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC,gBAAgB,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,GAAG,YAAY,YAAY;QAAE,OAAO,GAAG,CAAC;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GACX,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;QACxE,CAAC,CAAC,EAAE,GAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAmC,EAAE;QAC/D,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QACxF,GAAG,OAAO;QACV,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAmB,EAAE,KAAmB;IAClE,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,UAAU;QACxB,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvD,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;AAC9C,CAAC"}