@bsv/vsc 0.2.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +58 -0
- package/README.md +107 -0
- package/artifacts/context-0.1.0.jsonld +127 -0
- package/artifacts/disclosure-0.1.0.schema.json +526 -0
- package/artifacts/epcis/NOTICE.md +11 -0
- package/artifacts/epcis/epcis-context-2.0.1.jsonld +593 -0
- package/artifacts/epcis/epcis-json-schema-2.0.1.json +2352 -0
- package/artifacts/epcis/query-schema-2.0.1.json +968 -0
- package/artifacts/external/NOTICE.md +3 -0
- package/artifacts/external/dpp-external-passport-1.context.jsonld +8 -0
- package/artifacts/external/dpp-external-passport-1.schema.json +158 -0
- package/artifacts/profile-0.1.0.json +100 -0
- package/artifacts/seal-0.1.0.schema.json +535 -0
- package/artifacts/w3c/NOTICE.md +3 -0
- package/artifacts/w3c/credentials-v2.jsonld +340 -0
- package/dist/context.d.ts +9 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +50 -0
- package/dist/context.js.map +1 -0
- package/dist/crypto.d.ts +50 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +141 -0
- package/dist/crypto.js.map +1 -0
- package/dist/did-web.d.ts +9 -0
- package/dist/did-web.d.ts.map +1 -0
- package/dist/did-web.js +66 -0
- package/dist/did-web.js.map +1 -0
- package/dist/epcis-source.d.ts +251 -0
- package/dist/epcis-source.d.ts.map +1 -0
- package/dist/epcis-source.js +573 -0
- package/dist/epcis-source.js.map +1 -0
- package/dist/epcis.d.ts +51 -0
- package/dist/epcis.d.ts.map +1 -0
- package/dist/epcis.js +171 -0
- package/dist/epcis.js.map +1 -0
- package/dist/exchange.d.ts +175 -0
- package/dist/exchange.d.ts.map +1 -0
- package/dist/exchange.js +491 -0
- package/dist/exchange.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/jcs.d.ts +25 -0
- package/dist/jcs.d.ts.map +1 -0
- package/dist/jcs.js +67 -0
- package/dist/jcs.js.map +1 -0
- package/dist/schema.d.ts +414 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +537 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +159 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +22 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +147 -0
- package/dist/validation.js.map +1 -0
- package/dist/verification.d.ts +10 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +350 -0
- package/dist/verification.js.map +1 -0
- package/package.json +68 -0
package/dist/exchange.js
ADDED
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External credential verification: the `vc-di-ecdsa-rdfc-2019@1` exchange
|
|
3
|
+
* profile (`spec/external-credential-profile.md`), a separate entry point
|
|
4
|
+
* (`@bsv/vsc/exchange`) from the SEAL verifier so that a foreign credential
|
|
5
|
+
* is never routed through `verifySeal` and the main entry's proof verifier
|
|
6
|
+
* keeps its pinned SEAL context allowlist.
|
|
7
|
+
*
|
|
8
|
+
* What is verified, each as its own check and never folded into one word:
|
|
9
|
+
* exact-byte parsing, the context set, the owned structural schema, the
|
|
10
|
+
* Data Integrity proof under `ecdsa-rdfc-2019` with a P-256 Multikey, the
|
|
11
|
+
* binding of that key to a `did:web` issuer document, the subject binding,
|
|
12
|
+
* the validity interval, the Bitstring status list, the issuer's authority
|
|
13
|
+
* under a named policy, and the availability of everything referenced.
|
|
14
|
+
*
|
|
15
|
+
* Two facts stay independent throughout. An RDF Data Integrity proof holds
|
|
16
|
+
* over canonicalised statements, so the same credential re-serialised with
|
|
17
|
+
* different whitespace still verifies; the exact-byte digest of what was
|
|
18
|
+
* issued is a different commitment, and a re-serialised copy has a different
|
|
19
|
+
* one. Both are reported, neither implies the other.
|
|
20
|
+
*/
|
|
21
|
+
import { createHash } from 'node:crypto';
|
|
22
|
+
import { gunzipSync } from 'node:zlib';
|
|
23
|
+
import { readFileSync } from 'node:fs';
|
|
24
|
+
import jsigs from 'jsonld-signatures';
|
|
25
|
+
import { DataIntegrityProof } from '@digitalbazaar/data-integrity';
|
|
26
|
+
import { cryptosuite as ecdsaRdfc2019 } from '@digitalbazaar/ecdsa-rdfc-2019-cryptosuite';
|
|
27
|
+
import { contexts as vcContexts } from '@digitalbazaar/credentials-context';
|
|
28
|
+
import { contexts as diContexts } from '@digitalbazaar/data-integrity-context';
|
|
29
|
+
import { contexts as multikeyContexts } from '@digitalbazaar/multikey-context';
|
|
30
|
+
import { contexts as didContexts } from 'did-context';
|
|
31
|
+
import { Ajv2020 } from 'ajv/dist/2020.js';
|
|
32
|
+
import addFormats from 'ajv-formats';
|
|
33
|
+
import { parseStrictJsonBytes } from './validation.js';
|
|
34
|
+
import { verifyTemporal } from './verification.js';
|
|
35
|
+
import { createDidWebResolver } from './did-web.js';
|
|
36
|
+
export const EXTERNAL_REPRESENTATIONS = ['vc-di-ecdsa-rdfc-2019@1'];
|
|
37
|
+
export const EXTERNAL_MEDIA_TYPE = 'application/vc+ld+json';
|
|
38
|
+
export const EXTERNAL_CRYPTOSUITE = 'ecdsa-rdfc-2019';
|
|
39
|
+
/** The profile limit on one credential's exact bytes: 256 KiB. */
|
|
40
|
+
export const EXTERNAL_CREDENTIAL_LIMIT_BYTES = 262_144;
|
|
41
|
+
export const VC_V2_CONTEXT = 'https://www.w3.org/ns/credentials/v2';
|
|
42
|
+
export const DATA_INTEGRITY_V2_CONTEXT = 'https://w3id.org/security/data-integrity/v2';
|
|
43
|
+
export const MULTIKEY_V1_CONTEXT = 'https://w3id.org/security/multikey/v1';
|
|
44
|
+
export const DID_V1_CONTEXT = 'https://www.w3.org/ns/did/v1';
|
|
45
|
+
/** The owned payload context of the profile, served from the package's artefact bytes and never fetched. */
|
|
46
|
+
export const EXTERNAL_PASSPORT_CONTEXT_URL = 'urn:bsv:dpp:external-passport:context:1';
|
|
47
|
+
export const EXTERNAL_PASSPORT_SCHEMA_ID = 'urn:bsv:dpp:external-passport:schema:1';
|
|
48
|
+
/** The P-256 public key multicodec prefix as it appears in base58btc Multikey encoding. */
|
|
49
|
+
const P256_MULTIBASE_PREFIX = 'zDn';
|
|
50
|
+
const P384_MULTIBASE_PREFIX = 'z82';
|
|
51
|
+
const P521_MULTIBASE_PREFIX = 'z2J9';
|
|
52
|
+
// Two literal URLs rather than one built from a name: a bundler that follows
|
|
53
|
+
// `new URL(literal, import.meta.url)` carries exactly that file as an asset,
|
|
54
|
+
// while a URL assembled from a variable makes it carry the whole directory and
|
|
55
|
+
// hand back the first file in it, which is the notice and not JSON.
|
|
56
|
+
const artefact = (url) => JSON.parse(readFileSync(url, 'utf8'));
|
|
57
|
+
export const EXTERNAL_PASSPORT_CONTEXT = artefact(new URL('../artifacts/external/dpp-external-passport-1.context.jsonld', import.meta.url));
|
|
58
|
+
export const EXTERNAL_PASSPORT_SCHEMA = artefact(new URL('../artifacts/external/dpp-external-passport-1.schema.json', import.meta.url));
|
|
59
|
+
/** The context sets the profile accepts by default: the VC 2.0 context alone, or with the Data Integrity context, each optionally followed by the owned payload context. */
|
|
60
|
+
export const DEFAULT_CONTEXT_SETS = [
|
|
61
|
+
[VC_V2_CONTEXT],
|
|
62
|
+
[VC_V2_CONTEXT, DATA_INTEGRITY_V2_CONTEXT],
|
|
63
|
+
[VC_V2_CONTEXT, EXTERNAL_PASSPORT_CONTEXT_URL],
|
|
64
|
+
[VC_V2_CONTEXT, DATA_INTEGRITY_V2_CONTEXT, EXTERNAL_PASSPORT_CONTEXT_URL],
|
|
65
|
+
];
|
|
66
|
+
const ajv = new Ajv2020({ allErrors: true, strict: true });
|
|
67
|
+
addFormats(ajv);
|
|
68
|
+
let ownedValidator;
|
|
69
|
+
/** The compiled owned schema, compiled once. */
|
|
70
|
+
export function externalPassportSchemaValidator() {
|
|
71
|
+
ownedValidator ??= ajv.compile(EXTERNAL_PASSPORT_SCHEMA);
|
|
72
|
+
return ownedValidator;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The profile's document loader: the maintained VC 2.0, Data Integrity,
|
|
76
|
+
* Multikey and DID contexts, the owned payload context from the package's
|
|
77
|
+
* own bytes, and the caller's pinned documents (issuer DID documents, keys,
|
|
78
|
+
* status list credentials). Nothing else is served: a context or document a
|
|
79
|
+
* credential names that is not pinned is unavailable, and the SEAL profile
|
|
80
|
+
* context is refused by name so a foreign credential cannot borrow it.
|
|
81
|
+
*/
|
|
82
|
+
export function createExternalDocumentLoader(documents = new Map(), options = {}) {
|
|
83
|
+
const builtins = new Map([
|
|
84
|
+
...vcContexts, ...diContexts, ...multikeyContexts, ...didContexts,
|
|
85
|
+
[EXTERNAL_PASSPORT_CONTEXT_URL, EXTERNAL_PASSPORT_CONTEXT],
|
|
86
|
+
]);
|
|
87
|
+
const didWeb = options.didWeb == null ? undefined : createDidWebResolver(options.didWeb);
|
|
88
|
+
return async (url) => {
|
|
89
|
+
if (url.startsWith('urn:bsv:vsc:'))
|
|
90
|
+
throw new Error(`Unsupported context: ${url} is the SEAL profile's and is never served to an external credential`);
|
|
91
|
+
const document = builtins.get(url) ?? documents.get(url);
|
|
92
|
+
if (document)
|
|
93
|
+
return { document: structuredClone(document), documentUrl: url, contextUrl: null };
|
|
94
|
+
if (didWeb != null && url.startsWith('did:web:'))
|
|
95
|
+
return didWeb(url);
|
|
96
|
+
throw new Error(`No document available: ${url}`);
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Parse exact bytes strictly (duplicate keys, malformed UTF-8 and depth refused) under the profile's 256 KiB limit. The bytes are never re-serialised. */
|
|
100
|
+
export function parseExternalCredentialBytes(bytes, limits = {}) {
|
|
101
|
+
const maxBytes = limits.maxBytes ?? EXTERNAL_CREDENTIAL_LIMIT_BYTES;
|
|
102
|
+
if (bytes.byteLength > maxBytes)
|
|
103
|
+
throw new Error(`Credential exceeds the ${maxBytes} byte profile limit`);
|
|
104
|
+
const value = parseStrictJsonBytes(bytes);
|
|
105
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value))
|
|
106
|
+
throw new Error('A credential is a JSON object');
|
|
107
|
+
return { credential: value, digest: createHash('sha256').update(bytes).digest('hex'), byteLength: bytes.byteLength };
|
|
108
|
+
}
|
|
109
|
+
const good = (evidence) => ({ outcome: 'verified', issues: [], ...(evidence == null ? {} : { evidence }) });
|
|
110
|
+
const fail = (code, message, outcome = 'invalid', path = '') => ({ outcome, issues: [{ code, path, message }] });
|
|
111
|
+
const notEvaluated = () => fail('not_evaluated', 'Earlier validation did not permit this check', 'indeterminate');
|
|
112
|
+
const isUri = (value) => typeof value === 'string' && /^[a-z][a-z0-9+.-]*:\S+$/i.test(value);
|
|
113
|
+
const proofArray = (credential) => Array.isArray(credential.proof) ? credential.proof : credential.proof != null && typeof credential.proof === 'object' ? [credential.proof] : [];
|
|
114
|
+
const sameList = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
|
|
115
|
+
function contextsCheck(credential, policy) {
|
|
116
|
+
const contexts = credential['@context'];
|
|
117
|
+
if (!Array.isArray(contexts) || contexts.length === 0)
|
|
118
|
+
return fail('context_missing', 'A credential declares its contexts as a non-empty array', 'invalid', '/@context');
|
|
119
|
+
if (contexts.some(c => typeof c !== 'string'))
|
|
120
|
+
return fail('context_inline', 'An inline context object is not a pinned artefact; it could redefine signed terms, so it is unsupported rather than trusted', 'unsupported', '/@context');
|
|
121
|
+
if (contexts[0] !== VC_V2_CONTEXT)
|
|
122
|
+
return fail('context_unsupported', 'The first context must be the W3C Verifiable Credentials 2.0 context', 'unsupported', '/@context');
|
|
123
|
+
if (!policy.allowedContextSets.some(set => sameList(set, contexts)))
|
|
124
|
+
return fail('context_unsupported', `The context set [${contexts.join(', ')}] is not one this profile pins`, 'unsupported', '/@context');
|
|
125
|
+
return good(contexts);
|
|
126
|
+
}
|
|
127
|
+
function schemaCheck(credential, validate) {
|
|
128
|
+
if (validate(credential))
|
|
129
|
+
return good([EXTERNAL_PASSPORT_SCHEMA_ID]);
|
|
130
|
+
return { outcome: 'invalid', issues: (validate.errors ?? []).map(e => ({ code: 'schema', path: e.instancePath, message: e.message ?? 'Invalid field' })) };
|
|
131
|
+
}
|
|
132
|
+
async function loadDocument(loader, url, resolved) {
|
|
133
|
+
try {
|
|
134
|
+
const { document } = await loader(url);
|
|
135
|
+
resolved.available.push(url);
|
|
136
|
+
return document;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
resolved.unavailable.push(url);
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** Whether a DID document authorises a verification method for assertion, by identifier or by embedding. */
|
|
144
|
+
function authorisesAssertion(didDocument, methodId) {
|
|
145
|
+
const relationships = didDocument.assertionMethod;
|
|
146
|
+
if (!Array.isArray(relationships))
|
|
147
|
+
return false;
|
|
148
|
+
return relationships.some(value => value === methodId || (typeof value === 'object' && value !== null && value.id === methodId));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The issuer binding: the issuer is a DID under an allowed method, its
|
|
152
|
+
* document resolves and identifies it, and every proof's verification method
|
|
153
|
+
* is a P-256 Multikey controlled by the issuer and listed under
|
|
154
|
+
* `assertionMethod`. Resolving a document establishes a key relationship and
|
|
155
|
+
* nothing more: no allocation authority, no accreditation.
|
|
156
|
+
*/
|
|
157
|
+
async function issuerBindingCheck(credential, proofs, policy, resolved) {
|
|
158
|
+
const issuer = credential.issuer;
|
|
159
|
+
if (typeof issuer !== 'string' || !issuer.startsWith('did:'))
|
|
160
|
+
return fail('issuer_not_did', 'The issuer must be a DID string; embedded issuer objects are not supported by this profile', 'unsupported', '/issuer');
|
|
161
|
+
const methods = policy.issuerPolicy?.allowedMethods ?? ['did:web'];
|
|
162
|
+
if (!methods.some(m => issuer.startsWith(`${m}:`)))
|
|
163
|
+
return fail('did_method_unsupported', `Issuer DID method is not one of ${methods.join(', ')}`, 'unsupported', '/issuer');
|
|
164
|
+
let didDocument;
|
|
165
|
+
if (policy.issuerPolicy?.resolve != null) {
|
|
166
|
+
try {
|
|
167
|
+
didDocument = await policy.issuerPolicy.resolve(issuer);
|
|
168
|
+
resolved.available.push(issuer);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
resolved.unavailable.push(issuer);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
didDocument = await loadDocument(policy.documentLoader, issuer, resolved);
|
|
176
|
+
}
|
|
177
|
+
if (didDocument == null)
|
|
178
|
+
return fail('issuer_document_unavailable', `The issuer document ${issuer} could not be resolved`, 'indeterminate', '/issuer');
|
|
179
|
+
if (didDocument.id !== issuer)
|
|
180
|
+
return fail('issuer_document_mismatch', `The resolved document identifies ${String(didDocument.id)}, not the issuer ${issuer}`, 'invalid', '/issuer');
|
|
181
|
+
resolved.didDocument = didDocument;
|
|
182
|
+
if (proofs.length === 0)
|
|
183
|
+
return fail('proof_missing', 'A secured credential is required to bind an issuer to a key', 'invalid', '/proof');
|
|
184
|
+
const evidence = [issuer];
|
|
185
|
+
for (const proof of proofs) {
|
|
186
|
+
const methodId = proof.verificationMethod;
|
|
187
|
+
if (typeof methodId !== 'string' || methodId === '')
|
|
188
|
+
return fail('verification_method_missing', 'A proof names its verification method', 'invalid', '/proof/verificationMethod');
|
|
189
|
+
const method = await loadDocument(policy.documentLoader, methodId, resolved);
|
|
190
|
+
if (method == null)
|
|
191
|
+
return fail('verification_method_unavailable', `The verification method ${methodId} could not be resolved`, 'indeterminate', '/proof/verificationMethod');
|
|
192
|
+
const multibase = method.publicKeyMultibase;
|
|
193
|
+
if (method.type !== 'Multikey' || typeof multibase !== 'string')
|
|
194
|
+
return fail('key_type_unsupported', 'Only a Multikey verification method is supported by this profile', 'unsupported', '/proof/verificationMethod');
|
|
195
|
+
if (!multibase.startsWith(P256_MULTIBASE_PREFIX)) {
|
|
196
|
+
const curve = multibase.startsWith(P384_MULTIBASE_PREFIX) ? 'P-384' : multibase.startsWith(P521_MULTIBASE_PREFIX) ? 'P-521' : 'an unrecognised key type';
|
|
197
|
+
return fail('curve_unsupported', `The verification method is ${curve}; this profile supports P-256 only`, 'unsupported', '/proof/verificationMethod');
|
|
198
|
+
}
|
|
199
|
+
const controller = typeof method.controller === 'string' ? method.controller : method.controller?.id;
|
|
200
|
+
if (controller !== issuer)
|
|
201
|
+
return fail('key_controller_mismatch', `The key ${methodId} is controlled by ${String(controller)}, not the issuer ${issuer}`, 'invalid', '/proof/verificationMethod');
|
|
202
|
+
if (!authorisesAssertion(didDocument, methodId))
|
|
203
|
+
return fail('key_not_authorised', `The issuer document does not list ${methodId} under assertionMethod`, 'invalid', '/proof/verificationMethod');
|
|
204
|
+
evidence.push(methodId);
|
|
205
|
+
}
|
|
206
|
+
return good(evidence);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The proof itself: every proof is a Data Integrity proof under
|
|
210
|
+
* `ecdsa-rdfc-2019` for the assertion purpose, verified by the maintained
|
|
211
|
+
* suite with the issuer's resolved document as the controller. A set that
|
|
212
|
+
* mixes suites, or any other suite, is unsupported rather than failed.
|
|
213
|
+
*/
|
|
214
|
+
async function proofCheck(credential, proofs, policy, resolved) {
|
|
215
|
+
if (proofs.length === 0)
|
|
216
|
+
return fail('proof_missing', 'A secured credential is required', 'invalid', '/proof');
|
|
217
|
+
for (const proof of proofs) {
|
|
218
|
+
if (proof.type !== 'DataIntegrityProof' || proof.cryptosuite !== EXTERNAL_CRYPTOSUITE) {
|
|
219
|
+
return fail('suite_unsupported', `Proof suite ${String(proof.type)}/${String(proof.cryptosuite ?? '')} is not ${EXTERNAL_CRYPTOSUITE}`, 'unsupported', '/proof');
|
|
220
|
+
}
|
|
221
|
+
if (proof.proofPurpose !== 'assertionMethod')
|
|
222
|
+
return fail('proof_purpose', 'The proof does not authorise an assertion', 'invalid', '/proof/proofPurpose');
|
|
223
|
+
}
|
|
224
|
+
if (resolved.didDocument == null)
|
|
225
|
+
return fail('issuer_document_unavailable', 'The proof cannot be evaluated without the issuer document', 'indeterminate', '/issuer');
|
|
226
|
+
const purpose = new jsigs.purposes.AssertionProofPurpose({ controller: resolved.didDocument });
|
|
227
|
+
const suite = new DataIntegrityProof({ cryptosuite: ecdsaRdfc2019 });
|
|
228
|
+
try {
|
|
229
|
+
const result = await jsigs.verify(credential, { suite, purpose, documentLoader: policy.documentLoader });
|
|
230
|
+
if (result.verified)
|
|
231
|
+
return good(proofs.map(p => p.verificationMethod));
|
|
232
|
+
const message = result.error?.message ?? result.results?.find((r) => r.error)?.error?.message ?? 'Cryptographic proof failed';
|
|
233
|
+
const detail = Array.isArray(result.error?.errors) ? result.error.errors.map((e) => e.message) : [];
|
|
234
|
+
const text = [message, ...detail].join('; ');
|
|
235
|
+
if (/not authori[sz]ed|proof purpose/i.test(text))
|
|
236
|
+
return fail('key_not_authorised', text, 'invalid', '/proof');
|
|
237
|
+
if (/No document available/.test(text))
|
|
238
|
+
return fail('referenced_artefact_unavailable', text, 'indeterminate', '/proof');
|
|
239
|
+
return fail('proof_failed', text, 'invalid', '/proof');
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
243
|
+
return fail(/No document available/.test(message) ? 'referenced_artefact_unavailable' : 'proof_failed', message, /No document available/.test(message) ? 'indeterminate' : 'invalid', '/proof');
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function subjectBindingCheck(credential, policy) {
|
|
247
|
+
const subject = credential.credentialSubject;
|
|
248
|
+
if (Array.isArray(subject))
|
|
249
|
+
return { check: fail('subject_structure_unsupported', 'This profile supports exactly one credential subject', 'unsupported', '/credentialSubject'), subjects: subject.map(s => s?.id).filter(isUri) };
|
|
250
|
+
if (subject == null || typeof subject !== 'object' || !isUri(subject.id))
|
|
251
|
+
return { check: fail('subject_structure_unsupported', 'The credential subject must carry an explicit URI identifier', 'unsupported', '/credentialSubject/id'), subjects: [] };
|
|
252
|
+
const id = subject.id;
|
|
253
|
+
if (policy.expectedSubject == null)
|
|
254
|
+
return { check: { outcome: 'not-required', issues: [{ code: 'subject_not_expected', path: '/credentialSubject/id', message: `No expected subject was supplied; the credential names ${id}` }], evidence: [id] }, subjects: [id] };
|
|
255
|
+
if (policy.expectedSubject === id)
|
|
256
|
+
return { check: good([id]), subjects: [id] };
|
|
257
|
+
const binding = policy.subjectBindingPolicy?.bindings.find(b => b.credentialSubject === id && b.passportId === policy.expectedSubject);
|
|
258
|
+
if (binding != null)
|
|
259
|
+
return { check: good([id, binding.evidenceRef, policy.subjectBindingPolicy.id]), subjects: [id] };
|
|
260
|
+
return { check: fail('subject_mismatch', `The credential names ${id}, not the expected ${policy.expectedSubject}, and no binding policy relates them`, 'invalid', '/credentialSubject/id'), subjects: [id] };
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* The W3C Bitstring Status List rules of the SEAL verifier, with the proof
|
|
264
|
+
* verifier a parameter so the list is checked under this profile's suite.
|
|
265
|
+
* Identifier, authorised list issuer, proof, validity, signed freshness,
|
|
266
|
+
* purpose, canonical encoding, bounded decompression and the bit are
|
|
267
|
+
* separate refusals; a stale list stays stale however recently fetched.
|
|
268
|
+
*/
|
|
269
|
+
export async function verifyBitstringStatus(credential, options, verifyProof) {
|
|
270
|
+
const entry = credential.credentialStatus;
|
|
271
|
+
const policy = options.statusPolicy;
|
|
272
|
+
if (entry == null) {
|
|
273
|
+
if (policy != null)
|
|
274
|
+
return fail('status_entry_missing', 'The status policy requires a status entry and the credential carries none', 'invalid', '/credentialStatus');
|
|
275
|
+
if (options.statusOptional === true)
|
|
276
|
+
return { outcome: 'not-required', issues: [{ code: 'status_not_required', path: '/credentialStatus', message: 'The selected profile option accepts a credential without status; revocation cannot be evaluated' }] };
|
|
277
|
+
return fail('status_policy_missing', 'No authenticated status evidence policy is configured', 'indeterminate', '/credentialStatus');
|
|
278
|
+
}
|
|
279
|
+
if (!policy)
|
|
280
|
+
return fail('status_policy_missing', 'No authenticated status evidence policy is configured', 'indeterminate', '/credentialStatus');
|
|
281
|
+
if (!policy.id || !Number.isFinite(policy.maxAgeMs) || policy.maxAgeMs <= 0 || policy.maxAgeMs > 7 * 24 * 60 * 60 * 1000)
|
|
282
|
+
return fail('status_policy_invalid', 'Status freshness must be explicitly bounded to no more than seven days');
|
|
283
|
+
if (entry.type !== 'BitstringStatusListEntry' || !['revocation', 'suspension'].includes(entry.statusPurpose) || typeof entry.statusListIndex !== 'string' || !/^(0|[1-9][0-9]*)$/.test(entry.statusListIndex) || typeof entry.statusListCredential !== 'string')
|
|
284
|
+
return fail('status_entry_invalid', 'A supported status entry with a canonical decimal index is required', 'invalid', '/credentialStatus');
|
|
285
|
+
const index = Number(entry.statusListIndex);
|
|
286
|
+
if (!Number.isSafeInteger(index))
|
|
287
|
+
return fail('status_index_invalid', 'Status index is out of range');
|
|
288
|
+
let list;
|
|
289
|
+
try {
|
|
290
|
+
list = await policy.resolve(entry.statusListCredential);
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return fail('status_unavailable', 'Status evidence could not be retrieved', 'indeterminate');
|
|
294
|
+
}
|
|
295
|
+
if (!list || typeof list !== 'object' || list.id !== entry.statusListCredential || !Array.isArray(list.type) || !list.type.includes('BitstringStatusListCredential'))
|
|
296
|
+
return fail('status_identity', 'Status list identifier or credential type does not match');
|
|
297
|
+
const authorised = list.issuer === credential.issuer || policy.delegatedListIssuers?.[credential.issuer]?.includes(list.issuer);
|
|
298
|
+
if (!authorised)
|
|
299
|
+
return fail('status_issuer', 'The credential issuer has not been granted this status-list issuer by verifier policy');
|
|
300
|
+
const proof = await verifyProof(list);
|
|
301
|
+
if (proof.outcome !== 'verified')
|
|
302
|
+
return { ...proof, issues: proof.issues.map(i => ({ ...i, code: 'status_proof' })) };
|
|
303
|
+
const temporal = verifyTemporal(list, options.evaluationTime);
|
|
304
|
+
if (temporal.outcome !== 'verified')
|
|
305
|
+
return temporal;
|
|
306
|
+
if (Date.parse(options.evaluationTime) - Date.parse(list.validFrom) > policy.maxAgeMs)
|
|
307
|
+
return fail('status_stale', 'Signed status evidence exceeds the configured freshness interval', 'indeterminate');
|
|
308
|
+
const subject = list.credentialSubject;
|
|
309
|
+
if (!subject || subject.type !== 'BitstringStatusList' || subject.statusPurpose !== entry.statusPurpose || typeof subject.encodedList !== 'string' || !/^u[A-Za-z0-9_-]+$/.test(subject.encodedList))
|
|
310
|
+
return fail('status_payload', 'Status list purpose, subject type or encoding is invalid');
|
|
311
|
+
try {
|
|
312
|
+
const compressed = Buffer.from(subject.encodedList.slice(1), 'base64url');
|
|
313
|
+
if (`u${compressed.toString('base64url')}` !== subject.encodedList || compressed.length > 1_048_576)
|
|
314
|
+
return fail('status_encoding', 'Status list encoding is not canonical or exceeds the profile limit');
|
|
315
|
+
const bytes = gunzipSync(compressed, { maxOutputLength: 1_048_576 });
|
|
316
|
+
if (bytes.length < 16_384 || index >= bytes.length * 8)
|
|
317
|
+
return fail('status_index_invalid', 'Status list is too small or index is outside the list');
|
|
318
|
+
// W3C Bitstring Status List indexes each byte from most significant bit to least significant bit.
|
|
319
|
+
if (bytes[Math.floor(index / 8)] & (1 << (7 - index % 8)))
|
|
320
|
+
return fail(entry.statusPurpose === 'revocation' ? 'revoked' : 'suspended', 'Credential status prevents acceptance');
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return fail('status_encoding', 'Status list decompression failed or exceeded the profile limit');
|
|
324
|
+
}
|
|
325
|
+
return good([list.id, policy.id]);
|
|
326
|
+
}
|
|
327
|
+
function authorityCheck(issuer, policy) {
|
|
328
|
+
if (!policy.required)
|
|
329
|
+
return { outcome: 'not-required', issues: [{ code: 'authority_not_required', path: '', message: policy.reason }], evidence: [policy.id] };
|
|
330
|
+
if (issuer != null && policy.trustedIssuers.includes(issuer))
|
|
331
|
+
return good([policy.id, issuer]);
|
|
332
|
+
return fail('issuer_unauthorised', `${issuer ?? 'the issuer'} is not an issuer the policy ${policy.id} trusts for this claim`, 'invalid', '/issuer');
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Verify one external credential from its exact bytes under the profile.
|
|
336
|
+
* Every check answers for itself; `issues` is the union of their issues.
|
|
337
|
+
* Nothing here consults a trust list the credential carries, and nothing
|
|
338
|
+
* here reads the credential under the SEAL profile's rules.
|
|
339
|
+
*/
|
|
340
|
+
export async function verifyExternalCredential({ bytes, representation, policy }) {
|
|
341
|
+
const digest = createHash('sha256').update(bytes).digest('hex');
|
|
342
|
+
const base = { representation: EXTERNAL_REPRESENTATIONS[0], mediaType: EXTERNAL_MEDIA_TYPE, subjects: [], types: [], digest, evidenceScope: 'provided-evidence' };
|
|
343
|
+
const finish = (checks, extra = {}) => ({ ...base, ...extra, checks, issues: Object.values(checks).flatMap(c => c.issues) });
|
|
344
|
+
const pending = notEvaluated();
|
|
345
|
+
if (!EXTERNAL_REPRESENTATIONS.includes(representation)) {
|
|
346
|
+
return finish({ parse: fail('representation_unsupported', `${representation} is not a representation this entry point verifies`, 'unsupported'), contexts: pending, schema: pending, proof: pending, issuerBinding: pending, subjectBinding: pending, temporal: pending, status: pending, authority: pending, availability: pending });
|
|
347
|
+
}
|
|
348
|
+
let parsed;
|
|
349
|
+
try {
|
|
350
|
+
parsed = parseExternalCredentialBytes(bytes);
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
return finish({ parse: fail('parse', error instanceof Error ? error.message : String(error)), contexts: pending, schema: pending, proof: pending, issuerBinding: pending, subjectBinding: pending, temporal: pending, status: pending, authority: pending, availability: pending });
|
|
354
|
+
}
|
|
355
|
+
const credential = parsed.credential;
|
|
356
|
+
const types = Array.isArray(credential.type) ? credential.type.filter((t) => typeof t === 'string') : [];
|
|
357
|
+
const issuer = typeof credential.issuer === 'string' ? credential.issuer : undefined;
|
|
358
|
+
const credentialId = isUri(credential.id) ? credential.id : undefined;
|
|
359
|
+
const resolved = { unavailable: [], available: [] };
|
|
360
|
+
const proofs = proofArray(credential);
|
|
361
|
+
const contexts = contextsCheck(credential, policy.contextPolicy ?? { allowedContextSets: DEFAULT_CONTEXT_SETS });
|
|
362
|
+
const schema = schemaCheck(credential, policy.payloadSchema ?? externalPassportSchemaValidator());
|
|
363
|
+
const issuerBinding = await issuerBindingCheck(credential, proofs, policy, resolved);
|
|
364
|
+
// The proof is evaluated under pinned contexts and a resolved, supported
|
|
365
|
+
// issuer binding. An unsupported key or an unresolved document leaves the
|
|
366
|
+
// proof unsupported or indeterminate with the same reason; a binding that
|
|
367
|
+
// resolved and failed still lets the suite say what the signature does.
|
|
368
|
+
const proof = contexts.outcome !== 'verified'
|
|
369
|
+
? fail('context_unsupported', 'The proof covers statements under contexts this profile does not pin, so it is not evaluated', 'unsupported', '/@context')
|
|
370
|
+
: issuerBinding.outcome === 'unsupported' || issuerBinding.outcome === 'indeterminate'
|
|
371
|
+
? { outcome: issuerBinding.outcome, issues: issuerBinding.issues.map(i => ({ ...i, path: '/proof' })) }
|
|
372
|
+
: await proofCheck(credential, proofs, policy, resolved);
|
|
373
|
+
const { check: subjectBinding, subjects } = subjectBindingCheck(credential, policy);
|
|
374
|
+
const temporal = typeof credential.validFrom === 'string' ? verifyTemporal(credential, policy.evaluationTime) : fail('invalid_time', 'A credential states validFrom', 'invalid', '/validFrom');
|
|
375
|
+
const statusVerifier = async (list) => {
|
|
376
|
+
const listProofs = proofArray(list);
|
|
377
|
+
const listResolved = { unavailable: [], available: [] };
|
|
378
|
+
const listContexts = contextsCheck(list, policy.contextPolicy ?? { allowedContextSets: DEFAULT_CONTEXT_SETS });
|
|
379
|
+
if (listContexts.outcome !== 'verified')
|
|
380
|
+
return listContexts;
|
|
381
|
+
const binding = await issuerBindingCheck(list, listProofs, policy, listResolved);
|
|
382
|
+
resolved.unavailable.push(...listResolved.unavailable);
|
|
383
|
+
resolved.available.push(...listResolved.available);
|
|
384
|
+
if (binding.outcome !== 'verified')
|
|
385
|
+
return binding;
|
|
386
|
+
return proofCheck(list, listProofs, policy, listResolved);
|
|
387
|
+
};
|
|
388
|
+
const status = await verifyBitstringStatus(credential, { statusPolicy: policy.statusPolicy, statusOptional: policy.statusOptional, evaluationTime: policy.evaluationTime }, statusVerifier);
|
|
389
|
+
if (status.issues.some(i => i.code === 'status_unavailable') && typeof credential.credentialStatus?.statusListCredential === 'string')
|
|
390
|
+
resolved.unavailable.push(credential.credentialStatus.statusListCredential);
|
|
391
|
+
const authority = authorityCheck(issuer, policy.authorityPolicy);
|
|
392
|
+
const availability = resolved.unavailable.length === 0
|
|
393
|
+
? good([...new Set(resolved.available)])
|
|
394
|
+
: { outcome: 'indeterminate', issues: [...new Set(resolved.unavailable)].map(url => ({ code: 'referenced_artefact_unavailable', path: '', message: `${url} was not available` })), evidence: [...new Set(resolved.available)] };
|
|
395
|
+
return finish({ parse: good([`sha256:${digest}`]), contexts, schema, proof, issuerBinding, subjectBinding, temporal, status, authority, availability }, { ...(credentialId == null ? {} : { credentialId }), ...(issuer == null ? {} : { issuer }), subjects, types });
|
|
396
|
+
}
|
|
397
|
+
/** The profile's issue codes that name a shared reason code of the report; anything else becomes an `x-external-` code. */
|
|
398
|
+
const REASON_BY_ISSUE = {
|
|
399
|
+
representation_unsupported: 'representation-unsupported',
|
|
400
|
+
parse: 'decode-failed',
|
|
401
|
+
context_unsupported: 'suite-unsupported',
|
|
402
|
+
context_inline: 'suite-unsupported',
|
|
403
|
+
context_missing: 'suite-unsupported',
|
|
404
|
+
suite_unsupported: 'suite-unsupported',
|
|
405
|
+
curve_unsupported: 'suite-unsupported',
|
|
406
|
+
key_type_unsupported: 'suite-unsupported',
|
|
407
|
+
proof_missing: 'proof-absent',
|
|
408
|
+
proof_failed: 'signature-invalid',
|
|
409
|
+
proof_purpose: 'signature-invalid',
|
|
410
|
+
key_not_authorised: 'signature-invalid',
|
|
411
|
+
key_controller_mismatch: 'signature-invalid',
|
|
412
|
+
issuer_document_mismatch: 'signature-invalid',
|
|
413
|
+
issuer_not_did: 'suite-unsupported',
|
|
414
|
+
did_method_unsupported: 'suite-unsupported',
|
|
415
|
+
verification_method_missing: 'signature-invalid',
|
|
416
|
+
verification_method_unavailable: 'referenced-artefact-unavailable',
|
|
417
|
+
issuer_document_unavailable: 'referenced-artefact-unavailable',
|
|
418
|
+
referenced_artefact_unavailable: 'referenced-artefact-unavailable',
|
|
419
|
+
schema: 'schema-invalid',
|
|
420
|
+
not_yet_valid: 'not-yet-valid',
|
|
421
|
+
expired: 'expired',
|
|
422
|
+
invalid_time: 'time-invalid',
|
|
423
|
+
revoked: 'status-revoked',
|
|
424
|
+
suspended: 'status-suspended',
|
|
425
|
+
status_stale: 'status-stale',
|
|
426
|
+
status_unavailable: 'status-unknown',
|
|
427
|
+
status_policy_missing: 'policy-missing',
|
|
428
|
+
status_policy_invalid: 'policy-missing',
|
|
429
|
+
status_entry_missing: 'status-unset',
|
|
430
|
+
status_not_required: 'status-unset',
|
|
431
|
+
status_proof: 'status-unauthenticated',
|
|
432
|
+
status_issuer: 'status-unauthenticated',
|
|
433
|
+
status_identity: 'status-unauthenticated',
|
|
434
|
+
status_payload: 'status-unknown',
|
|
435
|
+
status_encoding: 'status-unknown',
|
|
436
|
+
status_index_invalid: 'status-unknown',
|
|
437
|
+
status_entry_invalid: 'status-purpose-unsupported',
|
|
438
|
+
issuer_unauthorised: 'authority-unconfirmed',
|
|
439
|
+
authority_not_required: 'authority-not-required',
|
|
440
|
+
subject_mismatch: 'subject-mismatch',
|
|
441
|
+
subject_structure_unsupported: 'suite-unsupported',
|
|
442
|
+
not_evaluated: 'not-inspected',
|
|
443
|
+
};
|
|
444
|
+
function partial(check) {
|
|
445
|
+
const detail = check.issues.length === 0 ? undefined : check.issues.map(i => ({ code: i.code, path: i.path, message: i.message }));
|
|
446
|
+
const refs = check.evidence == null ? {} : { evidenceRefs: check.evidence };
|
|
447
|
+
if (check.outcome === 'verified')
|
|
448
|
+
return { status: 'pass', ...refs };
|
|
449
|
+
const first = check.issues[0]?.code;
|
|
450
|
+
const reasonCode = first == null ? 'x-external-unspecified' : REASON_BY_ISSUE[first] ?? `x-external-${first.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')}`;
|
|
451
|
+
if (check.outcome === 'not-required')
|
|
452
|
+
return { status: 'not-applicable', reasonCode, ...refs, ...(detail == null ? {} : { detail }) };
|
|
453
|
+
return { status: check.outcome === 'invalid' ? 'fail' : 'unknown', reasonCode, ...refs, ...(detail == null ? {} : { detail }) };
|
|
454
|
+
}
|
|
455
|
+
/** The worse of two answers: a failure outranks an unknown, an unknown outranks a pass. */
|
|
456
|
+
function worst(a, b) {
|
|
457
|
+
const rank = (c) => c.status === 'fail' ? 3 : c.status === 'unknown' ? 2 : c.status === 'not-applicable' ? 1 : 0;
|
|
458
|
+
const chosen = rank(b) > rank(a) ? b : a;
|
|
459
|
+
const refs = [...new Set([...(a.evidenceRefs ?? []), ...(b.evidenceRefs ?? [])])];
|
|
460
|
+
return { ...chosen, ...(refs.length === 0 ? {} : { evidenceRefs: refs }) };
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* The verifier the report's `credentialVerifier` slot takes for this
|
|
464
|
+
* representation. The proof and issuer-binding checks answer `proof`
|
|
465
|
+
* together (a proof whose key its issuer never authorised does not verify
|
|
466
|
+
* under its own suite's controller rule); the schema, validity interval,
|
|
467
|
+
* status, authority and availability checks answer their own slots. The
|
|
468
|
+
* attestation type is the credential's first type after VerifiableCredential.
|
|
469
|
+
*/
|
|
470
|
+
export function externalCredentialVerifierFor(policy) {
|
|
471
|
+
return async (input) => {
|
|
472
|
+
if (!EXTERNAL_REPRESENTATIONS.includes(input.representation)) {
|
|
473
|
+
throw new Error(`this verifier handles ${EXTERNAL_REPRESENTATIONS.join(', ')} only, not ${input.representation}`);
|
|
474
|
+
}
|
|
475
|
+
const result = await verifyExternalCredential({ bytes: Uint8Array.from(input.bytes), representation: input.representation, policy: { ...policy, evaluationTime: policy.evaluationTime ?? input.checkedAt } });
|
|
476
|
+
const attestationType = result.types.find(t => t !== 'VerifiableCredential');
|
|
477
|
+
return {
|
|
478
|
+
...(result.credentialId == null ? {} : { id: result.credentialId }),
|
|
479
|
+
...(result.issuer == null ? {} : { issuer: result.issuer }),
|
|
480
|
+
subjects: result.subjects,
|
|
481
|
+
...(attestationType == null ? {} : { attestationType }),
|
|
482
|
+
proof: worst(partial(result.checks.parse.outcome === 'verified' ? result.checks.proof : result.checks.parse), partial(result.checks.issuerBinding)),
|
|
483
|
+
schema: partial(result.checks.schema),
|
|
484
|
+
time: partial(result.checks.temporal),
|
|
485
|
+
status: partial(result.checks.status),
|
|
486
|
+
authority: partial(result.checks.authority),
|
|
487
|
+
availability: partial(result.checks.availability),
|
|
488
|
+
};
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exchange.js","sourceRoot":"","sources":["../src/exchange.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,OAAO,EAAyB,MAAM,kBAAkB,CAAC;AAClE,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,yBAAyB,CAAU,CAAC;AAE7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAiC,CAAC;AACrE,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AACtD,kEAAkE;AAClE,MAAM,CAAC,MAAM,+BAA+B,GAAG,OAAO,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAG,sCAAsC,CAAC;AACpE,MAAM,CAAC,MAAM,yBAAyB,GAAG,6CAA6C,CAAC;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG,uCAAuC,CAAC;AAC3E,MAAM,CAAC,MAAM,cAAc,GAAG,8BAA8B,CAAC;AAC7D,4GAA4G;AAC5G,MAAM,CAAC,MAAM,6BAA6B,GAAG,yCAAyC,CAAC;AACvF,MAAM,CAAC,MAAM,2BAA2B,GAAG,wCAAwC,CAAC;AACpF,2FAA2F;AAC3F,MAAM,qBAAqB,GAAG,KAAK,CAAC;AACpC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AACpC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAErC,6EAA6E;AAC7E,6EAA6E;AAC7E,+EAA+E;AAC/E,oEAAoE;AACpE,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAc,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAe,CAAC;AAC/F,MAAM,CAAC,MAAM,yBAAyB,GAAe,QAAQ,CAAC,IAAI,GAAG,CAAC,8DAA8D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACxJ,MAAM,CAAC,MAAM,wBAAwB,GAAe,QAAQ,CAAC,IAAI,GAAG,CAAC,2DAA2D,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEpJ,4KAA4K;AAC5K,MAAM,CAAC,MAAM,oBAAoB,GAAmC;IAClE,CAAC,aAAa,CAAC;IACf,CAAC,aAAa,EAAE,yBAAyB,CAAC;IAC1C,CAAC,aAAa,EAAE,6BAA6B,CAAC;IAC9C,CAAC,aAAa,EAAE,yBAAyB,EAAE,6BAA6B,CAAC;CAC1E,CAAC;AAEF,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1D,UAA8C,CAAC,GAAG,CAAC,CAAC;AACrD,IAAI,cAA4C,CAAC;AACjD,gDAAgD;AAChD,MAAM,UAAU,+BAA+B;IAC7C,cAAc,KAAK,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACzD,OAAO,cAAc,CAAC;AACxB,CAAC;AAOD;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAAC,YAA6C,IAAI,GAAG,EAAE,EAAE,UAAiC,EAAE;IACtI,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAqB;QAC3C,GAAG,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,gBAAgB,EAAE,GAAG,WAAW;QACjE,CAAC,6BAA6B,EAAE,yBAAyB,CAAC;KAC3D,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzF,OAAO,KAAK,EAAC,GAAG,EAAC,EAAE;QACjB,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,sEAAsE,CAAC,CAAC;QACvJ,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,QAAQ;YAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACjG,IAAI,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC;AASD,2JAA2J;AAC3J,MAAM,UAAU,4BAA4B,CAAC,KAAiB,EAAE,SAAgC,EAAE;IAChG,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,+BAA+B,CAAC;IACpE,IAAI,KAAK,CAAC,UAAU,GAAG,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,qBAAqB,CAAC,CAAC;IAC1G,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzH,OAAO,EAAE,UAAU,EAAE,KAAmB,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;AACrI,CAAC;AAgDD,MAAM,IAAI,GAAG,CAAC,QAAmB,EAAS,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AAC9H,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,UAA4B,SAAS,EAAE,IAAI,GAAG,EAAE,EAAS,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1J,MAAM,YAAY,GAAG,GAAU,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,8CAA8C,EAAE,eAAe,CAAC,CAAC;AACzH,MAAM,KAAK,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvH,MAAM,UAAU,GAAG,CAAC,UAAsB,EAAW,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,IAAI,IAAI,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5N,MAAM,QAAQ,GAAG,CAAC,CAAqB,EAAE,CAAqB,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnI,SAAS,aAAa,CAAC,UAAsB,EAAE,MAA6B;IAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,yDAAyD,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IACzK,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,6HAA6H,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IACxO,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC,qBAAqB,EAAE,sEAAsE,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAC1K,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAoB,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,qBAAqB,EAAE,oBAAqB,QAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IACvO,OAAO,IAAI,CAAC,QAAoB,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,UAAsB,EAAE,QAA0B;IACrE,IAAI,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC;AAC7J,CAAC;AAID,KAAK,UAAU,YAAY,CAAC,MAAsB,EAAE,GAAW,EAAE,QAAkB;IACjF,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QACvC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,4GAA4G;AAC5G,SAAS,mBAAmB,CAAC,WAAuB,EAAE,QAAgB;IACpE,MAAM,aAAa,GAAG,WAAW,CAAC,eAAe,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAAoB,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC;AACnJ,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,kBAAkB,CAAC,UAAsB,EAAE,MAAe,EAAE,MAAkC,EAAE,QAAkB;IAC/H,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACjC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,4FAA4F,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACpN,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,EAAE,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,wBAAwB,EAAE,mCAAmC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC7K,IAAI,WAAmC,CAAC;IACxC,IAAI,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC;YAAC,WAAW,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;IAChJ,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,WAAW,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,6BAA6B,EAAE,uBAAuB,MAAM,wBAAwB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IACvJ,IAAI,WAAW,CAAC,EAAE,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,0BAA0B,EAAE,oCAAoC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,oBAAoB,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACrL,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,eAAe,EAAE,6DAA6D,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1I,MAAM,QAAQ,GAAa,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,kBAAkB,CAAC;QAC1C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC,6BAA6B,EAAE,uCAAuC,EAAE,SAAS,EAAE,2BAA2B,CAAC,CAAC;QACjL,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,iCAAiC,EAAE,2BAA2B,QAAQ,wBAAwB,EAAE,eAAe,EAAE,2BAA2B,CAAC,CAAC;QAC9K,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,kEAAkE,EAAE,aAAa,EAAE,2BAA2B,CAAC,CAAC;QACrN,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;YACzJ,OAAO,IAAI,CAAC,mBAAmB,EAAE,8BAA8B,KAAK,oCAAoC,EAAE,aAAa,EAAE,2BAA2B,CAAC,CAAC;QACxJ,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,MAAM,CAAC,UAAqC,EAAE,EAAE,CAAC;QACjI,IAAI,UAAU,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,yBAAyB,EAAE,WAAW,QAAQ,qBAAqB,MAAM,CAAC,UAAU,CAAC,oBAAoB,MAAM,EAAE,EAAE,SAAS,EAAE,2BAA2B,CAAC,CAAC;QAClM,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC,oBAAoB,EAAE,qCAAqC,QAAQ,wBAAwB,EAAE,SAAS,EAAE,2BAA2B,CAAC,CAAC;QAClM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,UAAU,CAAC,UAAsB,EAAE,MAAe,EAAE,MAAkC,EAAE,QAAkB;IACvH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,eAAe,EAAE,kCAAkC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/G,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,IAAI,KAAK,CAAC,WAAW,KAAK,oBAAoB,EAAE,CAAC;YACtF,OAAO,IAAI,CAAC,mBAAmB,EAAE,eAAe,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,WAAW,oBAAoB,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QACnK,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC,eAAe,EAAE,2CAA2C,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;IAC5J,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,6BAA6B,EAAE,2DAA2D,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IACtK,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QACzG,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACxE,MAAM,OAAO,GAAW,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,4BAA4B,CAAC;QACzJ,MAAM,MAAM,GAAa,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrH,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChH,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,iCAAiC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QACxH,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClM,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAsB,EAAE,MAAkC;IACrF,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,+BAA+B,EAAE,sDAAsD,EAAE,aAAa,EAAE,oBAAoB,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAgB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAClP,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAE,OAAsB,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,+BAA+B,EAAE,8DAA8D,EAAE,aAAa,EAAE,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACxQ,MAAM,EAAE,GAAI,OAAsB,CAAC,EAAY,CAAC;IAChD,IAAI,MAAM,CAAC,eAAe,IAAI,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,0DAA0D,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACtQ,IAAI,MAAM,CAAC,eAAe,KAAK,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAChF,MAAM,OAAO,GAAG,MAAM,CAAC,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,eAAe,CAAC,CAAC;IACvI,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,oBAAqB,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACxH,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,sBAAsB,MAAM,CAAC,eAAe,sCAAsC,EAAE,SAAS,EAAE,uBAAuB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/M,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAsB,EACtB,OAA0F,EAC1F,WAAiD;IAEjD,MAAM,KAAK,GAAG,UAAU,CAAC,gBAA0C,CAAC;IACpE,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IACpC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,2EAA2E,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;QACrK,IAAI,OAAO,CAAC,cAAc,KAAK,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,iGAAiG,EAAE,CAAC,EAAE,CAAC;QAC1P,OAAO,IAAI,CAAC,uBAAuB,EAAE,uDAAuD,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;IACtI,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,uBAAuB,EAAE,uDAAuD,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;IACjJ,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QAAE,OAAO,IAAI,CAAC,uBAAuB,EAAE,wEAAwE,CAAC,CAAC;IACzO,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,IAAI,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAuB,CAAC,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,qEAAqE,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACtZ,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,8BAA8B,CAAC,CAAC;IACtG,IAAI,IAAgB,CAAC;IACrB,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC,oBAAoB,EAAE,wCAAwC,EAAE,eAAe,CAAC,CAAC;IAAC,CAAC;IACxK,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,oBAAoB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,0DAA0D,CAAC,CAAC;IACjQ,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC,UAAU,CAAC,MAAgB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1I,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC,eAAe,EAAE,uFAAuF,CAAC,CAAC;IACvI,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAkB,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC;IACvH,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,QAAQ,CAAC;IACrD,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,cAAc,EAAE,kEAAkE,EAAE,eAAe,CAAC,CAAC;IACxM,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;IACvC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC,gBAAgB,EAAE,0DAA0D,CAAC,CAAC;IAChS,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC1E,IAAI,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,OAAO,CAAC,WAAW,IAAI,UAAU,CAAC,MAAM,GAAG,SAAS;YAAE,OAAO,IAAI,CAAC,iBAAiB,EAAE,oEAAoE,CAAC,CAAC;QAC1M,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QACrE,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,sBAAsB,EAAE,uDAAuD,CAAC,CAAC;QACrJ,kGAAkG;QAClG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,uCAAuC,CAAC,CAAC;IAClL,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC,iBAAiB,EAAE,gEAAgE,CAAC,CAAC;IAAC,CAAC;IAC7G,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,cAAc,CAAC,MAA0B,EAAE,MAA+B;IACjF,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAChK,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/F,OAAO,IAAI,CAAC,qBAAqB,EAAE,GAAG,MAAM,IAAI,YAAY,gCAAgC,MAAM,CAAC,EAAE,wBAAwB,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAqF;IACjK,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,EAAE,cAAc,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,mBAAiD,EAAE,QAAQ,EAAE,EAAc,EAAE,KAAK,EAAE,EAAc,EAAE,MAAM,EAAE,aAAa,EAAE,mBAA4B,EAAE,CAAC;IACjO,MAAM,MAAM,GAAG,CAAC,MAAsC,EAAE,QAAuC,EAAE,EAAwB,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClN,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAC/B,IAAI,CAAE,wBAA8C,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9E,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,4BAA4B,EAAE,GAAG,cAAc,oDAAoD,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IACzU,CAAC;IACD,IAAI,MAAgC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IACtR,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtH,MAAM,MAAM,GAAG,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,QAAQ,GAAa,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACjH,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,IAAI,+BAA+B,EAAE,CAAC,CAAC;IAClG,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrF,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,KAAK,UAAU;QAC3C,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,8FAA8F,EAAE,aAAa,EAAE,WAAW,CAAC;QACzJ,CAAC,CAAC,aAAa,CAAC,OAAO,KAAK,aAAa,IAAI,aAAa,CAAC,OAAO,KAAK,eAAe;YACpF,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE;YACvG,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,UAAmC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,+BAA+B,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACxN,MAAM,cAAc,GAAG,KAAK,EAAE,IAAgB,EAAkB,EAAE;QAChE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,YAAY,GAAa,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAClE,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC/G,IAAI,YAAY,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,YAAY,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACjF,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QACvD,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,OAAO,CAAC;QACnD,OAAO,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5D,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,EAAE,cAAc,CAAC,CAAC;IAC5L,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,IAAI,OAAQ,UAAU,CAAC,gBAA2C,EAAE,oBAAoB,KAAK,QAAQ;QAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAE,UAAU,CAAC,gBAA+B,CAAC,oBAA8B,CAAC,CAAC;IACzQ,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;QACpD,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAwB,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,oBAAoB,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IAE3O,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACzQ,CAAC;AAaD,2HAA2H;AAC3H,MAAM,eAAe,GAAqC;IACxD,0BAA0B,EAAE,4BAA4B;IACxD,KAAK,EAAE,eAAe;IACtB,mBAAmB,EAAE,mBAAmB;IACxC,cAAc,EAAE,mBAAmB;IACnC,eAAe,EAAE,mBAAmB;IACpC,iBAAiB,EAAE,mBAAmB;IACtC,iBAAiB,EAAE,mBAAmB;IACtC,oBAAoB,EAAE,mBAAmB;IACzC,aAAa,EAAE,cAAc;IAC7B,YAAY,EAAE,mBAAmB;IACjC,aAAa,EAAE,mBAAmB;IAClC,kBAAkB,EAAE,mBAAmB;IACvC,uBAAuB,EAAE,mBAAmB;IAC5C,wBAAwB,EAAE,mBAAmB;IAC7C,cAAc,EAAE,mBAAmB;IACnC,sBAAsB,EAAE,mBAAmB;IAC3C,2BAA2B,EAAE,mBAAmB;IAChD,+BAA+B,EAAE,iCAAiC;IAClE,2BAA2B,EAAE,iCAAiC;IAC9D,+BAA+B,EAAE,iCAAiC;IAClE,MAAM,EAAE,gBAAgB;IACxB,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,gBAAgB;IACzB,SAAS,EAAE,kBAAkB;IAC7B,YAAY,EAAE,cAAc;IAC5B,kBAAkB,EAAE,gBAAgB;IACpC,qBAAqB,EAAE,gBAAgB;IACvC,qBAAqB,EAAE,gBAAgB;IACvC,oBAAoB,EAAE,cAAc;IACpC,mBAAmB,EAAE,cAAc;IACnC,YAAY,EAAE,wBAAwB;IACtC,aAAa,EAAE,wBAAwB;IACvC,eAAe,EAAE,wBAAwB;IACzC,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,gBAAgB;IACjC,oBAAoB,EAAE,gBAAgB;IACtC,oBAAoB,EAAE,4BAA4B;IAClD,mBAAmB,EAAE,uBAAuB;IAC5C,sBAAsB,EAAE,wBAAwB;IAChD,gBAAgB,EAAE,kBAAkB;IACpC,6BAA6B,EAAE,mBAAmB;IAClD,aAAa,EAAE,eAAe;CAC/B,CAAC;AAEF,SAAS,OAAO,CAAC,KAAY;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACnI,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC5E,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC;IAChL,IAAI,KAAK,CAAC,OAAO,KAAK,cAAc;QAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACtI,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAClI,CAAC;AAED,2FAA2F;AAC3F,SAAS,KAAK,CAAC,CAAqB,EAAE,CAAqB;IACzD,MAAM,IAAI,GAAG,CAAC,CAAqB,EAAU,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7I,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAAwF;IACpI,OAAO,KAAK,EAAC,KAAK,EAAC,EAAE;QACnB,IAAI,CAAE,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,yBAAyB,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;QACpH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC9M,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,sBAAsB,CAAC,CAAC;QAC7E,OAAO;YACL,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;YACnE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YAC3D,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;YACvD,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACnJ,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YACrC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;YAC3C,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;SAClD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export * from './context.js';
|
|
3
|
+
export * from './validation.js';
|
|
4
|
+
export * from './crypto.js';
|
|
5
|
+
export { sealSchema } from './schema.js';
|
|
6
|
+
export * from './verification.js';
|
|
7
|
+
export * from './epcis.js';
|
|
8
|
+
export * from './did-web.js';
|
|
9
|
+
export * from './epcis-source.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export * from './context.js';
|
|
3
|
+
export * from './validation.js';
|
|
4
|
+
export * from './crypto.js';
|
|
5
|
+
export { sealSchema } from './schema.js';
|
|
6
|
+
export * from './verification.js';
|
|
7
|
+
export * from './epcis.js';
|
|
8
|
+
export * from './did-web.js';
|
|
9
|
+
export * from './epcis-source.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC"}
|
package/dist/jcs.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 8785, the JSON Canonicalization Scheme, as one small exact function.
|
|
3
|
+
*
|
|
4
|
+
* Object members are sorted by the UTF-16 code units of their names, which
|
|
5
|
+
* is what JavaScript's default string comparison does; numbers are written
|
|
6
|
+
* as ECMAScript's Number-to-string conversion writes them, which is what
|
|
7
|
+
* JSON.stringify writes for a finite number; strings are escaped as
|
|
8
|
+
* JSON.stringify escapes them (section 3.2.2.2: the short escapes, then
|
|
9
|
+
* \u00xx for the remaining control characters, everything else literal).
|
|
10
|
+
* Anything JSON cannot carry (undefined, a function, a symbol, a bigint, a
|
|
11
|
+
* non-finite number, a lone surrogate) is refused by name, so two
|
|
12
|
+
* implementations that both accept a value hash the same bytes.
|
|
13
|
+
*
|
|
14
|
+
* The EPCIS event-body digest (epcis-source.ts) is the reason this exists in
|
|
15
|
+
* this package: a retained source is compared by the digest of its canonical
|
|
16
|
+
* form, never by its formatting.
|
|
17
|
+
*/
|
|
18
|
+
export declare class JcsError extends Error {
|
|
19
|
+
constructor(path: string, detail: string);
|
|
20
|
+
}
|
|
21
|
+
/** The RFC 8785 canonical JSON text of a value. Throws JcsError for anything JSON cannot carry. */
|
|
22
|
+
export declare function canonicalizeJcs(value: unknown): string;
|
|
23
|
+
/** The canonical text as UTF-8 bytes, the form a digest is taken over. */
|
|
24
|
+
export declare function canonicalJcsBytes(value: unknown): Uint8Array;
|
|
25
|
+
//# sourceMappingURL=jcs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcs.d.ts","sourceRoot":"","sources":["../src/jcs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,QAAS,SAAQ,KAAK;gBACrB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAIzC;AAiCD,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAE5D"}
|