@thurinlabs/identity-kit 1.0.1 → 1.0.3

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.tsx","../src/core/abi.ts","../src/core/contract.ts","../src/context.ts","../src/hooks/useThurinIdentity.ts","../src/hooks/useAttestations.ts","../src/core/fingerprint.ts","../src/core/pgp.ts","../src/hooks/useEFPGraph.ts","../src/core/efp.ts","../src/hooks/usePGPProofs.ts","../src/core/proofs.ts","../src/components/ThurinCard/ThurinCard.tsx","../src/core/authorization.ts"],"sourcesContent":["import { type ReactNode, useMemo } from 'react'\nimport { WagmiProvider, createConfig, http, useConfig } from 'wagmi'\nimport { mainnet, sepolia, foundry } from 'wagmi/chains'\nimport { getRegistry } from './core/contract'\nimport type { NetworkName } from './core/contract'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { IdentityKitContext } from './context'\nimport type { IdentityKitConfig } from './core/types'\n\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60_000,\n retry: 1,\n },\n },\n})\n\nexport function chainFor(network: NetworkName = 'mainnet') {\n if (network === 'sepolia') return sepolia\n if (network === 'local') return foundry\n return mainnet\n}\n\nfunction createDefaultWagmiConfig(rpcUrl: string | undefined, network: NetworkName) {\n const url = rpcUrl || getRegistry(network).defaultRpcUrl\n // Spelled out per network: wagmi types `transports` by the exact chain ids.\n if (network === 'sepolia') return createConfig({ chains: [sepolia], transports: { [sepolia.id]: http(url) } })\n if (network === 'local') return createConfig({ chains: [foundry], transports: { [foundry.id]: http(url) } })\n return createConfig({ chains: [mainnet], transports: { [mainnet.id]: http(url) } })\n}\n\nfunction WagmiDetector({ children, rpcUrl, network }: { children: ReactNode; rpcUrl?: string; network: NetworkName }) {\n // Try to use existing wagmi config\n let hasWagmi = false\n try {\n useConfig()\n hasWagmi = true\n } catch {\n // No WagmiProvider above us\n }\n\n const wagmiConfig = useMemo(() => createDefaultWagmiConfig(rpcUrl, network), [rpcUrl, network])\n\n if (hasWagmi) {\n return <>{children}</>\n }\n\n return (\n <WagmiProvider config={wagmiConfig}>\n <QueryClientProvider client={defaultQueryClient}>\n {children}\n </QueryClientProvider>\n </WagmiProvider>\n )\n}\n\nexport interface IdentityKitProviderProps extends IdentityKitConfig {\n children: ReactNode\n}\n\nexport function IdentityKitProvider({\n children,\n rpcUrl,\n neynarApiKey,\n baseUrl = 'https://thurin.id',\n network = 'mainnet',\n registryAddress,\n}: IdentityKitProviderProps) {\n const config = useMemo(\n () => ({ rpcUrl, neynarApiKey, baseUrl, network, registryAddress }),\n [rpcUrl, neynarApiKey, baseUrl, network, registryAddress],\n )\n\n return (\n <IdentityKitContext.Provider value={config}>\n <WagmiDetector rpcUrl={rpcUrl} network={network}>\n {children}\n </WagmiDetector>\n </IdentityKitContext.Provider>\n )\n}\n","// Generated from pgp-registry: `forge inspect PGPRegistry abi --json`. Do not edit by hand.\nexport const REGISTRY_ABI = [\n {\n \"type\": \"function\",\n \"name\": \"ATTEST_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"DOMAIN_SEPARATOR\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"EIP712_NAME\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\",\n \"internalType\": \"string\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"EIP712_VERSION\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\",\n \"internalType\": \"string\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"MAX_KEY_BYTES\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"MAX_RECORD_BYTES\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"MAX_SIG_BYTES\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"MESSAGE_VERSION\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"REATTEST_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"REVOKE_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"SET_RECORD_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"UPDATE_KEY_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"VERSION\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"addressesFor\",\n \"inputs\": [\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"address[]\",\n \"internalType\": \"address[]\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"addressesForCount\",\n \"inputs\": [\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"addressesForRange\",\n \"inputs\": [\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"start\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"count\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"out\",\n \"type\": \"address[]\",\n \"internalType\": \"address[]\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attest\",\n \"inputs\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attestFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attestationCount\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attestationsOf\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct PGPRegistry.Attestation[]\",\n \"components\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"createdAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"revokedAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attestationsOfRange\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"start\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"count\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"out\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct PGPRegistry.Attestation[]\",\n \"components\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"createdAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"revokedAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"cancelAuthorization\",\n \"inputs\": [],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"current\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"found\",\n \"type\": \"bool\",\n \"internalType\": \"bool\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"attestation\",\n \"type\": \"tuple\",\n \"internalType\": \"struct PGPRegistry.Attestation\",\n \"components\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"createdAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"revokedAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"fingerprintsForKeyId\",\n \"inputs\": [\n {\n \"name\": \"keyId\",\n \"type\": \"bytes8\",\n \"internalType\": \"bytes8\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes[]\",\n \"internalType\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"fingerprintsForKeyIdCount\",\n \"inputs\": [\n {\n \"name\": \"keyId\",\n \"type\": \"bytes8\",\n \"internalType\": \"bytes8\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"fingerprintsForKeyIdRange\",\n \"inputs\": [\n {\n \"name\": \"keyId\",\n \"type\": \"bytes8\",\n \"internalType\": \"bytes8\"\n },\n {\n \"name\": \"start\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"count\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"out\",\n \"type\": \"bytes[]\",\n \"internalType\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getAttestation\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"tuple\",\n \"internalType\": \"struct PGPRegistry.Attestation\",\n \"components\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"createdAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"revokedAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getPayload\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"nonces\",\n \"inputs\": [\n {\n \"name\": \"\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"reattest\",\n \"inputs\": [\n {\n \"name\": \"revokeIndex\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"reattestFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"revokeIndex\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"record\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"kind\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"revoke\",\n \"inputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"revokeFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"setRecord\",\n \"inputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"kind\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"value\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"setRecordFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"kind\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"value\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"updateKey\",\n \"inputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"updateKeyFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"Attested\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"indexed\": true,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"indexed\": false,\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"submitter\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"KeyUpdated\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"indexed\": true,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"oldKeyPtr\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"newKeyPtr\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"submitter\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"NonceUsed\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"nonce\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"RecordSet\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"indexed\": true,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"kind\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"submitter\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"Revoked\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"indexed\": true,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"submitter\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"error\",\n \"name\": \"AlreadyRevoked\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"AuthorizationExpired\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"DeploymentFailed\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"DuplicateActiveFingerprint\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EmptyPublicKey\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EmptySignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"IndexOutOfBounds\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidAuthorization\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidFingerprintLength\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidPointer\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PublicKeyTooLarge\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"RecordTooLarge\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SignatureTooLarge\",\n \"inputs\": []\n }\n] as const\n","export { REGISTRY_ABI } from './abi'\n\n/**\n * PGPRegistry v2 is deployed with CREATE2, so it has the same address on every\n * network. (v1 lived at 0xf7a45BC662A78a6fb417ED5f52b3766cbf13EbBb on mainnet and\n * is no longer read by Thurin.)\n */\nexport const REGISTRY_ADDRESS = '0x9302E02e2869e129aC8516fE5eFFd51EA3082c09' as const\n\n/** Networks the PGPRegistry is deployed on. `mainnet` is the default everywhere. */\nexport type NetworkName = 'mainnet' | 'sepolia' | 'local'\n\nexport interface RegistryDeployment {\n chainId: number\n address: `0x${string}`\n /** Block the registry was deployed in (informational; v2 needs no log scans). */\n deployBlock: bigint\n /** Block explorer base URL for address/tx links. Empty when there is none. */\n explorerUrl: string\n /** Keyless public RPC used when no rpcUrl is configured. */\n defaultRpcUrl: string\n}\n\nexport const NETWORKS: Record<NetworkName, RegistryDeployment> = {\n mainnet: {\n chainId: 1,\n address: REGISTRY_ADDRESS,\n deployBlock: 25962908n, // 2026-09-12, tx 0xda4c3a19cae4e71ffb02559a048403f664d5a7967c19d42158c39600ec63bad8\n explorerUrl: 'https://etherscan.io',\n defaultRpcUrl: 'https://ethereum-rpc.publicnode.com',\n },\n sepolia: {\n chainId: 11155111,\n address: REGISTRY_ADDRESS,\n deployBlock: 11683667n, // 2026-09-11, tx 0x3e40e8f5b9fbf82a4b8943561bcc9b964b2987de10640ac8ff3a1b4ef0725322\n explorerUrl: 'https://sepolia.etherscan.io',\n defaultRpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n },\n /** A local anvil instance (`anvil`, chain id 31337). Deploy with pgp-registry's Deploy script. */\n local: {\n chainId: 31337,\n address: REGISTRY_ADDRESS,\n deployBlock: 0n,\n explorerUrl: '',\n defaultRpcUrl: 'http://127.0.0.1:8545',\n },\n}\n\nexport function isNetworkName(value: unknown): value is NetworkName {\n return value === 'mainnet' || value === 'sepolia' || value === 'local'\n}\n\n/**\n * The registry deployment for a network. `addressOverride` swaps the contract\n * address (e.g. a local deploy that landed somewhere else).\n */\nexport function getRegistry(network: NetworkName = 'mainnet', addressOverride?: string): RegistryDeployment {\n const r = NETWORKS[network]\n if (!r) throw new Error(`Unknown network: ${network}`)\n if (addressOverride && /^0x[0-9a-fA-F]{40}$/.test(addressOverride)) {\n return { ...r, address: addressOverride as `0x${string}` }\n }\n return r\n}\n","import { createContext, useContext } from 'react'\nimport type { IdentityKitConfig } from './core/types'\n\nconst defaultConfig: IdentityKitConfig = {\n baseUrl: 'https://thurin.id',\n network: 'mainnet',\n}\n\nexport const IdentityKitContext = createContext<IdentityKitConfig>(defaultConfig)\n\nexport function useIdentityKitConfig(): IdentityKitConfig {\n return useContext(IdentityKitContext)\n}\n","import { useEnsAddress, useEnsName, useEnsAvatar } from 'wagmi'\nimport { useIdentityKitConfig } from '../context'\nimport { chainFor } from '../provider'\nimport { normalize } from 'viem/ens'\nimport { useAttestations } from './useAttestations'\nimport { useEFPGraph } from './useEFPGraph'\nimport { usePGPProofs } from './usePGPProofs'\nimport type { ThurinIdentity } from '../core/types'\n\nfunction isAddress(value: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(value)\n}\n\nfunction safeNormalize(name: string): string | undefined {\n try {\n return normalize(name)\n } catch {\n return undefined\n }\n}\n\nexport function useThurinIdentity(ensOrAddress: string | undefined | null): ThurinIdentity {\n const chain = chainFor(useIdentityKitConfig().network)\n const isAddr = ensOrAddress ? isAddress(ensOrAddress) : false\n const ensInput = ensOrAddress && !isAddr ? safeNormalize(ensOrAddress) : undefined\n\n // Resolve ENS → address\n const { data: resolvedAddress } = useEnsAddress({\n name: ensInput,\n chainId: chain.id,\n query: { enabled: !!ensInput },\n })\n\n const address = isAddr ? ensOrAddress! : resolvedAddress ?? null\n\n // Reverse resolve address → ENS\n const { data: ensName } = useEnsName({\n address: address as `0x${string}` | undefined,\n chainId: chain.id,\n query: { enabled: !!address },\n })\n\n const displayName = ensInput || ensName || null\n\n const { data: ensAvatar } = useEnsAvatar({\n name: displayName ? safeNormalize(displayName) : undefined,\n chainId: chain.id,\n query: { enabled: !!displayName },\n })\n\n // On-chain attestations\n const {\n claims,\n totalClaims,\n activeClaims,\n currentFingerprint,\n isLoading: claimsLoading,\n } = useAttestations(address)\n\n // PGP proofs come from the key stored in the current attestation — the\n // latest claim that is active and whose signature verified (the same rule\n // useAttestations uses to pick currentFingerprint).\n const currentClaim = [...claims].reverse().find(\n (c) => !c.revoked && c.verification?.verified && c.fingerprint === currentFingerprint,\n )\n const {\n keyInfo: pgpKeyInfo,\n proofs,\n isLoading: proofsLoading,\n } = usePGPProofs(currentFingerprint, currentClaim?.pgpPublicKey ?? null)\n\n // EFP social graph\n const { efp, isLoading: efpLoading } = useEFPGraph(address)\n\n return {\n address,\n ensName: displayName,\n ensAvatar: ensAvatar ?? null,\n claims,\n totalClaims,\n activeClaims,\n currentFingerprint,\n pgpKeyInfo,\n proofs,\n efp,\n isLoading: claimsLoading || proofsLoading || efpLoading,\n error: null,\n }\n}\n","import { useReadContract, useReadContracts } from 'wagmi'\nimport { useQuery } from '@tanstack/react-query'\nimport { hexToString } from 'viem'\nimport { REGISTRY_ABI, getRegistry } from '../core/contract'\nimport { bytesToFingerprint } from '../core/fingerprint'\nimport { chainFor } from '../provider'\nimport { verifyAttestation } from '../core/pgp'\nimport { useIdentityKitConfig } from '../context'\nimport type { Attestation } from '../core/types'\n\n/**\n * On-chain attestations for an address, read straight from the v2 registry:\n * `attestationsOf` for the history, `getPayload` for each stored signature + key.\n * No event logs, so any RPC works. Each claim is verified off-chain.\n */\nexport function useAttestations(address: string | undefined | null) {\n const config = useIdentityKitConfig()\n const registry = getRegistry(config.network, config.registryAddress)\n const chain = chainFor(config.network)\n const owner = address as `0x${string}` | undefined\n\n const { data: rows, isLoading: rowsLoading } = useReadContract({\n address: registry.address,\n abi: REGISTRY_ABI,\n functionName: 'attestationsOf',\n args: owner ? [owner] : undefined,\n chainId: chain.id,\n query: { enabled: !!owner },\n })\n\n const count = rows?.length ?? 0\n\n const contracts = owner && rows\n ? rows.map((_, i) => ({\n address: registry.address,\n abi: REGISTRY_ABI,\n functionName: 'getPayload' as const,\n args: [owner, BigInt(i)] as const,\n chainId: chain.id,\n }))\n : []\n\n const { data: payloads, isLoading: payloadsLoading } = useReadContracts({\n contracts,\n query: { enabled: contracts.length > 0 },\n })\n\n const payloadsReady = count === 0 || (payloads !== undefined && payloads.length === count)\n\n const { data: claims, isLoading: verifyLoading } = useQuery({\n queryKey: ['attestations', config.network, registry.address, address, count, payloadsReady],\n queryFn: async (): Promise<Attestation[]> => {\n if (!rows || !address) return []\n const results: Attestation[] = []\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n const payload = payloads?.[i]\n let pgpSignature: string | null = null\n let pgpPublicKey: string | null = null\n if (payload && payload.status === 'success') {\n const [sigHex, keyHex] = payload.result as readonly [`0x${string}`, `0x${string}`]\n pgpSignature = hexToString(sigHex)\n pgpPublicKey = hexToString(keyHex)\n }\n\n const fingerprint = bytesToFingerprint(row.fingerprint)\n const verification = pgpPublicKey && pgpSignature\n ? await verifyAttestation({ pgpPublicKey, pgpSignature, fingerprint, ethAddress: address })\n : null\n\n const revokedAt = Number(row.revokedAt)\n results.push({\n index: i,\n fingerprint,\n createdAt: Number(row.createdAt),\n revoked: revokedAt !== 0,\n revokedAt: revokedAt === 0 ? null : revokedAt,\n messageVersion: Number(row.messageVersion),\n pgpSignature,\n pgpPublicKey,\n verification,\n })\n }\n return results\n },\n enabled: !!rows && payloadsReady,\n staleTime: 300_000,\n })\n\n const isLoading = rowsLoading || payloadsLoading || verifyLoading || (!!owner && rows !== undefined && !payloadsReady)\n\n const activeClaims = (claims || []).filter((c) => !c.revoked)\n // The current identity is the latest claim that is both active and has a\n // verified signature binding the key to this address. A claim whose signature\n // has not verified must not surface the key's proofs or user data.\n const verifiedClaims = activeClaims.filter((c) => c.verification?.verified)\n const currentFingerprint = verifiedClaims.length > 0\n ? verifiedClaims[verifiedClaims.length - 1].fingerprint\n : null\n\n return {\n claims: claims || [],\n totalClaims: count,\n activeClaims: activeClaims.length,\n currentFingerprint,\n isLoading,\n }\n}\n","import { keccak256, type Hex } from 'viem'\n\n/** 40 hex chars (OpenPGP v4) or 64 hex chars (v6), spaces/0x tolerated. */\nconst FINGERPRINT_HEX = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/\n\n/** Normalize a fingerprint to lowercase hex with no prefix or spaces. Returns null if malformed. */\nexport function normalizeFingerprint(input: string): string | null {\n const hex = input.replace(/^0x/i, '').replace(/\\s+/g, '').toLowerCase()\n return FINGERPRINT_HEX.test(hex) ? hex : null\n}\n\n/** Fingerprint → the raw `bytes` argument the v2 registry takes (0x-prefixed, 20 or 32 bytes). */\nexport function fingerprintToBytes(fingerprint: string): Hex {\n const hex = normalizeFingerprint(fingerprint)\n if (!hex) throw new Error(`Invalid PGP fingerprint: ${fingerprint}`)\n return `0x${hex}`\n}\n\n/** Raw `bytes` from the registry → lowercase hex fingerprint without 0x. */\nexport function bytesToFingerprint(bytes: Hex | string): string {\n return bytes.replace(/^0x/i, '').toLowerCase()\n}\n\n/** keccak256 of the raw fingerprint bytes — the `fingerprintHash` the registry indexes by. */\nexport function fingerprintHash(fingerprint: string): Hex {\n return keccak256(fingerprintToBytes(fingerprint))\n}\n\n/**\n * The long key ID as the `bytes8` the registry indexes by. Per RFC 9580 §5.5.4 it is the\n * low-order 8 bytes of a v4 (20-byte) fingerprint and the high-order 8 bytes of a v6\n * (32-byte) fingerprint — the same value `gpg --keyid-format long` prints.\n */\nexport function keyIdOf(fingerprint: string): Hex {\n const hex = normalizeFingerprint(fingerprint)\n if (!hex) throw new Error(`Invalid PGP fingerprint: ${fingerprint}`)\n return `0x${keyIdHex(hex)}`\n}\n\n/** Long key ID (16 lowercase hex chars) of a normalized fingerprint. */\nexport function keyIdHex(normalizedFingerprint: string): string {\n return normalizedFingerprint.length === 64 ? normalizedFingerprint.slice(0, 16) : normalizedFingerprint.slice(-16)\n}\n\n/** A 16-hex long key ID (spaces/0x tolerated) → `bytes8`. */\nexport function keyIdToBytes(keyId: string): Hex | null {\n const hex = keyId.replace(/^0x/i, '').replace(/\\s+/g, '').toLowerCase()\n return /^[0-9a-f]{16}$/.test(hex) ? `0x${hex}` : null\n}\n","import type { PGPKeyInfo, PGPVerification } from './types'\n\n/** Human-readable algorithm for a key or subkey packet: \"Ed25519\", \"Cv25519\", \"RSA 4096\", \"NIST P-256\", … */\nfunction algorithmName(keyOrSubkey: any): string {\n try {\n const info = keyOrSubkey.getAlgorithmInfo() as { algorithm: string; bits?: number; curve?: string }\n const curve = (info.curve || '').toLowerCase()\n if (curve.startsWith('ed25519') || info.algorithm === 'ed25519' || info.algorithm === 'eddsaLegacy') return 'Ed25519'\n if (curve.startsWith('curve25519') || info.algorithm === 'x25519') return 'Cv25519'\n if (curve.startsWith('ed448')) return 'Ed448'\n if (curve.startsWith('curve448') || info.algorithm === 'x448') return 'X448'\n if (curve.startsWith('nistp') || curve.startsWith('p')) return `NIST P-${curve.replace(/\\D/g, '')}`\n if (curve.startsWith('secp')) return curve\n if (curve.startsWith('brainpool')) return curve\n if (info.algorithm.startsWith('rsa')) return info.bits ? `RSA ${info.bits}` : 'RSA'\n if (info.algorithm.startsWith('dsa')) return info.bits ? `DSA ${info.bits}` : 'DSA'\n if (info.algorithm.startsWith('elgamal')) return info.bits ? `ElGamal ${info.bits}` : 'ElGamal'\n return info.curve || info.algorithm\n } catch {\n return String(keyOrSubkey.keyPacket?.algorithm ?? 'unknown')\n }\n}\n\nexport async function parsePgpKey(armoredKey: string): Promise<PGPKeyInfo | null> {\n try {\n const { readKey } = await import('openpgp')\n const key = await readKey({ armoredKey })\n const fingerprint = key.getFingerprint().toUpperCase()\n const algorithm = algorithmName(key)\n const created = key.keyPacket.created?.toISOString() ?? null\n const expiration = await key.getExpirationTime()\n const expires =\n expiration && expiration !== Infinity\n ? new Date(expiration as number).toISOString()\n : null\n\n // openpgp does not verify certification signatures when a key is parsed —\n // it groups them by issuer key ID only. A key's fingerprint also covers\n // only the primary key packet, not its user IDs or their certifications.\n // Each self-certification is therefore verified against the primary key\n // here before its user ID and notations are treated as authoritative.\n const userIDs: string[] = []\n const notations: { name: string; value: string }[] = []\n const seen = new Set<string>()\n for (const user of key.users) {\n const certs = (user as any).selfCertifications\n if (!certs || certs.length === 0) continue\n\n let userVerified = false\n for (const cert of certs) {\n try {\n await cert.verify(\n key.keyPacket,\n cert.signatureType,\n { userID: (user as any).userID, key: key.keyPacket },\n )\n } catch {\n continue // signature not made by this key — ignore this certification\n }\n userVerified = true\n\n if (cert.rawNotations) {\n for (const n of cert.rawNotations) {\n const name =\n typeof n.name === 'string' ? n.name : new TextDecoder().decode(n.name)\n const value =\n n.value instanceof Uint8Array\n ? new TextDecoder().decode(n.value)\n : typeof n.value === 'string'\n ? n.value\n : null\n if (value) {\n // Dedupe by value alone: the same proof target is often present\n // under both proof@thurin.id and proof@ariadne.id, and should\n // surface once, not once per namespace.\n if (!seen.has(value)) {\n seen.add(value)\n notations.push({ name, value })\n }\n }\n }\n }\n }\n\n if (userVerified) {\n const uid = (user as any).userID?.userID\n if (uid) userIDs.push(uid)\n }\n }\n\n const subkeys = key.subkeys.map((sk: any) => ({\n algorithm: algorithmName(sk),\n created: sk.keyPacket.created?.toISOString() ?? null,\n fingerprint: sk.getFingerprint().toUpperCase(),\n }))\n\n return { fingerprint, userIDs, algorithm, created, expires, notations, subkeys }\n } catch {\n return null\n }\n}\n\nexport async function verifyAttestation({\n pgpPublicKey,\n pgpSignature,\n fingerprint,\n ethAddress,\n}: {\n pgpPublicKey: string | null\n pgpSignature: string | null\n fingerprint: string\n ethAddress: string\n}): Promise<PGPVerification> {\n try {\n if (!pgpPublicKey || !pgpSignature) {\n return { verified: false, reason: 'Missing PGP data' }\n }\n\n const { readKey, readCleartextMessage, verify } = await import('openpgp')\n\n const publicKey = await readKey({ armoredKey: pgpPublicKey })\n const keyFingerprint = publicKey.getFingerprint().toUpperCase()\n if (keyFingerprint !== fingerprint.toUpperCase()) {\n return { verified: false, reason: 'Key fingerprint mismatch' }\n }\n\n const message = await readCleartextMessage({ cleartextMessage: pgpSignature })\n const { signatures } = await verify({ message, verificationKeys: publicKey })\n await signatures[0].verified\n\n const signedText = message.getText()\n if (!signedText.toLowerCase().includes(ethAddress.toLowerCase())) {\n return { verified: false, reason: 'Signed message does not contain ETH address' }\n }\n\n return { verified: true }\n } catch {\n return { verified: false, reason: 'Signature verification failed' }\n }\n}\n\nexport interface StrippedKey {\n /** Armored public key containing only the non-email user IDs. */\n armored: string\n /** User IDs kept (no `@`). */\n kept: string[]\n /** User IDs removed (contained an `@`). */\n removed: string[]\n}\n\nconst EMAIL_UID = /@/\n\n/**\n * Remove every user ID that contains an email address, keeping the rest (and\n * their self-certifications, so proof notations on a non-email user ID survive).\n * Returns null when nothing would remain — openpgp needs at least one\n * self-certified user ID to verify signatures, so such a key must not be\n * published. The key material and subkeys are untouched; the fingerprint is\n * unchanged.\n */\nexport async function stripEmailUserIDs(armoredKey: string): Promise<StrippedKey | null> {\n try {\n const { readKey } = await import('openpgp')\n const key = await readKey({ armoredKey })\n const kept: string[] = []\n const removed: string[] = []\n const users = (key as any).users.filter((u: any) => {\n const uid: string | undefined = u.userID?.userID\n if (!uid) return false\n if (EMAIL_UID.test(uid)) { removed.push(uid); return false }\n kept.push(uid)\n return true\n })\n if (users.length === 0) return null\n ;(key as any).users = users\n return { armored: key.armor(), kept, removed }\n } catch {\n return null\n }\n}\n\n/** True when any user ID on the key contains an email address. */\nexport async function hasEmailUserID(armoredKey: string): Promise<boolean> {\n try {\n const { readKey } = await import('openpgp')\n const key = await readKey({ armoredKey })\n return (key as any).users.some((u: any) => EMAIL_UID.test(u.userID?.userID ?? ''))\n } catch {\n return false\n }\n}\n\nconst KEYSERVER_BASE = 'https://keys.openpgp.org/vks/v1'\n\nexport async function fetchKeyByFingerprint(fingerprint: string): Promise<string | null> {\n try {\n const resp = await fetch(`${KEYSERVER_BASE}/by-fingerprint/${fingerprint}`)\n if (!resp.ok) return null\n return await resp.text()\n } catch {\n return null\n }\n}\n\nexport async function fetchKeyByKeyId(keyId: string): Promise<string | null> {\n try {\n const resp = await fetch(`${KEYSERVER_BASE}/by-keyid/${keyId}`)\n if (!resp.ok) return null\n return await resp.text()\n } catch {\n return null\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { fetchEFPGraph } from '../core/efp'\nimport type { EFPGraph } from '../core/types'\n\nexport function useEFPGraph(address: string | undefined | null) {\n const { data, isLoading } = useQuery<EFPGraph | null>({\n queryKey: ['efp-graph', address],\n queryFn: () => fetchEFPGraph(address!),\n enabled: !!address,\n staleTime: 300_000,\n })\n\n return {\n efp: data ?? null,\n isLoading,\n }\n}\n","import type { EFPGraph } from './types'\n\nconst EFP_API = 'https://api.ethfollow.xyz/api/v1'\n\nexport async function fetchEFPGraph(address: string): Promise<EFPGraph | null> {\n try {\n const listsResp = await fetch(`${EFP_API}/users/${address}/lists`)\n if (!listsResp.ok) return null\n const listsData = await listsResp.json()\n const listId = listsData.primary_list\n if (!listId) return null\n\n const [followingResp, statsResp, top8Resp] = await Promise.all([\n fetch(`${EFP_API}/lists/${listId}/following?limit=100`),\n fetch(`${EFP_API}/users/${address}/stats`),\n fetch(`${EFP_API}/lists/${listId}/following?limit=8&tags=top8`),\n ])\n\n const followingData = followingResp.ok ? await followingResp.json() : { following: [] }\n const statsData = statsResp.ok ? await statsResp.json() : {}\n const top8Data = top8Resp.ok ? await top8Resp.json() : { following: [] }\n\n return {\n followers: parseInt(statsData.followers_count) || 0,\n following: (followingData.following || []).length,\n top8: (top8Data.following || []).map((f: any) => f.data),\n hasEfp: true,\n }\n } catch {\n return null\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { parsePgpKey } from '../core/pgp'\nimport { identifyProof, verifyProof, displayUrl, proofHref, proofSecondaryHref } from '../core/proofs'\nimport { useIdentityKitConfig } from '../context'\nimport type { PGPKeyInfo, ProofResult } from '../core/types'\n\n/**\n * Proofs for an identity, read from the PGP key stored in its on-chain\n * attestation. No keyserver is consulted: keys.openpgp.org only serves user\n * IDs whose email is verified and drops non-email user IDs entirely, so it can\n * never carry the published (non-email) identity that holds the notations.\n *\n * @param fingerprint the attested fingerprint (proofs must name it)\n * @param armoredKey the attestation's `pgpPublicKey`\n */\nexport function usePGPProofs(fingerprint: string | undefined | null, armoredKey: string | undefined | null) {\n const config = useIdentityKitConfig()\n\n const { data } = useQuery({\n // The key is large; key the query on its length + fingerprint, which\n // changes whenever a different attestation's key is supplied.\n queryKey: ['pgp-proofs', fingerprint, armoredKey?.length ?? 0],\n queryFn: async (): Promise<{ keyInfo: PGPKeyInfo | null; proofs: ProofResult[] }> => {\n if (!fingerprint || !armoredKey) return { keyInfo: null, proofs: [] }\n\n const keyInfo = await parsePgpKey(armoredKey)\n if (!keyInfo) return { keyInfo: null, proofs: [] }\n\n // Identify proofs from notations. Drop unrecognized targets (provider\n // 'unknown') so the card doesn't render \"Unknown\" badges for platforms\n // Thurin has no verifier for — matching the explorer's behavior.\n const identified = keyInfo.notations\n .map((n) => identifyProof(n))\n .filter((p): p is NonNullable<typeof p> => p !== null && p.provider !== 'unknown')\n\n // Verify all proofs in parallel\n const proofs: ProofResult[] = await Promise.all(\n identified.map(async (proof) => {\n const result = await verifyProof(proof, fingerprint, config.neynarApiKey)\n return {\n provider: proof.provider,\n label: proof.label,\n url: proof.url,\n displayUrl: displayUrl(proof),\n href: proofHref(proof),\n secondaryHref: proofSecondaryHref(proof),\n status: result.verified ? 'verified' as const : 'unverified' as const,\n reason: result.reason,\n }\n }),\n )\n\n // Collapse proofs that resolve to the same account — the same target is\n // often listed under both proof@thurin.id and proof@ariadne.id (and can\n // be reached via more than one proof URL). Key by provider + display\n // identity, preferring a verified result.\n const byAccount = new Map<string, ProofResult>()\n for (const p of proofs) {\n const key = `${p.provider}:${p.displayUrl}`\n const prev = byAccount.get(key)\n if (!prev || (p.status === 'verified' && prev.status !== 'verified')) {\n byAccount.set(key, p)\n }\n }\n\n return { keyInfo, proofs: [...byAccount.values()] }\n },\n enabled: !!fingerprint && !!armoredKey,\n staleTime: 300_000,\n })\n\n return {\n keyInfo: data?.keyInfo ?? null,\n proofs: data?.proofs ?? [],\n // Report loading whenever a fingerprint is set but its proofs haven't\n // resolved yet. Using react-query's own isLoading leaves a gap while the\n // query is enabling (fingerprint just became known), during which the card\n // would briefly paint without proof badges and then pop them in.\n isLoading: !!fingerprint && !!armoredKey && data === undefined,\n }\n}\n","import { keyIdHex } from './fingerprint'\nimport type { Notation, Proof, PGPVerification } from './types'\n\nconst PROVIDERS: {\n provider: string\n label: string\n pattern: RegExp\n parse: (m: RegExpMatchArray) => Record<string, string>\n}[] = [\n {\n provider: 'github',\n label: 'GitHub',\n pattern: /^https:\\/\\/gist\\.github\\.com\\/([^/]+)\\/([a-f0-9]+)$/i,\n parse: (m) => ({ user: m[1], gistId: m[2] }),\n },\n {\n // A repository's description — the form an organisation can use, since\n // gists belong to user accounts only. Same shape as the Codeberg proof.\n provider: 'github',\n label: 'GitHub',\n pattern: /^https:\\/\\/github\\.com\\/([A-Za-z0-9-]+)\\/([A-Za-z0-9._-]+)$/i,\n parse: (m) => ({ user: m[1], repo: m[2] }),\n },\n {\n provider: 'dns',\n label: 'DNS',\n // domain is restricted to a hostname (labels may include underscores for\n // records like _thurin.example.com); rejects slashes, userinfo, and spaces.\n pattern: /^dns:([a-z0-9._-]+)\\?type=TXT$/i,\n parse: (m) => ({ domain: m[1] }),\n },\n {\n provider: 'farcaster',\n label: 'Farcaster',\n pattern: /^https:\\/\\/farcaster\\.xyz\\/([^/]+)\\/(0x[a-f0-9]+)$/i,\n parse: (m) => ({ user: m[1], castHash: m[2] }),\n },\n {\n provider: 'codeberg',\n label: 'Codeberg',\n pattern: /^https:\\/\\/codeberg\\.org\\/([^/]+)\\/([^/]+)$/i,\n parse: (m) => ({ user: m[1], repo: m[2] }),\n },\n {\n provider: 'mastodon',\n label: 'Mastodon',\n // instance is restricted to a bare hostname (optional port) so a value\n // like \"mastodon.social@evil.com\" can't redirect the lookup elsewhere.\n pattern: /^https:\\/\\/([a-z0-9.-]+(?::\\d+)?)\\/@([^/@?#\\s]+)$/i,\n parse: (m) => ({ instance: m[1], user: m[2] }),\n },\n]\n\nexport function identifyProof(notation: Notation): Proof | null {\n if (notation.name !== 'proof@thurin.id') return null\n\n for (const { provider, label, pattern, parse } of PROVIDERS) {\n const m = notation.value.match(pattern)\n if (m) {\n return { provider, label, url: notation.value, ...parse(m) }\n }\n }\n\n return { provider: 'unknown', label: 'Unknown', url: notation.value }\n}\n\nexport function displayUrl(proof: Proof): string {\n if (proof.provider === 'dns') return proof.domain!\n if (proof.provider === 'github') return proof.user!\n if (proof.provider === 'farcaster') return `@${proof.user}`\n if (proof.provider === 'codeberg') return proof.user!\n if (proof.provider === 'mastodon') return `@${proof.user}@${proof.instance}`\n return proof.url\n}\n\nexport function proofHref(proof: Proof): string | null {\n if (proof.provider === 'dns') return `https://${proof.domain}`\n if (proof.provider === 'github') return `https://github.com/${proof.user}`\n if (proof.provider === 'farcaster') return `https://farcaster.xyz/${proof.user}`\n if (proof.provider === 'codeberg') return `https://codeberg.org/${proof.user}`\n if (proof.provider === 'mastodon') return `https://${proof.instance}/@${proof.user}`\n if (proof.url.startsWith('http')) return proof.url\n return null\n}\n\nexport function proofSecondaryHref(proof: Proof): string | null {\n if (proof.provider === 'github') return proof.url\n if (proof.provider === 'farcaster') return proof.url\n if (proof.provider === 'codeberg') return proof.url\n if (proof.provider === 'mastodon') return proof.url\n return null\n}\n\n// ─── Verification ──────────────────────────────────────────────────────────\n\nconst FPR_TOKEN = 'OPENPGP4FPR:'\n\nfunction containsFingerprint(text: string, fingerprint: string): boolean {\n return text.toUpperCase().includes(FPR_TOKEN + fingerprint.toUpperCase())\n}\n\nfunction containsFingerprintUrl(text: string, fingerprint: string): boolean {\n return text.toUpperCase().includes(fingerprint.toUpperCase())\n}\n\nasync function verifyGitHub(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n if (proof.repo) return verifyGitHubRepo(proof, fingerprint)\n try {\n const resp = await fetch(`https://api.github.com/gists/${proof.gistId}`)\n if (!resp.ok) return { verified: false, reason: `GitHub API returned ${resp.status}` }\n const data = await resp.json()\n\n // A gist is identified solely by its globally-unique ID; the username in\n // the URL is not authoritative. Confirm the gist owner matches the claimed\n // account before trusting the token it contains.\n if (data.owner?.login?.toLowerCase() !== proof.user!.toLowerCase()) {\n return { verified: false, reason: 'Gist owner does not match claimed user' }\n }\n\n for (const file of Object.values(data.files || {}) as any[]) {\n if (file.content && containsFingerprint(file.content, fingerprint)) {\n return { verified: true }\n }\n }\n return { verified: false, reason: 'Fingerprint token not found in gist' }\n } catch (err: any) {\n return { verified: false, reason: `GitHub fetch failed: ${err.message}` }\n }\n}\n\nasync function verifyGitHubRepo(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n try {\n const resp = await fetch(\n `https://api.github.com/repos/${encodeURIComponent(proof.user!)}/${encodeURIComponent(proof.repo!)}`,\n )\n if (!resp.ok) return { verified: false, reason: `GitHub API returned ${resp.status}` }\n const data = await resp.json()\n\n // GitHub follows renames and redirects, so the API may answer for a repo\n // under a different owner than the URL names. Only trust it if the owner\n // is the account being claimed.\n if (data.owner?.login?.toLowerCase() !== proof.user!.toLowerCase()) {\n return { verified: false, reason: 'Repository owner does not match claimed account' }\n }\n\n if (data.description && containsFingerprint(data.description, fingerprint)) {\n return { verified: true }\n }\n return { verified: false, reason: 'Fingerprint token not found in repository description' }\n } catch (err: any) {\n return { verified: false, reason: `GitHub fetch failed: ${err.message}` }\n }\n}\n\nasync function verifyDNS(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n try {\n const resp = await fetch(\n `https://cloudflare-dns.com/dns-query?name=${encodeURIComponent(proof.domain!)}&type=TXT`,\n { headers: { Accept: 'application/dns-json' } },\n )\n if (!resp.ok) return { verified: false, reason: `DNS query returned ${resp.status}` }\n const data = await resp.json()\n\n for (const answer of data.Answer || []) {\n // TXT records only (type 16) — a CNAME or other record in the resolution\n // chain must not be eligible to match the token.\n if (answer.type !== 16) continue\n if (answer.data && containsFingerprint(answer.data, fingerprint)) {\n return { verified: true }\n }\n }\n return { verified: false, reason: 'Fingerprint token not found in TXT records' }\n } catch (err: any) {\n return { verified: false, reason: `DNS fetch failed: ${err.message}` }\n }\n}\n\nconst NEYNAR_HUB = 'https://hub-api.neynar.com'\n\nasync function resolveFid(\n username: string,\n apiKey: string,\n): Promise<number | null> {\n const resp = await fetch(\n `${NEYNAR_HUB}/v1/userNameProofByName?name=${encodeURIComponent(username)}`,\n { headers: { 'x-api-key': apiKey } },\n )\n if (!resp.ok) return null\n const data = await resp.json()\n return data.fid ?? null\n}\n\nasync function verifyFarcaster(\n proof: Proof,\n fingerprint: string,\n neynarApiKey?: string,\n): Promise<PGPVerification> {\n if (!neynarApiKey) {\n return { verified: false, reason: 'Farcaster verification requires a Neynar API key' }\n }\n\n try {\n const fid = await resolveFid(proof.user!, neynarApiKey)\n if (!fid) return { verified: false, reason: `Could not resolve Farcaster user \"${proof.user}\"` }\n\n const headers = { 'x-api-key': neynarApiKey }\n let pageToken = ''\n for (let page = 0; page < 5; page++) {\n const url = `${NEYNAR_HUB}/v1/castsByFid?fid=${fid}&pageSize=100&reverse=true${pageToken ? `&pageToken=${pageToken}` : ''}`\n const resp = await fetch(url, { headers })\n if (!resp.ok) return { verified: false, reason: `Farcaster Hub returned ${resp.status}` }\n const data = await resp.json()\n\n for (const msg of data.messages || []) {\n if (msg.hash && msg.hash.startsWith(proof.castHash!)) {\n const text = msg.data?.castAddBody?.text || ''\n if (containsFingerprint(text, fingerprint)) {\n return { verified: true }\n }\n // A short cast-hash prefix can match multiple casts; keep scanning\n // rather than stopping at the first prefix match without the token.\n }\n }\n\n if (!data.nextPageToken) break\n pageToken = data.nextPageToken\n }\n\n return { verified: false, reason: 'Cast not found' }\n } catch (err: any) {\n return { verified: false, reason: `Farcaster fetch failed: ${err.message}` }\n }\n}\n\nasync function verifyCodeberg(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n try {\n const resp = await fetch(\n `https://codeberg.org/api/v1/repos/${encodeURIComponent(proof.user!)}/${encodeURIComponent(proof.repo!)}`,\n )\n if (!resp.ok) return { verified: false, reason: `Codeberg API returned ${resp.status}` }\n const data = await resp.json()\n\n if (data.description && containsFingerprint(data.description, fingerprint)) {\n return { verified: true }\n }\n\n return { verified: false, reason: 'Fingerprint token not found in repo description' }\n } catch (err: any) {\n return { verified: false, reason: `Codeberg fetch failed: ${err.message}` }\n }\n}\n\nasync function verifyMastodon(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n try {\n // The instance host is user-supplied and interpolated into the request URL,\n // so restrict it to a bare hostname (optional port) before use — otherwise a\n // value such as \"mastodon.social@evil.com\" would send the lookup to another\n // server while still displaying as a legitimate handle.\n if (!proof.instance || !/^[a-z0-9.-]+(?::\\d+)?$/i.test(proof.instance)) {\n return { verified: false, reason: 'Invalid Mastodon instance host' }\n }\n const resp = await fetch(\n `https://${proof.instance}/api/v1/accounts/lookup?acct=${encodeURIComponent(proof.user!)}`,\n )\n if (!resp.ok) return { verified: false, reason: `Mastodon API returned ${resp.status}` }\n const data = await resp.json()\n\n const keyId = keyIdHex(fingerprint.replace(/^0x/i, '').replace(/\\s+/g, '').toLowerCase())\n\n for (const field of data.fields || []) {\n const text = field.value.replace(/<[^>]*>/g, '')\n if (containsFingerprintUrl(text, fingerprint) || containsFingerprintUrl(text, keyId)) {\n return { verified: true }\n }\n }\n\n if (data.note) {\n const text = data.note.replace(/<[^>]*>/g, '')\n if (containsFingerprintUrl(text, fingerprint) || containsFingerprintUrl(text, keyId)) {\n return { verified: true }\n }\n }\n\n return { verified: false, reason: 'Fingerprint not found in profile fields or bio' }\n } catch (err: any) {\n return { verified: false, reason: `Mastodon fetch failed: ${err.message}` }\n }\n}\n\ntype Verifier = (proof: Proof, fingerprint: string, neynarApiKey?: string) => Promise<PGPVerification>\n\nconst verifiers: Record<string, Verifier> = {\n github: verifyGitHub,\n dns: verifyDNS,\n farcaster: verifyFarcaster,\n codeberg: verifyCodeberg,\n mastodon: verifyMastodon,\n}\n\nexport async function verifyProof(\n proof: Proof,\n fingerprint: string,\n neynarApiKey?: string,\n): Promise<PGPVerification> {\n const fn = verifiers[proof.provider]\n if (!fn) return { verified: false, reason: 'Unknown provider' }\n return fn(proof, fingerprint, neynarApiKey)\n}\n","import { useThurinIdentity } from '../../hooks/useThurinIdentity'\nimport { useIdentityKitConfig } from '../../context'\nimport type { Theme } from '../../core/types'\nimport '../../themes/index.css'\nimport './ThurinCard.css'\n\nfunction ThurinLogo() {\n return (\n <svg className=\"thurin-card-avatar-placeholder\" viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"50\" cy=\"50\" r=\"50\" fill=\"var(--thurin-surface-deep)\" />\n <path d=\"M25 80 Q25 25 50 25 Q75 25 75 50\" fill=\"none\" stroke=\"#7c9a3e\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M33 75 Q33 35 50 35 Q67 35 67 52\" fill=\"none\" stroke=\"#7c9a3e\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M41 70 Q41 45 50 45 Q59 45 59 55\" fill=\"none\" stroke=\"#c9a227\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M50 65 L50 53\" fill=\"none\" stroke=\"#c9a227\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n </svg>\n )\n}\n\nexport interface ThurinCardProps {\n ens?: string\n address?: string\n theme?: Theme\n}\n\nexport function ThurinCard({ ens, address, theme = 'thurin' }: ThurinCardProps) {\n const input = ens || address\n const identity = useThurinIdentity(input)\n const config = useIdentityKitConfig()\n\n const profileUrl = identity.address\n ? `${config.baseUrl}/eth/${identity.address}`\n : ens\n ? `${config.baseUrl}/ens/${ens}`\n : null\n\n if (identity.isLoading) {\n return (\n <div className=\"thurin-card\" data-thurin-theme={theme}>\n <div className=\"thurin-card-loading\">Loading identity...</div>\n </div>\n )\n }\n\n const displayAddress = identity.address || null\n\n const verifiedProofs = identity.proofs.filter((p) => p.status === 'verified').length\n const hasVerifiedPgp = identity.claims.some((c) => c.verification?.verified && !c.revoked)\n\n return (\n <div className=\"thurin-card\" data-thurin-theme={theme}>\n <a className=\"thurin-card-header\" href={profileUrl || undefined} target=\"_blank\" rel=\"noopener noreferrer\">\n {identity.ensAvatar ? (\n <img\n className=\"thurin-card-avatar\"\n src={identity.ensAvatar}\n alt={identity.ensName || ''}\n />\n ) : (\n <ThurinLogo />\n )}\n <div>\n {identity.ensName && (\n <div className=\"thurin-card-name\">{identity.ensName}</div>\n )}\n {displayAddress && (\n <div className=\"thurin-card-address\">{displayAddress}</div>\n )}\n </div>\n </a>\n\n <div className=\"thurin-card-stats\">\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">{identity.activeClaims}</span>\n <span className=\"thurin-card-stat-label\">Attestations</span>\n </div>\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">{verifiedProofs}</span>\n <span className=\"thurin-card-stat-label\">Proofs</span>\n </div>\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">\n {identity.efp?.followers ?? 0}\n </span>\n <span className=\"thurin-card-stat-label\">Followers</span>\n </div>\n </div>\n\n <div className=\"thurin-card-badges\">\n {hasVerifiedPgp && (\n <span className=\"thurin-card-badge thurin-card-badge--verified\">PGP Verified</span>\n )}\n {identity.efp?.hasEfp && (\n <span className=\"thurin-card-badge thurin-card-badge--verified\">EFP</span>\n )}\n {identity.proofs.map((p, i) => (\n <span\n key={i}\n className={`thurin-card-badge thurin-card-badge--${p.status === 'verified' ? 'verified' : 'unverified'}`}\n >\n {p.label}\n </span>\n ))}\n </div>\n\n {profileUrl && (\n <a\n className=\"thurin-card-link\"\n href={profileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View on Thurin\n </a>\n )}\n </div>\n )\n}\n","import { hashTypedData, keccak256, stringToHex, type Hex, type TypedDataDomain } from 'viem'\nimport { fingerprintToBytes } from './fingerprint'\n\n/**\n * EIP-712 authorizations for the registry's relayed writes (`attestFor`, `reattestFor`,\n * `updateKeyFor`, `revokeFor`, `setRecordFor`). The owner signs one of these typed\n * structs; anyone can then submit the matching call and pay the gas. Every field is\n * bound, plus the owner's current `nonce` (read with `nonces(owner)`) and a `deadline`.\n *\n * The domain includes the chain id, so an authorization for one network cannot be\n * replayed on another even though the registry has the same address everywhere.\n */\nexport const EIP712_NAME = 'Thurin PGPRegistry'\nexport const EIP712_VERSION = '2'\n\nexport function registryDomain(chainId: number, verifyingContract: Hex): TypedDataDomain {\n return { name: EIP712_NAME, version: EIP712_VERSION, chainId, verifyingContract }\n}\n\nexport const AUTHORIZATION_TYPES = {\n Attest: [\n { name: 'owner', type: 'address' },\n { name: 'fingerprint', type: 'bytes' },\n { name: 'pgpSignature', type: 'bytes' },\n { name: 'pgpPublicKey', type: 'bytes' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n Reattest: [\n { name: 'owner', type: 'address' },\n { name: 'revokeIndex', type: 'uint256' },\n { name: 'fingerprint', type: 'bytes' },\n { name: 'pgpSignature', type: 'bytes' },\n { name: 'pgpPublicKey', type: 'bytes' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n UpdateKey: [\n { name: 'owner', type: 'address' },\n { name: 'index', type: 'uint256' },\n { name: 'pgpPublicKey', type: 'bytes' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n Revoke: [\n { name: 'owner', type: 'address' },\n { name: 'index', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n SetRecord: [\n { name: 'owner', type: 'address' },\n { name: 'index', type: 'uint256' },\n { name: 'kind', type: 'bytes32' },\n { name: 'value', type: 'bytes' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const\n\nexport type AuthorizationAction = keyof typeof AUTHORIZATION_TYPES\n\ninterface Common { owner: Hex; nonce: bigint; deadline: bigint }\nexport type AttestAuthorization = Common & { fingerprint: string; pgpSignature: string; pgpPublicKey: string }\nexport type ReattestAuthorization = AttestAuthorization & { revokeIndex: bigint }\nexport type UpdateKeyAuthorization = Common & { index: bigint; pgpPublicKey: string }\nexport type RevokeAuthorization = Common & { index: bigint }\nexport type SetRecordAuthorization = Common & { index: bigint; kind: Hex; value: Hex }\n\n/**\n * Build the object to pass to viem/wagmi `signTypedData`. `fingerprint` is the hex\n * fingerprint; `pgpSignature` / `pgpPublicKey` are the armored text exactly as they\n * will be submitted (they are hashed as UTF-8 bytes).\n */\nexport function attestTypedData(chainId: number, registry: Hex, a: AttestAuthorization) {\n return {\n domain: registryDomain(chainId, registry),\n types: { Attest: AUTHORIZATION_TYPES.Attest },\n primaryType: 'Attest' as const,\n message: {\n owner: a.owner,\n fingerprint: fingerprintToBytes(a.fingerprint),\n pgpSignature: stringToHex(a.pgpSignature),\n pgpPublicKey: stringToHex(a.pgpPublicKey),\n nonce: a.nonce,\n deadline: a.deadline,\n },\n }\n}\n\nexport function reattestTypedData(chainId: number, registry: Hex, a: ReattestAuthorization) {\n const base = attestTypedData(chainId, registry, a)\n return {\n domain: base.domain,\n types: { Reattest: AUTHORIZATION_TYPES.Reattest },\n primaryType: 'Reattest' as const,\n message: { ...base.message, revokeIndex: a.revokeIndex },\n }\n}\n\nexport function updateKeyTypedData(chainId: number, registry: Hex, a: UpdateKeyAuthorization) {\n return {\n domain: registryDomain(chainId, registry),\n types: { UpdateKey: AUTHORIZATION_TYPES.UpdateKey },\n primaryType: 'UpdateKey' as const,\n message: { owner: a.owner, index: a.index, pgpPublicKey: stringToHex(a.pgpPublicKey), nonce: a.nonce, deadline: a.deadline },\n }\n}\n\nexport function revokeTypedData(chainId: number, registry: Hex, a: RevokeAuthorization) {\n return {\n domain: registryDomain(chainId, registry),\n types: { Revoke: AUTHORIZATION_TYPES.Revoke },\n primaryType: 'Revoke' as const,\n message: { owner: a.owner, index: a.index, nonce: a.nonce, deadline: a.deadline },\n }\n}\n\nexport function setRecordTypedData(chainId: number, registry: Hex, a: SetRecordAuthorization) {\n return {\n domain: registryDomain(chainId, registry),\n types: { SetRecord: AUTHORIZATION_TYPES.SetRecord },\n primaryType: 'SetRecord' as const,\n message: { owner: a.owner, index: a.index, kind: a.kind, value: a.value, nonce: a.nonce, deadline: a.deadline },\n }\n}\n\n/** The digest the registry recovers the signer from — handy for tests and CLIs. */\nexport function authorizationDigest(typedData: ReturnType<typeof attestTypedData | typeof reattestTypedData | typeof updateKeyTypedData | typeof revokeTypedData | typeof setRecordTypedData>): Hex {\n return hashTypedData(typedData as any)\n}\n\n/** `bytes32 kind` for a record from a human-readable name, e.g. recordKind('thurin.vouch'). */\nexport function recordKind(name: string): Hex {\n return keccak256(stringToHex(name))\n}\n"],"mappings":"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","names":["useQuery","useQuery","useQuery","useQuery","jsx","keccak256","keccak256"]}
1
+ {"version":3,"sources":["../src/provider.tsx","../src/core/abi.ts","../src/core/contract.ts","../src/context.ts","../src/hooks/useThurinIdentity.ts","../src/hooks/useAttestations.ts","../src/core/fingerprint.ts","../src/core/pgp.ts","../src/hooks/useEFPGraph.ts","../src/core/efp.ts","../src/hooks/usePGPProofs.ts","../src/core/proofs.ts","../src/components/ThurinCard/ThurinCard.tsx","../src/core/authorization.ts"],"sourcesContent":["import { type ReactNode, useMemo } from 'react'\nimport { WagmiProvider, createConfig, http, useConfig } from 'wagmi'\nimport { mainnet, sepolia, foundry } from 'wagmi/chains'\nimport { getRegistry } from './core/contract'\nimport type { NetworkName } from './core/contract'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { IdentityKitContext } from './context'\nimport type { IdentityKitConfig } from './core/types'\n\nconst defaultQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 60_000,\n retry: 1,\n },\n },\n})\n\nexport function chainFor(network: NetworkName = 'mainnet') {\n if (network === 'sepolia') return sepolia\n if (network === 'local') return foundry\n return mainnet\n}\n\nfunction createDefaultWagmiConfig(rpcUrl: string | undefined, network: NetworkName) {\n const url = rpcUrl || getRegistry(network).defaultRpcUrl\n // Spelled out per network: wagmi types `transports` by the exact chain ids.\n if (network === 'sepolia') return createConfig({ chains: [sepolia], transports: { [sepolia.id]: http(url) } })\n if (network === 'local') return createConfig({ chains: [foundry], transports: { [foundry.id]: http(url) } })\n return createConfig({ chains: [mainnet], transports: { [mainnet.id]: http(url) } })\n}\n\nfunction WagmiDetector({ children, rpcUrl, network }: { children: ReactNode; rpcUrl?: string; network: NetworkName }) {\n // Try to use existing wagmi config\n let hasWagmi = false\n try {\n useConfig()\n hasWagmi = true\n } catch {\n // No WagmiProvider above us\n }\n\n const wagmiConfig = useMemo(() => createDefaultWagmiConfig(rpcUrl, network), [rpcUrl, network])\n\n if (hasWagmi) {\n return <>{children}</>\n }\n\n return (\n <WagmiProvider config={wagmiConfig}>\n <QueryClientProvider client={defaultQueryClient}>\n {children}\n </QueryClientProvider>\n </WagmiProvider>\n )\n}\n\nexport interface IdentityKitProviderProps extends IdentityKitConfig {\n children: ReactNode\n}\n\nexport function IdentityKitProvider({\n children,\n rpcUrl,\n neynarApiKey,\n baseUrl = 'https://thurin.id',\n network = 'mainnet',\n registryAddress,\n}: IdentityKitProviderProps) {\n const config = useMemo(\n () => ({ rpcUrl, neynarApiKey, baseUrl, network, registryAddress }),\n [rpcUrl, neynarApiKey, baseUrl, network, registryAddress],\n )\n\n return (\n <IdentityKitContext.Provider value={config}>\n <WagmiDetector rpcUrl={rpcUrl} network={network}>\n {children}\n </WagmiDetector>\n </IdentityKitContext.Provider>\n )\n}\n","// Generated from pgp-registry: `forge inspect PGPRegistry abi --json`. Do not edit by hand.\nexport const REGISTRY_ABI = [\n {\n \"type\": \"function\",\n \"name\": \"ATTEST_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"DOMAIN_SEPARATOR\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"EIP712_NAME\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\",\n \"internalType\": \"string\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"EIP712_VERSION\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"string\",\n \"internalType\": \"string\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"MAX_KEY_BYTES\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"MAX_RECORD_BYTES\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"MAX_SIG_BYTES\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"MESSAGE_VERSION\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"REATTEST_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"REVOKE_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"SET_RECORD_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"UPDATE_KEY_TYPEHASH\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"VERSION\",\n \"inputs\": [],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"addressesFor\",\n \"inputs\": [\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"address[]\",\n \"internalType\": \"address[]\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"addressesForCount\",\n \"inputs\": [\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"addressesForRange\",\n \"inputs\": [\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"start\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"count\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"out\",\n \"type\": \"address[]\",\n \"internalType\": \"address[]\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attest\",\n \"inputs\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attestFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attestationCount\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attestationsOf\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct PGPRegistry.Attestation[]\",\n \"components\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"createdAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"revokedAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"attestationsOfRange\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"start\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"count\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"out\",\n \"type\": \"tuple[]\",\n \"internalType\": \"struct PGPRegistry.Attestation[]\",\n \"components\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"createdAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"revokedAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"cancelAuthorization\",\n \"inputs\": [],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"current\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"found\",\n \"type\": \"bool\",\n \"internalType\": \"bool\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"attestation\",\n \"type\": \"tuple\",\n \"internalType\": \"struct PGPRegistry.Attestation\",\n \"components\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"createdAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"revokedAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"fingerprintsForKeyId\",\n \"inputs\": [\n {\n \"name\": \"keyId\",\n \"type\": \"bytes8\",\n \"internalType\": \"bytes8\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes[]\",\n \"internalType\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"fingerprintsForKeyIdCount\",\n \"inputs\": [\n {\n \"name\": \"keyId\",\n \"type\": \"bytes8\",\n \"internalType\": \"bytes8\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"fingerprintsForKeyIdRange\",\n \"inputs\": [\n {\n \"name\": \"keyId\",\n \"type\": \"bytes8\",\n \"internalType\": \"bytes8\"\n },\n {\n \"name\": \"start\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"count\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"out\",\n \"type\": \"bytes[]\",\n \"internalType\": \"bytes[]\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getAttestation\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"tuple\",\n \"internalType\": \"struct PGPRegistry.Attestation\",\n \"components\": [\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"createdAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"revokedAt\",\n \"type\": \"uint64\",\n \"internalType\": \"uint64\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"getPayload\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"nonces\",\n \"inputs\": [\n {\n \"name\": \"\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"reattest\",\n \"inputs\": [\n {\n \"name\": \"revokeIndex\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"reattestFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"revokeIndex\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpSignature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"record\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"kind\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [\n {\n \"name\": \"\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"stateMutability\": \"view\"\n },\n {\n \"type\": \"function\",\n \"name\": \"revoke\",\n \"inputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"revokeFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"setRecord\",\n \"inputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"kind\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"value\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"setRecordFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"kind\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"value\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"updateKey\",\n \"inputs\": [\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"updateKeyFor\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"pgpPublicKey\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"deadline\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"Attested\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"indexed\": true,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"fingerprint\",\n \"type\": \"bytes\",\n \"indexed\": false,\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"messageVersion\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"keyPtr\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"sigPtr\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"submitter\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"KeyUpdated\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"indexed\": true,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"oldKeyPtr\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"newKeyPtr\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"submitter\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"NonceUsed\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"nonce\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"RecordSet\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"indexed\": true,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"kind\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"submitter\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"Revoked\",\n \"inputs\": [\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"fingerprintHash\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"index\",\n \"type\": \"uint256\",\n \"indexed\": true,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"submitter\",\n \"type\": \"address\",\n \"indexed\": false,\n \"internalType\": \"address\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"error\",\n \"name\": \"AlreadyRevoked\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"AuthorizationExpired\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"DeploymentFailed\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"DuplicateActiveFingerprint\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EmptyPublicKey\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EmptySignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"IndexOutOfBounds\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidAuthorization\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidFingerprintLength\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidPointer\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PublicKeyTooLarge\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"RecordTooLarge\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SignatureTooLarge\",\n \"inputs\": []\n }\n] as const\n","export { REGISTRY_ABI } from './abi'\n\n/**\n * PGPRegistry v2 is deployed with CREATE2, so it has the same address on every\n * network. (v1 lived at 0xf7a45BC662A78a6fb417ED5f52b3766cbf13EbBb on mainnet and\n * is no longer read by Thurin.)\n */\nexport const REGISTRY_ADDRESS = '0x9302E02e2869e129aC8516fE5eFFd51EA3082c09' as const\n\n/** Networks the PGPRegistry is deployed on. `mainnet` is the default everywhere. */\nexport type NetworkName = 'mainnet' | 'sepolia' | 'local'\n\nexport interface RegistryDeployment {\n chainId: number\n address: `0x${string}`\n /** Block the registry was deployed in (informational; v2 needs no log scans). */\n deployBlock: bigint\n /** Block explorer base URL for address/tx links. Empty when there is none. */\n explorerUrl: string\n /** Keyless public RPC used when no rpcUrl is configured. */\n defaultRpcUrl: string\n}\n\nexport const NETWORKS: Record<NetworkName, RegistryDeployment> = {\n mainnet: {\n chainId: 1,\n address: REGISTRY_ADDRESS,\n deployBlock: 25962908n, // 2026-09-12, tx 0xda4c3a19cae4e71ffb02559a048403f664d5a7967c19d42158c39600ec63bad8\n explorerUrl: 'https://etherscan.io',\n defaultRpcUrl: 'https://ethereum-rpc.publicnode.com',\n },\n sepolia: {\n chainId: 11155111,\n address: REGISTRY_ADDRESS,\n deployBlock: 11683667n, // 2026-09-11, tx 0x3e40e8f5b9fbf82a4b8943561bcc9b964b2987de10640ac8ff3a1b4ef0725322\n explorerUrl: 'https://sepolia.etherscan.io',\n defaultRpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n },\n /** A local anvil instance (`anvil`, chain id 31337). Deploy with pgp-registry's Deploy script. */\n local: {\n chainId: 31337,\n address: REGISTRY_ADDRESS,\n deployBlock: 0n,\n explorerUrl: '',\n defaultRpcUrl: 'http://127.0.0.1:8545',\n },\n}\n\nexport function isNetworkName(value: unknown): value is NetworkName {\n return value === 'mainnet' || value === 'sepolia' || value === 'local'\n}\n\n/**\n * The registry deployment for a network. `addressOverride` swaps the contract\n * address (e.g. a local deploy that landed somewhere else).\n */\nexport function getRegistry(network: NetworkName = 'mainnet', addressOverride?: string): RegistryDeployment {\n const r = NETWORKS[network]\n if (!r) throw new Error(`Unknown network: ${network}`)\n if (addressOverride && /^0x[0-9a-fA-F]{40}$/.test(addressOverride)) {\n return { ...r, address: addressOverride as `0x${string}` }\n }\n return r\n}\n","import { createContext, useContext } from 'react'\nimport type { IdentityKitConfig } from './core/types'\n\nconst defaultConfig: IdentityKitConfig = {\n baseUrl: 'https://thurin.id',\n network: 'mainnet',\n}\n\nexport const IdentityKitContext = createContext<IdentityKitConfig>(defaultConfig)\n\nexport function useIdentityKitConfig(): IdentityKitConfig {\n return useContext(IdentityKitContext)\n}\n","import { useEnsAddress, useEnsName, useEnsAvatar } from 'wagmi'\nimport { useIdentityKitConfig } from '../context'\nimport { chainFor } from '../provider'\nimport { normalize } from 'viem/ens'\nimport { useAttestations } from './useAttestations'\nimport { useEFPGraph } from './useEFPGraph'\nimport { usePGPProofs } from './usePGPProofs'\nimport type { ThurinIdentity } from '../core/types'\n\nfunction isAddress(value: string): boolean {\n return /^0x[0-9a-fA-F]{40}$/.test(value)\n}\n\nfunction safeNormalize(name: string): string | undefined {\n try {\n return normalize(name)\n } catch {\n return undefined\n }\n}\n\nexport function useThurinIdentity(ensOrAddress: string | undefined | null): ThurinIdentity {\n const chain = chainFor(useIdentityKitConfig().network)\n const isAddr = ensOrAddress ? isAddress(ensOrAddress) : false\n const ensInput = ensOrAddress && !isAddr ? safeNormalize(ensOrAddress) : undefined\n\n // Resolve ENS → address\n const { data: resolvedAddress } = useEnsAddress({\n name: ensInput,\n chainId: chain.id,\n query: { enabled: !!ensInput },\n })\n\n const address = isAddr ? ensOrAddress! : resolvedAddress ?? null\n\n // Reverse resolve address → ENS\n const { data: ensName } = useEnsName({\n address: address as `0x${string}` | undefined,\n chainId: chain.id,\n query: { enabled: !!address },\n })\n\n const displayName = ensInput || ensName || null\n\n const { data: ensAvatar } = useEnsAvatar({\n name: displayName ? safeNormalize(displayName) : undefined,\n chainId: chain.id,\n query: { enabled: !!displayName },\n })\n\n // On-chain attestations\n const {\n claims,\n totalClaims,\n activeClaims,\n currentFingerprint,\n isLoading: claimsLoading,\n } = useAttestations(address)\n\n // PGP proofs come from the key stored in the current attestation — the\n // latest claim that is active and whose signature verified (the same rule\n // useAttestations uses to pick currentFingerprint).\n const currentClaim = [...claims].reverse().find(\n (c) => !c.revoked && c.verification?.verified && c.fingerprint === currentFingerprint,\n )\n const {\n keyInfo: pgpKeyInfo,\n proofs,\n isLoading: proofsLoading,\n } = usePGPProofs(currentFingerprint, currentClaim?.pgpPublicKey ?? null)\n\n // EFP social graph\n const { efp, isLoading: efpLoading } = useEFPGraph(address)\n\n return {\n address,\n ensName: displayName,\n ensAvatar: ensAvatar ?? null,\n claims,\n totalClaims,\n activeClaims,\n currentFingerprint,\n pgpKeyInfo,\n proofs,\n efp,\n isLoading: claimsLoading || proofsLoading || efpLoading,\n error: null,\n }\n}\n","import { useReadContract, useReadContracts } from 'wagmi'\nimport { useQuery } from '@tanstack/react-query'\nimport { hexToString } from 'viem'\nimport { REGISTRY_ABI, getRegistry } from '../core/contract'\nimport { bytesToFingerprint } from '../core/fingerprint'\nimport { chainFor } from '../provider'\nimport { verifyAttestation } from '../core/pgp'\nimport { useIdentityKitConfig } from '../context'\nimport type { Attestation } from '../core/types'\n\n/**\n * On-chain attestations for an address, read straight from the v2 registry:\n * `attestationsOf` for the history, `getPayload` for each stored signature + key.\n * No event logs, so any RPC works. Each claim is verified off-chain.\n */\nexport function useAttestations(address: string | undefined | null) {\n const config = useIdentityKitConfig()\n const registry = getRegistry(config.network, config.registryAddress)\n const chain = chainFor(config.network)\n const owner = address as `0x${string}` | undefined\n\n const { data: rows, isLoading: rowsLoading } = useReadContract({\n address: registry.address,\n abi: REGISTRY_ABI,\n functionName: 'attestationsOf',\n args: owner ? [owner] : undefined,\n chainId: chain.id,\n query: { enabled: !!owner },\n })\n\n const count = rows?.length ?? 0\n\n const contracts = owner && rows\n ? rows.map((_, i) => ({\n address: registry.address,\n abi: REGISTRY_ABI,\n functionName: 'getPayload' as const,\n args: [owner, BigInt(i)] as const,\n chainId: chain.id,\n }))\n : []\n\n const { data: payloads, isLoading: payloadsLoading } = useReadContracts({\n contracts,\n query: { enabled: contracts.length > 0 },\n })\n\n const payloadsReady = count === 0 || (payloads !== undefined && payloads.length === count)\n\n const { data: claims, isLoading: verifyLoading } = useQuery({\n queryKey: ['attestations', config.network, registry.address, address, count, payloadsReady],\n queryFn: async (): Promise<Attestation[]> => {\n if (!rows || !address) return []\n const results: Attestation[] = []\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i]\n const payload = payloads?.[i]\n let pgpSignature: string | null = null\n let pgpPublicKey: string | null = null\n if (payload && payload.status === 'success') {\n const [sigHex, keyHex] = payload.result as readonly [`0x${string}`, `0x${string}`]\n pgpSignature = hexToString(sigHex)\n pgpPublicKey = hexToString(keyHex)\n }\n\n const fingerprint = bytesToFingerprint(row.fingerprint)\n const verification = pgpPublicKey && pgpSignature\n ? await verifyAttestation({ pgpPublicKey, pgpSignature, fingerprint, ethAddress: address })\n : null\n\n const revokedAt = Number(row.revokedAt)\n results.push({\n index: i,\n fingerprint,\n createdAt: Number(row.createdAt),\n revoked: revokedAt !== 0,\n revokedAt: revokedAt === 0 ? null : revokedAt,\n messageVersion: Number(row.messageVersion),\n pgpSignature,\n pgpPublicKey,\n verification,\n })\n }\n return results\n },\n enabled: !!rows && payloadsReady,\n staleTime: 300_000,\n })\n\n const isLoading = rowsLoading || payloadsLoading || verifyLoading || (!!owner && rows !== undefined && !payloadsReady)\n\n const activeClaims = (claims || []).filter((c) => !c.revoked)\n // The current identity is the latest claim that is both active and has a\n // verified signature binding the key to this address. A claim whose signature\n // has not verified must not surface the key's proofs or user data.\n const verifiedClaims = activeClaims.filter((c) => c.verification?.verified)\n const currentFingerprint = verifiedClaims.length > 0\n ? verifiedClaims[verifiedClaims.length - 1].fingerprint\n : null\n\n return {\n claims: claims || [],\n totalClaims: count,\n activeClaims: activeClaims.length,\n currentFingerprint,\n isLoading,\n }\n}\n","import { keccak256, type Hex } from 'viem'\n\n/** 40 hex chars (OpenPGP v4) or 64 hex chars (v6), spaces/0x tolerated. */\nconst FINGERPRINT_HEX = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/\n\n/** Normalize a fingerprint to lowercase hex with no prefix or spaces. Returns null if malformed. */\nexport function normalizeFingerprint(input: string): string | null {\n const hex = input.replace(/^0x/i, '').replace(/\\s+/g, '').toLowerCase()\n return FINGERPRINT_HEX.test(hex) ? hex : null\n}\n\n/** Fingerprint → the raw `bytes` argument the v2 registry takes (0x-prefixed, 20 or 32 bytes). */\nexport function fingerprintToBytes(fingerprint: string): Hex {\n const hex = normalizeFingerprint(fingerprint)\n if (!hex) throw new Error(`Invalid PGP fingerprint: ${fingerprint}`)\n return `0x${hex}`\n}\n\n/** Raw `bytes` from the registry → lowercase hex fingerprint without 0x. */\nexport function bytesToFingerprint(bytes: Hex | string): string {\n return bytes.replace(/^0x/i, '').toLowerCase()\n}\n\n/** keccak256 of the raw fingerprint bytes — the `fingerprintHash` the registry indexes by. */\nexport function fingerprintHash(fingerprint: string): Hex {\n return keccak256(fingerprintToBytes(fingerprint))\n}\n\n/**\n * The long key ID as the `bytes8` the registry indexes by. Per RFC 9580 §5.5.4 it is the\n * low-order 8 bytes of a v4 (20-byte) fingerprint and the high-order 8 bytes of a v6\n * (32-byte) fingerprint — the same value `gpg --keyid-format long` prints.\n */\nexport function keyIdOf(fingerprint: string): Hex {\n const hex = normalizeFingerprint(fingerprint)\n if (!hex) throw new Error(`Invalid PGP fingerprint: ${fingerprint}`)\n return `0x${keyIdHex(hex)}`\n}\n\n/** Long key ID (16 lowercase hex chars) of a normalized fingerprint. */\nexport function keyIdHex(normalizedFingerprint: string): string {\n return normalizedFingerprint.length === 64 ? normalizedFingerprint.slice(0, 16) : normalizedFingerprint.slice(-16)\n}\n\n/** A 16-hex long key ID (spaces/0x tolerated) → `bytes8`. */\nexport function keyIdToBytes(keyId: string): Hex | null {\n const hex = keyId.replace(/^0x/i, '').replace(/\\s+/g, '').toLowerCase()\n return /^[0-9a-f]{16}$/.test(hex) ? `0x${hex}` : null\n}\n","import type { PGPKeyInfo, PGPVerification } from './types'\n\n/**\n * openpgp.js refuses secp256k1 by default because RFC 9580 does not list the\n * curve — a compatibility choice, not a security one. A secp256k1 PGP key is a\n * valid key (and, incidentally, doubles as an Ethereum key: the address falls out\n * of the same public point). Thurin verifies signatures over any curve openpgp.js\n * can compute; whether a holder reuses such a key as a wallet is their business.\n * In Node, openpgp.js needs the optional `eckey-utils` package for this curve;\n * the browser build does not.\n *\n * The low-level packet/key methods take a *complete* config (they index into\n * it), so this builds one from the library's defaults rather than passing a\n * partial object.\n */\nfunction pgpConfig(openpgp: typeof import('openpgp')) {\n return { ...openpgp.config, rejectCurves: new Set() as Set<never> }\n}\n\n/** Human-readable algorithm for a key or subkey packet: \"Ed25519\", \"Cv25519\", \"RSA 4096\", \"NIST P-256\", … */\nfunction algorithmName(keyOrSubkey: any): string {\n try {\n const info = keyOrSubkey.getAlgorithmInfo() as { algorithm: string; bits?: number; curve?: string }\n const curve = (info.curve || '').toLowerCase()\n if (curve.startsWith('ed25519') || info.algorithm === 'ed25519' || info.algorithm === 'eddsaLegacy') return 'Ed25519'\n if (curve.startsWith('curve25519') || info.algorithm === 'x25519') return 'Cv25519'\n if (curve.startsWith('ed448')) return 'Ed448'\n if (curve.startsWith('curve448') || info.algorithm === 'x448') return 'X448'\n if (curve.startsWith('nistp') || curve.startsWith('p')) return `NIST P-${curve.replace(/\\D/g, '')}`\n if (curve.startsWith('secp')) return curve\n if (curve.startsWith('brainpool')) return curve\n if (info.algorithm.startsWith('rsa')) return info.bits ? `RSA ${info.bits}` : 'RSA'\n if (info.algorithm.startsWith('dsa')) return info.bits ? `DSA ${info.bits}` : 'DSA'\n if (info.algorithm.startsWith('elgamal')) return info.bits ? `ElGamal ${info.bits}` : 'ElGamal'\n return info.curve || info.algorithm\n } catch {\n return String(keyOrSubkey.keyPacket?.algorithm ?? 'unknown')\n }\n}\n\nexport async function parsePgpKey(armoredKey: string): Promise<PGPKeyInfo | null> {\n try {\n const openpgp = await import('openpgp')\n const { readKey } = openpgp\n const config = pgpConfig(openpgp)\n const key = await readKey({ armoredKey })\n const fingerprint = key.getFingerprint().toUpperCase()\n const algorithm = algorithmName(key)\n const created = key.keyPacket.created?.toISOString() ?? null\n const expiration = await key.getExpirationTime()\n const expires =\n expiration && expiration !== Infinity\n ? new Date(expiration as number).toISOString()\n : null\n\n // openpgp does not verify certification signatures when a key is parsed —\n // it groups them by issuer key ID only. A key's fingerprint also covers\n // only the primary key packet, not its user IDs or their certifications.\n // Each self-certification is therefore verified against the primary key\n // here before its user ID and notations are treated as authoritative.\n const userIDs: string[] = []\n const notations: { name: string; value: string }[] = []\n const seen = new Set<string>()\n for (const user of key.users) {\n const certs = (user as any).selfCertifications\n if (!certs || certs.length === 0) continue\n\n let userVerified = false\n for (const cert of certs) {\n try {\n await cert.verify(\n key.keyPacket,\n cert.signatureType,\n { userID: (user as any).userID, key: key.keyPacket },\n undefined, // date: now\n undefined, // detached\n config,\n )\n } catch {\n continue // signature not made by this key — ignore this certification\n }\n userVerified = true\n\n if (cert.rawNotations) {\n for (const n of cert.rawNotations) {\n const name =\n typeof n.name === 'string' ? n.name : new TextDecoder().decode(n.name)\n const value =\n n.value instanceof Uint8Array\n ? new TextDecoder().decode(n.value)\n : typeof n.value === 'string'\n ? n.value\n : null\n if (value) {\n // Dedupe by value alone: the same proof target is often present\n // under both proof@thurin.id and proof@ariadne.id, and should\n // surface once, not once per namespace.\n if (!seen.has(value)) {\n seen.add(value)\n notations.push({ name, value })\n }\n }\n }\n }\n }\n\n if (userVerified) {\n const uid = (user as any).userID?.userID\n if (uid) userIDs.push(uid)\n }\n }\n\n const subkeys = key.subkeys.map((sk: any) => ({\n algorithm: algorithmName(sk),\n created: sk.keyPacket.created?.toISOString() ?? null,\n fingerprint: sk.getFingerprint().toUpperCase(),\n }))\n\n return { fingerprint, userIDs, algorithm, created, expires, notations, subkeys }\n } catch {\n return null\n }\n}\n\nexport async function verifyAttestation({\n pgpPublicKey,\n pgpSignature,\n fingerprint,\n ethAddress,\n}: {\n pgpPublicKey: string | null\n pgpSignature: string | null\n fingerprint: string\n ethAddress: string\n}): Promise<PGPVerification> {\n try {\n if (!pgpPublicKey || !pgpSignature) {\n return { verified: false, reason: 'Missing PGP data' }\n }\n\n const openpgp = await import('openpgp')\n const { readKey, readCleartextMessage, LiteralDataPacket } = openpgp\n const config = pgpConfig(openpgp)\n\n const publicKey = await readKey({ armoredKey: pgpPublicKey })\n const keyFingerprint = publicKey.getFingerprint().toUpperCase()\n if (keyFingerprint !== fingerprint.toUpperCase()) {\n return { verified: false, reason: 'Key fingerprint mismatch' }\n }\n\n const message = await readCleartextMessage({ cleartextMessage: pgpSignature })\n\n // Verify the way gpg does: the key (or subkey) must be valid *now* — bound to\n // this primary, unrevoked, unexpired — and the signature must be sound. We\n // deliberately do not ask openpgp.verify(), which also demands the key was\n // valid at the instant the signature was made. Thurin's update flow tells\n // people to `export-minimal` after editing notations, which keeps only the\n // newest self-certification; when that postdates the attest signature\n // (Ben's own key, 2026-09-14: notations edited 16 minutes after signing),\n // openpgp.verify() reports \"Could not find valid self-signature\" for a\n // signature gpg verifies fine. A key that has since been revoked or expired\n // still fails here, as it should.\n // These are internals the .d.ts does not expose (the signature packet list,\n // the CRLF-normalised text, LiteralDataPacket.setText); they are stable across\n // openpgp.js 6 and exercised by the real-data tests in attestation.test.ts.\n const msg = message as any\n const now = new Date()\n let signed = false\n for (const sig of msg.signature.packets) {\n if (!publicKey.getKeys(sig.issuerKeyID).length) continue\n const signingKey = await publicKey.getSigningKey(sig.issuerKeyID, now, undefined, config)\n const literal: any = new LiteralDataPacket()\n literal.setText(msg.text ?? message.getText().replace(/\\r?\\n/g, '\\r\\n'))\n await sig.verify(signingKey.keyPacket, sig.signatureType, literal, now, true, config)\n signed = true\n break\n }\n if (!signed) return { verified: false, reason: 'Message is not signed by this key' }\n\n const signedText = message.getText()\n if (!signedText.toLowerCase().includes(ethAddress.toLowerCase())) {\n return { verified: false, reason: 'Signed message does not contain ETH address' }\n }\n\n return { verified: true }\n } catch {\n return { verified: false, reason: 'Signature verification failed' }\n }\n}\n\nexport interface StrippedKey {\n /** Armored public key containing only the non-email user IDs. */\n armored: string\n /** User IDs kept (no `@`). */\n kept: string[]\n /** User IDs removed (contained an `@`). */\n removed: string[]\n}\n\nconst EMAIL_UID = /@/\n\n/**\n * Remove every user ID that contains an email address, keeping the rest (and\n * their self-certifications, so proof notations on a non-email user ID survive).\n * Returns null when nothing would remain — openpgp needs at least one\n * self-certified user ID to verify signatures, so such a key must not be\n * published. The key material and subkeys are untouched; the fingerprint is\n * unchanged.\n */\nexport async function stripEmailUserIDs(armoredKey: string): Promise<StrippedKey | null> {\n try {\n const { readKey } = await import('openpgp')\n const key = await readKey({ armoredKey })\n const kept: string[] = []\n const removed: string[] = []\n const users = (key as any).users.filter((u: any) => {\n const uid: string | undefined = u.userID?.userID\n if (!uid) return false\n if (EMAIL_UID.test(uid)) { removed.push(uid); return false }\n kept.push(uid)\n return true\n })\n if (users.length === 0) return null\n ;(key as any).users = users\n return { armored: key.armor(), kept, removed }\n } catch {\n return null\n }\n}\n\n/** True when any user ID on the key contains an email address. */\nexport async function hasEmailUserID(armoredKey: string): Promise<boolean> {\n try {\n const { readKey } = await import('openpgp')\n const key = await readKey({ armoredKey })\n return (key as any).users.some((u: any) => EMAIL_UID.test(u.userID?.userID ?? ''))\n } catch {\n return false\n }\n}\n\nconst KEYSERVER_BASE = 'https://keys.openpgp.org/vks/v1'\n\nexport async function fetchKeyByFingerprint(fingerprint: string): Promise<string | null> {\n try {\n const resp = await fetch(`${KEYSERVER_BASE}/by-fingerprint/${fingerprint}`)\n if (!resp.ok) return null\n return await resp.text()\n } catch {\n return null\n }\n}\n\nexport async function fetchKeyByKeyId(keyId: string): Promise<string | null> {\n try {\n const resp = await fetch(`${KEYSERVER_BASE}/by-keyid/${keyId}`)\n if (!resp.ok) return null\n return await resp.text()\n } catch {\n return null\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { fetchEFPGraph } from '../core/efp'\nimport type { EFPGraph } from '../core/types'\n\nexport function useEFPGraph(address: string | undefined | null) {\n const { data, isLoading } = useQuery<EFPGraph | null>({\n queryKey: ['efp-graph', address],\n queryFn: () => fetchEFPGraph(address!),\n enabled: !!address,\n staleTime: 300_000,\n })\n\n return {\n efp: data ?? null,\n isLoading,\n }\n}\n","import type { EFPGraph } from './types'\n\nconst EFP_API = 'https://api.ethfollow.xyz/api/v1'\n\nexport async function fetchEFPGraph(address: string): Promise<EFPGraph | null> {\n try {\n const listsResp = await fetch(`${EFP_API}/users/${address}/lists`)\n if (!listsResp.ok) return null\n const listsData = await listsResp.json()\n const listId = listsData.primary_list\n if (!listId) return null\n\n const [followingResp, statsResp, top8Resp] = await Promise.all([\n fetch(`${EFP_API}/lists/${listId}/following?limit=100`),\n fetch(`${EFP_API}/users/${address}/stats`),\n fetch(`${EFP_API}/lists/${listId}/following?limit=8&tags=top8`),\n ])\n\n const followingData = followingResp.ok ? await followingResp.json() : { following: [] }\n const statsData = statsResp.ok ? await statsResp.json() : {}\n const top8Data = top8Resp.ok ? await top8Resp.json() : { following: [] }\n\n return {\n followers: parseInt(statsData.followers_count) || 0,\n following: (followingData.following || []).length,\n top8: (top8Data.following || []).map((f: any) => f.data),\n hasEfp: true,\n }\n } catch {\n return null\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { parsePgpKey } from '../core/pgp'\nimport { identifyProof, verifyProof, displayUrl, proofHref, proofSecondaryHref } from '../core/proofs'\nimport { useIdentityKitConfig } from '../context'\nimport type { PGPKeyInfo, ProofResult } from '../core/types'\n\n/**\n * Proofs for an identity, read from the PGP key stored in its on-chain\n * attestation. No keyserver is consulted: keys.openpgp.org only serves user\n * IDs whose email is verified and drops non-email user IDs entirely, so it can\n * never carry the published (non-email) identity that holds the notations.\n *\n * @param fingerprint the attested fingerprint (proofs must name it)\n * @param armoredKey the attestation's `pgpPublicKey`\n */\nexport function usePGPProofs(fingerprint: string | undefined | null, armoredKey: string | undefined | null) {\n const config = useIdentityKitConfig()\n\n const { data } = useQuery({\n // The key is large; key the query on its length + fingerprint, which\n // changes whenever a different attestation's key is supplied.\n queryKey: ['pgp-proofs', fingerprint, armoredKey?.length ?? 0],\n queryFn: async (): Promise<{ keyInfo: PGPKeyInfo | null; proofs: ProofResult[] }> => {\n if (!fingerprint || !armoredKey) return { keyInfo: null, proofs: [] }\n\n const keyInfo = await parsePgpKey(armoredKey)\n if (!keyInfo) return { keyInfo: null, proofs: [] }\n\n // Identify proofs from notations. Drop unrecognized targets (provider\n // 'unknown') so the card doesn't render \"Unknown\" badges for platforms\n // Thurin has no verifier for — matching the explorer's behavior.\n const identified = keyInfo.notations\n .map((n) => identifyProof(n))\n .filter((p): p is NonNullable<typeof p> => p !== null && p.provider !== 'unknown')\n\n // Verify all proofs in parallel\n const proofs: ProofResult[] = await Promise.all(\n identified.map(async (proof) => {\n const result = await verifyProof(proof, fingerprint, config.neynarApiKey)\n return {\n provider: proof.provider,\n label: proof.label,\n url: proof.url,\n displayUrl: displayUrl(proof),\n href: proofHref(proof),\n secondaryHref: proofSecondaryHref(proof),\n status: result.verified ? 'verified' as const : 'unverified' as const,\n reason: result.reason,\n }\n }),\n )\n\n // Collapse proofs that resolve to the same account — the same target is\n // often listed under both proof@thurin.id and proof@ariadne.id (and can\n // be reached via more than one proof URL). Key by provider + display\n // identity, preferring a verified result.\n const byAccount = new Map<string, ProofResult>()\n for (const p of proofs) {\n const key = `${p.provider}:${p.displayUrl}`\n const prev = byAccount.get(key)\n if (!prev || (p.status === 'verified' && prev.status !== 'verified')) {\n byAccount.set(key, p)\n }\n }\n\n return { keyInfo, proofs: [...byAccount.values()] }\n },\n enabled: !!fingerprint && !!armoredKey,\n staleTime: 300_000,\n })\n\n return {\n keyInfo: data?.keyInfo ?? null,\n proofs: data?.proofs ?? [],\n // Report loading whenever a fingerprint is set but its proofs haven't\n // resolved yet. Using react-query's own isLoading leaves a gap while the\n // query is enabling (fingerprint just became known), during which the card\n // would briefly paint without proof badges and then pop them in.\n isLoading: !!fingerprint && !!armoredKey && data === undefined,\n }\n}\n","import { keyIdHex } from './fingerprint'\nimport type { Notation, Proof, PGPVerification } from './types'\n\nconst PROVIDERS: {\n provider: string\n label: string\n pattern: RegExp\n parse: (m: RegExpMatchArray) => Record<string, string>\n}[] = [\n {\n provider: 'github',\n label: 'GitHub',\n pattern: /^https:\\/\\/gist\\.github\\.com\\/([^/]+)\\/([a-f0-9]+)$/i,\n parse: (m) => ({ user: m[1], gistId: m[2] }),\n },\n {\n // A repository's description — the form an organisation can use, since\n // gists belong to user accounts only. Same shape as the Codeberg proof.\n provider: 'github',\n label: 'GitHub',\n pattern: /^https:\\/\\/github\\.com\\/([A-Za-z0-9-]+)\\/([A-Za-z0-9._-]+)$/i,\n parse: (m) => ({ user: m[1], repo: m[2] }),\n },\n {\n provider: 'dns',\n label: 'DNS',\n // domain is restricted to a hostname (labels may include underscores for\n // records like _thurin.example.com); rejects slashes, userinfo, and spaces.\n pattern: /^dns:([a-z0-9._-]+)\\?type=TXT$/i,\n parse: (m) => ({ domain: m[1] }),\n },\n {\n provider: 'farcaster',\n label: 'Farcaster',\n pattern: /^https:\\/\\/farcaster\\.xyz\\/([^/]+)\\/(0x[a-f0-9]+)$/i,\n parse: (m) => ({ user: m[1], castHash: m[2] }),\n },\n {\n provider: 'codeberg',\n label: 'Codeberg',\n pattern: /^https:\\/\\/codeberg\\.org\\/([^/]+)\\/([^/]+)$/i,\n parse: (m) => ({ user: m[1], repo: m[2] }),\n },\n {\n provider: 'mastodon',\n label: 'Mastodon',\n // instance is restricted to a bare hostname (optional port) so a value\n // like \"mastodon.social@evil.com\" can't redirect the lookup elsewhere.\n pattern: /^https:\\/\\/([a-z0-9.-]+(?::\\d+)?)\\/@([^/@?#\\s]+)$/i,\n parse: (m) => ({ instance: m[1], user: m[2] }),\n },\n]\n\nexport function identifyProof(notation: Notation): Proof | null {\n if (notation.name !== 'proof@thurin.id') return null\n\n for (const { provider, label, pattern, parse } of PROVIDERS) {\n const m = notation.value.match(pattern)\n if (m) {\n return { provider, label, url: notation.value, ...parse(m) }\n }\n }\n\n return { provider: 'unknown', label: 'Unknown', url: notation.value }\n}\n\nexport function displayUrl(proof: Proof): string {\n if (proof.provider === 'dns') return proof.domain!\n if (proof.provider === 'github') return proof.user!\n if (proof.provider === 'farcaster') return `@${proof.user}`\n if (proof.provider === 'codeberg') return proof.user!\n if (proof.provider === 'mastodon') return `@${proof.user}@${proof.instance}`\n return proof.url\n}\n\nexport function proofHref(proof: Proof): string | null {\n if (proof.provider === 'dns') return `https://${proof.domain}`\n if (proof.provider === 'github') return `https://github.com/${proof.user}`\n if (proof.provider === 'farcaster') return `https://farcaster.xyz/${proof.user}`\n if (proof.provider === 'codeberg') return `https://codeberg.org/${proof.user}`\n if (proof.provider === 'mastodon') return `https://${proof.instance}/@${proof.user}`\n if (proof.url.startsWith('http')) return proof.url\n return null\n}\n\nexport function proofSecondaryHref(proof: Proof): string | null {\n if (proof.provider === 'github') return proof.url\n if (proof.provider === 'farcaster') return proof.url\n if (proof.provider === 'codeberg') return proof.url\n if (proof.provider === 'mastodon') return proof.url\n return null\n}\n\n// ─── Verification ──────────────────────────────────────────────────────────\n\nconst FPR_TOKEN = 'OPENPGP4FPR:'\n\nfunction containsFingerprint(text: string, fingerprint: string): boolean {\n return text.toUpperCase().includes(FPR_TOKEN + fingerprint.toUpperCase())\n}\n\nfunction containsFingerprintUrl(text: string, fingerprint: string): boolean {\n return text.toUpperCase().includes(fingerprint.toUpperCase())\n}\n\nasync function verifyGitHub(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n if (proof.repo) return verifyGitHubRepo(proof, fingerprint)\n try {\n const resp = await fetch(`https://api.github.com/gists/${proof.gistId}`)\n if (!resp.ok) return { verified: false, reason: `GitHub API returned ${resp.status}` }\n const data = await resp.json()\n\n // A gist is identified solely by its globally-unique ID; the username in\n // the URL is not authoritative. Confirm the gist owner matches the claimed\n // account before trusting the token it contains.\n if (data.owner?.login?.toLowerCase() !== proof.user!.toLowerCase()) {\n return { verified: false, reason: 'Gist owner does not match claimed user' }\n }\n\n for (const file of Object.values(data.files || {}) as any[]) {\n if (file.content && containsFingerprint(file.content, fingerprint)) {\n return { verified: true }\n }\n }\n return { verified: false, reason: 'Fingerprint token not found in gist' }\n } catch (err: any) {\n return { verified: false, reason: `GitHub fetch failed: ${err.message}` }\n }\n}\n\nasync function verifyGitHubRepo(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n try {\n const resp = await fetch(\n `https://api.github.com/repos/${encodeURIComponent(proof.user!)}/${encodeURIComponent(proof.repo!)}`,\n )\n if (!resp.ok) return { verified: false, reason: `GitHub API returned ${resp.status}` }\n const data = await resp.json()\n\n // GitHub follows renames and redirects, so the API may answer for a repo\n // under a different owner than the URL names. Only trust it if the owner\n // is the account being claimed.\n if (data.owner?.login?.toLowerCase() !== proof.user!.toLowerCase()) {\n return { verified: false, reason: 'Repository owner does not match claimed account' }\n }\n\n if (data.description && containsFingerprint(data.description, fingerprint)) {\n return { verified: true }\n }\n return { verified: false, reason: 'Fingerprint token not found in repository description' }\n } catch (err: any) {\n return { verified: false, reason: `GitHub fetch failed: ${err.message}` }\n }\n}\n\nasync function verifyDNS(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n try {\n const resp = await fetch(\n `https://cloudflare-dns.com/dns-query?name=${encodeURIComponent(proof.domain!)}&type=TXT`,\n { headers: { Accept: 'application/dns-json' } },\n )\n if (!resp.ok) return { verified: false, reason: `DNS query returned ${resp.status}` }\n const data = await resp.json()\n\n for (const answer of data.Answer || []) {\n // TXT records only (type 16) — a CNAME or other record in the resolution\n // chain must not be eligible to match the token.\n if (answer.type !== 16) continue\n if (answer.data && containsFingerprint(answer.data, fingerprint)) {\n return { verified: true }\n }\n }\n return { verified: false, reason: 'Fingerprint token not found in TXT records' }\n } catch (err: any) {\n return { verified: false, reason: `DNS fetch failed: ${err.message}` }\n }\n}\n\nconst NEYNAR_HUB = 'https://hub-api.neynar.com'\n\nasync function resolveFid(\n username: string,\n apiKey: string,\n): Promise<number | null> {\n const resp = await fetch(\n `${NEYNAR_HUB}/v1/userNameProofByName?name=${encodeURIComponent(username)}`,\n { headers: { 'x-api-key': apiKey } },\n )\n if (!resp.ok) return null\n const data = await resp.json()\n return data.fid ?? null\n}\n\nasync function verifyFarcaster(\n proof: Proof,\n fingerprint: string,\n neynarApiKey?: string,\n): Promise<PGPVerification> {\n if (!neynarApiKey) {\n return { verified: false, reason: 'Farcaster verification requires a Neynar API key' }\n }\n\n try {\n const fid = await resolveFid(proof.user!, neynarApiKey)\n if (!fid) return { verified: false, reason: `Could not resolve Farcaster user \"${proof.user}\"` }\n\n const headers = { 'x-api-key': neynarApiKey }\n let pageToken = ''\n for (let page = 0; page < 5; page++) {\n const url = `${NEYNAR_HUB}/v1/castsByFid?fid=${fid}&pageSize=100&reverse=true${pageToken ? `&pageToken=${pageToken}` : ''}`\n const resp = await fetch(url, { headers })\n if (!resp.ok) return { verified: false, reason: `Farcaster Hub returned ${resp.status}` }\n const data = await resp.json()\n\n for (const msg of data.messages || []) {\n if (msg.hash && msg.hash.startsWith(proof.castHash!)) {\n const text = msg.data?.castAddBody?.text || ''\n if (containsFingerprint(text, fingerprint)) {\n return { verified: true }\n }\n // A short cast-hash prefix can match multiple casts; keep scanning\n // rather than stopping at the first prefix match without the token.\n }\n }\n\n if (!data.nextPageToken) break\n pageToken = data.nextPageToken\n }\n\n return { verified: false, reason: 'Cast not found' }\n } catch (err: any) {\n return { verified: false, reason: `Farcaster fetch failed: ${err.message}` }\n }\n}\n\nasync function verifyCodeberg(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n try {\n const resp = await fetch(\n `https://codeberg.org/api/v1/repos/${encodeURIComponent(proof.user!)}/${encodeURIComponent(proof.repo!)}`,\n )\n if (!resp.ok) return { verified: false, reason: `Codeberg API returned ${resp.status}` }\n const data = await resp.json()\n\n if (data.description && containsFingerprint(data.description, fingerprint)) {\n return { verified: true }\n }\n\n return { verified: false, reason: 'Fingerprint token not found in repo description' }\n } catch (err: any) {\n return { verified: false, reason: `Codeberg fetch failed: ${err.message}` }\n }\n}\n\nasync function verifyMastodon(proof: Proof, fingerprint: string): Promise<PGPVerification> {\n try {\n // The instance host is user-supplied and interpolated into the request URL,\n // so restrict it to a bare hostname (optional port) before use — otherwise a\n // value such as \"mastodon.social@evil.com\" would send the lookup to another\n // server while still displaying as a legitimate handle.\n if (!proof.instance || !/^[a-z0-9.-]+(?::\\d+)?$/i.test(proof.instance)) {\n return { verified: false, reason: 'Invalid Mastodon instance host' }\n }\n const resp = await fetch(\n `https://${proof.instance}/api/v1/accounts/lookup?acct=${encodeURIComponent(proof.user!)}`,\n )\n if (!resp.ok) return { verified: false, reason: `Mastodon API returned ${resp.status}` }\n const data = await resp.json()\n\n const keyId = keyIdHex(fingerprint.replace(/^0x/i, '').replace(/\\s+/g, '').toLowerCase())\n\n for (const field of data.fields || []) {\n const text = field.value.replace(/<[^>]*>/g, '')\n if (containsFingerprintUrl(text, fingerprint) || containsFingerprintUrl(text, keyId)) {\n return { verified: true }\n }\n }\n\n if (data.note) {\n const text = data.note.replace(/<[^>]*>/g, '')\n if (containsFingerprintUrl(text, fingerprint) || containsFingerprintUrl(text, keyId)) {\n return { verified: true }\n }\n }\n\n return { verified: false, reason: 'Fingerprint not found in profile fields or bio' }\n } catch (err: any) {\n return { verified: false, reason: `Mastodon fetch failed: ${err.message}` }\n }\n}\n\ntype Verifier = (proof: Proof, fingerprint: string, neynarApiKey?: string) => Promise<PGPVerification>\n\nconst verifiers: Record<string, Verifier> = {\n github: verifyGitHub,\n dns: verifyDNS,\n farcaster: verifyFarcaster,\n codeberg: verifyCodeberg,\n mastodon: verifyMastodon,\n}\n\nexport async function verifyProof(\n proof: Proof,\n fingerprint: string,\n neynarApiKey?: string,\n): Promise<PGPVerification> {\n const fn = verifiers[proof.provider]\n if (!fn) return { verified: false, reason: 'Unknown provider' }\n return fn(proof, fingerprint, neynarApiKey)\n}\n","import { useThurinIdentity } from '../../hooks/useThurinIdentity'\nimport { useIdentityKitConfig } from '../../context'\nimport type { Theme } from '../../core/types'\nimport '../../themes/index.css'\nimport './ThurinCard.css'\n\nfunction ThurinLogo() {\n return (\n <svg className=\"thurin-card-avatar-placeholder\" viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"50\" cy=\"50\" r=\"50\" fill=\"var(--thurin-surface-deep)\" />\n <path d=\"M25 80 Q25 25 50 25 Q75 25 75 50\" fill=\"none\" stroke=\"#7c9a3e\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M33 75 Q33 35 50 35 Q67 35 67 52\" fill=\"none\" stroke=\"#7c9a3e\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M41 70 Q41 45 50 45 Q59 45 59 55\" fill=\"none\" stroke=\"#c9a227\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n <path d=\"M50 65 L50 53\" fill=\"none\" stroke=\"#c9a227\" strokeWidth=\"4\" strokeLinecap=\"round\"/>\n </svg>\n )\n}\n\nexport interface ThurinCardProps {\n ens?: string\n address?: string\n theme?: Theme\n}\n\nexport function ThurinCard({ ens, address, theme = 'thurin' }: ThurinCardProps) {\n const input = ens || address\n const identity = useThurinIdentity(input)\n const config = useIdentityKitConfig()\n\n const profileUrl = identity.address\n ? `${config.baseUrl}/eth/${identity.address}`\n : ens\n ? `${config.baseUrl}/ens/${ens}`\n : null\n\n if (identity.isLoading) {\n return (\n <div className=\"thurin-card\" data-thurin-theme={theme}>\n <div className=\"thurin-card-loading\">Loading identity...</div>\n </div>\n )\n }\n\n const displayAddress = identity.address || null\n\n const verifiedProofs = identity.proofs.filter((p) => p.status === 'verified').length\n const hasVerifiedPgp = identity.claims.some((c) => c.verification?.verified && !c.revoked)\n\n return (\n <div className=\"thurin-card\" data-thurin-theme={theme}>\n <a className=\"thurin-card-header\" href={profileUrl || undefined} target=\"_blank\" rel=\"noopener noreferrer\">\n {identity.ensAvatar ? (\n <img\n className=\"thurin-card-avatar\"\n src={identity.ensAvatar}\n alt={identity.ensName || ''}\n />\n ) : (\n <ThurinLogo />\n )}\n <div>\n {identity.ensName && (\n <div className=\"thurin-card-name\">{identity.ensName}</div>\n )}\n {displayAddress && (\n <div className=\"thurin-card-address\">{displayAddress}</div>\n )}\n </div>\n </a>\n\n <div className=\"thurin-card-stats\">\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">{identity.activeClaims}</span>\n <span className=\"thurin-card-stat-label\">Attestations</span>\n </div>\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">{verifiedProofs}</span>\n <span className=\"thurin-card-stat-label\">Proofs</span>\n </div>\n <div className=\"thurin-card-stat\">\n <span className=\"thurin-card-stat-value\">\n {identity.efp?.followers ?? 0}\n </span>\n <span className=\"thurin-card-stat-label\">Followers</span>\n </div>\n </div>\n\n <div className=\"thurin-card-badges\">\n {hasVerifiedPgp && (\n <span className=\"thurin-card-badge thurin-card-badge--verified\">PGP Verified</span>\n )}\n {identity.efp?.hasEfp && (\n <span className=\"thurin-card-badge thurin-card-badge--verified\">EFP</span>\n )}\n {identity.proofs.map((p, i) => (\n <span\n key={i}\n className={`thurin-card-badge thurin-card-badge--${p.status === 'verified' ? 'verified' : 'unverified'}`}\n >\n {p.label}\n </span>\n ))}\n </div>\n\n {profileUrl && (\n <a\n className=\"thurin-card-link\"\n href={profileUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n View on Thurin\n </a>\n )}\n </div>\n )\n}\n","import { hashTypedData, keccak256, stringToHex, type Hex, type TypedDataDomain } from 'viem'\nimport { fingerprintToBytes } from './fingerprint'\n\n/**\n * EIP-712 authorizations for the registry's relayed writes (`attestFor`, `reattestFor`,\n * `updateKeyFor`, `revokeFor`, `setRecordFor`). The owner signs one of these typed\n * structs; anyone can then submit the matching call and pay the gas. Every field is\n * bound, plus the owner's current `nonce` (read with `nonces(owner)`) and a `deadline`.\n *\n * The domain includes the chain id, so an authorization for one network cannot be\n * replayed on another even though the registry has the same address everywhere.\n */\nexport const EIP712_NAME = 'Thurin PGPRegistry'\nexport const EIP712_VERSION = '2'\n\nexport function registryDomain(chainId: number, verifyingContract: Hex): TypedDataDomain {\n return { name: EIP712_NAME, version: EIP712_VERSION, chainId, verifyingContract }\n}\n\nexport const AUTHORIZATION_TYPES = {\n Attest: [\n { name: 'owner', type: 'address' },\n { name: 'fingerprint', type: 'bytes' },\n { name: 'pgpSignature', type: 'bytes' },\n { name: 'pgpPublicKey', type: 'bytes' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n Reattest: [\n { name: 'owner', type: 'address' },\n { name: 'revokeIndex', type: 'uint256' },\n { name: 'fingerprint', type: 'bytes' },\n { name: 'pgpSignature', type: 'bytes' },\n { name: 'pgpPublicKey', type: 'bytes' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n UpdateKey: [\n { name: 'owner', type: 'address' },\n { name: 'index', type: 'uint256' },\n { name: 'pgpPublicKey', type: 'bytes' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n Revoke: [\n { name: 'owner', type: 'address' },\n { name: 'index', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n SetRecord: [\n { name: 'owner', type: 'address' },\n { name: 'index', type: 'uint256' },\n { name: 'kind', type: 'bytes32' },\n { name: 'value', type: 'bytes' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const\n\nexport type AuthorizationAction = keyof typeof AUTHORIZATION_TYPES\n\ninterface Common { owner: Hex; nonce: bigint; deadline: bigint }\nexport type AttestAuthorization = Common & { fingerprint: string; pgpSignature: string; pgpPublicKey: string }\nexport type ReattestAuthorization = AttestAuthorization & { revokeIndex: bigint }\nexport type UpdateKeyAuthorization = Common & { index: bigint; pgpPublicKey: string }\nexport type RevokeAuthorization = Common & { index: bigint }\nexport type SetRecordAuthorization = Common & { index: bigint; kind: Hex; value: Hex }\n\n/**\n * Build the object to pass to viem/wagmi `signTypedData`. `fingerprint` is the hex\n * fingerprint; `pgpSignature` / `pgpPublicKey` are the armored text exactly as they\n * will be submitted (they are hashed as UTF-8 bytes).\n */\nexport function attestTypedData(chainId: number, registry: Hex, a: AttestAuthorization) {\n return {\n domain: registryDomain(chainId, registry),\n types: { Attest: AUTHORIZATION_TYPES.Attest },\n primaryType: 'Attest' as const,\n message: {\n owner: a.owner,\n fingerprint: fingerprintToBytes(a.fingerprint),\n pgpSignature: stringToHex(a.pgpSignature),\n pgpPublicKey: stringToHex(a.pgpPublicKey),\n nonce: a.nonce,\n deadline: a.deadline,\n },\n }\n}\n\nexport function reattestTypedData(chainId: number, registry: Hex, a: ReattestAuthorization) {\n const base = attestTypedData(chainId, registry, a)\n return {\n domain: base.domain,\n types: { Reattest: AUTHORIZATION_TYPES.Reattest },\n primaryType: 'Reattest' as const,\n message: { ...base.message, revokeIndex: a.revokeIndex },\n }\n}\n\nexport function updateKeyTypedData(chainId: number, registry: Hex, a: UpdateKeyAuthorization) {\n return {\n domain: registryDomain(chainId, registry),\n types: { UpdateKey: AUTHORIZATION_TYPES.UpdateKey },\n primaryType: 'UpdateKey' as const,\n message: { owner: a.owner, index: a.index, pgpPublicKey: stringToHex(a.pgpPublicKey), nonce: a.nonce, deadline: a.deadline },\n }\n}\n\nexport function revokeTypedData(chainId: number, registry: Hex, a: RevokeAuthorization) {\n return {\n domain: registryDomain(chainId, registry),\n types: { Revoke: AUTHORIZATION_TYPES.Revoke },\n primaryType: 'Revoke' as const,\n message: { owner: a.owner, index: a.index, nonce: a.nonce, deadline: a.deadline },\n }\n}\n\nexport function setRecordTypedData(chainId: number, registry: Hex, a: SetRecordAuthorization) {\n return {\n domain: registryDomain(chainId, registry),\n types: { SetRecord: AUTHORIZATION_TYPES.SetRecord },\n primaryType: 'SetRecord' as const,\n message: { owner: a.owner, index: a.index, kind: a.kind, value: a.value, nonce: a.nonce, deadline: a.deadline },\n }\n}\n\n/** The digest the registry recovers the signer from — handy for tests and CLIs. */\nexport function authorizationDigest(typedData: ReturnType<typeof attestTypedData | typeof reattestTypedData | typeof updateKeyTypedData | typeof revokeTypedData | typeof setRecordTypedData>): Hex {\n return hashTypedData(typedData as any)\n}\n\n/** `bytes32 kind` for a record from a human-readable name, e.g. recordKind('thurin.vouch'). */\nexport function recordKind(name: string): Hex {\n return keccak256(stringToHex(name))\n}\n"],"mappings":";AAAA,SAAyB,eAAe;AACxC,SAAS,eAAe,cAAc,MAAM,iBAAiB;AAC7D,SAAS,SAAS,SAAS,eAAe;;;ACDnC,IAAM,eAAe;AAAA,EAC1B;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,cAAc;AAAA,UACZ;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,cAAc;AAAA,UACZ;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,cAAc;AAAA,UACZ;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,cAAc;AAAA,UACZ;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW;AAAA,MACT;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,MACR;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AACF;;;AC/pCO,IAAM,mBAAmB;AAgBzB,IAAM,WAAoD;AAAA,EAC/D,SAAS;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA;AAAA,EAEA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,cAAc,OAAsC;AAClE,SAAO,UAAU,aAAa,UAAU,aAAa,UAAU;AACjE;AAMO,SAAS,YAAY,UAAuB,WAAW,iBAA8C;AAC1G,QAAM,IAAI,SAAS,OAAO;AAC1B,MAAI,CAAC,EAAG,OAAM,IAAI,MAAM,oBAAoB,OAAO,EAAE;AACrD,MAAI,mBAAmB,sBAAsB,KAAK,eAAe,GAAG;AAClE,WAAO,EAAE,GAAG,GAAG,SAAS,gBAAiC;AAAA,EAC3D;AACA,SAAO;AACT;;;AF1DA,SAAS,aAAa,2BAA2B;;;AGLjD,SAAS,eAAe,kBAAkB;AAG1C,IAAM,gBAAmC;AAAA,EACvC,SAAS;AAAA,EACT,SAAS;AACX;AAEO,IAAM,qBAAqB,cAAiC,aAAa;AAEzE,SAAS,uBAA0C;AACxD,SAAO,WAAW,kBAAkB;AACtC;;;AHiCW;AApCX,IAAM,qBAAqB,IAAI,YAAY;AAAA,EACzC,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAEM,SAAS,SAAS,UAAuB,WAAW;AACzD,MAAI,YAAY,UAAW,QAAO;AAClC,MAAI,YAAY,QAAS,QAAO;AAChC,SAAO;AACT;AAEA,SAAS,yBAAyB,QAA4B,SAAsB;AAClF,QAAM,MAAM,UAAU,YAAY,OAAO,EAAE;AAE3C,MAAI,YAAY,UAAW,QAAO,aAAa,EAAE,QAAQ,CAAC,OAAO,GAAG,YAAY,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;AAC7G,MAAI,YAAY,QAAS,QAAO,aAAa,EAAE,QAAQ,CAAC,OAAO,GAAG,YAAY,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;AAC3G,SAAO,aAAa,EAAE,QAAQ,CAAC,OAAO,GAAG,YAAY,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;AACpF;AAEA,SAAS,cAAc,EAAE,UAAU,QAAQ,QAAQ,GAAmE;AAEpH,MAAI,WAAW;AACf,MAAI;AACF,cAAU;AACV,eAAW;AAAA,EACb,QAAQ;AAAA,EAER;AAEA,QAAM,cAAc,QAAQ,MAAM,yBAAyB,QAAQ,OAAO,GAAG,CAAC,QAAQ,OAAO,CAAC;AAE9F,MAAI,UAAU;AACZ,WAAO,gCAAG,UAAS;AAAA,EACrB;AAEA,SACE,oBAAC,iBAAc,QAAQ,aACrB,8BAAC,uBAAoB,QAAQ,oBAC1B,UACH,GACF;AAEJ;AAMO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AAAA,EACV;AACF,GAA6B;AAC3B,QAAM,SAAS;AAAA,IACb,OAAO,EAAE,QAAQ,cAAc,SAAS,SAAS,gBAAgB;AAAA,IACjE,CAAC,QAAQ,cAAc,SAAS,SAAS,eAAe;AAAA,EAC1D;AAEA,SACE,oBAAC,mBAAmB,UAAnB,EAA4B,OAAO,QAClC,8BAAC,iBAAc,QAAgB,SAC5B,UACH,GACF;AAEJ;;;AIjFA,SAAS,eAAe,YAAY,oBAAoB;AAGxD,SAAS,iBAAiB;;;ACH1B,SAAS,iBAAiB,wBAAwB;AAClD,SAAS,gBAAgB;AACzB,SAAS,mBAAmB;;;ACF5B,SAAS,iBAA2B;AAGpC,IAAM,kBAAkB;AAGjB,SAAS,qBAAqB,OAA8B;AACjE,QAAM,MAAM,MAAM,QAAQ,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE,EAAE,YAAY;AACtE,SAAO,gBAAgB,KAAK,GAAG,IAAI,MAAM;AAC3C;AAGO,SAAS,mBAAmB,aAA0B;AAC3D,QAAM,MAAM,qBAAqB,WAAW;AAC5C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,4BAA4B,WAAW,EAAE;AACnE,SAAO,KAAK,GAAG;AACjB;AAGO,SAAS,mBAAmB,OAA6B;AAC9D,SAAO,MAAM,QAAQ,QAAQ,EAAE,EAAE,YAAY;AAC/C;AAGO,SAAS,gBAAgB,aAA0B;AACxD,SAAO,UAAU,mBAAmB,WAAW,CAAC;AAClD;AAOO,SAAS,QAAQ,aAA0B;AAChD,QAAM,MAAM,qBAAqB,WAAW;AAC5C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,4BAA4B,WAAW,EAAE;AACnE,SAAO,KAAK,SAAS,GAAG,CAAC;AAC3B;AAGO,SAAS,SAAS,uBAAuC;AAC9D,SAAO,sBAAsB,WAAW,KAAK,sBAAsB,MAAM,GAAG,EAAE,IAAI,sBAAsB,MAAM,GAAG;AACnH;AAGO,SAAS,aAAa,OAA2B;AACtD,QAAM,MAAM,MAAM,QAAQ,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE,EAAE,YAAY;AACtE,SAAO,iBAAiB,KAAK,GAAG,IAAI,KAAK,GAAG,KAAK;AACnD;;;ACjCA,SAAS,UAAU,SAAmC;AACpD,SAAO,EAAE,GAAG,QAAQ,QAAQ,cAAc,oBAAI,IAAI,EAAgB;AACpE;AAGA,SAAS,cAAc,aAA0B;AAC/C,MAAI;AACF,UAAM,OAAO,YAAY,iBAAiB;AAC1C,UAAM,SAAS,KAAK,SAAS,IAAI,YAAY;AAC7C,QAAI,MAAM,WAAW,SAAS,KAAK,KAAK,cAAc,aAAa,KAAK,cAAc,cAAe,QAAO;AAC5G,QAAI,MAAM,WAAW,YAAY,KAAK,KAAK,cAAc,SAAU,QAAO;AAC1E,QAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,QAAI,MAAM,WAAW,UAAU,KAAK,KAAK,cAAc,OAAQ,QAAO;AACtE,QAAI,MAAM,WAAW,OAAO,KAAK,MAAM,WAAW,GAAG,EAAG,QAAO,UAAU,MAAM,QAAQ,OAAO,EAAE,CAAC;AACjG,QAAI,MAAM,WAAW,MAAM,EAAG,QAAO;AACrC,QAAI,MAAM,WAAW,WAAW,EAAG,QAAO;AAC1C,QAAI,KAAK,UAAU,WAAW,KAAK,EAAG,QAAO,KAAK,OAAO,OAAO,KAAK,IAAI,KAAK;AAC9E,QAAI,KAAK,UAAU,WAAW,KAAK,EAAG,QAAO,KAAK,OAAO,OAAO,KAAK,IAAI,KAAK;AAC9E,QAAI,KAAK,UAAU,WAAW,SAAS,EAAG,QAAO,KAAK,OAAO,WAAW,KAAK,IAAI,KAAK;AACtF,WAAO,KAAK,SAAS,KAAK;AAAA,EAC5B,QAAQ;AACN,WAAO,OAAO,YAAY,WAAW,aAAa,SAAS;AAAA,EAC7D;AACF;AAEA,eAAsB,YAAY,YAAgD;AAChF,MAAI;AACF,UAAM,UAAU,MAAM,OAAO,SAAS;AACtC,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,SAAS,UAAU,OAAO;AAChC,UAAM,MAAM,MAAM,QAAQ,EAAE,WAAW,CAAC;AACxC,UAAM,cAAc,IAAI,eAAe,EAAE,YAAY;AACrD,UAAM,YAAY,cAAc,GAAG;AACnC,UAAM,UAAU,IAAI,UAAU,SAAS,YAAY,KAAK;AACxD,UAAM,aAAa,MAAM,IAAI,kBAAkB;AAC/C,UAAM,UACJ,cAAc,eAAe,WACzB,IAAI,KAAK,UAAoB,EAAE,YAAY,IAC3C;AAON,UAAM,UAAoB,CAAC;AAC3B,UAAM,YAA+C,CAAC;AACtD,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,QAAQ,IAAI,OAAO;AAC5B,YAAM,QAAS,KAAa;AAC5B,UAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAElC,UAAI,eAAe;AACnB,iBAAW,QAAQ,OAAO;AACxB,YAAI;AACF,gBAAM,KAAK;AAAA,YACT,IAAI;AAAA,YACJ,KAAK;AAAA,YACL,EAAE,QAAS,KAAa,QAAQ,KAAK,IAAI,UAAU;AAAA,YACnD;AAAA;AAAA,YACA;AAAA;AAAA,YACA;AAAA,UACF;AAAA,QACF,QAAQ;AACN;AAAA,QACF;AACA,uBAAe;AAEf,YAAI,KAAK,cAAc;AACrB,qBAAW,KAAK,KAAK,cAAc;AACjC,kBAAM,OACJ,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,IAAI;AACvE,kBAAM,QACJ,EAAE,iBAAiB,aACf,IAAI,YAAY,EAAE,OAAO,EAAE,KAAK,IAChC,OAAO,EAAE,UAAU,WACjB,EAAE,QACF;AACR,gBAAI,OAAO;AAIT,kBAAI,CAAC,KAAK,IAAI,KAAK,GAAG;AACpB,qBAAK,IAAI,KAAK;AACd,0BAAU,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,cAChC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,cAAM,MAAO,KAAa,QAAQ;AAClC,YAAI,IAAK,SAAQ,KAAK,GAAG;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,QAAQ,IAAI,CAAC,QAAa;AAAA,MAC5C,WAAW,cAAc,EAAE;AAAA,MAC3B,SAAS,GAAG,UAAU,SAAS,YAAY,KAAK;AAAA,MAChD,aAAa,GAAG,eAAe,EAAE,YAAY;AAAA,IAC/C,EAAE;AAEF,WAAO,EAAE,aAAa,SAAS,WAAW,SAAS,SAAS,WAAW,QAAQ;AAAA,EACjF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBAAkB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAK6B;AAC3B,MAAI;AACF,QAAI,CAAC,gBAAgB,CAAC,cAAc;AAClC,aAAO,EAAE,UAAU,OAAO,QAAQ,mBAAmB;AAAA,IACvD;AAEA,UAAM,UAAU,MAAM,OAAO,SAAS;AACtC,UAAM,EAAE,SAAS,sBAAsB,kBAAkB,IAAI;AAC7D,UAAM,SAAS,UAAU,OAAO;AAEhC,UAAM,YAAY,MAAM,QAAQ,EAAE,YAAY,aAAa,CAAC;AAC5D,UAAM,iBAAiB,UAAU,eAAe,EAAE,YAAY;AAC9D,QAAI,mBAAmB,YAAY,YAAY,GAAG;AAChD,aAAO,EAAE,UAAU,OAAO,QAAQ,2BAA2B;AAAA,IAC/D;AAEA,UAAM,UAAU,MAAM,qBAAqB,EAAE,kBAAkB,aAAa,CAAC;AAe7E,UAAM,MAAM;AACZ,UAAM,MAAM,oBAAI,KAAK;AACrB,QAAI,SAAS;AACb,eAAW,OAAO,IAAI,UAAU,SAAS;AACvC,UAAI,CAAC,UAAU,QAAQ,IAAI,WAAW,EAAE,OAAQ;AAChD,YAAM,aAAa,MAAM,UAAU,cAAc,IAAI,aAAa,KAAK,QAAW,MAAM;AACxF,YAAM,UAAe,IAAI,kBAAkB;AAC3C,cAAQ,QAAQ,IAAI,QAAQ,QAAQ,QAAQ,EAAE,QAAQ,UAAU,MAAM,CAAC;AACvE,YAAM,IAAI,OAAO,WAAW,WAAW,IAAI,eAAe,SAAS,KAAK,MAAM,MAAM;AACpF,eAAS;AACT;AAAA,IACF;AACA,QAAI,CAAC,OAAQ,QAAO,EAAE,UAAU,OAAO,QAAQ,oCAAoC;AAEnF,UAAM,aAAa,QAAQ,QAAQ;AACnC,QAAI,CAAC,WAAW,YAAY,EAAE,SAAS,WAAW,YAAY,CAAC,GAAG;AAChE,aAAO,EAAE,UAAU,OAAO,QAAQ,8CAA8C;AAAA,IAClF;AAEA,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,UAAU,OAAO,QAAQ,gCAAgC;AAAA,EACpE;AACF;AAWA,IAAM,YAAY;AAUlB,eAAsB,kBAAkB,YAAiD;AACvF,MAAI;AACF,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,SAAS;AAC1C,UAAM,MAAM,MAAM,QAAQ,EAAE,WAAW,CAAC;AACxC,UAAM,OAAiB,CAAC;AACxB,UAAM,UAAoB,CAAC;AAC3B,UAAM,QAAS,IAAY,MAAM,OAAO,CAAC,MAAW;AAClD,YAAM,MAA0B,EAAE,QAAQ;AAC1C,UAAI,CAAC,IAAK,QAAO;AACjB,UAAI,UAAU,KAAK,GAAG,GAAG;AAAE,gBAAQ,KAAK,GAAG;AAAG,eAAO;AAAA,MAAM;AAC3D,WAAK,KAAK,GAAG;AACb,aAAO;AAAA,IACT,CAAC;AACD,QAAI,MAAM,WAAW,EAAG,QAAO;AAC9B,IAAC,IAAY,QAAQ;AACtB,WAAO,EAAE,SAAS,IAAI,MAAM,GAAG,MAAM,QAAQ;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,eAAsB,eAAe,YAAsC;AACzE,MAAI;AACF,UAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,SAAS;AAC1C,UAAM,MAAM,MAAM,QAAQ,EAAE,WAAW,CAAC;AACxC,WAAQ,IAAY,MAAM,KAAK,CAAC,MAAW,UAAU,KAAK,EAAE,QAAQ,UAAU,EAAE,CAAC;AAAA,EACnF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,iBAAiB;AAEvB,eAAsB,sBAAsB,aAA6C;AACvF,MAAI;AACF,UAAM,OAAO,MAAM,MAAM,GAAG,cAAc,mBAAmB,WAAW,EAAE;AAC1E,QAAI,CAAC,KAAK,GAAI,QAAO;AACrB,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBAAgB,OAAuC;AAC3E,MAAI;AACF,UAAM,OAAO,MAAM,MAAM,GAAG,cAAc,aAAa,KAAK,EAAE;AAC9D,QAAI,CAAC,KAAK,GAAI,QAAO;AACrB,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AFtPO,SAAS,gBAAgB,SAAoC;AAClE,QAAM,SAAS,qBAAqB;AACpC,QAAM,WAAW,YAAY,OAAO,SAAS,OAAO,eAAe;AACnE,QAAM,QAAQ,SAAS,OAAO,OAAO;AACrC,QAAM,QAAQ;AAEd,QAAM,EAAE,MAAM,MAAM,WAAW,YAAY,IAAI,gBAAgB;AAAA,IAC7D,SAAS,SAAS;AAAA,IAClB,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,QAAQ,CAAC,KAAK,IAAI;AAAA,IACxB,SAAS,MAAM;AAAA,IACf,OAAO,EAAE,SAAS,CAAC,CAAC,MAAM;AAAA,EAC5B,CAAC;AAED,QAAM,QAAQ,MAAM,UAAU;AAE9B,QAAM,YAAY,SAAS,OACvB,KAAK,IAAI,CAAC,GAAG,OAAO;AAAA,IAClB,SAAS,SAAS;AAAA,IAClB,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC;AAAA,IACvB,SAAS,MAAM;AAAA,EACjB,EAAE,IACF,CAAC;AAEL,QAAM,EAAE,MAAM,UAAU,WAAW,gBAAgB,IAAI,iBAAiB;AAAA,IACtE;AAAA,IACA,OAAO,EAAE,SAAS,UAAU,SAAS,EAAE;AAAA,EACzC,CAAC;AAED,QAAM,gBAAgB,UAAU,KAAM,aAAa,UAAa,SAAS,WAAW;AAEpF,QAAM,EAAE,MAAM,QAAQ,WAAW,cAAc,IAAI,SAAS;AAAA,IAC1D,UAAU,CAAC,gBAAgB,OAAO,SAAS,SAAS,SAAS,SAAS,OAAO,aAAa;AAAA,IAC1F,SAAS,YAAoC;AAC3C,UAAI,CAAC,QAAQ,CAAC,QAAS,QAAO,CAAC;AAC/B,YAAM,UAAyB,CAAC;AAEhC,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,MAAM,KAAK,CAAC;AAClB,cAAM,UAAU,WAAW,CAAC;AAC5B,YAAI,eAA8B;AAClC,YAAI,eAA8B;AAClC,YAAI,WAAW,QAAQ,WAAW,WAAW;AAC3C,gBAAM,CAAC,QAAQ,MAAM,IAAI,QAAQ;AACjC,yBAAe,YAAY,MAAM;AACjC,yBAAe,YAAY,MAAM;AAAA,QACnC;AAEA,cAAM,cAAc,mBAAmB,IAAI,WAAW;AACtD,cAAM,eAAe,gBAAgB,eACjC,MAAM,kBAAkB,EAAE,cAAc,cAAc,aAAa,YAAY,QAAQ,CAAC,IACxF;AAEJ,cAAM,YAAY,OAAO,IAAI,SAAS;AACtC,gBAAQ,KAAK;AAAA,UACX,OAAO;AAAA,UACP;AAAA,UACA,WAAW,OAAO,IAAI,SAAS;AAAA,UAC/B,SAAS,cAAc;AAAA,UACvB,WAAW,cAAc,IAAI,OAAO;AAAA,UACpC,gBAAgB,OAAO,IAAI,cAAc;AAAA,UACzC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,CAAC,QAAQ;AAAA,IACnB,WAAW;AAAA,EACb,CAAC;AAED,QAAM,YAAY,eAAe,mBAAmB,iBAAkB,CAAC,CAAC,SAAS,SAAS,UAAa,CAAC;AAExG,QAAM,gBAAgB,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;AAI5D,QAAM,iBAAiB,aAAa,OAAO,CAAC,MAAM,EAAE,cAAc,QAAQ;AAC1E,QAAM,qBAAqB,eAAe,SAAS,IAC/C,eAAe,eAAe,SAAS,CAAC,EAAE,cAC1C;AAEJ,SAAO;AAAA,IACL,QAAQ,UAAU,CAAC;AAAA,IACnB,aAAa;AAAA,IACb,cAAc,aAAa;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;;;AG5GA,SAAS,YAAAA,iBAAgB;;;ACEzB,IAAM,UAAU;AAEhB,eAAsB,cAAc,SAA2C;AAC7E,MAAI;AACF,UAAM,YAAY,MAAM,MAAM,GAAG,OAAO,UAAU,OAAO,QAAQ;AACjE,QAAI,CAAC,UAAU,GAAI,QAAO;AAC1B,UAAM,YAAY,MAAM,UAAU,KAAK;AACvC,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ,QAAO;AAEpB,UAAM,CAAC,eAAe,WAAW,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7D,MAAM,GAAG,OAAO,UAAU,MAAM,sBAAsB;AAAA,MACtD,MAAM,GAAG,OAAO,UAAU,OAAO,QAAQ;AAAA,MACzC,MAAM,GAAG,OAAO,UAAU,MAAM,8BAA8B;AAAA,IAChE,CAAC;AAED,UAAM,gBAAgB,cAAc,KAAK,MAAM,cAAc,KAAK,IAAI,EAAE,WAAW,CAAC,EAAE;AACtF,UAAM,YAAY,UAAU,KAAK,MAAM,UAAU,KAAK,IAAI,CAAC;AAC3D,UAAM,WAAW,SAAS,KAAK,MAAM,SAAS,KAAK,IAAI,EAAE,WAAW,CAAC,EAAE;AAEvE,WAAO;AAAA,MACL,WAAW,SAAS,UAAU,eAAe,KAAK;AAAA,MAClD,YAAY,cAAc,aAAa,CAAC,GAAG;AAAA,MAC3C,OAAO,SAAS,aAAa,CAAC,GAAG,IAAI,CAAC,MAAW,EAAE,IAAI;AAAA,MACvD,QAAQ;AAAA,IACV;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD3BO,SAAS,YAAY,SAAoC;AAC9D,QAAM,EAAE,MAAM,UAAU,IAAIC,UAA0B;AAAA,IACpD,UAAU,CAAC,aAAa,OAAO;AAAA,IAC/B,SAAS,MAAM,cAAc,OAAQ;AAAA,IACrC,SAAS,CAAC,CAAC;AAAA,IACX,WAAW;AAAA,EACb,CAAC;AAED,SAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb;AAAA,EACF;AACF;;;AEhBA,SAAS,YAAAC,iBAAgB;;;ACGzB,IAAM,YAKA;AAAA,EACJ;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;AAAA,EAC5C;AAAA,EACA;AAAA;AAAA;AAAA,IAGE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;AAAA,EAC1C;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA;AAAA;AAAA,IAGP,SAAS;AAAA,IACT,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;AAAA,EAChC;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE;AAAA,EAC9C;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;AAAA,EAC1C;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,OAAO;AAAA;AAAA;AAAA,IAGP,SAAS;AAAA,IACT,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;AAAA,EAC9C;AACF;AAEO,SAAS,cAAc,UAAkC;AAC9D,MAAI,SAAS,SAAS,kBAAmB,QAAO;AAEhD,aAAW,EAAE,UAAU,OAAO,SAAS,MAAM,KAAK,WAAW;AAC3D,UAAM,IAAI,SAAS,MAAM,MAAM,OAAO;AACtC,QAAI,GAAG;AACL,aAAO,EAAE,UAAU,OAAO,KAAK,SAAS,OAAO,GAAG,MAAM,CAAC,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,WAAW,OAAO,WAAW,KAAK,SAAS,MAAM;AACtE;AAEO,SAAS,WAAW,OAAsB;AAC/C,MAAI,MAAM,aAAa,MAAO,QAAO,MAAM;AAC3C,MAAI,MAAM,aAAa,SAAU,QAAO,MAAM;AAC9C,MAAI,MAAM,aAAa,YAAa,QAAO,IAAI,MAAM,IAAI;AACzD,MAAI,MAAM,aAAa,WAAY,QAAO,MAAM;AAChD,MAAI,MAAM,aAAa,WAAY,QAAO,IAAI,MAAM,IAAI,IAAI,MAAM,QAAQ;AAC1E,SAAO,MAAM;AACf;AAEO,SAAS,UAAU,OAA6B;AACrD,MAAI,MAAM,aAAa,MAAO,QAAO,WAAW,MAAM,MAAM;AAC5D,MAAI,MAAM,aAAa,SAAU,QAAO,sBAAsB,MAAM,IAAI;AACxE,MAAI,MAAM,aAAa,YAAa,QAAO,yBAAyB,MAAM,IAAI;AAC9E,MAAI,MAAM,aAAa,WAAY,QAAO,wBAAwB,MAAM,IAAI;AAC5E,MAAI,MAAM,aAAa,WAAY,QAAO,WAAW,MAAM,QAAQ,KAAK,MAAM,IAAI;AAClF,MAAI,MAAM,IAAI,WAAW,MAAM,EAAG,QAAO,MAAM;AAC/C,SAAO;AACT;AAEO,SAAS,mBAAmB,OAA6B;AAC9D,MAAI,MAAM,aAAa,SAAU,QAAO,MAAM;AAC9C,MAAI,MAAM,aAAa,YAAa,QAAO,MAAM;AACjD,MAAI,MAAM,aAAa,WAAY,QAAO,MAAM;AAChD,MAAI,MAAM,aAAa,WAAY,QAAO,MAAM;AAChD,SAAO;AACT;AAIA,IAAM,YAAY;AAElB,SAAS,oBAAoB,MAAc,aAA8B;AACvE,SAAO,KAAK,YAAY,EAAE,SAAS,YAAY,YAAY,YAAY,CAAC;AAC1E;AAEA,SAAS,uBAAuB,MAAc,aAA8B;AAC1E,SAAO,KAAK,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC;AAC9D;AAEA,eAAe,aAAa,OAAc,aAA+C;AACvF,MAAI,MAAM,KAAM,QAAO,iBAAiB,OAAO,WAAW;AAC1D,MAAI;AACF,UAAM,OAAO,MAAM,MAAM,gCAAgC,MAAM,MAAM,EAAE;AACvE,QAAI,CAAC,KAAK,GAAI,QAAO,EAAE,UAAU,OAAO,QAAQ,uBAAuB,KAAK,MAAM,GAAG;AACrF,UAAM,OAAO,MAAM,KAAK,KAAK;AAK7B,QAAI,KAAK,OAAO,OAAO,YAAY,MAAM,MAAM,KAAM,YAAY,GAAG;AAClE,aAAO,EAAE,UAAU,OAAO,QAAQ,yCAAyC;AAAA,IAC7E;AAEA,eAAW,QAAQ,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,GAAY;AAC3D,UAAI,KAAK,WAAW,oBAAoB,KAAK,SAAS,WAAW,GAAG;AAClE,eAAO,EAAE,UAAU,KAAK;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,EAAE,UAAU,OAAO,QAAQ,sCAAsC;AAAA,EAC1E,SAAS,KAAU;AACjB,WAAO,EAAE,UAAU,OAAO,QAAQ,wBAAwB,IAAI,OAAO,GAAG;AAAA,EAC1E;AACF;AAEA,eAAe,iBAAiB,OAAc,aAA+C;AAC3F,MAAI;AACF,UAAM,OAAO,MAAM;AAAA,MACjB,gCAAgC,mBAAmB,MAAM,IAAK,CAAC,IAAI,mBAAmB,MAAM,IAAK,CAAC;AAAA,IACpG;AACA,QAAI,CAAC,KAAK,GAAI,QAAO,EAAE,UAAU,OAAO,QAAQ,uBAAuB,KAAK,MAAM,GAAG;AACrF,UAAM,OAAO,MAAM,KAAK,KAAK;AAK7B,QAAI,KAAK,OAAO,OAAO,YAAY,MAAM,MAAM,KAAM,YAAY,GAAG;AAClE,aAAO,EAAE,UAAU,OAAO,QAAQ,kDAAkD;AAAA,IACtF;AAEA,QAAI,KAAK,eAAe,oBAAoB,KAAK,aAAa,WAAW,GAAG;AAC1E,aAAO,EAAE,UAAU,KAAK;AAAA,IAC1B;AACA,WAAO,EAAE,UAAU,OAAO,QAAQ,wDAAwD;AAAA,EAC5F,SAAS,KAAU;AACjB,WAAO,EAAE,UAAU,OAAO,QAAQ,wBAAwB,IAAI,OAAO,GAAG;AAAA,EAC1E;AACF;AAEA,eAAe,UAAU,OAAc,aAA+C;AACpF,MAAI;AACF,UAAM,OAAO,MAAM;AAAA,MACjB,6CAA6C,mBAAmB,MAAM,MAAO,CAAC;AAAA,MAC9E,EAAE,SAAS,EAAE,QAAQ,uBAAuB,EAAE;AAAA,IAChD;AACA,QAAI,CAAC,KAAK,GAAI,QAAO,EAAE,UAAU,OAAO,QAAQ,sBAAsB,KAAK,MAAM,GAAG;AACpF,UAAM,OAAO,MAAM,KAAK,KAAK;AAE7B,eAAW,UAAU,KAAK,UAAU,CAAC,GAAG;AAGtC,UAAI,OAAO,SAAS,GAAI;AACxB,UAAI,OAAO,QAAQ,oBAAoB,OAAO,MAAM,WAAW,GAAG;AAChE,eAAO,EAAE,UAAU,KAAK;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,EAAE,UAAU,OAAO,QAAQ,6CAA6C;AAAA,EACjF,SAAS,KAAU;AACjB,WAAO,EAAE,UAAU,OAAO,QAAQ,qBAAqB,IAAI,OAAO,GAAG;AAAA,EACvE;AACF;AAEA,IAAM,aAAa;AAEnB,eAAe,WACb,UACA,QACwB;AACxB,QAAM,OAAO,MAAM;AAAA,IACjB,GAAG,UAAU,gCAAgC,mBAAmB,QAAQ,CAAC;AAAA,IACzE,EAAE,SAAS,EAAE,aAAa,OAAO,EAAE;AAAA,EACrC;AACA,MAAI,CAAC,KAAK,GAAI,QAAO;AACrB,QAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,SAAO,KAAK,OAAO;AACrB;AAEA,eAAe,gBACb,OACA,aACA,cAC0B;AAC1B,MAAI,CAAC,cAAc;AACjB,WAAO,EAAE,UAAU,OAAO,QAAQ,mDAAmD;AAAA,EACvF;AAEA,MAAI;AACF,UAAM,MAAM,MAAM,WAAW,MAAM,MAAO,YAAY;AACtD,QAAI,CAAC,IAAK,QAAO,EAAE,UAAU,OAAO,QAAQ,qCAAqC,MAAM,IAAI,IAAI;AAE/F,UAAM,UAAU,EAAE,aAAa,aAAa;AAC5C,QAAI,YAAY;AAChB,aAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,YAAM,MAAM,GAAG,UAAU,sBAAsB,GAAG,6BAA6B,YAAY,cAAc,SAAS,KAAK,EAAE;AACzH,YAAM,OAAO,MAAM,MAAM,KAAK,EAAE,QAAQ,CAAC;AACzC,UAAI,CAAC,KAAK,GAAI,QAAO,EAAE,UAAU,OAAO,QAAQ,0BAA0B,KAAK,MAAM,GAAG;AACxF,YAAM,OAAO,MAAM,KAAK,KAAK;AAE7B,iBAAW,OAAO,KAAK,YAAY,CAAC,GAAG;AACrC,YAAI,IAAI,QAAQ,IAAI,KAAK,WAAW,MAAM,QAAS,GAAG;AACpD,gBAAM,OAAO,IAAI,MAAM,aAAa,QAAQ;AAC5C,cAAI,oBAAoB,MAAM,WAAW,GAAG;AAC1C,mBAAO,EAAE,UAAU,KAAK;AAAA,UAC1B;AAAA,QAGF;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,cAAe;AACzB,kBAAY,KAAK;AAAA,IACnB;AAEA,WAAO,EAAE,UAAU,OAAO,QAAQ,iBAAiB;AAAA,EACrD,SAAS,KAAU;AACjB,WAAO,EAAE,UAAU,OAAO,QAAQ,2BAA2B,IAAI,OAAO,GAAG;AAAA,EAC7E;AACF;AAEA,eAAe,eAAe,OAAc,aAA+C;AACzF,MAAI;AACF,UAAM,OAAO,MAAM;AAAA,MACjB,qCAAqC,mBAAmB,MAAM,IAAK,CAAC,IAAI,mBAAmB,MAAM,IAAK,CAAC;AAAA,IACzG;AACA,QAAI,CAAC,KAAK,GAAI,QAAO,EAAE,UAAU,OAAO,QAAQ,yBAAyB,KAAK,MAAM,GAAG;AACvF,UAAM,OAAO,MAAM,KAAK,KAAK;AAE7B,QAAI,KAAK,eAAe,oBAAoB,KAAK,aAAa,WAAW,GAAG;AAC1E,aAAO,EAAE,UAAU,KAAK;AAAA,IAC1B;AAEA,WAAO,EAAE,UAAU,OAAO,QAAQ,kDAAkD;AAAA,EACtF,SAAS,KAAU;AACjB,WAAO,EAAE,UAAU,OAAO,QAAQ,0BAA0B,IAAI,OAAO,GAAG;AAAA,EAC5E;AACF;AAEA,eAAe,eAAe,OAAc,aAA+C;AACzF,MAAI;AAKF,QAAI,CAAC,MAAM,YAAY,CAAC,0BAA0B,KAAK,MAAM,QAAQ,GAAG;AACtE,aAAO,EAAE,UAAU,OAAO,QAAQ,iCAAiC;AAAA,IACrE;AACA,UAAM,OAAO,MAAM;AAAA,MACjB,WAAW,MAAM,QAAQ,gCAAgC,mBAAmB,MAAM,IAAK,CAAC;AAAA,IAC1F;AACA,QAAI,CAAC,KAAK,GAAI,QAAO,EAAE,UAAU,OAAO,QAAQ,yBAAyB,KAAK,MAAM,GAAG;AACvF,UAAM,OAAO,MAAM,KAAK,KAAK;AAE7B,UAAM,QAAQ,SAAS,YAAY,QAAQ,QAAQ,EAAE,EAAE,QAAQ,QAAQ,EAAE,EAAE,YAAY,CAAC;AAExF,eAAW,SAAS,KAAK,UAAU,CAAC,GAAG;AACrC,YAAM,OAAO,MAAM,MAAM,QAAQ,YAAY,EAAE;AAC/C,UAAI,uBAAuB,MAAM,WAAW,KAAK,uBAAuB,MAAM,KAAK,GAAG;AACpF,eAAO,EAAE,UAAU,KAAK;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,KAAK,MAAM;AACb,YAAM,OAAO,KAAK,KAAK,QAAQ,YAAY,EAAE;AAC7C,UAAI,uBAAuB,MAAM,WAAW,KAAK,uBAAuB,MAAM,KAAK,GAAG;AACpF,eAAO,EAAE,UAAU,KAAK;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,OAAO,QAAQ,iDAAiD;AAAA,EACrF,SAAS,KAAU;AACjB,WAAO,EAAE,UAAU,OAAO,QAAQ,0BAA0B,IAAI,OAAO,GAAG;AAAA,EAC5E;AACF;AAIA,IAAM,YAAsC;AAAA,EAC1C,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AACZ;AAEA,eAAsB,YACpB,OACA,aACA,cAC0B;AAC1B,QAAM,KAAK,UAAU,MAAM,QAAQ;AACnC,MAAI,CAAC,GAAI,QAAO,EAAE,UAAU,OAAO,QAAQ,mBAAmB;AAC9D,SAAO,GAAG,OAAO,aAAa,YAAY;AAC5C;;;ADpSO,SAAS,aAAa,aAAwC,YAAuC;AAC1G,QAAM,SAAS,qBAAqB;AAEpC,QAAM,EAAE,KAAK,IAAIC,UAAS;AAAA;AAAA;AAAA,IAGxB,UAAU,CAAC,cAAc,aAAa,YAAY,UAAU,CAAC;AAAA,IAC7D,SAAS,YAA4E;AACnF,UAAI,CAAC,eAAe,CAAC,WAAY,QAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAEpE,YAAM,UAAU,MAAM,YAAY,UAAU;AAC5C,UAAI,CAAC,QAAS,QAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAKjD,YAAM,aAAa,QAAQ,UACxB,IAAI,CAAC,MAAM,cAAc,CAAC,CAAC,EAC3B,OAAO,CAAC,MAAkC,MAAM,QAAQ,EAAE,aAAa,SAAS;AAGnF,YAAM,SAAwB,MAAM,QAAQ;AAAA,QAC1C,WAAW,IAAI,OAAO,UAAU;AAC9B,gBAAM,SAAS,MAAM,YAAY,OAAO,aAAa,OAAO,YAAY;AACxE,iBAAO;AAAA,YACL,UAAU,MAAM;AAAA,YAChB,OAAO,MAAM;AAAA,YACb,KAAK,MAAM;AAAA,YACX,YAAY,WAAW,KAAK;AAAA,YAC5B,MAAM,UAAU,KAAK;AAAA,YACrB,eAAe,mBAAmB,KAAK;AAAA,YACvC,QAAQ,OAAO,WAAW,aAAsB;AAAA,YAChD,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF,CAAC;AAAA,MACH;AAMA,YAAM,YAAY,oBAAI,IAAyB;AAC/C,iBAAW,KAAK,QAAQ;AACtB,cAAM,MAAM,GAAG,EAAE,QAAQ,IAAI,EAAE,UAAU;AACzC,cAAM,OAAO,UAAU,IAAI,GAAG;AAC9B,YAAI,CAAC,QAAS,EAAE,WAAW,cAAc,KAAK,WAAW,YAAa;AACpE,oBAAU,IAAI,KAAK,CAAC;AAAA,QACtB;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,QAAQ,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE;AAAA,IACpD;AAAA,IACA,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC;AAAA,IAC5B,WAAW;AAAA,EACb,CAAC;AAED,SAAO;AAAA,IACL,SAAS,MAAM,WAAW;AAAA,IAC1B,QAAQ,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKzB,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,cAAc,SAAS;AAAA,EACvD;AACF;;;ANvEA,SAAS,UAAU,OAAwB;AACzC,SAAO,sBAAsB,KAAK,KAAK;AACzC;AAEA,SAAS,cAAc,MAAkC;AACvD,MAAI;AACF,WAAO,UAAU,IAAI;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,cAAyD;AACzF,QAAM,QAAQ,SAAS,qBAAqB,EAAE,OAAO;AACrD,QAAM,SAAS,eAAe,UAAU,YAAY,IAAI;AACxD,QAAM,WAAW,gBAAgB,CAAC,SAAS,cAAc,YAAY,IAAI;AAGzE,QAAM,EAAE,MAAM,gBAAgB,IAAI,cAAc;AAAA,IAC9C,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IACf,OAAO,EAAE,SAAS,CAAC,CAAC,SAAS;AAAA,EAC/B,CAAC;AAED,QAAM,UAAU,SAAS,eAAgB,mBAAmB;AAG5D,QAAM,EAAE,MAAM,QAAQ,IAAI,WAAW;AAAA,IACnC;AAAA,IACA,SAAS,MAAM;AAAA,IACf,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ;AAAA,EAC9B,CAAC;AAED,QAAM,cAAc,YAAY,WAAW;AAE3C,QAAM,EAAE,MAAM,UAAU,IAAI,aAAa;AAAA,IACvC,MAAM,cAAc,cAAc,WAAW,IAAI;AAAA,IACjD,SAAS,MAAM;AAAA,IACf,OAAO,EAAE,SAAS,CAAC,CAAC,YAAY;AAAA,EAClC,CAAC;AAGD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,IAAI,gBAAgB,OAAO;AAK3B,QAAM,eAAe,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE;AAAA,IACzC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,YAAY,EAAE,gBAAgB;AAAA,EACrE;AACA,QAAM;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA,WAAW;AAAA,EACb,IAAI,aAAa,oBAAoB,cAAc,gBAAgB,IAAI;AAGvE,QAAM,EAAE,KAAK,WAAW,WAAW,IAAI,YAAY,OAAO;AAE1D,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,WAAW,aAAa;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,iBAAiB,iBAAiB;AAAA,IAC7C,OAAO;AAAA,EACT;AACF;;;AQhFI,SACE,OAAAC,MADF;AAFJ,SAAS,aAAa;AACpB,SACE,qBAAC,SAAI,WAAU,kCAAiC,SAAQ,eAAc,OAAM,8BAC1E;AAAA,oBAAAA,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,8BAA6B;AAAA,IACjE,gBAAAA,KAAC,UAAK,GAAE,oCAAmC,MAAK,QAAO,QAAO,WAAU,aAAY,KAAI,eAAc,SAAO;AAAA,IAC7G,gBAAAA,KAAC,UAAK,GAAE,oCAAmC,MAAK,QAAO,QAAO,WAAU,aAAY,KAAI,eAAc,SAAO;AAAA,IAC7G,gBAAAA,KAAC,UAAK,GAAE,oCAAmC,MAAK,QAAO,QAAO,WAAU,aAAY,KAAI,eAAc,SAAO;AAAA,IAC7G,gBAAAA,KAAC,UAAK,GAAE,iBAAgB,MAAK,QAAO,QAAO,WAAU,aAAY,KAAI,eAAc,SAAO;AAAA,KAC5F;AAEJ;AAQO,SAAS,WAAW,EAAE,KAAK,SAAS,QAAQ,SAAS,GAAoB;AAC9E,QAAM,QAAQ,OAAO;AACrB,QAAM,WAAW,kBAAkB,KAAK;AACxC,QAAM,SAAS,qBAAqB;AAEpC,QAAM,aAAa,SAAS,UACxB,GAAG,OAAO,OAAO,QAAQ,SAAS,OAAO,KACzC,MACE,GAAG,OAAO,OAAO,QAAQ,GAAG,KAC5B;AAEN,MAAI,SAAS,WAAW;AACtB,WACE,gBAAAA,KAAC,SAAI,WAAU,eAAc,qBAAmB,OAC9C,0BAAAA,KAAC,SAAI,WAAU,uBAAsB,iCAAmB,GAC1D;AAAA,EAEJ;AAEA,QAAM,iBAAiB,SAAS,WAAW;AAE3C,QAAM,iBAAiB,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE;AAC9E,QAAM,iBAAiB,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,cAAc,YAAY,CAAC,EAAE,OAAO;AAEzF,SACE,qBAAC,SAAI,WAAU,eAAc,qBAAmB,OAC9C;AAAA,yBAAC,OAAE,WAAU,sBAAqB,MAAM,cAAc,QAAW,QAAO,UAAS,KAAI,uBAClF;AAAA,eAAS,YACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,KAAK,SAAS;AAAA,UACd,KAAK,SAAS,WAAW;AAAA;AAAA,MAC3B,IAEA,gBAAAA,KAAC,cAAW;AAAA,MAEd,qBAAC,SACE;AAAA,iBAAS,WACR,gBAAAA,KAAC,SAAI,WAAU,oBAAoB,mBAAS,SAAQ;AAAA,QAErD,kBACC,gBAAAA,KAAC,SAAI,WAAU,uBAAuB,0BAAe;AAAA,SAEzD;AAAA,OACF;AAAA,IAEA,qBAAC,SAAI,WAAU,qBACb;AAAA,2BAAC,SAAI,WAAU,oBACb;AAAA,wBAAAA,KAAC,UAAK,WAAU,0BAA0B,mBAAS,cAAa;AAAA,QAChE,gBAAAA,KAAC,UAAK,WAAU,0BAAyB,0BAAY;AAAA,SACvD;AAAA,MACA,qBAAC,SAAI,WAAU,oBACb;AAAA,wBAAAA,KAAC,UAAK,WAAU,0BAA0B,0BAAe;AAAA,QACzD,gBAAAA,KAAC,UAAK,WAAU,0BAAyB,oBAAM;AAAA,SACjD;AAAA,MACA,qBAAC,SAAI,WAAU,oBACb;AAAA,wBAAAA,KAAC,UAAK,WAAU,0BACb,mBAAS,KAAK,aAAa,GAC9B;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,0BAAyB,uBAAS;AAAA,SACpD;AAAA,OACF;AAAA,IAEA,qBAAC,SAAI,WAAU,sBACZ;AAAA,wBACC,gBAAAA,KAAC,UAAK,WAAU,iDAAgD,0BAAY;AAAA,MAE7E,SAAS,KAAK,UACb,gBAAAA,KAAC,UAAK,WAAU,iDAAgD,iBAAG;AAAA,MAEpE,SAAS,OAAO,IAAI,CAAC,GAAG,MACvB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,wCAAwC,EAAE,WAAW,aAAa,aAAa,YAAY;AAAA,UAErG,YAAE;AAAA;AAAA,QAHE;AAAA,MAIP,CACD;AAAA,OACH;AAAA,IAEC,cACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,MAAM;AAAA,QACN,QAAO;AAAA,QACP,KAAI;AAAA,QACL;AAAA;AAAA,IAED;AAAA,KAEJ;AAEJ;;;ACpHA,SAAS,eAAe,aAAAC,YAAW,mBAAmD;AAY/E,IAAM,cAAc;AACpB,IAAM,iBAAiB;AAEvB,SAAS,eAAe,SAAiB,mBAAyC;AACvF,SAAO,EAAE,MAAM,aAAa,SAAS,gBAAgB,SAAS,kBAAkB;AAClF;AAEO,IAAM,sBAAsB;AAAA,EACjC,QAAQ;AAAA,IACN,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,eAAe,MAAM,QAAQ;AAAA,IACrC,EAAE,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IACtC,EAAE,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IACtC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,EACtC;AAAA,EACA,UAAU;AAAA,IACR,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,IACvC,EAAE,MAAM,eAAe,MAAM,QAAQ;AAAA,IACrC,EAAE,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IACtC,EAAE,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IACtC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,EACtC;AAAA,EACA,WAAW;AAAA,IACT,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,gBAAgB,MAAM,QAAQ;AAAA,IACtC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,EACtC;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,EACtC;AAAA,EACA,WAAW;AAAA,IACT,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC,EAAE,MAAM,SAAS,MAAM,QAAQ;AAAA,IAC/B,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,EACtC;AACF;AAgBO,SAAS,gBAAgB,SAAiB,UAAe,GAAwB;AACtF,SAAO;AAAA,IACL,QAAQ,eAAe,SAAS,QAAQ;AAAA,IACxC,OAAO,EAAE,QAAQ,oBAAoB,OAAO;AAAA,IAC5C,aAAa;AAAA,IACb,SAAS;AAAA,MACP,OAAO,EAAE;AAAA,MACT,aAAa,mBAAmB,EAAE,WAAW;AAAA,MAC7C,cAAc,YAAY,EAAE,YAAY;AAAA,MACxC,cAAc,YAAY,EAAE,YAAY;AAAA,MACxC,OAAO,EAAE;AAAA,MACT,UAAU,EAAE;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,SAAiB,UAAe,GAA0B;AAC1F,QAAM,OAAO,gBAAgB,SAAS,UAAU,CAAC;AACjD,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,OAAO,EAAE,UAAU,oBAAoB,SAAS;AAAA,IAChD,aAAa;AAAA,IACb,SAAS,EAAE,GAAG,KAAK,SAAS,aAAa,EAAE,YAAY;AAAA,EACzD;AACF;AAEO,SAAS,mBAAmB,SAAiB,UAAe,GAA2B;AAC5F,SAAO;AAAA,IACL,QAAQ,eAAe,SAAS,QAAQ;AAAA,IACxC,OAAO,EAAE,WAAW,oBAAoB,UAAU;AAAA,IAClD,aAAa;AAAA,IACb,SAAS,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,cAAc,YAAY,EAAE,YAAY,GAAG,OAAO,EAAE,OAAO,UAAU,EAAE,SAAS;AAAA,EAC7H;AACF;AAEO,SAAS,gBAAgB,SAAiB,UAAe,GAAwB;AACtF,SAAO;AAAA,IACL,QAAQ,eAAe,SAAS,QAAQ;AAAA,IACxC,OAAO,EAAE,QAAQ,oBAAoB,OAAO;AAAA,IAC5C,aAAa;AAAA,IACb,SAAS,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,UAAU,EAAE,SAAS;AAAA,EAClF;AACF;AAEO,SAAS,mBAAmB,SAAiB,UAAe,GAA2B;AAC5F,SAAO;AAAA,IACL,QAAQ,eAAe,SAAS,QAAQ;AAAA,IACxC,OAAO,EAAE,WAAW,oBAAoB,UAAU;AAAA,IAClD,aAAa;AAAA,IACb,SAAS,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,UAAU,EAAE,SAAS;AAAA,EAChH;AACF;AAGO,SAAS,oBAAoB,WAAgK;AAClM,SAAO,cAAc,SAAgB;AACvC;AAGO,SAAS,WAAW,MAAmB;AAC5C,SAAOC,WAAU,YAAY,IAAI,CAAC;AACpC;","names":["useQuery","useQuery","useQuery","useQuery","jsx","keccak256","keccak256"]}