UNPKG

@owlprotocol/contracts-account-abstraction

Version:

ERC4337 Account Abstraction support for deploying relevant smart contracts and interacting with UserOps.

626 lines (624 loc) 119 kB
import { Hex, Address } from "viem"; export const _constructor = { inputs: [], stateMutability: "nonpayable", type: "constructor" } as const; export const DelegateAndRevert = { inputs: [ { internalType: "bool", name: "success", type: "bool" }, { internalType: "bytes", name: "ret", type: "bytes" }, ], name: "DelegateAndRevert", type: "error", } as const; export const FailedOp = { inputs: [ { internalType: "uint256", name: "opIndex", type: "uint256" }, { internalType: "string", name: "reason", type: "string" }, ], name: "FailedOp", type: "error", } as const; export const FailedOpWithRevert = { inputs: [ { internalType: "uint256", name: "opIndex", type: "uint256" }, { internalType: "string", name: "reason", type: "string" }, { internalType: "bytes", name: "inner", type: "bytes" }, ], name: "FailedOpWithRevert", type: "error", } as const; export const PostOpReverted = { inputs: [{ internalType: "bytes", name: "returnData", type: "bytes" }], name: "PostOpReverted", type: "error", } as const; export const ReentrancyGuardReentrantCall = { inputs: [], name: "ReentrancyGuardReentrantCall", type: "error", } as const; export const SenderAddressResult = { inputs: [{ internalType: "address", name: "sender", type: "address" }], name: "SenderAddressResult", type: "error", } as const; export const SignatureValidationFailed = { inputs: [{ internalType: "address", name: "aggregator", type: "address" }], name: "SignatureValidationFailed", type: "error", } as const; export const AccountDeployed = { anonymous: false, inputs: [ { indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" }, { indexed: true, internalType: "address", name: "sender", type: "address" }, { indexed: false, internalType: "address", name: "factory", type: "address" }, { indexed: false, internalType: "address", name: "paymaster", type: "address" }, ], name: "AccountDeployed", type: "event", } as const; export const BeforeExecution = { anonymous: false, inputs: [], name: "BeforeExecution", type: "event" } as const; export const Deposited = { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "account", type: "address" }, { indexed: false, internalType: "uint256", name: "totalDeposit", type: "uint256" }, ], name: "Deposited", type: "event", } as const; export const PostOpRevertReason = { anonymous: false, inputs: [ { indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" }, { indexed: true, internalType: "address", name: "sender", type: "address" }, { indexed: false, internalType: "uint256", name: "nonce", type: "uint256" }, { indexed: false, internalType: "bytes", name: "revertReason", type: "bytes" }, ], name: "PostOpRevertReason", type: "event", } as const; export const SignatureAggregatorChanged = { anonymous: false, inputs: [{ indexed: true, internalType: "address", name: "aggregator", type: "address" }], name: "SignatureAggregatorChanged", type: "event", } as const; export const StakeLocked = { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "account", type: "address" }, { indexed: false, internalType: "uint256", name: "totalStaked", type: "uint256" }, { indexed: false, internalType: "uint256", name: "unstakeDelaySec", type: "uint256" }, ], name: "StakeLocked", type: "event", } as const; export const StakeUnlocked = { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "account", type: "address" }, { indexed: false, internalType: "uint256", name: "withdrawTime", type: "uint256" }, ], name: "StakeUnlocked", type: "event", } as const; export const StakeWithdrawn = { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "account", type: "address" }, { indexed: false, internalType: "address", name: "withdrawAddress", type: "address" }, { indexed: false, internalType: "uint256", name: "amount", type: "uint256" }, ], name: "StakeWithdrawn", type: "event", } as const; export const UserOperationEvent = { anonymous: false, inputs: [ { indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" }, { indexed: true, internalType: "address", name: "sender", type: "address" }, { indexed: true, internalType: "address", name: "paymaster", type: "address" }, { indexed: false, internalType: "uint256", name: "nonce", type: "uint256" }, { indexed: false, internalType: "bool", name: "success", type: "bool" }, { indexed: false, internalType: "uint256", name: "actualGasCost", type: "uint256" }, { indexed: false, internalType: "uint256", name: "actualGasUsed", type: "uint256" }, ], name: "UserOperationEvent", type: "event", } as const; export const UserOperationPrefundTooLow = { anonymous: false, inputs: [ { indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" }, { indexed: true, internalType: "address", name: "sender", type: "address" }, { indexed: false, internalType: "uint256", name: "nonce", type: "uint256" }, ], name: "UserOperationPrefundTooLow", type: "event", } as const; export const UserOperationRevertReason = { anonymous: false, inputs: [ { indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" }, { indexed: true, internalType: "address", name: "sender", type: "address" }, { indexed: false, internalType: "uint256", name: "nonce", type: "uint256" }, { indexed: false, internalType: "bytes", name: "revertReason", type: "bytes" }, ], name: "UserOperationRevertReason", type: "event", } as const; export const Withdrawn = { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "account", type: "address" }, { indexed: false, internalType: "address", name: "withdrawAddress", type: "address" }, { indexed: false, internalType: "uint256", name: "amount", type: "uint256" }, ], name: "Withdrawn", type: "event", } as const; export const addStake = { inputs: [{ internalType: "uint32", name: "unstakeDelaySec", type: "uint32" }], name: "addStake", outputs: [], stateMutability: "payable", type: "function", } as const; export const balanceOf = { inputs: [{ internalType: "address", name: "account", type: "address" }], name: "balanceOf", outputs: [{ internalType: "uint256", name: "", type: "uint256" }], stateMutability: "view", type: "function", } as const; export const delegateAndRevert = { inputs: [ { internalType: "address", name: "target", type: "address" }, { internalType: "bytes", name: "data", type: "bytes" }, ], name: "delegateAndRevert", outputs: [], stateMutability: "nonpayable", type: "function", } as const; export const depositTo = { inputs: [{ internalType: "address", name: "account", type: "address" }], name: "depositTo", outputs: [], stateMutability: "payable", type: "function", } as const; export const deposits = { inputs: [{ internalType: "address", name: "", type: "address" }], name: "deposits", outputs: [ { internalType: "uint256", name: "deposit", type: "uint256" }, { internalType: "bool", name: "staked", type: "bool" }, { internalType: "uint112", name: "stake", type: "uint112" }, { internalType: "uint32", name: "unstakeDelaySec", type: "uint32" }, { internalType: "uint48", name: "withdrawTime", type: "uint48" }, ], stateMutability: "view", type: "function", } as const; export const getDepositInfo = { inputs: [{ internalType: "address", name: "account", type: "address" }], name: "getDepositInfo", outputs: [ { components: [ { internalType: "uint256", name: "deposit", type: "uint256" }, { internalType: "bool", name: "staked", type: "bool" }, { internalType: "uint112", name: "stake", type: "uint112" }, { internalType: "uint32", name: "unstakeDelaySec", type: "uint32" }, { internalType: "uint48", name: "withdrawTime", type: "uint48" }, ], internalType: "struct IStakeManager.DepositInfo", name: "info", type: "tuple", }, ], stateMutability: "view", type: "function", } as const; export const getNonce = { inputs: [ { internalType: "address", name: "sender", type: "address" }, { internalType: "uint192", name: "key", type: "uint192" }, ], name: "getNonce", outputs: [{ internalType: "uint256", name: "nonce", type: "uint256" }], stateMutability: "view", type: "function", } as const; export const getSenderAddress = { inputs: [{ internalType: "bytes", name: "initCode", type: "bytes" }], name: "getSenderAddress", outputs: [], stateMutability: "nonpayable", type: "function", } as const; export const getUserOpHash = { inputs: [ { components: [ { internalType: "address", name: "sender", type: "address" }, { internalType: "uint256", name: "nonce", type: "uint256" }, { internalType: "bytes", name: "initCode", type: "bytes" }, { internalType: "bytes", name: "callData", type: "bytes" }, { internalType: "bytes32", name: "accountGasLimits", type: "bytes32" }, { internalType: "uint256", name: "preVerificationGas", type: "uint256" }, { internalType: "bytes32", name: "gasFees", type: "bytes32" }, { internalType: "bytes", name: "paymasterAndData", type: "bytes" }, { internalType: "bytes", name: "signature", type: "bytes" }, ], internalType: "struct PackedUserOperation", name: "userOp", type: "tuple", }, ], name: "getUserOpHash", outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], stateMutability: "view", type: "function", } as const; export const handleAggregatedOps = { inputs: [ { components: [ { components: [ { internalType: "address", name: "sender", type: "address" }, { internalType: "uint256", name: "nonce", type: "uint256" }, { internalType: "bytes", name: "initCode", type: "bytes" }, { internalType: "bytes", name: "callData", type: "bytes" }, { internalType: "bytes32", name: "accountGasLimits", type: "bytes32" }, { internalType: "uint256", name: "preVerificationGas", type: "uint256" }, { internalType: "bytes32", name: "gasFees", type: "bytes32" }, { internalType: "bytes", name: "paymasterAndData", type: "bytes" }, { internalType: "bytes", name: "signature", type: "bytes" }, ], internalType: "struct PackedUserOperation[]", name: "userOps", type: "tuple[]", }, { internalType: "contract IAggregator", name: "aggregator", type: "address" }, { internalType: "bytes", name: "signature", type: "bytes" }, ], internalType: "struct IEntryPoint.UserOpsPerAggregator[]", name: "opsPerAggregator", type: "tuple[]", }, { internalType: "address payable", name: "beneficiary", type: "address" }, ], name: "handleAggregatedOps", outputs: [], stateMutability: "nonpayable", type: "function", } as const; export const handleOps = { inputs: [ { components: [ { internalType: "address", name: "sender", type: "address" }, { internalType: "uint256", name: "nonce", type: "uint256" }, { internalType: "bytes", name: "initCode", type: "bytes" }, { internalType: "bytes", name: "callData", type: "bytes" }, { internalType: "bytes32", name: "accountGasLimits", type: "bytes32" }, { internalType: "uint256", name: "preVerificationGas", type: "uint256" }, { internalType: "bytes32", name: "gasFees", type: "bytes32" }, { internalType: "bytes", name: "paymasterAndData", type: "bytes" }, { internalType: "bytes", name: "signature", type: "bytes" }, ], internalType: "struct PackedUserOperation[]", name: "ops", type: "tuple[]", }, { internalType: "address payable", name: "beneficiary", type: "address" }, ], name: "handleOps", outputs: [], stateMutability: "nonpayable", type: "function", } as const; export const incrementNonce = { inputs: [{ internalType: "uint192", name: "key", type: "uint192" }], name: "incrementNonce", outputs: [], stateMutability: "nonpayable", type: "function", } as const; export const innerHandleOp = { inputs: [ { internalType: "bytes", name: "callData", type: "bytes" }, { components: [ { components: [ { internalType: "address", name: "sender", type: "address" }, { internalType: "uint256", name: "nonce", type: "uint256" }, { internalType: "uint256", name: "verificationGasLimit", type: "uint256" }, { internalType: "uint256", name: "callGasLimit", type: "uint256" }, { internalType: "uint256", name: "paymasterVerificationGasLimit", type: "uint256" }, { internalType: "uint256", name: "paymasterPostOpGasLimit", type: "uint256" }, { internalType: "uint256", name: "preVerificationGas", type: "uint256" }, { internalType: "address", name: "paymaster", type: "address" }, { internalType: "uint256", name: "maxFeePerGas", type: "uint256" }, { internalType: "uint256", name: "maxPriorityFeePerGas", type: "uint256" }, ], internalType: "struct EntryPoint.MemoryUserOp", name: "mUserOp", type: "tuple", }, { internalType: "bytes32", name: "userOpHash", type: "bytes32" }, { internalType: "uint256", name: "prefund", type: "uint256" }, { internalType: "uint256", name: "contextOffset", type: "uint256" }, { internalType: "uint256", name: "preOpGas", type: "uint256" }, ], internalType: "struct EntryPoint.UserOpInfo", name: "opInfo", type: "tuple", }, { internalType: "bytes", name: "context", type: "bytes" }, ], name: "innerHandleOp", outputs: [{ internalType: "uint256", name: "actualGasCost", type: "uint256" }], stateMutability: "nonpayable", type: "function", } as const; export const nonceSequenceNumber = { inputs: [ { internalType: "address", name: "", type: "address" }, { internalType: "uint192", name: "", type: "uint192" }, ], name: "nonceSequenceNumber", outputs: [{ internalType: "uint256", name: "", type: "uint256" }], stateMutability: "view", type: "function", } as const; export const simulateCallData = { inputs: [ { components: [ { internalType: "address", name: "sender", type: "address" }, { internalType: "uint256", name: "nonce", type: "uint256" }, { internalType: "bytes", name: "initCode", type: "bytes" }, { internalType: "bytes", name: "callData", type: "bytes" }, { internalType: "bytes32", name: "accountGasLimits", type: "bytes32" }, { internalType: "uint256", name: "preVerificationGas", type: "uint256" }, { internalType: "bytes32", name: "gasFees", type: "bytes32" }, { internalType: "bytes", name: "paymasterAndData", type: "bytes" }, { internalType: "bytes", name: "signature", type: "bytes" }, ], internalType: "struct PackedUserOperation", name: "op", type: "tuple", }, { internalType: "address", name: "target", type: "address" }, { internalType: "bytes", name: "targetCallData", type: "bytes" }, ], name: "simulateCallData", outputs: [ { components: [ { internalType: "uint256", name: "gasUsed", type: "uint256" }, { internalType: "bool", name: "success", type: "bool" }, { internalType: "bytes", name: "returnData", type: "bytes" }, ], internalType: "struct IEntryPointSimulations.TargetCallResult", name: "", type: "tuple", }, ], stateMutability: "nonpayable", type: "function", } as const; export const simulateHandleOp = { inputs: [ { components: [ { internalType: "address", name: "sender", type: "address" }, { internalType: "uint256", name: "nonce", type: "uint256" }, { internalType: "bytes", name: "initCode", type: "bytes" }, { internalType: "bytes", name: "callData", type: "bytes" }, { internalType: "bytes32", name: "accountGasLimits", type: "bytes32" }, { internalType: "uint256", name: "preVerificationGas", type: "uint256" }, { internalType: "bytes32", name: "gasFees", type: "bytes32" }, { internalType: "bytes", name: "paymasterAndData", type: "bytes" }, { internalType: "bytes", name: "signature", type: "bytes" }, ], internalType: "struct PackedUserOperation", name: "op", type: "tuple", }, ], name: "simulateHandleOp", outputs: [ { components: [ { internalType: "uint256", name: "preOpGas", type: "uint256" }, { internalType: "uint256", name: "paid", type: "uint256" }, { internalType: "uint256", name: "accountValidationData", type: "uint256" }, { internalType: "uint256", name: "paymasterValidationData", type: "uint256" }, { internalType: "bool", name: "targetSuccess", type: "bool" }, { internalType: "bytes", name: "targetResult", type: "bytes" }, ], internalType: "struct IEntryPointSimulations.ExecutionResult", name: "", type: "tuple", }, ], stateMutability: "nonpayable", type: "function", } as const; export const simulateValidation = { inputs: [ { components: [ { internalType: "address", name: "sender", type: "address" }, { internalType: "uint256", name: "nonce", type: "uint256" }, { internalType: "bytes", name: "initCode", type: "bytes" }, { internalType: "bytes", name: "callData", type: "bytes" }, { internalType: "bytes32", name: "accountGasLimits", type: "bytes32" }, { internalType: "uint256", name: "preVerificationGas", type: "uint256" }, { internalType: "bytes32", name: "gasFees", type: "bytes32" }, { internalType: "bytes", name: "paymasterAndData", type: "bytes" }, { internalType: "bytes", name: "signature", type: "bytes" }, ], internalType: "struct PackedUserOperation", name: "userOp", type: "tuple", }, ], name: "simulateValidation", outputs: [ { components: [ { components: [ { internalType: "uint256", name: "preOpGas", type: "uint256" }, { internalType: "uint256", name: "prefund", type: "uint256" }, { internalType: "uint256", name: "accountValidationData", type: "uint256" }, { internalType: "uint256", name: "paymasterValidationData", type: "uint256" }, { internalType: "bytes", name: "paymasterContext", type: "bytes" }, ], internalType: "struct IEntryPoint.ReturnInfo", name: "returnInfo", type: "tuple", }, { components: [ { internalType: "uint256", name: "stake", type: "uint256" }, { internalType: "uint256", name: "unstakeDelaySec", type: "uint256" }, ], internalType: "struct IStakeManager.StakeInfo", name: "senderInfo", type: "tuple", }, { components: [ { internalType: "uint256", name: "stake", type: "uint256" }, { internalType: "uint256", name: "unstakeDelaySec", type: "uint256" }, ], internalType: "struct IStakeManager.StakeInfo", name: "factoryInfo", type: "tuple", }, { components: [ { internalType: "uint256", name: "stake", type: "uint256" }, { internalType: "uint256", name: "unstakeDelaySec", type: "uint256" }, ], internalType: "struct IStakeManager.StakeInfo", name: "paymasterInfo", type: "tuple", }, { components: [ { internalType: "address", name: "aggregator", type: "address" }, { components: [ { internalType: "uint256", name: "stake", type: "uint256" }, { internalType: "uint256", name: "unstakeDelaySec", type: "uint256" }, ], internalType: "struct IStakeManager.StakeInfo", name: "stakeInfo", type: "tuple", }, ], internalType: "struct IEntryPoint.AggregatorStakeInfo", name: "aggregatorInfo", type: "tuple", }, ], internalType: "struct IEntryPointSimulations.ValidationResult", name: "", type: "tuple", }, ], stateMutability: "nonpayable", type: "function", } as const; export const supportsInterface = { inputs: [{ internalType: "bytes4", name: "interfaceId", type: "bytes4" }], name: "supportsInterface", outputs: [{ internalType: "bool", name: "", type: "bool" }], stateMutability: "view", type: "function", } as const; export const unlockStake = { inputs: [], name: "unlockStake", outputs: [], stateMutability: "nonpayable", type: "function", } as const; export const withdrawStake = { inputs: [{ internalType: "address payable", name: "withdrawAddress", type: "address" }], name: "withdrawStake", outputs: [], stateMutability: "nonpayable", type: "function", } as const; export const withdrawTo = { inputs: [ { internalType: "address payable", name: "withdrawAddress", type: "address" }, { internalType: "uint256", name: "withdrawAmount", type: "uint256" }, ], name: "withdrawTo", outputs: [], stateMutability: "nonpayable", type: "function", } as const; export const receive = { stateMutability: "payable", type: "receive" } as const; export const functions = [ _constructor, addStake, balanceOf, delegateAndRevert, depositTo, deposits, getDepositInfo, getNonce, getSenderAddress, getUserOpHash, handleAggregatedOps, handleOps, incrementNonce, innerHandleOp, nonceSequenceNumber, simulateCallData, simulateHandleOp, simulateValidation, supportsInterface, unlockStake, withdrawStake, withdrawTo, receive, ] as const; export const events = [ AccountDeployed, BeforeExecution, Deposited, PostOpRevertReason, SignatureAggregatorChanged, StakeLocked, StakeUnlocked, StakeWithdrawn, UserOperationEvent, UserOperationPrefundTooLow, UserOperationRevertReason, Withdrawn, ] as const; export const errors = [ DelegateAndRevert, FailedOp, FailedOpWithRevert, PostOpReverted, ReentrancyGuardReentrantCall, SenderAddressResult, SignatureValidationFailed, ] as const; export const abi = [...functions, ...events, ...errors] as const; export const bytecode = "0x60a08060405234620000ba5760016002556101df8181016001600160401b03811183821017620000a457829162005aff833903906000f0801562000098576080526200004a620000bf565b6000815260208101906000825280602062000064620000bf565b600081520152600380546001600160a01b03191690555160045551600555604051615a1f9081620000e08239608051815050f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b60408051919082016001600160401b03811183821017620000a45760405256fe60806040526004361015610024575b361561001957600080fd5b610022336143a4565b005b60003560e01c806242dc531461385057806301ffc9a71461371c5780630396cb601461346a5780630bd28e3b1461340c5780631b2e01b8146133a3578063205c28781461327a57806322cdde4c1461325a57806335567e1a146131cd5780635287ce12146130ea5780635895273b146124c757806370a082311461248d578063765e827f14612240578063850aaf62146121a35780639b249f69146120b7578063b760faf91461209b578063bb9fe6bf14611f1b578063c23a5cea14611d17578063c3bce00914611223578063c5f996e6146106f7578063dbed18e0146101975763fc7e286d0361000e5734610192576020600319360112610192576001600160a01b03610130613f68565b16600052600060205260a0604060002065ffffffffffff6001825492015460405192835260ff8116151560208401526dffffffffffffffffffffffffffff8160081c16604084015263ffffffff8160781c16606084015260981c166080820152f35b600080fd5b34610192576101a53661404e565b906101ae614700565b60009160005b8281106104e757506101c68493614292565b6000805b8481106102e55750507fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000809360005b81811061023d57610236868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2615668565b6001600255005b61028b61024b82848a61444b565b6001600160a01b0361025f602083016144df565b167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a28061448b565b906000915b8083106102a2575050506001016101ff565b909194976102dc6102d66001926102d08c8b6102c9826102c38e8b8d614324565b926142e1565b51916151ac565b906140af565b996140bc565b95019190610290565b60206102f282878961444b565b6103086102ff828061448b565b939092016144df565b916000926001600160a01b038091165b82851061032c5750505050506001016101ca565b909192939561035b83610354610342848c6142e1565b5161034e8b898b614324565b8561483c565b9290615960565b9116840361049b5761044f576103718491615960565b911661040357610391576103866001916140bc565b960193929190610318565b60a48760405190631101335b60e11b8252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b60848860405190631101335b60e11b8252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b60848860405190631101335b60e11b8252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b60848960405190631101335b60e11b8252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b6104f281848761444b565b936104fd858061448b565b91909560206001600160a01b036105158284016144df565b1697600192838a146106b35789610545575b50505050600192939495509061053c916140af565b939291016101b4565b8060406105539201906143fa565b918a3b1561019257929391906040519485937f2dd8113300000000000000000000000000000000000000000000000000000000855288604486016040600488015252606490818601918a60051b8701019680936000915b8c8310610633575050505050508383926105d1926003198560009803016024860152614383565b03818a5afa9081610624575b5061061357602486604051907f86a9f7500000000000000000000000000000000000000000000000000000000082526004820152fd5b939450849361053c60018980610527565b61062d90613ec8565b886105dd565b91939596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c908a9294969a0301865288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18336030181121561019257836106a0879385839401614543565b9a019601930190918997969594926105aa565b6064836040519062461bcd60e51b82526004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b34610192576003196060813601126101925767ffffffffffffffff6004351161019257610120906004353603011261019257610731613f52565b60443567ffffffffffffffff811161019257610751903690600401613f7e565b909160606040805161076281613eac565b60008152600060208201520152610777614209565b610785600435600401614739565b5a8151906001600160a01b0361079f6004356004016144df565b168252600480356024810135602085015260848101356fffffffffffffffffffffffffffffffff8181166060870152608091821c604087015260a483013560c087015260c4830135908116610100870152901c6101208501526108079160e4820191016143fa565b801561120757603481106111c3578060141161019257806024116101925760341161019257602481013560801c60a0840152601481013560801c60808401523560601c60e08301525b61085e600435600401614126565b60208401526040820151916effffffffffffffffffffffffffffff8360c08301511760608301511760808301511760a08301511761010083015117610120830151171161117f57604081015160608201510160808201510160a08201510160c082015101610100820151029284516001600160a01b03815116906108ec6044600435016004356004016143fa565b80610f31575b505060e001516001600160a01b031660008115610ef9575b602061094e91818a015160405193849283927f19822f7c0000000000000000000000000000000000000000000000000000000084526004356004016004850161593e565b038160008789f19081610ece575b50610a09576109fd3d610800808211610a01575b50604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b0390fd5b905082610970565b15610e61575b506001600160a01b03825116602083015190600052600160205260406000208160401c60005260205267ffffffffffffffff604060002091825492610a53846140bc565b90551603610e15575a830311610dc9576001600160a01b0360e0606092015116610b3f575b6080926040850152606084015260a46004350135905a9003019101526000926060916000936001600160a01b038216610aff575b505050610afb9060405192610ac084613eac565b835260208301931515845260408301908152604051938493602085525160208501525115156040840152516060808401526080830190614029565b0390f35b9091945060008094508093505a95826040519384928337810182815203925af1610afb610b36610b2d6140f6565b92935a906140e9565b91908480610aac565b505a9183516001600160a01b0360e08201511690816000526000602052604060002090815491848310610d7d576080600092869283610bbf960390550151936020890151836040518096819582947f52b7512c0000000000000000000000000000000000000000000000000000000084526004356004016004850161593e565b039287f160009181610cf6575b50610c75576109fd3d610800808211610c6d575b50604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b905082610be0565b935a900311610c845791610a78565b60a4604051631101335b60e11b81526000600482015260406024820152602760448201527f41413336206f766572207061796d6173746572566572696669636174696f6e4760648201527f61734c696d6974000000000000000000000000000000000000000000000000006084820152fd5b9091503d90816000823e610d0a8282613edc565b60408183810103126101925780519067ffffffffffffffff821161019257828101601f838301011215610192578181015190610d4582613eff565b93610d536040519586613edc565b8285528101602083858401010111610192576020610d7693818601920101614006565b908a610bcc565b6084604051631101335b60e11b81526000600482015260406024820152601e60448201527f41413331207061796d6173746572206465706f73697420746f6f206c6f7700006064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601e60448201527f41413236206f76657220766572696669636174696f6e4761734c696d697400006064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601a60448201527f4141323520696e76616c6964206163636f756e74206e6f6e63650000000000006064820152fd5b600052600060205260406000208054808611610e8257859003905588610a0f565b6084604051631101335b60e11b81526000600482015260406024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152fd5b602090813d8311610ef2575b610ee48183613edc565b81010312610192578b61095c565b503d610eda565b50816000526000602052604060002054868111600014610f24575061094e602060005b91505061090a565b602061094e918803610f1c565b833b61113357600060206001600160a01b036006541660408c510151604051809481937f570e1a3600000000000000000000000000000000000000000000000000000000835285600484015282610f8c602482018a8c614383565b0393f1908115611127576000916110f8575b506001600160a01b03811680156110ac578503611060573b1561101457601411610192576001600160a01b039183897fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d604060e0958787602086015195510151168251913560601c82526020820152a3916108f2565b6084604051631101335b60e11b81526000600482015260406024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152602060448201527f4141313420696e6974436f6465206d7573742072657475726e2073656e6465726064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601b60448201527f4141313320696e6974436f6465206661696c6564206f72204f4f4700000000006064820152fd5b61111a915060203d602011611120575b6111128183613edc565b810190614364565b8d610f9e565b503d611108565b6040513d6000823e3d90fd5b6084604051631101335b60e11b81526000600482015260406024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152fd5b606460405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b5050600060e083015260006080830152600060a0830152610850565b346101925761123136613fd3565b60405161123d81613e0c565b60405161124981613e0c565b6000815260006020820152600060408201526000606082015260606080820152815260405161127781613e90565b6000815260006020820152602082015260405161129381613e90565b600081526000602082015260408201526040516112af81613e90565b600081526000602082015260608201526080604051916112ce83613e90565b600083526040516112de81613e90565b6000815260006020820152602084015201526112f8614209565b9061130281614739565b6000905a928051936001600160a01b0361131b846144df565b168552602083013560208601526fffffffffffffffffffffffffffffffff6080840135166060860152608083013560801c604086015260a083013560c08601526fffffffffffffffffffffffffffffffff60c08401351661010086015260c083013560801c61012086015261139360e08401846143fa565b8015611cfb57603481106111c3578060141161019257806024116101925760341161019257602481013560801c60a0870152601481013560801c60808701523560601c60e08601525b6113e583614126565b60208301526040850151946effffffffffffffffffffffffffffff8660c08301511760608301511760808301511760a08301511761010083015117610120830151171161117f57604081015160608201510160808201510160a08201510160c082015101610100820151028351966001600160a01b038851169761146c60408801886143fa565b80611bf9575b505060e001516001600160a01b03169760008915611bc1575b60206114ca918189015160405193849283927f19822f7c0000000000000000000000000000000000000000000000000000000084528d6004850161593e565b038160008688f160009181611b8d575b5061157a576109fd3d610800808211610a015750604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b9815611b6c575b506001600160a01b03835116602084015190600052600160205260406000208160401c60005260205267ffffffffffffffff6040600020918254926115c5846140bc565b90551603610e15575a840311610dc9576001600160a01b0360e060609301511661199f575b6040840152606083015260a0830135905a90030160808201526001600160a01b0361161485615960565b911661195357611907576001600160a01b0361162f84615960565b91166118bb57611849576116506001600160a01b0360e08351015116615718565b916116886116686001600160a01b0384515116615718565b916000602060405161167981613e90565b828152015260408101906143fa565b6014811061183d57601411610192576116a4903560601c615718565b916001600160a01b038616946080820151966060604084015193015192604051986116ce8a613e0c565b895260208901526040880152606087015260808601526040516116f081613e90565b6001600160a01b0360035416815260405161170a81613e90565b6004548152600554602082015260208201529380151580611832575b61180b575b506040519461173986613e0c565b8552602085015260408401526060830152608082015260405180916020825260208060806117a78185516101408589015280516101608901528481015161018089015260408101516101a089015260608101516101c0890152015160a06101e0880152610200870190614029565b9382808201518051604089015201516060870152826040820151805184890152015160a0870152826060820151805160c0890152015160e087015201516001600160a01b038151166101008601520151805161012085015201516101408301520390f35b90935061181781615718565b6040519161182483613e90565b82526020820152928561172b565b506001811415611726565b50506116a46000615718565b60a4604051631101335b60e11b81526000600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b9450505a938251946001600160a01b0360e087015116806000526000602052604060002096875497848910610d7d576080600092869283611a1d9c0390550151926020880151838a6040519c8d95869485937f52b7512c0000000000000000000000000000000000000000000000000000000085526004850161593e565b039286f19687600091600099611adf575b50611ace576109fd3d610800808211610c6d5750604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b96915a900311610c845794906115ea565b915097503d90816000823e611af48282613edc565b60408183810103126101925780519067ffffffffffffffff821161019257828101601f838301011215610192578181015191611b2f83613eff565b93611b3d6040519586613edc565b838552820160208483850101011161019257602092611b63918480870191850101614006565b0151978a611a2e565b600052600060205260406000208054808411610e8257839003905588611581565b9091506020813d602011611bb9575b81611ba960209383613edc565b810103126101925751908b6114da565b3d9150611b9c565b50806000526000602052604060002054838111600014611bec57506114ca602060005b91505061148b565b60206114ca918503611be4565b8a3b61113357600060206001600160a01b036006541660408b510151604051809481937f570e1a3600000000000000000000000000000000000000000000000000000000835285600484015282611c54602482018a8c614383565b0393f190811561112757600091611cdc575b506001600160a01b03811680156110ac578c03611060573b1561101457601411610192576001600160a01b03918a887fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d604060e0958787602086015195510151168251913560601c82526020820152a391611472565b611cf5915060203d602011611120576111128183613edc565b8c611c66565b5050600060e086015260006080860152600060a08601526113dc565b346101925760208060031936011261019257611d31613f68565b33600052600082526001604060002001908154916dffffffffffffffffffffffffffff8360081c16928315611ed75765ffffffffffff8160981c168015611e93574210611e4f576000936001600160a01b03859485947fffffffffffffff000000000000000000000000000000000000000000000000ff86951690556040517fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3339180611df5878683602090939291936001600160a01b0360408201951681520152565b0390a2165af1611e036140f6565b5015611e0b57005b6064906040519062461bcd60e51b82526004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b6064856040519062461bcd60e51b82526004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b6064866040519062461bcd60e51b82526004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b6064856040519062461bcd60e51b82526004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b34610192576000600319360112610192573360005260006020526001604060002001805463ffffffff8160781c169081156120575760ff16156120135765ffffffffffff908142160191818311611fe45780547fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff001678ffffffffffff00000000000000000000000000000000000000609885901b161790556040519116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a2005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b606460405162461bcd60e51b815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b6020600319360112610192576100226120b2613f68565b6143a4565b346101925760206003193601126101925760043567ffffffffffffffff81116101925760206120ed61213c923690600401613f7e565b91906001600160a01b039283600654169060006040518097819582947f570e1a360000000000000000000000000000000000000000000000000000000084528860048501526024840191614383565b03925af190811561112757602492600092612182575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61219c91925060203d602011611120576111128183613edc565b9083612152565b34610192576040600319360112610192576121bc613f68565b60243567ffffffffffffffff8111610192576000916121e083923690600401613f7e565b90816040519283928337810184815203915af46121fb6140f6565b906109fd6040519283927f9941055400000000000000000000000000000000000000000000000000000000845215156004840152604060248401526044830190614029565b346101925761224e3661404e565b612259929192614700565b61226283614292565b60005b8481106122da57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000915b8583106122aa576102368585615668565b9091936001906122d06122be878987614324565b6122c888866142e1565b5190886151ac565b0194019190612299565b6123056122fe6122ec838597956142e1565b516122f8848987614324565b8461483c565b9190615960565b6001600160a01b0392918316612441576123f55761232290615960565b91166123a95761233757600101929092612265565b60a49060405190631101335b60e11b8252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b60848260405190631101335b60e11b8252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b60848360405190631101335b60e11b8252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b60848460405190631101335b60e11b8252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b34610192576020600319360112610192576001600160a01b036124ae613f68565b1660005260006020526020604060002054604051908152f35b34610192576124d536613fd3565b606060a06040516124e581613e74565b60008152600060208201526000604082015260008382015260006080820152015261250e614700565b612516614209565b61251f82614739565b6000905a9080516001600160a01b03612537866144df565b1681526020850135602082015260808501356fffffffffffffffffffffffffffffffff90818116606084015260801c604083015260a086013560c083015260c086013590811661010083015260801c61012082015261259960e08601866143fa565b80156130ce57603481106111c3578060141161019257806024116101925760341161019257602481013560801c60a0830152601481013560801c60808301523560601c60e08201525b6125eb85614126565b60208301526040810151926effffffffffffffffffffffffffffff8460c08401511760608401511760808401511760a08401511761010084015117610120840151171161117f57604082015160608301510160808301510160a08301510160c083015101610100830151028351946001600160a01b038651169561267260408a018a6143fa565b80612fcc575b505060e001516001600160a01b03169560008715612fa3575b6020808801518b6126cf60405194859384937f19822f7c0000000000000000000000000000000000000000000000000000000085526004850161593e565b038160008688f160009181612f6f575b5061277f576109fd3d610800808211610a015750604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b9615612f4e575b506001600160a01b03845116602085015190600052600160205260406000208160401c60005260205267ffffffffffffffff6040600020918254926127ca846140bc565b90551603610e15575a830311610dc9576001600160a01b0360e0606094015116612d8a575b604084015281606084015260a0860135905a90030160808301525a604051957fffffffff000000000000000000000000000000000000000000000000000000008761283d60608401846143fa565b600060038211612d82575b7f8dd7712f0000000000000000000000000000000000000000000000000000000094168403612c50575050506128fc6129da602093600093858901516128a260405193849389850152604060248501526064840190614543565b90604483015203906128bc601f1992838101835282613edc565b6129ce6040519485927e42dc5300000000000000000000000000000000000000000000000000000000898501526102006024850152610224840190614029565b61299d604484018c60806101a09180516001600160a01b03808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8382030161020484015289614029565b03908101835282613edc565b828151910182305af16000519660405215612aa6575b50506080015160405192610afb9291612a0885613e74565b845260208401948552604084019182526060840190815260808401906000825260405192612a3584613e90565b600284527f3078000000000000000000000000000000000000000000000000000000000000602085015260a0860193845260016002556040519687966020885251602088015251604087015251606086015251608085015251151560a08401525160c08084015260e0830190614029565b90929194506000903d602014612c3f575b7fdeaddead000000000000000000000000000000000000000000000000000000008203612b2a576084604051631101335b60e11b81526000600482015260406024820152600f60448201527f41413935206f7574206f662067617300000000000000000000000000000000006064820152fd5b610afb936080927fdeadaa510000000000000000000000000000000000000000000000000000000003612b925750612b66612b70915a906140e9565b82870151906140af565b612b89604087015191612b8288615825565b82886157c3565b945b91926129f0565b612c2a612c20612c319360208a01518a51907ff62676f440ff169a3a9afdbf812e89e7f95975ee8e5c31214ffdef631c5f479260206001600160a01b038451169301513d90610800808311612c37575b50604051916020818401016040528083526000602084013e612c166040519283928352604060208401526040830190614029565b0390a35a906140e9565b84890151906140af565b9087614607565b94612b8b565b91508f612be2565b905060206000803e60005190612ab7565b612d78945082935090612c98917e42dc53000000000000000000000000000000000000000000000000000000006020612d6a9501526102006024860152610224850191614383565b612d39604484018860806101a09180516001600160a01b03808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8382030161020484015285614029565b03601f198101885287613edc565b60206000876129da565b508135612848565b915093505a938251946001600160a01b0360e087015116806000526000602052604060002096875497858910610d7d576080600092879283612e099c0390550151926020880151838c6040519c8d95869485937f52b7512c0000000000000000000000000000000000000000000000000000000085526004850161593e565b039286f19687600091600099612ecb575b50612eba576109fd3d610800808211610c6d5750604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b96915a900311610c845794916127ef565b915097503d806000833e612edf8183613edc565b81019060408183031261019257805167ffffffffffffffff81116101925781019082601f8