From da2f9fa7c30eb2b631d4f314ce64609ce71aa4d2 Mon Sep 17 00:00:00 2001 From: PacificYield <173040337+PacificYield@users.noreply.github.com> Date: Mon, 25 Nov 2024 15:32:55 +0100 Subject: [PATCH] refactor: types and codegen --- contracts/codegen/main.ts | 2 - contracts/codegen/tfheexecutor.ts | 179 --- .../examples/TFHEExecutorUpgradedExample.sol | 1 + .../BaseTFHEExecutor.sol/BaseTFHEExecutor.ts | 333 +++++ .../BaseTFHEExecutor.sol/IInputVerifier.ts | 121 ++ .../contracts/BaseTFHEExecutor.sol/index.ts | 5 + .../InputVerifier.ts | 8 +- .../InputVerifier.native.sol/InputVerifier.ts | 8 +- .../TFHEExecutor.events.sol/index.ts | 1 - contracts/types/contracts/TFHEExecutor.ts | 1013 ++++++++++++++ contracts/types/contracts/index.ts | 5 +- .../BaseTFHEExecutor__factory.ts | 239 ++++ .../IInputVerifier__factory.ts | 71 + .../contracts/BaseTFHEExecutor.sol/index.ts | 5 + .../InputVerifier__factory.ts | 2 +- .../InputVerifier__factory.ts | 2 +- .../TFHEExecutor__factory.ts | 2 +- .../TFHEExecutor.events.sol/index.ts | 1 - .../contracts/TFHEExecutor__factory.ts | 1245 +++++++++++++++++ contracts/types/factories/contracts/index.ts | 3 +- contracts/types/hardhat.d.ts | 72 +- contracts/types/index.ts | 6 +- 22 files changed, 3089 insertions(+), 235 deletions(-) delete mode 100644 contracts/codegen/tfheexecutor.ts create mode 100644 contracts/types/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor.ts create mode 100644 contracts/types/contracts/BaseTFHEExecutor.sol/IInputVerifier.ts create mode 100644 contracts/types/contracts/BaseTFHEExecutor.sol/index.ts create mode 100644 contracts/types/contracts/TFHEExecutor.ts create mode 100644 contracts/types/factories/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor__factory.ts create mode 100644 contracts/types/factories/contracts/BaseTFHEExecutor.sol/IInputVerifier__factory.ts create mode 100644 contracts/types/factories/contracts/BaseTFHEExecutor.sol/index.ts create mode 100644 contracts/types/factories/contracts/TFHEExecutor__factory.ts diff --git a/contracts/codegen/main.ts b/contracts/codegen/main.ts index bdc1016f..ee1f6674 100644 --- a/contracts/codegen/main.ts +++ b/contracts/codegen/main.ts @@ -6,7 +6,6 @@ import operatorsPrices from './operatorsPrices.json'; import { generateFHEPayment } from './payments'; import * as t from './templates'; import * as testgen from './testgen'; -import { addTFHEExecutorEvents } from './tfheexecutor'; function generateAllFiles() { const numSplits = 12; @@ -18,7 +17,6 @@ function generateAllFiles() { writeFileSync('contracts/FHEPayment.sol', generateFHEPayment(operatorsPrices)); writeFileSync('contracts/InputVerifier.native.sol', generateInputVerifiers(false)); writeFileSync('contracts/InputVerifier.coprocessor.sol', generateInputVerifiers(true)); - writeFileSync('contracts/TFHEExecutor.events.sol', addTFHEExecutorEvents('contracts/TFHEExecutor.sol')); writeFileSync('payment/Payment.sol', t.paymentSol()); mkdirSync('contracts/tests', { recursive: true }); ovShards.forEach((os) => { diff --git a/contracts/codegen/tfheexecutor.ts b/contracts/codegen/tfheexecutor.ts deleted file mode 100644 index 0232bf32..00000000 --- a/contracts/codegen/tfheexecutor.ts +++ /dev/null @@ -1,179 +0,0 @@ -import * as fs from 'fs'; - -/** - * @description This function is generating the "TFHEExecutor with events" solidity contract variant from the original TFHEExecutor file. - * @returns {string} the solidity source code - */ -export function addTFHEExecutorEvents(pathOriginalTFHEExecutor: string): string { - const events = [ - 'event FheAdd(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheSub(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheMul(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheDiv(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheRem(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheBitAnd(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheBitOr(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheBitXor(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheShl(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheShr(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheRotl(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheRotr(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheEq(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheEqBytes(uint256 lhs, bytes rhs, bytes1 scalarByte, uint256 result)', - 'event FheNe(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheNeBytes(uint256 lhs, bytes rhs, bytes1 scalarByte, uint256 result)', - 'event FheGe(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheGt(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheLe(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheLt(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheMin(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheMax(uint256 lhs, uint256 rhs, bytes1 scalarByte, uint256 result)', - 'event FheNeg(uint256 ct, uint256 result)', - 'event FheNot(uint256 ct, uint256 result)', - 'event VerifyCiphertext(bytes32 inputHandle,address userAddress,bytes inputProof,bytes1 inputType,uint256 result)', - 'event Cast(uint256 ct, bytes1 toType, uint256 result)', - 'event TrivialEncrypt(uint256 pt, bytes1 toType, uint256 result)', - 'event TrivialEncryptBytes(bytes pt, bytes1 toType, uint256 result)', - 'event FheIfThenElse(uint256 control, uint256 ifTrue, uint256 ifFalse, uint256 result)', - 'event FheRand(bytes1 randType, uint256 result)', - 'event FheRandBounded(uint256 upperBound, bytes1 randType, uint256 result)', - ]; - const formattedEvents = events - .map((event) => { - const eventWithSemicolon = event.endsWith(';') ? event : event + ';'; - return ' ' + eventWithSemicolon; - }) - .join('\n'); - - const contractRegex = /(contract\s+TFHEExecutor\s+is\s+[^\{]+\{)/; - let content = fs.readFileSync(pathOriginalTFHEExecutor, 'utf8'); - content = content.replace(contractRegex, `$1\n${formattedEvents}\n`); - content = addEmitStatements(content, events); - content = replaceEmitBytesEvents(content); - return content; -} - -function addEmitStatements(content: string, abi: string[]): string { - function parseAbi(abi: string[]): Map { - const eventMap = new Map(); - const eventRegex = /event\s+(\w+)\s*\(([^)]*)\)/; - - for (const eventDef of abi) { - const match = eventRegex.exec(eventDef); - if (match) { - const eventName = match[1]; - const paramList = match[2]; - const params = paramList.split(',').map((param) => param.trim()); - const paramNames = params.map((param) => { - const parts = param.split(/\s+/); - return parts[parts.length - 1]; - }); - eventMap.set(eventName, paramNames); - } - } - return eventMap; - } - - function findMatchingBrace(content: string, startPos: number): number { - let braceCount = 1; - let pos = startPos + 1; - while (braceCount > 0 && pos < content.length) { - const char = content[pos]; - if (char === '{') { - braceCount++; - } else if (char === '}') { - braceCount--; - } - pos++; - } - return pos - 1; - } - - const eventMap = parseAbi(abi); - - const functionRegex = /function\s+(\w+)\s*\([^)]*\)\s*(?:[^{;]*\{)/g; - - let result = ''; - let currentIndex = 0; - let match; - - while ((match = functionRegex.exec(content)) !== null) { - const functionName = match[1]; - const functionStartIndex = match.index; - const functionHeader = match[0]; - const bodyStartIndex = functionStartIndex + functionHeader.length - 1; - - const bodyEndIndex = findMatchingBrace(content, bodyStartIndex); - const functionEndIndex = bodyEndIndex + 1; - - result += content.substring(currentIndex, functionStartIndex); - const functionCode = content.substring(functionStartIndex, functionEndIndex); - - const eventName = functionName.charAt(0).toUpperCase() + functionName.slice(1); - if (eventMap.has(eventName)) { - const paramNames = eventMap.get(eventName)!; - - const functionBody = content.substring(bodyStartIndex + 1, bodyEndIndex); - - const lines = functionBody.split('\n'); - let indent = ''; - for (const line of lines.reverse()) { - const matchIndent = /^\s*/.exec(line); - if (matchIndent && matchIndent[0].length > 0) { - indent = matchIndent[0]; - break; - } - } - - const emitStatement = `${indent} emit ${eventName}(${paramNames.join(', ')});`; - const modifiedFunctionCode = functionCode.slice(0, -1) + emitStatement + '\n' + indent + '}'; - result += modifiedFunctionCode; - } else { - result += functionCode; - } - currentIndex = functionEndIndex; - functionRegex.lastIndex = currentIndex; - } - - result += content.substring(currentIndex); - return result; -} - -function replaceEmitBytesEvents(content: string): string { - const emitLineRegex = /emit\s+FheEq\s*\(\s*lhs\s*,\s*rhs\s*,\s*scalarByte\s*,\s*result\s*\);/g; - const newEmitLine = 'emit FheEqBytes(lhs, rhs, scalarByte, result);'; - let occurrence = 0; - content = content.replace(emitLineRegex, (match) => { - occurrence++; - if (occurrence === 2) { - return newEmitLine; - } else { - return match; - } - }); - - const emitLineRegex2 = /emit\s+FheNe\s*\(\s*lhs\s*,\s*rhs\s*,\s*scalarByte\s*,\s*result\s*\);/g; - const newEmitLine2 = 'emit FheNeBytes(lhs, rhs, scalarByte, result);'; - occurrence = 0; - content = content.replace(emitLineRegex2, (match) => { - occurrence++; - if (occurrence === 2) { - return newEmitLine2; - } else { - return match; - } - }); - const emitLineRegex3 = /emit\s+TrivialEncrypt\s*\(\s*pt\s*,\s*toType\s*,\s*result\s*\);/g; - const newEmitLine3 = 'emit TrivialEncryptBytes(pt, toType, result);'; - occurrence = 0; - content = content.replace(emitLineRegex3, (match) => { - occurrence++; - if (occurrence === 2) { - return newEmitLine3; - } else { - return match; - } - }); - - return content; -} diff --git a/contracts/examples/TFHEExecutorUpgradedExample.sol b/contracts/examples/TFHEExecutorUpgradedExample.sol index 06f2820f..88fb2cd2 100644 --- a/contracts/examples/TFHEExecutorUpgradedExample.sol +++ b/contracts/examples/TFHEExecutorUpgradedExample.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.24; +import "@openzeppelin/contracts/utils/Strings.sol"; import "../contracts/TFHEExecutor.sol"; /// @title TFHEExecutorUpgradedExample diff --git a/contracts/types/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor.ts b/contracts/types/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor.ts new file mode 100644 index 00000000..002eac31 --- /dev/null +++ b/contracts/types/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor.ts @@ -0,0 +1,333 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../../common"; + +export interface BaseTFHEExecutorInterface extends Interface { + getFunction( + nameOrSignature: + | "HANDLE_VERSION" + | "acceptOwnership" + | "getACLAddress" + | "getFHEPaymentAddress" + | "getInputVerifierAddress" + | "getVersion" + | "initialize" + | "owner" + | "pendingOwner" + | "renounceOwnership" + | "transferOwnership" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "Initialized" + | "OwnershipTransferStarted" + | "OwnershipTransferred" + ): EventFragment; + + encodeFunctionData( + functionFragment: "HANDLE_VERSION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "acceptOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getACLAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getFHEPaymentAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getInputVerifierAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getVersion", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [AddressLike] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "pendingOwner", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [AddressLike] + ): string; + + decodeFunctionResult( + functionFragment: "HANDLE_VERSION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "acceptOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getACLAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getFHEPaymentAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getInputVerifierAddress", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getVersion", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pendingOwner", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; +} + +export namespace InitializedEvent { + export type InputTuple = [version: BigNumberish]; + export type OutputTuple = [version: bigint]; + export interface OutputObject { + version: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferStartedEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface BaseTFHEExecutor extends BaseContract { + connect(runner?: ContractRunner | null): BaseTFHEExecutor; + waitForDeployment(): Promise; + + interface: BaseTFHEExecutorInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + HANDLE_VERSION: TypedContractMethod<[], [bigint], "view">; + + acceptOwnership: TypedContractMethod<[], [void], "nonpayable">; + + getACLAddress: TypedContractMethod<[], [string], "view">; + + getFHEPaymentAddress: TypedContractMethod<[], [string], "view">; + + getInputVerifierAddress: TypedContractMethod<[], [string], "view">; + + getVersion: TypedContractMethod<[], [string], "view">; + + initialize: TypedContractMethod< + [initialOwner: AddressLike], + [void], + "nonpayable" + >; + + owner: TypedContractMethod<[], [string], "view">; + + pendingOwner: TypedContractMethod<[], [string], "view">; + + renounceOwnership: TypedContractMethod<[], [void], "nonpayable">; + + transferOwnership: TypedContractMethod< + [newOwner: AddressLike], + [void], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "HANDLE_VERSION" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "acceptOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "getACLAddress" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "getFHEPaymentAddress" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "getInputVerifierAddress" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "getVersion" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "initialize" + ): TypedContractMethod<[initialOwner: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "pendingOwner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "renounceOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "transferOwnership" + ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">; + + getEvent( + key: "Initialized" + ): TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferStarted" + ): TypedContractEvent< + OwnershipTransferStartedEvent.InputTuple, + OwnershipTransferStartedEvent.OutputTuple, + OwnershipTransferStartedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + filters: { + "Initialized(uint64)": TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + Initialized: TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + + "OwnershipTransferStarted(address,address)": TypedContractEvent< + OwnershipTransferStartedEvent.InputTuple, + OwnershipTransferStartedEvent.OutputTuple, + OwnershipTransferStartedEvent.OutputObject + >; + OwnershipTransferStarted: TypedContractEvent< + OwnershipTransferStartedEvent.InputTuple, + OwnershipTransferStartedEvent.OutputTuple, + OwnershipTransferStartedEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + }; +} diff --git a/contracts/types/contracts/BaseTFHEExecutor.sol/IInputVerifier.ts b/contracts/types/contracts/BaseTFHEExecutor.sol/IInputVerifier.ts new file mode 100644 index 00000000..0e69f0f7 --- /dev/null +++ b/contracts/types/contracts/BaseTFHEExecutor.sol/IInputVerifier.ts @@ -0,0 +1,121 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BytesLike, + FunctionFragment, + Result, + Interface, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedListener, + TypedContractMethod, +} from "../../common"; + +export declare namespace BaseTFHEExecutor { + export type ContextUserInputsStruct = { + aclAddress: AddressLike; + userAddress: AddressLike; + contractAddress: AddressLike; + }; + + export type ContextUserInputsStructOutput = [ + aclAddress: string, + userAddress: string, + contractAddress: string + ] & { aclAddress: string; userAddress: string; contractAddress: string }; +} + +export interface IInputVerifierInterface extends Interface { + getFunction(nameOrSignature: "verifyCiphertext"): FunctionFragment; + + encodeFunctionData( + functionFragment: "verifyCiphertext", + values: [BaseTFHEExecutor.ContextUserInputsStruct, BytesLike, BytesLike] + ): string; + + decodeFunctionResult( + functionFragment: "verifyCiphertext", + data: BytesLike + ): Result; +} + +export interface IInputVerifier extends BaseContract { + connect(runner?: ContractRunner | null): IInputVerifier; + waitForDeployment(): Promise; + + interface: IInputVerifierInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + verifyCiphertext: TypedContractMethod< + [ + context: BaseTFHEExecutor.ContextUserInputsStruct, + inputHandle: BytesLike, + inputProof: BytesLike + ], + [bigint], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "verifyCiphertext" + ): TypedContractMethod< + [ + context: BaseTFHEExecutor.ContextUserInputsStruct, + inputHandle: BytesLike, + inputProof: BytesLike + ], + [bigint], + "nonpayable" + >; + + filters: {}; +} diff --git a/contracts/types/contracts/BaseTFHEExecutor.sol/index.ts b/contracts/types/contracts/BaseTFHEExecutor.sol/index.ts new file mode 100644 index 00000000..b67becf8 --- /dev/null +++ b/contracts/types/contracts/BaseTFHEExecutor.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { BaseTFHEExecutor } from "./BaseTFHEExecutor"; +export type { IInputVerifier } from "./IInputVerifier"; diff --git a/contracts/types/contracts/InputVerifier.coprocessor.sol/InputVerifier.ts b/contracts/types/contracts/InputVerifier.coprocessor.sol/InputVerifier.ts index bd2756f7..79d2b4af 100644 --- a/contracts/types/contracts/InputVerifier.coprocessor.sol/InputVerifier.ts +++ b/contracts/types/contracts/InputVerifier.coprocessor.sol/InputVerifier.ts @@ -23,7 +23,7 @@ import type { TypedContractMethod, } from "../../common"; -export declare namespace TFHEExecutor { +export declare namespace BaseTFHEExecutor { export type ContextUserInputsStruct = { aclAddress: AddressLike; userAddress: AddressLike; @@ -136,7 +136,7 @@ export interface InputVerifierInterface extends Interface { ): string; encodeFunctionData( functionFragment: "verifyCiphertext", - values: [TFHEExecutor.ContextUserInputsStruct, BytesLike, BytesLike] + values: [BaseTFHEExecutor.ContextUserInputsStruct, BytesLike, BytesLike] ): string; decodeFunctionResult( @@ -373,7 +373,7 @@ export interface InputVerifier extends BaseContract { verifyCiphertext: TypedContractMethod< [ - context: TFHEExecutor.ContextUserInputsStruct, + context: BaseTFHEExecutor.ContextUserInputsStruct, inputHandle: BytesLike, inputProof: BytesLike ], @@ -458,7 +458,7 @@ export interface InputVerifier extends BaseContract { nameOrSignature: "verifyCiphertext" ): TypedContractMethod< [ - context: TFHEExecutor.ContextUserInputsStruct, + context: BaseTFHEExecutor.ContextUserInputsStruct, inputHandle: BytesLike, inputProof: BytesLike ], diff --git a/contracts/types/contracts/InputVerifier.native.sol/InputVerifier.ts b/contracts/types/contracts/InputVerifier.native.sol/InputVerifier.ts index d8f20d2d..d24ed142 100644 --- a/contracts/types/contracts/InputVerifier.native.sol/InputVerifier.ts +++ b/contracts/types/contracts/InputVerifier.native.sol/InputVerifier.ts @@ -23,7 +23,7 @@ import type { TypedContractMethod, } from "../../common"; -export declare namespace TFHEExecutor { +export declare namespace BaseTFHEExecutor { export type ContextUserInputsStruct = { aclAddress: AddressLike; userAddress: AddressLike; @@ -115,7 +115,7 @@ export interface InputVerifierInterface extends Interface { ): string; encodeFunctionData( functionFragment: "verifyCiphertext", - values: [TFHEExecutor.ContextUserInputsStruct, BytesLike, BytesLike] + values: [BaseTFHEExecutor.ContextUserInputsStruct, BytesLike, BytesLike] ): string; decodeFunctionResult( @@ -300,7 +300,7 @@ export interface InputVerifier extends BaseContract { verifyCiphertext: TypedContractMethod< [ - context: TFHEExecutor.ContextUserInputsStruct, + context: BaseTFHEExecutor.ContextUserInputsStruct, inputHandle: BytesLike, inputProof: BytesLike ], @@ -359,7 +359,7 @@ export interface InputVerifier extends BaseContract { nameOrSignature: "verifyCiphertext" ): TypedContractMethod< [ - context: TFHEExecutor.ContextUserInputsStruct, + context: BaseTFHEExecutor.ContextUserInputsStruct, inputHandle: BytesLike, inputProof: BytesLike ], diff --git a/contracts/types/contracts/TFHEExecutor.events.sol/index.ts b/contracts/types/contracts/TFHEExecutor.events.sol/index.ts index db48c59e..432e4dc2 100644 --- a/contracts/types/contracts/TFHEExecutor.events.sol/index.ts +++ b/contracts/types/contracts/TFHEExecutor.events.sol/index.ts @@ -1,5 +1,4 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -export type { IInputVerifier } from "./IInputVerifier"; export type { TFHEExecutor } from "./TFHEExecutor"; diff --git a/contracts/types/contracts/TFHEExecutor.ts b/contracts/types/contracts/TFHEExecutor.ts new file mode 100644 index 00000000..abfe8dad --- /dev/null +++ b/contracts/types/contracts/TFHEExecutor.ts @@ -0,0 +1,1013 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumberish, + BytesLike, + FunctionFragment, + Result, + Interface, + EventFragment, + AddressLike, + ContractRunner, + ContractMethod, + Listener, +} from "ethers"; +import type { + TypedContractEvent, + TypedDeferredTopicFilter, + TypedEventLog, + TypedLogDescription, + TypedListener, + TypedContractMethod, +} from "../common"; + +export interface TFHEExecutorInterface extends Interface { + getFunction( + nameOrSignature: + | "HANDLE_VERSION" + | "UPGRADE_INTERFACE_VERSION" + | "acceptOwnership" + | "cast" + | "fheAdd" + | "fheBitAnd" + | "fheBitOr" + | "fheBitXor" + | "fheDiv" + | "fheEq(uint256,uint256,bytes1)" + | "fheEq(uint256,bytes,bytes1)" + | "fheGe" + | "fheGt" + | "fheIfThenElse" + | "fheLe" + | "fheLt" + | "fheMax" + | "fheMin" + | "fheMul" + | "fheNe(uint256,bytes,bytes1)" + | "fheNe(uint256,uint256,bytes1)" + | "fheNeg" + | "fheNot" + | "fheRand" + | "fheRandBounded" + | "fheRem" + | "fheRotl" + | "fheRotr" + | "fheShl" + | "fheShr" + | "fheSub" + | "getACLAddress" + | "getFHEPaymentAddress" + | "getInputVerifierAddress" + | "getVersion" + | "initialize" + | "owner" + | "pendingOwner" + | "proxiableUUID" + | "renounceOwnership" + | "transferOwnership" + | "trivialEncrypt(bytes,bytes1)" + | "trivialEncrypt(uint256,bytes1)" + | "upgradeToAndCall" + | "verifyCiphertext" + ): FunctionFragment; + + getEvent( + nameOrSignatureOrTopic: + | "Initialized" + | "OwnershipTransferStarted" + | "OwnershipTransferred" + | "Upgraded" + ): EventFragment; + + encodeFunctionData( + functionFragment: "HANDLE_VERSION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "UPGRADE_INTERFACE_VERSION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "acceptOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "cast", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheAdd", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheBitAnd", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheBitOr", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheBitXor", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheDiv", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheEq(uint256,uint256,bytes1)", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheEq(uint256,bytes,bytes1)", + values: [BigNumberish, BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheGe", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheGt", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheIfThenElse", + values: [BigNumberish, BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "fheLe", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheLt", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheMax", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheMin", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheMul", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheNe(uint256,bytes,bytes1)", + values: [BigNumberish, BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheNe(uint256,uint256,bytes1)", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheNeg", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "fheNot", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "fheRand", values: [BytesLike]): string; + encodeFunctionData( + functionFragment: "fheRandBounded", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheRem", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheRotl", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheRotr", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheShl", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheShr", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "fheSub", + values: [BigNumberish, BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getACLAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getFHEPaymentAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getInputVerifierAddress", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getVersion", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [AddressLike] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData( + functionFragment: "pendingOwner", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "proxiableUUID", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [AddressLike] + ): string; + encodeFunctionData( + functionFragment: "trivialEncrypt(bytes,bytes1)", + values: [BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "trivialEncrypt(uint256,bytes1)", + values: [BigNumberish, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "upgradeToAndCall", + values: [AddressLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "verifyCiphertext", + values: [BytesLike, AddressLike, BytesLike, BytesLike] + ): string; + + decodeFunctionResult( + functionFragment: "HANDLE_VERSION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "UPGRADE_INTERFACE_VERSION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "acceptOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "cast", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheAdd", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheBitAnd", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheBitOr", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheBitXor", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheDiv", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "fheEq(uint256,uint256,bytes1)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "fheEq(uint256,bytes,bytes1)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "fheGe", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheGt", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "fheIfThenElse", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "fheLe", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheLt", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheMax", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheMin", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheMul", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "fheNe(uint256,bytes,bytes1)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "fheNe(uint256,uint256,bytes1)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "fheNeg", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheNot", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheRand", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "fheRandBounded", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "fheRem", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheRotl", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheRotr", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheShl", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheShr", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "fheSub", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getACLAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getFHEPaymentAddress", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getInputVerifierAddress", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getVersion", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pendingOwner", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "proxiableUUID", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "trivialEncrypt(bytes,bytes1)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "trivialEncrypt(uint256,bytes1)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "upgradeToAndCall", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "verifyCiphertext", + data: BytesLike + ): Result; +} + +export namespace InitializedEvent { + export type InputTuple = [version: BigNumberish]; + export type OutputTuple = [version: bigint]; + export interface OutputObject { + version: bigint; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferStartedEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace OwnershipTransferredEvent { + export type InputTuple = [previousOwner: AddressLike, newOwner: AddressLike]; + export type OutputTuple = [previousOwner: string, newOwner: string]; + export interface OutputObject { + previousOwner: string; + newOwner: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export namespace UpgradedEvent { + export type InputTuple = [implementation: AddressLike]; + export type OutputTuple = [implementation: string]; + export interface OutputObject { + implementation: string; + } + export type Event = TypedContractEvent; + export type Filter = TypedDeferredTopicFilter; + export type Log = TypedEventLog; + export type LogDescription = TypedLogDescription; +} + +export interface TFHEExecutor extends BaseContract { + connect(runner?: ContractRunner | null): TFHEExecutor; + waitForDeployment(): Promise; + + interface: TFHEExecutorInterface; + + queryFilter( + event: TCEvent, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + queryFilter( + filter: TypedDeferredTopicFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>>; + + on( + event: TCEvent, + listener: TypedListener + ): Promise; + on( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + once( + event: TCEvent, + listener: TypedListener + ): Promise; + once( + filter: TypedDeferredTopicFilter, + listener: TypedListener + ): Promise; + + listeners( + event: TCEvent + ): Promise>>; + listeners(eventName?: string): Promise>; + removeAllListeners( + event?: TCEvent + ): Promise; + + HANDLE_VERSION: TypedContractMethod<[], [bigint], "view">; + + UPGRADE_INTERFACE_VERSION: TypedContractMethod<[], [string], "view">; + + acceptOwnership: TypedContractMethod<[], [void], "nonpayable">; + + cast: TypedContractMethod< + [ct: BigNumberish, toType: BytesLike], + [bigint], + "nonpayable" + >; + + fheAdd: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheBitAnd: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheBitOr: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheBitXor: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheDiv: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + "fheEq(uint256,uint256,bytes1)": TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + "fheEq(uint256,bytes,bytes1)": TypedContractMethod< + [lhs: BigNumberish, rhs: BytesLike, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheGe: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheGt: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheIfThenElse: TypedContractMethod< + [control: BigNumberish, ifTrue: BigNumberish, ifFalse: BigNumberish], + [bigint], + "nonpayable" + >; + + fheLe: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheLt: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheMax: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheMin: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheMul: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + "fheNe(uint256,bytes,bytes1)": TypedContractMethod< + [lhs: BigNumberish, rhs: BytesLike, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + "fheNe(uint256,uint256,bytes1)": TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheNeg: TypedContractMethod<[ct: BigNumberish], [bigint], "nonpayable">; + + fheNot: TypedContractMethod<[ct: BigNumberish], [bigint], "nonpayable">; + + fheRand: TypedContractMethod<[randType: BytesLike], [bigint], "nonpayable">; + + fheRandBounded: TypedContractMethod< + [upperBound: BigNumberish, randType: BytesLike], + [bigint], + "nonpayable" + >; + + fheRem: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheRotl: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheRotr: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheShl: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheShr: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + fheSub: TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + + getACLAddress: TypedContractMethod<[], [string], "view">; + + getFHEPaymentAddress: TypedContractMethod<[], [string], "view">; + + getInputVerifierAddress: TypedContractMethod<[], [string], "view">; + + getVersion: TypedContractMethod<[], [string], "view">; + + initialize: TypedContractMethod< + [initialOwner: AddressLike], + [void], + "nonpayable" + >; + + owner: TypedContractMethod<[], [string], "view">; + + pendingOwner: TypedContractMethod<[], [string], "view">; + + proxiableUUID: TypedContractMethod<[], [string], "view">; + + renounceOwnership: TypedContractMethod<[], [void], "nonpayable">; + + transferOwnership: TypedContractMethod< + [newOwner: AddressLike], + [void], + "nonpayable" + >; + + "trivialEncrypt(bytes,bytes1)": TypedContractMethod< + [pt: BytesLike, toType: BytesLike], + [bigint], + "nonpayable" + >; + + "trivialEncrypt(uint256,bytes1)": TypedContractMethod< + [pt: BigNumberish, toType: BytesLike], + [bigint], + "nonpayable" + >; + + upgradeToAndCall: TypedContractMethod< + [newImplementation: AddressLike, data: BytesLike], + [void], + "payable" + >; + + verifyCiphertext: TypedContractMethod< + [ + inputHandle: BytesLike, + userAddress: AddressLike, + inputProof: BytesLike, + inputType: BytesLike + ], + [bigint], + "nonpayable" + >; + + getFunction( + key: string | FunctionFragment + ): T; + + getFunction( + nameOrSignature: "HANDLE_VERSION" + ): TypedContractMethod<[], [bigint], "view">; + getFunction( + nameOrSignature: "UPGRADE_INTERFACE_VERSION" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "acceptOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "cast" + ): TypedContractMethod< + [ct: BigNumberish, toType: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheAdd" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheBitAnd" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheBitOr" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheBitXor" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheDiv" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheEq(uint256,uint256,bytes1)" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheEq(uint256,bytes,bytes1)" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BytesLike, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheGe" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheGt" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheIfThenElse" + ): TypedContractMethod< + [control: BigNumberish, ifTrue: BigNumberish, ifFalse: BigNumberish], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheLe" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheLt" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheMax" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheMin" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheMul" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheNe(uint256,bytes,bytes1)" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BytesLike, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheNe(uint256,uint256,bytes1)" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheNeg" + ): TypedContractMethod<[ct: BigNumberish], [bigint], "nonpayable">; + getFunction( + nameOrSignature: "fheNot" + ): TypedContractMethod<[ct: BigNumberish], [bigint], "nonpayable">; + getFunction( + nameOrSignature: "fheRand" + ): TypedContractMethod<[randType: BytesLike], [bigint], "nonpayable">; + getFunction( + nameOrSignature: "fheRandBounded" + ): TypedContractMethod< + [upperBound: BigNumberish, randType: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheRem" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheRotl" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheRotr" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheShl" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheShr" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "fheSub" + ): TypedContractMethod< + [lhs: BigNumberish, rhs: BigNumberish, scalarByte: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "getACLAddress" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "getFHEPaymentAddress" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "getInputVerifierAddress" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "getVersion" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "initialize" + ): TypedContractMethod<[initialOwner: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "owner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "pendingOwner" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "proxiableUUID" + ): TypedContractMethod<[], [string], "view">; + getFunction( + nameOrSignature: "renounceOwnership" + ): TypedContractMethod<[], [void], "nonpayable">; + getFunction( + nameOrSignature: "transferOwnership" + ): TypedContractMethod<[newOwner: AddressLike], [void], "nonpayable">; + getFunction( + nameOrSignature: "trivialEncrypt(bytes,bytes1)" + ): TypedContractMethod< + [pt: BytesLike, toType: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "trivialEncrypt(uint256,bytes1)" + ): TypedContractMethod< + [pt: BigNumberish, toType: BytesLike], + [bigint], + "nonpayable" + >; + getFunction( + nameOrSignature: "upgradeToAndCall" + ): TypedContractMethod< + [newImplementation: AddressLike, data: BytesLike], + [void], + "payable" + >; + getFunction( + nameOrSignature: "verifyCiphertext" + ): TypedContractMethod< + [ + inputHandle: BytesLike, + userAddress: AddressLike, + inputProof: BytesLike, + inputType: BytesLike + ], + [bigint], + "nonpayable" + >; + + getEvent( + key: "Initialized" + ): TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferStarted" + ): TypedContractEvent< + OwnershipTransferStartedEvent.InputTuple, + OwnershipTransferStartedEvent.OutputTuple, + OwnershipTransferStartedEvent.OutputObject + >; + getEvent( + key: "OwnershipTransferred" + ): TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + getEvent( + key: "Upgraded" + ): TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + + filters: { + "Initialized(uint64)": TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + Initialized: TypedContractEvent< + InitializedEvent.InputTuple, + InitializedEvent.OutputTuple, + InitializedEvent.OutputObject + >; + + "OwnershipTransferStarted(address,address)": TypedContractEvent< + OwnershipTransferStartedEvent.InputTuple, + OwnershipTransferStartedEvent.OutputTuple, + OwnershipTransferStartedEvent.OutputObject + >; + OwnershipTransferStarted: TypedContractEvent< + OwnershipTransferStartedEvent.InputTuple, + OwnershipTransferStartedEvent.OutputTuple, + OwnershipTransferStartedEvent.OutputObject + >; + + "OwnershipTransferred(address,address)": TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + OwnershipTransferred: TypedContractEvent< + OwnershipTransferredEvent.InputTuple, + OwnershipTransferredEvent.OutputTuple, + OwnershipTransferredEvent.OutputObject + >; + + "Upgraded(address)": TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + Upgraded: TypedContractEvent< + UpgradedEvent.InputTuple, + UpgradedEvent.OutputTuple, + UpgradedEvent.OutputObject + >; + }; +} diff --git a/contracts/types/contracts/index.ts b/contracts/types/contracts/index.ts index ccb1c6cf..6f31c144 100644 --- a/contracts/types/contracts/index.ts +++ b/contracts/types/contracts/index.ts @@ -1,14 +1,15 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +import type * as baseTfheExecutorSol from "./BaseTFHEExecutor.sol"; +export type { baseTfheExecutorSol }; import type * as inputVerifierCoprocessorSol from "./InputVerifier.coprocessor.sol"; export type { inputVerifierCoprocessorSol }; import type * as inputVerifierNativeSol from "./InputVerifier.native.sol"; export type { inputVerifierNativeSol }; import type * as tfheExecutorEventsSol from "./TFHEExecutor.events.sol"; export type { tfheExecutorEventsSol }; -import type * as tfheExecutorSol from "./TFHEExecutor.sol"; -export type { tfheExecutorSol }; export type { ACL } from "./ACL"; export type { FHEPayment } from "./FHEPayment"; export type { KMSVerifier } from "./KMSVerifier"; +export type { TFHEExecutor } from "./TFHEExecutor"; diff --git a/contracts/types/factories/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor__factory.ts b/contracts/types/factories/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor__factory.ts new file mode 100644 index 00000000..8428b294 --- /dev/null +++ b/contracts/types/factories/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor__factory.ts @@ -0,0 +1,239 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + BaseTFHEExecutor, + BaseTFHEExecutorInterface, +} from "../../../contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor"; + +const _abi = [ + { + inputs: [], + name: "InvalidInitialization", + type: "error", + }, + { + inputs: [], + name: "NotInitializing", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferStarted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + inputs: [], + name: "HANDLE_VERSION", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "acceptOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "getACLAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFHEPaymentAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getInputVerifierAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getVersion", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "initialOwner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "pendingOwner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class BaseTFHEExecutor__factory { + static readonly abi = _abi; + static createInterface(): BaseTFHEExecutorInterface { + return new Interface(_abi) as BaseTFHEExecutorInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): BaseTFHEExecutor { + return new Contract(address, _abi, runner) as unknown as BaseTFHEExecutor; + } +} diff --git a/contracts/types/factories/contracts/BaseTFHEExecutor.sol/IInputVerifier__factory.ts b/contracts/types/factories/contracts/BaseTFHEExecutor.sol/IInputVerifier__factory.ts new file mode 100644 index 00000000..d8c88536 --- /dev/null +++ b/contracts/types/factories/contracts/BaseTFHEExecutor.sol/IInputVerifier__factory.ts @@ -0,0 +1,71 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ + +import { Contract, Interface, type ContractRunner } from "ethers"; +import type { + IInputVerifier, + IInputVerifierInterface, +} from "../../../contracts/BaseTFHEExecutor.sol/IInputVerifier"; + +const _abi = [ + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "aclAddress", + type: "address", + }, + { + internalType: "address", + name: "userAddress", + type: "address", + }, + { + internalType: "address", + name: "contractAddress", + type: "address", + }, + ], + internalType: "struct BaseTFHEExecutor.ContextUserInputs", + name: "context", + type: "tuple", + }, + { + internalType: "bytes32", + name: "inputHandle", + type: "bytes32", + }, + { + internalType: "bytes", + name: "inputProof", + type: "bytes", + }, + ], + name: "verifyCiphertext", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +export class IInputVerifier__factory { + static readonly abi = _abi; + static createInterface(): IInputVerifierInterface { + return new Interface(_abi) as IInputVerifierInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): IInputVerifier { + return new Contract(address, _abi, runner) as unknown as IInputVerifier; + } +} diff --git a/contracts/types/factories/contracts/BaseTFHEExecutor.sol/index.ts b/contracts/types/factories/contracts/BaseTFHEExecutor.sol/index.ts new file mode 100644 index 00000000..9fd29928 --- /dev/null +++ b/contracts/types/factories/contracts/BaseTFHEExecutor.sol/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { BaseTFHEExecutor__factory } from "./BaseTFHEExecutor__factory"; +export { IInputVerifier__factory } from "./IInputVerifier__factory"; diff --git a/contracts/types/factories/contracts/InputVerifier.coprocessor.sol/InputVerifier__factory.ts b/contracts/types/factories/contracts/InputVerifier.coprocessor.sol/InputVerifier__factory.ts index f807ffbf..7420ab79 100644 --- a/contracts/types/factories/contracts/InputVerifier.coprocessor.sol/InputVerifier__factory.ts +++ b/contracts/types/factories/contracts/InputVerifier.coprocessor.sol/InputVerifier__factory.ts @@ -461,7 +461,7 @@ const _abi = [ type: "address", }, ], - internalType: "struct TFHEExecutor.ContextUserInputs", + internalType: "struct BaseTFHEExecutor.ContextUserInputs", name: "context", type: "tuple", }, diff --git a/contracts/types/factories/contracts/InputVerifier.native.sol/InputVerifier__factory.ts b/contracts/types/factories/contracts/InputVerifier.native.sol/InputVerifier__factory.ts index 8b7cc5b7..20c8ab2e 100644 --- a/contracts/types/factories/contracts/InputVerifier.native.sol/InputVerifier__factory.ts +++ b/contracts/types/factories/contracts/InputVerifier.native.sol/InputVerifier__factory.ts @@ -346,7 +346,7 @@ const _abi = [ type: "address", }, ], - internalType: "struct TFHEExecutor.ContextUserInputs", + internalType: "struct BaseTFHEExecutor.ContextUserInputs", name: "context", type: "tuple", }, diff --git a/contracts/types/factories/contracts/TFHEExecutor.events.sol/TFHEExecutor__factory.ts b/contracts/types/factories/contracts/TFHEExecutor.events.sol/TFHEExecutor__factory.ts index ca661f80..97d2581a 100644 --- a/contracts/types/factories/contracts/TFHEExecutor.events.sol/TFHEExecutor__factory.ts +++ b/contracts/types/factories/contracts/TFHEExecutor.events.sol/TFHEExecutor__factory.ts @@ -2103,7 +2103,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516150de620001005f395f8181613eda01528181613f03015261406801526150de5ff3fe6080604052600436106102e2575f3560e01c806389a4314b11610186578063c4d66de8116100dc578063ec4057dc11610087578063f6859bdc11610062578063f6859bdc1461081a578063f953e42714610839578063fa33b7af14610858575f80fd5b8063ec4057dc146107bd578063eee1833c146107dc578063f2fde38b146107fb575f80fd5b8063e0c5cbb3116100b7578063e0c5cbb31461076b578063e30c39781461078a578063e71746b81461079e575f80fd5b8063c4d66de81461070e578063cb3b94071461072d578063e0c516ae1461074c575f80fd5b8063a86e9de51161013c578063a8c7c2c111610117578063a8c7c2c114610681578063ad3cb1cc146106a7578063bc47139a146106ef575f80fd5b8063a86e9de514610624578063a87deac414610643578063a8b42a8914610662575f80fd5b80638da5cb5b1161016c5780638da5cb5b146105d2578063900d294e146105e65780639675211f14610605575f80fd5b806389a4314b146105945780638c14cc21146105b3575f80fd5b806344ae9c5c1161023b578063694daf72116101f1578063715018a6116101cc578063715018a61461054d57806379ba509714610561578063816d57d314610575575f80fd5b8063694daf72146104ea5780636a8c8eb4146105095780636be317581461052e575f80fd5b80634f1ef286116102215780634f1ef286146104a257806352d1902d146104b7578063666a3588146104cb575f80fd5b806344ae9c5c146104645780634be68d2014610483575f80fd5b8063192710811161029b5780632e817ff0116102765780632e817ff01461040757806336cdd31b146104265780633e63c50a14610445575f80fd5b80631927108114610396578063275e36bf146103b55780632c7d67b7146103e8575f80fd5b80630b90dfc3116102cb5780630b90dfc3146103375780630d8e6e2c1461035657806313801ffa14610377575f80fd5b8063052896f1146102e65780630590734314610318575b5f80fd5b3480156102f1575f80fd5b506103056103003660046148fc565b610877565b6040519081526020015b60405180910390f35b348015610323575f80fd5b506103056103323660046148fc565b610971565b348015610342575f80fd5b506103056103513660046149cb565b610a5e565b348015610361575f80fd5b5061036a610e67565b60405161030f9190614a62565b348015610382575f80fd5b50610305610391366004614a74565b610ee2565b3480156103a1575f80fd5b506103056103b03660046148fc565b610fae565b3480156103c0575f80fd5b505f805160206150928339815191525b6040516001600160a01b03909116815260200161030f565b3480156103f3575f80fd5b506103056104023660046148fc565b611126565b348015610412575f80fd5b50610305610421366004614aa1565b611213565b348015610431575f80fd5b506103056104403660046148fc565b6113cf565b348015610450575f80fd5b5061030561045f3660046148fc565b61156c565b34801561046f575f80fd5b5061030561047e3660046148fc565b611659565b34801561048e575f80fd5b5061030561049d366004614b05565b611746565b6104b56104b0366004614b2f565b611a77565b005b3480156104c2575f80fd5b50610305611a96565b3480156104d6575f80fd5b506103056104e53660046148fc565b611ac4565b3480156104f5575f80fd5b506103056105043660046148fc565b611bb1565b348015610514575f80fd5b5061051c5f81565b60405160ff909116815260200161030f565b348015610539575f80fd5b506103056105483660046148fc565b611c9e565b348015610558575f80fd5b506104b5611e16565b34801561056c575f80fd5b506104b5611e29565b348015610580575f80fd5b5061030561058f3660046148fc565b611e71565b34801561059f575f80fd5b506103056105ae3660046148fc565b611f5e565b3480156105be575f80fd5b506103056105cd3660046148fc565b61204b565b3480156105dd575f80fd5b506103d0612138565b3480156105f1575f80fd5b50610305610600366004614b7a565b61216c565b348015610610575f80fd5b5061030561061f3660046148fc565b6123be565b34801561062f575f80fd5b5061030561063e3660046148fc565b6124ab565b34801561064e575f80fd5b5061030561065d3660046148fc565b612598565b34801561066d575f80fd5b5061030561067c366004614a74565b612685565b34801561068c575f80fd5b507369de3158643e738a0724418b21a35faa20cbb1c56103d0565b3480156106b2575f80fd5b5061036a6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156106fa575f80fd5b506103056107093660046149cb565b612746565b348015610719575f80fd5b506104b5610728366004614b93565b612b37565b348015610738575f80fd5b50610305610747366004614bac565b612c59565b348015610757575f80fd5b506103056107663660046148fc565b612d37565b348015610776575f80fd5b50610305610785366004614bd5565b612ed4565b348015610795575f80fd5b506103d06131b5565b3480156107a9575f80fd5b506103056107b8366004614b05565b6131dd565b3480156107c8575f80fd5b506103056107d73660046148fc565b613392565b3480156107e7575f80fd5b506103056107f63660046148fc565b61347f565b348015610806575f80fd5b506104b5610815366004614b93565b61356c565b348015610825575f80fd5b505f805160206150b28339815191526103d0565b348015610844575f80fd5b506103056108533660046148fc565b6135f1565b348015610863575f80fd5b50610305610872366004614b05565b6136dd565b5f61017e610885858261398e565b5f6108908660081c90565b60405162fabc1960e21b815233600482015260ff82166024820152600160f81b8616604482018190529192505f80516020615092833981519152906303eaf064906064015f604051808303815f87803b1580156108eb575f80fd5b505af11580156108fd573d5f803e3d5ffd5b5050505061090f600e8888845f6139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f917801ccb010364b80d82085948b6ce1f7231e1e6950253ca1134a2dace31132906080015b60405180910390a15050509392505050565b5f61017e61097f858261398e565b5f61098a8660081c90565b60405163b25fd54760e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206150928339815191529063b25fd547906064015f604051808303815f87803b1580156109e6575f80fd5b505af11580156109f8573d5f803e3d5ffd5b50505050610a0a600a888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507ff58687e1e87ebb2fe49b53f406501933e51bed3f62e278ac0bf3203a26a9e2e99060800161095f565b5f610e00610a6c858261398e565b5f610a778660081c90565b9050600160f81b808516908114610afb5760405162461bcd60e51b815260206004820152603c60248201527f4f7665726c6f61646564206668654e65206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e640000000060648201526084015b60405180910390fd5b6040516399841ed760e01b815233600482015260ff831660248201526001600160f81b0319821660448201525f80516020615092833981519152906399841ed7906064015f604051808303815f87803b158015610b56575f80fd5b505af1158015610b68573d5f803e3d5ffd5b5050604051632fd514cd60e11b8152600481018a90523360248201525f805160206150b28339815191529250635faa299a9150604401602060405180830381865afa158015610bb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdd9190614c17565b610c295760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610af2565b855160ff8316600903610c9e5780604014610c995760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610af2565b610d74565b8260ff16600a03610d0e5780608014610c995760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610af2565b8061010014610d745760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610af2565b600d8888845f805160206150b283398151915246604051602001610d9d96959493929190614c59565b60408051601f198184030181529190528051602090910120945061ffff1985166040516346ce4e4960e11b8152600481018290523360248201529095505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015610e09575f80fd5b505af1158015610e1b573d5f803e3d5ffd5b505050507f5b7bbda9449c32c1d56a33ee9be18d67a28f5faead25db7ab04fa217000cecf788888888604051610e549493929190614cc1565b60405180910390a1505050509392505050565b60606040518060400160405280600c81526020017f544648454578656375746f720000000000000000000000000000000000000000815250610ea85f613caf565b610eb26001613caf565b610ebb5f613caf565b604051602001610ece9493929190614cf6565b604051602081830303815290604052905090565b5f61017f610ef0838261398e565b5f610efb8460081c90565b60405163aa43b7f960e01b815233600482015260ff821660248201529091505f805160206150928339815191529063aa43b7f9906044015f604051808303815f87803b158015610f49575f80fd5b505af1158015610f5b573d5f803e3d5ffd5b50505050610f6a601585613d4c565b60408051868152602081018390529194507f9a9785c912b1ce9b03afbd78573bd048c160bd5a489c02f52a3eb9703a718f2491015b60405180910390a15050919050565b5f610fff610fbc858261398e565b5f610fc78660081c90565b9050600160f81b808516908190036110535760088260ff1611156110535760405162461bcd60e51b815260206004820152603e60248201527f5363616c6172206668654e6520666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f61646564206668654e6500006064820152608401610af2565b6040516399841ed760e01b815233600482015260ff831660248201526001600160f81b0319821660448201525f80516020615092833981519152906399841ed7906064015f604051808303815f87803b1580156110ae575f80fd5b505af11580156110c0573d5f803e3d5ffd5b505050506110d2600d8888845f6139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507fd43ba81a7c94579d65cbb7db5db8dcf366ff05bdecd1d927fcc99840c68571a59060800161095f565b5f61017f611134858261398e565b5f61113f8660081c90565b60405163473dceed60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206150928339815191529063473dceed906064015f604051808303815f87803b15801561119b575f80fd5b505af11580156111ad573d5f803e3d5ffd5b505050506111bf6007888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f31a58348e92aca95ce44cfea2a1066053d8807feb5ed9bbdfe95e13a622e21f29060800161095f565b604080516060810182525f805160206150b283398151915281526001600160a01b038516602082015233918101919091525f90816112518760081c90565b905060f884901c60ff8216146112a95760405162461bcd60e51b815260206004820152600a60248201527f57726f6e672074797065000000000000000000000000000000000000000000006044820152606401610af2565b604051634d52c10760e01b81527369de3158643e738a0724418b21a35faa20cbb1c590634d52c107906112e49085908b908a90600401614d73565b6020604051808303815f875af1158015611300573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113249190614db5565b6040516346ce4e4960e11b8152600481018290523360248201529093505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015611370575f80fd5b505af1158015611382573d5f803e3d5ffd5b505050507f777462f58dda134f765b89f211d136b25f0d06d218cb2c311f1c43f2a2392b4987878787876040516113bd959493929190614dcc565b60405180910390a15050949350505050565b5f600160f81b808316146114315760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206668654469762062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608401610af2565b825f036114805760405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606401610af2565b61017e61148d858261398e565b5f6114988660081c90565b60405163f7eaec6360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206150928339815191529063f7eaec63906064015f604051808303815f87803b1580156114f4575f80fd5b505af1158015611506573d5f803e3d5ffd5b505050506115186003888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f9968f8dbde1f175af00b6630b7b30747c77be278fd2e64c281458c0d470084319060800161095f565b5f61017e61157a858261398e565b5f6115858660081c90565b604051638638282b60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061509283398151915290638638282b906064015f604051808303815f87803b1580156115e1575f80fd5b505af11580156115f3573d5f803e3d5ffd5b50505050611605600f8888845f6139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507fa0da53ac7741df5d78f645cb77e6577ba9e246906a77e17286f285a916dff7089060800161095f565b5f61017e611667858261398e565b5f6116728660081c90565b6040516313f3d32960e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f80516020615092833981519152906313f3d329906064015f604051808303815f87803b1580156116ce575f80fd5b505af11580156116e0573d5f803e3d5ffd5b505050506116f2600b888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507fd42970039fe3f91ed8c5a4aea3d626defdb62b542b70d6f0dd2b56fcfac120f59060800161095f565b604051632fd514cd60e11b8152600481018390523360248201525f905f805160206150b283398151915290635faa299a90604401602060405180830381865afa158015611795573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b99190614c17565b6118055760405162461bcd60e51b815260206004820152601d60248201527f53656e64657220646f65736e2774206f776e206374206f6e20636173740000006044820152606401610af2565b61017f611812848261398e565b61017e600160f885901c1b811661186b5760405162461bcd60e51b815260206004820152601760248201527f556e737570706f72746564206f757470757420747970650000000000000000006044820152606401610af2565b5f6118768660081c90565b9050847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168160f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361190e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206361737420746f2073616d65207479706500000000000000006044820152606401610af2565b604051630cea149360e41b815233600482015260ff821660248201525f805160206150928339815191529063cea14930906044015f604051808303815f87803b158015611959575f80fd5b505af115801561196b573d5f803e3d5ffd5b50505050601786865f805160206150b283398151915246604051602001611996959493929190614e11565b60408051601f198184030181529190528051602090910120935061ffff19841660f086901c61ff0016176040516346ce4e4960e11b8152600481018290523360248201529094505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015611a0c575f80fd5b505af1158015611a1e573d5f803e3d5ffd5b5050604080518981526001600160f81b0319891660208201529081018790527fce79b6444dc9b93ecddbc13b55eaecf50a20eb779fa5b59f358bd16ab82a9667925060600190505b60405180910390a150505092915050565b611a7f613ecf565b611a8882613f86565b611a928282613f8e565b5050565b5f611a9f61405d565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f61017f611ad2858261398e565b5f611add8660081c90565b60405163cd2bd00360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206150928339815191529063cd2bd003906064015f604051808303815f87803b158015611b39575f80fd5b505af1158015611b4b573d5f803e3d5ffd5b50505050611b5d6005888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f419268c57bdb686c5c3a209be649f9884f7c21b28195fe7c5849e62e551713149060800161095f565b5f61017e611bbf858261398e565b5f611bca8660081c90565b60405163d692278360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206150928339815191529063d6922783906064015f604051808303815f87803b158015611c26575f80fd5b505af1158015611c38573d5f803e3d5ffd5b50505050611c4a60108888845f6139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f60922014988035600ca3a12a623206cc9ddebf14a95e0829feb779ad972a65789060800161095f565b5f610fff611cac858261398e565b5f611cb78660081c90565b9050600160f81b80851690819003611d435760088260ff161115611d435760405162461bcd60e51b815260206004820152603e60248201527f5363616c617220666865457120666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f6164656420666865457100006064820152608401610af2565b60405163709c098f60e11b815233600482015260ff831660248201526001600160f81b0319821660448201525f805160206150928339815191529063e138131e906064015f604051808303815f87803b158015611d9e575f80fd5b505af1158015611db0573d5f803e3d5ffd5b50505050611dc2600c8888845f6139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f64ec7877f22d6fdca08285a604b343d39c022789c65e3bedb5229f121bb7f3e99060800161095f565b611e1e6140a6565b611e275f6140d8565b565b3380611e336131b5565b6001600160a01b031614611e655760405163118cdaa760e01b81526001600160a01b0382166004820152602401610af2565b611e6e816140d8565b50565b5f61017e611e7f858261398e565b5f611e8a8660081c90565b604051632be8dd7960e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061509283398151915290632be8dd79906064015f604051808303815f87803b158015611ee6575f80fd5b505af1158015611ef8573d5f803e3d5ffd5b50505050611f0a6002888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f0989d2283d5ee26a114f8459c51f9da4cda53751648900a1b7fecc5c6952f0239060800161095f565b5f61017e611f6c858261398e565b5f611f778660081c90565b604051633968721960e11b815233600482015260ff82166024820152600160f81b8616604482018190529192505f80516020615092833981519152906372d0e432906064015f604051808303815f87803b158015611fd3575f80fd5b505af1158015611fe5573d5f803e3d5ffd5b50505050611ff76008888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f9ebe62c7110336cba03426473780c0102203aeb00d3123672eba9c2bb878cb549060800161095f565b5f61017e612059858261398e565b5f6120648660081c90565b6040516303ed3f3160e51b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061509283398151915290637da7e620906064015f604051808303815f87803b1580156120c0575f80fd5b505af11580156120d2573d5f803e3d5ffd5b505050506120e46001888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f6474889e10e183464e682cafbc5957864fb8682dc51a102779cabc8fc2499c1e9060800161095f565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f7fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e00610f7f60f884901c6001811b82166121e85760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606401610af2565b6040516302cccbd160e21b815233600482015260ff821660248201525f8051602061509283398151915290630b332f44906044015f604051808303815f87803b158015612233575f80fd5b505af1158015612245573d5f803e3d5ffd5b505084545f925090505f805160206150b283398151915246612268600143614e6d565b60408051602081019590955260609390931b6bffffffffffffffffffffffff191692840192909252605483015240607482015242609482015260b401604051602081830303815290604052805190602001209050601a86826040516020016122d293929190614e80565b60408051601f198184030181529190528051602090910120945061ffff198516600883901b61ff0016176040516346ce4e4960e11b8152600481018290523360248201529095505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015612348575f80fd5b505af115801561235a573d5f803e3d5ffd5b5050855491508590505f61236d83614ebc565b9091555050604080516001600160f81b031988168152602081018790527ff8c2522b360452dbfbd5bcbe526855aff6b9d028ee4caee8d2642a996cc29062910160405180910390a150505050919050565b5f61017e6123cc858261398e565b5f6123d78660081c90565b60405163466ac06560e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206150928339815191529063466ac065906064015f604051808303815f87803b158015612433575f80fd5b505af1158015612445573d5f803e3d5ffd5b5050505061245760118888845f6139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f2bee1dac90f17bc8b79a023dfb22222b8786d8f30dfabfd8e49def6388b3b8889060800161095f565b5f61017e6124b9858261398e565b5f6124c48660081c90565b604051631ade267d60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061509283398151915290631ade267d906064015f604051808303815f87803b158015612520575f80fd5b505af1158015612532573d5f803e3d5ffd5b505050506125446013888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f411ff36379fe7481c69a4c1a025dcdd04aa4165c7dd55863adc2a33503a1ca7f9060800161095f565b5f61017e6125a6858261398e565b5f6125b18660081c90565b604051630ad2336160e41b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206150928339815191529063ad233610906064015f604051808303815f87803b15801561260d575f80fd5b505af115801561261f573d5f803e3d5ffd5b505050506126316012888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f18267ba238338c85ae081777c793518e79a4878da40902f2a0d9bc6d2be8834e9060800161095f565b5f61017e612693838261398e565b5f61269e8460081c90565b6040516313ed41db60e31b815233600482015260ff821660248201529091505f8051602061509283398151915290639f6a0ed8906044015f604051808303815f87803b1580156126ec575f80fd5b505af11580156126fe573d5f803e3d5ffd5b5050505061270d601485613d4c565b60408051868152602081018390529194507fd44a29b8a904963175fc3746c74fbb91ee1632a7e14e9a0e6be53398529acf6c9101610f9f565b5f610e00612754858261398e565b5f61275f8660081c90565b9050600160f81b8085169081146127de5760405162461bcd60e51b815260206004820152603c60248201527f4f7665726c6f61646564206668654571206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608401610af2565b60405163709c098f60e11b815233600482015260ff831660248201526001600160f81b0319821660448201525f805160206150928339815191529063e138131e906064015f604051808303815f87803b158015612839575f80fd5b505af115801561284b573d5f803e3d5ffd5b5050604051632fd514cd60e11b8152600481018a90523360248201525f805160206150b28339815191529250635faa299a9150604401602060405180830381865afa15801561289c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c09190614c17565b61290c5760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610af2565b855160ff8316600903612981578060401461297c5760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610af2565b612a57565b8260ff16600a036129f1578060801461297c5760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610af2565b8061010014612a575760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610af2565b600c8888845f805160206150b283398151915246604051602001612a8096959493929190614c59565b60408051601f198184030181529190528051602090910120945061ffff1985166040516346ce4e4960e11b8152600481018290523360248201529095505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015612aec575f80fd5b505af1158015612afe573d5f803e3d5ffd5b505050507fdb01345c4f3b7bd8896dfe2c115602dc067bcb66e6140ac6a28555d9c228c30d88888888604051610e549493929190614cc1565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015612b815750825b90505f8267ffffffffffffffff166001148015612b9d5750303b155b905081158015612bab575080155b15612bc95760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315612bfd57845468ff00000000000000001916680100000000000000001785555b612c0686614110565b8315612c5157845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f610fff612c67848261398e565b5f612c728560081c90565b60405163d5f0797d60e01b815233600482015260ff821660248201529091505f805160206150928339815191529063d5f0797d906044015f604051808303815f87803b158015612cc0575f80fd5b505af1158015612cd2573d5f803e3d5ffd5b50505050612ce36019878787614121565b6040805188815260208101889052908101869052606081018290529093507fcb2748038781ebdf91e7fb61259ffa009fa4d389ff38772b0784b45803b527f39060800160405180910390a150509392505050565b5f600160f81b80831614612d995760405162461bcd60e51b8152602060048201526024808201527f4f6e6c792066686552656d2062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608401610af2565b825f03612de85760405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606401610af2565b61017e612df5858261398e565b5f612e008660081c90565b6040516317f83edb60e31b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206150928339815191529063bfc1f6d8906064015f604051808303815f87803b158015612e5c575f80fd5b505af1158015612e6e573d5f803e3d5ffd5b50505050612e806004888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507f5955bd79cf32dbacc40c6b8d59b5ed35e027bfbef26c4e9db048b41a3778e16b9060800161095f565b5f610e0060f883901c6001811b8216612f225760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610af2565b60405163100747ad60e01b815233600482015260ff821660248201525f805160206150928339815191529063100747ad906044015f604051808303815f87803b158015612f6d575f80fd5b505af1158015612f7f573d5f803e3d5ffd5b5050865191505060ff8216600903612ff95780604014612ff45760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610af2565b6130cf565b8160ff16600a036130695780608014612ff45760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610af2565b80610100146130cf5760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610af2565b601886865f805160206150b2833981519152466040516020016130f6959493929190614ed4565b60408051601f198184030181529190528051602090910120935061ffff198416600883901b61ff0016176040516346ce4e4960e11b8152600481018290523360248201529094505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b15801561316c575f80fd5b505af115801561317e573d5f803e3d5ffd5b505050507f1113c34f59d2144e0abd8d37fb966653a61c15142afe3c606cafbb4bbc05f485868686604051611a6693929190614f35565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0061215c565b5f6101ff60f883901c6001811b821661322b5760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610af2565b60405163100747ad60e01b815233600482015260ff821660248201525f805160206150928339815191529063100747ad906044015f604051808303815f87803b158015613276575f80fd5b505af1158015613288573d5f803e3d5ffd5b50505050601885855f805160206150b2833981519152466040516020016132b3959493929190614e11565b60408051601f198184030181529190528051602090910120925061ffff198316600882901b61ff0016176040516346ce4e4960e11b8152600481018290523360248201529093505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015613329575f80fd5b505af115801561333b573d5f803e3d5ffd5b5050604080518881526001600160f81b0319881660208201529081018690527f11218712ed0401394352868fe9038b5e6ccbf9724007fd2c6757618044885b349250606001905060405180910390a1505092915050565b5f61017f6133a0858261398e565b5f6133ab8660081c90565b604051633980607d60e11b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061509283398151915290637300c0fa906064015f604051808303815f87803b158015613407575f80fd5b505af1158015613419573d5f803e3d5ffd5b5050505061342b6006888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507fe34d43146b8cd59adb8714914fcb0a11b9c117dfe923edb15c7d929361ce11f89060800161095f565b5f61017e61348d858261398e565b5f6134988660081c90565b6040516307dbdabb60e21b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061509283398151915290631f6f6aec906064015f604051808303815f87803b1580156134f4575f80fd5b505af1158015613506573d5f803e3d5ffd5b505050506135186009888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507fdbd92baa847015c4d6cd3a7a5baeb65aaedeb3f4598aedcadd6062107f0453189060800161095f565b6135746140a6565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b03831690811782556135b8612138565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b5f61017e6135ff858261398e565b5f61360a8660081c90565b6040516327af38ad60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f80516020615092833981519152906327af38ad906064015f604051808303815f87803b158015613666575f80fd5b505af1158015613678573d5f803e3d5ffd5b505050506136895f888884866139e8565b60408051898152602081018990526001600160f81b0319881691810191909152606081018290529094507fca101b6655df270ab4c630a5cd2c2df7b974e16b2d53387ce9ed51591f7742ed9060800161095f565b5f7fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e0061017e60f884901c6001811b82166137595760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606401610af2565b6137628661450c565b6137ae5760405162461bcd60e51b815260206004820152601f60248201527f5570706572426f756e64206d757374206265206120706f776572206f662032006044820152606401610af2565b604051639bf5592160e01b815233600482015260ff821660248201525f8051602061509283398151915290639bf55921906044015f604051808303815f87803b1580156137f9575f80fd5b505af115801561380b573d5f803e3d5ffd5b505084545f925090505f805160206150b28339815191524661382e600143614e6d565b60408051602081019590955260609390931b6bffffffffffffffffffffffff191692840192909252605483015240607482015242609482015260b401604051602081830303815290604052805190602001209050601b87878360405160200161389a9493929190614f63565b60408051601f198184030181529190528051602090910120945061ffff198516600883901b61ff0016176040516346ce4e4960e11b8152600481018290523360248201529095505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015613910575f80fd5b505af1158015613922573d5f803e3d5ffd5b5050855491508590505f61393583614ebc565b9091555050604080518881526001600160f81b0319881660208201529081018690527f92331e27bd97df8f1490a60822d7d55e23a39dcbf856ff4ad171be686e9df97b9060600160405180910390a15050505092915050565b5f6139998360081c90565b9050600160ff82161b82166139e35760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610af2565b505050565b604051632fd514cd60e11b8152600481018590523360248201525f905f805160206150b283398151915290635faa299a90604401602060405180830381865afa158015613a37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a5b9190614c17565b613aa75760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610af2565b6001600160f81b031983165f03613bf257604051632fd514cd60e11b8152600481018590523360248201525f805160206150b283398151915290635faa299a90604401602060405180830381865afa158015613b05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b299190614c17565b613b755760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606401610af2565b5f613b808560081c90565b90505f613b8d8760081c90565b90508160ff168160ff1614613bef5760405162461bcd60e51b815260206004820152602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608401610af2565b50505b858585855f805160206150b283398151915246604051602001613c1a96959493929190614fa7565b60408051601f198184030181529190528051602090910120905061ffff198116600883901b61ff0016176040516346ce4e4960e11b8152600481018290523360248201529091505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015613c90575f80fd5b505af1158015613ca2573d5f803e3d5ffd5b5050505095945050505050565b60605f613cbb8361452c565b60010190505f8167ffffffffffffffff811115613cda57613cda61492e565b6040519080825280601f01601f191660200182016040528015613d04576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084613d0e57509392505050565b604051632fd514cd60e11b8152600481018290523360248201525f905f805160206150b283398151915290635faa299a90604401602060405180830381865afa158015613d9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dbf9190614c17565b613e0b5760405162461bcd60e51b815260206004820152601b60248201527f53656e64657220646f65736e2774206f776e206374206f6e206f7000000000006044820152606401610af2565b82825f805160206150b283398151915246604051602001613e2f9493929190614ff7565b604051602081830303815290604052805190602001205f1c90505f613e548360081c90565b905061ffff198216600882901b61ff0016176040516346ce4e4960e11b8152600481018290523360248201529092505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b158015613eb2575f80fd5b505af1158015613ec4573d5f803e3d5ffd5b505050505092915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480613f6857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316613f5c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15611e275760405163703e46dd60e11b815260040160405180910390fd5b611e6e6140a6565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613fe8575060408051601f3d908101601f19168201909252613fe591810190614db5565b60015b61401057604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610af2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461405357604051632a87526960e21b815260048101829052602401610af2565b6139e3838361460d565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e275760405163703e46dd60e11b815260040160405180910390fd5b336140af612138565b6001600160a01b031614611e275760405163118cdaa760e01b8152336004820152602401610af2565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319168155611a9282614662565b6141186146d2565b611e6e81614720565b604051632fd514cd60e11b8152600481018490523360248201525f905f805160206150b283398151915290635faa299a90604401602060405180830381865afa158015614170573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141949190614c17565b6141e05760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610af2565b604051632fd514cd60e11b8152600481018490523360248201525f805160206150b283398151915290635faa299a90604401602060405180830381865afa15801561422d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142519190614c17565b61429d5760405162461bcd60e51b815260206004820152601f60248201527f53656e64657220646f65736e2774206f776e206d6964646c65206f6e206f70006044820152606401610af2565b604051632fd514cd60e11b8152600481018390523360248201525f805160206150b283398151915290635faa299a90604401602060405180830381865afa1580156142ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061430e9190614c17565b61435a5760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606401610af2565b5f6143658560081c90565b90505f6143728560081c90565b90505f61437f8560081c90565b905060ff8316156143d25760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564207479706520666f72206c687300000000000000006044820152606401610af2565b8060ff168260ff161461444d5760405162461bcd60e51b815260206004820152602560248201527f496e636f6d70617469626c6520747970657320666f72206d6964646c6520616e60448201527f64207268730000000000000000000000000000000000000000000000000000006064820152608401610af2565b878787875f805160206150b28339815191524660405160200161447596959493929190615030565b60408051601f198184030181529190528051602090910120935061ffff198416600883901b61ff0016176040516346ce4e4960e11b8152600481018290523360248201529094505f805160206150b283398151915290638d9c9c92906044015f604051808303815f87803b1580156144eb575f80fd5b505af11580156144fd573d5f803e3d5ffd5b50505050505050949350505050565b5f80821180156145265750614522600183614e6d565b8216155b92915050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310614574577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106145a0576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106145be57662386f26fc10000830492506010015b6305f5e10083106145d6576305f5e100830492506008015b61271083106145ea57612710830492506004015b606483106145fc576064830492506002015b600a83106145265760010192915050565b61461682614751565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561465a576139e382826147c7565b611a92614839565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16611e2757604051631afcd79f60e31b815260040160405180910390fd5b6147286146d2565b6001600160a01b038116611e6557604051631e4fbdf760e01b81525f6004820152602401610af2565b806001600160a01b03163b5f0361478657604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610af2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516147e39190615076565b5f60405180830381855af49150503d805f811461481b576040519150601f19603f3d011682016040523d82523d5f602084013e614820565b606091505b5091509150614830858383614858565b95945050505050565b3415611e275760405163b398979f60e01b815260040160405180910390fd5b60608261486d57614868826148b7565b6148b0565b815115801561488457506001600160a01b0384163b155b156148ad57604051639996b31560e01b81526001600160a01b0385166004820152602401610af2565b50805b9392505050565b8051156148c75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160f81b0319811681146148f7575f80fd5b919050565b5f805f6060848603121561490e575f80fd5b8335925060208401359150614925604085016148e0565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112614951575f80fd5b813567ffffffffffffffff8082111561496c5761496c61492e565b604051601f8301601f19908116603f011681019082821181831017156149945761499461492e565b816040528381528660208588010111156149ac575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f606084860312156149dd575f80fd5b83359250602084013567ffffffffffffffff8111156149fa575f80fd5b614a0686828701614942565b925050614925604085016148e0565b5f5b83811015614a2f578181015183820152602001614a17565b50505f910152565b5f8151808452614a4e816020860160208601614a15565b601f01601f19169290920160200192915050565b602081525f6148b06020830184614a37565b5f60208284031215614a84575f80fd5b5035919050565b80356001600160a01b03811681146148f7575f80fd5b5f805f8060808587031215614ab4575f80fd5b84359350614ac460208601614a8b565b9250604085013567ffffffffffffffff811115614adf575f80fd5b614aeb87828801614942565b925050614afa606086016148e0565b905092959194509250565b5f8060408385031215614b16575f80fd5b82359150614b26602084016148e0565b90509250929050565b5f8060408385031215614b40575f80fd5b614b4983614a8b565b9150602083013567ffffffffffffffff811115614b64575f80fd5b614b7085828601614942565b9150509250929050565b5f60208284031215614b8a575f80fd5b6148b0826148e0565b5f60208284031215614ba3575f80fd5b6148b082614a8b565b5f805f60608486031215614bbe575f80fd5b505081359360208301359350604090920135919050565b5f8060408385031215614be6575f80fd5b823567ffffffffffffffff811115614bfc575f80fd5b614c0885828601614942565b925050614b26602084016148e0565b5f60208284031215614c27575f80fd5b815180151581146148b0575f80fd5b601c8110614c5257634e487b7160e01b5f52602160045260245ffd5b60f81b9052565b614c638188614c36565b8560018201525f8551614c7d816021850160208a01614a15565b6001600160f81b0319959095166021929095019182019490945260609290921b6bffffffffffffffffffffffff191660228301526036820152605601949350505050565b848152608060208201525f614cd96080830186614a37565b6001600160f81b0319949094166040830152506060015292915050565b5f8551614d07818460208a01614a15565b61103b60f11b9083019081528551614d26816002840160208a01614a15565b808201915050601760f91b8060028301528551614d4a816003850160208a01614a15565b60039201918201528351614d65816004840160208801614a15565b016004019695505050505050565b5f6001600160a01b038086511683528060208701511660208401528060408701511660408401525083606083015260a0608083015261483060a0830184614a37565b5f60208284031215614dc5575f80fd5b5051919050565b8581526001600160a01b038516602082015260a060408201525f614df360a0830186614a37565b6001600160f81b031994909416606083015250608001529392505050565b614e1b8187614c36565b60018101949094526001600160f81b031992909216602184015260601b6bffffffffffffffffffffffff191660228301526036820152605601919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561452657614526614e59565b614e8a8185614c36565b6001600160f81b03199290921660018301526fffffffffffffffffffffffffffffffff19166002820152601201919050565b5f60018201614ecd57614ecd614e59565b5060010190565b614ede8187614c36565b5f8551614ef2816001850160208a01614a15565b6001600160f81b0319959095166001929095019182019490945260609290921b6bffffffffffffffffffffffff1916600283015260168201526036019392505050565b606081525f614f476060830186614a37565b6001600160f81b03199490941660208301525060400152919050565b614f6d8186614c36565b60018101939093526001600160f81b03199190911660218301526fffffffffffffffffffffffffffffffff19166022820152603201919050565b614fb18188614c36565b600181019590955260218501939093526001600160f81b031991909116604184015260601b6bffffffffffffffffffffffff191660428301526056820152607601919050565b6150018186614c36565b600181019390935260609190911b6bffffffffffffffffffffffff191660218301526035820152605501919050565b61503a8188614c36565b60018101959095526021850193909352604184019190915260601b6bffffffffffffffffffffffff191660618301526075820152609501919050565b5f8251615087818460208701614a15565b919091019291505056fe0000000000000000000000006d5a11ac509c707c00bc3a0a113accc26c532547000000000000000000000000339ece85b9e11a3a3aa557582784a15d7f82aaf2a164736f6c6343000818000a"; + "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051615238620001005f395f8181612597015281816125c0015261272a01526152385ff3fe6080604052600436106102e2575f3560e01c806389a4314b11610186578063c4d66de8116100dc578063ec4057dc11610087578063f6859bdc11610062578063f6859bdc1461081a578063f953e42714610840578063fa33b7af1461085f575f80fd5b8063ec4057dc146107bd578063eee1833c146107dc578063f2fde38b146107fb575f80fd5b8063e0c5cbb3116100b7578063e0c5cbb31461076b578063e30c39781461078a578063e71746b81461079e575f80fd5b8063c4d66de81461070e578063cb3b94071461072d578063e0c516ae1461074c575f80fd5b8063a86e9de51161013c578063a8c7c2c111610117578063a8c7c2c114610681578063ad3cb1cc146106a7578063bc47139a146106ef575f80fd5b8063a86e9de514610624578063a87deac414610643578063a8b42a8914610662575f80fd5b80638da5cb5b1161016c5780638da5cb5b146105d2578063900d294e146105e65780639675211f14610605575f80fd5b806389a4314b146105945780638c14cc21146105b3575f80fd5b806344ae9c5c1161023b578063694daf72116101f1578063715018a6116101cc578063715018a61461054d57806379ba509714610561578063816d57d314610575575f80fd5b8063694daf72146104ea5780636a8c8eb4146105095780636be317581461052e575f80fd5b80634f1ef286116102215780634f1ef286146104a257806352d1902d146104b7578063666a3588146104cb575f80fd5b806344ae9c5c146104645780634be68d2014610483575f80fd5b8063192710811161029b5780632e817ff0116102765780632e817ff01461040757806336cdd31b146104265780633e63c50a14610445575f80fd5b80631927108114610396578063275e36bf146103b55780632c7d67b7146103e8575f80fd5b80630b90dfc3116102cb5780630b90dfc3146103375780630d8e6e2c1461035657806313801ffa14610377575f80fd5b8063052896f1146102e65780630590734314610318575b5f80fd5b3480156102f1575f80fd5b50610305610300366004614a76565b61087e565b6040519081526020015b60405180910390f35b348015610323575f80fd5b50610305610332366004614a76565b6108e9565b348015610342575f80fd5b50610305610351366004614b45565b610949565b348015610361575f80fd5b5061036a61098c565b60405161030f9190614bdc565b348015610382575f80fd5b50610305610391366004614bee565b610a07565b3480156103a1575f80fd5b506103056103b0366004614a76565b610a53565b3480156103c0575f80fd5b505f8051602061520c8339815191525b6040516001600160a01b03909116815260200161030f565b3480156103f3575f80fd5b50610305610402366004614a76565b610ab3565b348015610412575f80fd5b50610305610421366004614c1b565b610b13565b348015610431575f80fd5b50610305610440366004614a76565b610b69565b348015610450575f80fd5b5061030561045f366004614a76565b610bc9565b34801561046f575f80fd5b5061030561047e366004614a76565b610c29565b34801561048e575f80fd5b5061030561049d366004614c7f565b610c89565b6104b56104b0366004614ca9565b610ce8565b005b3480156104c2575f80fd5b50610305610d07565b3480156104d6575f80fd5b506103056104e5366004614a76565b610d35565b3480156104f5575f80fd5b50610305610504366004614a76565b610d95565b348015610514575f80fd5b5061051c5f81565b60405160ff909116815260200161030f565b348015610539575f80fd5b50610305610548366004614a76565b610df5565b348015610558575f80fd5b506104b5610e55565b34801561056c575f80fd5b506104b5610e68565b348015610580575f80fd5b5061030561058f366004614a76565b610eb5565b34801561059f575f80fd5b506103056105ae366004614a76565b610f15565b3480156105be575f80fd5b506103056105cd366004614a76565b610f75565b3480156105dd575f80fd5b506103d0610fd5565b3480156105f1575f80fd5b50610305610600366004614cf4565b611009565b348015610610575f80fd5b5061030561061f366004614a76565b611056565b34801561062f575f80fd5b5061030561063e366004614a76565b6110b6565b34801561064e575f80fd5b5061030561065d366004614a76565b611116565b34801561066d575f80fd5b5061030561067c366004614bee565b611176565b34801561068c575f80fd5b507369de3158643e738a0724418b21a35faa20cbb1c56103d0565b3480156106b2575f80fd5b5061036a6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156106fa575f80fd5b50610305610709366004614b45565b6111b9565b348015610719575f80fd5b506104b5610728366004614d0d565b6111fc565b348015610738575f80fd5b50610305610747366004614d26565b61131e565b348015610757575f80fd5b50610305610766366004614a76565b611372565b348015610776575f80fd5b50610305610785366004614d4f565b6113d2565b348015610795575f80fd5b506103d0611412565b3480156107a9575f80fd5b506103056107b8366004614c7f565b61143a565b3480156107c8575f80fd5b506103056107d7366004614a76565b61148f565b3480156107e7575f80fd5b506103056107f6366004614a76565b6114ef565b348015610806575f80fd5b506104b5610815366004614d0d565b61154f565b348015610825575f80fd5b5073339ece85b9e11a3a3aa557582784a15d7f82aaf26103d0565b34801561084b575f80fd5b5061030561085a366004614a76565b6115d4565b34801561086a575f80fd5b50610305610879366004614c7f565b611634565b5f61088a848484611689565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f917801ccb010364b80d82085948b6ce1f7231e1e6950253ca1134a2dace31132906080015b60405180910390a19392505050565b5f6108f584848461172c565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507ff58687e1e87ebb2fe49b53f406501933e51bed3f62e278ac0bf3203a26a9e2e9906080016108da565b5f6109558484846117c5565b90507f5b7bbda9449c32c1d56a33ee9be18d67a28f5faead25db7ab04fa217000cecf7848484846040516108da9493929190614d91565b60606040518060400160405280600c81526020017f544648454578656375746f7200000000000000000000000000000000000000008152506109cd5f611ba1565b6109d76001611ba1565b6109e05f611ba1565b6040516020016109f39493929190614dc6565b604051602081830303815290604052905090565b5f610a1182611c3e565b60408051848152602081018390529192507f9a9785c912b1ce9b03afbd78573bd048c160bd5a489c02f52a3eb9703a718f2491015b60405180910390a1919050565b5f610a5f848484611cce565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507fd43ba81a7c94579d65cbb7db5db8dcf366ff05bdecd1d927fcc99840c68571a5906080016108da565b5f610abf848484611df2565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f31a58348e92aca95ce44cfea2a1066053d8807feb5ed9bbdfe95e13a622e21f2906080016108da565b5f610b2085858585611e8b565b90507f777462f58dda134f765b89f211d136b25f0d06d218cb2c311f1c43f2a2392b498585858585604051610b59959493929190614e43565b60405180910390a1949350505050565b5f610b75848484612016565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f9968f8dbde1f175af00b6630b7b30747c77be278fd2e64c281458c0d47008431906080016108da565b5f610bd584848461215f565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507fa0da53ac7741df5d78f645cb77e6577ba9e246906a77e17286f285a916dff708906080016108da565b5f610c358484846121f8565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507fd42970039fe3f91ed8c5a4aea3d626defdb62b542b70d6f0dd2b56fcfac120f5906080016108da565b5f610c948383612291565b604080518581526001600160f81b0319851660208201529081018290529091507fce79b6444dc9b93ecddbc13b55eaecf50a20eb779fa5b59f358bd16ab82a9667906060015b60405180910390a192915050565b610cf061258c565b610cf982612643565b610d03828261264b565b5050565b5f610d1061271f565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f610d41848484612768565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f419268c57bdb686c5c3a209be649f9884f7c21b28195fe7c5849e62e55171314906080016108da565b5f610da1848484612801565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f60922014988035600ca3a12a623206cc9ddebf14a95e0829feb779ad972a6578906080016108da565b5f610e0184848461289a565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f64ec7877f22d6fdca08285a604b343d39c022789c65e3bedb5229f121bb7f3e9906080016108da565b610e5d6129be565b610e665f6129f0565b565b3380610e72611412565b6001600160a01b031614610ea95760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b610eb2816129f0565b50565b5f610ec1848484612a28565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f0989d2283d5ee26a114f8459c51f9da4cda53751648900a1b7fecc5c6952f023906080016108da565b5f610f21848484612ac1565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f9ebe62c7110336cba03426473780c0102203aeb00d3123672eba9c2bb878cb54906080016108da565b5f610f81848484612b5a565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f6474889e10e183464e682cafbc5957864fb8682dc51a102779cabc8fc2499c1e906080016108da565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f61101382612bf3565b604080516001600160f81b031985168152602081018390529192507ff8c2522b360452dbfbd5bcbe526855aff6b9d028ee4caee8d2642a996cc290629101610a46565b5f611062848484612e10565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f2bee1dac90f17bc8b79a023dfb22222b8786d8f30dfabfd8e49def6388b3b888906080016108da565b5f6110c2848484612ea9565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f411ff36379fe7481c69a4c1a025dcdd04aa4165c7dd55863adc2a33503a1ca7f906080016108da565b5f611122848484612f42565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f18267ba238338c85ae081777c793518e79a4878da40902f2a0d9bc6d2be8834e906080016108da565b5f61118082612fdb565b60408051848152602081018390529192507fd44a29b8a904963175fc3746c74fbb91ee1632a7e14e9a0e6be53398529acf6c9101610a46565b5f6111c5848484613063565b90507fdb01345c4f3b7bd8896dfe2c115602dc067bcb66e6140ac6a28555d9c228c30d848484846040516108da9493929190614d91565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f811580156112465750825b90505f8267ffffffffffffffff1660011480156112625750303b155b905081158015611270575080155b1561128e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156112c257845468ff00000000000000001916680100000000000000001785555b6112cb866133ab565b831561131657845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f61132a8484846133bc565b6040805186815260208101869052908101849052606081018290529091507fcb2748038781ebdf91e7fb61259ffa009fa4d389ff38772b0784b45803b527f3906080016108da565b5f61137e848484613450565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507f5955bd79cf32dbacc40c6b8d59b5ed35e027bfbef26c4e9db048b41a3778e16b906080016108da565b5f6113dd8383613599565b90507f1113c34f59d2144e0abd8d37fb966653a61c15142afe3c606cafbb4bbc05f485838383604051610cda93929190614e88565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610ff9565b5f61144583836137f1565b604080518581526001600160f81b0319851660208201529081018290529091507f11218712ed0401394352868fe9038b5e6ccbf9724007fd2c6757618044885b3490606001610cda565b5f61149b848484613969565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507fe34d43146b8cd59adb8714914fcb0a11b9c117dfe923edb15c7d929361ce11f8906080016108da565b5f6114fb848484613a02565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507fdbd92baa847015c4d6cd3a7a5baeb65aaedeb3f4598aedcadd6062107f045318906080016108da565b6115576129be565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b038316908117825561159b610fd5565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b5f6115e0848484613a9b565b60408051868152602081018690526001600160f81b0319851691810191909152606081018290529091507fca101b6655df270ab4c630a5cd2c2df7b974e16b2d53387ce9ed51591f7742ed906080016108da565b5f61163f8383613b33565b604080518581526001600160f81b0319851660208201529081018290529091507f92331e27bd97df8f1490a60822d7d55e23a39dcbf856ff4ad171be686e9df97b90606001610cda565b5f61017e6116978582613da8565b5f6116a28660081c90565b60405162fabc1960e21b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c833981519152906303eaf064906064015f604051808303815f87803b1580156116fd575f80fd5b505af115801561170f573d5f803e3d5ffd5b50505050611721600e8888845f613dfd565b979650505050505050565b5f61017e61173a8582613da8565b5f6117458660081c90565b60405163b25fd54760e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c8339815191529063b25fd547906064015f604051808303815f87803b1580156117a1575f80fd5b505af11580156117b3573d5f803e3d5ffd5b50505050611721600a88888486613dfd565b5f610e006117d38582613da8565b5f6117de8660081c90565b9050600160f81b80851690811461185d5760405162461bcd60e51b815260206004820152603c60248201527f4f7665726c6f61646564206668654e65206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608401610ea0565b6040516399841ed760e01b815233600482015260ff831660248201526001600160f81b0319821660448201525f8051602061520c833981519152906399841ed7906064015f604051808303815f87803b1580156118b8575f80fd5b505af11580156118ca573d5f803e3d5ffd5b5050604051632fd514cd60e11b8152600481018a905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf29250635faa299a9150604401602060405180830381865afa158015611922573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119469190614eb6565b6119925760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610ea0565b855160ff8316600903611a075780604014611a025760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610ea0565b611add565b8260ff16600a03611a775780608014611a025760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610ea0565b8061010014611add5760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610ea0565b600d88888473339ece85b9e11a3a3aa557582784a15d7f82aaf246604051602001611b0d96959493929190614ef8565b60408051601f198184030181529190528051602090910120945061ffff1985166040516346ce4e4960e11b81526004810182905233602482015290955073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015611b80575f80fd5b505af1158015611b92573d5f803e3d5ffd5b50505050505050509392505050565b60605f611bad836140e0565b60010190505f8167ffffffffffffffff811115611bcc57611bcc614aa8565b6040519080825280601f01601f191660200182016040528015611bf6576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084611c0057509392505050565b5f61017f611c4c8382613da8565b5f611c578460081c90565b60405163aa43b7f960e01b815233600482015260ff821660248201529091505f8051602061520c8339815191529063aa43b7f9906044015f604051808303815f87803b158015611ca5575f80fd5b505af1158015611cb7573d5f803e3d5ffd5b50505050611cc66015856141c2565b949350505050565b5f610fff611cdc8582613da8565b5f611ce78660081c90565b9050600160f81b80851690819003611d735760088260ff161115611d735760405162461bcd60e51b815260206004820152603e60248201527f5363616c6172206668654e6520666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f61646564206668654e6500006064820152608401610ea0565b6040516399841ed760e01b815233600482015260ff831660248201526001600160f81b0319821660448201525f8051602061520c833981519152906399841ed7906064015f604051808303815f87803b158015611dce575f80fd5b505af1158015611de0573d5f803e3d5ffd5b50505050611721600d8888845f613dfd565b5f61017f611e008582613da8565b5f611e0b8660081c90565b60405163473dceed60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c8339815191529063473dceed906064015f604051808303815f87803b158015611e67575f80fd5b505af1158015611e79573d5f803e3d5ffd5b50505050611721600788888486613dfd565b6040805160608101825273339ece85b9e11a3a3aa557582784a15d7f82aaf281526001600160a01b038516602082015233918101919091525f9081611ed08760081c90565b905060f884901c60ff821614611f285760405162461bcd60e51b815260206004820152600a60248201527f57726f6e672074797065000000000000000000000000000000000000000000006044820152606401610ea0565b604051634d52c10760e01b81527369de3158643e738a0724418b21a35faa20cbb1c590634d52c10790611f639085908b908a90600401614f60565b6020604051808303815f875af1158015611f7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fa39190614fa2565b6040516346ce4e4960e11b81526004810182905233602482015290935073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015611ff6575f80fd5b505af1158015612008573d5f803e3d5ffd5b505050505050949350505050565b5f600160f81b808316146120785760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206668654469762062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608401610ea0565b825f036120c75760405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606401610ea0565b61017e6120d48582613da8565b5f6120df8660081c90565b60405163f7eaec6360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c8339815191529063f7eaec63906064015f604051808303815f87803b15801561213b575f80fd5b505af115801561214d573d5f803e3d5ffd5b50505050611721600388888486613dfd565b5f61017e61216d8582613da8565b5f6121788660081c90565b604051638638282b60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c83398151915290638638282b906064015f604051808303815f87803b1580156121d4575f80fd5b505af11580156121e6573d5f803e3d5ffd5b50505050611721600f8888845f613dfd565b5f61017e6122068582613da8565b5f6122118660081c90565b6040516313f3d32960e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c833981519152906313f3d329906064015f604051808303815f87803b15801561226d575f80fd5b505af115801561227f573d5f803e3d5ffd5b50505050611721600b88888486613dfd565b604051632fd514cd60e11b8152600481018390523360248201525f9073339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa1580156122e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230b9190614eb6565b6123575760405162461bcd60e51b815260206004820152601d60248201527f53656e64657220646f65736e2774206f776e206374206f6e20636173740000006044820152606401610ea0565b61017f6123648482613da8565b61017e600160f885901c1b81166123bd5760405162461bcd60e51b815260206004820152601760248201527f556e737570706f72746564206f757470757420747970650000000000000000006044820152606401610ea0565b5f6123c88660081c90565b9050847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168160f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036124605760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206361737420746f2073616d65207479706500000000000000006044820152606401610ea0565b604051630cea149360e41b815233600482015260ff821660248201525f8051602061520c8339815191529063cea14930906044015f604051808303815f87803b1580156124ab575f80fd5b505af11580156124bd573d5f803e3d5ffd5b505050506017868673339ece85b9e11a3a3aa557582784a15d7f82aaf2466040516020016124ef959493929190614fb9565b60408051601f198184030181529190528051602090910120935061ffff19841660f086901c61ff0016175b6040516346ce4e4960e11b81526004810182905233602482015290945073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b15801561256d575f80fd5b505af115801561257f573d5f803e3d5ffd5b5050505050505092915050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061262557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166126197f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610e665760405163703e46dd60e11b815260040160405180910390fd5b610eb26129be565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156126a5575060408051601f3d908101601f191682019092526126a291810190614fa2565b60015b6126cd57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ea0565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc811461271057604051632a87526960e21b815260048101829052602401610ea0565b61271a838361435a565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e665760405163703e46dd60e11b815260040160405180910390fd5b5f61017f6127768582613da8565b5f6127818660081c90565b60405163cd2bd00360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c8339815191529063cd2bd003906064015f604051808303815f87803b1580156127dd575f80fd5b505af11580156127ef573d5f803e3d5ffd5b50505050611721600588888486613dfd565b5f61017e61280f8582613da8565b5f61281a8660081c90565b60405163d692278360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c8339815191529063d6922783906064015f604051808303815f87803b158015612876575f80fd5b505af1158015612888573d5f803e3d5ffd5b5050505061172160108888845f613dfd565b5f610fff6128a88582613da8565b5f6128b38660081c90565b9050600160f81b8085169081900361293f5760088260ff16111561293f5760405162461bcd60e51b815260206004820152603e60248201527f5363616c617220666865457120666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f6164656420666865457100006064820152608401610ea0565b60405163709c098f60e11b815233600482015260ff831660248201526001600160f81b0319821660448201525f8051602061520c8339815191529063e138131e906064015f604051808303815f87803b15801561299a575f80fd5b505af11580156129ac573d5f803e3d5ffd5b50505050611721600c8888845f613dfd565b336129c7610fd5565b6001600160a01b031614610e665760405163118cdaa760e01b8152336004820152602401610ea0565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319168155610d03826143af565b5f61017e612a368582613da8565b5f612a418660081c90565b604051632be8dd7960e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c83398151915290632be8dd79906064015f604051808303815f87803b158015612a9d575f80fd5b505af1158015612aaf573d5f803e3d5ffd5b50505050611721600288888486613dfd565b5f61017e612acf8582613da8565b5f612ada8660081c90565b604051633968721960e11b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c833981519152906372d0e432906064015f604051808303815f87803b158015612b36575f80fd5b505af1158015612b48573d5f803e3d5ffd5b50505050611721600888888486613dfd565b5f61017e612b688582613da8565b5f612b738660081c90565b6040516303ed3f3160e51b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c83398151915290637da7e620906064015f604051808303815f87803b158015612bcf575f80fd5b505af1158015612be1573d5f803e3d5ffd5b50505050611721600188888486613dfd565b5f7fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e00610f7f60f884901c6001811b8216612c6f5760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606401610ea0565b6040516302cccbd160e21b815233600482015260ff821660248201525f8051602061520c83398151915290630b332f44906044015f604051808303815f87803b158015612cba575f80fd5b505af1158015612ccc573d5f803e3d5ffd5b505084545f9250905073339ece85b9e11a3a3aa557582784a15d7f82aaf246612cf6600143615015565b60408051602081019590955260609390931b6bffffffffffffffffffffffff191692840192909252605483015240607482015242609482015260b401604051602081830303815290604052805190602001209050601a8682604051602001612d6093929190615028565b60408051601f198184030181529190528051602090910120945061ffff198516600883901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290955073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015612ddd575f80fd5b505af1158015612def573d5f803e3d5ffd5b5050855491508590505f612e0283615064565b919050555050505050919050565b5f61017e612e1e8582613da8565b5f612e298660081c90565b60405163466ac06560e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c8339815191529063466ac065906064015f604051808303815f87803b158015612e85575f80fd5b505af1158015612e97573d5f803e3d5ffd5b5050505061172160118888845f613dfd565b5f61017e612eb78582613da8565b5f612ec28660081c90565b604051631ade267d60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c83398151915290631ade267d906064015f604051808303815f87803b158015612f1e575f80fd5b505af1158015612f30573d5f803e3d5ffd5b50505050611721601388888486613dfd565b5f61017e612f508582613da8565b5f612f5b8660081c90565b604051630ad2336160e41b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c8339815191529063ad233610906064015f604051808303815f87803b158015612fb7575f80fd5b505af1158015612fc9573d5f803e3d5ffd5b50505050611721601288888486613dfd565b5f61017e612fe98382613da8565b5f612ff48460081c90565b6040516313ed41db60e31b815233600482015260ff821660248201529091505f8051602061520c83398151915290639f6a0ed8906044015f604051808303815f87803b158015613042575f80fd5b505af1158015613054573d5f803e3d5ffd5b50505050611cc66014856141c2565b5f610e006130718582613da8565b5f61307c8660081c90565b9050600160f81b8085169081146130fb5760405162461bcd60e51b815260206004820152603c60248201527f4f7665726c6f61646564206668654571206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608401610ea0565b60405163709c098f60e11b815233600482015260ff831660248201526001600160f81b0319821660448201525f8051602061520c8339815191529063e138131e906064015f604051808303815f87803b158015613156575f80fd5b505af1158015613168573d5f803e3d5ffd5b5050604051632fd514cd60e11b8152600481018a905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf29250635faa299a9150604401602060405180830381865afa1580156131c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e49190614eb6565b6132305760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610ea0565b855160ff83166009036132a557806040146132a05760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610ea0565b61337b565b8260ff16600a0361331557806080146132a05760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610ea0565b806101001461337b5760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610ea0565b600c88888473339ece85b9e11a3a3aa557582784a15d7f82aaf246604051602001611b0d96959493929190614ef8565b6133b361441f565b610eb28161446d565b5f610fff6133ca8482613da8565b5f6133d58560081c90565b60405163d5f0797d60e01b815233600482015260ff821660248201529091505f8051602061520c8339815191529063d5f0797d906044015f604051808303815f87803b158015613423575f80fd5b505af1158015613435573d5f803e3d5ffd5b50505050613446601987878761449e565b9695505050505050565b5f600160f81b808316146134b25760405162461bcd60e51b8152602060048201526024808201527f4f6e6c792066686552656d2062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608401610ea0565b825f036135015760405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606401610ea0565b61017e61350e8582613da8565b5f6135198660081c90565b6040516317f83edb60e31b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c8339815191529063bfc1f6d8906064015f604051808303815f87803b158015613575575f80fd5b505af1158015613587573d5f803e3d5ffd5b50505050611721600488888486613dfd565b5f610e0060f883901c6001811b82166135e75760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610ea0565b60405163100747ad60e01b815233600482015260ff821660248201525f8051602061520c8339815191529063100747ad906044015f604051808303815f87803b158015613632575f80fd5b505af1158015613644573d5f803e3d5ffd5b5050865191505060ff82166009036136be57806040146136b95760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610ea0565b613794565b8160ff16600a0361372e57806080146136b95760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610ea0565b80610100146137945760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610ea0565b6018868673339ece85b9e11a3a3aa557582784a15d7f82aaf2466040516020016137c295949392919061507c565b60408051601f198184030181529190528051602090910120935061ffff198416600883901b61ff00161761251a565b5f6101ff60f883901c6001811b821661383f5760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610ea0565b60405163100747ad60e01b815233600482015260ff821660248201525f8051602061520c8339815191529063100747ad906044015f604051808303815f87803b15801561388a575f80fd5b505af115801561389c573d5f803e3d5ffd5b505050506018858573339ece85b9e11a3a3aa557582784a15d7f82aaf2466040516020016138ce959493929190614fb9565b60408051601f198184030181529190528051602090910120925061ffff198316600882901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290935073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b15801561394b575f80fd5b505af115801561395d573d5f803e3d5ffd5b50505050505092915050565b5f61017f6139778582613da8565b5f6139828660081c90565b604051633980607d60e11b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c83398151915290637300c0fa906064015f604051808303815f87803b1580156139de575f80fd5b505af11580156139f0573d5f803e3d5ffd5b50505050611721600688888486613dfd565b5f61017e613a108582613da8565b5f613a1b8660081c90565b6040516307dbdabb60e21b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c83398151915290631f6f6aec906064015f604051808303815f87803b158015613a77575f80fd5b505af1158015613a89573d5f803e3d5ffd5b50505050611721600988888486613dfd565b5f61017e613aa98582613da8565b5f613ab48660081c90565b6040516327af38ad60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f8051602061520c833981519152906327af38ad906064015f604051808303815f87803b158015613b10575f80fd5b505af1158015613b22573d5f803e3d5ffd5b505050506117215f88888486613dfd565b5f7fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e0061017e60f884901c6001811b8216613baf5760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606401610ea0565b613bb8866148ac565b613c045760405162461bcd60e51b815260206004820152601f60248201527f5570706572426f756e64206d757374206265206120706f776572206f662032006044820152606401610ea0565b604051639bf5592160e01b815233600482015260ff821660248201525f8051602061520c83398151915290639bf55921906044015f604051808303815f87803b158015613c4f575f80fd5b505af1158015613c61573d5f803e3d5ffd5b505084545f9250905073339ece85b9e11a3a3aa557582784a15d7f82aaf246613c8b600143615015565b60408051602081019590955260609390931b6bffffffffffffffffffffffff191692840192909252605483015240607482015242609482015260b401604051602081830303815290604052805190602001209050601b878783604051602001613cf794939291906150dd565b60408051601f198184030181529190528051602090910120945061ffff198516600883901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290955073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015613d74575f80fd5b505af1158015613d86573d5f803e3d5ffd5b5050855491508590505f613d9983615064565b91905055505050505092915050565b5f613db38360081c90565b9050600160ff82161b821661271a5760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610ea0565b604051632fd514cd60e11b8152600481018590523360248201525f9073339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa158015613e53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e779190614eb6565b613ec35760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610ea0565b6001600160f81b031983165f0361401557604051632fd514cd60e11b81526004810185905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa158015613f28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f4c9190614eb6565b613f985760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606401610ea0565b5f613fa38560081c90565b90505f613fb08760081c90565b90508160ff168160ff16146140125760405162461bcd60e51b815260206004820152602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608401610ea0565b50505b8585858573339ece85b9e11a3a3aa557582784a15d7f82aaf24660405160200161404496959493929190615121565b60408051601f198184030181529190528051602090910120905061ffff198116600883901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290915073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b1580156140c1575f80fd5b505af11580156140d3573d5f803e3d5ffd5b5050505095945050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310614128577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310614154576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061417257662386f26fc10000830492506010015b6305f5e100831061418a576305f5e100830492506008015b612710831061419e57612710830492506004015b606483106141b0576064830492506002015b600a83106141bc576001015b92915050565b604051632fd514cd60e11b8152600481018290523360248201525f9073339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa158015614218573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061423c9190614eb6565b6142885760405162461bcd60e51b815260206004820152601b60248201527f53656e64657220646f65736e2774206f776e206374206f6e206f7000000000006044820152606401610ea0565b828273339ece85b9e11a3a3aa557582784a15d7f82aaf2466040516020016142b39493929190615171565b604051602081830303815290604052805190602001205f1c90505f6142d88360081c90565b905061ffff198216600882901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290925073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b15801561433d575f80fd5b505af115801561434f573d5f803e3d5ffd5b505050505092915050565b614363826148cb565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156143a75761271a8282614941565b610d036149b3565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610e6657604051631afcd79f60e31b815260040160405180910390fd5b61447561441f565b6001600160a01b038116610ea957604051631e4fbdf760e01b81525f6004820152602401610ea0565b604051632fd514cd60e11b8152600481018490523360248201525f9073339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa1580156144f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145189190614eb6565b6145645760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610ea0565b604051632fd514cd60e11b81526004810184905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa1580156145b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145dc9190614eb6565b6146285760405162461bcd60e51b815260206004820152601f60248201527f53656e64657220646f65736e2774206f776e206d6964646c65206f6e206f70006044820152606401610ea0565b604051632fd514cd60e11b81526004810183905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa15801561467c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146a09190614eb6565b6146ec5760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606401610ea0565b5f6146f78560081c90565b90505f6147048560081c90565b90505f6147118560081c90565b905060ff8316156147645760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564207479706520666f72206c687300000000000000006044820152606401610ea0565b8060ff168260ff16146147df5760405162461bcd60e51b815260206004820152602560248201527f496e636f6d70617469626c6520747970657320666f72206d6964646c6520616e60448201527f64207268730000000000000000000000000000000000000000000000000000006064820152608401610ea0565b8787878773339ece85b9e11a3a3aa557582784a15d7f82aaf24660405160200161480e969594939291906151aa565b60408051601f198184030181529190528051602090910120935061ffff198416600883901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290945073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b15801561488b575f80fd5b505af115801561489d573d5f803e3d5ffd5b50505050505050949350505050565b5f80821180156141bc57506148c2600183615015565b82161592915050565b806001600160a01b03163b5f0361490057604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ea0565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b03168460405161495d91906151f0565b5f60405180830381855af49150503d805f8114614995576040519150601f19603f3d011682016040523d82523d5f602084013e61499a565b606091505b50915091506149aa8583836149d2565b95945050505050565b3415610e665760405163b398979f60e01b815260040160405180910390fd5b6060826149e7576149e282614a31565b614a2a565b81511580156149fe57506001600160a01b0384163b155b15614a2757604051639996b31560e01b81526001600160a01b0385166004820152602401610ea0565b50805b9392505050565b805115614a415780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160f81b031981168114614a71575f80fd5b919050565b5f805f60608486031215614a88575f80fd5b8335925060208401359150614a9f60408501614a5a565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112614acb575f80fd5b813567ffffffffffffffff80821115614ae657614ae6614aa8565b604051601f8301601f19908116603f01168101908282118183101715614b0e57614b0e614aa8565b81604052838152866020858801011115614b26575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f60608486031215614b57575f80fd5b83359250602084013567ffffffffffffffff811115614b74575f80fd5b614b8086828701614abc565b925050614a9f60408501614a5a565b5f5b83811015614ba9578181015183820152602001614b91565b50505f910152565b5f8151808452614bc8816020860160208601614b8f565b601f01601f19169290920160200192915050565b602081525f614a2a6020830184614bb1565b5f60208284031215614bfe575f80fd5b5035919050565b80356001600160a01b0381168114614a71575f80fd5b5f805f8060808587031215614c2e575f80fd5b84359350614c3e60208601614c05565b9250604085013567ffffffffffffffff811115614c59575f80fd5b614c6587828801614abc565b925050614c7460608601614a5a565b905092959194509250565b5f8060408385031215614c90575f80fd5b82359150614ca060208401614a5a565b90509250929050565b5f8060408385031215614cba575f80fd5b614cc383614c05565b9150602083013567ffffffffffffffff811115614cde575f80fd5b614cea85828601614abc565b9150509250929050565b5f60208284031215614d04575f80fd5b614a2a82614a5a565b5f60208284031215614d1d575f80fd5b614a2a82614c05565b5f805f60608486031215614d38575f80fd5b505081359360208301359350604090920135919050565b5f8060408385031215614d60575f80fd5b823567ffffffffffffffff811115614d76575f80fd5b614d8285828601614abc565b925050614ca060208401614a5a565b848152608060208201525f614da96080830186614bb1565b6001600160f81b0319949094166040830152506060015292915050565b5f8551614dd7818460208a01614b8f565b61103b60f11b9083019081528551614df6816002840160208a01614b8f565b808201915050601760f91b8060028301528551614e1a816003850160208a01614b8f565b60039201918201528351614e35816004840160208801614b8f565b016004019695505050505050565b8581526001600160a01b038516602082015260a060408201525f614e6a60a0830186614bb1565b6001600160f81b031994909416606083015250608001529392505050565b606081525f614e9a6060830186614bb1565b6001600160f81b03199490941660208301525060400152919050565b5f60208284031215614ec6575f80fd5b81518015158114614a2a575f80fd5b601c8110614ef157634e487b7160e01b5f52602160045260245ffd5b60f81b9052565b614f028188614ed5565b8560018201525f8551614f1c816021850160208a01614b8f565b6001600160f81b0319959095166021929095019182019490945260609290921b6bffffffffffffffffffffffff191660228301526036820152605601949350505050565b5f6001600160a01b038086511683528060208701511660208401528060408701511660408401525083606083015260a060808301526149aa60a0830184614bb1565b5f60208284031215614fb2575f80fd5b5051919050565b614fc38187614ed5565b60018101949094526001600160f81b031992909216602184015260601b6bffffffffffffffffffffffff191660228301526036820152605601919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156141bc576141bc615001565b6150328185614ed5565b6001600160f81b03199290921660018301526fffffffffffffffffffffffffffffffff19166002820152601201919050565b5f6001820161507557615075615001565b5060010190565b6150868187614ed5565b5f855161509a816001850160208a01614b8f565b6001600160f81b0319959095166001929095019182019490945260609290921b6bffffffffffffffffffffffff1916600283015260168201526036019392505050565b6150e78186614ed5565b60018101939093526001600160f81b03199190911660218301526fffffffffffffffffffffffffffffffff19166022820152603201919050565b61512b8188614ed5565b600181019590955260218501939093526001600160f81b031991909116604184015260601b6bffffffffffffffffffffffff191660428301526056820152607601919050565b61517b8186614ed5565b600181019390935260609190911b6bffffffffffffffffffffffff191660218301526035820152605501919050565b6151b48188614ed5565b60018101959095526021850193909352604184019190915260601b6bffffffffffffffffffffffff191660618301526075820152609501919050565b5f8251615201818460208701614b8f565b919091019291505056fe0000000000000000000000006d5a11ac509c707c00bc3a0a113accc26c532547a164736f6c6343000818000a"; type TFHEExecutorConstructorParams = | [signer?: Signer] diff --git a/contracts/types/factories/contracts/TFHEExecutor.events.sol/index.ts b/contracts/types/factories/contracts/TFHEExecutor.events.sol/index.ts index 97428f32..cfcf9568 100644 --- a/contracts/types/factories/contracts/TFHEExecutor.events.sol/index.ts +++ b/contracts/types/factories/contracts/TFHEExecutor.events.sol/index.ts @@ -1,5 +1,4 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -export { IInputVerifier__factory } from "./IInputVerifier__factory"; export { TFHEExecutor__factory } from "./TFHEExecutor__factory"; diff --git a/contracts/types/factories/contracts/TFHEExecutor__factory.ts b/contracts/types/factories/contracts/TFHEExecutor__factory.ts new file mode 100644 index 00000000..13c206ef --- /dev/null +++ b/contracts/types/factories/contracts/TFHEExecutor__factory.ts @@ -0,0 +1,1245 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Contract, + ContractFactory, + ContractTransactionResponse, + Interface, +} from "ethers"; +import type { Signer, ContractDeployTransaction, ContractRunner } from "ethers"; +import type { NonPayableOverrides } from "../../common"; +import type { + TFHEExecutor, + TFHEExecutorInterface, +} from "../../contracts/TFHEExecutor"; + +const _abi = [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [ + { + internalType: "address", + name: "target", + type: "address", + }, + ], + name: "AddressEmptyCode", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "ERC1967InvalidImplementation", + type: "error", + }, + { + inputs: [], + name: "ERC1967NonPayable", + type: "error", + }, + { + inputs: [], + name: "FailedCall", + type: "error", + }, + { + inputs: [], + name: "InvalidInitialization", + type: "error", + }, + { + inputs: [], + name: "NotInitializing", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "OwnableInvalidOwner", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "OwnableUnauthorizedAccount", + type: "error", + }, + { + inputs: [], + name: "UUPSUnauthorizedCallContext", + type: "error", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "slot", + type: "bytes32", + }, + ], + name: "UUPSUnsupportedProxiableUUID", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint64", + name: "version", + type: "uint64", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferStarted", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + ], + name: "Upgraded", + type: "event", + }, + { + inputs: [], + name: "HANDLE_VERSION", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "UPGRADE_INTERFACE_VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "acceptOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "ct", + type: "uint256", + }, + { + internalType: "bytes1", + name: "toType", + type: "bytes1", + }, + ], + name: "cast", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheAdd", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheBitAnd", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheBitOr", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheBitXor", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheDiv", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheEq", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "bytes", + name: "rhs", + type: "bytes", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheEq", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheGe", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheGt", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "control", + type: "uint256", + }, + { + internalType: "uint256", + name: "ifTrue", + type: "uint256", + }, + { + internalType: "uint256", + name: "ifFalse", + type: "uint256", + }, + ], + name: "fheIfThenElse", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheLe", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheLt", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheMax", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheMin", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheMul", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "bytes", + name: "rhs", + type: "bytes", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheNe", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheNe", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "ct", + type: "uint256", + }, + ], + name: "fheNeg", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "ct", + type: "uint256", + }, + ], + name: "fheNot", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes1", + name: "randType", + type: "bytes1", + }, + ], + name: "fheRand", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "upperBound", + type: "uint256", + }, + { + internalType: "bytes1", + name: "randType", + type: "bytes1", + }, + ], + name: "fheRandBounded", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheRem", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheRotl", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheRotr", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheShl", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheShr", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "lhs", + type: "uint256", + }, + { + internalType: "uint256", + name: "rhs", + type: "uint256", + }, + { + internalType: "bytes1", + name: "scalarByte", + type: "bytes1", + }, + ], + name: "fheSub", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "getACLAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFHEPaymentAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getInputVerifierAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getVersion", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "initialOwner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "pendingOwner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "proxiableUUID", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "pt", + type: "bytes", + }, + { + internalType: "bytes1", + name: "toType", + type: "bytes1", + }, + ], + name: "trivialEncrypt", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "pt", + type: "uint256", + }, + { + internalType: "bytes1", + name: "toType", + type: "bytes1", + }, + ], + name: "trivialEncrypt", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newImplementation", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "upgradeToAndCall", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "inputHandle", + type: "bytes32", + }, + { + internalType: "address", + name: "userAddress", + type: "address", + }, + { + internalType: "bytes", + name: "inputProof", + type: "bytes", + }, + { + internalType: "bytes1", + name: "inputType", + type: "bytes1", + }, + ], + name: "verifyCiphertext", + outputs: [ + { + internalType: "uint256", + name: "result", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, +] as const; + +const _bytecode = + "0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051614824620001005f395f8181611c3801528181611c610152611dcb01526148245ff3fe6080604052600436106102e2575f3560e01c806389a4314b11610186578063c4d66de8116100dc578063ec4057dc11610087578063f6859bdc11610062578063f6859bdc1461081a578063f953e42714610840578063fa33b7af1461085f575f80fd5b8063ec4057dc146107bd578063eee1833c146107dc578063f2fde38b146107fb575f80fd5b8063e0c5cbb3116100b7578063e0c5cbb31461076b578063e30c39781461078a578063e71746b81461079e575f80fd5b8063c4d66de81461070e578063cb3b94071461072d578063e0c516ae1461074c575f80fd5b8063a86e9de51161013c578063a8c7c2c111610117578063a8c7c2c114610681578063ad3cb1cc146106a7578063bc47139a146106ef575f80fd5b8063a86e9de514610624578063a87deac414610643578063a8b42a8914610662575f80fd5b80638da5cb5b1161016c5780638da5cb5b146105d2578063900d294e146105e65780639675211f14610605575f80fd5b806389a4314b146105945780638c14cc21146105b3575f80fd5b806344ae9c5c1161023b578063694daf72116101f1578063715018a6116101cc578063715018a61461054d57806379ba509714610561578063816d57d314610575575f80fd5b8063694daf72146104ea5780636a8c8eb4146105095780636be317581461052e575f80fd5b80634f1ef286116102215780634f1ef286146104a257806352d1902d146104b7578063666a3588146104cb575f80fd5b806344ae9c5c146104645780634be68d2014610483575f80fd5b8063192710811161029b5780632e817ff0116102765780632e817ff01461040757806336cdd31b146104265780633e63c50a14610445575f80fd5b80631927108114610396578063275e36bf146103b55780632c7d67b7146103e8575f80fd5b80630b90dfc3116102cb5780630b90dfc3146103375780630d8e6e2c1461035657806313801ffa14610377575f80fd5b8063052896f1146102e65780630590734314610318575b5f80fd5b3480156102f1575f80fd5b5061030561030036600461410a565b61087e565b6040519081526020015b60405180910390f35b348015610323575f80fd5b5061030561033236600461410a565b610892565b348015610342575f80fd5b506103056103513660046141d9565b61089e565b348015610361575f80fd5b5061036a6108aa565b60405161030f9190614270565b348015610382575f80fd5b50610305610391366004614282565b610925565b3480156103a1575f80fd5b506103056103b036600461410a565b610935565b3480156103c0575f80fd5b505f805160206147f88339815191525b6040516001600160a01b03909116815260200161030f565b3480156103f3575f80fd5b5061030561040236600461410a565b610941565b348015610412575f80fd5b506103056104213660046142af565b61094d565b348015610431575f80fd5b5061030561044036600461410a565b610963565b348015610450575f80fd5b5061030561045f36600461410a565b61096f565b34801561046f575f80fd5b5061030561047e36600461410a565b61097b565b34801561048e575f80fd5b5061030561049d366004614313565b610987565b6104b56104b036600461433d565b610999565b005b3480156104c2575f80fd5b506103056109b8565b3480156104d6575f80fd5b506103056104e536600461410a565b6109e6565b3480156104f5575f80fd5b5061030561050436600461410a565b6109f2565b348015610514575f80fd5b5061051c5f81565b60405160ff909116815260200161030f565b348015610539575f80fd5b5061030561054836600461410a565b6109fe565b348015610558575f80fd5b506104b5610a0a565b34801561056c575f80fd5b506104b5610a1d565b348015610580575f80fd5b5061030561058f36600461410a565b610a6a565b34801561059f575f80fd5b506103056105ae36600461410a565b610a76565b3480156105be575f80fd5b506103056105cd36600461410a565b610a82565b3480156105dd575f80fd5b506103d0610a8e565b3480156105f1575f80fd5b50610305610600366004614388565b610ac2565b348015610610575f80fd5b5061030561061f36600461410a565b610acc565b34801561062f575f80fd5b5061030561063e36600461410a565b610ad8565b34801561064e575f80fd5b5061030561065d36600461410a565b610ae4565b34801561066d575f80fd5b5061030561067c366004614282565b610af0565b34801561068c575f80fd5b507369de3158643e738a0724418b21a35faa20cbb1c56103d0565b3480156106b2575f80fd5b5061036a6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b3480156106fa575f80fd5b506103056107093660046141d9565b610afa565b348015610719575f80fd5b506104b56107283660046143a1565b610b06565b348015610738575f80fd5b506103056107473660046143ba565b610c28565b348015610757575f80fd5b5061030561076636600461410a565b610c34565b348015610776575f80fd5b506103056107853660046143e3565b610c40565b348015610795575f80fd5b506103d0610c4b565b3480156107a9575f80fd5b506103056107b8366004614313565b610c73565b3480156107c8575f80fd5b506103056107d736600461410a565b610c7e565b3480156107e7575f80fd5b506103056107f636600461410a565b610c8a565b348015610806575f80fd5b506104b56108153660046143a1565b610c96565b348015610825575f80fd5b5073339ece85b9e11a3a3aa557582784a15d7f82aaf26103d0565b34801561084b575f80fd5b5061030561085a36600461410a565b610d1b565b34801561086a575f80fd5b50610305610879366004614313565b610d27565b5f61088a848484610d32565b949350505050565b5f61088a848484610dd5565b5f61088a848484610e6e565b60606040518060400160405280600c81526020017f544648454578656375746f7200000000000000000000000000000000000000008152506108eb5f61124a565b6108f5600161124a565b6108fe5f61124a565b6040516020016109119493929190614425565b604051602081830303815290604052905090565b5f61092f826112e7565b92915050565b5f61088a84848461136f565b5f61088a848484611493565b5f61095a8585858561152c565b95945050505050565b5f61088a8484846116b7565b5f61088a848484611800565b5f61088a848484611899565b5f6109928383611932565b9392505050565b6109a1611c2d565b6109aa82611ce4565b6109b48282611cec565b5050565b5f6109c1611dc0565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b5f61088a848484611e09565b5f61088a848484611ea2565b5f61088a848484611f3b565b610a1261205f565b610a1b5f612091565b565b3380610a27610c4b565b6001600160a01b031614610a5e5760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b610a6781612091565b50565b5f61088a8484846120c9565b5f61088a848484612162565b5f61088a8484846121fb565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b5f61092f82612294565b5f61088a8484846124b1565b5f61088a84848461254a565b5f61088a8484846125e3565b5f61092f8261267c565b5f61088a848484612704565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f81158015610b505750825b90505f8267ffffffffffffffff166001148015610b6c5750303b155b905081158015610b7a575080155b15610b985760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bcc57845468ff00000000000000001916680100000000000000001785555b610bd586612a4c565b8315610c2057845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f61088a848484612a5d565b5f61088a848484612af1565b5f6109928383612c3a565b5f807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00610ab2565b5f6109928383612e92565b5f61088a84848461300a565b5f61088a8484846130a3565b610c9e61205f565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b0319166001600160a01b0383169081178255610ce2610a8e565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b5f61088a84848461313c565b5f61099283836131d4565b5f61017e610d408582613449565b5f610d4b8660081c90565b60405162fabc1960e21b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f8833981519152906303eaf064906064015f604051808303815f87803b158015610da6575f80fd5b505af1158015610db8573d5f803e3d5ffd5b50505050610dca600e8888845f61349e565b979650505050505050565b5f61017e610de38582613449565b5f610dee8660081c90565b60405163b25fd54760e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f88339815191529063b25fd547906064015f604051808303815f87803b158015610e4a575f80fd5b505af1158015610e5c573d5f803e3d5ffd5b50505050610dca600a8888848661349e565b5f610e00610e7c8582613449565b5f610e878660081c90565b9050600160f81b808516908114610f065760405162461bcd60e51b815260206004820152603c60248201527f4f7665726c6f61646564206668654e65206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608401610a55565b6040516399841ed760e01b815233600482015260ff831660248201526001600160f81b0319821660448201525f805160206147f8833981519152906399841ed7906064015f604051808303815f87803b158015610f61575f80fd5b505af1158015610f73573d5f803e3d5ffd5b5050604051632fd514cd60e11b8152600481018a905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf29250635faa299a9150604401602060405180830381865afa158015610fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef91906144a2565b61103b5760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610a55565b855160ff83166009036110b057806040146110ab5760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610a55565b611186565b8260ff16600a0361112057806080146110ab5760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610a55565b80610100146111865760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610a55565b600d88888473339ece85b9e11a3a3aa557582784a15d7f82aaf2466040516020016111b6969594939291906144e4565b60408051601f198184030181529190528051602090910120945061ffff1985166040516346ce4e4960e11b81526004810182905233602482015290955073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015611229575f80fd5b505af115801561123b573d5f803e3d5ffd5b50505050505050509392505050565b60605f61125683613781565b60010190505f8167ffffffffffffffff8111156112755761127561413c565b6040519080825280601f01601f19166020018201604052801561129f576020820181803683370190505b5090508181016020015b5f19017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846112a957509392505050565b5f61017f6112f58382613449565b5f6113008460081c90565b60405163aa43b7f960e01b815233600482015260ff821660248201529091505f805160206147f88339815191529063aa43b7f9906044015f604051808303815f87803b15801561134e575f80fd5b505af1158015611360573d5f803e3d5ffd5b5050505061088a601585613862565b5f610fff61137d8582613449565b5f6113888660081c90565b9050600160f81b808516908190036114145760088260ff1611156114145760405162461bcd60e51b815260206004820152603e60248201527f5363616c6172206668654e6520666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f61646564206668654e6500006064820152608401610a55565b6040516399841ed760e01b815233600482015260ff831660248201526001600160f81b0319821660448201525f805160206147f8833981519152906399841ed7906064015f604051808303815f87803b15801561146f575f80fd5b505af1158015611481573d5f803e3d5ffd5b50505050610dca600d8888845f61349e565b5f61017f6114a18582613449565b5f6114ac8660081c90565b60405163473dceed60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f88339815191529063473dceed906064015f604051808303815f87803b158015611508575f80fd5b505af115801561151a573d5f803e3d5ffd5b50505050610dca60078888848661349e565b6040805160608101825273339ece85b9e11a3a3aa557582784a15d7f82aaf281526001600160a01b038516602082015233918101919091525f90816115718760081c90565b905060f884901c60ff8216146115c95760405162461bcd60e51b815260206004820152600a60248201527f57726f6e672074797065000000000000000000000000000000000000000000006044820152606401610a55565b604051634d52c10760e01b81527369de3158643e738a0724418b21a35faa20cbb1c590634d52c107906116049085908b908a9060040161454c565b6020604051808303815f875af1158015611620573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611644919061458e565b6040516346ce4e4960e11b81526004810182905233602482015290935073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015611697575f80fd5b505af11580156116a9573d5f803e3d5ffd5b505050505050949350505050565b5f600160f81b808316146117195760405162461bcd60e51b8152602060048201526024808201527f4f6e6c79206668654469762062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608401610a55565b825f036117685760405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606401610a55565b61017e6117758582613449565b5f6117808660081c90565b60405163f7eaec6360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f88339815191529063f7eaec63906064015f604051808303815f87803b1580156117dc575f80fd5b505af11580156117ee573d5f803e3d5ffd5b50505050610dca60038888848661349e565b5f61017e61180e8582613449565b5f6118198660081c90565b604051638638282b60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f883398151915290638638282b906064015f604051808303815f87803b158015611875575f80fd5b505af1158015611887573d5f803e3d5ffd5b50505050610dca600f8888845f61349e565b5f61017e6118a78582613449565b5f6118b28660081c90565b6040516313f3d32960e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f8833981519152906313f3d329906064015f604051808303815f87803b15801561190e575f80fd5b505af1158015611920573d5f803e3d5ffd5b50505050610dca600b8888848661349e565b604051632fd514cd60e11b8152600481018390523360248201525f9073339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa158015611988573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ac91906144a2565b6119f85760405162461bcd60e51b815260206004820152601d60248201527f53656e64657220646f65736e2774206f776e206374206f6e20636173740000006044820152606401610a55565b61017f611a058482613449565b61017e600160f885901c1b8116611a5e5760405162461bcd60e51b815260206004820152601760248201527f556e737570706f72746564206f757470757420747970650000000000000000006044820152606401610a55565b5f611a698660081c90565b9050847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168160f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603611b015760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206361737420746f2073616d65207479706500000000000000006044820152606401610a55565b604051630cea149360e41b815233600482015260ff821660248201525f805160206147f88339815191529063cea14930906044015f604051808303815f87803b158015611b4c575f80fd5b505af1158015611b5e573d5f803e3d5ffd5b505050506017868673339ece85b9e11a3a3aa557582784a15d7f82aaf246604051602001611b909594939291906145a5565b60408051601f198184030181529190528051602090910120935061ffff19841660f086901c61ff0016175b6040516346ce4e4960e11b81526004810182905233602482015290945073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015611c0e575f80fd5b505af1158015611c20573d5f803e3d5ffd5b5050505050505092915050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480611cc657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611cba7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610a1b5760405163703e46dd60e11b815260040160405180910390fd5b610a6761205f565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d46575060408051601f3d908101601f19168201909252611d439181019061458e565b60015b611d6e57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610a55565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611db157604051632a87526960e21b815260048101829052602401610a55565b611dbb83836139fa565b505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1b5760405163703e46dd60e11b815260040160405180910390fd5b5f61017f611e178582613449565b5f611e228660081c90565b60405163cd2bd00360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f88339815191529063cd2bd003906064015f604051808303815f87803b158015611e7e575f80fd5b505af1158015611e90573d5f803e3d5ffd5b50505050610dca60058888848661349e565b5f61017e611eb08582613449565b5f611ebb8660081c90565b60405163d692278360e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f88339815191529063d6922783906064015f604051808303815f87803b158015611f17575f80fd5b505af1158015611f29573d5f803e3d5ffd5b50505050610dca60108888845f61349e565b5f610fff611f498582613449565b5f611f548660081c90565b9050600160f81b80851690819003611fe05760088260ff161115611fe05760405162461bcd60e51b815260206004820152603e60248201527f5363616c617220666865457120666f722065627974657358585820747970657360448201527f206d7573742075736520746865206f7665726c6f6164656420666865457100006064820152608401610a55565b60405163709c098f60e11b815233600482015260ff831660248201526001600160f81b0319821660448201525f805160206147f88339815191529063e138131e906064015f604051808303815f87803b15801561203b575f80fd5b505af115801561204d573d5f803e3d5ffd5b50505050610dca600c8888845f61349e565b33612068610a8e565b6001600160a01b031614610a1b5760405163118cdaa760e01b8152336004820152602401610a55565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080546001600160a01b03191681556109b482613a4f565b5f61017e6120d78582613449565b5f6120e28660081c90565b604051632be8dd7960e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f883398151915290632be8dd79906064015f604051808303815f87803b15801561213e575f80fd5b505af1158015612150573d5f803e3d5ffd5b50505050610dca60028888848661349e565b5f61017e6121708582613449565b5f61217b8660081c90565b604051633968721960e11b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f8833981519152906372d0e432906064015f604051808303815f87803b1580156121d7575f80fd5b505af11580156121e9573d5f803e3d5ffd5b50505050610dca60088888848661349e565b5f61017e6122098582613449565b5f6122148660081c90565b6040516303ed3f3160e51b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f883398151915290637da7e620906064015f604051808303815f87803b158015612270575f80fd5b505af1158015612282573d5f803e3d5ffd5b50505050610dca60018888848661349e565b5f7fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e00610f7f60f884901c6001811b82166123105760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606401610a55565b6040516302cccbd160e21b815233600482015260ff821660248201525f805160206147f883398151915290630b332f44906044015f604051808303815f87803b15801561235b575f80fd5b505af115801561236d573d5f803e3d5ffd5b505084545f9250905073339ece85b9e11a3a3aa557582784a15d7f82aaf246612397600143614601565b60408051602081019590955260609390931b6bffffffffffffffffffffffff191692840192909252605483015240607482015242609482015260b401604051602081830303815290604052805190602001209050601a868260405160200161240193929190614614565b60408051601f198184030181529190528051602090910120945061ffff198516600883901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290955073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b15801561247e575f80fd5b505af1158015612490573d5f803e3d5ffd5b5050855491508590505f6124a383614650565b919050555050505050919050565b5f61017e6124bf8582613449565b5f6124ca8660081c90565b60405163466ac06560e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f88339815191529063466ac065906064015f604051808303815f87803b158015612526575f80fd5b505af1158015612538573d5f803e3d5ffd5b50505050610dca60118888845f61349e565b5f61017e6125588582613449565b5f6125638660081c90565b604051631ade267d60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f883398151915290631ade267d906064015f604051808303815f87803b1580156125bf575f80fd5b505af11580156125d1573d5f803e3d5ffd5b50505050610dca60138888848661349e565b5f61017e6125f18582613449565b5f6125fc8660081c90565b604051630ad2336160e41b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f88339815191529063ad233610906064015f604051808303815f87803b158015612658575f80fd5b505af115801561266a573d5f803e3d5ffd5b50505050610dca60128888848661349e565b5f61017e61268a8382613449565b5f6126958460081c90565b6040516313ed41db60e31b815233600482015260ff821660248201529091505f805160206147f883398151915290639f6a0ed8906044015f604051808303815f87803b1580156126e3575f80fd5b505af11580156126f5573d5f803e3d5ffd5b5050505061088a601485613862565b5f610e006127128582613449565b5f61271d8660081c90565b9050600160f81b80851690811461279c5760405162461bcd60e51b815260206004820152603c60248201527f4f7665726c6f61646564206668654571206973206f6e6c7920666f722073636160448201527f6c617220656279746573585858207365636f6e64206f706572616e64000000006064820152608401610a55565b60405163709c098f60e11b815233600482015260ff831660248201526001600160f81b0319821660448201525f805160206147f88339815191529063e138131e906064015f604051808303815f87803b1580156127f7575f80fd5b505af1158015612809573d5f803e3d5ffd5b5050604051632fd514cd60e11b8152600481018a905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf29250635faa299a9150604401602060405180830381865afa158015612861573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288591906144a2565b6128d15760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610a55565b855160ff831660090361294657806040146129415760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610a55565b612a1c565b8260ff16600a036129b657806080146129415760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610a55565b8061010014612a1c5760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610a55565b600c88888473339ece85b9e11a3a3aa557582784a15d7f82aaf2466040516020016111b6969594939291906144e4565b612a54613abf565b610a6781613b0d565b5f610fff612a6b8482613449565b5f612a768560081c90565b60405163d5f0797d60e01b815233600482015260ff821660248201529091505f805160206147f88339815191529063d5f0797d906044015f604051808303815f87803b158015612ac4575f80fd5b505af1158015612ad6573d5f803e3d5ffd5b50505050612ae76019878787613b3e565b9695505050505050565b5f600160f81b80831614612b535760405162461bcd60e51b8152602060048201526024808201527f4f6e6c792066686552656d2062792061207363616c617220697320737570706f6044820152631c9d195960e21b6064820152608401610a55565b825f03612ba25760405162461bcd60e51b815260206004820152601560248201527f436f756c64206e6f7420646976696465206279203000000000000000000000006044820152606401610a55565b61017e612baf8582613449565b5f612bba8660081c90565b6040516317f83edb60e31b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f88339815191529063bfc1f6d8906064015f604051808303815f87803b158015612c16575f80fd5b505af1158015612c28573d5f803e3d5ffd5b50505050610dca60048888848661349e565b5f610e0060f883901c6001811b8216612c885760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610a55565b60405163100747ad60e01b815233600482015260ff821660248201525f805160206147f88339815191529063100747ad906044015f604051808303815f87803b158015612cd3575f80fd5b505af1158015612ce5573d5f803e3d5ffd5b5050865191505060ff8216600903612d5f5780604014612d5a5760405162461bcd60e51b815260206004820152602a60248201527f4279746573206172726179206c656e677468206f6620427974657336342073686044820152691bdd5b19081899480d8d60b21b6064820152608401610a55565b612e35565b8160ff16600a03612dcf5780608014612d5a5760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573313238207360448201526b0d0deead8c840c4ca406264760a31b6064820152608401610a55565b8061010014612e355760405162461bcd60e51b815260206004820152602c60248201527f4279746573206172726179206c656e677468206f66204279746573323536207360448201526b3437bab63210313290191a9b60a11b6064820152608401610a55565b6018868673339ece85b9e11a3a3aa557582784a15d7f82aaf246604051602001612e63959493929190614668565b60408051601f198184030181529190528051602090910120935061ffff198416600883901b61ff001617611bbb565b5f6101ff60f883901c6001811b8216612ee05760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610a55565b60405163100747ad60e01b815233600482015260ff821660248201525f805160206147f88339815191529063100747ad906044015f604051808303815f87803b158015612f2b575f80fd5b505af1158015612f3d573d5f803e3d5ffd5b505050506018858573339ece85b9e11a3a3aa557582784a15d7f82aaf246604051602001612f6f9594939291906145a5565b60408051601f198184030181529190528051602090910120925061ffff198316600882901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290935073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015612fec575f80fd5b505af1158015612ffe573d5f803e3d5ffd5b50505050505092915050565b5f61017f6130188582613449565b5f6130238660081c90565b604051633980607d60e11b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f883398151915290637300c0fa906064015f604051808303815f87803b15801561307f575f80fd5b505af1158015613091573d5f803e3d5ffd5b50505050610dca60068888848661349e565b5f61017e6130b18582613449565b5f6130bc8660081c90565b6040516307dbdabb60e21b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f883398151915290631f6f6aec906064015f604051808303815f87803b158015613118575f80fd5b505af115801561312a573d5f803e3d5ffd5b50505050610dca60098888848661349e565b5f61017e61314a8582613449565b5f6131558660081c90565b6040516327af38ad60e01b815233600482015260ff82166024820152600160f81b8616604482018190529192505f805160206147f8833981519152906327af38ad906064015f604051808303815f87803b1580156131b1575f80fd5b505af11580156131c3573d5f803e3d5ffd5b50505050610dca5f8888848661349e565b5f7fa436a06f0efce5ea38c956a21e24202a59b3b746d48a23fb52b4a5bc33fe3e0061017e60f884901c6001811b82166132505760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564206572616e646f6d207479706500000000000000006044820152606401610a55565b61325986613f4c565b6132a55760405162461bcd60e51b815260206004820152601f60248201527f5570706572426f756e64206d757374206265206120706f776572206f662032006044820152606401610a55565b604051639bf5592160e01b815233600482015260ff821660248201525f805160206147f883398151915290639bf55921906044015f604051808303815f87803b1580156132f0575f80fd5b505af1158015613302573d5f803e3d5ffd5b505084545f9250905073339ece85b9e11a3a3aa557582784a15d7f82aaf24661332c600143614601565b60408051602081019590955260609390931b6bffffffffffffffffffffffff191692840192909252605483015240607482015242609482015260b401604051602081830303815290604052805190602001209050601b87878360405160200161339894939291906146c9565b60408051601f198184030181529190528051602090910120945061ffff198516600883901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290955073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015613415575f80fd5b505af1158015613427573d5f803e3d5ffd5b5050855491508590505f61343a83614650565b91905055505050505092915050565b5f6134548360081c90565b9050600160ff82161b8216611dbb5760405162461bcd60e51b815260206004820152601060248201526f556e737570706f72746564207479706560801b6044820152606401610a55565b604051632fd514cd60e11b8152600481018590523360248201525f9073339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa1580156134f4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061351891906144a2565b6135645760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610a55565b6001600160f81b031983165f036136b657604051632fd514cd60e11b81526004810185905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa1580156135c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135ed91906144a2565b6136395760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606401610a55565b5f6136448560081c90565b90505f6136518760081c90565b90508160ff168160ff16146136b35760405162461bcd60e51b815260206004820152602260248201527f496e636f6d70617469626c6520747970657320666f72206c687320616e642072604482015261687360f01b6064820152608401610a55565b50505b8585858573339ece85b9e11a3a3aa557582784a15d7f82aaf2466040516020016136e59695949392919061470d565b60408051601f198184030181529190528051602090910120905061ffff198116600883901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290915073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015613762575f80fd5b505af1158015613774573d5f803e3d5ffd5b5050505095945050505050565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106137c9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106137f5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061381357662386f26fc10000830492506010015b6305f5e100831061382b576305f5e100830492506008015b612710831061383f57612710830492506004015b60648310613851576064830492506002015b600a831061092f5760010192915050565b604051632fd514cd60e11b8152600481018290523360248201525f9073339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa1580156138b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138dc91906144a2565b6139285760405162461bcd60e51b815260206004820152601b60248201527f53656e64657220646f65736e2774206f776e206374206f6e206f7000000000006044820152606401610a55565b828273339ece85b9e11a3a3aa557582784a15d7f82aaf246604051602001613953949392919061475d565b604051602081830303815290604052805190602001205f1c90505f6139788360081c90565b905061ffff198216600882901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290925073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b1580156139dd575f80fd5b505af11580156139ef573d5f803e3d5ffd5b505050505092915050565b613a0382613f6b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613a4757611dbb8282613fe1565b6109b461404a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610a1b57604051631afcd79f60e31b815260040160405180910390fd5b613b15613abf565b6001600160a01b038116610a5e57604051631e4fbdf760e01b81525f6004820152602401610a55565b604051632fd514cd60e11b8152600481018490523360248201525f9073339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa158015613b94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb891906144a2565b613c045760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e206c6873206f6e206f70000000006044820152606401610a55565b604051632fd514cd60e11b81526004810184905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa158015613c58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c7c91906144a2565b613cc85760405162461bcd60e51b815260206004820152601f60248201527f53656e64657220646f65736e2774206f776e206d6964646c65206f6e206f70006044820152606401610a55565b604051632fd514cd60e11b81526004810183905233602482015273339ece85b9e11a3a3aa557582784a15d7f82aaf290635faa299a90604401602060405180830381865afa158015613d1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d4091906144a2565b613d8c5760405162461bcd60e51b815260206004820152601c60248201527f53656e64657220646f65736e2774206f776e20726873206f6e206f70000000006044820152606401610a55565b5f613d978560081c90565b90505f613da48560081c90565b90505f613db18560081c90565b905060ff831615613e045760405162461bcd60e51b815260206004820152601860248201527f556e737570706f72746564207479706520666f72206c687300000000000000006044820152606401610a55565b8060ff168260ff1614613e7f5760405162461bcd60e51b815260206004820152602560248201527f496e636f6d70617469626c6520747970657320666f72206d6964646c6520616e60448201527f64207268730000000000000000000000000000000000000000000000000000006064820152608401610a55565b8787878773339ece85b9e11a3a3aa557582784a15d7f82aaf246604051602001613eae96959493929190614796565b60408051601f198184030181529190528051602090910120935061ffff198416600883901b61ff0016176040516346ce4e4960e11b81526004810182905233602482015290945073339ece85b9e11a3a3aa557582784a15d7f82aaf290638d9c9c92906044015f604051808303815f87803b158015613f2b575f80fd5b505af1158015613f3d573d5f803e3d5ffd5b50505050505050949350505050565b5f808211801561092f5750613f62600183614601565b82161592915050565b806001600160a01b03163b5f03613fa057604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610a55565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051613ffd91906147dc565b5f60405180830381855af49150503d805f8114614035576040519150601f19603f3d011682016040523d82523d5f602084013e61403a565b606091505b509150915061095a858383614069565b3415610a1b5760405163b398979f60e01b815260040160405180910390fd5b60608261407e57614079826140c5565b610992565b815115801561409557506001600160a01b0384163b155b156140be57604051639996b31560e01b81526001600160a01b0385166004820152602401610a55565b5092915050565b8051156140d55780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160f81b031981168114614105575f80fd5b919050565b5f805f6060848603121561411c575f80fd5b8335925060208401359150614133604085016140ee565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261415f575f80fd5b813567ffffffffffffffff8082111561417a5761417a61413c565b604051601f8301601f19908116603f011681019082821181831017156141a2576141a261413c565b816040528381528660208588010111156141ba575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f606084860312156141eb575f80fd5b83359250602084013567ffffffffffffffff811115614208575f80fd5b61421486828701614150565b925050614133604085016140ee565b5f5b8381101561423d578181015183820152602001614225565b50505f910152565b5f815180845261425c816020860160208601614223565b601f01601f19169290920160200192915050565b602081525f6109926020830184614245565b5f60208284031215614292575f80fd5b5035919050565b80356001600160a01b0381168114614105575f80fd5b5f805f80608085870312156142c2575f80fd5b843593506142d260208601614299565b9250604085013567ffffffffffffffff8111156142ed575f80fd5b6142f987828801614150565b925050614308606086016140ee565b905092959194509250565b5f8060408385031215614324575f80fd5b82359150614334602084016140ee565b90509250929050565b5f806040838503121561434e575f80fd5b61435783614299565b9150602083013567ffffffffffffffff811115614372575f80fd5b61437e85828601614150565b9150509250929050565b5f60208284031215614398575f80fd5b610992826140ee565b5f602082840312156143b1575f80fd5b61099282614299565b5f805f606084860312156143cc575f80fd5b505081359360208301359350604090920135919050565b5f80604083850312156143f4575f80fd5b823567ffffffffffffffff81111561440a575f80fd5b61441685828601614150565b925050614334602084016140ee565b5f8551614436818460208a01614223565b61103b60f11b9083019081528551614455816002840160208a01614223565b808201915050601760f91b8060028301528551614479816003850160208a01614223565b60039201918201528351614494816004840160208801614223565b016004019695505050505050565b5f602082840312156144b2575f80fd5b81518015158114610992575f80fd5b601c81106144dd57634e487b7160e01b5f52602160045260245ffd5b60f81b9052565b6144ee81886144c1565b8560018201525f8551614508816021850160208a01614223565b6001600160f81b0319959095166021929095019182019490945260609290921b6bffffffffffffffffffffffff191660228301526036820152605601949350505050565b5f6001600160a01b038086511683528060208701511660208401528060408701511660408401525083606083015260a0608083015261095a60a0830184614245565b5f6020828403121561459e575f80fd5b5051919050565b6145af81876144c1565b60018101949094526001600160f81b031992909216602184015260601b6bffffffffffffffffffffffff191660228301526036820152605601919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561092f5761092f6145ed565b61461e81856144c1565b6001600160f81b03199290921660018301526fffffffffffffffffffffffffffffffff19166002820152601201919050565b5f60018201614661576146616145ed565b5060010190565b61467281876144c1565b5f8551614686816001850160208a01614223565b6001600160f81b0319959095166001929095019182019490945260609290921b6bffffffffffffffffffffffff1916600283015260168201526036019392505050565b6146d381866144c1565b60018101939093526001600160f81b03199190911660218301526fffffffffffffffffffffffffffffffff19166022820152603201919050565b61471781886144c1565b600181019590955260218501939093526001600160f81b031991909116604184015260601b6bffffffffffffffffffffffff191660428301526056820152607601919050565b61476781866144c1565b600181019390935260609190911b6bffffffffffffffffffffffff191660218301526035820152605501919050565b6147a081886144c1565b60018101959095526021850193909352604184019190915260601b6bffffffffffffffffffffffff191660618301526075820152609501919050565b5f82516147ed818460208701614223565b919091019291505056fe0000000000000000000000006d5a11ac509c707c00bc3a0a113accc26c532547a164736f6c6343000818000a"; + +type TFHEExecutorConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: TFHEExecutorConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class TFHEExecutor__factory extends ContractFactory { + constructor(...args: TFHEExecutorConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override getDeployTransaction( + overrides?: NonPayableOverrides & { from?: string } + ): Promise { + return super.getDeployTransaction(overrides || {}); + } + override deploy(overrides?: NonPayableOverrides & { from?: string }) { + return super.deploy(overrides || {}) as Promise< + TFHEExecutor & { + deploymentTransaction(): ContractTransactionResponse; + } + >; + } + override connect(runner: ContractRunner | null): TFHEExecutor__factory { + return super.connect(runner) as TFHEExecutor__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): TFHEExecutorInterface { + return new Interface(_abi) as TFHEExecutorInterface; + } + static connect( + address: string, + runner?: ContractRunner | null + ): TFHEExecutor { + return new Contract(address, _abi, runner) as unknown as TFHEExecutor; + } +} diff --git a/contracts/types/factories/contracts/index.ts b/contracts/types/factories/contracts/index.ts index 8a13b075..99e6c462 100644 --- a/contracts/types/factories/contracts/index.ts +++ b/contracts/types/factories/contracts/index.ts @@ -1,10 +1,11 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +export * as baseTfheExecutorSol from "./BaseTFHEExecutor.sol"; export * as inputVerifierCoprocessorSol from "./InputVerifier.coprocessor.sol"; export * as inputVerifierNativeSol from "./InputVerifier.native.sol"; export * as tfheExecutorEventsSol from "./TFHEExecutor.events.sol"; -export * as tfheExecutorSol from "./TFHEExecutor.sol"; export { ACL__factory } from "./ACL__factory"; export { FHEPayment__factory } from "./FHEPayment__factory"; export { KMSVerifier__factory } from "./KMSVerifier__factory"; +export { TFHEExecutor__factory } from "./TFHEExecutor__factory"; diff --git a/contracts/types/hardhat.d.ts b/contracts/types/hardhat.d.ts index ec67eb9e..0fa97c35 100644 --- a/contracts/types/hardhat.d.ts +++ b/contracts/types/hardhat.d.ts @@ -89,6 +89,14 @@ declare module "hardhat/types/runtime" { name: "ACL", signerOrOptions?: ethers.Signer | FactoryOptions ): Promise; + getContractFactory( + name: "BaseTFHEExecutor", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; + getContractFactory( + name: "IInputVerifier", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; getContractFactory( name: "FHEPayment", signerOrOptions?: ethers.Signer | FactoryOptions @@ -105,18 +113,10 @@ declare module "hardhat/types/runtime" { name: "KMSVerifier", signerOrOptions?: ethers.Signer | FactoryOptions ): Promise; - getContractFactory( - name: "IInputVerifier", - signerOrOptions?: ethers.Signer | FactoryOptions - ): Promise; getContractFactory( name: "TFHEExecutor", signerOrOptions?: ethers.Signer | FactoryOptions ): Promise; - getContractFactory( - name: "IInputVerifier", - signerOrOptions?: ethers.Signer | FactoryOptions - ): Promise; getContractFactory( name: "TFHEExecutor", signerOrOptions?: ethers.Signer | FactoryOptions @@ -365,6 +365,16 @@ declare module "hardhat/types/runtime" { address: string | ethers.Addressable, signer?: ethers.Signer ): Promise; + getContractAt( + name: "BaseTFHEExecutor", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; + getContractAt( + name: "IInputVerifier", + address: string | ethers.Addressable, + signer?: ethers.Signer + ): Promise; getContractAt( name: "FHEPayment", address: string | ethers.Addressable, @@ -385,21 +395,11 @@ declare module "hardhat/types/runtime" { address: string | ethers.Addressable, signer?: ethers.Signer ): Promise; - getContractAt( - name: "IInputVerifier", - address: string | ethers.Addressable, - signer?: ethers.Signer - ): Promise; getContractAt( name: "TFHEExecutor", address: string | ethers.Addressable, signer?: ethers.Signer ): Promise; - getContractAt( - name: "IInputVerifier", - address: string | ethers.Addressable, - signer?: ethers.Signer - ): Promise; getContractAt( name: "TFHEExecutor", address: string | ethers.Addressable, @@ -667,6 +667,14 @@ declare module "hardhat/types/runtime" { name: "ACL", signerOrOptions?: ethers.Signer | DeployContractOptions ): Promise; + deployContract( + name: "BaseTFHEExecutor", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IInputVerifier", + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; deployContract( name: "FHEPayment", signerOrOptions?: ethers.Signer | DeployContractOptions @@ -683,18 +691,10 @@ declare module "hardhat/types/runtime" { name: "KMSVerifier", signerOrOptions?: ethers.Signer | DeployContractOptions ): Promise; - deployContract( - name: "IInputVerifier", - signerOrOptions?: ethers.Signer | DeployContractOptions - ): Promise; deployContract( name: "TFHEExecutor", signerOrOptions?: ethers.Signer | DeployContractOptions ): Promise; - deployContract( - name: "IInputVerifier", - signerOrOptions?: ethers.Signer | DeployContractOptions - ): Promise; deployContract( name: "TFHEExecutor", signerOrOptions?: ethers.Signer | DeployContractOptions @@ -943,6 +943,16 @@ declare module "hardhat/types/runtime" { args: any[], signerOrOptions?: ethers.Signer | DeployContractOptions ): Promise; + deployContract( + name: "BaseTFHEExecutor", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; + deployContract( + name: "IInputVerifier", + args: any[], + signerOrOptions?: ethers.Signer | DeployContractOptions + ): Promise; deployContract( name: "FHEPayment", args: any[], @@ -963,21 +973,11 @@ declare module "hardhat/types/runtime" { args: any[], signerOrOptions?: ethers.Signer | DeployContractOptions ): Promise; - deployContract( - name: "IInputVerifier", - args: any[], - signerOrOptions?: ethers.Signer | DeployContractOptions - ): Promise; deployContract( name: "TFHEExecutor", args: any[], signerOrOptions?: ethers.Signer | DeployContractOptions ): Promise; - deployContract( - name: "IInputVerifier", - args: any[], - signerOrOptions?: ethers.Signer | DeployContractOptions - ): Promise; deployContract( name: "TFHEExecutor", args: any[], diff --git a/contracts/types/index.ts b/contracts/types/index.ts index 5a0aac43..948b9679 100644 --- a/contracts/types/index.ts +++ b/contracts/types/index.ts @@ -52,14 +52,16 @@ export type { Strings } from "./@openzeppelin/contracts/utils/Strings"; export { Strings__factory } from "./factories/@openzeppelin/contracts/utils/Strings__factory"; export type { ACL } from "./contracts/ACL"; export { ACL__factory } from "./factories/contracts/ACL__factory"; +export type { BaseTFHEExecutor } from "./contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor"; +export { BaseTFHEExecutor__factory } from "./factories/contracts/BaseTFHEExecutor.sol/BaseTFHEExecutor__factory"; +export type { IInputVerifier } from "./contracts/BaseTFHEExecutor.sol/IInputVerifier"; +export { IInputVerifier__factory } from "./factories/contracts/BaseTFHEExecutor.sol/IInputVerifier__factory"; export type { FHEPayment } from "./contracts/FHEPayment"; export { FHEPayment__factory } from "./factories/contracts/FHEPayment__factory"; export type { InputVerifier } from "./contracts/InputVerifier.coprocessor.sol/InputVerifier"; export { InputVerifier__factory } from "./factories/contracts/InputVerifier.coprocessor.sol/InputVerifier__factory"; export type { KMSVerifier } from "./contracts/KMSVerifier"; export { KMSVerifier__factory } from "./factories/contracts/KMSVerifier__factory"; -export type { IInputVerifier } from "./contracts/TFHEExecutor.events.sol/IInputVerifier"; -export { IInputVerifier__factory } from "./factories/contracts/TFHEExecutor.events.sol/IInputVerifier__factory"; export type { TFHEExecutor } from "./contracts/TFHEExecutor.events.sol/TFHEExecutor"; export { TFHEExecutor__factory } from "./factories/contracts/TFHEExecutor.events.sol/TFHEExecutor__factory"; export type { ACLUpgradedExample } from "./examples/ACLUpgradedExample";