ETH Price: $3,842.00 (+6.20%)

Token

ERC-20: Uniforth (UNIF)
 

Overview

Max Total Supply

3,780,694,074,007.734210276 UNIF

Holders

698

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
15,185,075.087658973 UNIF

Value
$0.00
0xda58d65500563404015699e3e43d8e4bb69a07b9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
UNIF

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-22
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

library SafeCast {

    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits");
        return uint128(value);
    }

    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits");
        return uint64(value);
    }

    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits");
        return uint32(value);
    }

    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits");
        return uint16(value);
    }

    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits");
        return uint8(value);
    }
    
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    function toInt256(uint256 value) internal pure returns (int256) {
        require(value < 2**255, "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

contract Initializable {

  bool private initialized;

  bool private initializing;

  modifier initializer() {
    require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");

    bool isTopLevelCall = !initializing;
    if (isTopLevelCall) {
      initializing = true;
      initialized = true;
    }

    _;

    if (isTopLevelCall) {
      initializing = false;
    }
  }

  function isConstructor() private view returns (bool) {
    address self = address(this);
    uint256 cs;
    assembly { cs := extcodesize(self) }
    return cs == 0;
  }

  uint256[50] private ______gap;
}

contract ContextUpgradeSafe is Initializable {

    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }

    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }

    uint256[50] private __gap;
}

contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        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), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    uint256[49] private __gap;
}

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

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

contract ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    function __ERC20_init(string memory name, string memory symbol) internal initializer {
        __Context_init_unchained();
        __ERC20_init_unchained(name, symbol);
    }

    function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer {


        _name = name;
        _symbol = symbol;
        _decimals = 18;

    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        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 _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }

    uint256[44] private __gap;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setMigrator(address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

contract UNIF is ERC20UpgradeSafe, OwnableUpgradeSafe {
    
    using SafeCast for int256;
    using SafeMath for uint256;
    using Address for address;
    
    struct Transaction {
        bool enabled;
        address destination;
        bytes data;
    }

    event TransactionFailed(address indexed destination, uint index, bytes data);
	
	// Stable ordering is not guaranteed.

    Transaction[] public transactions;

    uint256 private _epoch;
    event LogRebase(uint256 indexed epoch, uint256 totalSupply);

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
	
	uint256 private _totalSupply;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    
    uint256 private constant DECIMALS = 9;
    uint256 private constant RATE_PRECISION = 10 ** DECIMALS;
    
    uint256 public _tFeePercent;
    
    address public _rebaser;
    
    uint256 public _limitTransferAmount;
    uint256 public _limitMaxBalance;
    uint256 public _limitSellFeePercent;
    
    uint256 public _limitTimestamp;

    uint256 public _presaleTimestamp;
    uint256 public _presaleEth;
    bool public endSale;
    uint256 public _presaleRate;
    
    IUniswapV2Router02 public uniswapRouterV2;
    IUniswapV2Factory public uniswapFactory;
    
    function initialize()
        public
        initializer
    {
        __ERC20_init("Uniforth", "UNIF");
        _setupDecimals(uint8(DECIMALS));
        __Ownable_init();
        
        _totalSupply = 8000000 * 10**9 ;
        _rTotal = (MAX - (MAX % _totalSupply));
        
        _rebaser = _msgSender();
        
        _tFeePercent = 266; //2.6682%

        _rOwned[address(this)] = _rTotal;
        emit Transfer(address(0), address(this), _totalSupply);

        _presaleTimestamp = now  + 3 days;
        endSale = false;
        _presaleEth = 600 ether;
        _presaleRate = 6000;
        
        excludeAccount(_msgSender());
        excludeAccount(address(this));
        
        uniswapRouterV2 = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapFactory = IUniswapV2Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
    }

    receive() external payable {
        require(!endSale, "PreSale Ended");
        require(_presaleEth >= msg.value, "Sold out");
        address payable wallet = address(uint160(owner()));
        wallet.transfer(msg.value.div(3));
        _presaleEth = _presaleEth.sub(msg.value);
        uint256 amountBought = msg.value.div(10**9).mul(_presaleRate);
        _transfer(address(this), msg.sender, amountBought );
    }

    function listToken() external onlyOwner() {
        require(!endSale, 'already listed');
        require(_presaleEth == 0 || _presaleTimestamp < now, "Sale has not ended yet");
        endSale = true;
        _transfer(address(this), _msgSender(), 2000000 * 10**9);
        address tokenUniswapPair = uniswapFactory.createPair(
            address(uniswapRouterV2.WETH()),
            address(address(this))
        );
        IUniswapV2Pair pair = IUniswapV2Pair(tokenUniswapPair);
        address WETH = uniswapRouterV2.WETH();
        uint256 ethToSend = address(this).balance;
        IWETH(WETH).deposit{value : ethToSend}();
        require(address(this).balance == 0 , "Transfer Failed");
        uint256 tokenToAdd = 2400000 * 10**9;
        if(_presaleEth != 0) {
            tokenToAdd = ethToSend.div(10**9).mul(_presaleRate);
            uint256 unsoldTokens = balanceOf(address(this)) - tokenToAdd; 
            _transfer(address(this), address(0), unsoldTokens);
        }
        IWETH(WETH).transfer(address(pair),ethToSend);
        _transfer(address(this), address(pair), tokenToAdd);
        pair.mint(address(this));
        IERC20(address(pair)).transfer(msg.sender, IERC20(address(pair)).balanceOf(address(this)));
    }
    
    function setRebaser(address rebaser) external onlyOwner() {
        _rebaser = rebaser;
    }
    
    function setTransferFeePercent(uint256 tFeePercent) external onlyOwner() {

        _tFeePercent = tFeePercent;
    }
    
    function setLimit(uint256 transferAmount, uint256 maxBalance, uint256 sellFeePercent) external onlyOwner() {
        require(_limitTimestamp == 0, "Limit changes not allowed");
        
        _limitTransferAmount = transferAmount;
        _limitMaxBalance = maxBalance;
        _limitSellFeePercent = sellFeePercent;

        _limitTimestamp = now;
    }
    
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }
    
    function rebase(int256 supplyDelta)
        external
        returns (uint256)
    {
        require(_msgSender() == owner() || _msgSender() == _rebaser, "Sender not authorized");
        
        _epoch = _epoch.add(1);
		
        if (supplyDelta == 0) {
            emit LogRebase(_epoch, _totalSupply);
            return _totalSupply;
        }
        
        uint256 uSupplyDelta = (supplyDelta < 0 ? -supplyDelta : supplyDelta).toUint256();
        uint256 rate = uSupplyDelta.mul(RATE_PRECISION).div(_totalSupply);
        uint256 multiplier;
        
        if (supplyDelta < 0) {
            multiplier = RATE_PRECISION.sub(rate);
        } else {
            multiplier = RATE_PRECISION.add(rate);
        }
        
        if (supplyDelta < 0) {
            _totalSupply = _totalSupply.sub(uSupplyDelta);
        } else {
            _totalSupply = _totalSupply.add(uSupplyDelta);
        }
        
        if (_totalSupply > MAX) {
            _totalSupply = MAX;
        }
        
        for (uint256 i = 0; i < _excluded.length; i++) {
            if(_tOwned[_excluded[i]] > 0) {
                _tOwned[_excluded[i]] = _tOwned[_excluded[i]].mul(multiplier).div(RATE_PRECISION);
            }
        }
        
        emit LogRebase(_epoch, _totalSupply);

		for (uint i = 0; i < transactions.length; i++) {
            Transaction storage t = transactions[i];
            if (t.enabled) {
                bool result = externalCall(t.destination, t.data);
                if (!result) {
                    emit TransactionFailed(t.destination, i, t.data);
                    revert("Transaction Failed");
                }
            }
        }

        return _totalSupply;
    }
    
    /**
     * @notice Adds a transaction that gets called for a downstream receiver of rebases
     * @param destination Address of contract destination
     * @param data Transaction data payload
     */
	
    function addTransaction(address destination, bytes memory data)
        external
        onlyOwner
    {
        transactions.push(Transaction({
            enabled: true,
            destination: destination,
            data: data
        }));
    }
	
	/**
     * @param index Index of transaction to remove.
     *              Transaction ordering may have changed since adding.
     */

    function removeTransaction(uint index)
        external
        onlyOwner
    {
        require(index < transactions.length, "index out of bounds");

        if (index < transactions.length - 1) {
            transactions[index] = transactions[transactions.length - 1];
        }

        transactions.pop();
    }
	
	/**
     * @param index Index of transaction. Transaction ordering may have changed since adding.
     * @param enabled True for enabled, false for disabled.
     */

    function setTransactionEnabled(uint index, bool enabled)
        external
        onlyOwner
    {
        require(index < transactions.length, "index must be in range of stored tx list");
        transactions[index].enabled = enabled;
    }
	
	/**
     * @return Number of transactions, both enabled and disabled, in transactions list.
     */

    function transactionsSize()
        external
        view
        returns (uint256)
    {
        return transactions.length;
    }
	
	/**
     * @dev wrapper to call the encoded transactions on downstream consumers.
     * @param destination Address of destination contract.
     * @param data The encoded data payload.
     * @return True on success
     */

    function externalCall(address destination, bytes memory data)
        internal
        returns (bool)
    {
        bool result;
        assembly {  // solhint-disable-line no-inline-assembly
            // "Allocate" memory for output
            // (0x40 is where "free memory" pointer is stored by convention)
            let outputAddress := mload(0x40)

            // First 32 bytes are the padded length of data, so exclude that
            let dataAddress := add(data, 32)

            result := call(
                // 34710 is the value that solidity is currently emitting
                // It includes callGas (700) + callVeryLow (3, to pay for SUB)
                // + callValueTransferGas (9000) + callNewAccountGas
                // (25000, in case the destination address does not exist and needs creating)
                sub(gas(), 34710),


                destination,
                0, // transfer value in wei
                dataAddress,
                mload(data),  // Size of the input, in bytes. Stored in position 0 of the array.
                outputAddress,
                0  // Output is ignored, therefore the output size is zero
            )
        }
        return result;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromRefraction(_rOwned[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 increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function refract(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,) = _getValues(tAmount, _tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function refractionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _totalSupply, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount, _tFeePercent);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount, _tFeePercent);
            return rTransferAmount;
        }
    }

    function tokenFromRefraction(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total refractions");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeAccount(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromRefraction(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) public onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(address owner, address spender, uint256 amount) internal override {
        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 sender, address recipient, uint256 amount) internal override {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(endSale || sender == owner() || sender == address(this), "transfer paused for sale");
        if(sender == address(this) || sender == owner()) {
            _transferBothExcluded(sender, recipient, amount, 0);
        } else if(_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount, _tFeePercent);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
                _transferToExcluded(sender, recipient, amount, _tFeePercent);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount, _tFeePercent);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount, 0);
        } else {
            _transferStandard(sender, recipient, amount, _tFeePercent);
        }
    }
    

    function _transferStandard(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);       
        _refractFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _refractFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _refractFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _refractFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _refractFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount, uint256 tFeePercent) private view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount, tFeePercent);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount, uint256 tFeePercent) private pure returns (uint256, uint256) {
        uint256 tFee = tAmount.mul(tFeePercent).div(10000);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _totalSupply;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _totalSupply);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_totalSupply)) return (_rTotal, _totalSupply);
        return (rSupply, tSupply);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"LogRebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TransactionFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_limitMaxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitSellFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rebaser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"addTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"supplyDelta","type":"int256"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"refract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"refractionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"uint256","name":"maxBalance","type":"uint256"},{"internalType":"uint256","name":"sellFeePercent","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rebaser","type":"address"}],"name":"setRebaser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTransactionEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tFeePercent","type":"uint256"}],"name":"setTransferFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromRefraction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionsSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouterV2","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50613aa6806100206000396000f3fe60806040526004361061026b5760003560e01c8063596fa9e31161014457806395d89b41116100b6578063cba0e9961161007a578063cba0e99614610a6c578063dd62ed3e14610a9f578063e46adf6214610ada578063f2cc0c1814610b0d578063f2fde38b14610b40578063f84354f114610b7357610386565b806395d89b41146108f857806397d0677b1461090d5780639ace38c21461093f578063a457c2d7146109fa578063a9059cbb14610a3357610386565b8063715018a611610108578063715018a61461087a5780637d4497891461088f5780638129fc1c146108a45780638bdb2afa146108b95780638da5cb5b146108ce57806391d4ec18146108e357610386565b8063596fa9e3146107b55780635c31a713146107ca57806365cccc80146108005780636e9dde991461081557806370a082311461084757610386565b806323b872dd116101dd578063313ce567116101a1578063313ce567146106cc578063380d831b146106f7578063395093511461070c5780633aa8d4be14610745578063456e0a5d1461077657806346c3bd1f1461078b57610386565b806323b872dd146106205780632ae427dc146106635780632bc1281e146106785780632d7da5a41461068d578063303bb0b6146106a257610386565b8063126e19be1161022f578063126e19be146104ca57806313114a9d1461058d57806314f43f7e146105a257806316007d29146105cc57806318160ddd146105e15780631f36d925146105f657610386565b8063030ba6bf1461038b57806306fdde03146103a257806308d1dd8a1461042c578063095ea7b3146104535780630ab114f9146104a057610386565b366103865760db5460ff16156102b8576040805162461bcd60e51b815260206004820152600d60248201526c141c9954d85b1948115b991959609a1b604482015290519081900360640190fd5b3460da5410156102fa576040805162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b604482015290519081900360640190fd5b6000610304610ba6565b90506001600160a01b0381166108fc61031e346003610bb5565b6040518115909202916000818181858888f19350505050158015610346573d6000803e3d6000fd5b5060da546103549034610c00565b60da5560dc546000906103759061036f34633b9aca00610bb5565b90610c42565b9050610382303383610c9b565b5050005b600080fd5b34801561039757600080fd5b506103a0610f54565b005b3480156103ae57600080fd5b506103b76114d4565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f15781810151838201526020016103d9565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043857600080fd5b5061044161156a565b60408051918252519081900360200190f35b34801561045f57600080fd5b5061048c6004803603604081101561047657600080fd5b506001600160a01b038135169060200135611570565b604080519115158252519081900360200190f35b3480156104ac57600080fd5b50610441600480360360208110156104c357600080fd5b503561158d565b3480156104d657600080fd5b506103a0600480360360408110156104ed57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561051857600080fd5b82018360208201111561052a57600080fd5b8035906020019184600183028401116401000000008311171561054c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a2e945050505050565b34801561059957600080fd5b50610441611b4f565b3480156105ae57600080fd5b506103a0600480360360208110156105c557600080fd5b5035611b55565b3480156105d857600080fd5b50610441611c30565b3480156105ed57600080fd5b50610441611c36565b34801561060257600080fd5b506103a06004803603602081101561061957600080fd5b5035611c3c565b34801561062c57600080fd5b5061048c6004803603606081101561064357600080fd5b506001600160a01b03813581169160208101359091169060400135611c99565b34801561066f57600080fd5b50610441611d20565b34801561068457600080fd5b50610441611d26565b34801561069957600080fd5b50610441611d2c565b3480156106ae57600080fd5b50610441600480360360208110156106c557600080fd5b5035611d32565b3480156106d857600080fd5b506106e1611d92565b6040805160ff9092168252519081900360200190f35b34801561070357600080fd5b5061048c611d9b565b34801561071857600080fd5b5061048c6004803603604081101561072f57600080fd5b506001600160a01b038135169060200135611da4565b34801561075157600080fd5b5061075a611df2565b604080516001600160a01b039092168252519081900360200190f35b34801561078257600080fd5b50610441611e01565b34801561079757600080fd5b506103a0600480360360208110156107ae57600080fd5b5035611e07565b3480156107c157600080fd5b5061075a611f9f565b3480156107d657600080fd5b506103a0600480360360608110156107ed57600080fd5b5080359060208101359060400135611fae565b34801561080c57600080fd5b5061044161206d565b34801561082157600080fd5b506103a06004803603604081101561083857600080fd5b50803590602001351515612073565b34801561085357600080fd5b506104416004803603602081101561086a57600080fd5b50356001600160a01b031661213c565b34801561088657600080fd5b506103a061219e565b34801561089b57600080fd5b50610441612240565b3480156108b057600080fd5b506103a0612246565b3480156108c557600080fd5b5061075a61245c565b3480156108da57600080fd5b5061075a610ba6565b3480156108ef57600080fd5b5061044161246b565b34801561090457600080fd5b506103b7612471565b34801561091957600080fd5b506104416004803603604081101561093057600080fd5b508035906020013515156124d2565b34801561094b57600080fd5b506109696004803603602081101561096257600080fd5b5035612568565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109bd5781810151838201526020016109a5565b50505050905090810190601f1680156109ea5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610a0657600080fd5b5061048c60048036036040811015610a1d57600080fd5b506001600160a01b03813516906020013561262d565b348015610a3f57600080fd5b5061048c60048036036040811015610a5657600080fd5b506001600160a01b038135169060200135612695565b348015610a7857600080fd5b5061048c60048036036020811015610a8f57600080fd5b50356001600160a01b03166126a9565b348015610aab57600080fd5b5061044160048036036040811015610ac257600080fd5b506001600160a01b03813581169160200135166126c7565b348015610ae657600080fd5b506103a060048036036020811015610afd57600080fd5b50356001600160a01b03166126f2565b348015610b1957600080fd5b506103a060048036036020811015610b3057600080fd5b50356001600160a01b031661276c565b348015610b4c57600080fd5b506103a060048036036020811015610b6357600080fd5b50356001600160a01b03166128f2565b348015610b7f57600080fd5b506103a060048036036020811015610b9657600080fd5b50356001600160a01b03166129eb565b6097546001600160a01b031690565b6000610bf783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612bac565b90505b92915050565b6000610bf783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c4e565b600082610c5157506000610bfa565b82820282848281610c5e57fe5b0414610bf75760405162461bcd60e51b81526004018080602001828103825260218152602001806138ed6021913960400191505060405180910390fd5b6001600160a01b038316610ce05760405162461bcd60e51b81526004018080602001828103825260258152602001806139d76025913960400191505060405180910390fd5b60008111610d1f5760405162461bcd60e51b81526004018080602001828103825260298152602001806139566029913960400191505060405180910390fd5b60db5460ff1680610d485750610d33610ba6565b6001600160a01b0316836001600160a01b0316145b80610d5b57506001600160a01b03831630145b610dac576040805162461bcd60e51b815260206004820152601860248201527f7472616e736665722070617573656420666f722073616c650000000000000000604482015290519081900360640190fd5b6001600160a01b038316301480610ddb5750610dc6610ba6565b6001600160a01b0316836001600160a01b0316145b15610df257610ded8383836000612ca8565b610f4f565b6001600160a01b038316600090815260ce602052604090205460ff168015610e3357506001600160a01b038216600090815260ce602052604090205460ff16155b15610e4657610ded83838360d354612df7565b6001600160a01b038316600090815260ce602052604090205460ff16158015610e8757506001600160a01b038216600090815260ce602052604090205460ff165b15610e9a57610ded83838360d354612e97565b6001600160a01b038316600090815260ce602052604090205460ff16158015610edc57506001600160a01b038216600090815260ce602052604090205460ff16155b15610eef57610ded83838360d354612ed9565b6001600160a01b038316600090815260ce602052604090205460ff168015610f2f57506001600160a01b038216600090815260ce602052604090205460ff165b15610f4157610ded8383836000612ca8565b610f4f83838360d354612ed9565b505050565b610f5c612f1b565b6097546001600160a01b03908116911614610fac576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60db5460ff1615610ff5576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b1a5cdd195960921b604482015290519081900360640190fd5b60da54158061100557504260d954105b61104f576040805162461bcd60e51b815260206004820152601660248201527514d85b19481a185cc81b9bdd08195b991959081e595d60521b604482015290519081900360640190fd5b60db805460ff1916600117905561107530611068612f1b565b66071afd498d0000610c9b565b60de5460dd54604080516315ab88c960e31b815290516000936001600160a01b039081169363c9c653969391169163ad5c464891600480820192602092909190829003018186803b1580156110c957600080fd5b505afa1580156110dd573d6000803e3d6000fd5b505050506040513d60208110156110f357600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b15801561114257600080fd5b505af1158015611156573d6000803e3d6000fd5b505050506040513d602081101561116c57600080fd5b505160dd54604080516315ab88c960e31b8152905192935083926000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b1580156111b857600080fd5b505afa1580156111cc573d6000803e3d6000fd5b505050506040513d60208110156111e257600080fd5b505160408051630d0e30db60e41b8152905191925047916001600160a01b0384169163d0e30db091849160048082019260009290919082900301818588803b15801561122d57600080fd5b505af1158015611241573d6000803e3d6000fd5b50505050504760001461128d576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b60da54660886c98b76000090156112d25760dc546112b39061036f84633b9aca00610bb5565b90506000816112c13061213c565b0390506112d030600083610c9b565b505b826001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561132957600080fd5b505af115801561133d573d6000803e3d6000fd5b505050506040513d602081101561135357600080fd5b506113619050308583610c9b565b604080516335313c2160e11b815230600482015290516001600160a01b03861691636a6278429160248083019260209291908290030181600087803b1580156113a957600080fd5b505af11580156113bd573d6000803e3d6000fd5b505050506040513d60208110156113d357600080fd5b5050604080516370a0823160e01b815230600482015290516001600160a01b0386169163a9059cbb91339184916370a0823191602480820192602092909190829003018186803b15801561142657600080fd5b505afa15801561143a573d6000803e3d6000fd5b505050506040513d602081101561145057600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156114a157600080fd5b505af11580156114b5573d6000803e3d6000fd5b505050506040513d60208110156114cb57600080fd5b50505050505050565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115605780601f1061153557610100808354040283529160200191611560565b820191906000526020600020905b81548152906001019060200180831161154357829003601f168201915b5050505050905090565b60d85481565b600061158461157d612f1b565b8484612f1f565b50600192915050565b6000611597610ba6565b6001600160a01b03166115a8612f1b565b6001600160a01b031614806115d7575060d4546001600160a01b03166115cc612f1b565b6001600160a01b0316145b611620576040805162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604482015290519081900360640190fd5b60ca5461162e90600161300b565b60ca55816116775760ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a25060d054611a29565b60006116946000841261168a578361168f565b836000035b613065565b60d0549091506000906116b5906116af84633b9aca00610c42565b90610bb5565b90506000808512156116d6576116cf633b9aca0083610c00565b90506116e7565b6116e4633b9aca008361300b565b90505b60008512156117055760d0546116fd9084610c00565b60d055611716565b60d054611712908461300b565b60d0555b60005b60cf548110156117e857600060cc600060cf848154811061173657fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411156117e0576117a96009600a0a6116af8460cc600060cf878154811061177e57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490610c42565b60cc600060cf84815481106117ba57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b600101611719565b5060ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a260005b60c954811015611a1f57600060c9828154811061183d57fe5b60009182526020909120600290910201805490915060ff1615611a165780546001808301805460408051602060026101009685161587026000190190941693909304601f81018490048402820184019092528181526000956119059590046001600160a01b03169390929091908301828280156118fb5780601f106118d0576101008083540402835291602001916118fb565b820191906000526020600020905b8154815290600101906020018083116118de57829003601f168201915b50505050506130c0565b905080611a145781546040805185815260208101828152600180870180546002610100938216158402600019019091160494840185905294046001600160a01b0316937f8091ecaaa54ebb82e02d36c2c336528e0fcb9b3430fc1291ac88295032b9c2639388939192906060830190849080156119c35780601f10611998576101008083540402835291602001916119c3565b820191906000526020600020905b8154815290600101906020018083116119a657829003601f168201915b5050935050505060405180910390a26040805162461bcd60e51b8152602060048201526012602482015271151c985b9cd858dd1a5bdb8811985a5b195960721b604482015290519081900360640190fd5b505b50600101611824565b5060d05493505050505b919050565b611a36612f1b565b6097546001600160a01b03908116911614611a86576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6040805160608101825260018082526001600160a01b03808616602080850191825294840186815260c980549485018155600052845160029094027f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2881018054935190941661010002610100600160a81b031995151560ff19909416939093179490941691909117825551805193949193611b48937f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2901929190910190613738565b5050505050565b60d25490565b6000611b5f612f1b565b6001600160a01b038116600090815260ce602052604090205490915060ff1615611bba5760405162461bcd60e51b815260040180806020018281038252602c815260200180613a20602c913960400191505060405180910390fd5b6000611bc88360d3546130e3565b505050506001600160a01b038316600090815260cb6020526040902054909150611bf29082610c00565b6001600160a01b038316600090815260cb602052604090205560d154611c189082610c00565b60d15560d254611c28908461300b565b60d255505050565b60dc5481565b60d05490565b611c44612f1b565b6097546001600160a01b03908116911614611c94576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60d355565b6000611ca6848484610c9b565b611d1684611cb2612f1b565b611d118560405180606001604052806028815260200161390e602891396001600160a01b038a16600090815260cd6020526040812090611cf0612f1b565b6001600160a01b031681526020810191909152604001600020549190612c4e565b612f1f565b5060019392505050565b60d35481565b60d55481565b60d95481565b600060d154821115611d755760405162461bcd60e51b815260040180806020018281038252602a8152602001806139ad602a913960400191505060405180910390fd5b6000611d7f613131565b9050611d8b8382610bb5565b9392505050565b606a5460ff1690565b60db5460ff1681565b6000611584611db1612f1b565b84611d118560cd6000611dc2612f1b565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061300b565b60d4546001600160a01b031681565b60d65481565b611e0f612f1b565b6097546001600160a01b03908116911614611e5f576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60c9548110611eab576040805162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b60c95460001901811015611f5c5760c980546000198101908110611ecb57fe5b906000526020600020906002020160c98281548110611ee657fe5b6000918252602090912082546002928302909101805460ff191660ff9092161515919091178082558354610100600160a81b0319909116610100918290046001600160a01b03168202178255600180850180549394611f589483870194929381161590920260001901909116046137b2565b5050505b60c9805480611f6757fe5b60008281526020812060026000199093019283020180546001600160a81b031916815590611f986001830182613827565b5050905550565b60dd546001600160a01b031681565b611fb6612f1b565b6097546001600160a01b03908116911614612006576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60d8541561205b576040805162461bcd60e51b815260206004820152601960248201527f4c696d6974206368616e676573206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60d59290925560d65560d7554260d855565b60da5481565b61207b612f1b565b6097546001600160a01b039081169116146120cb576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60c954821061210b5760405162461bcd60e51b81526004018080602001828103825260288152602001806138c56028913960400191505060405180910390fd5b8060c9838154811061211957fe5b60009182526020909120600290910201805460ff19169115159190911790555050565b6001600160a01b038116600090815260ce602052604081205460ff161561217c57506001600160a01b038116600090815260cc6020526040902054611a29565b6001600160a01b038216600090815260cb6020526040902054610bfa90611d32565b6121a6612f1b565b6097546001600160a01b039081169116146121f6576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b60d75481565b600054610100900460ff168061225f575061225f613154565b8061226d575060005460ff16155b6122a85760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156122d3576000805460ff1961ff0019909116610100171660011790555b612319604051806040016040528060088152602001670aadcd2ccdee4e8d60c31b815250604051806040016040528060048152602001632aa724a360e11b81525061315a565b612323600961320f565b61232b613225565b661c6bf52634000060d0556507326b47ffff1960d155612349612f1b565b60d480546001600160a01b0319166001600160a01b039290921691909117905561010a60d35560d15430600081815260cb602090815260408083209490945560d05484519081529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a36203f480420160d95560db805460ff19169055682086ac35105260000060da5561177060dc556123f66123f1612f1b565b61276c565b6123ff3061276c565b60dd80546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560de8054909116735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f1790558015612459576000805461ff00191690555b50565b60de546001600160a01b031681565b60c95490565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115605780601f1061153557610100808354040283529160200191611560565b600060d05483111561252b576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b8161254c57600061253e8460d3546130e3565b50929450610bfa9350505050565b600061255a8460d3546130e3565b50919450610bfa9350505050565b60c9818154811061257557fe5b6000918252602091829020600291820201805460018083018054604080516101009483161585026000190190921696909604601f810188900488028201880190965285815260ff84169750919092046001600160a01b031694929390928301828280156126235780601f106125f857610100808354040283529160200191612623565b820191906000526020600020905b81548152906001019060200180831161260657829003601f168201915b5050505050905083565b600061158461263a612f1b565b84611d1185604051806060016040528060258152602001613a4c6025913960cd6000612664612f1b565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612c4e565b60006115846126a2612f1b565b8484610c9b565b6001600160a01b0316600090815260ce602052604090205460ff1690565b6001600160a01b03918216600090815260cd6020908152604080832093909416825291909152205490565b6126fa612f1b565b6097546001600160a01b0390811691161461274a576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b612774612f1b565b6097546001600160a01b039081169116146127c4576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff1615612832576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260cb60205260409020541561288c576001600160a01b038116600090815260cb602052604090205461287290611d32565b6001600160a01b038216600090815260cc60205260409020555b6001600160a01b0316600081815260ce60205260408120805460ff1916600190811790915560cf805491820181559091527facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf290180546001600160a01b0319169091179055565b6128fa612f1b565b6097546001600160a01b0390811691161461294a576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6001600160a01b03811661298f5760405162461bcd60e51b815260040180806020018281038252602681526020018061387d6026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b6129f3612f1b565b6097546001600160a01b03908116911614612a43576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff16612ab0576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b60cf54811015612ba857816001600160a01b031660cf8281548110612ad457fe5b6000918252602090912001546001600160a01b03161415612ba05760cf80546000198101908110612b0157fe5b60009182526020909120015460cf80546001600160a01b039092169183908110612b2757fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918416815260cc8252604080822082905560ce90925220805460ff1916905560cf805480612b7957fe5b600082815260209020810160001990810180546001600160a01b0319169055019055612ba8565b600101612ab3565b5050565b60008183612c385760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bfd578181015183820152602001612be5565b50505050905090810190601f168015612c2a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c4457fe5b0495945050505050565b60008184841115612ca05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bfd578181015183820152602001612be5565b505050900390565b6000806000806000612cba87876130e3565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612cea9088610c00565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612d199086610c00565b6001600160a01b03808b16600090815260cb6020908152604080832094909455918b16815260cc9091522054612d4f908361300b565b6001600160a01b038916600090815260cc602090815260408083209390935560cb90522054612d7e908561300b565b6001600160a01b038916600090815260cb6020526040902055612da183826132d6565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b6000806000806000612e0987876130e3565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612e399088610c00565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612e689086610c00565b6001600160a01b03808b16600090815260cb602052604080822093909355908a1681522054612d7e908561300b565b6000806000806000612ea987876130e3565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612d199086610c00565b6000806000806000612eeb87876130e3565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612e689086610c00565b3390565b6001600160a01b038316612f645760405162461bcd60e51b81526004018080602001828103825260248152602001806139fc6024913960400191505060405180910390fd5b6001600160a01b038216612fa95760405162461bcd60e51b81526004018080602001828103825260228152602001806138a36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260cd6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015610bf7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000808212156130bc576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b5090565b6000806040516020840160008286518360008a6187965a03f19695505050505050565b60008060008060008060006130f889896132fa565b915091506000613106613131565b905060008060006131188d8686613328565b919f909e50909c50959a50939850939650505050505050565b600080600061313e613364565b909250905061314d8282610bb5565b9250505090565b303b1590565b600054610100900460ff16806131735750613173613154565b80613181575060005460ff16155b6131bc5760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156131e7576000805460ff1961ff0019909116610100171660011790555b6131ef6134c7565b6131f98383613567565b8015610f4f576000805461ff0019169055505050565b606a805460ff191660ff92909216919091179055565b600054610100900460ff168061323e575061323e613154565b8061324c575060005460ff16155b6132875760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156132b2576000805460ff1961ff0019909116610100171660011790555b6132ba6134c7565b6132c261363f565b8015612459576000805461ff001916905550565b60d1546132e39083610c00565b60d15560d2546132f3908261300b565b60d2555050565b6000808061330e6127106116af8787610c42565b9050600061331c8683610c00565b96919550909350505050565b60008080806133378786610c42565b905060006133458787610c42565b905060006133538383610c00565b929992985090965090945050505050565b60d15460d0546000918291825b60cf54811015613495578260cb600060cf848154811061338d57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806133f257508160cc600060cf84815481106133cb57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156134095760d15460d054945094505050506134c3565b61344960cb600060cf848154811061341d57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490610c00565b925061348b60cc600060cf848154811061345f57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390610c00565b9150600101613371565b5060d05460d1546134a591610bb5565b8210156134bd5760d15460d0549350935050506134c3565b90925090505b9091565b600054610100900460ff16806134e057506134e0613154565b806134ee575060005460ff16155b6135295760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156132c2576000805460ff1961ff0019909116610100171660011790558015612459576000805461ff001916905550565b600054610100900460ff16806135805750613580613154565b8061358e575060005460ff16155b6135c95760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156135f4576000805460ff1961ff0019909116610100171660011790555b8251613607906068906020860190613738565b50815161361b906069906020850190613738565b50606a805460ff191660121790558015610f4f576000805461ff0019169055505050565b600054610100900460ff16806136585750613658613154565b80613666575060005460ff16155b6136a15760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156136cc576000805460ff1961ff0019909116610100171660011790555b60006136d6612f1b565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612459576000805461ff001916905550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377957805160ff19168380011785556137a6565b828001600101855582156137a6579182015b828111156137a657825182559160200191906001019061378b565b506130bc929150613867565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106137eb57805485556137a6565b828001600101855582156137a657600052602060002091601f016020900482015b828111156137a657825482559160010191906001019061380c565b50805460018160011615610100020316600290046000825580601f1061384d5750612459565b601f01602090049060005260206000209081019061245991905b5b808211156130bc576000815560010161386856fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373696e646578206d75737420626520696e2072616e6765206f662073746f726564207478206c697374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e7345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200e224a80089863c6376bfe0a8e07570cd0cfc7329fafc32f6ef6355ed2525abf64736f6c634300060c0033

Deployed Bytecode

0x60806040526004361061026b5760003560e01c8063596fa9e31161014457806395d89b41116100b6578063cba0e9961161007a578063cba0e99614610a6c578063dd62ed3e14610a9f578063e46adf6214610ada578063f2cc0c1814610b0d578063f2fde38b14610b40578063f84354f114610b7357610386565b806395d89b41146108f857806397d0677b1461090d5780639ace38c21461093f578063a457c2d7146109fa578063a9059cbb14610a3357610386565b8063715018a611610108578063715018a61461087a5780637d4497891461088f5780638129fc1c146108a45780638bdb2afa146108b95780638da5cb5b146108ce57806391d4ec18146108e357610386565b8063596fa9e3146107b55780635c31a713146107ca57806365cccc80146108005780636e9dde991461081557806370a082311461084757610386565b806323b872dd116101dd578063313ce567116101a1578063313ce567146106cc578063380d831b146106f7578063395093511461070c5780633aa8d4be14610745578063456e0a5d1461077657806346c3bd1f1461078b57610386565b806323b872dd146106205780632ae427dc146106635780632bc1281e146106785780632d7da5a41461068d578063303bb0b6146106a257610386565b8063126e19be1161022f578063126e19be146104ca57806313114a9d1461058d57806314f43f7e146105a257806316007d29146105cc57806318160ddd146105e15780631f36d925146105f657610386565b8063030ba6bf1461038b57806306fdde03146103a257806308d1dd8a1461042c578063095ea7b3146104535780630ab114f9146104a057610386565b366103865760db5460ff16156102b8576040805162461bcd60e51b815260206004820152600d60248201526c141c9954d85b1948115b991959609a1b604482015290519081900360640190fd5b3460da5410156102fa576040805162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b604482015290519081900360640190fd5b6000610304610ba6565b90506001600160a01b0381166108fc61031e346003610bb5565b6040518115909202916000818181858888f19350505050158015610346573d6000803e3d6000fd5b5060da546103549034610c00565b60da5560dc546000906103759061036f34633b9aca00610bb5565b90610c42565b9050610382303383610c9b565b5050005b600080fd5b34801561039757600080fd5b506103a0610f54565b005b3480156103ae57600080fd5b506103b76114d4565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f15781810151838201526020016103d9565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043857600080fd5b5061044161156a565b60408051918252519081900360200190f35b34801561045f57600080fd5b5061048c6004803603604081101561047657600080fd5b506001600160a01b038135169060200135611570565b604080519115158252519081900360200190f35b3480156104ac57600080fd5b50610441600480360360208110156104c357600080fd5b503561158d565b3480156104d657600080fd5b506103a0600480360360408110156104ed57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561051857600080fd5b82018360208201111561052a57600080fd5b8035906020019184600183028401116401000000008311171561054c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a2e945050505050565b34801561059957600080fd5b50610441611b4f565b3480156105ae57600080fd5b506103a0600480360360208110156105c557600080fd5b5035611b55565b3480156105d857600080fd5b50610441611c30565b3480156105ed57600080fd5b50610441611c36565b34801561060257600080fd5b506103a06004803603602081101561061957600080fd5b5035611c3c565b34801561062c57600080fd5b5061048c6004803603606081101561064357600080fd5b506001600160a01b03813581169160208101359091169060400135611c99565b34801561066f57600080fd5b50610441611d20565b34801561068457600080fd5b50610441611d26565b34801561069957600080fd5b50610441611d2c565b3480156106ae57600080fd5b50610441600480360360208110156106c557600080fd5b5035611d32565b3480156106d857600080fd5b506106e1611d92565b6040805160ff9092168252519081900360200190f35b34801561070357600080fd5b5061048c611d9b565b34801561071857600080fd5b5061048c6004803603604081101561072f57600080fd5b506001600160a01b038135169060200135611da4565b34801561075157600080fd5b5061075a611df2565b604080516001600160a01b039092168252519081900360200190f35b34801561078257600080fd5b50610441611e01565b34801561079757600080fd5b506103a0600480360360208110156107ae57600080fd5b5035611e07565b3480156107c157600080fd5b5061075a611f9f565b3480156107d657600080fd5b506103a0600480360360608110156107ed57600080fd5b5080359060208101359060400135611fae565b34801561080c57600080fd5b5061044161206d565b34801561082157600080fd5b506103a06004803603604081101561083857600080fd5b50803590602001351515612073565b34801561085357600080fd5b506104416004803603602081101561086a57600080fd5b50356001600160a01b031661213c565b34801561088657600080fd5b506103a061219e565b34801561089b57600080fd5b50610441612240565b3480156108b057600080fd5b506103a0612246565b3480156108c557600080fd5b5061075a61245c565b3480156108da57600080fd5b5061075a610ba6565b3480156108ef57600080fd5b5061044161246b565b34801561090457600080fd5b506103b7612471565b34801561091957600080fd5b506104416004803603604081101561093057600080fd5b508035906020013515156124d2565b34801561094b57600080fd5b506109696004803603602081101561096257600080fd5b5035612568565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109bd5781810151838201526020016109a5565b50505050905090810190601f1680156109ea5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b348015610a0657600080fd5b5061048c60048036036040811015610a1d57600080fd5b506001600160a01b03813516906020013561262d565b348015610a3f57600080fd5b5061048c60048036036040811015610a5657600080fd5b506001600160a01b038135169060200135612695565b348015610a7857600080fd5b5061048c60048036036020811015610a8f57600080fd5b50356001600160a01b03166126a9565b348015610aab57600080fd5b5061044160048036036040811015610ac257600080fd5b506001600160a01b03813581169160200135166126c7565b348015610ae657600080fd5b506103a060048036036020811015610afd57600080fd5b50356001600160a01b03166126f2565b348015610b1957600080fd5b506103a060048036036020811015610b3057600080fd5b50356001600160a01b031661276c565b348015610b4c57600080fd5b506103a060048036036020811015610b6357600080fd5b50356001600160a01b03166128f2565b348015610b7f57600080fd5b506103a060048036036020811015610b9657600080fd5b50356001600160a01b03166129eb565b6097546001600160a01b031690565b6000610bf783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612bac565b90505b92915050565b6000610bf783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c4e565b600082610c5157506000610bfa565b82820282848281610c5e57fe5b0414610bf75760405162461bcd60e51b81526004018080602001828103825260218152602001806138ed6021913960400191505060405180910390fd5b6001600160a01b038316610ce05760405162461bcd60e51b81526004018080602001828103825260258152602001806139d76025913960400191505060405180910390fd5b60008111610d1f5760405162461bcd60e51b81526004018080602001828103825260298152602001806139566029913960400191505060405180910390fd5b60db5460ff1680610d485750610d33610ba6565b6001600160a01b0316836001600160a01b0316145b80610d5b57506001600160a01b03831630145b610dac576040805162461bcd60e51b815260206004820152601860248201527f7472616e736665722070617573656420666f722073616c650000000000000000604482015290519081900360640190fd5b6001600160a01b038316301480610ddb5750610dc6610ba6565b6001600160a01b0316836001600160a01b0316145b15610df257610ded8383836000612ca8565b610f4f565b6001600160a01b038316600090815260ce602052604090205460ff168015610e3357506001600160a01b038216600090815260ce602052604090205460ff16155b15610e4657610ded83838360d354612df7565b6001600160a01b038316600090815260ce602052604090205460ff16158015610e8757506001600160a01b038216600090815260ce602052604090205460ff165b15610e9a57610ded83838360d354612e97565b6001600160a01b038316600090815260ce602052604090205460ff16158015610edc57506001600160a01b038216600090815260ce602052604090205460ff16155b15610eef57610ded83838360d354612ed9565b6001600160a01b038316600090815260ce602052604090205460ff168015610f2f57506001600160a01b038216600090815260ce602052604090205460ff165b15610f4157610ded8383836000612ca8565b610f4f83838360d354612ed9565b505050565b610f5c612f1b565b6097546001600160a01b03908116911614610fac576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60db5460ff1615610ff5576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b1a5cdd195960921b604482015290519081900360640190fd5b60da54158061100557504260d954105b61104f576040805162461bcd60e51b815260206004820152601660248201527514d85b19481a185cc81b9bdd08195b991959081e595d60521b604482015290519081900360640190fd5b60db805460ff1916600117905561107530611068612f1b565b66071afd498d0000610c9b565b60de5460dd54604080516315ab88c960e31b815290516000936001600160a01b039081169363c9c653969391169163ad5c464891600480820192602092909190829003018186803b1580156110c957600080fd5b505afa1580156110dd573d6000803e3d6000fd5b505050506040513d60208110156110f357600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301523060248301525160448083019260209291908290030181600087803b15801561114257600080fd5b505af1158015611156573d6000803e3d6000fd5b505050506040513d602081101561116c57600080fd5b505160dd54604080516315ab88c960e31b8152905192935083926000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b1580156111b857600080fd5b505afa1580156111cc573d6000803e3d6000fd5b505050506040513d60208110156111e257600080fd5b505160408051630d0e30db60e41b8152905191925047916001600160a01b0384169163d0e30db091849160048082019260009290919082900301818588803b15801561122d57600080fd5b505af1158015611241573d6000803e3d6000fd5b50505050504760001461128d576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8811985a5b1959608a1b604482015290519081900360640190fd5b60da54660886c98b76000090156112d25760dc546112b39061036f84633b9aca00610bb5565b90506000816112c13061213c565b0390506112d030600083610c9b565b505b826001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561132957600080fd5b505af115801561133d573d6000803e3d6000fd5b505050506040513d602081101561135357600080fd5b506113619050308583610c9b565b604080516335313c2160e11b815230600482015290516001600160a01b03861691636a6278429160248083019260209291908290030181600087803b1580156113a957600080fd5b505af11580156113bd573d6000803e3d6000fd5b505050506040513d60208110156113d357600080fd5b5050604080516370a0823160e01b815230600482015290516001600160a01b0386169163a9059cbb91339184916370a0823191602480820192602092909190829003018186803b15801561142657600080fd5b505afa15801561143a573d6000803e3d6000fd5b505050506040513d602081101561145057600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b1580156114a157600080fd5b505af11580156114b5573d6000803e3d6000fd5b505050506040513d60208110156114cb57600080fd5b50505050505050565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115605780601f1061153557610100808354040283529160200191611560565b820191906000526020600020905b81548152906001019060200180831161154357829003601f168201915b5050505050905090565b60d85481565b600061158461157d612f1b565b8484612f1f565b50600192915050565b6000611597610ba6565b6001600160a01b03166115a8612f1b565b6001600160a01b031614806115d7575060d4546001600160a01b03166115cc612f1b565b6001600160a01b0316145b611620576040805162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604482015290519081900360640190fd5b60ca5461162e90600161300b565b60ca55816116775760ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a25060d054611a29565b60006116946000841261168a578361168f565b836000035b613065565b60d0549091506000906116b5906116af84633b9aca00610c42565b90610bb5565b90506000808512156116d6576116cf633b9aca0083610c00565b90506116e7565b6116e4633b9aca008361300b565b90505b60008512156117055760d0546116fd9084610c00565b60d055611716565b60d054611712908461300b565b60d0555b60005b60cf548110156117e857600060cc600060cf848154811061173657fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411156117e0576117a96009600a0a6116af8460cc600060cf878154811061177e57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205490610c42565b60cc600060cf84815481106117ba57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b600101611719565b5060ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a260005b60c954811015611a1f57600060c9828154811061183d57fe5b60009182526020909120600290910201805490915060ff1615611a165780546001808301805460408051602060026101009685161587026000190190941693909304601f81018490048402820184019092528181526000956119059590046001600160a01b03169390929091908301828280156118fb5780601f106118d0576101008083540402835291602001916118fb565b820191906000526020600020905b8154815290600101906020018083116118de57829003601f168201915b50505050506130c0565b905080611a145781546040805185815260208101828152600180870180546002610100938216158402600019019091160494840185905294046001600160a01b0316937f8091ecaaa54ebb82e02d36c2c336528e0fcb9b3430fc1291ac88295032b9c2639388939192906060830190849080156119c35780601f10611998576101008083540402835291602001916119c3565b820191906000526020600020905b8154815290600101906020018083116119a657829003601f168201915b5050935050505060405180910390a26040805162461bcd60e51b8152602060048201526012602482015271151c985b9cd858dd1a5bdb8811985a5b195960721b604482015290519081900360640190fd5b505b50600101611824565b5060d05493505050505b919050565b611a36612f1b565b6097546001600160a01b03908116911614611a86576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6040805160608101825260018082526001600160a01b03808616602080850191825294840186815260c980549485018155600052845160029094027f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2881018054935190941661010002610100600160a81b031995151560ff19909416939093179490941691909117825551805193949193611b48937f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2901929190910190613738565b5050505050565b60d25490565b6000611b5f612f1b565b6001600160a01b038116600090815260ce602052604090205490915060ff1615611bba5760405162461bcd60e51b815260040180806020018281038252602c815260200180613a20602c913960400191505060405180910390fd5b6000611bc88360d3546130e3565b505050506001600160a01b038316600090815260cb6020526040902054909150611bf29082610c00565b6001600160a01b038316600090815260cb602052604090205560d154611c189082610c00565b60d15560d254611c28908461300b565b60d255505050565b60dc5481565b60d05490565b611c44612f1b565b6097546001600160a01b03908116911614611c94576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60d355565b6000611ca6848484610c9b565b611d1684611cb2612f1b565b611d118560405180606001604052806028815260200161390e602891396001600160a01b038a16600090815260cd6020526040812090611cf0612f1b565b6001600160a01b031681526020810191909152604001600020549190612c4e565b612f1f565b5060019392505050565b60d35481565b60d55481565b60d95481565b600060d154821115611d755760405162461bcd60e51b815260040180806020018281038252602a8152602001806139ad602a913960400191505060405180910390fd5b6000611d7f613131565b9050611d8b8382610bb5565b9392505050565b606a5460ff1690565b60db5460ff1681565b6000611584611db1612f1b565b84611d118560cd6000611dc2612f1b565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061300b565b60d4546001600160a01b031681565b60d65481565b611e0f612f1b565b6097546001600160a01b03908116911614611e5f576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60c9548110611eab576040805162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b60c95460001901811015611f5c5760c980546000198101908110611ecb57fe5b906000526020600020906002020160c98281548110611ee657fe5b6000918252602090912082546002928302909101805460ff191660ff9092161515919091178082558354610100600160a81b0319909116610100918290046001600160a01b03168202178255600180850180549394611f589483870194929381161590920260001901909116046137b2565b5050505b60c9805480611f6757fe5b60008281526020812060026000199093019283020180546001600160a81b031916815590611f986001830182613827565b5050905550565b60dd546001600160a01b031681565b611fb6612f1b565b6097546001600160a01b03908116911614612006576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60d8541561205b576040805162461bcd60e51b815260206004820152601960248201527f4c696d6974206368616e676573206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60d59290925560d65560d7554260d855565b60da5481565b61207b612f1b565b6097546001600160a01b039081169116146120cb576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60c954821061210b5760405162461bcd60e51b81526004018080602001828103825260288152602001806138c56028913960400191505060405180910390fd5b8060c9838154811061211957fe5b60009182526020909120600290910201805460ff19169115159190911790555050565b6001600160a01b038116600090815260ce602052604081205460ff161561217c57506001600160a01b038116600090815260cc6020526040902054611a29565b6001600160a01b038216600090815260cb6020526040902054610bfa90611d32565b6121a6612f1b565b6097546001600160a01b039081169116146121f6576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b60d75481565b600054610100900460ff168061225f575061225f613154565b8061226d575060005460ff16155b6122a85760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156122d3576000805460ff1961ff0019909116610100171660011790555b612319604051806040016040528060088152602001670aadcd2ccdee4e8d60c31b815250604051806040016040528060048152602001632aa724a360e11b81525061315a565b612323600961320f565b61232b613225565b661c6bf52634000060d0556507326b47ffff1960d155612349612f1b565b60d480546001600160a01b0319166001600160a01b039290921691909117905561010a60d35560d15430600081815260cb602090815260408083209490945560d05484519081529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a36203f480420160d95560db805460ff19169055682086ac35105260000060da5561177060dc556123f66123f1612f1b565b61276c565b6123ff3061276c565b60dd80546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560de8054909116735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f1790558015612459576000805461ff00191690555b50565b60de546001600160a01b031681565b60c95490565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115605780601f1061153557610100808354040283529160200191611560565b600060d05483111561252b576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b8161254c57600061253e8460d3546130e3565b50929450610bfa9350505050565b600061255a8460d3546130e3565b50919450610bfa9350505050565b60c9818154811061257557fe5b6000918252602091829020600291820201805460018083018054604080516101009483161585026000190190921696909604601f810188900488028201880190965285815260ff84169750919092046001600160a01b031694929390928301828280156126235780601f106125f857610100808354040283529160200191612623565b820191906000526020600020905b81548152906001019060200180831161260657829003601f168201915b5050505050905083565b600061158461263a612f1b565b84611d1185604051806060016040528060258152602001613a4c6025913960cd6000612664612f1b565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612c4e565b60006115846126a2612f1b565b8484610c9b565b6001600160a01b0316600090815260ce602052604090205460ff1690565b6001600160a01b03918216600090815260cd6020908152604080832093909416825291909152205490565b6126fa612f1b565b6097546001600160a01b0390811691161461274a576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b612774612f1b565b6097546001600160a01b039081169116146127c4576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff1615612832576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260cb60205260409020541561288c576001600160a01b038116600090815260cb602052604090205461287290611d32565b6001600160a01b038216600090815260cc60205260409020555b6001600160a01b0316600081815260ce60205260408120805460ff1916600190811790915560cf805491820181559091527facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf290180546001600160a01b0319169091179055565b6128fa612f1b565b6097546001600160a01b0390811691161461294a576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6001600160a01b03811661298f5760405162461bcd60e51b815260040180806020018281038252602681526020018061387d6026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b6129f3612f1b565b6097546001600160a01b03908116911614612a43576040805162461bcd60e51b81526020600482018190526024820152600080516020613936833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff16612ab0576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b60cf54811015612ba857816001600160a01b031660cf8281548110612ad457fe5b6000918252602090912001546001600160a01b03161415612ba05760cf80546000198101908110612b0157fe5b60009182526020909120015460cf80546001600160a01b039092169183908110612b2757fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918416815260cc8252604080822082905560ce90925220805460ff1916905560cf805480612b7957fe5b600082815260209020810160001990810180546001600160a01b0319169055019055612ba8565b600101612ab3565b5050565b60008183612c385760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bfd578181015183820152602001612be5565b50505050905090810190601f168015612c2a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c4457fe5b0495945050505050565b60008184841115612ca05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bfd578181015183820152602001612be5565b505050900390565b6000806000806000612cba87876130e3565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612cea9088610c00565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612d199086610c00565b6001600160a01b03808b16600090815260cb6020908152604080832094909455918b16815260cc9091522054612d4f908361300b565b6001600160a01b038916600090815260cc602090815260408083209390935560cb90522054612d7e908561300b565b6001600160a01b038916600090815260cb6020526040902055612da183826132d6565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b6000806000806000612e0987876130e3565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612e399088610c00565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612e689086610c00565b6001600160a01b03808b16600090815260cb602052604080822093909355908a1681522054612d7e908561300b565b6000806000806000612ea987876130e3565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612d199086610c00565b6000806000806000612eeb87876130e3565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612e689086610c00565b3390565b6001600160a01b038316612f645760405162461bcd60e51b81526004018080602001828103825260248152602001806139fc6024913960400191505060405180910390fd5b6001600160a01b038216612fa95760405162461bcd60e51b81526004018080602001828103825260228152602001806138a36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260cd6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015610bf7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000808212156130bc576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b5090565b6000806040516020840160008286518360008a6187965a03f19695505050505050565b60008060008060008060006130f889896132fa565b915091506000613106613131565b905060008060006131188d8686613328565b919f909e50909c50959a50939850939650505050505050565b600080600061313e613364565b909250905061314d8282610bb5565b9250505090565b303b1590565b600054610100900460ff16806131735750613173613154565b80613181575060005460ff16155b6131bc5760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156131e7576000805460ff1961ff0019909116610100171660011790555b6131ef6134c7565b6131f98383613567565b8015610f4f576000805461ff0019169055505050565b606a805460ff191660ff92909216919091179055565b600054610100900460ff168061323e575061323e613154565b8061324c575060005460ff16155b6132875760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156132b2576000805460ff1961ff0019909116610100171660011790555b6132ba6134c7565b6132c261363f565b8015612459576000805461ff001916905550565b60d1546132e39083610c00565b60d15560d2546132f3908261300b565b60d2555050565b6000808061330e6127106116af8787610c42565b9050600061331c8683610c00565b96919550909350505050565b60008080806133378786610c42565b905060006133458787610c42565b905060006133538383610c00565b929992985090965090945050505050565b60d15460d0546000918291825b60cf54811015613495578260cb600060cf848154811061338d57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806133f257508160cc600060cf84815481106133cb57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156134095760d15460d054945094505050506134c3565b61344960cb600060cf848154811061341d57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490610c00565b925061348b60cc600060cf848154811061345f57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390610c00565b9150600101613371565b5060d05460d1546134a591610bb5565b8210156134bd5760d15460d0549350935050506134c3565b90925090505b9091565b600054610100900460ff16806134e057506134e0613154565b806134ee575060005460ff16155b6135295760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156132c2576000805460ff1961ff0019909116610100171660011790558015612459576000805461ff001916905550565b600054610100900460ff16806135805750613580613154565b8061358e575060005460ff16155b6135c95760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156135f4576000805460ff1961ff0019909116610100171660011790555b8251613607906068906020860190613738565b50815161361b906069906020850190613738565b50606a805460ff191660121790558015610f4f576000805461ff0019169055505050565b600054610100900460ff16806136585750613658613154565b80613666575060005460ff16155b6136a15760405162461bcd60e51b815260040180806020018281038252602e81526020018061397f602e913960400191505060405180910390fd5b600054610100900460ff161580156136cc576000805460ff1961ff0019909116610100171660011790555b60006136d6612f1b565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612459576000805461ff001916905550565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061377957805160ff19168380011785556137a6565b828001600101855582156137a6579182015b828111156137a657825182559160200191906001019061378b565b506130bc929150613867565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106137eb57805485556137a6565b828001600101855582156137a657600052602060002091601f016020900482015b828111156137a657825482559160010191906001019061380c565b50805460018160011615610100020316600290046000825580601f1061384d5750612459565b601f01602090049060005260206000209081019061245991905b5b808211156130bc576000815560010161386856fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373696e646578206d75737420626520696e2072616e6765206f662073746f726564207478206c697374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e7345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200e224a80089863c6376bfe0a8e07570cd0cfc7329fafc32f6ef6355ed2525abf64736f6c634300060c0033

Deployed Bytecode Sourcemap

18827:19276:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21349:7;;;;21348:8;21340:34;;;;;-1:-1:-1;;;21340:34:0;;;;;;;;;;;;-1:-1:-1;;;21340:34:0;;;;;;;;;;;;;;;21408:9;21393:11;;:24;;21385:45;;;;;-1:-1:-1;;;21385:45:0;;;;;;;;;;;;-1:-1:-1;;;21385:45:0;;;;;;;;;;;;;;;21441:22;21482:7;:5;:7::i;:::-;21441:50;-1:-1:-1;;;;;;21502:15:0;;:33;21518:16;:9;21532:1;21518:13;:16::i;:::-;21502:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21560:11:0;;:26;;21576:9;21560:15;:26::i;:::-;21546:11;:40;21645:12;;21597:20;;21620:38;;:20;:9;21634:5;21620:13;:20::i;:::-;:24;;:38::i;:::-;21597:61;;21669:51;21687:4;21694:10;21706:12;21669:9;:51::i;:::-;21302:426;;18827:19276;;;;;21736:1266;;;;;;;;;;;;;:::i;:::-;;7563:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20114:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29178:161;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29178:161:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23741:1761;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23741:1761:0;;:::i;25728:260::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25728:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25728:260:0;;-1:-1:-1;25728:260:0;;-1:-1:-1;;;;;25728:260:0:i;30307:87::-;;;;;;;;;;;;;:::i;30402:390::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30402:390:0;;:::i;20251:27::-;;;;;;;;;;;;;:::i;23629:100::-;;;;;;;;;;;;;:::i;23121:120::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23121:120:0;;:::i;29347:313::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29347:313:0;;;;;;;;;;;;;;;;;:::i;19910:27::-;;;;;;;;;;;;;:::i;19986:35::-;;;;;;;;;;;;;:::i;20153:32::-;;;;;;;;;;;;;:::i;31275:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31275:253:0;;:::i;7749:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20225:19;;;;;;;;;;;;;:::i;29668:227::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29668:227:0;;;;;;;;:::i;19950:23::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;19950:23:0;;;;;;;;;;;;;;20028:31;;;;;;;;;;;;;:::i;26140:325::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26140:325:0;;:::i;20291:41::-;;;;;;;;;;;;;:::i;23253:364::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23253:364:0;;;;;;;;;;;;:::i;20192:26::-;;;;;;;;;;;;;:::i;26647:246::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26647:246:0;;;;;;;;;:::i;28646:198::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28646:198:0;-1:-1:-1;;;;;28646:198:0;;:::i;3427:148::-;;;;;;;;;;;;;:::i;20066:35::-;;;;;;;;;;;;;:::i;20391:903::-;;;;;;;;;;;;;:::i;20339:39::-;;;;;;;;;;;;;:::i;3213:79::-;;;;;;;;;;;;;:::i;27008:137::-;;;;;;;;;;;;;:::i;7654:87::-;;;;;;;;;;;;;:::i;30800:467::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30800:467:0;;;;;;;;;:::i;19234:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19234:33:0;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;19234:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29903:278;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29903:278:0;;;;;;;;:::i;28852:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28852:167:0;;;;;;;;:::i;30189:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30189:110:0;-1:-1:-1;;;;;30189:110:0;;:::i;29027:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29027:143:0;;;;;;;;;;:::i;23014:95::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23014:95:0;-1:-1:-1;;;;;23014:95:0;;:::i;31536:330::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31536:330:0;-1:-1:-1;;;;;31536:330:0;;:::i;3583:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3583:244:0;-1:-1:-1;;;;;3583:244:0;;:::i;31874:476::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31874:476:0;-1:-1:-1;;;;;31874:476:0;;:::i;3213:79::-;3278:6;;-1:-1:-1;;;;;3278:6:0;3213:79;:::o;5383:132::-;5441:7;5468:39;5472:1;5475;5468:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5461:46;;5383:132;;;;;:::o;4777:136::-;4835:7;4862:43;4866:1;4869;4862:43;;;;;;;;;;;;;;;;;:3;:43::i;5125:250::-;5183:7;5207:6;5203:47;;-1:-1:-1;5237:1:0;5230:8;;5203:47;5274:5;;;5278:1;5274;:5;:1;5298:5;;;;;:10;5290:56;;;;-1:-1:-1;;;5290:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32713:1157;-1:-1:-1;;;;;32820:20:0;;32812:70;;;;-1:-1:-1;;;32812:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32910:1;32901:6;:10;32893:64;;;;-1:-1:-1;;;32893:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32976:7;;;;;:28;;;32997:7;:5;:7::i;:::-;-1:-1:-1;;;;;32987:17:0;:6;-1:-1:-1;;;;;32987:17:0;;32976:28;:55;;;-1:-1:-1;;;;;;33008:23:0;;33026:4;33008:23;32976:55;32968:92;;;;;-1:-1:-1;;;32968:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33074:23:0;;33092:4;33074:23;;:44;;;33111:7;:5;:7::i;:::-;-1:-1:-1;;;;;33101:17:0;:6;-1:-1:-1;;;;;33101:17:0;;33074:44;33071:792;;;33135:51;33157:6;33165:9;33176:6;33184:1;33135:21;:51::i;:::-;33071:792;;;-1:-1:-1;;;;;33207:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;33231:22:0;;;;;;:11;:22;;;;;;;;33230:23;33207:46;33204:659;;;33270:62;33292:6;33300:9;33311:6;33319:12;;33270:21;:62::i;33204:659::-;-1:-1:-1;;;;;33355:19:0;;;;;;:11;:19;;;;;;;;33354:20;:46;;;;-1:-1:-1;;;;;;33378:22:0;;;;;;:11;:22;;;;;;;;33354:46;33350:513;;;33421:60;33441:6;33449:9;33460:6;33468:12;;33421:19;:60::i;33350:513::-;-1:-1:-1;;;;;33504:19:0;;;;;;:11;:19;;;;;;;;33503:20;:47;;;;-1:-1:-1;;;;;;33528:22:0;;;;;;:11;:22;;;;;;;;33527:23;33503:47;33499:364;;;33567:58;33585:6;33593:9;33604:6;33612:12;;33567:17;:58::i;33499:364::-;-1:-1:-1;;;;;33647:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;33670:22:0;;;;;;:11;:22;;;;;;;;33647:45;33643:220;;;33709:51;33731:6;33739:9;33750:6;33758:1;33709:21;:51::i;33643:220::-;33793:58;33811:6;33819:9;33830:6;33838:12;;33793:17;:58::i;:::-;32713:1157;;;:::o;21736:1266::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;21798:7:::1;::::0;::::1;;21797:8;21789:35;;;::::0;;-1:-1:-1;;;21789:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21789:35:0;;;;;;;;;;;;;::::1;;21843:11;::::0;:16;;:43:::1;;;21883:3;21863:17;;:23;21843:43;21835:78;;;::::0;;-1:-1:-1;;;21835:78:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;21835:78:0;;;;;;;;;;;;;::::1;;21924:7;:14:::0;;-1:-1:-1;;21924:14:0::1;21934:4;21924:14;::::0;;21949:55:::1;21967:4;21974:12;:10;:12::i;:::-;21988:15;21949:9;:55::i;:::-;22042:14;::::0;22090:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;22090:22:0;;;;22015:24:::1;::::0;-1:-1:-1;;;;;22042:14:0;;::::1;::::0;:25:::1;::::0;22090:15;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22090:22:0;22042:119:::1;::::0;;-1:-1:-1;;;;;;22042:119:0::1;::::0;;;;;;-1:-1:-1;;;;;22042:119:0;;::::1;;::::0;::::1;::::0;22144:4:::1;22042:119:::0;;;;;;;;;;22090:22:::1;::::0;22042:119;;;;;;;-1:-1:-1;22042:119:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22042:119:0;22252:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;22252:22:0;;;;22042:119;;-1:-1:-1;22042:119:0;;22172:19:::1;::::0;-1:-1:-1;;;;;22252:15:0::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;22042:119:::1;::::0;22252:22;;;;;;;:15;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22252:22:0;22337:40:::1;::::0;;-1:-1:-1;;;22337:40:0;;;;22252:22;;-1:-1:-1;22305:21:0::1;::::0;-1:-1:-1;;;;;22337:19:0;::::1;::::0;::::1;::::0;22305:21;;22337:40:::1;::::0;;::::1;::::0;22285:17:::1;::::0;22337:40;;;;;;;;22305:21;22337:19;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;22396:21;22421:1;22396:26;22388:55;;;::::0;;-1:-1:-1;;;22388:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22388:55:0;;;;;;;;;;;;;::::1;;22504:11;::::0;22475:15:::1;::::0;22504:16;22501:240:::1;;22575:12;::::0;22550:38:::1;::::0;:20:::1;:9:::0;22564:5:::1;22550:13;:20::i;:38::-;22537:51;;22603:20;22653:10;22626:24;22644:4;22626:9;:24::i;:::-;:37;22603:60;;22679:50;22697:4;22712:1;22716:12;22679:9;:50::i;:::-;22501:240;;22757:4;-1:-1:-1::0;;;;;22751:20:0::1;;22780:4;22786:9;22751:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;22751:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22807:51:0::1;::::0;-1:-1:-1;22825:4:0::1;22840::::0;22847:10;22807:9:::1;:51::i;:::-;22869:24;::::0;;-1:-1:-1;;;22869:24:0;;22887:4:::1;22869:24;::::0;::::1;::::0;;;-1:-1:-1;;;;;22869:9:0;::::1;::::0;::::1;::::0;:24;;;;;::::1;::::0;;;;;;;;-1:-1:-1;22869:9:0;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;22947:46:0::1;::::0;;-1:-1:-1;;;22947:46:0;;22987:4:::1;22947:46;::::0;::::1;::::0;;;-1:-1:-1;;;;;22904:30:0;::::1;::::0;::::1;::::0;22935:10:::1;::::0;22904:30;;22947:31:::1;::::0;:46;;;;;22869:24:::1;::::0;22947:46;;;;;;;;22904:30;22947:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22947:46:0;22904:90:::1;::::0;;-1:-1:-1;;;;;;22904:90:0::1;::::0;;;;;;-1:-1:-1;;;;;22904:90:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;22947:46:::1;::::0;22904:90;;;;;;;-1:-1:-1;22904:90:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;;;21736:1266:0:o;7563:83::-;7633:5;7626:12;;;;;;;;-1:-1:-1;;7626:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7600:13;;7626:12;;7633:5;;7626:12;;7633:5;7626:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7563:83;:::o;20114:30::-;;;;:::o;29178:161::-;29253:4;29270:39;29279:12;:10;:12::i;:::-;29293:7;29302:6;29270:8;:39::i;:::-;-1:-1:-1;29327:4:0;29178:161;;;;:::o;23741:1761::-;23813:7;23862;:5;:7::i;:::-;-1:-1:-1;;;;;23846:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23846:23:0;;:51;;;-1:-1:-1;23889:8:0;;-1:-1:-1;;;;;23889:8:0;23873:12;:10;:12::i;:::-;-1:-1:-1;;;;;23873:24:0;;23846:51;23838:85;;;;;-1:-1:-1;;;23838:85:0;;;;;;;;;;;;-1:-1:-1;;;23838:85:0;;;;;;;;;;;;;;;23953:6;;:13;;23964:1;23953:10;:13::i;:::-;23944:6;:22;23985:16;23981:119;;24033:6;;24041:12;;24023:31;;;;;;;;;;;;;;;;-1:-1:-1;24076:12:0;;24069:19;;23981:119;24120:20;24143:58;24158:1;24144:11;:15;:44;;24177:11;24144:44;;;24163:11;24162:12;;24144:44;24143:56;:58::i;:::-;24264:12;;24120:81;;-1:-1:-1;24212:12:0;;24227:50;;:32;24120:81;19883:14;24227:16;:32::i;:::-;:36;;:50::i;:::-;24212:65;;24288:18;24345:1;24331:11;:15;24327:155;;;24376:24;19883:14;24395:4;24376:18;:24::i;:::-;24363:37;;24327:155;;;24446:24;19883:14;24465:4;24446:18;:24::i;:::-;24433:37;;24327:155;24520:1;24506:11;:15;24502:171;;;24553:12;;:30;;24570:12;24553:16;:30::i;:::-;24538:12;:45;24502:171;;;24631:12;;:30;;24648:12;24631:16;:30::i;:::-;24616:12;:45;24502:171;24787:9;24782:219;24806:9;:16;24802:20;;24782:219;;;24871:1;24847:7;:21;24855:9;24865:1;24855:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24855:12:0;24847:21;;;;;;;;;;;;;:25;24844:146;;;24917:57;19833:1;19883:2;:14;24917:37;24943:10;24917:7;:21;24925:9;24935:1;24925:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24925:12:0;24917:21;;;;;;;;;;;;;;:25;:37::i;:57::-;24893:7;:21;24901:9;24911:1;24901:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24901:12:0;24893:21;;;;;;;;;;;;:81;24844:146;24824:3;;24782:219;;;-1:-1:-1;25036:6:0;;25044:12;;25026:31;;;;;;;;;;;;;;;;25069:6;25064:399;25085:12;:19;25081:23;;25064:399;;;25126:21;25150:12;25163:1;25150:15;;;;;;;;;;;;;;;;;;;;;25184:9;;25150:15;;-1:-1:-1;25184:9:0;;25180:272;;;25241:13;;;25256:6;;;25228:35;;;;;;;25241:13;25228:35;;;;;;-1:-1:-1;;25228:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25228:35:0;;25241:13;;-1:-1:-1;;;;;25241:13:0;;25228:35;;25256:6;;25228:35;;;25256:6;25228:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:35::i;:::-;25214:49;;25287:6;25282:155;;25341:13;;25323:43;;;;;;;;;;;;25341:13;25359:6;;;25323:43;;;25341:13;25323:43;;;;;;-1:-1:-1;;25323:43:0;;;;;;;;;;;25341:13;;-1:-1:-1;;;;;25341:13:0;;25323:43;;;;25359:6;;25323:43;;;;;25359:6;;25323:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25389:28;;;-1:-1:-1;;;25389:28:0;;;;;;;;;;;;-1:-1:-1;;;25389:28:0;;;;;;;;;;;;;;25282:155;25180:272;;-1:-1:-1;25106:3:0;;25064:399;;;;25482:12;;25475:19;;;;;23741:1761;;;;:::o;25728:260::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;25863:116:::1;::::0;;::::1;::::0;::::1;::::0;;25899:4:::1;25863:116:::0;;;-1:-1:-1;;;;;25863:116:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;25845:12:::1;:135:::0;;;;::::1;::::0;;-1:-1:-1;25845:135:0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;::::1;;;-1:-1:-1::0;;;;;;25845:135:0;::::1;;-1:-1:-1::0;;25845:135:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;25863:116;;25845:135;;::::1;::::0;;;;;;;::::1;::::0;::::1;:::i;:::-;;;;25728:260:::0;;:::o;30307:87::-;30376:10;;30307:87;:::o;30402:390::-;30454:14;30471:12;:10;:12::i;:::-;-1:-1:-1;;;;;30503:19:0;;;;;;:11;:19;;;;;;30454:29;;-1:-1:-1;30503:19:0;;30502:20;30494:77;;;;-1:-1:-1;;;30494:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30583:15;30606:33;30617:7;30626:12;;30606:10;:33::i;:::-;-1:-1:-1;;;;;;;;;30668:15:0;;;;;;:7;:15;;;;;;30582:57;;-1:-1:-1;30668:28:0;;30582:57;30668:19;:28::i;:::-;-1:-1:-1;;;;;30650:15:0;;;;;;:7;:15;;;;;:46;30717:7;;:20;;30729:7;30717:11;:20::i;:::-;30707:7;:30;30761:10;;:23;;30776:7;30761:14;:23::i;:::-;30748:10;:36;-1:-1:-1;;;30402:390:0:o;20251:27::-;;;;:::o;23629:100::-;23709:12;;23629:100;:::o;23121:120::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;23207:12:::1;:26:::0;23121:120::o;29347:313::-;29445:4;29462:36;29472:6;29480:9;29491:6;29462:9;:36::i;:::-;29509:121;29518:6;29526:12;:10;:12::i;:::-;29540:89;29578:6;29540:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29540:19:0;;;;;;:11;:19;;;;;;29560:12;:10;:12::i;:::-;-1:-1:-1;;;;;29540:33:0;;;;;;;;;;;;-1:-1:-1;29540:33:0;;;:89;:37;:89::i;:::-;29509:8;:121::i;:::-;-1:-1:-1;29648:4:0;29347:313;;;;;:::o;19910:27::-;;;;:::o;19986:35::-;;;;:::o;20153:32::-;;;;:::o;31275:253::-;31341:7;31380;;31369;:18;;31361:73;;;;-1:-1:-1;;;31361:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31445:19;31468:10;:8;:10::i;:::-;31445:33;-1:-1:-1;31496:24:0;:7;31445:33;31496:11;:24::i;:::-;31489:31;31275:253;-1:-1:-1;;;31275:253:0:o;7749:83::-;7815:9;;;;7749:83;:::o;20225:19::-;;;;;;:::o;29668:227::-;29765:4;29782:83;29791:12;:10;:12::i;:::-;29805:7;29814:50;29853:10;29814:11;:25;29826:12;:10;:12::i;:::-;-1:-1:-1;;;;;29814:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;29814:25:0;;;:34;;;;;;;;;;;:38;:50::i;19950:23::-;;;-1:-1:-1;;;;;19950:23:0;;:::o;20028:31::-;;;;:::o;26140:325::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;26248:12:::1;:19:::0;26240:27;::::1;26232:59;;;::::0;;-1:-1:-1;;;26232:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26232:59:0;;;;;;;;;;;;;::::1;;26316:12;:19:::0;-1:-1:-1;;26316:23:0;26308:31;::::1;26304:123;;;26378:12;26391:19:::0;;-1:-1:-1;;26391:23:0;;;26378:37;::::1;;;;;;;;;;;;;;;26356:12;26369:5;26356:19;;;;;;;;;::::0;;;::::1;::::0;;;:59;;:19:::1;::::0;;::::1;::::0;;::::1;:59:::0;;-1:-1:-1;;26356:59:0::1;;::::0;;::::1;;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;;;;;26356:59:0;;::::1;;::::0;;;::::1;-1:-1:-1::0;;;;;26356:59:0::1;::::0;::::1;;::::0;;-1:-1:-1;26356:59:0;;::::1;::::0;;:19;;:59:::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;::::1;-1:-1:-1::0;;26356:59:0;;;::::1;;;:::i;:::-;-1:-1:-1::0;;;26304:123:0::1;26439:12;:18;;;;;;;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;26439:18:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;26439:18:0;;;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;26140:325:::0;:::o;20291:41::-;;;-1:-1:-1;;;;;20291:41:0;;:::o;23253:364::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;23379:15:::1;::::0;:20;23371:58:::1;;;::::0;;-1:-1:-1;;;23371:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23450:20;:37:::0;;;;23498:16:::1;:29:::0;23538:20:::1;:37:::0;23606:3:::1;23588:15;:21:::0;23253:364::o;20192:26::-;;;;:::o;26647:246::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;26773:12:::1;:19:::0;26765:27;::::1;26757:80;;;;-1:-1:-1::0;;;26757:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26878:7;26848:12;26861:5;26848:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:37:::0;;-1:-1:-1;;26848:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;26647:246:0:o;28646:198::-;-1:-1:-1;;;;;28736:20:0;;28712:7;28736:20;;;:11;:20;;;;;;;;28732:49;;;-1:-1:-1;;;;;;28765:16:0;;;;;;:7;:16;;;;;;28758:23;;28732:49;-1:-1:-1;;;;;28819:16:0;;;;;;:7;:16;;;;;;28799:37;;:19;:37::i;3427:148::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;3518:6:::1;::::0;3497:40:::1;::::0;3534:1:::1;::::0;-1:-1:-1;;;;;3518:6:0::1;::::0;3497:40:::1;::::0;3534:1;;3497:40:::1;3548:6;:19:::0;;-1:-1:-1;;;;;;3548:19:0::1;::::0;;3427:148::o;20066:35::-;;;;:::o;20391:903::-;1525:12;;;;;;;;:31;;;1541:15;:13;:15::i;:::-;1525:47;;;-1:-1:-1;1561:11:0;;;;1560:12;1525:47;1517:106;;;;-1:-1:-1;;;1517:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:19;1655:12;;;;;;1654:13;1674:83;;;;1703:12;:19;;-1:-1:-1;;;;1703:19:0;;;;;1731:18;1718:4;1731:18;;;1674:83;20466:32:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;20466:32:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;20466:32:0::1;;::::0;:12:::1;:32::i;:::-;20509:31;19833:1;20509:14;:31::i;:::-;20551:16;:14;:16::i;:::-;20603:15;20588:12;:30:::0;-1:-1:-1;;20630:7:0::1;:38:::0;20700:12:::1;:10;:12::i;:::-;20689:8;:23:::0;;-1:-1:-1;;;;;;20689:23:0::1;-1:-1:-1::0;;;;;20689:23:0;;;::::1;::::0;;;::::1;::::0;;20748:3:::1;20733:12;:18:::0;20799:7:::1;::::0;20790:4:::1;-1:-1:-1::0;20774:22:0;;;:7:::1;:22;::::0;;;;;;;:32;;;;20858:12:::1;::::0;20822:49;;;;;;;20790:4;;-1:-1:-1;;20822:49:0::1;::::0;;;;;;;;::::1;20911:6;20904:3;:13;20884:17;:33:::0;20928:7:::1;:15:::0;;-1:-1:-1;;20928:15:0::1;::::0;;20968:9:::1;20954:11;:23:::0;21003:4:::1;20988:12;:19:::0;21028:28:::1;21043:12;:10;:12::i;:::-;21028:14;:28::i;:::-;21067:29;21090:4;21067:14;:29::i;:::-;21117:15;:80:::0;;-1:-1:-1;;;;;;21117:80:0;;::::1;21154:42;21117:80;::::0;;;21208:14:::1;:78:::0;;;;::::1;21243:42;21208:78;::::0;;1775:57;;;;1819:5;1804:20;;-1:-1:-1;;1804:20:0;;;1775:57;20391:903;:::o;20339:39::-;;;-1:-1:-1;;;;;20339:39:0;;:::o;27008:137::-;27118:12;:19;27008:137;:::o;7654:87::-;7726:7;7719:14;;;;;;;;-1:-1:-1;;7719:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7693:13;;7719:14;;7726:7;;7719:14;;7726:7;7719:14;;;;;;;;;;;;;;;;;;;;;;;;30800:467;30890:7;30929:12;;30918:7;:23;;30910:67;;;;;-1:-1:-1;;;30910:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30993:17;30988:272;;31028:15;31051:33;31062:7;31071:12;;31051:10;:33::i;:::-;-1:-1:-1;31027:57:0;;-1:-1:-1;31099:14:0;;-1:-1:-1;;;;31099:14:0;30988:272;31148:23;31178:33;31189:7;31198:12;;31178:10;:33::i;:::-;-1:-1:-1;31146:65:0;;-1:-1:-1;31226:22:0;;-1:-1:-1;;;;31226:22:0;19234:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19234:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19234:33:0;;;;-1:-1:-1;;;;;19234:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29903:278::-;30005:4;30022:129;30031:12;:10;:12::i;:::-;30045:7;30054:96;30093:15;30054:96;;;;;;;;;;;;;;;;;:11;:25;30066:12;:10;:12::i;:::-;-1:-1:-1;;;;;30054:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;30054:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;28852:167::-;28930:4;28947:42;28957:12;:10;:12::i;:::-;28971:9;28982:6;28947:9;:42::i;30189:110::-;-1:-1:-1;;;;;30271:20:0;30247:4;30271:20;;;:11;:20;;;;;;;;;30189:110::o;29027:143::-;-1:-1:-1;;;;;29135:18:0;;;29108:7;29135:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;29027:143::o;23014:95::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;23083:8:::1;:18:::0;;-1:-1:-1;;;;;;23083:18:0::1;-1:-1:-1::0;;;;;23083:18:0;;;::::1;::::0;;;::::1;::::0;;23014:95::o;31536:330::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31616:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;31615:21;31607:61;;;::::0;;-1:-1:-1;;;31607:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;31682:16:0;::::1;31701:1;31682:16:::0;;;:7:::1;:16;::::0;;;;;:20;31679:108:::1;;-1:-1:-1::0;;;;;31758:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;31738:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;31719:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;31679:108:::1;-1:-1:-1::0;;;;;31797:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;31797:27:0::1;31820:4;31797:27:::0;;::::1;::::0;;;31835:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;31835:23:0::1;::::0;;::::1;::::0;;31536:330::o;3583:244::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3672:22:0;::::1;3664:73;;;;-1:-1:-1::0;;;3664:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3774:6;::::0;3753:38:::1;::::0;-1:-1:-1;;;;;3753:38:0;;::::1;::::0;3774:6:::1;::::0;3753:38:::1;::::0;3774:6:::1;::::0;3753:38:::1;3802:6;:17:::0;;-1:-1:-1;;;;;;3802:17:0::1;-1:-1:-1::0;;;;;3802:17:0;;;::::1;::::0;;;::::1;::::0;;3583:244::o;31874:476::-;3350:12;:10;:12::i;:::-;3340:6;;-1:-1:-1;;;;;3340:6:0;;;:22;;;3332:67;;;;;-1:-1:-1;;;3332:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3332:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31953:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;31945:60;;;::::0;;-1:-1:-1;;;31945:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32021:9;32016:327;32040:9;:16:::0;32036:20;::::1;32016:327;;;32098:7;-1:-1:-1::0;;;;;32082:23:0::1;:9;32092:1;32082:12;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;32082:12:0::1;:23;32078:254;;;32141:9;32151:16:::0;;-1:-1:-1;;32151:20:0;;;32141:31;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;32126:9:::1;:12:::0;;-1:-1:-1;;;;;32141:31:0;;::::1;::::0;32136:1;;32126:12;::::1;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;32126:46:0::1;-1:-1:-1::0;;;;;32126:46:0;;::::1;;::::0;;32191:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;32230:11:::1;:20:::0;;;;:28;;-1:-1:-1;;32230:28:0::1;::::0;;32277:9:::1;:15:::0;;;::::1;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;32277:15:0;;;;;-1:-1:-1;;;;;;32277:15:0::1;::::0;;;;;32311:5:::1;;32078:254;32058:3;;32016:327;;;;31874:476:::0;:::o;5523:189::-;5609:7;5644:12;5637:5;5629:28;;;;-1:-1:-1;;;5629:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5668:9;5684:1;5680;:5;;;;;;;5523:189;-1:-1:-1;;;;;5523:189:0:o;4921:192::-;5007:7;5043:12;5035:6;;;;5027:29;;;;-1:-1:-1;;;5027:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5079:5:0;;;4921:192::o;35500:619::-;35624:15;35641:23;35666:12;35680:23;35705:12;35721:32;35732:7;35741:11;35721:10;:32::i;:::-;-1:-1:-1;;;;;35782:15:0;;;;;;:7;:15;;;;;;35623:130;;-1:-1:-1;35623:130:0;;-1:-1:-1;35623:130:0;;-1:-1:-1;35623:130:0;-1:-1:-1;35623:130:0;-1:-1:-1;35782:28:0;;35802:7;35782:19;:28::i;:::-;-1:-1:-1;;;;;35764:15:0;;;;;;:7;:15;;;;;;;;:46;;;;35839:7;:15;;;;:28;;35859:7;35839:19;:28::i;:::-;-1:-1:-1;;;;;35821:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;35899:18;;;;;:7;:18;;;;;:39;;35922:15;35899:22;:39::i;:::-;-1:-1:-1;;;;;35878:18:0;;;;;;:7;:18;;;;;;;;:60;;;;35970:7;:18;;;;:39;;35993:15;35970:22;:39::i;:::-;-1:-1:-1;;;;;35949:18:0;;;;;;:7;:18;;;;;:60;36028:23;36040:4;36046;36028:11;:23::i;:::-;36084:9;-1:-1:-1;;;;;36067:44:0;36076:6;-1:-1:-1;;;;;36067:44:0;;36095:15;36067:44;;;;;;;;;;;;;;;;;;35500:619;;;;;;;;;:::o;34949:543::-;35073:15;35090:23;35115:12;35129:23;35154:12;35170:32;35181:7;35190:11;35170:10;:32::i;:::-;-1:-1:-1;;;;;35231:15:0;;;;;;:7;:15;;;;;;35072:130;;-1:-1:-1;35072:130:0;;-1:-1:-1;35072:130:0;;-1:-1:-1;35072:130:0;-1:-1:-1;35072:130:0;-1:-1:-1;35231:28:0;;35251:7;35231:19;:28::i;:::-;-1:-1:-1;;;;;35213:15:0;;;;;;:7;:15;;;;;;;;:46;;;;35288:7;:15;;;;:28;;35308:7;35288:19;:28::i;:::-;-1:-1:-1;;;;;35270:15:0;;;;;;;:7;:15;;;;;;:46;;;;35348:18;;;;;;;:39;;35371:15;35348:22;:39::i;34378:563::-;34500:15;34517:23;34542:12;34556:23;34581:12;34597:32;34608:7;34617:11;34597:10;:32::i;:::-;-1:-1:-1;;;;;34658:15:0;;;;;;:7;:15;;;;;;34499:130;;-1:-1:-1;34499:130:0;;-1:-1:-1;34499:130:0;;-1:-1:-1;34499:130:0;-1:-1:-1;34499:130:0;-1:-1:-1;34658:28:0;;34499:130;34658:19;:28::i;33884:486::-;34004:15;34021:23;34046:12;34060:23;34085:12;34101:32;34112:7;34121:11;34101:10;:32::i;:::-;-1:-1:-1;;;;;34162:15:0;;;;;;:7;:15;;;;;;34003:130;;-1:-1:-1;34003:130:0;;-1:-1:-1;34003:130:0;;-1:-1:-1;34003:130:0;-1:-1:-1;34003:130:0;-1:-1:-1;34162:28:0;;34003:130;34162:19;:28::i;2287:106::-;2375:10;2287:106;:::o;32358:347::-;-1:-1:-1;;;;;32461:19:0;;32453:68;;;;-1:-1:-1;;;32453:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32540:21:0;;32532:68;;;;-1:-1:-1;;;32532:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32613:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;32665:32;;;;;;;;;;;;;;;;;32358:347;;;:::o;4588:181::-;4646:7;4678:5;;;4702:6;;;;4694:46;;;;;-1:-1:-1;;;4694:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1027:171;1083:7;1120:1;1111:5;:10;;1103:55;;;;;-1:-1:-1;;;1103:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1184:5:0;1027:171::o;27388:1250::-;27486:4;27508:11;27748:4;27742:11;27876:2;27870:4;27866:13;28523:1;28491:13;28399:4;28393:11;28363;28318:1;28288:11;28259:5;28252;28248:17;27905:691;27895:701;27388:1250;-1:-1:-1;;;;;;27388:1250:0:o;36282:445::-;36362:7;36371;36380;36389;36398;36419:23;36444:12;36460:33;36472:7;36481:11;36460;:33::i;:::-;36418:75;;;;36504:19;36527:10;:8;:10::i;:::-;36504:33;;36549:15;36566:23;36591:12;36607:39;36619:7;36628:4;36634:11;36607;:39::i;:::-;36548:98;;;;-1:-1:-1;36548:98:0;;-1:-1:-1;36697:15:0;;-1:-1:-1;36714:4:0;;-1:-1:-1;36282:445:0;;-1:-1:-1;;;;;;;36282:445:0:o;37348:163::-;37389:7;37410:15;37427;37446:19;:17;:19::i;:::-;37409:56;;-1:-1:-1;37409:56:0;-1:-1:-1;37483:20:0;37409:56;;37483:11;:20::i;:::-;37476:27;;;;37348:163;:::o;1843:174::-;1926:4;1972:17;2004:7;1843:174;:::o;7186:177::-;1525:12;;;;;;;;:31;;;1541:15;:13;:15::i;:::-;1525:47;;;-1:-1:-1;1561:11:0;;;;1560:12;1525:47;1517:106;;;;-1:-1:-1;;;1517:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:19;1655:12;;;;;;1654:13;1674:83;;;;1703:12;:19;;-1:-1:-1;;;;1703:19:0;;;;;1731:18;1718:4;1731:18;;;1674:83;7282:26:::1;:24;:26::i;:::-;7319:36;7342:4;7348:6;7319:22;:36::i;:::-;1779:14:::0;1775:57;;;1819:5;1804:20;;-1:-1:-1;;1804:20:0;;;7186:177;;;:::o;10351:90::-;10412:9;:21;;-1:-1:-1;;10412:21:0;;;;;;;;;;;;10351:90::o;2870:129::-;1525:12;;;;;;;;:31;;;1541:15;:13;:15::i;:::-;1525:47;;;-1:-1:-1;1561:11:0;;;;1560:12;1525:47;1517:106;;;;-1:-1:-1;;;1517:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:19;1655:12;;;;;;1654:13;1674:83;;;;1703:12;:19;;-1:-1:-1;;;;1703:19:0;;;;;1731:18;1718:4;1731:18;;;1674:83;2928:26:::1;:24;:26::i;:::-;2965;:24;:26::i;:::-;1779:14:::0;1775:57;;;1819:5;1804:20;;-1:-1:-1;;1804:20:0;;;2870:129;:::o;36127:147::-;36205:7;;:17;;36217:4;36205:11;:17::i;:::-;36195:7;:27;36246:10;;:20;;36261:4;36246:14;:20::i;:::-;36233:10;:33;-1:-1:-1;;36127:147:0:o;36735:263::-;36816:7;;;36860:35;36889:5;36860:24;:7;36872:11;36860;:24::i;:35::-;36845:50;-1:-1:-1;36906:23:0;36932:17;:7;36845:50;36932:11;:17::i;:::-;36906:43;36985:4;;-1:-1:-1;36735:263:0;;-1:-1:-1;;;;36735:263:0:o;37006:334::-;37101:7;;;;37157:24;:7;37169:11;37157;:24::i;:::-;37139:42;-1:-1:-1;37192:12:0;37207:21;:4;37216:11;37207:8;:21::i;:::-;37192:36;-1:-1:-1;37239:23:0;37265:17;:7;37192:36;37265:11;:17::i;:::-;37301:7;;;;-1:-1:-1;37327:4:0;;-1:-1:-1;37006:334:0;;-1:-1:-1;;;;;37006:334:0:o;37519:581::-;37616:7;;37652:12;;37569:7;;;;;37681:294;37705:9;:16;37701:20;;37681:294;;;37771:7;37747;:21;37755:9;37765:1;37755:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37755:12:0;37747:21;;;;;;;;;;;;;:31;;:66;;;37806:7;37782;:21;37790:9;37800:1;37790:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37790:12:0;37782:21;;;;;;;;;;;;;:31;37747:66;37743:102;;;37823:7;;37832:12;;37815:30;;;;;;;;;37743:102;37870:34;37882:7;:21;37890:9;37900:1;37890:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37890:12:0;37882:21;;;;;;;;;;;;;37870:7;;:11;:34::i;:::-;37860:44;;37929:34;37941:7;:21;37949:9;37959:1;37949:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37949:12:0;37941:21;;;;;;;;;;;;;37929:7;;:11;:34::i;:::-;37919:44;-1:-1:-1;37723:3:0;;37681:294;;;-1:-1:-1;38011:12:0;;37999:7;;:25;;:11;:25::i;:::-;37989:7;:35;37985:71;;;38034:7;;38043:12;;38026:30;;;;;;;;37985:71;38075:7;;-1:-1:-1;38084:7:0;-1:-1:-1;37519:581:0;;;:::o;2214:65::-;1525:12;;;;;;;;:31;;;1541:15;:13;:15::i;:::-;1525:47;;;-1:-1:-1;1561:11:0;;;;1560:12;1525:47;1517:106;;;;-1:-1:-1;;;1517:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:19;1655:12;;;;;;1654:13;1674:83;;;;1703:12;:19;;-1:-1:-1;;;;1703:19:0;;;;;1731:18;1718:4;1731:18;;;1779:14;1775:57;;;1819:5;1804:20;;-1:-1:-1;;1804:20:0;;;2214:65;:::o;7371:184::-;1525:12;;;;;;;;:31;;;1541:15;:13;:15::i;:::-;1525:47;;;-1:-1:-1;1561:11:0;;;;1560:12;1525:47;1517:106;;;;-1:-1:-1;;;1517:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:19;1655:12;;;;;;1654:13;1674:83;;;;1703:12;:19;;-1:-1:-1;;;;1703:19:0;;;;;1731:18;1718:4;1731:18;;;1674:83;7481:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7504:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7531:9:0::1;:14:::0;;-1:-1:-1;;7531:14:0::1;7543:2;7531:14;::::0;;1775:57;;;;1819:5;1804:20;;-1:-1:-1;;1804:20:0;;;7371:184;;;:::o;3007:198::-;1525:12;;;;;;;;:31;;;1541:15;:13;:15::i;:::-;1525:47;;;-1:-1:-1;1561:11:0;;;;1560:12;1525:47;1517:106;;;;-1:-1:-1;;;1517:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:19;1655:12;;;;;;1654:13;1674:83;;;;1703:12;:19;;-1:-1:-1;;;;1703:19:0;;;;;1731:18;1718:4;1731:18;;;1674:83;3075:17:::1;3095:12;:10;:12::i;:::-;3118:6;:18:::0;;-1:-1:-1;;;;;;3118:18:0::1;-1:-1:-1::0;;;;;3118:18:0;::::1;::::0;;::::1;::::0;;;3152:43:::1;::::0;3118:18;;-1:-1:-1;3118:18:0;-1:-1:-1;;3152:43:0::1;::::0;-1:-1:-1;;3152:43:0::1;1765:1;1779:14:::0;1775:57;;;1819:5;1804:20;;-1:-1:-1;;1804:20:0;;;3007:198;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://0e224a80089863c6376bfe0a8e07570cd0cfc7329fafc32f6ef6355ed2525abf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.