ETH Price: $3,406.07 (-0.55%)

Token

Proper (PROPER)
 

Overview

Max Total Supply

100,000,000 PROPER

Holders

113

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
58,353.545113737618204431 PROPER

Value
$0.00
0xfc51089adf2e5ba5658f3e176c7cfff4a58a0dfe
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:
Proper

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-23
*/

/**

Telegram https://t.me/ProperToken
Twitter https://twitter.com/tokenproper/
Website https://propertoken.club/

*/

// SPDX-License-Identifier: MIT                                                
pragma solidity >=0.8.10 >=0.8.0 <0.9.0;

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 Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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

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

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

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

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

contract Proper is ERC20, Ownable {
    using SafeMath for uint256;

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

    bool private swapping;

    address public marketingWallet;
    address public treasuryWallet;
    address public devWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    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
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyTreasuryFee;
    uint256 public buyDevFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellTreasuryFee;
    uint256 public sellDevFee;
    
    uint256 public tokensForMarketing;
    uint256 public tokensForTreasury;
    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;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);

    event treasuryWalletUpdated(address indexed newWallet, address indexed oldWallet);
    
    event devWalletUpdated(address indexed newWallet, address indexed oldWallet);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    
    event AutoNukeLP();
    
    event ManualNukeLP();

    constructor() ERC20("Proper", "PROPER") {
        
        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 = 10;
        uint256 _buyTreasuryFee = 2;
        uint256 _buyDevFee = 3;

        uint256 _sellMarketingFee = 10;
        uint256 _sellTreasuryFee = 2;
        uint256 _sellDevFee = 13;
        
        uint256 totalSupply = 100_000_000 * 1e18;
        
        maxTransactionAmount = totalSupply * 20 / 1000; // 2% maxTransaction
        maxWallet = totalSupply * 20 / 1000; // 2% maxWallet
        swapTokensAtAmount = totalSupply * 4 / 10000; // 0.04% swap amount

        buyMarketingFee = _buyMarketingFee;
        buyTreasuryFee = _buyTreasuryFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyTreasuryFee + buyDevFee;
        
        sellMarketingFee = _sellMarketingFee;
        sellTreasuryFee = _sellTreasuryFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellTreasuryFee + sellDevFee;
        
        marketingWallet = address(0x7C2213e48736Dbb186B7A2FF61cC0F0c71a2887c); // set as marketing wallet
        treasuryWallet = address(0xcad6e1570e80f72B38f1Ef6a0Ed3fCaaFECb8CaD); // set as treasury wallet - MRI deployer
        devWallet = address(0xBEB49194a37dAA8F095EbF2248F2be57fEC09dA7); // set as dev wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(treasuryWallet, true);
        excludeFromFees(devWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(marketingWallet, true);
        excludeFromMaxTransaction(treasuryWallet, true);
        excludeFromMaxTransaction(devWallet, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {

  	}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }
    
    // remove limits after token is stable
    function removeEverySingleLimit() external returns (bool) {
        require(msg.sender == owner() || msg.sender == devWallet || msg.sender == devWallet, "Not authorised");
        limitsInEffect = false;
        return true;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}
    
    function updateMaxTransactAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%");
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newNum * (10**18);
    }
    
    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 _treasuryFee, uint256 _devFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyTreasuryFee = _treasuryFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyTreasuryFee + buyDevFee;
        require(buyTotalFees <= 10, "Must keep fees at 10% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _treasuryFee, uint256 _devFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellTreasuryFee = _treasuryFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellTreasuryFee + sellDevFee;
        require(sellTotalFees <= 10, "Must keep fees at 10% or less");
    }

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

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet) external onlyOwner {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updateTreasuryWallet(address newTreasuryWallet) external onlyOwner {
        emit treasuryWalletUpdated(newTreasuryWallet, treasuryWallet);
        treasuryWallet = newTreasuryWallet;
    }
    
    function updateDevWallet(address newWallet) external onlyOwner {
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
    }
    
    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    event BoughtEarly(address indexed sniper);

    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");
        
         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.mul(sellTotalFees).div(100);
                tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
                tokensForDev += fees * sellDevFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount.mul(buyTotalFees).div(100);
        	    tokensForTreasury += fees * buyTreasuryFee / 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() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForTreasury + tokensForMarketing + tokensForDev;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 20){
          contractBalance = swapTokensAtAmount * 20;
        }
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(contractBalance); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        
        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);
        uint256 ethForTreasury = ethBalance - ethForMarketing - ethForDev;
        
        tokensForTreasury = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;
        
        (success,) = address(devWallet).call{value: ethForDev}("");        
        (success,) = address(treasuryWallet).call{value: ethForTreasury}("");  
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }
}

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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"treasuryWalletUpdated","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":"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":"buyTreasuryFee","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":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEverySingleLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"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":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","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":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","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":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTransactAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","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":"newTreasuryWallet","type":"address"}],"name":"updateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600c805462ffffff19166001908117909155600e805460ff191690911790553480156200003057600080fd5b5060405180604001604052806006815260200165283937b832b960d11b81525060405180604001604052806006815260200165282927a822a960d11b81525081600390816200008091906200087a565b5060046200008f82826200087a565b5050506000620000a4620004ed60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d62000114816001620004f1565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200015f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000185919062000946565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f9919062000946565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000247573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026d919062000946565b6001600160a01b031660a081905262000288906001620004f1565b60a051620002989060016200056b565b600a600260038282600d6a52b7d2dcc80cd2e40000006103e8620002be82601462000987565b620002ca9190620009a1565b6009556103e8620002dd82601462000987565b620002e99190620009a1565b600b55612710620002fc82600462000987565b620003089190620009a1565b600a5560108790556011869055601285905584620003278789620009c4565b620003339190620009c4565b600f5560148490556015839055601682905581620003528486620009c4565b6200035e9190620009c4565b601355600680546001600160a01b0319908116737c2213e48736dbb186b7a2ff61cc0f0c71a2887c1790915560078054821673cad6e1570e80f72b38f1ef6a0ed3fcaafecb8cad1790556008805490911673beb49194a37daa8f095ebf2248f2be57fec09da7179055620003e6620003de6005546001600160a01b031690565b6001620005bf565b600654620003ff906001600160a01b03166001620005bf565b60075462000418906001600160a01b03166001620005bf565b60085462000431906001600160a01b03166001620005bf565b6200043e306001620005bf565b6200044d61dead6001620005bf565b6200046c620004646005546001600160a01b031690565b6001620004f1565b60065462000485906001600160a01b03166001620004f1565b6007546200049e906001600160a01b03166001620004f1565b600854620004b7906001600160a01b03166001620004f1565b620004c4306001620004f1565b620004d361dead6001620004f1565b620004df338262000669565b5050505050505050620009da565b3390565b6005546001600160a01b03163314620005405760405162461bcd60e51b815260206004820181905260248201526000805160206200359383398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b031633146200060a5760405162461bcd60e51b8152602060048201819052602482015260008051602062003593833981519152604482015260640162000537565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006c15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000537565b620006dd816002546200076a60201b620016881790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000710918390620016886200076a821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b600080620007798385620009c4565b905083811015620007cd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000537565b90505b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200080157607f821691505b6020821081036200082257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200076557600081815260208120601f850160051c81016020861015620008515750805b601f850160051c820191505b8181101562000872578281556001016200085d565b505050505050565b81516001600160401b03811115620008965762000896620007d6565b620008ae81620008a78454620007ec565b8462000828565b602080601f831160018114620008e65760008415620008cd5750858301515b600019600386901b1c1916600185901b17855562000872565b600085815260208120601f198616915b828110156200091757888601518255948401946001909101908401620008f6565b5085821015620009365787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200095957600080fd5b81516001600160a01b0381168114620007cd57600080fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620007d057620007d062000971565b600082620009bf57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620007d057620007d062000971565b60805160a051612b6962000a2a6000396000818161054d0152818161107601526119e7015260008181610418015281816119a901528181612509015281816125c201526125fe0152612b696000f3fe60806040526004361061036f5760003560e01c80638da5cb5b116101c6578063bbc0c742116100f7578063d257b34f11610095578063e2f456051161006f578063e2f4560514610a0b578063e884f26014610a21578063f2fde38b14610a36578063f8b45b0514610a5657600080fd5b8063d257b34f1461098f578063d85ba063146109af578063dd62ed3e146109c557600080fd5b8063c18bc195116100d1578063c18bc19514610929578063c876d0b914610949578063c8c8ebe414610963578063cc2ffe7c1461097957600080fd5b8063bbc0c742146108ca578063c0246668146108e9578063c17b5b8c1461090957600080fd5b80639c3b4fdc11610164578063a457c2d71161013e578063a457c2d71461083a578063a9059cbb1461085a578063aacebbe31461087a578063b62496f51461089a57600080fd5b80639c3b4fdc146107f85780639fccce321461080e578063a0d82dc51461082457600080fd5b806392136913116101a0578063921369131461078d578063924de9b7146107a357806395d89b41146107c35780639a7a23d6146107d857600080fd5b80638da5cb5b1461072f5780638ea5220f1461074d5780638fb12cd01461076d57600080fd5b80634fbee193116102a0578063715018a61161023e5780637bce5a04116102185780637bce5a04146106c45780638095d564146106da578063809d458d146106fa5780638a8c523c1461071a57600080fd5b8063715018a61461066f5780637571336a1461068457806375f0a874146106a457600080fd5b80636b2fb1241161027a5780636b2fb124146105ee5780636c4bb6ce146106045780636ddd17131461061957806370a082311461063957600080fd5b80634fbee193146105895780635c068a8c146105c25780636a486a8e146105d857600080fd5b806323b872dd1161030d57806339509351116102e757806339509351146104fb5780634626402b1461051b57806349bd5a5e1461053b5780634a62bb651461056f57600080fd5b806323b872dd146104a957806327c8f835146104c9578063313ce567146104df57600080fd5b80631694505e116103495780631694505e1461040657806318160ddd146104525780631816467f146104715780631f3fed8f1461049357600080fd5b806306fdde031461037b578063095ea7b3146103a657806310d5de53146103d657600080fd5b3661037657005b600080fd5b34801561038757600080fd5b50610390610a6c565b60405161039d91906126e2565b60405180910390f35b3480156103b257600080fd5b506103c66103c1366004612748565b610afe565b604051901515815260200161039d565b3480156103e257600080fd5b506103c66103f1366004612774565b601b6020526000908152604090205460ff1681565b34801561041257600080fd5b5061043a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161039d565b34801561045e57600080fd5b506002545b60405190815260200161039d565b34801561047d57600080fd5b5061049161048c366004612774565b610b15565b005b34801561049f57600080fd5b5061046360175481565b3480156104b557600080fd5b506103c66104c4366004612791565b610ba5565b3480156104d557600080fd5b5061043a61dead81565b3480156104eb57600080fd5b506040516012815260200161039d565b34801561050757600080fd5b506103c6610516366004612748565b610c0e565b34801561052757600080fd5b5060075461043a906001600160a01b031681565b34801561054757600080fd5b5061043a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b57600080fd5b50600c546103c69060ff1681565b34801561059557600080fd5b506103c66105a4366004612774565b6001600160a01b03166000908152601a602052604090205460ff1690565b3480156105ce57600080fd5b5061046360115481565b3480156105e457600080fd5b5061046360135481565b3480156105fa57600080fd5b5061046360155481565b34801561061057600080fd5b506103c6610c44565b34801561062557600080fd5b50600c546103c69062010000900460ff1681565b34801561064557600080fd5b50610463610654366004612774565b6001600160a01b031660009081526020819052604090205490565b34801561067b57600080fd5b50610491610ce3565b34801561069057600080fd5b5061049161069f3660046127e2565b610d57565b3480156106b057600080fd5b5060065461043a906001600160a01b031681565b3480156106d057600080fd5b5061046360105481565b3480156106e657600080fd5b506104916106f5366004612817565b610dac565b34801561070657600080fd5b50610491610715366004612774565b610e54565b34801561072657600080fd5b50610491610edb565b34801561073b57600080fd5b506005546001600160a01b031661043a565b34801561075957600080fd5b5060085461043a906001600160a01b031681565b34801561077957600080fd5b50610491610788366004612843565b610f18565b34801561079957600080fd5b5061046360145481565b3480156107af57600080fd5b506104916107be36600461285c565b610ff5565b3480156107cf57600080fd5b5061039061103b565b3480156107e457600080fd5b506104916107f33660046127e2565b61104a565b34801561080457600080fd5b5061046360125481565b34801561081a57600080fd5b5061046360195481565b34801561083057600080fd5b5061046360165481565b34801561084657600080fd5b506103c6610855366004612748565b611129565b34801561086657600080fd5b506103c6610875366004612748565b611178565b34801561088657600080fd5b50610491610895366004612774565b611185565b3480156108a657600080fd5b506103c66108b5366004612774565b601c6020526000908152604090205460ff1681565b3480156108d657600080fd5b50600c546103c690610100900460ff1681565b3480156108f557600080fd5b506104916109043660046127e2565b61120c565b34801561091557600080fd5b50610491610924366004612817565b611295565b34801561093557600080fd5b50610491610944366004612843565b611338565b34801561095557600080fd5b50600e546103c69060ff1681565b34801561096f57600080fd5b5061046360095481565b34801561098557600080fd5b5061046360185481565b34801561099b57600080fd5b506103c66109aa366004612843565b611409565b3480156109bb57600080fd5b50610463600f5481565b3480156109d157600080fd5b506104636109e0366004612877565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a1757600080fd5b50610463600a5481565b348015610a2d57600080fd5b506103c6611560565b348015610a4257600080fd5b50610491610a51366004612774565b61159d565b348015610a6257600080fd5b50610463600b5481565b606060038054610a7b906128b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa7906128b0565b8015610af45780601f10610ac957610100808354040283529160200191610af4565b820191906000526020600020905b815481529060010190602001808311610ad757829003601f168201915b5050505050905090565b6000610b0b3384846116ee565b5060015b92915050565b6005546001600160a01b03163314610b485760405162461bcd60e51b8152600401610b3f906128ea565b60405180910390fd5b6008546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bb2848484611813565b610c048433610bff85604051806060016040528060288152602001612ae7602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612065565b6116ee565b5060019392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610b0b918590610bff9086611688565b6000610c586005546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610c8157506008546001600160a01b031633145b80610c9657506008546001600160a01b031633145b610cd35760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5cd95960921b6044820152606401610b3f565b50600c805460ff19169055600190565b6005546001600160a01b03163314610d0d5760405162461bcd60e51b8152600401610b3f906128ea565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610d815760405162461bcd60e51b8152600401610b3f906128ea565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610dd65760405162461bcd60e51b8152600401610b3f906128ea565b60108390556011829055601281905580610df08385612935565b610dfa9190612935565b600f819055600a1015610e4f5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610b3f565b505050565b6005546001600160a01b03163314610e7e5760405162461bcd60e51b8152600401610b3f906128ea565b6007546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f63590600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f055760405162461bcd60e51b8152600401610b3f906128ea565b600c805462ffff00191662010100179055565b6005546001600160a01b03163314610f425760405162461bcd60e51b8152600401610b3f906128ea565b670de0b6b3a76400006103e8610f5760025490565b610f62906001612948565b610f6c919061295f565b610f76919061295f565b811015610fdd5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b3f565b610fef81670de0b6b3a7640000612948565b60095550565b6005546001600160a01b0316331461101f5760405162461bcd60e51b8152600401610b3f906128ea565b600c8054911515620100000262ff000019909216919091179055565b606060048054610a7b906128b0565b6005546001600160a01b031633146110745760405162461bcd60e51b8152600401610b3f906128ea565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361111b5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b3f565b611125828261209f565b5050565b6000610b0b3384610bff85604051806060016040528060258152602001612b0f602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612065565b6000610b0b338484611813565b6005546001600160a01b031633146111af5760405162461bcd60e51b8152600401610b3f906128ea565b6006546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146112365760405162461bcd60e51b8152600401610b3f906128ea565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146112bf5760405162461bcd60e51b8152600401610b3f906128ea565b601483905560158290556016819055806112d98385612935565b6112e39190612935565b6013819055600a1015610e4f5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610b3f565b6005546001600160a01b031633146113625760405162461bcd60e51b8152600401610b3f906128ea565b670de0b6b3a76400006103e861137760025490565b611382906005612948565b61138c919061295f565b611396919061295f565b8110156113f15760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b3f565b61140381670de0b6b3a7640000612948565b600b5550565b6005546000906001600160a01b031633146114365760405162461bcd60e51b8152600401610b3f906128ea565b620186a061144360025490565b61144e906001612948565b611458919061295f565b8210156114c55760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b3f565b6103e86114d160025490565b6114dc906005612948565b6114e6919061295f565b8211156115525760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b3f565b50600a81905560015b919050565b6005546000906001600160a01b0316331461158d5760405162461bcd60e51b8152600401610b3f906128ea565b50600e805460ff19169055600190565b6005546001600160a01b031633146115c75760405162461bcd60e51b8152600401610b3f906128ea565b6001600160a01b03811661162c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b3f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000806116958385612935565b9050838110156116e75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b3f565b9392505050565b6001600160a01b0383166117505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b3f565b6001600160a01b0382166117b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b3f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118395760405162461bcd60e51b8152600401610b3f90612981565b6001600160a01b03821661185f5760405162461bcd60e51b8152600401610b3f906129c6565b8060000361187357610e4f838360006120f3565b600c5460ff1615611d30576005546001600160a01b038481169116148015906118aa57506005546001600160a01b03838116911614155b80156118be57506001600160a01b03821615155b80156118d557506001600160a01b03821661dead14155b80156118eb5750600554600160a01b900460ff16155b15611d3057600c54610100900460ff16611983576001600160a01b0383166000908152601a602052604090205460ff168061193e57506001600160a01b0382166000908152601a602052604090205460ff165b6119835760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b3f565b600e5460ff1615611aca576005546001600160a01b038381169116148015906119de57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015611a1c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15611aca57326000908152600d60205260409020544311611ab75760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b3f565b326000908152600d602052604090204390555b6001600160a01b0383166000908152601c602052604090205460ff168015611b0b57506001600160a01b0382166000908152601b602052604090205460ff16155b15611bef57600954811115611b805760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b3f565b600b546001600160a01b038316600090815260208190526040902054611ba69083612935565b1115611bea5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b3f565b611d30565b6001600160a01b0382166000908152601c602052604090205460ff168015611c3057506001600160a01b0383166000908152601b602052604090205460ff16155b15611ca657600954811115611bea5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b3f565b6001600160a01b0382166000908152601b602052604090205460ff16611d3057600b546001600160a01b038316600090815260208190526040902054611cec9083612935565b1115611d305760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b3f565b30600090815260208190526040902054600a5481108015908190611d5c5750600c5462010000900460ff165b8015611d725750600554600160a01b900460ff16155b8015611d9757506001600160a01b0385166000908152601c602052604090205460ff16155b8015611dbc57506001600160a01b0385166000908152601a602052604090205460ff16155b8015611de157506001600160a01b0384166000908152601a602052604090205460ff16155b15611e0f576005805460ff60a01b1916600160a01b179055611e016121fc565b6005805460ff60a01b191690555b6005546001600160a01b0386166000908152601a602052604090205460ff600160a01b909204821615911680611e5d57506001600160a01b0385166000908152601a602052604090205460ff165b15611e66575060005b60008115612051576001600160a01b0386166000908152601c602052604090205460ff168015611e9857506000601354115b15611f5657611ebd6064611eb7601354886123ee90919063ffffffff16565b90612470565b905060135460155482611ed09190612948565b611eda919061295f565b60186000828254611eeb9190612935565b9091555050601354601654611f009083612948565b611f0a919061295f565b60196000828254611f1b9190612935565b9091555050601354601454611f309083612948565b611f3a919061295f565b60176000828254611f4b9190612935565b909155506120339050565b6001600160a01b0387166000908152601c602052604090205460ff168015611f8057506000600f54115b1561203357611f9f6064611eb7600f54886123ee90919063ffffffff16565b9050600f5460115482611fb29190612948565b611fbc919061295f565b60186000828254611fcd9190612935565b9091555050600f54601254611fe29083612948565b611fec919061295f565b60196000828254611ffd9190612935565b9091555050600f546010546120129083612948565b61201c919061295f565b6017600082825461202d9190612935565b90915550505b8015612044576120448730836120f3565b61204e8186612a09565b94505b61205c8787876120f3565b50505050505050565b600081848411156120895760405162461bcd60e51b8152600401610b3f91906126e2565b5060006120968486612a09565b95945050505050565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166121195760405162461bcd60e51b8152600401610b3f90612981565b6001600160a01b03821661213f5760405162461bcd60e51b8152600401610b3f906129c6565b61217c81604051806060016040528060268152602001612ac1602691396001600160a01b0386166000908152602081905260409020549190612065565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546121ab9082611688565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611806565b30600090815260208190526040812054905060006019546017546018546122239190612935565b61222d9190612935565b9050600082158061223c575081155b1561224657505050565b600a54612254906014612948565b83111561226c57600a54612269906014612948565b92505b47612276846124b2565b60006122824783612672565b9050600061229f85611eb7601754856123ee90919063ffffffff16565b905060006122bc86611eb7601954866123ee90919063ffffffff16565b90506000816122cb8486612a09565b6122d59190612a09565b60006018819055601781905560198190556008546040519293506001600160a01b031691849181818185875af1925050503d8060008114612332576040519150601f19603f3d011682016040523d82523d6000602084013e612337565b606091505b50506007546040519197506001600160a01b0316908290600081818185875af1925050503d8060008114612387576040519150601f19603f3d011682016040523d82523d6000602084013e61238c565b606091505b50506006546040519197506001600160a01b0316904790600081818185875af1925050503d80600081146123dc576040519150601f19603f3d011682016040523d82523d6000602084013e6123e1565b606091505b5050505050505050505050565b60008260000361240057506000610b0f565b600061240c8385612948565b905082612419858361295f565b146116e75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b3f565b60006116e783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126b4565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106124e7576124e7612a1c565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612565573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125899190612a32565b8160018151811061259c5761259c612a1c565b60200260200101906001600160a01b031690816001600160a01b0316815250506125e7307f0000000000000000000000000000000000000000000000000000000000000000846116ee565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061263c908590600090869030904290600401612a4f565b600060405180830381600087803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b505050505050565b60006116e783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612065565b600081836126d55760405162461bcd60e51b8152600401610b3f91906126e2565b506000612096848661295f565b600060208083528351808285015260005b8181101561270f578581018301518582016040015282016126f3565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461274557600080fd5b50565b6000806040838503121561275b57600080fd5b823561276681612730565b946020939093013593505050565b60006020828403121561278657600080fd5b81356116e781612730565b6000806000606084860312156127a657600080fd5b83356127b181612730565b925060208401356127c181612730565b929592945050506040919091013590565b8035801515811461155b57600080fd5b600080604083850312156127f557600080fd5b823561280081612730565b915061280e602084016127d2565b90509250929050565b60008060006060848603121561282c57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561285557600080fd5b5035919050565b60006020828403121561286e57600080fd5b6116e7826127d2565b6000806040838503121561288a57600080fd5b823561289581612730565b915060208301356128a581612730565b809150509250929050565b600181811c908216806128c457607f821691505b6020821081036128e457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b0f57610b0f61291f565b8082028115828204841417610b0f57610b0f61291f565b60008261297c57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610b0f57610b0f61291f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a4457600080fd5b81516116e781612730565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a9f5784516001600160a01b031683529383019391830191600101612a7a565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220571a4e36616b86ef516fa0688bdbb0a30a26a3ff4930839d7788dcc9b450e5ee64736f6c634300081100334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x60806040526004361061036f5760003560e01c80638da5cb5b116101c6578063bbc0c742116100f7578063d257b34f11610095578063e2f456051161006f578063e2f4560514610a0b578063e884f26014610a21578063f2fde38b14610a36578063f8b45b0514610a5657600080fd5b8063d257b34f1461098f578063d85ba063146109af578063dd62ed3e146109c557600080fd5b8063c18bc195116100d1578063c18bc19514610929578063c876d0b914610949578063c8c8ebe414610963578063cc2ffe7c1461097957600080fd5b8063bbc0c742146108ca578063c0246668146108e9578063c17b5b8c1461090957600080fd5b80639c3b4fdc11610164578063a457c2d71161013e578063a457c2d71461083a578063a9059cbb1461085a578063aacebbe31461087a578063b62496f51461089a57600080fd5b80639c3b4fdc146107f85780639fccce321461080e578063a0d82dc51461082457600080fd5b806392136913116101a0578063921369131461078d578063924de9b7146107a357806395d89b41146107c35780639a7a23d6146107d857600080fd5b80638da5cb5b1461072f5780638ea5220f1461074d5780638fb12cd01461076d57600080fd5b80634fbee193116102a0578063715018a61161023e5780637bce5a04116102185780637bce5a04146106c45780638095d564146106da578063809d458d146106fa5780638a8c523c1461071a57600080fd5b8063715018a61461066f5780637571336a1461068457806375f0a874146106a457600080fd5b80636b2fb1241161027a5780636b2fb124146105ee5780636c4bb6ce146106045780636ddd17131461061957806370a082311461063957600080fd5b80634fbee193146105895780635c068a8c146105c25780636a486a8e146105d857600080fd5b806323b872dd1161030d57806339509351116102e757806339509351146104fb5780634626402b1461051b57806349bd5a5e1461053b5780634a62bb651461056f57600080fd5b806323b872dd146104a957806327c8f835146104c9578063313ce567146104df57600080fd5b80631694505e116103495780631694505e1461040657806318160ddd146104525780631816467f146104715780631f3fed8f1461049357600080fd5b806306fdde031461037b578063095ea7b3146103a657806310d5de53146103d657600080fd5b3661037657005b600080fd5b34801561038757600080fd5b50610390610a6c565b60405161039d91906126e2565b60405180910390f35b3480156103b257600080fd5b506103c66103c1366004612748565b610afe565b604051901515815260200161039d565b3480156103e257600080fd5b506103c66103f1366004612774565b601b6020526000908152604090205460ff1681565b34801561041257600080fd5b5061043a7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161039d565b34801561045e57600080fd5b506002545b60405190815260200161039d565b34801561047d57600080fd5b5061049161048c366004612774565b610b15565b005b34801561049f57600080fd5b5061046360175481565b3480156104b557600080fd5b506103c66104c4366004612791565b610ba5565b3480156104d557600080fd5b5061043a61dead81565b3480156104eb57600080fd5b506040516012815260200161039d565b34801561050757600080fd5b506103c6610516366004612748565b610c0e565b34801561052757600080fd5b5060075461043a906001600160a01b031681565b34801561054757600080fd5b5061043a7f00000000000000000000000054133b9d1408bce7dc3de75b86fadbc85fe7517781565b34801561057b57600080fd5b50600c546103c69060ff1681565b34801561059557600080fd5b506103c66105a4366004612774565b6001600160a01b03166000908152601a602052604090205460ff1690565b3480156105ce57600080fd5b5061046360115481565b3480156105e457600080fd5b5061046360135481565b3480156105fa57600080fd5b5061046360155481565b34801561061057600080fd5b506103c6610c44565b34801561062557600080fd5b50600c546103c69062010000900460ff1681565b34801561064557600080fd5b50610463610654366004612774565b6001600160a01b031660009081526020819052604090205490565b34801561067b57600080fd5b50610491610ce3565b34801561069057600080fd5b5061049161069f3660046127e2565b610d57565b3480156106b057600080fd5b5060065461043a906001600160a01b031681565b3480156106d057600080fd5b5061046360105481565b3480156106e657600080fd5b506104916106f5366004612817565b610dac565b34801561070657600080fd5b50610491610715366004612774565b610e54565b34801561072657600080fd5b50610491610edb565b34801561073b57600080fd5b506005546001600160a01b031661043a565b34801561075957600080fd5b5060085461043a906001600160a01b031681565b34801561077957600080fd5b50610491610788366004612843565b610f18565b34801561079957600080fd5b5061046360145481565b3480156107af57600080fd5b506104916107be36600461285c565b610ff5565b3480156107cf57600080fd5b5061039061103b565b3480156107e457600080fd5b506104916107f33660046127e2565b61104a565b34801561080457600080fd5b5061046360125481565b34801561081a57600080fd5b5061046360195481565b34801561083057600080fd5b5061046360165481565b34801561084657600080fd5b506103c6610855366004612748565b611129565b34801561086657600080fd5b506103c6610875366004612748565b611178565b34801561088657600080fd5b50610491610895366004612774565b611185565b3480156108a657600080fd5b506103c66108b5366004612774565b601c6020526000908152604090205460ff1681565b3480156108d657600080fd5b50600c546103c690610100900460ff1681565b3480156108f557600080fd5b506104916109043660046127e2565b61120c565b34801561091557600080fd5b50610491610924366004612817565b611295565b34801561093557600080fd5b50610491610944366004612843565b611338565b34801561095557600080fd5b50600e546103c69060ff1681565b34801561096f57600080fd5b5061046360095481565b34801561098557600080fd5b5061046360185481565b34801561099b57600080fd5b506103c66109aa366004612843565b611409565b3480156109bb57600080fd5b50610463600f5481565b3480156109d157600080fd5b506104636109e0366004612877565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a1757600080fd5b50610463600a5481565b348015610a2d57600080fd5b506103c6611560565b348015610a4257600080fd5b50610491610a51366004612774565b61159d565b348015610a6257600080fd5b50610463600b5481565b606060038054610a7b906128b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa7906128b0565b8015610af45780601f10610ac957610100808354040283529160200191610af4565b820191906000526020600020905b815481529060010190602001808311610ad757829003601f168201915b5050505050905090565b6000610b0b3384846116ee565b5060015b92915050565b6005546001600160a01b03163314610b485760405162461bcd60e51b8152600401610b3f906128ea565b60405180910390fd5b6008546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bb2848484611813565b610c048433610bff85604051806060016040528060288152602001612ae7602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612065565b6116ee565b5060019392505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610b0b918590610bff9086611688565b6000610c586005546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610c8157506008546001600160a01b031633145b80610c9657506008546001600160a01b031633145b610cd35760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5cd95960921b6044820152606401610b3f565b50600c805460ff19169055600190565b6005546001600160a01b03163314610d0d5760405162461bcd60e51b8152600401610b3f906128ea565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610d815760405162461bcd60e51b8152600401610b3f906128ea565b6001600160a01b03919091166000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610dd65760405162461bcd60e51b8152600401610b3f906128ea565b60108390556011829055601281905580610df08385612935565b610dfa9190612935565b600f819055600a1015610e4f5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610b3f565b505050565b6005546001600160a01b03163314610e7e5760405162461bcd60e51b8152600401610b3f906128ea565b6007546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f63590600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f055760405162461bcd60e51b8152600401610b3f906128ea565b600c805462ffff00191662010100179055565b6005546001600160a01b03163314610f425760405162461bcd60e51b8152600401610b3f906128ea565b670de0b6b3a76400006103e8610f5760025490565b610f62906001612948565b610f6c919061295f565b610f76919061295f565b811015610fdd5760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b3f565b610fef81670de0b6b3a7640000612948565b60095550565b6005546001600160a01b0316331461101f5760405162461bcd60e51b8152600401610b3f906128ea565b600c8054911515620100000262ff000019909216919091179055565b606060048054610a7b906128b0565b6005546001600160a01b031633146110745760405162461bcd60e51b8152600401610b3f906128ea565b7f00000000000000000000000054133b9d1408bce7dc3de75b86fadbc85fe751776001600160a01b0316826001600160a01b03160361111b5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b3f565b611125828261209f565b5050565b6000610b0b3384610bff85604051806060016040528060258152602001612b0f602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612065565b6000610b0b338484611813565b6005546001600160a01b031633146111af5760405162461bcd60e51b8152600401610b3f906128ea565b6006546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146112365760405162461bcd60e51b8152600401610b3f906128ea565b6001600160a01b0382166000818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146112bf5760405162461bcd60e51b8152600401610b3f906128ea565b601483905560158290556016819055806112d98385612935565b6112e39190612935565b6013819055600a1015610e4f5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610b3f565b6005546001600160a01b031633146113625760405162461bcd60e51b8152600401610b3f906128ea565b670de0b6b3a76400006103e861137760025490565b611382906005612948565b61138c919061295f565b611396919061295f565b8110156113f15760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b3f565b61140381670de0b6b3a7640000612948565b600b5550565b6005546000906001600160a01b031633146114365760405162461bcd60e51b8152600401610b3f906128ea565b620186a061144360025490565b61144e906001612948565b611458919061295f565b8210156114c55760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b3f565b6103e86114d160025490565b6114dc906005612948565b6114e6919061295f565b8211156115525760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b3f565b50600a81905560015b919050565b6005546000906001600160a01b0316331461158d5760405162461bcd60e51b8152600401610b3f906128ea565b50600e805460ff19169055600190565b6005546001600160a01b031633146115c75760405162461bcd60e51b8152600401610b3f906128ea565b6001600160a01b03811661162c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b3f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6000806116958385612935565b9050838110156116e75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b3f565b9392505050565b6001600160a01b0383166117505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b3f565b6001600160a01b0382166117b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b3f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166118395760405162461bcd60e51b8152600401610b3f90612981565b6001600160a01b03821661185f5760405162461bcd60e51b8152600401610b3f906129c6565b8060000361187357610e4f838360006120f3565b600c5460ff1615611d30576005546001600160a01b038481169116148015906118aa57506005546001600160a01b03838116911614155b80156118be57506001600160a01b03821615155b80156118d557506001600160a01b03821661dead14155b80156118eb5750600554600160a01b900460ff16155b15611d3057600c54610100900460ff16611983576001600160a01b0383166000908152601a602052604090205460ff168061193e57506001600160a01b0382166000908152601a602052604090205460ff165b6119835760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b3f565b600e5460ff1615611aca576005546001600160a01b038381169116148015906119de57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b8015611a1c57507f00000000000000000000000054133b9d1408bce7dc3de75b86fadbc85fe751776001600160a01b0316826001600160a01b031614155b15611aca57326000908152600d60205260409020544311611ab75760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b3f565b326000908152600d602052604090204390555b6001600160a01b0383166000908152601c602052604090205460ff168015611b0b57506001600160a01b0382166000908152601b602052604090205460ff16155b15611bef57600954811115611b805760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b3f565b600b546001600160a01b038316600090815260208190526040902054611ba69083612935565b1115611bea5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b3f565b611d30565b6001600160a01b0382166000908152601c602052604090205460ff168015611c3057506001600160a01b0383166000908152601b602052604090205460ff16155b15611ca657600954811115611bea5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b3f565b6001600160a01b0382166000908152601b602052604090205460ff16611d3057600b546001600160a01b038316600090815260208190526040902054611cec9083612935565b1115611d305760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b3f565b30600090815260208190526040902054600a5481108015908190611d5c5750600c5462010000900460ff165b8015611d725750600554600160a01b900460ff16155b8015611d9757506001600160a01b0385166000908152601c602052604090205460ff16155b8015611dbc57506001600160a01b0385166000908152601a602052604090205460ff16155b8015611de157506001600160a01b0384166000908152601a602052604090205460ff16155b15611e0f576005805460ff60a01b1916600160a01b179055611e016121fc565b6005805460ff60a01b191690555b6005546001600160a01b0386166000908152601a602052604090205460ff600160a01b909204821615911680611e5d57506001600160a01b0385166000908152601a602052604090205460ff165b15611e66575060005b60008115612051576001600160a01b0386166000908152601c602052604090205460ff168015611e9857506000601354115b15611f5657611ebd6064611eb7601354886123ee90919063ffffffff16565b90612470565b905060135460155482611ed09190612948565b611eda919061295f565b60186000828254611eeb9190612935565b9091555050601354601654611f009083612948565b611f0a919061295f565b60196000828254611f1b9190612935565b9091555050601354601454611f309083612948565b611f3a919061295f565b60176000828254611f4b9190612935565b909155506120339050565b6001600160a01b0387166000908152601c602052604090205460ff168015611f8057506000600f54115b1561203357611f9f6064611eb7600f54886123ee90919063ffffffff16565b9050600f5460115482611fb29190612948565b611fbc919061295f565b60186000828254611fcd9190612935565b9091555050600f54601254611fe29083612948565b611fec919061295f565b60196000828254611ffd9190612935565b9091555050600f546010546120129083612948565b61201c919061295f565b6017600082825461202d9190612935565b90915550505b8015612044576120448730836120f3565b61204e8186612a09565b94505b61205c8787876120f3565b50505050505050565b600081848411156120895760405162461bcd60e51b8152600401610b3f91906126e2565b5060006120968486612a09565b95945050505050565b6001600160a01b0382166000818152601c6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166121195760405162461bcd60e51b8152600401610b3f90612981565b6001600160a01b03821661213f5760405162461bcd60e51b8152600401610b3f906129c6565b61217c81604051806060016040528060268152602001612ac1602691396001600160a01b0386166000908152602081905260409020549190612065565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546121ab9082611688565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611806565b30600090815260208190526040812054905060006019546017546018546122239190612935565b61222d9190612935565b9050600082158061223c575081155b1561224657505050565b600a54612254906014612948565b83111561226c57600a54612269906014612948565b92505b47612276846124b2565b60006122824783612672565b9050600061229f85611eb7601754856123ee90919063ffffffff16565b905060006122bc86611eb7601954866123ee90919063ffffffff16565b90506000816122cb8486612a09565b6122d59190612a09565b60006018819055601781905560198190556008546040519293506001600160a01b031691849181818185875af1925050503d8060008114612332576040519150601f19603f3d011682016040523d82523d6000602084013e612337565b606091505b50506007546040519197506001600160a01b0316908290600081818185875af1925050503d8060008114612387576040519150601f19603f3d011682016040523d82523d6000602084013e61238c565b606091505b50506006546040519197506001600160a01b0316904790600081818185875af1925050503d80600081146123dc576040519150601f19603f3d011682016040523d82523d6000602084013e6123e1565b606091505b5050505050505050505050565b60008260000361240057506000610b0f565b600061240c8385612948565b905082612419858361295f565b146116e75760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b3f565b60006116e783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126b4565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106124e7576124e7612a1c565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612565573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125899190612a32565b8160018151811061259c5761259c612a1c565b60200260200101906001600160a01b031690816001600160a01b0316815250506125e7307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846116ee565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061263c908590600090869030904290600401612a4f565b600060405180830381600087803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b505050505050565b60006116e783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612065565b600081836126d55760405162461bcd60e51b8152600401610b3f91906126e2565b506000612096848661295f565b600060208083528351808285015260005b8181101561270f578581018301518582016040015282016126f3565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461274557600080fd5b50565b6000806040838503121561275b57600080fd5b823561276681612730565b946020939093013593505050565b60006020828403121561278657600080fd5b81356116e781612730565b6000806000606084860312156127a657600080fd5b83356127b181612730565b925060208401356127c181612730565b929592945050506040919091013590565b8035801515811461155b57600080fd5b600080604083850312156127f557600080fd5b823561280081612730565b915061280e602084016127d2565b90509250929050565b60008060006060848603121561282c57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561285557600080fd5b5035919050565b60006020828403121561286e57600080fd5b6116e7826127d2565b6000806040838503121561288a57600080fd5b823561289581612730565b915060208301356128a581612730565b809150509250929050565b600181811c908216806128c457607f821691505b6020821081036128e457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b0f57610b0f61291f565b8082028115828204841417610b0f57610b0f61291f565b60008261297c57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610b0f57610b0f61291f565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a4457600080fd5b81516116e781612730565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612a9f5784516001600160a01b031683529383019391830191600101612a7a565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220571a4e36616b86ef516fa0688bdbb0a30a26a3ff4930839d7788dcc9b450e5ee64736f6c63430008110033

Deployed Bytecode Sourcemap

29494:15802:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7650:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9817:169;;;;;;;;;;-1:-1:-1;9817:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;9817:169:0;1023:187:1;30893:64:0;;;;;;;;;;-1:-1:-1;30893:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29570:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1658:32:1;;;1640:51;;1628:2;1613:18;29570:51:0;1467:230:1;8770:108:0;;;;;;;;;;-1:-1:-1;8858:12:0;;8770:108;;;1848:25:1;;;1836:2;1821:18;8770:108:0;1702:177:1;38444:157:0;;;;;;;;;;-1:-1:-1;38444:157:0;;;;;:::i;:::-;;:::i;:::-;;30633:33;;;;;;;;;;;;;;;;10468:355;;;;;;;;;;-1:-1:-1;10468:355:0;;;;;:::i;:::-;;:::i;29673:53::-;;;;;;;;;;;;29719:6;29673:53;;8612:93;;;;;;;;;;-1:-1:-1;8612:93:0;;8695:2;2695:36:1;;2683:2;2668:18;8612:93:0;2553:184:1;11232:218:0;;;;;;;;;;-1:-1:-1;11232:218:0;;;;;:::i;:::-;;:::i;29802:29::-;;;;;;;;;;-1:-1:-1;29802:29:0;;;;-1:-1:-1;;;;;29802:29:0;;;29628:38;;;;;;;;;;;;;;;29990:33;;;;;;;;;;-1:-1:-1;29990:33:0;;;;;;;;38613:125;;;;;;;;;;-1:-1:-1;38613:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;38702:28:0;38678:4;38702:28;;;:19;:28;;;;;;;;;38613:125;30412:29;;;;;;;;;;;;;;;;30485:28;;;;;;;;;;;;;;;;30558:30;;;;;;;;;;;;;;;;34886:234;;;;;;;;;;;;;:::i;30070:31::-;;;;;;;;;;-1:-1:-1;30070:31:0;;;;;;;;;;;8941:127;;;;;;;;;;-1:-1:-1;8941:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;9042:18:0;9015:7;9042:18;;;;;;;;;;;;8941:127;22115:148;;;;;;;;;;;;;:::i;36261:144::-;;;;;;;;;;-1:-1:-1;36261:144:0;;;;;:::i;:::-;;:::i;29765:30::-;;;;;;;;;;-1:-1:-1;29765:30:0;;;;-1:-1:-1;;;;;29765:30:0;;;30375;;;;;;;;;;;;;;;;36618:365;;;;;;;;;;-1:-1:-1;36618:365:0;;;;;:::i;:::-;;:::i;38231:201::-;;;;;;;;;;-1:-1:-1;38231:201:0;;;;;:::i;:::-;;:::i;34718:112::-;;;;;;;;;;;;;:::i;21473:79::-;;;;;;;;;;-1:-1:-1;21538:6:0;;-1:-1:-1;;;;;21538:6:0;21473:79;;29838:24;;;;;;;;;;-1:-1:-1;29838:24:0;;;;-1:-1:-1;;;;;29838:24:0;;;35787:239;;;;;;;;;;-1:-1:-1;35787:239:0;;;;;:::i;:::-;;:::i;30520:31::-;;;;;;;;;;;;;;;;36505:101;;;;;;;;;;-1:-1:-1;36505:101:0;;;;;:::i;:::-;;:::i;7869:104::-;;;;;;;;;;;;;:::i;37567:244::-;;;;;;;;;;-1:-1:-1;37567:244:0;;;;;:::i;:::-;;:::i;30448:24::-;;;;;;;;;;;;;;;;30712:27;;;;;;;;;;;;;;;;30595:25;;;;;;;;;;;;;;;;11953:269;;;;;;;;;;-1:-1:-1;11953:269:0;;;;;:::i;:::-;;:::i;9281:175::-;;;;;;;;;;-1:-1:-1;9281:175:0;;;;;:::i;:::-;;:::i;38015:208::-;;;;;;;;;;-1:-1:-1;38015:208:0;;;;;:::i;:::-;;:::i;31115:58::-;;;;;;;;;;-1:-1:-1;31115:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;30030:33;;;;;;;;;;-1:-1:-1;30030:33:0;;;;;;;;;;;37377:182;;;;;;;;;;-1:-1:-1;37377:182:0;;;;;:::i;:::-;;:::i;36995:374::-;;;;;;;;;;-1:-1:-1;36995:374:0;;;;;:::i;:::-;;:::i;36034:215::-;;;;;;;;;;-1:-1:-1;36034:215:0;;;;;:::i;:::-;;:::i;30293:39::-;;;;;;;;;;-1:-1:-1;30293:39:0;;;;;;;;29875:35;;;;;;;;;;;;;;;;30673:32;;;;;;;;;;;;;;;;35394:381;;;;;;;;;;-1:-1:-1;35394:381:0;;;;;:::i;:::-;;:::i;30341:27::-;;;;;;;;;;;;;;;;9519:151;;;;;;;;;;-1:-1:-1;9519:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;9635:18:0;;;9608:7;9635:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9519:151;29917:33;;;;;;;;;;;;;;;;35185:134;;;;;;;;;;;;;:::i;22418:244::-;;;;;;;;;;-1:-1:-1;22418:244:0;;;;;:::i;:::-;;:::i;29957:24::-;;;;;;;;;;;;;;;;7650:100;7704:13;7737:5;7730:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7650:100;:::o;9817:169::-;9900:4;9917:39;365:10;9940:7;9949:6;9917:8;:39::i;:::-;-1:-1:-1;9974:4:0;9817:169;;;;;:::o;38444:157::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;;;;;;;;;38551:9:::1;::::0;38523:38:::1;::::0;-1:-1:-1;;;;;38551:9:0;;::::1;::::0;38523:38;::::1;::::0;::::1;::::0;38551:9:::1;::::0;38523:38:::1;38572:9;:21:::0;;-1:-1:-1;;;;;;38572:21:0::1;-1:-1:-1::0;;;;;38572:21:0;;;::::1;::::0;;;::::1;::::0;;38444:157::o;10468:355::-;10608:4;10625:36;10635:6;10643:9;10654:6;10625:9;:36::i;:::-;10672:121;10681:6;365:10;10703:89;10741:6;10703:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10703:19:0;;;;;;:11;:19;;;;;;;;365:10;10703:33;;;;;;;;;;:37;:89::i;:::-;10672:8;:121::i;:::-;-1:-1:-1;10811:4:0;10468:355;;;;;:::o;11232:218::-;365:10;11320:4;11369:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11369:34:0;;;;;;;;;;11320:4;;11337:83;;11360:7;;11369:50;;11408:10;11369:38;:50::i;34886:234::-;34938:4;34977:7;21538:6;;-1:-1:-1;;;;;21538:6:0;;21473:79;34977:7;-1:-1:-1;;;;;34963:21:0;:10;-1:-1:-1;;;;;34963:21:0;;:48;;;-1:-1:-1;35002:9:0;;-1:-1:-1;;;;;35002:9:0;34988:10;:23;34963:48;:75;;;-1:-1:-1;35029:9:0;;-1:-1:-1;;;;;35029:9:0;35015:10;:23;34963:75;34955:102;;;;-1:-1:-1;;;34955:102:0;;5259:2:1;34955:102:0;;;5241:21:1;5298:2;5278:18;;;5271:30;-1:-1:-1;;;5317:18:1;;;5310:44;5371:18;;34955:102:0;5057:338:1;34955:102:0;-1:-1:-1;35068:14:0;:22;;-1:-1:-1;;35068:22:0;;;;;34886:234::o;22115:148::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;22206:6:::1;::::0;22185:40:::1;::::0;22222:1:::1;::::0;-1:-1:-1;;;;;22206:6:0::1;::::0;22185:40:::1;::::0;22222:1;;22185:40:::1;22236:6;:19:::0;;-1:-1:-1;;;;;;22236:19:0::1;::::0;;22115:148::o;36261:144::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36351:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;36351:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36261:144::o;36618:365::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;36733:15:::1;:31:::0;;;36775:14:::1;:29:::0;;;36815:9:::1;:19:::0;;;36827:7;36860:32:::1;36792:12:::0;36751:13;36860:32:::1;:::i;:::-;:44;;;;:::i;:::-;36845:12;:59:::0;;;36939:2:::1;-1:-1:-1::0;36923:18:0::1;36915:60;;;::::0;-1:-1:-1;;;36915:60:0;;5864:2:1;36915:60:0::1;::::0;::::1;5846:21:1::0;5903:2;5883:18;;;5876:30;5942:31;5922:18;;;5915:59;5991:18;;36915:60:0::1;5662:353:1::0;36915:60:0::1;36618:365:::0;;;:::o;38231:201::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;38364:14:::1;::::0;38323:56:::1;::::0;-1:-1:-1;;;;;38364:14:0;;::::1;::::0;38323:56;::::1;::::0;::::1;::::0;38364:14:::1;::::0;38323:56:::1;38390:14;:34:::0;;-1:-1:-1;;;;;;38390:34:0::1;-1:-1:-1::0;;;;;38390:34:0;;;::::1;::::0;;;::::1;::::0;;38231:201::o;34718:112::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;34773:13:::1;:20:::0;;-1:-1:-1;;34804:18:0;;;;;34718:112::o;35787:239::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;35911:4:::1;35905;35885:13;8858:12:::0;;;8770:108;35885:13:::1;:17;::::0;35901:1:::1;35885:17;:::i;:::-;:24;;;;:::i;:::-;35884:31;;;;:::i;:::-;35874:6;:41;;35866:101;;;::::0;-1:-1:-1;;;35866:101:0;;6617:2:1;35866:101:0::1;::::0;::::1;6599:21:1::0;6656:2;6636:18;;;6629:30;6695:34;6675:18;;;6668:62;-1:-1:-1;;;6746:18:1;;;6739:45;6801:19;;35866:101:0::1;6415:411:1::0;35866:101:0::1;36001:17;:6:::0;36011::::1;36001:17;:::i;:::-;35978:20;:40:::0;-1:-1:-1;35787:239:0:o;36505:101::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;36577:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;36577:21:0;;::::1;::::0;;;::::1;::::0;;36505:101::o;7869:104::-;7925:13;7958:7;7951:14;;;;;:::i;37567:244::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;37674:13:::1;-1:-1:-1::0;;;;;37666:21:0::1;:4;-1:-1:-1::0;;;;;37666:21:0::1;::::0;37658:91:::1;;;::::0;-1:-1:-1;;;37658:91:0;;7033:2:1;37658:91:0::1;::::0;::::1;7015:21:1::0;7072:2;7052:18;;;7045:30;7111:34;7091:18;;;7084:62;7182:27;7162:18;;;7155:55;7227:19;;37658:91:0::1;6831:421:1::0;37658:91:0::1;37762:41;37791:4;37797:5;37762:28;:41::i;:::-;37567:244:::0;;:::o;11953:269::-;12046:4;12063:129;365:10;12086:7;12095:96;12134:15;12095:96;;;;;;;;;;;;;;;;;365:10;12095:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12095:34:0;;;;;;;;;;;;:38;:96::i;9281:175::-;9367:4;9384:42;365:10;9408:9;9419:6;9384:9;:42::i;38015:208::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;38152:15:::1;::::0;38109:59:::1;::::0;-1:-1:-1;;;;;38152:15:0;;::::1;::::0;38109:59;::::1;::::0;::::1;::::0;38152:15:::1;::::0;38109:59:::1;38179:15;:36:::0;;-1:-1:-1;;;;;;38179:36:0::1;-1:-1:-1::0;;;;;38179:36:0;;;::::1;::::0;;;::::1;::::0;;38015:208::o;37377:182::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37462:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;37462:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37517:34;;1163:41:1;;;37517:34:0::1;::::0;1136:18:1;37517:34:0::1;;;;;;;37377:182:::0;;:::o;36995:374::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;37111:16:::1;:32:::0;;;37154:15:::1;:30:::0;;;37195:10:::1;:20:::0;;;37208:7;37242:34:::1;37172:12:::0;37130:13;37242:34:::1;:::i;:::-;:47;;;;:::i;:::-;37226:13;:63:::0;;;37325:2:::1;-1:-1:-1::0;37308:19:0::1;37300:61;;;::::0;-1:-1:-1;;;37300:61:0;;5864:2:1;37300:61:0::1;::::0;::::1;5846:21:1::0;5903:2;5883:18;;;5876:30;5942:31;5922:18;;;5915:59;5991:18;;37300:61:0::1;5662:353:1::0;36034:215:0;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;36156:4:::1;36150;36130:13;8858:12:::0;;;8770:108;36130:13:::1;:17;::::0;36146:1:::1;36130:17;:::i;:::-;:24;;;;:::i;:::-;36129:31;;;;:::i;:::-;36119:6;:41;;36111:90;;;::::0;-1:-1:-1;;;36111:90:0;;7459:2:1;36111:90:0::1;::::0;::::1;7441:21:1::0;7498:2;7478:18;;;7471:30;7537:34;7517:18;;;7510:62;-1:-1:-1;;;7588:18:1;;;7581:34;7632:19;;36111:90:0::1;7257:400:1::0;36111:90:0::1;36224:17;:6:::0;36234::::1;36224:17;:::i;:::-;36212:9;:29:::0;-1:-1:-1;36034:215:0:o;35394:381::-;21685:6;;35475:4;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;35531:6:::1;35511:13;8858:12:::0;;;8770:108;35511:13:::1;:17;::::0;35527:1:::1;35511:17;:::i;:::-;:26;;;;:::i;:::-;35498:9;:39;;35490:105;;;::::0;-1:-1:-1;;;35490:105:0;;7864:2:1;35490:105:0::1;::::0;::::1;7846:21:1::0;7903:2;7883:18;;;7876:30;7942:34;7922:18;;;7915:62;-1:-1:-1;;;7993:18:1;;;7986:51;8054:19;;35490:105:0::1;7662:417:1::0;35490:105:0::1;35646:4;35626:13;8858:12:::0;;;8770:108;35626:13:::1;:17;::::0;35642:1:::1;35626:17;:::i;:::-;:24;;;;:::i;:::-;35613:9;:37;;35605:102;;;::::0;-1:-1:-1;;;35605:102:0;;8286:2:1;35605:102:0::1;::::0;::::1;8268:21:1::0;8325:2;8305:18;;;8298:30;8364:34;8344:18;;;8337:62;-1:-1:-1;;;8415:18:1;;;8408:50;8475:19;;35605:102:0::1;8084:416:1::0;35605:102:0::1;-1:-1:-1::0;35717:18:0::1;:30:::0;;;35764:4:::1;21755:1;35394:381:::0;;;:::o;35185:134::-;21685:6;;35245:4;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;-1:-1:-1;35261:20:0::1;:28:::0;;-1:-1:-1;;35261:28:0::1;::::0;;;35185:134;:::o;22418:244::-;21685:6;;-1:-1:-1;;;;;21685:6:0;365:10;21685:22;21677:67;;;;-1:-1:-1;;;21677:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22507:22:0;::::1;22499:73;;;::::0;-1:-1:-1;;;22499:73:0;;8707:2:1;22499:73:0::1;::::0;::::1;8689:21:1::0;8746:2;8726:18;;;8719:30;8785:34;8765:18;;;8758:62;-1:-1:-1;;;8836:18:1;;;8829:36;8882:19;;22499:73:0::1;8505:402:1::0;22499:73:0::1;22609:6;::::0;22588:38:::1;::::0;-1:-1:-1;;;;;22588:38:0;;::::1;::::0;22609:6:::1;::::0;22588:38:::1;::::0;22609:6:::1;::::0;22588:38:::1;22637:6;:17:::0;;-1:-1:-1;;;;;;22637:17:0::1;-1:-1:-1::0;;;;;22637:17:0;;;::::1;::::0;;;::::1;::::0;;22418:244::o;16517:181::-;16575:7;;16607:5;16611:1;16607;:5;:::i;:::-;16595:17;;16636:1;16631;:6;;16623:46;;;;-1:-1:-1;;;16623:46:0;;9114:2:1;16623:46:0;;;9096:21:1;9153:2;9133:18;;;9126:30;9192:29;9172:18;;;9165:57;9239:18;;16623:46:0;8912:351:1;16623:46:0;16689:1;16517:181;-1:-1:-1;;;16517:181:0:o;15139:380::-;-1:-1:-1;;;;;15275:19:0;;15267:68;;;;-1:-1:-1;;;15267:68:0;;9470:2:1;15267:68:0;;;9452:21:1;9509:2;9489:18;;;9482:30;9548:34;9528:18;;;9521:62;-1:-1:-1;;;9599:18:1;;;9592:34;9643:19;;15267:68:0;9268:400:1;15267:68:0;-1:-1:-1;;;;;15354:21:0;;15346:68;;;;-1:-1:-1;;;15346:68:0;;9875:2:1;15346:68:0;;;9857:21:1;9914:2;9894:18;;;9887:30;9953:34;9933:18;;;9926:62;-1:-1:-1;;;10004:18:1;;;9997:32;10046:19;;15346:68:0;9673:398:1;15346:68:0;-1:-1:-1;;;;;15427:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15479:32;;1848:25:1;;;15479:32:0;;1821:18:1;15479:32:0;;;;;;;;15139:380;;;:::o;38800:4110::-;-1:-1:-1;;;;;38932:18:0;;38924:68;;;;-1:-1:-1;;;38924:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39011:16:0;;39003:64;;;;-1:-1:-1;;;39003:64:0;;;;;;;:::i;:::-;39092:6;39102:1;39092:11;39089:92;;39120:28;39136:4;39142:2;39146:1;39120:15;:28::i;39089:92::-;39204:14;;;;39201:1841;;;21538:6;;-1:-1:-1;;;;;39256:15:0;;;21538:6;;39256:15;;;;:49;;-1:-1:-1;21538:6:0;;-1:-1:-1;;;;;39292:13:0;;;21538:6;;39292:13;;39256:49;:86;;;;-1:-1:-1;;;;;;39326:16:0;;;;39256:86;:128;;;;-1:-1:-1;;;;;;39363:21:0;;39377:6;39363:21;;39256:128;:158;;;;-1:-1:-1;39406:8:0;;-1:-1:-1;;;39406:8:0;;;;39405:9;39256:158;39234:1797;;;39452:13;;;;;;;39448:148;;-1:-1:-1;;;;;39497:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;39526:23:0;;;;;;:19;:23;;;;;;;;39497:52;39489:87;;;;-1:-1:-1;;;39489:87:0;;11088:2:1;39489:87:0;;;11070:21:1;11127:2;11107:18;;;11100:30;-1:-1:-1;;;11146:18:1;;;11139:52;11208:18;;39489:87:0;10886:346:1;39489:87:0;39754:20;;;;39750:423;;;21538:6;;-1:-1:-1;;;;;39802:13:0;;;21538:6;;39802:13;;;;:47;;;39833:15;-1:-1:-1;;;;;39819:30:0;:2;-1:-1:-1;;;;;39819:30:0;;;39802:47;:79;;;;;39867:13;-1:-1:-1;;;;;39853:28:0;:2;-1:-1:-1;;;;;39853:28:0;;;39802:79;39798:356;;;39946:9;39917:39;;;;:28;:39;;;;;;39959:12;-1:-1:-1;39909:140:0;;;;-1:-1:-1;;;39909:140:0;;11439:2:1;39909:140:0;;;11421:21:1;11478:2;11458:18;;;11451:30;11517:34;11497:18;;;11490:62;11588:34;11568:18;;;11561:62;-1:-1:-1;;;11639:19:1;;;11632:40;11689:19;;39909:140:0;11237:477:1;39909:140:0;40105:9;40076:39;;;;:28;:39;;;;;40118:12;40076:54;;39798:356;-1:-1:-1;;;;;40242:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;40278:35:0;;;;;;:31;:35;;;;;;;;40277:36;40242:71;40238:778;;;40360:20;;40350:6;:30;;40342:96;;;;-1:-1:-1;;;40342:96:0;;11921:2:1;40342:96:0;;;11903:21:1;11960:2;11940:18;;;11933:30;11999:34;11979:18;;;11972:62;-1:-1:-1;;;12050:18:1;;;12043:51;12111:19;;40342:96:0;11719:417:1;40342:96:0;40499:9;;-1:-1:-1;;;;;9042:18:0;;9015:7;9042:18;;;;;;;;;;;40473:22;;:6;:22;:::i;:::-;:35;;40465:67;;;;-1:-1:-1;;;40465:67:0;;12343:2:1;40465:67:0;;;12325:21:1;12382:2;12362:18;;;12355:30;-1:-1:-1;;;12401:18:1;;;12394:49;12460:18;;40465:67:0;12141:343:1;40465:67:0;40238:778;;;-1:-1:-1;;;;;40626:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;40660:37:0;;;;;;:31;:37;;;;;;;;40659:38;40626:71;40622:394;;;40744:20;;40734:6;:30;;40726:97;;;;-1:-1:-1;;;40726:97:0;;12691:2:1;40726:97:0;;;12673:21:1;12730:2;12710:18;;;12703:30;12769:34;12749:18;;;12742:62;-1:-1:-1;;;12820:18:1;;;12813:52;12882:19;;40726:97:0;12489:418:1;40622:394:0;-1:-1:-1;;;;;40870:35:0;;;;;;:31;:35;;;;;;;;40866:150;;40963:9;;-1:-1:-1;;;;;9042:18:0;;9015:7;9042:18;;;;;;;;;;;40937:22;;:6;:22;:::i;:::-;:35;;40929:67;;;;-1:-1:-1;;;40929:67:0;;12343:2:1;40929:67:0;;;12325:21:1;12382:2;12362:18;;;12355:30;-1:-1:-1;;;12401:18:1;;;12394:49;12460:18;;40929:67:0;12141:343:1;40929:67:0;41105:4;41056:28;9042:18;;;;;;;;;;;41171;;41147:42;;;;;;;41220:35;;-1:-1:-1;41244:11:0;;;;;;;41220:35;:61;;;;-1:-1:-1;41273:8:0;;-1:-1:-1;;;41273:8:0;;;;41272:9;41220:61;:110;;;;-1:-1:-1;;;;;;41299:31:0;;;;;;:25;:31;;;;;;;;41298:32;41220:110;:153;;;;-1:-1:-1;;;;;;41348:25:0;;;;;;:19;:25;;;;;;;;41347:26;41220:153;:194;;;;-1:-1:-1;;;;;;41391:23:0;;;;;;:19;:23;;;;;;;;41390:24;41220:194;41202:338;;;41441:8;:15;;-1:-1:-1;;;;41441:15:0;-1:-1:-1;;;41441:15:0;;;41485:10;:8;:10::i;:::-;41512:8;:16;;-1:-1:-1;;;;41512:16:0;;;41202:338;41568:8;;-1:-1:-1;;;;;41677:25:0;;41552:12;41677:25;;;:19;:25;;;;;;41568:8;-1:-1:-1;;;41568:8:0;;;;;41567:9;;41677:25;;:52;;-1:-1:-1;;;;;;41706:23:0;;;;;;:19;:23;;;;;;;;41677:52;41674:99;;;-1:-1:-1;41756:5:0;41674:99;41793:12;41897:7;41894:963;;;-1:-1:-1;;;;;41948:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;41997:1;41981:13;;:17;41948:50;41944:744;;;42025:34;42055:3;42025:25;42036:13;;42025:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;42018:41;;42124:13;;42106:15;;42099:4;:22;;;;:::i;:::-;:38;;;;:::i;:::-;42078:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;42192:13:0;;42179:10;;42172:17;;:4;:17;:::i;:::-;:33;;;;:::i;:::-;42156:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;42272:13:0;;42253:16;;42246:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;42224:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;41944:744:0;;-1:-1:-1;41944:744:0;;-1:-1:-1;;;;;42346:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;42396:1;42381:12;;:16;42346:51;42343:345;;;42422:33;42451:3;42422:24;42433:12;;42422:6;:10;;:24;;;;:::i;:33::-;42415:40;;42516:12;;42499:14;;42492:4;:21;;;;:::i;:::-;:36;;;;:::i;:::-;42471:17;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;42582:12:0;;42570:9;;42563:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;42547:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;42660:12:0;;42642:15;;42635:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;42613:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;42343:345:0;42719:8;;42716:93;;42751:42;42767:4;42781;42788;42751:15;:42::i;:::-;42831:14;42841:4;42831:14;;:::i;:::-;;;41894:963;42869:33;42885:4;42891:2;42895:6;42869:15;:33::i;:::-;38913:3997;;;;38800:4110;;;:::o;17420:192::-;17506:7;17542:12;17534:6;;;;17526:29;;;;-1:-1:-1;;;17526:29:0;;;;;;;;:::i;:::-;-1:-1:-1;17566:9:0;17578:5;17582:1;17578;:5;:::i;:::-;17566:17;17420:192;-1:-1:-1;;;;;17420:192:0:o;37819:188::-;-1:-1:-1;;;;;37902:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;37902:39:0;;;;;;;;;;37959:40;;37902:39;;:31;37959:40;;;37819:188;;:::o;12712:573::-;-1:-1:-1;;;;;12852:20:0;;12844:70;;;;-1:-1:-1;;;12844:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12933:23:0;;12925:71;;;;-1:-1:-1;;;12925:71:0;;;;;;;:::i;:::-;13089;13111:6;13089:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13089:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;13069:17:0;;;:9;:17;;;;;;;;;;;:91;;;;13194:20;;;;;;;:32;;13219:6;13194:24;:32::i;:::-;-1:-1:-1;;;;;13171:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;13242:35;1848:25:1;;;13171:20:0;;13242:35;;;;;;1821:18:1;13242:35:0;1702:177:1;44056:1237:0;44139:4;44095:23;9042:18;;;;;;;;;;;44095:50;;44156:25;44225:12;;44204:18;;44184:17;;:38;;;;:::i;:::-;:53;;;;:::i;:::-;44156:81;-1:-1:-1;44248:12:0;44284:20;;;:46;;-1:-1:-1;44308:22:0;;44284:46;44281:60;;;44333:7;;;44056:1237::o;44281:60::-;44374:18;;:23;;44395:2;44374:23;:::i;:::-;44356:15;:41;44353:111;;;44429:18;;:23;;44450:2;44429:23;:::i;:::-;44411:41;;44353:111;44512:21;44546:33;44563:15;44546:16;:33::i;:::-;44601:18;44622:44;:21;44648:17;44622:25;:44::i;:::-;44601:65;;44687:23;44713:57;44752:17;44713:34;44728:18;;44713:10;:14;;:34;;;;:::i;:57::-;44687:83;;44781:17;44801:51;44834:17;44801:28;44816:12;;44801:10;:14;;:28;;;;:::i;:51::-;44781:71;-1:-1:-1;44863:22:0;44781:71;44888:28;44901:15;44888:10;:28;:::i;:::-;:40;;;;:::i;:::-;44969:1;44949:17;:21;;;44981:18;:22;;;45014:12;:16;;;45072:9;;45064:45;;44863:65;;-1:-1:-1;;;;;;45072:9:0;;45095;;45064:45;44969:1;45064:45;45095:9;45072;45064:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45149:14:0;;45141:55;;45051:58;;-1:-1:-1;;;;;;45149:14:0;;45177;;45141:55;;;;45177:14;45149;45141:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45230:15:0;;45222:63;;45128:68;;-1:-1:-1;;;;;;45230:15:0;;45259:21;;45222:63;;;;45259:21;45230:15;45222:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44056:1237:0:o;17871:471::-;17929:7;18174:1;18179;18174:6;18170:47;;-1:-1:-1;18204:1:0;18197:8;;18170:47;18229:9;18241:5;18245:1;18241;:5;:::i;:::-;18229:17;-1:-1:-1;18274:1:0;18265:5;18269:1;18229:17;18265:5;:::i;:::-;:10;18257:56;;;;-1:-1:-1;;;18257:56:0;;13457:2:1;18257:56:0;;;13439:21:1;13496:2;13476:18;;;13469:30;13535:34;13515:18;;;13508:62;-1:-1:-1;;;13586:18:1;;;13579:31;13627:19;;18257:56:0;13255:397:1;18818:132:0;18876:7;18903:39;18907:1;18910;18903:39;;;;;;;;;;;;;;;;;:3;:39::i;42918:601::-;43070:16;;;43084:1;43070:16;;;;;;;;43046:21;;43070:16;;;;;;;;;;-1:-1:-1;43070:16:0;43046:40;;43115:4;43097;43102:1;43097:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;43097:23:0;;;-1:-1:-1;;;;;43097:23:0;;;;;43141:15;-1:-1:-1;;;;;43141:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43131:4;43136:1;43131:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;43131:32:0;;;-1:-1:-1;;;;;43131:32:0;;;;;43176:62;43193:4;43208:15;43226:11;43176:8;:62::i;:::-;43277:224;;-1:-1:-1;;;43277:224:0;;-1:-1:-1;;;;;43277:15:0;:66;;;;:224;;43358:11;;43384:1;;43428:4;;43455;;43475:15;;43277:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42973:546;42918:601;:::o;16981:136::-;17039:7;17066:43;17070:1;17073;17066:43;;;;;;;;;;;;;;;;;:3;:43::i;19446:278::-;19532:7;19567:12;19560:5;19552:28;;;;-1:-1:-1;;;19552:28:0;;;;;;;;:::i;:::-;-1:-1:-1;19591:9:0;19603:5;19607:1;19603;:5;:::i;14:548:1:-;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;1884:456::-;1961:6;1969;1977;2030:2;2018:9;2009:7;2005:23;2001:32;1998:52;;;2046:1;2043;2036:12;1998:52;2085:9;2072:23;2104:31;2129:5;2104:31;:::i;:::-;2154:5;-1:-1:-1;2211:2:1;2196:18;;2183:32;2224:33;2183:32;2224:33;:::i;:::-;1884:456;;2276:7;;-1:-1:-1;;;2330:2:1;2315:18;;;;2302:32;;1884:456::o;2742:160::-;2807:20;;2863:13;;2856:21;2846:32;;2836:60;;2892:1;2889;2882:12;2907:315;2972:6;2980;3033:2;3021:9;3012:7;3008:23;3004:32;3001:52;;;3049:1;3046;3039:12;3001:52;3088:9;3075:23;3107:31;3132:5;3107:31;:::i;:::-;3157:5;-1:-1:-1;3181:35:1;3212:2;3197:18;;3181:35;:::i;:::-;3171:45;;2907:315;;;;;:::o;3227:316::-;3304:6;3312;3320;3373:2;3361:9;3352:7;3348:23;3344:32;3341:52;;;3389:1;3386;3379:12;3341:52;-1:-1:-1;;3412:23:1;;;3482:2;3467:18;;3454:32;;-1:-1:-1;3533:2:1;3518:18;;;3505:32;;3227:316;-1:-1:-1;3227:316:1:o;3548:180::-;3607:6;3660:2;3648:9;3639:7;3635:23;3631:32;3628:52;;;3676:1;3673;3666:12;3628:52;-1:-1:-1;3699:23:1;;3548:180;-1:-1:-1;3548:180:1:o;3733:::-;3789:6;3842:2;3830:9;3821:7;3817:23;3813:32;3810:52;;;3858:1;3855;3848:12;3810:52;3881:26;3897:9;3881:26;:::i;3918:388::-;3986:6;3994;4047:2;4035:9;4026:7;4022:23;4018:32;4015:52;;;4063:1;4060;4053:12;4015:52;4102:9;4089:23;4121:31;4146:5;4121:31;:::i;:::-;4171:5;-1:-1:-1;4228:2:1;4213:18;;4200:32;4241:33;4200:32;4241:33;:::i;:::-;4293:7;4283:17;;;3918:388;;;;;:::o;4311:380::-;4390:1;4386:12;;;;4433;;;4454:61;;4508:4;4500:6;4496:17;4486:27;;4454:61;4561:2;4553:6;4550:14;4530:18;4527:38;4524:161;;4607:10;4602:3;4598:20;4595:1;4588:31;4642:4;4639:1;4632:15;4670:4;4667:1;4660:15;4524:161;;4311:380;;;:::o;4696:356::-;4898:2;4880:21;;;4917:18;;;4910:30;4976:34;4971:2;4956:18;;4949:62;5043:2;5028:18;;4696:356::o;5400:127::-;5461:10;5456:3;5452:20;5449:1;5442:31;5492:4;5489:1;5482:15;5516:4;5513:1;5506:15;5532:125;5597:9;;;5618:10;;;5615:36;;;5631:18;;:::i;6020:168::-;6093:9;;;6124;;6141:15;;;6135:22;;6121:37;6111:71;;6162:18;;:::i;6193:217::-;6233:1;6259;6249:132;;6303:10;6298:3;6294:20;6291:1;6284:31;6338:4;6335:1;6328:15;6366:4;6363:1;6356:15;6249:132;-1:-1:-1;6395:9:1;;6193:217::o;10076:401::-;10278:2;10260:21;;;10317:2;10297:18;;;10290:30;10356:34;10351:2;10336:18;;10329:62;-1:-1:-1;;;10422:2:1;10407:18;;10400:35;10467:3;10452:19;;10076:401::o;10482:399::-;10684:2;10666:21;;;10723:2;10703:18;;;10696:30;10762:34;10757:2;10742:18;;10735:62;-1:-1:-1;;;10828:2:1;10813:18;;10806:33;10871:3;10856:19;;10482:399::o;12912:128::-;12979:9;;;13000:11;;;12997:37;;;13014:18;;:::i;13789:127::-;13850:10;13845:3;13841:20;13838:1;13831:31;13881:4;13878:1;13871:15;13905:4;13902:1;13895:15;13921:251;13991:6;14044:2;14032:9;14023:7;14019:23;14015:32;14012:52;;;14060:1;14057;14050:12;14012:52;14092:9;14086:16;14111:31;14136:5;14111:31;:::i;14177:980::-;14439:4;14487:3;14476:9;14472:19;14518:6;14507:9;14500:25;14544:2;14582:6;14577:2;14566:9;14562:18;14555:34;14625:3;14620:2;14609:9;14605:18;14598:31;14649:6;14684;14678:13;14715:6;14707;14700:22;14753:3;14742:9;14738:19;14731:26;;14792:2;14784:6;14780:15;14766:29;;14813:1;14823:195;14837:6;14834:1;14831:13;14823:195;;;14902:13;;-1:-1:-1;;;;;14898:39:1;14886:52;;14993:15;;;;14958:12;;;;14934:1;14852:9;14823:195;;;-1:-1:-1;;;;;;;15074:32:1;;;;15069:2;15054:18;;15047:60;-1:-1:-1;;;15138:3:1;15123:19;15116:35;15035:3;14177:980;-1:-1:-1;;;14177:980:1:o

Swarm Source

ipfs://571a4e36616b86ef516fa0688bdbb0a30a26a3ff4930839d7788dcc9b450e5ee
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.