UNPKG

@oikos/swap

Version:
1,109 lines 2.46 MB
{ "contractName": "UniswapExchange", "abi": [ { "constant": true, "inputs": [], "name": "name", "outputs": [ { "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "spender", "type": "address" }, { "name": "value", "type": "uint256" } ], "name": "approve", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "totalSupply", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [], "name": "decimals", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "spender", "type": "address" }, { "name": "addedValue", "type": "uint256" } ], "name": "increaseAllowance", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "symbol", "outputs": [ { "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "spender", "type": "address" }, { "name": "subtractedValue", "type": "uint256" } ], "name": "decreaseAllowance", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ], "name": "transfer", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "owner", "type": "address" }, { "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "payable": true, "stateMutability": "payable", "type": "fallback" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "buyer", "type": "address" }, { "indexed": true, "name": "eth_sold", "type": "uint256" }, { "indexed": true, "name": "tokens_bought", "type": "uint256" } ], "name": "TokenPurchase", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "buyer", "type": "address" }, { "indexed": true, "name": "tokens_sold", "type": "uint256" }, { "indexed": true, "name": "eth_bought", "type": "uint256" } ], "name": "EthPurchase", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "provider", "type": "address" }, { "indexed": true, "name": "eth_amount", "type": "uint256" }, { "indexed": true, "name": "token_amount", "type": "uint256" } ], "name": "AddLiquidity", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "provider", "type": "address" }, { "indexed": true, "name": "eth_amount", "type": "uint256" }, { "indexed": true, "name": "token_amount", "type": "uint256" } ], "name": "RemoveLiquidity", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "owner", "type": "address" }, { "indexed": true, "name": "spender", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "constant": false, "inputs": [ { "name": "token_addr", "type": "address" }, { "name": "factory_addr", "type": "address" } ], "name": "setup", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "input_amount", "type": "uint256" }, { "name": "input_reserve", "type": "uint256" }, { "name": "output_reserve", "type": "uint256" } ], "name": "getInputPrice", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "output_amount", "type": "uint256" }, { "name": "input_reserve", "type": "uint256" }, { "name": "output_reserve", "type": "uint256" } ], "name": "getOutputPrice", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "min_tokens", "type": "uint256" }, { "name": "deadline", "type": "uint256" } ], "name": "ethToTokenSwapInput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": true, "stateMutability": "payable", "type": "function" }, { "constant": false, "inputs": [ { "name": "min_tokens", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "recipient", "type": "address" } ], "name": "ethToTokenTransferInput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": true, "stateMutability": "payable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_bought", "type": "uint256" }, { "name": "deadline", "type": "uint256" } ], "name": "ethToTokenSwapOutput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": true, "stateMutability": "payable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_bought", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "recipient", "type": "address" } ], "name": "ethToTokenTransferOutput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": true, "stateMutability": "payable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_sold", "type": "uint256" }, { "name": "min_eth", "type": "uint256" }, { "name": "deadline", "type": "uint256" } ], "name": "tokenToEthSwapInput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_sold", "type": "uint256" }, { "name": "min_eth", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "recipient", "type": "address" } ], "name": "tokenToEthTransferInput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "eth_bought", "type": "uint256" }, { "name": "max_tokens", "type": "uint256" }, { "name": "deadline", "type": "uint256" } ], "name": "tokenToEthSwapOutput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "eth_bought", "type": "uint256" }, { "name": "max_tokens", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "recipient", "type": "address" } ], "name": "tokenToEthTransferOutput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_sold", "type": "uint256" }, { "name": "min_tokens_bought", "type": "uint256" }, { "name": "min_eth_bought", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "token_addr", "type": "address" } ], "name": "tokenToTokenSwapInput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_sold", "type": "uint256" }, { "name": "min_tokens_bought", "type": "uint256" }, { "name": "min_eth_bought", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "recipient", "type": "address" }, { "name": "token_addr", "type": "address" } ], "name": "tokenToTokenTransferInput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_bought", "type": "uint256" }, { "name": "max_tokens_sold", "type": "uint256" }, { "name": "max_eth_sold", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "token_addr", "type": "address" } ], "name": "tokenToTokenSwapOutput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_bought", "type": "uint256" }, { "name": "max_tokens_sold", "type": "uint256" }, { "name": "max_eth_sold", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "recipient", "type": "address" }, { "name": "token_addr", "type": "address" } ], "name": "tokenToTokenTransferOutput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_sold", "type": "uint256" }, { "name": "min_tokens_bought", "type": "uint256" }, { "name": "min_eth_bought", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "exchange_addr", "type": "address" } ], "name": "tokenToExchangeSwapInput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_sold", "type": "uint256" }, { "name": "min_tokens_bought", "type": "uint256" }, { "name": "min_eth_bought", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "recipient", "type": "address" }, { "name": "exchange_addr", "type": "address" } ], "name": "tokenToExchangeTransferInput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_bought", "type": "uint256" }, { "name": "max_tokens_sold", "type": "uint256" }, { "name": "max_eth_sold", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "exchange_addr", "type": "address" } ], "name": "tokenToExchangeSwapOutput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "tokens_bought", "type": "uint256" }, { "name": "max_tokens_sold", "type": "uint256" }, { "name": "max_eth_sold", "type": "uint256" }, { "name": "deadline", "type": "uint256" }, { "name": "recipient", "type": "address" }, { "name": "exchange_addr", "type": "address" } ], "name": "tokenToExchangeTransferOutput", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "eth_sold", "type": "uint256" } ], "name": "getEthToTokenInputPrice", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "tokens_bought", "type": "uint256" } ], "name": "getEthToTokenOutputPrice", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "tokens_sold", "type": "uint256" } ], "name": "getTokenToEthInputPrice", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "eth_bought", "type": "uint256" } ], "name": "getTokenToEthOutputPrice", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "tokenAddress", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "factoryAddress", "outputs": [ { "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "min_liquidity", "type": "uint256" }, { "name": "max_tokens", "type": "uint256" }, { "name": "deadline", "type": "uint256" } ], "name": "addLiquidity", "outputs": [ { "name": "", "type": "uint256" } ], "payable": true, "stateMutability": "payable", "type": "function" }, { "constant": false, "inputs": [ { "name": "amount", "type": "uint256" }, { "name": "min_eth", "type": "uint256" }, { "name": "min_tokens", "type": "uint256" }, { "name": "deadline", "type": "uint256" } ], "name": "removeLiquidity", "outputs": [ { "name": "", "type": "uint256" }, { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x60806040523480156200001157600080fd5b50d380156200001f57600080fd5b50d280156200002d57600080fd5b50615240806200003e6000396000f3fe608060405260043610610242576000357c010000000000000000000000000000000000000000000000000000000090048063966dae0e11610140578063d4e4841d116100c8578063f39b5b9b1161008c578063f39b5b9b146112cc578063f3c0efe914611318578063f552d91b146113df578063f88bf15a146114a6578063fd11c2231461153457610242565b8063d4e4841d14610f7b578063dd62ed3e14611018578063ddf7e1a7146110b7578063ea650c7d1461115e578063ec384a3e1461120557610242565b8063a9059cbb1161010f578063a9059cbb14610ccb578063ad65d76d14610d58578063b040d54514610dc4578063b1cb43bf14610e6b578063cd7724c314610f1257610242565b8063966dae0e14610a95578063981a132714610b065780639d76ea5814610bcd578063a457c2d714610c3e57610242565b806339509351116101ce5780637237e031116101925780637237e0311461085057806389f2a871146108ed57806395b68fe71461096a57806395d89b41146109d357806395e3c50b14610a1857610242565b80633950935114610639578063422f1043146106c657806359e948621461071c5780636b1d4db71461078557806370a08231146107d157610242565b806318160ddd1161021557806318160ddd1461040e57806323b872dd146104535780632640f62c146105005780632d34ba7914610569578063313ce567146105f457610242565b8063013efd8b1461025357806306fdde03146102d0578063095ea7b3146103155780630b573638146103a2575b6102503460014233336115b1565b50005b34801561025f57600080fd5b50d3801561026c57600080fd5b50d2801561027957600080fd5b506102ba6004803603606081101561029057600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611873565b6040518082815260200191505060405180910390f35b3480156102dc57600080fd5b50d380156102e957600080fd5b50d280156102f657600080fd5b506102ff61188b565b6040518082815260200191505060405180910390f35b34801561032157600080fd5b50d3801561032e57600080fd5b50d2801561033b57600080fd5b506103886004803603604081101561035257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611891565b604051808215151515815260200191505060405180910390f35b6103f8600480360360608110156103b857600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118a8565b6040518082815260200191505060405180910390f35b34801561041a57600080fd5b50d3801561042757600080fd5b50d2801561043457600080fd5b5061043d611932565b6040518082815260200191505060405180910390f35b34801561045f57600080fd5b50d3801561046c57600080fd5b50d2801561047957600080fd5b506104e66004803603606081101561049057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061193c565b604051808215151515815260200191505060405180910390f35b34801561050c57600080fd5b50d3801561051957600080fd5b50d2801561052657600080fd5b506105536004803603602081101561053d57600080fd5b81019080803590602001909291905050506119ed565b6040518082815260200191505060405180910390f35b34801561057557600080fd5b50d3801561058257600080fd5b50d2801561058f57600080fd5b506105f2600480360360408110156105a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b1f565b005b34801561060057600080fd5b50d3801561060d57600080fd5b50d2801561061a57600080fd5b50610623611d58565b6040518082815260200191505060405180910390f35b34801561064557600080fd5b50d3801561065257600080fd5b50d2801561065f57600080fd5b506106ac6004803603604081101561067657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d5e565b604051808215151515815260200191505060405180910390f35b610706600480360360608110156106dc57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050611e03565b6040518082815260200191505060405180910390f35b34801561072857600080fd5b50d3801561073557600080fd5b50d2801561074257600080fd5b5061076f6004803603602081101561075957600080fd5b81019080803590602001909291905050506127a6565b6040518082815260200191505060405180910390f35b6107bb6004803603604081101561079b57600080fd5b8101908080359060200190929190803590602001909291905050506128de565b6040518082815260200191505060405180910390f35b3480156107dd57600080fd5b50d380156107ea57600080fd5b50d280156107f757600080fd5b5061083a6004803603602081101561080e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128f5565b6040518082815260200191505060405180910390f35b34801561085c57600080fd5b50d3801561086957600080fd5b50d2801561087657600080fd5b506108d76004803603608081101561088d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061293d565b6040518082815260200191505060405180910390f35b3480156108f957600080fd5b50d3801561090657600080fd5b50d2801561091357600080fd5b506109546004803603606081101561092a57600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506129c8565b6040518082815260200191505060405180910390f35b34801561097657600080fd5b50d3801561098357600080fd5b50d2801561099057600080fd5b506109bd600480360360208110156109a757600080fd5b8101908080359060200190929190505050612abc565b6040518082815260200191505060405180910390f35b3480156109df57600080fd5b50d380156109ec57600080fd5b50d280156109f957600080fd5b50610a02612bf4565b6040518082815260200191505060405180910390f35b348015610a2457600080fd5b50d38015610a3157600080fd5b50d28015610a3e57600080fd5b50610a7f60048036036060811015610a5557600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050612bfa565b6040518082815260200191505060405180910390f35b348015610aa157600080fd5b50d38015610aae57600080fd5b50d28015610abb57600080fd5b50610ac4612c12565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b1257600080fd5b50d38015610b1f57600080fd5b50d28015610b2c57600080fd5b50610bb7600480360360c0811015610b4357600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c3c565b6040518082815260200191505060405180910390f35b348015610bd957600080fd5b50d38015610be657600080fd5b50d28015610bf357600080fd5b50610bfc612c92565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610c4a57600080fd5b50d38015610c5757600080fd5b50d28015610c6457600080fd5b50610cb160048036036040811015610c7b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612cbc565b604051808215151515815260200191505060405180910390f35b348015610cd757600080fd5b50d38015610ce457600080fd5b50d28015610cf157600080fd5b50610d3e60048036036040811015610d0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612d61565b604051808215151515815260200191505060405180910390f35b610dae60048036036060811015610d6e57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d78565b6040518082815260200191505060405180910390f35b348015610dd057600080fd5b50d38015610ddd57600080fd5b50d28015610dea57600080fd5b50610e55600480360360a0811015610e0157600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e02565b6040518082815260200191505060405180910390f35b348015610e7757600080fd5b50d38015610e8457600080fd5b50d28015610e9157600080fd5b50610efc600480360360a0811015610ea857600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f18565b6040518082815260200191505060405180910390f35b348015610f1e57600080fd5b50d38015610f2b57600080fd5b50d28015610f3857600080fd5b50610f6560048036036020811015610f4f57600080fd5b8101908080359060200190929190505050612f34565b6040518082815260200191505060405180910390f35b348015610f8757600080fd5b50d38015610f9457600080fd5b50d28015610fa157600080fd5b5061100260048036036080811015610fb857600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613066565b6040518082815260200191505060405180910390f35b34801561102457600080fd5b50d3801561103157600080fd5b50d2801561103e57600080fd5b506110a16004803603604081101561105557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130f1565b6040518082815260200191505060405180910390f35b3480156110c357600080fd5b50d380156110d057600080fd5b50d280156110dd57600080fd5b50611148600480360360a08110156110f457600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613178565b6040518082815260200191505060405180910390f35b34801561116a57600080fd5b50d3801561117757600080fd5b50d2801561118457600080fd5b506111ef600480360360a081101561119b57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061328e565b6040518082815260200191505060405180910390f35b34801561121157600080fd5b50d3801561121e57600080fd5b50d2801561122b57600080fd5b506112b6600480360360c081101561124257600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506132aa565b6040518082815260200191505060405180910390f35b611302600480360360408110156112e257600080fd5b810190808035906020019092919080359060200190929190505050613300565b6040518082815260200191505060405180910390f35b34801561132457600080fd5b50d3801561133157600080fd5b50d2801561133e57600080fd5b506113c9600480360360c081101561135557600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613317565b6040518082815260200191505060405180910390f35b3480156113eb57600080fd5b50d380156113f857600080fd5b50d2801561140557600080fd5b50611490600480360360c081101561141c57600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061342e565b6040518082815260200191505060405180910390f35b3480156114b257600080fd5b50d380156114bf57600080fd5b50d280156114cc57600080fd5b50611517600480360360808110156114e357600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613545565b604051808381526020018281526020019250505060405180910390f35b34801561154057600080fd5b50d3801561154d57600080fd5b50d2801561155a57600080fd5b5061159b6004803603606081101561157157600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506139b0565b6040518082815260200191505060405180910390f35b60004284101580156115c35750600086115b80156115cf5750600085115b6115d857600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561169557600080fd5b505afa1580156116a9573d6000803e3d6000fd5b505050506040513d60208110156116bf57600080fd5b810190808051906020019092919050505090506000611708886117028a3073ffffffffffffffffffffffffffffffffffffffff1631613a4890919063ffffffff16565b846129c8565b90508681101561171757600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b505050506040513d602081101561180657600080fd5b810190808051906020019092919050505061182057600080fd5b80888673ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f60405160405180910390a4809250505095945050505050565b60006118828484843333613ad1565b90509392505050565b60035481565b600061189e338484613df0565b6001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156119135750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61191c57600080fd5b6119298434853386613f4f565b90509392505050565b6000600254905090565b600061194984848461426d565b6119e284336119dd85600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b613df0565b600190509392505050565b60008082116119fb57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611ab857600080fd5b505afa158015611acc573d6000803e3d6000fd5b505050506040513d6020811015611ae257600080fd5b81019080805190602001909291905050509050611b1783823073ffffffffffffffffffffffffffffffffffffffff16316139b0565b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148015611bcb5750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8015611c045750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f494e56414c49445f41444452455353000000000000000000000000000000000081525060200191505060405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f556e6973776170205631000000000000000000000000000000000000000000006001026003819055507f554e492d5631000000000000000000000000000000000000000000000000000060010260048190555060126005819055505050565b60055481565b6000611df93384611df485600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461443790919063ffffffff16565b613df0565b6001905092915050565b60004282118015611e145750600083115b8015611e205750600034115b611e75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806151e7602e913960400191505060405180910390fd5b6000600254905060008111156122c75760008511611e9257600080fd5b6000611ebe343073ffffffffffffffffffffffffffffffffffffffff1631613a4890919063ffffffff16565b90506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f7d57600080fd5b505afa158015611f91573d6000803e3d6000fd5b505050506040513d6020811015611fa757600080fd5b810190808051906020019092919050505090506000611feb600184611fd585346144bf90919063ffffffff16565b81611fdc57fe5b0461443790919063ffffffff16565b905060008361200386346144bf90919063ffffffff16565b8161200a57fe5b04905081881015801561201d5750888110155b61202657600080fd5b612077816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461443790919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506120cc818661443790919063ffffffff16565b600281905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156121cb57600080fd5b505af11580156121df573d6000803e3d6000fd5b505050506040513d60208110156121f557600080fd5b810190808051906020019092919050505061220f57600080fd5b81343373ffffffffffffffffffffffffffffffffffffffff167f06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3809550505050505061279f565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141580156123755750600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156123845750620f42403410155b6123f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f494e56414c49445f56414c55450000000000000000000000000000000000000081525060200191505060405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d602081101561251457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461254557600080fd5b600084905060003073ffffffffffffffffffffffffffffffffffffffff1631905080600281905550806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156126a957600080fd5b505af11580156126bd573d6000803e3d6000fd5b505050506040513d60208110156126d357600080fd5b81019080805190602001909291905050506126ed57600080fd5b81343373ffffffffffffffffffffffffffffffffffffffff167f06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca60405160405180910390a43373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a38093505050505b9392505050565b60008082116127b457600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561287157600080fd5b505afa158015612885573d6000803e3d6000fd5b505050506040513d602081101561289b57600080fd5b8101908080519060200190929190505050905060006128d2843073ffffffffffffffffffffffffffffffffffffffff1631846139b0565b90508092505050919050565b60006128ed8334843333613f4f565b905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156129a85750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6129b157600080fd5b6129be8585853386614562565b9050949350505050565b600080831180156129d95750600082115b612a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f494e56414c49445f56414c55450000000000000000000000000000000000000081525060200191505060405180910390fd5b6000612a626103e5866144bf90919063ffffffff16565b90506000612a7984836144bf90919063ffffffff16565b90506000612aa483612a966103e8896144bf90919063ffffffff16565b61443790919063ffffffff16565b9050808281612aaf57fe5b0493505050509392505050565b6000808211612aca57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612b8757600080fd5b505afa158015612b9b573d6000803e3d6000fd5b505050506040513d6020811015612bb157600080fd5b810190808051906020019092919050505090506000612be884833073ffffffffffffffffffffffffffffffffffffffff16316129c8565b90508092505050919050565b60045481565b6000612c098484843333614562565b90509392505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c7757600080fd5b612c8687878787338888614893565b90509695505050505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000612d573384612d5285600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a4890919063ffffffff16565b613df0565b6001905092915050565b6000612d6e33848461426d565b6001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612de35750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612dec57600080fd5b612df934858533866115b1565b90509392505050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ec057600080fd5b505afa158015612ed4573d6000803e3d6000fd5b505050506040513d6020811015612eea57600080fd5b81019080805190602001909291905050509050612f0c87878787333387614893565b91505095945050505050565b6000612f2986868686333388614d90565b905095945050505050565b6000808211612f4257600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fff57600080fd5b505afa158015613013573d6000803e3d6000fd5b505050506040513d602081101561302957600080fd5b8101908080519060200190929190505050905061305e833073ffffffffffffffffffffffffffffffffffffffff1631836129c8565b915050919050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156130d15750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6130da57600080fd5b6130e78585853386613ad1565b9050949350505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561323657600080fd5b505afa15801561324a573d6000803e3d6000fd5b505050506040513d602081101561326057600080fd5b8101908080519060200190929190505050905061328287878787333387614d90565b91505095945050505050565b600061329f86868686333388614893565b905095945050505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156132e557600080fd5b6132f487878787338888614d90565b90509695505050505050565b600061330f34848433336115b1565b905092915050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133d557600080fd5b505afa1580156133e9573d6000803e3d6000fd5b505050506040513d60208110156133ff57600080fd5b8101908080519060200190929190505050905061342188888888338987614893565b9150509695505050505050565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306f2bf62846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156134ec57600080fd5b505afa158015613500573d6000803e3d6000fd5b505050506040513d602081101561351657600080fd5b8101908080519060200190929190505050905061353888888888338987614d90565b9150509695505050505050565b60008060008611801561355757504283115b80156135635750600085115b801561356f5750600084115b61357857600080fd5b600060025490506000811161358c57600080fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561364957600080fd5b505afa15801561365d573d6000803e3d6000fd5b505050506040513d602081101561367357600080fd5b810190808051906020019092919050505090506000826136b33073ffffffffffffffffffffffffffffffffffffffff16318b6144bf90919063ffffffff16565b816136ba57fe5b0490506000836136d3848c6144bf90919063ffffffff16565b816136da57fe5b0490508882101580156136ed5750878110155b6136f657600080fd5b6137478a6000803373ffffffffffffffffffffffffffffffffffffffff1673fffffffffffffffffffffffffffff