UNPKG

@andrekorol/kollateral

Version:

Typescript library for Kollateral, the flash loan building block

224 lines 1.38 MB
{ "contractName": "SoloLiquidityProxy", "abi": [ { "inputs": [ { "internalType": "address", "name": "soloMarginAddress", "type": "address" }, { "internalType": "address payable", "name": "wethAddress", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" }, { "inputs": [ { "internalType": "uint256", "name": "marketId", "type": "uint256" } ], "name": "registerPool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "marketId", "type": "uint256" } ], "name": "deregisterPool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" } ], "name": "getRepaymentAddress", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" } ], "name": "getTotalReserve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "getRepaymentAmount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "borrow", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "sender", "type": "address" }, { "components": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "number", "type": "uint256" } ], "internalType": "struct Types.AccountInfo", "name": "accountInfo", "type": "tuple" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "callFunction", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "metadata": "{\"compiler\":{\"version\":\"0.7.3+commit.9bfce1f6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"soloMarginAddress\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"wethAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"name\":\"borrow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"internalType\":\"struct Types.AccountInfo\",\"name\":\"accountInfo\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"callFunction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"marketId\",\"type\":\"uint256\"}],\"name\":\"deregisterPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"getRepaymentAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"name\":\"getRepaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"getTotalReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"marketId\",\"type\":\"uint256\"}],\"name\":\"registerPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"callFunction(address,(address,uint256),bytes)\":{\"params\":{\"accountInfo\":\"The account from which the data is being sent\",\"data\":\"Arbitrary data given by the sender\",\"sender\":\"The msg.sender to Solo\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"callFunction(address,(address,uint256),bytes)\":{\"notice\":\"Allows users to send this contract arbitrary data.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/dydx/SoloLiquidityProxy.sol\":\"SoloLiquidityProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvocationHook.sol\":{\"keccak256\":\"0x36fb31db8a8e7eed7038b37554582655826969a556005d8ee3ab5070fe034860\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e0dde70be03ea1e086a5bce0d3a7bb1ac65549eab7ea2618343255332edddca7\",\"dweb:/ipfs/QmVaQG686g3tbgM3L3mtw4ei1WxzcDRcS9UxipSt4KCYs1\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvoker.sol\":{\"keccak256\":\"0x8a9fcbe16fdb00f3b5f32c528564cf4ba5c47ed9741a673973087d4d604e0b5a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b4af56bf9d2bd95bddca2156c6eea65c5caf0117d9a99d6cc575ac2c329bd672\",\"dweb:/ipfs/QmTxg3NpWNAxaVHKYU1cdVboo962auWmq5pmS9XvXcXNAF\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/BalanceCarrier.sol\":{\"keccak256\":\"0x69e63e482d839c831c8c32f002e6454f6a8d9e602b39e9cdc1c0649451df3337\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0a40661372b8f95cbed7714a16323b435ccbe85205178d32bc6012e47bfc0640\",\"dweb:/ipfs/QmTyHr1Ag4AkcyazzTT5GDcWabAMHPTrELoGhL85ZWDgBy\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/ExternalCaller.sol\":{\"keccak256\":\"0x54f88a1f0ac5dd7ab99a0519124cb09f1e19b4efb9baf240bc2500f8caa0b4ff\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3170671378d20b47498224d065e33fccc223ae772d7f0af2c5ef314f94b75c98\",\"dweb:/ipfs/Qme8ZEEBnBG5Vvj8uyJCD2YVPcLx6funKsSSCpGkTyn1zi\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/IWETH.sol\":{\"keccak256\":\"0x714f003eb93b5f91739e36fdc22ba3eaca8c82a83d11013b1dc776d63aa242cb\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://47d70bd07837927806c759fe38c1fc8933bc8de2e4f56f6c234ca5e338ded961\",\"dweb:/ipfs/QmeDYFtSUQVG1fQEXgVMh2AE2fs3rGYnG8L8C7uK4fDWg9\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/WETHHandler.sol\":{\"keccak256\":\"0x5fb1478553b344b7bf23aa86ed0eabc424b3463570ce95651bf2c341b0312c9f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a0617b46289ba31a4dfff0dbd294aec021969e0f2143bb5598e9e71060f21455\",\"dweb:/ipfs/QmefJFyX2wUJzFmYJffBEqK4tukgwuFvUerYjwfBYNwbQL\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/ILiquidityProxy.sol\":{\"keccak256\":\"0xd463abb162d0ce2e2d1a5f80b6b1254857e8800b930b4d8d1c3557c444d6363d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1c65c049566e4b8586ffb7ab62018d49f09d8f915450f6e79a0db84e4500fffb\",\"dweb:/ipfs/QmNSjMiWsY2Tt9eMYyNf3oGTFWDJjnWpgmVWTY6zKBAy3f\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/dydx/ICallee.sol\":{\"keccak256\":\"0xa9b64126eb7872118430e6f217903d82fa6be3f7ac240eb744b9313feac2baa4\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://cf4a6bdd4de3254fef36a4ca761d4b84ae1295dc63351571a13a3e6081ff6598\",\"dweb:/ipfs/Qmf41m5ZHnzt342H6gkWZBXz2XxhqfLa5QrngTsWjH8ZPD\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/dydx/ISoloMargin.sol\":{\"keccak256\":\"0xa84cb90af092bf862ff4f94fa0efef844dbc7f1be6cb10cb698c3e5c23c6c603\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://c0abc2f5c91d4a7c5b82fa86c604280bfab8aaee1118da7678aec102de320cda\",\"dweb:/ipfs/QmRUXv3xYQdXZskrfNjNi3S7oYBQud2gSsQ4LLmeEgE9ap\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/dydx/SoloLiquidityProxy.sol\":{\"keccak256\":\"0x48d271228de2d50d81ee2efb4da127a203e0aad536059c30cae8c6da92ee64f9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b9dfd67c7539976c202d7233b04fb51ed5d2992858d0c61ca90bb35ab006adc6\",\"dweb:/ipfs/QmTiyaTpQENeo8Pkf3tZrLmYpTjbr3CTKDYpAbrP41QRto\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/dydx/Types.sol\":{\"keccak256\":\"0x6ed571153190f3dd335ef6979ee462c6edbf519b0f5b4ca0d469ac7ed39b9d72\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b9ed752bdc9d722648483115bc6bbc40c6566ba6f3ea6c1a6dea56706dfcdba3\",\"dweb:/ipfs/QmYzqrrEnrL3ALyrQZATiobh696caMHMe1V8GsmtsoVYb2\"]},\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x910a2e625b71168563edf9eeef55a50d6d699acfe27ceba3921f291829a8f938\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://248246ac66e6479dce1ad7d4945ec5540c98ceb09881e93c93f7c48d5772925c\",\"dweb:/ipfs/QmXr8tmUiZgEYid6ixeeBRmTdUnASWjKzhP3KRxMPy8fRt\"]},\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0x46d2453e9db55eae25c9abdae2c42229086c54f1a6a247e8ce32658bb785f6ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://198ef77ef5d9f7a7709d6bbfba1d4d54d82ccc15358e9dced37f1376dac887fa\",\"dweb:/ipfs/QmQHFvCA74s3AHU3NMn4AAYzFTt6UotWq7yk3WzLQs1oJS\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0xba96bc371ba999f452985a98717cca1e4c4abb598dc038a9a9c3db08129b1ba4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26e50e3f7b6482fb6f598f2e006994a74aa492687daa4b3eee7fd4fb5398ce7f\",\"dweb:/ipfs/QmZudqoPSkA4USLMFsBBmt19dDPZFS8aaAmL5R7pECXu6t\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xbd74f587ab9b9711801baf667db1426e4a03fd2d7f15af33e0e0d0394e7cef76\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2d0913dfbfce90d170df0d496ad7596c0778518e5fa7aba6c32562522546f66b\",\"dweb:/ipfs/QmR6B8nLj2PJf5e1JWD9Nk7ErkAwkqUwadCnvE82FJr1RU\"]}},\"version\":1}", "bytecode": "0x6080604052600060035560006004556040518060800160405280600015158152602001600060018111156200003057fe5b8152602001600060018111156200004357fe5b81526020016000815250600560008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff021916908360018111156200009457fe5b021790555060408201518160000160026101000a81548160ff02191690836001811115620000be57fe5b02179055506060820151816001015550506040518060200160405280600081525060079080519060200190620000f6929190620002b2565b503480156200010457600080fd5b50604051620031333803806200313383398181016040528101906200012a919062000386565b80600160006200013f620002aa60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000443565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002f557805160ff191683800117855562000326565b8280016001018555821562000326579182015b828111156200032557825182559160200191906001019062000308565b5b50905062000335919062000339565b5090565b5b80821115620003545760008160009055506001016200033a565b5090565b60008151905062000369816200040f565b92915050565b600081519050620003808162000429565b92915050565b600080604083850312156200039a57600080fd5b6000620003aa8582860162000358565b9250506020620003bd858286016200036f565b9150509250929050565b6000620003d482620003ef565b9050919050565b6000620003e882620003ef565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200041a81620003c7565b81146200042657600080fd5b50565b6200043481620003db565b81146200044057600080fd5b50565b612ce080620004536000396000f3fe6080604052600436106100955760003560e01c80638b418713116100595780638b4187131461016d5780638da5cb5b14610196578063aa819057146101c1578063c32dc3b6146101fe578063f2fde38b1461023b5761009c565b80630c9386571461009e5780634b8a3529146100c7578063549d0d84146100f0578063680c7b9414610119578063715018a6146101565761009c565b3661009c57005b005b3480156100aa57600080fd5b506100c560048036038101906100c091906120e1565b610264565b005b3480156100d357600080fd5b506100ee60048036038101906100e9919061207c565b6105ea565b005b3480156100fc57600080fd5b50610117600480360381019061011291906120e1565b6108d5565b005b34801561012557600080fd5b50610140600480360381019061013b9190611fc3565b610b4f565b60405161014d91906127f4565b60405180910390f35b34801561016257600080fd5b5061016b610b59565b005b34801561017957600080fd5b50610194600480360381019061018f9190612015565b610cac565b005b3480156101a257600080fd5b506101ab610f4c565b6040516101b891906127f4565b60405180910390f35b3480156101cd57600080fd5b506101e860048036038101906101e3919061207c565b610f75565b6040516101f591906129da565b60405180910390f35b34801561020a57600080fd5b5061022560048036038101906102209190611fc3565b610f89565b60405161023291906129da565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190611fc3565b61106f565b005b61026c611231565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f0906129ba565b60405180910390fd5b60006103ae600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663062bd3e9846040518263ffffffff1660e01b815260040161035991906129da565b60206040518083038186803b15801561037157600080fd5b505afa158015610385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a99190611fec565b611239565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104179061291a565b60405180910390fd5b81600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600a600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610517816112a0565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610593929190612838565b602060405180830381600087803b1580156105ad57600080fd5b505af11580156105c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e591906120b8565b505050565b33600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e819055506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506060600367ffffffffffffffff811180156106b457600080fd5b506040519080825280602002602001820160405280156106ee57816020015b6106db611dde565b8152602001906001900390816106d35790505b5090506106fb8484611307565b8160008151811061070857fe5b602002602001018190525061071b611455565b8160018151811061072857fe5b60200260200101819052506107468461074186866115e9565b611622565b8160028151811061075357fe5b60200260200101819052506060600167ffffffffffffffff8111801561077857600080fd5b506040519080825280602002602001820160405280156107b257816020015b61079f611e4a565b8152602001906001900390816107975790505b5090506107bd611770565b816000815181106107ca57fe5b60200260200101819052508273ffffffffffffffffffffffffffffffffffffffff1663a67a6a4582846040518363ffffffff1660e01b8152600401610810929190612861565b600060405180830381600087803b15801561082a57600080fd5b505af115801561083e573d6000803e3d6000fd5b505050506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e819055505050505050565b6108dd611231565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461096a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610961906129ba565b60405180910390fd5b6000600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600a600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a9b816112a0565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401610af892919061280f565b602060405180830381600087803b158015610b1257600080fd5b505af1158015610b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a91906120b8565b505050565b6000309050919050565b610b61611231565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be5906129ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d359061299a565b60405180910390fd5b600173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610da157610da0600e546117a9565b5b610df2600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e5461190a565b610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e289061297a565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16630a5ca4e86040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ea057600080fd5b505af1158015610eb4573d6000803e3d6000fd5b50505050600173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f4657610f45610f40600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e546115e9565b611a0c565b5b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610f8183836115e9565b905092915050565b6000610f9482611ad5565b8015610fa65750610fa482611b2b565b155b1561106557610fb4826112a0565b73ffffffffffffffffffffffffffffffffffffffff166370a08231600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161100e91906127f4565b60206040518083038186803b15801561102657600080fd5b505afa15801561103a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e919061210a565b905061106a565b600090505b919050565b611077611231565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fb906129ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b906128da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146112965781611299565b60015b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146112dc5781611300565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b9050919050565b61130f611dde565b6040518061010001604052806001600881111561132857fe5b81526020016000815260200160405180608001604052806000151581526020016000600181111561135557fe5b81526020016000600181111561136757fe5b815260200185815250815260200161137e85611c23565b815260200160045481526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600354815260200160078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114455780601f1061141a57610100808354040283529160200191611445565b820191906000526020600020905b81548152906001019060200180831161142857829003601f168201915b5050505050815250905092915050565b61145d611dde565b60405180610100016040528060088081111561147557fe5b81526020016000815260200160056040518060800160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff1660018111156114c757fe5b60018111156114d257fe5b81526020016000820160029054906101000a900460ff1660018111156114f457fe5b60018111156114ff57fe5b81526020016001820154815250508152602001600454815260200160045481526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600354815260200160078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115dc5780601f106115b1576101008083540402835291602001916115dc565b820191906000526020600020905b8154815290600101906020018083116115bf57829003601f168201915b5050505050815250905090565b600061161a60026115f985611c23565b10611605576002611608565b60015b60ff1683611c6c90919063ffffffff16565b905092915050565b61162a611dde565b6040518061010001604052806000600881111561164357fe5b81526020016000815260200160405180608001604052806001151581526020016000600181111561167057fe5b81526020016000600181111561168257fe5b815260200185815250815260200161169985611c23565b815260200160045481526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600354815260200160078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117605780601f1061173557610100808354040283529160200191611760565b820191906000526020600020905b81548152906001019060200180831161174357829003601f168201915b5050505050815250905092915050565b611778611e4a565b60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016001815250905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050818173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161180a91906127f4565b60206040518083038186803b15801561182257600080fd5b505afa158015611836573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185a919061210a565b101561189b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118929061295a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016118d491906129da565b600060405180830381600087803b1580156118ee57600080fd5b505af1158015611902573d6000803e3d6000fd5b505050505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156119755761196c8383611cc1565b60019050611a05565b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b81526004016119b0929190612838565b602060405180830381600087803b1580156119ca57600080fd5b505af11580156119de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0291906120b8565b90505b9392505050565b80471015611a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a46906128ba565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ab957600080fd5b505af1158015611acd573d6000803e3d6000fd5b505050505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635ac7d17c826040518263ffffffff1660e01b8152600401611bcb91906129da565b60206040518083038186803b158015611be357600080fd5b505afa158015611bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1b91906120b8565b915050919050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080828401905083811015611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae906128fa565b60405180910390fd5b8091505092915050565b80471015611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb9061293a565b60405180910390fd5b611d1e828260405180602001604052806000815250611d22565b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff168484604051611d4c91906127dd565b60006040518083038185875af1925050503d8060008114611d89576040519150601f19603f3d011682016040523d82523d6000602084013e611d8e565b606091505b5091509150818190611dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcd9190612898565b60405180910390fd5b505050505050565b60405180610100016040528060006008811115611df757fe5b815260200160008152602001611e0b611e7a565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b604051806080016040528060001515815260200160006001811115611e9b57fe5b815260200160006001811115611ead57fe5b8152602001600081525090565b600081359050611ec981612c65565b92915050565b600081519050611ede81612c65565b92915050565b600081519050611ef381612c7c565b92915050565b600082601f830112611f0a57600080fd5b8135611f1d611f1882612a26565b6129f5565b91508082526020830160208301858383011115611f3957600080fd5b611f44838284612bd4565b50505092915050565b600060408284031215611f5f57600080fd5b611f6960406129f5565b90506000611f7984828501611eba565b6000830152506020611f8d84828501611f99565b60208301525092915050565b600081359050611fa881612c93565b92915050565b600081519050611fbd81612c93565b92915050565b600060208284031215611fd557600080fd5b6000611fe384828501611eba565b91505092915050565b600060208284031215611ffe57600080fd5b600061200c84828501611ecf565b91505092915050565b60008060006080848603121561202a57600080fd5b600061203886828701611eba565b935050602061204986828701611f4d565b925050606084013567ffffffffffffffff81111561206657600080fd5b61207286828701611ef9565b9150509250925092565b6000806040838503121561208f57600080fd5b600061209d85828601611eba565b92505060206120ae85828601611f99565b9150509250929050565b6000602082840312156120ca57600080fd5b60006120d884828501611ee4565b91505092915050565b6000602082840312156120f357600080fd5b600061210184828501611f99565b91505092915050565b60006020828403121561211c57600080fd5b600061212a84828501611fae565b91505092915050565b600061213f8383612688565b60408301905092915050565b600061215783836126b7565b905092915050565b61216881612b0b565b82525050565b61217781612b0b565b82525050565b600061218882612a76565b6121928185612abc565b935061219d83612a56565b8060005b838110156121ce5781516121b58882612133565b97506121c083612aa2565b9250506001810190506121a1565b5085935050505092915050565b60006121e682612a81565b6121f08185612acd565b93508360208202850161220285612a66565b8060005b8581101561223e578484038952815161221f858261214b565b945061222a83612aaf565b925060208a01995050600181019050612206565b50829750879550505050505092915050565b61225981612b1d565b82525050565b600061226a82612a8c565b6122748185612ade565b9350612284818560208601612be3565b61228d81612c18565b840191505092915050565b60006122a382612a8c565b6122ad8185612aef565b93506122bd818560208601612be3565b80840191505092915050565b6122d281612b8c565b82525050565b6122e181612b9e565b82525050565b6122f081612bb0565b82525050565b6122ff81612bc2565b82525050565b600061231082612a97565b61231a8185612afa565b935061232a818560208601612be3565b61233381612c18565b840191505092915050565b600061234b602583612afa565b91507f5745544848616e646c65723a206e6f7420656e6f75676820657468657220626160008301527f6c616e63650000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006123b1602683612afa565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612417601b83612afa565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000612457603083612afa565b91507f536f6c6f4c697175696469747950726f78793a2063616e6e6f7420726567697360008301527f74657220656d707479206d61726b6574000000000000000000000000000000006020830152604082019050919050565b60006124bd602a83612afa565b91507f45787465726e616c43616c6c65723a20696e73756666696369656e742065746860008301527f65722062616c616e6365000000000000000000000000000000000000000000006020830152604082019050919050565b6000612523602483612afa565b91507f5745544848616e646c65723a206e6f7420656e6f75676820776574682062616c60008301527f616e6365000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612589602e83612afa565b91507f536f6c6f4c697175696469747950726f78793a207472616e7366657220746f2060008301527f696e766f6b6572206661696c65640000000000000000000000000000000000006020830152604082019050919050565b60006125ef602183612afa565b91507f536f6c6f4c697175696469747950726f78793a206e6f74207363686564756c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612655602083612afa565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60408201600082015161269e600085018261215f565b5060208201516126b160208501826127bf565b50505050565b6000610160830160008301516126d060008601826122c9565b5060208301516126e360208601826127bf565b5060408301516126f6604086018261276a565b50606083015161270960c08601826127bf565b50608083015161271c60e08601826127bf565b5060a083015161273061010086018261215f565b5060c08301516127446101208601826127bf565b5060e083015184820361014086015261275d828261225f565b9150508091505092915050565b6080820160008201516127806000850182612250565b50602082015161279360208501826122d8565b5060408201516127a660408501826122e7565b5060608201516127b960608501826127bf565b50505050565b6127c881612b82565b82525050565b6127d781612b82565b82525050565b60006127e98284612298565b915081905092915050565b6000602082019050612809600083018461216e565b92915050565b6000604082019050612824600083018561216e565b61283160208301846122f6565b9392505050565b600060408201905061284d600083018561216e565b61285a60208301846127ce565b9392505050565b6000604082019050818103600083015261287b818561217d565b9050818103602083015261288f81846121db565b90509392505050565b600060208201905081810360008301526128b28184612305565b905092915050565b600060208201905081810360008301526128d38161233e565b9050919050565b600060208201905081810360008301526128f3816123a4565b9050919050565b600060208201905081810360008301526129138161240a565b9050919050565b600060208201905081810360008301526129338161244a565b9050919050565b60006020820190508181036000830152612953816124b0565b9050919050565b6000602082019050818103600083015261297381612516565b9050919050565b600060208201905081810360008301526129938161257c565b9050919050565b600060208201905081810360008301526129b3816125e2565b9050919050565b600060208201905081810360008301526129d381612648565b9050919050565b60006020820190506129ef60008301846127ce565b92915050565b6000604051905081810181811067ffffffffffffffff82111715612a1c57612a1b612c16565b5b8060405250919050565b600067ffffffffffffffff821115612a4157612a40612c16565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612b1682612b62565b9050919050565b60008115159050919050565b6000819050612b3782612c29565b919050565b6000819050612b4a82612c3d565b919050565b6000819050612b5d82612c51565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612b9782612b29565b9050919050565b6000612ba982612b3c565b9050919050565b6000612bbb82612b4f565b9050919050565b6000612bcd82612b82565b9050919050565b82818337600083830152505050565b60005b83811015612c01578082015181840152602081019050612be6565b83811115612c10576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b60098110612c3a57612c39612c16565b5b50565b60028110612c4e57612c4d612c16565b5b50565b60028110612c6257612c61612c16565b5b50565b612c6e81612b0b565b8114612c7957600080fd5b50565b612c8581612b1d565b8114612c9057600080fd5b50565b612c9c81612b82565b8114612ca757600080fd5b5056fea26469706673582212204eaca7647fbf3320d25e46a90c6f2ea0c4158c7c73f0032edf310d5eede8aaf364736f6c63430007030033", "deployedBytecode": "0x6080604052600436106100955760003560e01c80638b418713116100595780638b4187131461016d5780638da5cb5b14610196578063aa819057146101c1578063c32dc3b6146101fe578063f2fde38b1461023b5761009c565b80630c9386571461009e5780634b8a3529146100c7578063549d0d84146100f0578063680c7b9414610119578063715018a6146101565761009c565b3661009c57005b005b3480156100aa57600080fd5b506100c560048036038101906100c091906120e1565b610264565b005b3480156100d357600080fd5b506100ee60048036038101906100e9919061207c565b6105ea565b005b3480156100fc57600080fd5b50610117600480360381019061011291906120e1565b6108d5565b005b34801561012557600080fd5b50610140600480360381019061013b9190611fc3565b610b4f565b60405161014d91906127f4565b60405180910390f35b34801561016257600080fd5b5061016b610b59565b005b34801561017957600080fd5b50610194600480360381019061018f9190612015565b610cac565b005b3480156101a257600080fd5b506101ab610f4c565b6040516101b891906127f4565b60405180910390f35b3480156101cd57600080fd5b506101e860048036038101906101e3919061207c565b610f75565b6040516101f591906129da565b60405180910390f35b34801561020a57600080fd5b5061022560048036038101906102209190611fc3565b610f89565b60405161023291906129da565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d9190611fc3565b61106f565b005b61026c611231565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146102f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102f0906129ba565b60405180910390fd5b60006103ae600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663062bd3e9846040518263ffffffff1660e01b815260040161035991906129da565b60206040518083038186803b15801561037157600080fd5b505afa158015610385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a99190611fec565b611239565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610420576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104179061291a565b60405180910390fd5b81600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600a600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610517816112a0565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401610593929190612838565b602060405180830381600087803b1580156105ad57600080fd5b505af11580156105c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e591906120b8565b505050565b33600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e819055506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506060600367ffffffffffffffff811180156106b457600080fd5b506040519080825280602002602001820160405280156106ee57816020015b6106db611dde565b8152602001906001900390816106d35790505b5090506106fb8484611307565b8160008151811061070857fe5b602002602001018190525061071b611455565b8160018151811061072857fe5b60200260200101819052506107468461074186866115e9565b611622565b8160028151811061075357fe5b60200260200101819052506060600167ffffffffffffffff8111801561077857600080fd5b506040519080825280602002602001820160405280156107b257816020015b61079f611e4a565b8152602001906001900390816107975790505b5090506107bd611770565b816000815181106107ca57fe5b60200260200101819052508273ffffffffffffffffffffffffffffffffffffffff1663a67a6a4582846040518363ffffffff1660e01b8152600401610810929190612861565b600060405180830381600087803b15801561082a57600080fd5b505af115801561083e573d6000803e3d6000fd5b505050506000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e819055505050505050565b6108dd611231565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461096a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610961906129ba565b60405180910390fd5b6000600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600a600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610a9b816112a0565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660006040518363ffffffff1660e01b8152600401610af892919061280f565b602060405180830381600087803b158015610b1257600080fd5b505af1158015610b26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4a91906120b8565b505050565b6000309050919050565b610b61611231565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be5906129ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d359061299a565b60405180910390fd5b600173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610da157610da0600e546117a9565b5b610df2600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e5461190a565b610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e289061297a565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16630a5ca4e86040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ea057600080fd5b505af1158015610eb4573d6000803e3d6000fd5b50505050600173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f4657610f45610f40600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e546115e9565b611a0c565b5b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610f8183836115e9565b905092915050565b6000610f9482611ad5565b8015610fa65750610fa482611b2b565b155b1561106557610fb4826112a0565b73ffffffffffffffffffffffffffffffffffffffff166370a08231600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161100e91906127f4565b60206040518083038186803b15801561102657600080fd5b505afa15801561103a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105e919061210a565b905061106a565b600090505b919050565b611077611231565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611104576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fb906129ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116b906128da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146112965781611299565b60015b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146112dc5781611300565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b9050919050565b61130f611dde565b6040518061010001604052806001600881111561132857fe5b81526020016000815260200160405180608001604052806000151581526020016000600181111561135557fe5b81526020016000600181111561136757fe5b815260200185815250815260200161137e85611c23565b815260200160045481526020013073ffffffffffffffffffffffffffffffffffffffff168152602001600354815260200160078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114455780601f1061141a57610100808354040283529160200191611445565b820191906000526020600020905b81548152906001019060200180831161142857829003601f168201915b5050505050815250905092915050565b61145d611dde565b6040518061010