ETH Price: $3,525.02 (+1.09%)
Gas: 2 Gwei

Token

E - 2 (E-2)
 

Overview

Max Total Supply

297,425.91515625 E-2

Holders

307

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
500 E-2

Value
$0.00
0x7051aac27d0e2f8f4ee77610048f83fa02bdba4b
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:
UVStandardPool

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-06-25
*/

// File: @uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol


pragma solidity >=0.5.0;

/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
    /// @dev In the implementation you must pay the pool tokens owed for the swap.
    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata data
    ) external;
}

// File: @uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol


pragma solidity >=0.7.5;
pragma abicoder v2;


/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
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);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @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 Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @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 public 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 Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @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`.
     *
     * May emit a {RoleRevoked} event.
     */
    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.
     *
     * May emit a {RoleGranted} event.
     *
     * [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.
     *
     * May emit a {RoleGranted} event.
     */
    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.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

// File: @uniswap/v3-periphery/contracts/libraries/TransferHelper.sol


pragma solidity >=0.6.0;


library TransferHelper {
    /// @notice Transfers tokens from the targeted address to the given destination
    /// @notice Errors with 'STF' if transfer fails
    /// @param token The contract address of the token to be transferred
    /// @param from The originating address from which the tokens will be transferred
    /// @param to The destination address of the transfer
    /// @param value The amount to be transferred
    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF');
    }

    /// @notice Transfers tokens from msg.sender to a recipient
    /// @dev Errors with ST if transfer fails
    /// @param token The contract address of the token which will be transferred
    /// @param to The recipient of the transfer
    /// @param value The value of the transfer
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST');
    }

    /// @notice Approves the stipulated contract to spend the given allowance in the given token
    /// @dev Errors with 'SA' if transfer fails
    /// @param token The contract address of the token to be approved
    /// @param to The target of the approval
    /// @param value The amount of the given token the target will be allowed to spend
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA');
    }

    /// @notice Transfers ETH to the recipient address
    /// @dev Fails with `STE`
    /// @param to The destination of the transfer
    /// @param value The value to be transferred
    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'STE');
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @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.openzeppelin.com/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) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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 `from` to `to`.
     *
     * 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;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/StandardPool_ETH/UVPool.sol


pragma solidity ^0.8.12;









contract UVStandardPool is ERC20, ERC20Burnable, Ownable, AccessControl {
    using SafeMath for uint256;

    struct WhiteList {
        uint256 limitDeposit;
        uint64 startTimeDeposit;
        uint64 closeTimeDeposit;
    }

    struct Vote {
        string name;
        uint64 startTimestamp;
        uint64 endTimestamp;
        bool isActive;
        uint64 voteCount;
    }

    struct VoteInfo {
        uint64 timestamp;
        uint256 amount;
        uint8 optionId;
        address voter;
    }
    uint256 public feeCreator = 1 ether;
    mapping(uint8 => Vote) public allVotes;
    mapping(uint8 => mapping(address => VoteInfo)) public allVoters;
    mapping(uint8 => mapping(uint64 => VoteInfo)) public allVotersIndex;

    bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE");

    address public SWAP_ROUTER_ADDRESS =
        0xE592427A0AEce92De3Edee1F18E0157C05861564; // check
    address public stableCoin = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // check

    address public poolReserved;

    uint256 public poolOpenTime = 1687698000; // check
    mapping(address => WhiteList) public whiteList;
    mapping(address => uint256) public renewedList;

    mapping(address => uint256) private _balances;
    mapping(address => bool) public investmentAddreses;
    ISwapRouter public swapRouter;
    address public fundWallet = 0xE46d994aC4eee7775Bdc5F425FB4dDc2E1d6Db54; // check
    uint256 public currentSizePool = 0; // check
    uint256 public maxSizePool = 285715000000000000000000; // check
    uint8 public orderNumber = 2; // check
    uint256 public minimumDeposit = 500 ether; // check
    bool public isClose = false; // check
    uint8 percentFee = 250;
    bool public pausedTransfer = false;
    bool public voteCreateable = true;

    event Deposit(address indexed sender, uint256 amount);
    event BuyToken(address indexed tokenAddress, uint256 amount);
    event BuyBNB(uint256 amount);

    event CreateVote(uint8 voteId, uint64 startTimestamp, uint64 endTimestamp);
    event Voting(
        address indexed voter,
        uint256 amount,
        uint64 timestamp,
        uint8 optionId,
        uint64 voteCount
    );
    event CloseVote(uint8 voteId);

    constructor()
        ERC20(
            string.concat("E - ", Strings.toString(orderNumber)),
            string.concat("E-", Strings.toString(orderNumber))
        )
    {
        swapRouter = ISwapRouter(SWAP_ROUTER_ADDRESS);
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(MANAGER_ROLE, msg.sender);
    }

    // called once by the factory at time of deployment
    function initialize(
        uint256 _amountLimited,
        uint256 _minimumDeposit,
        address _fundWallet,
        uint64 _poolOpenTime,
        address _stableCoin,
        address _swapRouterAddress
    ) external onlyOwner {
        minimumDeposit = _minimumDeposit;
        maxSizePool = _amountLimited;
        SWAP_ROUTER_ADDRESS = _swapRouterAddress;
        swapRouter = ISwapRouter(SWAP_ROUTER_ADDRESS);
        fundWallet = _fundWallet;
        stableCoin = _stableCoin;
        poolOpenTime = _poolOpenTime;
    }

    receive() external payable {}

    fallback() external payable {}

    // Transfer tokens to fund wallet process projects vesting
    function transferForInvestment(
        address _tokenAddress,
        uint256 _amount,
        address _receiver
    ) external onlyRole(MANAGER_ROLE) {
        require(_receiver != address(0), "receiver address is zero");
        require(
            investmentAddreses[_receiver],
            "receiver is not investment address"
        );
        IERC20 _instance = IERC20(_tokenAddress);
        uint256 _balance = _instance.balanceOf(address(this));
        require(_balance >= _amount, "Not enough");

        _instance.approve(address(this), _amount);
        _instance.transfer(_receiver, _amount);
    }

    // Add white list for user
    function addsWhiteList(
        address[] memory _users,
        uint256[] memory _limitsDeposit,
        uint64 _startTimeDeposit,
        uint64 _closeTimeDeposit
    ) external onlyRole(MANAGER_ROLE) {
        require(_users.length > 0, "users is empty");
        require(_limitsDeposit.length > 0, "limit deposit is zero");
        require(_startTimeDeposit > 0, "start time deposit is zero");
        require(_closeTimeDeposit > 0, "close time deposit is zero");
        require(
            _closeTimeDeposit > _startTimeDeposit,
            "close time deposit must be greater than start time deposit"
        );
        for (uint256 index = 0; index < _users.length; index++) {
            whiteList[_users[index]] = WhiteList({
                limitDeposit: _limitsDeposit[index],
                startTimeDeposit: _startTimeDeposit,
                closeTimeDeposit: _closeTimeDeposit
            });
        }
    }

    // Deposit stable coin to the pool
    function wlDeposit(uint256 amount) public {
        require(!isClose, "Pool is closed");
        require(
            block.timestamp <= whiteList[msg.sender].closeTimeDeposit,
            "Deposit time is over"
        );
        require(
            block.timestamp >= whiteList[msg.sender].startTimeDeposit,
            "Deposit time is not start"
        );
        require(
            whiteList[msg.sender].limitDeposit >= amount,
            "Deposit amount is over limit"
        );
        require(maxSizePool >= currentSizePool.add(amount), "Pool is full");
        require(amount >= minimumDeposit, "Not enough");

        uint256 amount6Decimals = amount.div(10 ** 12);
        TransferHelper.safeTransferFrom(
            stableCoin,
            msg.sender,
            address(this),
            amount6Decimals
        );
        _mint(msg.sender, amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        _mint(fundWallet, amount.mul(percentFee).div(1000));
        _balances[fundWallet] = _balances[fundWallet].add(
            amount.mul(percentFee).div(1000)
        );

        currentSizePool += amount;

        emit Deposit(msg.sender, amount);
    }

    // Deposit stable coin to the pool
    function deposit(uint256 amount) public {
        require(!isClose, "Pool is closed");
        require(maxSizePool >= currentSizePool.add(amount), "Pool is full");
        require(amount >= minimumDeposit, "Amount is not enough");
        require(
            block.timestamp >= poolOpenTime,
            "Pool is not open yet, please wait"
        );

        uint256 amount6Decimals = amount.div(10 ** 12);
        TransferHelper.safeTransferFrom(
            stableCoin,
            msg.sender,
            address(this),
            amount6Decimals
        );
        _mint(msg.sender, amount);
        _balances[msg.sender] = _balances[msg.sender].add(amount);
        _mint(fundWallet, amount.mul(percentFee).div(1000));
        _balances[fundWallet] = _balances[fundWallet].add(
            amount.mul(percentFee).div(1000)
        );

        currentSizePool += amount;

        emit Deposit(msg.sender, amount);
    }

    // Set percent fee for the pool
    function setPercentFee(uint8 _percentFee) public onlyRole(MANAGER_ROLE) {
        require(
            _percentFee > 10 && _percentFee < 400,
            "Percent fee is invalid"
        );
        percentFee = _percentFee;
    }

    // swap any token on uniswap
    function buyToken(
        uint256 _amountIn,
        uint256 _amountOutMin,
        address _tokenIn,
        bytes calldata _path,
        uint256 _deadline
    ) public onlyRole(MANAGER_ROLE) {
        require(isClose, "Pool is not closed");
        address _poolReserved = poolReserved;

        TransferHelper.safeApprove(_tokenIn, address(swapRouter), _amountIn);

        ISwapRouter.ExactInputParams memory params = ISwapRouter
            .ExactInputParams({
                path: _path,
                recipient: _poolReserved,
                deadline: _deadline,
                amountIn: _amountIn,
                amountOutMinimum: _amountOutMin
            });

        // Executes the swap.
        uint256 realAmount = swapRouter.exactInput(params);

        emit BuyToken(_tokenIn, realAmount);
    }

    // toggles the paused state of the transfer function
    function togglePausedTransfer() public onlyRole(MANAGER_ROLE) {
        pausedTransfer = !pausedTransfer;
    }

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

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

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual override {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(pausedTransfer == false, "ERC20: transfer is paused");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(
            amount <= _balances[sender],
            "ERC20: amount must be less or equal to balance"
        );

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

    // Add investment address
    function addInvestmentAddress(address _investmentAddress) public onlyOwner {
        investmentAddreses[_investmentAddress] = true;
    }

    // Remove investment address
    function removeInvestmentAddress(
        address _investmentAddress
    ) public onlyOwner {
        investmentAddreses[_investmentAddress] = false;
    }

    // Set the fund wallet
    function setFundWallet(address _fundWallet) public onlyOwner {
        fundWallet = _fundWallet;
    }

    // Set minimum deposit amount
    function setMinimumDeposit(
        uint256 _minimumDeposit
    ) public onlyRole(MANAGER_ROLE) {
        minimumDeposit = _minimumDeposit;
    }

    // Set Max size pool
    function setMaxSizePool(
        uint256 _maxSizePool
    ) public onlyRole(MANAGER_ROLE) {
        maxSizePool = _maxSizePool;
    }

    // set pool open time
    function setPoolOpenTime(
        uint256 _poolOpenTime
    ) public onlyRole(MANAGER_ROLE) {
        poolOpenTime = _poolOpenTime;
    }

    // open the pool
    function openPool() public onlyRole(MANAGER_ROLE) {
        isClose = false;
    }

    // close the pool
    function closePool() public onlyRole(MANAGER_ROLE) {
        isClose = true;
    }

    // get detail Vote
    function getVote(uint8 _orderNumber) public view returns (Vote memory) {
        return allVotes[_orderNumber];
    }

    // Set fee creator
    function setFeeCreator(uint256 _feeCreator) public onlyRole(MANAGER_ROLE) {
        feeCreator = _feeCreator;
    }

    // Add wallet to manager role
    function addManager(address _manager) public onlyOwner {
        _setupRole(MANAGER_ROLE, _manager);
    }

    // Remove wallet from manager role
    function removeManager(address _manager) public onlyOwner {
        revokeRole(MANAGER_ROLE, _manager);
    }

    // get detail VoteInfo by orderNumber
    function getVoteInfo(
        uint8 _orderNumber,
        address _user
    ) public view returns (VoteInfo memory) {
        return allVoters[_orderNumber][_user];
    }

    // create a new vote
    function createVote(
        uint8 _orderNumber,
        uint64 _startTimestamp,
        uint64 _endTimestamp
    ) public payable {
        require(voteCreateable, "Vote is not createable");
        require(isClose, "Pool is not closed");
        if (hasRole(MANAGER_ROLE, msg.sender)) {} else {
            require(
                msg.value >= feeCreator,
                "You need to pay fee to create vote"
            );
            uint256 balance = balanceOf(msg.sender);
            require(
                balance >= totalSupply().div(10) ||
                    hasRole(MANAGER_ROLE, msg.sender),
                "You need to have 10% of total supply"
            );
        }

        allVotes[_orderNumber].startTimestamp = _startTimestamp;
        allVotes[_orderNumber].endTimestamp = _endTimestamp;
        allVotes[_orderNumber].isActive = true;
        voteCreateable = false;

        emit CreateVote(_orderNumber, _startTimestamp, _endTimestamp);
    }

    // close a vote
    function closeVote(uint8 _orderNumber) public onlyRole(MANAGER_ROLE) {
        allVotes[_orderNumber].isActive = false;
        voteCreateable = true;
        emit CloseVote(_orderNumber);
    }

    // voting for a option
    function voting(uint8 _orderNumber, uint8 _optionId) public {
        require(isClose, "This Pool is closed");
        require(allVotes[_orderNumber].isActive, "This Vote is closed");
        require(
            allVoters[_orderNumber][msg.sender].timestamp == 0,
            "You have voted"
        );
        require(
            allVoters[_orderNumber][msg.sender].amount == 0,
            "You have voted"
        );
        uint256 _amountBalance = balanceOf(msg.sender);

        transferFrom(msg.sender, address(this), _amountBalance);
        allVotes[_orderNumber].voteCount += 1;

        allVoters[_orderNumber][msg.sender] = VoteInfo({
            amount: _amountBalance,
            timestamp: uint64(block.timestamp),
            optionId: _optionId,
            voter: msg.sender
        });
        allVotersIndex[_orderNumber][
            allVotes[_orderNumber].voteCount
        ] = VoteInfo({
            amount: _amountBalance,
            timestamp: uint64(block.timestamp),
            optionId: _optionId,
            voter: msg.sender
        });

        emit Voting(
            msg.sender,
            _amountBalance,
            uint64(block.timestamp),
            _optionId,
            allVotes[_orderNumber].voteCount
        );
    }

    // internal release token after vote closed
    function releaseTokenAfterVote(
        uint8 _orderNumber,
        uint64 _from,
        uint64 _to
    ) external onlyRole(MANAGER_ROLE) {
        require(!allVotes[_orderNumber].isActive, "This Vote is still active");
        for (uint64 i = _from; i < _to; i++) {
            _transfer(
                address(this),
                allVotersIndex[_orderNumber][i].voter,
                allVotersIndex[_orderNumber][i].amount
            );
        }
    }

    // Set swap router
    function setSwapRouter(
        address _swapRouterAddress
    ) public onlyRole(MANAGER_ROLE) {
        SWAP_ROUTER_ADDRESS = _swapRouterAddress;
        swapRouter = ISwapRouter(_swapRouterAddress);
    }

    // Set Reserves address
    function setReserves(address _poolReserved) public onlyRole(MANAGER_ROLE) {
        poolReserved = _poolReserved;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBNB","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"voteId","type":"uint8"}],"name":"CloseVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"voteId","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"endTimestamp","type":"uint64"}],"name":"CreateVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"},{"indexed":false,"internalType":"uint8","name":"optionId","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"voteCount","type":"uint64"}],"name":"Voting","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_ROUTER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_investmentAddress","type":"address"}],"name":"addInvestmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_limitsDeposit","type":"uint256[]"},{"internalType":"uint64","name":"_startTimeDeposit","type":"uint64"},{"internalType":"uint64","name":"_closeTimeDeposit","type":"uint64"}],"name":"addsWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"address","name":"","type":"address"}],"name":"allVoters","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"allVotersIndex","outputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"allVotes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint64","name":"voteCount","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"address","name":"_tokenIn","type":"address"},{"internalType":"bytes","name":"_path","type":"bytes"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"buyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"name":"closeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint64","name":"_startTimestamp","type":"uint64"},{"internalType":"uint64","name":"_endTimestamp","type":"uint64"}],"name":"createVote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"currentSizePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCreator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"}],"name":"getVote","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"endTimestamp","type":"uint64"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint64","name":"voteCount","type":"uint64"}],"internalType":"struct UVStandardPool.Vote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"address","name":"_user","type":"address"}],"name":"getVoteInfo","outputs":[{"components":[{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"optionId","type":"uint8"},{"internalType":"address","name":"voter","type":"address"}],"internalType":"struct UVStandardPool.VoteInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","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":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountLimited","type":"uint256"},{"internalType":"uint256","name":"_minimumDeposit","type":"uint256"},{"internalType":"address","name":"_fundWallet","type":"address"},{"internalType":"uint64","name":"_poolOpenTime","type":"uint64"},{"internalType":"address","name":"_stableCoin","type":"address"},{"internalType":"address","name":"_swapRouterAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"investmentAddreses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClose","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSizePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumDeposit","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":"openPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"orderNumber","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolOpenTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolReserved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint64","name":"_from","type":"uint64"},{"internalType":"uint64","name":"_to","type":"uint64"}],"name":"releaseTokenAfterVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investmentAddress","type":"address"}],"name":"removeInvestmentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"renewedList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeCreator","type":"uint256"}],"name":"setFeeCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundWallet","type":"address"}],"name":"setFundWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSizePool","type":"uint256"}],"name":"setMaxSizePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumDeposit","type":"uint256"}],"name":"setMinimumDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_percentFee","type":"uint8"}],"name":"setPercentFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolOpenTime","type":"uint256"}],"name":"setPoolOpenTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolReserved","type":"address"}],"name":"setReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_swapRouterAddress","type":"address"}],"name":"setSwapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stableCoin","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePausedTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"transferForInvestment","outputs":[],"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":"voteCreateable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_orderNumber","type":"uint8"},{"internalType":"uint8","name":"_optionId","type":"uint8"}],"name":"voting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"uint256","name":"limitDeposit","type":"uint256"},{"internalType":"uint64","name":"startTimeDeposit","type":"uint64"},{"internalType":"uint64","name":"closeTimeDeposit","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"wlDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052670de0b6b3a7640000600755600b80546001600160a01b031990811673e592427a0aece92de3edee1f18e0157c0586156417909155600c8054821673dac17f958d2ee523a2206206994597c13d831ec71790556364983a50600e556014805490911673e46d994ac4eee7775bdc5f425fb4ddc2e1d6db541790556000601555693c80a424bd0d5c6c00006016556017805460ff19166002179055681b1ae4d6e2ef50000060185560198054630100fa0063ffffffff19909116179055348015620000cd57600080fd5b50601754620000eb9060ff16620001e7602090811b62002b5517901c565b604051602001620000fd919062000456565b60408051808303601f190181529190526017546200012a9060ff16620001e7602090811b62002b5517901c565b6040516020016200013c919062000478565b60408051601f1981840301815291905260036200015a838262000536565b50600462000169828262000536565b50505062000186620001806200030760201b60201c565b6200030b565b600b54601380546001600160a01b0319166001600160a01b03909216919091179055620001b56000336200035d565b620001e17f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08336200035d565b620006ba565b6060816000036200020f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156200023f5780620002268162000618565b9150620002379050600a836200064a565b915062000213565b6000816001600160401b038111156200025c576200025c62000491565b6040519080825280601f01601f19166020018201604052801562000287576020820181803683370190505b5090505b8415620002ff576200029f60018362000661565b9150620002ae600a8662000677565b620002bb9060306200068e565b60f81b818381518110620002d357620002d3620006a4565b60200101906001600160f81b031916908160001a905350620002f7600a866200064a565b94506200028b565b949350505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200036982826200036d565b5050565b620003798282620003f7565b620003695760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620003b33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff165b92915050565b6000815160005b818110156200044757602081850181015186830152016200042b565b50600093019283525090919050565b630229016960e51b8152600062000471600483018462000424565b9392505050565b61452d60f01b8152600062000471600283018462000424565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004bc57607f821691505b602082108103620004dd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200053157600081815260208120601f850160051c810160208610156200050c5750805b601f850160051c820191505b818110156200052d5782815560010162000518565b5050505b505050565b81516001600160401b0381111562000552576200055262000491565b6200056a81620005638454620004a7565b84620004e3565b602080601f831160018114620005a25760008415620005895750858301515b600019600386901b1c1916600185901b1785556200052d565b600085815260208120601f198616915b82811015620005d357888601518255948401946001909101908401620005b2565b5085821015620005f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b6000600182016200062d576200062d62000602565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826200065c576200065c62000634565b500490565b818103818111156200041e576200041e62000602565b60008262000689576200068962000634565b500690565b808201808211156200041e576200041e62000602565b634e487b7160e01b600052603260045260246000fd5b61416780620006ca6000396000f3fe6080604052600436106103e45760003560e01c8063715018a611610206578063b74bd54f11610117578063de09ee24116100a5578063eb5797a411610077578063eb5797a414610e19578063ec87621c14610e2e578063f2fde38b14610e50578063fcf4850414610e70578063febc6c4d14610e9057005b8063de09ee2414610d94578063df75254014610db4578063e40366c814610dc9578063e78ec42e14610df957005b8063cdae1104116100e9578063cdae110414610cf4578063d2e2a23714610d14578063d547741f14610d34578063db62190b14610d54578063dd62ed3e14610d7457005b8063b74bd54f14610c67578063c31c9c0714610c94578063c345cafd14610cb4578063c9ce798414610cd457005b8063992642e511610194578063a457c2d711610166578063a457c2d714610bcd578063a9059cbb14610bed578063ac18de4314610c0d578063b04dd81b14610c2d578063b6b55f2514610c4757005b8063992642e514610b585780639e0b65a614610b785780639f480f8a14610b98578063a217fddf14610bb857005b80639040d553116101d85780639040d55314610acd5780639194da6314610ae357806391d1485414610b0357806395d89b4114610b2357806397e18f3514610b3857005b8063715018a614610a4957806379cc679014610a5e5780638635a57014610a7e5780638da5cb5b14610aaf57005b8063372c12b1116103005780635adce3501161028e57806366805de51161026057806366805de5146108e55780636943ca2b146108fa5780636ae17b1b146109995780636d2dd6ba146109fd57806370a0823114610a1357005b80635adce35014610861578063636bfbab146108815780636376539f14610897578063664a1ad6146108ad57005b806342966c68116102d257806342966c68146107cb5780634777dbfe146107eb57806350885acc1461080157806355ce3b9a14610821578063589666f91461084157005b8063372c12b1146106fe578063395093511461076b5780633fa8ffa61461078b57806341273657146107ab57005b806319157eaa1161037d5780632d06177a1161034f5780632d06177a1461065c5780632f2ff15d1461067c578063313ce5671461069c5780633285db38146106be57806336568abe146106de57005b806319157eaa1461050a5780631c52d6b61461051d57806323b872dd1461060c578063248a9ca31461062c57005b80630d54538c116103b65780630d54538c14610484578063124474a7146104a45780631338f493146104d157806318160ddd146104eb57005b806301ffc9a7146103ed57806306fdde0314610422578063095ea7b3146104445780630bd541241461046457005b366103eb57005b005b3480156103f957600080fd5b5061040d61040836600461386d565b610eb1565b60405190151581526020015b60405180910390f35b34801561042e57600080fd5b50610437610ee8565b60405161041991906138e7565b34801561045057600080fd5b5061040d61045f366004613916565b610f7a565b34801561047057600080fd5b506103eb61047f366004613940565b610f92565b34801561049057600080fd5b506103eb61049f366004613983565b610fbe565b3480156104b057600080fd5b506104c46104bf3660046139c6565b6110c8565b60405161041991906139e1565b3480156104dd57600080fd5b5060195461040d9060ff1681565b3480156104f757600080fd5b506002545b604051908152602001610419565b6103eb610518366004613983565b6111eb565b34801561052957600080fd5b506105c4610538366004613a44565b6040805160808101825260008082526020820181905291810182905260608101919091525060ff91821660009081526009602090815260408083206001600160a01b039485168452825291829020825160808101845281546001600160401b03168152600182015492810192909252600201549384169181019190915261010090920416606082015290565b604051610419919081516001600160401b031681526020808301519082015260408083015160ff16908201526060918201516001600160a01b03169181019190915260800190565b34801561061857600080fd5b5061040d610627366004613a77565b611439565b34801561063857600080fd5b506104fc610647366004613ab3565b60009081526006602052604090206001015490565b34801561066857600080fd5b506103eb610677366004613940565b61145d565b34801561068857600080fd5b506103eb610697366004613acc565b611480565b3480156106a857600080fd5b5060125b60405160ff9091168152602001610419565b3480156106ca57600080fd5b506103eb6106d9366004613ab3565b6114aa565b3480156106ea57600080fd5b506103eb6106f9366004613acc565b6114c8565b34801561070a57600080fd5b50610746610719366004613940565b600f60205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610419565b34801561077757600080fd5b5061040d610786366004613916565b611546565b34801561079757600080fd5b506103eb6107a6366004613ab3565b611568565b3480156107b757600080fd5b506103eb6107c6366004613940565b6118b0565b3480156107d757600080fd5b506103eb6107e6366004613ab3565b6118f5565b3480156107f757600080fd5b506104fc600e5481565b34801561080d57600080fd5b506103eb61081c366004613ab3565b6118ff565b34801561082d57600080fd5b506103eb61083c366004613940565b61191d565b34801561084d57600080fd5b506103eb61085c366004613aef565b611947565b34801561086d57600080fd5b506103eb61087c366004613c61565b611aeb565b34801561088d57600080fd5b506104fc60185481565b3480156108a357600080fd5b506104fc60165481565b3480156108b957600080fd5b506014546108cd906001600160a01b031681565b6040516001600160a01b039091168152602001610419565b3480156108f157600080fd5b506103eb611dac565b34801561090657600080fd5b5061095e610915366004613a44565b60096020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b604080516001600160401b039095168552602085019390935260ff909116918301919091526001600160a01b03166060820152608001610419565b3480156109a557600080fd5b5061095e6109b4366004613d41565b600a6020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b348015610a0957600080fd5b506104fc60155481565b348015610a1f57600080fd5b506104fc610a2e366004613940565b6001600160a01b031660009081526011602052604090205490565b348015610a5557600080fd5b506103eb611dd4565b348015610a6a57600080fd5b506103eb610a79366004613916565b611de8565b348015610a8a57600080fd5b50610a9e610a993660046139c6565b611dfd565b604051610419959493929190613d6b565b348015610abb57600080fd5b506005546001600160a01b03166108cd565b348015610ad957600080fd5b506104fc60075481565b348015610aef57600080fd5b50600b546108cd906001600160a01b031681565b348015610b0f57600080fd5b5061040d610b1e366004613acc565b611eca565b348015610b2f57600080fd5b50610437611ef5565b348015610b4457600080fd5b506103eb610b53366004613940565b611f04565b348015610b6457600080fd5b50600c546108cd906001600160a01b031681565b348015610b8457600080fd5b506103eb610b93366004613db0565b611f3f565b348015610ba457600080fd5b506103eb610bb33660046139c6565b6121ba565b348015610bc457600080fd5b506104fc600081565b348015610bd957600080fd5b5061040d610be8366004613916565b61224b565b348015610bf957600080fd5b5061040d610c08366004613916565b6122c6565b348015610c1957600080fd5b506103eb610c28366004613940565b6122dc565b348015610c3957600080fd5b506017546106ac9060ff1681565b348015610c5357600080fd5b506103eb610c62366004613ab3565b6122fc565b348015610c7357600080fd5b506104fc610c82366004613940565b60106020526000908152604090205481565b348015610ca057600080fd5b506013546108cd906001600160a01b031681565b348015610cc057600080fd5b506103eb610ccf366004613de3565b612432565b348015610ce057600080fd5b50600d546108cd906001600160a01b031681565b348015610d0057600080fd5b5060195461040d9062010000900460ff1681565b348015610d2057600080fd5b506103eb610d2f366004613ab3565b6128da565b348015610d4057600080fd5b506103eb610d4f366004613acc565b6128f8565b348015610d6057600080fd5b506103eb610d6f366004613e0d565b61291d565b348015610d8057600080fd5b506104fc610d8f366004613e73565b61298d565b348015610da057600080fd5b506103eb610daf366004613940565b6129b8565b348015610dc057600080fd5b506103eb6129e1565b348015610dd557600080fd5b5061040d610de4366004613940565b60126020526000908152604090205460ff1681565b348015610e0557600080fd5b506103eb610e14366004613ab3565b612a19565b348015610e2557600080fd5b506103eb612a37565b348015610e3a57600080fd5b506104fc60008051602061411283398151915281565b348015610e5c57600080fd5b506103eb610e6b366004613940565b612a5c565b348015610e7c57600080fd5b506103eb610e8b3660046139c6565b612ad2565b348015610e9c57600080fd5b5060195461040d906301000000900460ff1681565b60006001600160e01b03198216637965db0b60e01b1480610ee257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610ef790613e8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2390613e8f565b8015610f705780601f10610f4557610100808354040283529160200191610f70565b820191906000526020600020905b815481529060010190602001808311610f5357829003601f168201915b5050505050905090565b600033610f88818585612c5d565b5060019392505050565b610f9a612d82565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b600080516020614112833981519152610fd681612ddc565b60ff808516600090815260086020526040902060010154600160801b900416156110475760405162461bcd60e51b815260206004820152601960248201527f5468697320566f7465206973207374696c6c206163746976650000000000000060448201526064015b60405180910390fd5b825b826001600160401b0316816001600160401b031610156110c15760ff85166000908152600a602090815260408083206001600160401b0385168452909152902060028101546001909101546110af9130916101009091046001600160a01b031690612de6565b806110b981613edf565b915050611049565b5050505050565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260ff821660009081526008602052604090819020815160a0810190925280548290829061111f90613e8f565b80601f016020809104026020016040519081016040528092919081815260200182805461114b90613e8f565b80156111985780601f1061116d57610100808354040283529160200191611198565b820191906000526020600020905b81548152906001019060200180831161117b57829003601f168201915b5050509183525050600191909101546001600160401b038082166020840152600160401b82048116604084015260ff600160801b83041615156060840152600160881b9091041660809091015292915050565b6019546301000000900460ff1661123d5760405162461bcd60e51b8152602060048201526016602482015275566f7465206973206e6f742063726561746561626c6560501b604482015260640161103e565b60195460ff166112845760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b604482015260640161103e565b61129c60008051602061411283398151915233611eca565b611399576007543410156112fd5760405162461bcd60e51b815260206004820152602260248201527f596f75206e65656420746f207061792066656520746f2063726561746520766f604482015261746560f01b606482015260840161103e565b3360009081526011602052604090205460025461131e90600a905b9061308c565b8110158061133f575061133f60008051602061411283398151915233611eca565b6113975760405162461bcd60e51b8152602060048201526024808201527f596f75206e65656420746f206861766520313025206f6620746f74616c20737560448201526370706c7960e01b606482015260840161103e565b505b60ff8316600081815260086020908152604091829020600101805460ff60801b196001600160401b03878116600160401b81026001600160801b0319909416918a169182179390931791909116600160801b179092556019805463ff0000001916905583519485529184015282820152517f1d66141808fec33c82bd035e01d0a193ead5ead8504b58ac0bbc032fb22bae909181900360600190a1505050565b60003361144785828561309f565b611452858585612de6565b506001949350505050565b611465612d82565b61147d60008051602061411283398151915282613119565b50565b60008281526006602052604090206001015461149b81612ddc565b6114a5838361311f565b505050565b6000805160206141128339815191526114c281612ddc565b50600e55565b6001600160a01b03811633146115385760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161103e565b61154282826131a5565b5050565b600033610f88818585611559838361298d565b6115639190613f05565b612c5d565b60195460ff16156115ac5760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b604482015260640161103e565b336000908152600f6020526040902060010154600160401b90046001600160401b03164211156116155760405162461bcd60e51b81526020600482015260146024820152732232b837b9b4ba103a34b6b29034b99037bb32b960611b604482015260640161103e565b336000908152600f60205260409020600101546001600160401b03164210156116805760405162461bcd60e51b815260206004820152601960248201527f4465706f7369742074696d65206973206e6f7420737461727400000000000000604482015260640161103e565b336000908152600f60205260409020548111156116df5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d697400000000604482015260640161103e565b6015546116ec908261320c565b601654101561172c5760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b604482015260640161103e565b60185481101561176b5760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b604482015260640161103e565b600061177c8264e8d4a5100061308c565b600c54909150611797906001600160a01b0316333084613218565b6117a1338361331a565b336000908152601160205260409020546117bb908361320c565b336000908152601160205260409020556014546019546117ff916001600160a01b0316906117fa906103e890611318908790610100900460ff166133d9565b61331a565b60195461184290611821906103e890611318908690610100900460ff166133d9565b6014546001600160a01b03166000908152601160205260409020549061320c565b6014546001600160a01b031660009081526011602052604081209190915560158054849290611872908490613f05565b909155505060405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a25050565b6000805160206141128339815191526118c881612ddc565b50600b80546001600160a01b039092166001600160a01b0319928316811790915560138054909216179055565b61147d33826133e5565b60008051602061411283398151915261191781612ddc565b50600755565b611925612d82565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60008051602061411283398151915261195f81612ddc565b60195460ff166119a65760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b604482015260640161103e565b600d546013546001600160a01b03918216916119c5918891168a613517565b6040805160c06020601f8801819004028201810190925260a08101868152600092829190899089908190850183828082843760009201829052509385525050506001600160a01b0380861660208401526040808401899052606084018e905260809093018c9052601354925163c04b8d5960e01b8152939450909291169063c04b8d5990611a57908590600401613f18565b6020604051808303816000875af1158015611a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9a9190613f70565b9050876001600160a01b03167fdd06b66c3ba8126086cd863137d6f3b86ce5bcf4309cac390cc265e39194d0b282604051611ad791815260200190565b60405180910390a250505050505050505050565b600080516020614112833981519152611b0381612ddc565b6000855111611b455760405162461bcd60e51b815260206004820152600e60248201526d757365727320697320656d70747960901b604482015260640161103e565b6000845111611b8e5760405162461bcd60e51b81526020600482015260156024820152746c696d6974206465706f736974206973207a65726f60581b604482015260640161103e565b6000836001600160401b031611611be75760405162461bcd60e51b815260206004820152601a60248201527f73746172742074696d65206465706f736974206973207a65726f000000000000604482015260640161103e565b6000826001600160401b031611611c405760405162461bcd60e51b815260206004820152601a60248201527f636c6f73652074696d65206465706f736974206973207a65726f000000000000604482015260640161103e565b826001600160401b0316826001600160401b031611611cc75760405162461bcd60e51b815260206004820152603a60248201527f636c6f73652074696d65206465706f736974206d75737420626520677265617460448201527f6572207468616e2073746172742074696d65206465706f736974000000000000606482015260840161103e565b60005b8551811015611da4576040518060600160405280868381518110611cf057611cf0613f89565b60200260200101518152602001856001600160401b03168152602001846001600160401b0316815250600f6000888481518110611d2f57611d2f613f89565b6020908102919091018101516001600160a01b0316825281810192909252604090810160002083518155918301516001909201805493909101516001600160401b03908116600160401b026001600160801b031990941692169190911791909117905580611d9c81613f9f565b915050611cca565b505050505050565b600080516020614112833981519152611dc481612ddc565b506019805460ff19166001179055565b611ddc612d82565b611de66000613610565b565b611df382338361309f565b61154282826133e5565b600860205260009081526040902080548190611e1890613e8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4490613e8f565b8015611e915780601f10611e6657610100808354040283529160200191611e91565b820191906000526020600020905b815481529060010190602001808311611e7457829003601f168201915b505050600190930154919250506001600160401b0380821691600160401b810482169160ff600160801b83041691600160881b90041685565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610ef790613e8f565b600080516020614112833981519152611f1c81612ddc565b50600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020614112833981519152611f5781612ddc565b6001600160a01b038216611fad5760405162461bcd60e51b815260206004820152601860248201527f72656365697665722061646472657373206973207a65726f0000000000000000604482015260640161103e565b6001600160a01b03821660009081526012602052604090205460ff166120205760405162461bcd60e51b815260206004820152602260248201527f7265636569766572206973206e6f7420696e766573746d656e74206164647265604482015261737360f01b606482015260840161103e565b6040516370a0823160e01b815230600482015284906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190613f70565b9050848110156120cc5760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b604482015260640161103e565b60405163095ea7b360e01b8152306004820152602481018690526001600160a01b0383169063095ea7b3906044016020604051808303816000875af1158015612119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213d9190613fb8565b5060405163a9059cbb60e01b81526001600160a01b0385811660048301526024820187905283169063a9059cbb906044016020604051808303816000875af115801561218d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b19190613fb8565b50505050505050565b6000805160206141128339815191526121d281612ddc565b600a8260ff161180156121e957506101908260ff16105b61222e5760405162461bcd60e51b815260206004820152601660248201527514195c98d95b9d08199959481a5cc81a5b9d985b1a5960521b604482015260640161103e565b506019805460ff9092166101000261ff0019909216919091179055565b60003381612259828661298d565b9050838110156122b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161103e565b6114528286868403612c5d565b60006122d3338484612de6565b50600192915050565b6122e4612d82565b61147d600080516020614112833981519152826128f8565b60195460ff16156123405760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b604482015260640161103e565b60155461234d908261320c565b601654101561238d5760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b604482015260640161103e565b6018548110156123d65760405162461bcd60e51b8152602060048201526014602482015273082dadeeadce840d2e640dcdee840cadcdeeaced60631b604482015260640161103e565b600e5442101561176b5760405162461bcd60e51b815260206004820152602160248201527f506f6f6c206973206e6f74206f70656e207965742c20706c65617365207761696044820152601d60fa1b606482015260840161103e565b60195460ff1661247a5760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8141bdbdb081a5cc818db1bdcd959606a1b604482015260640161103e565b60ff808316600090815260086020526040902060010154600160801b9004166124db5760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8159bdd19481a5cc818db1bdcd959606a1b604482015260640161103e565b60ff821660009081526009602090815260408083203384529091529020546001600160401b0316156125405760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b604482015260640161103e565b60ff821660009081526009602090815260408083203384529091529020600101541561259f5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b604482015260640161103e565b33600081815260116020526040902054906125bb903083611439565b5060ff83166000908152600860205260409020600190810180546011906125f3908490600160881b90046001600160401b0316613fda565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600960008560ff1660ff1681526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600a60008560ff1660ff1681526020019081526020016000206000600860008760ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f35d237ec79045d79173411929e0c49b6089611517881c6f075c0bec2f32b2073824285600860008960ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166040516128cd94939291909384526001600160401b03928316602085015260ff91909116604084015216606082015260800190565b60405180910390a2505050565b6000805160206141128339815191526128f281612ddc565b50601655565b60008281526006602052604090206001015461291381612ddc565b6114a583836131a5565b612925612d82565b601894909455601694909455600b80546001600160a01b03199081166001600160a01b0395861690811790925560138054821690921790915560148054821693851693909317909255600c8054909216929093169190911790556001600160401b0316600e55565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6129c0612d82565b6001600160a01b03166000908152601260205260409020805460ff19169055565b6000805160206141128339815191526129f981612ddc565b506019805462ff0000198116620100009182900460ff1615909102179055565b600080516020614112833981519152612a3181612ddc565b50601855565b600080516020614112833981519152612a4f81612ddc565b506019805460ff19169055565b612a64612d82565b6001600160a01b038116612ac95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161103e565b61147d81613610565b600080516020614112833981519152612aea81612ddc565b60ff8216600081815260086020908152604091829020600101805460ff60801b191690556019805463ff0000001916630100000017905590519182527f4329ff635fb60bac41e85195468d8998fac762dabf4ffde9a7cfb9ec0d22d897910160405180910390a15050565b606081600003612b7c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ba65780612b9081613f9f565b9150612b9f9050600a83614017565b9150612b80565b6000816001600160401b03811115612bc057612bc0613b8d565b6040519080825280601f01601f191660200182016040528015612bea576020820181803683370190505b5090505b8415612c5557612bff60018361402b565b9150612c0c600a8661403e565b612c17906030613f05565b60f81b818381518110612c2c57612c2c613f89565b60200101906001600160f81b031916908160001a905350612c4e600a86614017565b9450612bee565b949350505050565b6001600160a01b038316612cbf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161103e565b6001600160a01b038216612d205760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161103e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314611de65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161103e565b61147d8133613662565b6001600160a01b038316612e4a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161103e565b6001600160a01b038216612eac5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161103e565b60195462010000900460ff1615612f055760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e736665722069732070617573656400000000000000604482015260640161103e565b60008111612f675760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161103e565b6001600160a01b038316600090815260116020526040902054811115612fe65760405162461bcd60e51b815260206004820152602e60248201527f45524332303a20616d6f756e74206d757374206265206c657373206f7220657160448201526d75616c20746f2062616c616e636560901b606482015260840161103e565b6001600160a01b03831660009081526011602052604090205461300990826136c6565b6001600160a01b038085166000908152601160205260408082209390935590841681522054613038908261320c565b6001600160a01b0380841660008181526011602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d759085815260200190565b60006130988284614017565b9392505050565b60006130ab848461298d565b9050600019811461311357818110156131065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161103e565b6131138484848403612c5d565b50505050565b61154282825b6131298282611eca565b6115425760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556131613390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6131af8282611eca565b156115425760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006130988284613f05565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161327c9190614052565b6000604051808303816000865af19150503d80600081146132b9576040519150601f19603f3d011682016040523d82523d6000602084013e6132be565b606091505b50915091508180156132e85750805115806132e85750808060200190518101906132e89190613fb8565b611da45760405162461bcd60e51b815260206004820152600360248201526229aa2360e91b604482015260640161103e565b6001600160a01b0382166133705760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161103e565b80600260008282546133829190613f05565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6000613098828461406e565b6001600160a01b0382166134455760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161103e565b6001600160a01b038216600090815260208190526040902054818110156134b95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161103e565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b17905291516000928392908716916135739190614052565b6000604051808303816000865af19150503d80600081146135b0576040519150601f19603f3d011682016040523d82523d6000602084013e6135b5565b606091505b50915091508180156135df5750805115806135df5750808060200190518101906135df9190613fb8565b6110c15760405162461bcd60e51b8152602060048201526002602482015261534160f01b604482015260640161103e565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61366c8282611eca565b61154257613684816001600160a01b031660146136d2565b61368f8360206136d2565b6040516020016136a0929190614085565b60408051601f198184030181529082905262461bcd60e51b825261103e916004016138e7565b6000613098828461402b565b606060006136e183600261406e565b6136ec906002613f05565b6001600160401b0381111561370357613703613b8d565b6040519080825280601f01601f19166020018201604052801561372d576020820181803683370190505b509050600360fc1b8160008151811061374857613748613f89565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061377757613777613f89565b60200101906001600160f81b031916908160001a905350600061379b84600261406e565b6137a6906001613f05565b90505b600181111561381e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106137da576137da613f89565b1a60f81b8282815181106137f0576137f0613f89565b60200101906001600160f81b031916908160001a90535060049490941c93613817816140fa565b90506137a9565b5083156130985760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161103e565b60006020828403121561387f57600080fd5b81356001600160e01b03198116811461309857600080fd5b60005b838110156138b257818101518382015260200161389a565b50506000910152565b600081518084526138d3816020860160208601613897565b601f01601f19169290920160200192915050565b60208152600061309860208301846138bb565b80356001600160a01b038116811461391157600080fd5b919050565b6000806040838503121561392957600080fd5b613932836138fa565b946020939093013593505050565b60006020828403121561395257600080fd5b613098826138fa565b803560ff8116811461391157600080fd5b80356001600160401b038116811461391157600080fd5b60008060006060848603121561399857600080fd5b6139a18461395b565b92506139af6020850161396c565b91506139bd6040850161396c565b90509250925092565b6000602082840312156139d857600080fd5b6130988261395b565b602081526000825160a060208401526139fd60c08401826138bb565b905060208401516001600160401b0380821660408601528060408701511660608601526060860151151560808601528060808701511660a086015250508091505092915050565b60008060408385031215613a5757600080fd5b613a608361395b565b9150613a6e602084016138fa565b90509250929050565b600080600060608486031215613a8c57600080fd5b613a95846138fa565b9250613aa3602085016138fa565b9150604084013590509250925092565b600060208284031215613ac557600080fd5b5035919050565b60008060408385031215613adf57600080fd5b82359150613a6e602084016138fa565b60008060008060008060a08789031215613b0857600080fd5b8635955060208701359450613b1f604088016138fa565b935060608701356001600160401b0380821115613b3b57600080fd5b818901915089601f830112613b4f57600080fd5b813581811115613b5e57600080fd5b8a6020828501011115613b7057600080fd5b602083019550809450505050608087013590509295509295509295565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613bcb57613bcb613b8d565b604052919050565b60006001600160401b03821115613bec57613bec613b8d565b5060051b60200190565b600082601f830112613c0757600080fd5b81356020613c1c613c1783613bd3565b613ba3565b82815260059290921b84018101918181019086841115613c3b57600080fd5b8286015b84811015613c565780358352918301918301613c3f565b509695505050505050565b60008060008060808587031215613c7757600080fd5b84356001600160401b0380821115613c8e57600080fd5b818701915087601f830112613ca257600080fd5b81356020613cb2613c1783613bd3565b82815260059290921b8401810191818101908b841115613cd157600080fd5b948201945b83861015613cf657613ce7866138fa565b82529482019490820190613cd6565b98505088013592505080821115613d0c57600080fd5b50613d1987828801613bf6565b935050613d286040860161396c565b9150613d366060860161396c565b905092959194509250565b60008060408385031215613d5457600080fd5b613d5d8361395b565b9150613a6e6020840161396c565b60a081526000613d7e60a08301886138bb565b6001600160401b0396871660208401529486166040830152509115156060830152909216608090920191909152919050565b600080600060608486031215613dc557600080fd5b613dce846138fa565b9250602084013591506139bd604085016138fa565b60008060408385031215613df657600080fd5b613dff8361395b565b9150613a6e6020840161395b565b60008060008060008060c08789031215613e2657600080fd5b8635955060208701359450613e3d604088016138fa565b9350613e4b6060880161396c565b9250613e59608088016138fa565b9150613e6760a088016138fa565b90509295509295509295565b60008060408385031215613e8657600080fd5b613a60836138fa565b600181811c90821680613ea357607f821691505b602082108103613ec357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b03808316818103613efb57613efb613ec9565b6001019392505050565b80820180821115610ee257610ee2613ec9565b602081526000825160a06020840152613f3460c08401826138bb565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b600060208284031215613f8257600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060018201613fb157613fb1613ec9565b5060010190565b600060208284031215613fca57600080fd5b8151801515811461309857600080fd5b6001600160401b03818116838216019080821115613ffa57613ffa613ec9565b5092915050565b634e487b7160e01b600052601260045260246000fd5b60008261402657614026614001565b500490565b81810381811115610ee257610ee2613ec9565b60008261404d5761404d614001565b500690565b60008251614064818460208701613897565b9190910192915050565b8082028115828204841417610ee257610ee2613ec9565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516140bd816017850160208801613897565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516140ee816028840160208801613897565b01602801949350505050565b60008161410957614109613ec9565b50600019019056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a2646970667358221220022dc9696a24cc7666f714a2679da0b16e4ccd7659d7d27acf7719fb9177450b64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106103e45760003560e01c8063715018a611610206578063b74bd54f11610117578063de09ee24116100a5578063eb5797a411610077578063eb5797a414610e19578063ec87621c14610e2e578063f2fde38b14610e50578063fcf4850414610e70578063febc6c4d14610e9057005b8063de09ee2414610d94578063df75254014610db4578063e40366c814610dc9578063e78ec42e14610df957005b8063cdae1104116100e9578063cdae110414610cf4578063d2e2a23714610d14578063d547741f14610d34578063db62190b14610d54578063dd62ed3e14610d7457005b8063b74bd54f14610c67578063c31c9c0714610c94578063c345cafd14610cb4578063c9ce798414610cd457005b8063992642e511610194578063a457c2d711610166578063a457c2d714610bcd578063a9059cbb14610bed578063ac18de4314610c0d578063b04dd81b14610c2d578063b6b55f2514610c4757005b8063992642e514610b585780639e0b65a614610b785780639f480f8a14610b98578063a217fddf14610bb857005b80639040d553116101d85780639040d55314610acd5780639194da6314610ae357806391d1485414610b0357806395d89b4114610b2357806397e18f3514610b3857005b8063715018a614610a4957806379cc679014610a5e5780638635a57014610a7e5780638da5cb5b14610aaf57005b8063372c12b1116103005780635adce3501161028e57806366805de51161026057806366805de5146108e55780636943ca2b146108fa5780636ae17b1b146109995780636d2dd6ba146109fd57806370a0823114610a1357005b80635adce35014610861578063636bfbab146108815780636376539f14610897578063664a1ad6146108ad57005b806342966c68116102d257806342966c68146107cb5780634777dbfe146107eb57806350885acc1461080157806355ce3b9a14610821578063589666f91461084157005b8063372c12b1146106fe578063395093511461076b5780633fa8ffa61461078b57806341273657146107ab57005b806319157eaa1161037d5780632d06177a1161034f5780632d06177a1461065c5780632f2ff15d1461067c578063313ce5671461069c5780633285db38146106be57806336568abe146106de57005b806319157eaa1461050a5780631c52d6b61461051d57806323b872dd1461060c578063248a9ca31461062c57005b80630d54538c116103b65780630d54538c14610484578063124474a7146104a45780631338f493146104d157806318160ddd146104eb57005b806301ffc9a7146103ed57806306fdde0314610422578063095ea7b3146104445780630bd541241461046457005b366103eb57005b005b3480156103f957600080fd5b5061040d61040836600461386d565b610eb1565b60405190151581526020015b60405180910390f35b34801561042e57600080fd5b50610437610ee8565b60405161041991906138e7565b34801561045057600080fd5b5061040d61045f366004613916565b610f7a565b34801561047057600080fd5b506103eb61047f366004613940565b610f92565b34801561049057600080fd5b506103eb61049f366004613983565b610fbe565b3480156104b057600080fd5b506104c46104bf3660046139c6565b6110c8565b60405161041991906139e1565b3480156104dd57600080fd5b5060195461040d9060ff1681565b3480156104f757600080fd5b506002545b604051908152602001610419565b6103eb610518366004613983565b6111eb565b34801561052957600080fd5b506105c4610538366004613a44565b6040805160808101825260008082526020820181905291810182905260608101919091525060ff91821660009081526009602090815260408083206001600160a01b039485168452825291829020825160808101845281546001600160401b03168152600182015492810192909252600201549384169181019190915261010090920416606082015290565b604051610419919081516001600160401b031681526020808301519082015260408083015160ff16908201526060918201516001600160a01b03169181019190915260800190565b34801561061857600080fd5b5061040d610627366004613a77565b611439565b34801561063857600080fd5b506104fc610647366004613ab3565b60009081526006602052604090206001015490565b34801561066857600080fd5b506103eb610677366004613940565b61145d565b34801561068857600080fd5b506103eb610697366004613acc565b611480565b3480156106a857600080fd5b5060125b60405160ff9091168152602001610419565b3480156106ca57600080fd5b506103eb6106d9366004613ab3565b6114aa565b3480156106ea57600080fd5b506103eb6106f9366004613acc565b6114c8565b34801561070a57600080fd5b50610746610719366004613940565b600f60205260009081526040902080546001909101546001600160401b0380821691600160401b90041683565b604080519384526001600160401b039283166020850152911690820152606001610419565b34801561077757600080fd5b5061040d610786366004613916565b611546565b34801561079757600080fd5b506103eb6107a6366004613ab3565b611568565b3480156107b757600080fd5b506103eb6107c6366004613940565b6118b0565b3480156107d757600080fd5b506103eb6107e6366004613ab3565b6118f5565b3480156107f757600080fd5b506104fc600e5481565b34801561080d57600080fd5b506103eb61081c366004613ab3565b6118ff565b34801561082d57600080fd5b506103eb61083c366004613940565b61191d565b34801561084d57600080fd5b506103eb61085c366004613aef565b611947565b34801561086d57600080fd5b506103eb61087c366004613c61565b611aeb565b34801561088d57600080fd5b506104fc60185481565b3480156108a357600080fd5b506104fc60165481565b3480156108b957600080fd5b506014546108cd906001600160a01b031681565b6040516001600160a01b039091168152602001610419565b3480156108f157600080fd5b506103eb611dac565b34801561090657600080fd5b5061095e610915366004613a44565b60096020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b604080516001600160401b039095168552602085019390935260ff909116918301919091526001600160a01b03166060820152608001610419565b3480156109a557600080fd5b5061095e6109b4366004613d41565b600a6020908152600092835260408084209091529082529020805460018201546002909201546001600160401b03909116919060ff81169061010090046001600160a01b031684565b348015610a0957600080fd5b506104fc60155481565b348015610a1f57600080fd5b506104fc610a2e366004613940565b6001600160a01b031660009081526011602052604090205490565b348015610a5557600080fd5b506103eb611dd4565b348015610a6a57600080fd5b506103eb610a79366004613916565b611de8565b348015610a8a57600080fd5b50610a9e610a993660046139c6565b611dfd565b604051610419959493929190613d6b565b348015610abb57600080fd5b506005546001600160a01b03166108cd565b348015610ad957600080fd5b506104fc60075481565b348015610aef57600080fd5b50600b546108cd906001600160a01b031681565b348015610b0f57600080fd5b5061040d610b1e366004613acc565b611eca565b348015610b2f57600080fd5b50610437611ef5565b348015610b4457600080fd5b506103eb610b53366004613940565b611f04565b348015610b6457600080fd5b50600c546108cd906001600160a01b031681565b348015610b8457600080fd5b506103eb610b93366004613db0565b611f3f565b348015610ba457600080fd5b506103eb610bb33660046139c6565b6121ba565b348015610bc457600080fd5b506104fc600081565b348015610bd957600080fd5b5061040d610be8366004613916565b61224b565b348015610bf957600080fd5b5061040d610c08366004613916565b6122c6565b348015610c1957600080fd5b506103eb610c28366004613940565b6122dc565b348015610c3957600080fd5b506017546106ac9060ff1681565b348015610c5357600080fd5b506103eb610c62366004613ab3565b6122fc565b348015610c7357600080fd5b506104fc610c82366004613940565b60106020526000908152604090205481565b348015610ca057600080fd5b506013546108cd906001600160a01b031681565b348015610cc057600080fd5b506103eb610ccf366004613de3565b612432565b348015610ce057600080fd5b50600d546108cd906001600160a01b031681565b348015610d0057600080fd5b5060195461040d9062010000900460ff1681565b348015610d2057600080fd5b506103eb610d2f366004613ab3565b6128da565b348015610d4057600080fd5b506103eb610d4f366004613acc565b6128f8565b348015610d6057600080fd5b506103eb610d6f366004613e0d565b61291d565b348015610d8057600080fd5b506104fc610d8f366004613e73565b61298d565b348015610da057600080fd5b506103eb610daf366004613940565b6129b8565b348015610dc057600080fd5b506103eb6129e1565b348015610dd557600080fd5b5061040d610de4366004613940565b60126020526000908152604090205460ff1681565b348015610e0557600080fd5b506103eb610e14366004613ab3565b612a19565b348015610e2557600080fd5b506103eb612a37565b348015610e3a57600080fd5b506104fc60008051602061411283398151915281565b348015610e5c57600080fd5b506103eb610e6b366004613940565b612a5c565b348015610e7c57600080fd5b506103eb610e8b3660046139c6565b612ad2565b348015610e9c57600080fd5b5060195461040d906301000000900460ff1681565b60006001600160e01b03198216637965db0b60e01b1480610ee257506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610ef790613e8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2390613e8f565b8015610f705780601f10610f4557610100808354040283529160200191610f70565b820191906000526020600020905b815481529060010190602001808311610f5357829003601f168201915b5050505050905090565b600033610f88818585612c5d565b5060019392505050565b610f9a612d82565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b600080516020614112833981519152610fd681612ddc565b60ff808516600090815260086020526040902060010154600160801b900416156110475760405162461bcd60e51b815260206004820152601960248201527f5468697320566f7465206973207374696c6c206163746976650000000000000060448201526064015b60405180910390fd5b825b826001600160401b0316816001600160401b031610156110c15760ff85166000908152600a602090815260408083206001600160401b0385168452909152902060028101546001909101546110af9130916101009091046001600160a01b031690612de6565b806110b981613edf565b915050611049565b5050505050565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915260ff821660009081526008602052604090819020815160a0810190925280548290829061111f90613e8f565b80601f016020809104026020016040519081016040528092919081815260200182805461114b90613e8f565b80156111985780601f1061116d57610100808354040283529160200191611198565b820191906000526020600020905b81548152906001019060200180831161117b57829003601f168201915b5050509183525050600191909101546001600160401b038082166020840152600160401b82048116604084015260ff600160801b83041615156060840152600160881b9091041660809091015292915050565b6019546301000000900460ff1661123d5760405162461bcd60e51b8152602060048201526016602482015275566f7465206973206e6f742063726561746561626c6560501b604482015260640161103e565b60195460ff166112845760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b604482015260640161103e565b61129c60008051602061411283398151915233611eca565b611399576007543410156112fd5760405162461bcd60e51b815260206004820152602260248201527f596f75206e65656420746f207061792066656520746f2063726561746520766f604482015261746560f01b606482015260840161103e565b3360009081526011602052604090205460025461131e90600a905b9061308c565b8110158061133f575061133f60008051602061411283398151915233611eca565b6113975760405162461bcd60e51b8152602060048201526024808201527f596f75206e65656420746f206861766520313025206f6620746f74616c20737560448201526370706c7960e01b606482015260840161103e565b505b60ff8316600081815260086020908152604091829020600101805460ff60801b196001600160401b03878116600160401b81026001600160801b0319909416918a169182179390931791909116600160801b179092556019805463ff0000001916905583519485529184015282820152517f1d66141808fec33c82bd035e01d0a193ead5ead8504b58ac0bbc032fb22bae909181900360600190a1505050565b60003361144785828561309f565b611452858585612de6565b506001949350505050565b611465612d82565b61147d60008051602061411283398151915282613119565b50565b60008281526006602052604090206001015461149b81612ddc565b6114a5838361311f565b505050565b6000805160206141128339815191526114c281612ddc565b50600e55565b6001600160a01b03811633146115385760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161103e565b61154282826131a5565b5050565b600033610f88818585611559838361298d565b6115639190613f05565b612c5d565b60195460ff16156115ac5760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b604482015260640161103e565b336000908152600f6020526040902060010154600160401b90046001600160401b03164211156116155760405162461bcd60e51b81526020600482015260146024820152732232b837b9b4ba103a34b6b29034b99037bb32b960611b604482015260640161103e565b336000908152600f60205260409020600101546001600160401b03164210156116805760405162461bcd60e51b815260206004820152601960248201527f4465706f7369742074696d65206973206e6f7420737461727400000000000000604482015260640161103e565b336000908152600f60205260409020548111156116df5760405162461bcd60e51b815260206004820152601c60248201527f4465706f73697420616d6f756e74206973206f766572206c696d697400000000604482015260640161103e565b6015546116ec908261320c565b601654101561172c5760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b604482015260640161103e565b60185481101561176b5760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b604482015260640161103e565b600061177c8264e8d4a5100061308c565b600c54909150611797906001600160a01b0316333084613218565b6117a1338361331a565b336000908152601160205260409020546117bb908361320c565b336000908152601160205260409020556014546019546117ff916001600160a01b0316906117fa906103e890611318908790610100900460ff166133d9565b61331a565b60195461184290611821906103e890611318908690610100900460ff166133d9565b6014546001600160a01b03166000908152601160205260409020549061320c565b6014546001600160a01b031660009081526011602052604081209190915560158054849290611872908490613f05565b909155505060405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a25050565b6000805160206141128339815191526118c881612ddc565b50600b80546001600160a01b039092166001600160a01b0319928316811790915560138054909216179055565b61147d33826133e5565b60008051602061411283398151915261191781612ddc565b50600755565b611925612d82565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b60008051602061411283398151915261195f81612ddc565b60195460ff166119a65760405162461bcd60e51b8152602060048201526012602482015271141bdbdb081a5cc81b9bdd0818db1bdcd95960721b604482015260640161103e565b600d546013546001600160a01b03918216916119c5918891168a613517565b6040805160c06020601f8801819004028201810190925260a08101868152600092829190899089908190850183828082843760009201829052509385525050506001600160a01b0380861660208401526040808401899052606084018e905260809093018c9052601354925163c04b8d5960e01b8152939450909291169063c04b8d5990611a57908590600401613f18565b6020604051808303816000875af1158015611a76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9a9190613f70565b9050876001600160a01b03167fdd06b66c3ba8126086cd863137d6f3b86ce5bcf4309cac390cc265e39194d0b282604051611ad791815260200190565b60405180910390a250505050505050505050565b600080516020614112833981519152611b0381612ddc565b6000855111611b455760405162461bcd60e51b815260206004820152600e60248201526d757365727320697320656d70747960901b604482015260640161103e565b6000845111611b8e5760405162461bcd60e51b81526020600482015260156024820152746c696d6974206465706f736974206973207a65726f60581b604482015260640161103e565b6000836001600160401b031611611be75760405162461bcd60e51b815260206004820152601a60248201527f73746172742074696d65206465706f736974206973207a65726f000000000000604482015260640161103e565b6000826001600160401b031611611c405760405162461bcd60e51b815260206004820152601a60248201527f636c6f73652074696d65206465706f736974206973207a65726f000000000000604482015260640161103e565b826001600160401b0316826001600160401b031611611cc75760405162461bcd60e51b815260206004820152603a60248201527f636c6f73652074696d65206465706f736974206d75737420626520677265617460448201527f6572207468616e2073746172742074696d65206465706f736974000000000000606482015260840161103e565b60005b8551811015611da4576040518060600160405280868381518110611cf057611cf0613f89565b60200260200101518152602001856001600160401b03168152602001846001600160401b0316815250600f6000888481518110611d2f57611d2f613f89565b6020908102919091018101516001600160a01b0316825281810192909252604090810160002083518155918301516001909201805493909101516001600160401b03908116600160401b026001600160801b031990941692169190911791909117905580611d9c81613f9f565b915050611cca565b505050505050565b600080516020614112833981519152611dc481612ddc565b506019805460ff19166001179055565b611ddc612d82565b611de66000613610565b565b611df382338361309f565b61154282826133e5565b600860205260009081526040902080548190611e1890613e8f565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4490613e8f565b8015611e915780601f10611e6657610100808354040283529160200191611e91565b820191906000526020600020905b815481529060010190602001808311611e7457829003601f168201915b505050600190930154919250506001600160401b0380821691600160401b810482169160ff600160801b83041691600160881b90041685565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610ef790613e8f565b600080516020614112833981519152611f1c81612ddc565b50600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020614112833981519152611f5781612ddc565b6001600160a01b038216611fad5760405162461bcd60e51b815260206004820152601860248201527f72656365697665722061646472657373206973207a65726f0000000000000000604482015260640161103e565b6001600160a01b03821660009081526012602052604090205460ff166120205760405162461bcd60e51b815260206004820152602260248201527f7265636569766572206973206e6f7420696e766573746d656e74206164647265604482015261737360f01b606482015260840161103e565b6040516370a0823160e01b815230600482015284906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190613f70565b9050848110156120cc5760405162461bcd60e51b815260206004820152600a60248201526909cdee840cadcdeeaced60b31b604482015260640161103e565b60405163095ea7b360e01b8152306004820152602481018690526001600160a01b0383169063095ea7b3906044016020604051808303816000875af1158015612119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213d9190613fb8565b5060405163a9059cbb60e01b81526001600160a01b0385811660048301526024820187905283169063a9059cbb906044016020604051808303816000875af115801561218d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b19190613fb8565b50505050505050565b6000805160206141128339815191526121d281612ddc565b600a8260ff161180156121e957506101908260ff16105b61222e5760405162461bcd60e51b815260206004820152601660248201527514195c98d95b9d08199959481a5cc81a5b9d985b1a5960521b604482015260640161103e565b506019805460ff9092166101000261ff0019909216919091179055565b60003381612259828661298d565b9050838110156122b95760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161103e565b6114528286868403612c5d565b60006122d3338484612de6565b50600192915050565b6122e4612d82565b61147d600080516020614112833981519152826128f8565b60195460ff16156123405760405162461bcd60e51b815260206004820152600e60248201526d141bdbdb081a5cc818db1bdcd95960921b604482015260640161103e565b60155461234d908261320c565b601654101561238d5760405162461bcd60e51b815260206004820152600c60248201526b141bdbdb081a5cc8199d5b1b60a21b604482015260640161103e565b6018548110156123d65760405162461bcd60e51b8152602060048201526014602482015273082dadeeadce840d2e640dcdee840cadcdeeaced60631b604482015260640161103e565b600e5442101561176b5760405162461bcd60e51b815260206004820152602160248201527f506f6f6c206973206e6f74206f70656e207965742c20706c65617365207761696044820152601d60fa1b606482015260840161103e565b60195460ff1661247a5760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8141bdbdb081a5cc818db1bdcd959606a1b604482015260640161103e565b60ff808316600090815260086020526040902060010154600160801b9004166124db5760405162461bcd60e51b8152602060048201526013602482015272151a1a5cc8159bdd19481a5cc818db1bdcd959606a1b604482015260640161103e565b60ff821660009081526009602090815260408083203384529091529020546001600160401b0316156125405760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b604482015260640161103e565b60ff821660009081526009602090815260408083203384529091529020600101541561259f5760405162461bcd60e51b815260206004820152600e60248201526d165bdd481a185d99481d9bdd195960921b604482015260640161103e565b33600081815260116020526040902054906125bb903083611439565b5060ff83166000908152600860205260409020600190810180546011906125f3908490600160881b90046001600160401b0316613fda565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600960008560ff1660ff1681526020019081526020016000206000336001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b031602179055509050506040518060800160405280426001600160401b031681526020018281526020018360ff168152602001336001600160a01b0316815250600a60008560ff1660ff1681526020019081526020016000206000600860008760ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a8154816001600160401b0302191690836001600160401b031602179055506020820151816001015560408201518160020160006101000a81548160ff021916908360ff16021790555060608201518160020160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050336001600160a01b03167f35d237ec79045d79173411929e0c49b6089611517881c6f075c0bec2f32b2073824285600860008960ff1660ff16815260200190815260200160002060010160119054906101000a90046001600160401b03166040516128cd94939291909384526001600160401b03928316602085015260ff91909116604084015216606082015260800190565b60405180910390a2505050565b6000805160206141128339815191526128f281612ddc565b50601655565b60008281526006602052604090206001015461291381612ddc565b6114a583836131a5565b612925612d82565b601894909455601694909455600b80546001600160a01b03199081166001600160a01b0395861690811790925560138054821690921790915560148054821693851693909317909255600c8054909216929093169190911790556001600160401b0316600e55565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6129c0612d82565b6001600160a01b03166000908152601260205260409020805460ff19169055565b6000805160206141128339815191526129f981612ddc565b506019805462ff0000198116620100009182900460ff1615909102179055565b600080516020614112833981519152612a3181612ddc565b50601855565b600080516020614112833981519152612a4f81612ddc565b506019805460ff19169055565b612a64612d82565b6001600160a01b038116612ac95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161103e565b61147d81613610565b600080516020614112833981519152612aea81612ddc565b60ff8216600081815260086020908152604091829020600101805460ff60801b191690556019805463ff0000001916630100000017905590519182527f4329ff635fb60bac41e85195468d8998fac762dabf4ffde9a7cfb9ec0d22d897910160405180910390a15050565b606081600003612b7c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ba65780612b9081613f9f565b9150612b9f9050600a83614017565b9150612b80565b6000816001600160401b03811115612bc057612bc0613b8d565b6040519080825280601f01601f191660200182016040528015612bea576020820181803683370190505b5090505b8415612c5557612bff60018361402b565b9150612c0c600a8661403e565b612c17906030613f05565b60f81b818381518110612c2c57612c2c613f89565b60200101906001600160f81b031916908160001a905350612c4e600a86614017565b9450612bee565b949350505050565b6001600160a01b038316612cbf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161103e565b6001600160a01b038216612d205760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161103e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6005546001600160a01b03163314611de65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161103e565b61147d8133613662565b6001600160a01b038316612e4a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161103e565b6001600160a01b038216612eac5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161103e565b60195462010000900460ff1615612f055760405162461bcd60e51b815260206004820152601960248201527f45524332303a207472616e736665722069732070617573656400000000000000604482015260640161103e565b60008111612f675760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161103e565b6001600160a01b038316600090815260116020526040902054811115612fe65760405162461bcd60e51b815260206004820152602e60248201527f45524332303a20616d6f756e74206d757374206265206c657373206f7220657160448201526d75616c20746f2062616c616e636560901b606482015260840161103e565b6001600160a01b03831660009081526011602052604090205461300990826136c6565b6001600160a01b038085166000908152601160205260408082209390935590841681522054613038908261320c565b6001600160a01b0380841660008181526011602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d759085815260200190565b60006130988284614017565b9392505050565b60006130ab848461298d565b9050600019811461311357818110156131065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161103e565b6131138484848403612c5d565b50505050565b61154282825b6131298282611eca565b6115425760008281526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790556131613390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6131af8282611eca565b156115425760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006130988284613f05565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161327c9190614052565b6000604051808303816000865af19150503d80600081146132b9576040519150601f19603f3d011682016040523d82523d6000602084013e6132be565b606091505b50915091508180156132e85750805115806132e85750808060200190518101906132e89190613fb8565b611da45760405162461bcd60e51b815260206004820152600360248201526229aa2360e91b604482015260640161103e565b6001600160a01b0382166133705760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161103e565b80600260008282546133829190613f05565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6000613098828461406e565b6001600160a01b0382166134455760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161103e565b6001600160a01b038216600090815260208190526040902054818110156134b95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161103e565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b17905291516000928392908716916135739190614052565b6000604051808303816000865af19150503d80600081146135b0576040519150601f19603f3d011682016040523d82523d6000602084013e6135b5565b606091505b50915091508180156135df5750805115806135df5750808060200190518101906135df9190613fb8565b6110c15760405162461bcd60e51b8152602060048201526002602482015261534160f01b604482015260640161103e565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61366c8282611eca565b61154257613684816001600160a01b031660146136d2565b61368f8360206136d2565b6040516020016136a0929190614085565b60408051601f198184030181529082905262461bcd60e51b825261103e916004016138e7565b6000613098828461402b565b606060006136e183600261406e565b6136ec906002613f05565b6001600160401b0381111561370357613703613b8d565b6040519080825280601f01601f19166020018201604052801561372d576020820181803683370190505b509050600360fc1b8160008151811061374857613748613f89565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061377757613777613f89565b60200101906001600160f81b031916908160001a905350600061379b84600261406e565b6137a6906001613f05565b90505b600181111561381e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106137da576137da613f89565b1a60f81b8282815181106137f0576137f0613f89565b60200101906001600160f81b031916908160001a90535060049490941c93613817816140fa565b90506137a9565b5083156130985760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161103e565b60006020828403121561387f57600080fd5b81356001600160e01b03198116811461309857600080fd5b60005b838110156138b257818101518382015260200161389a565b50506000910152565b600081518084526138d3816020860160208601613897565b601f01601f19169290920160200192915050565b60208152600061309860208301846138bb565b80356001600160a01b038116811461391157600080fd5b919050565b6000806040838503121561392957600080fd5b613932836138fa565b946020939093013593505050565b60006020828403121561395257600080fd5b613098826138fa565b803560ff8116811461391157600080fd5b80356001600160401b038116811461391157600080fd5b60008060006060848603121561399857600080fd5b6139a18461395b565b92506139af6020850161396c565b91506139bd6040850161396c565b90509250925092565b6000602082840312156139d857600080fd5b6130988261395b565b602081526000825160a060208401526139fd60c08401826138bb565b905060208401516001600160401b0380821660408601528060408701511660608601526060860151151560808601528060808701511660a086015250508091505092915050565b60008060408385031215613a5757600080fd5b613a608361395b565b9150613a6e602084016138fa565b90509250929050565b600080600060608486031215613a8c57600080fd5b613a95846138fa565b9250613aa3602085016138fa565b9150604084013590509250925092565b600060208284031215613ac557600080fd5b5035919050565b60008060408385031215613adf57600080fd5b82359150613a6e602084016138fa565b60008060008060008060a08789031215613b0857600080fd5b8635955060208701359450613b1f604088016138fa565b935060608701356001600160401b0380821115613b3b57600080fd5b818901915089601f830112613b4f57600080fd5b813581811115613b5e57600080fd5b8a6020828501011115613b7057600080fd5b602083019550809450505050608087013590509295509295509295565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613bcb57613bcb613b8d565b604052919050565b60006001600160401b03821115613bec57613bec613b8d565b5060051b60200190565b600082601f830112613c0757600080fd5b81356020613c1c613c1783613bd3565b613ba3565b82815260059290921b84018101918181019086841115613c3b57600080fd5b8286015b84811015613c565780358352918301918301613c3f565b509695505050505050565b60008060008060808587031215613c7757600080fd5b84356001600160401b0380821115613c8e57600080fd5b818701915087601f830112613ca257600080fd5b81356020613cb2613c1783613bd3565b82815260059290921b8401810191818101908b841115613cd157600080fd5b948201945b83861015613cf657613ce7866138fa565b82529482019490820190613cd6565b98505088013592505080821115613d0c57600080fd5b50613d1987828801613bf6565b935050613d286040860161396c565b9150613d366060860161396c565b905092959194509250565b60008060408385031215613d5457600080fd5b613d5d8361395b565b9150613a6e6020840161396c565b60a081526000613d7e60a08301886138bb565b6001600160401b0396871660208401529486166040830152509115156060830152909216608090920191909152919050565b600080600060608486031215613dc557600080fd5b613dce846138fa565b9250602084013591506139bd604085016138fa565b60008060408385031215613df657600080fd5b613dff8361395b565b9150613a6e6020840161395b565b60008060008060008060c08789031215613e2657600080fd5b8635955060208701359450613e3d604088016138fa565b9350613e4b6060880161396c565b9250613e59608088016138fa565b9150613e6760a088016138fa565b90509295509295509295565b60008060408385031215613e8657600080fd5b613a60836138fa565b600181811c90821680613ea357607f821691505b602082108103613ec357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60006001600160401b03808316818103613efb57613efb613ec9565b6001019392505050565b80820180821115610ee257610ee2613ec9565b602081526000825160a06020840152613f3460c08401826138bb565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b600060208284031215613f8257600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060018201613fb157613fb1613ec9565b5060010190565b600060208284031215613fca57600080fd5b8151801515811461309857600080fd5b6001600160401b03818116838216019080821115613ffa57613ffa613ec9565b5092915050565b634e487b7160e01b600052601260045260246000fd5b60008261402657614026614001565b500490565b81810381811115610ee257610ee2613ec9565b60008261404d5761404d614001565b500690565b60008251614064818460208701613897565b9190910192915050565b8082028115828204841417610ee257610ee2613ec9565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516140bd816017850160208801613897565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516140ee816028840160208801613897565b01602801949350505050565b60008161410957614109613ec9565b50600019019056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a2646970667358221220022dc9696a24cc7666f714a2679da0b16e4ccd7659d7d27acf7719fb9177450b64736f6c63430008120033

Deployed Bytecode Sourcemap

51243:15688:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22084:204;;;;;;;;;;-1:-1:-1;22084:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;22084:204:0;;;;;;;;38795:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41146:201::-;;;;;;;;;;-1:-1:-1;41146:201:0;;;;;:::i;:::-;;:::i;61309:139::-;;;;;;;;;;-1:-1:-1;61309:139:0;;;;;:::i;:::-;;:::i;66052:475::-;;;;;;;;;;-1:-1:-1;66052:475:0;;;;;:::i;:::-;;:::i;62589:119::-;;;;;;;;;;-1:-1:-1;62589:119:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52932:27::-;;;;;;;;;;-1:-1:-1;52932:27:0;;;;;;;;39915:108;;;;;;;;;;-1:-1:-1;40003:12:0;;39915:108;;;3615:25:1;;;3603:2;3588:18;39915:108:0;3469:177:1;63427:998:0;;;;;;:::i;:::-;;:::i;63218:175::-;;;;;;;;;;-1:-1:-1;63218:175:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63355:23:0;;;;;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;63355:30:0;;;;;;;;;;;63348:37;;;;;;;;;-1:-1:-1;;;;;63348:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63218:175;;;;;;;4133:13:1;;-1:-1:-1;;;;;4129:38:1;4111:57;;4224:4;4212:17;;;4206:24;4184:20;;;4177:54;4291:4;4279:17;;;4273:24;4299:4;4269:35;4247:20;;;4240:65;4365:4;4353:17;;;4347:24;-1:-1:-1;;;;;4343:50:1;4321:20;;;4314:80;;;;4098:3;4083:19;;3912:488;60083:295:0;;;;;;;;;;-1:-1:-1;60083:295:0;;;;;:::i;:::-;;:::i;23920:131::-;;;;;;;;;;-1:-1:-1;23920:131:0;;;;;:::i;:::-;23994:7;24021:12;;;:6;:12;;;;;:22;;;;23920:131;62900:108;;;;;;;;;;-1:-1:-1;62900:108:0;;;;;:::i;:::-;;:::i;24361:147::-;;;;;;;;;;-1:-1:-1;24361:147:0;;;;;:::i;:::-;;:::i;39757:93::-;;;;;;;;;;-1:-1:-1;39840:2:0;39757:93;;;5536:4:1;5524:17;;;5506:36;;5494:2;5479:18;39757:93:0;5364:184:1;62187:141:0;;;;;;;;;;-1:-1:-1;62187:141:0;;;;;:::i;:::-;;:::i;25505:218::-;;;;;;;;;;-1:-1:-1;25505:218:0;;;;;:::i;:::-;;:::i;52373:46::-;;;;;;;;;;-1:-1:-1;52373:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52373:46:0;;;;-1:-1:-1;;;52373:46:0;;;;;;;;;5936:25:1;;;-1:-1:-1;;;;;6034:15:1;;;6029:2;6014:18;;6007:43;6086:15;;6066:18;;;6059:43;5924:2;5909:18;52373:46:0;5738:370:1;42631:238:0;;;;;;;;;;-1:-1:-1;42631:238:0;;;;;:::i;:::-;;:::i;56297:1233::-;;;;;;;;;;-1:-1:-1;56297:1233:0;;;;;:::i;:::-;;:::i;66559:211::-;;;;;;;;;;-1:-1:-1;66559:211:0;;;;;:::i;:::-;;:::i;50566:91::-;;;;;;;;;;-1:-1:-1;50566:91:0;;;;;:::i;:::-;;:::i;52317:40::-;;;;;;;;;;;;;;;;62740:117;;;;;;;;;;-1:-1:-1;62740:117:0;;;;;:::i;:::-;;:::i;61685:104::-;;;;;;;;;;-1:-1:-1;61685:104:0;;;;;:::i;:::-;;:::i;58852:844::-;;;;;;;;;;-1:-1:-1;58852:844:0;;;;;:::i;:::-;;:::i;55302:947::-;;;;;;;;;;-1:-1:-1;55302:947:0;;;;;:::i;:::-;;:::i;52875:41::-;;;;;;;;;;;;;;;;52762:53;;;;;;;;;;;;;;;;52626:70;;;;;;;;;;-1:-1:-1;52626:70:0;;;;-1:-1:-1;;;;;52626:70:0;;;;;;-1:-1:-1;;;;;9716:32:1;;;9698:51;;9686:2;9671:18;52626:70:0;9552:203:1;62473:84:0;;;;;;;;;;;;;:::i;51870:63::-;;;;;;;;;;-1:-1:-1;51870:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51870:63:0;;;;;;;;;;;;-1:-1:-1;;;;;51870:63:0;;;;;;;-1:-1:-1;;;;;10003:31:1;;;9985:50;;10066:2;10051:18;;10044:34;;;;10126:4;10114:17;;;10094:18;;;10087:45;;;;-1:-1:-1;;;;;10168:32:1;10163:2;10148:18;;10141:60;9972:3;9957:19;51870:63:0;9760:447:1;51940:67:0;;;;;;;;;;-1:-1:-1;51940:67:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51940:67:0;;;;;;;;;;;;-1:-1:-1;;;;;51940:67:0;;;52712:34;;;;;;;;;;;;;;;;61155:115;;;;;;;;;;-1:-1:-1;61155:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;61246:16:0;61219:7;61246:16;;;:9;:16;;;;;;;61155:115;29649:103;;;;;;;;;;;;;:::i;50976:164::-;;;;;;;;;;-1:-1:-1;50976:164:0;;;;;:::i;:::-;;:::i;51825:38::-;;;;;;;;;;-1:-1:-1;51825:38:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;29001:87::-;;;;;;;;;;-1:-1:-1;29074:6:0;;-1:-1:-1;;;;;29074:6:0;29001:87;;51783:35;;;;;;;;;;;;;;;;52089:88;;;;;;;;;;-1:-1:-1;52089:88:0;;;;-1:-1:-1;;;;;52089:88:0;;;22380:147;;;;;;;;;;-1:-1:-1;22380:147:0;;;;;:::i;:::-;;:::i;39014:104::-;;;;;;;;;;;;;:::i;66807:121::-;;;;;;;;;;-1:-1:-1;66807:121:0;;;;;:::i;:::-;;:::i;52193:70::-;;;;;;;;;;-1:-1:-1;52193:70:0;;;;-1:-1:-1;;;;;52193:70:0;;;54632:630;;;;;;;;;;-1:-1:-1;54632:630:0;;;;;:::i;:::-;;:::i;58575:235::-;;;;;;;;;;-1:-1:-1;58575:235:0;;;;;:::i;:::-;;:::i;21485:49::-;;;;;;;;;;-1:-1:-1;21485:49:0;21530:4;21485:49;;43372:436;;;;;;;;;;-1:-1:-1;43372:436:0;;;;;:::i;:::-;;:::i;59883:192::-;;;;;;;;;;-1:-1:-1;59883:192:0;;;;;:::i;:::-;;:::i;63056:111::-;;;;;;;;;;-1:-1:-1;63056:111:0;;;;;:::i;:::-;;:::i;52831:28::-;;;;;;;;;;-1:-1:-1;52831:28:0;;;;;;;;57578:952;;;;;;;;;;-1:-1:-1;57578:952:0;;;;;:::i;:::-;;:::i;52426:46::-;;;;;;;;;;-1:-1:-1;52426:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;52590:29;;;;;;;;;;-1:-1:-1;52590:29:0;;;;-1:-1:-1;;;;;52590:29:0;;;64688:1307;;;;;;;;;;-1:-1:-1;64688:1307:0;;;;;:::i;:::-;;:::i;52281:27::-;;;;;;;;;;-1:-1:-1;52281:27:0;;;;-1:-1:-1;;;;;52281:27:0;;;53004:34;;;;;;;;;;-1:-1:-1;53004:34:0;;;;;;;;;;;62015:137;;;;;;;;;;-1:-1:-1;62015:137:0;;;;;:::i;:::-;;:::i;24801:149::-;;;;;;;;;;-1:-1:-1;24801:149:0;;;;;:::i;:::-;;:::i;53938:547::-;;;;;;;;;;-1:-1:-1;53938:547:0;;;;;:::i;:::-;;:::i;40675:151::-;;;;;;;;;;-1:-1:-1;40675:151:0;;;;;:::i;:::-;;:::i;61490:159::-;;;;;;;;;;-1:-1:-1;61490:159:0;;;;;:::i;:::-;;:::i;59762:113::-;;;;;;;;;;;;;:::i;52533:50::-;;;;;;;;;;-1:-1:-1;52533:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;61832:149;;;;;;;;;;-1:-1:-1;61832:149:0;;;;;:::i;:::-;;:::i;62358:84::-;;;;;;;;;;;;;:::i;52016:64::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52016:64:0;;29907:201;;;;;;;;;;-1:-1:-1;29907:201:0;;;;;:::i;:::-;;:::i;64454:198::-;;;;;;;;;;-1:-1:-1;64454:198:0;;;;;:::i;:::-;;:::i;53045:33::-;;;;;;;;;;-1:-1:-1;53045:33:0;;;;;;;;;;;22084:204;22169:4;-1:-1:-1;;;;;;22193:47:0;;-1:-1:-1;;;22193:47:0;;:87;;-1:-1:-1;;;;;;;;;;13021:40:0;;;22244:36;22186:94;22084:204;-1:-1:-1;;22084:204:0:o;38795:100::-;38849:13;38882:5;38875:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38795:100;:::o;41146:201::-;41229:4;19373:10;41285:32;19373:10;41301:7;41310:6;41285:8;:32::i;:::-;-1:-1:-1;41335:4:0;;41146:201;-1:-1:-1;;;41146:201:0:o;61309:139::-;28887:13;:11;:13::i;:::-;-1:-1:-1;;;;;61395:38:0::1;;::::0;;;:18:::1;:38;::::0;;;;:45;;-1:-1:-1;;61395:45:0::1;61436:4;61395:45;::::0;;61309:139::o;66052:475::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;66215:22:::1;::::0;;::::1;;::::0;;;:8:::1;:22;::::0;;;;:31:::1;;::::0;-1:-1:-1;;;66215:31:0;::::1;;66214:32;66206:70;;;::::0;-1:-1:-1;;;66206:70:0;;13270:2:1;66206:70:0::1;::::0;::::1;13252:21:1::0;13309:2;13289:18;;;13282:30;13348:27;13328:18;;;13321:55;13393:18;;66206:70:0::1;;;;;;;;;66303:5:::0;66287:233:::1;66314:3;-1:-1:-1::0;;;;;66310:7:0::1;:1;-1:-1:-1::0;;;;;66310:7:0::1;;66287:233;;;66399:28;::::0;::::1;;::::0;;;:14:::1;:28;::::0;;;;;;;-1:-1:-1;;;;;66399:31:0;::::1;::::0;;;;;;;:37:::1;::::0;::::1;::::0;::::1;66455:38:::0;;::::1;::::0;66339:169:::1;::::0;66375:4:::1;::::0;66399:37:::1;::::0;;::::1;-1:-1:-1::0;;;;;66399:37:0::1;::::0;66339:9:::1;:169::i;:::-;66319:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66287:233;;;;66052:475:::0;;;;:::o;62589:119::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62678:22:0;;;;;;;:8;:22;;;;;;;62671:29;;;;;;;;;;;;62678:22;;62671:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;62671:29:0;;;-1:-1:-1;;62671:29:0;;;;;;-1:-1:-1;;;;;62671:29:0;;;;;;;-1:-1:-1;;;62671:29:0;;;;;;;;;-1:-1:-1;;;62671:29:0;;;;;;;;;-1:-1:-1;;;62671:29:0;;;;;;;;;;62589:119;-1:-1:-1;;62589:119:0:o;63427:998::-;63581:14;;;;;;;63573:49;;;;-1:-1:-1;;;63573:49:0;;13970:2:1;63573:49:0;;;13952:21:1;14009:2;13989:18;;;13982:30;-1:-1:-1;;;14028:18:1;;;14021:52;14090:18;;63573:49:0;13768:346:1;63573:49:0;63641:7;;;;63633:38;;;;-1:-1:-1;;;63633:38:0;;14321:2:1;63633:38:0;;;14303:21:1;14360:2;14340:18;;;14333:30;-1:-1:-1;;;14379:18:1;;;14372:48;14437:18;;63633:38:0;14119:342:1;63633:38:0;63686:33;-1:-1:-1;;;;;;;;;;;63708:10:0;63686:7;:33::i;:::-;63682:450;;63783:10;;63770:9;:23;;63744:119;;;;-1:-1:-1;;;63744:119:0;;14668:2:1;63744:119:0;;;14650:21:1;14707:2;14687:18;;;14680:30;14746:34;14726:18;;;14719:62;-1:-1:-1;;;14797:18:1;;;14790:32;14839:19;;63744:119:0;14466:398:1;63744:119:0;63906:10;63878:15;61246:16;;;:9;:16;;;;;;40003:12;;63969:21;;63987:2;;63969:13;:17;;:21::i;:::-;63958:7;:32;;:90;;;;64015:33;-1:-1:-1;;;;;;;;;;;64037:10:0;64015:7;:33::i;:::-;63932:188;;;;-1:-1:-1;;;63932:188:0;;15071:2:1;63932:188:0;;;15053:21:1;15110:2;15090:18;;;15083:30;15149:34;15129:18;;;15122:62;-1:-1:-1;;;15200:18:1;;;15193:34;15244:19;;63932:188:0;14869:400:1;63932:188:0;63729:403;63682:450;64144:22;;;;;;;:8;:22;;;;;;;;;:37;;:55;;-1:-1:-1;;;;;;;;;64210:51:0;;;-1:-1:-1;;;64210:51:0;;-1:-1:-1;;;;;;64210:51:0;;;64144:55;;;64210:51;;;;;;;64272:38;;;;-1:-1:-1;;;64272:38:0;;;;64321:14;:22;;-1:-1:-1;;64321:22:0;;;64361:56;;15468:36:1;;;15557:18;;;15550:43;15609:18;;;15602:43;64361:56:0;;;;;;15456:2:1;64361:56:0;;;63427:998;;;:::o;60083:295::-;60214:4;19373:10;60272:38;60288:4;19373:10;60303:6;60272:15;:38::i;:::-;60321:27;60331:4;60337:2;60341:6;60321:9;:27::i;:::-;-1:-1:-1;60366:4:0;;60083:295;-1:-1:-1;;;;60083:295:0:o;62900:108::-;28887:13;:11;:13::i;:::-;62966:34:::1;-1:-1:-1::0;;;;;;;;;;;62991:8:0::1;62966:10;:34::i;:::-;62900:108:::0;:::o;24361:147::-;23994:7;24021:12;;;:6;:12;;;;;:22;;;21976:16;21987:4;21976:10;:16::i;:::-;24475:25:::1;24486:4;24492:7;24475:10;:25::i;:::-;24361:147:::0;;;:::o;62187:141::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;62292:12:0::1;:28:::0;62187:141::o;25505:218::-;-1:-1:-1;;;;;25601:23:0;;19373:10;25601:23;25593:83;;;;-1:-1:-1;;;25593:83:0;;15858:2:1;25593:83:0;;;15840:21:1;15897:2;15877:18;;;15870:30;15936:34;15916:18;;;15909:62;-1:-1:-1;;;15987:18:1;;;15980:45;16042:19;;25593:83:0;15656:411:1;25593:83:0;25689:26;25701:4;25707:7;25689:11;:26::i;:::-;25505:218;;:::o;42631:238::-;42719:4;19373:10;42775:64;19373:10;42791:7;42828:10;42800:25;19373:10;42791:7;42800:9;:25::i;:::-;:38;;;;:::i;:::-;42775:8;:64::i;56297:1233::-;56359:7;;;;56358:8;56350:35;;;;-1:-1:-1;;;56350:35:0;;16404:2:1;56350:35:0;;;16386:21:1;16443:2;16423:18;;;16416:30;-1:-1:-1;;;16462:18:1;;;16455:44;16516:18;;56350:35:0;16202:338:1;56350:35:0;56447:10;56437:21;;;;:9;:21;;;;;:38;;;-1:-1:-1;;;56437:38:0;;-1:-1:-1;;;;;56437:38:0;56418:15;:57;;56396:127;;;;-1:-1:-1;;;56396:127:0;;16747:2:1;56396:127:0;;;16729:21:1;16786:2;16766:18;;;16759:30;-1:-1:-1;;;16805:18:1;;;16798:50;16865:18;;56396:127:0;16545:344:1;56396:127:0;56585:10;56575:21;;;;:9;:21;;;;;:38;;;-1:-1:-1;;;;;56575:38:0;56556:15;:57;;56534:132;;;;-1:-1:-1;;;56534:132:0;;17096:2:1;56534:132:0;;;17078:21:1;17135:2;17115:18;;;17108:30;17174:27;17154:18;;;17147:55;17219:18;;56534:132:0;16894:349:1;56534:132:0;56709:10;56699:21;;;;:9;:21;;;;;:34;:44;-1:-1:-1;56699:44:0;56677:122;;;;-1:-1:-1;;;56677:122:0;;17450:2:1;56677:122:0;;;17432:21:1;17489:2;17469:18;;;17462:30;17528;17508:18;;;17501:58;17576:18;;56677:122:0;17248:352:1;56677:122:0;56833:15;;:27;;56853:6;56833:19;:27::i;:::-;56818:11;;:42;;56810:67;;;;-1:-1:-1;;;56810:67:0;;17807:2:1;56810:67:0;;;17789:21:1;17846:2;17826:18;;;17819:30;-1:-1:-1;;;17865:18:1;;;17858:42;17917:18;;56810:67:0;17605:336:1;56810:67:0;56906:14;;56896:6;:24;;56888:47;;;;-1:-1:-1;;;56888:47:0;;18148:2:1;56888:47:0;;;18130:21:1;18187:2;18167:18;;;18160:30;-1:-1:-1;;;18206:18:1;;;18199:40;18256:18;;56888:47:0;17946:334:1;56888:47:0;56948:23;56974:20;:6;56985:8;56974:10;:20::i;:::-;57051:10;;56948:46;;-1:-1:-1;57005:150:0;;-1:-1:-1;;;;;57051:10:0;57076;57109:4;56948:46;57005:31;:150::i;:::-;57166:25;57172:10;57184:6;57166:5;:25::i;:::-;57236:10;57226:21;;;;:9;:21;;;;;;:33;;57252:6;57226:25;:33::i;:::-;57212:10;57202:21;;;;:9;:21;;;;;:57;57276:10;;57299;;57270:51;;-1:-1:-1;;;;;57276:10:0;;57288:32;;57315:4;;57288:22;;:6;;57276:10;57299;;;;57288;:22::i;:32::-;57270:5;:51::i;:::-;57407:10;;57356:83;;57396:32;;57423:4;;57396:22;;:6;;57407:10;;;;;57396;:22::i;:32::-;57366:10;;-1:-1:-1;;;;;57366:10:0;57356:21;;;;:9;:21;;;;;;;:25;:83::i;:::-;57342:10;;-1:-1:-1;;;;;57342:10:0;57332:21;;;;:9;:21;;;;;:107;;;;57452:15;:25;;57471:6;;57332:21;57452:25;;57471:6;;57452:25;:::i;:::-;;;;-1:-1:-1;;57495:27:0;;3615:25:1;;;57503:10:0;;57495:27;;3603:2:1;3588:18;57495:27:0;;;;;;;56339:1191;56297:1233;:::o;66559:211::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;66667:19:0::1;:40:::0;;-1:-1:-1;;;;;66667:40:0;;::::1;-1:-1:-1::0;;;;;;66667:40:0;;::::1;::::0;::::1;::::0;;;66718:10:::1;:44:::0;;;;::::1;;::::0;;66559:211::o;50566:91::-;50622:27;19373:10;50642:6;50622:5;:27::i;62740:117::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;62825:10:0::1;:24:::0;62740:117::o;61685:104::-;28887:13;:11;:13::i;:::-;61757:10:::1;:24:::0;;-1:-1:-1;;;;;;61757:24:0::1;-1:-1:-1::0;;;;;61757:24:0;;;::::1;::::0;;;::::1;::::0;;61685:104::o;58852:844::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;59072:7:::1;::::0;::::1;;59064:38;;;::::0;-1:-1:-1;;;59064:38:0;;14321:2:1;59064:38:0::1;::::0;::::1;14303:21:1::0;14360:2;14340:18;;;14333:30;-1:-1:-1;;;14379:18:1;;;14372:48;14437:18;;59064:38:0::1;14119:342:1::0;59064:38:0::1;59137:12;::::0;59207:10:::1;::::0;-1:-1:-1;;;;;59137:12:0;;::::1;::::0;59162:68:::1;::::0;59189:8;;59207:10:::1;59220:9:::0;59162:26:::1;:68::i;:::-;59288:258;::::0;;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;59243:42:::1;::::0;59288:258;;;59356:5;;;;;;59288:258;;59356:5;;;;59288:258;::::1;;::::0;::::1;::::0;;;-1:-1:-1;59288:258:0;;;-1:-1:-1;;;;;;;;59288:258:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;59611:10:::1;::::0;:29;;-1:-1:-1;;;59611:29:0;;59243:303;;-1:-1:-1;59288:258:0;;59611:10;::::1;::::0;:21:::1;::::0;:29:::1;::::0;59243:303;;59611:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59590:50;;59667:8;-1:-1:-1::0;;;;;59658:30:0::1;;59677:10;59658:30;;;;3615:25:1::0;;3603:2;3588:18;;3469:177;59658:30:0::1;;;;;;;;59053:643;;;58852:844:::0;;;;;;;:::o;55302:947::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;55545:1:::1;55529:6;:13;:17;55521:44;;;::::0;-1:-1:-1;;;55521:44:0;;19330:2:1;55521:44:0::1;::::0;::::1;19312:21:1::0;19369:2;19349:18;;;19342:30;-1:-1:-1;;;19388:18:1;;;19381:44;19442:18;;55521:44:0::1;19128:338:1::0;55521:44:0::1;55608:1;55584:14;:21;:25;55576:59;;;::::0;-1:-1:-1;;;55576:59:0;;19673:2:1;55576:59:0::1;::::0;::::1;19655:21:1::0;19712:2;19692:18;;;19685:30;-1:-1:-1;;;19731:18:1;;;19724:51;19792:18;;55576:59:0::1;19471:345:1::0;55576:59:0::1;55674:1;55654:17;-1:-1:-1::0;;;;;55654:21:0::1;;55646:60;;;::::0;-1:-1:-1;;;55646:60:0;;20023:2:1;55646:60:0::1;::::0;::::1;20005:21:1::0;20062:2;20042:18;;;20035:30;20101:28;20081:18;;;20074:56;20147:18;;55646:60:0::1;19821:350:1::0;55646:60:0::1;55745:1;55725:17;-1:-1:-1::0;;;;;55725:21:0::1;;55717:60;;;::::0;-1:-1:-1;;;55717:60:0;;20378:2:1;55717:60:0::1;::::0;::::1;20360:21:1::0;20417:2;20397:18;;;20390:30;20456:28;20436:18;;;20429:56;20502:18;;55717:60:0::1;20176:350:1::0;55717:60:0::1;55830:17;-1:-1:-1::0;;;;;55810:37:0::1;:17;-1:-1:-1::0;;;;;55810:37:0::1;;55788:145;;;::::0;-1:-1:-1;;;55788:145:0;;20733:2:1;55788:145:0::1;::::0;::::1;20715:21:1::0;20772:2;20752:18;;;20745:30;20811:34;20791:18;;;20784:62;20882:28;20862:18;;;20855:56;20928:19;;55788:145:0::1;20531:422:1::0;55788:145:0::1;55949:13;55944:298;55976:6;:13;55968:5;:21;55944:298;;;56042:188;;;;;;;;56085:14;56100:5;56085:21;;;;;;;;:::i;:::-;;;;;;;56042:188;;;;56143:17;-1:-1:-1::0;;;;;56042:188:0::1;;;;;56197:17;-1:-1:-1::0;;;;;56042:188:0::1;;;::::0;56015:9:::1;:24;56025:6;56032:5;56025:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;56015:24:0::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;56015:24:0;:215;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;56015:215:0;;::::1;-1:-1:-1::0;;;56015:215:0::1;-1:-1:-1::0;;;;;;56015:215:0;;;;::::1;::::0;;;;;;;::::1;::::0;;55991:7;::::1;::::0;::::1;:::i;:::-;;;;55944:298;;;;55302:947:::0;;;;;:::o;62473:84::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;62535:7:0::1;:14:::0;;-1:-1:-1;;62535:14:0::1;62545:4;62535:14;::::0;;62473:84::o;29649:103::-;28887:13;:11;:13::i;:::-;29714:30:::1;29741:1;29714:18;:30::i;:::-;29649:103::o:0;50976:164::-;51053:46;51069:7;19373:10;51092:6;51053:15;:46::i;:::-;51110:22;51116:7;51125:6;51110:5;:22::i;51825:38::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51825:38:0;;;;;;;-1:-1:-1;;;;;;;51825:38:0;;;;-1:-1:-1;;;51825:38:0;;;;;;-1:-1:-1;;;51825:38:0;;;;-1:-1:-1;;;51825:38:0;;;;:::o;22380:147::-;22466:4;22490:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;22490:29:0;;;;;;;;;;;;;;;22380:147::o;39014:104::-;39070:13;39103:7;39096:14;;;;;:::i;66807:121::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;66892:12:0::1;:28:::0;;-1:-1:-1;;;;;;66892:28:0::1;-1:-1:-1::0;;;;;66892:28:0;;;::::1;::::0;;;::::1;::::0;;66807:121::o;54632:630::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;;;;;54807:23:0;::::1;54799:60;;;::::0;-1:-1:-1;;;54799:60:0;;21432:2:1;54799:60:0::1;::::0;::::1;21414:21:1::0;21471:2;21451:18;;;21444:30;21510:26;21490:18;;;21483:54;21554:18;;54799:60:0::1;21230:348:1::0;54799:60:0::1;-1:-1:-1::0;;;;;54892:29:0;::::1;;::::0;;;:18:::1;:29;::::0;;;;;::::1;;54870:113;;;::::0;-1:-1:-1;;;54870:113:0;;21785:2:1;54870:113:0::1;::::0;::::1;21767:21:1::0;21824:2;21804:18;;;21797:30;21863:34;21843:18;;;21836:62;-1:-1:-1;;;21914:18:1;;;21907:32;21956:19;;54870:113:0::1;21583:398:1::0;54870:113:0::1;55064:34;::::0;-1:-1:-1;;;55064:34:0;;55092:4:::1;55064:34;::::0;::::1;9698:51:1::0;55020:13:0;;54994:16:::1;::::0;-1:-1:-1;;;;;55064:19:0;::::1;::::0;::::1;::::0;9671:18:1;;55064:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55045:53;;55129:7;55117:8;:19;;55109:42;;;::::0;-1:-1:-1;;;55109:42:0;;18148:2:1;55109:42:0::1;::::0;::::1;18130:21:1::0;18187:2;18167:18;;;18160:30;-1:-1:-1;;;18206:18:1;;;18199:40;18256:18;;55109:42:0::1;17946:334:1::0;55109:42:0::1;55164:41;::::0;-1:-1:-1;;;55164:41:0;;55190:4:::1;55164:41;::::0;::::1;22160:51:1::0;22227:18;;;22220:34;;;-1:-1:-1;;;;;55164:17:0;::::1;::::0;::::1;::::0;22133:18:1;;55164:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;55216:38:0::1;::::0;-1:-1:-1;;;55216:38:0;;-1:-1:-1;;;;;22178:32:1;;;55216:38:0::1;::::0;::::1;22160:51:1::0;22227:18;;;22220:34;;;55216:18:0;::::1;::::0;::::1;::::0;22133::1;;55216:38:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54788:474;;54632:630:::0;;;;:::o;58575:235::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;58694:2:::1;58680:11;:16;;;:37;;;;;58714:3;58700:11;:17;;;58680:37;58658:109;;;::::0;-1:-1:-1;;;58658:109:0;;22749:2:1;58658:109:0::1;::::0;::::1;22731:21:1::0;22788:2;22768:18;;;22761:30;-1:-1:-1;;;22807:18:1;;;22800:52;22869:18;;58658:109:0::1;22547:346:1::0;58658:109:0::1;-1:-1:-1::0;58778:10:0::1;:24:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;58778:24:0;;::::1;::::0;;;::::1;::::0;;58575:235::o;43372:436::-;43465:4;19373:10;43465:4;43548:25;19373:10;43565:7;43548:9;:25::i;:::-;43521:52;;43612:15;43592:16;:35;;43584:85;;;;-1:-1:-1;;;43584:85:0;;23100:2:1;43584:85:0;;;23082:21:1;23139:2;23119:18;;;23112:30;23178:34;23158:18;;;23151:62;-1:-1:-1;;;23229:18:1;;;23222:35;23274:19;;43584:85:0;22898:401:1;43584:85:0;43705:60;43714:5;43721:7;43749:15;43730:16;:34;43705:8;:60::i;59883:192::-;59986:4;60003:42;19373:10;60027:9;60038:6;60003:9;:42::i;:::-;-1:-1:-1;60063:4:0;59883:192;;;;:::o;63056:111::-;28887:13;:11;:13::i;:::-;63125:34:::1;-1:-1:-1::0;;;;;;;;;;;63150:8:0::1;63125:10;:34::i;57578:952::-:0;57638:7;;;;57637:8;57629:35;;;;-1:-1:-1;;;57629:35:0;;16404:2:1;57629:35:0;;;16386:21:1;16443:2;16423:18;;;16416:30;-1:-1:-1;;;16462:18:1;;;16455:44;16516:18;;57629:35:0;16202:338:1;57629:35:0;57698:15;;:27;;57718:6;57698:19;:27::i;:::-;57683:11;;:42;;57675:67;;;;-1:-1:-1;;;57675:67:0;;17807:2:1;57675:67:0;;;17789:21:1;17846:2;17826:18;;;17819:30;-1:-1:-1;;;17865:18:1;;;17858:42;17917:18;;57675:67:0;17605:336:1;57675:67:0;57771:14;;57761:6;:24;;57753:57;;;;-1:-1:-1;;;57753:57:0;;23506:2:1;57753:57:0;;;23488:21:1;23545:2;23525:18;;;23518:30;-1:-1:-1;;;23564:18:1;;;23557:50;23624:18;;57753:57:0;23304:344:1;57753:57:0;57862:12;;57843:15;:31;;57821:114;;;;-1:-1:-1;;;57821:114:0;;23855:2:1;57821:114:0;;;23837:21:1;23894:2;23874:18;;;23867:30;23933:34;23913:18;;;23906:62;-1:-1:-1;;;23984:18:1;;;23977:31;24025:19;;57821:114:0;23653:397:1;64688:1307:0;64767:7;;;;64759:39;;;;-1:-1:-1;;;64759:39:0;;24257:2:1;64759:39:0;;;24239:21:1;24296:2;24276:18;;;24269:30;-1:-1:-1;;;24315:18:1;;;24308:49;24374:18;;64759:39:0;24055:343:1;64759:39:0;64817:22;;;;;;;;:8;:22;;;;;:31;;;-1:-1:-1;;;64817:31:0;;;64809:63;;;;-1:-1:-1;;;64809:63:0;;24605:2:1;64809:63:0;;;24587:21:1;24644:2;24624:18;;;24617:30;-1:-1:-1;;;24663:18:1;;;24656:49;24722:18;;64809:63:0;24403:343:1;64809:63:0;64905:23;;;;;;;:9;:23;;;;;;;;64929:10;64905:35;;;;;;;:45;-1:-1:-1;;;;;64905:45:0;:50;64883:114;;;;-1:-1:-1;;;64883:114:0;;24953:2:1;64883:114:0;;;24935:21:1;24992:2;24972:18;;;24965:30;-1:-1:-1;;;25011:18:1;;;25004:44;25065:18;;64883:114:0;24751:338:1;64883:114:0;65030:23;;;;;;;:9;:23;;;;;;;;65054:10;65030:35;;;;;;;:42;;;:47;65008:111;;;;-1:-1:-1;;;65008:111:0;;24953:2:1;65008:111:0;;;24935:21:1;24992:2;24972:18;;;24965:30;-1:-1:-1;;;25011:18:1;;;25004:44;25065:18;;65008:111:0;24751:338:1;65008:111:0;65165:10;65130:22;61246:16;;;:9;:16;;;;;;;65189:55;;65222:4;61246:16;65189:12;:55::i;:::-;-1:-1:-1;65255:22:0;;;;;;;:8;:22;;;;;65291:1;65255:32;;;:37;;:32;;:37;;65291:1;;-1:-1:-1;;;65255:37:0;;-1:-1:-1;;;;;65255:37:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;65255:37:0;;;;;-1:-1:-1;;;;;65255:37:0;;;;;;65343:173;;;;;;;;65422:15;-1:-1:-1;;;;;65343:173:0;;;;;65375:14;65343:173;;;;65463:9;65343:173;;;;;;65494:10;-1:-1:-1;;;;;65343:173:0;;;;65305:9;:23;65315:12;65305:23;;;;;;;;;;;;;;;:35;65329:10;-1:-1:-1;;;;;65305:35:0;-1:-1:-1;;;;;65305:35:0;;;;;;;;;;;;:211;;;;;;;;;;;;;-1:-1:-1;;;;;65305:211:0;;;;;-1:-1:-1;;;;;65305:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65305:211:0;;;;;-1:-1:-1;;;;;65305:211:0;;;;;;;;;65616:173;;;;;;;;65695:15;-1:-1:-1;;;;;65616:173:0;;;;;65648:14;65616:173;;;;65736:9;65616:173;;;;;;65767:10;-1:-1:-1;;;;;65616:173:0;;;;65527:14;:28;65542:12;65527:28;;;;;;;;;;;;;;;:86;65570:8;:22;65579:12;65570:22;;;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;65570:32:0;-1:-1:-1;;;;;65527:86:0;-1:-1:-1;;;;;65527:86:0;;;;;;;;;;;;:262;;;;;;;;;;;;;-1:-1:-1;;;;;65527:262:0;;;;;-1:-1:-1;;;;;65527:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65527:262:0;;;;;-1:-1:-1;;;;;65527:262:0;;;;;;;;;65828:10;-1:-1:-1;;;;;65807:180:0;;65853:14;65889:15;65920:9;65944:8;:22;65953:12;65944:22;;;;;;;;;;;;;;;:32;;;;;;;;;;-1:-1:-1;;;;;65944:32:0;65807:180;;;;;;;;25502:25:1;;;-1:-1:-1;;;;;25600:15:1;;;25595:2;25580:18;;25573:43;25664:4;25652:17;;;;25647:2;25632:18;;25625:45;25706:15;25701:2;25686:18;;25679:43;25489:3;25474:19;;25279:449;65807:180:0;;;;;;;;64748:1247;64688:1307;;:::o;62015:137::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;62118:11:0::1;:26:::0;62015:137::o;24801:149::-;23994:7;24021:12;;;:6;:12;;;;;:22;;;21976:16;21987:4;21976:10;:16::i;:::-;24916:26:::1;24928:4;24934:7;24916:11;:26::i;53938:547::-:0;28887:13;:11;:13::i;:::-;54190:14:::1;:32:::0;;;;54233:11:::1;:28:::0;;;;54272:19:::1;:40:::0;;-1:-1:-1;;;;;;54272:40:0;;::::1;-1:-1:-1::0;;;;;54272:40:0;;::::1;::::0;;::::1;::::0;;;54323:10:::1;:45:::0;;;::::1;::::0;;::::1;::::0;;;54379:10:::1;:24:::0;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;54414:10:::1;:24:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;54449:28:0::1;:12;:28:::0;53938:547::o;40675:151::-;-1:-1:-1;;;;;40791:18:0;;;40764:7;40791:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;40675:151::o;61490:159::-;28887:13;:11;:13::i;:::-;-1:-1:-1;;;;;61595:38:0::1;61636:5;61595:38:::0;;;:18:::1;:38;::::0;;;;:46;;-1:-1:-1;;61595:46:0::1;::::0;;61490:159::o;59762:113::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;59853:14:0::1;::::0;;-1:-1:-1;;59835:32:0;::::1;59853:14:::0;;;;::::1;;;59852:15;59835:32:::0;;::::1;;::::0;;59762:113::o;61832:149::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;61941:14:0::1;:32:::0;61832:149::o;62358:84::-;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;-1:-1:-1;62419:7:0::1;:15:::0;;-1:-1:-1;;62419:15:0::1;::::0;;62358:84::o;29907:201::-;28887:13;:11;:13::i;:::-;-1:-1:-1;;;;;29996:22:0;::::1;29988:73;;;::::0;-1:-1:-1;;;29988:73:0;;25935:2:1;29988:73:0::1;::::0;::::1;25917:21:1::0;25974:2;25954:18;;;25947:30;26013:34;25993:18;;;25986:62;-1:-1:-1;;;26064:18:1;;;26057:36;26110:19;;29988:73:0::1;25733:402:1::0;29988:73:0::1;30072:28;30091:8;30072:18;:28::i;64454:198::-:0;-1:-1:-1;;;;;;;;;;;21976:16:0;21987:4;21976:10;:16::i;:::-;64534:22:::1;::::0;::::1;64568:5;64534:22:::0;;;:8:::1;:22;::::0;;;;;;;;:31:::1;;:39:::0;;-1:-1:-1;;;;64534:39:0::1;::::0;;64584:14:::1;:21:::0;;-1:-1:-1;;64584:21:0::1;::::0;::::1;::::0;;64621:23;;5506:36:1;;;64621:23:0::1;::::0;5479:18:1;64621:23:0::1;;;;;;;64454:198:::0;;:::o;13506:723::-;13562:13;13783:5;13792:1;13783:10;13779:53;;-1:-1:-1;;13810:10:0;;;;;;;;;;;;-1:-1:-1;;;13810:10:0;;;;;13506:723::o;13779:53::-;13857:5;13842:12;13898:78;13905:9;;13898:78;;13931:8;;;;:::i;:::-;;-1:-1:-1;13954:10:0;;-1:-1:-1;13962:2:0;13954:10;;:::i;:::-;;;13898:78;;;13986:19;14018:6;-1:-1:-1;;;;;14008:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14008:17:0;;13986:39;;14036:154;14043:10;;14036:154;;14070:11;14080:1;14070:11;;:::i;:::-;;-1:-1:-1;14139:10:0;14147:2;14139:5;:10;:::i;:::-;14126:24;;:2;:24;:::i;:::-;14113:39;;14096:6;14103;14096:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;14096:56:0;;;;;;;;-1:-1:-1;14167:11:0;14176:2;14167:11;;:::i;:::-;;;14036:154;;;14214:6;13506:723;-1:-1:-1;;;;13506:723:0:o;47399:380::-;-1:-1:-1;;;;;47535:19:0;;47527:68;;;;-1:-1:-1;;;47527:68:0;;26849:2:1;47527:68:0;;;26831:21:1;26888:2;26868:18;;;26861:30;26927:34;26907:18;;;26900:62;-1:-1:-1;;;26978:18:1;;;26971:34;27022:19;;47527:68:0;26647:400:1;47527:68:0;-1:-1:-1;;;;;47614:21:0;;47606:68;;;;-1:-1:-1;;;47606:68:0;;27254:2:1;47606:68:0;;;27236:21:1;27293:2;27273:18;;;27266:30;27332:34;27312:18;;;27305:62;-1:-1:-1;;;27383:18:1;;;27376:32;27425:19;;47606:68:0;27052:398:1;47606:68:0;-1:-1:-1;;;;;47687:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;47739:32;;3615:25:1;;;47739:32:0;;3588:18:1;47739:32:0;;;;;;;;47399:380;;;:::o;29166:132::-;29074:6;;-1:-1:-1;;;;;29074:6:0;19373:10;29230:23;29222:68;;;;-1:-1:-1;;;29222:68:0;;27657:2:1;29222:68:0;;;27639:21:1;;;27676:18;;;27669:30;27735:34;27715:18;;;27708:62;27787:18;;29222:68:0;27455:356:1;22831:105:0;22898:30;22909:4;19373:10;22898;:30::i;60386:761::-;-1:-1:-1;;;;;60535:20:0;;60527:70;;;;-1:-1:-1;;;60527:70:0;;28018:2:1;60527:70:0;;;28000:21:1;28057:2;28037:18;;;28030:30;28096:34;28076:18;;;28069:62;-1:-1:-1;;;28147:18:1;;;28140:35;28192:19;;60527:70:0;27816:401:1;60527:70:0;-1:-1:-1;;;;;60616:23:0;;60608:71;;;;-1:-1:-1;;;60608:71:0;;28424:2:1;60608:71:0;;;28406:21:1;28463:2;28443:18;;;28436:30;28502:34;28482:18;;;28475:62;-1:-1:-1;;;28553:18:1;;;28546:33;28596:19;;60608:71:0;28222:399:1;60608:71:0;60698:14;;;;;;;:23;60690:61;;;;-1:-1:-1;;;60690:61:0;;28828:2:1;60690:61:0;;;28810:21:1;28867:2;28847:18;;;28840:30;28906:27;28886:18;;;28879:55;28951:18;;60690:61:0;28626:349:1;60690:61:0;60779:1;60770:6;:10;60762:64;;;;-1:-1:-1;;;60762:64:0;;29182:2:1;60762:64:0;;;29164:21:1;29221:2;29201:18;;;29194:30;29260:34;29240:18;;;29233:62;-1:-1:-1;;;29311:18:1;;;29304:39;29360:19;;60762:64:0;28980:405:1;60762:64:0;-1:-1:-1;;;;;60869:17:0;;;;;;:9;:17;;;;;;60859:27;;;60837:123;;;;-1:-1:-1;;;60837:123:0;;29592:2:1;60837:123:0;;;29574:21:1;29631:2;29611:18;;;29604:30;29670:34;29650:18;;;29643:62;-1:-1:-1;;;29721:18:1;;;29714:44;29775:19;;60837:123:0;29390:410:1;60837:123:0;-1:-1:-1;;;;;60993:17:0;;;;;;:9;:17;;;;;;:29;;61015:6;60993:21;:29::i;:::-;-1:-1:-1;;;;;60973:17:0;;;;;;;:9;:17;;;;;;:49;;;;61056:20;;;;;;;:32;;61081:6;61056:24;:32::i;:::-;-1:-1:-1;;;;;61033:20:0;;;;;;;:9;:20;;;;;;;:55;;;;61104:35;;;;;;;;;;61132:6;3615:25:1;;3603:2;3588:18;;3469:177;8102:98:0;8160:7;8187:5;8191:1;8187;:5;:::i;:::-;8180:12;8102:98;-1:-1:-1;;;8102:98:0:o;48070:453::-;48205:24;48232:25;48242:5;48249:7;48232:9;:25::i;:::-;48205:52;;-1:-1:-1;;48272:16:0;:37;48268:248;;48354:6;48334:16;:26;;48326:68;;;;-1:-1:-1;;;48326:68:0;;30007:2:1;48326:68:0;;;29989:21:1;30046:2;30026:18;;;30019:30;30085:31;30065:18;;;30058:59;30134:18;;48326:68:0;29805:353:1;48326:68:0;48438:51;48447:5;48454:7;48482:6;48463:16;:25;48438:8;:51::i;:::-;48194:329;48070:453;;;:::o;26430:112::-;26509:25;26520:4;26526:7;27102:238;27186:22;27194:4;27200:7;27186;:22::i;:::-;27181:152;;27225:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27225:29:0;;;;;;;;;:36;;-1:-1:-1;;27225:36:0;27257:4;27225:36;;;27308:12;19373:10;;19293:98;27308:12;-1:-1:-1;;;;;27281:40:0;27299:7;-1:-1:-1;;;;;27281:40:0;27293:4;27281:40;;;;;;;;;;27102:238;;:::o;27520:239::-;27604:22;27612:4;27618:7;27604;:22::i;:::-;27600:152;;;27675:5;27643:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27643:29:0;;;;;;;;;;:37;;-1:-1:-1;;27643:37:0;;;27700:40;19373:10;;27643:12;;27700:40;;27675:5;27700:40;27520:239;;:::o;6965:98::-;7023:7;7050:5;7054:1;7050;:5;:::i;33889:367::-;34094:69;;;-1:-1:-1;;;;;30421:15:1;;;34094:69:0;;;30403:34:1;30473:15;;;30453:18;;;30446:43;30505:18;;;;30498:34;;;34094:69:0;;;;;;;;;;30338:18:1;;;;34094:69:0;;;;;;;-1:-1:-1;;;;;34094:69:0;-1:-1:-1;;;34094:69:0;;;34083:81;;-1:-1:-1;;;;34083:10:0;;;;:81;;34094:69;34083:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34034:130;;;;34183:7;:57;;;;-1:-1:-1;34195:11:0;;:16;;:44;;;34226:4;34215:24;;;;;;;;;;;;:::i;:::-;34175:73;;;;-1:-1:-1;;;34175:73:0;;31037:2:1;34175:73:0;;;31019:21:1;31076:1;31056:18;;;31049:29;-1:-1:-1;;;31094:18:1;;;31087:33;31137:18;;34175:73:0;30835:326:1;45405:548:0;-1:-1:-1;;;;;45489:21:0;;45481:65;;;;-1:-1:-1;;;45481:65:0;;31368:2:1;45481:65:0;;;31350:21:1;31407:2;31387:18;;;31380:30;31446:33;31426:18;;;31419:61;31497:18;;45481:65:0;31166:355:1;45481:65:0;45637:6;45621:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;45792:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;45847:37;3615:25:1;;;45847:37:0;;3588:18:1;45847:37:0;;;;;;;25505:218;;:::o;7703:98::-;7761:7;7788:5;7792:1;7788;:5;:::i;46286:675::-;-1:-1:-1;;;;;46370:21:0;;46362:67;;;;-1:-1:-1;;;46362:67:0;;31901:2:1;46362:67:0;;;31883:21:1;31940:2;31920:18;;;31913:30;31979:34;31959:18;;;31952:62;-1:-1:-1;;;32030:18:1;;;32023:31;32071:19;;46362:67:0;31699:397:1;46362:67:0;-1:-1:-1;;;;;46529:18:0;;46504:22;46529:18;;;;;;;;;;;46566:24;;;;46558:71;;;;-1:-1:-1;;;46558:71:0;;32303:2:1;46558:71:0;;;32285:21:1;32342:2;32322:18;;;32315:30;32381:34;32361:18;;;32354:62;-1:-1:-1;;;32432:18:1;;;32425:32;32474:19;;46558:71:0;32101:398:1;46558:71:0;-1:-1:-1;;;;;46665:18:0;;:9;:18;;;;;;;;;;;46686:23;;;46665:44;;46804:12;:22;;;;;;;46855:37;3615:25:1;;;46665:9:0;;:18;46855:37;;3588:18:1;46855:37:0;;;;;;;24361:147;;;:::o;35231:314::-;35395:58;;;-1:-1:-1;;;;;22178:32:1;;;35395:58:0;;;22160:51:1;22227:18;;;;22220:34;;;35395:58:0;;;;;;;;;;22133:18:1;;;;35395:58:0;;;;;;;-1:-1:-1;;;;;35395:58:0;-1:-1:-1;;;35395:58:0;;;35384:70;;-1:-1:-1;;;;35384:10:0;;;;:70;;35395:58;35384:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35348:106;;;;35473:7;:57;;;;-1:-1:-1;35485:11:0;;:16;;:44;;;35516:4;35505:24;;;;;;;;;;;;:::i;:::-;35465:72;;;;-1:-1:-1;;;35465:72:0;;32706:2:1;35465:72:0;;;32688:21:1;32745:1;32725:18;;;32718:29;-1:-1:-1;;;32763:18:1;;;32756:32;32805:18;;35465:72:0;32504:325:1;30268:191:0;30361:6;;;-1:-1:-1;;;;;30378:17:0;;;-1:-1:-1;;;;;;30378:17:0;;;;;;;30411:40;;30361:6;;;30378:17;30361:6;;30411:40;;30342:16;;30411:40;30331:128;30268:191;:::o;23226:505::-;23315:22;23323:4;23329:7;23315;:22::i;:::-;23310:414;;23503:41;23531:7;-1:-1:-1;;;;;23503:41:0;23541:2;23503:19;:41::i;:::-;23617:38;23645:4;23652:2;23617:19;:38::i;:::-;23408:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23408:270:0;;;;;;;;;;-1:-1:-1;;;23354:358:0;;;;;;;:::i;7346:98::-;7404:7;7431:5;7435:1;7431;:5;:::i;14807:451::-;14882:13;14908:19;14940:10;14944:6;14940:1;:10;:::i;:::-;:14;;14953:1;14940:14;:::i;:::-;-1:-1:-1;;;;;14930:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14930:25:0;;14908:47;;-1:-1:-1;;;14966:6:0;14973:1;14966:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;14966:15:0;;;;;;;;;-1:-1:-1;;;14992:6:0;14999:1;14992:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;14992:15:0;;;;;;;;-1:-1:-1;15023:9:0;15035:10;15039:6;15035:1;:10;:::i;:::-;:14;;15048:1;15035:14;:::i;:::-;15023:26;;15018:135;15055:1;15051;:5;15018:135;;;-1:-1:-1;;;15103:5:0;15111:3;15103:11;15090:25;;;;;;;:::i;:::-;;;;15078:6;15085:1;15078:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;15078:37:0;;;;;;;;-1:-1:-1;15140:1:0;15130:11;;;;;15058:3;;;:::i;:::-;;;15018:135;;;-1:-1:-1;15171:10:0;;15163:55;;;;-1:-1:-1;;;15163:55:0;;33994:2:1;15163:55:0;;;33976:21:1;;;34013:18;;;34006:30;34072:34;34052:18;;;34045:62;34124:18;;15163:55:0;33792:356:1;14:286;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:271::-;794:3;832:5;826:12;859:6;854:3;847:19;875:76;944:6;937:4;932:3;928:14;921:4;914:5;910:16;875:76;:::i;:::-;1005:2;984:15;-1:-1:-1;;980:29:1;971:39;;;;1012:4;967:50;;752:271;-1:-1:-1;;752:271:1:o;1028:220::-;1177:2;1166:9;1159:21;1140:4;1197:45;1238:2;1227:9;1223:18;1215:6;1197:45;:::i;1253:173::-;1321:20;;-1:-1:-1;;;;;1370:31:1;;1360:42;;1350:70;;1416:1;1413;1406:12;1350:70;1253:173;;;:::o;1431:254::-;1499:6;1507;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;1599:29;1618:9;1599:29;:::i;:::-;1589:39;1675:2;1660:18;;;;1647:32;;-1:-1:-1;;;1431:254:1:o;1690:186::-;1749:6;1802:2;1790:9;1781:7;1777:23;1773:32;1770:52;;;1818:1;1815;1808:12;1770:52;1841:29;1860:9;1841:29;:::i;1881:156::-;1947:20;;2007:4;1996:16;;1986:27;;1976:55;;2027:1;2024;2017:12;2042:171;2109:20;;-1:-1:-1;;;;;2158:30:1;;2148:41;;2138:69;;2203:1;2200;2193:12;2218:326;2291:6;2299;2307;2360:2;2348:9;2339:7;2335:23;2331:32;2328:52;;;2376:1;2373;2366:12;2328:52;2399:27;2416:9;2399:27;:::i;:::-;2389:37;;2445;2478:2;2467:9;2463:18;2445:37;:::i;:::-;2435:47;;2501:37;2534:2;2523:9;2519:18;2501:37;:::i;:::-;2491:47;;2218:326;;;;;:::o;2549:182::-;2606:6;2659:2;2647:9;2638:7;2634:23;2630:32;2627:52;;;2675:1;2672;2665:12;2627:52;2698:27;2715:9;2698:27;:::i;2736:728::-;2909:2;2898:9;2891:21;2872:4;2947:6;2941:13;2990:4;2985:2;2974:9;2970:18;2963:32;3018:52;3065:3;3054:9;3050:19;3036:12;3018:52;:::i;:::-;3004:66;;3119:2;3111:6;3107:15;3101:22;-1:-1:-1;;;;;3216:2:1;3200:14;3196:23;3191:2;3180:9;3176:18;3169:51;3284:2;3278;3270:6;3266:15;3260:22;3256:31;3251:2;3240:9;3236:18;3229:59;3357:2;3349:6;3345:15;3339:22;3332:30;3325:38;3319:3;3308:9;3304:19;3297:67;3431:2;3424:3;3416:6;3412:16;3406:23;3402:32;3395:4;3384:9;3380:20;3373:62;;;3452:6;3444:14;;;2736:728;;;;:::o;3651:256::-;3717:6;3725;3778:2;3766:9;3757:7;3753:23;3749:32;3746:52;;;3794:1;3791;3784:12;3746:52;3817:27;3834:9;3817:27;:::i;:::-;3807:37;;3863:38;3897:2;3886:9;3882:18;3863:38;:::i;:::-;3853:48;;3651:256;;;;;:::o;4405:328::-;4482:6;4490;4498;4551:2;4539:9;4530:7;4526:23;4522:32;4519:52;;;4567:1;4564;4557:12;4519:52;4590:29;4609:9;4590:29;:::i;:::-;4580:39;;4638:38;4672:2;4661:9;4657:18;4638:38;:::i;:::-;4628:48;;4723:2;4712:9;4708:18;4695:32;4685:42;;4405:328;;;;;:::o;4738:180::-;4797:6;4850:2;4838:9;4829:7;4825:23;4821:32;4818:52;;;4866:1;4863;4856:12;4818:52;-1:-1:-1;4889:23:1;;4738:180;-1:-1:-1;4738:180:1:o;5105:254::-;5173:6;5181;5234:2;5222:9;5213:7;5209:23;5205:32;5202:52;;;5250:1;5247;5240:12;5202:52;5286:9;5273:23;5263:33;;5315:38;5349:2;5338:9;5334:18;5315:38;:::i;6113:871::-;6219:6;6227;6235;6243;6251;6259;6312:3;6300:9;6291:7;6287:23;6283:33;6280:53;;;6329:1;6326;6319:12;6280:53;6365:9;6352:23;6342:33;;6422:2;6411:9;6407:18;6394:32;6384:42;;6445:38;6479:2;6468:9;6464:18;6445:38;:::i;:::-;6435:48;;6534:2;6523:9;6519:18;6506:32;-1:-1:-1;;;;;6598:2:1;6590:6;6587:14;6584:34;;;6614:1;6611;6604:12;6584:34;6652:6;6641:9;6637:22;6627:32;;6697:7;6690:4;6686:2;6682:13;6678:27;6668:55;;6719:1;6716;6709:12;6668:55;6759:2;6746:16;6785:2;6777:6;6774:14;6771:34;;;6801:1;6798;6791:12;6771:34;6846:7;6841:2;6832:6;6828:2;6824:15;6820:24;6817:37;6814:57;;;6867:1;6864;6857:12;6814:57;6898:2;6894;6890:11;6880:21;;6920:6;6910:16;;;;;6973:3;6962:9;6958:19;6945:33;6935:43;;6113:871;;;;;;;;:::o;6989:127::-;7050:10;7045:3;7041:20;7038:1;7031:31;7081:4;7078:1;7071:15;7105:4;7102:1;7095:15;7121:275;7192:2;7186:9;7257:2;7238:13;;-1:-1:-1;;7234:27:1;7222:40;;-1:-1:-1;;;;;7277:34:1;;7313:22;;;7274:62;7271:88;;;7339:18;;:::i;:::-;7375:2;7368:22;7121:275;;-1:-1:-1;7121:275:1:o;7401:183::-;7461:4;-1:-1:-1;;;;;7486:6:1;7483:30;7480:56;;;7516:18;;:::i;:::-;-1:-1:-1;7561:1:1;7557:14;7573:4;7553:25;;7401:183::o;7589:662::-;7643:5;7696:3;7689:4;7681:6;7677:17;7673:27;7663:55;;7714:1;7711;7704:12;7663:55;7750:6;7737:20;7776:4;7800:60;7816:43;7856:2;7816:43;:::i;:::-;7800:60;:::i;:::-;7894:15;;;7980:1;7976:10;;;;7964:23;;7960:32;;;7925:12;;;;8004:15;;;8001:35;;;8032:1;8029;8022:12;8001:35;8068:2;8060:6;8056:15;8080:142;8096:6;8091:3;8088:15;8080:142;;;8162:17;;8150:30;;8200:12;;;;8113;;8080:142;;;-1:-1:-1;8240:5:1;7589:662;-1:-1:-1;;;;;;7589:662:1:o;8256:1291::-;8390:6;8398;8406;8414;8467:3;8455:9;8446:7;8442:23;8438:33;8435:53;;;8484:1;8481;8474:12;8435:53;8524:9;8511:23;-1:-1:-1;;;;;8594:2:1;8586:6;8583:14;8580:34;;;8610:1;8607;8600:12;8580:34;8648:6;8637:9;8633:22;8623:32;;8693:7;8686:4;8682:2;8678:13;8674:27;8664:55;;8715:1;8712;8705:12;8664:55;8751:2;8738:16;8773:4;8797:60;8813:43;8853:2;8813:43;:::i;8797:60::-;8891:15;;;8973:1;8969:10;;;;8961:19;;8957:28;;;8922:12;;;;8997:19;;;8994:39;;;9029:1;9026;9019:12;8994:39;9053:11;;;;9073:148;9089:6;9084:3;9081:15;9073:148;;;9155:23;9174:3;9155:23;:::i;:::-;9143:36;;9106:12;;;;9199;;;;9073:148;;;9240:5;-1:-1:-1;;9283:18:1;;9270:32;;-1:-1:-1;;9314:16:1;;;9311:36;;;9343:1;9340;9333:12;9311:36;;9366:63;9421:7;9410:8;9399:9;9395:24;9366:63;:::i;:::-;9356:73;;;9448:37;9481:2;9470:9;9466:18;9448:37;:::i;:::-;9438:47;;9504:37;9537:2;9526:9;9522:18;9504:37;:::i;:::-;9494:47;;8256:1291;;;;;;;:::o;10212:254::-;10277:6;10285;10338:2;10326:9;10317:7;10313:23;10309:32;10306:52;;;10354:1;10351;10344:12;10306:52;10377:27;10394:9;10377:27;:::i;:::-;10367:37;;10423;10456:2;10445:9;10441:18;10423:37;:::i;10471:575::-;10720:3;10709:9;10702:22;10683:4;10741:46;10782:3;10771:9;10767:19;10759:6;10741:46;:::i;:::-;-1:-1:-1;;;;;10860:15:1;;;10855:2;10840:18;;10833:43;10912:15;;;10907:2;10892:18;;10885:43;-1:-1:-1;10971:14:1;;10964:22;10959:2;10944:18;;10937:50;11024:15;;;11018:3;11003:19;;;10996:44;;;;10733:54;10471:575;-1:-1:-1;10471:575:1:o;11051:328::-;11128:6;11136;11144;11197:2;11185:9;11176:7;11172:23;11168:32;11165:52;;;11213:1;11210;11203:12;11165:52;11236:29;11255:9;11236:29;:::i;:::-;11226:39;;11312:2;11301:9;11297:18;11284:32;11274:42;;11335:38;11369:2;11358:9;11354:18;11335:38;:::i;11611:252::-;11675:6;11683;11736:2;11724:9;11715:7;11711:23;11707:32;11704:52;;;11752:1;11749;11742:12;11704:52;11775:27;11792:9;11775:27;:::i;:::-;11765:37;;11821:36;11853:2;11842:9;11838:18;11821:36;:::i;11868:545::-;11971:6;11979;11987;11995;12003;12011;12064:3;12052:9;12043:7;12039:23;12035:33;12032:53;;;12081:1;12078;12071:12;12032:53;12117:9;12104:23;12094:33;;12174:2;12163:9;12159:18;12146:32;12136:42;;12197:38;12231:2;12220:9;12216:18;12197:38;:::i;:::-;12187:48;;12254:37;12287:2;12276:9;12272:18;12254:37;:::i;:::-;12244:47;;12310:39;12344:3;12333:9;12329:19;12310:39;:::i;:::-;12300:49;;12368:39;12402:3;12391:9;12387:19;12368:39;:::i;:::-;12358:49;;11868:545;;;;;;;;:::o;12418:260::-;12486:6;12494;12547:2;12535:9;12526:7;12522:23;12518:32;12515:52;;;12563:1;12560;12553:12;12515:52;12586:29;12605:9;12586:29;:::i;12683:380::-;12762:1;12758:12;;;;12805;;;12826:61;;12880:4;12872:6;12868:17;12858:27;;12826:61;12933:2;12925:6;12922:14;12902:18;12899:38;12896:161;;12979:10;12974:3;12970:20;12967:1;12960:31;13014:4;13011:1;13004:15;13042:4;13039:1;13032:15;12896:161;;12683:380;;;:::o;13422:127::-;13483:10;13478:3;13474:20;13471:1;13464:31;13514:4;13511:1;13504:15;13538:4;13535:1;13528:15;13554:209;13592:3;-1:-1:-1;;;;;13673:2:1;13666:5;13662:14;13700:2;13691:7;13688:15;13685:41;;13706:18;;:::i;:::-;13755:1;13742:15;;13554:209;-1:-1:-1;;;13554:209:1:o;16072:125::-;16137:9;;;16158:10;;;16155:36;;;16171:18;;:::i;18285:649::-;18478:2;18467:9;18460:21;18441:4;18516:6;18510:13;18559:4;18554:2;18543:9;18539:18;18532:32;18587:52;18634:3;18623:9;18619:19;18605:12;18587:52;:::i;:::-;18573:66;;18720:1;18716;18711:3;18707:11;18703:19;18697:2;18689:6;18685:15;18679:22;18675:48;18670:2;18659:9;18655:18;18648:76;18778:2;18770:6;18766:15;18760:22;18755:2;18744:9;18740:18;18733:50;18838:2;18830:6;18826:15;18820:22;18814:3;18803:9;18799:19;18792:51;18899:3;18891:6;18887:16;18881:23;18874:4;18863:9;18859:20;18852:53;18922:6;18914:14;;;18285:649;;;;:::o;18939:184::-;19009:6;19062:2;19050:9;19041:7;19037:23;19033:32;19030:52;;;19078:1;19075;19068:12;19030:52;-1:-1:-1;19101:16:1;;18939:184;-1:-1:-1;18939:184:1:o;20958:127::-;21019:10;21014:3;21010:20;21007:1;21000:31;21050:4;21047:1;21040:15;21074:4;21071:1;21064:15;21090:135;21129:3;21150:17;;;21147:43;;21170:18;;:::i;:::-;-1:-1:-1;21217:1:1;21206:13;;21090:135::o;22265:277::-;22332:6;22385:2;22373:9;22364:7;22360:23;22356:32;22353:52;;;22401:1;22398;22391:12;22353:52;22433:9;22427:16;22486:5;22479:13;22472:21;22465:5;22462:32;22452:60;;22508:1;22505;22498:12;25094:180;-1:-1:-1;;;;;25199:10:1;;;25211;;;25195:27;;25234:11;;;25231:37;;;25248:18;;:::i;:::-;25231:37;25094:180;;;;:::o;26140:127::-;26201:10;26196:3;26192:20;26189:1;26182:31;26232:4;26229:1;26222:15;26256:4;26253:1;26246:15;26272:120;26312:1;26338;26328:35;;26343:18;;:::i;:::-;-1:-1:-1;26377:9:1;;26272:120::o;26397:128::-;26464:9;;;26485:11;;;26482:37;;;26499:18;;:::i;26530:112::-;26562:1;26588;26578:35;;26593:18;;:::i;:::-;-1:-1:-1;26627:9:1;;26530:112::o;30543:287::-;30672:3;30710:6;30704:13;30726:66;30785:6;30780:3;30773:4;30765:6;30761:17;30726:66;:::i;:::-;30808:16;;;;;30543:287;-1:-1:-1;;30543:287:1:o;31526:168::-;31599:9;;;31630;;31647:15;;;31641:22;;31627:37;31617:71;;31668:18;;:::i;32834:812::-;33245:25;33240:3;33233:38;33215:3;33300:6;33294:13;33316:75;33384:6;33379:2;33374:3;33370:12;33363:4;33355:6;33351:17;33316:75;:::i;:::-;-1:-1:-1;;;33450:2:1;33410:16;;;33442:11;;;33435:40;33500:13;;33522:76;33500:13;33584:2;33576:11;;33569:4;33557:17;;33522:76;:::i;:::-;33618:17;33637:2;33614:26;;32834:812;-1:-1:-1;;;;32834:812:1:o;33651:136::-;33690:3;33718:5;33708:39;;33727:18;;:::i;:::-;-1:-1:-1;;;33763:18:1;;33651:136::o

Swarm Source

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