UNPKG

@layerzerolabs/oft-alt-evm

Version:

LayerZero Labs reference EVM OmniChain Fungible Token (OFT) implementation

1 lines 282 kB
{"abi":[{"type":"constructor","inputs":[{"name":"_verifyHelper","type":"address","internalType":"address payable"},{"name":"_endpoint","type":"address","internalType":"address"},{"name":"_treasuryGasLimit","type":"uint256","internalType":"uint256"},{"name":"_treasuryGasForFeeCap","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"receive","stateMutability":"payable"},{"type":"function","name":"cmdHashLookup","inputs":[{"name":"oapp","type":"address","internalType":"address"},{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"nonce","type":"uint64","internalType":"uint64"}],"outputs":[{"name":"cmdHash","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"commitVerification","inputs":[{"name":"_packetHeader","type":"bytes","internalType":"bytes"},{"name":"_cmdHash","type":"bytes32","internalType":"bytes32"},{"name":"_payloadHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"fees","inputs":[{"name":"worker","type":"address","internalType":"address"}],"outputs":[{"name":"fee","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getAppReadLibConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_remoteEid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getConfig","inputs":[{"name":"_eid","type":"uint32","internalType":"uint32"},{"name":"_oapp","type":"address","internalType":"address"},{"name":"_configType","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getReadLibConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_remoteEid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"rtnConfig","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"stateMutability":"view"},{"type":"function","name":"getTreasuryAndNativeFeeCap","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"hashLookup","inputs":[{"name":"headerHash","type":"bytes32","internalType":"bytes32"},{"name":"cmdHash","type":"bytes32","internalType":"bytes32"},{"name":"dvn","type":"address","internalType":"address"}],"outputs":[{"name":"payloadHash","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"isSupportedEid","inputs":[{"name":"_eid","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"messageLibType","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"enum MessageLibType"}],"stateMutability":"pure"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"quote","inputs":[{"name":"_packet","type":"tuple","internalType":"struct Packet","components":[{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"srcEid","type":"uint32","internalType":"uint32"},{"name":"sender","type":"address","internalType":"address"},{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"receiver","type":"bytes32","internalType":"bytes32"},{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"message","type":"bytes","internalType":"bytes"}]},{"name":"_options","type":"bytes","internalType":"bytes"},{"name":"_payInLzToken","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"tuple","internalType":"struct MessagingFee","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"send","inputs":[{"name":"_packet","type":"tuple","internalType":"struct Packet","components":[{"name":"nonce","type":"uint64","internalType":"uint64"},{"name":"srcEid","type":"uint32","internalType":"uint32"},{"name":"sender","type":"address","internalType":"address"},{"name":"dstEid","type":"uint32","internalType":"uint32"},{"name":"receiver","type":"bytes32","internalType":"bytes32"},{"name":"guid","type":"bytes32","internalType":"bytes32"},{"name":"message","type":"bytes","internalType":"bytes"}]},{"name":"_options","type":"bytes","internalType":"bytes"},{"name":"_payInLzToken","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"tuple","internalType":"struct MessagingFee","components":[{"name":"nativeFee","type":"uint256","internalType":"uint256"},{"name":"lzTokenFee","type":"uint256","internalType":"uint256"}]},{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"function","name":"setConfig","inputs":[{"name":"_oapp","type":"address","internalType":"address"},{"name":"_params","type":"tuple[]","internalType":"struct SetConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"configType","type":"uint32","internalType":"uint32"},{"name":"config","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDefaultReadLibConfigs","inputs":[{"name":"_params","type":"tuple[]","internalType":"struct SetDefaultReadLibConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"config","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTreasury","inputs":[{"name":"_treasury","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTreasuryNativeFeeCap","inputs":[{"name":"_newTreasuryNativeFeeCap","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"_interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"testHelper","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract TestHelperOz5"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"verifiable","inputs":[{"name":"_config","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]},{"name":"_headerHash","type":"bytes32","internalType":"bytes32"},{"name":"_cmdHash","type":"bytes32","internalType":"bytes32"},{"name":"_payloadHash","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"verify","inputs":[{"name":"_packetHeader","type":"bytes","internalType":"bytes"},{"name":"_cmdHash","type":"bytes32","internalType":"bytes32"},{"name":"_payloadHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"version","inputs":[],"outputs":[{"name":"major","type":"uint64","internalType":"uint64"},{"name":"minor","type":"uint8","internalType":"uint8"},{"name":"endpointVersion","type":"uint8","internalType":"uint8"}],"stateMutability":"pure"},{"type":"function","name":"withdrawFee","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawLzTokenFee","inputs":[{"name":"_lzToken","type":"address","internalType":"address"},{"name":"_to","type":"address","internalType":"address"},{"name":"_amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DVNFeePaid","inputs":[{"name":"requiredDVNs","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","indexed":false,"internalType":"address[]"},{"name":"fees","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"DefaultReadLibConfigsSet","inputs":[{"name":"params","type":"tuple[]","indexed":false,"internalType":"struct SetDefaultReadLibConfigParam[]","components":[{"name":"eid","type":"uint32","internalType":"uint32"},{"name":"config","type":"tuple","internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}]}],"anonymous":false},{"type":"event","name":"ExecutorFeePaid","inputs":[{"name":"executor","type":"address","indexed":false,"internalType":"address"},{"name":"fee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"LzTokenFeeWithdrawn","inputs":[{"name":"lzToken","type":"address","indexed":false,"internalType":"address"},{"name":"receiver","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NativeFeeWithdrawn","inputs":[{"name":"worker","type":"address","indexed":false,"internalType":"address"},{"name":"receiver","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"PayloadVerified","inputs":[{"name":"dvn","type":"address","indexed":false,"internalType":"address"},{"name":"header","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"cmdHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"payloadHash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ReadLibConfigSet","inputs":[{"name":"oapp","type":"address","indexed":false,"internalType":"address"},{"name":"eid","type":"uint32","indexed":false,"internalType":"uint32"},{"name":"config","type":"tuple","indexed":false,"internalType":"struct ReadLibConfig","components":[{"name":"executor","type":"address","internalType":"address"},{"name":"requiredDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNCount","type":"uint8","internalType":"uint8"},{"name":"optionalDVNThreshold","type":"uint8","internalType":"uint8"},{"name":"requiredDVNs","type":"address[]","internalType":"address[]"},{"name":"optionalDVNs","type":"address[]","internalType":"address[]"}]}],"anonymous":false},{"type":"event","name":"TreasuryNativeFeeCapSet","inputs":[{"name":"newTreasuryNativeFeeCap","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TreasurySet","inputs":[{"name":"treasury","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"error","name":"DVN_InvalidDVNIdx","inputs":[]},{"type":"error","name":"DVN_InvalidDVNOptions","inputs":[{"name":"cursor","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_MessageLib_OnlyEndpoint","inputs":[]},{"type":"error","name":"LZ_RL_AtLeastOneDVN","inputs":[]},{"type":"error","name":"LZ_RL_CannotWithdrawAltToken","inputs":[]},{"type":"error","name":"LZ_RL_InvalidAmount","inputs":[{"name":"requested","type":"uint256","internalType":"uint256"},{"name":"available","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_RL_InvalidCmdHash","inputs":[]},{"type":"error","name":"LZ_RL_InvalidConfigType","inputs":[{"name":"configType","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"LZ_RL_InvalidEid","inputs":[]},{"type":"error","name":"LZ_RL_InvalidExecutor","inputs":[]},{"type":"error","name":"LZ_RL_InvalidOptionalDVNCount","inputs":[]},{"type":"error","name":"LZ_RL_InvalidOptionalDVNThreshold","inputs":[]},{"type":"error","name":"LZ_RL_InvalidPacketHeader","inputs":[]},{"type":"error","name":"LZ_RL_InvalidPacketVersion","inputs":[]},{"type":"error","name":"LZ_RL_InvalidReceiver","inputs":[]},{"type":"error","name":"LZ_RL_InvalidRequiredDVNCount","inputs":[]},{"type":"error","name":"LZ_RL_NotTreasury","inputs":[]},{"type":"error","name":"LZ_RL_Unsorted","inputs":[]},{"type":"error","name":"LZ_RL_UnsupportedEid","inputs":[{"name":"eid","type":"uint32","internalType":"uint32"}]},{"type":"error","name":"LZ_RL_Verifying","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidLegacyType1Option","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidLegacyType2Option","inputs":[]},{"type":"error","name":"LZ_ULN_InvalidWorkerId","inputs":[{"name":"workerId","type":"uint8","internalType":"uint8"}]},{"type":"error","name":"LZ_ULN_InvalidWorkerOptions","inputs":[{"name":"cursor","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"LZ_ULN_UnsupportedOptionType","inputs":[{"name":"optionType","type":"uint16","internalType":"uint16"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"type":"error","name":"Transfer_NativeFailed","inputs":[{"name":"_to","type":"address","internalType":"address"},{"name":"_value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"Transfer_ToAddressIsZero","inputs":[]}],"bytecode":{"object":"0x60e060405234801562000010575f80fd5b5060405162005cb238038062005cb2833981016040819052620000339162000170565b82836001600160a01b031663416ecebf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000071573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000979190620001ba565b3380620000bd57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b620000c88162000109565b506001600160a01b0391821660805263ffffffff1660a05260c092909252600655600280546001600160a01b031916939091169290921790915550620001e6565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200016d575f80fd5b50565b5f805f806080858703121562000184575f80fd5b8451620001918162000158565b6020860151909450620001a48162000158565b6040860151606090960151949790965092505050565b5f60208284031215620001cb575f80fd5b815163ffffffff81168114620001df575f80fd5b9392505050565b60805160a05160c051615a7e620002345f395f81816121c00152612ffa01525f610e0f01525f81816107510152818161089401528181610a0f01528181610ff80152611cee0152615a7e5ff3fe60806040526004361061019c575f3560e01c80637620fd01116100dc578063d15b0d4911610087578063f0f4426011610062578063f0f442601461055b578063f2fde38b1461057a578063faaebd2114610599578063fd9be522146105c4575f80fd5b8063d15b0d49146104f1578063d80e9bd914610510578063ea69d69d1461053c575f80fd5b80639c33abf7116100b75780639c33abf714610487578063ab750e75146104b3578063c85f4b4e146104d2575f80fd5b80637620fd01146103d65780638da5cb5b146104325780638eb0bf301461045b575f80fd5b806320efd7221161014757806354fd4d501161012257806354fd4d5014610359578063594924da146103845780636750cd4c146103a3578063715018a6146103c2575f80fd5b806320efd722146102d15780633c782a52146102f05780634389e58f1461032c575f80fd5b80631881d94d116101775780631881d94d1461024b5780631fb5122514610266578063200175f7146102b0575f80fd5b806301ffc9a7146101a7578063052368ca146101db5780630e97289b146101fa575f80fd5b366101a357005b5f80fd5b3480156101b2575f80fd5b506101c66101c1366004614622565b6105e3565b60405190151581526020015b60405180910390f35b3480156101e6575f80fd5b506101c66101f5366004614661565b6106c7565b348015610205575f80fd5b506002546102269073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b348015610256575f80fd5b5060026040516101d291906146b5565b348015610271575f80fd5b506102a261028036600461474f565b600360209081525f938452604080852082529284528284209052825290205481565b6040519081526020016101d2565b3480156102bb575f80fd5b506102cf6102ca366004614791565b6106e7565b005b3480156102dc575f80fd5b506102cf6102eb366004614817565b610892565b3480156102fb575f80fd5b506102a261030a366004614868565b600460209081525f938452604080852082529284528284209052825290205481565b348015610337575f80fd5b5061034b6103463660046148dc565b6109f8565b6040516101d29291906149c9565b348015610364575f80fd5b5060408051600a81525f60208201526002918101919091526060016101d2565b34801561038f575f80fd5b506102cf61039e3660046149ec565b610d8d565b3480156103ae575f80fd5b506101c66103bd366004614a39565b61105c565b3480156103cd575f80fd5b506102cf611066565b3480156103e1575f80fd5b5061040660075460065473ffffffffffffffffffffffffffffffffffffffff90911691565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101d2565b34801561043d575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610226565b348015610466575f80fd5b5061047a610475366004614a52565b611079565b6040516101d29190614b52565b348015610492575f80fd5b506104a66104a1366004614b64565b6114bd565b6040516101d29190614b9d565b3480156104be575f80fd5b506102cf6104cd3660046149ec565b61155d565b3480156104dd575f80fd5b506102cf6104ec366004614baf565b6115e6565b3480156104fc575f80fd5b506102cf61050b366004614bee565b6117cd565b34801561051b575f80fd5b5061052f61052a3660046148dc565b61185b565b6040516101d29190614c05565b348015610547575f80fd5b5061047a610556366004614a52565b6119c4565b348015610566575f80fd5b506102cf610575366004614c1c565b611b7e565b348015610585575f80fd5b506102cf610594366004614c1c565b611bf9565b3480156105a4575f80fd5b506102a26105b3366004614c1c565b60056020525f908152604090205481565b3480156105cf575f80fd5b506102cf6105de366004614c37565b611c5c565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f97f0258400000000000000000000000000000000000000000000000000000000148061067557507fffffffff0000000000000000000000000000000000000000000000000000000082167fb6e9ace300000000000000000000000000000000000000000000000000000000145b806106c157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b5f6106dc6106d486614e6e565b858585611dcc565b90505b949350505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610738576040517f96830d1e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107dc9190614e79565b73ffffffffffffffffffffffffffffffffffffffff1603610829576040517fb77f504400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610834838383611f39565b6040805173ffffffffffffffffffffffffffffffffffffffff8086168252841660208201529081018290527fe081464b7278501267de69fa85b7b9560b0ae05d5fbfaab9b1986c70356e2efe906060015b60405180910390a1505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610901576040517f467409c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b818110156109f2573683838381811061091e5761091e614e94565b90506020028101906109309190614ec1565b90506109476109426020830183614a39565b611fac565b60016109596040830160208401614a39565b63ffffffff1603610999576109946109746020830183614a39565b866109826040850185614efd565b81019061098f9190614f5e565b611ff3565b6109e9565b6109a96040820160208301614a39565b6040517f0cb84e8200000000000000000000000000000000000000000000000000000000815263ffffffff90911660048201526024015b60405180910390fd5b50600101610903565b50505050565b604080518082019091525f808252602082015260607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163314610a7c576040517f467409c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080860135610aad610a946060890160408a01614c1c565b73ffffffffffffffffffffffffffffffffffffffff1690565b14610ae4576040517fa4884a5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80610af188888861203c565b90925090505f80610b22610b0b60608c0160408d01614c1c565b610b1b60808d0160608e01614a39565b858a6120c1565b9092509050610b318284614fbd565b9250610b4060c08b018b614efd565b604051610b4e929190614fd0565b604051809103902060035f8c6040016020810190610b6c9190614c1c565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f90812090610ba460808e0160608f01614a39565b63ffffffff1681526020808201929092526040015f90812091610bc9908e018e614fdf565b67ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f20819055505f610ce36040518060e001604052808d5f016020810190610c0f9190614fdf565b67ffffffffffffffff1681526020018d6060016020810190610c319190614a39565b63ffffffff1681526020018d6040016020810190610c4f9190614c1c565b73ffffffffffffffffffffffffffffffffffffffff1681526020018d6020016020810190610c7d9190614a39565b63ffffffff16815260808e0135602082015260a08e01356040820152606001610ca960c08f018f614efd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061224b565b6002546040517ffaed6c5800000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063faed6c5890610d3e9084908e908e9060040161503f565b5f604051808303815f87803b158015610d55575f80fd5b505af1158015610d67573d5f803e3d5ffd5b505060408051808201909152958652505050602083015250925090505b94509492505050565b60518314610dc7576040517f864d08b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001610dd385856122b0565b60ff1614610e0d576040517f7952a82f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff16610e3e85856122d1565b63ffffffff1614610e7b576040517f3e96df1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610e8685856122f3565b90505f610e938686612304565b90505f610ea08787612313565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260036020908152604080832063ffffffff87168452825280832067ffffffffffffffff851684529091529020549091508514610f23576040517f660e96ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610f2e8484611079565b9050610f53818989604051610f44929190614fd0565b60405180910390208888612335565b5f60405180606001604052808563ffffffff168152602001610f758b8b6124ca565b815267ffffffffffffffff858116602092830152604080517fa825d747000000000000000000000000000000000000000000000000000000008152845163ffffffff16600482015292840151602484015283015116604482015273ffffffffffffffffffffffffffffffffffffffff8781166064830152608482018990529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a825d7479060a4015f604051808303815f87803b15801561103b575f80fd5b505af115801561104d573d5f803e3d5ffd5b50505050505050505050505050565b5f6106c1826124e2565b61106e612560565b6110775f6125b2565b565b6040805160c0810182525f808252602080830182905282840182905260608084018390526080840181905260a084015263ffffffff85168083527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49825284832073ffffffffffffffffffffffffffffffffffffffff88811685526001845286852092855291909252939091208054929391929091168061113057825473ffffffffffffffffffffffffffffffffffffffff16611132565b805b73ffffffffffffffffffffffffffffffffffffffff168452815474010000000000000000000000000000000000000000900460ff1661122257825474010000000000000000000000000000000000000000900460ff161561121d57826001018054806020026020016040519081016040528092919081815260200182805480156111f057602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111c5575b50505050506080850152825474010000000000000000000000000000000000000000900460ff1660208501525b6112d6565b815474010000000000000000000000000000000000000000900460ff908116146112d657816001018054806020026020016040519081016040528092919081815260200182805480156112a957602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161127e575b50505050506080850152815474010000000000000000000000000000000000000000900460ff1660208501525b81547501000000000000000000000000000000000000000000900460ff166113d35782547501000000000000000000000000000000000000000000900460ff16156113ce578260020180548060200260200160405190810160405280929190818152602001828054801561137e57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611353575b505050505060a0850152825460ff75010000000000000000000000000000000000000000008204811660408701527601000000000000000000000000000000000000000000009091041660608501525b6114ab565b81547501000000000000000000000000000000000000000000900460ff908116146114ab578160020180548060200260200160405190810160405280929190818152602001828054801561145b57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611430575b505050505060a0850152815460ff75010000000000000000000000000000000000000000008204811660408701527601000000000000000000000000000000000000000000009091041660608501525b6114b484612626565b50505092915050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff63ffffffff83160161151c576114f68385611079565b6040516020016115069190614b52565b6040516020818303038152906040529050611556565b6040517f0cb84e8200000000000000000000000000000000000000000000000000000000815263ffffffff831660048201526024016109e0565b9392505050565b8060045f8686604051611571929190614fd0565b604080519182900390912082526020808301939093529081015f90812086825283528181203380835293528190209290925590517f04708e5dfef6005d6d646eb761e3b9e412e1cc5749fc9d884bca441cc7a95258916115d891879087908790879061506e565b60405180910390a150505050565b6115ee612560565b5f5b8181101561178f573683838381811061160b5761160b614e94565b905060200281019061161d91906150b1565b905060ff61162e60208301836150e3565b61163f906040810190602001615115565b60ff1603611679576040517f55a01c0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff61168860208301836150e3565b611699906060810190604001615115565b60ff16036116d3576040517fe35436c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f16116e360208301836150e3565b6116ec90614e6e565b612626565b5f6116ff60208301836150e3565b61170d906020810190614c1c565b73ffffffffffffffffffffffffffffffffffffffff160361175a576040517f76df55a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117865f61176b6020840184614a39565b61177860208501856150e3565b61178190614e6e565b612677565b506001016115f0565b507f65edb7dc0f21ba15c998f8bd220ea9fec30757ff9fb07696c634bcce00ce6f3482826040516117c19291906151da565b60405180910390a15050565b6117d5612560565b60065481111561181f576006546040517fb79d12630000000000000000000000000000000000000000000000000000000081526109e0918391600401918252602082015260400190565b60068190556040518181527f491ff913b5444f4136b0d4075f020cfe3a5f60de926ec0b091612401a22b7842906020015b60405180910390a150565b604080518082019091525f80825260208201525f8061187a8686612a25565b90925090505f6118906060890160408a01614c1c565b90505f6118a360808a0160608b01614a39565b90505f6118b08383611079565b90505f6118df82856118c96118c48f61540c565b612c5b565b8e8060c001906118d99190614efd565b8a612d2f565b82516040517fc8f8dcd100000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff169063c8f8dcd1906119379087908a906004016154a7565b602060405180830381865afa158015611952573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061197691906154d5565b6119809082614fbd565b90505f806119908686858d612efb565b909250905061199f8284614fbd565b6040805180820190915290815260208101919091529c9b505050505050505050505050565b6040805160c0810182525f808252602082018190529181018290526060808201929092526080810182905260a081019190915273ffffffffffffffffffffffffffffffffffffffff8084165f90815260016020818152604080842063ffffffff88168552825292839020835160c0810185528154958616815260ff7401000000000000000000000000000000000000000087048116828501527501000000000000000000000000000000000000000000870481168287015276010000000000000000000000000000000000000000000090960490951660608601529182018054845181840281018401909552808552929360808601939092830182828015611b0057602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611ad5575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611b6d57602002820191905f5260205f20905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611b42575b505050505081525050905092915050565b611b86612560565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f3c864541ef71378c6229510ed90f376565ee42d9c5e0904a984a9e863e6db44f90602001611850565b611c01612560565b73ffffffffffffffffffffffffffffffffffffffff8116611c50576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016109e0565b611c59816125b2565b50565b335f9081526005602052604090205480821115611caf576040517fb79d126300000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016109e0565b335f908152600560209081526040808320858503905580517fe1758bd800000000000000000000000000000000000000000000000000000000815290517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169263e1758bd892600480820193918290030181865afa158015611d48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d6c9190614e79565b9050611d7981858561303c565b6040805133815273ffffffffffffffffffffffffffffffffffffffff861660208201529081018490527f820b7fd51bf79c54350bab98400651b3314ff6e79b33528821871d94a6669883906060016115d8565b60208401515f9060ff1615611e80575f5b856020015160ff168160ff161015611e6957611e5486608001518260ff1681518110611e0b57611e0b614e94565b60200260200101518686865f92835260046020908152604080852093855292815282842073ffffffffffffffffffffffffffffffffffffffff9095168452939093529020541490565b611e61575f9150506106df565b600101611ddd565b50846040015160ff165f03611e80575060016106df565b60608501515f5b866040015160ff168160ff161015611f2d57611efe8760a001518260ff1681518110611eb557611eb5614e94565b60200260200101518787875f92835260046020908152604080852093855292815282842073ffffffffffffffffffffffffffffffffffffffff9095168452939093529020541490565b15611f255781611f0d816154ec565b9250508160ff165f03611f25576001925050506106df565b600101611e87565b505f9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216611f86576040517f6b7a931000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa773ffffffffffffffffffffffffffffffffffffffff8416838361306c565b505050565b611fb5816124e2565b611c59576040517f0ff03e5400000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526024016109e0565b611ffe828483612677565b6120088284611079565b507fe8e2a5b92fc69ac50188ea142042492be8e8c34febb10b2cd02983684336e14282848360405161088593929190615526565b60605f805f61204b8686612a25565b90925090505f61207461206460608a0160408b01614c1c565b61047560808b0160608c01614a39565b80519091506120939061208d60608b0160408c01614c1c565b856130f9565b93505f806120a2838b86613227565b90925090506120b18287614fbd565b909a909950975050505050505050565b6007545f90819073ffffffffffffffffffffffffffffffffffffffff1615610d845760405173ffffffffffffffffffffffffffffffffffffffff8716602482015263ffffffff861660448201526064810185905283151560848201525f9060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd51c5486000000000000000000000000000000000000000000000000000000001790526007549192505f9182916121e89173ffffffffffffffffffffffffffffffffffffffff16907f0000000000000000000000000000000000000000000000000000000000000000908490876132ed565b915091506121f887878484613398565b9095509350841561223f5760075473ffffffffffffffffffffffffffffffffffffffff165f9081526005602052604081208054879290612239908490614fbd565b90915550505b50505094509492505050565b8051602080830151604080850151606080870151608088015160a089015160c08a01519551939861229a986001989197919673ffffffffffffffffffffffffffffffffffffffff169501615560565b6040516020818303038152906040529050919050565b5f6122be6001828486615625565b6122c79161564c565b60f81c9392505050565b5f6122e06031602d8486615625565b6122e991615694565b60e01c9392505050565b5f611556612301848461340f565b90565b5f6122e0600d60098486615625565b5f612322600960018486615625565b61232b916156da565b60c01c9392505050565b61234184848484611dcc565b612377576040517f28ca4b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602084015160ff161561241e575f5b846020015160ff168160ff16101561241c575f84815260046020908152604080832086845290915281206080870151805191929160ff85169081106123cd576123cd614e94565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9055806001019050612386565b505b604084015160ff16156109f2575f5b846040015160ff168160ff1610156124c3575f848152600460209081526040808320868452909152812060a0870151805191929160ff851690811061247457612474614e94565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f905580600101905061242d565b5050505050565b5f6124d9602d600d8486615625565b61155691615720565b63ffffffff81165f9081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4960205260408120805474010000000000000000000000000000000000000000900460ff16151580611556575054760100000000000000000000000000000000000000000000900460ff16151592915050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611077576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016109e0565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b602081015160ff161580156126405750606081015160ff16155b15611c59576040517f9b5f9f7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015160ff90811614806126925750602081015160ff16155b156126d957608081015151156126d4576040517f55a01c0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612758565b806020015160ff16816080015151141580612714575060026126fd600160ff61575c565b6127079190615775565b60ff16816020015160ff16115b1561274b576040517f55a01c0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612758816080015161341e565b604081015160ff90811614806127735750604081015160ff16155b156127f95760a081015151156127b5576040517fe35436c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015160ff16156127f4576040517ff92940be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128d0565b806040015160ff168160a00151511415806128345750600261281d600160ff61575c565b6128279190615775565b60ff16816040015160ff16115b1561286b576040517fe35436c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015160ff16158061288c5750806040015160ff16816060015160ff16115b156128c3576040517ff92940be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128d08160a0015161341e565b73ffffffffffffffffffffffffffffffffffffffff8381165f90815260016020818152604080842063ffffffff881685528252928390208551815487840151958801516060890151929097167fffffffffffffffffffffff000000000000000000000000000000000000000000909116177401000000000000000000000000000000000000000060ff96871602177fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000968616969096027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16959095177601000000000000000000000000000000000000000000009490951693909302939093178255608084015180518594612a0193850192019061458f565b5060a08201518051612a1d91600284019160209091019061458f565b505050505050565b6060806002831015612a65576040517f6592671c0000000000000000000000000000000000000000000000000000000081525f60048201526024016109e0565b5f612a736002828688615625565b612a7c916157bb565b60f01c905060027ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8201612c4457805f5b86831015612bd1575f612ac560018501858a8c615625565b612ace9161564c565b60f81c90505f819003612b0f576040517f6780cfaf0000000000000000000000000000000000000000000000000000000081525f60048201526024016109e0565b8160ff165f03612b2157809150612b5d565b8160ff168160ff1614612b5d57365f612b3c86868c8e615625565b91509150612b4d89898685856134b6565b9099509750859450919250829150505b60018401935f90612b7390600301868b8d615625565b612b7c916157bb565b60f01c90505f819003612bbe576040517f6592671c000000000000000000000000000000000000000000000000000000008152600481018690526024016109e0565b8060020161ffff16850194505050612aad565b828714612c0d576040517f6592671c000000000000000000000000000000000000000000000000000000008152600481018490526024016109e0565b6002871115612c3d57365f612c2485858b8d615625565b91509150612c3588888585856134b6565b909850965050505b5050612c52565b612c4f828787613629565b93505b50509250929050565b8051602080830151604080850151606080870151608088015193517f01000000000000000000000000000000000000000000000000000000000000009681019690965260c09690961b7fffffffffffffffff00000000000000000000000000000000000000000000000016602186015260e093841b7fffffffff00000000000000000000000000000000000000000000000000000000908116602987015273ffffffffffffffffffffffffffffffffffffffff909216602d8601529490921b909116604d830152605182015260710161229a565b5f805f612d3b846138a4565b915091505f89604001518a60200151612d549190615801565b90505f5b8160ff168160ff161015612eed575f8b6020015160ff168260ff1610612dac5760a08c015160208d0151612d8c908461575c565b60ff1681518110612d9f57612d9f614e94565b6020026020010151612dce565b8b608001518260ff1681518110612dc557612dc5614e94565b60200260200101515b60408051602081019091525f808252919250905b8551811015612e3a578360ff16868281518110612e0157612e01614e94565b602002602001015160ff1603612e3257868181518110612e2357612e23614e94565b60200260200101519150612e3a565b600101612de2565b506040517ffdb9b0f100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063fdb9b0f190612e95908f908f908f908f90889060040161581a565b602060405180830381865afa158015612eb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed491906154d5565b612ede9088614fbd565b96505050806001019050612d58565b505050509695505050505050565b6007545f90819073ffffffffffffffffffffffffffffffffffffffff1615610d845760405173ffffffffffffffffffffffffffffffffffffffff8716602482015263ffffffff861660448201526064810185905283151560848201525f9060a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd4244221000000000000000000000000000000000000000000000000000000001790526007549192505f9182916130209173ffffffffffffffffffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000009086613b3e565b9150915061303087878484613398565b94509450505050610d84565b73ffffffffffffffffffffffffffffffffffffffff831661306157611fa78282613be5565b611fa7838383611f39565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611fa7908490613ce7565b6040517fc015bb7d0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff85169063c015bb7d9061314f90869086906004016154a7565b6020604051808303815f875af115801561316b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061318f91906154d5565b905080156131d15773ffffffffffffffffffffffffffffffffffffffff84165f90815260056020526040812080548392906131cb908490614fbd565b90915550505b6040805173ffffffffffffffffffffffffffffffffffffffff86168152602081018390527f61ed099e74a97a1d7f8bb0952a88ca8b7b8ebd00c126ea04671f92a81213318a910160405180910390a19392505050565b5f6060816132376118c48661540c565b90505f61324b6132468761540c565b613d86565b905060606132768861326289840160408b01614c1c565b8561327060c08c018c614efd565b8b613da3565b604051919650915061328e908490849060200161587b565b60405160208183030381529060405293507f07ea52d82345d6e838192107d8fd7123d9c2ec8e916cd0aad13fd2b60db2464488608001518960a00151836040516132da939291906158a9565b60405180910390a1505050935093915050565b5f6060863b80830361331257604080515f80825260208201909252925092505061338e565b5f805f8761ffff1667ffffffffffffffff81111561333257613332614c61565b6040519080825280601f01601f19166020018201604052801561335c576020820181803683370190505b5090505f80885160208a018c8f8ff191503d92508783111561337c578792505b828152825f602083013e909450925050505b9550959350505050565b5f808315806133a8575082516020115b156133b757505f905080610d84565b5f838060200190518101906133cc91906154d5565b905085156133dc57809150613405565b5f60065488116133ee576006546133f0565b875b90508082116133ff5781613401565b805b9350505b5094509492505050565b5f6124d9605160318486615625565b5f805b8251811015611fa7575f83828151811061343d5761343d614e94565b602002602001015190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16116134ac576040517fc0762a5d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150600101613421565b6060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff86160161355057865115613513578684846040516020016134ff93929190615905565b604051602081830303815290604052613549565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b965061361e565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe60ff8616016135e7578551156135aa5785848460405160200161359693929190615905565b6040516020818303038152906040526135e0565b83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505b955061361e565b6040517f6780cfaf00000000000000000000000000000000000000000000000000000000815260ff861660048201526024016109e0565b509495939450505050565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61ffff85160161374e5760228214613690576040517f0dc652a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6136b06136a2602260028688615625565b6136ab91615720565b614072565b6040517f0100000000000000000000000000000000000000000000000000000000000000602082018190527e11000000000000000000000000000000000000000000000000000000000000602183015260238201527fffffffffffffffffffffffffffffffff00000000000000000000000000000000608083901b166024820152909150603401604051602081830303815290604052915050611556565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe61ffff85160161386c576042821115806137895750606282115b156137c0576040517fc0927c5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6137d26136a2602260028688615625565b90505f6137e66136a2604260228789615625565b90505f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbe8501613819866042818a615625565b61382291615720565b60405160086020938403029190911c9250613853916001916011918391889183916031916002918b918b910161592b565b6040516020818303038152906040529350505050611556565b6040517f4170513000000000000000000000000000000000000000000000000000000000815261ffff851660048201526024016109e0565b60608082515f036138b457915091565b5f6138be846140cb565b90508060ff1660010361396e5760408051600180825281830190925290816020015b60608152602001906001900390816138e057905050925083835f8151811061390a5761390a614e94565b6020908102919091010152604080516001808252818301909252908160200160208202803683370190505091506139428460036141ed565b825f8151811061395457613954614e94565b602002602001019060ff16908160ff168152505050915091565b8060ff1667ffffffffffffffff81111561398a5761398a614c61565b6040519080825280602002602001820160405280156139b3578160200160208202803683370190505b5091508060ff1667ffffffffffffffff8111156139d2576139d2614c61565b604051908082528060200260200182016040528015613a0557816020015b60608152602001906001900390816139f05790505b5092505f8060ff5b8651831015613ab5576001909201915f613a27888561426c565b6002949094019390505f613a3b89866141ed565b90508260ff1660ff03613a5057809250613aa6565b8260ff168160ff1614613aa6577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd848603015f613a8e8b87846142eb565b9050613a9c8a8a8784614464565b5093909301929150815b5061ffff169290920191613a0d565b8183035f613ac48985846142eb565b9050613ad288888584614464565b5f5b8660ff168160ff161015613b3257878160ff1681518110613af757613af7614e94565b6020908102919091010180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff169052600101613ad4565b50505050505050915091565b5f6060853b808303613b6357604080515f808252602082019092529250925050610d84565b5f805f8761ffff1667ffffffffffffffff811115613b8357613b83614c61565b6040519080825280601f01601f191660200182016040528015613bad576020820181803683370190505b5090505f80885160208a018d8dfa91503d925087831115613bcc578792505b828152825f602083013e90999098509650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216613c32576040517f6b7a931000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114613c88576040519150601f19603f3d011682016040523d82523d5f602084013e613c8d565b606091505b5050905080611fa7576040517f465bc83400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602481018390526044016109e0565b5f8060205f8451602086015f885af180613d06576040513d5f823e3d81fd5b50505f513d91508115613d1d578060011415613d37565b73ffffffffffffffffffffffffffffffffffffffff84163b155b156109f2576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016109e0565b60608160a001518260c0015160405160200161229a929190615a23565b5f60605f80613db1856138a4565b915091505f8a604001518b60200151613dca9190615801565b90508060ff1667ffffffffffffffff811115613de857613de8614c61565b604051908082528060200260200182016040528015613e11578160200160208202803683370190505b5093505f5b8160ff168160ff161015614063575f8c6020015160ff168260ff1610613e6a5760a08d015160208e0151613e4a908461575c565b60ff1681518110613e5d57613e5d614e94565b6020026020010151613e8c565b8c608001518260ff1681518110613e8357613e83614e94565b60200260200101515b60408051602081019091525f808252919250905b8551811015613ef8578360ff16868281518110613ebf57613ebf614e94565b602002602001015160ff1603613ef057868181518110613ee157613ee1614e94565b60200260200101519150613ef8565b600101613ea0565b508173ffffffffffffffffffffffffffffffffffffffff1663f42ed2ed8e8e8e8e866040518663ffffffff1660e01b8152600401613f3a95949392919061581a565b6020604051808303815f875af1158015613f56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f7a91906154d5565b878460ff1681518110613f8f57613f8f614e94565b6020026020010181815250505f878460ff1681518110613fb157613fb1614e94565b602002602001015111156140595786