Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- TaikoSwap
- Optimization enabled
- true
- Compiler version
- v0.8.0+commit.c7dfd78e
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2024-05-27T12:15:25.082061Z
Constructor Arguments
0x0000000000000000000000006391c46ac4d308adce3aa49ce18488f25b176378
Arg [0] (address) : 0x6391c46ac4d308adce3aa49ce18488f25b176378
Contract source code
// SPDX-License-Identifier: MIT /* Website: https://www.swaptko.xyz/ TG: https://t.me/swaptaiko X: https://x.com/swaptaiko */ pragma solidity 0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } } interface IERC20 { 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) { require(b > 0, errorMessage); uint256 c = a / b; return c; } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "cannot set owner to 0 address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); function getPair(address tokenA, address tokenB) external view returns (address pair); } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } contract TaikoSwap is Context, IERC20, Ownable { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcludedFromFee; bool public transferDelayEnabled = false; address payable private _taxWallet; uint256 private _finalBuyTax=4; uint256 private _finalSellTax=4; uint8 private constant _decimals = 18; uint256 private _tTotal = 1000000 * 10 **_decimals; string private constant _name = unicode"TaikoSwap"; string private constant _symbol = unicode"TKS"; uint256 public _taxSwapThreshold= 2500 * 10 **_decimals; uint256 public _maxTaxSwap= 5000 * 10 **_decimals; IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; bool private tradingOpen; bool private inSwap = false; bool private swapEnabled = false; mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); event MaxTxAmountUpdated(uint _maxTxAmount); modifier lockTheSwap { inSwap = true; _; inSwap = false; } constructor (address router) { _taxWallet = payable(_msgSender()); _balances[_msgSender()] = _tTotal; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[_taxWallet] = true; uniswapV2Router = IUniswapV2Router02(router); _approve(address(this), address(uniswapV2Router), _tTotal); emit Transfer(address(0), _msgSender(), _tTotal); } function name() public pure returns (string memory) { return _name; } function symbol() public pure returns (string memory) { return _symbol; } function decimals() public pure returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address from, address to, uint256 amount) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); uint256 taxAmount=0; if (from != owner() && to != owner()) { if (from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to] ) { taxAmount = amount.mul(_finalBuyTax).div(100); } if(to == uniswapV2Pair && from!= address(this) ){ taxAmount = amount.mul(_finalSellTax).div(100); } uint256 contractTokenBalance = balanceOf(address(this)); if (!inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance>_taxSwapThreshold) { swapTokensForEth(min(amount,min(contractTokenBalance,_maxTaxSwap))); uint256 contractETHBalance = address(this).balance; if(contractETHBalance > 0) { sendETHToFee(address(this).balance); } } } if(taxAmount>0){ _balances[address(this)]=_balances[address(this)].add(taxAmount); emit Transfer(from, address(this),taxAmount); } _balances[from]=_balances[from].sub(amount); _balances[to]=_balances[to].add(amount.sub(taxAmount)); emit Transfer(from, to, amount.sub(taxAmount)); } function _mint(address account, uint256 amount) internal { require(account != address(0), 'ERC20: mint to the zero address'); _tTotal = _tTotal.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef). function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); } function min(uint256 a, uint256 b) private pure returns (uint256){ return (a>b)?b:a; } function swapTokensForEth(uint256 tokenAmount) private lockTheSwap { if(tokenAmount==0){return;} if(!tradingOpen){return;} address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function sendETHToFee(uint256 amount) private { _taxWallet.transfer(amount); } function openTrading() external onlyOwner() { require(!tradingOpen,"trading is already open"); IUniswapV2Factory factory=IUniswapV2Factory(uniswapV2Router.factory()); uniswapV2Pair = factory.getPair(address(this),uniswapV2Router.WETH()); if(uniswapV2Pair==address(0x0)){ uniswapV2Pair = factory.createPair(address(this), uniswapV2Router.WETH()); } uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp); IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max); swapEnabled = true; tradingOpen = true; } receive() external payable {} function manualSwap() external { require(_msgSender()==_taxWallet); uint256 tokenBalance=balanceOf(address(this)); if(tokenBalance>0){ swapTokensForEth(tokenBalance); } uint256 ethBalance=address(this).balance; if(ethBalance>0){ sendETHToFee(ethBalance); } } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "cub::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "cub::delegateBySig: invalid nonce"); require(block.timestamp <= expiry, "cub::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "cub::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying cubs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld - amount; _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld + amount; _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes) internal { uint32 blockNumber = safe32(block.number, "cub::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"router","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DelegateChanged","inputs":[{"type":"address","name":"delegator","internalType":"address","indexed":true},{"type":"address","name":"fromDelegate","internalType":"address","indexed":true},{"type":"address","name":"toDelegate","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"DelegateVotesChanged","inputs":[{"type":"address","name":"delegate","internalType":"address","indexed":true},{"type":"uint256","name":"previousBalance","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBalance","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MaxTxAmountUpdated","inputs":[{"type":"uint256","name":"_maxTxAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DELEGATION_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTaxSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_taxSwapThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"fromBlock","internalType":"uint32"},{"type":"uint256","name":"votes","internalType":"uint256"}],"name":"checkpoints","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint32","name":"","internalType":"uint32"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delegate","inputs":[{"type":"address","name":"delegatee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"delegateBySig","inputs":[{"type":"address","name":"delegatee","internalType":"address"},{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"uint256","name":"expiry","internalType":"uint256"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"delegates","inputs":[{"type":"address","name":"delegator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCurrentVotes","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPriorVotes","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"blockNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSwap","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"numCheckpoints","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"openTrading","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferDelayEnabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60806040526004805460ff191681556005819055600655620000246012600a62000453565b6200003390620f42406200053e565b600755620000446012600a62000453565b62000052906109c46200053e565b600855620000636012600a62000453565b62000071906113886200053e565b600955600b805461ffff60a81b191690553480156200008f57600080fd5b5060405162002ced38038062002ced833981016040819052620000b29162000347565b6000620000be6200026f565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001126200026f565b600480546001600160a01b039290921661010002610100600160a81b0319909216919091179055600754600160006200014a6200026f565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160036000620001846200027360201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553080825260039094528281208054861660019081179091556004546101009004831682529290208054909416909117909255600a80548484166001600160a01b031990911617908190556007546200020f93919091169062000282565b620002196200026f565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600754604051620002609190620003fd565b60405180910390a35062000576565b3390565b6000546001600160a01b031690565b6001600160a01b038316620002b45760405162461bcd60e51b8152600401620002ab90620003b9565b60405180910390fd5b6001600160a01b038216620002dd5760405162461bcd60e51b8152600401620002ab9062000377565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906200033a908590620003fd565b60405180910390a3505050565b60006020828403121562000359578081fd5b81516001600160a01b038116811462000370578182fd5b9392505050565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b90815260200190565b80825b60018086116200041a57506200044a565b8187048211156200042f576200042f62000560565b808616156200043d57918102915b9490941c93800262000409565b94509492505050565b60006200037060001960ff851684600082620004725750600162000370565b81620004815750600062000370565b81600181146200049a5760028114620004a557620004d9565b600191505062000370565b60ff841115620004b957620004b962000560565b6001841b915084821115620004d257620004d262000560565b5062000370565b5060208310610133831016604e8410600b841016171562000511575081810a838111156200050b576200050b62000560565b62000370565b62000520848484600162000406565b80860482111562000535576200053562000560565b02949350505050565b60008160001904831182151516156200055b576200055b62000560565b500290565b634e487b7160e01b600052601160045260246000fd5b61276780620005866000396000f3fe6080604052600436106101bb5760003560e01c8063782d6fe1116100ec578063c3cda5201161008a578063dd62ed3e11610064578063dd62ed3e1461049c578063e7a324dc146104bc578063f1127ed8146104d1578063f2fde38b146104ff576101c2565b8063c3cda52014610452578063c876d0b914610472578063c9567bf914610487576101c2565b806395d89b41116100c657806395d89b41146103e8578063a9059cbb146103fd578063b4b5ea571461041d578063bf474bed1461043d576101c2565b8063782d6fe1146103935780637ecebe00146103b35780638da5cb5b146103d3576101c2565b806340c10f19116101595780635c19a95c116101335780635c19a95c146103115780636fcfff451461033157806370a082311461035e578063715018a61461037e576101c2565b806340c10f19146102ad57806351bc3c85146102cf578063587cde1e146102e4576101c2565b806318160ddd1161019557806318160ddd1461024157806320606b701461025657806323b872dd1461026b578063313ce5671461028b576101c2565b806306fdde03146101c7578063095ea7b3146101f25780630faee56f1461021f576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101dc61051f565b6040516101e991906120e8565b60405180910390f35b3480156101fe57600080fd5b5061021261020d366004611ec4565b610542565b6040516101e9919061206e565b34801561022b57600080fd5b50610234610560565b6040516101e99190612079565b34801561024d57600080fd5b50610234610566565b34801561026257600080fd5b5061023461056c565b34801561027757600080fd5b50610212610286366004611e84565b610590565b34801561029757600080fd5b506102a0610617565b6040516101e9919061259a565b3480156102b957600080fd5b506102cd6102c8366004611ec4565b61061c565b005b3480156102db57600080fd5b506102cd610668565b3480156102f057600080fd5b506103046102ff366004611e14565b6106c0565b6040516101e99190611fec565b34801561031d57600080fd5b506102cd61032c366004611e14565b6106de565b34801561033d57600080fd5b5061035161034c366004611e14565b6106eb565b6040516101e99190612573565b34801561036a57600080fd5b50610234610379366004611e14565b610703565b34801561038a57600080fd5b506102cd61071e565b34801561039f57600080fd5b506102346103ae366004611ec4565b61079d565b3480156103bf57600080fd5b506102346103ce366004611e14565b6109c2565b3480156103df57600080fd5b506103046109d4565b3480156103f457600080fd5b506101dc6109e3565b34801561040957600080fd5b50610212610418366004611ec4565b610a00565b34801561042957600080fd5b50610234610438366004611e14565b610a14565b34801561044957600080fd5b50610234610a89565b34801561045e57600080fd5b506102cd61046d366004611eef565b610a8f565b34801561047e57600080fd5b50610212610c6a565b34801561049357600080fd5b506102cd610c73565b3480156104a857600080fd5b506102346104b7366004611e4c565b6110ea565b3480156104c857600080fd5b50610234611115565b3480156104dd57600080fd5b506104f16104ec366004611f4f565b611139565b6040516101e9929190612584565b34801561050b57600080fd5b506102cd61051a366004611e14565b611166565b60408051808201909152600981526805461696b6f537761760bc1b602082015290565b600061055661054f6111ca565b84846111ce565b5060015b92915050565b60095481565b60075490565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061059d848484611282565b61060d846105a96111ca565b610608856040518060600160405280602881526020016126d7602891396001600160a01b038a166000908152600260205260408120906105e76111ca565b6001600160a01b0316815260208101919091526040016000205491906115c9565b6111ce565b5060019392505050565b601290565b6106246111ca565b6000546001600160a01b0390811691161461065a5760405162461bcd60e51b81526004016106519061233f565b60405180910390fd5b6106648282611603565b5050565b60045461010090046001600160a01b03166106816111ca565b6001600160a01b03161461069457600080fd5b600061069f30610703565b905080156106b0576106b0816116b7565b478015610664576106648161187d565b6001600160a01b039081166000908152600c60205260409020541690565b6106e833826118bb565b50565b600e6020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526001602052604090205490565b6107266111ca565b6000546001600160a01b039081169116146107535760405162461bcd60e51b81526004016106519061233f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60004382106107be5760405162461bcd60e51b8152600401610651906122b8565b6001600160a01b0383166000908152600e602052604090205463ffffffff16806107ec57600091505061055a565b6001600160a01b0384166000908152600d602052604081208491610811600185612655565b63ffffffff9081168252602082019290925260400160002054161161087a576001600160a01b0384166000908152600d6020526040812090610854600184612655565b63ffffffff1663ffffffff1681526020019081526020016000206001015491505061055a565b6001600160a01b0384166000908152600d6020908152604080832083805290915290205463ffffffff168310156108b557600091505061055a565b6000806108c3600184612655565b90505b8163ffffffff168163ffffffff16111561098b57600060026108e88484612655565b6108f291906125fc565b6108fc9083612655565b6001600160a01b0388166000908152600d6020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141561095f5760200151945061055a9350505050565b805163ffffffff1687111561097657819350610984565b610981600183612655565b92505b50506108c6565b506001600160a01b0385166000908152600d6020908152604080832063ffffffff9094168352929052206001015491505092915050565b600f6020526000908152604090205481565b6000546001600160a01b031690565b604080518082019091526003815262544b5360e81b602082015290565b6000610556610a0d6111ca565b8484611282565b6001600160a01b0381166000908152600e602052604081205463ffffffff1680610a3f576000610a82565b6001600160a01b0383166000908152600d6020526040812090610a63600184612655565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60085481565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610aba61051f565b80519060200120610ac9611950565b30604051602001610add94939291906120a6565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610b2e9493929190612082565b60405160208183030381529060405280519060200120905060008282604051602001610b5b929190611fd1565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610b9894939291906120ca565b6020604051602081039080840390855afa158015610bba573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610bed5760405162461bcd60e51b8152600401610651906121f7565b6001600160a01b0381166000908152600f60205260408120805491610c118361267a565b919050558914610c335760405162461bcd60e51b8152600401610651906123bd565b87421115610c535760405162461bcd60e51b81526004016106519061223c565b610c5d818b6118bb565b505050505b505050505050565b60045460ff1681565b610c7b6111ca565b6000546001600160a01b03908116911614610ca85760405162461bcd60e51b81526004016106519061233f565b600b54600160a01b900460ff1615610cd25760405162461bcd60e51b815260040161065190612487565b600a546040805163c45a015560e01b815290516000926001600160a01b03169163c45a0155916004808301926020929190829003018186803b158015610d1757600080fd5b505afa158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f9190611e30565b9050806001600160a01b031663e6a4390530600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610daf57600080fd5b505afa158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190611e30565b6040518363ffffffff1660e01b8152600401610e04929190612000565b60206040518083038186803b158015610e1c57600080fd5b505afa158015610e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e549190611e30565b600b80546001600160a01b0319166001600160a01b03928316179081905516610f9d57806001600160a01b031663c9c6539630600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed557600080fd5b505afa158015610ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0d9190611e30565b6040518363ffffffff1660e01b8152600401610f2a929190612000565b602060405180830381600087803b158015610f4457600080fd5b505af1158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190611e30565b600b80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b031663f305d7194730610fb981610703565b600080610fc46109d4565b426040518863ffffffff1660e01b8152600401610fe696959493929190612033565b6060604051808303818588803b158015610fff57600080fd5b505af1158015611013573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110389190611fa4565b5050600b54600a5460405163095ea7b360e01b81526001600160a01b03928316935063095ea7b3926110729216906000199060040161201a565b602060405180830381600087803b15801561108c57600080fd5b505af11580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190611f84565b5050600b805460ff60a01b1960ff60b01b19909116600160b01b1716600160a01b179055565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600d6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b61116e6111ca565b6000546001600160a01b0390811691161461119b5760405162461bcd60e51b81526004016106519061233f565b6001600160a01b0381166111c15760405162461bcd60e51b815260040161065190612281565b6106e881611954565b3390565b6001600160a01b0383166111f45760405162461bcd60e51b815260040161065190612443565b6001600160a01b03821661121a5760405162461bcd60e51b81526004016106519061217e565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611275908590612079565b60405180910390a3505050565b6001600160a01b0383166112a85760405162461bcd60e51b8152600401610651906123fe565b6001600160a01b0382166112ce5760405162461bcd60e51b81526004016106519061213b565b600081116112ee5760405162461bcd60e51b815260040161065190612374565b60006112f86109d4565b6001600160a01b0316846001600160a01b031614158015611332575061131c6109d4565b6001600160a01b0316836001600160a01b031614155b1561148457600b546001600160a01b0385811691161480156113625750600a546001600160a01b03848116911614155b801561138757506001600160a01b03831660009081526003602052604090205460ff16155b156113af576113ac60646113a6600554856119a490919063ffffffff16565b906119e9565b90505b600b546001600160a01b0384811691161480156113d557506001600160a01b0384163014155b156113f7576113f460646113a6600654856119a490919063ffffffff16565b90505b600061140230610703565b600b54909150600160a81b900460ff1615801561142c5750600b546001600160a01b038581169116145b80156114415750600b54600160b01b900460ff165b801561144e575060085481115b156114825761147061146b8461146684600954611a2b565b611a2b565b6116b7565b478015611480576114804761187d565b505b505b80156114fc57306000908152600160205260409020546114a49082611a40565b30600081815260016020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114f3908590612079565b60405180910390a35b6001600160a01b03841660009081526001602052604090205461151f9083611a6f565b6001600160a01b0385166000908152600160205260409020556115646115458383611a6f565b6001600160a01b03851660009081526001602052604090205490611a40565b6001600160a01b0380851660008181526001602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6115ae8585611a6f565b6040516115bb9190612079565b60405180910390a350505050565b600081848411156115ed5760405162461bcd60e51b815260040161065191906120e8565b5060006115fa848661263e565b95945050505050565b6001600160a01b0382166116295760405162461bcd60e51b8152600401610651906124be565b6007546116369082611a40565b6007556001600160a01b03821660009081526001602052604090205461165c9082611a40565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116ab908590612079565b60405180910390a35050565b600b805460ff60a81b1916600160a81b179055806116d45761186d565b600b54600160a01b900460ff166116ea5761186d565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061172d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190611e30565b816001815181106117da57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600a5461180091309116846111ce565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac947906118399085906000908690309042906004016124f5565b600060405180830381600087803b15801561185357600080fd5b505af1158015611867573d6000803e3d6000fd5b50505050505b50600b805460ff60a81b19169055565b6004546040516101009091046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015610664573d6000803e3d6000fd5b6001600160a01b038083166000908152600c6020526040812054909116906118e284610703565b6001600160a01b038581166000818152600c602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461194a828483611ab1565b50505050565b4690565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826119b35750600061055a565b60006119bf838561261f565b9050826119cc85836125e8565b14610a825760405162461bcd60e51b8152600401610651906122fe565b6000610a8283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c15565b6000818311611a3a5782610a82565b50919050565b600080611a4d83856125a8565b905083811015610a825760405162461bcd60e51b8152600401610651906121c0565b6000610a8283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115c9565b816001600160a01b0316836001600160a01b031614158015611ad35750600081115b15611c10576001600160a01b03831615611b76576001600160a01b0383166000908152600e602052604081205463ffffffff169081611b13576000611b56565b6001600160a01b0385166000908152600d6020526040812090611b37600185612655565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611b64848361263e565b9050611b7286848484611c43565b5050505b6001600160a01b03821615611c10576001600160a01b0382166000908152600e602052604081205463ffffffff169081611bb1576000611bf4565b6001600160a01b0384166000908152600d6020526040812090611bd5600185612655565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611c0284836125a8565b9050610c6285848484611c43565b505050565b60008183611c365760405162461bcd60e51b815260040161065191906120e8565b5060006115fa84866125e8565b6000611c67436040518060600160405280603381526020016126ff60339139611de4565b905060008463ffffffff16118015611cc157506001600160a01b0385166000908152600d6020526040812063ffffffff831691611ca5600188612655565b63ffffffff908116825260208201929092526040016000205416145b15611d0a576001600160a01b0385166000908152600d602052604081208391611ceb600188612655565b63ffffffff168152602081019190915260400160002060010155611d9a565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600d83528581208a851682529092529390209151825463ffffffff191691161781559051600191820155611d699085906125c0565b6001600160a01b0386166000908152600e60205260409020805463ffffffff191663ffffffff929092169190911790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611dd5929190612565565b60405180910390a25050505050565b6000816401000000008410611e0c5760405162461bcd60e51b815260040161065191906120e8565b509192915050565b600060208284031215611e25578081fd5b8135610a82816126c1565b600060208284031215611e41578081fd5b8151610a82816126c1565b60008060408385031215611e5e578081fd5b8235611e69816126c1565b91506020830135611e79816126c1565b809150509250929050565b600080600060608486031215611e98578081fd5b8335611ea3816126c1565b92506020840135611eb3816126c1565b929592945050506040919091013590565b60008060408385031215611ed6578182fd5b8235611ee1816126c1565b946020939093013593505050565b60008060008060008060c08789031215611f07578182fd5b8635611f12816126c1565b95506020870135945060408701359350606087013560ff81168114611f35578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611f61578182fd5b8235611f6c816126c1565b9150602083013563ffffffff81168114611e79578182fd5b600060208284031215611f95578081fd5b81518015158114610a82578182fd5b600080600060608486031215611fb8578283fd5b8351925060208401519150604084015190509250925092565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015612114578581018301518582016040015282016120f8565b818111156121255783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526025908201527f6375623a3a64656c656761746542795369673a20696e76616c6964207369676e604082015264617475726560d81b606082015260800190565b60208082526025908201527f6375623a3a64656c656761746542795369673a207369676e61747572652065786040820152641c1a5c995960da1b606082015260800190565b6020808252601d908201527f63616e6e6f7420736574206f776e657220746f20302061646472657373000000604082015260600190565b60208082526026908201527f6375623a3a6765745072696f72566f7465733a206e6f742079657420646574656040820152651c9b5a5b995960d21b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b60208082526021908201527f6375623a3a64656c656761746542795369673a20696e76616c6964206e6f6e636040820152606560f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526017908201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156125445784516001600160a01b03168352938301939183019160010161251f565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b600082198211156125bb576125bb612695565b500190565b600063ffffffff8083168185168083038211156125df576125df612695565b01949350505050565b6000826125f7576125f76126ab565b500490565b600063ffffffff80841680612613576126136126ab565b92169190910492915050565b600081600019048311821515161561263957612639612695565b500290565b60008282101561265057612650612695565b500390565b600063ffffffff8381169083168181101561267257612672612695565b039392505050565b600060001982141561268e5761268e612695565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b03811681146106e857600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63656375623a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212203fd45183a1bd80241bc5ca8d3e1a148d46ab51aef8808428a0cf74474df5ba8264736f6c634300080000330000000000000000000000006391c46ac4d308adce3aa49ce18488f25b176378
Deployed ByteCode
0x6080604052600436106101bb5760003560e01c8063782d6fe1116100ec578063c3cda5201161008a578063dd62ed3e11610064578063dd62ed3e1461049c578063e7a324dc146104bc578063f1127ed8146104d1578063f2fde38b146104ff576101c2565b8063c3cda52014610452578063c876d0b914610472578063c9567bf914610487576101c2565b806395d89b41116100c657806395d89b41146103e8578063a9059cbb146103fd578063b4b5ea571461041d578063bf474bed1461043d576101c2565b8063782d6fe1146103935780637ecebe00146103b35780638da5cb5b146103d3576101c2565b806340c10f19116101595780635c19a95c116101335780635c19a95c146103115780636fcfff451461033157806370a082311461035e578063715018a61461037e576101c2565b806340c10f19146102ad57806351bc3c85146102cf578063587cde1e146102e4576101c2565b806318160ddd1161019557806318160ddd1461024157806320606b701461025657806323b872dd1461026b578063313ce5671461028b576101c2565b806306fdde03146101c7578063095ea7b3146101f25780630faee56f1461021f576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101dc61051f565b6040516101e991906120e8565b60405180910390f35b3480156101fe57600080fd5b5061021261020d366004611ec4565b610542565b6040516101e9919061206e565b34801561022b57600080fd5b50610234610560565b6040516101e99190612079565b34801561024d57600080fd5b50610234610566565b34801561026257600080fd5b5061023461056c565b34801561027757600080fd5b50610212610286366004611e84565b610590565b34801561029757600080fd5b506102a0610617565b6040516101e9919061259a565b3480156102b957600080fd5b506102cd6102c8366004611ec4565b61061c565b005b3480156102db57600080fd5b506102cd610668565b3480156102f057600080fd5b506103046102ff366004611e14565b6106c0565b6040516101e99190611fec565b34801561031d57600080fd5b506102cd61032c366004611e14565b6106de565b34801561033d57600080fd5b5061035161034c366004611e14565b6106eb565b6040516101e99190612573565b34801561036a57600080fd5b50610234610379366004611e14565b610703565b34801561038a57600080fd5b506102cd61071e565b34801561039f57600080fd5b506102346103ae366004611ec4565b61079d565b3480156103bf57600080fd5b506102346103ce366004611e14565b6109c2565b3480156103df57600080fd5b506103046109d4565b3480156103f457600080fd5b506101dc6109e3565b34801561040957600080fd5b50610212610418366004611ec4565b610a00565b34801561042957600080fd5b50610234610438366004611e14565b610a14565b34801561044957600080fd5b50610234610a89565b34801561045e57600080fd5b506102cd61046d366004611eef565b610a8f565b34801561047e57600080fd5b50610212610c6a565b34801561049357600080fd5b506102cd610c73565b3480156104a857600080fd5b506102346104b7366004611e4c565b6110ea565b3480156104c857600080fd5b50610234611115565b3480156104dd57600080fd5b506104f16104ec366004611f4f565b611139565b6040516101e9929190612584565b34801561050b57600080fd5b506102cd61051a366004611e14565b611166565b60408051808201909152600981526805461696b6f537761760bc1b602082015290565b600061055661054f6111ca565b84846111ce565b5060015b92915050565b60095481565b60075490565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061059d848484611282565b61060d846105a96111ca565b610608856040518060600160405280602881526020016126d7602891396001600160a01b038a166000908152600260205260408120906105e76111ca565b6001600160a01b0316815260208101919091526040016000205491906115c9565b6111ce565b5060019392505050565b601290565b6106246111ca565b6000546001600160a01b0390811691161461065a5760405162461bcd60e51b81526004016106519061233f565b60405180910390fd5b6106648282611603565b5050565b60045461010090046001600160a01b03166106816111ca565b6001600160a01b03161461069457600080fd5b600061069f30610703565b905080156106b0576106b0816116b7565b478015610664576106648161187d565b6001600160a01b039081166000908152600c60205260409020541690565b6106e833826118bb565b50565b600e6020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526001602052604090205490565b6107266111ca565b6000546001600160a01b039081169116146107535760405162461bcd60e51b81526004016106519061233f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60004382106107be5760405162461bcd60e51b8152600401610651906122b8565b6001600160a01b0383166000908152600e602052604090205463ffffffff16806107ec57600091505061055a565b6001600160a01b0384166000908152600d602052604081208491610811600185612655565b63ffffffff9081168252602082019290925260400160002054161161087a576001600160a01b0384166000908152600d6020526040812090610854600184612655565b63ffffffff1663ffffffff1681526020019081526020016000206001015491505061055a565b6001600160a01b0384166000908152600d6020908152604080832083805290915290205463ffffffff168310156108b557600091505061055a565b6000806108c3600184612655565b90505b8163ffffffff168163ffffffff16111561098b57600060026108e88484612655565b6108f291906125fc565b6108fc9083612655565b6001600160a01b0388166000908152600d6020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141561095f5760200151945061055a9350505050565b805163ffffffff1687111561097657819350610984565b610981600183612655565b92505b50506108c6565b506001600160a01b0385166000908152600d6020908152604080832063ffffffff9094168352929052206001015491505092915050565b600f6020526000908152604090205481565b6000546001600160a01b031690565b604080518082019091526003815262544b5360e81b602082015290565b6000610556610a0d6111ca565b8484611282565b6001600160a01b0381166000908152600e602052604081205463ffffffff1680610a3f576000610a82565b6001600160a01b0383166000908152600d6020526040812090610a63600184612655565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60085481565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610aba61051f565b80519060200120610ac9611950565b30604051602001610add94939291906120a6565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf888888604051602001610b2e9493929190612082565b60405160208183030381529060405280519060200120905060008282604051602001610b5b929190611fd1565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610b9894939291906120ca565b6020604051602081039080840390855afa158015610bba573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610bed5760405162461bcd60e51b8152600401610651906121f7565b6001600160a01b0381166000908152600f60205260408120805491610c118361267a565b919050558914610c335760405162461bcd60e51b8152600401610651906123bd565b87421115610c535760405162461bcd60e51b81526004016106519061223c565b610c5d818b6118bb565b505050505b505050505050565b60045460ff1681565b610c7b6111ca565b6000546001600160a01b03908116911614610ca85760405162461bcd60e51b81526004016106519061233f565b600b54600160a01b900460ff1615610cd25760405162461bcd60e51b815260040161065190612487565b600a546040805163c45a015560e01b815290516000926001600160a01b03169163c45a0155916004808301926020929190829003018186803b158015610d1757600080fd5b505afa158015610d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4f9190611e30565b9050806001600160a01b031663e6a4390530600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610daf57600080fd5b505afa158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190611e30565b6040518363ffffffff1660e01b8152600401610e04929190612000565b60206040518083038186803b158015610e1c57600080fd5b505afa158015610e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e549190611e30565b600b80546001600160a01b0319166001600160a01b03928316179081905516610f9d57806001600160a01b031663c9c6539630600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed557600080fd5b505afa158015610ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0d9190611e30565b6040518363ffffffff1660e01b8152600401610f2a929190612000565b602060405180830381600087803b158015610f4457600080fd5b505af1158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190611e30565b600b80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b031663f305d7194730610fb981610703565b600080610fc46109d4565b426040518863ffffffff1660e01b8152600401610fe696959493929190612033565b6060604051808303818588803b158015610fff57600080fd5b505af1158015611013573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110389190611fa4565b5050600b54600a5460405163095ea7b360e01b81526001600160a01b03928316935063095ea7b3926110729216906000199060040161201a565b602060405180830381600087803b15801561108c57600080fd5b505af11580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190611f84565b5050600b805460ff60a01b1960ff60b01b19909116600160b01b1716600160a01b179055565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b600d6020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b61116e6111ca565b6000546001600160a01b0390811691161461119b5760405162461bcd60e51b81526004016106519061233f565b6001600160a01b0381166111c15760405162461bcd60e51b815260040161065190612281565b6106e881611954565b3390565b6001600160a01b0383166111f45760405162461bcd60e51b815260040161065190612443565b6001600160a01b03821661121a5760405162461bcd60e51b81526004016106519061217e565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611275908590612079565b60405180910390a3505050565b6001600160a01b0383166112a85760405162461bcd60e51b8152600401610651906123fe565b6001600160a01b0382166112ce5760405162461bcd60e51b81526004016106519061213b565b600081116112ee5760405162461bcd60e51b815260040161065190612374565b60006112f86109d4565b6001600160a01b0316846001600160a01b031614158015611332575061131c6109d4565b6001600160a01b0316836001600160a01b031614155b1561148457600b546001600160a01b0385811691161480156113625750600a546001600160a01b03848116911614155b801561138757506001600160a01b03831660009081526003602052604090205460ff16155b156113af576113ac60646113a6600554856119a490919063ffffffff16565b906119e9565b90505b600b546001600160a01b0384811691161480156113d557506001600160a01b0384163014155b156113f7576113f460646113a6600654856119a490919063ffffffff16565b90505b600061140230610703565b600b54909150600160a81b900460ff1615801561142c5750600b546001600160a01b038581169116145b80156114415750600b54600160b01b900460ff165b801561144e575060085481115b156114825761147061146b8461146684600954611a2b565b611a2b565b6116b7565b478015611480576114804761187d565b505b505b80156114fc57306000908152600160205260409020546114a49082611a40565b30600081815260016020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906114f3908590612079565b60405180910390a35b6001600160a01b03841660009081526001602052604090205461151f9083611a6f565b6001600160a01b0385166000908152600160205260409020556115646115458383611a6f565b6001600160a01b03851660009081526001602052604090205490611a40565b6001600160a01b0380851660008181526001602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6115ae8585611a6f565b6040516115bb9190612079565b60405180910390a350505050565b600081848411156115ed5760405162461bcd60e51b815260040161065191906120e8565b5060006115fa848661263e565b95945050505050565b6001600160a01b0382166116295760405162461bcd60e51b8152600401610651906124be565b6007546116369082611a40565b6007556001600160a01b03821660009081526001602052604090205461165c9082611a40565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116ab908590612079565b60405180910390a35050565b600b805460ff60a81b1916600160a81b179055806116d45761186d565b600b54600160a01b900460ff166116ea5761186d565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061172d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190611e30565b816001815181106117da57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600a5461180091309116846111ce565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac947906118399085906000908690309042906004016124f5565b600060405180830381600087803b15801561185357600080fd5b505af1158015611867573d6000803e3d6000fd5b50505050505b50600b805460ff60a81b19169055565b6004546040516101009091046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015610664573d6000803e3d6000fd5b6001600160a01b038083166000908152600c6020526040812054909116906118e284610703565b6001600160a01b038581166000818152600c602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461194a828483611ab1565b50505050565b4690565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826119b35750600061055a565b60006119bf838561261f565b9050826119cc85836125e8565b14610a825760405162461bcd60e51b8152600401610651906122fe565b6000610a8283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611c15565b6000818311611a3a5782610a82565b50919050565b600080611a4d83856125a8565b905083811015610a825760405162461bcd60e51b8152600401610651906121c0565b6000610a8283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115c9565b816001600160a01b0316836001600160a01b031614158015611ad35750600081115b15611c10576001600160a01b03831615611b76576001600160a01b0383166000908152600e602052604081205463ffffffff169081611b13576000611b56565b6001600160a01b0385166000908152600d6020526040812090611b37600185612655565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611b64848361263e565b9050611b7286848484611c43565b5050505b6001600160a01b03821615611c10576001600160a01b0382166000908152600e602052604081205463ffffffff169081611bb1576000611bf4565b6001600160a01b0384166000908152600d6020526040812090611bd5600185612655565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000611c0284836125a8565b9050610c6285848484611c43565b505050565b60008183611c365760405162461bcd60e51b815260040161065191906120e8565b5060006115fa84866125e8565b6000611c67436040518060600160405280603381526020016126ff60339139611de4565b905060008463ffffffff16118015611cc157506001600160a01b0385166000908152600d6020526040812063ffffffff831691611ca5600188612655565b63ffffffff908116825260208201929092526040016000205416145b15611d0a576001600160a01b0385166000908152600d602052604081208391611ceb600188612655565b63ffffffff168152602081019190915260400160002060010155611d9a565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600d83528581208a851682529092529390209151825463ffffffff191691161781559051600191820155611d699085906125c0565b6001600160a01b0386166000908152600e60205260409020805463ffffffff191663ffffffff929092169190911790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248484604051611dd5929190612565565b60405180910390a25050505050565b6000816401000000008410611e0c5760405162461bcd60e51b815260040161065191906120e8565b509192915050565b600060208284031215611e25578081fd5b8135610a82816126c1565b600060208284031215611e41578081fd5b8151610a82816126c1565b60008060408385031215611e5e578081fd5b8235611e69816126c1565b91506020830135611e79816126c1565b809150509250929050565b600080600060608486031215611e98578081fd5b8335611ea3816126c1565b92506020840135611eb3816126c1565b929592945050506040919091013590565b60008060408385031215611ed6578182fd5b8235611ee1816126c1565b946020939093013593505050565b60008060008060008060c08789031215611f07578182fd5b8635611f12816126c1565b95506020870135945060408701359350606087013560ff81168114611f35578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611f61578182fd5b8235611f6c816126c1565b9150602083013563ffffffff81168114611e79578182fd5b600060208284031215611f95578081fd5b81518015158114610a82578182fd5b600080600060608486031215611fb8578283fd5b8351925060208401519150604084015190509250925092565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b6000602080835283518082850152825b81811015612114578581018301518582016040015282016120f8565b818111156121255783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526025908201527f6375623a3a64656c656761746542795369673a20696e76616c6964207369676e604082015264617475726560d81b606082015260800190565b60208082526025908201527f6375623a3a64656c656761746542795369673a207369676e61747572652065786040820152641c1a5c995960da1b606082015260800190565b6020808252601d908201527f63616e6e6f7420736574206f776e657220746f20302061646472657373000000604082015260600190565b60208082526026908201527f6375623a3a6765745072696f72566f7465733a206e6f742079657420646574656040820152651c9b5a5b995960d21b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b60208082526021908201527f6375623a3a64656c656761746542795369673a20696e76616c6964206e6f6e636040820152606560f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526017908201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156125445784516001600160a01b03168352938301939183019160010161251f565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b600082198211156125bb576125bb612695565b500190565b600063ffffffff8083168185168083038211156125df576125df612695565b01949350505050565b6000826125f7576125f76126ab565b500490565b600063ffffffff80841680612613576126136126ab565b92169190910492915050565b600081600019048311821515161561263957612639612695565b500290565b60008282101561265057612650612695565b500390565b600063ffffffff8381169083168181101561267257612672612695565b039392505050565b600060001982141561268e5761268e612695565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b03811681146106e857600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63656375623a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a26469706673582212203fd45183a1bd80241bc5ca8d3e1a148d46ab51aef8808428a0cf74474df5ba8264736f6c63430008000033