ETH Price: $3,698.92 (+1.24%)

Token

ERC-20: Sappy (SAPPY)
 

Overview

Max Total Supply

1,000,000,000 SAPPY

Holders

97

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
7,425,000 SAPPY

Value
$0.00
0xd6754663eb7a212f9adc41417857998d1196e061
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:
SAPPY

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-09-17
*/

// SPDX-License-Identifier: MIT

/*


⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣠⡶⠟⠛⠉⠉⠉⠀⠈⠉⠉⠉⠛⠷⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣠⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⡀⠀⠀⠀⢰⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢿⡇⠀⠀⠀⣾⠁⠠⠀⠀⠀⠀⠀⠀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣿⢰⣿⡷⣀⣄⡀⠀⠠⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠐⠶⣼⡏⠘⠛⠁⢴⣦⡇⡀⠀⠙⠛⠛⠁⠖⠚⠉⠀⠀⠀⠀⢸⢧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠐⠒⣿⠀⠀⠀⠳⠼⠧⠤⠝⠁⠀⠀⠀⠐⠒⠲⠆⠀⠀⠀⠀⠑⠘⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠒⢻⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠙⢷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠙⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⡀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣦⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡏⠀⠀⠀⠀⠀⢠⡀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢷⡄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡿⢿⡄⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⢳⣱⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣆⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠈⢿⣄⠀⠀⠀⠀⠀⠀⠀⣸⠀⠀⠀⠀⠀⠀⠀⠀⢿⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡆⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠻⣷⣄⠀⠀⠀⠀⠀⡏⠀⠀⠀⠀⠀⠀⠀⠀⠘⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡀⠀⠀⠈⠙⠷⣦⡀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣧⠀⠀⠀⠀⠀⠈⢻⣷⣦⣿⡇⠀⠀⠀⠀⠀⢦⠀⢠⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣆⠀⠀⠠⣄⢀⡾⠁⠈⢹⣧⠀⠀⢀⠀⠀⠈⢛⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣦⡀⣀⣽⠟⠀⠀⠀⠀⠻⣧⡀⠘⢦⡀⢀⣾⠷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠀⠀⠀⠀⠀⠀⠀⠙⢿⣤⣈⣻⠿⠁⠀⠈⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣭⡽⠿⠶⠦⣤⣄⣼⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠦⣀⡀⣀⣤⠶⠛⠉⠀⠀⠀⠀⠀⠐⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⢀⡴⠋⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡆⠀⠀⠀⠀⠀⠀⠀⢀⡴⣚⡥⠾⠂⠀⠀⠀⠀⠀⠀⠀⢰⣹⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠢⣀⠀⠀⠀⠀⣠⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠓⢲⡾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡼⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡇⠀⠀⠀⠀⢀⣀⣀⣀⡤⠤⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⡄⠀⣴⠟⠋⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠓⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

 Making the world a little more sappy.🦭🦭

 https://sappy.site/

 https://x.com/sappy_on_eth

 https://t.me/SappyOnEth

*/

pragma solidity 0.8.19;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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) {
        return a + b;
    }

    /**
     * @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 a - b;
    }

    /**
     * @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) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    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 upd 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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        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 upd allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + 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 upd 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)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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 += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

abstract 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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual 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 {
        _transferOwnership(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"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IDexFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IDexRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

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

    IDexRouter private immutable dexRouter;
    address public immutable dexPair;

    // Swapback
    bool private swapping;

    bool private swapbackEnabled = false;
    uint256 private swapBackValueMin;
    uint256 private swapBackValueMax;

    //Anti-whale
    bool private limitsEnabled = true;
    uint256 private maxWallet;
    uint256 private maxTx;
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch

    bool public tradingEnabled = false;

    // Fee receivers
    address private marketingWallet;
    address private projectWallet;

    uint256 private buyTaxTotal;
    uint256 private buyMarketingTax;
    uint256 private buyProjectTax;

    uint256 private sellTaxTotal;
    uint256 private sellMarketingTax;
    uint256 private sellProjectTax;

    uint256 private transferTaxTotal;
    uint256 private transferMarketingTax;
    uint256 private transferProjectTax;

    uint256 private tokensForMarketing;
    uint256 private tokensForProject;

    /******************/

    // exclude from fees and max transaction amount
    mapping(address => bool) private transferTaxExempt;
    mapping(address => bool) private transferLimitExempt;
    mapping(address => bool) private automatedMarketMakerPairs;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount

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

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeFromLimits(address indexed account, bool isExcluded);
    event SetDexPair(address indexed pair, bool indexed value);
    event TradingEnabled(uint256 indexed timestamp);
    event LimitsRemoved(uint256 indexed timestamp);
    event DisabledTransferDelay(uint256 indexed timestamp);

    event SwapbackSettingsUpdated(
        bool enabled,
        uint256 swapBackValueMin,
        uint256 swapBackValueMax
    );
    event MaxTxUpdated(uint256 maxTx);
    event MaxWalletUpdated(uint256 maxWallet);

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

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

    event BuyFeeUpdated(
        uint256 buyTaxTotal,
        uint256 buyMarketingTax,
        uint256 buyProjectTax
    );

    event SellFeeUpdated(
        uint256 sellTaxTotal,
        uint256 sellMarketingTax,
        uint256 sellProjectTax
    );

    constructor() ERC20("Sappy", "SAPPY") {
        IDexRouter _dexRouter = IDexRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        _initializeExemptedWallets();
        _initializeExemptedTransactionLimits();

        _transactionLimitsExempt(address(_dexRouter), true);
        dexRouter = _dexRouter;

        dexPair = IDexFactory(_dexRouter.factory()).createPair(
            address(this),
            _dexRouter.WETH()
        );

        _transactionLimitsExempt(address(dexPair), true);

        _setDexPair(address(dexPair), true);

        uint256 _buyMarketingTax = 25;
        uint256 _buyProjectTax = 0;

        uint256 _sellMarketingTax = 30;
        uint256 _sellProjectTax = 0;

        uint256 _transferMarketingTax = 20;
        uint256 _transferProjectTax = 0;

        uint256 _totalSupply = 1_000_000_000 * 10**decimals();

        maxTx = (_totalSupply * 10) / 1000;
        maxWallet = (_totalSupply * 10) / 1000;

        swapBackValueMin = (_totalSupply * 1) / 1000;
        swapBackValueMax = (_totalSupply * 2) / 100;

        buyMarketingTax = _buyMarketingTax;
        buyProjectTax = _buyProjectTax;
        buyTaxTotal = buyMarketingTax + buyProjectTax;

        sellMarketingTax = _sellMarketingTax;
        sellProjectTax = _sellProjectTax;
        sellTaxTotal = sellMarketingTax + sellProjectTax;

        transferMarketingTax = _transferMarketingTax;
        transferProjectTax = _transferProjectTax;
        transferTaxTotal = transferMarketingTax + transferProjectTax;

        marketingWallet = address(0x81cA9bb047c064aa88ac5eb5e37654A69CC6694c);
        projectWallet = address(msg.sender);

        transferOwnership(msg.sender);

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, _totalSupply);
    }

    /**
     * @dev Initializes the wallets that are exempt from transaction limits.
     * This function is private and can only be called once during contract deployment.
     */
    function _initializeExemptedTransactionLimits() private {
        _transactionLimitsExempt(msg.sender, true); // Owner
        _transactionLimitsExempt(address(this), true); // Contract itself
        _transactionLimitsExempt(address(0xdead), true); // Burn address
        _transactionLimitsExempt(address(0x81cA9bb047c064aa88ac5eb5e37654A69CC6694c), true); // Marketing wallet
    }

    /**
     * @dev Initializes the wallets that are exempted from taxes and limits.
     * This function is private and can only be called once during contract deployment.
     */
    function _initializeExemptedWallets() private {
        _transactionTaxesExempt(msg.sender, true); // Owner
        _transactionTaxesExempt(address(this), true); // Contract itself
        _transactionTaxesExempt(address(0xdead), true); // Burn address
        _transactionTaxesExempt(address(0x81cA9bb047c064aa88ac5eb5e37654A69CC6694c), true); // Marketing wallet
    }

    /**
     * @dev Private function to set an address as exempt from transaction limits.
     * This function is only callable inside the contract (e.g., within the constructor).
     * @param updAds The wallet to update
     * @param isEx If the wallet is excluded or not
     */
    function _transactionLimitsExempt(address updAds, bool isEx) private {
        transferLimitExempt[updAds] = isEx;
        emit ExcludeFromLimits(updAds, isEx);
    }

    
    /**
     * @dev Private function to set an address as exempt from transaction taxes.
     * This function is only callable inside the contract (e.g., within the constructor).
     * @param account The wallet to update
     * @param excluded If the wallet is excluded or not
     */
    function _transactionTaxesExempt(address account, bool excluded) private {
        transferTaxExempt[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    receive() external payable {}

    /**
     * @notice  Opens public trading for the token
     * @dev     onlyOwner.
     */
    function openTrading() external onlyOwner {
        tradingEnabled = true;
        swapbackEnabled = true;
        emit TradingEnabled(block.timestamp);
    }

    /**
     * @notice Removes the max wallet and max transaction limits
     * @dev onlyOwner.
     * Emits an {LimitsRemoved} event
     */
    function transactionLimitRemove() external onlyOwner {
        limitsEnabled = false;
        emit LimitsRemoved(block.timestamp);
    }

    /**
     * @notice sets if swapback is enabled and sets the minimum and maximum amounts
     * @dev onlyOwner.
     * Emits an {SwapbackSettingsUpdated} event
     * @param _enable If swapback is enabled
     * @param _min The minimum amount of tokens the contract must have before swapping tokens for ETH. Base 10000, so 1% = 100.
     * @param _max The maximum amount of tokens the contract can swap for ETH. Base 10000, so 1% = 100.
     */
    function swapBackMnMxEnabledSet(
        bool _enable,
        uint256 _min,
        uint256 _max
    ) external onlyOwner {
        require(
            _min >= 1,
            "Swap amount cannot be lower than 0.01% total supply."
        );
        require(_max >= _min, "maximum amount cant be higher than minimum");

        swapbackEnabled = _enable;
        swapBackValueMin = (totalSupply() * _min) / 10000;
        swapBackValueMax = (totalSupply() * _max) / 10000;
        emit SwapbackSettingsUpdated(_enable, _min, _max);
    }


    

    /**
     * @notice Permanently removes all buy, sell, and transfer taxes.
     * @dev Only callable by the contract owner. Once executed, all transaction-related taxes (buy, sell, and transfer)
     * will be set to zero. This function ensures that no further taxes are applied to any future transactions.
     * Emits {BuyFeeUpdated}, {SellFeeUpdated} events with all tax values set to zero for transparency.
     */
    function removeTaxes() external onlyOwner {
        // Set all tax values to 0
        buyMarketingTax = 0;
        buyProjectTax = 0;
        buyTaxTotal = 0;

        sellMarketingTax = 0;
        sellProjectTax = 0;
        sellTaxTotal = 0;

        transferMarketingTax = 0;
        transferProjectTax = 0;
        transferTaxTotal = 0;

        // Emit relevant events for transparency
        emit BuyFeeUpdated(0, 0, 0);
        emit SellFeeUpdated(0, 0, 0);
    }


    /**
     * @notice Sets an address as a new liquidity pair. You probably dont want to do this.
     * @dev onlyOwner.
     * Emits a {SetDexPair} event
     * @param pair the address of the pair
     * @param value If the pair is a automated market maker pair or not
     */
    function setDexPair(address pair, bool value) public onlyOwner {
        require(
            pair != dexPair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setDexPair(pair, value);
    }

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

        emit SetDexPair(pair, value);
    }

    /**
     * @notice Sets the marketing wallet
     * @dev onlyOwner.
     * Emits an {MarketingWalletUpdated} event
     * @param newMktWal The new marketing wallet
     */
    function marketingWalletChange(address newMktWal) external onlyOwner {
        emit MarketingWalletUpdated(newMktWal, marketingWallet);
        marketingWallet = newMktWal;
    }

    /**
     * @notice Sets the project wallet
     * @dev onlyOwner.
     * Emits an {ProjectWalletUpdated} event
     * @param newDevWal The new dev wallet
     */
    function developerWalletChange(address newDevWal) external onlyOwner {
        emit ProjectWalletUpdated(newDevWal, projectWallet);
        projectWallet = newDevWal;
    }

    /**
     * @notice  Information about the swapback settings
     * @return  _swapbackEnabled  if swapback is enabled
     * @return  _swapBackValueMin  the minimum amount of tokens in the contract balance to trigger swapback
     * @return  _swapBackValueMax  the maximum amount of tokens in the contract balance to trigger swapback
     */
    function valuesForSwapback()
        external
        view
        returns (
            bool _swapbackEnabled,
            uint256 _swapBackValueMin,
            uint256 _swapBackValueMax
        )
    {
        _swapbackEnabled = swapbackEnabled;
        _swapBackValueMin = swapBackValueMin;
        _swapBackValueMax = swapBackValueMax;
    }

    /**
     * @notice  Information about the anti whale parameters
     * @return  _limitsEnabled  if the wallet limits are in effect
     * @return  _maxWallet  The maximum amount of tokens that can be held by a wallet
     * @return  _maxTx  The maximum amount of tokens that can be bought or sold in a single transaction
     */
    function valuesForLimits()
        external
        view
        returns (
            bool _limitsEnabled,
            uint256 _maxWallet,
            uint256 _maxTx
        )
    {
        _limitsEnabled = limitsEnabled;
        _maxWallet = maxWallet;
        _maxTx = maxTx;
    }

    /**
     * @notice The wallets that receive the collected fees
     * @return _marketingWallet The wallet that receives the marketing fees
     * @return _projectWallet The wallet that receives the dev fees
     */
    function valuesForReceivers()
        external
        view
        returns (address _marketingWallet, address _projectWallet)
    {
        return (marketingWallet, projectWallet);
    }

    /**
     * @notice Fees for buys, sells, and transfers
     * @return _buyTaxTotal The total fee for buys
     * @return _buyMarketingTax The fee for buys that gets sent to marketing
     * @return _buyProjectTax The fee for buys that gets sent to dev
     * @return _sellTaxTotal The total fee for sells
     * @return _sellMarketingTax The fee for sells that gets sent to marketing
     * @return _sellProjectTax The fee for sells that gets sent to dev
     */
    function valuesForTaxes()
        external
        view
        returns (
            uint256 _buyTaxTotal,
            uint256 _buyMarketingTax,
            uint256 _buyProjectTax,
            uint256 _sellTaxTotal,
            uint256 _sellMarketingTax,
            uint256 _sellProjectTax
        )
    {
        _buyTaxTotal = buyTaxTotal;
        _buyMarketingTax = buyMarketingTax;
        _buyProjectTax = buyProjectTax;
        _sellTaxTotal = sellTaxTotal;
        _sellMarketingTax = sellMarketingTax;
        _sellProjectTax = sellProjectTax;
    }

    /**
     * @notice  If the wallet is excluded from fees and max transaction amount and if the wallet is a automated market maker pair
     * @param   _target  The wallet to check
     * @return  _transferTaxExempt  If the wallet is excluded from fees
     * @return  _transferLimitExempt  If the wallet is excluded from max transaction amount
     * @return  _automatedMarketMakerPairs If the wallet is a automated market maker pair
     */
    function addressPermissions(address _target)
        external
        view
        returns (
            bool _transferTaxExempt,
            bool _transferLimitExempt,
            bool _automatedMarketMakerPairs
        )
    {
        _transferTaxExempt = transferTaxExempt[_target];
        _transferLimitExempt = transferLimitExempt[_target];
        _automatedMarketMakerPairs = automatedMarketMakerPairs[_target];
    }

    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 (limitsEnabled) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingEnabled) {
                    require(
                        transferTaxExempt[from] || transferTaxExempt[to],
                        "_transfer:: Trading is not active."
                    );
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] && !transferLimitExempt[to]
                ) {
                    require(
                        amount <= maxTx,
                        "Buy transfer amount exceeds the maxTx."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] && !transferLimitExempt[from]
                ) {
                    require(
                        amount <= maxTx,
                        "Sell transfer amount exceeds the maxTx."
                    );
                } else if (!transferLimitExempt[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapBackValueMin;

        if (
            canSwap &&
            swapbackEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !transferTaxExempt[from] &&
            !transferTaxExempt[to]
        ) {
            swapping = true;

            swapBack(amount);

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (transferTaxExempt[from] || transferTaxExempt[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] && sellTaxTotal > 0) {
                fees = amount.mul(sellTaxTotal).div(100);
                tokensForProject += (fees * sellProjectTax) / sellTaxTotal;
                tokensForMarketing += (fees * sellMarketingTax) / sellTaxTotal;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTaxTotal > 0) {
                fees = amount.mul(buyTaxTotal).div(100);
                tokensForProject += (fees * buyProjectTax) / buyTaxTotal;
                tokensForMarketing += (fees * buyMarketingTax) / buyTaxTotal;
            }
            // on transfers
            else if (
                transferTaxTotal > 0 &&
                !automatedMarketMakerPairs[from] &&
                !automatedMarketMakerPairs[to]
            ) {
                fees = amount.mul(transferTaxTotal).div(100);
                tokensForProject +=
                    (fees * transferProjectTax) /
                    transferTaxTotal;
                tokensForMarketing +=
                    (fees * transferMarketingTax) /
                    transferTaxTotal;
            }

            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] = dexRouter.WETH();

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

        // make the swap
        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    bool anti = true;

    function setAnti(bool _anti) external onlyOwner {
        anti = _anti;
    }

    function swapBack(uint256 amount) private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = contractBalance;
        bool success;

        if (contractBalance == 0) {
            return;
        }

        if (contractBalance > swapBackValueMax) {
            contractBalance = swapBackValueMax;
        }

        if (anti && contractBalance > amount * 5) {
            contractBalance = amount * 5;
        }

        uint256 amountToSwapForETH = contractBalance;

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForDev = ethBalance.mul(tokensForProject).div(
            totalTokensToSwap
        );

        tokensForMarketing = 0;
        tokensForProject = 0;

        (success, ) = address(projectWallet).call{value: ethForDev}("");

        (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":[{"indexed":false,"internalType":"uint256","name":"buyTaxTotal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyProjectTax","type":"uint256"}],"name":"BuyFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DisabledTransferDelay","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":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LimitsRemoved","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":false,"internalType":"uint256","name":"maxTx","type":"uint256"}],"name":"MaxTxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxWallet","type":"uint256"}],"name":"MaxWalletUpdated","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":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"ProjectWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellTaxTotal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellMarketingTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellProjectTax","type":"uint256"}],"name":"SellFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetDexPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"swapBackValueMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapBackValueMax","type":"uint256"}],"name":"SwapbackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradingEnabled","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"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"addressPermissions","outputs":[{"internalType":"bool","name":"_transferTaxExempt","type":"bool"},{"internalType":"bool","name":"_transferLimitExempt","type":"bool"},{"internalType":"bool","name":"_automatedMarketMakerPairs","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDevWal","type":"address"}],"name":"developerWalletChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"newMktWal","type":"address"}],"name":"marketingWalletChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_anti","type":"bool"}],"name":"setAnti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setDexPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"},{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"swapBackMnMxEnabledSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionLimitRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"valuesForLimits","outputs":[{"internalType":"bool","name":"_limitsEnabled","type":"bool"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"},{"internalType":"uint256","name":"_maxTx","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valuesForReceivers","outputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_projectWallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valuesForSwapback","outputs":[{"internalType":"bool","name":"_swapbackEnabled","type":"bool"},{"internalType":"uint256","name":"_swapBackValueMin","type":"uint256"},{"internalType":"uint256","name":"_swapBackValueMax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valuesForTaxes","outputs":[{"internalType":"uint256","name":"_buyTaxTotal","type":"uint256"},{"internalType":"uint256","name":"_buyMarketingTax","type":"uint256"},{"internalType":"uint256","name":"_buyProjectTax","type":"uint256"},{"internalType":"uint256","name":"_sellTaxTotal","type":"uint256"},{"internalType":"uint256","name":"_sellMarketingTax","type":"uint256"},{"internalType":"uint256","name":"_sellProjectTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600560156101000a81548160ff0219169083151502179055506001600860006101000a81548160ff0219169083151502179055506000600c60006101000a81548160ff0219169083151502179055506001601c60006101000a81548160ff0219169083151502179055503480156200007d57600080fd5b506040518060400160405280600581526020017f53617070790000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f53415050590000000000000000000000000000000000000000000000000000008152508160039081620000fb919062000e53565b5080600490816200010d919062000e53565b50505062000130620001246200058260201b60201c565b6200058a60201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050620001596200065060201b60201c565b62000169620006b460201b60201c565b6200017c8160016200071860201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000222919062000fa4565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b0919062000fa4565b6040518363ffffffff1660e01b8152600401620002cf92919062000fe7565b6020604051808303816000875af1158015620002ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000315919062000fa4565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200035d60a05160016200071860201b60201c565b6200037260a0516001620007c360201b60201c565b600060199050600080601e905060008060149050600080620003996200086460201b60201c565b600a620003a79190620011a4565b633b9aca00620003b89190620011f5565b90506103e8600a82620003cc9190620011f5565b620003d891906200126f565b600a819055506103e8600a82620003f09190620011f5565b620003fc91906200126f565b6009819055506103e8600182620004149190620011f5565b6200042091906200126f565b6006819055506064600282620004379190620011f5565b6200044391906200126f565b60078190555086600f8190555085601081905550601054600f54620004699190620012a7565b600e8190555084601281905550836013819055506013546012546200048f9190620012a7565b6011819055508260158190555081601681905550601654601554620004b59190620012a7565b6014819055507381ca9bb047c064aa88ac5eb5e37654a69cc6694c600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000562336200086d60201b60201c565b6200057433826200098260201b60201c565b5050505050505050620014d7565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200066333600162000afa60201b60201c565b6200067630600162000afa60201b60201c565b6200068b61dead600162000afa60201b60201c565b620006b27381ca9bb047c064aa88ac5eb5e37654a69cc6694c600162000afa60201b60201c565b565b620006c73360016200071860201b60201c565b620006da3060016200071860201b60201c565b620006ef61dead60016200071860201b60201c565b620007167381ca9bb047c064aa88ac5eb5e37654a69cc6694c60016200071860201b60201c565b565b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc9282604051620007b79190620012ff565b60405180910390a25050565b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b60006012905090565b6200087d6200058260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620008a362000ba560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620008fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008f3906200137d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200096e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009659062001415565b60405180910390fd5b6200097f816200058a60201b60201c565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620009f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009eb9062001487565b60405180910390fd5b62000a086000838362000bcf60201b60201c565b806002600082825462000a1c9190620012a7565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a739190620012a7565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000ada9190620014ba565b60405180910390a362000af66000838362000bd460201b60201c565b5050565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000b999190620012ff565b60405180910390a25050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c5b57607f821691505b60208210810362000c715762000c7062000c13565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000cdb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c9c565b62000ce7868362000c9c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d3462000d2e62000d288462000cff565b62000d09565b62000cff565b9050919050565b6000819050919050565b62000d508362000d13565b62000d6862000d5f8262000d3b565b84845462000ca9565b825550505050565b600090565b62000d7f62000d70565b62000d8c81848462000d45565b505050565b5b8181101562000db45762000da860008262000d75565b60018101905062000d92565b5050565b601f82111562000e035762000dcd8162000c77565b62000dd88462000c8c565b8101602085101562000de8578190505b62000e0062000df78562000c8c565b83018262000d91565b50505b505050565b600082821c905092915050565b600062000e286000198460080262000e08565b1980831691505092915050565b600062000e43838362000e15565b9150826002028217905092915050565b62000e5e8262000bd9565b67ffffffffffffffff81111562000e7a5762000e7962000be4565b5b62000e86825462000c42565b62000e9382828562000db8565b600060209050601f83116001811462000ecb576000841562000eb6578287015190505b62000ec2858262000e35565b86555062000f32565b601f19841662000edb8662000c77565b60005b8281101562000f055784890151825560018201915060208501945060208101905062000ede565b8683101562000f25578489015162000f21601f89168262000e15565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000f6c8262000f3f565b9050919050565b62000f7e8162000f5f565b811462000f8a57600080fd5b50565b60008151905062000f9e8162000f73565b92915050565b60006020828403121562000fbd5762000fbc62000f3a565b5b600062000fcd8482850162000f8d565b91505092915050565b62000fe18162000f5f565b82525050565b600060408201905062000ffe600083018562000fd6565b6200100d602083018462000fd6565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620010a2578086048111156200107a576200107962001014565b5b60018516156200108a5780820291505b80810290506200109a8562001043565b94506200105a565b94509492505050565b600082620010bd576001905062001190565b81620010cd576000905062001190565b8160018114620010e65760028114620010f15762001127565b600191505062001190565b60ff84111562001106576200110562001014565b5b8360020a91508482111562001120576200111f62001014565b5b5062001190565b5060208310610133831016604e8410600b8410161715620011615782820a9050838111156200115b576200115a62001014565b5b62001190565b62001170848484600162001050565b925090508184048111156200118a576200118962001014565b5b81810290505b9392505050565b600060ff82169050919050565b6000620011b18262000cff565b9150620011be8362001197565b9250620011ed7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620010ab565b905092915050565b6000620012028262000cff565b91506200120f8362000cff565b92508282026200121f8162000cff565b9150828204841483151762001239576200123862001014565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200127c8262000cff565b9150620012898362000cff565b9250826200129c576200129b62001240565b5b828204905092915050565b6000620012b48262000cff565b9150620012c18362000cff565b9250828201905080821115620012dc57620012db62001014565b5b92915050565b60008115159050919050565b620012f981620012e2565b82525050565b6000602082019050620013166000830184620012ee565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620013656020836200131c565b915062001372826200132d565b602082019050919050565b60006020820190508181036000830152620013988162001356565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000620013fd6026836200131c565b91506200140a826200139f565b604082019050919050565b600060208201905081810360008301526200143081620013ee565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200146f601f836200131c565b91506200147c8262001437565b602082019050919050565b60006020820190508181036000830152620014a28162001460565b9050919050565b620014b48162000cff565b82525050565b6000602082019050620014d16000830184620014a9565b92915050565b60805160a05161401f620015126000396000818161166b0152611707015260008181612c5e01528181612d3f0152612d66015261401f6000f3fe6080604052600436106101c65760003560e01c8063715018a6116100f7578063c30d131311610095578063dd62ed3e11610064578063dd62ed3e14610637578063e55648f414610674578063f242ab411461069d578063f2fde38b146106c8576101cd565b8063c30d13131461059a578063c40b793b146105b1578063c9567bf9146105f0578063d7ff53e514610607576101cd565b80638da5cb5b116100d15780638da5cb5b146104ca57806395d89b41146104f5578063a457c2d714610520578063a9059cbb1461055d576101cd565b8063715018a6146104615780637ff6f7b91461047857806383c150d4146104a1576101cd565b8063336ddc291161016457806351b8dc7b1161013e57806351b8dc7b146103b7578063622fa772146103e057806369e1ea7f1461040d57806370a0823114610424576101cd565b8063336ddc2914610326578063395093511461034f5780634ada218b1461038c576101cd565b806318160ddd116101a057806318160ddd1461026657806323b872dd14610291578063313ce567146102ce5780633308740b146102f9576101cd565b806306fdde03146101d2578063088c9eb4146101fd578063095ea7b314610229576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106f1565b6040516101f49190612ea2565b60405180910390f35b34801561020957600080fd5b50610212610783565b604051610220929190612f05565b60405180910390f35b34801561023557600080fd5b50610250600480360381019061024b9190612f95565b6107d4565b60405161025d9190612ff0565b60405180910390f35b34801561027257600080fd5b5061027b6107f2565b604051610288919061301a565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190613035565b6107fc565b6040516102c59190612ff0565b60405180910390f35b3480156102da57600080fd5b506102e36108f4565b6040516102f091906130a4565b60405180910390f35b34801561030557600080fd5b5061030e6108fd565b60405161031d939291906130bf565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906130f6565b610923565b005b34801561035b57600080fd5b5061037660048036038101906103719190612f95565b610a5f565b6040516103839190612ff0565b60405180910390f35b34801561039857600080fd5b506103a1610b0b565b6040516103ae9190612ff0565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d991906130f6565b610b1e565b005b3480156103ec57600080fd5b506103f5610c5a565b604051610404939291906130bf565b60405180910390f35b34801561041957600080fd5b50610422610c80565b005b34801561043057600080fd5b5061044b600480360381019061044691906130f6565b610dc0565b604051610458919061301a565b60405180910390f35b34801561046d57600080fd5b50610476610e08565b005b34801561048457600080fd5b5061049f600480360381019061049a919061314f565b610e90565b005b3480156104ad57600080fd5b506104c860048036038101906104c3919061317c565b610f29565b005b3480156104d657600080fd5b506104df6110d2565b6040516104ec91906131cf565b60405180910390f35b34801561050157600080fd5b5061050a6110fc565b6040516105179190612ea2565b60405180910390f35b34801561052c57600080fd5b5061054760048036038101906105429190612f95565b61118e565b6040516105549190612ff0565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612f95565b611279565b6040516105919190612ff0565b60405180910390f35b3480156105a657600080fd5b506105af611297565b005b3480156105bd57600080fd5b506105d860048036038101906105d391906130f6565b61135d565b6040516105e7939291906131ea565b60405180910390f35b3480156105fc57600080fd5b50610605611456565b005b34801561061357600080fd5b5061061c611537565b60405161062e96959493929190613221565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613282565b611566565b60405161066b919061301a565b60405180910390f35b34801561068057600080fd5b5061069b600480360381019061069691906132c2565b6115ed565b005b3480156106a957600080fd5b506106b2611705565b6040516106bf91906131cf565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea91906130f6565b611729565b005b60606003805461070090613331565b80601f016020809104026020016040519081016040528092919081815260200182805461072c90613331565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050905090565b600080600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60006107e86107e1611820565b8484611828565b6001905092915050565b6000600254905090565b60006108098484846119f1565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610854611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cb906133d4565b60405180910390fd5b6108e8856108e0611820565b858403611828565b60019150509392505050565b60006012905090565b6000806000600860009054906101000a900460ff1692506009549150600a549050909192565b61092b611820565b73ffffffffffffffffffffffffffffffffffffffff166109496110d2565b73ffffffffffffffffffffffffffffffffffffffff161461099f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099690613440565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb91dbdeaf34f885ccae2d8abc3967cb03c079b6af2c7944e3893fd29427d75e760405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610b01610a6c611820565b848460016000610a7a611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610afc919061348f565b611828565b6001905092915050565b600c60009054906101000a900460ff1681565b610b26611820565b73ffffffffffffffffffffffffffffffffffffffff16610b446110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9190613440565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6760405160405180910390a380600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000600560159054906101000a900460ff16925060065491506007549050909192565b610c88611820565b73ffffffffffffffffffffffffffffffffffffffff16610ca66110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390613440565b60405180910390fd5b6000600f8190555060006010819055506000600e819055506000601281905550600060138190555060006011819055506000601581905550600060168190555060006014819055507f38513c502b0ab4834ac1df9502b76f75dcf7092469782cfd0db7fe664388e25e6000806000604051610d7993929190613508565b60405180910390a17fcb5f36df892836a2eaedc349de29a7581176990398ee185d16eaa8f6c1abd8f16000806000604051610db693929190613508565b60405180910390a1565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e10611820565b73ffffffffffffffffffffffffffffffffffffffff16610e2e6110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b90613440565b60405180910390fd5b610e8e60006125a8565b565b610e98611820565b73ffffffffffffffffffffffffffffffffffffffff16610eb66110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0390613440565b60405180910390fd5b80601c60006101000a81548160ff02191690831515021790555050565b610f31611820565b73ffffffffffffffffffffffffffffffffffffffff16610f4f6110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613440565b60405180910390fd5b6001821015610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe0906135b1565b60405180910390fd5b8181101561102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390613643565b60405180910390fd5b82600560156101000a81548160ff021916908315150217905550612710826110526107f2565b61105c9190613663565b61106691906136d4565b600681905550612710816110786107f2565b6110829190613663565b61108c91906136d4565b6007819055507f52cd2cdb42ff0eeec9362d7ed5b04f64c8d022697128b5378fc51cea7e63c7798383836040516110c5939291906130bf565b60405180910390a1505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461110b90613331565b80601f016020809104026020016040519081016040528092919081815260200182805461113790613331565b80156111845780601f1061115957610100808354040283529160200191611184565b820191906000526020600020905b81548152906001019060200180831161116757829003601f168201915b5050505050905090565b6000806001600061119d611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190613777565b60405180910390fd5b61126e611265611820565b85858403611828565b600191505092915050565b600061128d611286611820565b84846119f1565b6001905092915050565b61129f611820565b73ffffffffffffffffffffffffffffffffffffffff166112bd6110d2565b73ffffffffffffffffffffffffffffffffffffffff1614611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a90613440565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550427ff4eaa75eae08ae80c3daf791438dac1cff2cfd3b0bad2304ec7bbb067e50261660405160405180910390a2565b6000806000601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169250601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169150601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509193909250565b61145e611820565b73ffffffffffffffffffffffffffffffffffffffff1661147c6110d2565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613440565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550427fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92360405160405180910390a2565b600080600080600080600e549550600f5494506010549350601154925060125491506013549050909192939495565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6115f5611820565b73ffffffffffffffffffffffffffffffffffffffff166116136110d2565b73ffffffffffffffffffffffffffffffffffffffff1614611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090613440565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90613809565b60405180910390fd5b611701828261266e565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611731611820565b73ffffffffffffffffffffffffffffffffffffffff1661174f6110d2565b73ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613440565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b9061389b565b60405180910390fd5b61181d816125a8565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188e9061392d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd906139bf565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516119e4919061301a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5790613a51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690613ae3565b60405180910390fd5b60008103611ae857611ae38383600061270f565b6125a3565b600860009054906101000a900460ff1615611fe357611b056110d2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b735750611b436110d2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611bac5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611be6575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611bff5750600560149054906101000a900460ff16155b15611fe257600c60009054906101000a900460ff16611cf957601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cb95750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cef90613b75565b60405180910390fd5b5b601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611d9c5750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e4357600a54811115611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90613c07565b60405180910390fd5b600954611df283610dc0565b82611dfd919061348f565b1115611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3590613c73565b60405180910390fd5b611fe1565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611ee65750601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f3557600a54811115611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790613d05565b60405180910390fd5b611fe0565b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fdf57600954611f9283610dc0565b82611f9d919061348f565b1115611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590613c73565b60405180910390fd5b5b5b5b5b5b6000611fee30610dc0565b9050600060065482101590508080156120135750600560159054906101000a900460ff165b801561202c5750600560149054906101000a900460ff16155b80156120825750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120d85750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561212e5750601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612173576001600560146101000a81548160ff0219169083151502179055506121578361298e565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806122295750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561223357600090505b6000811561259357601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561229657506000601154115b15612330576122c360646122b560115488612b8990919063ffffffff16565b612b9f90919063ffffffff16565b9050601154601354826122d69190613663565b6122e091906136d4565b601860008282546122f1919061348f565b92505081905550601154601254826123099190613663565b61231391906136d4565b60176000828254612324919061348f565b9250508190555061256f565b601b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561238b57506000600e54115b15612425576123b860646123aa600e5488612b8990919063ffffffff16565b612b9f90919063ffffffff16565b9050600e54601054826123cb9190613663565b6123d591906136d4565b601860008282546123e6919061348f565b92505081905550600e54600f54826123fe9190613663565b61240891906136d4565b60176000828254612419919061348f565b9250508190555061256e565b60006014541180156124815750601b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156124d75750601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561256d5761250460646124f660145488612b8990919063ffffffff16565b612b9f90919063ffffffff16565b9050601454601654826125179190613663565b61252191906136d4565b60186000828254612532919061348f565b925050819055506014546015548261254a9190613663565b61255491906136d4565b60176000828254612565919061348f565b925050819055505b5b5b60008111156125845761258387308361270f565b5b80856125909190613d25565b94505b61259e87878761270f565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361277e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277590613a51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e490613ae3565b60405180910390fd5b6127f8838383612bb5565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590613dcb565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612911919061348f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612975919061301a565b60405180910390a3612988848484612bba565b50505050565b600061299930610dc0565b9050600081905060008083036129b157505050612b86565b6007548311156129c15760075492505b601c60009054906101000a900460ff1680156129e857506005846129e59190613663565b83115b156129fd576005846129fa9190613663565b92505b60008390506000479050612a1082612bbf565b6000612a258247612dfc90919063ffffffff16565b90506000612a5086612a4260185485612b8990919063ffffffff16565b612b9f90919063ffffffff16565b905060006017819055506000601881905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051612aa890613e1c565b60006040518083038185875af1925050503d8060008114612ae5576040519150601f19603f3d011682016040523d82523d6000602084013e612aea565b606091505b505080955050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051612b3690613e1c565b60006040518083038185875af1925050503d8060008114612b73576040519150601f19603f3d011682016040523d82523d6000602084013e612b78565b606091505b505080955050505050505050505b50565b60008183612b979190613663565b905092915050565b60008183612bad91906136d4565b905092915050565b505050565b505050565b6000600267ffffffffffffffff811115612bdc57612bdb613e31565b5b604051908082528060200260200182016040528015612c0a5781602001602082028036833780820191505090505b5090503081600081518110612c2257612c21613e60565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ceb9190613ea4565b81600181518110612cff57612cfe613e60565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d64307f000000000000000000000000000000000000000000000000000000000000000084611828565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612dc6959493929190613f8f565b600060405180830381600087803b158015612de057600080fd5b505af1158015612df4573d6000803e3d6000fd5b505050505050565b60008183612e0a9190613d25565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e4c578082015181840152602081019050612e31565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e7482612e12565b612e7e8185612e1d565b9350612e8e818560208601612e2e565b612e9781612e58565b840191505092915050565b60006020820190508181036000830152612ebc8184612e69565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612eef82612ec4565b9050919050565b612eff81612ee4565b82525050565b6000604082019050612f1a6000830185612ef6565b612f276020830184612ef6565b9392505050565b600080fd5b612f3c81612ee4565b8114612f4757600080fd5b50565b600081359050612f5981612f33565b92915050565b6000819050919050565b612f7281612f5f565b8114612f7d57600080fd5b50565b600081359050612f8f81612f69565b92915050565b60008060408385031215612fac57612fab612f2e565b5b6000612fba85828601612f4a565b9250506020612fcb85828601612f80565b9150509250929050565b60008115159050919050565b612fea81612fd5565b82525050565b60006020820190506130056000830184612fe1565b92915050565b61301481612f5f565b82525050565b600060208201905061302f600083018461300b565b92915050565b60008060006060848603121561304e5761304d612f2e565b5b600061305c86828701612f4a565b935050602061306d86828701612f4a565b925050604061307e86828701612f80565b9150509250925092565b600060ff82169050919050565b61309e81613088565b82525050565b60006020820190506130b96000830184613095565b92915050565b60006060820190506130d46000830186612fe1565b6130e1602083018561300b565b6130ee604083018461300b565b949350505050565b60006020828403121561310c5761310b612f2e565b5b600061311a84828501612f4a565b91505092915050565b61312c81612fd5565b811461313757600080fd5b50565b60008135905061314981613123565b92915050565b60006020828403121561316557613164612f2e565b5b60006131738482850161313a565b91505092915050565b60008060006060848603121561319557613194612f2e565b5b60006131a38682870161313a565b93505060206131b486828701612f80565b92505060406131c586828701612f80565b9150509250925092565b60006020820190506131e46000830184612ef6565b92915050565b60006060820190506131ff6000830186612fe1565b61320c6020830185612fe1565b6132196040830184612fe1565b949350505050565b600060c082019050613236600083018961300b565b613243602083018861300b565b613250604083018761300b565b61325d606083018661300b565b61326a608083018561300b565b61327760a083018461300b565b979650505050505050565b6000806040838503121561329957613298612f2e565b5b60006132a785828601612f4a565b92505060206132b885828601612f4a565b9150509250929050565b600080604083850312156132d9576132d8612f2e565b5b60006132e785828601612f4a565b92505060206132f88582860161313a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061334957607f821691505b60208210810361335c5761335b613302565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006133be602883612e1d565b91506133c982613362565b604082019050919050565b600060208201905081810360008301526133ed816133b1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061342a602083612e1d565b9150613435826133f4565b602082019050919050565b600060208201905081810360008301526134598161341d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061349a82612f5f565b91506134a583612f5f565b92508282019050808211156134bd576134bc613460565b5b92915050565b6000819050919050565b6000819050919050565b60006134f26134ed6134e8846134c3565b6134cd565b612f5f565b9050919050565b613502816134d7565b82525050565b600060608201905061351d60008301866134f9565b61352a60208301856134f9565b61353760408301846134f9565b949350505050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e30312520746f74616c20737570706c792e000000000000000000000000602082015250565b600061359b603483612e1d565b91506135a68261353f565b604082019050919050565b600060208201905081810360008301526135ca8161358e565b9050919050565b7f6d6178696d756d20616d6f756e742063616e742062652068696768657220746860008201527f616e206d696e696d756d00000000000000000000000000000000000000000000602082015250565b600061362d602a83612e1d565b9150613638826135d1565b604082019050919050565b6000602082019050818103600083015261365c81613620565b9050919050565b600061366e82612f5f565b915061367983612f5f565b925082820261368781612f5f565b9150828204841483151761369e5761369d613460565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006136df82612f5f565b91506136ea83612f5f565b9250826136fa576136f96136a5565b5b828204905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613761602583612e1d565b915061376c82613705565b604082019050919050565b6000602082019050818103600083015261379081613754565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006137f3603983612e1d565b91506137fe82613797565b604082019050919050565b60006020820190508181036000830152613822816137e6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613885602683612e1d565b915061389082613829565b604082019050919050565b600060208201905081810360008301526138b481613878565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613917602483612e1d565b9150613922826138bb565b604082019050919050565b600060208201905081810360008301526139468161390a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006139a9602283612e1d565b91506139b48261394d565b604082019050919050565b600060208201905081810360008301526139d88161399c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613a3b602583612e1d565b9150613a46826139df565b604082019050919050565b60006020820190508181036000830152613a6a81613a2e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613acd602383612e1d565b9150613ad882613a71565b604082019050919050565b60006020820190508181036000830152613afc81613ac0565b9050919050565b7f5f7472616e736665723a3a2054726164696e67206973206e6f7420616374697660008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b5f602283612e1d565b9150613b6a82613b03565b604082019050919050565b60006020820190508181036000830152613b8e81613b52565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d617854782e0000000000000000000000000000000000000000000000000000602082015250565b6000613bf1602683612e1d565b9150613bfc82613b95565b604082019050919050565b60006020820190508181036000830152613c2081613be4565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000613c5d601383612e1d565b9150613c6882613c27565b602082019050919050565b60006020820190508181036000830152613c8c81613c50565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d617854782e00000000000000000000000000000000000000000000000000602082015250565b6000613cef602783612e1d565b9150613cfa82613c93565b604082019050919050565b60006020820190508181036000830152613d1e81613ce2565b9050919050565b6000613d3082612f5f565b9150613d3b83612f5f565b9250828203905081811115613d5357613d52613460565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613db5602683612e1d565b9150613dc082613d59565b604082019050919050565b60006020820190508181036000830152613de481613da8565b9050919050565b600081905092915050565b50565b6000613e06600083613deb565b9150613e1182613df6565b600082019050919050565b6000613e2782613df9565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613e9e81612f33565b92915050565b600060208284031215613eba57613eb9612f2e565b5b6000613ec884828501613e8f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f0681612ee4565b82525050565b6000613f188383613efd565b60208301905092915050565b6000602082019050919050565b6000613f3c82613ed1565b613f468185613edc565b9350613f5183613eed565b8060005b83811015613f82578151613f698882613f0c565b9750613f7483613f24565b925050600181019050613f55565b5085935050505092915050565b600060a082019050613fa4600083018861300b565b613fb160208301876134f9565b8181036040830152613fc38186613f31565b9050613fd26060830185612ef6565b613fdf608083018461300b565b969550505050505056fea2646970667358221220a989c08600dbf86f2aaa452a0773f1807cb90ea20fb2a432560a9030547da2da64736f6c63430008130033

Deployed Bytecode

0x6080604052600436106101c65760003560e01c8063715018a6116100f7578063c30d131311610095578063dd62ed3e11610064578063dd62ed3e14610637578063e55648f414610674578063f242ab411461069d578063f2fde38b146106c8576101cd565b8063c30d13131461059a578063c40b793b146105b1578063c9567bf9146105f0578063d7ff53e514610607576101cd565b80638da5cb5b116100d15780638da5cb5b146104ca57806395d89b41146104f5578063a457c2d714610520578063a9059cbb1461055d576101cd565b8063715018a6146104615780637ff6f7b91461047857806383c150d4146104a1576101cd565b8063336ddc291161016457806351b8dc7b1161013e57806351b8dc7b146103b7578063622fa772146103e057806369e1ea7f1461040d57806370a0823114610424576101cd565b8063336ddc2914610326578063395093511461034f5780634ada218b1461038c576101cd565b806318160ddd116101a057806318160ddd1461026657806323b872dd14610291578063313ce567146102ce5780633308740b146102f9576101cd565b806306fdde03146101d2578063088c9eb4146101fd578063095ea7b314610229576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106f1565b6040516101f49190612ea2565b60405180910390f35b34801561020957600080fd5b50610212610783565b604051610220929190612f05565b60405180910390f35b34801561023557600080fd5b50610250600480360381019061024b9190612f95565b6107d4565b60405161025d9190612ff0565b60405180910390f35b34801561027257600080fd5b5061027b6107f2565b604051610288919061301a565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190613035565b6107fc565b6040516102c59190612ff0565b60405180910390f35b3480156102da57600080fd5b506102e36108f4565b6040516102f091906130a4565b60405180910390f35b34801561030557600080fd5b5061030e6108fd565b60405161031d939291906130bf565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906130f6565b610923565b005b34801561035b57600080fd5b5061037660048036038101906103719190612f95565b610a5f565b6040516103839190612ff0565b60405180910390f35b34801561039857600080fd5b506103a1610b0b565b6040516103ae9190612ff0565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d991906130f6565b610b1e565b005b3480156103ec57600080fd5b506103f5610c5a565b604051610404939291906130bf565b60405180910390f35b34801561041957600080fd5b50610422610c80565b005b34801561043057600080fd5b5061044b600480360381019061044691906130f6565b610dc0565b604051610458919061301a565b60405180910390f35b34801561046d57600080fd5b50610476610e08565b005b34801561048457600080fd5b5061049f600480360381019061049a919061314f565b610e90565b005b3480156104ad57600080fd5b506104c860048036038101906104c3919061317c565b610f29565b005b3480156104d657600080fd5b506104df6110d2565b6040516104ec91906131cf565b60405180910390f35b34801561050157600080fd5b5061050a6110fc565b6040516105179190612ea2565b60405180910390f35b34801561052c57600080fd5b5061054760048036038101906105429190612f95565b61118e565b6040516105549190612ff0565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190612f95565b611279565b6040516105919190612ff0565b60405180910390f35b3480156105a657600080fd5b506105af611297565b005b3480156105bd57600080fd5b506105d860048036038101906105d391906130f6565b61135d565b6040516105e7939291906131ea565b60405180910390f35b3480156105fc57600080fd5b50610605611456565b005b34801561061357600080fd5b5061061c611537565b60405161062e96959493929190613221565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613282565b611566565b60405161066b919061301a565b60405180910390f35b34801561068057600080fd5b5061069b600480360381019061069691906132c2565b6115ed565b005b3480156106a957600080fd5b506106b2611705565b6040516106bf91906131cf565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea91906130f6565b611729565b005b60606003805461070090613331565b80601f016020809104026020016040519081016040528092919081815260200182805461072c90613331565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050905090565b600080600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915091509091565b60006107e86107e1611820565b8484611828565b6001905092915050565b6000600254905090565b60006108098484846119f1565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610854611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156108d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cb906133d4565b60405180910390fd5b6108e8856108e0611820565b858403611828565b60019150509392505050565b60006012905090565b6000806000600860009054906101000a900460ff1692506009549150600a549050909192565b61092b611820565b73ffffffffffffffffffffffffffffffffffffffff166109496110d2565b73ffffffffffffffffffffffffffffffffffffffff161461099f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099690613440565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb91dbdeaf34f885ccae2d8abc3967cb03c079b6af2c7944e3893fd29427d75e760405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610b01610a6c611820565b848460016000610a7a611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610afc919061348f565b611828565b6001905092915050565b600c60009054906101000a900460ff1681565b610b26611820565b73ffffffffffffffffffffffffffffffffffffffff16610b446110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9190613440565b60405180910390fd5b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6760405160405180910390a380600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000600560159054906101000a900460ff16925060065491506007549050909192565b610c88611820565b73ffffffffffffffffffffffffffffffffffffffff16610ca66110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390613440565b60405180910390fd5b6000600f8190555060006010819055506000600e819055506000601281905550600060138190555060006011819055506000601581905550600060168190555060006014819055507f38513c502b0ab4834ac1df9502b76f75dcf7092469782cfd0db7fe664388e25e6000806000604051610d7993929190613508565b60405180910390a17fcb5f36df892836a2eaedc349de29a7581176990398ee185d16eaa8f6c1abd8f16000806000604051610db693929190613508565b60405180910390a1565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e10611820565b73ffffffffffffffffffffffffffffffffffffffff16610e2e6110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b90613440565b60405180910390fd5b610e8e60006125a8565b565b610e98611820565b73ffffffffffffffffffffffffffffffffffffffff16610eb66110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0390613440565b60405180910390fd5b80601c60006101000a81548160ff02191690831515021790555050565b610f31611820565b73ffffffffffffffffffffffffffffffffffffffff16610f4f6110d2565b73ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613440565b60405180910390fd5b6001821015610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe0906135b1565b60405180910390fd5b8181101561102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390613643565b60405180910390fd5b82600560156101000a81548160ff021916908315150217905550612710826110526107f2565b61105c9190613663565b61106691906136d4565b600681905550612710816110786107f2565b6110829190613663565b61108c91906136d4565b6007819055507f52cd2cdb42ff0eeec9362d7ed5b04f64c8d022697128b5378fc51cea7e63c7798383836040516110c5939291906130bf565b60405180910390a1505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461110b90613331565b80601f016020809104026020016040519081016040528092919081815260200182805461113790613331565b80156111845780601f1061115957610100808354040283529160200191611184565b820191906000526020600020905b81548152906001019060200180831161116757829003601f168201915b5050505050905090565b6000806001600061119d611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561125a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125190613777565b60405180910390fd5b61126e611265611820565b85858403611828565b600191505092915050565b600061128d611286611820565b84846119f1565b6001905092915050565b61129f611820565b73ffffffffffffffffffffffffffffffffffffffff166112bd6110d2565b73ffffffffffffffffffffffffffffffffffffffff1614611313576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130a90613440565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550427ff4eaa75eae08ae80c3daf791438dac1cff2cfd3b0bad2304ec7bbb067e50261660405160405180910390a2565b6000806000601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169250601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169150601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690509193909250565b61145e611820565b73ffffffffffffffffffffffffffffffffffffffff1661147c6110d2565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613440565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550427fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92360405160405180910390a2565b600080600080600080600e549550600f5494506010549350601154925060125491506013549050909192939495565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6115f5611820565b73ffffffffffffffffffffffffffffffffffffffff166116136110d2565b73ffffffffffffffffffffffffffffffffffffffff1614611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090613440565b60405180910390fd5b7f00000000000000000000000099b1febd6ed175ac63cb2e12395af2feea9111be73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee90613809565b60405180910390fd5b611701828261266e565b5050565b7f00000000000000000000000099b1febd6ed175ac63cb2e12395af2feea9111be81565b611731611820565b73ffffffffffffffffffffffffffffffffffffffff1661174f6110d2565b73ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613440565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b9061389b565b60405180910390fd5b61181d816125a8565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188e9061392d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd906139bf565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516119e4919061301a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5790613a51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690613ae3565b60405180910390fd5b60008103611ae857611ae38383600061270f565b6125a3565b600860009054906101000a900460ff1615611fe357611b056110d2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611b735750611b436110d2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611bac5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611be6575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611bff5750600560149054906101000a900460ff16155b15611fe257600c60009054906101000a900460ff16611cf957601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cb95750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b611cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cef90613b75565b60405180910390fd5b5b601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611d9c5750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e4357600a54811115611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90613c07565b60405180910390fd5b600954611df283610dc0565b82611dfd919061348f565b1115611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3590613c73565b60405180910390fd5b611fe1565b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611ee65750601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f3557600a54811115611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790613d05565b60405180910390fd5b611fe0565b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611fdf57600954611f9283610dc0565b82611f9d919061348f565b1115611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590613c73565b60405180910390fd5b5b5b5b5b5b6000611fee30610dc0565b9050600060065482101590508080156120135750600560159054906101000a900460ff165b801561202c5750600560149054906101000a900460ff16155b80156120825750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120d85750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561212e5750601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612173576001600560146101000a81548160ff0219169083151502179055506121578361298e565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806122295750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561223357600090505b6000811561259357601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561229657506000601154115b15612330576122c360646122b560115488612b8990919063ffffffff16565b612b9f90919063ffffffff16565b9050601154601354826122d69190613663565b6122e091906136d4565b601860008282546122f1919061348f565b92505081905550601154601254826123099190613663565b61231391906136d4565b60176000828254612324919061348f565b9250508190555061256f565b601b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561238b57506000600e54115b15612425576123b860646123aa600e5488612b8990919063ffffffff16565b612b9f90919063ffffffff16565b9050600e54601054826123cb9190613663565b6123d591906136d4565b601860008282546123e6919061348f565b92505081905550600e54600f54826123fe9190613663565b61240891906136d4565b60176000828254612419919061348f565b9250508190555061256e565b60006014541180156124815750601b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156124d75750601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561256d5761250460646124f660145488612b8990919063ffffffff16565b612b9f90919063ffffffff16565b9050601454601654826125179190613663565b61252191906136d4565b60186000828254612532919061348f565b925050819055506014546015548261254a9190613663565b61255491906136d4565b60176000828254612565919061348f565b925050819055505b5b5b60008111156125845761258387308361270f565b5b80856125909190613d25565b94505b61259e87878761270f565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f02d59e6bf2c101e2d8367c2a27c51357eccfebcca0d09aa27c00e24e946c0d6a60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361277e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277590613a51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036127ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e490613ae3565b60405180910390fd5b6127f8838383612bb5565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590613dcb565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612911919061348f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612975919061301a565b60405180910390a3612988848484612bba565b50505050565b600061299930610dc0565b9050600081905060008083036129b157505050612b86565b6007548311156129c15760075492505b601c60009054906101000a900460ff1680156129e857506005846129e59190613663565b83115b156129fd576005846129fa9190613663565b92505b60008390506000479050612a1082612bbf565b6000612a258247612dfc90919063ffffffff16565b90506000612a5086612a4260185485612b8990919063ffffffff16565b612b9f90919063ffffffff16565b905060006017819055506000601881905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051612aa890613e1c565b60006040518083038185875af1925050503d8060008114612ae5576040519150601f19603f3d011682016040523d82523d6000602084013e612aea565b606091505b505080955050600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051612b3690613e1c565b60006040518083038185875af1925050503d8060008114612b73576040519150601f19603f3d011682016040523d82523d6000602084013e612b78565b606091505b505080955050505050505050505b50565b60008183612b979190613663565b905092915050565b60008183612bad91906136d4565b905092915050565b505050565b505050565b6000600267ffffffffffffffff811115612bdc57612bdb613e31565b5b604051908082528060200260200182016040528015612c0a5781602001602082028036833780820191505090505b5090503081600081518110612c2257612c21613e60565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ceb9190613ea4565b81600181518110612cff57612cfe613e60565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612d64307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611828565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612dc6959493929190613f8f565b600060405180830381600087803b158015612de057600080fd5b505af1158015612df4573d6000803e3d6000fd5b505050505050565b60008183612e0a9190613d25565b905092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e4c578082015181840152602081019050612e31565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e7482612e12565b612e7e8185612e1d565b9350612e8e818560208601612e2e565b612e9781612e58565b840191505092915050565b60006020820190508181036000830152612ebc8184612e69565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612eef82612ec4565b9050919050565b612eff81612ee4565b82525050565b6000604082019050612f1a6000830185612ef6565b612f276020830184612ef6565b9392505050565b600080fd5b612f3c81612ee4565b8114612f4757600080fd5b50565b600081359050612f5981612f33565b92915050565b6000819050919050565b612f7281612f5f565b8114612f7d57600080fd5b50565b600081359050612f8f81612f69565b92915050565b60008060408385031215612fac57612fab612f2e565b5b6000612fba85828601612f4a565b9250506020612fcb85828601612f80565b9150509250929050565b60008115159050919050565b612fea81612fd5565b82525050565b60006020820190506130056000830184612fe1565b92915050565b61301481612f5f565b82525050565b600060208201905061302f600083018461300b565b92915050565b60008060006060848603121561304e5761304d612f2e565b5b600061305c86828701612f4a565b935050602061306d86828701612f4a565b925050604061307e86828701612f80565b9150509250925092565b600060ff82169050919050565b61309e81613088565b82525050565b60006020820190506130b96000830184613095565b92915050565b60006060820190506130d46000830186612fe1565b6130e1602083018561300b565b6130ee604083018461300b565b949350505050565b60006020828403121561310c5761310b612f2e565b5b600061311a84828501612f4a565b91505092915050565b61312c81612fd5565b811461313757600080fd5b50565b60008135905061314981613123565b92915050565b60006020828403121561316557613164612f2e565b5b60006131738482850161313a565b91505092915050565b60008060006060848603121561319557613194612f2e565b5b60006131a38682870161313a565b93505060206131b486828701612f80565b92505060406131c586828701612f80565b9150509250925092565b60006020820190506131e46000830184612ef6565b92915050565b60006060820190506131ff6000830186612fe1565b61320c6020830185612fe1565b6132196040830184612fe1565b949350505050565b600060c082019050613236600083018961300b565b613243602083018861300b565b613250604083018761300b565b61325d606083018661300b565b61326a608083018561300b565b61327760a083018461300b565b979650505050505050565b6000806040838503121561329957613298612f2e565b5b60006132a785828601612f4a565b92505060206132b885828601612f4a565b9150509250929050565b600080604083850312156132d9576132d8612f2e565b5b60006132e785828601612f4a565b92505060206132f88582860161313a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061334957607f821691505b60208210810361335c5761335b613302565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006133be602883612e1d565b91506133c982613362565b604082019050919050565b600060208201905081810360008301526133ed816133b1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061342a602083612e1d565b9150613435826133f4565b602082019050919050565b600060208201905081810360008301526134598161341d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061349a82612f5f565b91506134a583612f5f565b92508282019050808211156134bd576134bc613460565b5b92915050565b6000819050919050565b6000819050919050565b60006134f26134ed6134e8846134c3565b6134cd565b612f5f565b9050919050565b613502816134d7565b82525050565b600060608201905061351d60008301866134f9565b61352a60208301856134f9565b61353760408301846134f9565b949350505050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e30312520746f74616c20737570706c792e000000000000000000000000602082015250565b600061359b603483612e1d565b91506135a68261353f565b604082019050919050565b600060208201905081810360008301526135ca8161358e565b9050919050565b7f6d6178696d756d20616d6f756e742063616e742062652068696768657220746860008201527f616e206d696e696d756d00000000000000000000000000000000000000000000602082015250565b600061362d602a83612e1d565b9150613638826135d1565b604082019050919050565b6000602082019050818103600083015261365c81613620565b9050919050565b600061366e82612f5f565b915061367983612f5f565b925082820261368781612f5f565b9150828204841483151761369e5761369d613460565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006136df82612f5f565b91506136ea83612f5f565b9250826136fa576136f96136a5565b5b828204905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613761602583612e1d565b915061376c82613705565b604082019050919050565b6000602082019050818103600083015261379081613754565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b60006137f3603983612e1d565b91506137fe82613797565b604082019050919050565b60006020820190508181036000830152613822816137e6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613885602683612e1d565b915061389082613829565b604082019050919050565b600060208201905081810360008301526138b481613878565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613917602483612e1d565b9150613922826138bb565b604082019050919050565b600060208201905081810360008301526139468161390a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006139a9602283612e1d565b91506139b48261394d565b604082019050919050565b600060208201905081810360008301526139d88161399c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613a3b602583612e1d565b9150613a46826139df565b604082019050919050565b60006020820190508181036000830152613a6a81613a2e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613acd602383612e1d565b9150613ad882613a71565b604082019050919050565b60006020820190508181036000830152613afc81613ac0565b9050919050565b7f5f7472616e736665723a3a2054726164696e67206973206e6f7420616374697660008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b5f602283612e1d565b9150613b6a82613b03565b604082019050919050565b60006020820190508181036000830152613b8e81613b52565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d617854782e0000000000000000000000000000000000000000000000000000602082015250565b6000613bf1602683612e1d565b9150613bfc82613b95565b604082019050919050565b60006020820190508181036000830152613c2081613be4565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b6000613c5d601383612e1d565b9150613c6882613c27565b602082019050919050565b60006020820190508181036000830152613c8c81613c50565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d617854782e00000000000000000000000000000000000000000000000000602082015250565b6000613cef602783612e1d565b9150613cfa82613c93565b604082019050919050565b60006020820190508181036000830152613d1e81613ce2565b9050919050565b6000613d3082612f5f565b9150613d3b83612f5f565b9250828203905081811115613d5357613d52613460565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613db5602683612e1d565b9150613dc082613d59565b604082019050919050565b60006020820190508181036000830152613de481613da8565b9050919050565b600081905092915050565b50565b6000613e06600083613deb565b9150613e1182613df6565b600082019050919050565b6000613e2782613df9565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613e9e81612f33565b92915050565b600060208284031215613eba57613eb9612f2e565b5b6000613ec884828501613e8f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f0681612ee4565b82525050565b6000613f188383613efd565b60208301905092915050565b6000602082019050919050565b6000613f3c82613ed1565b613f468185613edc565b9350613f5183613eed565b8060005b83811015613f82578151613f698882613f0c565b9750613f7483613f24565b925050600181019050613f55565b5085935050505092915050565b600060a082019050613fa4600083018861300b565b613fb160208301876134f9565b8181036040830152613fc38186613f31565b9050613fd26060830185612ef6565b613fdf608083018461300b565b969550505050505056fea2646970667358221220a989c08600dbf86f2aaa452a0773f1807cb90ea20fb2a432560a9030547da2da64736f6c63430008130033

Deployed Bytecode Sourcemap

30470:20541:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15850:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42868:193;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;18158:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16970:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18846:529;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16812:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42340:296;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;41101:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19780:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31044:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40740:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41635:358;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;39362:489;;;;;;;;;;;;;:::i;:::-;;17141:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27294:103;;;;;;;;;;;;;:::i;:::-;;49826:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38363:553;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26643:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16069:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20576:482;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17531:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37760:139;;;;;;;;;;;;;:::i;:::-;;44582:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37443:162;;;;;;;;;;;;;:::i;:::-;;43545:577;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;17810:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40147:241;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30590:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27552:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15850:100;15904:13;15937:5;15930:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15850:100;:::o;42868:193::-;42948:24;42974:22;43022:15;;;;;;;;;;;43039:13;;;;;;;;;;;43014:39;;;;42868:193;;:::o;18158:210::-;18277:4;18299:39;18308:12;:10;:12::i;:::-;18322:7;18331:6;18299:8;:39::i;:::-;18356:4;18349:11;;18158:210;;;;:::o;16970:108::-;17031:7;17058:12;;17051:19;;16970:108;:::o;18846:529::-;18986:4;19003:36;19013:6;19021:9;19032:6;19003:9;:36::i;:::-;19052:24;19079:11;:19;19091:6;19079:19;;;;;;;;;;;;;;;:33;19099:12;:10;:12::i;:::-;19079:33;;;;;;;;;;;;;;;;19052:60;;19165:6;19145:16;:26;;19123:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;19275:57;19284:6;19292:12;:10;:12::i;:::-;19325:6;19306:16;:25;19275:8;:57::i;:::-;19363:4;19356:11;;;18846:529;;;;;:::o;16812:93::-;16870:5;16895:2;16888:9;;16812:93;:::o;42340:296::-;42431:19;42465:18;42498:14;42557:13;;;;;;;;;;;42540:30;;42594:9;;42581:22;;42623:5;;42614:14;;42340:296;;;:::o;41101:175::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41218:13:::1;;;;;;;;;;;41186:46;;41207:9;41186:46;;;;;;;;;;;;41259:9;41243:13;;:25;;;;;;;;;;;;;;;;;;41101:175:::0;:::o;19780:297::-;19895:4;19917:130;19940:12;:10;:12::i;:::-;19967:7;20026:10;19989:11;:25;20001:12;:10;:12::i;:::-;19989:25;;;;;;;;;;;;;;;:34;20015:7;19989:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;19917:8;:130::i;:::-;20065:4;20058:11;;19780:297;;;;:::o;31044:34::-;;;;;;;;;;;;;:::o;40740:181::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40859:15:::1;;;;;;;;;;;40825:50;;40848:9;40825:50;;;;;;;;;;;;40904:9;40886:15;;:27;;;;;;;;;;;;;;;;;;40740:181:::0;:::o;41635:358::-;41728:21;41764:25;41804;41876:15;;;;;;;;;;;41857:34;;41922:16;;41902:36;;41969:16;;41949:36;;41635:358;;;:::o;39362:489::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39469:1:::1;39451:15;:19;;;;39497:1;39481:13;:17;;;;39523:1;39509:11;:15;;;;39556:1;39537:16;:20;;;;39585:1;39568:14;:18;;;;39612:1;39597:12;:16;;;;39649:1;39626:20;:24;;;;39682:1;39661:18;:22;;;;39713:1;39694:16;:20;;;;39782:22;39796:1;39799::::0;39802::::1;39782:22;;;;;;;;:::i;:::-;;;;;;;;39820:23;39835:1;39838::::0;39841::::1;39820:23;;;;;;;;:::i;:::-;;;;;;;;39362:489::o:0;17141:177::-;17260:7;17292:9;:18;17302:7;17292:18;;;;;;;;;;;;;;;;17285:25;;17141:177;;;:::o;27294:103::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27359:30:::1;27386:1;27359:18;:30::i;:::-;27294:103::o:0;49826:79::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49892:5:::1;49885:4;;:12;;;;;;;;;;;;;;;;;;49826:79:::0;:::o;38363:553::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38531:1:::1;38523:4;:9;;38501:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38639:4;38631;:12;;38623:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38721:7;38703:15;;:25;;;;;;;;;;;;;;;;;;38783:5;38775:4;38759:13;:11;:13::i;:::-;:20;;;;:::i;:::-;38758:30;;;;:::i;:::-;38739:16;:49;;;;38843:5;38835:4;38819:13;:11;:13::i;:::-;:20;;;;:::i;:::-;38818:30;;;;:::i;:::-;38799:16;:49;;;;38864:44;38888:7;38897:4;38903;38864:44;;;;;;;;:::i;:::-;;;;;;;;38363:553:::0;;;:::o;26643:87::-;26689:7;26716:6;;;;;;;;;;;26709:13;;26643:87;:::o;16069:104::-;16125:13;16158:7;16151:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16069:104;:::o;20576:482::-;20696:4;20718:24;20745:11;:25;20757:12;:10;:12::i;:::-;20745:25;;;;;;;;;;;;;;;:34;20771:7;20745:34;;;;;;;;;;;;;;;;20718:61;;20832:15;20812:16;:35;;20790:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;20948:67;20957:12;:10;:12::i;:::-;20971:7;20999:15;20980:16;:34;20948:8;:67::i;:::-;21046:4;21039:11;;;20576:482;;;;:::o;17531:216::-;17653:4;17675:42;17685:12;:10;:12::i;:::-;17699:9;17710:6;17675:9;:42::i;:::-;17735:4;17728:11;;17531:216;;;;:::o;37760:139::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37840:5:::1;37824:13;;:21;;;;;;;;;;;;;;;;;;37875:15;37861:30;;;;;;;;;;37760:139::o:0;44582:437::-;44691:23;44729:25;44769:31;44849:17;:26;44867:7;44849:26;;;;;;;;;;;;;;;;;;;;;;;;;44828:47;;44909:19;:28;44929:7;44909:28;;;;;;;;;;;;;;;;;;;;;;;;;44886:51;;44977:25;:34;45003:7;44977:34;;;;;;;;;;;;;;;;;;;;;;;;;44948:63;;44582:437;;;;;:::o;37443:162::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37513:4:::1;37496:14;;:21;;;;;;;;;;;;;;;;;;37546:4;37528:15;;:22;;;;;;;;;;;;;;;;;;37581:15;37566:31;;;;;;;;;;37443:162::o:0;43545:577::-;43635:20;43670:24;43709:22;43746:21;43782:25;43822:23;43888:11;;43873:26;;43929:15;;43910:34;;43972:13;;43955:30;;44012:12;;43996:28;;44055:16;;44035:36;;44100:14;;44082:32;;43545:577;;;;;;:::o;17810:201::-;17944:7;17976:11;:18;17988:5;17976:18;;;;;;;;;;;;;;;:27;17995:7;17976:27;;;;;;;;;;;;;;;;17969:34;;17810:201;;;;:::o;40147:241::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40251:7:::1;40243:15;;:4;:15;;::::0;40221:122:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;40356:24;40368:4;40374:5;40356:11;:24::i;:::-;40147:241:::0;;:::o;30590:32::-;;;:::o;27552:238::-;26874:12;:10;:12::i;:::-;26863:23;;:7;:5;:7::i;:::-;:23;;;26855:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27675:1:::1;27655:22;;:8;:22;;::::0;27633:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27754:28;27773:8;27754:18;:28::i;:::-;27552:238:::0;:::o;14856:98::-;14909:7;14936:10;14929:17;;14856:98;:::o;24366:380::-;24519:1;24502:19;;:5;:19;;;24494:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24600:1;24581:21;;:7;:21;;;24573:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24684:6;24654:11;:18;24666:5;24654:18;;;;;;;;;;;;;;;:27;24673:7;24654:27;;;;;;;;;;;;;;;:36;;;;24722:7;24706:32;;24715:5;24706:32;;;24731:6;24706:32;;;;;;:::i;:::-;;;;;;;;24366:380;;;:::o;45027:4187::-;45175:1;45159:18;;:4;:18;;;45151:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45252:1;45238:16;;:2;:16;;;45230:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45321:1;45311:6;:11;45307:93;;45339:28;45355:4;45361:2;45365:1;45339:15;:28::i;:::-;45382:7;;45307:93;45416:13;;;;;;;;;;;45412:1564;;;45476:7;:5;:7::i;:::-;45468:15;;:4;:15;;;;:49;;;;;45510:7;:5;:7::i;:::-;45504:13;;:2;:13;;;;45468:49;:86;;;;;45552:1;45538:16;;:2;:16;;;;45468:86;:128;;;;;45589:6;45575:21;;:2;:21;;;;45468:128;:158;;;;;45618:8;;;;;;;;;;;45617:9;45468:158;45446:1519;;;45666:14;;;;;;;;;;;45661:232;;45739:17;:23;45757:4;45739:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;45766:17;:21;45784:2;45766:21;;;;;;;;;;;;;;;;;;;;;;;;;45739:48;45705:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;45661:232;45967:25;:31;45993:4;45967:31;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;;46003:19;:23;46023:2;46003:23;;;;;;;;;;;;;;;;;;;;;;;;;46002:24;45967:59;45941:1009;;;46113:5;;46103:6;:15;;46069:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;46291:9;;46274:13;46284:2;46274:9;:13::i;:::-;46265:6;:22;;;;:::i;:::-;:35;;46231:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;45941:1009;;;46469:25;:29;46495:2;46469:29;;;;;;;;;;;;;;;;;;;;;;;;;:59;;;;;46503:19;:25;46523:4;46503:25;;;;;;;;;;;;;;;;;;;;;;;;;46502:26;46469:59;46443:507;;;46615:5;;46605:6;:15;;46571:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;46443:507;;;46742:19;:23;46762:2;46742:23;;;;;;;;;;;;;;;;;;;;;;;;;46737:213;;46850:9;;46833:13;46843:2;46833:9;:13::i;:::-;46824:6;:22;;;;:::i;:::-;:35;;46790:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;46737:213;46443:507;45941:1009;45446:1519;45412:1564;46988:28;47019:24;47037:4;47019:9;:24::i;:::-;46988:55;;47056:12;47095:16;;47071:20;:40;;47056:55;;47142:7;:39;;;;;47166:15;;;;;;;;;;;47142:39;:65;;;;;47199:8;;;;;;;;;;;47198:9;47142:65;:114;;;;;47225:25;:31;47251:4;47225:31;;;;;;;;;;;;;;;;;;;;;;;;;47224:32;47142:114;:155;;;;;47274:17;:23;47292:4;47274:23;;;;;;;;;;;;;;;;;;;;;;;;;47273:24;47142:155;:194;;;;;47315:17;:21;47333:2;47315:21;;;;;;;;;;;;;;;;;;;;;;;;;47314:22;47142:194;47124:332;;;47374:4;47363:8;;:15;;;;;;;;;;;;;;;;;;47395:16;47404:6;47395:8;:16::i;:::-;47439:5;47428:8;;:16;;;;;;;;;;;;;;;;;;47124:332;47468:12;47484:8;;;;;;;;;;;47483:9;47468:24;;47594:17;:23;47612:4;47594:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;47621:17;:21;47639:2;47621:21;;;;;;;;;;;;;;;;;;;;;;;;;47594:48;47590:96;;;47669:5;47659:15;;47590:96;47698:12;47803:7;47799:1362;;;47855:25;:29;47881:2;47855:29;;;;;;;;;;;;;;;;;;;;;;;;;:49;;;;;47903:1;47888:12;;:16;47855:49;47851:1161;;;47932:33;47961:3;47932:24;47943:12;;47932:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;47925:40;;48030:12;;48012:14;;48005:4;:21;;;;:::i;:::-;48004:38;;;;:::i;:::-;47984:16;;:58;;;;;;;:::i;:::-;;;;;;;;48111:12;;48091:16;;48084:4;:23;;;;:::i;:::-;48083:40;;;;:::i;:::-;48061:18;;:62;;;;;;;:::i;:::-;;;;;;;;47851:1161;;;48185:25;:31;48211:4;48185:31;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;48234:1;48220:11;;:15;48185:50;48181:831;;;48263:32;48291:3;48263:23;48274:11;;48263:6;:10;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;48256:39;;48359:11;;48342:13;;48335:4;:20;;;;:::i;:::-;48334:36;;;;:::i;:::-;48314:16;;:56;;;;;;;:::i;:::-;;;;;;;;48438:11;;48419:15;;48412:4;:22;;;;:::i;:::-;48411:38;;;;:::i;:::-;48389:18;;:60;;;;;;;:::i;:::-;;;;;;;;48181:831;;;48554:1;48535:16;;:20;:73;;;;;48577:25;:31;48603:4;48577:31;;;;;;;;;;;;;;;;;;;;;;;;;48576:32;48535:73;:124;;;;;48630:25;:29;48656:2;48630:29;;;;;;;;;;;;;;;;;;;;;;;;;48629:30;48535:124;48513:499;;;48701:37;48734:3;48701:28;48712:16;;48701:6;:10;;:28;;;;:::i;:::-;:32;;:37;;;;:::i;:::-;48694:44;;48849:16;;48806:18;;48799:4;:25;;;;:::i;:::-;48798:67;;;;:::i;:::-;48757:16;;:108;;;;;;;:::i;:::-;;;;;;;;48980:16;;48935:20;;48928:4;:27;;;;:::i;:::-;48927:69;;;;:::i;:::-;48884:18;;:112;;;;;;;:::i;:::-;;;;;;;;48513:499;48181:831;47851:1161;49039:1;49032:4;:8;49028:91;;;49061:42;49077:4;49091;49098;49061:15;:42::i;:::-;49028:91;49145:4;49135:14;;;;;:::i;:::-;;;47799:1362;49173:33;49189:4;49195:2;49199:6;49173:15;:33::i;:::-;45140:4074;;;;45027:4187;;;;:::o;27950:191::-;28024:16;28043:6;;;;;;;;;;;28024:25;;28069:8;28060:6;;:17;;;;;;;;;;;;;;;;;;28124:8;28093:40;;28114:8;28093:40;;;;;;;;;;;;28013:128;27950:191;:::o;40396:154::-;40496:5;40462:25;:31;40488:4;40462:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;40536:5;40519:23;;40530:4;40519:23;;;;;;;;;;;;40396:154;;:::o;21548:770::-;21706:1;21688:20;;:6;:20;;;21680:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;21790:1;21769:23;;:9;:23;;;21761:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21845:47;21866:6;21874:9;21885:6;21845:20;:47::i;:::-;21905:21;21929:9;:17;21939:6;21929:17;;;;;;;;;;;;;;;;21905:41;;21996:6;21979:13;:23;;21957:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22140:6;22124:13;:22;22104:9;:17;22114:6;22104:17;;;;;;;;;;;;;;;:42;;;;22192:6;22168:9;:20;22178:9;22168:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;22233:9;22216:35;;22225:6;22216:35;;;22244:6;22216:35;;;;;;:::i;:::-;;;;;;;;22264:46;22284:6;22292:9;22303:6;22264:19;:46::i;:::-;21669:649;21548:770;;;:::o;49913:1095::-;49966:23;49992:24;50010:4;49992:9;:24::i;:::-;49966:50;;50027:25;50055:15;50027:43;;50081:12;50129:1;50110:15;:20;50106:59;;50147:7;;;;;50106:59;50199:16;;50181:15;:34;50177:101;;;50250:16;;50232:34;;50177:101;50294:4;;;;;;;;;;;:36;;;;;50329:1;50320:6;:10;;;;:::i;:::-;50302:15;:28;50294:36;50290:97;;;50374:1;50365:6;:10;;;;:::i;:::-;50347:28;;50290:97;50399:26;50428:15;50399:44;;50456:25;50484:21;50456:49;;50518:36;50535:18;50518:16;:36::i;:::-;50567:18;50588:44;50614:17;50588:21;:25;;:44;;;;:::i;:::-;50567:65;;50645:17;50665:79;50716:17;50665:32;50680:16;;50665:10;:14;;:32;;;;:::i;:::-;:36;;:79;;;;:::i;:::-;50645:99;;50778:1;50757:18;:22;;;;50809:1;50790:16;:20;;;;50845:13;;;;;;;;;;;50837:27;;50872:9;50837:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50823:63;;;;;50921:15;;;;;;;;;;;50913:29;;50964:21;50913:87;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50899:101;;;;;49955:1053;;;;;;;49913:1095;;:::o;8220:98::-;8278:7;8309:1;8305;:5;;;;:::i;:::-;8298:12;;8220:98;;;;:::o;8619:::-;8677:7;8708:1;8704;:5;;;;:::i;:::-;8697:12;;8619:98;;;;:::o;25346:125::-;;;;:::o;26075:124::-;;;;:::o;49222:571::-;49348:21;49386:1;49372:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49348:40;;49417:4;49399;49404:1;49399:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;49443:9;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49433:4;49438:1;49433:7;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;49472:56;49489:4;49504:9;49516:11;49472:8;:56::i;:::-;49567:9;:60;;;49642:11;49668:1;49712:4;49739;49759:15;49567:218;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49277:516;49222:571;:::o;7863:98::-;7921:7;7952:1;7948;:5;;;;:::i;:::-;7941:12;;7863:98;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:126::-;1386:7;1426:42;1419:5;1415:54;1404:65;;1349:126;;;:::o;1481:96::-;1518:7;1547:24;1565:5;1547:24;:::i;:::-;1536:35;;1481:96;;;:::o;1583:118::-;1670:24;1688:5;1670:24;:::i;:::-;1665:3;1658:37;1583:118;;:::o;1707:332::-;1828:4;1866:2;1855:9;1851:18;1843:26;;1879:71;1947:1;1936:9;1932:17;1923:6;1879:71;:::i;:::-;1960:72;2028:2;2017:9;2013:18;2004:6;1960:72;:::i;:::-;1707:332;;;;;:::o;2126:117::-;2235:1;2232;2225:12;2372:122;2445:24;2463:5;2445:24;:::i;:::-;2438:5;2435:35;2425:63;;2484:1;2481;2474:12;2425:63;2372:122;:::o;2500:139::-;2546:5;2584:6;2571:20;2562:29;;2600:33;2627:5;2600:33;:::i;:::-;2500:139;;;;:::o;2645:77::-;2682:7;2711:5;2700:16;;2645:77;;;:::o;2728:122::-;2801:24;2819:5;2801:24;:::i;:::-;2794:5;2791:35;2781:63;;2840:1;2837;2830:12;2781:63;2728:122;:::o;2856:139::-;2902:5;2940:6;2927:20;2918:29;;2956:33;2983:5;2956:33;:::i;:::-;2856:139;;;;:::o;3001:474::-;3069:6;3077;3126:2;3114:9;3105:7;3101:23;3097:32;3094:119;;;3132:79;;:::i;:::-;3094:119;3252:1;3277:53;3322:7;3313:6;3302:9;3298:22;3277:53;:::i;:::-;3267:63;;3223:117;3379:2;3405:53;3450:7;3441:6;3430:9;3426:22;3405:53;:::i;:::-;3395:63;;3350:118;3001:474;;;;;:::o;3481:90::-;3515:7;3558:5;3551:13;3544:21;3533:32;;3481:90;;;:::o;3577:109::-;3658:21;3673:5;3658:21;:::i;:::-;3653:3;3646:34;3577:109;;:::o;3692:210::-;3779:4;3817:2;3806:9;3802:18;3794:26;;3830:65;3892:1;3881:9;3877:17;3868:6;3830:65;:::i;:::-;3692:210;;;;:::o;3908:118::-;3995:24;4013:5;3995:24;:::i;:::-;3990:3;3983:37;3908:118;;:::o;4032:222::-;4125:4;4163:2;4152:9;4148:18;4140:26;;4176:71;4244:1;4233:9;4229:17;4220:6;4176:71;:::i;:::-;4032:222;;;;:::o;4260:619::-;4337:6;4345;4353;4402:2;4390:9;4381:7;4377:23;4373:32;4370:119;;;4408:79;;:::i;:::-;4370:119;4528:1;4553:53;4598:7;4589:6;4578:9;4574:22;4553:53;:::i;:::-;4543:63;;4499:117;4655:2;4681:53;4726:7;4717:6;4706:9;4702:22;4681:53;:::i;:::-;4671:63;;4626:118;4783:2;4809:53;4854:7;4845:6;4834:9;4830:22;4809:53;:::i;:::-;4799:63;;4754:118;4260:619;;;;;:::o;4885:86::-;4920:7;4960:4;4953:5;4949:16;4938:27;;4885:86;;;:::o;4977:112::-;5060:22;5076:5;5060:22;:::i;:::-;5055:3;5048:35;4977:112;;:::o;5095:214::-;5184:4;5222:2;5211:9;5207:18;5199:26;;5235:67;5299:1;5288:9;5284:17;5275:6;5235:67;:::i;:::-;5095:214;;;;:::o;5315:430::-;5458:4;5496:2;5485:9;5481:18;5473:26;;5509:65;5571:1;5560:9;5556:17;5547:6;5509:65;:::i;:::-;5584:72;5652:2;5641:9;5637:18;5628:6;5584:72;:::i;:::-;5666;5734:2;5723:9;5719:18;5710:6;5666:72;:::i;:::-;5315:430;;;;;;:::o;5751:329::-;5810:6;5859:2;5847:9;5838:7;5834:23;5830:32;5827:119;;;5865:79;;:::i;:::-;5827:119;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5751:329;;;;:::o;6086:116::-;6156:21;6171:5;6156:21;:::i;:::-;6149:5;6146:32;6136:60;;6192:1;6189;6182:12;6136:60;6086:116;:::o;6208:133::-;6251:5;6289:6;6276:20;6267:29;;6305:30;6329:5;6305:30;:::i;:::-;6208:133;;;;:::o;6347:323::-;6403:6;6452:2;6440:9;6431:7;6427:23;6423:32;6420:119;;;6458:79;;:::i;:::-;6420:119;6578:1;6603:50;6645:7;6636:6;6625:9;6621:22;6603:50;:::i;:::-;6593:60;;6549:114;6347:323;;;;:::o;6676:613::-;6750:6;6758;6766;6815:2;6803:9;6794:7;6790:23;6786:32;6783:119;;;6821:79;;:::i;:::-;6783:119;6941:1;6966:50;7008:7;6999:6;6988:9;6984:22;6966:50;:::i;:::-;6956:60;;6912:114;7065:2;7091:53;7136:7;7127:6;7116:9;7112:22;7091:53;:::i;:::-;7081:63;;7036:118;7193:2;7219:53;7264:7;7255:6;7244:9;7240:22;7219:53;:::i;:::-;7209:63;;7164:118;6676:613;;;;;:::o;7295:222::-;7388:4;7426:2;7415:9;7411:18;7403:26;;7439:71;7507:1;7496:9;7492:17;7483:6;7439:71;:::i;:::-;7295:222;;;;:::o;7523:406::-;7654:4;7692:2;7681:9;7677:18;7669:26;;7705:65;7767:1;7756:9;7752:17;7743:6;7705:65;:::i;:::-;7780:66;7842:2;7831:9;7827:18;7818:6;7780:66;:::i;:::-;7856;7918:2;7907:9;7903:18;7894:6;7856:66;:::i;:::-;7523:406;;;;;;:::o;7935:775::-;8168:4;8206:3;8195:9;8191:19;8183:27;;8220:71;8288:1;8277:9;8273:17;8264:6;8220:71;:::i;:::-;8301:72;8369:2;8358:9;8354:18;8345:6;8301:72;:::i;:::-;8383;8451:2;8440:9;8436:18;8427:6;8383:72;:::i;:::-;8465;8533:2;8522:9;8518:18;8509:6;8465:72;:::i;:::-;8547:73;8615:3;8604:9;8600:19;8591:6;8547:73;:::i;:::-;8630;8698:3;8687:9;8683:19;8674:6;8630:73;:::i;:::-;7935:775;;;;;;;;;:::o;8716:474::-;8784:6;8792;8841:2;8829:9;8820:7;8816:23;8812:32;8809:119;;;8847:79;;:::i;:::-;8809:119;8967:1;8992:53;9037:7;9028:6;9017:9;9013:22;8992:53;:::i;:::-;8982:63;;8938:117;9094:2;9120:53;9165:7;9156:6;9145:9;9141:22;9120:53;:::i;:::-;9110:63;;9065:118;8716:474;;;;;:::o;9196:468::-;9261:6;9269;9318:2;9306:9;9297:7;9293:23;9289:32;9286:119;;;9324:79;;:::i;:::-;9286:119;9444:1;9469:53;9514:7;9505:6;9494:9;9490:22;9469:53;:::i;:::-;9459:63;;9415:117;9571:2;9597:50;9639:7;9630:6;9619:9;9615:22;9597:50;:::i;:::-;9587:60;;9542:115;9196:468;;;;;:::o;9670:180::-;9718:77;9715:1;9708:88;9815:4;9812:1;9805:15;9839:4;9836:1;9829:15;9856:320;9900:6;9937:1;9931:4;9927:12;9917:22;;9984:1;9978:4;9974:12;10005:18;9995:81;;10061:4;10053:6;10049:17;10039:27;;9995:81;10123:2;10115:6;10112:14;10092:18;10089:38;10086:84;;10142:18;;:::i;:::-;10086:84;9907:269;9856:320;;;:::o;10182:227::-;10322:34;10318:1;10310:6;10306:14;10299:58;10391:10;10386:2;10378:6;10374:15;10367:35;10182:227;:::o;10415:366::-;10557:3;10578:67;10642:2;10637:3;10578:67;:::i;:::-;10571:74;;10654:93;10743:3;10654:93;:::i;:::-;10772:2;10767:3;10763:12;10756:19;;10415:366;;;:::o;10787:419::-;10953:4;10991:2;10980:9;10976:18;10968:26;;11040:9;11034:4;11030:20;11026:1;11015:9;11011:17;11004:47;11068:131;11194:4;11068:131;:::i;:::-;11060:139;;10787:419;;;:::o;11212:182::-;11352:34;11348:1;11340:6;11336:14;11329:58;11212:182;:::o;11400:366::-;11542:3;11563:67;11627:2;11622:3;11563:67;:::i;:::-;11556:74;;11639:93;11728:3;11639:93;:::i;:::-;11757:2;11752:3;11748:12;11741:19;;11400:366;;;:::o;11772:419::-;11938:4;11976:2;11965:9;11961:18;11953:26;;12025:9;12019:4;12015:20;12011:1;12000:9;11996:17;11989:47;12053:131;12179:4;12053:131;:::i;:::-;12045:139;;11772:419;;;:::o;12197:180::-;12245:77;12242:1;12235:88;12342:4;12339:1;12332:15;12366:4;12363:1;12356:15;12383:191;12423:3;12442:20;12460:1;12442:20;:::i;:::-;12437:25;;12476:20;12494:1;12476:20;:::i;:::-;12471:25;;12519:1;12516;12512:9;12505:16;;12540:3;12537:1;12534:10;12531:36;;;12547:18;;:::i;:::-;12531:36;12383:191;;;;:::o;12580:85::-;12625:7;12654:5;12643:16;;12580:85;;;:::o;12671:60::-;12699:3;12720:5;12713:12;;12671:60;;;:::o;12737:158::-;12795:9;12828:61;12846:42;12855:32;12881:5;12855:32;:::i;:::-;12846:42;:::i;:::-;12828:61;:::i;:::-;12815:74;;12737:158;;;:::o;12901:147::-;12996:45;13035:5;12996:45;:::i;:::-;12991:3;12984:58;12901:147;;:::o;13054:490::-;13227:4;13265:2;13254:9;13250:18;13242:26;;13278:79;13354:1;13343:9;13339:17;13330:6;13278:79;:::i;:::-;13367:80;13443:2;13432:9;13428:18;13419:6;13367:80;:::i;:::-;13457;13533:2;13522:9;13518:18;13509:6;13457:80;:::i;:::-;13054:490;;;;;;:::o;13550:239::-;13690:34;13686:1;13678:6;13674:14;13667:58;13759:22;13754:2;13746:6;13742:15;13735:47;13550:239;:::o;13795:366::-;13937:3;13958:67;14022:2;14017:3;13958:67;:::i;:::-;13951:74;;14034:93;14123:3;14034:93;:::i;:::-;14152:2;14147:3;14143:12;14136:19;;13795:366;;;:::o;14167:419::-;14333:4;14371:2;14360:9;14356:18;14348:26;;14420:9;14414:4;14410:20;14406:1;14395:9;14391:17;14384:47;14448:131;14574:4;14448:131;:::i;:::-;14440:139;;14167:419;;;:::o;14592:229::-;14732:34;14728:1;14720:6;14716:14;14709:58;14801:12;14796:2;14788:6;14784:15;14777:37;14592:229;:::o;14827:366::-;14969:3;14990:67;15054:2;15049:3;14990:67;:::i;:::-;14983:74;;15066:93;15155:3;15066:93;:::i;:::-;15184:2;15179:3;15175:12;15168:19;;14827:366;;;:::o;15199:419::-;15365:4;15403:2;15392:9;15388:18;15380:26;;15452:9;15446:4;15442:20;15438:1;15427:9;15423:17;15416:47;15480:131;15606:4;15480:131;:::i;:::-;15472:139;;15199:419;;;:::o;15624:410::-;15664:7;15687:20;15705:1;15687:20;:::i;:::-;15682:25;;15721:20;15739:1;15721:20;:::i;:::-;15716:25;;15776:1;15773;15769:9;15798:30;15816:11;15798:30;:::i;:::-;15787:41;;15977:1;15968:7;15964:15;15961:1;15958:22;15938:1;15931:9;15911:83;15888:139;;16007:18;;:::i;:::-;15888:139;15672:362;15624:410;;;;:::o;16040:180::-;16088:77;16085:1;16078:88;16185:4;16182:1;16175:15;16209:4;16206:1;16199:15;16226:185;16266:1;16283:20;16301:1;16283:20;:::i;:::-;16278:25;;16317:20;16335:1;16317:20;:::i;:::-;16312:25;;16356:1;16346:35;;16361:18;;:::i;:::-;16346:35;16403:1;16400;16396:9;16391:14;;16226:185;;;;:::o;16417:224::-;16557:34;16553:1;16545:6;16541:14;16534:58;16626:7;16621:2;16613:6;16609:15;16602:32;16417:224;:::o;16647:366::-;16789:3;16810:67;16874:2;16869:3;16810:67;:::i;:::-;16803:74;;16886:93;16975:3;16886:93;:::i;:::-;17004:2;16999:3;16995:12;16988:19;;16647:366;;;:::o;17019:419::-;17185:4;17223:2;17212:9;17208:18;17200:26;;17272:9;17266:4;17262:20;17258:1;17247:9;17243:17;17236:47;17300:131;17426:4;17300:131;:::i;:::-;17292:139;;17019:419;;;:::o;17444:244::-;17584:34;17580:1;17572:6;17568:14;17561:58;17653:27;17648:2;17640:6;17636:15;17629:52;17444:244;:::o;17694:366::-;17836:3;17857:67;17921:2;17916:3;17857:67;:::i;:::-;17850:74;;17933:93;18022:3;17933:93;:::i;:::-;18051:2;18046:3;18042:12;18035:19;;17694:366;;;:::o;18066:419::-;18232:4;18270:2;18259:9;18255:18;18247:26;;18319:9;18313:4;18309:20;18305:1;18294:9;18290:17;18283:47;18347:131;18473:4;18347:131;:::i;:::-;18339:139;;18066:419;;;:::o;18491:225::-;18631:34;18627:1;18619:6;18615:14;18608:58;18700:8;18695:2;18687:6;18683:15;18676:33;18491:225;:::o;18722:366::-;18864:3;18885:67;18949:2;18944:3;18885:67;:::i;:::-;18878:74;;18961:93;19050:3;18961:93;:::i;:::-;19079:2;19074:3;19070:12;19063:19;;18722:366;;;:::o;19094:419::-;19260:4;19298:2;19287:9;19283:18;19275:26;;19347:9;19341:4;19337:20;19333:1;19322:9;19318:17;19311:47;19375:131;19501:4;19375:131;:::i;:::-;19367:139;;19094:419;;;:::o;19519:223::-;19659:34;19655:1;19647:6;19643:14;19636:58;19728:6;19723:2;19715:6;19711:15;19704:31;19519:223;:::o;19748:366::-;19890:3;19911:67;19975:2;19970:3;19911:67;:::i;:::-;19904:74;;19987:93;20076:3;19987:93;:::i;:::-;20105:2;20100:3;20096:12;20089:19;;19748:366;;;:::o;20120:419::-;20286:4;20324:2;20313:9;20309:18;20301:26;;20373:9;20367:4;20363:20;20359:1;20348:9;20344:17;20337:47;20401:131;20527:4;20401:131;:::i;:::-;20393:139;;20120:419;;;:::o;20545:221::-;20685:34;20681:1;20673:6;20669:14;20662:58;20754:4;20749:2;20741:6;20737:15;20730:29;20545:221;:::o;20772:366::-;20914:3;20935:67;20999:2;20994:3;20935:67;:::i;:::-;20928:74;;21011:93;21100:3;21011:93;:::i;:::-;21129:2;21124:3;21120:12;21113:19;;20772:366;;;:::o;21144:419::-;21310:4;21348:2;21337:9;21333:18;21325:26;;21397:9;21391:4;21387:20;21383:1;21372:9;21368:17;21361:47;21425:131;21551:4;21425:131;:::i;:::-;21417:139;;21144:419;;;:::o;21569:224::-;21709:34;21705:1;21697:6;21693:14;21686:58;21778:7;21773:2;21765:6;21761:15;21754:32;21569:224;:::o;21799:366::-;21941:3;21962:67;22026:2;22021:3;21962:67;:::i;:::-;21955:74;;22038:93;22127:3;22038:93;:::i;:::-;22156:2;22151:3;22147:12;22140:19;;21799:366;;;:::o;22171:419::-;22337:4;22375:2;22364:9;22360:18;22352:26;;22424:9;22418:4;22414:20;22410:1;22399:9;22395:17;22388:47;22452:131;22578:4;22452:131;:::i;:::-;22444:139;;22171:419;;;:::o;22596:222::-;22736:34;22732:1;22724:6;22720:14;22713:58;22805:5;22800:2;22792:6;22788:15;22781:30;22596:222;:::o;22824:366::-;22966:3;22987:67;23051:2;23046:3;22987:67;:::i;:::-;22980:74;;23063:93;23152:3;23063:93;:::i;:::-;23181:2;23176:3;23172:12;23165:19;;22824:366;;;:::o;23196:419::-;23362:4;23400:2;23389:9;23385:18;23377:26;;23449:9;23443:4;23439:20;23435:1;23424:9;23420:17;23413:47;23477:131;23603:4;23477:131;:::i;:::-;23469:139;;23196:419;;;:::o;23621:221::-;23761:34;23757:1;23749:6;23745:14;23738:58;23830:4;23825:2;23817:6;23813:15;23806:29;23621:221;:::o;23848:366::-;23990:3;24011:67;24075:2;24070:3;24011:67;:::i;:::-;24004:74;;24087:93;24176:3;24087:93;:::i;:::-;24205:2;24200:3;24196:12;24189:19;;23848:366;;;:::o;24220:419::-;24386:4;24424:2;24413:9;24409:18;24401:26;;24473:9;24467:4;24463:20;24459:1;24448:9;24444:17;24437:47;24501:131;24627:4;24501:131;:::i;:::-;24493:139;;24220:419;;;:::o;24645:225::-;24785:34;24781:1;24773:6;24769:14;24762:58;24854:8;24849:2;24841:6;24837:15;24830:33;24645:225;:::o;24876:366::-;25018:3;25039:67;25103:2;25098:3;25039:67;:::i;:::-;25032:74;;25115:93;25204:3;25115:93;:::i;:::-;25233:2;25228:3;25224:12;25217:19;;24876:366;;;:::o;25248:419::-;25414:4;25452:2;25441:9;25437:18;25429:26;;25501:9;25495:4;25491:20;25487:1;25476:9;25472:17;25465:47;25529:131;25655:4;25529:131;:::i;:::-;25521:139;;25248:419;;;:::o;25673:169::-;25813:21;25809:1;25801:6;25797:14;25790:45;25673:169;:::o;25848:366::-;25990:3;26011:67;26075:2;26070:3;26011:67;:::i;:::-;26004:74;;26087:93;26176:3;26087:93;:::i;:::-;26205:2;26200:3;26196:12;26189:19;;25848:366;;;:::o;26220:419::-;26386:4;26424:2;26413:9;26409:18;26401:26;;26473:9;26467:4;26463:20;26459:1;26448:9;26444:17;26437:47;26501:131;26627:4;26501:131;:::i;:::-;26493:139;;26220:419;;;:::o;26645:226::-;26785:34;26781:1;26773:6;26769:14;26762:58;26854:9;26849:2;26841:6;26837:15;26830:34;26645:226;:::o;26877:366::-;27019:3;27040:67;27104:2;27099:3;27040:67;:::i;:::-;27033:74;;27116:93;27205:3;27116:93;:::i;:::-;27234:2;27229:3;27225:12;27218:19;;26877:366;;;:::o;27249:419::-;27415:4;27453:2;27442:9;27438:18;27430:26;;27502:9;27496:4;27492:20;27488:1;27477:9;27473:17;27466:47;27530:131;27656:4;27530:131;:::i;:::-;27522:139;;27249:419;;;:::o;27674:194::-;27714:4;27734:20;27752:1;27734:20;:::i;:::-;27729:25;;27768:20;27786:1;27768:20;:::i;:::-;27763:25;;27812:1;27809;27805:9;27797:17;;27836:1;27830:4;27827:11;27824:37;;;27841:18;;:::i;:::-;27824:37;27674:194;;;;:::o;27874:225::-;28014:34;28010:1;28002:6;27998:14;27991:58;28083:8;28078:2;28070:6;28066:15;28059:33;27874:225;:::o;28105:366::-;28247:3;28268:67;28332:2;28327:3;28268:67;:::i;:::-;28261:74;;28344:93;28433:3;28344:93;:::i;:::-;28462:2;28457:3;28453:12;28446:19;;28105:366;;;:::o;28477:419::-;28643:4;28681:2;28670:9;28666:18;28658:26;;28730:9;28724:4;28720:20;28716:1;28705:9;28701:17;28694:47;28758:131;28884:4;28758:131;:::i;:::-;28750:139;;28477:419;;;:::o;28902:147::-;29003:11;29040:3;29025:18;;28902:147;;;;:::o;29055:114::-;;:::o;29175:398::-;29334:3;29355:83;29436:1;29431:3;29355:83;:::i;:::-;29348:90;;29447:93;29536:3;29447:93;:::i;:::-;29565:1;29560:3;29556:11;29549:18;;29175:398;;;:::o;29579:379::-;29763:3;29785:147;29928:3;29785:147;:::i;:::-;29778:154;;29949:3;29942:10;;29579:379;;;:::o;29964:180::-;30012:77;30009:1;30002:88;30109:4;30106:1;30099:15;30133:4;30130:1;30123:15;30150:180;30198:77;30195:1;30188:88;30295:4;30292:1;30285:15;30319:4;30316:1;30309:15;30336:143;30393:5;30424:6;30418:13;30409:22;;30440:33;30467:5;30440:33;:::i;:::-;30336:143;;;;:::o;30485:351::-;30555:6;30604:2;30592:9;30583:7;30579:23;30575:32;30572:119;;;30610:79;;:::i;:::-;30572:119;30730:1;30755:64;30811:7;30802:6;30791:9;30787:22;30755:64;:::i;:::-;30745:74;;30701:128;30485:351;;;;:::o;30842:114::-;30909:6;30943:5;30937:12;30927:22;;30842:114;;;:::o;30962:184::-;31061:11;31095:6;31090:3;31083:19;31135:4;31130:3;31126:14;31111:29;;30962:184;;;;:::o;31152:132::-;31219:4;31242:3;31234:11;;31272:4;31267:3;31263:14;31255:22;;31152:132;;;:::o;31290:108::-;31367:24;31385:5;31367:24;:::i;:::-;31362:3;31355:37;31290:108;;:::o;31404:179::-;31473:10;31494:46;31536:3;31528:6;31494:46;:::i;:::-;31572:4;31567:3;31563:14;31549:28;;31404:179;;;;:::o;31589:113::-;31659:4;31691;31686:3;31682:14;31674:22;;31589:113;;;:::o;31738:732::-;31857:3;31886:54;31934:5;31886:54;:::i;:::-;31956:86;32035:6;32030:3;31956:86;:::i;:::-;31949:93;;32066:56;32116:5;32066:56;:::i;:::-;32145:7;32176:1;32161:284;32186:6;32183:1;32180:13;32161:284;;;32262:6;32256:13;32289:63;32348:3;32333:13;32289:63;:::i;:::-;32282:70;;32375:60;32428:6;32375:60;:::i;:::-;32365:70;;32221:224;32208:1;32205;32201:9;32196:14;;32161:284;;;32165:14;32461:3;32454:10;;31862:608;;;31738:732;;;;:::o;32476:831::-;32739:4;32777:3;32766:9;32762:19;32754:27;;32791:71;32859:1;32848:9;32844:17;32835:6;32791:71;:::i;:::-;32872:80;32948:2;32937:9;32933:18;32924:6;32872:80;:::i;:::-;32999:9;32993:4;32989:20;32984:2;32973:9;32969:18;32962:48;33027:108;33130:4;33121:6;33027:108;:::i;:::-;33019:116;;33145:72;33213:2;33202:9;33198:18;33189:6;33145:72;:::i;:::-;33227:73;33295:3;33284:9;33280:19;33271:6;33227:73;:::i;:::-;32476:831;;;;;;;;:::o

Swarm Source

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