ETH Price: $3,491.99 (+0.03%)

Token

Shuba Duck (SHUBA)
 

Overview

Max Total Supply

1,000,000,000,000 SHUBA

Holders

181

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.542037735474584467 SHUBA

Value
$0.00
0x0Cc5c125809c13F9a75Bb150Ea162E0A271E4C7f
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:
SHUBA

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-09-15
*/

/**

Website: https://shubaduck.fun/
Twitter: https://twitter.com/ShubaDuckERC
Telegram: https://t.me/ShubaDuckERC

*/


// SPDX-License-Identifier: MIT                                                                               
                                                    
pragma solidity = 0.8.19;

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

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

interface IUniswapV2Pair {
    event Sync(uint112 reserve0, uint112 reserve1);
    function sync() external;
}

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

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

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    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;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    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;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    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);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}



library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


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

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract SHUBA is ERC20, Ownable {

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public devWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;
    
    uint256 public percentForLPBurn = 25; // 25 = .25%
    bool public lpBurnEnabled = false;
    uint256 public lpBurnFrequency = 3600 seconds;
    uint256 public lastLpBurnTime;
    
    uint256 public manualBurnFrequency = 30 minutes;
    uint256 public lastManualLpBurnTime;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    mapping (address => bool) public isBlacklisted;
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
    
    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    constructor() ERC20(unicode"Shuba Duck", unicode"SHUBA") {
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 _buyMarketingFee = 25;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyDevFee = 0;

        uint256 _sellMarketingFee = 35;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellDevFee = 0;
        
        uint256 totalSupply = 1000000000000 * 1e18; 
        
        maxTransactionAmount = totalSupply * 2 / 100; // 
        maxWallet = totalSupply * 2 / 100; //
        swapTokensAtAmount = totalSupply * 5 / 1000; // 

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        
        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        
        marketingWallet = address(owner()); 
        devWallet = address(owner()); // 

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {

  	}

    // once enabled, can never be turned off
    function openTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        lastLpBurnTime = block.timestamp;
    }
    
    // remove limits after token is stable
    function updateandmanagelimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        transferDelayEnabled = false;
        return true;
    }
    
    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    require(newAmount <= 1, "Swap amount cannot be higher than 1% total supply.");
  	    swapTokensAtAmount = totalSupply() * newAmount / 100;
  	    return true;
  	}
    
    function updateMaxTxnAmount(uint256 txNum, uint256 walNum) external onlyOwner {
        require(txNum >= 1, "Cannot set maxTransactionAmount lower than 1%");
        maxTransactionAmount = (totalSupply() * txNum / 100)/1e18;
        require(walNum >= 1, "Cannot set maxWallet lower than 1%");
        maxWallet = (totalSupply() * walNum / 100)/1e18;
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 40, "Must keep fees at 99% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        require(sellTotalFees <= 50, "Must keep fees at 99% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
    }

    function updateandmanagemarketingWallet(address newMarketingWallet) external onlyOwner {
        marketingWallet = newMarketingWallet;
    }
    
    function updateandmanagedevWallet(address newWallet) external onlyOwner {
        devWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function massManageBoughtEarly(address[] calldata wallets, bool flag) external onlyOwner {
        for(uint256 i = 0; i < wallets.length; i++){
        isBlacklisted[wallets[i]] = flag;
        }
    }

    function withdrawETH() external onlyOwner returns(bool){
        (bool success, ) = owner().call{value: address(this).balance}("");
        return success;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(!isBlacklisted[from] && !isBlacklisted[to],"Blacklisted");
    
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(limitsInEffect){
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                if(!tradingActive){
                    require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
                if (transferDelayEnabled){
                    if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                        require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount * sellTotalFees/100;
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount * buyTotalFees/100;
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }
    
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            deadAddress,
            block.timestamp
        );
    }

    function swapBack() public {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForDev;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 20){
          contractBalance = swapTokensAtAmount * 20;
        }
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance - liquidityTokens;
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance - initialETHBalance;
        
        uint256 ethForMarketing = ethBalance * tokensForMarketing/totalTokensToSwap;
        uint256 ethForDev = ethBalance * tokensForDev/totalTokensToSwap;
        
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;
        
        (success,) = address(devWallet).call{value: ethForDev}("");
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }
        
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }

    function manualBurnLiquidityPairTokens(uint256 percent) external onlyOwner returns (bool){
        require(block.timestamp > lastManualLpBurnTime + manualBurnFrequency , "Must wait for cooldown to finish");
        require(percent <= 1000, "May not nuke more than 10% of tokens in LP");
        lastManualLpBurnTime = block.timestamp;
        
        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);
        
        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance * percent/10000;
        
        
        if (amountToBurn > 0){
            super._transfer(uniswapV2Pair, address(0xdead), amountToBurn);
        }
        
        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"manualBurnLiquidityPairTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"massManageBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"txNum","type":"uint256"},{"internalType":"uint256","name":"walNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateandmanagedevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateandmanagelimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateandmanagemarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526019600b55600c805460ff19908116909155610e10600d55610708600f556011805462ffffff19166001908117909155601480549092161790553480156200004b57600080fd5b506040518060400160405280600a8152602001695368756261204475636b60b01b81525060405180604001604052806005815260200164534855424160d81b81525081600390816200009e91906200072c565b506004620000ad82826200072c565b5050506000620000c26200044060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d6200013281600162000444565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200017d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a39190620007f8565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002179190620007f8565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028b9190620007f8565b6001600160a01b031660a0819052620002a690600162000444565b60a0516001600160a01b03166000908152602260205260409020805460ff191660011790556019600080602381806c0c9f2c9cd04674edea400000006064620002f182600262000839565b620002fd919062000853565b60085560646200030f82600262000839565b6200031b919062000853565b600a556103e86200032e82600562000839565b6200033a919062000853565b6009556016879055601786905560188590558462000359878962000876565b62000365919062000876565b601555601a849055601b839055601c8290558162000384848662000876565b62000390919062000876565b601955600554600680546001600160a01b03199081166001600160a01b039093169283179091556007805490911682179055620003cf906001620004be565b620003dc306001620004be565b620003eb61dead6001620004be565b6200040a620004026005546001600160a01b031690565b600162000444565b6200041730600162000444565b6200042661dead600162000444565b62000432338262000533565b50505050505050506200088c565b3390565b6005546001600160a01b03163314620004935760405162461bcd60e51b815260206004820181905260248201526000805160206200360b83398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314620005095760405162461bcd60e51b815260206004820181905260248201526000805160206200360b83398151915260448201526064016200048a565b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b6001600160a01b0382166200058b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200048a565b6002546200059a90826200061c565b6002556001600160a01b038216600090815260208190526040902054620005c290826200061c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b6000806200062b838562000876565b9050838110156200067f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200048a565b90505b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620006b357607f821691505b602082108103620006d457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200061757600081815260208120601f850160051c81016020861015620007035750805b601f850160051c820191505b8181101562000724578281556001016200070f565b505050505050565b81516001600160401b0381111562000748576200074862000688565b62000760816200075984546200069e565b84620006da565b602080601f8311600181146200079857600084156200077f5750858301515b600019600386901b1c1916600185901b17855562000724565b600085815260208120601f198616915b82811015620007c957888601518255948401946001909101908401620007a8565b5085821015620007e85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200080b57600080fd5b81516001600160a01b03811681146200067f57600080fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000682576200068262000823565b6000826200087157634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000682576200068262000823565b60805160a051612d13620008f8600039600081816106210152818161180e015281816118aa015281816118d60152611cc801526000818161049c01528181611c8a01528181612433015281816124ec01528181612528015281816125a201526125ff0152612d136000f3fe6080604052600436106103b15760003560e01c80638ea5220f116101e7578063c17b5b8c1161010d578063e086e5ec116100a0578063f63743421161006f578063f637434214610abe578063f8b45b0514610ad4578063fe575a8714610aea578063fe72b27a14610b1a57600080fd5b8063e086e5ec14610a5d578063e2f4560514610a72578063f11a24d314610a88578063f2fde38b14610a9e57600080fd5b8063d257b34f116100dc578063d257b34f146109c1578063d85ba063146109e1578063da722e21146109f7578063dd62ed3e14610a1757600080fd5b8063c17b5b8c1461095c578063c876d0b91461097c578063c8c8ebe414610996578063c9567bf9146109ac57600080fd5b8063a0d82dc511610185578063b62496f511610154578063b62496f5146108d8578063bac0b0ce14610908578063bbc0c7421461091d578063c02466681461093c57600080fd5b8063a0d82dc51461086c578063a457c2d714610882578063a4c82a00146108a2578063a9059cbb146108b857600080fd5b806395d89b41116101c157806395d89b41146108155780639c3b4fdc1461082a5780639ec22c0e146108405780639fccce321461085657600080fd5b80638ea5220f146107bf57806392136913146107df578063924de9b7146107f557600080fd5b80632e82f1a0116102d75780636ddd17131161026a57806375f0a8741161023957806375f0a8741461074b5780637bce5a041461076b5780638095d564146107815780638da5cb5b146107a157600080fd5b80636ddd1713146106c057806370a08231146106e0578063715018a6146107165780637571336a1461072b57600080fd5b80634a62bb65116102a65780634a62bb65146106435780634fbee1931461065d5780636a486a8e146106955780636ac5eeee146106ab57600080fd5b80632e82f1a0146105b9578063313ce567146105d357806339509351146105ef57806349bd5a5e1461060f57600080fd5b8063184c16c51161034f57806323b872dd1161031e57806323b872dd1461054d57806327c8f8351461056d5780632bf31418146105835780632c3e486c146105a357600080fd5b8063184c16c5146104f5578063199ffc721461050b5780631a8145bb146105215780631f3fed8f1461053757600080fd5b806311a582c31161038b57806311a582c314610448578063130a2c3c1461046a5780631694505e1461048a57806318160ddd146104d657600080fd5b806306fdde03146103bd578063095ea7b3146103e857806310d5de531461041857600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103d2610b3a565b6040516103df9190612786565b60405180910390f35b3480156103f457600080fd5b506104086104033660046127ec565b610bcc565b60405190151581526020016103df565b34801561042457600080fd5b50610408610433366004612818565b60216020526000908152604090205460ff1681565b34801561045457600080fd5b50610468610463366004612835565b610be3565b005b34801561047657600080fd5b50610468610485366004612867565b610d49565b34801561049657600080fd5b506104be7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103df565b3480156104e257600080fd5b506002545b6040519081526020016103df565b34801561050157600080fd5b506104e7600f5481565b34801561051757600080fd5b506104e7600b5481565b34801561052d57600080fd5b506104e7601e5481565b34801561054357600080fd5b506104e7601d5481565b34801561055957600080fd5b506104086105683660046128eb565b610dea565b34801561057957600080fd5b506104be61dead81565b34801561058f57600080fd5b5061046861059e366004612818565b610e53565b3480156105af57600080fd5b506104e7600d5481565b3480156105c557600080fd5b50600c546104089060ff1681565b3480156105df57600080fd5b50604051601281526020016103df565b3480156105fb57600080fd5b5061040861060a3660046127ec565b610e9f565b34801561061b57600080fd5b506104be7f000000000000000000000000000000000000000000000000000000000000000081565b34801561064f57600080fd5b506011546104089060ff1681565b34801561066957600080fd5b50610408610678366004612818565b6001600160a01b0316600090815260208052604090205460ff1690565b3480156106a157600080fd5b506104e760195481565b3480156106b757600080fd5b50610468610ed5565b3480156106cc57600080fd5b506011546104089062010000900460ff1681565b3480156106ec57600080fd5b506104e76106fb366004612818565b6001600160a01b031660009081526020819052604090205490565b34801561072257600080fd5b506104686110cb565b34801561073757600080fd5b5061046861074636600461292c565b61113f565b34801561075757600080fd5b506006546104be906001600160a01b031681565b34801561077757600080fd5b506104e760165481565b34801561078d57600080fd5b5061046861079c366004612961565b611194565b3480156107ad57600080fd5b506005546001600160a01b03166104be565b3480156107cb57600080fd5b506007546104be906001600160a01b031681565b3480156107eb57600080fd5b506104e7601a5481565b34801561080157600080fd5b5061046861081036600461298d565b61123c565b34801561082157600080fd5b506103d2611282565b34801561083657600080fd5b506104e760185481565b34801561084c57600080fd5b506104e760105481565b34801561086257600080fd5b506104e7601f5481565b34801561087857600080fd5b506104e7601c5481565b34801561088e57600080fd5b5061040861089d3660046127ec565b611291565b3480156108ae57600080fd5b506104e7600e5481565b3480156108c457600080fd5b506104086108d33660046127ec565b6112e0565b3480156108e457600080fd5b506104086108f3366004612818565b60226020526000908152604090205460ff1681565b34801561091457600080fd5b506104086112ed565b34801561092957600080fd5b5060115461040890610100900460ff1681565b34801561094857600080fd5b5061046861095736600461292c565b611336565b34801561096857600080fd5b50610468610977366004612961565b61138a565b34801561098857600080fd5b506014546104089060ff1681565b3480156109a257600080fd5b506104e760085481565b3480156109b857600080fd5b5061046861142d565b3480156109cd57600080fd5b506104086109dc3660046129a8565b61146e565b3480156109ed57600080fd5b506104e760155481565b348015610a0357600080fd5b50610468610a12366004612818565b611533565b348015610a2357600080fd5b506104e7610a323660046129c1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a6957600080fd5b5061040861157f565b348015610a7e57600080fd5b506104e760095481565b348015610a9457600080fd5b506104e760175481565b348015610aaa57600080fd5b50610468610ab9366004612818565b611618565b348015610aca57600080fd5b506104e7601b5481565b348015610ae057600080fd5b506104e7600a5481565b348015610af657600080fd5b50610408610b05366004612818565b60136020526000908152604090205460ff1681565b348015610b2657600080fd5b50610408610b353660046129a8565b611703565b606060038054610b49906129fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610b75906129fa565b8015610bc25780601f10610b9757610100808354040283529160200191610bc2565b820191906000526020600020905b815481529060010190602001808311610ba557829003601f168201915b5050505050905090565b6000610bd9338484611955565b5060015b92915050565b6005546001600160a01b03163314610c165760405162461bcd60e51b8152600401610c0d90612a34565b60405180910390fd5b6001821015610c7d5760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526c6c6f776572207468616e20312560981b6064820152608401610c0d565b670de0b6b3a7640000606483610c9260025490565b610c9c9190612a7f565b610ca69190612a96565b610cb09190612a96565b6008556001811015610d0f5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610c0d565b670de0b6b3a7640000606482610d2460025490565b610d2e9190612a7f565b610d389190612a96565b610d429190612a96565b600a555050565b6005546001600160a01b03163314610d735760405162461bcd60e51b8152600401610c0d90612a34565b60005b82811015610de4578160136000868685818110610d9557610d95612ab8565b9050602002016020810190610daa9190612818565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610ddc81612ace565b915050610d76565b50505050565b6000610df7848484611a7a565b610e498433610e4485604051806060016040528060288152602001612c91602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061233c565b611955565b5060019392505050565b6005546001600160a01b03163314610e7d5760405162461bcd60e51b8152600401610c0d90612a34565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610bd9918590610e449086612376565b3060009081526020819052604081205490506000601f54601d54601e54610efc9190612ae7565b610f069190612ae7565b90506000821580610f15575081155b15610f1f57505050565b600954610f2d906014612a7f565b831115610f4557600954610f42906014612a7f565b92505b6000600283601e5486610f589190612a7f565b610f629190612a96565b610f6c9190612a96565b90506000610f7a8286612afa565b905047610f86826123dc565b6000610f928247612afa565b9050600086601d5483610fa59190612a7f565b610faf9190612a96565b9050600087601f5484610fc29190612a7f565b610fcc9190612a96565b9050600081610fdb8486612afa565b610fe59190612afa565b6000601e819055601d819055601f8190556007546040519293506001600160a01b031691849181818185875af1925050503d8060008114611042576040519150601f19603f3d011682016040523d82523d6000602084013e611047565b606091505b5090985050861580159061105b5750600081115b1561106a5761106a878261259c565b6006546040516001600160a01b03909116904790600081818185875af1925050503d80600081146110b7576040519150601f19603f3d011682016040523d82523d6000602084013e6110bc565b606091505b50505050505050505050505050565b6005546001600160a01b031633146110f55760405162461bcd60e51b8152600401610c0d90612a34565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146111695760405162461bcd60e51b8152600401610c0d90612a34565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146111be5760405162461bcd60e51b8152600401610c0d90612a34565b601683905560178290556018819055806111d88385612ae7565b6111e29190612ae7565b6015819055602810156112375760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420393925206f72206c6573730000006044820152606401610c0d565b505050565b6005546001600160a01b031633146112665760405162461bcd60e51b8152600401610c0d90612a34565b60118054911515620100000262ff000019909216919091179055565b606060048054610b49906129fa565b6000610bd93384610e4485604051806060016040528060258152602001612cb9602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061233c565b6000610bd9338484611a7a565b6005546000906001600160a01b0316331461131a5760405162461bcd60e51b8152600401610c0d90612a34565b506011805460ff19908116909155601480549091169055600190565b6005546001600160a01b031633146113605760405162461bcd60e51b8152600401610c0d90612a34565b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b6005546001600160a01b031633146113b45760405162461bcd60e51b8152600401610c0d90612a34565b601a839055601b829055601c819055806113ce8385612ae7565b6113d89190612ae7565b6019819055603210156112375760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420393925206f72206c6573730000006044820152606401610c0d565b6005546001600160a01b031633146114575760405162461bcd60e51b8152600401610c0d90612a34565b6011805462ffff0019166201010017905542600e55565b6005546000906001600160a01b0316331461149b5760405162461bcd60e51b8152600401610c0d90612a34565b60018211156115075760405162461bcd60e51b815260206004820152603260248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201527137101892903a37ba30b61039bab838363c9760711b6064820152608401610c0d565b60648261151360025490565b61151d9190612a7f565b6115279190612a96565b6009555060015b919050565b6005546001600160a01b0316331461155d5760405162461bcd60e51b8152600401610c0d90612a34565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146115ac5760405162461bcd60e51b8152600401610c0d90612a34565b60006115c06005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d806000811461160a576040519150601f19603f3d011682016040523d82523d6000602084013e61160f565b606091505b50909250505090565b6005546001600160a01b031633146116425760405162461bcd60e51b8152600401610c0d90612a34565b6001600160a01b0381166116a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c0d565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146117305760405162461bcd60e51b8152600401610c0d90612a34565b600f546010546117409190612ae7565b421161178e5760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e6973686044820152606401610c0d565b6103e88211156117f35760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b6064820152608401610c0d565b426010556040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482015260009030906370a0823190602401602060405180830381865afa15801561185e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118829190612b0d565b905060006127106118938584612a7f565b61189d9190612a96565b905080156118d2576118d27f000000000000000000000000000000000000000000000000000000000000000061dead8361267d565b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561193257600080fd5b505af1158015611946573d6000803e3d6000fd5b50600198975050505050505050565b6001600160a01b0383166119b75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c0d565b6001600160a01b038216611a185760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c0d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611aa05760405162461bcd60e51b8152600401610c0d90612b26565b6001600160a01b038216611ac65760405162461bcd60e51b8152600401610c0d90612b6b565b6001600160a01b03831660009081526013602052604090205460ff16158015611b0857506001600160a01b03821660009081526013602052604090205460ff16155b611b425760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610c0d565b80600003611b56576112378383600061267d565b60115460ff1615612011576005546001600160a01b03848116911614801590611b8d57506005546001600160a01b03838116911614155b8015611ba157506001600160a01b03821615155b8015611bb857506001600160a01b03821661dead14155b8015611bce5750600554600160a01b900460ff16155b1561201157601154610100900460ff16611c64576001600160a01b038316600090815260208052604090205460ff1680611c1f57506001600160a01b038216600090815260208052604090205460ff165b611c645760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c0d565b60145460ff1615611dab576005546001600160a01b03838116911614801590611cbf57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015611cfd57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15611dab57326000908152601260205260409020544311611d985760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610c0d565b3260009081526012602052604090204390555b6001600160a01b03831660009081526022602052604090205460ff168015611dec57506001600160a01b03821660009081526021602052604090205460ff16155b15611ed057600854811115611e615760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610c0d565b600a546001600160a01b038316600090815260208190526040902054611e879083612ae7565b1115611ecb5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c0d565b612011565b6001600160a01b03821660009081526022602052604090205460ff168015611f1157506001600160a01b03831660009081526021602052604090205460ff16155b15611f8757600854811115611ecb5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610c0d565b6001600160a01b03821660009081526021602052604090205460ff1661201157600a546001600160a01b038316600090815260208190526040902054611fcd9083612ae7565b11156120115760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c0d565b306000908152602081905260409020546009548110801590819061203d575060115462010000900460ff165b80156120535750600554600160a01b900460ff16155b801561207857506001600160a01b03851660009081526022602052604090205460ff16155b801561209c57506001600160a01b038516600090815260208052604090205460ff16155b80156120c057506001600160a01b038416600090815260208052604090205460ff16155b156120ee576005805460ff60a01b1916600160a01b1790556120e0610ed5565b6005805460ff60a01b191690555b6005546001600160a01b038616600090815260208052604090205460ff600160a01b90920482161591168061213a57506001600160a01b038516600090815260208052604090205460ff165b15612143575060005b60008115612328576001600160a01b03861660009081526022602052604090205460ff16801561217557506000601954115b1561222d5760646019548661218a9190612a7f565b6121949190612a96565b9050601954601b54826121a79190612a7f565b6121b19190612a96565b601e60008282546121c29190612ae7565b9091555050601954601c546121d79083612a7f565b6121e19190612a96565b601f60008282546121f29190612ae7565b9091555050601954601a546122079083612a7f565b6122119190612a96565b601d60008282546122229190612ae7565b9091555061230a9050565b6001600160a01b03871660009081526022602052604090205460ff16801561225757506000601554115b1561230a5760646015548661226c9190612a7f565b6122769190612a96565b9050601554601754826122899190612a7f565b6122939190612a96565b601e60008282546122a49190612ae7565b90915550506015546018546122b99083612a7f565b6122c39190612a96565b601f60008282546122d49190612ae7565b90915550506015546016546122e99083612a7f565b6122f39190612a96565b601d60008282546123049190612ae7565b90915550505b801561231b5761231b87308361267d565b6123258186612afa565b94505b61233387878761267d565b50505050505050565b600081848411156123605760405162461bcd60e51b8152600401610c0d9190612786565b50600061236d8486612afa565b95945050505050565b6000806123838385612ae7565b9050838110156123d55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c0d565b9392505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061241157612411612ab8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561248f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b39190612bae565b816001815181106124c6576124c6612ab8565b60200260200101906001600160a01b031690816001600160a01b031681525050612511307f000000000000000000000000000000000000000000000000000000000000000084611955565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612566908590600090869030904290600401612bcb565b600060405180830381600087803b15801561258057600080fd5b505af1158015612594573d6000803e3d6000fd5b505050505050565b6125c7307f000000000000000000000000000000000000000000000000000000000000000084611955565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612651573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126769190612c3c565b5050505050565b6001600160a01b0383166126a35760405162461bcd60e51b8152600401610c0d90612b26565b6001600160a01b0382166126c95760405162461bcd60e51b8152600401610c0d90612b6b565b61270681604051806060016040528060268152602001612c6b602691396001600160a01b038616600090815260208190526040902054919061233c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546127359082612376565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611a6d565b600060208083528351808285015260005b818110156127b357858101830151858201604001528201612797565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146127e957600080fd5b50565b600080604083850312156127ff57600080fd5b823561280a816127d4565b946020939093013593505050565b60006020828403121561282a57600080fd5b81356123d5816127d4565b6000806040838503121561284857600080fd5b50508035926020909101359150565b8035801515811461152e57600080fd5b60008060006040848603121561287c57600080fd5b833567ffffffffffffffff8082111561289457600080fd5b818601915086601f8301126128a857600080fd5b8135818111156128b757600080fd5b8760208260051b85010111156128cc57600080fd5b6020928301955093506128e29186019050612857565b90509250925092565b60008060006060848603121561290057600080fd5b833561290b816127d4565b9250602084013561291b816127d4565b929592945050506040919091013590565b6000806040838503121561293f57600080fd5b823561294a816127d4565b915061295860208401612857565b90509250929050565b60008060006060848603121561297657600080fd5b505081359360208301359350604090920135919050565b60006020828403121561299f57600080fd5b6123d582612857565b6000602082840312156129ba57600080fd5b5035919050565b600080604083850312156129d457600080fd5b82356129df816127d4565b915060208301356129ef816127d4565b809150509250929050565b600181811c90821680612a0e57607f821691505b602082108103612a2e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610bdd57610bdd612a69565b600082612ab357634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201612ae057612ae0612a69565b5060010190565b80820180821115610bdd57610bdd612a69565b81810381811115610bdd57610bdd612a69565b600060208284031215612b1f57600080fd5b5051919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060208284031215612bc057600080fd5b81516123d5816127d4565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612c1b5784516001600160a01b031683529383019391830191600101612bf6565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612c5157600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122047a76bdfa44b6783d6216b12601d9aa6201d864f633d98ce7441db01f2a96cfb64736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106103b15760003560e01c80638ea5220f116101e7578063c17b5b8c1161010d578063e086e5ec116100a0578063f63743421161006f578063f637434214610abe578063f8b45b0514610ad4578063fe575a8714610aea578063fe72b27a14610b1a57600080fd5b8063e086e5ec14610a5d578063e2f4560514610a72578063f11a24d314610a88578063f2fde38b14610a9e57600080fd5b8063d257b34f116100dc578063d257b34f146109c1578063d85ba063146109e1578063da722e21146109f7578063dd62ed3e14610a1757600080fd5b8063c17b5b8c1461095c578063c876d0b91461097c578063c8c8ebe414610996578063c9567bf9146109ac57600080fd5b8063a0d82dc511610185578063b62496f511610154578063b62496f5146108d8578063bac0b0ce14610908578063bbc0c7421461091d578063c02466681461093c57600080fd5b8063a0d82dc51461086c578063a457c2d714610882578063a4c82a00146108a2578063a9059cbb146108b857600080fd5b806395d89b41116101c157806395d89b41146108155780639c3b4fdc1461082a5780639ec22c0e146108405780639fccce321461085657600080fd5b80638ea5220f146107bf57806392136913146107df578063924de9b7146107f557600080fd5b80632e82f1a0116102d75780636ddd17131161026a57806375f0a8741161023957806375f0a8741461074b5780637bce5a041461076b5780638095d564146107815780638da5cb5b146107a157600080fd5b80636ddd1713146106c057806370a08231146106e0578063715018a6146107165780637571336a1461072b57600080fd5b80634a62bb65116102a65780634a62bb65146106435780634fbee1931461065d5780636a486a8e146106955780636ac5eeee146106ab57600080fd5b80632e82f1a0146105b9578063313ce567146105d357806339509351146105ef57806349bd5a5e1461060f57600080fd5b8063184c16c51161034f57806323b872dd1161031e57806323b872dd1461054d57806327c8f8351461056d5780632bf31418146105835780632c3e486c146105a357600080fd5b8063184c16c5146104f5578063199ffc721461050b5780631a8145bb146105215780631f3fed8f1461053757600080fd5b806311a582c31161038b57806311a582c314610448578063130a2c3c1461046a5780631694505e1461048a57806318160ddd146104d657600080fd5b806306fdde03146103bd578063095ea7b3146103e857806310d5de531461041857600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103d2610b3a565b6040516103df9190612786565b60405180910390f35b3480156103f457600080fd5b506104086104033660046127ec565b610bcc565b60405190151581526020016103df565b34801561042457600080fd5b50610408610433366004612818565b60216020526000908152604090205460ff1681565b34801561045457600080fd5b50610468610463366004612835565b610be3565b005b34801561047657600080fd5b50610468610485366004612867565b610d49565b34801561049657600080fd5b506104be7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016103df565b3480156104e257600080fd5b506002545b6040519081526020016103df565b34801561050157600080fd5b506104e7600f5481565b34801561051757600080fd5b506104e7600b5481565b34801561052d57600080fd5b506104e7601e5481565b34801561054357600080fd5b506104e7601d5481565b34801561055957600080fd5b506104086105683660046128eb565b610dea565b34801561057957600080fd5b506104be61dead81565b34801561058f57600080fd5b5061046861059e366004612818565b610e53565b3480156105af57600080fd5b506104e7600d5481565b3480156105c557600080fd5b50600c546104089060ff1681565b3480156105df57600080fd5b50604051601281526020016103df565b3480156105fb57600080fd5b5061040861060a3660046127ec565b610e9f565b34801561061b57600080fd5b506104be7f000000000000000000000000abde00391ef02b7f8393232baeadf8b9638688db81565b34801561064f57600080fd5b506011546104089060ff1681565b34801561066957600080fd5b50610408610678366004612818565b6001600160a01b0316600090815260208052604090205460ff1690565b3480156106a157600080fd5b506104e760195481565b3480156106b757600080fd5b50610468610ed5565b3480156106cc57600080fd5b506011546104089062010000900460ff1681565b3480156106ec57600080fd5b506104e76106fb366004612818565b6001600160a01b031660009081526020819052604090205490565b34801561072257600080fd5b506104686110cb565b34801561073757600080fd5b5061046861074636600461292c565b61113f565b34801561075757600080fd5b506006546104be906001600160a01b031681565b34801561077757600080fd5b506104e760165481565b34801561078d57600080fd5b5061046861079c366004612961565b611194565b3480156107ad57600080fd5b506005546001600160a01b03166104be565b3480156107cb57600080fd5b506007546104be906001600160a01b031681565b3480156107eb57600080fd5b506104e7601a5481565b34801561080157600080fd5b5061046861081036600461298d565b61123c565b34801561082157600080fd5b506103d2611282565b34801561083657600080fd5b506104e760185481565b34801561084c57600080fd5b506104e760105481565b34801561086257600080fd5b506104e7601f5481565b34801561087857600080fd5b506104e7601c5481565b34801561088e57600080fd5b5061040861089d3660046127ec565b611291565b3480156108ae57600080fd5b506104e7600e5481565b3480156108c457600080fd5b506104086108d33660046127ec565b6112e0565b3480156108e457600080fd5b506104086108f3366004612818565b60226020526000908152604090205460ff1681565b34801561091457600080fd5b506104086112ed565b34801561092957600080fd5b5060115461040890610100900460ff1681565b34801561094857600080fd5b5061046861095736600461292c565b611336565b34801561096857600080fd5b50610468610977366004612961565b61138a565b34801561098857600080fd5b506014546104089060ff1681565b3480156109a257600080fd5b506104e760085481565b3480156109b857600080fd5b5061046861142d565b3480156109cd57600080fd5b506104086109dc3660046129a8565b61146e565b3480156109ed57600080fd5b506104e760155481565b348015610a0357600080fd5b50610468610a12366004612818565b611533565b348015610a2357600080fd5b506104e7610a323660046129c1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a6957600080fd5b5061040861157f565b348015610a7e57600080fd5b506104e760095481565b348015610a9457600080fd5b506104e760175481565b348015610aaa57600080fd5b50610468610ab9366004612818565b611618565b348015610aca57600080fd5b506104e7601b5481565b348015610ae057600080fd5b506104e7600a5481565b348015610af657600080fd5b50610408610b05366004612818565b60136020526000908152604090205460ff1681565b348015610b2657600080fd5b50610408610b353660046129a8565b611703565b606060038054610b49906129fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610b75906129fa565b8015610bc25780601f10610b9757610100808354040283529160200191610bc2565b820191906000526020600020905b815481529060010190602001808311610ba557829003601f168201915b5050505050905090565b6000610bd9338484611955565b5060015b92915050565b6005546001600160a01b03163314610c165760405162461bcd60e51b8152600401610c0d90612a34565b60405180910390fd5b6001821015610c7d5760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526c6c6f776572207468616e20312560981b6064820152608401610c0d565b670de0b6b3a7640000606483610c9260025490565b610c9c9190612a7f565b610ca69190612a96565b610cb09190612a96565b6008556001811015610d0f5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610c0d565b670de0b6b3a7640000606482610d2460025490565b610d2e9190612a7f565b610d389190612a96565b610d429190612a96565b600a555050565b6005546001600160a01b03163314610d735760405162461bcd60e51b8152600401610c0d90612a34565b60005b82811015610de4578160136000868685818110610d9557610d95612ab8565b9050602002016020810190610daa9190612818565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610ddc81612ace565b915050610d76565b50505050565b6000610df7848484611a7a565b610e498433610e4485604051806060016040528060288152602001612c91602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061233c565b611955565b5060019392505050565b6005546001600160a01b03163314610e7d5760405162461bcd60e51b8152600401610c0d90612a34565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610bd9918590610e449086612376565b3060009081526020819052604081205490506000601f54601d54601e54610efc9190612ae7565b610f069190612ae7565b90506000821580610f15575081155b15610f1f57505050565b600954610f2d906014612a7f565b831115610f4557600954610f42906014612a7f565b92505b6000600283601e5486610f589190612a7f565b610f629190612a96565b610f6c9190612a96565b90506000610f7a8286612afa565b905047610f86826123dc565b6000610f928247612afa565b9050600086601d5483610fa59190612a7f565b610faf9190612a96565b9050600087601f5484610fc29190612a7f565b610fcc9190612a96565b9050600081610fdb8486612afa565b610fe59190612afa565b6000601e819055601d819055601f8190556007546040519293506001600160a01b031691849181818185875af1925050503d8060008114611042576040519150601f19603f3d011682016040523d82523d6000602084013e611047565b606091505b5090985050861580159061105b5750600081115b1561106a5761106a878261259c565b6006546040516001600160a01b03909116904790600081818185875af1925050503d80600081146110b7576040519150601f19603f3d011682016040523d82523d6000602084013e6110bc565b606091505b50505050505050505050505050565b6005546001600160a01b031633146110f55760405162461bcd60e51b8152600401610c0d90612a34565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146111695760405162461bcd60e51b8152600401610c0d90612a34565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146111be5760405162461bcd60e51b8152600401610c0d90612a34565b601683905560178290556018819055806111d88385612ae7565b6111e29190612ae7565b6015819055602810156112375760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420393925206f72206c6573730000006044820152606401610c0d565b505050565b6005546001600160a01b031633146112665760405162461bcd60e51b8152600401610c0d90612a34565b60118054911515620100000262ff000019909216919091179055565b606060048054610b49906129fa565b6000610bd93384610e4485604051806060016040528060258152602001612cb9602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061233c565b6000610bd9338484611a7a565b6005546000906001600160a01b0316331461131a5760405162461bcd60e51b8152600401610c0d90612a34565b506011805460ff19908116909155601480549091169055600190565b6005546001600160a01b031633146113605760405162461bcd60e51b8152600401610c0d90612a34565b6001600160a01b039190911660009081526020805260409020805460ff1916911515919091179055565b6005546001600160a01b031633146113b45760405162461bcd60e51b8152600401610c0d90612a34565b601a839055601b829055601c819055806113ce8385612ae7565b6113d89190612ae7565b6019819055603210156112375760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420393925206f72206c6573730000006044820152606401610c0d565b6005546001600160a01b031633146114575760405162461bcd60e51b8152600401610c0d90612a34565b6011805462ffff0019166201010017905542600e55565b6005546000906001600160a01b0316331461149b5760405162461bcd60e51b8152600401610c0d90612a34565b60018211156115075760405162461bcd60e51b815260206004820152603260248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201527137101892903a37ba30b61039bab838363c9760711b6064820152608401610c0d565b60648261151360025490565b61151d9190612a7f565b6115279190612a96565b6009555060015b919050565b6005546001600160a01b0316331461155d5760405162461bcd60e51b8152600401610c0d90612a34565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146115ac5760405162461bcd60e51b8152600401610c0d90612a34565b60006115c06005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d806000811461160a576040519150601f19603f3d011682016040523d82523d6000602084013e61160f565b606091505b50909250505090565b6005546001600160a01b031633146116425760405162461bcd60e51b8152600401610c0d90612a34565b6001600160a01b0381166116a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c0d565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146117305760405162461bcd60e51b8152600401610c0d90612a34565b600f546010546117409190612ae7565b421161178e5760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e6973686044820152606401610c0d565b6103e88211156117f35760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b6064820152608401610c0d565b426010556040516370a0823160e01b81526001600160a01b037f000000000000000000000000abde00391ef02b7f8393232baeadf8b9638688db16600482015260009030906370a0823190602401602060405180830381865afa15801561185e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118829190612b0d565b905060006127106118938584612a7f565b61189d9190612a96565b905080156118d2576118d27f000000000000000000000000abde00391ef02b7f8393232baeadf8b9638688db61dead8361267d565b60007f000000000000000000000000abde00391ef02b7f8393232baeadf8b9638688db9050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561193257600080fd5b505af1158015611946573d6000803e3d6000fd5b50600198975050505050505050565b6001600160a01b0383166119b75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c0d565b6001600160a01b038216611a185760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c0d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611aa05760405162461bcd60e51b8152600401610c0d90612b26565b6001600160a01b038216611ac65760405162461bcd60e51b8152600401610c0d90612b6b565b6001600160a01b03831660009081526013602052604090205460ff16158015611b0857506001600160a01b03821660009081526013602052604090205460ff16155b611b425760405162461bcd60e51b815260206004820152600b60248201526a109b1858dadb1a5cdd195960aa1b6044820152606401610c0d565b80600003611b56576112378383600061267d565b60115460ff1615612011576005546001600160a01b03848116911614801590611b8d57506005546001600160a01b03838116911614155b8015611ba157506001600160a01b03821615155b8015611bb857506001600160a01b03821661dead14155b8015611bce5750600554600160a01b900460ff16155b1561201157601154610100900460ff16611c64576001600160a01b038316600090815260208052604090205460ff1680611c1f57506001600160a01b038216600090815260208052604090205460ff165b611c645760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610c0d565b60145460ff1615611dab576005546001600160a01b03838116911614801590611cbf57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b8015611cfd57507f000000000000000000000000abde00391ef02b7f8393232baeadf8b9638688db6001600160a01b0316826001600160a01b031614155b15611dab57326000908152601260205260409020544311611d985760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610c0d565b3260009081526012602052604090204390555b6001600160a01b03831660009081526022602052604090205460ff168015611dec57506001600160a01b03821660009081526021602052604090205460ff16155b15611ed057600854811115611e615760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610c0d565b600a546001600160a01b038316600090815260208190526040902054611e879083612ae7565b1115611ecb5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c0d565b612011565b6001600160a01b03821660009081526022602052604090205460ff168015611f1157506001600160a01b03831660009081526021602052604090205460ff16155b15611f8757600854811115611ecb5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610c0d565b6001600160a01b03821660009081526021602052604090205460ff1661201157600a546001600160a01b038316600090815260208190526040902054611fcd9083612ae7565b11156120115760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610c0d565b306000908152602081905260409020546009548110801590819061203d575060115462010000900460ff165b80156120535750600554600160a01b900460ff16155b801561207857506001600160a01b03851660009081526022602052604090205460ff16155b801561209c57506001600160a01b038516600090815260208052604090205460ff16155b80156120c057506001600160a01b038416600090815260208052604090205460ff16155b156120ee576005805460ff60a01b1916600160a01b1790556120e0610ed5565b6005805460ff60a01b191690555b6005546001600160a01b038616600090815260208052604090205460ff600160a01b90920482161591168061213a57506001600160a01b038516600090815260208052604090205460ff165b15612143575060005b60008115612328576001600160a01b03861660009081526022602052604090205460ff16801561217557506000601954115b1561222d5760646019548661218a9190612a7f565b6121949190612a96565b9050601954601b54826121a79190612a7f565b6121b19190612a96565b601e60008282546121c29190612ae7565b9091555050601954601c546121d79083612a7f565b6121e19190612a96565b601f60008282546121f29190612ae7565b9091555050601954601a546122079083612a7f565b6122119190612a96565b601d60008282546122229190612ae7565b9091555061230a9050565b6001600160a01b03871660009081526022602052604090205460ff16801561225757506000601554115b1561230a5760646015548661226c9190612a7f565b6122769190612a96565b9050601554601754826122899190612a7f565b6122939190612a96565b601e60008282546122a49190612ae7565b90915550506015546018546122b99083612a7f565b6122c39190612a96565b601f60008282546122d49190612ae7565b90915550506015546016546122e99083612a7f565b6122f39190612a96565b601d60008282546123049190612ae7565b90915550505b801561231b5761231b87308361267d565b6123258186612afa565b94505b61233387878761267d565b50505050505050565b600081848411156123605760405162461bcd60e51b8152600401610c0d9190612786565b50600061236d8486612afa565b95945050505050565b6000806123838385612ae7565b9050838110156123d55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c0d565b9392505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061241157612411612ab8565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561248f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b39190612bae565b816001815181106124c6576124c6612ab8565b60200260200101906001600160a01b031690816001600160a01b031681525050612511307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611955565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612566908590600090869030904290600401612bcb565b600060405180830381600087803b15801561258057600080fd5b505af1158015612594573d6000803e3d6000fd5b505050505050565b6125c7307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611955565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612651573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126769190612c3c565b5050505050565b6001600160a01b0383166126a35760405162461bcd60e51b8152600401610c0d90612b26565b6001600160a01b0382166126c95760405162461bcd60e51b8152600401610c0d90612b6b565b61270681604051806060016040528060268152602001612c6b602691396001600160a01b038616600090815260208190526040902054919061233c565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546127359082612376565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611a6d565b600060208083528351808285015260005b818110156127b357858101830151858201604001528201612797565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146127e957600080fd5b50565b600080604083850312156127ff57600080fd5b823561280a816127d4565b946020939093013593505050565b60006020828403121561282a57600080fd5b81356123d5816127d4565b6000806040838503121561284857600080fd5b50508035926020909101359150565b8035801515811461152e57600080fd5b60008060006040848603121561287c57600080fd5b833567ffffffffffffffff8082111561289457600080fd5b818601915086601f8301126128a857600080fd5b8135818111156128b757600080fd5b8760208260051b85010111156128cc57600080fd5b6020928301955093506128e29186019050612857565b90509250925092565b60008060006060848603121561290057600080fd5b833561290b816127d4565b9250602084013561291b816127d4565b929592945050506040919091013590565b6000806040838503121561293f57600080fd5b823561294a816127d4565b915061295860208401612857565b90509250929050565b60008060006060848603121561297657600080fd5b505081359360208301359350604090920135919050565b60006020828403121561299f57600080fd5b6123d582612857565b6000602082840312156129ba57600080fd5b5035919050565b600080604083850312156129d457600080fd5b82356129df816127d4565b915060208301356129ef816127d4565b809150509250929050565b600181811c90821680612a0e57607f821691505b602082108103612a2e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610bdd57610bdd612a69565b600082612ab357634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201612ae057612ae0612a69565b5060010190565b80820180821115610bdd57610bdd612a69565b81810381811115610bdd57610bdd612a69565b600060208284031215612b1f57600080fd5b5051919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060208284031215612bc057600080fd5b81516123d5816127d4565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612c1b5784516001600160a01b031683529383019391830191600101612bf6565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612c5157600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122047a76bdfa44b6783d6216b12601d9aa6201d864f633d98ce7441db01f2a96cfb64736f6c63430008130033

Deployed Bytecode Sourcemap

22637:15088:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4957:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7124:169;;;;;;;;;;-1:-1:-1;7124:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;7124:169:0;1023:187:1;24282:64:0;;;;;;;;;;-1:-1:-1;24282:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27396:360;;;;;;;;;;-1:-1:-1;27396:360:0;;;;;:::i;:::-;;:::i;:::-;;29573:205;;;;;;;;;;-1:-1:-1;29573:205:0;;;;;:::i;:::-;;:::i;22679:51::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2770:32:1;;;2752:51;;2740:2;2725:18;22679:51:0;2579:230:1;6077:108:0;;;;;;;;;;-1:-1:-1;6165:12:0;;6077:108;;;2960:25:1;;;2948:2;2933:18;6077:108:0;2814:177:1;23257:47:0;;;;;;;;;;;;;;;;23067:36;;;;;;;;;;;;;;;;24093:33;;;;;;;;;;;;;;;;24053;;;;;;;;;;;;;;;;7775:355;;;;;;;;;;-1:-1:-1;7775:355:0;;;;;:::i;:::-;;:::i;22782:53::-;;;;;;;;;;;;22828:6;22782:53;;29166:142;;;;;;;;;;-1:-1:-1;29166:142:0;;;;;:::i;:::-;;:::i;23163:45::-;;;;;;;;;;;;;;;;23123:33;;;;;;;;;;-1:-1:-1;23123:33:0;;;;;;;;5919:93;;;;;;;;;;-1:-1:-1;5919:93:0;;6002:2;3807:36:1;;3795:2;3780:18;5919:93:0;3665:184:1;8539:218:0;;;;;;;;;;-1:-1:-1;8539:218:0;;;;;:::i;:::-;;:::i;22737:38::-;;;;;;;;;;;;;;;23355:33;;;;;;;;;;-1:-1:-1;23355:33:0;;;;;;;;29440:125;;;;;;;;;;-1:-1:-1;29440:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;29529:28:0;29505:4;29529:28;;;:19;:28;;;;;;;;;29440:125;23904:28;;;;;;;;;;;;;;;;35290:1522;;;;;;;;;;;;;:::i;23435:31::-;;;;;;;;;;-1:-1:-1;23435:31:0;;;;;;;;;;;6248:127;;;;;;;;;;-1:-1:-1;6248:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;6349:18:0;6322:7;6349:18;;;;;;;;;;;;6248:127;19422:148;;;;;;;;;;;;;:::i;27764:144::-;;;;;;;;;;-1:-1:-1;27764:144:0;;;;;:::i;:::-;;:::i;22874:30::-;;;;;;;;;;-1:-1:-1;22874:30:0;;;;-1:-1:-1;;;;;22874:30:0;;;23793;;;;;;;;;;;;;;;;28121:369;;;;;;;;;;-1:-1:-1;28121:369:0;;;;;:::i;:::-;;:::i;18780:79::-;;;;;;;;;;-1:-1:-1;18845:6:0;;-1:-1:-1;;;;;18845:6:0;18780:79;;22911:24;;;;;;;;;;-1:-1:-1;22911:24:0;;;;-1:-1:-1;;;;;22911:24:0;;;23939:31;;;;;;;;;;;;;;;;28008:101;;;;;;;;;;-1:-1:-1;28008:101:0;;;;;:::i;:::-;;:::i;5176:104::-;;;;;;;;;;;;;:::i;23867:24::-;;;;;;;;;;;;;;;;23311:35;;;;;;;;;;;;;;;;24133:27;;;;;;;;;;;;;;;;24015:25;;;;;;;;;;;;;;;;9260:269;;;;;;;;;;-1:-1:-1;9260:269:0;;;;;:::i;:::-;;:::i;23215:29::-;;;;;;;;;;;;;;;;6588:175;;;;;;;;;;-1:-1:-1;6588:175:0;;;;;:::i;:::-;;:::i;24504:58::-;;;;;;;;;;-1:-1:-1;24504:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;26879:168;;;;;;;;;;;;;:::i;23395:33::-;;;;;;;;;;-1:-1:-1;23395:33:0;;;;;;;;;;;28888:132;;;;;;;;;;-1:-1:-1;28888:132:0;;;;;:::i;:::-;;:::i;28502:378::-;;;;;;;;;;-1:-1:-1;28502:378:0;;;;;:::i;:::-;;:::i;23711:39::-;;;;;;;;;;-1:-1:-1;23711:39:0;;;;;;;;22948:35;;;;;;;;;;;;;;;;26670:153;;;;;;;;;;;;;:::i;27121:263::-;;;;;;;;;;-1:-1:-1;27121:263:0;;;;;:::i;:::-;;:::i;23759:27::-;;;;;;;;;;;;;;;;29320:112;;;;;;;;;;-1:-1:-1;29320:112:0;;;;;:::i;:::-;;:::i;6826:151::-;;;;;;;;;;-1:-1:-1;6826:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;6942:18:0;;;6915:7;6942:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6826:151;29786:164;;;;;;;;;;;;;:::i;22990:33::-;;;;;;;;;;;;;;;;23830:30;;;;;;;;;;;;;;;;19725:244;;;;;;;;;;-1:-1:-1;19725:244:0;;;;;:::i;:::-;;:::i;23977:31::-;;;;;;;;;;;;;;;;23030:24;;;;;;;;;;;;;;;;23658:46;;;;;;;;;;-1:-1:-1;23658:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;36820:902;;;;;;;;;;-1:-1:-1;36820:902:0;;;;;:::i;:::-;;:::i;4957:100::-;5011:13;5044:5;5037:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4957:100;:::o;7124:169::-;7207:4;7224:39;438:10;7247:7;7256:6;7224:8;:39::i;:::-;-1:-1:-1;7281:4:0;7124:169;;;;;:::o;27396:360::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;;;;;;;;;27502:1:::1;27493:5;:10;;27485:68;;;::::0;-1:-1:-1;;;27485:68:0;;6206:2:1;27485:68:0::1;::::0;::::1;6188:21:1::0;6245:2;6225:18;;;6218:30;6284:34;6264:18;;;6257:62;-1:-1:-1;;;6335:18:1;;;6328:43;6388:19;;27485:68:0::1;6004:409:1::0;27485:68:0::1;27617:4;27612:3;27604:5;27588:13;6165:12:::0;;;6077:108;27588:13:::1;:21;;;;:::i;:::-;:27;;;;:::i;:::-;27587:34;;;;:::i;:::-;27564:20;:57:::0;27650:1:::1;27640:11:::0;::::1;;27632:58;;;::::0;-1:-1:-1;;;27632:58:0;;7147:2:1;27632:58:0::1;::::0;::::1;7129:21:1::0;7186:2;7166:18;;;7159:30;7225:34;7205:18;;;7198:62;-1:-1:-1;;;7276:18:1;;;7269:32;7318:19;;27632:58:0::1;6945:398:1::0;27632:58:0::1;27744:4;27739:3;27730:6;27714:13;6165:12:::0;;;6077:108;27714:13:::1;:22;;;;:::i;:::-;:28;;;;:::i;:::-;27713:35;;;;:::i;:::-;27701:9;:47:::0;-1:-1:-1;;27396:360:0:o;29573:205::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;29677:9:::1;29673:98;29692:18:::0;;::::1;29673:98;;;29755:4;29727:13;:25;29741:7;;29749:1;29741:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29727:25:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;29727:25:0;:32;;-1:-1:-1;;29727:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29712:3;::::1;::::0;::::1;:::i;:::-;;;;29673:98;;;;29573:205:::0;;;:::o;7775:355::-;7915:4;7932:36;7942:6;7950:9;7961:6;7932:9;:36::i;:::-;7979:121;7988:6;438:10;8010:89;8048:6;8010:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8010:19:0;;;;;;:11;:19;;;;;;;;438:10;8010:33;;;;;;;;;;:37;:89::i;:::-;7979:8;:121::i;:::-;-1:-1:-1;8118:4:0;7775:355;;;;;:::o;29166:142::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;29264:15:::1;:36:::0;;-1:-1:-1;;;;;;29264:36:0::1;-1:-1:-1::0;;;;;29264:36:0;;;::::1;::::0;;;::::1;::::0;;29166:142::o;8539:218::-;438:10;8627:4;8676:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8676:34:0;;;;;;;;;;8627:4;;8644:83;;8667:7;;8676:50;;8715:10;8676:38;:50::i;35290:1522::-;35372:4;35328:23;6349:18;;;;;;;;;;;35328:50;;35389:25;35459:12;;35438:18;;35417;;:39;;;;:::i;:::-;:54;;;;:::i;:::-;35389:82;-1:-1:-1;35482:12:0;35518:20;;;:46;;-1:-1:-1;35542:22:0;;35518:46;35515:60;;;35567:7;;;35290:1522::o;35515:60::-;35608:18;;:23;;35629:2;35608:23;:::i;:::-;35590:15;:41;35587:111;;;35663:18;;:23;;35684:2;35663:23;:::i;:::-;35645:41;;35587:111;35767:23;35852:1;35832:17;35811:18;;35793:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;35767:86;-1:-1:-1;35864:26:0;35893:33;35767:86;35893:15;:33;:::i;:::-;35864:62;-1:-1:-1;35975:21:0;36009:36;35864:62;36009:16;:36::i;:::-;36067:18;36088:41;36112:17;36088:21;:41;:::i;:::-;36067:62;;36150:23;36208:17;36189:18;;36176:10;:31;;;;:::i;:::-;:49;;;;:::i;:::-;36150:75;;36236:17;36282;36269:12;;36256:10;:25;;;;:::i;:::-;:43;;;;:::i;:::-;36236:63;-1:-1:-1;36320:23:0;36236:63;36346:28;36359:15;36346:10;:28;:::i;:::-;:40;;;;:::i;:::-;36428:1;36407:18;:22;;;36440:18;:22;;;36473:12;:16;;;36531:9;;36523:45;;36320:66;;-1:-1:-1;;;;;;36531:9:0;;36554;;36523:45;36428:1;36523:45;36554:9;36531;36523:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36510:58:0;;-1:-1:-1;;36592:19:0;;;;;:42;;;36633:1;36615:15;:19;36592:42;36589:119;;;36650:46;36663:15;36680;36650:12;:46::i;:::-;36749:15;;36741:63;;-1:-1:-1;;;;;36749:15:0;;;;36778:21;;36741:63;;;;36778:21;36749:15;36741:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;35290:1522:0:o;19422:148::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;19513:6:::1;::::0;19492:40:::1;::::0;19529:1:::1;::::0;-1:-1:-1;;;;;19513:6:0::1;::::0;19492:40:::1;::::0;19529:1;;19492:40:::1;19543:6;:19:::0;;-1:-1:-1;;;;;;19543:19:0::1;::::0;;19422:148::o;27764:144::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27854:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;27854:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27764:144::o;28121:369::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;28237:15:::1;:31:::0;;;28279:15:::1;:31:::0;;;28321:9:::1;:19:::0;;;28333:7;28366:33:::1;28297:13:::0;28255;28366:33:::1;:::i;:::-;:45;;;;:::i;:::-;28351:12;:60:::0;;;28446:2:::1;-1:-1:-1::0;28430:18:0::1;28422:60;;;::::0;-1:-1:-1;;;28422:60:0;;8295:2:1;28422:60:0::1;::::0;::::1;8277:21:1::0;8334:2;8314:18;;;8307:30;8373:31;8353:18;;;8346:59;8422:18;;28422:60:0::1;8093:353:1::0;28422:60:0::1;28121:369:::0;;;:::o;28008:101::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;28080:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;28080:21:0;;::::1;::::0;;;::::1;::::0;;28008:101::o;5176:104::-;5232:13;5265:7;5258:14;;;;;:::i;9260:269::-;9353:4;9370:129;438:10;9393:7;9402:96;9441:15;9402:96;;;;;;;;;;;;;;;;;438:10;9402:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;9402:34:0;;;;;;;;;;;;:38;:96::i;6588:175::-;6674:4;6691:42;438:10;6715:9;6726:6;6691:9;:42::i;26879:168::-;18992:6;;26940:4;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;-1:-1:-1;26956:14:0::1;:22:::0;;-1:-1:-1;;26956:22:0;;::::1;::::0;;;26989:20:::1;:28:::0;;;;::::1;::::0;;26956:22;26879:168;:::o;28888:132::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28973:28:0;;;::::1;;::::0;;;:19:::1;:28:::0;;;;;:39;;-1:-1:-1;;28973:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28888:132::o;28502:378::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;28619:16:::1;:32:::0;;;28662:16:::1;:32:::0;;;28705:10:::1;:20:::0;;;28718:7;28752:35:::1;28681:13:::0;28638;28752:35:::1;:::i;:::-;:48;;;;:::i;:::-;28736:13;:64:::0;;;28836:2:::1;-1:-1:-1::0;28819:19:0::1;28811:61;;;::::0;-1:-1:-1;;;28811:61:0;;8295:2:1;28811:61:0::1;::::0;::::1;8277:21:1::0;8334:2;8314:18;;;8307:30;8373:31;8353:18;;;8346:59;8422:18;;28811:61:0::1;8093:353:1::0;26670:153:0;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;26723:13:::1;:20:::0;;-1:-1:-1;;26754:18:0;;;;;26800:15:::1;26783:14;:32:::0;26670:153::o;27121:263::-;18992:6;;27202:4;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;27238:1:::1;27225:9;:14;;27217:77;;;::::0;-1:-1:-1;;;27217:77:0;;8653:2:1;27217:77:0::1;::::0;::::1;8635:21:1::0;8692:2;8672:18;;;8665:30;8731:34;8711:18;;;8704:62;-1:-1:-1;;;8782:18:1;;;8775:48;8840:19;;27217:77:0::1;8451:414:1::0;27217:77:0::1;27353:3;27341:9;27325:13;6165:12:::0;;;6077:108;27325:13:::1;:25;;;;:::i;:::-;:31;;;;:::i;:::-;27304:18;:52:::0;-1:-1:-1;27373:4:0::1;19062:1;27121:263:::0;;;:::o;29320:112::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;29403:9:::1;:21:::0;;-1:-1:-1;;;;;;29403:21:0::1;-1:-1:-1::0;;;;;29403:21:0;;;::::1;::::0;;;::::1;::::0;;29320:112::o;29786:164::-;18992:6;;29836:4;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;29853:12:::1;29871:7;18845:6:::0;;-1:-1:-1;;;;;18845:6:0;;18780:79;29871:7:::1;-1:-1:-1::0;;;;;29871:12:0::1;29891:21;29871:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;29852:65:0;;-1:-1:-1;;;29786:164:0;:::o;19725:244::-;18992:6;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19814:22:0;::::1;19806:73;;;::::0;-1:-1:-1;;;19806:73:0;;9072:2:1;19806:73:0::1;::::0;::::1;9054:21:1::0;9111:2;9091:18;;;9084:30;9150:34;9130:18;;;9123:62;-1:-1:-1;;;9201:18:1;;;9194:36;9247:19;;19806:73:0::1;8870:402:1::0;19806:73:0::1;19916:6;::::0;19895:38:::1;::::0;-1:-1:-1;;;;;19895:38:0;;::::1;::::0;19916:6:::1;::::0;19895:38:::1;::::0;19916:6:::1;::::0;19895:38:::1;19944:6;:17:::0;;-1:-1:-1;;;;;;19944:17:0::1;-1:-1:-1::0;;;;;19944:17:0;;;::::1;::::0;;;::::1;::::0;;19725:244::o;36820:902::-;18992:6;;36904:4;;-1:-1:-1;;;;;18992:6:0;438:10;18992:22;18984:67;;;;-1:-1:-1;;;18984:67:0;;;;;;;:::i;:::-;36969:19:::1;;36946:20;;:42;;;;:::i;:::-;36928:15;:60;36920:106;;;::::0;-1:-1:-1;;;36920:106:0;;9479:2:1;36920:106:0::1;::::0;::::1;9461:21:1::0;;;9498:18;;;9491:30;9557:34;9537:18;;;9530:62;9609:18;;36920:106:0::1;9277:356:1::0;36920:106:0::1;37056:4;37045:7;:15;;37037:70;;;::::0;-1:-1:-1;;;37037:70:0;;9840:2:1;37037:70:0::1;::::0;::::1;9822:21:1::0;9879:2;9859:18;;;9852:30;9918:34;9898:18;;;9891:62;-1:-1:-1;;;9969:18:1;;;9962:40;10019:19;;37037:70:0::1;9638:406:1::0;37037:70:0::1;37141:15;37118:20;:38:::0;37250:29:::1;::::0;-1:-1:-1;;;37250:29:0;;-1:-1:-1;;;;;37265:13:0::1;2770:32:1::0;37250:29:0::1;::::0;::::1;2752:51:1::0;37219:28:0::1;::::0;37250:4:::1;::::0;:14:::1;::::0;2725:18:1;;37250:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37219:60:::0;-1:-1:-1;37337:20:0::1;37391:5;37360:30;37383:7:::0;37219:60;37360:30:::1;:::i;:::-;:36;;;;:::i;:::-;37337:59:::0;-1:-1:-1;37431:16:0;;37427:109:::1;;37463:61;37479:13;37502:6;37511:12;37463:15;:61::i;:::-;37619:19;37656:13;37619:51;;37681:4;-1:-1:-1::0;;;;;37681:9:0::1;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;37710:4:0::1;::::0;36820:902;-1:-1:-1;;;;;;;;36820:902:0:o;12446:380::-;-1:-1:-1;;;;;12582:19:0;;12574:68;;;;-1:-1:-1;;;12574:68:0;;10440:2:1;12574:68:0;;;10422:21:1;10479:2;10459:18;;;10452:30;10518:34;10498:18;;;10491:62;-1:-1:-1;;;10569:18:1;;;10562:34;10613:19;;12574:68:0;10238:400:1;12574:68:0;-1:-1:-1;;;;;12661:21:0;;12653:68;;;;-1:-1:-1;;;12653:68:0;;10845:2:1;12653:68:0;;;10827:21:1;10884:2;10864:18;;;10857:30;10923:34;10903:18;;;10896:62;-1:-1:-1;;;10974:18:1;;;10967:32;11016:19;;12653:68:0;10643:398:1;12653:68:0;-1:-1:-1;;;;;12734:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12786:32;;2960:25:1;;;12786:32:0;;2933:18:1;12786:32:0;;;;;;;;12446:380;;;:::o;29958:4180::-;-1:-1:-1;;;;;30090:18:0;;30082:68;;;;-1:-1:-1;;;30082:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30169:16:0;;30161:64;;;;-1:-1:-1;;;30161:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30245:19:0;;;;;;:13;:19;;;;;;;;30244:20;:42;;;;-1:-1:-1;;;;;;30269:17:0;;;;;;:13;:17;;;;;;;;30268:18;30244:42;30236:65;;;;-1:-1:-1;;;30236:65:0;;12058:2:1;30236:65:0;;;12040:21:1;12097:2;12077:18;;;12070:30;-1:-1:-1;;;12116:18:1;;;12109:41;12167:18;;30236:65:0;11856:335:1;30236:65:0;30332:6;30342:1;30332:11;30329:92;;30360:28;30376:4;30382:2;30386:1;30360:15;:28::i;30329:92::-;30444:14;;;;30441:1841;;;18845:6;;-1:-1:-1;;;;;30496:15:0;;;18845:6;;30496:15;;;;:49;;-1:-1:-1;18845:6:0;;-1:-1:-1;;;;;30532:13:0;;;18845:6;;30532:13;;30496:49;:86;;;;-1:-1:-1;;;;;;30566:16:0;;;;30496:86;:128;;;;-1:-1:-1;;;;;;30603:21:0;;30617:6;30603:21;;30496:128;:158;;;;-1:-1:-1;30646:8:0;;-1:-1:-1;;;30646:8:0;;;;30645:9;30496:158;30474:1797;;;30692:13;;;;;;;30688:148;;-1:-1:-1;;;;;30737:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;30766:23:0;;;;;;:19;:23;;;;;;;;30737:52;30729:87;;;;-1:-1:-1;;;30729:87:0;;12398:2:1;30729:87:0;;;12380:21:1;12437:2;12417:18;;;12410:30;-1:-1:-1;;;12456:18:1;;;12449:52;12518:18;;30729:87:0;12196:346:1;30729:87:0;30994:20;;;;30990:423;;;18845:6;;-1:-1:-1;;;;;31042:13:0;;;18845:6;;31042:13;;;;:47;;;31073:15;-1:-1:-1;;;;;31059:30:0;:2;-1:-1:-1;;;;;31059:30:0;;;31042:47;:79;;;;;31107:13;-1:-1:-1;;;;;31093:28:0;:2;-1:-1:-1;;;;;31093:28:0;;;31042:79;31038:356;;;31186:9;31157:39;;;;:28;:39;;;;;;31199:12;-1:-1:-1;31149:140:0;;;;-1:-1:-1;;;31149:140:0;;12749:2:1;31149:140:0;;;12731:21:1;12788:2;12768:18;;;12761:30;12827:34;12807:18;;;12800:62;12898:34;12878:18;;;12871:62;-1:-1:-1;;;12949:19:1;;;12942:40;12999:19;;31149:140:0;12547:477:1;31149:140:0;31345:9;31316:39;;;;:28;:39;;;;;31358:12;31316:54;;31038:356;-1:-1:-1;;;;;31482:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;31518:35:0;;;;;;:31;:35;;;;;;;;31517:36;31482:71;31478:778;;;31600:20;;31590:6;:30;;31582:96;;;;-1:-1:-1;;;31582:96:0;;13231:2:1;31582:96:0;;;13213:21:1;13270:2;13250:18;;;13243:30;13309:34;13289:18;;;13282:62;-1:-1:-1;;;13360:18:1;;;13353:51;13421:19;;31582:96:0;13029:417:1;31582:96:0;31739:9;;-1:-1:-1;;;;;6349:18:0;;6322:7;6349:18;;;;;;;;;;;31713:22;;:6;:22;:::i;:::-;:35;;31705:67;;;;-1:-1:-1;;;31705:67:0;;13653:2:1;31705:67:0;;;13635:21:1;13692:2;13672:18;;;13665:30;-1:-1:-1;;;13711:18:1;;;13704:49;13770:18;;31705:67:0;13451:343:1;31705:67:0;31478:778;;;-1:-1:-1;;;;;31866:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;31900:37:0;;;;;;:31;:37;;;;;;;;31899:38;31866:71;31862:394;;;31984:20;;31974:6;:30;;31966:97;;;;-1:-1:-1;;;31966:97:0;;14001:2:1;31966:97:0;;;13983:21:1;14040:2;14020:18;;;14013:30;14079:34;14059:18;;;14052:62;-1:-1:-1;;;14130:18:1;;;14123:52;14192:19;;31966:97:0;13799:418:1;31862:394:0;-1:-1:-1;;;;;32110:35:0;;;;;;:31;:35;;;;;;;;32106:150;;32203:9;;-1:-1:-1;;;;;6349:18:0;;6322:7;6349:18;;;;;;;;;;;32177:22;;:6;:22;:::i;:::-;:35;;32169:67;;;;-1:-1:-1;;;32169:67:0;;13653:2:1;32169:67:0;;;13635:21:1;13692:2;13672:18;;;13665:30;-1:-1:-1;;;13711:18:1;;;13704:49;13770:18;;32169:67:0;13451:343:1;32169:67:0;32345:4;32296:28;6349:18;;;;;;;;;;;32411;;32387:42;;;;;;;32460:35;;-1:-1:-1;32484:11:0;;;;;;;32460:35;:61;;;;-1:-1:-1;32513:8:0;;-1:-1:-1;;;32513:8:0;;;;32512:9;32460:61;:110;;;;-1:-1:-1;;;;;;32539:31:0;;;;;;:25;:31;;;;;;;;32538:32;32460:110;:153;;;;-1:-1:-1;;;;;;32588:25:0;;;;;;:19;:25;;;;;;;;32587:26;32460:153;:194;;;;-1:-1:-1;;;;;;32631:23:0;;;;;;:19;:23;;;;;;;;32630:24;32460:194;32442:338;;;32681:8;:15;;-1:-1:-1;;;;32681:15:0;-1:-1:-1;;;32681:15:0;;;32725:10;:8;:10::i;:::-;32752:8;:16;;-1:-1:-1;;;;32752:16:0;;;32442:338;32808:8;;-1:-1:-1;;;;;32917:25:0;;32792:12;32917:25;;;:19;:25;;;;;;32808:8;-1:-1:-1;;;32808:8:0;;;;;32807:9;;32917:25;;:52;;-1:-1:-1;;;;;;32946:23:0;;;;;;:19;:23;;;;;;;;32917:52;32914:99;;;-1:-1:-1;32996:5:0;32914:99;33033:12;33137:7;33134:951;;;-1:-1:-1;;;;;33188:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;33237:1;33221:13;;:17;33188:50;33184:732;;;33288:3;33274:13;;33265:6;:22;;;;:::i;:::-;:26;;;;:::i;:::-;33258:33;;33358:13;;33339:16;;33332:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;33310:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;33426:13:0;;33413:10;;33406:17;;:4;:17;:::i;:::-;:33;;;;:::i;:::-;33390:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;33506:13:0;;33487:16;;33480:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;33458:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;33184:732:0;;-1:-1:-1;33184:732:0;;-1:-1:-1;;;;;33580:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;33630:1;33615:12;;:16;33580:51;33577:339;;;33678:3;33665:12;;33656:6;:21;;;;:::i;:::-;:25;;;;:::i;:::-;33649:32;;33744:12;;33726:15;;33719:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;33697:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;33810:12:0;;33798:9;;33791:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;33775:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;33888:12:0;;33870:15;;33863:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;33841:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;33577:339:0;33947:8;;33944:93;;33979:42;33995:4;34009;34016;33979:15;:42::i;:::-;34059:14;34069:4;34059:14;;:::i;:::-;;;33134:951;34097:33;34113:4;34119:2;34123:6;34097:15;:33::i;:::-;30071:4067;;;;29958:4180;;;:::o;14727:192::-;14813:7;14849:12;14841:6;;;;14833:29;;;;-1:-1:-1;;;14833:29:0;;;;;;;;:::i;:::-;-1:-1:-1;14873:9:0;14885:5;14889:1;14885;:5;:::i;:::-;14873:17;14727:192;-1:-1:-1;;;;;14727:192:0:o;13824:181::-;13882:7;;13914:5;13918:1;13914;:5;:::i;:::-;13902:17;;13943:1;13938;:6;;13930:46;;;;-1:-1:-1;;;13930:46:0;;14424:2:1;13930:46:0;;;14406:21:1;14463:2;14443:18;;;14436:30;14502:29;14482:18;;;14475:57;14549:18;;13930:46:0;14222:351:1;13930:46:0;13996:1;13824:181;-1:-1:-1;;;13824:181:0:o;34146:601::-;34298:16;;;34312:1;34298:16;;;;;;;;34274:21;;34298:16;;;;;;;;;;-1:-1:-1;34298:16:0;34274:40;;34343:4;34325;34330:1;34325:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;34325:23:0;;;-1:-1:-1;;;;;34325:23:0;;;;;34369:15;-1:-1:-1;;;;;34369:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34359:4;34364:1;34359:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;34359:32:0;;;-1:-1:-1;;;;;34359:32:0;;;;;34404:62;34421:4;34436:15;34454:11;34404:8;:62::i;:::-;34505:224;;-1:-1:-1;;;34505:224:0;;-1:-1:-1;;;;;34505:15:0;:66;;;;:224;;34586:11;;34612:1;;34656:4;;34683;;34703:15;;34505:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34201:546;34146:601;:::o;34765:517::-;34913:62;34930:4;34945:15;34963:11;34913:8;:62::i;:::-;35018:256;;-1:-1:-1;;;35018:256:0;;35090:4;35018:256;;;16292:34:1;16342:18;;;16335:34;;;35136:1:0;16385:18:1;;;16378:34;;;16428:18;;;16421:34;22828:6:0;16471:19:1;;;16464:44;35248:15:0;16524:19:1;;;16517:35;35018:15:0;-1:-1:-1;;;;;35018:31:0;;;;35057:9;;16226:19:1;;35018:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;34765:517;;:::o;10019:573::-;-1:-1:-1;;;;;10159:20:0;;10151:70;;;;-1:-1:-1;;;10151:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10240:23:0;;10232:71;;;;-1:-1:-1;;;10232:71:0;;;;;;;:::i;:::-;10396;10418:6;10396:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10396:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;10376:17:0;;;:9;:17;;;;;;;;;;;:91;;;;10501:20;;;;;;;:32;;10526:6;10501:24;:32::i;:::-;-1:-1:-1;;;;;10478:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;10549:35;2960:25:1;;;10478:20:0;;10549:35;;;;;;2933:18:1;10549:35:0;2814:177:1;14:548;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;622:70;567:131;:::o;703:315::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1467:248::-;1535:6;1543;1596:2;1584:9;1575:7;1571:23;1567:32;1564:52;;;1612:1;1609;1602:12;1564:52;-1:-1:-1;;1635:23:1;;;1705:2;1690:18;;;1677:32;;-1:-1:-1;1467:248:1:o;1720:160::-;1785:20;;1841:13;;1834:21;1824:32;;1814:60;;1870:1;1867;1860:12;1885:689;1977:6;1985;1993;2046:2;2034:9;2025:7;2021:23;2017:32;2014:52;;;2062:1;2059;2052:12;2014:52;2102:9;2089:23;2131:18;2172:2;2164:6;2161:14;2158:34;;;2188:1;2185;2178:12;2158:34;2226:6;2215:9;2211:22;2201:32;;2271:7;2264:4;2260:2;2256:13;2252:27;2242:55;;2293:1;2290;2283:12;2242:55;2333:2;2320:16;2359:2;2351:6;2348:14;2345:34;;;2375:1;2372;2365:12;2345:34;2430:7;2423:4;2413:6;2410:1;2406:14;2402:2;2398:23;2394:34;2391:47;2388:67;;;2451:1;2448;2441:12;2388:67;2482:4;2474:13;;;;-1:-1:-1;2506:6:1;-1:-1:-1;2531:37:1;;2547:20;;;-1:-1:-1;2531:37:1;:::i;:::-;2521:47;;1885:689;;;;;:::o;2996:456::-;3073:6;3081;3089;3142:2;3130:9;3121:7;3117:23;3113:32;3110:52;;;3158:1;3155;3148:12;3110:52;3197:9;3184:23;3216:31;3241:5;3216:31;:::i;:::-;3266:5;-1:-1:-1;3323:2:1;3308:18;;3295:32;3336:33;3295:32;3336:33;:::i;:::-;2996:456;;3388:7;;-1:-1:-1;;;3442:2:1;3427:18;;;;3414:32;;2996:456::o;3854:315::-;3919:6;3927;3980:2;3968:9;3959:7;3955:23;3951:32;3948:52;;;3996:1;3993;3986:12;3948:52;4035:9;4022:23;4054:31;4079:5;4054:31;:::i;:::-;4104:5;-1:-1:-1;4128:35:1;4159:2;4144:18;;4128:35;:::i;:::-;4118:45;;3854:315;;;;;:::o;4174:316::-;4251:6;4259;4267;4320:2;4308:9;4299:7;4295:23;4291:32;4288:52;;;4336:1;4333;4326:12;4288:52;-1:-1:-1;;4359:23:1;;;4429:2;4414:18;;4401:32;;-1:-1:-1;4480:2:1;4465:18;;;4452:32;;4174:316;-1:-1:-1;4174:316:1:o;4495:180::-;4551:6;4604:2;4592:9;4583:7;4579:23;4575:32;4572:52;;;4620:1;4617;4610:12;4572:52;4643:26;4659:9;4643:26;:::i;4680:180::-;4739:6;4792:2;4780:9;4771:7;4767:23;4763:32;4760:52;;;4808:1;4805;4798:12;4760:52;-1:-1:-1;4831:23:1;;4680:180;-1:-1:-1;4680:180:1:o;4865:388::-;4933:6;4941;4994:2;4982:9;4973:7;4969:23;4965:32;4962:52;;;5010:1;5007;5000:12;4962:52;5049:9;5036:23;5068:31;5093:5;5068:31;:::i;:::-;5118:5;-1:-1:-1;5175:2:1;5160:18;;5147:32;5188:33;5147:32;5188:33;:::i;:::-;5240:7;5230:17;;;4865:388;;;;;:::o;5258:380::-;5337:1;5333:12;;;;5380;;;5401:61;;5455:4;5447:6;5443:17;5433:27;;5401:61;5508:2;5500:6;5497:14;5477:18;5474:38;5471:161;;5554:10;5549:3;5545:20;5542:1;5535:31;5589:4;5586:1;5579:15;5617:4;5614:1;5607:15;5471:161;;5258:380;;;:::o;5643:356::-;5845:2;5827:21;;;5864:18;;;5857:30;5923:34;5918:2;5903:18;;5896:62;5990:2;5975:18;;5643:356::o;6418:127::-;6479:10;6474:3;6470:20;6467:1;6460:31;6510:4;6507:1;6500:15;6534:4;6531:1;6524:15;6550:168;6623:9;;;6654;;6671:15;;;6665:22;;6651:37;6641:71;;6692:18;;:::i;6723:217::-;6763:1;6789;6779:132;;6833:10;6828:3;6824:20;6821:1;6814:31;6868:4;6865:1;6858:15;6896:4;6893:1;6886:15;6779:132;-1:-1:-1;6925:9:1;;6723:217::o;7348:127::-;7409:10;7404:3;7400:20;7397:1;7390:31;7440:4;7437:1;7430:15;7464:4;7461:1;7454:15;7480:135;7519:3;7540:17;;;7537:43;;7560:18;;:::i;:::-;-1:-1:-1;7607:1:1;7596:13;;7480:135::o;7620:125::-;7685:9;;;7706:10;;;7703:36;;;7719:18;;:::i;7750:128::-;7817:9;;;7838:11;;;7835:37;;;7852:18;;:::i;10049:184::-;10119:6;10172:2;10160:9;10151:7;10147:23;10143:32;10140:52;;;10188:1;10185;10178:12;10140:52;-1:-1:-1;10211:16:1;;10049:184;-1:-1:-1;10049:184:1:o;11046:401::-;11248:2;11230:21;;;11287:2;11267:18;;;11260:30;11326:34;11321:2;11306:18;;11299:62;-1:-1:-1;;;11392:2:1;11377:18;;11370:35;11437:3;11422:19;;11046:401::o;11452:399::-;11654:2;11636:21;;;11693:2;11673:18;;;11666:30;11732:34;11727:2;11712:18;;11705:62;-1:-1:-1;;;11798:2:1;11783:18;;11776:33;11841:3;11826:19;;11452:399::o;14710:251::-;14780:6;14833:2;14821:9;14812:7;14808:23;14804:32;14801:52;;;14849:1;14846;14839:12;14801:52;14881:9;14875:16;14900:31;14925:5;14900:31;:::i;14966:980::-;15228:4;15276:3;15265:9;15261:19;15307:6;15296:9;15289:25;15333:2;15371:6;15366:2;15355:9;15351:18;15344:34;15414:3;15409:2;15398:9;15394:18;15387:31;15438:6;15473;15467:13;15504:6;15496;15489:22;15542:3;15531:9;15527:19;15520:26;;15581:2;15573:6;15569:15;15555:29;;15602:1;15612:195;15626:6;15623:1;15620:13;15612:195;;;15691:13;;-1:-1:-1;;;;;15687:39:1;15675:52;;15782:15;;;;15747:12;;;;15723:1;15641:9;15612:195;;;-1:-1:-1;;;;;;;15863:32:1;;;;15858:2;15843:18;;15836:60;-1:-1:-1;;;15927:3:1;15912:19;15905:35;15824:3;14966:980;-1:-1:-1;;;14966:980:1:o;16563:306::-;16651:6;16659;16667;16720:2;16708:9;16699:7;16695:23;16691:32;16688:52;;;16736:1;16733;16726:12;16688:52;16765:9;16759:16;16749:26;;16815:2;16804:9;16800:18;16794:25;16784:35;;16859:2;16848:9;16844:18;16838:25;16828:35;;16563:306;;;;;:::o

Swarm Source

ipfs://47a76bdfa44b6783d6216b12601d9aa6201d864f633d98ce7441db01f2a96cfb
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.