@actuarial-ts/compliance 0.6.0 → 0.7.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 (83) hide show
  1. package/README.md +19 -9
  2. package/dist/bundle.d.ts +1 -1
  3. package/dist/bundle.d.ts.map +1 -1
  4. package/dist/bundle.js +163 -21
  5. package/dist/bundle.js.map +1 -1
  6. package/dist/diagnosticArtifactStream.d.ts +30 -0
  7. package/dist/diagnosticArtifactStream.d.ts.map +1 -0
  8. package/dist/diagnosticArtifactStream.js +128 -0
  9. package/dist/diagnosticArtifactStream.js.map +1 -0
  10. package/dist/diagnosticByteSource.d.ts +10 -0
  11. package/dist/diagnosticByteSource.d.ts.map +1 -0
  12. package/dist/diagnosticByteSource.js +70 -0
  13. package/dist/diagnosticByteSource.js.map +1 -0
  14. package/dist/diagnosticByteView.d.ts +3 -0
  15. package/dist/diagnosticByteView.d.ts.map +1 -0
  16. package/dist/diagnosticByteView.js +27 -0
  17. package/dist/diagnosticByteView.js.map +1 -0
  18. package/dist/diagnosticCompactRun.d.ts +43 -0
  19. package/dist/diagnosticCompactRun.d.ts.map +1 -0
  20. package/dist/diagnosticCompactRun.js +253 -0
  21. package/dist/diagnosticCompactRun.js.map +1 -0
  22. package/dist/diagnosticReplayFrames.d.ts +10 -0
  23. package/dist/diagnosticReplayFrames.d.ts.map +1 -0
  24. package/dist/diagnosticReplayFrames.js +99 -0
  25. package/dist/diagnosticReplayFrames.js.map +1 -0
  26. package/dist/diagnosticReplayProtocol.d.ts +17 -0
  27. package/dist/diagnosticReplayProtocol.d.ts.map +1 -0
  28. package/dist/diagnosticReplayProtocol.js +98 -0
  29. package/dist/diagnosticReplayProtocol.js.map +1 -0
  30. package/dist/diagnosticReplayReader.d.ts +41 -0
  31. package/dist/diagnosticReplayReader.d.ts.map +1 -0
  32. package/dist/diagnosticReplayReader.js +346 -0
  33. package/dist/diagnosticReplayReader.js.map +1 -0
  34. package/dist/diagnosticReplayValue.d.ts +34 -0
  35. package/dist/diagnosticReplayValue.d.ts.map +1 -0
  36. package/dist/diagnosticReplayValue.js +269 -0
  37. package/dist/diagnosticReplayValue.js.map +1 -0
  38. package/dist/diagnosticReplayWriter.d.ts +25 -0
  39. package/dist/diagnosticReplayWriter.d.ts.map +1 -0
  40. package/dist/diagnosticReplayWriter.js +148 -0
  41. package/dist/diagnosticReplayWriter.js.map +1 -0
  42. package/dist/diagnosticRun.d.ts +52 -29
  43. package/dist/diagnosticRun.d.ts.map +1 -1
  44. package/dist/diagnosticRun.js +564 -174
  45. package/dist/diagnosticRun.js.map +1 -1
  46. package/dist/diagnosticRunEvidence.d.ts +18 -0
  47. package/dist/diagnosticRunEvidence.d.ts.map +1 -0
  48. package/dist/diagnosticRunEvidence.js +195 -0
  49. package/dist/diagnosticRunEvidence.js.map +1 -0
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +4 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/ledger.d.ts.map +1 -1
  55. package/dist/ledger.js +47 -6
  56. package/dist/ledger.js.map +1 -1
  57. package/dist/metadata.d.ts.map +1 -1
  58. package/dist/metadata.js +27 -3
  59. package/dist/metadata.js.map +1 -1
  60. package/dist/sha256Stream.d.ts +6 -0
  61. package/dist/sha256Stream.d.ts.map +1 -0
  62. package/dist/sha256Stream.js +103 -0
  63. package/dist/sha256Stream.js.map +1 -0
  64. package/dist/version.d.ts +1 -1
  65. package/dist/version.js +1 -1
  66. package/package.json +6 -5
  67. package/src/bundle.ts +272 -32
  68. package/src/diagnosticArtifactStream.ts +148 -0
  69. package/src/diagnosticByteSource.ts +82 -0
  70. package/src/diagnosticByteView.ts +27 -0
  71. package/src/diagnosticCompactRun.ts +462 -0
  72. package/src/diagnosticReplayFrames.ts +99 -0
  73. package/src/diagnosticReplayProtocol.ts +99 -0
  74. package/src/diagnosticReplayReader.ts +428 -0
  75. package/src/diagnosticReplayValue.ts +269 -0
  76. package/src/diagnosticReplayWriter.ts +190 -0
  77. package/src/diagnosticRun.ts +1030 -93
  78. package/src/diagnosticRunEvidence.ts +391 -0
  79. package/src/index.ts +10 -0
  80. package/src/ledger.ts +59 -8
  81. package/src/metadata.ts +48 -7
  82. package/src/sha256Stream.ts +108 -0
  83. package/src/version.ts +1 -1
@@ -0,0 +1,70 @@
1
+ function isObject(value) {
2
+ return (value !== null && (typeof value === "object" || typeof value === "function"));
3
+ }
4
+ /**
5
+ * Own one producer iterator through completion, cancellation or read failure.
6
+ * Unlike a bare for-await loop, a rejected next() also closes the producer.
7
+ * A cleanup failure never replaces the error that caused cleanup. Hosts should
8
+ * pass the same cancellation signal to pending I/O; checks cannot interrupt it.
9
+ */
10
+ export async function* consumeDiagnosticByteSource(source, checkCancellation = () => { }) {
11
+ if (!isObject(source))
12
+ throw new TypeError("Diagnostic byte source must be iterable");
13
+ const iterable = source;
14
+ const asynchronous = iterable[Symbol.asyncIterator];
15
+ const method = asynchronous ?? iterable[Symbol.iterator];
16
+ if (typeof method !== "function")
17
+ throw new TypeError("Diagnostic byte source must provide an iterator method");
18
+ const iterator = Reflect.apply(method, source, []);
19
+ if (!isObject(iterator))
20
+ throw new TypeError("Diagnostic byte iterator must be an object");
21
+ const protocol = iterator;
22
+ let completed = false;
23
+ let failed = false;
24
+ try {
25
+ // Capture next once, as the iterator protocol does; never use a producer's
26
+ // potentially overwritten Function.call property.
27
+ const next = protocol.next;
28
+ if (typeof next !== "function")
29
+ throw new TypeError("Diagnostic byte iterator must provide next()");
30
+ for (;;) {
31
+ checkCancellation();
32
+ const result = await Reflect.apply(next, iterator, []);
33
+ if (!isObject(result))
34
+ throw new TypeError("Diagnostic byte read must return an iterator result");
35
+ const item = result;
36
+ completed = Boolean(item.done);
37
+ checkCancellation();
38
+ if (completed)
39
+ return;
40
+ // An async generator also observes a rejected value from a synchronous
41
+ // iterator here, so that failure follows the same cleanup path.
42
+ yield item.value;
43
+ }
44
+ }
45
+ catch (error) {
46
+ failed = true;
47
+ throw error;
48
+ }
49
+ finally {
50
+ if (!completed) {
51
+ try {
52
+ // Read return only when closing, once, following normal iterator
53
+ // semantics. The generator's finally executes at most once.
54
+ const close = protocol.return;
55
+ if (close !== undefined && close !== null) {
56
+ if (typeof close !== "function")
57
+ throw new TypeError("Diagnostic byte iterator return must be a function");
58
+ const result = await Reflect.apply(close, iterator, []);
59
+ if (!isObject(result))
60
+ throw new TypeError("Diagnostic byte iterator return must return an iterator result");
61
+ }
62
+ }
63
+ catch (cleanupError) {
64
+ if (!failed)
65
+ throw cleanupError;
66
+ }
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=diagnosticByteSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticByteSource.js","sourceRoot":"","sources":["../src/diagnosticByteSource.ts"],"names":[],"mappings":"AAEA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,CACL,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC,CAC7E,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,2BAA2B,CAChD,MAA4B,EAC5B,oBAAgC,GAAG,EAAE,GAAE,CAAC;IAExC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,MAEhB,CAAC;IACF,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,YAAY,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,OAAO,MAAM,KAAK,UAAU;QAC9B,MAAM,IAAI,SAAS,CACjB,wDAAwD,CACzD,CAAC;IACJ,MAAM,QAAQ,GAAY,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACrB,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,QAAgD,CAAC;IAClE,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC;QACH,2EAA2E;QAC3E,kDAAkD;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,IAAI,OAAO,IAAI,KAAK,UAAU;YAC5B,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACtE,SAAS,CAAC;YACR,iBAAiB,EAAE,CAAC;YACpB,MAAM,MAAM,GAAY,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACnB,MAAM,IAAI,SAAS,CACjB,qDAAqD,CACtD,CAAC;YACJ,MAAM,IAAI,GAAG,MAAoC,CAAC;YAClD,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,iBAAiB,EAAE,CAAC;YACpB,IAAI,SAAS;gBAAE,OAAO;YACtB,uEAAuE;YACvE,gEAAgE;YAChE,MAAM,IAAI,CAAC,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,IAAI,CAAC;QACd,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,iEAAiE;gBACjE,4DAA4D;gBAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAC1C,IAAI,OAAO,KAAK,KAAK,UAAU;wBAC7B,MAAM,IAAI,SAAS,CACjB,oDAAoD,CACrD,CAAC;oBACJ,MAAM,MAAM,GAAY,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;oBACjE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;wBACnB,MAAM,IAAI,SAAS,CACjB,gEAAgE,CACjE,CAAC;gBACN,CAAC;YACH,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC,MAAM;oBAAE,MAAM,YAAY,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Borrow a synchronous intrinsic-only view; callers copy before yielding. */
2
+ export declare function diagnosticByteView(chunk: unknown): Uint8Array<ArrayBuffer>;
3
+ //# sourceMappingURL=diagnosticByteView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticByteView.d.ts","sourceRoot":"","sources":["../src/diagnosticByteView.ts"],"names":[],"mappings":"AAUA,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAe1E"}
@@ -0,0 +1,27 @@
1
+ import { ComplianceError } from "./errors.js";
2
+ const typedArrayPrototype = Object.getPrototypeOf(Uint8Array.prototype);
3
+ const byteLength = Object.getOwnPropertyDescriptor(typedArrayPrototype, "byteLength").get;
4
+ const byteOffset = Object.getOwnPropertyDescriptor(typedArrayPrototype, "byteOffset").get;
5
+ const bufferOf = Object.getOwnPropertyDescriptor(typedArrayPrototype, "buffer").get;
6
+ const arrayBufferLength = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "byteLength")
7
+ .get;
8
+ const resizable = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "resizable")?.get;
9
+ /** Borrow a synchronous intrinsic-only view; callers copy before yielding. */
10
+ export function diagnosticByteView(chunk) {
11
+ const fail = (message) => {
12
+ throw new ComplianceError("BAD_DIAGNOSTIC_RUN", message, "$.chunks");
13
+ };
14
+ if (!(chunk instanceof Uint8Array) || !ArrayBuffer.isView(chunk))
15
+ fail("Artifact chunks must be Uint8Array values");
16
+ const buffer = bufferOf.call(chunk);
17
+ try {
18
+ arrayBufferLength.call(buffer);
19
+ }
20
+ catch {
21
+ fail("Shared artifact buffers cannot provide a stable byte snapshot");
22
+ }
23
+ if (resizable?.call(buffer))
24
+ fail("Resizable artifact buffers cannot provide a stable byte snapshot");
25
+ return new Uint8Array(buffer, byteOffset.call(chunk), byteLength.call(chunk));
26
+ }
27
+ //# sourceMappingURL=diagnosticByteView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticByteView.js","sourceRoot":"","sources":["../src/diagnosticByteView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,mBAAmB,GAAG,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AACxE,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,YAAY,CAAE,CAAC,GAAI,CAAC;AAC5F,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,YAAY,CAAE,CAAC,GAAI,CAAC;AAC5F,MAAM,QAAQ,GAAG,MAAM,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,QAAQ,CAAE,CAAC,GAAI,CAAC;AACtF,MAAM,iBAAiB,GAAG,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,SAAS,EAAE,YAAY,CAAE;KAC5F,GAAI,CAAC;AACR,MAAM,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC;AAE3F,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,IAAI,GAAG,CAAC,OAAe,EAAS,EAAE;QACtC,MAAM,IAAI,eAAe,CAAC,oBAAoB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACvE,CAAC,CAAC;IACF,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9D,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAgB,CAAC;IACnD,IAAI,CAAC;QACH,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,+DAA+D,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC3E,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { type DiagnosticIdentityDocument } from "@actuarial-ts/core";
2
+ import { type CompletedCompactMetricDiagnosticsRun } from "@actuarial-ts/data";
3
+ import { type ComputedDiagnosticArtifactDigest } from "./diagnosticArtifactStream.js";
4
+ import type { DiagnosticArtifactDigest, DiagnosticPreparationLineage, DiagnosticRunIdentity, DiagnosticRunProvenance } from "./diagnosticRun.js";
5
+ /** Computed digests must be authentic completed byte-stream receipts, not JSON copies. */
6
+ export type CompactDiagnosticArtifactEvidence = ComputedDiagnosticArtifactDigest | Extract<DiagnosticArtifactDigest, {
7
+ assurance: "caller-declared";
8
+ }>;
9
+ export interface CreateCompactDiagnosticRunIdentityInput {
10
+ readonly completedRun: CompletedCompactMetricDiagnosticsRun;
11
+ readonly inputArtifacts: readonly CompactDiagnosticArtifactEvidence[];
12
+ readonly preparationArtifacts: readonly CompactDiagnosticArtifactEvidence[];
13
+ readonly preparationLineage: readonly DiagnosticPreparationLineage[];
14
+ }
15
+ declare const verifiedCompactDiagnosticRunProvenanceBrand: unique symbol;
16
+ /**
17
+ * Verified compact evidence, not a legacy provenance DTO or BundleDoc.
18
+ * Documents emit the complete legacy normalized manifest/result identity bytes.
19
+ * They retain immutable owners, not expanded identity arrays or source bytes.
20
+ * The provenance brand, not a structural document, establishes verification.
21
+ */
22
+ export interface VerifiedCompactDiagnosticRunProvenance extends DiagnosticRunIdentity {
23
+ readonly [verifiedCompactDiagnosticRunProvenanceBrand]: true;
24
+ readonly definition: DiagnosticRunProvenance["definition"];
25
+ readonly inputArtifacts: readonly DiagnosticArtifactDigest[];
26
+ readonly preparationArtifacts: readonly DiagnosticArtifactDigest[];
27
+ readonly preparationLineage: readonly DiagnosticPreparationLineage[];
28
+ readonly preparationFingerprint: string;
29
+ readonly reviewFingerprint: string;
30
+ readonly manifestIdentityDocument: DiagnosticIdentityDocument;
31
+ readonly resultIdentityDocument: DiagnosticIdentityDocument;
32
+ }
33
+ /**
34
+ * Verify an authentic compact completed run and bind completed artifact digests.
35
+ * Synchronous: source bytes were consumed by digestDiagnosticArtifactChunks already.
36
+ * This deliberately replays review/math and compares every identity code unit.
37
+ */
38
+ export declare function createCompactDiagnosticRunIdentity(input: CreateCompactDiagnosticRunIdentityInput): VerifiedCompactDiagnosticRunProvenance;
39
+ export declare function assertVerifiedCompactDiagnosticRunProvenance(value: unknown): asserts value is VerifiedCompactDiagnosticRunProvenance;
40
+ /** Internal transport plumbing; deliberately not exported from the package index. */
41
+ export declare function getCompactDiagnosticRunOwner(provenance: VerifiedCompactDiagnosticRunProvenance): CompletedCompactMetricDiagnosticsRun;
42
+ export {};
43
+ //# sourceMappingURL=diagnosticCompactRun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticCompactRun.d.ts","sourceRoot":"","sources":["../src/diagnosticCompactRun.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,0BAA0B,EAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAML,KAAK,oCAAoC,EAC1C,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,wBAAwB,EACxB,4BAA4B,EAC5B,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,oBAAoB,CAAC;AAU5B,0FAA0F;AAC1F,MAAM,MAAM,iCAAiC,GACzC,gCAAgC,GAChC,OAAO,CAAC,wBAAwB,EAAE;IAAE,SAAS,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAAC;AAExE,MAAM,WAAW,uCAAuC;IACtD,QAAQ,CAAC,YAAY,EAAE,oCAAoC,CAAC;IAC5D,QAAQ,CAAC,cAAc,EAAE,SAAS,iCAAiC,EAAE,CAAC;IACtE,QAAQ,CAAC,oBAAoB,EAAE,SAAS,iCAAiC,EAAE,CAAC;IAC5E,QAAQ,CAAC,kBAAkB,EAAE,SAAS,4BAA4B,EAAE,CAAC;CACtE;AAED,OAAO,CAAC,MAAM,2CAA2C,EAAE,OAAO,MAAM,CAAC;AACzE;;;;;GAKG;AACH,MAAM,WAAW,sCACf,SAAQ,qBAAqB;IAC7B,QAAQ,CAAC,CAAC,2CAA2C,CAAC,EAAE,IAAI,CAAC;IAC7D,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAC3D,QAAQ,CAAC,cAAc,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC7D,QAAQ,CAAC,oBAAoB,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACnE,QAAQ,CAAC,kBAAkB,EAAE,SAAS,4BAA4B,EAAE,CAAC;IACrE,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,wBAAwB,EAAE,0BAA0B,CAAC;IAC9D,QAAQ,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;CAC7D;AAuRD;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,uCAAuC,GAC7C,sCAAsC,CAyFxC;AAED,wBAAgB,4CAA4C,CAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,sCAAsC,CAGzD;AAED,qFAAqF;AACrF,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,sCAAsC,GACjD,oCAAoC,CAGtC"}
@@ -0,0 +1,253 @@
1
+ import { CORE_PACKAGE_VERSION, canonicalFnv1a64, compareDiagnosticIdentityDocuments, createDiagnosticIdentityArray, createDiagnosticIdentityObject, createDiagnosticIdentityValue, fingerprintDiagnosticIdentity, getCompactMetricDiagnosticsResultIdentityDocument, getCompactPreparedDiagnosticDataFingerprint, normalizeDiagnosticsFilterIdentity, runMetricDiagnosticsCompact, } from "@actuarial-ts/core";
2
+ import { DATA_PACKAGE_VERSION, assertCompletedCompactMetricDiagnosticsRun, getCompactDiagnosticReviewReceiptFingerprint, getCompactDiagnosticReviewReceiptIdentityDocument, reviewPreparedDiagnosticDataCompact, } from "@actuarial-ts/data";
3
+ import { assertComputedDiagnosticArtifactDigest, } from "./diagnosticArtifactStream.js";
4
+ import { plain, snapshotLineage, token, validateArtifactGraph, } from "./diagnosticRunEvidence.js";
5
+ import { ComplianceError } from "./errors.js";
6
+ import { COMPLIANCE_PACKAGE_VERSION } from "./version.js";
7
+ const verified = new WeakMap();
8
+ function bad(message, path) {
9
+ throw new ComplianceError("BAD_DIAGNOSTIC_RUN", message, path);
10
+ }
11
+ /** Snapshot boundary metadata without invoking getters or caller array methods. */
12
+ function record(value, allowed, path) {
13
+ if (!plain(value))
14
+ bad("Expected a plain metadata object", path);
15
+ const copy = Object.create(null);
16
+ for (const key of Reflect.ownKeys(value)) {
17
+ if (typeof key !== "string" || !allowed.includes(key))
18
+ bad("Unknown metadata field", `${path}.${String(key)}`);
19
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
20
+ if (!descriptor || !descriptor.enumerable || !("value" in descriptor))
21
+ bad("Metadata fields must be enumerable data properties", `${path}.${key}`);
22
+ copy[key] = descriptor.value;
23
+ }
24
+ return copy;
25
+ }
26
+ function array(value, path) {
27
+ if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype)
28
+ bad("Expected a plain metadata array", path);
29
+ const length = Object.getOwnPropertyDescriptor(value, "length")?.value;
30
+ if (!Number.isSafeInteger(length) || length < 0)
31
+ bad("Invalid array length", path);
32
+ for (const key of Reflect.ownKeys(value)) {
33
+ if (key === "length")
34
+ continue;
35
+ if (typeof key !== "string" ||
36
+ !/^(0|[1-9][0-9]*)$/.test(key) ||
37
+ Number(key) >= length)
38
+ bad("Unexpected array property", `${path}.${String(key)}`);
39
+ }
40
+ const copy = [];
41
+ for (let index = 0; index < length; index++) {
42
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
43
+ if (!descriptor || !descriptor.enumerable || !("value" in descriptor))
44
+ bad("Array items must be present data properties", `${path}[${index}]`);
45
+ copy.push(descriptor.value);
46
+ }
47
+ return copy;
48
+ }
49
+ function artifacts(value, scope, path) {
50
+ const seen = new Set();
51
+ const result = array(value, path).map((raw, index) => {
52
+ const itemPath = `${path}[${index}]`;
53
+ const item = record(raw, ["id", "scope", "assurance", "algorithm", "value", "byteLength"], itemPath);
54
+ if (typeof item.id !== "string")
55
+ bad("Artifact id must be a string", `${itemPath}.id`);
56
+ token(item.id, `${itemPath}.id`);
57
+ if (seen.has(item.id))
58
+ bad("Artifact IDs must be unique", `${itemPath}.id`);
59
+ seen.add(item.id);
60
+ if (item.scope !== scope)
61
+ bad(`Artifact must have ${scope} scope`, `${itemPath}.scope`);
62
+ if (item.assurance === "sdk-computed") {
63
+ assertComputedDiagnosticArtifactDigest(raw);
64
+ return raw;
65
+ }
66
+ if (item.assurance !== "caller-declared")
67
+ bad("Unknown artifact assurance", `${itemPath}.assurance`);
68
+ if (Object.hasOwn(item, "byteLength"))
69
+ bad("Caller-declared evidence cannot claim a computed byte length", `${itemPath}.byteLength`);
70
+ if (typeof item.algorithm !== "string" || typeof item.value !== "string")
71
+ bad("Declared algorithm and value must be strings", itemPath);
72
+ token(item.algorithm, `${itemPath}.algorithm`);
73
+ token(item.value, `${itemPath}.value`);
74
+ return Object.freeze({
75
+ id: item.id,
76
+ scope,
77
+ assurance: "caller-declared",
78
+ algorithm: item.algorithm,
79
+ value: item.value,
80
+ });
81
+ });
82
+ return Object.freeze(result.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)));
83
+ }
84
+ function lineage(value) {
85
+ const copied = array(value, "$.preparationLineage").map((raw, index) => {
86
+ const path = `$.preparationLineage[${index}]`;
87
+ const item = record(raw, ["outputArtifactId", "inputArtifactIds", "transformationArtifactIds"], path);
88
+ return {
89
+ outputArtifactId: item.outputArtifactId,
90
+ inputArtifactIds: array(item.inputArtifactIds, `${path}.inputArtifactIds`),
91
+ transformationArtifactIds: array(item.transformationArtifactIds, `${path}.transformationArtifactIds`),
92
+ };
93
+ });
94
+ return Object.freeze(snapshotLineage(copied).map((edge) => Object.freeze({
95
+ outputArtifactId: edge.outputArtifactId,
96
+ inputArtifactIds: Object.freeze([...edge.inputArtifactIds]),
97
+ transformationArtifactIds: Object.freeze([
98
+ ...edge.transformationArtifactIds,
99
+ ]),
100
+ })));
101
+ }
102
+ function requireEqual(actual, expected, path) {
103
+ const comparison = compareDiagnosticIdentityDocuments(actual, expected);
104
+ if (!comparison.equal)
105
+ throw new ComplianceError("DIAGNOSTIC_MISMATCH", `Deterministic replay differs at canonical code-unit offset ${comparison.codeUnitOffset}`, path);
106
+ }
107
+ /** Replay before issuing authority; hashes never replace complete identity comparison. */
108
+ function rerunAndVerify(run) {
109
+ const review = reviewPreparedDiagnosticDataCompact({
110
+ prepared: run.prepared,
111
+ evidence: run.review.evidence,
112
+ });
113
+ requireEqual(getCompactDiagnosticReviewReceiptIdentityDocument(review), getCompactDiagnosticReviewReceiptIdentityDocument(run.review), "$.review");
114
+ const rerun = runMetricDiagnosticsCompact({
115
+ prepared: run.prepared,
116
+ groupMap: run.groupMap,
117
+ groupDimensions: run.groupDimensions,
118
+ });
119
+ requireEqual(getCompactMetricDiagnosticsResultIdentityDocument(rerun), getCompactMetricDiagnosticsResultIdentityDocument(run.result), "$.result");
120
+ const counts = review.evaluations.summary;
121
+ const effectiveCounts = {
122
+ pass: counts.pass,
123
+ warning: counts.warning,
124
+ fail: counts.fail,
125
+ "not-evaluated": counts.notEvaluated,
126
+ };
127
+ const statuses = ["pass", "warning", "fail", "not-evaluated"];
128
+ const reviewBlocked = review.report.checks.some((check) => !run.gate.allowedReviewStatuses.includes(check.status)) ||
129
+ statuses.some((status) => effectiveCounts[status] > 0 &&
130
+ !run.gate.allowedReviewStatuses.includes(status));
131
+ const metricBlocked = rerun.findings.some((finding) => finding.category !== "structural" &&
132
+ !run.gate.allowedMetricFindingSeverities.includes(finding.severity));
133
+ if (reviewBlocked ||
134
+ metricBlocked ||
135
+ run.gate.reviewGate !== "passed" ||
136
+ run.gate.metricGate !== "passed")
137
+ throw new ComplianceError("DIAGNOSTIC_MISMATCH", "Diagnostic execution gates do not recompute as passed", "$.gate");
138
+ }
139
+ function manifestDocument(run, inputArtifacts, preparationArtifacts, preparationLineage, preparationFingerprint, reviewFingerprint) {
140
+ const prepared = run.prepared;
141
+ const expectedCells = createDiagnosticIdentityArray(prepared.expectedCells.length, (index) => {
142
+ const cell = prepared.expectedCells[index];
143
+ return createDiagnosticIdentityObject({
144
+ sourceGroup: createDiagnosticIdentityValue(cell.sourceGroup),
145
+ origin: createDiagnosticIdentityValue(cell.origin),
146
+ valuation: createDiagnosticIdentityValue(cell.valuation),
147
+ source: createDiagnosticIdentityValue(cell.source ?? null),
148
+ });
149
+ });
150
+ return createDiagnosticIdentityObject({
151
+ definitionIntegrity: createDiagnosticIdentityValue(prepared.definition.definitionIntegrity),
152
+ preparationFingerprint: createDiagnosticIdentityValue(preparationFingerprint),
153
+ runPresetId: createDiagnosticIdentityValue(run.runPresetId),
154
+ datasetArtifactId: createDiagnosticIdentityValue(run.datasetArtifactId),
155
+ inputArtifacts: createDiagnosticIdentityValue(inputArtifacts),
156
+ preparationArtifacts: createDiagnosticIdentityValue(preparationArtifacts),
157
+ preparationLineage: createDiagnosticIdentityValue(preparationLineage),
158
+ inputAudit: createDiagnosticIdentityValue(prepared.inputAudit),
159
+ filter: createDiagnosticIdentityValue(normalizeDiagnosticsFilterIdentity(prepared.filter)),
160
+ groupMap: createDiagnosticIdentityValue(run.groupMap),
161
+ groupDimensions: createDiagnosticIdentityValue(run.groupDimensions),
162
+ completePeriodCutoffs: createDiagnosticIdentityValue(prepared.completePeriodCutoffs),
163
+ expectedCellGridFingerprint: createDiagnosticIdentityValue(prepared.expectedCellsProvided
164
+ ? fingerprintDiagnosticIdentity(expectedCells, {
165
+ kind: "diagnostic-expected-cell-grid",
166
+ property: "expectedCells",
167
+ })
168
+ : null),
169
+ executionPolicy: createDiagnosticIdentityObject({
170
+ gate: createDiagnosticIdentityValue(run.gate),
171
+ review: createDiagnosticIdentityObject({
172
+ body: getCompactDiagnosticReviewReceiptIdentityDocument(run.review),
173
+ reportFingerprint: createDiagnosticIdentityValue(reviewFingerprint),
174
+ }),
175
+ }),
176
+ engine: createDiagnosticIdentityValue(Object.freeze({
177
+ packages: Object.freeze({
178
+ core: CORE_PACKAGE_VERSION,
179
+ data: DATA_PACKAGE_VERSION,
180
+ compliance: COMPLIANCE_PACKAGE_VERSION,
181
+ }),
182
+ algorithmVersion: "diagnostics-1",
183
+ })),
184
+ });
185
+ }
186
+ /**
187
+ * Verify an authentic compact completed run and bind completed artifact digests.
188
+ * Synchronous: source bytes were consumed by digestDiagnosticArtifactChunks already.
189
+ * This deliberately replays review/math and compares every identity code unit.
190
+ */
191
+ export function createCompactDiagnosticRunIdentity(input) {
192
+ const snapshot = record(input, [
193
+ "completedRun",
194
+ "inputArtifacts",
195
+ "preparationArtifacts",
196
+ "preparationLineage",
197
+ ], "$");
198
+ const run = snapshot.completedRun;
199
+ try {
200
+ assertCompletedCompactMetricDiagnosticsRun(run);
201
+ }
202
+ catch {
203
+ bad("completedRun must be an authentic completed compact diagnostic run", "$.completedRun");
204
+ }
205
+ const inputArtifacts = artifacts(snapshot.inputArtifacts, "input", "$.inputArtifacts");
206
+ const preparationArtifacts = artifacts(snapshot.preparationArtifacts, "preparation", "$.preparationArtifacts");
207
+ const preparationLineage = lineage(snapshot.preparationLineage);
208
+ validateArtifactGraph(run, inputArtifacts, preparationArtifacts, preparationLineage);
209
+ rerunAndVerify(run);
210
+ const preparationFingerprint = getCompactPreparedDiagnosticDataFingerprint(run.prepared);
211
+ const reviewFingerprint = getCompactDiagnosticReviewReceiptFingerprint(run.review);
212
+ const manifestIdentityDocument = manifestDocument(run, inputArtifacts, preparationArtifacts, preparationLineage, preparationFingerprint, reviewFingerprint);
213
+ const resultIdentityDocument = getCompactMetricDiagnosticsResultIdentityDocument(run.result);
214
+ const runFingerprint = fingerprintDiagnosticIdentity(manifestIdentityDocument, { kind: "diagnostic-run", property: "manifest" });
215
+ const resultFingerprint = fingerprintDiagnosticIdentity(resultIdentityDocument, { kind: "diagnostic-result", property: "result" });
216
+ const runResultFingerprint = `fnv1a64-jcs-v1:${canonicalFnv1a64({ identityVersion: 1, kind: "diagnostic-run-result", runFingerprint, resultFingerprint })}`;
217
+ const definition = run.prepared.definition;
218
+ const provenance = Object.freeze({
219
+ definition: Object.freeze({
220
+ definition: definition.definition,
221
+ identities: Object.freeze({
222
+ algorithm: "fnv1a64-jcs-v1",
223
+ formulaById: Object.freeze({ ...definition.formulaFingerprints }),
224
+ calculationByInstanceId: Object.freeze({
225
+ ...definition.calculationFingerprints,
226
+ }),
227
+ definition: definition.definitionIntegrity,
228
+ }),
229
+ }),
230
+ inputArtifacts,
231
+ preparationArtifacts,
232
+ preparationLineage,
233
+ preparationFingerprint,
234
+ reviewFingerprint,
235
+ manifestIdentityDocument,
236
+ resultIdentityDocument,
237
+ runFingerprint,
238
+ resultFingerprint,
239
+ runResultFingerprint,
240
+ });
241
+ verified.set(provenance, run);
242
+ return provenance;
243
+ }
244
+ export function assertVerifiedCompactDiagnosticRunProvenance(value) {
245
+ if (value === null || typeof value !== "object" || !verified.has(value))
246
+ bad("Value is not authentic verified compact diagnostic provenance", "$");
247
+ }
248
+ /** Internal transport plumbing; deliberately not exported from the package index. */
249
+ export function getCompactDiagnosticRunOwner(provenance) {
250
+ assertVerifiedCompactDiagnosticRunProvenance(provenance);
251
+ return verified.get(provenance);
252
+ }
253
+ //# sourceMappingURL=diagnosticCompactRun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticCompactRun.js","sourceRoot":"","sources":["../src/diagnosticCompactRun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const MAX_REPLAY_FRAME_BYTES = 131072;
2
+ export declare const MAX_REPLAY_READ_BYTES = 131072;
3
+ export declare const REPLAY_TEXT_UNITS = 16384;
4
+ export type ReplayAtom = string | number | boolean | null;
5
+ export type ReplayFrame = readonly ReplayAtom[];
6
+ /** Private transport codec; construction does not grant diagnostic authority. */
7
+ export declare function encodeReplayFrames(frames: AsyncIterable<ReplayFrame> | Iterable<ReplayFrame>): AsyncGenerator<Uint8Array>;
8
+ /** Parse bounded flat frames, never a complete candidate audit/identity. */
9
+ export declare function decodeReplayFrames(chunks: AsyncIterable<Uint8Array> | Iterable<Uint8Array>): AsyncGenerator<ReplayFrame>;
10
+ //# sourceMappingURL=diagnosticReplayFrames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticReplayFrames.d.ts","sourceRoot":"","sources":["../src/diagnosticReplayFrames.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAC9C,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAC7C,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,SAAS,UAAU,EAAE,CAAC;AAkChD,iFAAiF;AACjF,wBAAuB,kBAAkB,CACvC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,GACzD,cAAc,CAAC,UAAU,CAAC,CAc5B;AAED,4EAA4E;AAC5E,wBAAuB,kBAAkB,CACvC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,GACvD,cAAc,CAAC,WAAW,CAAC,CAiC7B"}
@@ -0,0 +1,99 @@
1
+ import { ComplianceError } from "./errors.js";
2
+ import { diagnosticByteView } from "./diagnosticByteView.js";
3
+ import { consumeDiagnosticByteSource } from "./diagnosticByteSource.js";
4
+ // Transport granularity only: not a limit on total evidence or dataset size.
5
+ export const MAX_REPLAY_FRAME_BYTES = 131_072;
6
+ export const MAX_REPLAY_READ_BYTES = 131_072;
7
+ export const REPLAY_TEXT_UNITS = 16_384;
8
+ function invalid(message) {
9
+ throw new ComplianceError("BAD_DIAGNOSTIC_RUN", message, "$.replayFrames");
10
+ }
11
+ function snapshotFrame(value) {
12
+ if (!Array.isArray(value))
13
+ invalid("Replay frame must be an array");
14
+ const length = Object.getOwnPropertyDescriptor(value, "length")?.value;
15
+ if (!Number.isInteger(length) || length < 1 || length > 16)
16
+ invalid("Replay frame must be a nonempty flat array with at most 16 items");
17
+ const owned = [];
18
+ for (let index = 0; index < length; index++) {
19
+ const field = Object.getOwnPropertyDescriptor(value, String(index));
20
+ if (!field || !("value" in field))
21
+ invalid("Replay frames must contain indexed data properties");
22
+ const item = field.value;
23
+ if (item === null || typeof item === "boolean") {
24
+ owned.push(item);
25
+ continue;
26
+ }
27
+ if (typeof item === "number" && Number.isFinite(item)) {
28
+ owned.push(item);
29
+ continue;
30
+ }
31
+ // Enough for a base64-encoded 64 KiB artifact chunk. Higher-level protocol
32
+ // validates each event's arity, sequencing, and narrower field limits.
33
+ if (typeof item === "string" && item.length <= 87_384) {
34
+ owned.push(item);
35
+ continue;
36
+ }
37
+ invalid("Replay frames contain only bounded JSON primitives");
38
+ }
39
+ return Object.freeze(owned);
40
+ }
41
+ /** Private transport codec; construction does not grant diagnostic authority. */
42
+ export async function* encodeReplayFrames(frames) {
43
+ const encoder = new TextEncoder();
44
+ for await (const frame of frames) {
45
+ const owned = snapshotFrame(frame);
46
+ const atoms = [];
47
+ let bytes = 3;
48
+ for (const item of owned) {
49
+ const text = JSON.stringify(item);
50
+ bytes += encoder.encode(text).byteLength + (atoms.length ? 1 : 0);
51
+ if (bytes > MAX_REPLAY_FRAME_BYTES)
52
+ invalid("Replay frame exceeds its byte limit");
53
+ atoms.push(text);
54
+ }
55
+ yield encoder.encode(`[${atoms.join(",")}]\n`);
56
+ }
57
+ }
58
+ /** Parse bounded flat frames, never a complete candidate audit/identity. */
59
+ export async function* decodeReplayFrames(chunks) {
60
+ const line = new Uint8Array(MAX_REPLAY_FRAME_BYTES);
61
+ const decoder = new TextDecoder("utf-8", { fatal: true });
62
+ let used = 0;
63
+ try {
64
+ for await (const chunk of consumeDiagnosticByteSource(chunks)) {
65
+ const view = diagnosticByteView(chunk);
66
+ if (view.byteLength > MAX_REPLAY_READ_BYTES)
67
+ invalid("Replay read chunk exceeds its transport limit; split input reads");
68
+ // Snapshot before yielding any frame: reused buffers cannot alter later
69
+ // frames in the same delivered chunk. This copy is always bounded.
70
+ const owned = new Uint8Array(view);
71
+ for (const byte of owned) {
72
+ if (byte === 10) {
73
+ if (used === 0)
74
+ invalid("Empty replay frame");
75
+ let parsed;
76
+ try {
77
+ parsed = JSON.parse(decoder.decode(line.subarray(0, used)));
78
+ }
79
+ catch {
80
+ invalid("Replay frame is not valid UTF-8 JSON");
81
+ }
82
+ used = 0;
83
+ yield snapshotFrame(parsed);
84
+ }
85
+ else {
86
+ if (used >= MAX_REPLAY_FRAME_BYTES - 1)
87
+ invalid("Replay frame exceeds its byte limit");
88
+ line[used++] = byte;
89
+ }
90
+ }
91
+ }
92
+ if (used !== 0)
93
+ invalid("Replay stream ended inside a frame");
94
+ }
95
+ finally {
96
+ line.fill(0);
97
+ }
98
+ }
99
+ //# sourceMappingURL=diagnosticReplayFrames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticReplayFrames.js","sourceRoot":"","sources":["../src/diagnosticReplayFrames.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type ReplayFrame } from "./diagnosticReplayFrames.js";
2
+ export declare const REPLAY_FORMAT = "diagnostic-replay";
3
+ export declare const REPLAY_VERSION = 1;
4
+ export declare const ARTIFACT_CHUNK_BYTES = 65536;
5
+ export declare function badReplay(message: string): never;
6
+ export declare function mismatch(message: string): never;
7
+ /** Snapshot host metadata once, without invoking accessors or caller methods. */
8
+ export declare function replayRecord(value: unknown, keys: readonly string[]): Record<string, unknown>;
9
+ export declare function replayArray(value: unknown): unknown[];
10
+ export declare function replayToken(value: unknown): string;
11
+ export declare function replayLimit(value: unknown, label: string): number;
12
+ export declare function replayCancellation(signal: unknown): () => void;
13
+ /** Exactly the writer's bounded canonical flat-frame bytes, including newline. */
14
+ export declare function replayFrameBytes(frame: ReplayFrame): Uint8Array;
15
+ export declare function encodeArtifactChunk(bytes: Uint8Array): string;
16
+ export declare function decodeArtifactChunk(value: unknown): Uint8Array;
17
+ //# sourceMappingURL=diagnosticReplayProtocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnosticReplayProtocol.d.ts","sourceRoot":"","sources":["../src/diagnosticReplayProtocol.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAEvF,eAAO,MAAM,aAAa,sBAAsB,CAAC;AACjD,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAEhD;AACD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAE/C;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAW7F;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,CAoBrD;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGlD;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjE;AAID,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,CAQ9D;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAI/D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAI7D;AACD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAe9D"}