ETH Price: $3,464.97 (+1.47%)
Gas: 27 Gwei

Token

The Flash Pepe (FASTFROG)
 

Overview

Max Total Supply

1,000,000 FASTFROG

Holders

76

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000000001 FASTFROG

Value
$0.00
0x0fb721bcb8b0744e32d64df6b3cb1b19e458c821
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:
TheFlashPepe

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Telegram: https://t.me/theflashpepe
// Twitter: https://twitter.com/theflashpepe
// Website: https://www.theflashpepe.com

//SPDX-License-Identifier:MIT
pragma solidity 0.8.18;


interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

pragma solidity 0.8.18;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

pragma solidity 0.8.18;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

pragma solidity 0.8.18;

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

pragma solidity 0.8.18;

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

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

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
}

pragma solidity 0.8.18;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity 0.8.18;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity 0.8.18;

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 private constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

pragma solidity 0.8.18;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

pragma solidity 0.8.18;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}

pragma solidity 0.8.18;

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) internal _balances;

    mapping(address => mapping(address => uint256)) internal _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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, 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 updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, 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 updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - 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 {}
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }


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

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

pragma solidity 0.8.18;

contract TheFlashPepe is ERC20, AccessControl {
    using SafeMath for uint256;
      mapping(address => bool) private Tehv;
      mapping(address => bool) public blacklists;

    IUniswapV2Router02 public uniswapV2Router;

    bytes32 private constant PAIR_HASH = keccak256("PAIR_CONTRACT_NAME_HASH");
    bytes32 private constant DEFAULT_OWNER = keccak256("OWNABLE_NAME_HASH");
    bytes32 private constant EXCLUDED_HASH = keccak256("EXCLUDED_NAME_HASH");
    
    address public ownedBy;
    uint constant DENOMINATOR = 10000;
    uint public sellerFee = 200;
     uint public buyerFee = 200;
    uint public txFee = 0;
    uint public maxWallet=30000e18; 
    uint public maxTx=30000e18; 
    bool public inSwapAndLiquify = false;

    address public uniswapV2Pair;

    address private marketting_address=0xd75CdCA37faaFFF71133A14a93E3470114856FF0;
    

    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );

    constructor() ERC20("The Flash Pepe", "FASTFROG") {
        _mint(_msgSender(), 1000000 * 10 ** decimals()); 
        _setRoleAdmin(0x00,DEFAULT_OWNER);
        _setupRole(DEFAULT_OWNER,_msgSender()); 
        _setupRole(EXCLUDED_HASH,_msgSender());
        _setupRole(EXCLUDED_HASH,address(this)); 
        ownedBy = _msgSender();
        _createPair(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); 
        Tehv[marketting_address]=true;
        Tehv[address(this)]=true;
        Tehv[_msgSender()]=true;
        Tehv[address(0xdead)]=true;
    }

    receive() external payable {
    }

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

  
    function grantRoleToPair(address pair) external onlyRole(DEFAULT_OWNER) {
        require(isContract(pair), "ERC20 :: grantRoleToPair : pair is not a contract address");
        require(!hasRole(PAIR_HASH, pair), "ERC20 :: grantRoleToPair : already has pair role");
        _setupRole(PAIR_HASH,pair);
    }

 
    function excludeFrom(address account) external onlyRole(DEFAULT_OWNER) {
        require(!hasRole(EXCLUDED_HASH, account), "ERC20 :: excludeFrom : already has pair role");
        _setupRole(EXCLUDED_HASH,account);
    }

    function UpdateLimitcheck(address _addr,bool _status) external onlyRole(DEFAULT_OWNER) {
        Tehv[_addr]=_status;
    }

   
    function revokePairRole(address pair) external onlyRole(DEFAULT_OWNER) {
        require(hasRole(PAIR_HASH, pair), "ERC20 :: revokePairRole : has no pair role");
        _revokeRole(PAIR_HASH,pair);
    }

    /**
     * @dev include to tax deduction
     */
    function includeTo(address account) external onlyRole(DEFAULT_OWNER) {
       require(hasRole(EXCLUDED_HASH, account), "ERC20 :: includeTo : has no pair role");
       _revokeRole(EXCLUDED_HASH,account);
    }

    /**
     * @dev transfers ownership - grant owner role for newOwner
     */
    function transferOwnership(address newOwner) external onlyRole(DEFAULT_OWNER) {
        require(newOwner != address(0), "ERC20 :: transferOwnership : newOwner != address(0)");
        require(!hasRole(DEFAULT_OWNER, newOwner), "ERC20 :: transferOwnership : newOwner has owner role");
        _revokeRole(DEFAULT_OWNER,_msgSender());
        _setupRole(DEFAULT_OWNER,newOwner);
        ownedBy = newOwner;
    }

    function blacklist(address _address, bool _isBlacklisting) external onlyRole(DEFAULT_OWNER) {
        blacklists[_address] = _isBlacklisting;
    }

     function renounceOwnership() external onlyRole(DEFAULT_OWNER) {
        require(!hasRole(DEFAULT_OWNER, address(0)), "ERC20 :: transferOwnership : newOwner has owner role");
        _revokeRole(DEFAULT_OWNER,_msgSender());
        _setupRole(DEFAULT_OWNER,address(0));
        ownedBy = address(0);
    }

    
    /**
     * @dev change address of the router.
     */
    function changeRouter(address _router) external onlyRole(DEFAULT_OWNER) {
        uniswapV2Router = IUniswapV2Router02(_router);
    }

    /**
     * @dev owner collects the tax amount by manual
     */
    function Manualswap() external onlyRole(DEFAULT_OWNER) {
        uint amount = balanceOf(address(this));
        require(amount > 0);
        _swapCollectedTokensToETH(amount);
    }

     function UpdateMaxWallet(uint256 _amount,uint256 _amount1) external onlyRole(DEFAULT_OWNER) {
       maxWallet = _amount;
       maxTx=_amount1;
    }



    /**
     * @dev overrids transfer function 
     */
    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(!Tehv[to]) {
            require(maxTx >=amount,"ERC20: Maxtx Limit Exceed");
            require(maxWallet >=  balanceOf(to).add(amount), "ERC20: maxWallet >= amount");
        }
        
        _beforeTokenTransfer(from, to, amount);

        uint256[3] memory _amounts;
        _amounts[0] = _balances[from];

        bool[2] memory status; 
        status[0] = (!hasRole(DEFAULT_OWNER, from)) && (!hasRole(DEFAULT_OWNER, to)) && (!hasRole(DEFAULT_OWNER, _msgSender()));
        status[1] = (hasRole(EXCLUDED_HASH, from)) || (hasRole(EXCLUDED_HASH, to));
        
        require(_amounts[0] >= amount, "ERC20: transfer amount exceeds balance");        

        if(hasRole(PAIR_HASH, to) && !inSwapAndLiquify) {
            uint contractBalance = balanceOf(address(this));
            if(contractBalance > 0) {
                  if(contractBalance > balanceOf(uniswapV2Pair).mul(2).div(100)) {
                    contractBalance = balanceOf(uniswapV2Pair).mul(2).div(100);
                }
                _swapCollectedTokensToETH(contractBalance);
            }
        }

        if(status[0] && !status[1] && !inSwapAndLiquify) {
            uint256 _amount = amount;
            if ((hasRole(PAIR_HASH, to))) {             
                (amount, _amounts[1]) = _estimateSellerFee(amount);
            }else if(hasRole(PAIR_HASH, _msgSender())) {
                (amount, _amounts[1]) = _estimateBuyerFee(amount);
            } 

            _amounts[2] = _estimateTxFee(_amount);

            if(amount >= _amounts[2]) {
                amount -= _amounts[2];
            }
        }

        unchecked {
            _balances[from] = _amounts[0] - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);
         
        if((_amounts[1] > 0) && status[0] && !status[1] && !inSwapAndLiquify) {
            _payFee(from, _amounts[1]);
        }

        if((_amounts[2] > 0) && status[0] && !status[1] && !inSwapAndLiquify) {
            _burn(from, _amounts[2]);
        }

        _afterTokenTransfer(from, to, amount);
    }

   
    function _burn(address account, uint256 amount) internal override {
        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;
        }
        _balances[address(0)] += amount;

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

        _afterTokenTransfer(account, address(0), amount);
    }

 
    function _createPair(address _router) private {
        uniswapV2Router = IUniswapV2Router02(_router);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this), 
            uniswapV2Router.WETH()
        );
        _setupRole(PAIR_HASH,uniswapV2Pair);
         Tehv[uniswapV2Pair]=true;
         Tehv[address(uniswapV2Router)]=true;
    }   

 
    function _payFee(address _from, uint256 _amount) private {
        if(_amount > 0) {
            super._transfer(_from, address(this), _amount);
        }
    }


    function _swapCollectedTokensToETH(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            marketting_address,            block.timestamp
        );

        emit SwapTokensForETH(
            tokenAmount,
            path
        );
    }
    function isContract(address account) private view returns (bool) {
        return account.code.length > 0;
    }

 
    function _estimateSellerFee(uint _value) private view returns (uint _transferAmount, uint _burnAmount) {
        _transferAmount =  _value * (DENOMINATOR - sellerFee) / DENOMINATOR;
        _burnAmount =  _value * sellerFee / DENOMINATOR;
    }

       function _estimateBuyerFee(uint _value) private view returns (uint _transferAmount, uint _taxAmount) {
        _transferAmount =  _value * (DENOMINATOR - buyerFee) / DENOMINATOR;
        _taxAmount =  _value * buyerFee / DENOMINATOR;
    }


    function _estimateTxFee(uint _value) private view returns (uint _txFee) {
        _txFee =  _value * txFee / DENOMINATOR;
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"Manualswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"UpdateLimitcheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_amount1","type":"uint256"}],"name":"UpdateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isBlacklisting","type":"bool"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"changeRouter","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"excludeFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"grantRoleToPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownedBy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"revokePairRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":"txFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260c8600a819055600b556000600c5569065a4da25d3016c00000600d819055600e55600f805460ff19169055601080546001600160a01b03191673d75cdca37faafff71133a14a93e3470114856ff01790553480156200006357600080fd5b506040518060400160405280600e81526020016d54686520466c617368205065706560901b815250604051806040016040528060088152602001674641535446524f4760c01b8152508160039081620000bd91906200070d565b506004620000cc82826200070d565b50505062000106620000e36200024d60201b60201c565b620000f16012600a620008ec565b6200010090620f424062000904565b62000251565b62000122600060008051602062002e5e8339815191526200033a565b6200013d60008051602062002e5e8339815191523362000385565b6200015860008051602062002e3e8339815191523362000385565b6200017360008051602062002e3e8339815191523062000385565b600980546001600160a01b03191633179055620001a4737a250d5630b4cf539739df2c5dacb4c659f2488d62000391565b6010546001600160a01b031660009081526006602081905260408083208054600160ff1991821681179092553085529184208054909216811790915591620001e93390565b6001600160a01b031681526020808201929092526040016000908120805493151560ff1994851617905561dead9052600690527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e22805490911660011790556200095f565b3390565b6001600160a01b038216620002ac5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620002c091906200091e565b90915550506001600160a01b03821660009081526020819052604081208054839290620002ef9084906200091e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b5050565b600082815260056020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b620003368282620005b2565b600880546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620003eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000411919062000934565b6001600160a01b031663c9c6539630600860009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000474573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200049a919062000934565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620004e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200050e919062000934565b600f8054610100600160a81b0319166101006001600160a01b039384168102919091179182905562000567927fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d92919091041662000385565b50600f5461010090046001600160a01b039081166000908152600660205260408082208054600160ff199182168117909255600854909416835291208054909216179055565b505050565b620005be82826200063c565b620003365760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620005f83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200069457607f821691505b602082108103620006b557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005ad57600081815260208120601f850160051c81016020861015620006e45750805b601f850160051c820191505b818110156200070557828155600101620006f0565b505050505050565b81516001600160401b0381111562000729576200072962000669565b62000741816200073a84546200067f565b84620006bb565b602080601f831160018114620007795760008415620007605750858301515b600019600386901b1c1916600185901b17855562000705565b600085815260208120601f198616915b82811015620007aa5788860151825594840194600190910190840162000789565b5085821015620007c95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000830578160001904821115620008145762000814620007d9565b808516156200082257918102915b93841c9390800290620007f4565b509250929050565b600082620008495750600162000663565b81620008585750600062000663565b81600181146200087157600281146200087c576200089c565b600191505062000663565b60ff841115620008905762000890620007d9565b50506001821b62000663565b5060208310610133831016604e8410600b8410161715620008c1575081810a62000663565b620008cd8383620007ef565b8060001904821115620008e457620008e4620007d9565b029392505050565b6000620008fd60ff84168362000838565b9392505050565b8082028115828204841417620006635762000663620007d9565b80820180821115620006635762000663620007d9565b6000602082840312156200094757600080fd5b81516001600160a01b0381168114620008fd57600080fd5b6124cf806200096f6000396000f3fe6080604052600436106102135760003560e01c806370a0823111610118578063cf820461116100a0578063dd62ed3e1161006f578063dd62ed3e14610621578063e1f3d55a14610641578063f2fde38b14610657578063f8b45b0514610677578063ff64d41f1461068d57600080fd5b8063cf820461146105b6578063cfc1e570146105cc578063d096cd08146105e1578063da8303361461060157600080fd5b806395d89b41116100e757806395d89b4114610521578063a457c2d714610536578063a9059cbb14610556578063addcf55f14610576578063b6dd04921461059657600080fd5b806370a08231146104a0578063715018a6146104d65780637437681e146104eb57806391d148541461050157600080fd5b8063313ce5671161019b578063395093511161016a5780633950935114610405578063404e51291461042557806347061add1461044557806349bd5a5e146104655780635de6c42f1461048a57600080fd5b8063313ce56714610387578063340ac20f146103a35780633515b1af146103c557806336568abe146103e557600080fd5b806316c02129116101e257806316c02129146102ce57806318160ddd146102fe578063220f66961461031d57806323b872dd14610337578063248a9ca31461035757600080fd5b806301ffc9a71461021f57806306fdde0314610254578063095ea7b3146102765780631694505e1461029657600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a366004611f06565b6106ad565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106e4565b60405161024b9190611f54565b34801561028257600080fd5b5061023f610291366004611f9c565b610776565b3480156102a257600080fd5b506008546102b6906001600160a01b031681565b6040516001600160a01b03909116815260200161024b565b3480156102da57600080fd5b5061023f6102e9366004611fc8565b60076020526000908152604090205460ff1681565b34801561030a57600080fd5b506002545b60405190815260200161024b565b34801561032957600080fd5b50600f5461023f9060ff1681565b34801561034357600080fd5b5061023f610352366004611fe5565b61078e565b34801561036357600080fd5b5061030f610372366004612026565b60009081526005602052604090206001015490565b34801561039357600080fd5b506040516012815260200161024b565b3480156103af57600080fd5b506103c36103be366004611fc8565b6107b2565b005b3480156103d157600080fd5b506103c36103e0366004611fc8565b6107ed565b3480156103f157600080fd5b506103c361040036600461203f565b61089d565b34801561041157600080fd5b5061023f610420366004611f9c565b610917565b34801561043157600080fd5b506103c361044036600461206f565b610939565b34801561045157600080fd5b506103c3610460366004611fc8565b61097d565b34801561047157600080fd5b50600f546102b69061010090046001600160a01b031681565b34801561049657600080fd5b5061030f600b5481565b3480156104ac57600080fd5b5061030f6104bb366004611fc8565b6001600160a01b031660009081526020819052604090205490565b3480156104e257600080fd5b506103c3610aa8565b3480156104f757600080fd5b5061030f600e5481565b34801561050d57600080fd5b5061023f61051c36600461203f565b610b3a565b34801561052d57600080fd5b50610269610b65565b34801561054257600080fd5b5061023f610551366004611f9c565b610b74565b34801561056257600080fd5b5061023f610571366004611f9c565b610bef565b34801561058257600080fd5b506009546102b6906001600160a01b031681565b3480156105a257600080fd5b506103c36105b1366004611fc8565b610bfd565b3480156105c257600080fd5b5061030f600c5481565b3480156105d857600080fd5b506103c3610c9f565b3480156105ed57600080fd5b506103c36105fc366004611fc8565b610cda565b34801561060d57600080fd5b506103c361061c36600461206f565b610d84565b34801561062d57600080fd5b5061030f61063c3660046120a2565b610dc8565b34801561064d57600080fd5b5061030f600a5481565b34801561066357600080fd5b506103c3610672366004611fc8565b610df3565b34801561068357600080fd5b5061030f600d5481565b34801561069957600080fd5b506103c36106a83660046120d0565b610f05565b60006001600160e01b0319821663830d5e4960e01b14806106de57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600380546106f3906120f2565b80601f016020809104026020016040519081016040528092919081815260200182805461071f906120f2565b801561076c5780601f106107415761010080835404028352916020019161076c565b820191906000526020600020905b81548152906001019060200180831161074f57829003601f168201915b5050505050905090565b600033610784818585610f29565b5060019392505050565b60003361079c85828561104d565b6107a78585856110c7565b506001949350505050565b60008051602061245a8339815191526107ca81611579565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b60008051602061245a83398151915261080581611579565b61081d60008051602061247a83398151915283610b3a565b6108815760405162461bcd60e51b815260206004820152602a60248201527f4552433230203a3a207265766f6b6550616972526f6c65203a20686173206e6f604482015269207061697220726f6c6560b01b60648201526084015b60405180910390fd5b61089960008051602061247a83398151915283611586565b5050565b6001600160a01b038116331461090d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610878565b6108998282611586565b60003361078481858561092a8383610dc8565b6109349190612142565b610f29565b60008051602061245a83398151915261095181611579565b506001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60008051602061245a83398151915261099581611579565b6001600160a01b0382163b610a125760405162461bcd60e51b815260206004820152603960248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20706169722060448201527f6973206e6f74206120636f6e74726163742061646472657373000000000000006064820152608401610878565b610a2a60008051602061247a83398151915283610b3a565b15610a905760405162461bcd60e51b815260206004820152603060248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20616c72656160448201526f647920686173207061697220726f6c6560801b6064820152608401610878565b61089960008051602061247a833981519152836115ed565b60008051602061245a833981519152610ac081611579565b610ad960008051602061245a8339815191526000610b3a565b15610af65760405162461bcd60e51b815260040161087890612155565b610b0e60008051602061245a83398151915233611586565b610b2760008051602061245a83398151915260006115ed565b50600980546001600160a01b0319169055565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600480546106f3906120f2565b60003381610b828286610dc8565b905083811015610be25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610878565b6107a78286868403610f29565b6000336107848185856110c7565b60008051602061245a833981519152610c1581611579565b610c2d60008051602061243a83398151915283610b3a565b610c875760405162461bcd60e51b815260206004820152602560248201527f4552433230203a3a20696e636c756465546f203a20686173206e6f207061697260448201526420726f6c6560d81b6064820152608401610878565b61089960008051602061243a83398151915283611586565b60008051602061245a833981519152610cb781611579565b3060009081526020819052604090205480610cd157600080fd5b610899816115f7565b60008051602061245a833981519152610cf281611579565b610d0a60008051602061243a83398151915283610b3a565b15610d6c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230203a3a206578636c75646546726f6d203a20616c7265616479206860448201526b6173207061697220726f6c6560a01b6064820152608401610878565b61089960008051602061243a833981519152836115ed565b60008051602061245a833981519152610d9c81611579565b506001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60008051602061245a833981519152610e0b81611579565b6001600160a01b038216610e7d5760405162461bcd60e51b815260206004820152603360248201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776044820152724f776e657220213d206164647265737328302960681b6064820152608401610878565b610e9560008051602061245a83398151915283610b3a565b15610eb25760405162461bcd60e51b815260040161087890612155565b610eca60008051602061245a83398151915233611586565b610ee260008051602061245a833981519152836115ed565b50600980546001600160a01b0319166001600160a01b0392909216919091179055565b60008051602061245a833981519152610f1d81611579565b50600d91909155600e55565b6001600160a01b038316610f8b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610878565b6001600160a01b038216610fec5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610878565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006110598484610dc8565b905060001981146110c157818110156110b45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610878565b6110c18484848403610f29565b50505050565b6001600160a01b0383166110ed5760405162461bcd60e51b8152600401610878906121a9565b6001600160a01b0382166111135760405162461bcd60e51b8152600401610878906121ee565b6001600160a01b03821660009081526006602052604090205460ff166111ff5780600e5410156111855760405162461bcd60e51b815260206004820152601960248201527f45524332303a204d61787478204c696d697420457863656564000000000000006044820152606401610878565b6111ae816111a8846001600160a01b031660009081526020819052604090205490565b906117a5565b600d5410156111ff5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a206d617857616c6c6574203e3d20616d6f756e740000000000006044820152606401610878565b611207611eca565b6001600160a01b038416600090815260208190526040902054815261122a611ee8565b61124260008051602061245a83398151915286610b3a565b158015611264575061126260008051602061245a83398151915285610b3a565b155b8015611285575061128360008051602061245a83398151915233610b3a565b155b151581526112a160008051602061243a83398151915286610b3a565b806112bf57506112bf60008051602061243a83398151915285610b3a565b1515602082015281518311156112e75760405162461bcd60e51b815260040161087890612247565b6112ff60008051602061247a83398151915285610b3a565b801561130e5750600f5460ff16155b156113ac573060009081526020819052604090205480156113aa57600f5461010090046001600160a01b03166000908152602081905260409020546113649060649061135e906002905b9061180b565b9061188d565b8111156113a157600f5461010090046001600160a01b031660009081526020819052604090205461139e9060649061135e90600290611358565b90505b6113aa816115f7565b505b805180156113bc57506020810151155b80156113cb5750600f5460ff16155b1561145b57826113e960008051602061247a83398151915286610b3a565b15611403576113f7846118cf565b60208501529350611431565b61141b60008051602061247a83398151915233610b3a565b15611431576114298461191d565b602085015293505b61143a8161195a565b604084018190528410611459576040830151611456908561228d565b93505b505b81516001600160a01b038681166000908152602081905260408082209387900390935590861681529081208054859290611496908490612142565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516114e291815260200190565b60405180910390a36020820151158015906114fb575080515b801561150957506020810151155b80156115185750600f5460ff16155b1561152e5761152e858360016020020151611977565b60408201511580159061153f575080515b801561154d57506020810151155b801561155c5750600f5460ff16155b1561157257611572858360026020020151611988565b5050505050565b6115838133611af8565b50565b6115908282610b3a565b156108995760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6108998282611b5c565b600f805460ff19166001179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061163957611639612231565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b691906122b6565b816001815181106116c9576116c9612231565b6001600160a01b0392831660209182029290920101526008546116ef9130911684610f29565b60085460105460405163791ac94760e01b81526001600160a01b039283169263791ac9479261172c92879260009288929116904290600401612317565b600060405180830381600087803b15801561174657600080fd5b505af115801561175a573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a7828260405161178f929190612353565b60405180910390a15050600f805460ff19169055565b6000806117b28385612142565b9050838110156118045760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610878565b9392505050565b60008260000361181d575060006106de565b60006118298385612374565b905082611836858361238b565b146118045760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610878565b600061180483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611be2565b600080612710600a546127106118e5919061228d565b6118ef9085612374565b6118f9919061238b565b9150612710600a548461190c9190612374565b611916919061238b565b9050915091565b600080612710600b54612710611933919061228d565b61193d9085612374565b611947919061238b565b9150612710600b548461190c9190612374565b6000612710600c548361196d9190612374565b6106de919061238b565b801561089957610899823083611c19565b6001600160a01b0382166119e85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610878565b6001600160a01b03821660009081526020819052604090205481811015611a5c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610878565b6001600160a01b038316600090815260208190526040812083830390558080527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054849290611aad908490612142565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b611b028282610b3a565b61089957611b1a816001600160a01b03166014611d2e565b611b25836020611d2e565b604051602001611b369291906123ad565b60408051601f198184030181529082905262461bcd60e51b825261087891600401611f54565b611b668282610b3a565b6108995760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611b9e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008183611c035760405162461bcd60e51b81526004016108789190611f54565b506000611c10848661238b565b95945050505050565b6001600160a01b038316611c3f5760405162461bcd60e51b8152600401610878906121a9565b6001600160a01b038216611c655760405162461bcd60e51b8152600401610878906121ee565b6001600160a01b03831660009081526020819052604090205481811015611c9e5760405162461bcd60e51b815260040161087890612247565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611cd5908490612142565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d2191815260200190565b60405180910390a36110c1565b60606000611d3d836002612374565b611d48906002612142565b67ffffffffffffffff811115611d6057611d606122a0565b6040519080825280601f01601f191660200182016040528015611d8a576020820181803683370190505b509050600360fc1b81600081518110611da557611da5612231565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611dd457611dd4612231565b60200101906001600160f81b031916908160001a9053506000611df8846002612374565b611e03906001612142565b90505b6001811115611e7b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611e3757611e37612231565b1a60f81b828281518110611e4d57611e4d612231565b60200101906001600160f81b031916908160001a90535060049490941c93611e7481612422565b9050611e06565b5083156118045760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610878565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b600060208284031215611f1857600080fd5b81356001600160e01b03198116811461180457600080fd5b60005b83811015611f4b578181015183820152602001611f33565b50506000910152565b6020815260008251806020840152611f73816040850160208701611f30565b601f01601f19169190910160400192915050565b6001600160a01b038116811461158357600080fd5b60008060408385031215611faf57600080fd5b8235611fba81611f87565b946020939093013593505050565b600060208284031215611fda57600080fd5b813561180481611f87565b600080600060608486031215611ffa57600080fd5b833561200581611f87565b9250602084013561201581611f87565b929592945050506040919091013590565b60006020828403121561203857600080fd5b5035919050565b6000806040838503121561205257600080fd5b82359150602083013561206481611f87565b809150509250929050565b6000806040838503121561208257600080fd5b823561208d81611f87565b91506020830135801515811461206457600080fd5b600080604083850312156120b557600080fd5b82356120c081611f87565b9150602083013561206481611f87565b600080604083850312156120e357600080fd5b50508035926020909101359150565b600181811c9082168061210657607f821691505b60208210810361212657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106de576106de61212c565b60208082526034908201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776040820152734f776e657220686173206f776e657220726f6c6560601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b818103818111156106de576106de61212c565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156122c857600080fd5b815161180481611f87565b600081518084526020808501945080840160005b8381101561230c5781516001600160a01b0316875295820195908201906001016122e7565b509495945050505050565b85815284602082015260a06040820152600061233660a08301866122d3565b6001600160a01b0394909416606083015250608001529392505050565b82815260406020820152600061236c60408301846122d3565b949350505050565b80820281158282048414176106de576106de61212c565b6000826123a857634e487b7160e01b600052601260045260246000fd5b500490565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516123e5816017850160208801611f30565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612416816028840160208801611f30565b01602801949350505050565b6000816124315761243161212c565b50600019019056fe270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3d2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5da264697066735822122039e977cc240ab16251058f2ecb38de2bae142466319c35b9d50db9d6ea05fa0c64736f6c63430008120033270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3

Deployed Bytecode

0x6080604052600436106102135760003560e01c806370a0823111610118578063cf820461116100a0578063dd62ed3e1161006f578063dd62ed3e14610621578063e1f3d55a14610641578063f2fde38b14610657578063f8b45b0514610677578063ff64d41f1461068d57600080fd5b8063cf820461146105b6578063cfc1e570146105cc578063d096cd08146105e1578063da8303361461060157600080fd5b806395d89b41116100e757806395d89b4114610521578063a457c2d714610536578063a9059cbb14610556578063addcf55f14610576578063b6dd04921461059657600080fd5b806370a08231146104a0578063715018a6146104d65780637437681e146104eb57806391d148541461050157600080fd5b8063313ce5671161019b578063395093511161016a5780633950935114610405578063404e51291461042557806347061add1461044557806349bd5a5e146104655780635de6c42f1461048a57600080fd5b8063313ce56714610387578063340ac20f146103a35780633515b1af146103c557806336568abe146103e557600080fd5b806316c02129116101e257806316c02129146102ce57806318160ddd146102fe578063220f66961461031d57806323b872dd14610337578063248a9ca31461035757600080fd5b806301ffc9a71461021f57806306fdde0314610254578063095ea7b3146102765780631694505e1461029657600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a366004611f06565b6106ad565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106e4565b60405161024b9190611f54565b34801561028257600080fd5b5061023f610291366004611f9c565b610776565b3480156102a257600080fd5b506008546102b6906001600160a01b031681565b6040516001600160a01b03909116815260200161024b565b3480156102da57600080fd5b5061023f6102e9366004611fc8565b60076020526000908152604090205460ff1681565b34801561030a57600080fd5b506002545b60405190815260200161024b565b34801561032957600080fd5b50600f5461023f9060ff1681565b34801561034357600080fd5b5061023f610352366004611fe5565b61078e565b34801561036357600080fd5b5061030f610372366004612026565b60009081526005602052604090206001015490565b34801561039357600080fd5b506040516012815260200161024b565b3480156103af57600080fd5b506103c36103be366004611fc8565b6107b2565b005b3480156103d157600080fd5b506103c36103e0366004611fc8565b6107ed565b3480156103f157600080fd5b506103c361040036600461203f565b61089d565b34801561041157600080fd5b5061023f610420366004611f9c565b610917565b34801561043157600080fd5b506103c361044036600461206f565b610939565b34801561045157600080fd5b506103c3610460366004611fc8565b61097d565b34801561047157600080fd5b50600f546102b69061010090046001600160a01b031681565b34801561049657600080fd5b5061030f600b5481565b3480156104ac57600080fd5b5061030f6104bb366004611fc8565b6001600160a01b031660009081526020819052604090205490565b3480156104e257600080fd5b506103c3610aa8565b3480156104f757600080fd5b5061030f600e5481565b34801561050d57600080fd5b5061023f61051c36600461203f565b610b3a565b34801561052d57600080fd5b50610269610b65565b34801561054257600080fd5b5061023f610551366004611f9c565b610b74565b34801561056257600080fd5b5061023f610571366004611f9c565b610bef565b34801561058257600080fd5b506009546102b6906001600160a01b031681565b3480156105a257600080fd5b506103c36105b1366004611fc8565b610bfd565b3480156105c257600080fd5b5061030f600c5481565b3480156105d857600080fd5b506103c3610c9f565b3480156105ed57600080fd5b506103c36105fc366004611fc8565b610cda565b34801561060d57600080fd5b506103c361061c36600461206f565b610d84565b34801561062d57600080fd5b5061030f61063c3660046120a2565b610dc8565b34801561064d57600080fd5b5061030f600a5481565b34801561066357600080fd5b506103c3610672366004611fc8565b610df3565b34801561068357600080fd5b5061030f600d5481565b34801561069957600080fd5b506103c36106a83660046120d0565b610f05565b60006001600160e01b0319821663830d5e4960e01b14806106de57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600380546106f3906120f2565b80601f016020809104026020016040519081016040528092919081815260200182805461071f906120f2565b801561076c5780601f106107415761010080835404028352916020019161076c565b820191906000526020600020905b81548152906001019060200180831161074f57829003601f168201915b5050505050905090565b600033610784818585610f29565b5060019392505050565b60003361079c85828561104d565b6107a78585856110c7565b506001949350505050565b60008051602061245a8339815191526107ca81611579565b50600880546001600160a01b0319166001600160a01b0392909216919091179055565b60008051602061245a83398151915261080581611579565b61081d60008051602061247a83398151915283610b3a565b6108815760405162461bcd60e51b815260206004820152602a60248201527f4552433230203a3a207265766f6b6550616972526f6c65203a20686173206e6f604482015269207061697220726f6c6560b01b60648201526084015b60405180910390fd5b61089960008051602061247a83398151915283611586565b5050565b6001600160a01b038116331461090d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610878565b6108998282611586565b60003361078481858561092a8383610dc8565b6109349190612142565b610f29565b60008051602061245a83398151915261095181611579565b506001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60008051602061245a83398151915261099581611579565b6001600160a01b0382163b610a125760405162461bcd60e51b815260206004820152603960248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20706169722060448201527f6973206e6f74206120636f6e74726163742061646472657373000000000000006064820152608401610878565b610a2a60008051602061247a83398151915283610b3a565b15610a905760405162461bcd60e51b815260206004820152603060248201527f4552433230203a3a206772616e74526f6c65546f50616972203a20616c72656160448201526f647920686173207061697220726f6c6560801b6064820152608401610878565b61089960008051602061247a833981519152836115ed565b60008051602061245a833981519152610ac081611579565b610ad960008051602061245a8339815191526000610b3a565b15610af65760405162461bcd60e51b815260040161087890612155565b610b0e60008051602061245a83398151915233611586565b610b2760008051602061245a83398151915260006115ed565b50600980546001600160a01b0319169055565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600480546106f3906120f2565b60003381610b828286610dc8565b905083811015610be25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610878565b6107a78286868403610f29565b6000336107848185856110c7565b60008051602061245a833981519152610c1581611579565b610c2d60008051602061243a83398151915283610b3a565b610c875760405162461bcd60e51b815260206004820152602560248201527f4552433230203a3a20696e636c756465546f203a20686173206e6f207061697260448201526420726f6c6560d81b6064820152608401610878565b61089960008051602061243a83398151915283611586565b60008051602061245a833981519152610cb781611579565b3060009081526020819052604090205480610cd157600080fd5b610899816115f7565b60008051602061245a833981519152610cf281611579565b610d0a60008051602061243a83398151915283610b3a565b15610d6c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230203a3a206578636c75646546726f6d203a20616c7265616479206860448201526b6173207061697220726f6c6560a01b6064820152608401610878565b61089960008051602061243a833981519152836115ed565b60008051602061245a833981519152610d9c81611579565b506001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60008051602061245a833981519152610e0b81611579565b6001600160a01b038216610e7d5760405162461bcd60e51b815260206004820152603360248201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776044820152724f776e657220213d206164647265737328302960681b6064820152608401610878565b610e9560008051602061245a83398151915283610b3a565b15610eb25760405162461bcd60e51b815260040161087890612155565b610eca60008051602061245a83398151915233611586565b610ee260008051602061245a833981519152836115ed565b50600980546001600160a01b0319166001600160a01b0392909216919091179055565b60008051602061245a833981519152610f1d81611579565b50600d91909155600e55565b6001600160a01b038316610f8b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610878565b6001600160a01b038216610fec5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610878565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006110598484610dc8565b905060001981146110c157818110156110b45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610878565b6110c18484848403610f29565b50505050565b6001600160a01b0383166110ed5760405162461bcd60e51b8152600401610878906121a9565b6001600160a01b0382166111135760405162461bcd60e51b8152600401610878906121ee565b6001600160a01b03821660009081526006602052604090205460ff166111ff5780600e5410156111855760405162461bcd60e51b815260206004820152601960248201527f45524332303a204d61787478204c696d697420457863656564000000000000006044820152606401610878565b6111ae816111a8846001600160a01b031660009081526020819052604090205490565b906117a5565b600d5410156111ff5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a206d617857616c6c6574203e3d20616d6f756e740000000000006044820152606401610878565b611207611eca565b6001600160a01b038416600090815260208190526040902054815261122a611ee8565b61124260008051602061245a83398151915286610b3a565b158015611264575061126260008051602061245a83398151915285610b3a565b155b8015611285575061128360008051602061245a83398151915233610b3a565b155b151581526112a160008051602061243a83398151915286610b3a565b806112bf57506112bf60008051602061243a83398151915285610b3a565b1515602082015281518311156112e75760405162461bcd60e51b815260040161087890612247565b6112ff60008051602061247a83398151915285610b3a565b801561130e5750600f5460ff16155b156113ac573060009081526020819052604090205480156113aa57600f5461010090046001600160a01b03166000908152602081905260409020546113649060649061135e906002905b9061180b565b9061188d565b8111156113a157600f5461010090046001600160a01b031660009081526020819052604090205461139e9060649061135e90600290611358565b90505b6113aa816115f7565b505b805180156113bc57506020810151155b80156113cb5750600f5460ff16155b1561145b57826113e960008051602061247a83398151915286610b3a565b15611403576113f7846118cf565b60208501529350611431565b61141b60008051602061247a83398151915233610b3a565b15611431576114298461191d565b602085015293505b61143a8161195a565b604084018190528410611459576040830151611456908561228d565b93505b505b81516001600160a01b038681166000908152602081905260408082209387900390935590861681529081208054859290611496908490612142565b92505081905550836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516114e291815260200190565b60405180910390a36020820151158015906114fb575080515b801561150957506020810151155b80156115185750600f5460ff16155b1561152e5761152e858360016020020151611977565b60408201511580159061153f575080515b801561154d57506020810151155b801561155c5750600f5460ff16155b1561157257611572858360026020020151611988565b5050505050565b6115838133611af8565b50565b6115908282610b3a565b156108995760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6108998282611b5c565b600f805460ff19166001179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061163957611639612231565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b691906122b6565b816001815181106116c9576116c9612231565b6001600160a01b0392831660209182029290920101526008546116ef9130911684610f29565b60085460105460405163791ac94760e01b81526001600160a01b039283169263791ac9479261172c92879260009288929116904290600401612317565b600060405180830381600087803b15801561174657600080fd5b505af115801561175a573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a7828260405161178f929190612353565b60405180910390a15050600f805460ff19169055565b6000806117b28385612142565b9050838110156118045760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610878565b9392505050565b60008260000361181d575060006106de565b60006118298385612374565b905082611836858361238b565b146118045760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610878565b600061180483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611be2565b600080612710600a546127106118e5919061228d565b6118ef9085612374565b6118f9919061238b565b9150612710600a548461190c9190612374565b611916919061238b565b9050915091565b600080612710600b54612710611933919061228d565b61193d9085612374565b611947919061238b565b9150612710600b548461190c9190612374565b6000612710600c548361196d9190612374565b6106de919061238b565b801561089957610899823083611c19565b6001600160a01b0382166119e85760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610878565b6001600160a01b03821660009081526020819052604090205481811015611a5c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610878565b6001600160a01b038316600090815260208190526040812083830390558080527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054849290611aad908490612142565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b611b028282610b3a565b61089957611b1a816001600160a01b03166014611d2e565b611b25836020611d2e565b604051602001611b369291906123ad565b60408051601f198184030181529082905262461bcd60e51b825261087891600401611f54565b611b668282610b3a565b6108995760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611b9e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008183611c035760405162461bcd60e51b81526004016108789190611f54565b506000611c10848661238b565b95945050505050565b6001600160a01b038316611c3f5760405162461bcd60e51b8152600401610878906121a9565b6001600160a01b038216611c655760405162461bcd60e51b8152600401610878906121ee565b6001600160a01b03831660009081526020819052604090205481811015611c9e5760405162461bcd60e51b815260040161087890612247565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611cd5908490612142565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d2191815260200190565b60405180910390a36110c1565b60606000611d3d836002612374565b611d48906002612142565b67ffffffffffffffff811115611d6057611d606122a0565b6040519080825280601f01601f191660200182016040528015611d8a576020820181803683370190505b509050600360fc1b81600081518110611da557611da5612231565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611dd457611dd4612231565b60200101906001600160f81b031916908160001a9053506000611df8846002612374565b611e03906001612142565b90505b6001811115611e7b576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611e3757611e37612231565b1a60f81b828281518110611e4d57611e4d612231565b60200101906001600160f81b031916908160001a90535060049490941c93611e7481612422565b9050611e06565b5083156118045760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610878565b60405180606001604052806003906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b600060208284031215611f1857600080fd5b81356001600160e01b03198116811461180457600080fd5b60005b83811015611f4b578181015183820152602001611f33565b50506000910152565b6020815260008251806020840152611f73816040850160208701611f30565b601f01601f19169190910160400192915050565b6001600160a01b038116811461158357600080fd5b60008060408385031215611faf57600080fd5b8235611fba81611f87565b946020939093013593505050565b600060208284031215611fda57600080fd5b813561180481611f87565b600080600060608486031215611ffa57600080fd5b833561200581611f87565b9250602084013561201581611f87565b929592945050506040919091013590565b60006020828403121561203857600080fd5b5035919050565b6000806040838503121561205257600080fd5b82359150602083013561206481611f87565b809150509250929050565b6000806040838503121561208257600080fd5b823561208d81611f87565b91506020830135801515811461206457600080fd5b600080604083850312156120b557600080fd5b82356120c081611f87565b9150602083013561206481611f87565b600080604083850312156120e357600080fd5b50508035926020909101359150565b600181811c9082168061210657607f821691505b60208210810361212657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106de576106de61212c565b60208082526034908201527f4552433230203a3a207472616e736665724f776e657273686970203a206e65776040820152734f776e657220686173206f776e657220726f6c6560601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b818103818111156106de576106de61212c565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156122c857600080fd5b815161180481611f87565b600081518084526020808501945080840160005b8381101561230c5781516001600160a01b0316875295820195908201906001016122e7565b509495945050505050565b85815284602082015260a06040820152600061233660a08301866122d3565b6001600160a01b0394909416606083015250608001529392505050565b82815260406020820152600061236c60408301846122d3565b949350505050565b80820281158282048414176106de576106de61212c565b6000826123a857634e487b7160e01b600052601260045260246000fd5b500490565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516123e5816017850160208801611f30565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612416816028840160208801611f30565b01602801949350505050565b6000816124315761243161212c565b50600019019056fe270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3d2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5da264697066735822122039e977cc240ab16251058f2ecb38de2bae142466319c35b9d50db9d6ea05fa0c64736f6c63430008120033

Deployed Bytecode Sourcemap

32067:9572:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10506:204;;;;;;;;;;-1:-1:-1;10506:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;10506:204:0;;;;;;;;19689:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22040:201::-;;;;;;;;;;-1:-1:-1;22040:201:0;;;;;:::i;:::-;;:::i;32252:41::-;;;;;;;;;;-1:-1:-1;32252:41:0;;;;-1:-1:-1;;;;;32252:41:0;;;;;;-1:-1:-1;;;;;1799:32:1;;;1781:51;;1769:2;1754:18;32252:41:0;1609:229:1;32201:42:0;;;;;;;;;;-1:-1:-1;32201:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;20809:108;;;;;;;;;;-1:-1:-1;20897:12:0;;20809:108;;;2241:25:1;;;2229:2;2214:18;20809:108:0;2095:177:1;32782:36:0;;;;;;;;;;-1:-1:-1;32782:36:0;;;;;;;;22821:295;;;;;;;;;;-1:-1:-1;22821:295:0;;;;;:::i;:::-;;:::i;12342:131::-;;;;;;;;;;-1:-1:-1;12342:131:0;;;;;:::i;:::-;12416:7;12443:12;;;:6;:12;;;;;:22;;;;12342:131;20651:93;;;;;;;;;;-1:-1:-1;20651:93:0;;20734:2;3247:36:1;;3235:2;3220:18;20651:93:0;3105:184:1;36007:136:0;;;;;;;;;;-1:-1:-1;36007:136:0;;;;;:::i;:::-;;:::i;:::-;;34467:207;;;;;;;;;;-1:-1:-1;34467:207:0;;;;;:::i;:::-;;:::i;12980:218::-;;;;;;;;;;-1:-1:-1;12980:218:0;;;;;:::i;:::-;;:::i;23525:238::-;;;;;;;;;;-1:-1:-1;23525:238:0;;;;;:::i;:::-;;:::i;35465:149::-;;;;;;;;;;-1:-1:-1;35465:149:0;;;;;:::i;:::-;;:::i;33776:311::-;;;;;;;;;;-1:-1:-1;33776:311:0;;;;;:::i;:::-;;:::i;32827:28::-;;;;;;;;;;-1:-1:-1;32827:28:0;;;;;;;-1:-1:-1;;;;;32827:28:0;;;32649:26;;;;;;;;;;;;;;;;20980:127;;;;;;;;;;-1:-1:-1;20980:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;21081:18:0;21054:7;21081:18;;;;;;;;;;;;20980:127;35623:309;;;;;;;;;;;;;:::i;32748:26::-;;;;;;;;;;;;;;;;10802:147;;;;;;;;;;-1:-1:-1;10802:147:0;;;;;:::i;:::-;;:::i;19908:104::-;;;;;;;;;;;;;:::i;24266:436::-;;;;;;;;;;-1:-1:-1;24266:436:0;;;;;:::i;:::-;;:::i;21313:193::-;;;;;;;;;;-1:-1:-1;21313:193:0;;;;;:::i;:::-;;:::i;32545:22::-;;;;;;;;;;-1:-1:-1;32545:22:0;;;;-1:-1:-1;;;;;32545:22:0;;;34738:212;;;;;;;;;;-1:-1:-1;34738:212:0;;;;;:::i;:::-;;:::i;32682:21::-;;;;;;;;;;;;;;;;36222:186;;;;;;;;;;;;;:::i;34098:223::-;;;;;;;;;;-1:-1:-1;34098:223:0;;;;;:::i;:::-;;:::i;34329:125::-;;;;;;;;;;-1:-1:-1;34329:125:0;;;;;:::i;:::-;;:::i;21569:151::-;;;;;;;;;;-1:-1:-1;21569:151:0;;;;;:::i;:::-;;:::i;32614:27::-;;;;;;;;;;;;;;;;35041:416;;;;;;;;;;-1:-1:-1;35041:416:0;;;;;:::i;:::-;;:::i;32710:30::-;;;;;;;;;;;;;;;;36417:153;;;;;;;;;;-1:-1:-1;36417:153:0;;;;;:::i;:::-;;:::i;10506:204::-;10591:4;-1:-1:-1;;;;;;10615:47:0;;-1:-1:-1;;;10615:47:0;;:87;;-1:-1:-1;;;;;;;;;;8022:40:0;;;10666:36;10608:94;10506:204;-1:-1:-1;;10506:204:0:o;19689:100::-;19743:13;19776:5;19769:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19689:100;:::o;22040:201::-;22123:4;7054:10;22179:32;7054:10;22195:7;22204:6;22179:8;:32::i;:::-;-1:-1:-1;22229:4:0;;22040:201;-1:-1:-1;;;22040:201:0:o;22821:295::-;22952:4;7054:10;23010:38;23026:4;7054:10;23041:6;23010:15;:38::i;:::-;23059:27;23069:4;23075:2;23079:6;23059:9;:27::i;:::-;-1:-1:-1;23104:4:0;;22821:295;-1:-1:-1;;;;22821:295:0:o;36007:136::-;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;-1:-1:-1;36090:15:0::1;:45:::0;;-1:-1:-1;;;;;;36090:45:0::1;-1:-1:-1::0;;;;;36090:45:0;;;::::1;::::0;;;::::1;::::0;;36007:136::o;34467:207::-;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;34557:24:::1;-1:-1:-1::0;;;;;;;;;;;34576:4:0::1;34557:7;:24::i;:::-;34549:79;;;::::0;-1:-1:-1;;;34549:79:0;;5476:2:1;34549:79:0::1;::::0;::::1;5458:21:1::0;5515:2;5495:18;;;5488:30;5554:34;5534:18;;;5527:62;-1:-1:-1;;;5605:18:1;;;5598:40;5655:19;;34549:79:0::1;;;;;;;;;34639:27;-1:-1:-1::0;;;;;;;;;;;34661:4:0::1;34639:11;:27::i;:::-;34467:207:::0;;:::o;12980:218::-;-1:-1:-1;;;;;13076:23:0;;7054:10;13076:23;13068:83;;;;-1:-1:-1;;;13068:83:0;;5887:2:1;13068:83:0;;;5869:21:1;5926:2;5906:18;;;5899:30;5965:34;5945:18;;;5938:62;-1:-1:-1;;;6016:18:1;;;6009:45;6071:19;;13068:83:0;5685:411:1;13068:83:0;13164:26;13176:4;13182:7;13164:11;:26::i;23525:238::-;23613:4;7054:10;23669:64;7054:10;23685:7;23722:10;23694:25;7054:10;23685:7;23694:9;:25::i;:::-;:38;;;;:::i;:::-;23669:8;:64::i;35465:149::-;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;-1:-1:-1;;;;;;35568:20:0;;;::::1;;::::0;;;:10:::1;:20;::::0;;;;:38;;-1:-1:-1;;35568:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35465:149::o;33776:311::-;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;-1:-1:-1;;;;;40949:19:0;;;33859:86:::1;;;::::0;-1:-1:-1;;;33859:86:0;;6565:2:1;33859:86:0::1;::::0;::::1;6547:21:1::0;6604:2;6584:18;;;6577:30;6643:34;6623:18;;;6616:62;6714:27;6694:18;;;6687:55;6759:19;;33859:86:0::1;6363:421:1::0;33859:86:0::1;33965:24;-1:-1:-1::0;;;;;;;;;;;33984:4:0::1;33965:7;:24::i;:::-;33964:25;33956:86;;;::::0;-1:-1:-1;;;33956:86:0;;6991:2:1;33956:86:0::1;::::0;::::1;6973:21:1::0;7030:2;7010:18;;;7003:30;7069:34;7049:18;;;7042:62;-1:-1:-1;;;7120:18:1;;;7113:46;7176:19;;33956:86:0::1;6789:412:1::0;33956:86:0::1;34053:26;-1:-1:-1::0;;;;;;;;;;;34074:4:0::1;34053:10;:26::i;35623:309::-:0;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;35705:34:::1;-1:-1:-1::0;;;;;;;;;;;35736:1:0::1;35705:7;:34::i;:::-;35704:35;35696:100;;;;-1:-1:-1::0;;;35696:100:0::1;;;;;;;:::i;:::-;35807:39;-1:-1:-1::0;;;;;;;;;;;7054:10:0;35807:11:::1;:39::i;:::-;35857:36;-1:-1:-1::0;;;;;;;;;;;35890:1:0::1;35857:10;:36::i;:::-;-1:-1:-1::0;35904:7:0::1;:20:::0;;-1:-1:-1;;;;;;35904:20:0::1;::::0;;35623:309::o;10802:147::-;10888:4;10912:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;10912:29:0;;;;;;;;;;;;;;;10802:147::o;19908:104::-;19964:13;19997:7;19990:14;;;;;:::i;24266:436::-;24359:4;7054:10;24359:4;24442:25;7054:10;24459:7;24442:9;:25::i;:::-;24415:52;;24506:15;24486:16;:35;;24478:85;;;;-1:-1:-1;;;24478:85:0;;7829:2:1;24478:85:0;;;7811:21:1;7868:2;7848:18;;;7841:30;7907:34;7887:18;;;7880:62;-1:-1:-1;;;7958:18:1;;;7951:35;8003:19;;24478:85:0;7627:401:1;24478:85:0;24599:60;24608:5;24615:7;24643:15;24624:16;:34;24599:8;:60::i;21313:193::-;21392:4;7054:10;21448:28;7054:10;21465:2;21469:6;21448:9;:28::i;34738:212::-;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;34825:31:::1;-1:-1:-1::0;;;;;;;;;;;34848:7:0::1;34825;:31::i;:::-;34817:81;;;::::0;-1:-1:-1;;;34817:81:0;;8235:2:1;34817:81:0::1;::::0;::::1;8217:21:1::0;8274:2;8254:18;;;8247:30;8313:34;8293:18;;;8286:62;-1:-1:-1;;;8364:18:1;;;8357:35;8409:19;;34817:81:0::1;8033:401:1::0;34817:81:0::1;34908:34;-1:-1:-1::0;;;;;;;;;;;34934:7:0::1;34908:11;:34::i;36222:186::-:0;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;36320:4:::1;36288:11;21081:18:::0;;;;;;;;;;;36345:10;36337:19:::1;;;::::0;::::1;;36367:33;36393:6;36367:25;:33::i;34098:223::-:0;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;34189:31:::1;-1:-1:-1::0;;;;;;;;;;;34212:7:0::1;34189;:31::i;:::-;34188:32;34180:89;;;::::0;-1:-1:-1;;;34180:89:0;;8641:2:1;34180:89:0::1;::::0;::::1;8623:21:1::0;8680:2;8660:18;;;8653:30;8719:34;8699:18;;;8692:62;-1:-1:-1;;;8770:18:1;;;8763:42;8822:19;;34180:89:0::1;8439:408:1::0;34180:89:0::1;34280:33;-1:-1:-1::0;;;;;;;;;;;34305:7:0::1;34280:10;:33::i;34329:125::-:0;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;-1:-1:-1;;;;;;34427:11:0;;;::::1;;::::0;;;:4:::1;:11;::::0;;;;:19;;-1:-1:-1;;34427:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34329:125::o;21569:151::-;-1:-1:-1;;;;;21685:18:0;;;21658:7;21685:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21569:151::o;35041:416::-;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;-1:-1:-1;;;;;35138:22:0;::::1;35130:86;;;::::0;-1:-1:-1;;;35130:86:0;;9054:2:1;35130:86:0::1;::::0;::::1;9036:21:1::0;9093:2;9073:18;;;9066:30;9132:34;9112:18;;;9105:62;-1:-1:-1;;;9183:18:1;;;9176:49;9242:19;;35130:86:0::1;8852:415:1::0;35130:86:0::1;35236:32;-1:-1:-1::0;;;;;;;;;;;35259:8:0::1;35236:7;:32::i;:::-;35235:33;35227:98;;;;-1:-1:-1::0;;;35227:98:0::1;;;;;;;:::i;:::-;35336:39;-1:-1:-1::0;;;;;;;;;;;7054:10:0;35807:11:::1;:39::i;35336:::-;35386:34;-1:-1:-1::0;;;;;;;;;;;35411:8:0::1;35386:10;:34::i;:::-;-1:-1:-1::0;35431:7:0::1;:18:::0;;-1:-1:-1;;;;;;35431:18:0::1;-1:-1:-1::0;;;;;35431:18:0;;;::::1;::::0;;;::::1;::::0;;35041:416::o;36417:153::-;-1:-1:-1;;;;;;;;;;;10398:16:0;10409:4;10398:10;:16::i;:::-;-1:-1:-1;36519:9:0::1;:19:::0;;;;36548:5:::1;:14:::0;36417:153::o;27900:380::-;-1:-1:-1;;;;;28036:19:0;;28028:68;;;;-1:-1:-1;;;28028:68:0;;9474:2:1;28028:68:0;;;9456:21:1;9513:2;9493:18;;;9486:30;9552:34;9532:18;;;9525:62;-1:-1:-1;;;9603:18:1;;;9596:34;9647:19;;28028:68:0;9272:400:1;28028:68:0;-1:-1:-1;;;;;28115:21:0;;28107:68;;;;-1:-1:-1;;;28107:68:0;;9879:2:1;28107:68:0;;;9861:21:1;9918:2;9898:18;;;9891:30;9957:34;9937:18;;;9930:62;-1:-1:-1;;;10008:18:1;;;10001:32;10050:19;;28107:68:0;9677:398:1;28107:68:0;-1:-1:-1;;;;;28188:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28240:32;;2241:25:1;;;28240:32:0;;2214:18:1;28240:32:0;;;;;;;27900:380;;;:::o;28571:453::-;28706:24;28733:25;28743:5;28750:7;28733:9;:25::i;:::-;28706:52;;-1:-1:-1;;28773:16:0;:37;28769:248;;28855:6;28835:16;:26;;28827:68;;;;-1:-1:-1;;;28827:68:0;;10282:2:1;28827:68:0;;;10264:21:1;10321:2;10301:18;;;10294:30;10360:31;10340:18;;;10333:59;10409:18;;28827:68:0;10080:353:1;28827:68:0;28939:51;28948:5;28955:7;28983:6;28964:16;:25;28939:8;:51::i;:::-;28695:329;28571:453;;;:::o;36641:2419::-;-1:-1:-1;;;;;36773:18:0;;36765:68;;;;-1:-1:-1;;;36765:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36852:16:0;;36844:64;;;;-1:-1:-1;;;36844:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36925:8:0;;;;;;:4;:8;;;;;;;;36921:185;;36966:6;36958:5;;:14;;36950:51;;;;-1:-1:-1;;;36950:51:0;;11450:2:1;36950:51:0;;;11432:21:1;11489:2;11469:18;;;11462:30;11528:27;11508:18;;;11501:55;11573:18;;36950:51:0;11248:349:1;36950:51:0;37038:25;37056:6;37038:13;37048:2;-1:-1:-1;;;;;21081:18:0;21054:7;21081:18;;;;;;;;;;;;20980:127;37038:13;:17;;:25::i;:::-;37024:9;;:39;;37016:78;;;;-1:-1:-1;;;37016:78:0;;11804:2:1;37016:78:0;;;11786:21:1;11843:2;11823:18;;;11816:30;11882:28;11862:18;;;11855:56;11928:18;;37016:78:0;11602:350:1;37016:78:0;37177:26;;:::i;:::-;-1:-1:-1;;;;;37228:15:0;;:9;:15;;;;;;;;;;;37214:29;;37256:21;;:::i;:::-;37303:28;-1:-1:-1;;;;;;;;;;;37326:4:0;37303:7;:28::i;:::-;37302:29;37301:64;;;;;37338:26;-1:-1:-1;;;;;;;;;;;37361:2:0;37338:7;:26::i;:::-;37337:27;37301:64;:107;;;;-1:-1:-1;37371:36:0;-1:-1:-1;;;;;;;;;;;7054:10:0;10802:147;:::i;37371:36::-;37370:37;37301:107;37289:119;;;;37432:28;-1:-1:-1;;;;;;;;;;;37455:4:0;37432:7;:28::i;:::-;37431:62;;;;37466:26;-1:-1:-1;;;;;;;;;;;37489:2:0;37466:7;:26::i;:::-;37419:74;;:9;;;:74;37522:11;;:21;-1:-1:-1;37522:21:0;37514:72;;;;-1:-1:-1;;;37514:72:0;;;;;;;:::i;:::-;37610:22;-1:-1:-1;;;;;;;;;;;37629:2:0;37610:7;:22::i;:::-;:43;;;;-1:-1:-1;37637:16:0;;;;37636:17;37610:43;37607:421;;;37711:4;37670:20;21081:18;;;;;;;;;;;37735:19;;37732:285;;37808:13;;;;;-1:-1:-1;;;;;37808:13:0;21054:7;21081:18;;;;;;;;;;;37798:40;;37834:3;;37798:31;;37827:1;;37798:24;:28;;:31::i;:::-;:35;;:40::i;:::-;37780:15;:58;37777:164;;;37891:13;;;;;-1:-1:-1;;;;;37891:13:0;21054:7;21081:18;;;;;;;;;;;37881:40;;37917:3;;37881:31;;37910:1;;37881:24;20980:127;37881:40;37863:58;;37777:164;37959:42;37985:15;37959:25;:42::i;:::-;37655:373;37607:421;38043:9;;:23;;;;-1:-1:-1;38057:9:0;;;;38056:10;38043:23;:44;;;;-1:-1:-1;38071:16:0;;;;38070:17;38043:44;38040:521;;;38122:6;38148:22;-1:-1:-1;;;;;;;;;;;38167:2:0;38148:7;:22::i;:::-;38143:254;;;38229:26;38248:6;38229:18;:26::i;:::-;38214:11;;;38205:50;;-1:-1:-1;38143:254:0;;;38279:32;-1:-1:-1;;;;;;;;;;;7054:10:0;10802:147;:::i;38279:32::-;38276:121;;;38356:25;38374:6;38356:17;:25::i;:::-;38341:11;;;38332:49;;-1:-1:-1;38276:121:0;38428:23;38443:7;38428:14;:23::i;:::-;38414:11;;;:37;;;38471:21;;38468:82;;38523:11;;;;38513:21;;;;:::i;:::-;;;38468:82;38089:472;38040:521;38616:11;;-1:-1:-1;;;;;38598:15:0;;;38625:1;38598:15;;;38616:11;38598:15;;;;;;;38616:20;;;;38598:38;;;38658:13;;;;;;;;:23;;38630:6;;38625:1;38658:23;;38630:6;;38658:23;:::i;:::-;;;;;;;;38714:2;-1:-1:-1;;;;;38699:26:0;38708:4;-1:-1:-1;;;;;38699:26:0;;38718:6;38699:26;;;;2241:25:1;;2229:2;2214:18;;2095:177;38699:26:0;;;;;;;;38751:11;;;;:15;;;;38750:30;;-1:-1:-1;38771:9:0;;38750:30;:44;;;;-1:-1:-1;38785:9:0;;;;38784:10;38750:44;:65;;;;-1:-1:-1;38799:16:0;;;;38798:17;38750:65;38747:123;;;38832:26;38840:4;38846:8;38855:1;38846:11;;;;38832:7;:26::i;:::-;38886:11;;;;:15;;;;38885:30;;-1:-1:-1;38906:9:0;;38885:30;:44;;;;-1:-1:-1;38920:9:0;;;;38919:10;38885:44;:65;;;;-1:-1:-1;38934:16:0;;;;38933:17;38885:65;38882:121;;;38967:24;38973:4;38979:8;38988:1;38979:11;;;;38967:5;:24::i;:::-;36754:2306;;36641:2419;;;:::o;11253:105::-;11320:30;11331:4;7054:10;11320;:30::i;:::-;11253:105;:::o;14851:239::-;14935:22;14943:4;14949:7;14935;:22::i;:::-;14931:152;;;15006:5;14974:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14974:29:0;;;;;;;;;;:37;;-1:-1:-1;;14974:37:0;;;15031:40;7054:10;;14974:12;;15031:40;;15006:5;15031:40;14851:239;;:::o;13857:112::-;13936:25;13947:4;13953:7;13936:10;:25::i;40271:589::-;33686:16;:23;;-1:-1:-1;;33686:23:0;33705:4;33686:23;;;40382:16:::1;::::0;;40396:1:::1;40382:16:::0;;;;;::::1;::::0;;-1:-1:-1;;40382:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;40382:16:0::1;40358:40;;40427:4;40409;40414:1;40409:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40409:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;40453:15:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;40453:22:0;;;;:15;;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;40409:7;;40453:22;;;;;:15;:22:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40443:4;40448:1;40443:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40443:32:0;;::::1;:7;::::0;;::::1;::::0;;;;;:32;40520:15:::1;::::0;40488:62:::1;::::0;40505:4:::1;::::0;40520:15:::1;40538:11:::0;40488:8:::1;:62::i;:::-;40563:15;::::0;40705:18:::1;::::0;40563:199:::1;::::0;-1:-1:-1;;;40563:199:0;;-1:-1:-1;;;;;40563:15:0;;::::1;::::0;:66:::1;::::0;:199:::1;::::0;40644:11;;40563:15:::1;::::0;40686:4;;40705:18;::::1;::::0;40736:15:::1;::::0;40563:199:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40780:72;40811:11;40837:4;40780:72;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;33732:16:0;:24;;-1:-1:-1;;33732:24:0;;;40271:589::o;30510:181::-;30568:7;;30600:5;30604:1;30600;:5;:::i;:::-;30588:17;;30629:1;30624;:6;;30616:46;;;;-1:-1:-1;;;30616:46:0;;14609:2:1;30616:46:0;;;14591:21:1;14648:2;14628:18;;;14621:30;14687:29;14667:18;;;14660:57;14734:18;;30616:46:0;14407:351:1;30616:46:0;30682:1;30510:181;-1:-1:-1;;;30510:181:0:o;31043:250::-;31101:7;31125:1;31130;31125:6;31121:47;;-1:-1:-1;31155:1:0;31148:8;;31121:47;31180:9;31192:5;31196:1;31192;:5;:::i;:::-;31180:17;-1:-1:-1;31225:1:0;31216:5;31220:1;31180:17;31216:5;:::i;:::-;:10;31208:56;;;;-1:-1:-1;;;31208:56:0;;15360:2:1;31208:56:0;;;15342:21:1;15399:2;15379:18;;;15372:30;15438:34;15418:18;;;15411:62;-1:-1:-1;;;15489:18:1;;;15482:31;15530:19;;31208:56:0;15158:397:1;31303:132:0;31361:7;31388:39;31392:1;31395;31388:39;;;;;;;;;;;;;;;;;:3;:39::i;40991:247::-;41054:20;41076:16;32602:5;41148:9;;32602:5;41134:23;;;;:::i;:::-;41124:34;;:6;:34;:::i;:::-;:48;;;;:::i;:::-;41105:67;;32602:5;41207:9;;41198:6;:18;;;;:::i;:::-;:32;;;;:::i;:::-;41183:47;;40991:247;;;:::o;41249:242::-;41311:20;41333:15;32602:5;41404:8;;32602:5;41390:22;;;;:::i;:::-;41380:33;;:6;:33;:::i;:::-;:47;;;;:::i;:::-;41361:66;;32602:5;41461:8;;41452:6;:17;;;;:::i;41501:129::-;41560:11;32602:5;41603;;41594:6;:14;;;;:::i;:::-;:28;;;;:::i;40097:164::-;40168:11;;40165:89;;40196:46;40212:5;40227:4;40234:7;40196:15;:46::i;39073:601::-;-1:-1:-1;;;;;39158:21:0;;39150:67;;;;-1:-1:-1;;;39150:67:0;;15762:2:1;39150:67:0;;;15744:21:1;15801:2;15781:18;;;15774:30;15840:34;15820:18;;;15813:62;-1:-1:-1;;;15891:18:1;;;15884:31;15932:19;;39150:67:0;15560:397:1;39150:67:0;-1:-1:-1;;;;;39317:18:0;;39292:22;39317:18;;;;;;;;;;;39354:24;;;;39346:71;;;;-1:-1:-1;;;39346:71:0;;16164:2:1;39346:71:0;;;16146:21:1;16203:2;16183:18;;;16176:30;16242:34;16222:18;;;16215:62;-1:-1:-1;;;16293:18:1;;;16286:32;16335:19;;39346:71:0;15962:398:1;39346:71:0;-1:-1:-1;;;;;39453:18:0;;:9;:18;;;;;;;;;;39474:23;;;39453:44;;39519:21;;;;:31;;39491:6;;39453:9;39519:31;;39491:6;;39519:31;:::i;:::-;;;;-1:-1:-1;;39568:37:0;;2241:25:1;;;39594:1:0;;-1:-1:-1;;;;;39568:37:0;;;;;2229:2:1;2214:18;39568:37:0;;;;;;;29624:125;;;:::o;11648:505::-;11737:22;11745:4;11751:7;11737;:22::i;:::-;11732:414;;11925:41;11953:7;-1:-1:-1;;;;;11925:41:0;11963:2;11925:19;:41::i;:::-;12039:38;12067:4;12074:2;12039:19;:38::i;:::-;11830:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11830:270:0;;;;;;;;;;-1:-1:-1;;;11776:358:0;;;;;;;:::i;14481:238::-;14565:22;14573:4;14579:7;14565;:22::i;:::-;14560:152;;14604:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14604:29:0;;;;;;;;;:36;;-1:-1:-1;;14604:36:0;14636:4;14604:36;;;14687:12;7054:10;;6974:98;14687:12;-1:-1:-1;;;;;14660:40:0;14678:7;-1:-1:-1;;;;;14660:40:0;14672:4;14660:40;;;;;;;;;;14481:238;;:::o;31443:278::-;31529:7;31564:12;31557:5;31549:28;;;;-1:-1:-1;;;31549:28:0;;;;;;;;:::i;:::-;-1:-1:-1;31588:9:0;31600:5;31604:1;31600;:5;:::i;:::-;31588:17;31443:278;-1:-1:-1;;;;;31443:278:0:o;25181:671::-;-1:-1:-1;;;;;25312:18:0;;25304:68;;;;-1:-1:-1;;;25304:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25391:16:0;;25383:64;;;;-1:-1:-1;;;25383:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25533:15:0;;25511:19;25533:15;;;;;;;;;;;25567:21;;;;25559:72;;;;-1:-1:-1;;;25559:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25667:15:0;;;:9;:15;;;;;;;;;;;25685:20;;;25667:38;;25727:13;;;;;;;;:23;;25699:6;;25667:9;25727:23;;25699:6;;25727:23;:::i;:::-;;;;;;;;25783:2;-1:-1:-1;;;;;25768:26:0;25777:4;-1:-1:-1;;;;;25768:26:0;;25787:6;25768:26;;;;2241:25:1;;2229:2;2214:18;;2095:177;25768:26:0;;;;;;;;25807:37;29624:125;16651:451;16726:13;16752:19;16784:10;16788:6;16784:1;:10;:::i;:::-;:14;;16797:1;16784:14;:::i;:::-;16774:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16774:25:0;;16752:47;;-1:-1:-1;;;16810:6:0;16817:1;16810:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;16810:15:0;;;;;;;;;-1:-1:-1;;;16836:6:0;16843:1;16836:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;16836:15:0;;;;;;;;-1:-1:-1;16867:9:0;16879:10;16883:6;16879:1;:10;:::i;:::-;:14;;16892:1;16879:14;:::i;:::-;16867:26;;16862:135;16899:1;16895;:5;16862:135;;;-1:-1:-1;;;16947:5:0;16955:3;16947:11;16934:25;;;;;;;:::i;:::-;;;;16922:6;16929:1;16922:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;16922:37:0;;;;;;;;-1:-1:-1;16984:1:0;16974:11;;;;;16902:3;;;:::i;:::-;;;16862:135;;;-1:-1:-1;17015:10:0;;17007:55;;;;-1:-1:-1;;;17007:55:0;;17525:2:1;17007:55:0;;;17507:21:1;;;17544:18;;;17537:30;17603:34;17583:18;;;17576:62;17655:18;;17007:55:0;17323:356:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:1;721:16;;714:27;497:250::o;752:396::-;901:2;890:9;883:21;864:4;933:6;927:13;976:6;971:2;960:9;956:18;949:34;992:79;1064:6;1059:2;1048:9;1044:18;1039:2;1031:6;1027:15;992:79;:::i;:::-;1132:2;1111:15;-1:-1:-1;;1107:29:1;1092:45;;;;1139:2;1088:54;;752:396;-1:-1:-1;;752:396:1:o;1153:131::-;-1:-1:-1;;;;;1228:31:1;;1218:42;;1208:70;;1274:1;1271;1264:12;1289:315;1357:6;1365;1418:2;1406:9;1397:7;1393:23;1389:32;1386:52;;;1434:1;1431;1424:12;1386:52;1473:9;1460:23;1492:31;1517:5;1492:31;:::i;:::-;1542:5;1594:2;1579:18;;;;1566:32;;-1:-1:-1;;;1289:315:1:o;1843:247::-;1902:6;1955:2;1943:9;1934:7;1930:23;1926:32;1923:52;;;1971:1;1968;1961:12;1923:52;2010:9;1997:23;2029:31;2054:5;2029:31;:::i;2277:456::-;2354:6;2362;2370;2423:2;2411:9;2402:7;2398:23;2394:32;2391:52;;;2439:1;2436;2429:12;2391:52;2478:9;2465:23;2497:31;2522:5;2497:31;:::i;:::-;2547:5;-1:-1:-1;2604:2:1;2589:18;;2576:32;2617:33;2576:32;2617:33;:::i;:::-;2277:456;;2669:7;;-1:-1:-1;;;2723:2:1;2708:18;;;;2695:32;;2277:456::o;2738:180::-;2797:6;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;-1:-1:-1;2889:23:1;;2738:180;-1:-1:-1;2738:180:1:o;3294:315::-;3362:6;3370;3423:2;3411:9;3402:7;3398:23;3394:32;3391:52;;;3439:1;3436;3429:12;3391:52;3475:9;3462:23;3452:33;;3535:2;3524:9;3520:18;3507:32;3548:31;3573:5;3548:31;:::i;:::-;3598:5;3588:15;;;3294:315;;;;;:::o;3614:416::-;3679:6;3687;3740:2;3728:9;3719:7;3715:23;3711:32;3708:52;;;3756:1;3753;3746:12;3708:52;3795:9;3782:23;3814:31;3839:5;3814:31;:::i;:::-;3864:5;-1:-1:-1;3921:2:1;3906:18;;3893:32;3963:15;;3956:23;3944:36;;3934:64;;3994:1;3991;3984:12;4243:388;4311:6;4319;4372:2;4360:9;4351:7;4347:23;4343:32;4340:52;;;4388:1;4385;4378:12;4340:52;4427:9;4414:23;4446:31;4471:5;4446:31;:::i;:::-;4496:5;-1:-1:-1;4553:2:1;4538:18;;4525:32;4566:33;4525:32;4566:33;:::i;4636:248::-;4704:6;4712;4765:2;4753:9;4744:7;4740:23;4736:32;4733:52;;;4781:1;4778;4771:12;4733:52;-1:-1:-1;;4804:23:1;;;4874:2;4859:18;;;4846:32;;-1:-1:-1;4636:248:1:o;4889:380::-;4968:1;4964:12;;;;5011;;;5032:61;;5086:4;5078:6;5074:17;5064:27;;5032:61;5139:2;5131:6;5128:14;5108:18;5105:38;5102:161;;5185:10;5180:3;5176:20;5173:1;5166:31;5220:4;5217:1;5210:15;5248:4;5245:1;5238:15;5102:161;;4889:380;;;:::o;6101:127::-;6162:10;6157:3;6153:20;6150:1;6143:31;6193:4;6190:1;6183:15;6217:4;6214:1;6207:15;6233:125;6298:9;;;6319:10;;;6316:36;;;6332:18;;:::i;7206:416::-;7408:2;7390:21;;;7447:2;7427:18;;;7420:30;7486:34;7481:2;7466:18;;7459:62;-1:-1:-1;;;7552:2:1;7537:18;;7530:50;7612:3;7597:19;;7206:416::o;10438:401::-;10640:2;10622:21;;;10679:2;10659:18;;;10652:30;10718:34;10713:2;10698:18;;10691:62;-1:-1:-1;;;10784:2:1;10769:18;;10762:35;10829:3;10814:19;;10438:401::o;10844:399::-;11046:2;11028:21;;;11085:2;11065:18;;;11058:30;11124:34;11119:2;11104:18;;11097:62;-1:-1:-1;;;11190:2:1;11175:18;;11168:33;11233:3;11218:19;;10844:399::o;11957:127::-;12018:10;12013:3;12009:20;12006:1;11999:31;12049:4;12046:1;12039:15;12073:4;12070:1;12063:15;12089:402;12291:2;12273:21;;;12330:2;12310:18;;;12303:30;12369:34;12364:2;12349:18;;12342:62;-1:-1:-1;;;12435:2:1;12420:18;;12413:36;12481:3;12466:19;;12089:402::o;12496:128::-;12563:9;;;12584:11;;;12581:37;;;12598:18;;:::i;12629:127::-;12690:10;12685:3;12681:20;12678:1;12671:31;12721:4;12718:1;12711:15;12745:4;12742:1;12735:15;12761:251;12831:6;12884:2;12872:9;12863:7;12859:23;12855:32;12852:52;;;12900:1;12897;12890:12;12852:52;12932:9;12926:16;12951:31;12976:5;12951:31;:::i;13017:461::-;13070:3;13108:5;13102:12;13135:6;13130:3;13123:19;13161:4;13190:2;13185:3;13181:12;13174:19;;13227:2;13220:5;13216:14;13248:1;13258:195;13272:6;13269:1;13266:13;13258:195;;;13337:13;;-1:-1:-1;;;;;13333:39:1;13321:52;;13393:12;;;;13428:15;;;;13369:1;13287:9;13258:195;;;-1:-1:-1;13469:3:1;;13017:461;-1:-1:-1;;;;;13017:461:1:o;13483:582::-;13782:6;13771:9;13764:25;13825:6;13820:2;13809:9;13805:18;13798:34;13868:3;13863:2;13852:9;13848:18;13841:31;13745:4;13889:57;13941:3;13930:9;13926:19;13918:6;13889:57;:::i;:::-;-1:-1:-1;;;;;13982:32:1;;;;13977:2;13962:18;;13955:60;-1:-1:-1;14046:3:1;14031:19;14024:35;13881:65;13483:582;-1:-1:-1;;;13483:582:1:o;14070:332::-;14277:6;14266:9;14259:25;14320:2;14315;14304:9;14300:18;14293:30;14240:4;14340:56;14392:2;14381:9;14377:18;14369:6;14340:56;:::i;:::-;14332:64;14070:332;-1:-1:-1;;;;14070:332:1:o;14763:168::-;14836:9;;;14867;;14884:15;;;14878:22;;14864:37;14854:71;;14905:18;;:::i;14936:217::-;14976:1;15002;14992:132;;15046:10;15041:3;15037:20;15034:1;15027:31;15081:4;15078:1;15071:15;15109:4;15106:1;15099:15;14992:132;-1:-1:-1;15138:9:1;;14936:217::o;16365:812::-;16776:25;16771:3;16764:38;16746:3;16831:6;16825:13;16847:75;16915:6;16910:2;16905:3;16901:12;16894:4;16886:6;16882:17;16847:75;:::i;:::-;-1:-1:-1;;;16981:2:1;16941:16;;;16973:11;;;16966:40;17031:13;;17053:76;17031:13;17115:2;17107:11;;17100:4;17088:17;;17053:76;:::i;:::-;17149:17;17168:2;17145:26;;16365:812;-1:-1:-1;;;;16365:812:1:o;17182:136::-;17221:3;17249:5;17239:39;;17258:18;;:::i;:::-;-1:-1:-1;;;17294:18:1;;17182:136::o

Swarm Source

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