Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- ILO
- Optimization enabled
- false
- Compiler version
- v0.8.9+commit.e5eed63a
- EVM Version
- default
- Verified at
- 2022-03-11T15:18:33.258661Z
Constructor Arguments
0000000000000000000000000b2c1514e85967c65fbb6cd6c7459b512fc83bc40000000000000000000000007c6ddcc3dd33290feb0c32023fa3e3cd0bbdd36f
Arg [0] (address) : 0x0b2c1514e85967c65fbb6cd6c7459b512fc83bc4
Arg [1] (address) : 0x7c6ddcc3dd33290feb0c32023fa3e3cd0bbdd36f
Contract source code
// File: contracts/ILO.sol pragma solidity 0.8.9; interface ERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; return c; } } contract ILO { using SafeMath for uint256; ERC20 public token; uint256 public startTime; uint256 public weiRaised; uint256 public tokensSold; uint256 public tokensUnsold = SafeMath.mul(150000000, 10**(18)); // 150,000,000 ELIST uint256 public phaseOneSupply; uint256 public phaseTwoSupply; uint256 public phaseThreeSupply; uint256 public phaseOneTimeLock; uint256 public phaseTwoTimeLock; uint256 public phaseThreeTimeLock; uint256 public idleTime; uint256 public vestingPhase1; uint256 public vestingPhase2; uint256 public vestingPhase3; uint256 public phase1Rate = 120; uint256 public phase2Rate = 58; uint256 public phase3Rate = 31; uint256 public purchaseCount = 0; struct Purchase { address buyer; uint256 weiInvested; uint256 tokensBuyed; } Purchase[] public latestPurchases; struct Investors { address payable buyer; uint256 tokensAmount; uint256 weiAmountPhase1; uint256 tokensAmountPhase1; uint256 weiAmountPhase2; uint256 tokensAmountPhase2; uint256 weiAmountPhase3; uint256 tokensAmountPhase3; } mapping(address => Investors) public investors; address payable public governance; event TokenPurchase( address indexed purchaser, uint256 value, uint256 amount ); constructor( address payable _governance, ERC20 _token ) { governance = _governance; token = _token; startTime = 1647298800; // Tue Mar 15 2022 00:00:00 GMT+0100 (hora estándar de Europa central) idleTime = SafeMath.add(idleTime, 1440 minutes); phaseOneTimeLock = SafeMath.add(startTime, 8640 minutes); phaseTwoTimeLock = SafeMath.add(phaseOneTimeLock, 10080 minutes); phaseThreeTimeLock = SafeMath.add(phaseTwoTimeLock, 11520 minutes); vestingPhase1 = SafeMath.add(phaseThreeTimeLock, 86400 minutes); vestingPhase2 = SafeMath.add(phaseThreeTimeLock, 43200 minutes); vestingPhase3 = SafeMath.add(phaseThreeTimeLock, 20160 minutes); phaseOneSupply = SafeMath.mul(40000000, 10**(18)); // 40,000,000 ELIST phaseTwoSupply = SafeMath.mul(50000000, 10**(18)); // 50,000,000 ELIST phaseThreeSupply = SafeMath.mul(60000000, 10**(18)); // 60,000,000 ELIST } receive() external payable { buyTokens(); } function _getTokensBasedOnPhase(uint256 _weiAmount) internal returns (uint256 _tokens) { uint256 _now = block.timestamp; uint256 _tokensAmount = 0; _tokens = SafeMath.add(_tokensAmount, _weiAmount.mul(getCurrentRate())); if (_now <= (phaseOneTimeLock - (idleTime))) { if ((phaseOneSupply - _tokens) >= 0) { require( (phaseOneSupply - _tokens) >= 0, "Phase One Supply Ended !" ); phaseOneSupply = phaseOneSupply.sub(_tokens); } else { _tokens = 0; } } else if ( _now > (phaseOneTimeLock - (idleTime)) && _now < phaseOneTimeLock ) { _tokens = 0; require(0 != 0, "IDLE TIME 1 !"); phaseTwoSupply = phaseTwoSupply.sub(_tokens); } else if ( _now > phaseOneTimeLock && _now < (phaseTwoTimeLock - (idleTime)) ) { if ((phaseTwoSupply - _tokens) >= 0) { require( (phaseTwoSupply - _tokens) >= 0, "Phase Two Supply Ended !" ); phaseTwoSupply = phaseTwoSupply.sub(_tokens); } else { _tokens = 0; } } else if ( _now > (phaseTwoTimeLock - (idleTime)) && _now < phaseTwoTimeLock ) { _tokens = 0; require(0 != 0, "IDLE TIME 2 !"); phaseTwoSupply = phaseTwoSupply - _tokens; } else if (_now > phaseTwoTimeLock && _now < (phaseThreeTimeLock)) { if (phaseThreeSupply - _tokens >= 0) { require( (phaseThreeSupply - _tokens) >= 0, "Phase Three Supply Ended !" ); phaseThreeSupply = phaseThreeSupply.sub(_tokens); } else { _tokens = 0; } } return _tokens; } function buyTokens() public payable { uint256 weiAmount = msg.value; require( weiAmount >= 0.0000000000001 ether, "investment should be more than 0.0000000000001 EWT" ); require(block.timestamp <= phaseThreeTimeLock, "ELIST ILO is Closed !"); require(block.timestamp >= startTime, "ELIST ILO is not open yet!"); Investors storage investor = investors[msg.sender]; uint256 tokens = 0; tokens = _getTokensBasedOnPhase(weiAmount); require(tokens > 0, "NOT POSSIBLE TO PURCHASE ELIST"); weiRaised = weiRaised.add(weiAmount); investor.buyer = payable(msg.sender); latestPurchases.push( Purchase(msg.sender, weiAmount, tokens) ); purchaseCount = purchaseCount + 1; if(block.timestamp < (phaseOneTimeLock-idleTime)){ investor.weiAmountPhase1 = investor.weiAmountPhase1 + weiAmount; investor.tokensAmountPhase1 = investor.tokensAmountPhase1 + tokens; }else if( block.timestamp > phaseOneTimeLock && block.timestamp < (phaseTwoTimeLock-idleTime)){ investor.weiAmountPhase2 = investor.weiAmountPhase2 + weiAmount; investor.tokensAmountPhase2 = investor.tokensAmountPhase2 + tokens; }else if(block.timestamp > phaseTwoTimeLock && block.timestamp < phaseThreeTimeLock){ investor.weiAmountPhase3 = investor.weiAmountPhase3 + weiAmount; investor.tokensAmountPhase3 = investor.tokensAmountPhase3 + tokens; } investor.tokensAmount = investor.tokensAmount + tokens; tokensSold = tokensSold.add(tokens); tokensUnsold = tokensUnsold.sub(tokens); governance.transfer(weiAmount); emit TokenPurchase(msg.sender, weiAmount, tokens); } function withdrawTokens() public returns (bool success) { Investors storage investor = investors[msg.sender]; address buyer = investor.buyer; require(msg.sender == buyer, "Not valid investor to withdraw !"); require(block.timestamp >= vestingPhase3,"ELIST still locked"); if(investor.tokensAmountPhase3 > 0 && block.timestamp >= vestingPhase3){ require(block.timestamp >= vestingPhase3, "Still in Vesting PH3"); require(token.transfer(buyer, investor.tokensAmountPhase3), "Can NOT transfer ELIST from Phase 3"); investor.tokensAmount = SafeMath.sub(investor.tokensAmount, investor.tokensAmountPhase3); investor.tokensAmountPhase3 = 0; } if(investor.tokensAmountPhase2 > 0 && block.timestamp >= vestingPhase2){ require(block.timestamp >= vestingPhase2, "Still in Vesting PH2"); require(token.transfer(buyer, investor.tokensAmountPhase2), "Can NOT transfer ELIST from Phase 2"); investor.tokensAmount = SafeMath.sub(investor.tokensAmount, investor.tokensAmountPhase2); investor.tokensAmountPhase2 = 0; } if(investor.tokensAmountPhase1 > 0 && block.timestamp >= vestingPhase1){ require(block.timestamp >= vestingPhase1, "Still in Vesting PH1"); require(token.transfer(buyer, investor.tokensAmountPhase1), "Can NOT transfer ELIST from Phase 1"); investor.tokensAmount = SafeMath.sub(investor.tokensAmount, investor.tokensAmountPhase1); investor.tokensAmountPhase1 = 0; } return true; } function getTokenCount() public view returns (uint256) { Investors storage investor = investors[msg.sender]; uint256 _totalTokens = investor.tokensAmountPhase1 + investor.tokensAmountPhase2 + investor.tokensAmountPhase3; return _totalTokens; } function withdrawUnsoldTokens() public returns (bool success) { require(msg.sender == governance, "!governance"); require(block.timestamp > phaseThreeTimeLock, "ELIST ILO is not finished"); require(token.transfer(governance, tokensUnsold), "Transfer not successful"); return true; } function setGovernance(address payable _governance) public returns (bool success) { require(msg.sender == governance, "!governance"); governance = _governance; return true; } function withdrawEthers(uint256 _weiAmount) public returns (bool success) { require(msg.sender == governance, "!governance"); governance.transfer(_weiAmount); return true; } function getCurrentRate() public view returns (uint256) { if(block.timestamp < phaseOneTimeLock){ return phase1Rate; }else if(block.timestamp < phaseTwoTimeLock && block.timestamp >= phaseOneTimeLock){ return phase2Rate; }else if(block.timestamp < phaseThreeTimeLock || block.timestamp > phaseThreeTimeLock){ return phase3Rate; } return 0; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_governance","internalType":"address payable"},{"type":"address","name":"_token","internalType":"contract ERC20"}]},{"type":"event","name":"TokenPurchase","inputs":[{"type":"address","name":"purchaser","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"payable","outputs":[],"name":"buyTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCurrentRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTokenCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"idleTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"buyer","internalType":"address payable"},{"type":"uint256","name":"tokensAmount","internalType":"uint256"},{"type":"uint256","name":"weiAmountPhase1","internalType":"uint256"},{"type":"uint256","name":"tokensAmountPhase1","internalType":"uint256"},{"type":"uint256","name":"weiAmountPhase2","internalType":"uint256"},{"type":"uint256","name":"tokensAmountPhase2","internalType":"uint256"},{"type":"uint256","name":"weiAmountPhase3","internalType":"uint256"},{"type":"uint256","name":"tokensAmountPhase3","internalType":"uint256"}],"name":"investors","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"buyer","internalType":"address"},{"type":"uint256","name":"weiInvested","internalType":"uint256"},{"type":"uint256","name":"tokensBuyed","internalType":"uint256"}],"name":"latestPurchases","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phase1Rate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phase2Rate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phase3Rate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseOneSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseOneTimeLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseThreeSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseThreeTimeLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseTwoSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"phaseTwoTimeLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"purchaseCount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"setGovernance","inputs":[{"type":"address","name":"_governance","internalType":"address payable"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ERC20"}],"name":"token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensSold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensUnsold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vestingPhase1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vestingPhase2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"vestingPhase3","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"weiRaised","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"withdrawEthers","inputs":[{"type":"uint256","name":"_weiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"withdrawTokens","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"withdrawUnsoldTokens","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x6080604052600436106101c65760003560e01c806378a89567116100f7578063ba982c4111610095578063d76b609511610064578063d76b60951461062b578063f420670614610656578063f7fb07b014610693578063fc0c546a146106be576101d5565b8063ba982c41146105a0578063c44aa1f4146105cb578063c8bdbfb6146105f6578063d0febe4c14610621576101d5565b80638d8f2adb116100d15780638d8f2adb146104e257806393bd73851461050d578063a1e33a8914610538578063ab033ea914610563576101d5565b806378a895671461046157806378e979251461048c5780637f18d9e3146104b7576101d5565b80634302c41711610164578063595d22131161013e578063595d22131461039c5780635aa6e675146103c757806362f3b1f6146103f25780636f7bc9be1461041d576101d5565b80634302c4171461031b578063518ab2a81461034657806355a16c2414610371576101d5565b80632236fa1d116101a05780632236fa1d1461026f5780632b85ed9c1461029a5780634042b66f146102c557806341338cc5146102f0576101d5565b806303b4a479146101da57806310095cd21461020557806319152e4214610244576101d5565b366101d5576101d36106e9565b005b600080fd5b3480156101e657600080fd5b506101ef610b78565b6040516101fc9190611bfe565b60405180910390f35b34801561021157600080fd5b5061022c60048036038101906102279190611c4a565b610b7e565b60405161023b93929190611cb8565b60405180910390f35b34801561025057600080fd5b50610259610bd8565b6040516102669190611bfe565b60405180910390f35b34801561027b57600080fd5b50610284610bde565b6040516102919190611bfe565b60405180910390f35b3480156102a657600080fd5b506102af610be4565b6040516102bc9190611bfe565b60405180910390f35b3480156102d157600080fd5b506102da610bea565b6040516102e79190611bfe565b60405180910390f35b3480156102fc57600080fd5b50610305610bf0565b6040516103129190611bfe565b60405180910390f35b34801561032757600080fd5b50610330610bf6565b60405161033d9190611bfe565b60405180910390f35b34801561035257600080fd5b5061035b610bfc565b6040516103689190611bfe565b60405180910390f35b34801561037d57600080fd5b50610386610c02565b6040516103939190611bfe565b60405180910390f35b3480156103a857600080fd5b506103b1610c08565b6040516103be9190611bfe565b60405180910390f35b3480156103d357600080fd5b506103dc610c0e565b6040516103e99190611d10565b60405180910390f35b3480156103fe57600080fd5b50610407610c34565b6040516104149190611bfe565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190611d57565b610c3a565b604051610458989796959493929190611d84565b60405180910390f35b34801561046d57600080fd5b50610476610ca2565b6040516104839190611bfe565b60405180910390f35b34801561049857600080fd5b506104a1610d15565b6040516104ae9190611bfe565b60405180910390f35b3480156104c357600080fd5b506104cc610d1b565b6040516104d99190611bfe565b60405180910390f35b3480156104ee57600080fd5b506104f7610d21565b6040516105049190611e1d565b60405180910390f35b34801561051957600080fd5b506105226112a9565b60405161052f9190611bfe565b60405180910390f35b34801561054457600080fd5b5061054d6112af565b60405161055a9190611bfe565b60405180910390f35b34801561056f57600080fd5b5061058a60048036038101906105859190611e64565b6112b5565b6040516105979190611e1d565b60405180910390f35b3480156105ac57600080fd5b506105b5611391565b6040516105c29190611bfe565b60405180910390f35b3480156105d757600080fd5b506105e0611397565b6040516105ed9190611bfe565b60405180910390f35b34801561060257600080fd5b5061060b61139d565b6040516106189190611e1d565b60405180910390f35b6106296106e9565b005b34801561063757600080fd5b5061064061158a565b60405161064d9190611bfe565b60405180910390f35b34801561066257600080fd5b5061067d60048036038101906106789190611c4a565b611590565b60405161068a9190611e1d565b60405180910390f35b34801561069f57600080fd5b506106a8611694565b6040516106b59190611bfe565b60405180910390f35b3480156106ca57600080fd5b506106d36116f4565b6040516106e09190611ef0565b60405180910390f35b6000349050620186a0811015610734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072b90611f8e565b60405180910390fd5b600a54421115610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077090611ffa565b60405180910390fd5b6001544210156107be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b590612066565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061080c836117f1565b905060008111610851576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610848906120d2565b60405180910390fd5b6108668360025461179390919063ffffffff16565b600281905550338260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601360405180606001604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815260200183815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155505060016012546109779190612121565b601281905550600b5460085461098d9190612177565b4210156109c9578282600201546109a49190612121565b82600201819055508082600301546109bc9190612121565b8260030181905550610a6c565b600854421180156109e85750600b546009546109e59190612177565b42105b15610a22578282600401546109fd9190612121565b8260040181905550808260050154610a159190612121565b8260050181905550610a6b565b60095442118015610a345750600a5442105b15610a6a57828260060154610a499190612121565b8260060181905550808260070154610a619190612121565b82600701819055505b5b5b808260010154610a7c9190612121565b8260010181905550610a998160035461179390919063ffffffff16565b600381905550610ab481600454611b3790919063ffffffff16565b600481905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610b22573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167fcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f8483604051610b6b9291906121ab565b60405180910390a2505050565b60075481565b60138181548110610b8e57600080fd5b90600052602060002090600302016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154905083565b60095481565b60115481565b60125481565b60025481565b60105481565b600e5481565b60035481565b60055481565b60065481565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b60146020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060154908060070154905088565b600080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816007015482600501548360030154610d019190612121565b610d0b9190612121565b9050809250505090565b60015481565b600c5481565b600080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390612220565b60405180910390fd5b600e54421015610e41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e389061228c565b60405180910390fd5b60008260070154118015610e575750600e544210155b15610fb657600e54421015610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e98906122f8565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8284600701546040518363ffffffff1660e01b8152600401610f00929190612318565b602060405180830381600087803b158015610f1a57600080fd5b505af1158015610f2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f52919061236d565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061240c565b60405180910390fd5b610fa382600101548360070154611b37565b8260010181905550600082600701819055505b60008260050154118015610fcc5750600d544210155b1561112b57600d54421015611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d90612478565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8284600501546040518363ffffffff1660e01b8152600401611075929190612318565b602060405180830381600087803b15801561108f57600080fd5b505af11580156110a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c7919061236d565b611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd9061250a565b60405180910390fd5b61111882600101548360050154611b37565b8260010181905550600082600501819055505b600082600301541180156111415750600c544210155b156112a057600c5442101561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290612576565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8284600301546040518363ffffffff1660e01b81526004016111ea929190612318565b602060405180830381600087803b15801561120457600080fd5b505af1158015611218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123c919061236d565b61127b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127290612608565b60405180910390fd5b61128d82600101548360030154611b37565b8260010181905550600082600301819055505b60019250505090565b600b5481565b600d5481565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133e90612674565b60405180910390fd5b81601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60045481565b60085481565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690612674565b60405180910390fd5b600a544211611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a906126e0565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166004546040518363ffffffff1660e01b81526004016114f2929190612721565b602060405180830381600087803b15801561150c57600080fd5b505af1158015611520573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611544919061236d565b611583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157a90612796565b60405180910390fd5b6001905090565b600f5481565b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990612674565b60405180910390fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561168a573d6000803e3d6000fd5b5060019050919050565b60006008544210156116aa57600f5490506116f1565b600954421080156116bd57506008544210155b156116cc5760105490506116f1565b600a544210806116dd5750600a5442115b156116ec5760115490506116f1565b600090505b90565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008083141561172b576000905061178d565b6000828461173991906127b6565b9050828482611748919061283f565b14611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f906128e2565b60405180910390fd5b809150505b92915050565b60008082846117a29190612121565b9050838110156117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de9061294e565b60405180910390fd5b8091505092915050565b600080429050600061181c81611817611808611694565b8761171890919063ffffffff16565b611793565b9250600b5460085461182e9190612177565b82116118c4576000836005546118449190612177565b106118ba576000836005546118599190612177565b101561189a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611891906129ba565b60405180910390fd5b6118af83600554611b3790919063ffffffff16565b6005819055506118bf565b600092505b611b30565b600b546008546118d49190612177565b821180156118e3575060085482105b1561195057600092506000801415611930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192790612a26565b60405180910390fd5b61194583600654611b3790919063ffffffff16565b600681905550611b2f565b6008548211801561196f5750600b5460095461196c9190612177565b82105b15611a04576000836006546119849190612177565b106119fa576000836006546119999190612177565b10156119da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d190612a92565b60405180910390fd5b6119ef83600654611b3790919063ffffffff16565b6006819055506119ff565b600092505b611b2e565b600b54600954611a149190612177565b82118015611a23575060095482105b15611a8957600092506000801415611a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6790612afe565b60405180910390fd5b82600654611a7e9190612177565b600681905550611b2d565b60095482118015611a9b5750600a5482105b15611b2c57600083600754611ab09190612177565b10611b2657600083600754611ac59190612177565b1015611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd90612b6a565b60405180910390fd5b611b1b83600754611b3790919063ffffffff16565b600781905550611b2b565b600092505b5b5b5b5b5b5050919050565b6000611b7983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b81565b905092915050565b6000838311158290611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc09190612c12565b60405180910390fd5b5060008385611bd89190612177565b9050809150509392505050565b6000819050919050565b611bf881611be5565b82525050565b6000602082019050611c136000830184611bef565b92915050565b600080fd5b611c2781611be5565b8114611c3257600080fd5b50565b600081359050611c4481611c1e565b92915050565b600060208284031215611c6057611c5f611c19565b5b6000611c6e84828501611c35565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611ca282611c77565b9050919050565b611cb281611c97565b82525050565b6000606082019050611ccd6000830186611ca9565b611cda6020830185611bef565b611ce76040830184611bef565b949350505050565b6000611cfa82611c77565b9050919050565b611d0a81611cef565b82525050565b6000602082019050611d256000830184611d01565b92915050565b611d3481611c97565b8114611d3f57600080fd5b50565b600081359050611d5181611d2b565b92915050565b600060208284031215611d6d57611d6c611c19565b5b6000611d7b84828501611d42565b91505092915050565b600061010082019050611d9a600083018b611d01565b611da7602083018a611bef565b611db46040830189611bef565b611dc16060830188611bef565b611dce6080830187611bef565b611ddb60a0830186611bef565b611de860c0830185611bef565b611df560e0830184611bef565b9998505050505050505050565b60008115159050919050565b611e1781611e02565b82525050565b6000602082019050611e326000830184611e0e565b92915050565b611e4181611cef565b8114611e4c57600080fd5b50565b600081359050611e5e81611e38565b92915050565b600060208284031215611e7a57611e79611c19565b5b6000611e8884828501611e4f565b91505092915050565b6000819050919050565b6000611eb6611eb1611eac84611c77565b611e91565b611c77565b9050919050565b6000611ec882611e9b565b9050919050565b6000611eda82611ebd565b9050919050565b611eea81611ecf565b82525050565b6000602082019050611f056000830184611ee1565b92915050565b600082825260208201905092915050565b7f696e766573746d656e742073686f756c64206265206d6f7265207468616e203060008201527f2e30303030303030303030303031204557540000000000000000000000000000602082015250565b6000611f78603283611f0b565b9150611f8382611f1c565b604082019050919050565b60006020820190508181036000830152611fa781611f6b565b9050919050565b7f454c49535420494c4f20697320436c6f73656420210000000000000000000000600082015250565b6000611fe4601583611f0b565b9150611fef82611fae565b602082019050919050565b6000602082019050818103600083015261201381611fd7565b9050919050565b7f454c49535420494c4f206973206e6f74206f70656e2079657421000000000000600082015250565b6000612050601a83611f0b565b915061205b8261201a565b602082019050919050565b6000602082019050818103600083015261207f81612043565b9050919050565b7f4e4f5420504f535349424c4520544f20505552434841534520454c4953540000600082015250565b60006120bc601e83611f0b565b91506120c782612086565b602082019050919050565b600060208201905081810360008301526120eb816120af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061212c82611be5565b915061213783611be5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561216c5761216b6120f2565b5b828201905092915050565b600061218282611be5565b915061218d83611be5565b9250828210156121a05761219f6120f2565b5b828203905092915050565b60006040820190506121c06000830185611bef565b6121cd6020830184611bef565b9392505050565b7f4e6f742076616c696420696e766573746f7220746f2077697468647261772021600082015250565b600061220a602083611f0b565b9150612215826121d4565b602082019050919050565b60006020820190508181036000830152612239816121fd565b9050919050565b7f454c495354207374696c6c206c6f636b65640000000000000000000000000000600082015250565b6000612276601283611f0b565b915061228182612240565b602082019050919050565b600060208201905081810360008301526122a581612269565b9050919050565b7f5374696c6c20696e2056657374696e6720504833000000000000000000000000600082015250565b60006122e2601483611f0b565b91506122ed826122ac565b602082019050919050565b60006020820190508181036000830152612311816122d5565b9050919050565b600060408201905061232d6000830185611ca9565b61233a6020830184611bef565b9392505050565b61234a81611e02565b811461235557600080fd5b50565b60008151905061236781612341565b92915050565b60006020828403121561238357612382611c19565b5b600061239184828501612358565b91505092915050565b7f43616e204e4f54207472616e7366657220454c4953542066726f6d205068617360008201527f6520330000000000000000000000000000000000000000000000000000000000602082015250565b60006123f6602383611f0b565b91506124018261239a565b604082019050919050565b60006020820190508181036000830152612425816123e9565b9050919050565b7f5374696c6c20696e2056657374696e6720504832000000000000000000000000600082015250565b6000612462601483611f0b565b915061246d8261242c565b602082019050919050565b6000602082019050818103600083015261249181612455565b9050919050565b7f43616e204e4f54207472616e7366657220454c4953542066726f6d205068617360008201527f6520320000000000000000000000000000000000000000000000000000000000602082015250565b60006124f4602383611f0b565b91506124ff82612498565b604082019050919050565b60006020820190508181036000830152612523816124e7565b9050919050565b7f5374696c6c20696e2056657374696e6720504831000000000000000000000000600082015250565b6000612560601483611f0b565b915061256b8261252a565b602082019050919050565b6000602082019050818103600083015261258f81612553565b9050919050565b7f43616e204e4f54207472616e7366657220454c4953542066726f6d205068617360008201527f6520310000000000000000000000000000000000000000000000000000000000602082015250565b60006125f2602383611f0b565b91506125fd82612596565b604082019050919050565b60006020820190508181036000830152612621816125e5565b9050919050565b7f21676f7665726e616e6365000000000000000000000000000000000000000000600082015250565b600061265e600b83611f0b565b915061266982612628565b602082019050919050565b6000602082019050818103600083015261268d81612651565b9050919050565b7f454c49535420494c4f206973206e6f742066696e697368656400000000000000600082015250565b60006126ca601983611f0b565b91506126d582612694565b602082019050919050565b600060208201905081810360008301526126f9816126bd565b9050919050565b600061270b82611ebd565b9050919050565b61271b81612700565b82525050565b60006040820190506127366000830185612712565b6127436020830184611bef565b9392505050565b7f5472616e73666572206e6f74207375636365737366756c000000000000000000600082015250565b6000612780601783611f0b565b915061278b8261274a565b602082019050919050565b600060208201905081810360008301526127af81612773565b9050919050565b60006127c182611be5565b91506127cc83611be5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612805576128046120f2565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061284a82611be5565b915061285583611be5565b92508261286557612864612810565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006128cc602183611f0b565b91506128d782612870565b604082019050919050565b600060208201905081810360008301526128fb816128bf565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612938601b83611f0b565b915061294382612902565b602082019050919050565b600060208201905081810360008301526129678161292b565b9050919050565b7f5068617365204f6e6520537570706c7920456e64656420210000000000000000600082015250565b60006129a4601883611f0b565b91506129af8261296e565b602082019050919050565b600060208201905081810360008301526129d381612997565b9050919050565b7f49444c452054494d452031202100000000000000000000000000000000000000600082015250565b6000612a10600d83611f0b565b9150612a1b826129da565b602082019050919050565b60006020820190508181036000830152612a3f81612a03565b9050919050565b7f50686173652054776f20537570706c7920456e64656420210000000000000000600082015250565b6000612a7c601883611f0b565b9150612a8782612a46565b602082019050919050565b60006020820190508181036000830152612aab81612a6f565b9050919050565b7f49444c452054494d452032202100000000000000000000000000000000000000600082015250565b6000612ae8600d83611f0b565b9150612af382612ab2565b602082019050919050565b60006020820190508181036000830152612b1781612adb565b9050919050565b7f506861736520546872656520537570706c7920456e6465642021000000000000600082015250565b6000612b54601a83611f0b565b9150612b5f82612b1e565b602082019050919050565b60006020820190508181036000830152612b8381612b47565b9050919050565b600081519050919050565b60005b83811015612bb3578082015181840152602081019050612b98565b83811115612bc2576000848401525b50505050565b6000601f19601f8301169050919050565b6000612be482612b8a565b612bee8185611f0b565b9350612bfe818560208601612b95565b612c0781612bc8565b840191505092915050565b60006020820190508181036000830152612c2c8184612bd9565b90509291505056fea2646970667358221220855f3c5541def9cb5748a3af0231ef35154b516f55e5d0a404d14c643d9b3a5b64736f6c63430008090033