UNPKG

@gnosis.pm/pm-contracts

Version:

Collection of smart contracts for the Gnosis prediction market platform

460 lines 1.26 MB
{ "contractName": "StandardMarket", "abi": [ { "constant": true, "inputs": [], "name": "creator", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "marketMaker", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "createdAtBlock", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "uint256" } ], "name": "netOutcomeTokensSold", "outputs": [ { "name": "", "type": "int256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "masterCopy", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "stage", "outputs": [ { "name": "", "type": "uint8" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "funding", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "fee", "outputs": [ { "name": "", "type": "uint24" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "eventContract", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "FEE_RANGE", "outputs": [ { "name": "", "type": "uint24" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "funding", "type": "uint256" } ], "name": "MarketFunding", "type": "event" }, { "anonymous": false, "inputs": [], "name": "MarketClosing", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "fees", "type": "uint256" } ], "name": "FeeWithdrawal", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "buyer", "type": "address" }, { "indexed": false, "name": "outcomeTokenIndex", "type": "uint8" }, { "indexed": false, "name": "outcomeTokenCount", "type": "uint256" }, { "indexed": false, "name": "outcomeTokenCost", "type": "uint256" }, { "indexed": false, "name": "marketFees", "type": "uint256" } ], "name": "OutcomeTokenPurchase", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "seller", "type": "address" }, { "indexed": false, "name": "outcomeTokenIndex", "type": "uint8" }, { "indexed": false, "name": "outcomeTokenCount", "type": "uint256" }, { "indexed": false, "name": "outcomeTokenProfit", "type": "uint256" }, { "indexed": false, "name": "marketFees", "type": "uint256" } ], "name": "OutcomeTokenSale", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "buyer", "type": "address" }, { "indexed": false, "name": "outcomeTokenIndex", "type": "uint8" }, { "indexed": false, "name": "outcomeTokenCount", "type": "uint256" }, { "indexed": false, "name": "cost", "type": "uint256" } ], "name": "OutcomeTokenShortSale", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "transactor", "type": "address" }, { "indexed": false, "name": "outcomeTokenAmounts", "type": "int256[]" }, { "indexed": false, "name": "outcomeTokenNetCost", "type": "int256" }, { "indexed": false, "name": "marketFees", "type": "uint256" } ], "name": "OutcomeTokenTrade", "type": "event" }, { "constant": false, "inputs": [ { "name": "_funding", "type": "uint256" } ], "name": "fund", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [], "name": "close", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [], "name": "withdrawFees", "outputs": [ { "name": "fees", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "outcomeTokenIndex", "type": "uint8" }, { "name": "outcomeTokenCount", "type": "uint256" }, { "name": "maxCost", "type": "uint256" } ], "name": "buy", "outputs": [ { "name": "cost", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "outcomeTokenIndex", "type": "uint8" }, { "name": "outcomeTokenCount", "type": "uint256" }, { "name": "minProfit", "type": "uint256" } ], "name": "sell", "outputs": [ { "name": "profit", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "outcomeTokenIndex", "type": "uint8" }, { "name": "outcomeTokenCount", "type": "uint256" }, { "name": "minProfit", "type": "uint256" } ], "name": "shortSell", "outputs": [ { "name": "cost", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "outcomeTokenAmounts", "type": "int256[]" }, { "name": "collateralLimit", "type": "int256" } ], "name": "trade", "outputs": [ { "name": "netCost", "type": "int256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "outcomeTokenCost", "type": "uint256" } ], "name": "calcMarketFee", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" } ], "metadata": "{\"compiler\":{\"version\":\"0.5.6+commit.b259423e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"creator\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"outcomeTokenAmounts\",\"type\":\"int256[]\"},{\"name\":\"collateralLimit\",\"type\":\"int256\"}],\"name\":\"trade\",\"outputs\":[{\"name\":\"netCost\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"marketMaker\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"outcomeTokenIndex\",\"type\":\"uint8\"},{\"name\":\"outcomeTokenCount\",\"type\":\"uint256\"},{\"name\":\"minProfit\",\"type\":\"uint256\"}],\"name\":\"shortSell\",\"outputs\":[{\"name\":\"cost\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"close\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"outcomeTokenIndex\",\"type\":\"uint8\"},{\"name\":\"outcomeTokenCount\",\"type\":\"uint256\"},{\"name\":\"minProfit\",\"type\":\"uint256\"}],\"name\":\"sell\",\"outputs\":[{\"name\":\"profit\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawFees\",\"outputs\":[{\"name\":\"fees\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"createdAtBlock\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"netOutcomeTokensSold\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"masterCopy\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"outcomeTokenCost\",\"type\":\"uint256\"}],\"name\":\"calcMarketFee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"stage\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_funding\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"funding\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"name\":\"\",\"type\":\"uint24\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"eventContract\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"outcomeTokenIndex\",\"type\":\"uint8\"},{\"name\":\"outcomeTokenCount\",\"type\":\"uint256\"},{\"name\":\"maxCost\",\"type\":\"uint256\"}],\"name\":\"buy\",\"outputs\":[{\"name\":\"cost\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"FEE_RANGE\",\"outputs\":[{\"name\":\"\",\"type\":\"uint24\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"funding\",\"type\":\"uint256\"}],\"name\":\"MarketFunding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"MarketClosing\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"FeeWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"outcomeTokenIndex\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"outcomeTokenCount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"outcomeTokenCost\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"marketFees\",\"type\":\"uint256\"}],\"name\":\"OutcomeTokenPurchase\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"outcomeTokenIndex\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"outcomeTokenCount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"outcomeTokenProfit\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"marketFees\",\"type\":\"uint256\"}],\"name\":\"OutcomeTokenSale\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"outcomeTokenIndex\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"outcomeTokenCount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"cost\",\"type\":\"uint256\"}],\"name\":\"OutcomeTokenShortSale\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactor\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"outcomeTokenAmounts\",\"type\":\"int256[]\"},{\"indexed\":false,\"name\":\"outcomeTokenNetCost\",\"type\":\"int256\"},{\"indexed\":false,\"name\":\"marketFees\",\"type\":\"uint256\"}],\"name\":\"OutcomeTokenTrade\",\"type\":\"event\"}],\"devdoc\":{\"author\":\"Stefan George - <stefan@gnosis.pm>\",\"methods\":{\"buy(uint8,uint256,uint256)\":{\"details\":\"Allows to buy outcome tokens from market maker\",\"params\":{\"maxCost\":\"The maximum cost in collateral tokens to pay for outcome tokens\",\"outcomeTokenCount\":\"Amount of outcome tokens to buy\",\"outcomeTokenIndex\":\"Index of the outcome token to buy\"},\"return\":\"Cost in collateral tokens\"},\"calcMarketFee(uint256)\":{\"details\":\"Calculates fee to be paid to market maker\",\"params\":{\"outcomeTokenCost\":\"Cost for buying outcome tokens\"},\"return\":\"Fee for trade\"},\"close()\":{\"details\":\"Allows market creator to close the markets by transferring all remaining outcome tokens to the creator\"},\"fund(uint256)\":{\"details\":\"Allows to fund the market with collateral tokens converting them into outcome tokens\",\"params\":{\"_funding\":\"Funding amount\"}},\"sell(uint8,uint256,uint256)\":{\"details\":\"Allows to sell outcome tokens to market maker\",\"params\":{\"minProfit\":\"The minimum profit in collateral tokens to earn for outcome tokens\",\"outcomeTokenCount\":\"Amount of outcome tokens to sell\",\"outcomeTokenIndex\":\"Index of the outcome token to sell\"},\"return\":\"Profit in collateral tokens\"},\"shortSell(uint8,uint256,uint256)\":{\"details\":\"Buys all outcomes, then sells all shares of selected outcome which were bought, keeping shares of all other outcome tokens.\",\"params\":{\"minProfit\":\"The minimum profit in collateral tokens to earn for short sold outcome tokens\",\"outcomeTokenCount\":\"Amount of outcome tokens to short sell\",\"outcomeTokenIndex\":\"Index of the outcome token to short sell\"},\"return\":\"Cost to short sell outcome in collateral tokens\"},\"trade(int256[],int256)\":{\"details\":\"Allows to trade outcome tokens and collateral with the market maker\",\"params\":{\"collateralLimit\":\"If positive, this is the limit for the amount of collateral tokens which will be sent to the market to conduct the trade. If negative, this is the minimum amount of collateral tokens which will be received from the market for the trade. If zero, there is no limit.\",\"outcomeTokenAmounts\":\"Amounts of each outcome token to buy or sell. If positive, will buy this amount of outcome token from the market. If negative, will sell this amount back to the market instead.\"},\"return\":\"If positive, the amount of collateral sent to the market. If negative, the amount of collateral received from the market. If zero, no collateral was sent or received.\"},\"withdrawFees()\":{\"details\":\"Allows market creator to withdraw fees generated by trades\",\"return\":\"Fee amount\"}},\"title\":\"Standard market contract - Backed implementation of standard markets\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/alan/src/github.com/gnosis/pm-contracts/contracts/Markets/StandardMarket.sol\":\"StandardMarket\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/alan/src/github.com/gnosis/pm-contracts/contracts/Events/Event.sol\":{\"keccak256\":\"0xdcacfa25145426b5681ad7d8bafb3c117c92a37b7a0175d72a10b42f130fb8c1\",\"urls\":[\"bzzr://bd10fbdb82f0d50866442c9e95317b3176c8ee067def27d764529973fb36420a\"]},\"/home/alan/src/github.com/gnosis/pm-contracts/contracts/MarketMakers/MarketMaker.sol\":{\"keccak256\":\"0xa71f8ce92412033d0900d44c01f0702aefced87d860cf116c6a4d3efe86913cf\",\"urls\":[\"bzzr://63c5bf60b931bb032fcab23514a3db171b680b11d8c6c05ac8caa88752e3be41\"]},\"/home/alan/src/github.com/gnosis/pm-contracts/contracts/Markets/Market.sol\":{\"keccak256\":\"0x7bc1ebf0ea0f4cd9b6e9bfff6c6ac9088c253bcfca4e27f31e5845799f0278d8\",\"urls\":[\"bzzr://5e3f86d96ab269d284b34563501469d539cc436d62f070dd0abda2519d5e60c0\"]},\"/home/alan/src/github.com/gnosis/pm-contracts/contracts/Markets/StandardMarket.sol\":{\"keccak256\":\"0x527abf1b0997e2d38ce3c97f7ed647b9e913424828594287e2b068f2fb41ad4c\",\"urls\":[\"bzzr://16756e1b212fd40f21de50d99c8b7a5dde0acc2b0b047af8beead831a1274bd7\"]},\"/home/alan/src/github.com/gnosis/pm-contracts/contracts/Oracles/Oracle.sol\":{\"keccak256\":\"0xf4d12f4a59c17e66dfa6791188f621a8914e2038a4e3f72d6fc9fb903ca8e18e\",\"urls\":[\"bzzr://a477ccd203e677cc904b1a4f8fcc85251c5b5e09c5c10eed27e01318584b16d1\"]},\"/home/alan/src/github.com/gnosis/pm-contracts/contracts/Tokens/OutcomeToken.sol\":{\"keccak256\":\"0x3d4c9ec14a60cf7577d366da5116e919a4331da8d6d993174f7d599f84ae74e0\",\"urls\":[\"bzzr://20f87450259a3af24ff1769faa9ab3b714d01921e9d8fa4efa75a0c277837a8a\"]},\"@gnosis.pm/util-contracts/contracts/Proxy.sol\":{\"keccak256\":\"0xeab0e83a9ec9e7f052c0455a11577061ec6d1994db08dae429abd6faaabf6555\",\"urls\":[\"bzzr://b2c1273d4ec30e2f9e768eea8c510f8493a7359b03e01923d93eea86b57ec145\"]},\"openzeppelin-solidity/contracts/drafts/SignedSafeMath.sol\":{\"keccak256\":\"0xb4b45cd5475c318722ac0f8d7e2b9e77fee6f4f36374c1110fe615d50fbc0650\",\"urls\":[\"bzzr://a90fb457269c8a03ec5b811c71acef08a2751a4d2019b0661328610f9357dae7\"]},\"openzeppelin-solidity/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x4ccf2d7b51873db1ccfd54ca2adae5eac3b184f9699911ed4490438419f1c690\",\"urls\":[\"bzzr://1604f5b6d6e916c154efd8c6720cda069e5ba32dfa0a9dedf2b42e5b02d07f89\"]},\"openzeppelin-solidity/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x852793a3c2f86d336a683b30d688ec3dcfc57451af5a2bf5975cda3b7191a901\",\"urls\":[\"bzzr://07fb42206812a17c1f71e548cfa5cec6f9aa1ae0ca5df870718ca4aa9759d1a5\"]},\"openzeppelin-solidity/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x90e8c2521653bbb1768b05889c5760031e688d9cd361f167489b89215e201b95\",\"urls\":[\"bzzr://aa8b45b57edafc3d67bc5d916327ea16807fae33f753ca163ae0c4061b789766\"]}},\"version\":1}", "bytecode": "0x608060405234801561001057600080fd5b5061302f806100206000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063a619486e116100a2578063cb4c86b711610071578063cb4c86b7146104a5578063ddca3f43146104c3578063e274fd24146104eb578063f6d956df14610535578063fbde47f61461058e57610116565b8063a619486e146103bf578063b001150914610409578063c040e6b81461044b578063ca1d209d1461047757610116565b806343d726d6116100e957806343d726d6146102de57806346280a80146102e8578063476343ee1461034157806359acb42c1461035f578063a157979c1461037d57610116565b806302d05d3f1461011b57806315bd7611146101655780631f21f9af1461023b57806328c05d3214610285575b600080fd5b6101236105b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102256004803603604081101561017b57600080fd5b810190808035906020019064010000000081111561019857600080fd5b8201836020820111156101aa57600080fd5b803590602001918460208302840111640100000000831117156101cc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291905050506105dc565b6040518082815260200191505060405180910390f35b61024361078b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102c86004803603606081101561029b57600080fd5b81019080803560ff16906020019092919080359060200190929190803590602001909291905050506107b1565b6040518082815260200191505060405180910390f35b6102e66111bb565b005b61032b600480360360608110156102fe57600080fd5b81019080803560ff1690602001909291908035906020019092919080359060200190929190505050611669565b6040518082815260200191505060405180910390f35b610349611893565b6040518082815260200191505060405180910390f35b610367611c14565b6040518082815260200191505060405180910390f35b6103a96004803603602081101561039357600080fd5b8101908080359060200190929190505050611c1a565b6040518082815260200191505060405180910390f35b6103c7611c3b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104356004803603602081101561041f57600080fd5b8101908080359060200190929190505050611c60565b6040518082815260200191505060405180910390f35b610453611c93565b6040518082600281111561046357fe5b60ff16815260200191505060405180910390f35b6104a36004803603602081101561048d57600080fd5b8101908080359060200190929190505050611ca6565b005b6104ad612157565b6040518082815260200191505060405180910390f35b6104cb61215d565b604051808262ffffff1662ffffff16815260200191505060405180910390f35b6104f3612172565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105786004803603606081101561054b57600080fd5b81019080803560ff1690602001909291908035906020019092919080359060200190929190505050612198565b6040518082815260200191505060405180910390f35b6105966123b0565b604051808262ffffff1662ffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060018060028111156105ec57fe5b600760009054906101000a900460ff16600281111561060757fe5b1461061157600080fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dc8f0866040518163ffffffff1660e01b815260040160206040518083038186803b15801561067b57600080fd5b505afa15801561068f573d6000803e3d6000fd5b505050506040513d60208110156106a557600080fd5b810190808051906020019092919050505090508060ff168551146106c857600080fd5b6000806106d68388886123b7565b8093508194508297505050503373ffffffffffffffffffffffffffffffffffffffff167fa66fcf59f5b6e4cb46e5745fd40c7dfac01b0a81b2b5e55038d9ec959adf7eaa8884846040518080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561076c578082015181840152602081019050610751565b5050505090500194505050505060405180910390a25050505092915050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b15801561081b57600080fd5b505afa15801561082f573d6000803e3d6000fd5b505050506040513d602081101561084557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561091057600080fd5b505af1158015610924573d6000803e3d6000fd5b505050506040513d602081101561093a57600080fd5b81019080805190602001909291905050508015610ad95750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b1580156109ba57600080fd5b505afa1580156109ce573d6000803e3d6000fd5b505050506040513d60208110156109e457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a9d57600080fd5b505af1158015610ab1573d6000803e3d6000fd5b505050506040513d6020811015610ac757600080fd5b81019080805190602001909291905050505b610ae257600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166328da850b846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610b5757600080fd5b505af1158015610b6b573d6000803e3d6000fd5b50505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638abe59ea856040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b158015610be557600080fd5b505afa158015610bf9573d6000803e3d6000fd5b505050506040513d6020811015610c0f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ca657600080fd5b505af1158015610cba573d6000803e3d6000fd5b505050506040513d6020811015610cd057600080fd5b81019080805190602001909291905050505060003073ffffffffffffffffffffffffffffffffffffffff166346280a808686866040518463ffffffff1660e01b8152600401808460ff1660ff1681526020018381526020018281526020019350505050602060405180830381600087803b158015610d4d57600080fd5b505af1158015610d61573d6000803e3d6000fd5b505050506040513d6020811015610d7757600080fd5b8101908080519060200190929190505050905080840391506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dc8f0866040518163ffffffff1660e01b815260040160206040518083038186803b158015610df957600080fd5b505afa158015610e0d573d6000803e3d6000fd5b505050506040513d6020811015610e2357600080fd5b8101908080519060200190929190505050905060008090505b8160ff168160ff161015610fe0578660ff168160ff1614610fd357600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638abe59ea826040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b158015610ecd57600080fd5b505afa158015610ee1573d6000803e3d6000fd5b505050506040513d6020811015610ef757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610f8e57600080fd5b505af1158015610fa2573d6000803e3d6000fd5b505050506040513d6020811015610fb857600080fd5b8101908080519060200190929190505050610fd257600080fd5b5b8080600101915050610e3c565b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d602081101561107357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561110a57600080fd5b505af115801561111e573d6000803e3d6000fd5b505050506040513d602081101561113457600080fd5b810190808051906020019092919050505061114e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f1dbdc4ff4d51949738d56e120b2be4edecc55d8d2150f1616ec5802abaae3f88878786604051808460ff1660ff168152602001838152602001828152602001935050505060405180910390a250509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461121557600080fd5b600180600281111561122357fe5b600760009054906101000a900460ff16600281111561123e57fe5b1461124857600080fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dc8f0866040518163ffffffff1660e01b815260040160206040518083038186803b1580156112b257600080fd5b505afa1580156112c6573d6000803e3d6000fd5b505050506040513d60208110156112dc57600080fd5b8101908080519060200190929190505050905060008090505b8160ff168160ff16101561161457600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638abe59ea826040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b15801561137957600080fd5b505afa15801561138d573d6000803e3d6000fd5b505050506040513d60208110156113a357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638abe59ea856040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b15801561146857600080fd5b505afa15801561147c573d6000803e3d6000fd5b505050506040513d602081101561149257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561151f57600080fd5b505afa158015611533573d6000803e3d6000fd5b505050506040513d602081101561154957600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115c357600080fd5b505af11580156115d7573d6000803e3d6000fd5b505050506040513d60208110156115ed57600080fd5b810190808051906020019092919050505061160757600080fd5b80806001019150506112f5565b506002600760006101000a81548160ff0219169083600281111561163457fe5b02179055507fe7d85885f81486e8f4c99e50e056745493861b8b5d4f973dcf0c3c0f74a25e0760405160405180910390a15050565b6000600180600281111561167957fe5b600760009054906101000a900460ff16600281111561169457fe5b1461169e57600080fd5b600084600003131580156116b55750600083600003125b6116be57600080fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dc8f0866040518163ffffffff1660e01b815260040160206040518083038186803b15801561172857600080fd5b505afa15801561173c573d6000803e3d6000fd5b505050506040513d602081101561175257600080fd5b8101908080519060200190929190505050905060008660ff161015801561177e57508060ff168660ff16105b61178757600080fd5b60608160ff166040519080825280602002602001820160405280156117bb5781602001602082028038833980820191505090505b50905085600003818860ff16815181106117d157fe5b60200260200101818152505060008060006117f085858a6000036123b7565b92509250925060008313158015611808575060008213155b61181157600080fd5b8260000396503373ffffffffffffffffffffffffffffffffffffffff167fab24ef3371efb2e0e3b02955e33b8ef03c14523e71f3bda87878a2386cc17b698b8b8560000385604051808560ff1660ff16815260200184815260200183815260200182815260200194505050505060405180910390a25050505050509392505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ef57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b15801561195757600080fd5b505afa15801561196b573d6000803e3d6000fd5b505050506040513d602081101561198157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a0e57600080fd5b505afa158015611a22573d6000803e3d6000fd5b505050506040513d6020811015611a3857600080fd5b81019080805190602001909291905050509050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab357600080fd5b505afa158015611ac7573d6000803e3d6000fd5b505050506040513d6020811015611add57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b9657600080fd5b505af1158015611baa573d6000803e3d6000fd5b505050506040513d6020811015611bc057600080fd5b8101908080519060200190929190505050611bda57600080fd5b7f706d7f48c702007c2fb0881cea5759732e64f52faee427d5ab030787cfb7d787816040518082815260200191505060405180910390a190565b60025481565b60068181548110611c2757fe5b906000526020600020016000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000620f424062ffffff16600460149054906101000a900462ffffff1662ffffff16830281611c8b57fe5b049050919050565b600760009054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d0057600080fd5b6000806002811115611d0e57fe5b600760009054906101000a900460ff166002811115611d2957fe5b14611d3357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b158015611d9b57600080fd5b505afa158015611daf573d6000803e3d6000fd5b505050506040513d6020811015611dc557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611e9057600080fd5b505af1158015611ea4573d6000803e3d6000fd5b505050506040513d6020811015611eba57600080fd5b810190808051906020019092919050505080156120595750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b158015611f3a57600080fd5b505afa158015611f4e573d6000803e3d6000fd5b505050506040513d6020811015611f6457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561201d57600080fd5b505af1158015612031573d6000803e3d6000fd5b505050506040513d602081101561204757600080fd5b81019080805190602001909291905050505b61206257600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166328da850b836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120d757600080fd5b505af11580156120eb573d6000803e3d6000fd5b50505050816005819055506001600760006101000a81548160ff0219169083600281111561211557fe5b02179055507f8a2fe22ce705a4ac9c189969cef327affbdc477afdae4ae274c2f8ad021f91636005546040518082815260200191505060405180910390a15050565b60055481565b600460149054906101000a900462ffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060018060028111156121a857fe5b600760009054906101000a900460ff1660028111156121c357fe5b146121cd57600080fd5b600084121580156121de5750600083135b6121e757600080fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dc8f0866040518163ffffffff1660e01b815260040160206040518083038186803b15801561225157600080fd5b505afa158015612265573d6000803e3d6000fd5b505050506040513d602081101561227b57600080fd5b8101908080519060200190929190505050905060008660ff16101580156122a757508060ff168660ff16105b6122b057600080fd5b60608160ff166040519080825280602002602001820160405280156122e45781602001602082028038833980820191505090505b50905085818860ff16815181106122f757fe5b602002602001018181525050600080600061231385858a6123b7565b9250925092506000831215801561232b575060008212155b61233457600080fd5b8296503373ffffffffffffffffffffffffffffffffffffffff167f7caea4a19892ce49b4daa2014d5599eed561dcd16ffabfac851a9737217ae4108b8b8585604051808560ff1660ff16815260200184815260200183815260200182815260200194505050505060405180910390a25050505050509392505050565b620f424081565b6000806000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338bf045230876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015612480578082015181840152602081019050612465565b50505050905001935050505060206040518083038186803b1580156124a457600080fd5b505afa1580156124b8573d6000803e3d6000fd5b505050506040513d60208110156124ce57600080fd5b8101908080519060200190929190505050915060008212156124fd576124f682600003611c60565b9050612509565b61250682611c60565b90505b600081121561251757600080fd5b61252a8183612f5490919063ffffffff16565b92506000841415801561253d5750838313155b806125485750600084145b61255157600080fd5b600082131561291757600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b1580156125c257600080fd5b505afa1580156125d6573d6000803e3d6000fd5b505050506040513d60208110156125ec57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156126b757600080fd5b505af11580156126cb573d6000803e3d6000fd5b505050506040513d60208110156126e157600080fd5b810190808051906020019092919050505080156128805750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b15801561276157600080fd5b505afa158015612775573d6000803e3d6000fd5b505050506040513d602081101561278b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561284457600080fd5b505af1158015612858573d6000803e3d6000fd5b505050506040513d602081101561286e57600080fd5b81019080805190602001909291905050505b61288957600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166328da850b836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156128fe57600080fd5b505af1158015612912573d6000803e3d6000fd5b505050505b60008090505b8660ff168160ff161015612d36576000868260ff168151811061293c57fe5b602002602001015114612d29576000868260ff168151811061295a57fe5b60200260200101511215612b3557600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638abe59ea826040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b1580156129de57600080fd5b505afa1580156129f2573d6000803e3d6000fd5b505050506040513d6020811015612a0857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330898560ff1681518110612a4557fe5b60200260200101516000036040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612aec57600080fd5b505af1158015612b00573d6000803e3d6000fd5b505050506040513d6020811015612b1657600080fd5b8101908080519060200190929190505050612b3057600080fd5b612cc7565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638abe59ea826040518263ffffffff1660e01b8152600401808260ff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33888460ff1681518110612c1157fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612c8257600080fd5b505af1158015612c96573d6000803e3d6000fd5b505050506040513d6020811015612cac57600080fd5b8101908080519060200190929190505050612cc657600080fd5b5b612d0a868260ff1681518110612cd957fe5b602002602001015160068360ff1681548110612cf157fe5b9060005260206000200154612f5490919063ffffffff16565b60068260ff1681548110612d1a57fe5b90600052602060002001819055505b808060010191505061291d565b506000821215612f4b57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fb1edcd836000036040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612db857600080fd5b505af1158015612dcc573d6000803e3d6000fd5b505050506000831215612f4a57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4157600080fd5b505afa158015612e55573d6000803e3d6000fd5b505050506040513d6020811015612e6b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856000036040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f0557600080fd5b505af1158015612f19573d6000803e3d6000fd5b505050506040513d6020811015612f2f57600080fd5b8101908080519060200190929190505050612f4957600080fd5b5b5b93509350939050565b600080828401905060008312158015612f6d5750838112155b80612f835750600083128015612f8257508381125b5b612fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612fe36021913960400191505060405180910390fd5b809150509291505056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77a165627a7a72305820c8a69c680e527165394d310f65d13d21be9e48a7f579ec15fcf36b732fc47a900029", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063a619486e116100a2578063cb4c86b711610071578063cb4c86b7146104a5578063ddca3f43146104c3578063e274fd24146104eb578063f6d956df14610535578063fbde47f61461058e57610116565b8063a619486e146103bf578063b001150914610409578063c040e6b81461044b578063ca1d209d1461047757610116565b806343d726d6116100e957806343d726d6146102de57806346280a80146102e8578063476343ee1461034157806359acb42c1461035f578063a157979c1461037d57610116565b806302d05d3f1461011b57806315bd7611146101655780631f21f9af1461023b57806328c05d3214610285575b600080fd5b6101236105b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102256004803603604081101561017b57600080fd5b810190808035906020019064010000000081111561019857600080fd5b8201836020820111156101aa57600080fd5b803590602001918460208302840111640100000000831117156101cc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291905050506105dc565b6040518082815260200191505060405180910390f35b61024361078b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102c86004803603606081101561029b57600080fd5b81019080803560ff16906020019092919080359060200190929190803590602001909291905050506107b1565b6040518082815260200191505060405180910390f35b6102e66111bb565b005b61032b600480360360608110156102fe57600080fd5b81019080803560ff1690602001909291908035906020019092919080359060200190929190505050611669565b6040518082815260200191505060405180910390f35b610349611893565b6040518082815260200191505060405180910390f35b610367611c14565b6040518082815260200191505060405180910390f35b6103a96004803603602081101561039357600080fd5b8101908080359060200190929190505050611c1a565b6040518082815260200191505060405180910390f35b6103c7611c3b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104356004803603602081101561041f57600080fd5b8101908080359060200190929190505050611c60565b6040518082815260200191505060405180910390f35b610453611c93565b6040518082600281111561046357fe5b60ff16815260200191505060405180910390f35b6104a36004803603602081101561048d57600080fd5b8101908080359060200190929190505050611ca6565b005b6104ad612157565b6040518082815260200191505060405180910390f35b6104cb61215d565b604051808262ffffff1662ffffff16815260200191505060405180910390f35b6104f3612172565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105786004803603606081101561054b57600080fd5b81019080803560ff1690602001909291908035906020019092919080359060200190929190505050612198565b6040518082815260200191505060405180910390f35b6105966123b0565b604051808262ffffff1662ffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060018060028111156105ec57fe5b600760009054906101000a900460ff16600281111561060757fe5b1461061157600080fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637dc8f0866040518163ffffffff1660e01b815260040160206040518083038186803b15801561067b57600080fd5b505afa15801561068f573d6000803e3d6000fd5b505050506040513d60208110156106a557600080fd5b810190808051906020019092919050505090508060ff168551146106c857600080fd5b6000806106d68388886123b7565b8093508194508297505050503373ffffffffffffffffffffffffffffffffffffffff167fa66fcf59f5b6e4cb46e5745fd40c7dfac01b0a81b2b5e55038d9ec959adf7eaa8884846040518080602001848152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561076c578082015181840152602081019050610751565b5050505090500194505050505060405180910390a25050505092915050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2016bd46040518163ffffffff1660e01b815260040160206040518083038186803b15801561081b57600080fd5b505afa15801561082f573d6000803e3d6000fd5b505050506040513d602081101561084557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815