@inco/js 0.3.1 → 0.3.2-alpha.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 (31) hide show
  1. package/dist/cjs/attestedcompute/attested-compute.d.ts +14 -16
  2. package/dist/cjs/attestedcompute/attested-compute.js +56 -71
  3. package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +18 -19
  4. package/dist/cjs/attesteddecrypt/attested-decrypt.js +50 -60
  5. package/dist/cjs/attesteddecrypt/index.d.ts +0 -1
  6. package/dist/cjs/attesteddecrypt/index.js +1 -2
  7. package/dist/cjs/lite/attested-compute.d.ts +1 -2
  8. package/dist/cjs/lite/attested-compute.js +1 -4
  9. package/dist/cjs/lite/attested-decrypt.d.ts +1 -2
  10. package/dist/cjs/lite/attested-decrypt.js +1 -4
  11. package/dist/cjs/lite/lightning.d.ts +41 -2
  12. package/dist/cjs/lite/lightning.js +57 -1
  13. package/dist/esm/attestedcompute/attested-compute.d.ts +14 -16
  14. package/dist/esm/attestedcompute/attested-compute.js +55 -70
  15. package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +18 -19
  16. package/dist/esm/attesteddecrypt/attested-decrypt.js +49 -59
  17. package/dist/esm/attesteddecrypt/index.d.ts +0 -1
  18. package/dist/esm/attesteddecrypt/index.js +1 -2
  19. package/dist/esm/lite/attested-compute.d.ts +1 -2
  20. package/dist/esm/lite/attested-compute.js +2 -3
  21. package/dist/esm/lite/attested-decrypt.d.ts +1 -2
  22. package/dist/esm/lite/attested-decrypt.js +2 -3
  23. package/dist/esm/lite/lightning.d.ts +41 -2
  24. package/dist/esm/lite/lightning.js +57 -1
  25. package/dist/types/attestedcompute/attested-compute.d.ts +14 -16
  26. package/dist/types/attesteddecrypt/attested-decrypt.d.ts +18 -19
  27. package/dist/types/attesteddecrypt/index.d.ts +0 -1
  28. package/dist/types/lite/attested-compute.d.ts +1 -2
  29. package/dist/types/lite/attested-decrypt.d.ts +1 -2
  30. package/dist/types/lite/lightning.d.ts +41 -2
  31. package/package.json +1 -1
@@ -1,8 +1,11 @@
1
1
  import type { Account, Chain, Transport, WalletClient } from 'viem';
2
+ import { DecryptionAttestation } from '../attesteddecrypt/types.js';
3
+ import { HexString } from '../binary.js';
2
4
  import { SupportedChainId } from '../chain.js';
3
- import { EciesScheme } from '../encryption/encryption.js';
5
+ import { EciesScheme, SupportedFheType } from '../encryption/encryption.js';
4
6
  import type { KmsClient } from '../kms/client.js';
5
- import { AttestedCompute } from './types.js';
7
+ import type { BackoffConfig } from '../retry.js';
8
+ import { AttestedComputeOP } from './types.js';
6
9
  /**
7
10
  * Arguments for creating an attested compute.
8
11
  */
@@ -21,18 +24,13 @@ export interface IncoLiteAttestedComputeArgs {
21
24
  * @throws {AttestedComputeError} If the creation fails
22
25
  *
23
26
  * @todo Support multiple operations in a single request.
24
- *
25
- * @example
26
- * ```typescript
27
- * const compute = await incoLiteAttestedCompute({
28
- * walletClient,
29
- * chainId: sepolia,
30
- * });
31
- * const decryptionAttestation = await compute({
32
- * lhsHandle: '0x...',
33
- * op: AttestedComputeSupportedOps.Eq,
34
- * rhsPlaintext: 1337n,
35
- * });
36
- * ```
37
27
  */
38
- export declare function incoLiteAttestedCompute({ kmsConnectRpcEndpointOrClient, chainId, walletClient, }: IncoLiteAttestedComputeArgs): AttestedCompute<EciesScheme>;
28
+ export declare function attestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient, kmsConnectRpcEndpointOrClient, chainId, }: {
29
+ lhsHandle: HexString;
30
+ op: AttestedComputeOP;
31
+ rhsPlaintext: bigint | boolean;
32
+ backoffConfig?: Partial<BackoffConfig> | undefined;
33
+ walletClient: WalletClient<Transport, Chain, Account>;
34
+ kmsConnectRpcEndpointOrClient?: string | KmsClient;
35
+ chainId: SupportedChainId;
36
+ }): Promise<DecryptionAttestation<EciesScheme, T>>;
@@ -17,79 +17,64 @@ const ATTESTED_COMPUTE_DOMAIN_VERSION = '0.1.0';
17
17
  * @throws {AttestedComputeError} If the creation fails
18
18
  *
19
19
  * @todo Support multiple operations in a single request.
20
- *
21
- * @example
22
- * ```typescript
23
- * const compute = await incoLiteAttestedCompute({
24
- * walletClient,
25
- * chainId: sepolia,
26
- * });
27
- * const decryptionAttestation = await compute({
28
- * lhsHandle: '0x...',
29
- * op: AttestedComputeSupportedOps.Eq,
30
- * rhsPlaintext: 1337n,
31
- * });
32
- * ```
33
20
  */
34
- export function incoLiteAttestedCompute({ kmsConnectRpcEndpointOrClient, chainId, walletClient, }) {
35
- const kmsClient = getKmsClient(kmsConnectRpcEndpointOrClient || defaultCovalidatorGrpc(getSupportedChain(chainId)));
36
- return async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, }) {
37
- try {
38
- validateHandle(lhsHandle);
39
- const rhsPlaintextBig = BigInt(rhsPlaintext);
40
- // Create the EIP712 payload for the handles to decrypt
41
- const eip712Payload = createEIP712Payload({
42
- chainId: BigInt(chainId),
43
- primaryType: 'AttestedComputeRequest',
44
- primaryTypeFields: [
45
- { name: 'op', type: 'uint8' },
46
- { name: 'lhsHandle', type: 'bytes32' },
47
- { name: 'rhsPlaintext', type: 'bytes32' },
48
- ],
49
- message: {
50
- op: op,
51
- lhsHandle: lhsHandle,
52
- rhsPlaintext: bigintToBytes32(rhsPlaintextBig),
53
- },
54
- domainName: ATTESTED_COMPUTE_DOMAIN_NAME,
55
- domainVersion: ATTESTED_COMPUTE_DOMAIN_VERSION,
56
- });
57
- // Sign the EIP712 message
58
- const eip712Signature = await walletClient.signTypedData(eip712Payload);
59
- const rhsValueBytes = bigintToPlaintext(encryptionSchemes.ecies, getHandleType(lhsHandle), rhsPlaintextBig);
60
- const attestedComputeRequest = {
61
- $typeName: 'inco.kms.lite.v1.AttestedComputeRequest',
62
- userAddress: walletClient.account.address,
21
+ export async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient, kmsConnectRpcEndpointOrClient, chainId, }) {
22
+ try {
23
+ const kmsClient = getKmsClient(kmsConnectRpcEndpointOrClient || defaultCovalidatorGrpc(getSupportedChain(chainId)));
24
+ validateHandle(lhsHandle);
25
+ const rhsPlaintextBig = BigInt(rhsPlaintext);
26
+ // Create the EIP712 payload for the handles to decrypt
27
+ const eip712Payload = createEIP712Payload({
28
+ chainId: BigInt(chainId),
29
+ primaryType: 'AttestedComputeRequest',
30
+ primaryTypeFields: [
31
+ { name: 'op', type: 'uint8' },
32
+ { name: 'lhsHandle', type: 'bytes32' },
33
+ { name: 'rhsPlaintext', type: 'bytes32' },
34
+ ],
35
+ message: {
63
36
  op: op,
64
37
  lhsHandle: lhsHandle,
65
- rhsPlaintext: rhsValueBytes.value.toString(16),
66
- eip712Signature: hexToBytes(eip712Signature),
67
- };
68
- const response = await retryWithBackoff(async () => {
69
- return await kmsClient.attestedCompute(attestedComputeRequest);
70
- }, backoffConfig);
71
- const decryptionAttestation = response.decryptionAttestation;
72
- if (decryptionAttestation?.plaintext === undefined) {
73
- throw new AttestedComputeError('No plaintext in response');
74
- }
75
- const computeResultHandle = response.decryptionAttestation?.handle;
76
- if (!computeResultHandle) {
77
- throw new AttestedComputeError('No compute result handle in response');
78
- }
79
- const handleType = getHandleType(computeResultHandle);
80
- const bigIntValue = bytesToBigInt(decryptionAttestation.plaintext);
81
- return {
82
- handle: computeResultHandle,
83
- plaintext: bigintToPlaintext(encryptionSchemes.ecies, handleType, bigIntValue),
84
- covalidatorSignature: decryptionAttestation.signature,
85
- };
38
+ rhsPlaintext: bigintToBytes32(rhsPlaintextBig),
39
+ },
40
+ domainName: ATTESTED_COMPUTE_DOMAIN_NAME,
41
+ domainVersion: ATTESTED_COMPUTE_DOMAIN_VERSION,
42
+ });
43
+ // Sign the EIP712 message
44
+ const eip712Signature = await walletClient.signTypedData(eip712Payload);
45
+ const rhsValueBytes = bigintToPlaintext(encryptionSchemes.ecies, getHandleType(lhsHandle), rhsPlaintextBig);
46
+ const attestedComputeRequest = {
47
+ $typeName: 'inco.kms.lite.v1.AttestedComputeRequest',
48
+ userAddress: walletClient.account.address,
49
+ op: op,
50
+ lhsHandle: lhsHandle,
51
+ rhsPlaintext: rhsValueBytes.value.toString(16),
52
+ eip712Signature: hexToBytes(eip712Signature),
53
+ };
54
+ const response = await retryWithBackoff(async () => {
55
+ return await kmsClient.attestedCompute(attestedComputeRequest);
56
+ }, backoffConfig);
57
+ const decryptionAttestation = response.decryptionAttestation;
58
+ if (decryptionAttestation?.plaintext === undefined) {
59
+ throw new AttestedComputeError('No plaintext in response');
60
+ }
61
+ const computeResultHandle = response.decryptionAttestation?.handle;
62
+ if (!computeResultHandle) {
63
+ throw new AttestedComputeError('No compute result handle in response');
86
64
  }
87
- catch (error) {
88
- if (error instanceof AttestedComputeError) {
89
- throw error;
90
- }
91
- throw new AttestedComputeError('Failed to perform attested compute', error);
65
+ const handleType = getHandleType(computeResultHandle);
66
+ const bigIntValue = bytesToBigInt(decryptionAttestation.plaintext);
67
+ return {
68
+ handle: computeResultHandle,
69
+ plaintext: bigintToPlaintext(encryptionSchemes.ecies, handleType, bigIntValue),
70
+ covalidatorSignature: decryptionAttestation.signature,
71
+ };
72
+ }
73
+ catch (error) {
74
+ if (error instanceof AttestedComputeError) {
75
+ throw error;
92
76
  }
93
- };
77
+ throw new AttestedComputeError('Failed to perform attested compute', error);
78
+ }
94
79
  }
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRlc3RlZGNvbXB1dGUvYXR0ZXN0ZWQtY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYSxNQUFNLGNBQWMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBZSxpQkFBaUIsRUFBb0IsTUFBTSw2QkFBNkIsQ0FBQztBQUVsSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxFQUFtQixvQkFBb0IsRUFBcUIsTUFBTSxZQUFZLENBQUM7QUFFdEYsTUFBTSw0QkFBNEIsR0FBRyxxQkFBcUIsQ0FBQztBQUMzRCxNQUFNLCtCQUErQixHQUFHLE9BQU8sQ0FBQztBQWNoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsRUFDdEMsNkJBQTZCLEVBQzdCLE9BQU8sRUFDUCxZQUFZLEdBQ2dCO0lBQzVCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyw2QkFBNkIsSUFBSSxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEgsT0FBTyxLQUFLLFVBQVUsZUFBZSxDQUE2QixF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
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRlc3RlZGNvbXB1dGUvYXR0ZXN0ZWQtY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYSxNQUFNLGNBQWMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0sYUFBYSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBZSxpQkFBaUIsRUFBb0IsTUFBTSw2QkFBNkIsQ0FBQztBQUVsSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFxQixNQUFNLFlBQVksQ0FBQztBQUVyRSxNQUFNLDRCQUE0QixHQUFHLHFCQUFxQixDQUFDO0FBQzNELE1BQU0sK0JBQStCLEdBQUcsT0FBTyxDQUFDO0FBY2hEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FBNkIsRUFDaEUsU0FBUyxFQUNULEVBQUUsRUFDRixZQUFZLEVBQ1osYUFBYSxFQUNiLFlBQVksRUFDWiw2QkFBNkIsRUFDN0IsT0FBTyxHQVNSO0lBQ0MsSUFBSSxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLDZCQUE2QixJQUFJLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxD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
@@ -1,16 +1,18 @@
1
1
  import type { Account, Chain, Transport, WalletClient } from 'viem';
2
+ import { HexString } from '../binary.js';
2
3
  import { SupportedChainId } from '../chain.js';
3
- import { EciesScheme } from '../encryption/encryption.js';
4
+ import { EciesScheme, SupportedFheType } from '../encryption/encryption.js';
4
5
  import type { KmsClient } from '../kms/client.js';
5
- import { AttestedDecryptor } from './types.js';
6
+ import type { BackoffConfig } from '../retry.js';
7
+ import { DecryptionAttestation } from './types.js';
6
8
  /**
7
9
  * Validates a handle format.
8
10
  * @param handle - The handle to validate
9
11
  * @throws {AttestedDecryptError} If the handle format is invalid
10
12
  */
11
- export declare function validateHandle(handle: string): void;
13
+ export declare function validateHandle(handle: HexString): void;
12
14
  /**
13
- * Arguments for creating an attested decryptor.
15
+ * Arguments for creating an attested decrypt request.
14
16
  */
15
17
  export interface IncoLiteAttestedDecryptorArgs {
16
18
  /** The wallet used to interact with the blockchain and sign the decrypt request */
@@ -21,20 +23,17 @@ export interface IncoLiteAttestedDecryptorArgs {
21
23
  chainId: SupportedChainId;
22
24
  }
23
25
  /**
24
- * Creates an attested decryptor that can decrypt handles with an attached attestation from the covalidator.
25
- * @param args - The arguments for creating the decryptor
26
- * @returns A function that can decrypt handles using attestation
27
- * @throws {AttestedDecryptError} If the decryptor creation fails
26
+ * Decrypt multiple handles in a single attested request.
27
+ * Returns an array of attestations aligned with the response ordering.
28
28
  *
29
- * @todo Support multiple handles in a single request.
30
- *
31
- * @example
32
- * ```typescript
33
- * const decryptor = await incoLiteAttestedDecryptor({
34
- * walletClient,
35
- * chainId: sepolia,
36
- * });
37
- * const { plaintext, covalidatorSignature } = await decryptor({ handle: '0x...' });
38
- * ```
29
+ * @param args - The arguments for creating the attested decrypt function
30
+ * @returns A function that can decrypt handles and return an attestation
31
+ * @throws {AttestedDecryptError} If the creation fails
39
32
  */
40
- export declare function incoLiteAttestedDecryptor({ kmsConnectRpcEndpointOrClient, chainId, walletClient, }: IncoLiteAttestedDecryptorArgs): AttestedDecryptor<EciesScheme>;
33
+ export declare function attestedDecrypt({ handles, backoffConfig, walletClient, chainId, kmsConnectRpcEndpointOrClient, }: {
34
+ handles: HexString[];
35
+ backoffConfig?: Partial<BackoffConfig> | undefined;
36
+ walletClient: WalletClient<Transport, Chain, Account>;
37
+ chainId: SupportedChainId;
38
+ kmsConnectRpcEndpointOrClient?: string | KmsClient;
39
+ }): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType>>>;
@@ -20,70 +20,60 @@ export function validateHandle(handle) {
20
20
  }
21
21
  }
22
22
  /**
23
- * Creates an attested decryptor that can decrypt handles with an attached attestation from the covalidator.
24
- * @param args - The arguments for creating the decryptor
25
- * @returns A function that can decrypt handles using attestation
26
- * @throws {AttestedDecryptError} If the decryptor creation fails
23
+ * Decrypt multiple handles in a single attested request.
24
+ * Returns an array of attestations aligned with the response ordering.
27
25
  *
28
- * @todo Support multiple handles in a single request.
29
- *
30
- * @example
31
- * ```typescript
32
- * const decryptor = await incoLiteAttestedDecryptor({
33
- * walletClient,
34
- * chainId: sepolia,
35
- * });
36
- * const { plaintext, covalidatorSignature } = await decryptor({ handle: '0x...' });
37
- * ```
26
+ * @param args - The arguments for creating the attested decrypt function
27
+ * @returns A function that can decrypt handles and return an attestation
28
+ * @throws {AttestedDecryptError} If the creation fails
38
29
  */
39
- export function incoLiteAttestedDecryptor({ kmsConnectRpcEndpointOrClient, chainId, walletClient, }) {
40
- const kmsClient = getKmsClient(kmsConnectRpcEndpointOrClient || defaultCovalidatorGrpc(getSupportedChain(chainId)));
41
- return async function attestedDecrypt({ handle, backoffConfig, }) {
42
- try {
43
- validateHandle(handle);
44
- // Create the EIP712 payload for the handles to decrypt
45
- const eip712Payload = createEIP712Payload({
46
- chainId: BigInt(chainId),
47
- primaryType: 'AttestedDecryptRequest',
48
- primaryTypeFields: [{ name: 'handles', type: 'bytes32[]' }],
49
- message: {
50
- handles: [handle],
51
- },
52
- domainName: ATTESTED_DECRYPT_DOMAIN_NAME,
53
- domainVersion: ATTESTED_DECRYPT_DOMAIN_VERSION,
54
- });
55
- // Sign the EIP712 message
56
- const eip712Signature = await walletClient.signTypedData(eip712Payload);
57
- const attestedDecryptRequest = {
58
- $typeName: 'inco.kms.lite.v1.AttestedDecryptRequest',
59
- userAddress: walletClient.account.address,
60
- handles: [handle],
61
- eip712Signature: hexToBytes(eip712Signature),
62
- };
63
- const response = await retryWithBackoff(async () => {
64
- return await kmsClient.attestedDecrypt(attestedDecryptRequest);
65
- }, backoffConfig);
66
- if (response.decryptionAttestations.length !== 1) {
67
- throw new AttestedDecryptError('Expected 1 decryption attestation in response');
68
- }
69
- const decryptionAttestation = response.decryptionAttestations[0];
70
- if (decryptionAttestation.plaintext === undefined) {
71
- throw new AttestedDecryptError('No plaintext in response');
30
+ export async function attestedDecrypt({ handles, backoffConfig, walletClient, chainId, kmsConnectRpcEndpointOrClient, }) {
31
+ try {
32
+ handles.forEach(validateHandle);
33
+ const kmsClient = getKmsClient(kmsConnectRpcEndpointOrClient || defaultCovalidatorGrpc(getSupportedChain(chainId)));
34
+ const eip712Payload = createEIP712Payload({
35
+ chainId: BigInt(chainId),
36
+ primaryType: 'AttestedDecryptRequest',
37
+ primaryTypeFields: [{ name: 'handles', type: 'bytes32[]' }],
38
+ message: {
39
+ handles,
40
+ },
41
+ domainName: ATTESTED_DECRYPT_DOMAIN_NAME,
42
+ domainVersion: ATTESTED_DECRYPT_DOMAIN_VERSION,
43
+ });
44
+ const eip712Signature = await walletClient.signTypedData(eip712Payload);
45
+ const attestedDecryptRequest = {
46
+ $typeName: 'inco.kms.lite.v1.AttestedDecryptRequest',
47
+ userAddress: walletClient.account.address,
48
+ handles,
49
+ eip712Signature: hexToBytes(eip712Signature),
50
+ };
51
+ const response = await retryWithBackoff(async () => {
52
+ return await kmsClient.attestedDecrypt(attestedDecryptRequest);
53
+ }, backoffConfig);
54
+ if (!response.decryptionAttestations || response.decryptionAttestations.length === 0) {
55
+ throw new AttestedDecryptError('No decryption attestations in response');
56
+ }
57
+ const results = response.decryptionAttestations.map((att) => {
58
+ if (att.plaintext === undefined) {
59
+ throw new AttestedDecryptError('No plaintext in attestation');
72
60
  }
73
- const handleType = getHandleType(handle);
74
- const bigIntValue = bytesToBigInt(decryptionAttestation.plaintext);
61
+ const h = att.handle;
62
+ const handleType = getHandleType(h);
63
+ const bigIntValue = bytesToBigInt(att.plaintext);
75
64
  return {
76
- handle: decryptionAttestation.handle,
65
+ handle: h,
77
66
  plaintext: bigintToPlaintext(encryptionSchemes.ecies, handleType, bigIntValue),
78
- covalidatorSignature: decryptionAttestation.signature,
67
+ covalidatorSignature: att.signature,
79
68
  };
69
+ });
70
+ return results;
71
+ }
72
+ catch (error) {
73
+ if (error instanceof AttestedDecryptError) {
74
+ throw error;
80
75
  }
81
- catch (error) {
82
- if (error instanceof AttestedDecryptError) {
83
- throw error;
84
- }
85
- throw new AttestedDecryptError('Failed to decrypt handle', error);
86
- }
87
- };
76
+ throw new AttestedDecryptError('Failed to decrypt handles', error);
77
+ }
88
78
  }
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtZGVjcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRlc3RlZGRlY3J5cHQvYXR0ZXN0ZWQtZGVjcnlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxhQUFhLEVBQWEsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFvQixNQUFNLGFBQWEsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQWUsaUJBQWlCLEVBQW9CLE1BQU0sNkJBQTZCLENBQUM7QUFFbEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBNEMsTUFBTSxZQUFZLENBQUM7QUFFNUYsTUFBTSw0QkFBNEIsR0FBRyxxQkFBcUIsQ0FBQztBQUMzRCxNQUFNLCtCQUErQixHQUFHLE9BQU8sQ0FBQztBQUVoRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFjO0lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLG9CQUFvQixDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDdkcsQ0FBQztBQUNILENBQUM7QUFjRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxFQUN4Qyw2QkFBNkIsRUFDN0IsT0FBTyxFQUNQ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
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtZGVjcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRlc3RlZGRlY3J5cHQvYXR0ZXN0ZWQtZGVjcnlwdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxhQUFhLEVBQWEsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFvQixNQUFNLGFBQWEsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQWUsaUJBQWlCLEVBQW9CLE1BQU0sNkJBQTZCLENBQUM7QUFFbEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBeUIsTUFBTSxZQUFZLENBQUM7QUFFekUsTUFBTSw0QkFBNEIsR0FBRyxxQkFBcUIsQ0FBQztBQUMzRCxNQUFNLCtCQUErQixHQUFHLE9BQU8sQ0FBQztBQUVoRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFpQjtJQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3JELE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7QUFDSCxDQUFDO0FBY0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLEVBQ3BDLE9BQU8sRUFDUCxhQUFhLEVBQ2IsWUFB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
@@ -1,2 +1 @@
1
- export * from './attested-decrypt.js';
2
1
  export * from './types.js';
@@ -1,3 +1,2 @@
1
- export * from './attested-decrypt.js';
2
1
  export * from './types.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXR0ZXN0ZWRkZWNyeXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxZQUFZLENBQUMifQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXR0ZXN0ZWRkZWNyeXB0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDIn0=
@@ -1,4 +1,3 @@
1
- import { type IncoLiteAttestedComputeArgs, incoLiteAttestedCompute } from '../attestedcompute/attested-compute.js';
1
+ import { type IncoLiteAttestedComputeArgs } from '../attestedcompute/attested-compute.js';
2
2
  import { type AttestedComputeSupportedOps } from '../attestedcompute/types.js';
3
- export { incoLiteAttestedCompute };
4
3
  export type { AttestedComputeSupportedOps, IncoLiteAttestedComputeArgs };
@@ -1,3 +1,2 @@
1
- import { incoLiteAttestedCompute } from '../attestedcompute/attested-compute.js';
2
- export { incoLiteAttestedCompute };
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saXRlL2F0dGVzdGVkLWNvbXB1dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQyx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBR25ILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxDQUFDIn0=
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saXRlL2F0dGVzdGVkLWNvbXB1dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -1,3 +1,2 @@
1
- import { type IncoLiteAttestedDecryptorArgs, incoLiteAttestedDecryptor } from '../attesteddecrypt/attested-decrypt.js';
2
- export { incoLiteAttestedDecryptor };
1
+ import { type IncoLiteAttestedDecryptorArgs } from '../attesteddecrypt/attested-decrypt.js';
3
2
  export type { IncoLiteAttestedDecryptorArgs };
@@ -1,3 +1,2 @@
1
- import { incoLiteAttestedDecryptor } from '../attesteddecrypt/attested-decrypt.js';
2
- export { incoLiteAttestedDecryptor };
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtZGVjcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saXRlL2F0dGVzdGVkLWRlY3J5cHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQyx5QkFBeUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXZILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxDQUFDIn0=
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtZGVjcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saXRlL2F0dGVzdGVkLWRlY3J5cHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -1,11 +1,14 @@
1
1
  import { Account, Chain, Transport, WalletClient } from 'viem';
2
2
  import { AllowanceVoucherWithSig } from '../advancedacl/types.js';
3
+ import { AttestedComputeOP } from '../attestedcompute/types.js';
4
+ import { DecryptionAttestation } from '../attesteddecrypt/index.js';
3
5
  import { Address, HexString } from '../binary.js';
4
- import { EciesScheme, PlaintextOf } from '../encryption/index.js';
6
+ import { EciesScheme, PlaintextOf, SupportedFheType } from '../encryption/index.js';
5
7
  import { lightningDeployments } from '../generated/lightning.js';
6
8
  import { localNodeLightningConfig } from '../generated/local-node.js';
7
9
  import { LocalNodeEnv } from '../local/index.js';
8
10
  import type { Reencryptor } from '../reencryption/index.js';
11
+ import { BackoffConfig } from '../retry.js';
9
12
  import { Secp256k1Keypair } from './ecies.js';
10
13
  type TupleToUnion<T> = T extends readonly unknown[] ? T[number] : never;
11
14
  type Deployment = TupleToUnion<typeof lightningDeployments>;
@@ -163,7 +166,7 @@ export declare class Lightning<T extends DeploymentSlice = DeploymentSlice> {
163
166
  * const decryptedValue = await reencryptor({handle: resultHandle});
164
167
  * ```
165
168
  */
166
- getSessionKeyRencryptor(allowanceVoucherWithSig: AllowanceVoucherWithSig, ephemeralKeypair: Secp256k1Keypair): Promise<(<T_1 extends import("../encryption/encryption.js").SupportedFheType>({ handle }: import("../reencryption/types.js").ReencryptFnArgs<EciesScheme, T_1>) => Promise<PlaintextOf<1, 0 | 5 | 7 | 8>>)>;
169
+ getSessionKeyRencryptor(allowanceVoucherWithSig: AllowanceVoucherWithSig, ephemeralKeypair: Secp256k1Keypair): Promise<(<T_1 extends SupportedFheType>({ handle }: import("../reencryption/types.js").ReencryptFnArgs<EciesScheme, T_1>) => Promise<PlaintextOf<1, 0 | 5 | 7 | 8>>)>;
167
170
  /**
168
171
  * Updates the active session nonce for the given wallet client.
169
172
  *
@@ -174,6 +177,42 @@ export declare class Lightning<T extends DeploymentSlice = DeploymentSlice> {
174
177
  * @returns The transaction hash of the updateActiveVouchersSessionNonce transaction
175
178
  */
176
179
  updateActiveVouchersSessionNonce(walletClient: WalletClient<Transport, Chain, Account>): Promise<HexString>;
180
+ /**
181
+ * Get an attested decryptor for the given wallet client.
182
+ *
183
+ * @param walletClient - The wallet client used for signing the attested decrypt request
184
+ * @param handles - The handles to decrypt
185
+ * @param backoffConfig - The backoff configuration for the attested decrypt request
186
+ * @returns The decryption attestations
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * const response = await lightning.attestedDecrypt(walletClient, [handle1, handle2]);
191
+ * const { plaintext, covalidatorSignature } = response[0];
192
+ * ```
193
+ */
194
+ attestedDecrypt(walletClient: WalletClient<Transport, Chain, Account>, handles: HexString[], backoffConfig?: Partial<BackoffConfig>): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType>>>;
195
+ /**
196
+ * Get an attested compute for the given wallet client.
197
+ *
198
+ * @param walletClient - The wallet client used for signing the attested compute request
199
+ * @param lhsHandle - The handle to compute
200
+ * @param op - The operation to perform
201
+ * @param rhsPlaintext - The plaintext to compute with
202
+ * @param backoffConfig - The backoff configuration for the attested compute request
203
+ * @returns The decryption attestation
204
+ *
205
+ * @example
206
+ * ```typescript
207
+ * import { AttestedComputeSupportedOps } from '../lite/attested-compute.js';
208
+ * const lhsHandle = '0x...';
209
+ * const rhsPlaintext = 1337n;
210
+ * const op = AttestedComputeSupportedOps.Eq;
211
+ * const response = await lightning.attestedCompute(walletClient, lhsHandle, op, rhsPlaintext);
212
+ * const { plaintext, covalidatorSignature, handle } = response;
213
+ * ```
214
+ */
215
+ attestedCompute(walletClient: WalletClient<Transport, Chain, Account>, lhsHandle: HexString, op: AttestedComputeOP, rhsPlaintext: bigint | boolean, backoffConfig?: Partial<BackoffConfig>): Promise<DecryptionAttestation<EciesScheme, SupportedFheType>>;
177
216
  /**
178
217
  * Get the GRPC endpoint for the covalidator that services this deployment.
179
218
  */
@@ -2,6 +2,8 @@ import * as fs from 'fs/promises';
2
2
  import { hexToBytes } from 'viem';
3
3
  import { baseSepolia } from 'viem/chains';
4
4
  import { grantSessionKey, sessionKeyReencryptor, updateActiveVouchersSessionNonce, } from '../advancedacl/session-key.js';
5
+ import { attestedCompute } from '../attestedcompute/attested-compute.js';
6
+ import { attestedDecrypt } from '../attesteddecrypt/attested-decrypt.js';
5
7
  import { HexString, parseAddress } from '../binary.js';
6
8
  import { encryptionSchemes } from '../encryption/index.js';
7
9
  import { lightningDeployments } from '../generated/lightning.js';
@@ -251,6 +253,60 @@ export class Lightning {
251
253
  updateActiveVouchersSessionNonce(walletClient) {
252
254
  return updateActiveVouchersSessionNonce(this.executorAddress, walletClient);
253
255
  }
256
+ /**
257
+ * Get an attested decryptor for the given wallet client.
258
+ *
259
+ * @param walletClient - The wallet client used for signing the attested decrypt request
260
+ * @param handles - The handles to decrypt
261
+ * @param backoffConfig - The backoff configuration for the attested decrypt request
262
+ * @returns The decryption attestations
263
+ *
264
+ * @example
265
+ * ```typescript
266
+ * const response = await lightning.attestedDecrypt(walletClient, [handle1, handle2]);
267
+ * const { plaintext, covalidatorSignature } = response[0];
268
+ * ```
269
+ */
270
+ attestedDecrypt(walletClient, handles, backoffConfig) {
271
+ return attestedDecrypt({
272
+ handles,
273
+ backoffConfig,
274
+ chainId: Number(this.chainId),
275
+ walletClient,
276
+ kmsConnectRpcEndpointOrClient: this.kmsClient,
277
+ });
278
+ }
279
+ /**
280
+ * Get an attested compute for the given wallet client.
281
+ *
282
+ * @param walletClient - The wallet client used for signing the attested compute request
283
+ * @param lhsHandle - The handle to compute
284
+ * @param op - The operation to perform
285
+ * @param rhsPlaintext - The plaintext to compute with
286
+ * @param backoffConfig - The backoff configuration for the attested compute request
287
+ * @returns The decryption attestation
288
+ *
289
+ * @example
290
+ * ```typescript
291
+ * import { AttestedComputeSupportedOps } from '../lite/attested-compute.js';
292
+ * const lhsHandle = '0x...';
293
+ * const rhsPlaintext = 1337n;
294
+ * const op = AttestedComputeSupportedOps.Eq;
295
+ * const response = await lightning.attestedCompute(walletClient, lhsHandle, op, rhsPlaintext);
296
+ * const { plaintext, covalidatorSignature, handle } = response;
297
+ * ```
298
+ */
299
+ attestedCompute(walletClient, lhsHandle, op, rhsPlaintext, backoffConfig) {
300
+ return attestedCompute({
301
+ walletClient,
302
+ kmsConnectRpcEndpointOrClient: this.kmsClient,
303
+ chainId: Number(this.chainId),
304
+ lhsHandle,
305
+ op,
306
+ rhsPlaintext,
307
+ backoffConfig,
308
+ });
309
+ }
254
310
  /**
255
311
  * Get the GRPC endpoint for the covalidator that services this deployment.
256
312
  */
@@ -281,4 +337,4 @@ export class Lightning {
281
337
  }
282
338
  }
283
339
  }
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBa0IsVUFBVSxFQUEyQixNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFDTCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLGdDQUFnQyxHQUNqQyxNQUFNLCtCQUErQixDQUFDO0FBRXZDLE9BQU8sRUFBVyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hFLE9BQU8sRUFBZSxpQkFBaUIsRUFBMEIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0sWUFBWSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQXdCbkUsTUFBTSxhQUFhLEdBQW9CLFNBQVMsQ0FBQztBQXVCakQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFVRDtJQUNEO0lBVkYsZUFBZSxDQUFVO0lBQ3pCLGNBQWMsQ0FBWTtJQUMxQixPQUFPLENBQVM7SUFFZixTQUFTLENBQXlCO0lBQ2xDLGdCQUFnQixDQUFtQjtJQUNuQyxTQUFTLENBQTRCO0lBRXRELFlBQ21CLFdBQWMsRUFDZixjQUFzQjtRQURyQixnQkFBVyxHQUFYLFdBQVcsQ0FBRztRQUNmLG1CQUFjLEdBQWQsY0FBYyxDQUFRO1FBRXRDLElBQUksQ0FBQyxlQUFlLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDO1lBQ2pDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxLQUFLO1lBQy9CLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUMzRixRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsa0JBQWtCO1FBQ3ZCLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBb0M7UUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUN0QixzRUFBc0U7WUFDdEUsT0FBTyxFQUFFLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztZQUM3RixjQUFjLEVBQUUsR0FBRyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsY0FBYztZQUMxRCxlQUFlLEVBQUUsR0FBRyxDQUFDLDhCQUE4QixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksdUJBQXVCO1lBQ3RHLHVDQUF1QztZQUN2QyxlQUFlLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtZQUNyQyxjQUFjLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtZQUNwQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO1NBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFpQjtRQUM3QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQy9ELE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQWdCO1FBQ3hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDbEYsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsS0FBSyxFQUFFLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBeUIsTUFBUztRQUM3QyxPQUFPLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBbUIsTUFBUyxFQUFFLE9BQWdCO1FBQ25FLHNFQUFzRTtRQUN0RSxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLDRHQUE0RztZQUM1Ryx3QkFBd0I7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFtQixNQUFTLEVBQUUsT0FBZ0I7UUFDekQsT0FBTyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxVQUFVO1FBQ1osT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUNYLEtBQVEsRUFDUixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQXFCO1FBRWxELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDMUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDOUMsT0FBTyxFQUFFO2dCQUNQLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDekIsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUNoQyxXQUFXLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQztnQkFDekMsZUFBZSxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUM7YUFDM0M7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGNBQWMsQ0FBQyxZQUFxRDtRQUNsRSxPQUFPLG1CQUFtQixDQUFDO1lBQ3pCLFlBQVk7WUFDWiw2QkFBNkIsRUFBRSxJQUFJLENBQUMsU0FBUztZQUM3QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtTQUN4QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FzQkc7SUFDSCwrQkFBK0IsQ0FDN0IsWUFBcUQsRUFDckQsY0FBc0IsRUFDdEIsU0FBZSxFQUNmLHNCQUE4QjtRQUU5QixPQUFPLGVBQWUsQ0FBQztZQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3JDLDhCQUE4QixFQUFFLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQztZQUNwRSxjQUFjLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUM1QyxrQkFBa0IsRUFBRSxZQUFZO1lBQ2hDLFNBQVM7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCx1QkFBdUIsQ0FBQyx1QkFBZ0QsRUFBRSxnQkFBa0M7UUFDMUcsT0FBTyxxQkFBcUIsQ0FBQztZQUMzQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDN0MsZ0JBQWdCO1lBQ2hCLHVCQUF1QjtTQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxnQ0FBZ0MsQ0FBQyxZQUFxRDtRQUNwRixPQUFPLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQWdEO1FBQzlFLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQztRQUN4RCxPQUFPLFdBQVcsZUFBZSxDQUFDLFdBQVcsRUFBRSxJQUFJLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztJQUNsRixDQUFDO0lBRU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFnQjtRQUN4QyxPQUFRLEVBQXVCLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sTUFBTSxDQUFDLGtCQUFrQixDQUMvQixLQUFRO1FBRVIsSUFBSSxPQUFPLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixPQUFPO2dCQUNMLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxLQUFLO2dCQUMvQixJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUs7Z0JBQ3ZCLEtBQUssRUFBRSxLQUFLO2FBQ3NDLENBQUM7UUFDdkQsQ0FBQzthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xFLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLGlCQUFpQixDQUFDLEtBQUs7Z0JBQy9CLElBQUksRUFBRSxXQUFXLENBQUMsUUFBUTtnQkFDMUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDOEIsQ0FBQztRQUN2RCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBa0IsVUFBVSxFQUEyQixNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFDTCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLGdDQUFnQyxHQUNqQyxNQUFNLCtCQUErQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFekUsT0FBTyxFQUFXLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFaEUsT0FBTyxFQUFlLGlCQUFpQixFQUE0QyxNQUFNLHdCQUF3QixDQUFDO0FBRWxILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFnQixhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxZQUFZLENBQUM7QUFDckgsT0FBTyxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBd0JuRSxNQUFNLGFBQWEsR0FBb0IsU0FBUyxDQUFDO0FBdUJqRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sU0FBUztJQVVE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