From 6010dc2cf1fa886d6b569b494534a9ed72584a06 Mon Sep 17 00:00:00 2001 From: adnpark Date: Tue, 2 Jul 2024 22:43:31 +0900 Subject: [PATCH 01/12] chore: add credentials to param --- plugins/passkey/toPasskeyValidator.ts | 7 +------ plugins/passkey/toWebAuthnKey.ts | 12 +++++++----- plugins/passkey/utils.ts | 1 - 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/plugins/passkey/toPasskeyValidator.ts b/plugins/passkey/toPasskeyValidator.ts index 2a2728ab..bf34705d 100644 --- a/plugins/passkey/toPasskeyValidator.ts +++ b/plugins/passkey/toPasskeyValidator.ts @@ -129,14 +129,12 @@ export async function toPasskeyValidator< webAuthnKey, entryPoint: entryPointAddress, kernelVersion, - validatorAddress: _validatorAddress, - credentials = "include" + validatorAddress: _validatorAddress }: { webAuthnKey: WebAuthnKey entryPoint: entryPoint kernelVersion: GetKernelVersion validatorAddress?: Address - credentials?: RequestCredentials } ): Promise< KernelValidator & { @@ -274,7 +272,6 @@ export async function toPasskeyValidator< getSerializedData() { return serializePasskeyValidatorData({ - credentials, entryPoint: entryPointAddress, validatorAddress, pubKeyX: webAuthnKey.pubX, @@ -307,7 +304,6 @@ export async function deserializePasskeyValidator< } > { const { - credentials, entryPoint, validatorAddress, pubKeyX, @@ -438,7 +434,6 @@ export async function deserializePasskeyValidator< }, getSerializedData() { return serializePasskeyValidatorData({ - credentials, entryPoint, validatorAddress, pubKeyX, diff --git a/plugins/passkey/toWebAuthnKey.ts b/plugins/passkey/toWebAuthnKey.ts index b0c1a1e2..1759e4bd 100644 --- a/plugins/passkey/toWebAuthnKey.ts +++ b/plugins/passkey/toWebAuthnKey.ts @@ -18,13 +18,15 @@ export type WebAuthnAccountParams = { passkeyServerUrl: string webAuthnKey?: WebAuthnKey mode?: WebAuthnMode + credentials?: RequestCredentials } export const toWebAuthnKey = async ({ passkeyName, passkeyServerUrl, webAuthnKey, - mode = WebAuthnMode.Register + mode = WebAuthnMode.Register, + credentials = "include" }: WebAuthnAccountParams): Promise => { if (webAuthnKey) { return webAuthnKey @@ -38,7 +40,7 @@ export const toWebAuthnKey = async ({ { method: "POST", headers: { "Content-Type": "application/json" }, - credentials: "include" + credentials } ) const loginOptions = await loginOptionsResponse.json() @@ -56,7 +58,7 @@ export const toWebAuthnKey = async ({ method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ cred: loginCred }), - credentials: "include" + credentials } ) @@ -77,7 +79,7 @@ export const toWebAuthnKey = async ({ "Content-Type": "application/json" }, body: JSON.stringify({ username: passkeyName }), - credentials: "include" + credentials } ) const registerOptions = await registerOptionsResponse.json() @@ -101,7 +103,7 @@ export const toWebAuthnKey = async ({ username: passkeyName, cred: registerCred }), - credentials: "include" + credentials } ) diff --git a/plugins/passkey/utils.ts b/plugins/passkey/utils.ts index 4d195b31..d488d1c7 100644 --- a/plugins/passkey/utils.ts +++ b/plugins/passkey/utils.ts @@ -68,7 +68,6 @@ export function parseAndNormalizeSig(derSig: Hex): { r: bigint; s: bigint } { } type PasskeyValidatorSerializedData = { - credentials: string entryPoint: Hex validatorAddress: Hex pubKeyX: bigint From 49c84539a4c4671fe99791657776d27a042c2361 Mon Sep 17 00:00:00 2001 From: adnpark Date: Tue, 2 Jul 2024 22:43:52 +0900 Subject: [PATCH 02/12] feat: remove redundant api calls in signing --- plugins/permission/signers/toWebAuthnKey.ts | 49 ++--- .../permission/signers/toWebAuthnSigner.ts | 198 ++++++++---------- plugins/permission/signers/webAuthnUtils.ts | 56 +++++ 3 files changed, 168 insertions(+), 135 deletions(-) diff --git a/plugins/permission/signers/toWebAuthnKey.ts b/plugins/permission/signers/toWebAuthnKey.ts index a5252cf6..267c2568 100644 --- a/plugins/permission/signers/toWebAuthnKey.ts +++ b/plugins/permission/signers/toWebAuthnKey.ts @@ -10,6 +10,7 @@ export enum WebAuthnMode { export type WebAuthnKey = { pubX: bigint pubY: bigint + authenticatorId: string authenticatorIdHash: Hex } @@ -17,18 +18,20 @@ export const toWebAuthnKey = async ({ passkeyName, passkeyServerUrl, webAuthnKey, - mode = WebAuthnMode.Login + mode = WebAuthnMode.Login, + credentials = "include" }: { passkeyName: string passkeyServerUrl: string webAuthnKey?: WebAuthnKey mode: WebAuthnMode + credentials?: RequestCredentials }): Promise => { if (webAuthnKey) { return webAuthnKey } let pubKey: string | undefined - let authenticatorIdHash: Hex + let authenticatorId: string | undefined if (mode === WebAuthnMode.Login) { // Get login options const loginOptionsResponse = await fetch( @@ -36,7 +39,7 @@ export const toWebAuthnKey = async ({ { method: "POST", headers: { "Content-Type": "application/json" }, - credentials: "include" + credentials } ) const loginOptions = await loginOptionsResponse.json() @@ -45,10 +48,7 @@ export const toWebAuthnKey = async ({ const { startAuthentication } = await import("@simplewebauthn/browser") const loginCred = await startAuthentication(loginOptions) - // get authenticatorIdHash - authenticatorIdHash = keccak256( - uint8ArrayToHexString(b64ToBytes(loginCred.id)) - ) + authenticatorId = loginCred.id // Verify authentication const loginVerifyResponse = await fetch( @@ -57,26 +57,18 @@ export const toWebAuthnKey = async ({ method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ cred: loginCred }), - credentials: "include" + credentials } ) const loginVerifyResult = await loginVerifyResponse.json() - if (window.sessionStorage === undefined) { - throw new Error("sessionStorage is not available") - } - sessionStorage.setItem("userId", loginVerifyResult.userId) - if (!loginVerifyResult.verification.verified) { throw new Error("Login not verified") } // Import the key pubKey = loginVerifyResult.pubkey // Uint8Array pubkey } else { - if (!passkeyName) { - throw new Error("No passkey name provided") - } // Get registration options const registerOptionsResponse = await fetch( `${passkeyServerUrl}/register/options`, @@ -86,25 +78,16 @@ export const toWebAuthnKey = async ({ "Content-Type": "application/json" }, body: JSON.stringify({ username: passkeyName }), - credentials: "include" + credentials } ) const registerOptions = await registerOptionsResponse.json() - // save userId to sessionStorage - if (window.sessionStorage === undefined) { - throw new Error("sessionStorage is not available") - } - sessionStorage.setItem("userId", registerOptions.userId) - // Start registration const { startRegistration } = await import("@simplewebauthn/browser") const registerCred = await startRegistration(registerOptions.options) - // get authenticatorIdHash - authenticatorIdHash = keccak256( - uint8ArrayToHexString(b64ToBytes(registerCred.id)) - ) + authenticatorId = registerCred.id // Verify registration const registerVerifyResponse = await fetch( @@ -119,7 +102,7 @@ export const toWebAuthnKey = async ({ username: passkeyName, cred: registerCred }), - credentials: "include" + credentials } ) @@ -135,6 +118,15 @@ export const toWebAuthnKey = async ({ throw new Error("No public key returned from registration credential") } + if (!authenticatorId) { + throw new Error( + "No authenticator id returned from registration credential" + ) + } + + const authenticatorIdHash = keccak256( + uint8ArrayToHexString(b64ToBytes(authenticatorId)) + ) const spkiDer = Buffer.from(pubKey, "base64") const key = await crypto.subtle.importKey( "spki", @@ -158,6 +150,7 @@ export const toWebAuthnKey = async ({ return { pubX: BigInt(`0x${pubKeyX}`), pubY: BigInt(`0x${pubKeyY}`), + authenticatorId, authenticatorIdHash } } diff --git a/plugins/permission/signers/toWebAuthnSigner.ts b/plugins/permission/signers/toWebAuthnSigner.ts index 6c9ceddd..255c7389 100644 --- a/plugins/permission/signers/toWebAuthnSigner.ts +++ b/plugins/permission/signers/toWebAuthnSigner.ts @@ -14,23 +14,103 @@ import { } from "viem" import { type SignableMessage, encodeAbiParameters } from "viem" import { toAccount } from "viem/accounts" -import { getChainId } from "viem/actions" +import { getChainId, signMessage } from "viem/actions" import { WEBAUTHN_SIGNER_CONTRACT } from "../constants.js" import type { ModularSigner, ModularSignerParams } from "../types.js" import type { WebAuthnKey } from "./toWebAuthnKey.js" import { b64ToBytes, + base64FromUint8Array, findQuoteIndices, + hexStringToUint8Array, isRIP7212SupportedNetwork, parseAndNormalizeSig, uint8ArrayToHexString } from "./webAuthnUtils.js" export type WebAuthnModularSignerParams = ModularSignerParams & { - passkeyServerUrl: string webAuthnKey: WebAuthnKey } +const signMessageUsingWebAuthn = async ( + message: SignableMessage, + chainId: number, + allowCredentials?: PublicKeyCredentialRequestOptionsJSON["allowCredentials"] +) => { + let messageContent: string + if (typeof message === "string") { + // message is a string + messageContent = message + } else if ("raw" in message && typeof message.raw === "string") { + // message.raw is a Hex string + messageContent = message.raw + } else if ("raw" in message && message.raw instanceof Uint8Array) { + // message.raw is a ByteArray + messageContent = message.raw.toString() + } else { + throw new Error("Unsupported message format") + } + + // remove 0x prefix if present + const formattedMessage = messageContent.startsWith("0x") + ? messageContent.slice(2) + : messageContent + + const challenge = base64FromUint8Array( + hexStringToUint8Array(formattedMessage), + true + ) + + // prepare assertion options + const assertionOptions: PublicKeyCredentialRequestOptionsJSON = { + challenge, + allowCredentials, + userVerification: "required" + } + + // start authentication (signing) + const { startAuthentication } = await import("@simplewebauthn/browser") + const cred = await startAuthentication(assertionOptions) + + // get authenticator data + const { authenticatorData } = cred.response + const authenticatorDataHex = uint8ArrayToHexString( + b64ToBytes(authenticatorData) + ) + + // get client data JSON + const clientDataJSON = atob(cred.response.clientDataJSON) + + // get challenge and response type location + const { beforeType } = findQuoteIndices(clientDataJSON) + + // get signature r,s + const { signature } = cred.response + const signatureHex = uint8ArrayToHexString(b64ToBytes(signature)) + const { r, s } = parseAndNormalizeSig(signatureHex) + + // encode signature + const encodedSignature = encodeAbiParameters( + [ + { name: "authenticatorData", type: "bytes" }, + { name: "clientDataJSON", type: "string" }, + { name: "responseTypeLocation", type: "uint256" }, + { name: "r", type: "uint256" }, + { name: "s", type: "uint256" }, + { name: "usePrecompiled", type: "bool" } + ], + [ + authenticatorDataHex, + clientDataJSON, + beforeType, + BigInt(r), + BigInt(s), + isRIP7212SupportedNetwork(chainId) + ] + ) + return encodedSignature +} + export const toWebAuthnSigner = async < TTransport extends Transport = Transport, TChain extends Chain | undefined = Chain | undefined @@ -38,118 +118,18 @@ export const toWebAuthnSigner = async < client: Client, { signerContractAddress = WEBAUTHN_SIGNER_CONTRACT, - passkeyServerUrl, webAuthnKey }: WebAuthnModularSignerParams ): Promise => { const chainId = await getChainId(client) - const signMessageUsingWebAuthn = async (message: SignableMessage) => { - let messageContent: string - if (typeof message === "string") { - // message is a string - messageContent = message - } else if ("raw" in message && typeof message.raw === "string") { - // message.raw is a Hex string - messageContent = message.raw - } else if ("raw" in message && message.raw instanceof Uint8Array) { - // message.raw is a ByteArray - messageContent = message.raw.toString() - } else { - throw new Error("Unsupported message format") - } - - // remove 0x prefix if present - const formattedMessage = messageContent.startsWith("0x") - ? messageContent.slice(2) - : messageContent - - if (window.sessionStorage === undefined) { - throw new Error("sessionStorage is not available") - } - const userId = sessionStorage.getItem("userId") - - // initiate signing - const signInitiateResponse = await fetch( - `${passkeyServerUrl}/sign-initiate`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ data: formattedMessage, userId }), - credentials: "include" - } - ) - const signInitiateResult = await signInitiateResponse.json() - - // prepare assertion options - const assertionOptions: PublicKeyCredentialRequestOptionsJSON = { - challenge: signInitiateResult.challenge, - allowCredentials: signInitiateResult.allowCredentials, - userVerification: "required" - } - - // start authentication (signing) - - const { startAuthentication } = await import("@simplewebauthn/browser") - const cred = await startAuthentication(assertionOptions) - - // verify signature from server - const verifyResponse = await fetch(`${passkeyServerUrl}/sign-verify`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ cred, userId }), - credentials: "include" - }) - - const verifyResult = await verifyResponse.json() - - if (!verifyResult.success) { - throw new Error("Signature not verified") - } - - // get authenticator data - const authenticatorData = verifyResult.authenticatorData - const authenticatorDataHex = uint8ArrayToHexString( - b64ToBytes(authenticatorData) - ) - - // get client data JSON - const clientDataJSON = atob(cred.response.clientDataJSON) - - // get challenge and response type location - const { beforeType } = findQuoteIndices(clientDataJSON) - - // get signature r,s - const signature = verifyResult.signature - const signatureHex = uint8ArrayToHexString(b64ToBytes(signature)) - const { r, s } = parseAndNormalizeSig(signatureHex) - - // encode signature - const encodedSignature = encodeAbiParameters( - [ - { name: "authenticatorData", type: "bytes" }, - { name: "clientDataJSON", type: "string" }, - { name: "responseTypeLocation", type: "uint256" }, - { name: "r", type: "uint256" }, - { name: "s", type: "uint256" }, - { name: "usePrecompiled", type: "bool" } - ], - [ - authenticatorDataHex, - clientDataJSON, - beforeType, - BigInt(r), - BigInt(s), - isRIP7212SupportedNetwork(chainId) - ] - ) - return encodedSignature - } const account: LocalAccount = toAccount({ // note that this address will be overwritten by actual address address: "0x0000000000000000000000000000000000000000", async signMessage({ message }) { - return signMessageUsingWebAuthn(message) + return signMessageUsingWebAuthn(message, chainId, [ + { id: webAuthnKey.authenticatorId, type: "public-key" } + ]) }, async signTransaction(_, __) { throw new SignTransactionNotSupportedBySmartAccount() @@ -171,7 +151,11 @@ export const toWebAuthnSigner = async < validateTypedData({ domain, message, primaryType, types }) const hash = hashTypedData(typedData) - return signMessageUsingWebAuthn(hash) + const signature = await signMessage(client, { + account, + message: hash + }) + return signature } }) @@ -209,7 +193,7 @@ export const toWebAuthnSigner = async < ], [ "0x49960de5880e8c687434170f6476605b8fe4aeb9a28632c7995cf3ba831d97631d00000000", - '{"type":"webauthn.get","challenge":"tbxXNFS9X_4Byr1cMwqKrIGB-_30a0QhZ6y7ucM0BOE","origin":"http://localhost:3000","crossOrigin":false}', + '{"type":"webauthn.get","challenge":"tbxXNFS9X_4Byr1cMwqKrIGB-_30a0QhZ6y7ucM0BOE","origin":"http://localhost:3000","crossOrigin":false, "other_keys_can_be_added_here":"do not compare clientDataJSON against a template. See https://goo.gl/yabPex"}', 1n, 44941127272049826721201904734628716258498742255959991581049806490182030242267n, 9910254599581058084911561569808925251374718953855182016200087235935345969636n, diff --git a/plugins/permission/signers/webAuthnUtils.ts b/plugins/permission/signers/webAuthnUtils.ts index d8c30814..0b4b4160 100644 --- a/plugins/permission/signers/webAuthnUtils.ts +++ b/plugins/permission/signers/webAuthnUtils.ts @@ -52,3 +52,59 @@ export function parseAndNormalizeSig(derSig: Hex): { r: bigint; s: bigint } { export const isRIP7212SupportedNetwork = (chainId: number): boolean => RIP7212_SUPPORTED_NETWORKS.includes(chainId) + +export const hexStringToUint8Array = (hexString: string): Uint8Array => { + const formattedHexString = hexString.startsWith("0x") + ? hexString.slice(2) + : hexString + const byteArray = new Uint8Array(formattedHexString.length / 2) + for (let i = 0; i < formattedHexString.length; i += 2) { + byteArray[i / 2] = Number.parseInt( + formattedHexString.substring(i, i + 2), + 16 + ) + } + return byteArray +} + +/** + * Convenience function for creating a base64 encoded string from an ArrayBuffer instance + * Copied from @hexagon/base64 package (base64.fromArrayBuffer) + * @public + * + * @param {Uint8Array} uint8Arr - Uint8Array to be encoded + * @param {boolean} [urlMode] - If set to true, URL mode string will be returned + * @returns {string} - Base64 representation of data + */ +export const base64FromUint8Array = ( + uint8Arr: Uint8Array, + urlMode: boolean +): string => { + const // Regular base64 characters + chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + const // Base64url characters + charsUrl = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + + let result = "" + + const len = uint8Arr.length + const target = urlMode ? charsUrl : chars + + for (let i = 0; i < len; i += 3) { + result += target[uint8Arr[i] >> 2] + result += target[((uint8Arr[i] & 3) << 4) | (uint8Arr[i + 1] >> 4)] + result += target[((uint8Arr[i + 1] & 15) << 2) | (uint8Arr[i + 2] >> 6)] + result += target[uint8Arr[i + 2] & 63] + } + + const remainder = len % 3 + if (remainder === 2) { + result = result.substring(0, result.length - 1) + (urlMode ? "" : "=") + } else if (remainder === 1) { + result = result.substring(0, result.length - 2) + (urlMode ? "" : "==") + } + + return result +} From ed9ac1d41a93a56a4cafbfbf992fac7cc6925a27 Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 13:11:22 +0900 Subject: [PATCH 03/12] feat: create webauthn-key module --- plugins/webauthn-key/CHANGELOG.md | 7 + plugins/webauthn-key/index.ts | 2 + plugins/webauthn-key/package.json | 44 ++++++ plugins/webauthn-key/toWebAuthnKey.ts | 165 +++++++++++++++++++++++ plugins/webauthn-key/tsconfig.build.json | 11 ++ plugins/webauthn-key/utils.ts | 153 +++++++++++++++++++++ 6 files changed, 382 insertions(+) create mode 100644 plugins/webauthn-key/CHANGELOG.md create mode 100644 plugins/webauthn-key/index.ts create mode 100644 plugins/webauthn-key/package.json create mode 100644 plugins/webauthn-key/toWebAuthnKey.ts create mode 100644 plugins/webauthn-key/tsconfig.build.json create mode 100644 plugins/webauthn-key/utils.ts diff --git a/plugins/webauthn-key/CHANGELOG.md b/plugins/webauthn-key/CHANGELOG.md new file mode 100644 index 00000000..7e557ecd --- /dev/null +++ b/plugins/webauthn-key/CHANGELOG.md @@ -0,0 +1,7 @@ +# @zerodev/passkey-validator + +## 5.3.0 + +### Patch Changes + +- Add `toWebAuthnKey` function diff --git a/plugins/webauthn-key/index.ts b/plugins/webauthn-key/index.ts new file mode 100644 index 00000000..72b4a76b --- /dev/null +++ b/plugins/webauthn-key/index.ts @@ -0,0 +1,2 @@ +export * from "./toWebAuthnKey.js" +export * from "./utils.js" diff --git a/plugins/webauthn-key/package.json b/plugins/webauthn-key/package.json new file mode 100644 index 00000000..bb9dc0d3 --- /dev/null +++ b/plugins/webauthn-key/package.json @@ -0,0 +1,44 @@ +{ + "name": "@zerodev/webauthn-key", + "version": "5.3.0", + "author": "ZeroDev", + "main": "./_cjs/index.js", + "module": "./_esm/index.js", + "types": "./_types/index.d.ts", + "typings": "./_types/index.d.ts", + "type": "module", + "sideEffects": false, + "license": "MIT", + "files": [ + "_esm", + "_cjs", + "_types", + "./**/*.ts", + "!_esm/**/*.tsbuildinfo", + "!_cjs/**/*.tsbuildinfo", + "!_types/**/*.tsbuildinfo", + "!.env", + "!./**/*.test.ts", + "!.changeset" + ], + "scripts": { + "build": "bun run clean && bun run build:cjs && bun run build:esm && bun run build:types", + "build:cjs": "tsc --project ./tsconfig.build.json --module commonjs --outDir ./_cjs --removeComments --verbatimModuleSyntax false && printf '{\"type\":\"commonjs\"}' > ./_cjs/package.json", + "build:esm": "tsc --project ./tsconfig.build.json --module es2020 --outDir ./_esm && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./_esm/package.json", + "build:types": "tsc --project ./tsconfig.build.json --module esnext --declarationDir ./_types --emitDeclarationOnly --declaration --declarationMap", + "clean": "rimraf _esm _cjs _types", + "changeset": "changeset", + "changeset:release": "bun run build && changeset publish", + "changeset:version": "changeset version && bun install --lockfile-only", + "format": "biome format . --write", + "lint": "biome check .", + "lint:fix": "bun run lint --apply" + }, + "dependencies": { + "@noble/curves": "^1.3.0", + "@simplewebauthn/browser": "^8.3.4" + }, + "peerDependencies": { + "viem": "^2.16.3" + } +} diff --git a/plugins/webauthn-key/toWebAuthnKey.ts b/plugins/webauthn-key/toWebAuthnKey.ts new file mode 100644 index 00000000..4711d03c --- /dev/null +++ b/plugins/webauthn-key/toWebAuthnKey.ts @@ -0,0 +1,165 @@ +import { type Hex, keccak256, concatHex, toHex, pad } from "viem" +import { b64ToBytes, uint8ArrayToHexString } from "./utils.js" + +export enum WebAuthnMode { + Register = "register", + Login = "login" +} + +export type WebAuthnKey = { + pubX: bigint + pubY: bigint + authenticatorId: string + authenticatorIdHash: Hex +} + +export type WebAuthnAccountParams = { + passkeyName: string + passkeyServerUrl: string + webAuthnKey?: WebAuthnKey + mode?: WebAuthnMode + credentials?: RequestCredentials +} + +export const encodeWebAuthnPubKey = (pubKey: WebAuthnKey) => { + return concatHex([ + toHex(pubKey.pubX, { size: 32 }), + toHex(pubKey.pubY, { size: 32 }), + pad(pubKey.authenticatorIdHash, { size: 32 }) + ]) +} + +export const toWebAuthnKey = async ({ + passkeyName, + passkeyServerUrl, + webAuthnKey, + mode = WebAuthnMode.Register, + credentials = "include" +}: WebAuthnAccountParams): Promise => { + if (webAuthnKey) { + return webAuthnKey + } + let pubKey: string | undefined + let authenticatorId: string | undefined + if (mode === WebAuthnMode.Login) { + // Get login options + const loginOptionsResponse = await fetch( + `${passkeyServerUrl}/login/options`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + credentials + } + ) + const loginOptions = await loginOptionsResponse.json() + + // Start authentication (login) + const { startAuthentication } = await import("@simplewebauthn/browser") + const loginCred = await startAuthentication(loginOptions) + + authenticatorId = loginCred.id + + // Verify authentication + const loginVerifyResponse = await fetch( + `${passkeyServerUrl}/login/verify`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ cred: loginCred }), + credentials + } + ) + + const loginVerifyResult = await loginVerifyResponse.json() + + if (!loginVerifyResult.verification.verified) { + throw new Error("Login not verified") + } + // Import the key + pubKey = loginVerifyResult.pubkey // Uint8Array pubkey + } else { + // Get registration options + const registerOptionsResponse = await fetch( + `${passkeyServerUrl}/register/options`, + { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ username: passkeyName }), + credentials + } + ) + const registerOptions = await registerOptionsResponse.json() + + // Start registration + const { startRegistration } = await import("@simplewebauthn/browser") + const registerCred = await startRegistration(registerOptions.options) + + authenticatorId = registerCred.id + + // Verify registration + const registerVerifyResponse = await fetch( + `${passkeyServerUrl}/register/verify`, + { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ + userId: registerOptions.userId, + username: passkeyName, + cred: registerCred + }), + credentials + } + ) + + const registerVerifyResult = await registerVerifyResponse.json() + if (!registerVerifyResult.verified) { + throw new Error("Registration not verified") + } + + // Import the key + pubKey = registerCred.response.publicKey + } + + if (!pubKey) { + throw new Error("No public key returned from registration credential") + } + if (!authenticatorId) { + throw new Error( + "No authenticator id returned from registration credential" + ) + } + + const authenticatorIdHash = keccak256( + uint8ArrayToHexString(b64ToBytes(authenticatorId)) + ) + const spkiDer = Buffer.from(pubKey, "base64") + const key = await crypto.subtle.importKey( + "spki", + spkiDer, + { + name: "ECDSA", + namedCurve: "P-256" + }, + true, + ["verify"] + ) + + // Export the key to the raw format + const rawKey = await crypto.subtle.exportKey("raw", key) + const rawKeyBuffer = Buffer.from(rawKey) + + // The first byte is 0x04 (uncompressed), followed by x and y coordinates (32 bytes each for P-256) + const pubKeyX = rawKeyBuffer.subarray(1, 33).toString("hex") + const pubKeyY = rawKeyBuffer.subarray(33).toString("hex") + + return { + pubX: BigInt(`0x${pubKeyX}`), + pubY: BigInt(`0x${pubKeyY}`), + authenticatorId, + authenticatorIdHash + } +} diff --git a/plugins/webauthn-key/tsconfig.build.json b/plugins/webauthn-key/tsconfig.build.json new file mode 100644 index 00000000..cc7e1921 --- /dev/null +++ b/plugins/webauthn-key/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "../../templates/typescript/tsconfig.build.json", + "include": ["./"], + "exclude": ["./**/*.test.ts", "./**/*.test-d.ts", "./**/*.bench.ts"], + "compilerOptions": { + "moduleResolution": "node", + "sourceMap": true, + "rootDir": "./", + "baseUrl": "./" + } +} diff --git a/plugins/webauthn-key/utils.ts b/plugins/webauthn-key/utils.ts new file mode 100644 index 00000000..d488d1c7 --- /dev/null +++ b/plugins/webauthn-key/utils.ts @@ -0,0 +1,153 @@ +import { p256 } from "@noble/curves/p256" +import { type Hex, bytesToBigInt, hexToBytes } from "viem" + +const RIP7212_SUPPORTED_NETWORKS = [80001, 137] + +export const isRIP7212SupportedNetwork = (chainId: number): boolean => + RIP7212_SUPPORTED_NETWORKS.includes(chainId) + +export const uint8ArrayToHexString = (array: Uint8Array): `0x${string}` => { + return `0x${Array.from(array, (byte) => + byte.toString(16).padStart(2, "0") + ).join("")}` as `0x${string}` +} + +export const hexStringToUint8Array = (hexString: string): Uint8Array => { + const formattedHexString = hexString.startsWith("0x") + ? hexString.slice(2) + : hexString + const byteArray = new Uint8Array(formattedHexString.length / 2) + for (let i = 0; i < formattedHexString.length; i += 2) { + byteArray[i / 2] = Number.parseInt( + formattedHexString.substring(i, i + 2), + 16 + ) + } + return byteArray +} + +export const b64ToBytes = (base64: string): Uint8Array => { + const paddedBase64 = base64 + .replace(/-/g, "+") + .replace(/_/g, "/") + .padEnd(base64.length + ((4 - (base64.length % 4)) % 4), "=") + const binString = atob(paddedBase64) + return Uint8Array.from(binString, (m) => m.codePointAt(0) ?? 0) +} + +export const findQuoteIndices = ( + input: string +): { beforeType: bigint; beforeChallenge: bigint } => { + const beforeTypeIndex = BigInt(input.lastIndexOf('"type":"webauthn.get"')) + const beforeChallengeIndex = BigInt(input.indexOf('"challenge')) + return { + beforeType: beforeTypeIndex, + beforeChallenge: beforeChallengeIndex + } +} + +// Parse DER-encoded P256-SHA256 signature to contract-friendly signature +// and normalize it so the signature is not malleable. +export function parseAndNormalizeSig(derSig: Hex): { r: bigint; s: bigint } { + const parsedSignature = p256.Signature.fromDER(derSig.slice(2)) + const bSig = hexToBytes(`0x${parsedSignature.toCompactHex()}`) + // assert(bSig.length === 64, "signature is not 64 bytes"); + const bR = bSig.slice(0, 32) + const bS = bSig.slice(32) + + // Avoid malleability. Ensure low S (<= N/2 where N is the curve order) + const r = bytesToBigInt(bR) + let s = bytesToBigInt(bS) + const n = BigInt( + "0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" + ) + if (s > n / 2n) { + s = n - s + } + return { r, s } +} + +type PasskeyValidatorSerializedData = { + entryPoint: Hex + validatorAddress: Hex + pubKeyX: bigint + pubKeyY: bigint + authenticatorId: string + authenticatorIdHash: Hex +} + +export const serializePasskeyValidatorData = ( + params: PasskeyValidatorSerializedData +) => { + // biome-ignore lint/suspicious/noExplicitAny: + const replacer = (_: string, value: any) => { + if (typeof value === "bigint") { + return value.toString() + } + return value + } + + const jsonString = JSON.stringify(params, replacer) + const uint8Array = new TextEncoder().encode(jsonString) + const base64String = bytesToBase64(uint8Array) + return base64String +} + +export const deserializePasskeyValidatorData = (params: string) => { + const uint8Array = base64ToBytes(params) + const jsonString = new TextDecoder().decode(uint8Array) + const parsed = JSON.parse(jsonString) as PasskeyValidatorSerializedData + return parsed +} + +function base64ToBytes(base64: string) { + const binString = atob(base64) + return Uint8Array.from(binString, (m) => m.codePointAt(0) as number) +} + +function bytesToBase64(bytes: Uint8Array) { + const binString = Array.from(bytes, (x) => String.fromCodePoint(x)).join("") + return btoa(binString) +} + +/** + * Convenience function for creating a base64 encoded string from an ArrayBuffer instance + * Copied from @hexagon/base64 package (base64.fromArrayBuffer) + * @public + * + * @param {Uint8Array} uint8Arr - Uint8Array to be encoded + * @param {boolean} [urlMode] - If set to true, URL mode string will be returned + * @returns {string} - Base64 representation of data + */ +export const base64FromUint8Array = ( + uint8Arr: Uint8Array, + urlMode: boolean +): string => { + const // Regular base64 characters + chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + const // Base64url characters + charsUrl = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + + let result = "" + + const len = uint8Arr.length + const target = urlMode ? charsUrl : chars + + for (let i = 0; i < len; i += 3) { + result += target[uint8Arr[i] >> 2] + result += target[((uint8Arr[i] & 3) << 4) | (uint8Arr[i + 1] >> 4)] + result += target[((uint8Arr[i + 1] & 15) << 2) | (uint8Arr[i + 2] >> 6)] + result += target[uint8Arr[i + 2] & 63] + } + + const remainder = len % 3 + if (remainder === 2) { + result = result.substring(0, result.length - 1) + (urlMode ? "" : "=") + } else if (remainder === 1) { + result = result.substring(0, result.length - 2) + (urlMode ? "" : "==") + } + + return result +} From f49a029c813d1e1e01ebeb48e82a7225477f6103 Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 13:11:46 +0900 Subject: [PATCH 04/12] chore: format --- plugins/webauthn-key/toWebAuthnKey.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/webauthn-key/toWebAuthnKey.ts b/plugins/webauthn-key/toWebAuthnKey.ts index 4711d03c..d5e81ff9 100644 --- a/plugins/webauthn-key/toWebAuthnKey.ts +++ b/plugins/webauthn-key/toWebAuthnKey.ts @@ -1,4 +1,4 @@ -import { type Hex, keccak256, concatHex, toHex, pad } from "viem" +import { type Hex, concatHex, keccak256, pad, toHex } from "viem" import { b64ToBytes, uint8ArrayToHexString } from "./utils.js" export enum WebAuthnMode { From 3fd293ed42bb8200a3fb635f167705e2d6ba69d4 Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 13:12:15 +0900 Subject: [PATCH 05/12] feat: separate webauthn key module --- plugins/passkey/CHANGELOG.md | 6 + plugins/passkey/index.ts | 2 +- plugins/passkey/package.json | 3 +- plugins/passkey/toPasskeyValidator.ts | 24 ++-- plugins/passkey/toWebAuthnKey.ts | 157 -------------------------- plugins/passkey/utils.ts | 153 ------------------------- 6 files changed, 21 insertions(+), 324 deletions(-) delete mode 100644 plugins/passkey/toWebAuthnKey.ts delete mode 100644 plugins/passkey/utils.ts diff --git a/plugins/passkey/CHANGELOG.md b/plugins/passkey/CHANGELOG.md index e4172be2..b432cc24 100644 --- a/plugins/passkey/CHANGELOG.md +++ b/plugins/passkey/CHANGELOG.md @@ -1,5 +1,11 @@ # @zerodev/passkey-validator +## 5.3.5 + +### Patch Changes + +- Separated webauthn validator and webauthn key module + ## 5.3.4 ### Patch Changes diff --git a/plugins/passkey/index.ts b/plugins/passkey/index.ts index 03f4bd17..bb320d11 100644 --- a/plugins/passkey/index.ts +++ b/plugins/passkey/index.ts @@ -3,13 +3,13 @@ import { validateKernelVersionWithEntryPoint } from "@zerodev/sdk" import type { GetKernelVersion, KernelValidator } from "@zerodev/sdk/types" +import { WebAuthnMode, toWebAuthnKey } from "@zerodev/webauthn-key" import type { EntryPoint } from "permissionless/types/entrypoint.js" import { type Address, zeroAddress } from "viem" import { deserializePasskeyValidator, toPasskeyValidator } from "./toPasskeyValidator.js" -import { WebAuthnMode, toWebAuthnKey } from "./toWebAuthnKey.js" export { deserializePasskeyValidator, diff --git a/plugins/passkey/package.json b/plugins/passkey/package.json index 77cffaf7..67dc18b0 100644 --- a/plugins/passkey/package.json +++ b/plugins/passkey/package.json @@ -1,6 +1,6 @@ { "name": "@zerodev/passkey-validator", - "version": "5.3.4", + "version": "5.3.5", "author": "ZeroDev", "main": "./_cjs/index.js", "module": "./_esm/index.js", @@ -41,6 +41,7 @@ "peerDependencies": { "viem": "^2.16.3", "@zerodev/sdk": "^5.2.1", + "@zerodev/webauthn-key": "^5.3.0", "permissionless": "^0.1.18" } } diff --git a/plugins/passkey/toPasskeyValidator.ts b/plugins/passkey/toPasskeyValidator.ts index bf34705d..847d76a6 100644 --- a/plugins/passkey/toPasskeyValidator.ts +++ b/plugins/passkey/toPasskeyValidator.ts @@ -1,5 +1,17 @@ import type { PublicKeyCredentialRequestOptionsJSON } from "@simplewebauthn/typescript-types" import type { GetKernelVersion, KernelValidator } from "@zerodev/sdk/types" +import { + type WebAuthnKey, + b64ToBytes, + base64FromUint8Array, + deserializePasskeyValidatorData, + findQuoteIndices, + hexStringToUint8Array, + isRIP7212SupportedNetwork, + parseAndNormalizeSig, + serializePasskeyValidatorData, + uint8ArrayToHexString +} from "@zerodev/webauthn-key" import type { TypedData } from "abitype" import { type UserOperation, getUserOperationHash } from "permissionless" import { SignTransactionNotSupportedBySmartAccount } from "permissionless/accounts" @@ -26,18 +38,6 @@ import { toAccount } from "viem/accounts" import { signMessage } from "viem/actions" import { getChainId } from "viem/actions" import { getValidatorAddress } from "./index.js" -import type { WebAuthnKey } from "./toWebAuthnKey.js" -import { - b64ToBytes, - base64FromUint8Array, - deserializePasskeyValidatorData, - findQuoteIndices, - hexStringToUint8Array, - isRIP7212SupportedNetwork, - parseAndNormalizeSig, - serializePasskeyValidatorData, - uint8ArrayToHexString -} from "./utils.js" const signMessageUsingWebAuthn = async ( message: SignableMessage, diff --git a/plugins/passkey/toWebAuthnKey.ts b/plugins/passkey/toWebAuthnKey.ts deleted file mode 100644 index 1759e4bd..00000000 --- a/plugins/passkey/toWebAuthnKey.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { type Hex, keccak256 } from "viem" -import { b64ToBytes, uint8ArrayToHexString } from "./utils.js" - -export enum WebAuthnMode { - Register = "register", - Login = "login" -} - -export type WebAuthnKey = { - pubX: bigint - pubY: bigint - authenticatorId: string - authenticatorIdHash: Hex -} - -export type WebAuthnAccountParams = { - passkeyName: string - passkeyServerUrl: string - webAuthnKey?: WebAuthnKey - mode?: WebAuthnMode - credentials?: RequestCredentials -} - -export const toWebAuthnKey = async ({ - passkeyName, - passkeyServerUrl, - webAuthnKey, - mode = WebAuthnMode.Register, - credentials = "include" -}: WebAuthnAccountParams): Promise => { - if (webAuthnKey) { - return webAuthnKey - } - let pubKey: string | undefined - let authenticatorId: string | undefined - if (mode === WebAuthnMode.Login) { - // Get login options - const loginOptionsResponse = await fetch( - `${passkeyServerUrl}/login/options`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - credentials - } - ) - const loginOptions = await loginOptionsResponse.json() - - // Start authentication (login) - const { startAuthentication } = await import("@simplewebauthn/browser") - const loginCred = await startAuthentication(loginOptions) - - authenticatorId = loginCred.id - - // Verify authentication - const loginVerifyResponse = await fetch( - `${passkeyServerUrl}/login/verify`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ cred: loginCred }), - credentials - } - ) - - const loginVerifyResult = await loginVerifyResponse.json() - - if (!loginVerifyResult.verification.verified) { - throw new Error("Login not verified") - } - // Import the key - pubKey = loginVerifyResult.pubkey // Uint8Array pubkey - } else { - // Get registration options - const registerOptionsResponse = await fetch( - `${passkeyServerUrl}/register/options`, - { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ username: passkeyName }), - credentials - } - ) - const registerOptions = await registerOptionsResponse.json() - - // Start registration - const { startRegistration } = await import("@simplewebauthn/browser") - const registerCred = await startRegistration(registerOptions.options) - - authenticatorId = registerCred.id - - // Verify registration - const registerVerifyResponse = await fetch( - `${passkeyServerUrl}/register/verify`, - { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - userId: registerOptions.userId, - username: passkeyName, - cred: registerCred - }), - credentials - } - ) - - const registerVerifyResult = await registerVerifyResponse.json() - if (!registerVerifyResult.verified) { - throw new Error("Registration not verified") - } - - // Import the key - pubKey = registerCred.response.publicKey - } - - if (!pubKey) { - throw new Error("No public key returned from registration credential") - } - if (!authenticatorId) { - throw new Error( - "No authenticator id returned from registration credential" - ) - } - - const authenticatorIdHash = keccak256( - uint8ArrayToHexString(b64ToBytes(authenticatorId)) - ) - const spkiDer = Buffer.from(pubKey, "base64") - const key = await crypto.subtle.importKey( - "spki", - spkiDer, - { - name: "ECDSA", - namedCurve: "P-256" - }, - true, - ["verify"] - ) - - // Export the key to the raw format - const rawKey = await crypto.subtle.exportKey("raw", key) - const rawKeyBuffer = Buffer.from(rawKey) - - // The first byte is 0x04 (uncompressed), followed by x and y coordinates (32 bytes each for P-256) - const pubKeyX = rawKeyBuffer.subarray(1, 33).toString("hex") - const pubKeyY = rawKeyBuffer.subarray(33).toString("hex") - - return { - pubX: BigInt(`0x${pubKeyX}`), - pubY: BigInt(`0x${pubKeyY}`), - authenticatorId, - authenticatorIdHash - } -} diff --git a/plugins/passkey/utils.ts b/plugins/passkey/utils.ts deleted file mode 100644 index d488d1c7..00000000 --- a/plugins/passkey/utils.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { p256 } from "@noble/curves/p256" -import { type Hex, bytesToBigInt, hexToBytes } from "viem" - -const RIP7212_SUPPORTED_NETWORKS = [80001, 137] - -export const isRIP7212SupportedNetwork = (chainId: number): boolean => - RIP7212_SUPPORTED_NETWORKS.includes(chainId) - -export const uint8ArrayToHexString = (array: Uint8Array): `0x${string}` => { - return `0x${Array.from(array, (byte) => - byte.toString(16).padStart(2, "0") - ).join("")}` as `0x${string}` -} - -export const hexStringToUint8Array = (hexString: string): Uint8Array => { - const formattedHexString = hexString.startsWith("0x") - ? hexString.slice(2) - : hexString - const byteArray = new Uint8Array(formattedHexString.length / 2) - for (let i = 0; i < formattedHexString.length; i += 2) { - byteArray[i / 2] = Number.parseInt( - formattedHexString.substring(i, i + 2), - 16 - ) - } - return byteArray -} - -export const b64ToBytes = (base64: string): Uint8Array => { - const paddedBase64 = base64 - .replace(/-/g, "+") - .replace(/_/g, "/") - .padEnd(base64.length + ((4 - (base64.length % 4)) % 4), "=") - const binString = atob(paddedBase64) - return Uint8Array.from(binString, (m) => m.codePointAt(0) ?? 0) -} - -export const findQuoteIndices = ( - input: string -): { beforeType: bigint; beforeChallenge: bigint } => { - const beforeTypeIndex = BigInt(input.lastIndexOf('"type":"webauthn.get"')) - const beforeChallengeIndex = BigInt(input.indexOf('"challenge')) - return { - beforeType: beforeTypeIndex, - beforeChallenge: beforeChallengeIndex - } -} - -// Parse DER-encoded P256-SHA256 signature to contract-friendly signature -// and normalize it so the signature is not malleable. -export function parseAndNormalizeSig(derSig: Hex): { r: bigint; s: bigint } { - const parsedSignature = p256.Signature.fromDER(derSig.slice(2)) - const bSig = hexToBytes(`0x${parsedSignature.toCompactHex()}`) - // assert(bSig.length === 64, "signature is not 64 bytes"); - const bR = bSig.slice(0, 32) - const bS = bSig.slice(32) - - // Avoid malleability. Ensure low S (<= N/2 where N is the curve order) - const r = bytesToBigInt(bR) - let s = bytesToBigInt(bS) - const n = BigInt( - "0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" - ) - if (s > n / 2n) { - s = n - s - } - return { r, s } -} - -type PasskeyValidatorSerializedData = { - entryPoint: Hex - validatorAddress: Hex - pubKeyX: bigint - pubKeyY: bigint - authenticatorId: string - authenticatorIdHash: Hex -} - -export const serializePasskeyValidatorData = ( - params: PasskeyValidatorSerializedData -) => { - // biome-ignore lint/suspicious/noExplicitAny: - const replacer = (_: string, value: any) => { - if (typeof value === "bigint") { - return value.toString() - } - return value - } - - const jsonString = JSON.stringify(params, replacer) - const uint8Array = new TextEncoder().encode(jsonString) - const base64String = bytesToBase64(uint8Array) - return base64String -} - -export const deserializePasskeyValidatorData = (params: string) => { - const uint8Array = base64ToBytes(params) - const jsonString = new TextDecoder().decode(uint8Array) - const parsed = JSON.parse(jsonString) as PasskeyValidatorSerializedData - return parsed -} - -function base64ToBytes(base64: string) { - const binString = atob(base64) - return Uint8Array.from(binString, (m) => m.codePointAt(0) as number) -} - -function bytesToBase64(bytes: Uint8Array) { - const binString = Array.from(bytes, (x) => String.fromCodePoint(x)).join("") - return btoa(binString) -} - -/** - * Convenience function for creating a base64 encoded string from an ArrayBuffer instance - * Copied from @hexagon/base64 package (base64.fromArrayBuffer) - * @public - * - * @param {Uint8Array} uint8Arr - Uint8Array to be encoded - * @param {boolean} [urlMode] - If set to true, URL mode string will be returned - * @returns {string} - Base64 representation of data - */ -export const base64FromUint8Array = ( - uint8Arr: Uint8Array, - urlMode: boolean -): string => { - const // Regular base64 characters - chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" - const // Base64url characters - charsUrl = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" - - let result = "" - - const len = uint8Arr.length - const target = urlMode ? charsUrl : chars - - for (let i = 0; i < len; i += 3) { - result += target[uint8Arr[i] >> 2] - result += target[((uint8Arr[i] & 3) << 4) | (uint8Arr[i + 1] >> 4)] - result += target[((uint8Arr[i + 1] & 15) << 2) | (uint8Arr[i + 2] >> 6)] - result += target[uint8Arr[i + 2] & 63] - } - - const remainder = len % 3 - if (remainder === 2) { - result = result.substring(0, result.length - 1) + (urlMode ? "" : "=") - } else if (remainder === 1) { - result = result.substring(0, result.length - 2) + (urlMode ? "" : "==") - } - - return result -} From 141064a582cd496562abff251639bc71eade2dcc Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 13:12:59 +0900 Subject: [PATCH 06/12] chore: update bun.lockb --- bun.lockb | Bin 553928 -> 554768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index 98c229f95efbfabc4fe7cec029e45f0d93bbc7f9..ef657d6afcaebff99197d48907bd126ddc53fce7 100755 GIT binary patch delta 113028 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 delta 113186 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 Date: Fri, 5 Jul 2024 13:37:08 +0900 Subject: [PATCH 07/12] feat: separated webauthn key module --- plugins/permission/CHANGELOG.md | 6 + .../deserializePermissionAccount.ts | 5 +- plugins/permission/package.json | 3 +- plugins/permission/signers/index.ts | 2 +- plugins/permission/signers/toWebAuthnKey.ts | 156 ------------------ .../permission/signers/toWebAuthnSigner.ts | 20 +-- plugins/permission/signers/webAuthnUtils.ts | 110 ------------ 7 files changed, 23 insertions(+), 279 deletions(-) delete mode 100644 plugins/permission/signers/toWebAuthnKey.ts delete mode 100644 plugins/permission/signers/webAuthnUtils.ts diff --git a/plugins/permission/CHANGELOG.md b/plugins/permission/CHANGELOG.md index 8f5f5f1a..a5c7492a 100644 --- a/plugins/permission/CHANGELOG.md +++ b/plugins/permission/CHANGELOG.md @@ -1,5 +1,11 @@ # @zerodev/permissions +## 5.3.2 + +### Patch Changes + +- Separated webauthn signer and webauthn key module + ## 5.3.1 ### Patch Changes diff --git a/plugins/permission/deserializePermissionAccount.ts b/plugins/permission/deserializePermissionAccount.ts index 01eab9bd..1ce70b38 100644 --- a/plugins/permission/deserializePermissionAccount.ts +++ b/plugins/permission/deserializePermissionAccount.ts @@ -11,6 +11,7 @@ import type { ValidatorInitData } from "@zerodev/sdk/types" import { getEntryPointVersion } from "permissionless" +import type { SmartAccountSigner } from "permissionless/accounts" import type { EntryPoint } from "permissionless/types" import type { Chain, Client, Hex, Transport } from "viem" import { decodeFunctionData } from "viem" @@ -52,7 +53,9 @@ export const deserializePermissionAccount = async < let signer: ModularSigner if (params.privateKey) signer = toECDSASigner({ - signer: privateKeyToAccount(params.privateKey) + signer: privateKeyToAccount( + params.privateKey + ) as SmartAccountSigner<"privateKey", `0x${string}`> }) else if (modularSigner) signer = modularSigner else throw new Error("No signer or serialized sessionKey provided") diff --git a/plugins/permission/package.json b/plugins/permission/package.json index cca91019..c109ebe7 100644 --- a/plugins/permission/package.json +++ b/plugins/permission/package.json @@ -1,6 +1,6 @@ { "name": "@zerodev/permissions", - "version": "5.3.1", + "version": "5.3.2", "author": "ZeroDev", "main": "./_cjs/index.js", "module": "./_esm/index.js", @@ -58,6 +58,7 @@ "peerDependencies": { "viem": "^2.16.3", "@zerodev/sdk": "^5.2.13", + "@zerodev/webauthn-key": "^5.3.0", "permissionless": "^0.1.18" } } diff --git a/plugins/permission/signers/index.ts b/plugins/permission/signers/index.ts index b32d87fe..09bcdd5f 100644 --- a/plugins/permission/signers/index.ts +++ b/plugins/permission/signers/index.ts @@ -6,6 +6,6 @@ export { toWebAuthnSigner, type WebAuthnModularSignerParams } from "./toWebAuthnSigner.js" -export { WebAuthnMode, toWebAuthnKey } from "./toWebAuthnKey.js" +export { WebAuthnMode, toWebAuthnKey } from "@zerodev/webauthn-key" export { toSignerId } from "./utils/toSignerId.js" export { toEmptyECDSASigner } from "./toEmptyECDSASigner.js" diff --git a/plugins/permission/signers/toWebAuthnKey.ts b/plugins/permission/signers/toWebAuthnKey.ts deleted file mode 100644 index 267c2568..00000000 --- a/plugins/permission/signers/toWebAuthnKey.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { Buffer } from "buffer" -import { type Hex, keccak256 } from "viem" -import { b64ToBytes, uint8ArrayToHexString } from "./webAuthnUtils.js" - -export enum WebAuthnMode { - Register = "register", - Login = "login" -} - -export type WebAuthnKey = { - pubX: bigint - pubY: bigint - authenticatorId: string - authenticatorIdHash: Hex -} - -export const toWebAuthnKey = async ({ - passkeyName, - passkeyServerUrl, - webAuthnKey, - mode = WebAuthnMode.Login, - credentials = "include" -}: { - passkeyName: string - passkeyServerUrl: string - webAuthnKey?: WebAuthnKey - mode: WebAuthnMode - credentials?: RequestCredentials -}): Promise => { - if (webAuthnKey) { - return webAuthnKey - } - let pubKey: string | undefined - let authenticatorId: string | undefined - if (mode === WebAuthnMode.Login) { - // Get login options - const loginOptionsResponse = await fetch( - `${passkeyServerUrl}/login/options`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - credentials - } - ) - const loginOptions = await loginOptionsResponse.json() - - // Start authentication (login) - const { startAuthentication } = await import("@simplewebauthn/browser") - const loginCred = await startAuthentication(loginOptions) - - authenticatorId = loginCred.id - - // Verify authentication - const loginVerifyResponse = await fetch( - `${passkeyServerUrl}/login/verify`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ cred: loginCred }), - credentials - } - ) - - const loginVerifyResult = await loginVerifyResponse.json() - - if (!loginVerifyResult.verification.verified) { - throw new Error("Login not verified") - } - // Import the key - pubKey = loginVerifyResult.pubkey // Uint8Array pubkey - } else { - // Get registration options - const registerOptionsResponse = await fetch( - `${passkeyServerUrl}/register/options`, - { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ username: passkeyName }), - credentials - } - ) - const registerOptions = await registerOptionsResponse.json() - - // Start registration - const { startRegistration } = await import("@simplewebauthn/browser") - const registerCred = await startRegistration(registerOptions.options) - - authenticatorId = registerCred.id - - // Verify registration - const registerVerifyResponse = await fetch( - `${passkeyServerUrl}/register/verify`, - { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - userId: registerOptions.userId, - username: passkeyName, - cred: registerCred - }), - credentials - } - ) - - const registerVerifyResult = await registerVerifyResponse.json() - if (!registerVerifyResult.verified) { - throw new Error("Registration not verified") - } - - // Import the key - pubKey = registerCred.response.publicKey - } - if (!pubKey) { - throw new Error("No public key returned from registration credential") - } - - if (!authenticatorId) { - throw new Error( - "No authenticator id returned from registration credential" - ) - } - - const authenticatorIdHash = keccak256( - uint8ArrayToHexString(b64ToBytes(authenticatorId)) - ) - const spkiDer = Buffer.from(pubKey, "base64") - const key = await crypto.subtle.importKey( - "spki", - spkiDer, - { - name: "ECDSA", - namedCurve: "P-256" - }, - true, - ["verify"] - ) - - // Export the key to the raw format - const rawKey = await crypto.subtle.exportKey("raw", key) - const rawKeyBuffer = Buffer.from(rawKey) - - // The first byte is 0x04 (uncompressed), followed by x and y coordinates (32 bytes each for P-256) - const pubKeyX = rawKeyBuffer.subarray(1, 33).toString("hex") - const pubKeyY = rawKeyBuffer.subarray(33).toString("hex") - - return { - pubX: BigInt(`0x${pubKeyX}`), - pubY: BigInt(`0x${pubKeyY}`), - authenticatorId, - authenticatorIdHash - } -} diff --git a/plugins/permission/signers/toWebAuthnSigner.ts b/plugins/permission/signers/toWebAuthnSigner.ts index 255c7389..c85c458e 100644 --- a/plugins/permission/signers/toWebAuthnSigner.ts +++ b/plugins/permission/signers/toWebAuthnSigner.ts @@ -1,4 +1,14 @@ import type { PublicKeyCredentialRequestOptionsJSON } from "@simplewebauthn/typescript-types" +import type { WebAuthnKey } from "@zerodev/webauthn-key" +import { + b64ToBytes, + base64FromUint8Array, + findQuoteIndices, + hexStringToUint8Array, + isRIP7212SupportedNetwork, + parseAndNormalizeSig, + uint8ArrayToHexString +} from "@zerodev/webauthn-key" import type { TypedData } from "abitype" import { SignTransactionNotSupportedBySmartAccount } from "permissionless/accounts" import { @@ -17,16 +27,6 @@ import { toAccount } from "viem/accounts" import { getChainId, signMessage } from "viem/actions" import { WEBAUTHN_SIGNER_CONTRACT } from "../constants.js" import type { ModularSigner, ModularSignerParams } from "../types.js" -import type { WebAuthnKey } from "./toWebAuthnKey.js" -import { - b64ToBytes, - base64FromUint8Array, - findQuoteIndices, - hexStringToUint8Array, - isRIP7212SupportedNetwork, - parseAndNormalizeSig, - uint8ArrayToHexString -} from "./webAuthnUtils.js" export type WebAuthnModularSignerParams = ModularSignerParams & { webAuthnKey: WebAuthnKey diff --git a/plugins/permission/signers/webAuthnUtils.ts b/plugins/permission/signers/webAuthnUtils.ts deleted file mode 100644 index 0b4b4160..00000000 --- a/plugins/permission/signers/webAuthnUtils.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { p256 } from "@noble/curves/p256" -import { type Hex, bytesToBigInt, hexToBytes } from "viem" - -const RIP7212_SUPPORTED_NETWORKS = [80001] - -export const uint8ArrayToHexString = (array: Uint8Array): `0x${string}` => { - return `0x${Array.from(array, (byte) => - byte.toString(16).padStart(2, "0") - ).join("")}` as `0x${string}` -} - -export const b64ToBytes = (base64: string): Uint8Array => { - const paddedBase64 = base64 - .replace(/-/g, "+") - .replace(/_/g, "/") - .padEnd(base64.length + ((4 - (base64.length % 4)) % 4), "=") - const binString = atob(paddedBase64) - return Uint8Array.from(binString, (m) => m.codePointAt(0) ?? 0) -} - -export const findQuoteIndices = ( - input: string -): { beforeType: bigint; beforeChallenge: bigint } => { - const beforeTypeIndex = BigInt(input.lastIndexOf('"type":"webauthn.get"')) - const beforeChallengeIndex = BigInt(input.indexOf('"challenge')) - return { - beforeType: beforeTypeIndex, - beforeChallenge: beforeChallengeIndex - } -} - -// Parse DER-encoded P256-SHA256 signature to contract-friendly signature -// and normalize it so the signature is not malleable. -export function parseAndNormalizeSig(derSig: Hex): { r: bigint; s: bigint } { - const parsedSignature = p256.Signature.fromDER(derSig.slice(2)) - const bSig = hexToBytes(`0x${parsedSignature.toCompactHex()}`) - // assert(bSig.length === 64, "signature is not 64 bytes"); - const bR = bSig.slice(0, 32) - const bS = bSig.slice(32) - - // Avoid malleability. Ensure low S (<= N/2 where N is the curve order) - const r = bytesToBigInt(bR) - let s = bytesToBigInt(bS) - const n = BigInt( - "0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" - ) - if (s > n / 2n) { - s = n - s - } - return { r, s } -} - -export const isRIP7212SupportedNetwork = (chainId: number): boolean => - RIP7212_SUPPORTED_NETWORKS.includes(chainId) - -export const hexStringToUint8Array = (hexString: string): Uint8Array => { - const formattedHexString = hexString.startsWith("0x") - ? hexString.slice(2) - : hexString - const byteArray = new Uint8Array(formattedHexString.length / 2) - for (let i = 0; i < formattedHexString.length; i += 2) { - byteArray[i / 2] = Number.parseInt( - formattedHexString.substring(i, i + 2), - 16 - ) - } - return byteArray -} - -/** - * Convenience function for creating a base64 encoded string from an ArrayBuffer instance - * Copied from @hexagon/base64 package (base64.fromArrayBuffer) - * @public - * - * @param {Uint8Array} uint8Arr - Uint8Array to be encoded - * @param {boolean} [urlMode] - If set to true, URL mode string will be returned - * @returns {string} - Base64 representation of data - */ -export const base64FromUint8Array = ( - uint8Arr: Uint8Array, - urlMode: boolean -): string => { - const // Regular base64 characters - chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" - const // Base64url characters - charsUrl = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" - - let result = "" - - const len = uint8Arr.length - const target = urlMode ? charsUrl : chars - - for (let i = 0; i < len; i += 3) { - result += target[uint8Arr[i] >> 2] - result += target[((uint8Arr[i] & 3) << 4) | (uint8Arr[i + 1] >> 4)] - result += target[((uint8Arr[i + 1] & 15) << 2) | (uint8Arr[i + 2] >> 6)] - result += target[uint8Arr[i + 2] & 63] - } - - const remainder = len % 3 - if (remainder === 2) { - result = result.substring(0, result.length - 1) + (urlMode ? "" : "=") - } else if (remainder === 1) { - result = result.substring(0, result.length - 2) + (urlMode ? "" : "==") - } - - return result -} From 60b637f53686458c2eb480e5597fa5c0ea49b87e Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 14:11:02 +0900 Subject: [PATCH 08/12] feat: separate webauthn key module from multichain-validator --- bun.lockb | Bin 554768 -> 553928 bytes plugins/multichain/CHANGELOG.md | 6 + plugins/multichain/package.json | 3 +- plugins/multichain/webauthn/index.ts | 2 +- .../webauthn/toMultiChainWebAuthnValidator.ts | 4 +- .../multichain/webauthn/toWebAuthnAccount.ts | 157 ------------------ plugins/multichain/webauthn/webAuthnUtils.ts | 110 ------------ 7 files changed, 11 insertions(+), 271 deletions(-) delete mode 100644 plugins/multichain/webauthn/toWebAuthnAccount.ts delete mode 100644 plugins/multichain/webauthn/webAuthnUtils.ts diff --git a/bun.lockb b/bun.lockb index ef657d6afcaebff99197d48907bd126ddc53fce7..98c229f95efbfabc4fe7cec029e45f0d93bbc7f9 100755 GIT binary patch delta 113186 zcmeFadwkFJ|NsAd&R)Ep*qCz8u_9?J$Jf~G<&+xc5atkLW@GHYHiwCAa;V7`p7Equ zDUphF(wick)b!q@1F7gN3Kc~ZeQ&qN{qcI)YhUla@6Ye|`P1vtc75FL_s9A4d_148 zr?vD{i}!wLu{5Gh$IqgNF5fu#+B$#tS+L#w$HP2Q>+Zo~?*!I>|CVLXx6Y42Y73%IRdFr> zsmEs}CM9PZMwMz}j|D?ve*~mI3h|gpYIgX3XzF!X`c&k?3T%fauLW5^-RmV? zVsdsk@;9=z|0|FM{jDoL2V_HsAs;dXM85e2>ktvXf|*Fn&-mn|Ngdi7#>X(yZsHeP z6pl%F9r#`=8LI5$^cl%nhT)rZxru3Mso6Qk%kZ<{jKqx0)Cq=>oIQSeYT5*&_sx<| zJCOb+;I*6sHMHYg8>!iMAR~MTvfy3X{uIcre@N@OAbVz_whslFuDkX}fK1;=>tK-S zf4xcKeF4_R94L4X0d~m?AS0A$y#!@VP86PkyUN;f*)6KJ&i5_V<%q>f z6@nHx9b{*$iI!f%#Lb+E>bL7AD{dL=T>AHPmvjd~*7@6!QO&7f2c4=na zK9Wy7@@0N5XpYKn@UwwGfwbp>H8}4^Ap;gL770SZUeNWyTQnPKzX4*g6pTTI*wO-2 zm>DkA4LAm}!XJU`@3%q5!!*fCo|ruAMQFxP%}&h9O3XFZLf6ZOp3TyMF$ZA!1EWot2(!7)Am#iya2CV`D*9D``?<+7$S| zA1ckj3<^(4OPqL(p3iQOGw46<^_BN{y}@+Fx{@7c{BSAIw*&pvNecc&Q(ZK|r>1{3 zLMqVB?qRiVvuu>~O8b#g{Dbgf>noT#Wnwrk&xUWAaCy|vFB~ngGN(xZbV3m$=Ck{Ovo7X`0`hV)}c1bd+{?n!UVWe+~^!K8IoFp4Cq}PEF zDVz&f9_tZcK`TJcnwB7k*VpS=$=R7{Gm?$QlMJI7>|r2VUIpajx(^vL-JfGsiwd$( z5c8YD?I<(Fs6JWp!=m63%9sE@(+vY_r6G`>I5j+T{AA+}?RXoLiY@lpBN-8T()9Gi zjPTS6DcR_*oUFtXNX&{(&d$t8Nli=s8qp-a5N0ni^!IQiHN`g?gCl;#2l&idXNRUrc3pMb-V|lnPIk$ z-x=h9o<_x(Pd(`7;C|>9;D8$c!dr<|Jp#FbrP{ ziZN*19cIp!itN;^a*q_4lhqL`-7wO%-B;k-$d5f)ZLUm=6LXMHJ`5it&;Z;8a!Ni4 za)lOy+`ndM|2Xa6gp62$oW!Zzk8m278Tn{|^we^Y4dL-P9Y>P_X!eBf_#A$(G&nOO zDH-J(#>}k5sZ-Ia%ID|F^QDED7-^{!C*`z6Le7<`$dFw=5#-FAkc>?vd4e$pnlr2W zLh(NiQm@j)l_5JhM;#>8n0H)gv{F;{MnvFP*SSwxd?zxh3*7~z{boBhv{}0&_lqhi zl#X1gxe#Qvrh(Ujz6(yWy*jkDKb0@GFIM~#SuPn5NF`SzclO#+``6I=4NnzG)6z00 z-~?-6mz+2q{cK>DtW`hOx5Zb!Z{U`nn30|8+kA@kNYz*-?V1EOM;VuvN?DEVd9_-% z-?m(8@`x?%XbjDoJgx1%*bhN-e*Ci3{;XC+{%~Z@3EdW?xfaOIy2X@kNLne`egtw9 zrst$Y8u(0cq!?efjfLjEF@BYd+76KU_)g-(;8&vxa!_=2NBQe_GaRgduilNIIX$j> zL=uL8%rGY_IhkADUR20}ehuV;*b1@&zFs0Lc zSO~I?qt?sX$%AHTKL1JN$NYWyz5JxgFTbGg28lQ!dHnQ=sCGKGHGX1XXCvEgl#FkK zX5$}&t^+1zC57|$Vxm4SU0{e*2{ zN^(+C;uOR1t(MoHmV%zQr`4(7Fzi_=J}E7G7PFhK`{i1DU7h+PcWjo*Zv{Ez>6tmH znHh$0VTt|UY)=162KEcwKg__%1Whh^S@Kx~Hh|stXrvM56UXpT z#3zTmqVmlzIJQkrw4cGz0*+Tf_Vq%r5qQ^j$>?VA8t85yE13B&;ndU&RLd~>zbX}L z0dh=xg6ytMJ4A;=GhGdk4f_lBTD;U8L*QB%_Jj4o?5Sy~IT-XGcgm<_?2-%;LGA#% z5s$O%WstLP8Y;^4b9c+#_c*W#^zC3{@bnuptG@)gSK%C;j7l{4q%DJ3yAw6=c8N268}lqck?>=l$Y;Ue{v#N77$wK=$8UkP~4H z*c^-oTYyc$rr_TnDt~^#_XsqCVK2xIe;#ZIt^hgJ?$Q3|^`e^!&4IgaxAgmk*M*;d zDidJNAz45*wBP-ibkk3WR}1Niv_1^29vtmQfK%?i&n2T=FcdlyWQ*?x+2TEj$AW+P zLgN3jLi+XP!-jDK?7pWSt8bL_4}wg;27WfE!!6!~we0=%>*qi4t*nGFkQ>Fs?}Skx`)jz?Y2Qn6zG{tzX8iNt z$h=&2RI2wqG@IA=2Wi%)#|?wEO3R!$B{e4}cS2$=H$&sQA64!8{$Ee_vVYS3R7VD& z-3iHPGVGi|#Yo7G&(6upn4XTOI2Gq#s&D@Nr}>tS)SNfp{4BkHP!o@~P$|RM_lwwH z1=)1iLyN0*+Ek|nBX)7AZuC;zMjGMt?=$7E9-(^4ab=r`#GW#2Y z%aS`{{;FyPP^F=5Ilolap}-&&tm6U7^xb)$OhEsrD~DFY)iS%|@R5;A4_` z;h&QF7my=(2;^4w(qA$U%Ai?z!bO>IzWanT(6p<|RCsE3MrKlC(xhagmac4KQd06% z?CQ7vEnRS^26g05lMof|jGf4PRK zuGO1B7Tq#LwC|p>8gygWABLZkhzIV(v}~gYn%mOBP*YvNc7RQw9|alzdlbR=tH#M< z^WE#_!O!V*E7I5I&GBTkF9~&STgOzZ^m~vQl!F|EYc+qk##9%ed?e)j8V7Pw{&lUy z{|e;bd0}S(m7isfsV5B_THjO`usgsIUcfpaz=_)$WDj@|ksD+WX2 zxE5>+J-d;_zp1gQI=dRkf=69v8rOrjf{gbU;&E>J8hR3%J@WzBBp-o22yhffgDm)2 zj8X@1V>8oe2hN6W57um98n=SqG&j|nd9=21HK<@s>K|J zV>_qe3hhtVyj}CRDrUYK^WUpV1~oxes7!13ZK5|oGoyUX5t{8m#{a=3EqYUPt>!Gv zp&+ji?LZDqEs(p-!ei)vj_s08rn)4UF*3Qn>Lz2k3z`K?_R5&O1v_W?2F+z4(9q7y!*4Y7Rz#=cA?KAA?+o&w%Wq5cCj-dSN~cEMPpyn(gi_8FtYTYioWJB^mAl z*^-Aq7BmH9hLIrWOg)e-JJVJ2dmrS`Jf-yvkaMXg$ekcR6*Xy&KvNi)as5bXxdF`@ ze$++g#5|7_xE`95u=xPfhy?SX*?kQtmq0#;$qagF&WS-`O;}fhk}N*bs~Zzs8WVf*II|xKW)O zA)E(0m*b_89P%ng!ALu{d9!@q)i~;IQ(d4kGACeEMg@4hJ&BIyh;L1l4sQ?Az6ySBU%P*hi%$=b4N0GZR!udGr;(1^ zRiR>IoImu4h3TteLtH$#t>oGBTGY?KkSr@CJuzzvuQ9%7lD=!Heb zw=>9Qygo_N=Om|3Wxx8qfC)h<+;z{PdK{)da3Em(%*lG22a!+Lf=^PVgVU39vNBPD zoJm=ke2(TDxb|sM;B{a^TZMuRb&JT%742naa&NtW`Nspmmzq1s?D-777^6I1m#c@{M1z>7NGa*zeTg9us9 zw@51TFvzh!0z3U(?vt^M0BQHFu?+ax(wRD*@40jq3b+RLaUkcwK#=+PzL1E~y6G{j zO!mM}SY#Z#uRs>?iRLTzyc?V4mwzM2-l@~&>G~VcT$1a+=3pwmoWxUk;~{NNPD)MA z#;r+Vu~g4@gO~@++%rIy>U*X!K69p;)VWB{0UiZ%%lKfant}NR&6i34tOQx`8*p$j z-nLva>VgF9Xx|Oq1Z(_TBVO>4{hoD}!37nikpz1E8(y8P16%(Y{O zc+HpX!XaMkhbo2aWy3t?KD!XMkZMwHH9HKs z4~OcF99;I`za!lcEV!D={0J1!b1r+?Ly>mraIZPqwnli(Rd(zMZ_tl!d+~@Evx!{_ z(-7Ml={48eu_L`fXDoa1$QY{&deDp1L3UWY$C?F&PA{lphowbUgJ3a^xw6V_cK0D} z>kKR`D#!^dG$Y*@MTtE4QNKWE4Dpyd?b1vu$8rKJYM9qY9gVx}{dn=UIB>xWAE zwHS&6UsVmj$6C3Rs*QQn9ll_D*+`F-1r-k^?R*c4o#a-dQx$8BD%jq?H_{E!69WBr zBj!PAqSrbElhlBd=o+jvmRZdn{BfjPi>gl8a5FL(s=Hk@JjyzR5VN%Gumq1)AG-`& zXV`;Bdd$1+!X&S?8n!!OQ~hb3gOVz+h)%fTQlXKGG_|Wwj&XT#Egh&_ix7%q$o$AIo$Pg8*W54$ z*darstjP$mT|t~q=HqtZ6tC+q*hV>JiDq;#F0Ne}&$Sex&UW0;D07cpnC5kzhrYuO znH=Tn-cq;PHQyiFgODoOYKnVU4m(B&V=@A&qf*!{TuY!-f4TM{q#EuDy}@T2jF5ED za)0O}givZqbnuPnV7n|i%1pAYsb1Gc=#F+-VpP!QH?rqkH?-0nWF;ar6lJP?&H5B7 z+OJx)mikn)mre0l!=PB#s+`d72cbGcUEUSmfrT?dcF4MRVV2h%YL{ktUGX<_VB%&* z2P1$A=BNNFm=)z}+m=3trXnP^?FikWY@w_C7ZKt{i8>DTxVv=`sXE;`mN=r6VdIS%)@CPUrEt~VdHV;6X>FQ8c+<+bWzEr|-lwQdj; zn}_Lv>+1b>>_V@#=W>iOxMuY7)sL5h=};ql<+{tDIJum}hh;-|HSCSHaYwLH5#k15 z+F@fn?t@UHE5@`s++MK-tD!hhsy(izXj)e_QARN2%f(s_#p$i`v_6C4;!wTgy5SCA zngoQTH_)T5HBkNSvUyQK$L_Ef7sgoO$RXZe)O;$nCm%wHjgc6x7@aoT~p0qoqc^|6ZS1*dOMx#QEqNamu2hp)mBw03+t=Hjt6fZ?3rrMXS-+j*w)E zo;5@4!lhm-2~(MQpxe+9uRvj_nFnU`pHS>lRjm7t!Fn;O*;4Sd<<InD?O~TjH?}R?Yuz)%*D!1r=3925?F~9R#NKPi-~ePjS3EU54H`1I0?>7&Ox3_6(CH;NJwSOjtPSWKZ1$#j(A-hy0)|xVmD2+=$6U zKhDm$)@DGlBy`6xkLxk0KHRhrQM#u*salPy`(uWiNg>#;j+T!Zqz~UvzfjMy>oc zvkt?;ZjsA+W2_}rJ73MMA+U6YzY4p}{ScJuOX=yoXV zrf5=FvB&xiid`y)oX!c-Q_{fsQ0ytCg31!?>O*7P)>u6T{yUC-u&`Kl7i1RNr6peL zE!bF9j3;*XmgA(~41515k2M;K{h@rWgHV0#xCK#Gi$vT=!j2h(Eqy)|bHLsKwFio2 z7+fG`uwD9?m%Y2r>wX7GIL|K6yuV@L?7=3G>#=T6k`ctwb&ba=gkrAJz&D_OWQDqFYOCQI602}Ly)rIS58B~fLvM$Q%kSvQBbw#dkLZKPV6&>6wMV2V?86RoK zuJ>9OVd3(Y*u5tDx)psBR5a1vn;c{Q+m3zG>+U)U1t6mTT3|f}i&TKi&;YI!|D=i)tfByqN=mM1#U~AFu!pWUV>0ZwGZq@sJF_A3odwy zZ~x&8=?leKgv%MYrjMus^L-Gl72De5H zp;%wc=oDQ2p;$hSc9=MwGG$QFFQ{R*UHGim++>$N>$Sdv2iG4NS}SgxQ|!OD%c@S964hsnCZA4OF2PdAu*7Hw~e|Dzp=! zI2Ed%?~6AQAr;SBk5D|yRhPM-3;A~S9Wi*K6}!XhI$gk_ELs|6-7-(QL>)X`8BmdS z98Uim5bDn++RHXax*^yCT;Xt7?shNwRIT!b2+@ub(7P`~brgj;a2$%`jBN_%;_L0w z*SuEFeBX==L;r7u!cE7#DEBdh*w_Aj$=zy!jN9e8m3e|^-%iG=NKIu?@HC_3z z+{J!0_uJMRUaR)~zD3FSBcLMLEdK>{gSMyxq;(RCix78XII1bTfmJUqtAS}d0pWP+>mn^2uui0^!F{Q-+=f|_rU4~QT8)%Zv^giJ*|6srco z;{7RIpE0f-_hyt;dx`Iovi|{(H6E%rVya1EZGal26z>|&La{WJi&GGdLsOA&hI3EM zvSasPXM&BRr=I+|&q1*o{*tZM#nM&i=(Ul-5ZGvNbF|tneAjF3gJu(PV8sSp=RujV zxJ2M$G8Bq^tfqyv1d2_CyhyZVS2_iPx|F!}Zu^98%K z)a#lRgzu)Dd2dwdpq_lTTqa$D2ZdR@4J+L1wZ4LlhaJ=mH)=O6_bJ?{SxHds;KMLI zgljldI22Nk@VI`4Qg_)wEo^)5h!|_UZ5UmckrP%2S5zpETAqgyk^*>4Y4DJa#Y2m0 zFjN%xW87~Rmf=b2L-yV>KIgT{z2*Qrwj4+A6}mq-72KPl{8MH5zB^q#F1K*^zW2;b zyYK^V(BYN#-Vb7|8IFvR9A!2@afPb!v%b?x_Qsa0eDe*%Jfj&=(O=rUEz}>#TqD?OM|yYy8SL(r(8AHV7jP%Z4g47(-!wGYbg}# zZ}Aq$4bfAHu%Wlw1qbdo!)@!J7k7}c2fbEsiJ_j7)KO>5UQn_SQAd{zb%z~yFv|5A zLXmbzd6d=cQK=0s=@`&NsCW*j^)W(RAh_IMX9%`q4|%Olk4aqE4tlH^P^<@r;H$`B z2s|zv6J>2&Cw0ZBJ&vXFxU5w5{Mx+^ikYhIX!%!`8=CE^>MXM`=bm8e@xaD42O&HH z9TDZ;i%>jM_*RD1e7$cSvuDzv`ooX?|0{f_@rBnq3ky?Vfnjm>e^PFZaTA9#$J_j;^%pl*S}RS5SszizM>ABizL+NDRl)})QH zYSDE#W4r*xuExm@>Tf8y65&kg>hKiK4|dU+Xg30b5DC@6`mDLhH)lA5#zL`jc%qJ~ zJ_yxKmAn5nkL%x1crK6>W!AA{zxJAU*o9wvt+`K2A!rVoS_Z|=#N`fo4|_&-9z60d z@mQ<1LMt{!x*=FM^!ik6@Xz|DBX2wg*|Fbxt;MjhD(F=_4c`IP!!8oW+hT`nm3wPYH-+N8BU5MYk?9%VO*4pQ^n@>?( zhoHQ6+4oVd23vih;RxYDC~S`*gy*UV{ee&q73%W5s^Irg)@+0#P%PRx$z#0-#cfs8 zwJ*qV7`q{EG{!)&f|w=?@g>MHuj>*lxKG0~#5-S92bdvIrfnA<_gbGo_f+`|{ubYL zyo4w4qRR2iPY>%}Girs=-M|*+}zijXQF~(}V&36vxrGElc2bBOPYL^2w z*bX@w?S2IT$>)j4Y7i_!U(tG)Rxm91k^tMzHUE;cDE7f}kGa4uJ%ML;unjr9K}IKRuwLr8c;<&4s#6Df+fSb)|9!UyGeZr&D)b=B;+@1+STI z7hdpMC3}4X#~Jz+RJh7xKk9YE`%+8P>sgN#55@dt$6llr?z$3D8WfkewC5C*?j^LR z<-dKou&qO(daDxn^l=pw+lq7xJgzUG)KSl>SEe^mCu|{(ZcuEee|EZ8!NPR@YmxhF zSh(&kuaH~IeH#F-H|`lw%I{wxZ^ObKlJ;DJ;)uAN!PU@T`y{sbN}*VqJQ@2Nif#4R z#`1h1s}J7=6wGrx0DC{XX z82kYxz103gSy;+$ef*JJZAIPuv43mC+*kmW;LE}K25OvN_58&5C=9t<>!C*bd@kbv z(%B);M!OLh>N8s}K*jr&`=EcTK?b9sM)-X%KwVB(^-~#qIRYd=#UQ5KNUVX9&5@U> z(|(1G+STq5uL4}=OAx{rx(JmbBul^kXWS)dyUQP1;|o~_5#oeXgJU)RT!soYz)-D% z;y&e{My_vQ>8&1LwfcfvKpeK`@dynn|uCHE=k@5{W)6N^SnG zLr~-GvJ+8elv7yU^jZ^-$P+bG2}9no$CRBt$8 zS(uJc{rzRO{7R;yY{(;^*gl+*u)D5-8VIG%zUDQK6=HhLd?ywNI`p-(IK+&xZvIvl zG9GQ552kHLuT7rWybggD!9MBagCL*MxnR;cwl6!%JXA8%dzz4&mV#K|KM zik0+trnMKAaH-5#k9AJRM(fdy-lKTF0Uu6$X&&=Mr?56^`14U`Z*9Cv9`9ITsCTdv z3s}$o=-XVvCVPTT|LE)uLn~VSB<;qAij8D0RJ6*DN51V^p$WSq-CAH!_?6=cnY#X3 zx@}lEg#N3c^${#xVZpwK!(ii+vKOI)p%S4wDjyEx)(R-@8fX))tM5XoJ;r}Ru6s&` z3Xh-vigZInBC@K8H6Mz_%ALqtP%IKBqH!u>Plbt8r9wr(hjOtbKhr);81z7cU-h-#_hipK2^LNv-2;zVj@1DDegbCp zsm%1wrzMi8*-*E@r?PZyfWo8R$x+s42;ByIRd$xE`Wf1}hGGz+9T&+_9#;kwwy=d! zuBQ-6RPAwf_zlN56*N~lrHwEr3w}3@G1A!9XQez$H5}r{LG^UvmYC5_X=Bv%95lN^ zc9Kr#{KJPK%7kLC<6#26Fx}{sUWWu1v{5}ZvD*J3LxJ%|Pi8?eGucPCLP>IruyqWI z&4v%xvTM&vqfqQ9kGnS%)A?tXYYi;j)yDJ%LfBUDwNmp7lExp)8U#ywq?4zK_i8`# zEb+KrfWkAFk@zn3g44IT8RKsBr_|tb`aZDqLi$GPX5%5KE`C+>FIi>i_IVyF8H$^O z+@zF4$y&ySYhLeIEzvR4F3OUw>kOW0MmmMC1^s=|+1nB;uKOj)I!wJBl?&C`mznE1 zC>#X8jk12$b~NDaNcZ0|g>ddT<}s%`u{U5@zu*)C)^YeG1Dsb}oelge1ooAcgAf;n zIt{sBg5r9+ygHA;A|t{LuemAzdLhUOTY`;JE8N}GHa#q<6-qLKOf`{_BPK*N6#HAQ z?HN#17l>Ixg5(|45Os3OI-zWa_(q7U7@>G^ ze}~{K6|@#LlIiDC-vthAY#K9E(J+Z|4&eP75!$mQ`iwTdAQROk)B3_$K26 zk85;u(^#bHi?c;3{H|A9prTI5Eofj%pU*Y?dVl9WkD#6$&2BJ_*^+p*6B~*CYUUII zuE%aPjeDJt&SsRE?pR%5`Lq>Nh1`i;TXV=l`b%hz6BmgIGwvqSnCTQTco0F!)HS$` zuQOex2+oi$_TJ23S#M;ZLLu!DYHJ!vXM8n|*50EZGrK3TjaRda;t5z@vwebsWf6-I=xce4R4`)MJox7nZ&*0l}%V_C^h1zD#Dljo^5UvrOhzL;baQ z$R9L=oYDcNx8VcBOao7a3#wrn)K!x~eq}l>2AZv1x5S&q8YgZPs*O;I6q+*JG+vWn z%MrfDnlCxAgK#(q9_jQQgzb2wQwnL-8YLG59FXwXX#!M?Oinx`cpQqCTEhwJVtT9( zA$euT^uyVps$<=S^u6zvZ4eIx_IO+cP*I#a=BrLA+^*kXz*m)c92num4#Ccq;S>U{ z7f1UpZDte48j6gjkCCF)b=`UqikA?q8JvTTL-7hK2k{mOSbKhz0VNk3zNo)GKz#6@~}PMrT@zKQf?l97j+|~FCxgWN|Ibe(aZ&SVZtdKiGG;| zBQIfwdRr+NN?-B46MR{lk2-~;(5c_RGE^OV+-s9fV+>OHPhnMRq?q;t@!eeB6pW&J zSf7m$Z>Hr6wiBwo9k(gU{WC&?n3gZ`INcYRmQy$y+2>B=#Yr8oK0*+uN4zN-J;~%_ z?Nd?Ke1zB*)E?)m51=?m7|sto?rT$}t1e%M`@_Pyg;zgv@dAWXn1B+#g0YuVlz`s4 zelq^Cs|4pFc)JQ(Zz3pLDGv88_Y_>3CC*?3JE)+$N18r>`o6ctF}83Vdh&TVWb|+} zaGir1CW*(Uo5pYnZbL9uf`20zp>77kGw?5g#W)GUeiD2U!GS7h)^tk8qkwUlnEmVl zXITi=%OjAyFUNhtSdZ&ls5>O(%~O5lne!ZL0#?P_3a)C?{4GsGP;OiKhT|s3N=54jD0V-dM`2=}hGNCU7oKgZJB}t?$5u8}H|681 ze#5aQqCP=REMRrZkrji(F&^sN1BJI<@zmpGgz&U=Yn1gXLfw&CJrA^cPOmtf^PqSR z#X%dj-3rBHGuBR`$ErHR7n5HU^@QT-5t9Y4SkHmtioQHqUVw#nOj7@#nHAOTP+a5c zg)wVB6z`_wE4 z;2C&`4kZiGI)Y##9I9tr-Z?z;sTJxV7%#z-2;L>Zesehq)zgSxdA`F0Uxb?vr8gop z@O3DT92$T}d%r@la(JGCh21t^6rN(N@wk$q^y7_xA;`%Y#@El>;RUAA14^~XDVU5$ zsIYK?V!C20-K-V1Sv>za0mUK5_jeeYmh(hmNH0YOLkyEDzl-2##KO^Op2v0ly?)0E z1X(ohcyJbf2kH)|tT8UM_2-+02M#15vK!2uY@{9}tulxVkRz-8Nc_ z5sXK|+RpyQSjvqTA`+xbz|~N<`&E@ivdnQ?fV$reb-9&KLUCHj(eGQRe*Sd*?vq^9 zY0g>-#h6g@@b7q_20>k(4^8i{xP(VS`DJ0>Q=Mhr@5JUJ z%11DAD6u6?_E;f{fIb~X}x1*5DBtW2}1Qwn3l*$<%imC=i8J>d%EyZ>Xg$E>f?lRIT%tzG^!^kZuL_NjrvrNWI z=Jpd%a%e!&LEkTP78meo%yQ{p>>(RGuKS@9ouYh9(&GrSrueo3-)Dt8h4YYqiY+6I zzr=)NP0NRHqEJz=|G4jm;>Le@c6XS6hEvAFycQRY#tS7f%$PCr zu!%r%b~aG&c0jNjuTvMR$VU*-4k?Oqy@F6QL)ICDI5Bat!bLH9jWh*nw5Q67HKyHf zXgABfR{s15*5N3RH2_L?1^Q_z6pNE4l|%6gtsXO*p-${#Ozb{RAzr2e661bMI$J%uwzfmb;ceMV zk?wUe;8@nUP7i~^`}}D7w+QuhLTuip7NJ_x9+!Px_Jk*#*kTlW0Y>?Hs^b&VA`C8; z%ycN(RPlAF>q#g)b&9}z{Q<$7{oN3@UalM%5nR{fpdyry-)Y_hCG&&B`6^UjRj)cv zs+M9%hBBl&5p&*!Ml4YXmF<)PTN#5c9{Q;x&Hbu8qopZwJ*c+6WJq-eI@`K_v+sgVH5Q69 zA2SyZ%vV71I4HIK0E$N@%qzS`Wo==biaw08dLbl3!*@OwYSloUfZm1TN~ou{M3-Yd zY`$*Z>6AW5Z7e_O4u zL>GLRrbZBcaAr{-lKFJdMCUs9tTnB{^kQRIPV|Q&E-C6mG86QLvZLeGhol|HBW1^7 zS$!0pch;KC!rU-m0;vyaIu~KiXDX~w^{Gf!4d(!ZRmY~Na>stIJ{8G$*wt03L&eSS zW>x%ntx0wf&PDhWKL#HksrcjY7l#m3-y16jo;j&cMY4bi_#u;(SICTT-BtEfZ6|3@ z)A~wegEO>0gMXZW38vwP1!U3Tggzue=C0Ie}NrC!z=jVQ;keuJwc|s9b`Ut;GnL$=1$F6kROr}`)f_shfdP^ ze~bD5TN(W~`LIDLx?!mx{>wKe>lRfcyCw~GjxFwq)#tw<3&8!U(Hz9dNu|fpK=m*# z{EE1qs}EU~he=%C_%}3+tso12K}YzXkm+91=}6OA`?y|QuRyY1J2ZFdXe5KX@GBU6 zQ|q@h-=-5E64yZEG|07aPW%7Rev-lS_(lIEZ3i*AwSl(3wS#2DU{soOw>n5y4b7S$ zE6hKGO?z#SACeWl7G(N{+TTdCvF3Fk{xg~ep?qf0j7pOQ-l!wC0;z8SnPEGS1$Wf+ zfJ`5$bri@C$#^j!E7Vi#+d=$i+@bCL)UFRhKW!MOIfSwBA(_E&tw|O*LUW|HleCWl zX&Q}RtiV{1>65fQS=%RRdw!ZWWP;3Ks@B<>Gc4kV#RUJ>c9I3`16hF&w7nu}->?1re;x2sk<9M^>~wvq`B@N7 zkNkY56Oaskp*6{Zztp-SO($+6I*{&fwfmpQDBtUNB-0(!`k%;nKk0ZR+j&B#|2YV= zl!jk)1d{q!tt*nIGunP7ax*y(KRfCo$b$KcI#>xI^LJ_Os*=Q5V&E=RT{|k0YqAdP zOn8mR`^g8Y!28TsYfKr*9!TK^MS(T{XIlIcFynpDSM zZT~{s{{!OvvkROr-MQcs6oEUBQ2Fp>)@ahO8BlG}ix?Sr#KvtwL$PD|@sY&|)t^X%v zJ_GZ0!hs-LG8ANn!$Gz%0c3^7flQF7IUeMP?;71l6EPx3-fkpa#eag=jm;c%dMNqCUuYjkLaA>sBD+ zwFa5KjSKB(pe+nM{&m(7JRmv&`s^jVPUFMurfFOcyrYF+|4 zMT7B+EE1t{Kn__)kdL%`RnyA~0rj~OnV^sMUy0nH2Wfvr zvI2u)C+`B;?x7&_<6qOI9$5{`iZvVq13x5nqShoMCTU%f%qT_MNyeK5vhy-P7M!U$ z736?U*LnuX&y0KoSm11s8P3&?|As7(>G|>HGas52DAab6@gC5+B3Z%wCE8JubQEbj zNnH%Gg3CZ=XoGCgDy<&|ITY(b#(xrI!!~LCwB|D)^VtF-pL}C00?g=TF&M9aO!z9u zh`Ti3(EhhH-_iE>wB8FcUAeaJ*Y=M<_Q)ZvKi530i1Ggt0VezwWPwL@gk#!%LhDo7 z|Etz#v_7l#A6oyZ^+m0DSH}ETOa#jm@-iP}C1WCoK# zwrDEI56OyWgDhyK<~`a^(x0a}4`e>`LG`$Kp*Gy7BP`Z>iPjH-tk_a*UklFX;%|bcF3%zpC{vt#@nvmgXL9e^2Z8L00tN zTJO{T{aSwva<4xOvH@Sa(f_R3w>rX6kop+N8lKelU$p(S=5Ly3HUH4O0I~vqf^66& zkOc*yROTBD(q0W@Jas<#w*bANalAh$chwd|6)d@V+qJlMbcgjJ1=_Mwf{=w`Qsh<*;9K#%ogKA z9ls*k&`)7!#SVe2aQ6n-`+Ove+pu51X@Y(ZTl z2y#xoZr1O@4r-{=lPtH9W@Bx?5?xN*ZnJe4-bA!VG-lILNB<`>`%Z}GayIYAIq%=Q zP3|-}$HPWnG{_ou*SZJDGVTKT`6seVM(FgTb$pUtG!~>kS#t`=^3tm7^_mU?KP1O} zhSnq_&eWP@hOC>z|P+CVb63BQ=()0)qK zT*j|}%;;5+9kdhVhopX8Ym(`AgRH3h8DxU4AU_q! zmPTtk$#mVcz7m;#ckL$`zlYZO3@}1(ZKz1@n6cX5A7qQ~((y=EFkWktdX&~AD>_;; zL313)3M7IkH{Y0`9VwcVKz>MOFd1ZmDcVlbp04c~+D@{9Iodx%`)6vM3$j6Z+RmQm z|1#JpMt~oZJ+TaA#FZcmTBYrefGl90_HWSkO(5evqxBY$6@E^0E68-)K*swQ$d4j7 zEC!fhyXFqfS9L^^33qDyE^Q~-qC>8}{l{71ds*-5+kaQz{=-(m-KBf3);-~Llef^P#}efy7HarN!Lt8f3wlHgl|ynI}J`|s-8 zf0ze6SzLYl@9NusSKt1-`u5+|xBue#xDFqZw^di){=542pPmx`U)~PnIqT}%e|S>O zwZymn_#xS+SKt1t{MMgOUw!)z)8p#fe_SkqZv*m6nu>4z(NE1o{MEPruD<ITc;MKSPWO-bD`wx?Y z^W*B$+N1LW|;Ae9<5b=w` zBEb~z=s9If z5$qDw`$HKs1bYNc&nx2$LAjvS1!c?=91ukOsf>#RM+BY!QpRGzQ9;Z_Wn3vZCFpZW z8A}9b1q1$8#tni?3M=A+(48x`@V8UdR7enP6NCmSV~Svxpk5Va%n>_ zE0;3n2@VJ%sw(3m!4W~{YRXtFI4X#7E8|MRDM24g8A}9b1p}%p;|9ScL3|Bm+#;x2 zQ>g^OHbH2JGNuT23F?I^V}@XlplK~-oFOO|w5qL)d4dCih%jYbBse1ITt^v;1xE!j z*C^vk!6`wXYn8D?a8@v&t}<>AToT0BQ^qZVs`Zsh5Ns2KHc-YC!7f3)hRT>B*du7# zNEv4c$_1?&D`TGEfFR;JWn3gUBIw*i8H)u+1u;#Pai!ptpieVpED@X)3}~*58w8gG z@hy~bi=b*tr4j_&1fka}V~SvxpxzD2m?79BXnLbE&JdIfTD4NfJi!4$L~CVSBse1I ze3LR33yun6+9=~n!6`wXo0YLda8@v&tuk&9ToT0JqKsPvRl}7^5Ns2KMkr&7V3(lY zt;(1o*du6qn=;N2lnYw5Q^q{O0YOB2Wn3gUBIw*f8H)u+1u-3!ai!ptpid`dED@X) z4Ct(k8w8gG@g8N|BB&avRDxieAhe4zrU-Tk>UCAd48a~j(r#Pa7hp!r;J+!RR<`QAlN1d9jJ^cf?a}ogOo8tut(5zurkgNlnYwj zrHpxk1A>Sl%D6~yM9_JtG8PMt3Sx#S<4VCPL7#YKED@X)3>dDA8w8gG@gtORi=gUA zr4j_&1fippF-5RTQ15PK%nl;;Ex81F;8$n5Rs~kiv&jmohK_}vEZm6W{NVd6r2+DNmIrW!CAq8bYX>=880QpOpAazU$XWy}*C5JcoC<08QkLFehp zSS&ayh?${`D+Q+neP$|SiQueYz$|6lAh;xm&sD}Pf~vEXN)T)lgx;f!DS};sdUKR9 zL$F8CbgnYa5R?mA%O&JQSKvEZm6W{EPc6r2+DDN@D~!CAq8VrASQxFm>wP#L!fsxDP3L9k5_x=a~U z1iJ+FmMde1V2_}wt&B4S<$_iZDPx}CfFNRpGA7FZ_`=)Xiz`YH}6rnPr_ZXTBg(GF_m@1WALthEYMrUIWFEK^v10V^tznY>r~p} zb?{!Sq+Ifv>wUQpA1YE=4==5mM7tDvLVoWjgz`TrA^oXZ&@X8U8mtji$x7ZH zPM2-U8?g=Ewc7&I_HvGk_XxdluLOE;cUHfm(iXo0@5M^qJDk{mDR0cb;NASMz_hW> zdGVg2cg*%cZ$D?#c9phdJG>z~0=;q0$Q{Z%UA1Je$6wu^Vm ztME2?Ezmo}NqtSFO?VC7vP#}zPQ#tb8@dzTxjO^X4tGk$yNllNU4h<_PVO$1He(mO zhbwvScG|qIyiH$+x9Ii2v}2q@;w`7Q+wMT`Sf_BeN}IPE-jkKQiB6X{lsDoHc-OuW zm^R5dF5V;b#=RNnO?FnlsnQm|3Gc;9-ic1^Tgn^r7QCC^3QU{ooEPsYddIvS=$+zh zdRwI}c^lr4cLKfX&d7I^cfdRF?yTg^bgVtfdx_rkJ%MSbIorj%We>bf-VO9-JE`xg zveIlP<81Jf2d=f!)9-ZA?Ey$?8>_NlZb````vAkbUn zjQl`(2YdkU&Pv_~9c#bxUZOXBe_+~W&UW!`*$;1%4+Finllq}boA4pLWtF@uoQ5AM zZ|Fzx&iyDbt>cu6cNe|k9|w9@JGmdLv>6}6d$^MK5vR>3%G>l4c#A#>OuN=OB;Im* zyB!GhKI#-6P-*iHzgm>-1z_d>|$HjYu-ndT#y-zx;KUHaqKZW;V zCGSQj_K@<%9D;ZAp}@48ob%#6Memr;0=>^Tn?6%%OFn});%p_rtk) zm(%WRpCw5B9nsgFLcb+gS#~>LSF*g}bos`Y%5d|qkG|~VheTY}YhlkYmQ-}zD*Zq(X%&spcU$W2PAa~>8PkxzYxR*(7K z*J|;;?`-;Bc}u>BH{@ubx6B!NRCxy+g?DEq?>@)+L3uCHoBl&!+WpRU@oxD6-X_Na zy&pNL$5h&cWAK($@_ynpJg&T<$KjoOJTUD+r&PSV=neld(0j*PaYa`>k_a zyhrGbI~C~t-dTN0r7b=M@5M^qADq~ql{e;RcsKtXnD)4HUc9I19rH_|_a|r5FDh-x zFYt!^8t6UgjQmx32mA`}&Pv{&9qY96UZOYsbYR+Fo$cb?avI(yX9B%voYXTaZNeFN z%PM()cN+etyrI9rJNLK1wC9{s@$RBG{P#fbc_;UGl{Vvdcn??d{^_(itGrFm!drAU zFzrR>ka)}K?RKux{c(`9_?+AypM(1(+?DQ+|4>;+`~mOUKLWi~oa5p>LT}vpK(EVL zeO{$4J`eB3O5SQt>;>hGxd89x3xR1Z=e&4N(L3hPKyM9a)1NAB$)E6s{1xa8aYp{7 zyaWD%cV{JUEyud3yqD-rzZjS{%-Js9Ef?W!aw*VzjgxvwrA@d5Z&@X8U8mvS${YGO zymS8!Ok3Y674I&1SAu}Hb>2w4Ru^LZ`j)AfUEA6S|z(zt!qYScftuW{BFtw94(M4RfPz%6+J3+vY{x6QZ^=QTZJ8meiDd-mo3aE?3=@4>c~oSM6v9O-bNAxAA%2sOQsH*7a^+EtH8 zO)BhFdzh((ov`Bzqh1P8dzrd1jv60>x+KOMwvV~ss%NDp7xAk7%)%m0*qKF8Z-%J- zO{-W(Z5WHXG1eP)fVu9fm!)Qx7sjG|81rA1Mr4Y6p67@`oI@VMu<*3CZK5Mf~i}^ zQRB;?E-B*;JJDQl)w5EQ%X-yGW?@+;?98&LH$&9Prd2sdZCDOxfwsph(?UY6Re zyjPuWGRiw)mzGD3zRRnoo33{`YTLU|_k^gkOjHF&y(KlJf;a3Ov&&UCRX~la=vC*L z0TrFF-7BIV4pHZum`aYCvl8mKO5U)>9B|dWQma(XNG7u&c}kS3N5=xtdp9 zZ5CE@!p^LQdNV{_Yg$!z)P~hjH&*wC%`n$p^|I7%HN5J2lTpJ7yR-&sbb?piXu2ji zYTE?VJt6956IIhuZ%Iw5=?%Np>~hsjHBsXdz3MhIAkhiiJrVVAh`Qax)N<6EwNS^^ z@`l}M4!G)Gsa0xw)m>(EZ71xI+Nftj)ZL~+9Y-xz2Q|HpH|!pB+EtH8O{(iv_nE16 zov`EUqFxG7_nW%)95uck>XLfiuy2_Qu6kB#a(%D*j#*gW2|Kes>dg@KJ=3azqc&`S zy0L*b>;ZG#RWD2JmgH3rnT#YS?9wFE=!RbPu<6>+QQI~|-4mi7HBpTm^_J9>M&7W; z%`R8n)Ce`Mu~+@b3~20x?cNymaESV`iD}}fIh&x4YvK)i${cXjy;7^(?Nv{k(RVvx zhun>NCPe+rRJg}ci`|2oevdco8FSiIk4Q~w>Q%omQ=2+r$2Ud26r!Ftb(=YAd^6M~ z&Aeg1G8bI+tkmS@UiBNZu(=ae=A?kOgRSQRL*aCH93vbv9=DMq1mfEeQSN+js zv~ka$6IpC^$rB+Gys@KivWGC#9WYjYu>J3w&t)muei<;in z8}_C-?W#wlCbbLq9u9|_Y3;(D!{K(wmymO?2Npc)_M5uxov7p6qb_OhRm05%S3N5= zxr0{?n1vmjuroWL-V9N*m{#{WYQy_bH{RzB8)dG$>Sd|jI(pUYCZnShc4$InW)Z=dP{0bXK&a%W|ymO>Wmt9zgNv?2Hfw2?S4P%;SjZeiRt2~ zIlG{a>*5Vt$Q*Fhy;7?@;8kPH=m(szLmogq6QahN3SAwwSXb2auHLY5=CrFGk(%_N zS1oR)KInuU{~+q65VfSK`;eo?KZLsEA#d2y=7Ou9m74spS1oH6KJ0{@`7r9u5VgE% z)y+{Gc0=9R%^S9Yx$df$rFQG?RV$f{?oQaH-BF`^c-1PVYY#_l+XHn^h+5S|^>ox* zQd4?*!&W!DTy;}V)VN+=HNgz%<%I3t3-xe_nrLErJ8I6}sN;Hj!`3zjTy?M1Dt)|a zT{F6m6Lv@+)H5M!eN&;YqZaFnn%>tNHp!fJ)gw}q`gzqxW@~hsjgHYoJd)1C+ zz+fkA_ra)#L)6YDCdE;6rl5{X@rLbU4!G)Gsa1w})vjjr5GU-AA*g3U)Q3!kp^jQ? zC~EppZ`f|;w5uMGn)H}g?O~=q=7b&p80w`EwU?N4*)M_BXADJ8Hw>s2hiS!wxXlUG=imZcljCK_=q~C+yNEP@_k9)fCfp zgrl|{fx0I|9crRRI_fQ{DI>jMhnZcjx@jb8+$gU)+zc4ygzY{G^>Bzf!o)o3s5zfR z9rvU+>?m`>0`WM$C=ZvdPHi{Sg)FD zrjB*OjvtG9DMX!M>OSSD@lT;HdCD7hqPgIzXQd{O^Qx1~!f{U6nd4AzhNzQGtMQK7 za6Ib9@!qgg&2?A3EVWyzSDkJ$Qk}3%Q&FSSylT4Xn&zl&(@^(>sIyGe1V_CkHD!V~ z>>RVpRX0sQjeFXw&NBm^cEWal8uf69I^V=hbkv*^QO8a6hBfAZtL~Lr;ZG#RWD2JHs7lrG8yxouuJEM7c@B*gg42&=09w@ zE^ySg3kbVsfj8_?6J;FrmedsERgarpuDZ#f#y#&w=%_gt zqK;eW4SUKQaMit1t1R-Wr_Ja^PS_!fP|t*@pP34a9ktkE)bz#PuxHF^S3M#%=>@O) zg_-(-6L$OysFy<2^QP_+M~z>Cx@3tr>{sT3tDcpbywt0HV-_xT!p>ZZdNV}*&a_(Q zs128)Zd~RKd%;|H)yq=5E%&NFnvCU6*rm%+qgQyVqQb+6PatG()V zGkUcXcF1bfGa>2?Q(=vx7F&awzQ!B&raA4ZN2DgL4S4{LFw@q$55Q}YFCk|h41QDh zB`50mmr$3y4r3 zt6pA5*lz2+F=sa!>z%Mm*P}*n@T$?K>jp<{y8(4ih?>hpZFJOIQd2g1!{#x&Ty@h% z)VNJvHJ=%<$qCzi6YAj*wSbA)?5H_6qmJ9`4O_?@aMit1t8DSAF=q4@C+v_dsAodd zSW{uEqZZrBgf(MpcoR;8M{W(*pYPrX1p4}GidGEh$P?-5jco#FfXhb2?X?u8Of7hK8wuc`L^S3e`UJZ{eFfZEq_2D%A zZvp)W5ABWPo40eqtKs#-qMt74{67n6GjMb7T=7Zx-{JEbcZ@J^91PDI$X}jcJ2DgY zhc|M#qWi+L#$>t6`Pn2VvVOyRj~Fnxudfwcb_LEJCPV)?le|B?d{m|CK3`s+FRg(Y zb~U`JS-wBKujII1HJu+?O6xsfNc_Oz?*EWew3f@2HPzn?ZxJ=tUY6N8;mz=)S^RxW zhlAmxZf9t$lc9SLg=dZ0($&pS#Jo9cs_rb2Bcf=SzU%lM6P2UD#Qts}RRNFp8$NXK z$bP>4JN-w)i--GDc9#4wd|p_f=u>3C>^~X4(+T&)$Kgf&`*+UyIJ}bIKV;{gli^?Z z{cU$H`6N6x;20b`6MofSd*}YM;lslMKdtpt)bcA--hCOCtK`_fdOrLQ|KmHiei>dV z(qF@z`96G`znqzKAv|B8_d%-fpK4y)^XG6U?-csl58?UT+AOUy{o?S^kA3L;u3TE{ zPxz$;Rr^q<+D)cpgXM_2{-yK#$Zi`X1X_RR^W`ud_J@}?A6zAqOMc)-9L)Le!`GU$ zYg|WPqB0fbQ75ULqOEt zuivf8pT+sRnK^$_%1(v+zJf}+xS=RlC6)ZEh+n^umo^~IumA1CCeUwq9};k4*;z7g z#Lz4%dt(ME(#VD&M1i{lZsT z88abk#AksPgGk+}gs5NeN_p7i$re#QJZz|c=dw@2_qb^^hxn?Fy-CXzQO%!Y=hj>ieZrz1o#EH-%A}3j8J9QWfq^QL+fj>#X=L;?X=5XL zXJ-Gu|NnIjwDRv{4sD;yX$mz;^_^P^1-km93J2(qK3~szCT~ojQQWP+-H*7*?kk!; zz4NHgWHT%#kS}$LrS+eF>D5bpre-qD?^3>LmQw-+EH@oaBP|l#k6)j3YnKK8Sw@UL zGcA`De;&)ta=BFJhwO^lz_YC(eb*OfxjB|oxE{(SpShOHfxoBa=2?zgh;J18@cIP* zpYELapS0Y3YeyINjq#_-j9*Q&q-x+PYiKOTDDyF1oX_)?<7VL-Z@Gn*%LkWcxkZ*! z?M<-UV#}%aCR*-=5|-qq=6lAHOW;(kg}{7MGL}}l$4bksc?{Adpw9}+6~X_Lt&EkH zi-mgtzdoxhR}_C&%e`p1IJhgSbv~;tR}BBpE|=zgWYymMa1GtL0v@TuHd# z|B#(wxl(ZY4MTm_S*|qxJ!D#~yB<#YF9Y7T1=-}-(Mn|@`&)9e4O|XxAe_3v7R!~# zA8qZnT8^8(?^o3*pO@hzR{)zVx82%RgxhMl9dPni0xvs1g^cG_OIF6efF@B3y=J*8 z_!rt{dfi4C5BGxQ_E@eeTr;@BxO**E4gWEq&pyksB=NOz7=G{W4M^pt254u=H?3g; z*NOP`dCPLFTYR-F_cpFdtb1W?%e`mqSiJb^Snhqx)rN~zd+<2`N4lxLI$VsghKHBgj*> zBb~5ZW4KQ&_p#-gz#UR|fZVDkT4W&A@C( zb;dIgYTD*tGMqZ&Sy7_qVpc!NZn-{|Q$NXJxxV-_NX)7KXiN5kTmz|&lGAdJ;8z6dC%G)wAOC6+QJ=_d zxkvG@wOk&{4S-{v=zQ{8ZXj1ff%-|lfc;shL0qV<)KT(VLvT^<)51lS^cc`@tLhUAr5*G~eTvD{i?b z;D*Dg)0VK@2>dOrT}jK0gez;gQkEM9r|Gzp>c6xlpTxh>_UbZl%He3R8BV>soV6Q+ zf2*}CZ@IB>uUPIb%kebl+hMs1mKz7Rz;YGgoZmYh51DSsD%MaLn*ygMh=)^$O9T7y zXk^r|b`$Vdvm+zF`Sxi7HDI+yRF@9IMtxq{~mFw<~cx%41Jnf!@2lnsP=DWxq0~Y z%g$>5=9YU7|LbsS{}z^;kN-6|wSP;?Ex_NLW>WjNf>Qa2E9<*Fr%Pod`*mCVG_X1ou%eA-M61bi&m+I>PslqP>eXU_~{=F@?#&T-^K9*aH|0&v7?cdjOFX2yyQ~UR`Tn7Gl+ZP_O+&Z}Zy8o+P`&)9o zNI13Yqn6uXIkoEm%WcH3+qT+upyf8<*KJ$eAj@sWf5z6bJ!ZLA;G(nod}{w;mfMa$51c-aTW$yb{FWQ;a;d(ZkUi+F z`aEF`U&Y_kawFi>#=Af-ICZE|mU|652{?_GIdF>bJ+P5TG+O3a?tT25EH@ucX&eBX<>9j! zPA!pokgx5QTm`8T9|CJEx5h^J0o-7?<+v|d?lAro%dLY`kR#wR8+HpE1Iu?5XuYrk zcdO-&;b*;&>X0v6@;Kx+{41@i(tQYCh0|xdwfhLaBGPAv0 zibI(>392&`GjMll{V(zqkfDavYu4}+{9jNK4WZp|%FJmXI}M>d*6vgM&9jgp+`X3j z48NA{8X5a6_c{KocI3Qa<2$4NmlsmQONL0v+Krp1-tqm+^P9@qG=aCcXli!)b_rW9_c0{H-ndosIAs2FW(?B^&rB zxOUd=vgLk;YY4Xw_lk}17yP?z@4sfbU*TT2+|M@bZ*WuK_N)GXv4+3npDGgfH#mj) z1EgE-FB|weoaX*Fac^4gPyCwu#oe;p4g60L_AT7M;gEfQfu}9!$4yn$+yq)8y^R|N zDee|fd%lYs4yV9>10}2pCt&Sltc1lyTFwurgx`nDV#9{PDPeI@)-GJ*efXrse z2n^@K>66`Z0k{R$E(e@46A8D_ayhMC7Puvr%VoK&aLa9cxh)q3x60wDe?2sE?aRj3 zi`GyNjpDNN^^)cCSx(1NFT))`&u_VCxM!?g0XTKwoN#^N4&slocAOOW23flz;?(}R zA%|Ep)&|Z4_Y!_h#l>+|VvZDi8J5$7DgS)=;M63Vp36gU>C4ZTnnc`PmMZ|KCef5# z0ax)AgiBSMh^%A{Iic_k!>>SU%B*W=Pn%k>e zE*5Sm*P7aESgt7C8m3@AslEhDa{S?xMANQ*n~FcHt!$8x3M{;-^W_sUuSm4>WftG}K#ECW~3a`i1&7Ot}88d$CzoT~o} zi6mLBJe)EuuA$}bf-6T@P3?^=R{^egD&#rH#+IxIIh-7xhihWFN^qB$tM$3ta+Tqp zu-rYCs{*GXt7*I`oZ2`ZP8s|Le{*YB6;2rxm)gRT)vV!nkS#4&-5QE(Ww{z~O5}UE z)^JKB!EzVy-)p&=a4F1=KftxM9OqWP$1K<0jW5+#3-WPDeLA?LuQuFpYj~dxTnFw6 z%XPALb>UPx-77j9$srQWamM;BaWx&hqNk&Hi)U9Djfq$1Q!MNc;h z+>kFtDDEN4HG<1yGySmT8pFMXUmrd3Xp}U8Q+&Gl^t5(&+xW!wO0}f6;g!RykiBu0 z!=`W=p5pXm#HF*pI~Tt`{j6Pcgn9UN5~snUrY zWXaZWH}LCjrZt}ex8ds&e%;Nq<`Z`>UzhRgGXz&9PKHw=y2EK6kzHH9l!my+E!Pf? z0;l?P*VE*J?rRUJ5{nyQ4LiW~;aYdSk(Rp;PLqo6aHA~O5l#u~#`UD-I>9MnaicBQ z*~X`v*%-Ay*S`DtQiQs5jkShd@N1&sF6A_hGWY=gPH?(Ojkk7P@hf57q=L=)Abuq* zF3s9Kg#Twoj&4X3EcdYPzvm!zM^edgeBJm;htmydqUE~d{~As=q-QMG1OEs(-H;|( zt|$JibWGilo`qAUd*RP+IW0Q4^!4T|8ZK3aQ>|ei{7(^~KGUsXU$`gWbd#E4xqkR_ zPz(BKal)nV5x!Ilx^d04Tz~wk1#z=1_b7gKbluEmtNoS30bHo`BGtQbd;|GXyXy|8 z-YsqrUuq`Z&7QN|VEpPU`pman3Y_|iZe|NCHw6D`pqrVo+)&+r*IH7;1+VWhzO)~p zJKRFc4U?ZcmhN1OEcZBmWl%S+#g-e6Uwx(o?hBTC0)I_vQ1_W7mK%XzVauugms)Zp z{t_7K#<0wCqwuR*tKcrT+>`iKt>RW#ZZv*HsQG@S<;GY}Q~N5*jm59{YT&*Ir}Uk3 zNku4fwKW`P4K=r~v7F8&WhZW}K9UQXnY2AO7 zYt7>utl>obYGcjW8!h(?e%Wby-ekE+_}|0d7*|iVIKF53lAWgAEtZ>%U-8|8yVY`2 z@T-=Zsr_HJ~z=yRTZi znfR~a*UY&~9O?UJS;J)9*R0`e{K~ba$=#NlW9>TPzHYg>_*Jc%nD$t1p0(4&wAXUa z;n!TDxn-Z_=HpNO1X7 ziZ~6cW0qTEIgOy>meU*~JB^kPE%y?BXa7&V@gqxSSVMKj6P8y-p7_(k6%rq zj(5^>8}O@1#GSI-M*J$A+W!;FZNjh2s994_TXM5CRC|4Dxh?oL6RH_Lv)oqvwWvZ> z<>zpu=QM{RRHn{ayKVTzDUL5JH@hBBp?q>{FPBfY1|v-Q27x%!xIy5_&Yfwj`@v!6 z*(2Z^p!YmJ1^MCM!__+;c|jSji-1_5S3KfCF;Eb~l(TBvE(816H#B?U&7Y)zJnf#RS9C<#h|(%=fQ zUo#yV1_}*mOZxGkDyRmkgBsu{`922nf&8EVCVr-~(_N905Opi{KKt488{!zz<-9Iov2v zDRl?cXt;bHECh?dOfUP^zE$O#phcL2okX&4oIkE~p2-qqi2JLiMIX zA)uEN^fJOzKrbNZg#&Hd>xF{8peN`KbhN5-0i6TrXieKN+IBfYV;lv?!H3zH@$`a$ zUMM&XJ_XrHP`gxLQNQQF=im%D3yuQ4KyVy<2;K!dz)tWg*aiNk5;P9|APj_qIq>tq ze6Ro*un;T?XU1EKXBk)yR)Ce@7Lh!II|)nyQ$cegdJ1i@1>b?Mz&UUpdEt zqmvw++~}mH5~vKSfOt?9R5SjjbpHU+M*=oqeeJ=0pd;u6w9on(I1bK%^FVv5Ux5=e z?8o2}ptlY_1s{QTsMB}B```dL2#$cG;28K2d<0H{)4Jh*j^_+G555H7f$zZ&;74!~ zTmqND6>t@7CZR208)!>o=LZEqK~Na1hF=3_fsUXPCVSqcj@~dB0`vlbUKnT& zS^&KipqBvN(#)avruKlnU_ISqBiIDC03GbV47LFs=x+x)#9t2P0Uh2Op!e{mpneBoGg(f$E?l(5o|g4=YtKUg;oS=kANaOrTdLb>_Z=c3ujWffZmS(4o+3 zpo5?^pd+xS!9?&3m<*9o-*+|R%# zU_W>hyanC{1E|)TpgyPzMp1=2XCDk61v+1^0(5-74QvNH!BT3X8Ku@vRx5BXXbaj! z=Azf*=>YBn9Zks=f#RlVi$H#VFVh)+w?%}lg;WRVfnqExHpnUs*j%jo(^B#B~=;-C3Io=`=o2p}?jbJla0GhM&Dr8*of1xf>*f9kxm9ME~@U7#YU1aus!hpjDOE6{V2o{RJxv=it_aVU5UEWuVU zaa{&_v+NV_8F)p9ZaT@+DV0}{}5crqU>0*k>?paYN?;B7(w78r;BjoVdHw@9i2nrcY4AQs2cy9gseJjVI_*P`0E0jtkQXF^ zTA((l1L^`j@ah3q543uIoeQ1=+JDl1llGUiopc@i32uVF!DVn2{0OoTPXK&FCR2al z>mt}M7cmMU2hdMMYez1MoNLD|C&&fzf+C<8C;>`?GN3Fd4=RF6pelHR_(p(DRCi;b zA5pCj`k?g%y|U2$OYkfOElI2%XaH(}crX%v6nGMh25DdyNTJpSlgUD$AkY)Kp2+oN ztp{m6I3EWe0zKa@0l$NAY%de9wjM@-(Q1GFglj`CCKB;8U=q+1_+&5z#1KdiwR&DX z0V24*g8gYQ6@3~g0`~>+bYzyf$epDv7|l(aeJ0;k{FlKV^lSnhR&TL_*_SM^iInPGJj})8U?AuX9tHh? z_->#(c!Ui0w;3IY`-Jtk!mR|9(XHTBAiv(p(>r*tfuiPdKZ0AwvQ6M!K=mrfDYhv-j)t@o;CvLyeu2Y z4x)j2^%(e};4v^9=m;zr*}rA>P8k_VT<(aX{WUQL$F(LQohStZbtSjT^H|6;8i76m456KanF`tj-5~#ut9=&@5e>7ElrksC1(awoQ06KQa)q(ce!RB4 zkAWbc*>*YnN)SwJaV9&}rjUA#uV27#;7*aKr>jxyrz2WJY}hn5h`-&!9;2kK^23VhsZ2YUHE@WbgKHV_TjZ3|1Ee3+zpBXMWRHM z!6rZz(-5~Fs0-=g>KnW|J+SXqaS8=HYzQr~eXDzOS@h0N0shvLMtQR>_ z%O>G(0P0(AAKYHhnCnL10dS9X@55~gnt~RfIcNsf5m!6h)}RAO2KRziKpg)ZU0amN zns6ny0sM1}GyA29Z_igSB3%dhV1)NWb_N|mC(s3m)3y9v!Gj>!U(`>!fmF5i6z~-2 z4|;=M;1SRdJZ!If;C2TJG=m!HiQ5;*UVia?GWmmX4uT7fH&dLcPCy0L?%n_p3^)+K z0zV3rAze$Ctr83-ri={+kAbmZ3>X2P0K>uKU1`|M<^~-%mf#sP5RFx`S z=8}t>3S>7OOamI0Wyx%DFpKMDU=GmX!))A{ARWvAruq<0*8Wyd1(UgCNw0&~zyh!i z%m-`1N{|5*?NYD=ECkPk=YRnUKM%|W3a_xz5%z$@To&{UPR70))X9qb1A z;BtV2|M<<*LjyHZ_i%j}d;pvlvhERFwd65-E%!s~e>xNY3I0>yB={J73e>3TP2Yg8 zK(O~bg?|uG7q>kr)j8@?tEF%Yrtxths{;s zH#Ci-U%(~sBlrR20ct{xGcC<8a;-D9{oqY-h3iVGd|d^XfkR|+f5!h4xCVlyf1ZHR z;8(aMxJp1z%7uXv{2i2Fp`w$JND`Gz4F2VyF`Dd_fkgO1xJ{PwwFGGMARg2ra2&2q zL3H@5jfLld0Smxgkz95jTj%c;>q+?p0=jR4GU|9pCiz@(v2^PZN3r(%AN^PWW z6a%UA-aD082?sNkKurw>Re>@#2)7C-1{C%_P#owCS=aZ1=Aa2^4Ael{f>SG(1m!?k z?bVe5r9n+l4QS6U$ko7K9aI68K_yTD+y%-5?d>UyN~Qfiaq%D#G?EKn8&}6oDo7H3 z?G4ribwFx8>uG@75Zn!vnWo?#&Kj;P?1`mN?B>nOC0lh&lpm-EsVS8A=t`)ajg$vp| zqL&}25GT@lRIirbx|U%I7zhS{!C(*=VqNjU2$g}y!7!il(|`gg(y3qym<%R?r@;j9444R>1+r1Xs`42?;eyq# z_-5JbnYgK;Vz4^rAI2J zZ5gau1zK$RUenK^3XmH>hiL1^q!+ zwY2UI{Du%NSp7~owZA+b(sG%HjdHA-$z1wi!gq3C#a8bz>i(zup5}_*;MDUqUF-s? ziPT_KsE7UxegfCPRd5BUy)J`qzz%Q*Tml!tkKj|FPBtH?q%Q(BnQB5E><4fGYy#hd zW#BvT3ivjhceB36^A*rUvJHF*&VzH{EchIJ23`iI!6)DpI0-%mnwU<2k3c80a5Sgs zAK+E1ZUpJz5I6wd2QPs4z;^I1cn7=<-U3^}o8S$w59|fI!D}Gc_ebJ?9jMZSb*HIj z57&Az4L;Q|P#_tpmK7ivfm%=lWj~Ofxs@~f|65C|t0`<|n}e21(JRE6h0uPf)(HmI z=$1cN61ARcE~u+TgZ}xM{Nf%1!E`kF2CpAhDMAf`hH}+if{_MYb)%p^=w>dZx?PZ$ z`vnNbsoIo(2auK;6f#%mGz67WQ%xTr8M7`N zjBbG&;5zsnXgZMo2dq+`$^Im7$!(nMLt~00;--BlJd-0>ogb zW4~ywWt0^}fovcL$PRW8X>Q#1*yXZr9$eMdSWp1JN|g^+k*gVl&5_@7p*8EYzXGoX z3Y3?uFDC)b+KM1}n^5HHJhBOL`|$4tyFqZsmcU;b+nTt|K_&cJzG_mf07}8#ggqqSE*q;wFL2b`{~DC&S_w5mw=qXm9w3fY#78fY#7@ zXwfT;)p4s?u7ujZ9|2UVM}ay?U(g+>w08sbi3bUwh?SYH_`3l0fqQT}1Kl=SgHAvR z+zpg)6QD)AGSCbtVP!;5ObtLCwSR5Ul!$}Xq>}61+C-qoi<-E4y45pU=8P(XDq-ft zlDJmnb%3foXdf(;xM1Ow=~U%HWPP9n>j4RhM7+4&lvKRl(Q6D|ATy0{)r*6RFD0bf zP?)AbdkdY!GDogRg9#~-oY-lUEX2PEXd+vII~rHpmO*z9e$4~I zMz#M2jMjnPWMDn6HjdP>G#s~ct&*vY)xIxty%s3&HtU!E3jQ5H+b_FtwaR%FSNl8N zK?eSpfOZ13_oFlvN0i!M8>uzHK5I}L|6criKmz{Pam(TEw%78@UXiI}as}CM22Joc z1oc2&PzMwN@1ea59>K3&v_T;C9f-HVTR@vk$APxSj)FtL?!P%(XR;d)Hx4M%C%|bi z5NNMX+jH8QQ^ehX5({d<1hoYhOb?q>C!lf^+}ryce=rgyeh%~iApxBYLv0)?1D$9( zy?_$T_`fBrLMmh0Y&?j+r#55`;L$}+$jrxKMFQ?CsWG@8q8|rGz)^6_UKd9D$nu5o z52iV?5znu1x4`${1bBqZeT*B1b_<(-PR>%fkk}iX#NZV84ro|?gL@vF17Cnoz-Qo7 za2n{y=nU@X;4JtGs6Tv(`!)E4#1zlB_Z~^=dQkBymfO@Xx>x=kRBWJn( z5%(AH6Sxd6foniESHTtQ4|2Me|7WWOd4>NC1ZzU>bwJvw&RbQ=#9!bh@KcRyOL0E@ zf8#2Eaw|@5but%*RuJg$EjzB>ZVI>81#mZFmmfC|$O&Yl_ttt~uaTiw&Hm8(U*}tc zAR{3Hpf~;`3^YcAf%Nx5veQtC!ru!ULBmeG-dB^YxXiZV#p%ym#Agn#aJ@+1i9qjZ zDFTstUrTO2++f6de@hXGS7dTENd*z?pn5YZb0^k$ZV5PbZXGa7(;;#(pmSgI+~h#+ zy4g`>SrRrFW9C>g4-L$mQ)k8Mp4!$>(9GtF?krp=U-((V@cDfA&Wck48~p9MU|5nH zQI=Cv<65TIdA&rW=B|P;GjU^an`il8>+|KS6ewrMmi5R<6WhZutPT0XJ%-3JPPfhaZUI)k97l51D!)bzZ>xzPYIwnw#qBfrQu@ z*eUtWJum+K=j>j;IWai(5^hq{DV$!|&WS<912sAwj$HQ+28k4oid$^95kt}YxCQgR zN?Nuh=RbWW%U20b3{)JmQdSc-GjOjz*0h^R4L?shtmD!qXQ{9>dDY8noh((4XVX`2 z1?57iU%X}aF>_nDag-V=#ul?=CKXuU{74M`0VXhutdBBvXHj!^%sO?)oyM$~h50D6 zTh0vgF`*KpD23`OCU4%sol56AK_Zk>6&-`3I(VZ<*~r~JdY*GikPy#bB9$^pvq`X$ z88(}UMwscd1C^r2V_pRFW@aC3;v#ac3hL6~L~^&E4xD!~@3ek7l4JduwshUx9}5=v za1u%#s*YkMnCLlym|FWVP>tLi?BDWOsivP|kVuv=_!5PGX@C4V_R%*Vcy4u={}7kz zWIyFL56=k{j?I(DO}1~>x87WuYk45d{}&bouqbY35qWF_43v8HY}bCQ*gStknEx)A z{4f(uyX_QbpYd-G+%0kNKYIZ)Vt(Bzqm)ZSFWDf&=eH_Z)0tG_b%a-XH-FTw5D z*!P?pD4f`ogFhwGdsvyI#@Tb#!J>xSJLaLNTO5C2-LY1`Ec+(RKb}qz&y&eSvr&=X zvG7jEvPC2_H!zGnM4nZ_UEi&B-w&;?UnC7GQ4QDLRGk-y3A6S^&r^C9mucgpk>@uZ=97u4W)Mzn3+6T1<BQ}Ixy{)V;mlXFd8+3NnJu{N;xmD)2!4Xq(0gZDm#xz(! zW`D*|qvoggKFPT;+vF{`4WrFa3=_+ss!HFCDeEk%<8qsDOvZ7OeSQw|2~-!HO7fu3_MxZL%Ajm(20SWQqD~Z0PJQ%+}?wQ_O@F zIAu()h5y+2UpM;|!kWxBegfL?mNa)iA1D$uuyzS%&hyxHFsWo32I&pwE&Ls{BBq_n zY_n6(991QaH=Eb|*OJ*hdSka$>sCuhK5RvMi(wOWOB42UjCpJo?RBTP&0|XfkNTs` z=_P^wVV{;TcP|apC>q7sW%@}wx^Pg^qtpJJOvN+H>CW&~2{Ze@STOcoi+?(YtvgS{ zdP@-OPGNuZ>qX1x>G|pD>aGv_GICwNK5N45W)CgowN-&4rYe2#pCa07o^8gdXL<|l z&4a526J@Ap?nA>($yH9<{gXnldpijv#1<&+-txjP-!r6qw!BTl{F>OQAfFp=>^Tad zD%{xiT9s3!?!R`s5S~n#XI9cNZO)!D-By$89r{uXGq25&##+&Tk3HDdw#(eHK5Xx> z>HN2m>Zz6gQYM?)of`YUjN&_%*Ue6_Q@HcPKSSwubGTjme`hK4xJ&lWG9Ai9#`qVS z;}voIraIG1aCm#Whqn>Db>tn=|7BGEQwmQ#2B!pDY1>Wl45ozl%egC-T06_XJu2s* zEMb1T2KIF|9Wz)&bu}9|klPVvMMj{%y^5W2mwO97dv@QF^)>d?jquY8>&92F;ah5w z))DQ?80fBWU&CXSipJ$xd)wfBGYo^U&+jrb)-md?VW9P*(-%#-ZIRvNQO(AgN;t9AE4rD@nx|o=kn(%aGim!6&y3+ICEZhj+5V1*ceDjJjl{i3-!$d z)_?p#zP$ylaUwelC@e42zCP38y#bfvx;u*V6yPi~3!3vA194$L)L5{IiQJ)_b(9PAuIdRoeQRkZKpJA{H0~O-+yx*0-P`Ukf$AF2E zojTJ71OEYYN%5UDS+;PyIiF}A+Y(q5b~VxD*cvDt_E)00dL~dKF)L3FT8F;%N#n4c z#edb~jIGjqC{ZYzpDWX{Q;Btb9mQFI7d7cy1O1Bze}L?-yC=;YTyN~}HYkd|Ubc;g}O(Kl_fjr4BssFLQPfZ@k!moSvI?lsO zThrzhD)S@}=>gzCt-n{q_wASHWX)N&2TUpk{@iBl;Xq~c&MSfXnR5t zk1m!OGcEcPOvKGitO$-9bU)jWc+X9bTdgi2{o8dc?p%X@q!;>$98;x#MBWI*bg2h8)CHLTLHT!h+o;kgf3?DZgz6ul!P|X(_nsfVSKUJqZD z?%TDjeYr8g##g z?+p};K<;7M?1xA(J;aYPJ>JEcWZJ20v&}}x*d@fRiMe!Y^9ny-ERo-dJ5kTB+st`| zdfVKCWbD$;JVRY;?<8TT5QxCetm7)*Hat-PN`q&K*2@Sxd>fq$?$BxkJo;@d!> zh(zB%jXP&wAUW(*W0QMdpn&Sw)~(wV`OW6tfk3b^-JTQXwnBkG^?!`j5Jm1>$?Pq0 z!sh7{ZZx*7V}19yv-H)SQ)VyB`i&l(wLe4Tz09z;$+GQ9nL`EpL zP-j!}AnnlI)R!~JbUw(2?ZiCpT+p`an=4}uzNMMFrn?dPO(*l>K^8D~*htg9B%cA-mLqvbRHwDnF5y-hj> zJjr|}b7u_@V{(4LM0)N4cb{)@>+@|h()zzf7`xPSt@!!U4l^S2n*$&7)I9wI{v)|0 zv;G4ToAaQ%(wKMuT7S#c{@0zYMkiCwCU-$o;c%d~KVW(t4yKr#IF-LXS3#<-ZTQBw zlX{PH5_5`JhhrqIaUZL@?8MkIFDM(DnaO$!bCVciJ6nV8$G^MzZqM&)IR;M9zNY#S zl6c&-!HInuJKZ5~bnG5;`s}o`*wu(<@0^!UOzIJqP^&OdCG|O!<<;=$p*JzG+pAm5 zVa4!oYpev{K;u73N~27yoVQHk(Li$1EySnJzCUmMUwhm;_Ym=M8`T7GqlZ~~l)3xg zvsBm|S4>;Xk8++jfn#i$XY}NC03xhEZRO`RN?zaZl)zaJzl%aQN*nW8@!TKusWKWx zySvP3yG;tm6|pUQyLX9w!^(elF}1ZiS?%~5HCZ3n^NdAiH%YM1cIEczM(iEBW`cWH ztZwpL;+8=Vec(77xlPUV+;=?CENVeNHydkA^oQ7&dc++mV;Wcb zGNDSR?BvSUc)V$Xfq%YvNOmt`mz(01J5*-ZzH{F{6>9fi48qNXFNr9RIivVu&F>%5 z+q0QwA5qwoX0)8PW}}?9&H0ZovAsIii9qqNi-S$I6D&S!m{upS*kQ)uw7-(#w(IFW zIX6r^()*R${d?>Xw>;OQOKmUEcsbj%LoIWX$yEJ&XGXd2(~rOT0VU8Nr!Vke;5>CX zk6X+(Cj)`lxmc??=N*rIWKi-m#T;w9yiNX?0yHvW ztEbrZv;N0F3DgXRu}_1p;pLWu5Y*f!*s$Pp>i^|KXfV&-$6EU!o4Hu_2+z4CWaeYc2cO-p zLvJ)*yB9v^-fJnhJi*My=6RCCFFM3)T`GS6#Laqno#s+&`D~+jVqya@I996?fH~Dxo-HhVB-GY+8&SaSLf_TBY&i6@&%F3G!Nm# zuEvh7%(OilS~e=$rOvY3c6-e%3=&UZP#A+oRWh;;{IuAW+Xfd=w2%ARqJD*2JU8&I z+e#L5=8Hi8*otZHo#N65<0Epv@asaSe9rM*UDM+niMPan8)jOqsdL62%a@CT3ul&O zu-TPFH?#2^_0Zp(m-Cn@a2_Ykv^pP{K*Jn5?^KTS@U_hRtt-znn7Q}MK;F_Xk%;ah z|MH+!hxZ#YPf4+{k2-(rnD*BjwXYxQ*Fk#_wrkr=*;S>p;&oPb&U(u}d?W`KM-;-Y zQE1On=A*BeB}$o+UsHf8rZY}rGw!0gk#^m8Iq<^SOLy7Q^LY91N2UYKp09%u=+r*J9IzFOo%5uU%w4t0cf_|6J8g{I z>Ncy(j~_Nag`M3Munq9fLOJtO67_z2!RO>QX4sD`8%S}+kAX*G@1Nn`FaH=? z@_d7HgSy!}DTYp7ikR{j>A%CwLyGl|$vXD{H`${9p6umx^Y%sFd~jDSEIn6jjEuR{ z>V}sbR1U|kpc!!~5Lfgk`jEOuT&eS=--s%;i|VseAB&$&mslMfH0N0hxlTgZ)!C-; zPk|b-w`RNZz{Wj2E{$upj8_I2*Un-syUF!4_K%uzmvLgvva9TQXsUe9Y=sHCHQQXi zO1zE|<6mb=Uc+vOsedg{)wH}4sKYBO6Rtr0bNq1X8r9^Irq<0s-l#6~+{TMFaaS>1 zY_9wsC|Hbo{m)#{cFt-#)(pCBs^=Of`2_#}&Q$;ZnV)RI{7^ZwuLo+x4DXjRvfty( z#;v}&KYDJNuS#h-s;yr$ba!NIunw(Tz%=@q)y!A(P4}N!G+&+XE?t)8Tz%#6;aUgX z{;YRo!p$62Y!Op3dt||4%(S%@xMvKTQ(t{!aj9*2Zkx6?U;Iqhck@%g-1AFdbB=0} z(|FxUbGOZAV)i-ifL)g7v(!JP(yYu0g3Rf;1EBWfEFmBP#@bSH7ivNzC8%o`8$nU}K=XT6>X2tJL7u+o; zb5Du6LqDfSIsM#g7dzLj+gfk#EBaZMKc9Ar<1AsK&9Fa+wy~Lx6I*n#TdMy1OV1zq z*$MYlzD;OUF!Bw3vEC%=z5^EZT1?J_-GXMG}4^8PRf&)xPxX% zzH>PmZrj1?oymX|60L3W{7D7PHO+9st}ZcS{$#$aZAva;8hM>ZD?R3Y|I)NvCr?H` z7UrM0)UD~f=KP=PWJ^r78&s$rpe1gx%yUyV3vS@=Y_{GAH1qE?zuyRy3|iIri$!DR zq5mKAf;%vSV=vR_FFk0vTaX*L`N`S&lV81GuHJwlVSegc>pfpCGw7!3dWF08XmD4P z<_~>!?6T8?oF~-!W|<5+V^D$^a;D{o-kxVfL#Ild#vNfky2;B|Q!yxpLFTeeHuY}> zw)^v%YqyxqF0C**{$|+T!cv*}^3lC%ub)a?NBcA2wS?_$8vV@;XZ%Vx*VDT`7vA)P zyW3-+{RaB;R20?l__I&0EVO8vrc&L(D9Bus{x=QN+w3O>e+6Wa<;p1I7QY-ul_2QTTSr@oP8#Jainvz?GzDN z;|}*vW+Z#tULpHDW>{s`{YN7ri-+CVV6H|)7A~59qdNos5}xIiln>jmFHVa%UC3IP z27$=7>{Cn+5W{O`bs#c1cI_s&sk`mXd++?uW(=p=7)RAvKI}HLA|ngO)i{7f9$NH^ zHVeu;5`MjcwIJqCH<_MUA`1jC{$Z1;mNl|KF}#0bpA-A?KV`hS^z#kQnFKLn@5Gq! zZ%Oj{*m!d$l3H-%Ega@XTG&6&RLT;W5TrvctyPV%@3xq~vP2dRn*GDOvDEOpsqI#fdJ``g^v z@!8QQZX~AdW3NbiQ`{|>%bhvOnIsZS(QJ`LVn^7a^!ARt2lotp>h0T&QpXgi9%c5^t<1{okwwD3-(mJlAQ z+r7s>v+R7iT>Hl8L{b(k21^=$Zt_^g#Nx!>jh$}wRl0PEerSF@Jy6-D>b<6&?5w$) z=dd64n5DTRYjECvJU1QkEKdM>@;h`X@IaGt`?N#K#G>9c#1zj%lfG*zts;`+CJ#=n zGyB}ZHas?|V(QZ$b8wO9-q3wNq9~$u#cz)Lv{g&?rR=RptM*cHIF{9!;M+@e!jaAfR|CXkvq?6lvC=uO)VkCibqep~2p0 z8oP+ZGKwHpEJOtxHc(6~39%Yq#9=zumOH=9KSC{w?vcqiRl}4(Qd7=JO+rvKdD|I^@8noovhD*9OYw#~upi z$8qXgMRRe@$&^9j$;LNc?<;YT^PP&+Cz-UU90W%K>iMTTq=0dVAKccO>{)mc$ae za42Wy8tu~n@c#h-&H(TXUEAQ&Hpf%|aG`hr&actJ#+3TZAN_I1UzRxPF5!(G-sByn z%H^?&rH@I7ESEsTi;HzWL0`DrKm?~1sZ)6nkwqiQV+9obr^`cKQt3Xo9HtT#FtcB& zK?Ut={gvaizJlhXzki%AR?yn&Umj1Z?xOkYbX%!+MJ-BaOF0#_uTd=0(xCk%(fR65 z(O_4+JVhs6G0}mi}c(Co^XwaRGXMd}vG!3uZY)@c(n{ustmwa-)OVP(z5Z|ON);Q%qa zZ{F#4{cZAFYZ!ct0+CNe3#Z83e|%KzqIdI7rk0zk1^~t|b!|fHNnc$m z01%HBK76>|Y~kFar`jzwb=^m{&>;WI7o|k58FZ}wteSZ;za;qo5@y4m$=bGk)EA|9 z7)$bfko>lweTHe5q%_9e{I#>zeORJeaqvc|x((Sw$MdyS{zUPHXTi5pzfmw^2HTUi z0?07>vXqthV&RKjd+zZOLkPD#nXUprH=ABDvPXZCb5*RgGLX}#QxY2IQ5bs@b5myW zx#m9SznZvsYWFd)nY(CZSEQ##ly{mz3c6!wa`^;SBR>ToDi9A*BG)6zho5hbj9#_Q zAHR)D-gIB_5o|AFLBL_<>XmDBuZBqW7&WK{mKD(l*k;ja0GL_Q!fY2QWncZ>T&i9j z>}){Yt3zEJD7rc@SHC7TJTU!vi7%SHbZ0u*RC!qiQ6>O%J?Jt&Cew57wTf!hK#*B} zoz$?0bD})9*VuLny_D-*La{ZV#%qAq9a7iuTH~+CV~($07XYURyJ3|{IRJ1y1pqdo zdouDC=m)hb0}K#XP5|A!Ms;dx75pqZP7(h8i@p`m*ZyeI{*t}zE}^eqogfa3?P+RF zSg$HnHXd%}bxp);^=8Usf!)&?cIB&&mZevsDr`P^*TT$jhR+X?mlP#N#?$Zyr1Q|c zI2-d7odk&C>l;!x%8!`5;a1JHNLGg95RbD40@N3*MGs$?vSIufNeNt;T2M+pbjN5p zxp`{MORl{o_0^j~JkdLtW_toxYdYYm?UuU)ei=Lm^rYREHnsEhq!CL7Z2wZPBfMd@ zi>oUl20ctwny^5B^wqD<$piUNBV| z=sdJ=V&+E7NBu6WzsI7C2$cgRYwB4WblBgK07 z;(pBh^L}uL;j2s-8l#1+lim56ZXut1#b+xleNcuDl+C#N0l)zOPaVB~?PPaY9)x@G z#&itX*AeXX#KSNXa87{B8`=H(kURgR^KLo-7t?&L;;1hG{I>&uU2^QuyHt6+8((a~ z7KUa0C|cO0_tosrckE&>HsZ2t&K=rT2j1-^APj&w{>QC=F1|Yuh8mGO(N!kGhh8xe z9siOB{CMjh15=L<*JBKyAZ*!utwvMbx*%d90ICAf$u{m@fxmB>Y(kWRmYQgB@W10e z{r5!!5ryH_70>hHUld*!aZy*wiP1buqOeeGfxT`vzu?#}S(rGU&i-qi}RDG+Tu_hey_Rz&&ZjqOWvgE-RHAX^?z@NwL-Rj7=w6jA5V8VKxX_LuKn>vReVbfmibUHM6GM<`p>VIe-@4DTF3vTTQ6p zqK;#^>uKtZu6(Bom6$%Xr5@}_(a<$1r=FzU(GL_^v|p?guu@{LALFM5;kL$s#hAXu z)okOhtu(xNCMT9{Q(=bw-xKRGF{OPINf&^wdNSZ)uzfC9B&JLJ(XZ3!xe3mNIxt)a zon<&bz*WO+qkr1DY41;aHkw4R2PFVNpZ%PsEduW)JW7i12EYK7CAUD>b!%t>ucO_n znTvmpI%mu42q}f_HBf38Z0@W;$m18ZCJ>?8^?&G5AlB&KKeQl7t3ZxnngiK2(rl<< zkXElyb6fqzJo+O@YwLPFPui-$=7ZM`C|15F@33Wb_8^a%*4H9+)9Hu$plK21)rWML zjNM%7+W<3_b+Pna1CUaht}cV(oqQ#^Lw@aYPXyY=gKp*KE}?}TQJ6zRpFL?KvEee> zy+^O;!2+aVcD_0;P;;K%qMAiNraReh*RG&uM44ONc7Jf}6p?p#e; zSB+8|f~LBZ)eyA0kxL^`?n&+ND8zvZ`s;bLr;&C?7f*?eu~hG$sURyM@;^y*zAtVE}ujW`^{C_T>s(`!GmIQ{D z2wB0=rwYZlsFpI-7cX7C%DN?5(1T}}g};-C0qz5UZRPC~SC)2 zK2am=GjUaDUAy2)QKuIU1d??tOQ^4On^ol#>bQxoSCnxAmL-m$IWwlvSeIO~Hod zC1lsfqi>vey5i>VCV&v?4*-u-_=CVAbP{2#sJ_`06a|p<$B1_0h0NG1qaBx8D#yA4Yh3s zaj8&JXN47rtkWsrr=!i<^Fgm#;8qj?K>sNKz@kR}zUg*)+Q~&zBwaB6-ru7I$(Beh zd2FvByN(q^i;%ROl5`5lbqSQ%4KqA}zZ{6iK&sLfq*cThquA414axZN{-RK%d_+11 zL@cKc3|E)V&O{Qk9-LF+m9lKqjv;)vm0o6ZDezg%rrhx6t!6XR?&18z4g$8 zd;h`MaTGdRb=^$f9f5Z@1vS^2BX<$eTx*~!K?j-xU)%uc(QkE}QmkFq6}<6P_^Q%F z0N|jzFj2TS*Z~cRbhi^8`zf>qhP_aR7PP>yk_zO%cu2a~0_ia|ynN)-r`{^`X5ES` zIP*6ZoaMEI88Rz4GmeAelQy8slj?r1m8UJOG*|yq4mx2Y`+YvJRMoj%|G*@bbG?Zc zj*R}bA3Wl1y_1|}!@XwyQo!wU^tu%Uq$mh4D=~tJ;c7yXJNjHl`g9tM?`uan!07PB z%`a{AP@2nYt2p+76_5gBoR`91o67dY^qNp_e)OiO)_9Dkm94dQel^PLL=5cv-M}fC z39G~Ox{7$i{>~RqjuGxQ=->Y*pY|oyJpKIxTT&%vR~HIs1CFBV=L`;e5x@3!mbgYQ zKV3F_PFu3m9RiM$z)_IFocD-rkN#8WKKEB7W7`K&cRhm-DDk#G>BzBrJtnT@^e5-? zp}_Ym(l>1pwZ8@g$MvU<`!qg&xoI;%cwsAq@k`)CYHWEc^@{3z&1%9Cv~Xnw)TAb* zvmVuT)$tz|jSO=9rDI^PFb*sfKo5G{7PLqrjO-Ii$kxNhYNMNu|K@7s*10P$AO1pU zAY26RsRmMJJ51&TMTO#_e#sf?uenpd(U5SZ&7~=V4~Gi&V4d|d;!u1sR~B!|0kaIf ztLjA3yqE8cxx1IYI|I^{(#@dQp}?9*wV`50rJ{Zv5DAz|gTnh?5t{c>G9>2bMEyEy z*18I`eOSSHJnnA#6;3DFa7fk_XVz6E9V>k+GVmjR@&!AYP2A9;hLr#0ere;QPy7~c znyR8qnvue0p&*5R)W(d{1qaJFt!mxa(B|XHCr_DQhA}FpaT%*p>Nf>v!k~sq%4dC? z^VL^9Lq|6$NOXaLjPn;N=|taj0Xvn&=3Hq3w%L<6reMfYA;HymgICSUn6g&lWmrq3 zg2bYyD&2vag`sFGV}{sraD+-;|Dp&0JEYDeLS)$uZg^1Tua)yQaPd7vmi1A@7e&ZI z!DY0e{$_$!K*b8{mKo8C%M4Swo6tY>RKjZs@I9|9R;++0RgTM&=onY@!)>NjsYum& zAS#ym3>Ci`qWq*yJG1PIQ;##QHwCLyIw6`eIiyvQ?E*?3k6-x)J>S)<(WQwuTm?Fu zUqwDhiS5+Z+Wx3X7+olqeZUY(#=~#DzmEUda^#2xcB>AC1k^CWSqDgax6fl~rH6Z$ z?9l730v5N%Bc&c2`~bk=<&u!`r^>Ggl`#${vwV9{?Oqr{gsLvODC*C@l4&X)u4mDU zkN$?+G#a+<@8U9o7Q&Q=`-i7-(tV2D!OHTxfVzr`(TP61<6SCK+oXs zG8e6TWy0hMW#?@8>ob!)esqZ6Woj8j2|#YJ9Mm)NdUO^52-EK}TsVecJ`a7caz^ls z+5sj+>&dMzR{lHyY6D=IF3j=Pf}_|H8{LUjeVwSV7*N7?#b6qzf@&V(2!)`lp)vrN zho7J9)T!4~`_87WVi&}BArCOz1i-QS=XLCz@OPIP@<>9g^(J}<0PMEcOa{ZU0LN*d zsDRp^_3=sJ(?aFhp4O+v{SZ&(AZkX&F>;V=_{dE=zG9EBAedd^`*z8p!=X zbXJ+YJBw$ZFu^UMLjds0005Kz+N$=JfA6(?Yy!B3mO5yeGQVN>Arox^O)Yk0+aI_s z+hJyl*z<5S)05$X8cG_@AB(V>l;L#SglGW80Kji10C;JNH_P&hN<0~30DCYX$RW;G|@DUJM{%Xhuca}Tds`m+~HOB zY!g8HMp8iihkhLQ@3C`jO)ar#;f=_g@dvBvTa^gW>n7n1pB^Pq-)R{92f7N}`rJnJ zdH@Wsj+_RH5KkCX5qYA*3mzbY!UlrKf!KL-EVt|5%6}}1T(#FuccZbyCycK#j-cFu zT4mjEdIw}5=#xS127$vmpy2&ZXiDGT4(r^JOhM@Gi^L~BOI*}&${(i;fowsw|1&xd_UfzZSllE~oigRbZ>HTfC~q}-pV z_jlCzh*bt1`7LT}g|V=w7GoEVuEa|fhAR98e5XSA!FY!C$lNg(cKu?E!hvT&PMAeE z#%ao(CJyjhW?3y3Z3-&2LosXd)PYX+|&|(#=7g%BQ4U1xwl!yHNh{tHLA7KoI zLpK#Lh~OT@N}TGKL12NsQQzx)vg}q^r&$Jf0cGg--2~PmIpIu!Eo7|wcy)x|7 zC!3@Caypwon!>A|J{I62Ga~SL`-{9C@4k?kaw7L}NZ(n^zhQ81ACX>jtdIW(S}pIc z6Q@w0PuRJ07mukEgM^k^;fKZ5up6g^IJDVGZXK1x|!i+X?|?oK%fhWX&+<#??vP9j@QfUj9jQzsz47I#tDJR<~=%b|bT zi{4H^ZvIU#sxT3!6{UL187{Mn4EF84tvLqcLMm^gDKZQP0DGrz-|b%Ys)Exf0Pty& zNW1Nvh(QLEZW7L3i_@@47}<^z_+d?F`B9FFPX>ruI+c6zq3o$xAQ}1S?_1Ns$zX>P z7t2Y56lydDT@*~dBnVZs_)87doNRe0)h~d8r^0ty&U8a^t<>Nu2W2E%(W@+m;$tD0 zf}X!TZh|Y{Pv1|=*LcdErcK9LmN>kTDSLzeU@0UzPn%Y;iDgcUr50x%Dz*O^WrZO` z=m0o7EP`G8zn|-_G~*3{NVjpN;yVENg#&FT2A7XujNi`DMdH*eof<^q)d}hvsrmZ~ zu@2*WIS5~ueOCDJ%h-~4n=&FHF3NWcLF`A58S7{&6$Mpz@rCiO3hTq2SFWCqMWcMCN~8WcJI6R?pU~smydN+_w}v9fL$uGCxepJBo7f z!jL#Zu4IGZ|IS+RXCx^;LGjckcQe(V0k~a&lrlrB;Q#)?pOHsJbMMv&dW*hBRvDRDht}ZaNdIgE9iEL=e4FN5$doHS$;>C` z9^sQpN7nYrFfC8DcXD~^qJ+0kR{v+11k|UFPXO*f6%g-bGa>vwWS9wtEvFciF7T0R z$C=s?Xrwr+GFt*Oo>!iQzW*yP3~lj6@Nyv4^^R66smmD{TO%*z)YOy;os`MZ3$MI7 zO%vw;W^$m?75QwEfb?WGD3#Nr>T~dawcu)Gg-!r`jkdfwu!~=j=UfQG`^Gn1Tn_cJ zDwr!SUyPHZ>THjNO-)0e*Nv{th0$+Ib?2GMq?yRc0y!6qnaWU#>KpTL!myfL=7X9I z)Q&6hl)lOndA?;HKOf$xh%d|{yqZgu7MQvTjqo)hIZ27!HiV)VLYV*SS*systTZ!j z3Hsc64!d~A2(<`+3l?XrzQ~<)jmFXP>+!Tc8dGjhkE4NKl3;i~K?VckRwu4qwL0M@ z%cHEnu%;#pVZ|)msaF*bl0w7gNm4DZ>`5*=u=9r1LZXFn*-e?ifOPM3JpA7Pj@^E* zZ(7`Iy{!qK%CR>@*l~ZdG-lQROqybFt;q>nl~%`9;65?f!B3c?6NS7jyNp`hwD|B= zCWtJGjlpcp(qXdhLsbCf&-A-6nHlOexVY1W7wL6OmSW4S;-#+Ww=Z z)2c=;N5u((6H!-^7e*<3&M%MsjmP~i^k$I|Oz&7wQlDa$;uvaBEUp>IXoHT&YG0rl z%W{%O7H@buOo02YiZ@YUqMTmlVIqs^iXOCWu)UeA_5`V@+E<-ZO^ zEPs79xCdfTR+b$uKs_*rTtP=_y+Dt+knt}LGyfo+&Uh>eBmYqAn%#X`ZcGAr^L zkkJ~-+Z*LF7fAzf{OOwucb28$ICT%*U#V45b&H19w`H+P%`F?BKi`o$(lNi_6|>T%V2;aVoNuoXeHVoz@pz$sPy zx`Dh`;g_uGGQ5A60eZnZS}S>T%0GFrWQ5C!*pk^ZQ<6a+pDTmD!UKvHF`&A~W!R6t zoPB#S%YD@4xD0tFEiCnE(j|fjaS04xsY=v}8*TuYOZCgK&aCxuIo=4Ryt9v#DulOr;(wuh zL&-%auXniqKin(%uVvN+tF;9QW_L;~2#WF2i@X(MECE-SLDYq!M0u}DRcp)n(y?_& zR2I!6a}4IJdXGrSCrVilv#rKdJXS-i{;ERUj1U}4@$DLva&dwA2QJxsa8y<7u1eo! zA$;?A&K;-F1^zXgN^KIqs%?UkG~UG@wnB=$!%O?IpG+Jq zbdQzK*J?6lGJHB+#>4eA;L1S-f6i?2)PB^03Lpcm!X(J33!qrM~dt6ja z)007?c0ziHe0^)N3h>+%E-urD`BgJ9Y{9A{=u=PJ@;{9Q? zIA97j#toV7fH3w#VCV|6-Hy8om)FWoL5{ve?!MvWmH|Ktu+{Cg)N4DgSUp}# zi?$;m9GaHB9oMn+c>g*Dp?>iVk}0PKJe%~#ut_LXF$$2B94SC9G%Xb-MiJ*gsi`1N z{&G!9l4Cn8doZQR3-FTzzjqz9 z<$qkNf67GNYKq!n6z~6mpAPib4y;@PRoaPOV<=!JHV02O(a4>!F`v=Qo#1lVX2}Zc zhSBR9AJ1|WTo&>%itYm*wxr4~^j=O4@Gv~tB&Dz7d9OjPW6$;nIEUq!)*8y(jeC1D zcWIsEM;2UgxAif1b)r(c(RD7uHLkNNdwNLRf!8yhqAOocf$)D%O?G1>^DEj$It5Xpyb=!RAvtrW;4~=gBiT<%|#Fdl4eru9`x~`WITA{$MzucG-QjUW31KP--kU~ zW23}Iz?+bJP|GxEksOw`r5VTL3*|g3a^8zqf*fDVToG150WZ%7=G&MjF$F)5WXZ`N z$~%@0b1R)CI4Kx!k;ektSu*ScqZAW{?h_Q?Ll(k!tNeiZ<22pf2i{*(#{QRowjIe? z`@-2y*SHZ1tzpN1Cb#{N3gs1$_zBAZ%bL)d{n|=?+xP&kC>mQ!(V+uql|Y8Q+a)8{ zWi6kaIQ-l&+`9?n+%(tD*d7F&B!xaZh`MWqf)*Y`iMjm2N#*Q=m`@Y3PdCwE;p-WY zF_BGhd*yr^>q`6gj-d$dOIWcd?>mNFH zN-Ew%rp&I7n?B5L(C3%S(i(svkCBOoefv4GwZx@%KUa;K(Do2L#%u3#$+AX$?S4uxT#`)SOatYQU@@O=W`&Thc5uhf;A!F+@<5Nx%V%snRmj(p9cZ zCAHKnHLE*~N{lkgN>VG!N}DY!Q5!5Q=sk|>yf(6Vyzl3Ee(&#n|8jqV?{%E#HBakW zYcJ{T@4G%!)%Bt9?nx`k`qTz*oxbhCZ)c1exT41myZk@uQJj~Xo;C^QyR=RV5_=-p82(X9p6gaL1*t8FtYC4z z2vSeVNlH%1HH@n-5PJ?70{bqI{>g~POww}0rle<0GVVZ?Sm;RDn}exIxp^~Ccuva9 z+_cnum8d1`6-e9!Y>LRu45NMV0G(iRT8_%;5F9LEygkG0T(lZxu-K)V>yfqvbW&!1 zMp9n#)SJ;3#?C<-S!_;PMovKx_>oA=YG$Nmre!DP=9WS;{$R~a)B*n$zky#Y z=Q?d4kIe92QSmVRZVJbZD3u92fNbZlnm@qL_S|!!VYCJFK^C|PepN6U&GfH=O!wdA z<4gZrD^{rJY)03jW+>2FX~|R3(zM)^IVs>u*x8~i)P@CTC*@5Io1T)N zk~cLa2LoEx-Y_nLeF%uC#o6r)qc!*)jI@_&PRb0QmRp1j_rrk76hDWE_^-G%esLtn zfJ`tgH!OE*QZM5n2xc@FWX6BMkIpC_58Vlj0lR=3P%!PuUr1bQ(+&tq5{46*#DKjf=vSFm;PMVpPKH12)Qt}xG z(mxPv#W~PhJGv+X7LShbS9eM9J;)mG2if&Iv|bOgXCBh_0+1P}Y5!=D74NTg7|8VP zLB?}|tuY6RPhBAed-40_Daq++Gt-cu2MXfszTV#G>OA(z z2+6)-cK>)}vCWRuex3c5&|IvYG%b)bB{eN`a@fplBdV{gt#G?*aJM4gQhf!vu~N^2 z7FY_hx8IDBUc$u9nvLp@i3gmFEooS1UY~?Agh%;H7R{M{2`;H z8JIy~sp&~mV)T6O333MgyS={Q9&v1^RZN%aI`qZl|d(8e!QP)>x@P zsvU22>;CdM>6P1HW$`bKk&QQd`jjwSo(ACN{uxxT4fsBW^kQ&yD(3>0 z$6f?jP&vq1HW*|t`+7YmB{wU5R*ErTs$q17y)Vd?Uk!3{ZAFGmcbT-Pcm)b#e$%-f zWu+Rurb&KS6zT}I2!5t31e>KJkdc%fmNjXbk*yuaF{#*MpFN2Yp{LHwNXiULo1B`9 z?#jzaYMmh&Ps`29OifEqX@qIPczGGw20s^NN@YM8)f=5F3GYV)7H|j1>ffIy)!qxTfbf}8{V*NxU(n2OrH(%l2IlLXQGl+fAEyD0*O-Wb`-4exI3_8foD3up=4! zI_f@XZfOf2m2vt8WHi?3fH2_ryen3t21 z!cFd1RLFw<4&=xk0$BlHzx-o=)x2}hS5`@JxK<=%mKe8}O00Gu$8{_G9Ot<+bMtts zaG%|?MdzaE$ECL(hnE}AWosmMx3$7-waa4pLbFc&o{%~$1-YLrg#BXhd60Fy`$<_X z8=zU5&))```TO!avQFg}P@HS;Z_)PFDeI-OBR5DkW1-p9Jfz4lB0jLbRj{BfMx}w=jxRX5n0dCcFjBjGhHA0(}og`eSZ! zJm3D8@Xqa$aSO0L?16~i75o-{4#XCa_B+ZXpAjJEMJlLnlOBCZYMPyviFz5v%vWT> z-2`$HPY2mU2VNGP0Non8H^`P<4mJZ@fUUqYh}Ra(%|_o~Mzk!Kp>sgycR$z^Jcf8h z?8+kuu%(Zorp#ddYjW?s0PF~z33dQGye9}wJ)ho#_ARYD z2ef(H&S@Q2iuT=e z;&DiF5(-)JzSy%eQ}WVqEYHA|E;%eUa~|yMME!uIC_mq409kM{$le_bvQ5WO0XF)g z1LFS_x*7D>A4sRZ39^&dgPbn&!7gA5*cH41>;zt+{UKm`=wFdv2hQJ55oiZPImmhW zB*+N9mAo99qkH{pGD??f1|5=VvJT|J>#glQKa~o$f@VdxX&nq50)1wu^uX57kY5oD zYZ0L1QIIXZ2V{#+AR-HHcUTg%!|=C+J_3Ci=zB2o`sI@TC6MXggr5x>|Ap*q&w`v@ zFTj2wI5ShG$2#aD7Cd>4w7At*c)AIFJ#=R<668?$w!WEpY3T+&|N2H2P+yQOf9PA` zWRN{rto0+`NrAqK&Vy$BOOTH9x#Fmis%jhp16!Q?y|mQ)5syHj)3c^bPs_{8pPZDh zHpQktNlP1E)>p!=dJfIw${qK!hE<52EZjAsDIZaoZgWt@heHMzG&CZz9H zF_{l(1)z96?G;@CNufUB)1NbKWse!(b$1U`AeOs&yICQZo1hn%x?!*}Rphu1ilLA?MEmkjwD$ z))LYFQ#8c=u zj_+>pD)5Q+691MCrt0S&APc_xV$--390M}m<*;*fd<|^_&7Q1A`i?~ioIrri;eKvujaMk@9p$R3J74{@ls6v4m(7J{tVu>q3dBpoqIvoXjFzmJxd z>;PHN!yq$E0y$^AAX|1Z$ozimD?Pa%q<$RaT$&DY6DV4WnshCbsHlRdv0?2$uB3~}gUeK)Q-AK=#XbjDvJ&bbDprYbU z2ym9q0~sL+WCmS8R_qKCvVadY6G4u37|3*cBTOR}d=QKSuLFmGjX+k=!M4YZs>@j6 z(->+l$8O^|;T9Z5SV5I5?r7*USYuJbm>= z?K)f}xQA>=5xeg@OJDj+Q)Pio35+(#b9pP^Q`^*ee9SQUBB_r=Pi?gJ+r-97J(D@#lF8MW>Dn-T35P`!v8;{1B z!JZkC0iH>wv!G&VF8>3_fRn@bV5Krg;`xpW59Z3S9s*f0-w|OZ(lgy8RXxM_Fi$$` zF!F1{)A!p5uzzOEOqrR20=Ge9oQp4?CHBqG9A@9+&r@l7{^2|X<< z4PL{zzF4}p56C%jxn>KH`E=0if^^&<50=Q)ytY7eeo}@S(r53I2H}}$k$R%M1_sW7 z&vnFCKo(quF6MFI6OfbX4Ulu;xp`8Ni{{I*A`fJR-T>J%7l51tlkSzF91YU$TTu?u zv!Sc!jh2YMN7E}%0B>*>fSdz!KxX9oPGXAIH-Id#709(_fh?dFTLSr|oqu`fqCdWt zQ)~82dA|N5G`Gojz%F1KzMjN$d1HsRrzEGP^ zHL2GkJqP%1kQ+|*Luv*V6%Se>{j(Ef!9T*mnKX8(WHbp0*w4QEx5?Npafh5c40d)y zw}<6A(G=u3{AtTt{6_ObkoiR;K96^otPW7;Yyc%pqvx3+0lmCDMToRtyA{pm98?Etd479c17 z3y({x)gb$A_-dKYemB~%|Bcc(f8R!}cuDzdjZD7;dw;jKMeU!ETvKv0(^69nBQIYb z-YFL^*yNE{ge!QPI|VgK$;`V@}rGX5#RjHo-}=O>a~XP z;M0=t0nK+1kDcB@Gh=ceyZ{2rh-bu6VV}C9?JY0B&0XQlCgDkt?VgmLG(82&WIg=s zmldck+wY^V-A6GA*zTnuoAawZwtF{g>a$XruU=TteP=WGYyCrypJ=yk*b6sCoor{W zwWCIO%_DaH2(Q&V$S^pCEIWRM$IP{>;d$1M8tJu;!-K;{ae!U1HPY=ej6M*J?f8)% zD;o+eE)GQY`;7z&dj%~M|rLCU|$X;qdexHc7B4_inu_^yTFcr zD$)%x0QtCV6S?k%Vu5h2@C01ow&#wHGq1PHMtjY9b~S!i*imD=0WB?i?wB}ppj|e` zYu;&Bl1lVSR$65o$!&{&#;%g`t5yT>_i!m5H=moG* z<~X}-oY&d{8{@+^!ebs)wod4GR#P?CnxvJa+HP0h<_$2L+I`2zxuP&oeVrZi%^16E zyw`lst{(3VFhcCU6XL9i7-Uw)S1jpmz9IHQP+vqb|{W+uoK_fjC5-y z-5rHl(+|ENyJW1#S^<>+C2c$f#h!7ie!2$hhbqW6QT4e{*FmX@nY-<>B(D{Kg(G#~ z^oW6Csc77;NVgWjw)tda5JW$_V05$T`}5Yy$QwX7{DHI|Dlz$=81qFc8?KmcXuprc4eK#x)T<* zL0Vf5rRN9+G+2dxLCC98_Uy=%=3F~}s@Js@=N6Tr>sN%NkjPGk5vvl-L}-+~ zV`@wg0%KL`OFP?V(&AjV2&uNaJeT=wa}kn0dZjM(H$o^C{oMa@cKr@C>H)ht z%j?<)-P_)g6de#0%HDGg3DtdM-H*^n6smSF%j{NfFSBlfVudcSOQw6QLMT=?Sk35{ zpdz4TAE<)5&XuhD$LlJ(lH;-?C)%|Op&L}F@l~pNu#H4Wyvvm>Ha8{+ z0g2ZAYM(O`A+!exwj(q|g@VF-wjl@&vt#GP&?L@d2uUVA!hO;55t6dXm91uGOwcvH z1S1hb-{mONU{%0Tn558adibK?H`TR0)vli7wVs8IJ%=3*JHt0n z>^ZEiWRJTe78+OO*|o&4Zf=GJYj>2#dJU=K?)iDCauvQn^@#8(NVyGB9c5JlkRfPK51*4)}rxEI5 z??4?xqhyy^*TZrv@~X2~f5M{Y7WTpcs08;pHPhU8Y2|c%E>P`F)@!h! zF#1P&Tz^8LO}9l`;nBW5jbm`TRx*2+LLnmO@>q}SJ*b=5=72Ua_RA%4*6lI( zXphT=>cM_D->{?Z@w!~dp|4%DFviV*ipI-CJ`@{O{kmg9VO8LEpD{u zE{Jm_Acq8dM|n(;3UCt+7$ogbrCURxSXXr8T#x%{DAu#Cjn+w6xD*jP*<yp8~mU398LSYf0hgKt`^T9&;5sK4M9ftzC+-#qDAkLbH-enYZ z#dLiGHQX*38*TL(A`=2vdR&KR+SQA^*2}PA4oMeUr=g_#QK)qjW)?dRXGBzCDO5jo zeK~*-8yBdKG8YZ=O*3?_D;26AJI=Kpp%^tBUn3;BqHE0vJO3fC^#JBD^N{ZN5(*;^ zWnx$_yG1%ymFv!iQfshoy1Y({+8bKIaia>2M<~&*IT;g#z!+7{3rENzljaVvtCxDM zCt;H&VRJBlw)1UoKXTvS*C?APDh`OCf5;Bmg4khT)L8n#`q$!x-m2{3N6=ROu^ zdhN2uyw+p4`J$s2-TSnvtC|&z#lyZ+o1l9Dl&W6cR(dBaY&I%1(&OHtV>@5X4Z>Et z#Io~Odaa%lq?$O5VpV+&h20Z-l)2brbxf3Q#ZbHz>4soGN$WO2v7bbphKhkQor;Tb z7MXJ54WdAqFCYyAuxtBO&@^cZ}*^qXNcl6{vDGv8xnLU94% zl)BPmJrBhkr9nSJ$rXc(tM6prlw|&M?6S4k1YlE5R+r4vP^os!>S$|xiY#2z6S@8b zg$5zllAj{osj@27@z6YMM?LAaLZ`@@mgwnFx>v_~0=7-DU&hh+cROmG*Uh&okY4YO zC#P6$7^DJRC$2P{U*N{3w%B9dWJj&{nh)9e>%G=b@NoGCIVHT~nI=;rSnW?Up)j{c zM!Q}_sJC6PG=>q_E9z#>3Y)IC9H(Nw85snHi}B(ZHv)`=NrOw(X(;JrjIh-s-8X4* z(KA!+sEuB09c(gO@n1)}wNMkn>Y5=<#@JzLCP6Wx97C5w$)<_)K zc+K1FsAs&^R@m5W=tSgk5{k1Pb2!!G3e7@}&W=Dc#*GkX3Gzn8R@(WSyygMBY?Ie& znvG*1Jh-;w_%jP?06WEc86nmNH+`=}20`>!HwFFd>dju)+!@GD4f(qWVY}w^Tkf&i z=jdXbk{tB6R;UaLU1vu<>$MJRo19%bD{MJE)bBcK%kcyLp~8 zRWITZZfiI!?0q$HT{e~46Td_V7af@}&dD20%RSRKV{lEe@}Ssh>JHP|1;tr{T1@k} zo6M3t&+c>sVHpX(49sItdY-QExIcv&&ywo)#faIsvcMuOd>D!~k&?cK8Uv*sYFPPm z^z5`tw&EcG)OAeflstgxmXF0_7i^6-lkMt%d94G`z2SAMo(i5T{j6>>tpQNCsxr() z9_wi+t_`e)RFC_lR%+vPvfH62?vSgc+^F3T)kD&rilj@H6)J>V->B_gbEuua-Rl}s zz`M?Z?YK-MG)jg3LTH!@-BieXTY4Ws=oS?^iqH@h>Q&^6cNan`p0yXD1Qe?-W&xKL z+h@w+@C+*IWv{D42}iNup=j4AgsyX98=Emf2u0elILW_{5DqAu?nROAyQK2CeBtPu z3Z*XY))s9??&#PfQ0zLnR1)oO zagX$L-PP4S3>MCov$Jq5EPY{7%h>ffl)4kKE}Z8Z2~^L@hhjRZ#z%ENT=}dP^Xp<_ zb`F7Jh1Ge+D)Cb;u@Tkn-lt*fi+DOhf0Uz%s^>eswh)P2$# z%tpj7f#P~Qdr^H~Th#H;YO|p3RD*Najds-QUh5;+2B;Fbj@sStQ@DTzOt|01Lpo~( zjKdKH)&D5+0*DBf;X934T^H&WsHZhaQ1q)c?_LAN*(d|Sr#1Uw;Vy7Cec%H+g;R1V zdH{+&fWj7ftc6fgJND}PP^^eL$h$i)l5)@HG!Yh=?&uA3g&nmU`x9&&OQ}zn#kxMe z+Pj9s5~)s*_aTJc1`kSJxAWifT7N>bB`7V`V?{scI|uM+Q2@oBRx`wU5sGb6Tdwsk|luZx@(F9-JGLoRFZ66qE^ z2F&r8&)NC!cr9zGoNrKUQl$H=7~!!Vfa-}lVB8*fTo>7>t-7PU$+lk} z6K5@iAxc#rCj!^|P##V(EBIkw{=CzShmu%OuDSGaYsMXA{$4yHeZ+owFCW`h@AaCq z?Wjr|wIA{I3dYWT5bEr_Iazt5Yg)Y)zTd=bC5_E~|84V8J8GXdAlR|z?u)Y?cVx)q zEb~58oN5@ZqE^#K>u;Nbq0~}R8|4ZpF3-B@;r;~{PAz3o7ZE$^fY+M7Tt)|D`H;uj z0ClSrfZN<^C}}j$2G>63Q+RspnhrHmU0Qb{#Dk`6PiLSw3vr>H6zN`3mpS@yAyi+u z)G^xiCRBt|vjkW3Iy;V#fqhmQ&R+}7IQL3vkEKomWl*d=9;u?`tyal&q`JoLaqvDf z!7e-K#l2(oL9Z27Di1_1ROicdDCrmMo~~D+@HFXQv@7s&HTCyKTQ?%a!NCO)V|zbT z0>{>>L8u4pxZq>M2(zm{@mh(iB`z+m2R+u~P}d=bdg$!>3JT8!$46WH)<|t}i?|kx zXRRz;9IJrOsJcX8kcGG-EkHdU4-h2oexhn(jwvIAWnfSgn0F`eqC-Z}&m5dKmUYk#2}sRc^(r9@pmLNveqHQOB*&x+vBc+VxP&#ZvD)1Z;=J6 zo-J94P_jQ`M=&3=tH1S{J?*IPy!fso|2wa1_p|WZu|LHGZRJztg72bT@pYkMgz(57 zwmk@;bcDJ-r)q@IBo&JNF4}qmp>WgzZJg?{PC-T1so3Y`Y>aIYw;A)HxR+q4@MX}a zcK#1uSGO0`JsKVt&Oiuf8_cLz?Wkj3s}}k?m6Q1mzS8&?9=0nLUx^1LFXA6UL#by! z)&VH?3Fh8-PeAZCd+v{M)_`rkV>!Ei5mYagfT!%&pl*XK}PDG;-~!^>)&Vk8q) zDAtK_BhV8OFe4{=%)9KUDzE#^S7a`qJsG)Pl@U~(>yC%wT(7I2RRYVcu%HUK?tB0> z5(<-VjK|$=hfGY_etV?jlJMt4yEK_FG zH&7fDOwjcn>++ql%;jvJ1r-M$ZdY;hx*1A_4;|*(^%@Vo*e+b{Dhy+U3Z>VDu6&&r zH+oYL>Tef(5fg*}Iv%Fq5yCef2=#u$7b-z0$}YGwCI|sZ`8z^*4!%6v^6sivvh_IB zC{<%@OlA)||92e5cXQrjSz8Mb;^bA!$=VJjiwj$j`IDW0+H3WBOO}{AOS+~&g{!Ul zNrYti^2vPI+ma8iX*f4ch2pYQr$p;9tB|e^jra{H1 zy78gKdZ->!Q~17s;uxXc*lydsBk9!rmpR6+uJ)SC?5Hzd*IV#hXV)Bvalb1^5)2~- zbqEwIh$?OJSVd6GTK4B>wZblygo2>Bo~0>m-_srBl(fRp5lV8w@y{xN8o)fAlIh}O zQ;_Z+JYd+Xt1FKYp!AN34w(nVW~!S*cLfyF)m?YojVkr6sCx3Wb*JTqL6$o%F7C&D zZgs-kTB6+S8fi_p_oa^b;sXyBA%@nuet}|9a-Vs{zPhUl9`@W0#aWNbESk2uzR&%M z_SIF678L}FdU#vjQ;B8fO1YEqqVFVy%t)%{@oboWAytn+;al~AX8eq6V! zVCLNoHKxw@8PwTy*L)&_E*JWHq1Xi3E8c{XEf7~9tHU9m;$?pv6u!*GqJ9w}d_#-S zFO0#E)$db%zH=(@)G3Hc#dy;fvW(B9Tp6DMP#i7P0(WH#4~TVh{u_ zdU!&!5TW6Sh|?B!?9ZTN`>Oaf(tTKR#F+pKBtpI0n`U4bqO6*J+uh{P-CXSFeXl#IDCC~QhudswkWhUa= z#-kD&U4X8f3N;o!9P!dU=I2gSbJXyn@142L%{a5jDT6e_oNB=O=ttlFVovh}boj}c z+XAf^_LH<5yT^NxZU}a$Jn#KlE3^PRU#FkNhmpZvkP5|FTvto?tFUlpoV{ZH4GXsi zY<)QU4LB}a5jq&^eyHBcXX4CI4#n*at*DN?0D@bG%33`J3aY|Lsh2PE5Q>CPRl?c? z#Uj-`hxIcQi^B;BqZ@jn?$QJ`6^ac*7mtn%f*9e{G&iHIHYa5!V)EgetC3n^-rz*J z6e=8P&>2{ofu|%UW(%4h55@UhcYJU!fray@uKDIiPFY)Yd+T4MXqj{qp%_gm*Aq}z z+p)zlK?wBbn+sOpuQIEG*-frqP`%X(nxgHvIF9qU94PE%^P*k*5lT{xagF~CM>Q2R zE1dlHn2j5MH;f6=(&4A&l#d?3aeV<4E><`JzU$<7KrOrcQGY*4gwi92(Rmb#osOGv z947ZU`4=O>rGNTHg1vnk6h{I>jecAK#q}*4_WrTIq>=UL?}Gw#+JScAw3p&IB^(?3$1QmS}jcZ zR{ zWg>1y|zH079%9raBf_bQ8%M=Wl$2o8eSn zVS3$9!+0}m@4Gj4ora~aQ`60ic2B^+%kp<_geBF9jmJ~i5Yrf=qPeCZ*iQwm&}P!~ z#@sDkxll3AjzNfxP^MEb0-@%nF<#Q;BRIy{5g|s&!G(VrXABVkCX9FY!Rzjn0oI)@O?Bl|R{(Rj6BQ2Q<@onqJguo!ZYmMxsOx?N)jW&|Lg-GX#slMmD@qT7=%2TDglCD*R9u>Muz0E6G7yGs#~Lb$goL&z6q5rnfK{g7hESnwzT!Nbv_$+QqZ#Ss$78?? z;$)^_$HZ

O~{aB&A$yp$0lT8e!`}h*JpmeK-mB^C|NyPrC}JiS*%P;wP8^e6~0( z`kURX=y+LExFmcV83dsR>U#tWrP3+au`gn;N23tZjgIfH28v4xARoIbEcaa=NdfNG$u*v%?P4UE|i_My`%*yhoQXLd{D~#=8-mrjl955uBu^I=6*kBkN}A4hdqEocy7tx81)+nZ_DM z!~|%qrh)u=)Y(7O?B*JkU>Yl(f*5oKLZwpVgZNh~uS#(67++J(!%p=uoCdn})NF0o(ZEO3oeb_>#H z+$Ospj_Y^&z{MO086+2PK@wghOCw-%xY8Xt%i5da>=djBa%^c{I!D5w8 z&{uzTOY%7sPbavu!nxKR7b?Ye9 zwRY@A8~~@_#00x~NMlZQqQ)cdwJ?s8E$?px@h%A7^-P&+;$bmH+uDQ>8zKkpYA6m6 zj*$C2?$|WxCw1v{PF{*LD(Ie;t`D2))u!w-mJ@Y5I`LDOW#BMlTwO9uW0WMl55dtA z`~ty261*Z4|1Or3!Igl}HDX+X;9v=Uj^HpAH2XODlTg5dEX;eh--&OEm9h(x&wX%5 zFwx^`l8tVXlp_$7^3125vSh4>;|i`GGwRy;2!dQ@xPib6iwB&t$ta*{j_;()+tpa8 zTMcr_@2gS8~_LTM+EW9_8`d>A>zRHB+W+e{`HbJp%^1a-5burn} zE9OWkxc9_+JCmTUwQE+yxDk*HN^sNoBa|$BZX|K}I5#0Xx$Rg6)ej1*a1_38)#_|D zyUrEA+DzO@P|UZ^@7@9nC*WC24J>SUoyGFpA*oOXYBLjxy9-t)s=OIWmY;ROou-il zhw2g6R4AOrd8hLlf(a6AQ^3teS@RIQLGHlQ3w;L%zSXt~N{<-E=m#i{7;Xpf;#HB< z4NppNUo=uHJfgtu+F~gE?BXi~xr|%zRWf%%v1#y`mu}EcmKz36%Rr~3F&+|Yh1H8^ z;jK%gD)@>OH{pY|!a!nqmOzb?8lOaPJhH&$sKn#C`K~%gIf5)2cQ!b4S3%w26m-Dx zu;1OL;ei8>2l4oBHWa??To~1*KZ49{N;5apctlL95BV*fQ$U7W=B zi=qVo@&<}~?%COJ!+rG^?p;v22HPT?s5w}nZ5Np8DV5Cr6ezAS)l=qkPBo+a4I}3m zwxMYrE8>3H?~wriehh*;l$x-(fK=xrzO_*5q~4S=Z*cPG;sEjljC{(#W5-4Or9byO z`{&{``X}66ve<4glHm{d#s#f16P^4!u%&Es$^fhBBJs%@iG|{YweAXK6~QtU7J0t> zJroDBjg7Aa13E2s&fJMZ%k5570q)9QS*#aN-5adG!!iKT)fBR#9+ZY)@z@?~HWX*3 zoF!h;K6QDsPDAy94;L;x+Pvx^Y|l{Gdhz(=E+?u8^$uPln@&^pU^WYiBZYp7?-C$rE)U<~%;y)p!|0Jk8v~5OTm$ z#wvH9I7>{Y;tovm8c0?js|YXgdY$^J1ZrrV?|rC#b*kB;^5-4UX*H2q>&c@$G?V*Ov&zFl1f4Qf4MDP`D7LK(RgOxVIzS5X=g7#*4(O zq)e$v5z@87hVT&-7X{9rxE6(O^o@V~JY4OdxTG*^ zu%CSe#dK&Jy1DDq>^A<}rrQu=x5@V>kJ1i>!;%x})&kocE@rKt!345*OvBp%D#SN` zRwAShcust{>2d9oDEQhaWK&%}_*UjdC=Q0qm^n`MGK}0N7}aBF%e`3^0IIejl0q)# z=ymHpDDKG^Eu19Ep}5whuGLUHCSgM1HPCCfutl*4qOEjY#YyP&|vi;sd4d8#34$3NG8KTDLcAEeaHZ3(JHfZ zJ0`=mTz%@(?d*UXrycdyhjI_XZ{~)}yZY28<6)OISlL_f!+1DLs84+|-bnnAxWcLr z$@sVmsSn9c!OdKe5s1L;_+f%1{P084KA8fa`eeKm{E(^m;fG}WH2lzxdrS2pX~)AV z_4%)CDK*Q|5y(L2c&XV|bxfW%*Jmf#mg0vU;oyh)KZYNENS40>KeU(PhaZym$2C`j z7JfG3haK|_e)u67ZxcI)1w4lzMtA`~)Gy(O4^4Jzy$fVUd-1~_{Qy6V{}F!psZXZ+ zTv>&z;1^ogCoAwJ%I6=sFizly8RC05{@DSe7C-#dC;hB8GYkZqfXzVKTWEVLkQHnX zwgSVozX!+<*$C_lvO)dX|IBb8$c%0T@t-kB^Ck*>NX8qYHQ5$=vey5nEc!o9_vN6+ji|Ug-lL0%&7B{i#^FJYb3^$WT7Z9f)l^$1jRSquS;6%e%jQ~F+ z#|{@M{sjx;Igkavp#A?FGTn}uORRZt#@g@Nhdxe zF4@MfAlJ&D+Fz~xB!g%0i~fJq!%7L@w=$>*s&O=+vW(~g+5W~LGiajO6l8^)Yuy6m zhh#-tgDz*t6S|!pAsM4HeleRa6q?LFRNK3O)L|ftzZPUMeKaFMrjOD(2IPliJp73X zReXP~2L@m=G0u(JaWe%zB`o`pK&jLX|kY&(9GunZT~MUs^?&Eu}<)y zw$~?3OSGM2#UBP)z$2Q=w4Y?~QLXyxG@wVh$I*mxgW*xmgxpH69_WGphW&C0>uV{aLvi;@SPO=%VYfVz`)*8f6YXdWUOFKvg z_uv;3?A3OX1?&SEf4{cZC++;x{^SSRU!TnHW7z3B6mXRUKGPBFlcvMkP6j$d_UR7$ zN}KDG_4-!Z{}UPIsE$W6-7&5I6B+O40RFKa38)4hX9mu3U%h_O`P3&(ziIoq$i3qX z{Op%nkmZ>8MeU-{WPb*0U7y@@8V4HJF&+bT-#}JU8bCIs$+Fzfn)~$hh?;D8-H1Pjg z#m~9O0!PEoc23ms{@;*UObYC!{)(G12a1L}@QW2G0NK*JY1E{B9_>!k572Qm^M7y0 zdMyI!eo#jzsh4P7pNzj$+eyx_CqYhtr$DBATKmsM`ZuxTco2IL5t-pOkR$hs)~|w$ zSPrtoc5D4M$PdYh@V?e0^Vz5Mesn1U8nD+VTt*-o z&-g*?1WjreH1iDsnJ@oP7ws*A^bBta12br&*-rCfkSFUTqT9eR4#?#tBGPni5SkP8&C)q%IgP-XR zgVf*X_#`WIl$sj_12h~1Y2#n3W5N@fr$G9D1KEYYgZz-R|EcZO+D+V`#4KiLB$n@7}_5^vP zi*ccRMu>%hACfvw>;DOvaX%fOWXlFMytx4)#TK@;CDXk*10&nRAWOL|`wf_H(EY<1wg4wnOXUgX&j}<@6a-CS1ix}Y> zNb;zz4#{!)QS1LiX7`hhN49|eTc_u&W3d4s;{|F4f%wm86pSUuf}28-%|Rx(klqHQ zy_L3;)NMe1>lm)>B9y-4eGk-OTX+Fzf{ zcMa_9k)kJbgmaMvJgFnD2iby+T0aBQzX{~$T%><9{EYGfe(`zcPLLIN8-zdH*h4Qq zB)fR8*5_hVr{gxWt@FSaW^*-gpXsA~N2pI$U^MLH7?3?N4rGQC zw4MmEg2^C1B=r=nNv2EFx{gIKFr#$sAQ>?eWbfsHEO@5oERgf$4z2G5`5{?gG06Px z*7pC7MU21#=jj9_Gg<($0uO3C$#_e&u1{8QskYZA?Y6d))DMHKpaUYmB4arMY*DEg zjMX5A;%Sfxo&i~*XSLp{`5efM{sppP+d$^?iq<SOvgcZY_|NEoU$=r8+MWqA-)vCr-m?(khh#zdAPXwc zEYW_F{(Cg<1)0$T&4rqawErQkmume8$cin~_D9_qe-^Y-M|fOwEy%Ilp!L(5n?V-% ztk%zijJI9um$m;@t#@i&q4h4UcWb?ef4_?@dQUqlwPQcXnjX;lBkliK>rX*m1HJ*- zfbX^cnD+mybrr}8{z|(u?C^I~x($m#@v%+?Juej{yf3Nl^@$PdY{ z&@Q3hS@bHt#AULpw3}q~t2M*4y*}v=hn+LKH^|~5biDecJrZ_SFB)XJ7|mFaey@e` zadq_TM#6Ykz$r|2D=M9pNvK6)>@x2Ro~NFxw_EUkj3Kq}iBzJwEkG ze-rI*su`l=or^4{75stD-kmsHeZJFlpZ(R7t?mFXTia3RQlGSU)^^f#I=*Ih<4v^@ zN(pw;?sJj13z6^#I0diqWcL~h$FJtR6*cJqY98Mcmw2zq<&Ltk{Ry?S%LRJ zF6a+IK2!Nx+kXH#K&L>?jDRAnN^WV*K(_oskQue)YHdJf+zxhDsH2Y8Nwc$#U!RP3 zDeT<2uGH)avYg%^%PH!k9Wfvi^aJ^+Pqy?rZ6}$qzt-m>3mB;VB;((pHA(+XqKkY1 zMJ~2sI>N0WTRcW0Dzbv(wI-==*P3KSCuvUBOa)niDIg1;rtRs982?NJ_#v4=Hpm1s zw4J1#|7#E0^R%601?Ou2o!VcZHHVfBx<}jRfxOLm803dk--$Q~Fycy(1(nhPt^rxV z2JPRZ?azXY_ng-M0$H&aHMfCG_bSMEgXW3GSpST`PiOt(3;W1~ms8+FGUHGR zd`SAQroiW1WW{>ohZVzDcj`kjpWcQuZMWIz{F{0BjzxOLkL;op-BqdDPjbl8w0)Yk zleA}O{a@Kq#vn^aAkV*T&vxE$83N!=dc_n|VB$e#u||4Y{SBe=|>xA?M%BE5u_3&WK_@ zUeLrNvh#1|sTc9sBj?}DJO5_h`8V^?nDt1o#= z*MNLdbpFje_R1iBd-HF|eS|OI@pG1Vw(T?UJXimXJld(*z31P|JO5_h`8V^{AeZ|0qUGw=V0H}jkhC(LoC z;mkT=js_|Pp(m9p6dV+UpHjy8f+K>6UzBmN;HV((S7lr#s1gkPO&LoCrv*cQSH|^% zT0z2TW!xeN{zIum!8Sq2pURjjC>OM;R>n-hZb7Fr$~a3b84Cpm1>t`y<9xvp zK}3x*E*2aW#MLU}GC`GK;6KV(Dmbn1$j|`v>Lcsb?^^zL5=@0Hg5Ut95(V1?A%V)6 zDkvAU2~x&P!EQk(mom;0R0=|am9bE8P!N8BGR_wq5k$C^ak1d2AkI?8Wr8Zfz(&eg zDmX0|+E^La3u*-kO_XtqAh@YgiGpo{kPu}|6_g9wG*iY*!EQmP=E^urP$>v)p^Sxs zgM#o2m2tk{h#;b+GA6PRh7ga8wZ2Ss9lJ zsssbOC}XMMv|wmgWn3?)6(n4uj9Uc3mnxMg*d_?MOc_%J<$^YsD`Tc$x1dv~GR_iI z3PQUnW1--nAp8ntoG&;ci0H12iv>poaaStiGC`GK;8n_4DmX0|dbKjH7t{(8!jy4~ zAUIs9M8P&e$TiBCDkvAU>7k67g582nJ(Y2mpi&Tetuhu04hq71DdT*>5kW+6Wn3&c zDv0Z&jLQU7f`JjrSSmOz80t~R^@3VKLZmWo5d=pml_=OI2Ffd*jO9iI|L$6cD^@3VK zLVso4A_yL!RH9&;Amn;wOcj(1+6+|2Ou=qJryG=UmY`A)dZRKH3Jwaw2Pxxx!4W~k zP0F}fa8wXCSQ(cIsssaXR>o4nX~EDT%D7%oD@Yisj9Uc3!<0%CY!ieGSH@I9xuDH0 z%9ttGE$DQsGR_iI3PMLHW1--nAbg}U&KDdJM2u3##e$=PxCCWfCa4k&9IcF{g42Sb zW0Y~dpjMDDRvEVlg2yS9DA*Il8g197QTqdXz44kBlrGnFfp~=d)UQjDYn5>Lj1i>jvB?`6)LQ<76 zRZuQyGesFQ1-k{ErYhqsL8TxxO&JRX2L<8NlySb`h#+FRGAjkxfgt^MNMG$<4Qi+0X zf{;6vF;!45Xj7n!nS$MdPKC-iOHe5YEmFop!9hWIu`xJ3{=U#UdFHbKa}%9tuB7qq!g88ZdD1)UZs<19g? zAoPA^EEF6RgfCRa`GO;YhzFE$vEZm6ZjmxB6I2NXE>^};!D+$J2bFQXpjMFZkTPx& z1TRr4QLs%AvQ!yU1?7S^wlZc4b_+T^tcM?{m02KRcSjt4)5UxUeoFRxbjxgyXbNMw1Lhc@fNOzH+HqZ*X1l&t1PZC;Z2% z8UM!^?BdcVk!-?~{+YILHa@AmL)XFEbe+Gqr89P&^48M3qk*@zW35--E$iXUSnr>< zty3o6#0~Iv+~DtR=cH{=X+xfZcW(o42dCXr%3Drv!BhTeJ34#Bo4FC*u#NuS&QAVD zmA2E<@E&g9?do)YT6rt!UG%hn+Dn~7;w^jz-q>gSy_Y)+o>6JTH^Fv77&oA^Au9iR92 zMmcHEtF$36z`M7BH`;0Ug7TKrTkwK^+E{0gcr*V6Z`i;5y0R`qf7<@eA@LS&gEw}YzxR4)!8VmPd^^0y8+dPUqP8pV5qei`_fI>>IVRr4 zFTp$HC4cW=XZcGiZCn|=H4VH&oIz#ETSf2YGXJ#0oNDowz6|e#m;JrBI2&J9X@|Z7 zZ_`)&y(65luPARVy*nCsM>*E3%Dd%Ncr#x0PdnNv6K~=UcsuU!_l|YacBr%=yh&S^cc*EZD_ZB(%@2Iq$-i7yY18<4b{axj)q<7J~{%P-a4vDw$J$Pf^^Y_kk z7QCm@hVO;y zn{mKDt>cu5H}L~_JAUBrUGAiPpwfnX2=Cqo-W5)}50$r^-hvPP)2?#%h&S^ic*8#O z_df3Af27iOItcIK2HrJJ_k+q?N$;YA{%N0Z4vDw$V|Zgf_V=!H7JRJIhJOO@@dn-v zPShvLdxYLqpZKTU=o}O8;zRHbIppts##w$yrH%U(-kJv9&CZ}tmA8uC&7bH4M5f)^uj z2e8x0ud@WGzvB6tv%k&~q%0Lq_pi>T;$QlF-6^TF7;akLa1J%F>~ea3?Mvl0iV^2c zXF;7MNLh9}U)5O*H{-nJM1A8+6(oNq!dX&hG2E!NvBx+I zd%trQ99L<>tKdD}!27)uRi(T~=v`IipZ1t@OuUOvz&qrGzxO9+`3aRa?j*c54ZO#l zK_`{Bir&p9{nMUss>NG+3f>8){Jp1~ji*%Fp})Y}^cR2cug=(Cl(&}N9Syv{JJzqt zyX9ASGk*0?`-f8|-o)SF?f9F&x7tbjO{ER_9p1eSyni|EeplXddJBH{Pg~>c5pU*c zc*9Qnd;f9rPph<@{($#z1Fz|H|3i5z>0R`Pf7(Fjka!FKgg5q2f3M3~@TW=}UJdW@ z2Hp#tsA}asLhq_-|Fo8KOuUQFz&qrOzqhfo{ESK)_ZPf14ZKaAL4PT46}_AP@=x2$ zsTObP-|$ZO+uz&5+4#3gJG2JgrZxWFmd@B3<*lW6M+0wb$EsD{Ew%7w)cU7w>y(K% z@gI0Q{^Rd$=cN6^w2y=YVt5-kJ3P`ZkiPQ3wvQA9`aM+X_{bi*oJXD8oO z-cAAV9&X_6>U0lK-b#8G1^B1E)Hx*H!a#Uq1O2_1I|~9;+VKB}z4r{Ss_4JJa}rLd zp|=o15u^x&5<*YtAYv#23M#!Bda(gQKty^kBfaTj(S1r{50OMCCyb=o#aPN^n2A( zX13o6n-GqACrB-08ihORb*byayBfEt~_t5!8h8Jw`0Gol^~QmdQDjE=fj>d=hd zu<_=wtM5pfKs_I%);1+09QC-=i4oqgbg&+iS}*W7m11<|N&qrGZ>vpU)d z+oS+$L;d!-I7>;AEb^jC5t%faj6rFc*Bk~ zXI*tzQPlXNUUifiThs{~^C;@IAa%5<`lzE`kUIZSZ`iTss;f>ahMHK+tByCbi#cHv zilg2MQYV^5#U1s!)b+)^VJDm0uDYNEYTFWCb*foi!U@}?Bx*!SuR7hdDe0(prS1t* zXPWenIqHVTP z+NTU^nKE8=p&3-h30oir^?Z=J*p!TM)ZfW%2%~e;O zR0B1!hF3jeX4i1SCd8xO2~v-lM)8h%UF!OHZ`hB`ZC728fZ8^}tDZEg6P&P3YNAHe z^s1*#o0^V#SL&W1^;46+mZNT{h1$E8H|!a+!&TeWMvboRRnMBF+D_Qabx@B5sb84L zI*z(m>d-pgu;FdeIE3>x3;(5A}SIdfAk$=cvb}PORq*`?Wdis>AA| z#@F|%-giUxH^-hp_ z%`|%4QLjr~|F}2o4RhO77c@d`+sLclGOHUoVVgXG8u5fz{l&C-!cp%^-4mq#X3{ry z)D4YMdpGum{ln~V)pk#!MnCCQZ=0kiov@h`QI7?wf1AieN8KxRXredl9dp=K`!qo< z)5NRZGlQBqVGA@xJs+g{Ov$E>dR*$nrrxk&=B%p@Yla%%%&Yp%*k(@HnC7V0g4DF8 zYI8@uAa#CoZ`kzas;f?V3N`U5ubR=!e#!}(&;s>NkQ!kcwQ$tyQrEZehRtGbyXu0L zsBK$%)of;UODAlTR;UrJylM{9rj?`KmAWTL&1KR*?Wh}`M(zEyH*6lW!&TcogBtye zSB*4D&p2T-w?;h{q(+&@){eSY>d@BSu+iqQtM+MwTBeOxEocU{al#gO7WI6PTG*6) z)=`g3o%pObY!P$TRfj!?8vmSEebkJ7&IudyJnFR|wYaJJyrW)_I{$fZ*plX|t4?Z* zn%LH>mNK*3I$;yqq238n%a}&(9QC@?_3gZ2%bMG+x}ZI3+xA|yyjk7e3EQLtYD5RG z8f)5gaMZg}_XMeNCVfXo-Ov%WcSmp7%4UbFw(Eo%-N~y~HA$VEu$eof9t%>do5;?N zx>xGZ&fc)`=CG^w>4I9Oi&w2_26b`57U+t4K1i)?N_KVB<5DMf^@go$&bsQbZm99y zylQZ+4oKuvtXt2Q>XUvR=EB%$63QWH(1 zBuBk2b$yaIY*TaFRTuO?ZQH}EHaDw#IANRgM2+a_Ra=-gJstI~)IC9JE0eyLqi*Ph z+PjxG>@#MEtG4Tn8r|EgwlPV)ov@kvpdJfSpEHqt9CfeMp?$nz+nU3!+NUpSnZ91N zy&2Tk30t5a>iHnGqbb?XQIAWV*v}ibvpMUk!}_Df_xGw@&Dj1<*q8yR*MijUrs@Dk zy&!e|0B_hNbJbNR4Ma^G=v8}~*#n)h2`{4F2~vBTMlU+*b*bxL^oH$gZoBG&mr&cj z8d)h{_=o4kw~@v>JPXxhB&sCT9A2~uA&>0fcw4X>c~e#IO16|=)t+r5e!{i;_T zWRhNW!e$4Q>Rzcs2YJH|HHTfb&tTLtgS~3988p}lTVM$4`5<+KDLKSZ zk4v36#2a>`IqRy!UPFz4&8vEHF~61oo$jvI$<-vfqE=RoogcBaMZn0 zhrZzrJKr33)jp$8%Z&1>3(cTWPS^r(qMi>@7n_oAI_hz$6W{cPU24v{>afwM@uR)! zax-?c6Ea`$srKvi`Q7=fHKgJt&wYlo5lg6SZj`gZ*&FryG*o1MYcY@UQrqMV@ zy)JeAIB(dE=C-RY7?0X^yjR_9R*!eWHkp7LF~O^DHEkw1>RqXOg4FFM{X|FIFcG!) zL~qy>v%^)}O+t;Hx2&n2LHnNZoHrPIc7dQYTLJhCOJ`y6UiLsPWUh>U(DFG$(A#bku7>>IbIkbVt1) zb^dg3*u&(!b@X8{R_g{gyZE z8MDJx+s#Iep6yl7nxxrI*vxZKj|Hh;n8-Pfx>xGZIo`16&0$yVGZ(eYT(5f344UhN zEie!De2{wCl$__N$E8l3=MDR{IqRy!=A*{X_p0BTvGbjd@uhuy@R1SM9R`waf~yde016;e;))67_tL>N6!*I_hz$6IXh} zhMBXjI&2kc{3@^NH)B^hVPjUKUJFvwnyRZE^}_0~yk^1bu$u1sC+_>^>CIJFowSCq ziEF$uXEd|dIAIgkqTUHoBTS>Uj(T0{`nBG$SVOynj< z-MfkD>a|T_wK?p~y*ca|o%wEtD!not2_3eZcvO6Lr^UknJq0`H?NRxhTZs(VghHp=a*cp~3jW6D0`zWlgr06~! z`}9rf5)x9bg!AJ@P8?kac6uqPSC^0hDI@lV%hLfUhW$516;-w zf@BGE;^}abcxDYCYa&Owh3}Nqw|7?p)i-xehkfC{A12D@g!$)F!k9N~L}`7h=1=^u zj3G7Uu$14i`Y>;rpXBj(SP&ADDJA{~>c!mL7S_y7_flB8(5O|Wz}~P1W)m0wA*=b_ z4;7}A3gb7|E`|N!pS#|PG?3ktf4&LJ8RmP=WcxmBYh=@p-0D*KdL+G=gcC9zE~8U* zDTS_vrSavOaGYP0qWU}cO1fXqD^jZd5Ed1he)cJh(FUfp{V6Ot)Mml=N!YH4N4|D` z()dBE*<78y5mwg!{tvb(m#Qr3yS>`4avk`9oU&jd#6PF9hQT=!^KUr<=ED zU&1^Ev)E9l4bxqrn z#uUo!pPoWTSr+>LfB#==;8&k2uST}?k$zf_9}=u#a^>~cEQI&&J@+GeOd9w98^m!w zV@&_N{v63;Egc3)dpMtQsZ8l8&S$*kltwPgO|V=z*SRe>5l(|LEqD&UK9jAT-sXJX za#LI`+4)VlZyAaDOtpq|_K-Z5n`Sv(mau`RTTb_xLYA9hIjx=xTW+T1GQ)LH3Hi*j zoC@2~`4KWa#*%s~^i|$4)#okCsRjmFZnovJ!ws?A9Lq7&gbcOZT+8Kz8)mtAmQ(E| zTW-E`FTbj9ge4bPE)U%6rf@!5=?yC_vQi|{D9bH|Q;p{Xvn;pN+C{a# zvkuuyNz@H?z^PCr!Fz7$LUvob$KYPD+#bu7g6o+Kss6IplBMxywubvGR|f8PRR^DU z;Uvd^jg~uT?aIP!vD_gzdCP&VmV4iFEFD4&RitK3{?L*YxR|4QP>l`|ESgk~Q&g^*zbaNc&zA1v1p?t>|8`%QZb$kdMJ$=c8n%ZkX1T1E>i}0APQ5mp$UY*TT(h?KUQ9 zZ-VKTYhdk0!%c!~huaX2{D+JIAK>YL+t}KT#b1e0qR*3-8;3tH{?4lZL`#l`)LluR zCYGCkUyCMvnp$omel7L%X=b@e_}|2@Pjkyn#y{3_Pg!mXoN7*=7UERRQ-OwwdVEW3 zI1T?!IQ8yUmYZ(v)VrUy+zkAxJ$2$|EH~3~>Uga!Hw*tT+wN`P)SLz+H@D<-*6=Mz zRiXOC^Ol>9Un?Vh+FEW7e%TGjZD+Z;`1K>s>J#lPHxK^-IQ5ARmYa|NT{!wga!5x@ zE`U^oZ{T*a+(P_M(srY8JHsj0i$ELOo?WfoVz}om*UfTE;M!TPyXBU`b+FtE4oCej zgY0Cj_6*Lso(wmg{TnR>AeMTt7HvdNt@{xdE121NVvU z|LS-zLaL{)1zYj!^NQux;n(O;=NXKv%&Z5y@Ti{*vD^myU4Z(;YnIz+IrWL5mfM8? zb(&p$B6*l4H*?Vf(&-eI+X7b+PM_hH+lpV!q_!SmxowtHTfc6(?UqwpkF?y|_;q_% zv%cYS$ss9R=>9Hplr?+@|JSy(%JSOZ^^xodD8L4XM*MS;m>EeiI#g8PQM?o&m_z3$KTCzli}3v2S9hY z<+xKVcMyM)wVR%710RCyVaXYmdk?O-bi<6g1c4g7a4ch!cysr$c=zy}b2u!gtrkAORf`;+B< z#@`$65bkx${er(QoIW?<(%}9I+QYpkzqR`fe+SF`4ySJRJ7@#YZ5AK180O&!s7Ip#$`w*zGl#oG%*#mTm;-(wpTxDxy*3$teqa` zRFEui3oTbdc545ukV`FD(gw~3x57sFnB~~s4_R%wQkKgBx5jd%EteB+gXPLtE*IQ8 zaLROy%TZ|y2tE)woV%f;ES`QSF-*Hl~;S0(14 zA!MWFs^ju6BtM**gy}gsq&5uKA)G`wZK655j^zr#sYx_v*Tq$Y1>w{r;_6$wLU6C( z*QbHy3d0S;uc^HuuI>?!z-d*jsr?DZj`}YGp^l`vy|E2kl%PfyF$f*WM*wEkCo9ASqHwp<@;R|igo)4if^ zvL)+6s&pdzSx(#Q>ixQb^v6|%_2Ja}#c378rL!HY2z66=(Q*xKeBxfR+~aV0Y^Jr? zQP|{0d>`gQ9}OW5lPBO5p>95dtzlz0Wl-D@%RLFF4C;pT8m=;!2&W8+8)ogAzy*E@ zO$C-+Q@Gh$|LM*(!jjD(7vR@tqz&90PMOi2>kZ321*go28)dl`a6USrZf0*-Y zggnbv7hK)-rdaMd{F+mAgPUr(=e7T$gwx_qvt(QRDxJ9LmTQM!5$bL>!*cEMD?;74 zW?HTTeoZvGNzH;&20P+^7S6dzS-VbfN;g?|DcZrwb!YraSlk@Tb-{m|@va-vT+4OE z{~ereNb@Y$4gYjF-H_&6t~>r8;B-S$v*Lujz}FBs-H;Zl{Y576m6@KYJJKQymFph( zvsrG54a|vfNDj*_wRXMWUME6*mRq~taD(A=lUiZ9KKQd!3;L|ITwmRPRSmjxt+Hf4 z{Hg_Ut1Z_bzuH}Qvo*NN-~jw;cX8{i-9Y?mCf(uITkb{tY9`&xba%uFd5JHLBCS81 z+oQ;r`O+{dguBTazJh-R(A{ja<#dd=%5qyQH;C(9KzF#UmK%(JAvY}DxVBkt2!3Ty zH?Hk)>VF}x@ug0qJJQ?Ma47z2RH1G(DV7_CUx9T4dB<{!pcr<#FYK_~aQv!OP3=1^ zHv+$ERopJiy{`42BGi1p+ma*ki__e`$8vArSA^AZ_gZcgenlv5pXJ`PcADGYwcKcH zCvLyx##p;}wf_N2j zX2c!0+zk90G5UOLxtVaui@DIWdjeObn}uJc)3kfa8XEk6;Mdf7+H!AMyQgtKvD|F@ z%Cu(5Pc1jc+C7i^ndRoK;#b0&NG@7#8GhAFU))QU zTaI5P*8FhUax3uf1RAol#;-&a z$!*Kks=;$NpAxN2k81v6W=1vti>(SkJV!M=4^A`3egdumy>D^}}f)13TqiI{+UoclYyibEfpgyENGssLu^1W_0SNB&hpn6uls>+=4 zimQ8aT~N9!A-NchCff6KS-nn>BoYKAP!UlmBFXv z`!f&;@_{IjAGAel2ik*ekeO=z z3jQcK3HFhdcfkR05F7&UnWT7s5nm58G2UOc<0~-DKy%;+bwC5~ICuiYfmeEphZ_N22P1)AUKj=RB0>+)4RirI zGuDAe4^R%IAs#>YgvR(3oXNoS{5c-IgrJuWE`m!S8%EkK(@O`J!Fg~2Tm&b8UNSfZ zPJ<6X3U~+X06T%kpAUqBFpvgJgP#Fr0R!FwbMz9`Ts#ZGBCr@N0ZYL>YH}3rn_w&$ z2O1L5P~2faZ`KS4Ps6>6I|vL0Pk{>Lp#W|!kOTaK%^h$OoB$orZ{gn5_Skpe3iuv; z11^KFz}Mh3_zdXnhIhaYunO>IL&!WZ6-)!u!DuiBj0NMsA_|}zlI}mcsp(#$MXK&E zT7&AI!kfjnYWbf_?u=i%D%$kW=7si`TY;xR3lIw)2bDnrU|MtD%4kM2KLzT5TA&Es zL+?50y@nE?0C=Ak{Q&44hQr_^kee3H1M-5%@DOvcwm&+#Fc*)2BA_UE6chs`fcC8( z1EoNA5Ki|<3-sEMUK7%51$vF3I|xDdfj;OuG}9rO4#frnorApu%7Y3Z7E}ar+A7uo zcx6xp=s;Ts*gCJyNMxCS_NR3)szXm5ay|<#0c|O34h_wG((wg45s=a0Z+M=fMT=75Ex_53YhA!B5~CxDIZBo8T7M zL_(XvHqeyrkPGAnc|ass0lyMV0WCo*b?Aa%3F1<43Y-C-gT3HguoLJ-idn#bnP3JO z4-Sy1mJM1aXbGT2)61YEEz$|}1ua2EPz6*4b!jfWr|=?3)_Vwg@8C(02=s1&-X%DU zkzN@)2o3@Ln&4Kj4ZIEXdcZqi2heK)yMSH=SOI1Oo%YWMs|Y(4cN&-u=5Rd$w;@ei zSC5Jn@l*npK{=pTg!FFN$3Q3dI;md_^up#$pi_FCRV@R{!Ah_S=&VZTQ0st>7e@mf zAC3j%fKK^zf;R=|)NUG>uA`zEcxC|u5Lx(@icgtQ^;r`F_o$hy*&c)gf&+ zpaWN(uj)Ki=cgrs&P;Visxwg?fyRJxpghnKrk;=A1}Q*~wtAG+qpO}u*MXP7%U~(C zdV}p(9p>xhy$j$n*hxuu0Uc591^d8$kOJNYi@;%OV5Le4)__r9G#CTMg7IJym=0Ql zHsD$C9Ebx|Kvhr;Bv5!}N=*&cCBx`}rMK*%1U>n#Dc7WYLM*J{b;z0t?bCjOBx)5Pk&<#`r+Vrmp>VXEJA<(A( z4R8fKO(q(GMj!@g^Ix0&<$*T%i-RKIRcy8IeiNL~>B2cY7r}8b9V7#7!l$L`w1qtc z^at7*&I_u88Xz7dfSTYi8U6?y0Y|}GKpTW}!91W1KW*^c10kdt2K*pd4`sgtJ=jGM zQAY41xx5K}1|P^p%L1Pr=%=Z*nU{sY+N{e7a)G>{5GV?Yfs)`cPzsa*@R}J=u zUd%x7IQW$O^d^1h{ki5`G$l6;!Q-G2s0V6;qSS_7=siMJ7AIplKnNM~flx37o8UqW zd8IOTV_Xz>EfVaR$TyFz)fJ&e}A-P@1 zl#oo~dJC=vP#kLrBUgzApzA>Q`bMMnGe+N=WMUM^!F13aw=AdtVnIbv3~a@A8yElv zg4C_5cZGI?cYzX8X1ZETBQuw<*Q-8CJOJ4wt9xiqP#1c4=Lzry8PY(>i`$b7=}nlw z@#{?&op^?U5ui6{4?2K0K<||39gDp6_35lT%myY)U;eRrToPGY$A9758rmt;I%t zNc|~LW8>j8Is%z^h@R|JnGO;IM(U~GQ%yP_)Op}^p!2>VK*xD{V#x+_0ND1>*X*%s$8n?cbkVE2po4)I%yTwlx{)#48Y}J(*QI4*;ux4zwzRI1sQ=AJ75T z5cJXDMVdK~sep~+YA+}t1iR`7uYsH(7f_;sz^SV^z!kve7=_R&$!8$Ir?y=IzX}A> za*k>OhN@2C5AYZG2L!a#k*KGuRsve!S~b%Fq|WGH)PkB*&8N6EuLKgOfXVku_nI~8 zh8u|ZVTleW5_QtR@RY4)JY_-|s7`qKl~5oaT?>Kh2QKZe9vjHHj8rnY%5C5}Fr~_N z8GN7w!FIY0&R(yHPh_!aF` zDm(3ODDgmIN<{cMl}#q}-?`3+n*pQ;>A)Xw{?L#*&L8uHL4*Kp;QkG6gFnGv;4b(F z+_8S?%J3x+N*JGM-rb)kQX9r;Z8YJy5x~idx!l#C!%XS!&y=ivwERH(YWiDc?agEZ z+K>oDYlbzxST+3e2-ki9=o?bq#wcqzG(4OBF@B{y4Mbr!a zh~xuQq)rxe!f*vV59)$wph%R6GFS&_nOYOKI;aM!0%fcOC;*CsVxTA}1PX#8pfGp@ zJPLGvg%c9X7xu{^k6EE4ZaEMGN`o92mclIq%7XGhHA*WvG03d|Dgq^}c&b=`9IoP0 zD||;hfjBF39f-FQ{f#3up&9OKk}Y2usn6^KaJ0X`7nGmuY%mY@}A z4aDhM{%65+AkbgbPuhWGwe?sq6ubaBgHE73=my%_>khc>fdWmSMmpkl1+tf4e3w-I zK%Bkcg5ymUXR;Gefwddi0|Wy0#IL|fKpE1tblEDwKw`>RZ_ppS28Mu_!AsypFc9>F01i1)qRZ;21aoj)Fi&$KY26h66R_FzYIV z!e}tcjOgjl@xn;FBXnuqH*r;YDo^UNiW>(M?F29$XdpgH_6mY2TrUFCfDTcn;!XyW zz(inty*MGfr=SWZbIFqSfL*|VwO|%l1(t#}K+!G)3&0#O8_Wc60fnCdrUQjnSZQ+S zTmM{K+0E0iQUo$s4FZWMGb_OgupG#E8CVPykutIbD8mY?0&K?J0M>!^U?bQB>QnZe zxI4f*AO&m(TS2{&h+FV%18;-fAO~C~a3q!gqfpbNx4%O2akyh3bpw6OwHoWB<>j8X z{*kHpv-m#;XTWFR3!p|-|M?Dl0|NbJDE?kRojTBWE^8K4tE-o*v}}|>N1#N-eGLMI2^2uX_FMSxK_s{W6z_ihjkz}Q-vN3!-3&GX{pSUx zG0=l&VO;HV>j-2eSOJ!UW#A7qjhx@Wb?_7T5o8ByLX9lF!*Gpjy|26<8~``DR{Xa# zbZ&qE5paKn`vv?A0;PY8fDzz#xcRtBU^)53>n(VZv zpc9U~xC_PWTxLEf3n~-10PZ|c4a^0zfgahl386C^ofD789S6pOfo4x%_CIv^6%B5a zj`F4aL~yNq=yd=V{vp~Z`V0Oa@Hf!yLK{f;@ZSMk`V1QINasCNz2^x87Z3UmX^f~)rr@&MWDm{~hnI%?KC3E6;7 z*;WAQ;&OvPf_d?GL{qD)Qfq;HIt$mC^}|Z6gaet821UF3^fPMfWj%hrr=!?Z-T4%R150EPvick_HT(t7wW%VaaV&6!8afp?ksM8 zTyuU`C|}x6)YiPB`&)_;^Xm;01Bfx$APh6 z40sca1h0cps@^xiXdojcEN&uDz(DmY!YTH8@QSQ%t7cM{ zK6UuydO?Zo;94*7=su|XpXQ7|;MDVf13N+LnotM*)hvFQk*pTF0lot%-~zY~u7RJx z7eL)=7Esw#iE1U4U0v!&@B`Qgu7XA2d$1i`0pEgezyh!hd=0(=m%+s_{@bGSc)kRh zlFpghuaGCrIG=(~Kr3(>oB}7o3GgvE4vqme=msze90ebN!(cx65WEdO0PlnMz#*^& z90dEpyI>#K4R!&#z1zE9;bIR^#RqzjW|_TQ>sUm*bOn-ssJ$kF`@Ka&hr1NvAo;|?Rf`X|0Ir^cbbGmn-9O+j@F&njApJJ37M6eGYT~$y8-;rZ zR}Xg~baZEbTRF-?MCm|Upp(cnK)fGU0U`;gBhSoS%O*VtoXbYw*V*jb#Fq`X8FpE% zn;lmLeGTNsuR>|T;JfcofX0ghg;40fm98Rq+(X zUlTV0q_!&sKbs7TpF>!MSDKymw5FH3wTzAhT1M-+MdQ5!Zh6Zok!}P~sgi*DNLSDv zsI+x~`oweCDPm>jS^TYm`hX6gp9Z>NGzP7J;;*YSdnH^4Xx*+1GyqCi8PP+N-u|r$ zs(|`L9H=E_sxqhq^nekEtLIxirKQfOGN=O91%b2@@GI_QMXV|h1PGK$T%dHywK5@2 zuOlnL>Oj0A5id>$GvaH4+F(AJsfDXf+=oo`1WHG>p)mE;{@ROCbv*^4s#2t?A`Po2 zaAnvK6yiE?o}b9I+EUMMPvTEUI8}c)py$~pR#$xDW!oICDX50ODrkm3UaQL%cv^yI zKt}?%!BwD6x(14@1857{gLXg>bqC!*K5V<-#^H9wO#&}~9-t>sfmDdVL#!UE73UZ* zTJ8T7xp^ITI4Fca0t~{hOuUNw3h={iA#*+8RH_%@^zivIu1@j?gJD4N4F#`(AwZm< zr)b5iI7e`;C;rj6$r1`6M1z3An+QsD6i~tn@CL|=Uy16`T2Heh;R0bg<5w6xmMb#> zUg5>*1=?Ep^%y?`T}?vZ*{TmHjV!ntC3Eo4)%e#;wuFnpxZ0}>xO?zx9uPL5uLo;ECo-@OS6fF; zr08#Rt&*vY)xKM~UIi3(oApcIjz0xl!oL%@w03KD;L#ROd$0!oYM{*kZT~0{MUsJB zYx6V?yleF;`1j%83o7E@gIgSTx4o8M_KHgdlPk!66R3kfxh7xLK{ZenM1ckrHfY11dv--M#Y0^*k3B!8br%;A`A( z!C4YhL|5?tWHa>-{@dUO@F!44e+25QnxL=YR~=mB`X}7qz%SqixDI{>vbhCrYGCOi zK;E?eUmfuQuL%ACftrx}7f|AVTlWs`U7$C#)OynN##RWBeIT=PE0DP`_&mvc>5MHC zt{@BnonrNbOUt$X#Gw=Z1au9`K$!IKveVen zD^?w`5t231B`nQ3lz*KssTGE~m}}mxTkP76$mLB7g==#( zCyb__!nkSAjE#PLVwK&6!Zqe|!)QGah1($Q(amoaFO#QG_+qPQx{~txj=`5t-mD** z&eyJdOl(YfdMUrMPhqHSbt(vD_Vxv0*1euKk3BfG3|a1^|h-&x&&@#Cdw|!>`&!9Z@w5y9NkTp zasKX6^}^{N1RmdI#^&AU4qtQvmy6*Ko?4oz;|ScvtR07WU$g%se{S>JIDfQnyD48H zJknR%lo?On^{z~2Vo1}vLd#>}Yu+PC z{9(ZVKEG+a|4CmxbBCDX_EQShY{N&VEx90Z>6VokQhhP(@#J$EAExO< z^1q01%KvNOZRf^MSl)-YW8J!U%9+!ciT;976);gfMP|?5t7VZapEy=dCD$=0iN@F1 z{5X+xTAG5BxLRPUPV$#Zzmib-2-U~*7JJY%{|cw6S*)w)%`Tiu-xIA$eW#aiQ@=;* zog-$O^^DovH2?f-$O{Kr&sZMn`xRUDlc;QF$`pUzsA^a!?_Js)Jg^|kB7dmwQ5g04 z$4&fX3fGlOmb1glXSns_V-0eq3H3FH(GXZ?`eWex-b~%>&uJD;_WMJLbC^~hTlw{G4*QBKzNEx)bT_09_()Ecp5R^EDZ!l$G= z^)DJ_<$M+?al) zBr1QK_bWa1!xOiELZR=f>kr~Lm;8|`k}4{H2FAAfN3&tQc7M5f>pBc8y9LR`?}SYC zSMbd#;$*= z9hli`>gES_Q%u=u^y%dosJiDJ>esO0fbqi~80`r=nAc>P^C_$sX zwFdKAEQefBoI@)xu;CD#z098 zY@PU6pJMxlJ}~HKgXYXMt!Ua)ug-a(j53MS$;3Qs@OhUPujS14S^5VCo6QIed>@&) zvir)~O)0x)LSo&!MIYGxVLrwnEBpD$ow?VdL^XJI$klv(bNHoq?M=k|Gnwl@1^@Ly6kbqvwkT>Q7df0&D@ z@@r$PVfM`$K(|;cKqxp0F%|pWqo11eP!Y=1$-pW+i zB+Lsik)iJ8{bsdQk-ABO@~EMuju2WR(mX$(Ar?>f*3JL%Wa1Pgw&g z1d8{NCbOgHp_z8m3AAEhPaz<+ey_u~k_E}@ z=D9WGc7bWS(%(IBwcVUt3HgEf5hv=467Kx^RKkf;`J=O~OylGBTQ#P9g^*jO;40>B zKQHiTVqFkbZs+N%ou7SRkPk((dbv7t+NXqP34NfHF}(>IRTl%@{|VVXsrhZ z&zQv+usGc%yP-CsC98+^xSsCOQxEK>m>bH&3JkR1IJr1$^q~@0n?5kuW0QC+dx==z z_^%f~P)?fo)x>?p8g$D2Px>qcbN>Fo;BV6(gV2b_%!Jj9@15aK1EU*RkyUtD^e|RN;>qv+5nl zs~Js;Dsm9~9D`yPRZ(#!>*qvR#!UU3m};8M#N=ylj>s8ejw$+arunDT)I74NjQ{ZV z_#C~O4?XpufNN1y^ry~jKD6M((~mgOlQf&Z<|5HX9mRkZ-|*epuN1#py4iNefF(Jv zVVM!@N#bWSSI#}NeZ9YXXogCrzy|-E{E?O1b@Y?J-|F+_botm4dur17#>B-ih zw=UCMcs|8{;k683SgV6V)L_D?JEMfESfz+Mkw z*xw^_T09@FbZ>D?m#%S6=A0#Rj488)dZ=n{9rj0>4qN<9+|J~596bm`Jx-|6+Ya7B=a+lZt`t(qNC#_q%iFUOq|E@oG8gj7H+a|j zZ+zPrdm#xX|2FQlQ3+ z!P^*Uerea_Qj4q2OVoCvEgwUtI%W!gO-X3ZbEY?@zME$BcFOUWxp&E*+fPr)UejFK zt1{FyH@EvML=~&)KKhh;YRAH6#RdmD1T7J3;@>8QIwsqDem#alC7S-C+L-Zg6KRs! zr>kVsceg)x0pu~nrAM4KpSE7}{`gIA+I*Fd4Vh&kQZQX)A`anfFtv5H!(6^dY2GK4 zmdr(x8gQKSx1L=% z#ZfBgDLh*(b0LLpQL>i1V9#6ZO5qDr<`l7E>4J4lws*)xD^m(5suy;u(h zcx5+1y9VRTh@HWykp*=T^X*P{N8E0ah78&?9`qkiqUMcVtku3V`}Yu?J81GRsqa3f zhE)Ca4fW1-f`HR;vDch4TX@W3Kx19!0g&~bx5{>2raT7@h}H!wAJ z({3?XXiSB*dS%>qv-1CLEhw(j-6HcR*eDjw&QPh~jtMuc0oCOu?^L_n0(osqXuxW` z2QH)jr3hrh8QF=pW%5S-d&jnQ66gaJgZqFTZvQ2Q|8r9AY-9V*|BBE~YJoW=(BqsQ zku%(xoSeqLKNxN7&Qy3ml$YFTHhxF@yR(#Am$}n0>A1al)_%H(w}QFU1ZlgRUpEdym?b@m%j$N4AO|3&tWjNV+i0QxG zb!>^8p&#ixW%@Ew3zCI@>FkVK+rv{;v7L3y>h~DnPN7pZ63-~k4DKz(eUf}V#Mr(2 z5m&0(_3hN1(#~XdlhRfOL(twjoEt=LO)oaA%SR1p;jS1iepfmv_h+}K)4;JY6?KCf zWX7rybP`e8O|-)Ze`l1Cr< zq3gAQ{MTtdXI`bp+jYq9!~T3x>D#zBy}3_ZZnAoK_nky)m!Pf{|B2150pYpLpws@m zrs_xhuQuJx=F_ZV27KhN7`5|RcgZvT>6O06m-}|J8LX8WRp#tsC;DPcmLp{8!OACx zX?4V3IBE-jF|S?1vMUqb{ccnz_Q{+bd`jEVOjU?}W-U(CFwT&4-`ali%ANN+d|wGW zJxXIY(OkqJZY~CzX=|(qIl1XdgQ>Ps$iZ3^-I)Jw(Ju1rg>jm{E5xu=3klh8${eK? zj+%}~N$IR9e~f+E$w%3jbr*TL!(v0Gn~jK3i`uzu-R;7`v0JvRsX!!lsr!@p`Y3ho zgpLd?+QB?|j5hlBL~EPmWA{@FcUIy1&Ek6DIn4*h*!4cufx8E}tv+tamlX=%-tXkr zS&H81 zEc|1Cg}8_86|?WJTG^e$ZOfCb*PLkd>%wo+r=r8({{&D)M&+y6y34!()X_g z2aWo7gVLt|2})JXjF(f-EI&ab#F}4D(4hBB@sl{OnCIkNGm}qZV*BsDlRUNM>OJcd z7QWA!KV)#xlsd)2K5rk>;gmmbrDc8G^4yMiWP7e!i*APc-m=U+My@(*%Iad@Pds_x zDA}z@)iAU1)Zy&FALr)4=p3H=?j!a0Z9F{*i^}vh!tFAbPmznK&EKaOlP~mh?M613 z)PBdVEP8mb-TA>Vt87OY*(|J)clq@FoJak8I&miU6KdieGvX7Hvk#!|W1czw2@f2W z@;p2Go-sXng!Eav1)s9rXZ?jf^H&Unu@9lH;_eW>@fc*dA={Hai?<2PRP;G0$ znz&iACB0t@9nZ4MV{6qL$9PEM=F$E;4HDYwpCj?p*G;{l7OknTCO0*%{~y%?<40QZUfdM3!I7tbz$2FM42b z9EJVa;d|CSUNiqQRTe%_u9*1q1igbnUJPoMS)H!OxdJyH7~~qta8ZHhbj{mvMvsFJ zlyYYLdCo^$40orCYe$Er$vW@1*-ni(2aBCd#0B!*AA?-PP-*PcAt!QVIcWzEgUqf6 z-Zal$pdO}}$#Q0!gK}1zKQ8!3MC~H5?#b)EJD9i0@9%SL$;fk_!tB!LL$jX8xxjME zdAKW8y-vUAR`lRzYQ6+jb8;r<( ze@*Sj+Q-=5b9NV=+Hvmz8znbdXQ5}Gr*oSfU$by~NM+{M!`{Cg zB=V_y#_1J{TQ-X|hn;*n%WC)O#Vq~CU)i_cd_go(M=;h_%-yz=pZW1rgEJW0JqX(l zsaL+KAF5~syMES_?)^o$TLGyP>IcEO%)W?Rg?j5Y~7iHTOZ&&z=J+!CZcbJnHusM4nv^}TB=Vz!+Gydu1l@%l)7+-WkN)WVQCO+v zqaV3k% zz{qvhUlmQZpRk{5O3A5bj{S7Att7nc}5XhmeFOz+8crFun(_b)9gJ#K19w+`+HCpRj zX5md%HJN6ay*F7kN6vEhfEH$6e&g7&N*}qsT5tT6Hn(n4b9GJM4B?Sc?XgoA+nD^$ zyK^7en(cwzKvVM;y`S7oy5&D)7VHYokU#jPq^#iq#uma?(bV2Wv=fL{?}cnnEOdAA z%EKFpmODdC`SQH;QgdZ^?lknVZ_UM@$;dC}_RqB4Kc>ttPPQ8U!c_}1L{~}X zI=8H0W+PP87~{sgwOx*!4c;uqaMi7r&dihG*9yA9l=txnQ0iA6tj3$h>RMl$uD|+Y zskFM&Ih}5p%de%o(-qZg)nERtUok1sk(>SIbmafmu`sM><`a{zlKJ9p zpvc1%9Mf&_4mog=6eVgSwbAxkeU96m*WQyGO z7YG=L~ly2@JqglR}0Wi`)_wU2KN^#VDz=*qx#>KbhF!#`Uki z3FYvxg0qCFZ#Mr${dX}(aH57`SBRR(JUmmx_G~XDI5pu+Wed!`zj#+_3kC%+NL`vu zru*Oi?Y`gXO;3VG zt;9g>Fuu)XjY?htz$lTrP%`^<*n zv8MH1nrPt6jp31I0^X>WE8XU9cfE8U{XJH% z*Hv`SdFoAbTes4Iefhsg`xlvVZb0;yLo>^87VZ?q*MH`a@K~oTv6NU*`rLXlxqadJ z-039Jcg`%_LXhvx=EC7Q(>g~`+_;DPxXFV6XIHQi#m&i?zoNKc=`8cukTe0 zs%6Od*XCqsc%tuwDHs+WS?QY%ZpwMmuQ!uN{QjuyFe9>`QL+)k#m2LWb_=^*@_`bz z(ew!m&l{R!qnY9l&sBgOu_7DYXo~;5`ke(|u5*q=+-SZryTYiP6XpiV^spCVY zeK<{W(hS1RcgU=lbIV*7=}tfH%oA%KPfP1N!&|4sCl_$j;x04ClwIojHki$63G|^k zBB!n?%_K85g$QJ)hp&ZdLipCnvHO$IR)>7e!Huk@fl4j(_#~&vUlv_Ek> zJ$>Uf(_GHOviz3GM(*g+|C;lt|B=5)pOd*rb1q|eKC?SRIJc8orrCn(D6jV$ZFg^B_Gb(fDK?Pw^O7U1@QUZI`)}DLil7qr2QkvomM@UuD+; zR@Kq8xmP`+D1ril2PtA#ly(uUQDd*zyTRU3u@?keG#13d*lR=-d&3e$lBgJCjWN-P zU8AvoYV7*Iv%8lIdhz@IJb9kOxo38Ec6N4Vc6Mg{{-^ev?cG#YfC$1D7fj65Ro6=w zN*%{%tgJO*@f(vby3*SLfQ9bOgAYUgO-ke45+;?A52SFWWh9N~hXhvy8jBpFUkYjg z$SjBh4ElFZjgs^JJ^>D1m4?64|3YTd<9 zD$A8zG9F;z^Pi>eymY~S+}d_WIS|Un{`m5NY8Te9-#S8F3TsQTv|knm@_|&Lh}O(B z;fRc~s?robt2^AC)sq-DXAjwET6Ulfj5z z902QuCktJ4_b#z{*PSUP$by3RvoWbQC)`5xSASM2DZT`RARtkfCOVq7a7yoxz9q)Yn<-Ys{NYXPmVFqf0vFcF~#|ebSR# zxoE)#!v&gIREvQfw{z9{B6}v%Rl5h|UER?3CB?aEeN8V<%2{t-;5NN1Keaddz??Iu zW}lK@>c#asI5x6MZY4eVl0d%2z{4C;oU!^kQaAt%J!w3{4LvRWj0?@{Z@3?OJqU=@ zUUV#NW4LK_ycjGG4tPEkgP6rpQC(|hbUjCXbgV*I2$0)^5?I=$gL2Ccm&o9b_TQ6^ zhkocB3P!;9J-6?6xcMRJLvAQ=!7ZCh)B*s(&j7%&xA?7#PL8^NcB%!y{x_+hC)++?*U|9lWnapumRNv3hvQ3VG6lif+H)(0 zmMnQoZ=Y|ab?m=NO%()1Ep&gX;elmjUb*tseeWeHUjt|Sd9KdSA1hdznE{1n;IMYq z=BBBCNlTp(voi2n@OTa@!A`TKUW_m71TD`MwZOgeUOp#Mf&H~q&=Y!bI{+L35H@A_ z(Z-3LIcI>4JcP8ky+&Emj=knl>#1m|?)M}AZzz4D0XjzFY z(`kK@l>-v!qZKzgU8hz)U~Vs(=A#9gs@;$iIM>HNHEo@nt0E1Qw7{1lU{6TOi@dGt zzVYHOtnmD7deB23Ovn@fuzcUHd&V|TY%(?=V)q52){=Kgtj=T9wj^v%4jY<4lzdVO z!~H@}OM<2UkXtdLt_xD6ZI0}c?Eamgmm!bp5uD?@uE#yCncP|hk(K=8f34~r-R0hN?x-A7E zYUQl;m2VB&2XH0xnUOH0`39P+oYE+KGQ5uNWi@}F6L;it>C{tA*qWVf-%mW}bkzBI`M#l>8!N^8o4tOj%t54}B_vc~#3?efFgEe5PaQ+U+uy7i^U z05FXK04s{w8%vhmlIF%ngYA;PpUq5sDU2`Aoczy+IUJTp^?tmwUPd)4pbK&Mhqw3Iz}VU}6GA5kg*Ot$x=ZqE1P^~j$S{>7#W8-QR& z?W4XNyL6{Yo4}o@`$4z`1$BYQCM;MHxH|)Y?Stpy9v-*KZk=ZV7)!MQ057^T!zBZ* z1mI3K@$w6~kT})?caaQnSkzb%r{;lmQDiqqt3Zz`YPLAiDijE}pf7a|1g2!_?hA8S z@IEc{)tVX>&~;z@x}4tPp<4<3s@Zx*l`8>GoQI1@a;FD!`fdh%Wmok=15V&zT?pkm zl_pk#;C{)#p8zhsCoDU=S?l9hKFH(s4W}?F_j)LOw#-A|)+5~h->}46iEqV$7_g4y`aa_T@-<5C}2>?E^#t3DeYye&G$G${D8^XvgKvMZt0K6z@ zoVfu~(*!`F1w6+cAL#7jve`uA*Lk&RDhXLO*pO!s~vEn$YO>lEYb^zYHN5^#Ai z>4gQ1OWpv*tFGA(HP7`=Bfliv> zd=+>}D}$kKonKOLu+}H*`@Uc>$MA}@Dq2(b0juT!kJWn?)*|xdc4-9 zUk}Y#wp$z~h`nNS%0N4mzPtl(G39?Qyc{DnmmWq^7yu9|8^~}w0p|_4 z2@6Ap@2dY$J8j*HWhF416s2FvEOYVkIMqjd;4F*Xy$b;2pX_`5TuFmMcjc?~q|5$pQA z`}sivSnwy2o^scx$*vYl8sN$TuKS)3RhHd6v&j|3$TbCkv5+lYMjv`8?tx*o z(kG~M-cZBW8!VW5QlYOf33C8Y0RZ)G3<;Q>Q6R~JX&=5+#Fxh@zup|&uZNrj!HHYc z6-{-=d(Fd?^qL7G$Fis!Px$EqNY@nE-h=e_Df-g5It}i;X zDMU2~p)=XH>Wp%Ktp%Aomi=c^rN~i;vo({+X_*OVKapbt^j4!Dddr@grf}4t6AkgL z4W-u80^MI0Hi)c~ZyNQqD>1X}B@9VzdF+djeSO5D9h?jzzHt4+$*pCB3N8kONNI#I z6c8@C{7_2|WJOUzVCJIgOAOu3n9rG3wuE{wsyq)Q76qWY;5?&z$*i z3zW0&#)SnFsb@oIU6Hfr!XcsQE)rM7;?sqqW;7)S!(BAa2V7a%RWw%+?$=&35ag^Q zw?@E_N%~_7YmA>?Q%obwuZvF08)3PX!YyWOa8DfzsCn$KIxNY4$ooTwesmgurZ51o z_GnP^_z~mrompI(4(@UxhC2P)GNj8yw&=?6Orhe9(Y5MPF-t57XF3z6yVP%=tPo`ljg|&yTDfj5g2h=y= zHa6BxXX0C*dV1()9gxks5!@5zMKV%(hGe++(zo_`*eG7LQ4f*j4 zyLCA)+HO>p#PqjKh#25zo^5D%eEa4MMkm9< zx;%4iW%)9nPBQL+0ATm;Wms3&sK0D)SO8X$p(|)OOFBQ|>EtLpo>L3FncS;MS=shs zgiAZe{skS|;EE6PnCz;PS2uRAs~c>}0iwn0&`0YomKbA!cuuwY0Mlt2+zmZicY&FGJ!lO8 zkiT${;kE)FPe-1*C;Vboos6~M+eeQXAQ*cljsuy(W2g1Fuw1EcMkF>qD6-+d&r^-= zV9|SE<9*GcxZlQhZ?l@KHq@Mys3F~u;%)aPA8c}bwB<`9nuVs;w?qQ>Xi8;(1Hj-6 z+%rc0P|Daa?_i^04SwO!_i36n79)B<1;4?X%U6>QkHwlRPqn`>`%lWbb2I!+*TaEp zb}p%zcE9$xG%tGPJ_kd=S`wGAN$do&ZiT*crUK!b2Vznc!Vy5qxt%~PGRj21&Y_6I z;fDB}y0LB)xmSVcOFb!-FZM;keQ~0$J#e7=d1qd=r88m02JoK7%FkAfUycSqm;>pG zebHjvqk+9JKgvFxqE-B6)$S-{pBh)u(WhRG_)+PAkb+PMWNazAyClo=M?!o%X2quB+rY$HBxWR*ziaGR$_dbN7aZh*pZlqw7n!uyHa z#p~&FLV#VuS^Pb7hgNAagCkNAr~uR>JGJ6R*=3e#|AK804ZttX{>eJ4jKdo0+&EF` zNN0w^;C!l9gm?gvf3R@k1XBOt7%Dyt`hS=Tyd17nf7ZZ^x6RDJAvPW=est`9aa_~hSND+KzKeUnKg0Ca4y(`W~6mW0wpD4vr#ZE3<3GC5{ z+6_l|xJ)NHG#o}mxuv3ti!Tqfi-d(yg_~3}648`i6d4IKlSUgN5i!W2Km)-jIg#$} zT_vp@`?PM?slmwe7zHPCz;7$vmA)QG;VA8fe#qRkmGm=!VIc_hrR)D z%vqY#>RsrhEol}(Fj04g!wn1*5a9ReLtDpdOVu%ft2&0r{*~{%IWYl9ebVKj&W?pM z&-i(a7a5vjVPJpDrx(b-a+?U@xkGE_i>S1T)m+R(h}8#5i^f{;enDp@BH)Gt(rz(O z7pJg@I0~ArVp8}jGpTqKT-?RDJ(~flEuYcsvdb?x9~8$(p~zK~sAxbGqB$ZCsp8=3 z*g!;G<)%^YA4Qa0og&Dns{DG6yeDbP3|lB=62`c9pj0gN&U9-1vRcP=Vg|(Vs#^VG z2U>(YqBTuV2XKC-Zoup5OD;!~;xg8++}fJX0f5)z+^&QB=dOMeN!Z;2LUE)TXp@02 ze0V%~&P4m0UI)I$7nMXJN3P!kKv4h;I=?IWn(cyk%g7ZkZ3fZhXv9Nx}wyEM|DA&$t$nra^#-0NAhRzoZkw=n3L1kWrLklNs z&0*EWvCwBzDPk(;$bSkJ^#95yeIzdBE`qMz?`q`|+MI#jH*-ObQH|}BBPrQ;PO>AH z?PtfQ3NP#k`r`(8aOb3e5PZN(GfEEd%-?*NMYwD zjf7N+1D7BgHXZ!V8Wm>W*>apFMOBT;2s>^6EzHJ9>ijL5DVbKu5;;q&$~og*FlBH< zH6Vu>uxZDs-V7}9Q&c$~Uz944N8emYEqL)QX$i{!1sI zP26K6W%PW-nDKo&Oq|f%vUucKs43^O(2Hp52x2`~7_S8t-u<^+T?nk&h-1+}!+DDN z4(Gh3M$wt?z>d*Wd=^NOl<6L$Wyd2{uUflu^@`h;j(ut1EDUustpd0yX9CZSk*oX4 z-lRf3TdiL$=1b_cEA)^t)F$uQIPEAsRvOkWL+d|iytNh|q_Mq*eRmm0LuYgLFS0Lq zbw7C3Bcpo}+aN%we5h69~ z?>x?byh^ELIWWIWbLL>7=X|0LEd&6gR}@{I15KXup}abJuS4bLV&Ku#buMV@NeAa+ z5zLzl8CON`FXn1thPBin7G}vYnkK|Tx9QPR!TzUtN!m^BE*PV_4x>~wZ3jfK2@nq8 z&xj)TM+V&QV6XTC4%WjLmVvZefq9nhxzoqOA7KB0w%m(&nsZJBrGZEroiq<5N{>ks zHPMnA=H!$wBtyt77MZXRh*RDcahAbOj>BS6$hXniILIIJFudkN{#4JxaGIH;@?GfB zd?*S5keLD_${{Nl^G&0b3pCe!Wu_U#tr0}23(%cfh}o8zz8WyhjX{R9O*XE($43RQ zL^zbS*+I2=IewwBd*11?add~2=*pXpU9mKFolaL4V){n_f~TQW_{b71hYeq$rU9M} z&i@v{C$MM`MVDOnxnarM)0RabK&&lh`*nWnL2vQUKhOL!pE_9^rFjt9hK_q2d4NWn zCv+zsNr3XE56mlML}XiuA_-9g7ASMx)x(L7ljdo%lKLKiWOgVrtKJJPatuP=DX#u2 zT0Gc>=1RW2_L{cuhRr;V#j^tsMY@5)7Gs<{Y2ack3)JfHo2=E5E}>GSGLNwsE{FVQ zo?P(9p1uF$ZhSJ1Mz7)*J6f|qD?)xtwEQw1&`pm->Kf~evYR%%c(HTGASZ*|zu<~| zidcf)1bG~`GTAhulqFh)JYC~pU>K8gzCQdXTBnlTQp`Zd`Emr)hHWXl!toKu(f#E; zH~Z*p5^knwyHu-!t2*Z_1>$3rhKG9!vLyN3vqSU$yzbSlzDpoGD_Uv_pbLcaEK8u=&o7YtaZ8WO zmoaTSrwZ`VF(%5KJ*ld(^qYX>;NYw2UPJy`dPp8J3-$bpe3xS$_R%&x^nwcw;-=() zy(Ocb{#dveFsd_8RpwR(033lmx#jTMGtc@D0RY#*!2y&Qve$iaP8DZylFJGdp{N(% z&*dv|k!1NRMdrl%Z+bc|8jKX$eKdN7wocXOx!;VJ;Nq%k zd(4$SS!-!T@KIE~xS>281w!Up3giE`LL*y(akhGmPwFzP%%Hg{M3#-1lb==bgsQm7 zUNs@dK>t~tS;pgPF1E;4p<^!F$yz_6MjD8#Ges?r%5Kh{`K)rCRRXkPnH=L6vZqx! zinZRpki;#syw$KXZ=sd9`Wh|y&O!7M^JB7JAI;uE&ecfcsoD3KT3I;_p2YB*%(uq0 z@A)3S<>xu(=8TJVlxsZzwl6k_V$Yfr3%cAKp4>tvp<{1nvyQ^n!-}awYJL6^DYu2+ zI7XHn-CHadUN3=2j()fv>*)>v3S+t0FHZll!hmaa`#E*TmBt^M#f-f(1Ova*d1 z6ubpn5#^CQ;h!jbXd2F{ga%$lb{jyHX_(B6i>usePU$^0LO~QFh4?>M)P3{y+bfa) zw+~&giA(D=qUpAZcWYR>NT)eKgmUoMt?+3MZ-ALs#o+%#0eIa+gkoAzQX;z8wOrEb zWN#YPW&eSKOp4qcy`!rDkoO>PGS`7!AC zZ)>eAe(g^{sK8Ol71U!RT#oLvZ6h!apyL~%xGT{6jj+e$~>)Sx7LevibavYndU*kuHJv=cvQ4tjw0F?`S)XcD*JU0XU zM+)5xPcrv98nPJ@<*<%sY(|k#v32yrW(+?rIo}rSICO_~(!=~GA!zzh+t|B6$3_FJ ztVFdjompnJnEcy3B#2%H14z1XlI931jrs0;GW7ETjit2Rcx)x_UBGaT+U|npf(=GJG+(dC7ch7Wid!d1-uzV5slY_f0w)A-M5e61 zkt*$l`Od!^9=X6LTt|hnHAU_Q=fv--gUp*9cyv@}51NUd+-Ma3HY$9ocLI>7`X2mb zvlPqNjD6KEzANWrAtDFzz)3T@H`HJ+hNyZpAhUHi&Kd@*q{>oaPSj1^|q{yE>D(T`3hYs(mL zz&<2Ts|Nr5-i_xoL5!*u7MHXOUVjz4Ig-X6F|ky)Mo-OhJE zwG2zBgm(@v-W)NxzeBG^e}&KzfFW419}maTGvwF27n}W3B4$+6yL1mf`&UnrWpr!* z*yFI{H}|O4cxU?;_t*ZV?#pL7b;CQ)^ur|E!ovpNemjgpQ-E|4b;P6CqGPfqE@Az+ z=s%7=esuV-r1Z+r4e=e=d+b-^dJm82)q7Os(Y-A{e)~FAOMac2 z_vbD7y@uI}L9QM~2Zq^}HlkGc?qJ*K{CCywcSj@-A7WcGSAN%#5-@Qj1J1QI|MOAQ gaJa2k{wL~d^e7rW+;&qz){N$VJZcSjN7`=qKWO)ypa1{> diff --git a/plugins/multichain/CHANGELOG.md b/plugins/multichain/CHANGELOG.md index 4976d7c6..33b2de17 100644 --- a/plugins/multichain/CHANGELOG.md +++ b/plugins/multichain/CHANGELOG.md @@ -1,5 +1,11 @@ # @zerodev/multi-chain-sdk +## 5.3.3 + +### Patch Changes + +- Separated webauthn validator and webauthn key module + ## 5.3.2 ### Patch Changes diff --git a/plugins/multichain/package.json b/plugins/multichain/package.json index 2f6e9d1f..84a9e963 100644 --- a/plugins/multichain/package.json +++ b/plugins/multichain/package.json @@ -1,6 +1,6 @@ { "name": "@zerodev/multi-chain-validator", - "version": "5.3.2", + "version": "5.3.3", "author": "ZeroDev", "main": "./_cjs/index.js", "module": "./_esm/index.js", @@ -37,6 +37,7 @@ "peerDependencies": { "viem": "^2.16.3", "@zerodev/sdk": "^5.2.15", + "@zerodev/webauthn-key": "^5.3.0", "permissionless": "^0.1.18" }, "dependencies": { diff --git a/plugins/multichain/webauthn/index.ts b/plugins/multichain/webauthn/index.ts index 0c66e643..3f2091d5 100644 --- a/plugins/multichain/webauthn/index.ts +++ b/plugins/multichain/webauthn/index.ts @@ -1,4 +1,4 @@ export * from "./webauthnSignUserOps.js" export * from "./webauthnSignUserOpsWithEnable.js" export * from "./toMultiChainWebAuthnValidator.js" -export * from "./toWebAuthnAccount.js" +export { WebAuthnMode, toWebAuthnKey } from "@zerodev/webauthn-key" diff --git a/plugins/multichain/webauthn/toMultiChainWebAuthnValidator.ts b/plugins/multichain/webauthn/toMultiChainWebAuthnValidator.ts index 9e2960b6..fe297238 100644 --- a/plugins/multichain/webauthn/toMultiChainWebAuthnValidator.ts +++ b/plugins/multichain/webauthn/toMultiChainWebAuthnValidator.ts @@ -25,7 +25,7 @@ import { import { toAccount } from "viem/accounts" import { getChainId, signMessage } from "viem/actions" import { MULTI_CHAIN_WEBAUTHN_VALIDATOR_ADDRESS } from "../constants.js" -import type { WebAuthnKey } from "./toWebAuthnAccount.js" +import type { WebAuthnKey } from "@zerodev/webauthn-key" import { b64ToBytes, base64FromUint8Array, @@ -34,7 +34,7 @@ import { isRIP7212SupportedNetwork, parseAndNormalizeSig, uint8ArrayToHexString -} from "./webAuthnUtils.js" +} from "@zerodev/webauthn-key" const signMessageUsingWebAuthn = async ( message: SignableMessage, diff --git a/plugins/multichain/webauthn/toWebAuthnAccount.ts b/plugins/multichain/webauthn/toWebAuthnAccount.ts deleted file mode 100644 index 08f2577e..00000000 --- a/plugins/multichain/webauthn/toWebAuthnAccount.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { type Hex, keccak256 } from "viem" -import { b64ToBytes, uint8ArrayToHexString } from "./webAuthnUtils.js" - -export enum WebAuthnMode { - Register = "register", - Login = "login" -} - -export type WebAuthnKey = { - pubX: bigint - pubY: bigint - authenticatorId: string - authenticatorIdHash: Hex -} - -export type WebAuthnAccountParams = { - passkeyName: string - passkeyServerUrl: string - webAuthnKey?: WebAuthnKey - mode?: WebAuthnMode - credentials?: RequestCredentials -} - -export const toWebAuthnKey = async ({ - passkeyName, - passkeyServerUrl, - webAuthnKey, - mode = WebAuthnMode.Register, - credentials = "include" -}: WebAuthnAccountParams): Promise => { - if (webAuthnKey) { - return webAuthnKey - } - let pubKey: string | undefined - let authenticatorId: string | undefined - if (mode === WebAuthnMode.Login) { - // Get login options - const loginOptionsResponse = await fetch( - `${passkeyServerUrl}/login/options`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - credentials - } - ) - const loginOptions = await loginOptionsResponse.json() - - // Start authentication (login) - const { startAuthentication } = await import("@simplewebauthn/browser") - const loginCred = await startAuthentication(loginOptions) - - authenticatorId = loginCred.id - - // Verify authentication - const loginVerifyResponse = await fetch( - `${passkeyServerUrl}/login/verify`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ cred: loginCred }), - credentials - } - ) - - const loginVerifyResult = await loginVerifyResponse.json() - - if (!loginVerifyResult.verification.verified) { - throw new Error("Login not verified") - } - // Import the key - pubKey = loginVerifyResult.pubkey // Uint8Array pubkey - } else { - // Get registration options - const registerOptionsResponse = await fetch( - `${passkeyServerUrl}/register/options`, - { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ username: passkeyName }), - credentials - } - ) - const registerOptions = await registerOptionsResponse.json() - - // Start registration - const { startRegistration } = await import("@simplewebauthn/browser") - const registerCred = await startRegistration(registerOptions.options) - - authenticatorId = registerCred.id - - // Verify registration - const registerVerifyResponse = await fetch( - `${passkeyServerUrl}/register/verify`, - { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - userId: registerOptions.userId, - username: passkeyName, - cred: registerCred - }), - credentials - } - ) - - const registerVerifyResult = await registerVerifyResponse.json() - if (!registerVerifyResult.verified) { - throw new Error("Registration not verified") - } - - // Import the key - pubKey = registerCred.response.publicKey - } - - if (!pubKey) { - throw new Error("No public key returned from registration credential") - } - if (!authenticatorId) { - throw new Error( - "No authenticator id returned from registration credential" - ) - } - - const authenticatorIdHash = keccak256( - uint8ArrayToHexString(b64ToBytes(authenticatorId)) - ) - const spkiDer = Buffer.from(pubKey, "base64") - const key = await crypto.subtle.importKey( - "spki", - spkiDer, - { - name: "ECDSA", - namedCurve: "P-256" - }, - true, - ["verify"] - ) - - // Export the key to the raw format - const rawKey = await crypto.subtle.exportKey("raw", key) - const rawKeyBuffer = Buffer.from(rawKey) - - // The first byte is 0x04 (uncompressed), followed by x and y coordinates (32 bytes each for P-256) - const pubKeyX = rawKeyBuffer.subarray(1, 33).toString("hex") - const pubKeyY = rawKeyBuffer.subarray(33).toString("hex") - - return { - pubX: BigInt(`0x${pubKeyX}`), - pubY: BigInt(`0x${pubKeyY}`), - authenticatorId, - authenticatorIdHash - } -} diff --git a/plugins/multichain/webauthn/webAuthnUtils.ts b/plugins/multichain/webauthn/webAuthnUtils.ts deleted file mode 100644 index 0b4b4160..00000000 --- a/plugins/multichain/webauthn/webAuthnUtils.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { p256 } from "@noble/curves/p256" -import { type Hex, bytesToBigInt, hexToBytes } from "viem" - -const RIP7212_SUPPORTED_NETWORKS = [80001] - -export const uint8ArrayToHexString = (array: Uint8Array): `0x${string}` => { - return `0x${Array.from(array, (byte) => - byte.toString(16).padStart(2, "0") - ).join("")}` as `0x${string}` -} - -export const b64ToBytes = (base64: string): Uint8Array => { - const paddedBase64 = base64 - .replace(/-/g, "+") - .replace(/_/g, "/") - .padEnd(base64.length + ((4 - (base64.length % 4)) % 4), "=") - const binString = atob(paddedBase64) - return Uint8Array.from(binString, (m) => m.codePointAt(0) ?? 0) -} - -export const findQuoteIndices = ( - input: string -): { beforeType: bigint; beforeChallenge: bigint } => { - const beforeTypeIndex = BigInt(input.lastIndexOf('"type":"webauthn.get"')) - const beforeChallengeIndex = BigInt(input.indexOf('"challenge')) - return { - beforeType: beforeTypeIndex, - beforeChallenge: beforeChallengeIndex - } -} - -// Parse DER-encoded P256-SHA256 signature to contract-friendly signature -// and normalize it so the signature is not malleable. -export function parseAndNormalizeSig(derSig: Hex): { r: bigint; s: bigint } { - const parsedSignature = p256.Signature.fromDER(derSig.slice(2)) - const bSig = hexToBytes(`0x${parsedSignature.toCompactHex()}`) - // assert(bSig.length === 64, "signature is not 64 bytes"); - const bR = bSig.slice(0, 32) - const bS = bSig.slice(32) - - // Avoid malleability. Ensure low S (<= N/2 where N is the curve order) - const r = bytesToBigInt(bR) - let s = bytesToBigInt(bS) - const n = BigInt( - "0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" - ) - if (s > n / 2n) { - s = n - s - } - return { r, s } -} - -export const isRIP7212SupportedNetwork = (chainId: number): boolean => - RIP7212_SUPPORTED_NETWORKS.includes(chainId) - -export const hexStringToUint8Array = (hexString: string): Uint8Array => { - const formattedHexString = hexString.startsWith("0x") - ? hexString.slice(2) - : hexString - const byteArray = new Uint8Array(formattedHexString.length / 2) - for (let i = 0; i < formattedHexString.length; i += 2) { - byteArray[i / 2] = Number.parseInt( - formattedHexString.substring(i, i + 2), - 16 - ) - } - return byteArray -} - -/** - * Convenience function for creating a base64 encoded string from an ArrayBuffer instance - * Copied from @hexagon/base64 package (base64.fromArrayBuffer) - * @public - * - * @param {Uint8Array} uint8Arr - Uint8Array to be encoded - * @param {boolean} [urlMode] - If set to true, URL mode string will be returned - * @returns {string} - Base64 representation of data - */ -export const base64FromUint8Array = ( - uint8Arr: Uint8Array, - urlMode: boolean -): string => { - const // Regular base64 characters - chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" - const // Base64url characters - charsUrl = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" - - let result = "" - - const len = uint8Arr.length - const target = urlMode ? charsUrl : chars - - for (let i = 0; i < len; i += 3) { - result += target[uint8Arr[i] >> 2] - result += target[((uint8Arr[i] & 3) << 4) | (uint8Arr[i + 1] >> 4)] - result += target[((uint8Arr[i + 1] & 15) << 2) | (uint8Arr[i + 2] >> 6)] - result += target[uint8Arr[i + 2] & 63] - } - - const remainder = len % 3 - if (remainder === 2) { - result = result.substring(0, result.length - 1) + (urlMode ? "" : "=") - } else if (remainder === 1) { - result = result.substring(0, result.length - 2) + (urlMode ? "" : "==") - } - - return result -} From 5bf25219e75351d590a7591ac2686d2feccb5b98 Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 14:11:20 +0900 Subject: [PATCH 09/12] chore: format --- .../webauthn/toMultiChainWebAuthnValidator.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/multichain/webauthn/toMultiChainWebAuthnValidator.ts b/plugins/multichain/webauthn/toMultiChainWebAuthnValidator.ts index fe297238..d9a23793 100644 --- a/plugins/multichain/webauthn/toMultiChainWebAuthnValidator.ts +++ b/plugins/multichain/webauthn/toMultiChainWebAuthnValidator.ts @@ -1,5 +1,15 @@ import type { PublicKeyCredentialRequestOptionsJSON } from "@simplewebauthn/typescript-types" import type { GetKernelVersion, KernelValidator } from "@zerodev/sdk/types" +import type { WebAuthnKey } from "@zerodev/webauthn-key" +import { + b64ToBytes, + base64FromUint8Array, + findQuoteIndices, + hexStringToUint8Array, + isRIP7212SupportedNetwork, + parseAndNormalizeSig, + uint8ArrayToHexString +} from "@zerodev/webauthn-key" import type { TypedData } from "abitype" import { type UserOperation, getUserOperationHash } from "permissionless" import { SignTransactionNotSupportedBySmartAccount } from "permissionless/accounts" @@ -25,16 +35,6 @@ import { import { toAccount } from "viem/accounts" import { getChainId, signMessage } from "viem/actions" import { MULTI_CHAIN_WEBAUTHN_VALIDATOR_ADDRESS } from "../constants.js" -import type { WebAuthnKey } from "@zerodev/webauthn-key" -import { - b64ToBytes, - base64FromUint8Array, - findQuoteIndices, - hexStringToUint8Array, - isRIP7212SupportedNetwork, - parseAndNormalizeSig, - uint8ArrayToHexString -} from "@zerodev/webauthn-key" const signMessageUsingWebAuthn = async ( message: SignableMessage, From e9f2f72bba3c4c589a189e023e78fd891d5587c3 Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 14:19:56 +0900 Subject: [PATCH 10/12] feat: separated webauthn key module from multi-chain-weighted-validator --- .../CHANGELOG.md | 6 + .../multi-chain-weighted-validator/index.ts | 7 +- .../package.json | 3 +- .../signers/toWebAuthnPubKey.ts | 153 ----------- .../signers/toWebAuthnSigner.ts | 247 ++++++++---------- .../signers/webAuthnUtils.ts | 70 ----- .../toMultiChainWeightedValidatorPlugin.ts | 4 +- 7 files changed, 124 insertions(+), 366 deletions(-) delete mode 100644 plugins/multi-chain-weighted-validator/signers/toWebAuthnPubKey.ts delete mode 100644 plugins/multi-chain-weighted-validator/signers/webAuthnUtils.ts diff --git a/plugins/multi-chain-weighted-validator/CHANGELOG.md b/plugins/multi-chain-weighted-validator/CHANGELOG.md index 86b0c8c2..4f470475 100644 --- a/plugins/multi-chain-weighted-validator/CHANGELOG.md +++ b/plugins/multi-chain-weighted-validator/CHANGELOG.md @@ -1,5 +1,11 @@ # @zerodev/multi-chain-weighted-validator +## 5.3.0-alpha-2 + +### Patch Changes + +- Separated webauthn signer and webauthn key module + ## 5.3.0-alpha-1 ### Patch Changes diff --git a/plugins/multi-chain-weighted-validator/index.ts b/plugins/multi-chain-weighted-validator/index.ts index 3e682493..6830b449 100644 --- a/plugins/multi-chain-weighted-validator/index.ts +++ b/plugins/multi-chain-weighted-validator/index.ts @@ -20,9 +20,12 @@ import { type ECDSASignerParams, toECDSASigner } from "./signers/toECDSASigner.js" -import { WebAuthnMode, toWebAuthnPubKey } from "./signers/toWebAuthnPubKey.js" import { type WebAuthnKey, + WebAuthnMode, + toWebAuthnKey +} from "@zerodev/webauthn-key" +import { type WebAuthnModularSignerParams, toWebAuthnSigner } from "./signers/toWebAuthnSigner.js" @@ -41,7 +44,7 @@ export { type KernelValidator, toECDSASigner, type ECDSASignerParams, - toWebAuthnPubKey, + toWebAuthnKey, type WebAuthnKey, WebAuthnMode, type WebAuthnModularSignerParams, diff --git a/plugins/multi-chain-weighted-validator/package.json b/plugins/multi-chain-weighted-validator/package.json index ca660fff..14280f7d 100644 --- a/plugins/multi-chain-weighted-validator/package.json +++ b/plugins/multi-chain-weighted-validator/package.json @@ -1,6 +1,6 @@ { "name": "@zerodev/multi-chain-weighted-validator", - "version": "5.3.0-alpha-1", + "version": "5.3.0-alpha-2", "author": "ZeroDev", "main": "./_cjs/index.js", "module": "./_esm/index.js", @@ -42,6 +42,7 @@ "peerDependencies": { "viem": "^2.16.3", "@zerodev/sdk": "^5.2.1", + "@zerodev/webauthn-key": "^5.3.0", "permissionless": "^0.1.18" } } diff --git a/plugins/multi-chain-weighted-validator/signers/toWebAuthnPubKey.ts b/plugins/multi-chain-weighted-validator/signers/toWebAuthnPubKey.ts deleted file mode 100644 index a47aaa21..00000000 --- a/plugins/multi-chain-weighted-validator/signers/toWebAuthnPubKey.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { Buffer } from "buffer" -import { type Hex, keccak256 } from "viem" -import type { WebAuthnKey } from "./toWebAuthnSigner.js" -import { b64ToBytes, uint8ArrayToHexString } from "./webAuthnUtils.js" - -export enum WebAuthnMode { - Register = "register", - Login = "login" -} - -export const toWebAuthnPubKey = async ({ - passkeyName, - passkeyServerUrl, - mode = WebAuthnMode.Login -}: { - passkeyName: string - passkeyServerUrl: string - mode: WebAuthnMode -}): Promise => { - let pubKey: string | undefined - let authenticatorIdHash: Hex - if (mode === WebAuthnMode.Login) { - // Get login options - const loginOptionsResponse = await fetch( - `${passkeyServerUrl}/login/options`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - credentials: "include" - } - ) - const loginOptions = await loginOptionsResponse.json() - - // Start authentication (login) - const { startAuthentication } = await import("@simplewebauthn/browser") - const loginCred = await startAuthentication(loginOptions) - - // get authenticatorIdHash - authenticatorIdHash = keccak256( - uint8ArrayToHexString(b64ToBytes(loginCred.id)) - ) - - // Verify authentication - const loginVerifyResponse = await fetch( - `${passkeyServerUrl}/login/verify`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ cred: loginCred }), - credentials: "include" - } - ) - - const loginVerifyResult = await loginVerifyResponse.json() - - if (window.sessionStorage === undefined) { - throw new Error("sessionStorage is not available") - } - sessionStorage.setItem("userId", loginVerifyResult.userId) - - if (!loginVerifyResult.verification.verified) { - throw new Error("Login not verified") - } - // Import the key - pubKey = loginVerifyResult.pubkey // Uint8Array pubkey - } else { - if (!passkeyName) { - throw new Error("No passkey name provided") - } - // Get registration options - const registerOptionsResponse = await fetch( - `${passkeyServerUrl}/register/options`, - { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ username: passkeyName }), - credentials: "include" - } - ) - const registerOptions = await registerOptionsResponse.json() - - // save userId to sessionStorage - if (window.sessionStorage === undefined) { - throw new Error("sessionStorage is not available") - } - sessionStorage.setItem("userId", registerOptions.userId) - - // Start registration - const { startRegistration } = await import("@simplewebauthn/browser") - const registerCred = await startRegistration(registerOptions.options) - - // get authenticatorIdHash - authenticatorIdHash = keccak256( - uint8ArrayToHexString(b64ToBytes(registerCred.id)) - ) - - // Verify registration - const registerVerifyResponse = await fetch( - `${passkeyServerUrl}/register/verify`, - { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - userId: registerOptions.userId, - username: passkeyName, - cred: registerCred - }), - credentials: "include" - } - ) - - const registerVerifyResult = await registerVerifyResponse.json() - if (!registerVerifyResult.verified) { - throw new Error("Registration not verified") - } - - // Import the key - pubKey = registerCred.response.publicKey - } - if (!pubKey) { - throw new Error("No public key returned from registration credential") - } - - const spkiDer = Buffer.from(pubKey, "base64") - const key = await crypto.subtle.importKey( - "spki", - spkiDer, - { - name: "ECDSA", - namedCurve: "P-256" - }, - true, - ["verify"] - ) - - // Export the key to the raw format - const rawKey = await crypto.subtle.exportKey("raw", key) - const rawKeyBuffer = Buffer.from(rawKey) - - // The first byte is 0x04 (uncompressed), followed by x and y coordinates (32 bytes each for P-256) - const pubKeyX = rawKeyBuffer.subarray(1, 33).toString("hex") - const pubKeyY = rawKeyBuffer.subarray(33).toString("hex") - - return { - pubX: BigInt(`0x${pubKeyX}`), - pubY: BigInt(`0x${pubKeyY}`), - authenticatorIdHash - } -} diff --git a/plugins/multi-chain-weighted-validator/signers/toWebAuthnSigner.ts b/plugins/multi-chain-weighted-validator/signers/toWebAuthnSigner.ts index 70faba07..dfaa4634 100644 --- a/plugins/multi-chain-weighted-validator/signers/toWebAuthnSigner.ts +++ b/plugins/multi-chain-weighted-validator/signers/toWebAuthnSigner.ts @@ -4,41 +4,123 @@ import { SignTransactionNotSupportedBySmartAccount } from "permissionless/accoun import { type Chain, type Client, - type Hex, type LocalAccount, type SignTypedDataParameters, type Transport, type TypedDataDefinition, getTypesForEIP712Domain, hashTypedData, - validateTypedData + validateTypedData, + concatHex, + toHex, + pad } from "viem" import { type SignableMessage, encodeAbiParameters } from "viem" import { toAccount } from "viem/accounts" -import { getChainId } from "viem/actions" +import { getChainId, signMessage } from "viem/actions" import { SIGNER_TYPE } from "../constants.js" import type { WeightedSigner } from "../toMultiChainWeightedValidatorPlugin.js" -import { WebAuthnMode, toWebAuthnPubKey } from "./toWebAuthnPubKey.js" import { b64ToBytes, - encodeWebAuthnPubKey, findQuoteIndices, isRIP7212SupportedNetwork, parseAndNormalizeSig, - uint8ArrayToHexString -} from "./webAuthnUtils.js" + uint8ArrayToHexString, + type WebAuthnKey, + base64FromUint8Array, + hexStringToUint8Array +} from "@zerodev/webauthn-key" -export type WebAuthnKey = { - pubX: bigint - pubY: bigint - authenticatorIdHash: Hex +export type WebAuthnModularSignerParams = { + webAuthnKey: WebAuthnKey } -export type WebAuthnModularSignerParams = { - passkeyName: string - passkeyServerUrl: string - pubKey?: WebAuthnKey - mode?: WebAuthnMode +export const encodeWebAuthnPubKey = (pubKey: WebAuthnKey) => { + return concatHex([ + toHex(pubKey.pubX, { size: 32 }), + toHex(pubKey.pubY, { size: 32 }), + pad(pubKey.authenticatorIdHash, { size: 32 }) + ]) +} + +const signMessageUsingWebAuthn = async ( + message: SignableMessage, + chainId: number, + allowCredentials?: PublicKeyCredentialRequestOptionsJSON["allowCredentials"] +) => { + let messageContent: string + if (typeof message === "string") { + // message is a string + messageContent = message + } else if ("raw" in message && typeof message.raw === "string") { + // message.raw is a Hex string + messageContent = message.raw + } else if ("raw" in message && message.raw instanceof Uint8Array) { + // message.raw is a ByteArray + messageContent = message.raw.toString() + } else { + throw new Error("Unsupported message format") + } + + // remove 0x prefix if present + const formattedMessage = messageContent.startsWith("0x") + ? messageContent.slice(2) + : messageContent + + const challenge = base64FromUint8Array( + hexStringToUint8Array(formattedMessage), + true + ) + + // prepare assertion options + const assertionOptions: PublicKeyCredentialRequestOptionsJSON = { + challenge, + allowCredentials, + userVerification: "required" + } + + // start authentication (signing) + + const { startAuthentication } = await import("@simplewebauthn/browser") + const cred = await startAuthentication(assertionOptions) + + // get authenticator data + const { authenticatorData } = cred.response + const authenticatorDataHex = uint8ArrayToHexString( + b64ToBytes(authenticatorData) + ) + + // get client data JSON + const clientDataJSON = atob(cred.response.clientDataJSON) + + // get challenge and response type location + const { beforeType } = findQuoteIndices(clientDataJSON) + + // get signature r,s + const { signature } = cred.response + const signatureHex = uint8ArrayToHexString(b64ToBytes(signature)) + const { r, s } = parseAndNormalizeSig(signatureHex) + + // encode signature + const encodedSignature = encodeAbiParameters( + [ + { name: "authenticatorData", type: "bytes" }, + { name: "clientDataJSON", type: "string" }, + { name: "responseTypeLocation", type: "uint256" }, + { name: "r", type: "uint256" }, + { name: "s", type: "uint256" }, + { name: "usePrecompiled", type: "bool" } + ], + [ + authenticatorDataHex, + clientDataJSON, + beforeType, + BigInt(r), + BigInt(s), + isRIP7212SupportedNetwork(chainId) + ] + ) + return encodedSignature } export const toWebAuthnSigner = async < @@ -46,132 +128,17 @@ export const toWebAuthnSigner = async < TChain extends Chain | undefined = Chain | undefined >( client: Client, - { - pubKey, - passkeyServerUrl, - passkeyName, - mode = WebAuthnMode.Register - }: WebAuthnModularSignerParams + { webAuthnKey }: WebAuthnModularSignerParams ): Promise => { - pubKey = - pubKey ?? - (await toWebAuthnPubKey({ - passkeyName, - passkeyServerUrl, - mode - })) - if (!pubKey) { - throw new Error("WebAuthn public key not found") - } - const chainId = await getChainId(client) - const signMessageUsingWebAuthn = async (message: SignableMessage) => { - let messageContent: string - if (typeof message === "string") { - // message is a string - messageContent = message - } else if ("raw" in message && typeof message.raw === "string") { - // message.raw is a Hex string - messageContent = message.raw - } else if ("raw" in message && message.raw instanceof Uint8Array) { - // message.raw is a ByteArray - messageContent = message.raw.toString() - } else { - throw new Error("Unsupported message format") - } - - // remove 0x prefix if present - const formattedMessage = messageContent.startsWith("0x") - ? messageContent.slice(2) - : messageContent - - if (window.sessionStorage === undefined) { - throw new Error("sessionStorage is not available") - } - const userId = sessionStorage.getItem("userId") - - // initiate signing - const signInitiateResponse = await fetch( - `${passkeyServerUrl}/sign-initiate`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ data: formattedMessage, userId }), - credentials: "include" - } - ) - const signInitiateResult = await signInitiateResponse.json() - - // prepare assertion options - const assertionOptions: PublicKeyCredentialRequestOptionsJSON = { - challenge: signInitiateResult.challenge, - allowCredentials: signInitiateResult.allowCredentials, - userVerification: "required" - } - - // start authentication (signing) - - const { startAuthentication } = await import("@simplewebauthn/browser") - const cred = await startAuthentication(assertionOptions) - - // verify signature from server - const verifyResponse = await fetch(`${passkeyServerUrl}/sign-verify`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ cred, userId }), - credentials: "include" - }) - - const verifyResult = await verifyResponse.json() - - if (!verifyResult.success) { - throw new Error("Signature not verified") - } - - // get authenticator data - const authenticatorData = verifyResult.authenticatorData - const authenticatorDataHex = uint8ArrayToHexString( - b64ToBytes(authenticatorData) - ) - - // get client data JSON - const clientDataJSON = atob(cred.response.clientDataJSON) - - // get challenge and response type location - const { beforeType } = findQuoteIndices(clientDataJSON) - - // get signature r,s - const signature = verifyResult.signature - const signatureHex = uint8ArrayToHexString(b64ToBytes(signature)) - const { r, s } = parseAndNormalizeSig(signatureHex) - - // encode signature - const encodedSignature = encodeAbiParameters( - [ - { name: "authenticatorData", type: "bytes" }, - { name: "clientDataJSON", type: "string" }, - { name: "responseTypeLocation", type: "uint256" }, - { name: "r", type: "uint256" }, - { name: "s", type: "uint256" }, - { name: "usePrecompiled", type: "bool" } - ], - [ - authenticatorDataHex, - clientDataJSON, - beforeType, - BigInt(r), - BigInt(s), - isRIP7212SupportedNetwork(chainId) - ] - ) - return encodedSignature - } const account: LocalAccount = toAccount({ // note that this address will be overwritten by actual address address: "0x0000000000000000000000000000000000000000", async signMessage({ message }) { - return signMessageUsingWebAuthn(message) + return signMessageUsingWebAuthn(message, chainId, [ + { id: webAuthnKey.authenticatorId, type: "public-key" } + ]) }, async signTransaction(_, __) { throw new SignTransactionNotSupportedBySmartAccount() @@ -193,7 +160,11 @@ export const toWebAuthnSigner = async < validateTypedData({ domain, message, primaryType, types }) const hash = hashTypedData(typedData) - return signMessageUsingWebAuthn(hash) + const signature = await signMessage(client, { + account, + message: hash + }) + return signature } }) @@ -201,8 +172,8 @@ export const toWebAuthnSigner = async < type: SIGNER_TYPE.PASSKEY, account, getPublicKey: () => { - if (!pubKey) return "0x" - return encodeWebAuthnPubKey(pubKey) + if (!webAuthnKey) return "0x" + return encodeWebAuthnPubKey(webAuthnKey) }, getDummySignature: () => { return encodeAbiParameters( diff --git a/plugins/multi-chain-weighted-validator/signers/webAuthnUtils.ts b/plugins/multi-chain-weighted-validator/signers/webAuthnUtils.ts deleted file mode 100644 index 6bc040c0..00000000 --- a/plugins/multi-chain-weighted-validator/signers/webAuthnUtils.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { p256 } from "@noble/curves/p256" -import { - type Hex, - bytesToBigInt, - concatHex, - hexToBytes, - pad, - toHex -} from "viem" -import type { WebAuthnKey } from "./toWebAuthnSigner.js" - -const RIP7212_SUPPORTED_NETWORKS = [80001] - -export const uint8ArrayToHexString = (array: Uint8Array): `0x${string}` => { - return `0x${Array.from(array, (byte) => - byte.toString(16).padStart(2, "0") - ).join("")}` as `0x${string}` -} - -export const b64ToBytes = (base64: string): Uint8Array => { - const paddedBase64 = base64 - .replace(/-/g, "+") - .replace(/_/g, "/") - .padEnd(base64.length + ((4 - (base64.length % 4)) % 4), "=") - const binString = atob(paddedBase64) - return Uint8Array.from(binString, (m) => m.codePointAt(0) ?? 0) -} - -export const findQuoteIndices = ( - input: string -): { beforeType: bigint; beforeChallenge: bigint } => { - const beforeTypeIndex = BigInt(input.lastIndexOf('"type":"webauthn.get"')) - const beforeChallengeIndex = BigInt(input.indexOf('"challenge')) - return { - beforeType: beforeTypeIndex, - beforeChallenge: beforeChallengeIndex - } -} - -// Parse DER-encoded P256-SHA256 signature to contract-friendly signature -// and normalize it so the signature is not malleable. -export function parseAndNormalizeSig(derSig: Hex): { r: bigint; s: bigint } { - const parsedSignature = p256.Signature.fromDER(derSig.slice(2)) - const bSig = hexToBytes(`0x${parsedSignature.toCompactHex()}`) - // assert(bSig.length === 64, "signature is not 64 bytes"); - const bR = bSig.slice(0, 32) - const bS = bSig.slice(32) - - // Avoid malleability. Ensure low S (<= N/2 where N is the curve order) - const r = bytesToBigInt(bR) - let s = bytesToBigInt(bS) - const n = BigInt( - "0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551" - ) - if (s > n / 2n) { - s = n - s - } - return { r, s } -} - -export const isRIP7212SupportedNetwork = (chainId: number): boolean => - RIP7212_SUPPORTED_NETWORKS.includes(chainId) - -export const encodeWebAuthnPubKey = (pubKey: WebAuthnKey) => { - return concatHex([ - toHex(pubKey.pubX, { size: 32 }), - toHex(pubKey.pubY, { size: 32 }), - pad(pubKey.authenticatorIdHash, { size: 32 }) - ]) -} diff --git a/plugins/multi-chain-weighted-validator/toMultiChainWeightedValidatorPlugin.ts b/plugins/multi-chain-weighted-validator/toMultiChainWeightedValidatorPlugin.ts index 1bc45862..7f0adcc0 100644 --- a/plugins/multi-chain-weighted-validator/toMultiChainWeightedValidatorPlugin.ts +++ b/plugins/multi-chain-weighted-validator/toMultiChainWeightedValidatorPlugin.ts @@ -31,8 +31,8 @@ import { decodeSignatures, encodeSignatures } from "./index.js" -import type { WebAuthnKey } from "./signers/toWebAuthnSigner.js" -import { encodeWebAuthnPubKey } from "./signers/webAuthnUtils.js" +import type { WebAuthnKey } from "@zerodev/webauthn-key" +import { encodeWebAuthnPubKey } from "./signers/toWebAuthnSigner.js" export type WeightedSigner = { account: LocalAccount From 18b182d93d0bc4fd49da6dd57adb5474a339e7e5 Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 14:20:06 +0900 Subject: [PATCH 11/12] chore: format --- .../multi-chain-weighted-validator/index.ts | 10 +++---- .../signers/toWebAuthnSigner.ts | 26 +++++++++---------- .../toMultiChainWeightedValidatorPlugin.ts | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/plugins/multi-chain-weighted-validator/index.ts b/plugins/multi-chain-weighted-validator/index.ts index 6830b449..b4262de0 100644 --- a/plugins/multi-chain-weighted-validator/index.ts +++ b/plugins/multi-chain-weighted-validator/index.ts @@ -1,4 +1,9 @@ import type { KernelValidator } from "@zerodev/sdk/types" +import { + type WebAuthnKey, + WebAuthnMode, + toWebAuthnKey +} from "@zerodev/webauthn-key" import { type ApproveUserOperationParameters, type ApproveUserOperationReturnType, @@ -20,11 +25,6 @@ import { type ECDSASignerParams, toECDSASigner } from "./signers/toECDSASigner.js" -import { - type WebAuthnKey, - WebAuthnMode, - toWebAuthnKey -} from "@zerodev/webauthn-key" import { type WebAuthnModularSignerParams, toWebAuthnSigner diff --git a/plugins/multi-chain-weighted-validator/signers/toWebAuthnSigner.ts b/plugins/multi-chain-weighted-validator/signers/toWebAuthnSigner.ts index dfaa4634..c88f2c43 100644 --- a/plugins/multi-chain-weighted-validator/signers/toWebAuthnSigner.ts +++ b/plugins/multi-chain-weighted-validator/signers/toWebAuthnSigner.ts @@ -1,4 +1,14 @@ import type { PublicKeyCredentialRequestOptionsJSON } from "@simplewebauthn/typescript-types" +import { + type WebAuthnKey, + b64ToBytes, + base64FromUint8Array, + findQuoteIndices, + hexStringToUint8Array, + isRIP7212SupportedNetwork, + parseAndNormalizeSig, + uint8ArrayToHexString +} from "@zerodev/webauthn-key" import type { TypedData } from "abitype" import { SignTransactionNotSupportedBySmartAccount } from "permissionless/accounts" import { @@ -8,28 +18,18 @@ import { type SignTypedDataParameters, type Transport, type TypedDataDefinition, + concatHex, getTypesForEIP712Domain, hashTypedData, - validateTypedData, - concatHex, + pad, toHex, - pad + validateTypedData } from "viem" import { type SignableMessage, encodeAbiParameters } from "viem" import { toAccount } from "viem/accounts" import { getChainId, signMessage } from "viem/actions" import { SIGNER_TYPE } from "../constants.js" import type { WeightedSigner } from "../toMultiChainWeightedValidatorPlugin.js" -import { - b64ToBytes, - findQuoteIndices, - isRIP7212SupportedNetwork, - parseAndNormalizeSig, - uint8ArrayToHexString, - type WebAuthnKey, - base64FromUint8Array, - hexStringToUint8Array -} from "@zerodev/webauthn-key" export type WebAuthnModularSignerParams = { webAuthnKey: WebAuthnKey diff --git a/plugins/multi-chain-weighted-validator/toMultiChainWeightedValidatorPlugin.ts b/plugins/multi-chain-weighted-validator/toMultiChainWeightedValidatorPlugin.ts index 7f0adcc0..6e988cf8 100644 --- a/plugins/multi-chain-weighted-validator/toMultiChainWeightedValidatorPlugin.ts +++ b/plugins/multi-chain-weighted-validator/toMultiChainWeightedValidatorPlugin.ts @@ -1,4 +1,5 @@ import type { GetKernelVersion, KernelValidator } from "@zerodev/sdk/types" +import type { WebAuthnKey } from "@zerodev/webauthn-key" import type { TypedData } from "abitype" import { type UserOperation, @@ -31,7 +32,6 @@ import { decodeSignatures, encodeSignatures } from "./index.js" -import type { WebAuthnKey } from "@zerodev/webauthn-key" import { encodeWebAuthnPubKey } from "./signers/toWebAuthnSigner.js" export type WeightedSigner = { From 708dc48e7594fa8514dcfac23050f65a21fb1002 Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 5 Jul 2024 05:21:09 +0000 Subject: [PATCH 12/12] chore: format --- bun.lockb | Bin 553928 -> 555584 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index 98c229f95efbfabc4fe7cec029e45f0d93bbc7f9..d70ce6617ab7de217f8278d11b094ba090cdb23e 100755 GIT binary patch delta 107020 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