false
true
0

Contract Address Details

0x0beBE618cd4971b33bcFfCA42F339cBd56270f29

Token
Tosa Inu (TOSA)
Creator
0x801123–b0d182 at 0x5cc048–e86b55
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
131 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26480841
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
TOSA




Optimization enabled
true
Compiler version
v0.8.10+commit.fc410830




Optimization runs
200
EVM Version
london




Verified at
2026-05-08T17:46:57.997615Z

Constructor Arguments

0000000000000000000000005a978c79830e886a995d43df90eacda50baf5043000000000000000000000000b37e2b46874338910b90db13f936a6bd021d9920

Arg [0] (address) : 0x5a978c79830e886a995d43df90eacda50baf5043
Arg [1] (address) : 0xb37e2b46874338910b90db13f936a6bd021d9920

              

TOSA.sol

/**

https://t.me/TosaInuEntry

https://Tosa.cc
                                                        
* TOKENOMICS
 * 1,000,000,000,000 token supply
 * FIRST TWO MINUTES: 5,000,000,000 max buy / 30-second buy cooldown (these limitations are lifted automatically two minutes post-launch)
 * 15-second cooldown to sell after a buy
 * 12% tax on buys and sells
 * 25% fee on sells within first (1) hour post-launch
 * Max wallet of 3% of total supply for first (1) hour post-launch
 * No team tokens, no presale

SPDX-License-Identifier: UNLICENSED 
*/
pragma solidity ^0.8.10;

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);
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    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);
    }
}  

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external 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 TOSA is Context, IERC20, Ownable { ////
    mapping (address => uint) private _owned;
    mapping (address => mapping (address => uint)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => User) private cooldown;
    uint private constant _totalSupply = 1e12 * 10**9;

    string public constant name = unicode"Tosa Inu"; ////
    string public constant symbol = unicode"TOSA"; ////
    uint8 public constant decimals = 9;

    IUniswapV2Router02 private uniswapV2Router;

    address payable public _FeeAddress1;
    address payable public _FeeAddress2;
    address public uniswapV2Pair;
    uint public _buyFee = 12;
    uint public _sellFee = 12;
    uint public _feeRate = 9;
    uint public _maxBuyAmount;
    uint public _maxHeldTokens;
    uint public _launchedAt;
    bool private _tradingOpen;
    bool private _inSwap;
    bool public _useImpactFeeSetter = true;

    struct User {
        uint buy;
        bool exists;
    }

    event FeeMultiplierUpdated(uint _multiplier);
    event ImpactFeeSetterUpdated(bool _usefeesetter);
    event FeeRateUpdated(uint _rate);
    event FeesUpdated(uint _buy, uint _sell);
    event FeeAddress1Updated(address _feewallet1);
    event FeeAddress2Updated(address _feewallet2);
    
    modifier lockTheSwap {
        _inSwap = true;
        _;
        _inSwap = false;
    }
    constructor (address payable FeeAddress1, address payable FeeAddress2) {
        _FeeAddress1 = FeeAddress1;
        _FeeAddress2 = FeeAddress2;
        _owned[address(this)] = _totalSupply;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[FeeAddress1] = true;
        _isExcludedFromFee[FeeAddress2] = true;
        emit Transfer(address(0), address(this), _totalSupply);
    }

    function balanceOf(address account) public view override returns (uint) {
        return _owned[account];
    }
    function transfer(address recipient, uint amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    
    function totalSupply() public pure override returns (uint) {
        return _totalSupply;
    }

    function allowance(address owner, address spender) public view override returns (uint) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint amount) public override returns (bool) {
        if(_tradingOpen && !_isExcludedFromFee[recipient] && sender == uniswapV2Pair){
            require (recipient == tx.origin, "pls no bot");
        }
        _transfer(sender, recipient, amount);
        uint allowedAmount = _allowances[sender][_msgSender()] - amount;
        _approve(sender, _msgSender(), allowedAmount);
        return true;
    }

    function _approve(address owner, address spender, uint 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, uint 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");
        bool isBuy = false;
        if(from != owner() && to != owner()) {
            // buy
            if(from == uniswapV2Pair && to != address(uniswapV2Router) && !_isExcludedFromFee[to]) {
                require(_tradingOpen, "Trading not yet enabled.");
                require(block.timestamp != _launchedAt, "pls no snip");
                if((_launchedAt + (1 hours)) > block.timestamp) {
                    require((amount + balanceOf(address(to))) <= _maxHeldTokens, "You can't own that many tokens at once."); // 5%
                }
                if(!cooldown[to].exists) {
                    cooldown[to] = User(0,true);
                }
                if((_launchedAt + (120 seconds)) > block.timestamp) {
                    require(amount <= _maxBuyAmount, "Exceeds maximum buy amount.");
                    require(cooldown[to].buy < block.timestamp + (30 seconds), "Your buy cooldown has not expired.");
                }
                cooldown[to].buy = block.timestamp;
                isBuy = true;
            }
            // sell
            if(!_inSwap && _tradingOpen && from != uniswapV2Pair) {
                require(cooldown[from].buy < block.timestamp + (15 seconds), "Your sell cooldown has not expired.");
                uint contractTokenBalance = balanceOf(address(this));
                if(contractTokenBalance > 0) {
                    if(_useImpactFeeSetter) {
                        if(contractTokenBalance > (balanceOf(uniswapV2Pair) * _feeRate) / 100) {
                            contractTokenBalance = (balanceOf(uniswapV2Pair) * _feeRate) / 100;
                        }
                    }
                    swapTokensForEth(contractTokenBalance);
                }
                uint contractETHBalance = address(this).balance;
                if(contractETHBalance > 0) {
                    sendETHToFee(address(this).balance);
                }
                isBuy = false;
            }
        }
        bool takeFee = true;
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        _tokenTransfer(from,to,amount,takeFee,isBuy);
    }

    function swapTokensForEth(uint tokenAmount) private lockTheSwap {
        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(uint amount) private {
        _FeeAddress1.transfer(amount / 2);
        _FeeAddress2.transfer(amount / 2);
    }
    
    function _tokenTransfer(address sender, address recipient, uint amount, bool takefee, bool buy) private {
        (uint fee) = _getFee(takefee, buy);
        _transferStandard(sender, recipient, amount, fee);
    }

    function _getFee(bool takefee, bool buy) private view returns (uint) {
        uint fee = 0;
        if(takefee) {
            if(buy) {
                fee = _buyFee;
            } else {
                fee = _sellFee;
                if(block.timestamp < _launchedAt + (1 hours)) {
                    fee += 13;
                }
            }
        }
        return fee;
    }

    function _transferStandard(address sender, address recipient, uint amount, uint fee) private {
        (uint transferAmount, uint team) = _getValues(amount, fee);
        _owned[sender] = _owned[sender] - amount;
        _owned[recipient] = _owned[recipient] + transferAmount; 
        _takeTeam(team);
        emit Transfer(sender, recipient, transferAmount);
    }

    function _getValues(uint amount, uint teamFee) private pure returns (uint, uint) {
        uint team = (amount * teamFee) / 100;
        uint transferAmount = amount - team;
        return (transferAmount, team);
    }

    function _takeTeam(uint team) private {
        _owned[address(this)] = _owned[address(this)] + team;
    }

    receive() external payable {}
    
    // external functions
    function addLiquidity() external onlyOwner() {
        require(!_tradingOpen, "Trading is already open");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        _approve(address(this), address(uniswapV2Router), _totalSupply);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.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);
    }

    function openTrading() external onlyOwner() {
        require(!_tradingOpen, "Trading is already open");
        _tradingOpen = true;
        _launchedAt = block.timestamp;
        _maxBuyAmount = 5000000001 * 10**9; // .5%
        _maxHeldTokens = 30000000000 * 10**9; // 3%
    }

    function manualswap() external {
        require(_msgSender() == _FeeAddress1);
        uint contractBalance = balanceOf(address(this));
        swapTokensForEth(contractBalance);
    }
    
    function manualsend() external {
        require(_msgSender() == _FeeAddress1);
        uint contractETHBalance = address(this).balance;
        sendETHToFee(contractETHBalance);
    }

    function setFeeRate(uint rate) external {
        require(_msgSender() == _FeeAddress1);
        require(rate > 0, "Rate can't be zero");
        // 100% is the common fee rate
        _feeRate = rate;
        emit FeeRateUpdated(_feeRate);
    }

    function setFees(uint buy, uint sell) external {
        require(_msgSender() == _FeeAddress1);
        _buyFee = buy;
        _sellFee = sell;
        emit FeesUpdated(_buyFee, _sellFee);
    }

    function toggleImpactFee(bool onoff) external {
        require(_msgSender() == _FeeAddress1);
        _useImpactFeeSetter = onoff;
        emit ImpactFeeSetterUpdated(_useImpactFeeSetter);
    }

    function updateFeeAddress1(address newAddress) external {
        require(_msgSender() == _FeeAddress1);
        _FeeAddress1 = payable(newAddress);
        emit FeeAddress1Updated(_FeeAddress1);
    }

    function updateFeeAddress2(address newAddress) external {
        require(_msgSender() == _FeeAddress2);
        _FeeAddress2 = payable(newAddress);
        emit FeeAddress2Updated(_FeeAddress2);
    }

    // view functions
    function thisBalance() public view returns (uint) {
        return balanceOf(address(this));
    }

    function amountInPool() public view returns (uint) {
        return balanceOf(uniswapV2Pair);
    }
}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"london","compilationTarget":{"TOSA.sol":"TOSA"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"FeeAddress1","internalType":"address payable"},{"type":"address","name":"FeeAddress2","internalType":"address payable"}]},{"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":"FeeAddress1Updated","inputs":[{"type":"address","name":"_feewallet1","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"FeeAddress2Updated","inputs":[{"type":"address","name":"_feewallet2","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"FeeMultiplierUpdated","inputs":[{"type":"uint256","name":"_multiplier","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeeRateUpdated","inputs":[{"type":"uint256","name":"_rate","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeesUpdated","inputs":[{"type":"uint256","name":"_buy","internalType":"uint256","indexed":false},{"type":"uint256","name":"_sell","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ImpactFeeSetterUpdated","inputs":[{"type":"bool","name":"_usefeesetter","internalType":"bool","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":"address","name":"","internalType":"address payable"}],"name":"_FeeAddress1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"_FeeAddress2","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_buyFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_feeRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_launchedAt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxBuyAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxHeldTokens","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_sellFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_useImpactFeeSetter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addLiquidity","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":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"amountInPool","inputs":[]},{"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":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualsend","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualswap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"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":"nonpayable","outputs":[],"name":"setFeeRate","inputs":[{"type":"uint256","name":"rate","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"buy","internalType":"uint256"},{"type":"uint256","name":"sell","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"thisBalance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"toggleImpactFee","inputs":[{"type":"bool","name":"onoff","internalType":"bool"}]},{"type":"function","stateMutability":"pure","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":"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":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniswapV2Pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateFeeAddress1","inputs":[{"type":"address","name":"newAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateFeeAddress2","inputs":[{"type":"address","name":"newAddress","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

Verify & Publish
0x6080604052600c600a819055600b819055600990556010805462ff00001916620100001790553480156200003257600080fd5b5060405162001e6738038062001e67833981016040819052620000559162000184565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600780546001600160a01b038481166001600160a01b0319928316811790935560088054858316931683179055306000818152600260209081526040808320683635c9adc5dea00000908190558354909516835260048252808320805460ff1990811660019081179092558585528285208054821683179055978452818420805489168217905595835280832080549097169095179095559251918252927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050620001bc565b80516001600160a01b03811681146200017f57600080fd5b919050565b600080604083850312156200019857600080fd5b620001a38362000167565b9150620001b36020840162000167565b90509250929050565b611c9b80620001cc6000396000f3fe6080604052600436106101e75760003560e01c80635090161711610102578063a9059cbb11610095578063db92dbb611610064578063db92dbb61461056f578063dcb0e0ad14610584578063dd62ed3e146105a4578063e8078d94146105ea57600080fd5b8063a9059cbb1461050f578063b2131f7d1461052f578063c3c8cd8014610545578063c9567bf91461055a57600080fd5b8063715018a6116100d1578063715018a61461048c5780638da5cb5b146104a157806394b8d8f2146104bf57806395d89b41146104df57600080fd5b80635090161714610421578063590f897e146104415780636fc3eaec1461045757806370a082311461046c57600080fd5b806327f3a72a1161017a5780633bed4355116101495780633bed4355146103ab57806340b9a54b146103cb57806345596e2e146103e157806349bd5a5e1461040157600080fd5b806327f3a72a14610321578063313ce5671461033657806332d873d81461035d578063367c55441461037357600080fd5b80630b78f9c0116101b65780630b78f9c0146102af57806318160ddd146102cf5780631940d020146102eb57806323b872dd1461030157600080fd5b80630492f055146101f357806306fdde031461021c5780630802d2f61461025d578063095ea7b31461027f57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b50610209600d5481565b6040519081526020015b60405180910390f35b34801561022857600080fd5b5061025060405180604001604052806008815260200167546f736120496e7560c01b81525081565b6040516102139190611928565b34801561026957600080fd5b5061027d610278366004611992565b6105ff565b005b34801561028b57600080fd5b5061029f61029a3660046119af565b610674565b6040519015158152602001610213565b3480156102bb57600080fd5b5061027d6102ca3660046119db565b61068a565b3480156102db57600080fd5b50683635c9adc5dea00000610209565b3480156102f757600080fd5b50610209600e5481565b34801561030d57600080fd5b5061029f61031c3660046119fd565b6106f1565b34801561032d57600080fd5b506102096107d9565b34801561034257600080fd5b5061034b600981565b60405160ff9091168152602001610213565b34801561036957600080fd5b50610209600f5481565b34801561037f57600080fd5b50600854610393906001600160a01b031681565b6040516001600160a01b039091168152602001610213565b3480156103b757600080fd5b50600754610393906001600160a01b031681565b3480156103d757600080fd5b50610209600a5481565b3480156103ed57600080fd5b5061027d6103fc366004611a3e565b6107e9565b34801561040d57600080fd5b50600954610393906001600160a01b031681565b34801561042d57600080fd5b5061027d61043c366004611992565b610883565b34801561044d57600080fd5b50610209600b5481565b34801561046357600080fd5b5061027d6108f1565b34801561047857600080fd5b50610209610487366004611992565b61091e565b34801561049857600080fd5b5061027d610939565b3480156104ad57600080fd5b506000546001600160a01b0316610393565b3480156104cb57600080fd5b5060105461029f9062010000900460ff1681565b3480156104eb57600080fd5b5061025060405180604001604052806004815260200163544f534160e01b81525081565b34801561051b57600080fd5b5061029f61052a3660046119af565b6109ad565b34801561053b57600080fd5b50610209600c5481565b34801561055157600080fd5b5061027d6109ba565b34801561056657600080fd5b5061027d6109f0565b34801561057b57600080fd5b50610209610a93565b34801561059057600080fd5b5061027d61059f366004611a65565b610aab565b3480156105b057600080fd5b506102096105bf366004611a82565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156105f657600080fd5b5061027d610b1e565b6007546001600160a01b0316336001600160a01b03161461061f57600080fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f0e96f8986653644392af4a5daec8b04a389af0d497572173e63846ccd26c843c906020015b60405180910390a150565b6000610681338484610e69565b50600192915050565b6007546001600160a01b0316336001600160a01b0316146106aa57600080fd5b600a829055600b81905560408051838152602081018390527f5c6323bf1c2d7aaea2c091a4751c1c87af7f2864650c336507a77d0557af37a1910160405180910390a15050565b60105460009060ff16801561071f57506001600160a01b03831660009081526004602052604090205460ff16155b801561073857506009546001600160a01b038581169116145b15610787576001600160a01b03831632146107875760405162461bcd60e51b815260206004820152600a6024820152691c1b1cc81b9bc8189bdd60b21b60448201526064015b60405180910390fd5b610792848484610f8d565b6001600160a01b03841660009081526003602090815260408083203384529091528120546107c1908490611ad1565b90506107ce853383610e69565b506001949350505050565b60006107e43061091e565b905090565b6007546001600160a01b0316336001600160a01b03161461080957600080fd5b6000811161084e5760405162461bcd60e51b8152602060048201526012602482015271526174652063616e2774206265207a65726f60701b604482015260640161077e565b600c8190556040518181527f208f1b468d3d61f0f085e975bd9d04367c930d599642faad06695229f3eadcd890602001610669565b6008546001600160a01b0316336001600160a01b0316146108a357600080fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f96511497113ddf59712b28350d7457b9c300ab227616bd3b451745a395a5301490602001610669565b6007546001600160a01b0316336001600160a01b03161461091157600080fd5b4761091b81611587565b50565b6001600160a01b031660009081526002602052604090205490565b6000546001600160a01b031633146109635760405162461bcd60e51b815260040161077e90611ae8565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610681338484610f8d565b6007546001600160a01b0316336001600160a01b0316146109da57600080fd5b60006109e53061091e565b905061091b8161160c565b6000546001600160a01b03163314610a1a5760405162461bcd60e51b815260040161077e90611ae8565b60105460ff1615610a675760405162461bcd60e51b81526020600482015260176024820152762a3930b234b7339034b99030b63932b0b23c9037b832b760491b604482015260640161077e565b6010805460ff1916600117905542600f556745639182808eca00600d556801a055690d9db80000600e55565b6009546000906107e4906001600160a01b031661091e565b6007546001600160a01b0316336001600160a01b031614610acb57600080fd5b6010805462ff00001916620100008315158102919091179182905560405160ff9190920416151581527ff65c78d1059dbb9ec90732848bcfebbec05ac40af847d3c19adcad63379d3aeb90602001610669565b6000546001600160a01b03163314610b485760405162461bcd60e51b815260040161077e90611ae8565b60105460ff1615610b955760405162461bcd60e51b81526020600482015260176024820152762a3930b234b7339034b99030b63932b0b23c9037b832b760491b604482015260640161077e565b600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155610bd23082683635c9adc5dea00000610e69565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c349190611b1d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca59190611b1d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d169190611b1d565b600980546001600160a01b0319166001600160a01b039283161790556006541663f305d7194730610d468161091e565b600080610d5b6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610dc3573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610de89190611b3a565b505060095460065460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529116915063095ea7b3906044016020604051808303816000875af1158015610e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e659190611b68565b5050565b6001600160a01b038316610ecb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161077e565b6001600160a01b038216610f2c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161077e565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610ff15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161077e565b6001600160a01b0382166110535760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161077e565b600081116110b55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161077e565b600080546001600160a01b038581169116148015906110e257506000546001600160a01b03848116911614155b15611528576009546001600160a01b03858116911614801561111257506006546001600160a01b03848116911614155b801561113757506001600160a01b03831660009081526004602052604090205460ff16155b156113c45760105460ff1661118e5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e0000000000000000604482015260640161077e565b600f544214156111ce5760405162461bcd60e51b815260206004820152600b60248201526a0706c73206e6f20736e69760ac1b604482015260640161077e565b42600f54610e106111df9190611b85565b111561125957600e546111f18461091e565b6111fb9084611b85565b11156112595760405162461bcd60e51b815260206004820152602760248201527f596f752063616e2774206f776e2074686174206d616e7920746f6b656e7320616044820152663a1037b731b29760c91b606482015260840161077e565b6001600160a01b03831660009081526005602052604090206001015460ff166112c1576040805180820182526000808252600160208084018281526001600160a01b03891684526005909152939091209151825591519101805460ff19169115159190911790555b42600f5460786112d19190611b85565b11156113a557600d548211156113295760405162461bcd60e51b815260206004820152601b60248201527f45786365656473206d6178696d756d2062757920616d6f756e742e0000000000604482015260640161077e565b61133442601e611b85565b6001600160a01b038416600090815260056020526040902054106113a55760405162461bcd60e51b815260206004820152602260248201527f596f75722062757920636f6f6c646f776e20686173206e6f7420657870697265604482015261321760f11b606482015260840161077e565b506001600160a01b038216600090815260056020526040902042905560015b601054610100900460ff161580156113de575060105460ff165b80156113f857506009546001600160a01b03858116911614155b156115285761140842600f611b85565b6001600160a01b0385166000908152600560205260409020541061147a5760405162461bcd60e51b815260206004820152602360248201527f596f75722073656c6c20636f6f6c646f776e20686173206e6f7420657870697260448201526232b21760e91b606482015260840161077e565b60006114853061091e565b905080156115115760105462010000900460ff161561150857600c54600954606491906114ba906001600160a01b031661091e565b6114c49190611b9d565b6114ce9190611bbc565b81111561150857600c54600954606491906114f1906001600160a01b031661091e565b6114fb9190611b9d565b6115059190611bbc565b90505b6115118161160c565b4780156115215761152147611587565b6000925050505b6001600160a01b03841660009081526004602052604090205460019060ff168061156a57506001600160a01b03841660009081526004602052604090205460ff165b15611573575060005b6115808585858486611780565b5050505050565b6007546001600160a01b03166108fc6115a1600284611bbc565b6040518115909202916000818181858888f193505050501580156115c9573d6000803e3d6000fd5b506008546001600160a01b03166108fc6115e4600284611bbc565b6040518115909202916000818181858888f19350505050158015610e65573d6000803e3d6000fd5b6010805461ff001916610100179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061165057611650611bde565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190611b1d565b816001815181106116e0576116e0611bde565b6001600160a01b0392831660209182029290920101526006546117069130911684610e69565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061173f908590600090869030904290600401611bf4565b600060405180830381600087803b15801561175957600080fd5b505af115801561176d573d6000803e3d6000fd5b50506010805461ff001916905550505050565b600061178c83836117a2565b905061179a868686846117e9565b505050505050565b60008083156117e25782156117ba5750600a546117e2565b50600b54600f546117cd90610e10611b85565b4210156117e2576117df600d82611b85565b90505b9392505050565b6000806117f684846118c6565b6001600160a01b038816600090815260026020526040902054919350915061181f908590611ad1565b6001600160a01b03808816600090815260026020526040808220939093559087168152205461184f908390611b85565b6001600160a01b038616600090815260026020526040902055611871816118fa565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118b691815260200190565b60405180910390a3505050505050565b6000808060646118d68587611b9d565b6118e09190611bbc565b905060006118ee8287611ad1565b96919550909350505050565b30600090815260026020526040902054611915908290611b85565b3060009081526002602052604090205550565b600060208083528351808285015260005b8181101561195557858101830151858201604001528201611939565b81811115611967576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461091b57600080fd5b6000602082840312156119a457600080fd5b81356117e28161197d565b600080604083850312156119c257600080fd5b82356119cd8161197d565b946020939093013593505050565b600080604083850312156119ee57600080fd5b50508035926020909101359150565b600080600060608486031215611a1257600080fd5b8335611a1d8161197d565b92506020840135611a2d8161197d565b929592945050506040919091013590565b600060208284031215611a5057600080fd5b5035919050565b801515811461091b57600080fd5b600060208284031215611a7757600080fd5b81356117e281611a57565b60008060408385031215611a9557600080fd5b8235611aa08161197d565b91506020830135611ab08161197d565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082821015611ae357611ae3611abb565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611b2f57600080fd5b81516117e28161197d565b600080600060608486031215611b4f57600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215611b7a57600080fd5b81516117e281611a57565b60008219821115611b9857611b98611abb565b500190565b6000816000190483118215151615611bb757611bb7611abb565b500290565b600082611bd957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611c445784516001600160a01b031683529383019391830191600101611c1f565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122002190efd6ac4e8b1eb3672e06eafa8dda6fa2edff26bef7f4b6267bb5f8c9d5864736f6c634300080a00330000000000000000000000005a978c79830e886a995d43df90eacda50baf5043000000000000000000000000b37e2b46874338910b90db13f936a6bd021d9920

Deployed ByteCode

0x6080604052600436106101e75760003560e01c80635090161711610102578063a9059cbb11610095578063db92dbb611610064578063db92dbb61461056f578063dcb0e0ad14610584578063dd62ed3e146105a4578063e8078d94146105ea57600080fd5b8063a9059cbb1461050f578063b2131f7d1461052f578063c3c8cd8014610545578063c9567bf91461055a57600080fd5b8063715018a6116100d1578063715018a61461048c5780638da5cb5b146104a157806394b8d8f2146104bf57806395d89b41146104df57600080fd5b80635090161714610421578063590f897e146104415780636fc3eaec1461045757806370a082311461046c57600080fd5b806327f3a72a1161017a5780633bed4355116101495780633bed4355146103ab57806340b9a54b146103cb57806345596e2e146103e157806349bd5a5e1461040157600080fd5b806327f3a72a14610321578063313ce5671461033657806332d873d81461035d578063367c55441461037357600080fd5b80630b78f9c0116101b65780630b78f9c0146102af57806318160ddd146102cf5780631940d020146102eb57806323b872dd1461030157600080fd5b80630492f055146101f357806306fdde031461021c5780630802d2f61461025d578063095ea7b31461027f57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b50610209600d5481565b6040519081526020015b60405180910390f35b34801561022857600080fd5b5061025060405180604001604052806008815260200167546f736120496e7560c01b81525081565b6040516102139190611928565b34801561026957600080fd5b5061027d610278366004611992565b6105ff565b005b34801561028b57600080fd5b5061029f61029a3660046119af565b610674565b6040519015158152602001610213565b3480156102bb57600080fd5b5061027d6102ca3660046119db565b61068a565b3480156102db57600080fd5b50683635c9adc5dea00000610209565b3480156102f757600080fd5b50610209600e5481565b34801561030d57600080fd5b5061029f61031c3660046119fd565b6106f1565b34801561032d57600080fd5b506102096107d9565b34801561034257600080fd5b5061034b600981565b60405160ff9091168152602001610213565b34801561036957600080fd5b50610209600f5481565b34801561037f57600080fd5b50600854610393906001600160a01b031681565b6040516001600160a01b039091168152602001610213565b3480156103b757600080fd5b50600754610393906001600160a01b031681565b3480156103d757600080fd5b50610209600a5481565b3480156103ed57600080fd5b5061027d6103fc366004611a3e565b6107e9565b34801561040d57600080fd5b50600954610393906001600160a01b031681565b34801561042d57600080fd5b5061027d61043c366004611992565b610883565b34801561044d57600080fd5b50610209600b5481565b34801561046357600080fd5b5061027d6108f1565b34801561047857600080fd5b50610209610487366004611992565b61091e565b34801561049857600080fd5b5061027d610939565b3480156104ad57600080fd5b506000546001600160a01b0316610393565b3480156104cb57600080fd5b5060105461029f9062010000900460ff1681565b3480156104eb57600080fd5b5061025060405180604001604052806004815260200163544f534160e01b81525081565b34801561051b57600080fd5b5061029f61052a3660046119af565b6109ad565b34801561053b57600080fd5b50610209600c5481565b34801561055157600080fd5b5061027d6109ba565b34801561056657600080fd5b5061027d6109f0565b34801561057b57600080fd5b50610209610a93565b34801561059057600080fd5b5061027d61059f366004611a65565b610aab565b3480156105b057600080fd5b506102096105bf366004611a82565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156105f657600080fd5b5061027d610b1e565b6007546001600160a01b0316336001600160a01b03161461061f57600080fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f0e96f8986653644392af4a5daec8b04a389af0d497572173e63846ccd26c843c906020015b60405180910390a150565b6000610681338484610e69565b50600192915050565b6007546001600160a01b0316336001600160a01b0316146106aa57600080fd5b600a829055600b81905560408051838152602081018390527f5c6323bf1c2d7aaea2c091a4751c1c87af7f2864650c336507a77d0557af37a1910160405180910390a15050565b60105460009060ff16801561071f57506001600160a01b03831660009081526004602052604090205460ff16155b801561073857506009546001600160a01b038581169116145b15610787576001600160a01b03831632146107875760405162461bcd60e51b815260206004820152600a6024820152691c1b1cc81b9bc8189bdd60b21b60448201526064015b60405180910390fd5b610792848484610f8d565b6001600160a01b03841660009081526003602090815260408083203384529091528120546107c1908490611ad1565b90506107ce853383610e69565b506001949350505050565b60006107e43061091e565b905090565b6007546001600160a01b0316336001600160a01b03161461080957600080fd5b6000811161084e5760405162461bcd60e51b8152602060048201526012602482015271526174652063616e2774206265207a65726f60701b604482015260640161077e565b600c8190556040518181527f208f1b468d3d61f0f085e975bd9d04367c930d599642faad06695229f3eadcd890602001610669565b6008546001600160a01b0316336001600160a01b0316146108a357600080fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f96511497113ddf59712b28350d7457b9c300ab227616bd3b451745a395a5301490602001610669565b6007546001600160a01b0316336001600160a01b03161461091157600080fd5b4761091b81611587565b50565b6001600160a01b031660009081526002602052604090205490565b6000546001600160a01b031633146109635760405162461bcd60e51b815260040161077e90611ae8565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610681338484610f8d565b6007546001600160a01b0316336001600160a01b0316146109da57600080fd5b60006109e53061091e565b905061091b8161160c565b6000546001600160a01b03163314610a1a5760405162461bcd60e51b815260040161077e90611ae8565b60105460ff1615610a675760405162461bcd60e51b81526020600482015260176024820152762a3930b234b7339034b99030b63932b0b23c9037b832b760491b604482015260640161077e565b6010805460ff1916600117905542600f556745639182808eca00600d556801a055690d9db80000600e55565b6009546000906107e4906001600160a01b031661091e565b6007546001600160a01b0316336001600160a01b031614610acb57600080fd5b6010805462ff00001916620100008315158102919091179182905560405160ff9190920416151581527ff65c78d1059dbb9ec90732848bcfebbec05ac40af847d3c19adcad63379d3aeb90602001610669565b6000546001600160a01b03163314610b485760405162461bcd60e51b815260040161077e90611ae8565b60105460ff1615610b955760405162461bcd60e51b81526020600482015260176024820152762a3930b234b7339034b99030b63932b0b23c9037b832b760491b604482015260640161077e565b600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155610bd23082683635c9adc5dea00000610e69565b806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c349190611b1d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca59190611b1d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610cf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d169190611b1d565b600980546001600160a01b0319166001600160a01b039283161790556006541663f305d7194730610d468161091e565b600080610d5b6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610dc3573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610de89190611b3a565b505060095460065460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529116915063095ea7b3906044016020604051808303816000875af1158015610e41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e659190611b68565b5050565b6001600160a01b038316610ecb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161077e565b6001600160a01b038216610f2c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161077e565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610ff15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161077e565b6001600160a01b0382166110535760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161077e565b600081116110b55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161077e565b600080546001600160a01b038581169116148015906110e257506000546001600160a01b03848116911614155b15611528576009546001600160a01b03858116911614801561111257506006546001600160a01b03848116911614155b801561113757506001600160a01b03831660009081526004602052604090205460ff16155b156113c45760105460ff1661118e5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642e0000000000000000604482015260640161077e565b600f544214156111ce5760405162461bcd60e51b815260206004820152600b60248201526a0706c73206e6f20736e69760ac1b604482015260640161077e565b42600f54610e106111df9190611b85565b111561125957600e546111f18461091e565b6111fb9084611b85565b11156112595760405162461bcd60e51b815260206004820152602760248201527f596f752063616e2774206f776e2074686174206d616e7920746f6b656e7320616044820152663a1037b731b29760c91b606482015260840161077e565b6001600160a01b03831660009081526005602052604090206001015460ff166112c1576040805180820182526000808252600160208084018281526001600160a01b03891684526005909152939091209151825591519101805460ff19169115159190911790555b42600f5460786112d19190611b85565b11156113a557600d548211156113295760405162461bcd60e51b815260206004820152601b60248201527f45786365656473206d6178696d756d2062757920616d6f756e742e0000000000604482015260640161077e565b61133442601e611b85565b6001600160a01b038416600090815260056020526040902054106113a55760405162461bcd60e51b815260206004820152602260248201527f596f75722062757920636f6f6c646f776e20686173206e6f7420657870697265604482015261321760f11b606482015260840161077e565b506001600160a01b038216600090815260056020526040902042905560015b601054610100900460ff161580156113de575060105460ff165b80156113f857506009546001600160a01b03858116911614155b156115285761140842600f611b85565b6001600160a01b0385166000908152600560205260409020541061147a5760405162461bcd60e51b815260206004820152602360248201527f596f75722073656c6c20636f6f6c646f776e20686173206e6f7420657870697260448201526232b21760e91b606482015260840161077e565b60006114853061091e565b905080156115115760105462010000900460ff161561150857600c54600954606491906114ba906001600160a01b031661091e565b6114c49190611b9d565b6114ce9190611bbc565b81111561150857600c54600954606491906114f1906001600160a01b031661091e565b6114fb9190611b9d565b6115059190611bbc565b90505b6115118161160c565b4780156115215761152147611587565b6000925050505b6001600160a01b03841660009081526004602052604090205460019060ff168061156a57506001600160a01b03841660009081526004602052604090205460ff165b15611573575060005b6115808585858486611780565b5050505050565b6007546001600160a01b03166108fc6115a1600284611bbc565b6040518115909202916000818181858888f193505050501580156115c9573d6000803e3d6000fd5b506008546001600160a01b03166108fc6115e4600284611bbc565b6040518115909202916000818181858888f19350505050158015610e65573d6000803e3d6000fd5b6010805461ff001916610100179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061165057611650611bde565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190611b1d565b816001815181106116e0576116e0611bde565b6001600160a01b0392831660209182029290920101526006546117069130911684610e69565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac9479061173f908590600090869030904290600401611bf4565b600060405180830381600087803b15801561175957600080fd5b505af115801561176d573d6000803e3d6000fd5b50506010805461ff001916905550505050565b600061178c83836117a2565b905061179a868686846117e9565b505050505050565b60008083156117e25782156117ba5750600a546117e2565b50600b54600f546117cd90610e10611b85565b4210156117e2576117df600d82611b85565b90505b9392505050565b6000806117f684846118c6565b6001600160a01b038816600090815260026020526040902054919350915061181f908590611ad1565b6001600160a01b03808816600090815260026020526040808220939093559087168152205461184f908390611b85565b6001600160a01b038616600090815260026020526040902055611871816118fa565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118b691815260200190565b60405180910390a3505050505050565b6000808060646118d68587611b9d565b6118e09190611bbc565b905060006118ee8287611ad1565b96919550909350505050565b30600090815260026020526040902054611915908290611b85565b3060009081526002602052604090205550565b600060208083528351808285015260005b8181101561195557858101830151858201604001528201611939565b81811115611967576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461091b57600080fd5b6000602082840312156119a457600080fd5b81356117e28161197d565b600080604083850312156119c257600080fd5b82356119cd8161197d565b946020939093013593505050565b600080604083850312156119ee57600080fd5b50508035926020909101359150565b600080600060608486031215611a1257600080fd5b8335611a1d8161197d565b92506020840135611a2d8161197d565b929592945050506040919091013590565b600060208284031215611a5057600080fd5b5035919050565b801515811461091b57600080fd5b600060208284031215611a7757600080fd5b81356117e281611a57565b60008060408385031215611a9557600080fd5b8235611aa08161197d565b91506020830135611ab08161197d565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082821015611ae357611ae3611abb565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215611b2f57600080fd5b81516117e28161197d565b600080600060608486031215611b4f57600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215611b7a57600080fd5b81516117e281611a57565b60008219821115611b9857611b98611abb565b500190565b6000816000190483118215151615611bb757611bb7611abb565b500290565b600082611bd957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611c445784516001600160a01b031683529383019391830191600101611c1f565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122002190efd6ac4e8b1eb3672e06eafa8dda6fa2edff26bef7f4b6267bb5f8c9d5864736f6c634300080a0033