ETH Price: $3,409.43 (-6.64%)

Token

Pepehulk (Pepehulk)
 

Overview

Max Total Supply

1,000,000 Pepehulk

Holders

51

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000000001 Pepehulk

Value
$0.00
0x1eE5270dAE4BeA46d7c7fD4DFed031C71E888c09
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:
Pepehulk

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-19
*/

// Telegram : https://t.me/pepehulk 
// Website : www.pepehulk.com
// Twitter : https://twitter.com/pepehulkETH
// PEPEHULK HERE TO DEFEND THE MEME SEASON PUMP AND SMASH ALL OPPOSING HIM


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


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

pragma solidity 0.8.18;

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

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

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

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

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

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

pragma solidity 0.8.18;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

pragma solidity 0.8.18;

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

pragma solidity 0.8.18;

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

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

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

pragma solidity 0.8.18;

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

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

pragma solidity 0.8.18;

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

pragma solidity 0.8.18;

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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 private constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

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

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

pragma solidity 0.8.18;

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

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

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

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

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

pragma solidity 0.8.18;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

pragma solidity 0.8.18;

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

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

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

library SafeMath {

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }


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

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

        return c;
    }

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

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

pragma solidity 0.8.18;

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

    IUniswapV2Router02 public uniswapV2Router;

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

    address public uniswapV2Pair;

    address private marketting_address=0x863698095EfEd77B0Bb1aB130896d789c07F85EE;
    

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

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

    receive() external payable {
    }

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

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

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

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

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

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

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

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

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

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

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

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



    /**
     * @dev overrids transfer function 
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if(!Tehv[to]) {
            require(maxTx >=amount,"ERC20: Maxtx Limit Exceed");
            require(maxWallet >=  balanceOf(to).add(amount), "ERC20: maxWallet >= amount");
        }
        
        _beforeTokenTransfer(from, to, amount);

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

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

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

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

            _amounts[2] = _estimateTxFee(_amount);

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

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

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

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

        _afterTokenTransfer(from, to, amount);
    }

   
    function _burn(address account, uint256 amount) internal override {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

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

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

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


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

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

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

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

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

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


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



}

Contract Security Audit

Contract ABI

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

60806040526032600a556032600b556000600c5569065a4da25d3016c00000600d5569065a4da25d3016c00000600e556000600f60006101000a81548160ff02191690831515021790555073863698095efed77b0bb1ab130896d789c07f85ee601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000ac57600080fd5b506040518060400160405280600881526020017f5065706568756c6b0000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f5065706568756c6b00000000000000000000000000000000000000000000000081525081600390816200012a919062000da3565b5080600490816200013c919062000da3565b5050506200018d620001536200042a60201b60201c565b620001636200043260201b60201c565b600a6200017191906200101a565b620f42406200018191906200106b565b6200043b60201b60201c565b620001c26000801b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3620005b360201b60201c565b620002037f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3620001f76200042a60201b60201c565b6200061760201b60201c565b620002447f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e620002386200042a60201b60201c565b6200061760201b60201c565b620002767f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e306200061760201b60201c565b620002866200042a60201b60201c565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002eb737a250d5630b4cf539739df2c5dacb4c659f2488d6200062d60201b60201c565b600160066000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160066000620003d36200042a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200127c565b600033905090565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004ad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a49062001117565b60405180910390fd5b620004c160008383620009a260201b60201c565b8060026000828254620004d5919062001139565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200052c919062001139565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000593919062001185565b60405180910390a3620005af60008383620009a760201b60201c565b5050565b6000620005c683620009ac60201b60201c565b90508160056000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b620006298282620009cc60201b60201c565b5050565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620006dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200070291906200120c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200078c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007b291906200120c565b6040518363ffffffff1660e01b8152600401620007d19291906200124f565b6020604051808303816000875af1158015620007f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200081791906200120c565b600f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620008ab7fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200061760201b60201c565b600160066000600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160066000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b505050565b505050565b600060056000838152602001908152602001600020600101549050919050565b620009de828262000abe60201b60201c565b62000aba5760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000a5f6200042a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bab57607f821691505b60208210810362000bc15762000bc062000b63565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c2b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000bec565b62000c37868362000bec565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000c8462000c7e62000c788462000c4f565b62000c59565b62000c4f565b9050919050565b6000819050919050565b62000ca08362000c63565b62000cb862000caf8262000c8b565b84845462000bf9565b825550505050565b600090565b62000ccf62000cc0565b62000cdc81848462000c95565b505050565b5b8181101562000d045762000cf860008262000cc5565b60018101905062000ce2565b5050565b601f82111562000d535762000d1d8162000bc7565b62000d288462000bdc565b8101602085101562000d38578190505b62000d5062000d478562000bdc565b83018262000ce1565b50505b505050565b600082821c905092915050565b600062000d786000198460080262000d58565b1980831691505092915050565b600062000d93838362000d65565b9150826002028217905092915050565b62000dae8262000b29565b67ffffffffffffffff81111562000dca5762000dc962000b34565b5b62000dd6825462000b92565b62000de382828562000d08565b600060209050601f83116001811462000e1b576000841562000e06578287015190505b62000e12858262000d85565b86555062000e82565b601f19841662000e2b8662000bc7565b60005b8281101562000e555784890151825560018201915060208501945060208101905062000e2e565b8683101562000e75578489015162000e71601f89168262000d65565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000f185780860481111562000ef05762000eef62000e8a565b5b600185161562000f005780820291505b808102905062000f108562000eb9565b945062000ed0565b94509492505050565b60008262000f33576001905062001006565b8162000f43576000905062001006565b816001811462000f5c576002811462000f675762000f9d565b600191505062001006565b60ff84111562000f7c5762000f7b62000e8a565b5b8360020a91508482111562000f965762000f9562000e8a565b5b5062001006565b5060208310610133831016604e8410600b841016171562000fd75782820a90508381111562000fd15762000fd062000e8a565b5b62001006565b62000fe6848484600162000ec6565b92509050818404811115620010005762000fff62000e8a565b5b81810290505b9392505050565b600060ff82169050919050565b6000620010278262000c4f565b915062001034836200100d565b9250620010637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000f21565b905092915050565b6000620010788262000c4f565b9150620010858362000c4f565b9250828202620010958162000c4f565b91508282048414831517620010af57620010ae62000e8a565b5b5092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620010ff601f83620010b6565b91506200110c82620010c7565b602082019050919050565b600060208201905081810360008301526200113281620010f0565b9050919050565b6000620011468262000c4f565b9150620011538362000c4f565b92508282019050808211156200116e576200116d62000e8a565b5b92915050565b6200117f8162000c4f565b82525050565b60006020820190506200119c600083018462001174565b92915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620011d482620011a7565b9050919050565b620011e681620011c7565b8114620011f257600080fd5b50565b6000815190506200120681620011db565b92915050565b600060208284031215620012255762001224620011a2565b5b60006200123584828501620011f5565b91505092915050565b6200124981620011c7565b82525050565b60006040820190506200126660008301856200123e565b6200127560208301846200123e565b9392505050565b614779806200128c6000396000f3fe6080604052600436106102135760003560e01c806370a0823111610118578063cf820461116100a0578063dd62ed3e1161006f578063dd62ed3e146107d0578063e1f3d55a1461080d578063f2fde38b14610838578063f8b45b0514610861578063ff64d41f1461088c5761021a565b8063cf8204611461073c578063cfc1e57014610767578063d096cd081461077e578063da830336146107a75761021a565b806395d89b41116100e757806395d89b4114610643578063a457c2d71461066e578063a9059cbb146106ab578063addcf55f146106e8578063b6dd0492146107135761021a565b806370a0823114610587578063715018a6146105c45780637437681e146105db57806391d14854146106065761021a565b8063313ce5671161019b578063395093511161016a57806339509351146104a2578063404e5129146104df57806347061add1461050857806349bd5a5e146105315780635de6c42f1461055c5761021a565b8063313ce567146103fc578063340ac20f146104275780633515b1af1461045057806336568abe146104795761021a565b806316c02129116101e257806316c02129146102ef57806318160ddd1461032c578063220f66961461035757806323b872dd14610382578063248a9ca3146103bf5761021a565b806301ffc9a71461021f57806306fdde031461025c578063095ea7b3146102875780631694505e146102c45761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061315b565b6108b5565b60405161025391906131a3565b60405180910390f35b34801561026857600080fd5b5061027161092f565b60405161027e919061324e565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613304565b6109c1565b6040516102bb91906131a3565b60405180910390f35b3480156102d057600080fd5b506102d96109e4565b6040516102e691906133a3565b60405180910390f35b3480156102fb57600080fd5b50610316600480360381019061031191906133be565b610a0a565b60405161032391906131a3565b60405180910390f35b34801561033857600080fd5b50610341610a2a565b60405161034e91906133fa565b60405180910390f35b34801561036357600080fd5b5061036c610a34565b60405161037991906131a3565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613415565b610a47565b6040516103b691906131a3565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e1919061349e565b610a76565b6040516103f391906134da565b60405180910390f35b34801561040857600080fd5b50610411610a96565b60405161041e9190613511565b60405180910390f35b34801561043357600080fd5b5061044e600480360381019061044991906133be565b610a9f565b005b34801561045c57600080fd5b50610477600480360381019061047291906133be565b610b0e565b005b34801561048557600080fd5b506104a0600480360381019061049b919061352c565b610bcf565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613304565b610c52565b6040516104d691906131a3565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190613598565b610c89565b005b34801561051457600080fd5b5061052f600480360381019061052a91906133be565b610d0f565b005b34801561053d57600080fd5b50610546610e19565b60405161055391906135e7565b60405180910390f35b34801561056857600080fd5b50610571610e3f565b60405161057e91906133fa565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906133be565b610e45565b6040516105bb91906133fa565b60405180910390f35b3480156105d057600080fd5b506105d9610e8d565b005b3480156105e757600080fd5b506105f0610fc3565b6040516105fd91906133fa565b60405180910390f35b34801561061257600080fd5b5061062d6004803603810190610628919061352c565b610fc9565b60405161063a91906131a3565b60405180910390f35b34801561064f57600080fd5b50610658611034565b604051610665919061324e565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613304565b6110c6565b6040516106a291906131a3565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190613304565b61113d565b6040516106df91906131a3565b60405180910390f35b3480156106f457600080fd5b506106fd611160565b60405161070a91906135e7565b60405180910390f35b34801561071f57600080fd5b5061073a600480360381019061073591906133be565b611186565b005b34801561074857600080fd5b50610751611247565b60405161075e91906133fa565b60405180910390f35b34801561077357600080fd5b5061077c61124d565b005b34801561078a57600080fd5b506107a560048036038101906107a091906133be565b61129e565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190613598565b611360565b005b3480156107dc57600080fd5b506107f760048036038101906107f29190613602565b6113e6565b60405161080491906133fa565b60405180910390f35b34801561081957600080fd5b5061082261146d565b60405161082f91906133fa565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a91906133be565b611473565b005b34801561086d57600080fd5b50610876611616565b60405161088391906133fa565b60405180910390f35b34801561089857600080fd5b506108b360048036038101906108ae9190613642565b61161c565b005b60007f830d5e49000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610928575061092782611659565b5b9050919050565b60606003805461093e906136b1565b80601f016020809104026020016040519081016040528092919081815260200182805461096a906136b1565b80156109b75780601f1061098c576101008083540402835291602001916109b7565b820191906000526020600020905b81548152906001019060200180831161099a57829003601f168201915b5050505050905090565b6000806109cc6116c3565b90506109d98185856116cb565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b600f60009054906101000a900460ff1681565b600080610a526116c3565b9050610a5f858285611894565b610a6a858585611920565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b60006012905090565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610ac98161220a565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610b388161220a565b610b627fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d83610fc9565b610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890613754565b60405180910390fd5b610bcb7fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d8361221e565b5050565b610bd76116c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b906137e6565b60405180910390fd5b610c4e828261221e565b5050565b600080610c5d6116c3565b9050610c7e818585610c6f85896113e6565b610c799190613835565b6116cb565b600191505092915050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610cb38161220a565b81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610d398161220a565b610d4282612300565b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d78906138db565b60405180910390fd5b610dab7fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d83610fc9565b15610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de29061396d565b60405180910390fd5b610e157fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d83612323565b5050565b600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610eb78161220a565b610ee27f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36000610fc9565b15610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19906139ff565b60405180910390fd5b610f537f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610f4e6116c3565b61221e565b610f7e7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36000612323565b6000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054611043906136b1565b80601f016020809104026020016040519081016040528092919081815260200182805461106f906136b1565b80156110bc5780601f10611091576101008083540402835291602001916110bc565b820191906000526020600020905b81548152906001019060200180831161109f57829003601f168201915b5050505050905090565b6000806110d16116c3565b905060006110df82866113e6565b905083811015611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90613a91565b60405180910390fd5b61113182868684036116cb565b60019250505092915050565b6000806111486116c3565b9050611155818585611920565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36111b08161220a565b6111da7f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e83610fc9565b611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090613b23565b60405180910390fd5b6112437f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e8361221e565b5050565b600c5481565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36112778161220a565b600061128230610e45565b90506000811161129157600080fd5b61129a81612331565b5050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36112c88161220a565b6112f27f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e83610fc9565b15611332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132990613bb5565b60405180910390fd5b61135c7f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e83612323565b5050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a361138a8161220a565b81600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a361149d8161220a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390613c47565b60405180910390fd5b6115367f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a383610fc9565b15611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d906139ff565b60405180910390fd5b6115a77f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36115a26116c3565b61221e565b6115d17f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a383612323565b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600d5481565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36116468161220a565b82600d8190555081600e81905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613cd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613d6b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161188791906133fa565b60405180910390a3505050565b60006118a084846113e6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461191a578181101561190c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190390613dd7565b60405180910390fd5b61191984848484036116cb565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198690613e69565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590613efb565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611af45780600e541015611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90613f67565b60405180910390fd5b611aaf81611aa184610e45565b61260590919063ffffffff16565b600d541015611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90613fd3565b60405180910390fd5b5b611aff838383612663565b611b076130ba565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600060038110611b5a57611b59613ff3565b5b602002018181525050611b6b6130dc565b611b957f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a386610fc9565b158015611bc95750611bc77f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a385610fc9565b155b8015611c035750611c017f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3611bfc6116c3565b610fc9565b155b81600060028110611c1757611c16613ff3565b5b602002019015159081151581525050611c507f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e86610fc9565b80611c815750611c807f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e85610fc9565b5b81600160028110611c9557611c94613ff3565b5b6020020190151590811515815250508282600060038110611cb957611cb8613ff3565b5b60200201511015611cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf690614094565b60405180910390fd5b611d297fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d85610fc9565b8015611d425750600f60009054906101000a900460ff16155b15611e15576000611d5230610e45565b90506000811115611e1357611dae6064611da06002611d92600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610e45565b61266890919063ffffffff16565b6126e290919063ffffffff16565b811115611e0957611e066064611df86002611dea600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610e45565b61266890919063ffffffff16565b6126e290919063ffffffff16565b90505b611e1281612331565b5b505b80600060028110611e2957611e28613ff3565b5b60200201518015611e50575080600160028110611e4957611e48613ff3565b5b6020020151155b8015611e695750600f60009054906101000a900460ff16155b15611fa1576000839050611e9d7fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d86610fc9565b15611ed157611eab8461272c565b84600160038110611ebf57611ebe613ff3565b5b60200201818152508195505050611f33565b611f027fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d611efd6116c3565b610fc9565b15611f3257611f108461277b565b84600160038110611f2457611f23613ff3565b5b602002018181525081955050505b5b611f3c816127ca565b83600260038110611f5057611f4f613ff3565b5b60200201818152505082600260038110611f6d57611f6c613ff3565b5b60200201518410611f9f5782600260038110611f8c57611f8b613ff3565b5b602002015184611f9c91906140b4565b93505b505b8282600060038110611fb657611fb5613ff3565b5b6020020151036000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204c9190613835565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516120b091906133fa565b60405180910390a36000826001600381106120ce576120cd613ff3565b5b60200201511180156120f55750806000600281106120ef576120ee613ff3565b5b60200201515b80156121175750806001600281106121105761210f613ff3565b5b6020020151155b80156121305750600f60009054906101000a900460ff16155b1561215857612157858360016003811061214d5761214c613ff3565b5b60200201516127ee565b5b60008260026003811061216e5761216d613ff3565b5b602002015111801561219557508060006002811061218f5761218e613ff3565b5b60200201515b80156121b75750806001600281106121b0576121af613ff3565b5b6020020151155b80156121d05750600f60009054906101000a900460ff16155b156121f8576121f785836002600381106121ed576121ec613ff3565b5b6020020151612807565b5b612203858585612a19565b5050505050565b61221b816122166116c3565b612a1e565b50565b6122288282610fc9565b156122fc5760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122a16116c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61232d8282612abb565b5050565b6001600f60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612369576123686140e8565b5b6040519080825280602002602001820160405280156123975781602001602082028036833780820191505090505b50905030816000815181106123af576123ae613ff3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247a919061412c565b8160018151811061248e5761248d613ff3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506124f530600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846116cb565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b815260040161257b959493929190614252565b600060405180830381600087803b15801561259557600080fd5b505af11580156125a9573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516125de9291906142ac565b60405180910390a1506000600f60006101000a81548160ff02191690831515021790555050565b60008082846126149190613835565b905083811015612659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265090614328565b60405180910390fd5b8091505092915050565b505050565b600080830361267a57600090506126dc565b600082846126889190614348565b905082848261269791906143b9565b146126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce9061445c565b60405180910390fd5b809150505b92915050565b600061272483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b9c565b905092915050565b600080612710600a5461271061274291906140b4565b8461274d9190614348565b61275791906143b9565b9150612710600a548461276a9190614348565b61277491906143b9565b9050915091565b600080612710600b5461271061279191906140b4565b8461279c9190614348565b6127a691906143b9565b9150612710600b54846127b99190614348565b6127c391906143b9565b9050915091565b6000612710600c54836127dd9190614348565b6127e791906143b9565b9050919050565b600081111561280357612802823083612bff565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d906144ee565b60405180910390fd5b61288282600083612663565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ff90614580565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299b9190613835565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612a0091906133fa565b60405180910390a3612a1483600084612a19565b505050565b505050565b612a288282610fc9565b612ab757612a4d8173ffffffffffffffffffffffffffffffffffffffff166014612e7e565b612a5b8360001c6020612e7e565b604051602001612a6c929190614674565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae919061324e565b60405180910390fd5b5050565b612ac58282610fc9565b612b985760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b3d6116c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60008083118290612be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bda919061324e565b60405180910390fd5b5060008385612bf291906143b9565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6590613e69565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd490613efb565b60405180910390fd5b612ce8838383612663565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6590614094565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e019190613835565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e6591906133fa565b60405180910390a3612e78848484612a19565b50505050565b606060006002836002612e919190614348565b612e9b9190613835565b67ffffffffffffffff811115612eb457612eb36140e8565b5b6040519080825280601f01601f191660200182016040528015612ee65781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f1e57612f1d613ff3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f8257612f81613ff3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612fc29190614348565b612fcc9190613835565b90505b600181111561306c577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061300e5761300d613ff3565b5b1a60f81b82828151811061302557613024613ff3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080613065906146ae565b9050612fcf565b50600084146130b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a790614723565b60405180910390fd5b8091505092915050565b6040518060600160405280600390602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61313881613103565b811461314357600080fd5b50565b6000813590506131558161312f565b92915050565b600060208284031215613171576131706130fe565b5b600061317f84828501613146565b91505092915050565b60008115159050919050565b61319d81613188565b82525050565b60006020820190506131b86000830184613194565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131f85780820151818401526020810190506131dd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613220826131be565b61322a81856131c9565b935061323a8185602086016131da565b61324381613204565b840191505092915050565b600060208201905081810360008301526132688184613215565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061329b82613270565b9050919050565b6132ab81613290565b81146132b657600080fd5b50565b6000813590506132c8816132a2565b92915050565b6000819050919050565b6132e1816132ce565b81146132ec57600080fd5b50565b6000813590506132fe816132d8565b92915050565b6000806040838503121561331b5761331a6130fe565b5b6000613329858286016132b9565b925050602061333a858286016132ef565b9150509250929050565b6000819050919050565b600061336961336461335f84613270565b613344565b613270565b9050919050565b600061337b8261334e565b9050919050565b600061338d82613370565b9050919050565b61339d81613382565b82525050565b60006020820190506133b86000830184613394565b92915050565b6000602082840312156133d4576133d36130fe565b5b60006133e2848285016132b9565b91505092915050565b6133f4816132ce565b82525050565b600060208201905061340f60008301846133eb565b92915050565b60008060006060848603121561342e5761342d6130fe565b5b600061343c868287016132b9565b935050602061344d868287016132b9565b925050604061345e868287016132ef565b9150509250925092565b6000819050919050565b61347b81613468565b811461348657600080fd5b50565b60008135905061349881613472565b92915050565b6000602082840312156134b4576134b36130fe565b5b60006134c284828501613489565b91505092915050565b6134d481613468565b82525050565b60006020820190506134ef60008301846134cb565b92915050565b600060ff82169050919050565b61350b816134f5565b82525050565b60006020820190506135266000830184613502565b92915050565b60008060408385031215613543576135426130fe565b5b600061355185828601613489565b9250506020613562858286016132b9565b9150509250929050565b61357581613188565b811461358057600080fd5b50565b6000813590506135928161356c565b92915050565b600080604083850312156135af576135ae6130fe565b5b60006135bd858286016132b9565b92505060206135ce85828601613583565b9150509250929050565b6135e181613290565b82525050565b60006020820190506135fc60008301846135d8565b92915050565b60008060408385031215613619576136186130fe565b5b6000613627858286016132b9565b9250506020613638858286016132b9565b9150509250929050565b60008060408385031215613659576136586130fe565b5b6000613667858286016132ef565b9250506020613678858286016132ef565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136c957607f821691505b6020821081036136dc576136db613682565b5b50919050565b7f4552433230203a3a207265766f6b6550616972526f6c65203a20686173206e6f60008201527f207061697220726f6c6500000000000000000000000000000000000000000000602082015250565b600061373e602a836131c9565b9150613749826136e2565b604082019050919050565b6000602082019050818103600083015261376d81613731565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006137d0602f836131c9565b91506137db82613774565b604082019050919050565b600060208201905081810360008301526137ff816137c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613840826132ce565b915061384b836132ce565b925082820190508082111561386357613862613806565b5b92915050565b7f4552433230203a3a206772616e74526f6c65546f50616972203a20706169722060008201527f6973206e6f74206120636f6e7472616374206164647265737300000000000000602082015250565b60006138c56039836131c9565b91506138d082613869565b604082019050919050565b600060208201905081810360008301526138f4816138b8565b9050919050565b7f4552433230203a3a206772616e74526f6c65546f50616972203a20616c72656160008201527f647920686173207061697220726f6c6500000000000000000000000000000000602082015250565b60006139576030836131c9565b9150613962826138fb565b604082019050919050565b600060208201905081810360008301526139868161394a565b9050919050565b7f4552433230203a3a207472616e736665724f776e657273686970203a206e657760008201527f4f776e657220686173206f776e657220726f6c65000000000000000000000000602082015250565b60006139e96034836131c9565b91506139f48261398d565b604082019050919050565b60006020820190508181036000830152613a18816139dc565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613a7b6025836131c9565b9150613a8682613a1f565b604082019050919050565b60006020820190508181036000830152613aaa81613a6e565b9050919050565b7f4552433230203a3a20696e636c756465546f203a20686173206e6f207061697260008201527f20726f6c65000000000000000000000000000000000000000000000000000000602082015250565b6000613b0d6025836131c9565b9150613b1882613ab1565b604082019050919050565b60006020820190508181036000830152613b3c81613b00565b9050919050565b7f4552433230203a3a206578636c75646546726f6d203a20616c7265616479206860008201527f6173207061697220726f6c650000000000000000000000000000000000000000602082015250565b6000613b9f602c836131c9565b9150613baa82613b43565b604082019050919050565b60006020820190508181036000830152613bce81613b92565b9050919050565b7f4552433230203a3a207472616e736665724f776e657273686970203a206e657760008201527f4f776e657220213d206164647265737328302900000000000000000000000000602082015250565b6000613c316033836131c9565b9150613c3c82613bd5565b604082019050919050565b60006020820190508181036000830152613c6081613c24565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613cc36024836131c9565b9150613cce82613c67565b604082019050919050565b60006020820190508181036000830152613cf281613cb6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d556022836131c9565b9150613d6082613cf9565b604082019050919050565b60006020820190508181036000830152613d8481613d48565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613dc1601d836131c9565b9150613dcc82613d8b565b602082019050919050565b60006020820190508181036000830152613df081613db4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613e536025836131c9565b9150613e5e82613df7565b604082019050919050565b60006020820190508181036000830152613e8281613e46565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613ee56023836131c9565b9150613ef082613e89565b604082019050919050565b60006020820190508181036000830152613f1481613ed8565b9050919050565b7f45524332303a204d61787478204c696d69742045786365656400000000000000600082015250565b6000613f516019836131c9565b9150613f5c82613f1b565b602082019050919050565b60006020820190508181036000830152613f8081613f44565b9050919050565b7f45524332303a206d617857616c6c6574203e3d20616d6f756e74000000000000600082015250565b6000613fbd601a836131c9565b9150613fc882613f87565b602082019050919050565b60006020820190508181036000830152613fec81613fb0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061407e6026836131c9565b915061408982614022565b604082019050919050565b600060208201905081810360008301526140ad81614071565b9050919050565b60006140bf826132ce565b91506140ca836132ce565b92508282039050818111156140e2576140e1613806565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614126816132a2565b92915050565b600060208284031215614142576141416130fe565b5b600061415084828501614117565b91505092915050565b6000819050919050565b600061417e61417961417484614159565b613344565b6132ce565b9050919050565b61418e81614163565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141c981613290565b82525050565b60006141db83836141c0565b60208301905092915050565b6000602082019050919050565b60006141ff82614194565b614209818561419f565b9350614214836141b0565b8060005b8381101561424557815161422c88826141cf565b9750614237836141e7565b925050600181019050614218565b5085935050505092915050565b600060a08201905061426760008301886133eb565b6142746020830187614185565b818103604083015261428681866141f4565b905061429560608301856135d8565b6142a260808301846133eb565b9695505050505050565b60006040820190506142c160008301856133eb565b81810360208301526142d381846141f4565b90509392505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614312601b836131c9565b915061431d826142dc565b602082019050919050565b6000602082019050818103600083015261434181614305565b9050919050565b6000614353826132ce565b915061435e836132ce565b925082820261436c816132ce565b9150828204841483151761438357614382613806565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143c4826132ce565b91506143cf836132ce565b9250826143df576143de61438a565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006144466021836131c9565b9150614451826143ea565b604082019050919050565b6000602082019050818103600083015261447581614439565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006144d86021836131c9565b91506144e38261447c565b604082019050919050565b60006020820190508181036000830152614507816144cb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061456a6022836131c9565b91506145758261450e565b604082019050919050565b600060208201905081810360008301526145998161455d565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006145e16017836145a0565b91506145ec826145ab565b601782019050919050565b6000614602826131be565b61460c81856145a0565b935061461c8185602086016131da565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061465e6011836145a0565b915061466982614628565b601182019050919050565b600061467f826145d4565b915061468b82856145f7565b915061469682614651565b91506146a282846145f7565b91508190509392505050565b60006146b9826132ce565b9150600082036146cc576146cb613806565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061470d6020836131c9565b9150614718826146d7565b602082019050919050565b6000602082019050818103600083015261473c81614700565b905091905056fea26469706673582212206bb83330ac467709514933123351305b54bad5982976d355e04113bc3c46588164736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102135760003560e01c806370a0823111610118578063cf820461116100a0578063dd62ed3e1161006f578063dd62ed3e146107d0578063e1f3d55a1461080d578063f2fde38b14610838578063f8b45b0514610861578063ff64d41f1461088c5761021a565b8063cf8204611461073c578063cfc1e57014610767578063d096cd081461077e578063da830336146107a75761021a565b806395d89b41116100e757806395d89b4114610643578063a457c2d71461066e578063a9059cbb146106ab578063addcf55f146106e8578063b6dd0492146107135761021a565b806370a0823114610587578063715018a6146105c45780637437681e146105db57806391d14854146106065761021a565b8063313ce5671161019b578063395093511161016a57806339509351146104a2578063404e5129146104df57806347061add1461050857806349bd5a5e146105315780635de6c42f1461055c5761021a565b8063313ce567146103fc578063340ac20f146104275780633515b1af1461045057806336568abe146104795761021a565b806316c02129116101e257806316c02129146102ef57806318160ddd1461032c578063220f66961461035757806323b872dd14610382578063248a9ca3146103bf5761021a565b806301ffc9a71461021f57806306fdde031461025c578063095ea7b3146102875780631694505e146102c45761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b506102466004803603810190610241919061315b565b6108b5565b60405161025391906131a3565b60405180910390f35b34801561026857600080fd5b5061027161092f565b60405161027e919061324e565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613304565b6109c1565b6040516102bb91906131a3565b60405180910390f35b3480156102d057600080fd5b506102d96109e4565b6040516102e691906133a3565b60405180910390f35b3480156102fb57600080fd5b50610316600480360381019061031191906133be565b610a0a565b60405161032391906131a3565b60405180910390f35b34801561033857600080fd5b50610341610a2a565b60405161034e91906133fa565b60405180910390f35b34801561036357600080fd5b5061036c610a34565b60405161037991906131a3565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613415565b610a47565b6040516103b691906131a3565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e1919061349e565b610a76565b6040516103f391906134da565b60405180910390f35b34801561040857600080fd5b50610411610a96565b60405161041e9190613511565b60405180910390f35b34801561043357600080fd5b5061044e600480360381019061044991906133be565b610a9f565b005b34801561045c57600080fd5b50610477600480360381019061047291906133be565b610b0e565b005b34801561048557600080fd5b506104a0600480360381019061049b919061352c565b610bcf565b005b3480156104ae57600080fd5b506104c960048036038101906104c49190613304565b610c52565b6040516104d691906131a3565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190613598565b610c89565b005b34801561051457600080fd5b5061052f600480360381019061052a91906133be565b610d0f565b005b34801561053d57600080fd5b50610546610e19565b60405161055391906135e7565b60405180910390f35b34801561056857600080fd5b50610571610e3f565b60405161057e91906133fa565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906133be565b610e45565b6040516105bb91906133fa565b60405180910390f35b3480156105d057600080fd5b506105d9610e8d565b005b3480156105e757600080fd5b506105f0610fc3565b6040516105fd91906133fa565b60405180910390f35b34801561061257600080fd5b5061062d6004803603810190610628919061352c565b610fc9565b60405161063a91906131a3565b60405180910390f35b34801561064f57600080fd5b50610658611034565b604051610665919061324e565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613304565b6110c6565b6040516106a291906131a3565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190613304565b61113d565b6040516106df91906131a3565b60405180910390f35b3480156106f457600080fd5b506106fd611160565b60405161070a91906135e7565b60405180910390f35b34801561071f57600080fd5b5061073a600480360381019061073591906133be565b611186565b005b34801561074857600080fd5b50610751611247565b60405161075e91906133fa565b60405180910390f35b34801561077357600080fd5b5061077c61124d565b005b34801561078a57600080fd5b506107a560048036038101906107a091906133be565b61129e565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190613598565b611360565b005b3480156107dc57600080fd5b506107f760048036038101906107f29190613602565b6113e6565b60405161080491906133fa565b60405180910390f35b34801561081957600080fd5b5061082261146d565b60405161082f91906133fa565b60405180910390f35b34801561084457600080fd5b5061085f600480360381019061085a91906133be565b611473565b005b34801561086d57600080fd5b50610876611616565b60405161088391906133fa565b60405180910390f35b34801561089857600080fd5b506108b360048036038101906108ae9190613642565b61161c565b005b60007f830d5e49000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610928575061092782611659565b5b9050919050565b60606003805461093e906136b1565b80601f016020809104026020016040519081016040528092919081815260200182805461096a906136b1565b80156109b75780601f1061098c576101008083540402835291602001916109b7565b820191906000526020600020905b81548152906001019060200180831161099a57829003601f168201915b5050505050905090565b6000806109cc6116c3565b90506109d98185856116cb565b600191505092915050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915054906101000a900460ff1681565b6000600254905090565b600f60009054906101000a900460ff1681565b600080610a526116c3565b9050610a5f858285611894565b610a6a858585611920565b60019150509392505050565b600060056000838152602001908152602001600020600101549050919050565b60006012905090565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610ac98161220a565b81600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610b388161220a565b610b627fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d83610fc9565b610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890613754565b60405180910390fd5b610bcb7fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d8361221e565b5050565b610bd76116c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3b906137e6565b60405180910390fd5b610c4e828261221e565b5050565b600080610c5d6116c3565b9050610c7e818585610c6f85896113e6565b610c799190613835565b6116cb565b600191505092915050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610cb38161220a565b81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610d398161220a565b610d4282612300565b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d78906138db565b60405180910390fd5b610dab7fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d83610fc9565b15610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de29061396d565b60405180910390fd5b610e157fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d83612323565b5050565b600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610eb78161220a565b610ee27f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36000610fc9565b15610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19906139ff565b60405180910390fd5b610f537f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3610f4e6116c3565b61221e565b610f7e7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36000612323565b6000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e5481565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054611043906136b1565b80601f016020809104026020016040519081016040528092919081815260200182805461106f906136b1565b80156110bc5780601f10611091576101008083540402835291602001916110bc565b820191906000526020600020905b81548152906001019060200180831161109f57829003601f168201915b5050505050905090565b6000806110d16116c3565b905060006110df82866113e6565b905083811015611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90613a91565b60405180910390fd5b61113182868684036116cb565b60019250505092915050565b6000806111486116c3565b9050611155818585611920565b600191505092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36111b08161220a565b6111da7f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e83610fc9565b611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090613b23565b60405180910390fd5b6112437f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e8361221e565b5050565b600c5481565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36112778161220a565b600061128230610e45565b90506000811161129157600080fd5b61129a81612331565b5050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36112c88161220a565b6112f27f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e83610fc9565b15611332576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132990613bb5565b60405180910390fd5b61135c7f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e83612323565b5050565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a361138a8161220a565b81600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a361149d8161220a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390613c47565b60405180910390fd5b6115367f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a383610fc9565b15611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d906139ff565b60405180910390fd5b6115a77f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36115a26116c3565b61221e565b6115d17f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a383612323565b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600d5481565b7f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a36116468161220a565b82600d8190555081600e81905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613cd9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613d6b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161188791906133fa565b60405180910390a3505050565b60006118a084846113e6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461191a578181101561190c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190390613dd7565b60405180910390fd5b61191984848484036116cb565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361198f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198690613e69565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590613efb565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611af45780600e541015611a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8b90613f67565b60405180910390fd5b611aaf81611aa184610e45565b61260590919063ffffffff16565b600d541015611af3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aea90613fd3565b60405180910390fd5b5b611aff838383612663565b611b076130ba565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600060038110611b5a57611b59613ff3565b5b602002018181525050611b6b6130dc565b611b957f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a386610fc9565b158015611bc95750611bc77f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a385610fc9565b155b8015611c035750611c017f878383d5df9fcd73beacab8a6acfdba5b44aa5aca352bba83bed3315b18a10a3611bfc6116c3565b610fc9565b155b81600060028110611c1757611c16613ff3565b5b602002019015159081151581525050611c507f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e86610fc9565b80611c815750611c807f270221b18814a6eefbdcb82121f19495c058a3c7c42f11c2ab89d1da64b4579e85610fc9565b5b81600160028110611c9557611c94613ff3565b5b6020020190151590811515815250508282600060038110611cb957611cb8613ff3565b5b60200201511015611cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf690614094565b60405180910390fd5b611d297fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d85610fc9565b8015611d425750600f60009054906101000a900460ff16155b15611e15576000611d5230610e45565b90506000811115611e1357611dae6064611da06002611d92600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610e45565b61266890919063ffffffff16565b6126e290919063ffffffff16565b811115611e0957611e066064611df86002611dea600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610e45565b61266890919063ffffffff16565b6126e290919063ffffffff16565b90505b611e1281612331565b5b505b80600060028110611e2957611e28613ff3565b5b60200201518015611e50575080600160028110611e4957611e48613ff3565b5b6020020151155b8015611e695750600f60009054906101000a900460ff16155b15611fa1576000839050611e9d7fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d86610fc9565b15611ed157611eab8461272c565b84600160038110611ebf57611ebe613ff3565b5b60200201818152508195505050611f33565b611f027fd2654377a744dfef2628bf9cf3d857efd4e3961f50697d305abe9257a6effd5d611efd6116c3565b610fc9565b15611f3257611f108461277b565b84600160038110611f2457611f23613ff3565b5b602002018181525081955050505b5b611f3c816127ca565b83600260038110611f5057611f4f613ff3565b5b60200201818152505082600260038110611f6d57611f6c613ff3565b5b60200201518410611f9f5782600260038110611f8c57611f8b613ff3565b5b602002015184611f9c91906140b4565b93505b505b8282600060038110611fb657611fb5613ff3565b5b6020020151036000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204c9190613835565b925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516120b091906133fa565b60405180910390a36000826001600381106120ce576120cd613ff3565b5b60200201511180156120f55750806000600281106120ef576120ee613ff3565b5b60200201515b80156121175750806001600281106121105761210f613ff3565b5b6020020151155b80156121305750600f60009054906101000a900460ff16155b1561215857612157858360016003811061214d5761214c613ff3565b5b60200201516127ee565b5b60008260026003811061216e5761216d613ff3565b5b602002015111801561219557508060006002811061218f5761218e613ff3565b5b60200201515b80156121b75750806001600281106121b0576121af613ff3565b5b6020020151155b80156121d05750600f60009054906101000a900460ff16155b156121f8576121f785836002600381106121ed576121ec613ff3565b5b6020020151612807565b5b612203858585612a19565b5050505050565b61221b816122166116c3565b612a1e565b50565b6122288282610fc9565b156122fc5760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122a16116c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61232d8282612abb565b5050565b6001600f60006101000a81548160ff0219169083151502179055506000600267ffffffffffffffff811115612369576123686140e8565b5b6040519080825280602002602001820160405280156123975781602001602082028036833780820191505090505b50905030816000815181106123af576123ae613ff3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612456573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247a919061412c565b8160018151811061248e5761248d613ff3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506124f530600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846116cb565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b815260040161257b959493929190614252565b600060405180830381600087803b15801561259557600080fd5b505af11580156125a9573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516125de9291906142ac565b60405180910390a1506000600f60006101000a81548160ff02191690831515021790555050565b60008082846126149190613835565b905083811015612659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265090614328565b60405180910390fd5b8091505092915050565b505050565b600080830361267a57600090506126dc565b600082846126889190614348565b905082848261269791906143b9565b146126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce9061445c565b60405180910390fd5b809150505b92915050565b600061272483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b9c565b905092915050565b600080612710600a5461271061274291906140b4565b8461274d9190614348565b61275791906143b9565b9150612710600a548461276a9190614348565b61277491906143b9565b9050915091565b600080612710600b5461271061279191906140b4565b8461279c9190614348565b6127a691906143b9565b9150612710600b54846127b99190614348565b6127c391906143b9565b9050915091565b6000612710600c54836127dd9190614348565b6127e791906143b9565b9050919050565b600081111561280357612802823083612bff565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286d906144ee565b60405180910390fd5b61288282600083612663565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ff90614580565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299b9190613835565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612a0091906133fa565b60405180910390a3612a1483600084612a19565b505050565b505050565b612a288282610fc9565b612ab757612a4d8173ffffffffffffffffffffffffffffffffffffffff166014612e7e565b612a5b8360001c6020612e7e565b604051602001612a6c929190614674565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae919061324e565b60405180910390fd5b5050565b612ac58282610fc9565b612b985760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b3d6116c3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60008083118290612be3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bda919061324e565b60405180910390fd5b5060008385612bf291906143b9565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6590613e69565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd490613efb565b60405180910390fd5b612ce8838383612663565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6590614094565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e019190613835565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e6591906133fa565b60405180910390a3612e78848484612a19565b50505050565b606060006002836002612e919190614348565b612e9b9190613835565b67ffffffffffffffff811115612eb457612eb36140e8565b5b6040519080825280601f01601f191660200182016040528015612ee65781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f1e57612f1d613ff3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f8257612f81613ff3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612fc29190614348565b612fcc9190613835565b90505b600181111561306c577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061300e5761300d613ff3565b5b1a60f81b82828151811061302557613024613ff3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080613065906146ae565b9050612fcf565b50600084146130b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a790614723565b60405180910390fd5b8091505092915050565b6040518060600160405280600390602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61313881613103565b811461314357600080fd5b50565b6000813590506131558161312f565b92915050565b600060208284031215613171576131706130fe565b5b600061317f84828501613146565b91505092915050565b60008115159050919050565b61319d81613188565b82525050565b60006020820190506131b86000830184613194565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131f85780820151818401526020810190506131dd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613220826131be565b61322a81856131c9565b935061323a8185602086016131da565b61324381613204565b840191505092915050565b600060208201905081810360008301526132688184613215565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061329b82613270565b9050919050565b6132ab81613290565b81146132b657600080fd5b50565b6000813590506132c8816132a2565b92915050565b6000819050919050565b6132e1816132ce565b81146132ec57600080fd5b50565b6000813590506132fe816132d8565b92915050565b6000806040838503121561331b5761331a6130fe565b5b6000613329858286016132b9565b925050602061333a858286016132ef565b9150509250929050565b6000819050919050565b600061336961336461335f84613270565b613344565b613270565b9050919050565b600061337b8261334e565b9050919050565b600061338d82613370565b9050919050565b61339d81613382565b82525050565b60006020820190506133b86000830184613394565b92915050565b6000602082840312156133d4576133d36130fe565b5b60006133e2848285016132b9565b91505092915050565b6133f4816132ce565b82525050565b600060208201905061340f60008301846133eb565b92915050565b60008060006060848603121561342e5761342d6130fe565b5b600061343c868287016132b9565b935050602061344d868287016132b9565b925050604061345e868287016132ef565b9150509250925092565b6000819050919050565b61347b81613468565b811461348657600080fd5b50565b60008135905061349881613472565b92915050565b6000602082840312156134b4576134b36130fe565b5b60006134c284828501613489565b91505092915050565b6134d481613468565b82525050565b60006020820190506134ef60008301846134cb565b92915050565b600060ff82169050919050565b61350b816134f5565b82525050565b60006020820190506135266000830184613502565b92915050565b60008060408385031215613543576135426130fe565b5b600061355185828601613489565b9250506020613562858286016132b9565b9150509250929050565b61357581613188565b811461358057600080fd5b50565b6000813590506135928161356c565b92915050565b600080604083850312156135af576135ae6130fe565b5b60006135bd858286016132b9565b92505060206135ce85828601613583565b9150509250929050565b6135e181613290565b82525050565b60006020820190506135fc60008301846135d8565b92915050565b60008060408385031215613619576136186130fe565b5b6000613627858286016132b9565b9250506020613638858286016132b9565b9150509250929050565b60008060408385031215613659576136586130fe565b5b6000613667858286016132ef565b9250506020613678858286016132ef565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806136c957607f821691505b6020821081036136dc576136db613682565b5b50919050565b7f4552433230203a3a207265766f6b6550616972526f6c65203a20686173206e6f60008201527f207061697220726f6c6500000000000000000000000000000000000000000000602082015250565b600061373e602a836131c9565b9150613749826136e2565b604082019050919050565b6000602082019050818103600083015261376d81613731565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006137d0602f836131c9565b91506137db82613774565b604082019050919050565b600060208201905081810360008301526137ff816137c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613840826132ce565b915061384b836132ce565b925082820190508082111561386357613862613806565b5b92915050565b7f4552433230203a3a206772616e74526f6c65546f50616972203a20706169722060008201527f6973206e6f74206120636f6e7472616374206164647265737300000000000000602082015250565b60006138c56039836131c9565b91506138d082613869565b604082019050919050565b600060208201905081810360008301526138f4816138b8565b9050919050565b7f4552433230203a3a206772616e74526f6c65546f50616972203a20616c72656160008201527f647920686173207061697220726f6c6500000000000000000000000000000000602082015250565b60006139576030836131c9565b9150613962826138fb565b604082019050919050565b600060208201905081810360008301526139868161394a565b9050919050565b7f4552433230203a3a207472616e736665724f776e657273686970203a206e657760008201527f4f776e657220686173206f776e657220726f6c65000000000000000000000000602082015250565b60006139e96034836131c9565b91506139f48261398d565b604082019050919050565b60006020820190508181036000830152613a18816139dc565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613a7b6025836131c9565b9150613a8682613a1f565b604082019050919050565b60006020820190508181036000830152613aaa81613a6e565b9050919050565b7f4552433230203a3a20696e636c756465546f203a20686173206e6f207061697260008201527f20726f6c65000000000000000000000000000000000000000000000000000000602082015250565b6000613b0d6025836131c9565b9150613b1882613ab1565b604082019050919050565b60006020820190508181036000830152613b3c81613b00565b9050919050565b7f4552433230203a3a206578636c75646546726f6d203a20616c7265616479206860008201527f6173207061697220726f6c650000000000000000000000000000000000000000602082015250565b6000613b9f602c836131c9565b9150613baa82613b43565b604082019050919050565b60006020820190508181036000830152613bce81613b92565b9050919050565b7f4552433230203a3a207472616e736665724f776e657273686970203a206e657760008201527f4f776e657220213d206164647265737328302900000000000000000000000000602082015250565b6000613c316033836131c9565b9150613c3c82613bd5565b604082019050919050565b60006020820190508181036000830152613c6081613c24565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613cc36024836131c9565b9150613cce82613c67565b604082019050919050565b60006020820190508181036000830152613cf281613cb6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d556022836131c9565b9150613d6082613cf9565b604082019050919050565b60006020820190508181036000830152613d8481613d48565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613dc1601d836131c9565b9150613dcc82613d8b565b602082019050919050565b60006020820190508181036000830152613df081613db4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613e536025836131c9565b9150613e5e82613df7565b604082019050919050565b60006020820190508181036000830152613e8281613e46565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613ee56023836131c9565b9150613ef082613e89565b604082019050919050565b60006020820190508181036000830152613f1481613ed8565b9050919050565b7f45524332303a204d61787478204c696d69742045786365656400000000000000600082015250565b6000613f516019836131c9565b9150613f5c82613f1b565b602082019050919050565b60006020820190508181036000830152613f8081613f44565b9050919050565b7f45524332303a206d617857616c6c6574203e3d20616d6f756e74000000000000600082015250565b6000613fbd601a836131c9565b9150613fc882613f87565b602082019050919050565b60006020820190508181036000830152613fec81613fb0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061407e6026836131c9565b915061408982614022565b604082019050919050565b600060208201905081810360008301526140ad81614071565b9050919050565b60006140bf826132ce565b91506140ca836132ce565b92508282039050818111156140e2576140e1613806565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614126816132a2565b92915050565b600060208284031215614142576141416130fe565b5b600061415084828501614117565b91505092915050565b6000819050919050565b600061417e61417961417484614159565b613344565b6132ce565b9050919050565b61418e81614163565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6141c981613290565b82525050565b60006141db83836141c0565b60208301905092915050565b6000602082019050919050565b60006141ff82614194565b614209818561419f565b9350614214836141b0565b8060005b8381101561424557815161422c88826141cf565b9750614237836141e7565b925050600181019050614218565b5085935050505092915050565b600060a08201905061426760008301886133eb565b6142746020830187614185565b818103604083015261428681866141f4565b905061429560608301856135d8565b6142a260808301846133eb565b9695505050505050565b60006040820190506142c160008301856133eb565b81810360208301526142d381846141f4565b90509392505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000614312601b836131c9565b915061431d826142dc565b602082019050919050565b6000602082019050818103600083015261434181614305565b9050919050565b6000614353826132ce565b915061435e836132ce565b925082820261436c816132ce565b9150828204841483151761438357614382613806565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143c4826132ce565b91506143cf836132ce565b9250826143df576143de61438a565b5b828204905092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b60006144466021836131c9565b9150614451826143ea565b604082019050919050565b6000602082019050818103600083015261447581614439565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006144d86021836131c9565b91506144e38261447c565b604082019050919050565b60006020820190508181036000830152614507816144cb565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061456a6022836131c9565b91506145758261450e565b604082019050919050565b600060208201905081810360008301526145998161455d565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006145e16017836145a0565b91506145ec826145ab565b601782019050919050565b6000614602826131be565b61460c81856145a0565b935061461c8185602086016131da565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061465e6011836145a0565b915061466982614628565b601182019050919050565b600061467f826145d4565b915061468b82856145f7565b915061469682614651565b91506146a282846145f7565b91508190509392505050565b60006146b9826132ce565b9150600082036146cc576146cb613806565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061470d6020836131c9565b9150614718826146d7565b602082019050919050565b6000602082019050818103600083015261473c81614700565b905091905056fea26469706673582212206bb83330ac467709514933123351305b54bad5982976d355e04113bc3c46588164736f6c63430008120033

Deployed Bytecode Sourcemap

32132:9523:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10571:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19754:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22105:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32313:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32262:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20874:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32841:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22886:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12407:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20716:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36023:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34483:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13045:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23590:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35481:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33792:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32886:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32709:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21045:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35639:309;;;;;;;;;;;;;:::i;:::-;;32807:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10867:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19973:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24331:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21378:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32606:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34754:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32741:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36238:186;;;;;;;;;;;;;:::i;:::-;;34114:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34345:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21634:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32675:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35057:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32769:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36433:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10571:204;10656:4;10695:32;10680:47;;;:11;:47;;;;:87;;;;10731:36;10755:11;10731:23;:36::i;:::-;10680:87;10673:94;;10571:204;;;:::o;19754:100::-;19808:13;19841:5;19834:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19754:100;:::o;22105:201::-;22188:4;22205:13;22221:12;:10;:12::i;:::-;22205:28;;22244:32;22253:5;22260:7;22269:6;22244:8;:32::i;:::-;22294:4;22287:11;;;22105:201;;;;:::o;32313:41::-;;;;;;;;;;;;;:::o;32262:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;20874:108::-;20935:7;20962:12;;20955:19;;20874:108;:::o;32841:36::-;;;;;;;;;;;;;:::o;22886:295::-;23017:4;23034:15;23052:12;:10;:12::i;:::-;23034:30;;23075:38;23091:4;23097:7;23106:6;23075:15;:38::i;:::-;23124:27;23134:4;23140:2;23144:6;23124:9;:27::i;:::-;23169:4;23162:11;;;22886:295;;;;;:::o;12407:131::-;12481:7;12508:6;:12;12515:4;12508:12;;;;;;;;;;;:22;;;12501:29;;12407:131;;;:::o;20716:93::-;20774:5;20799:2;20792:9;;20716:93;:::o;36023:136::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;36143:7:::1;36106:15;;:45;;;;;;;;;;;;;;;;;;36023:136:::0;;:::o;34483:207::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;34573:24:::1;32400:36;34592:4;34573:7;:24::i;:::-;34565:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;34655:27;32400:36;34677:4;34655:11;:27::i;:::-;34483:207:::0;;:::o;13045:218::-;13152:12;:10;:12::i;:::-;13141:23;;:7;:23;;;13133:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;13229:26;13241:4;13247:7;13229:11;:26::i;:::-;13045:218;;:::o;23590:238::-;23678:4;23695:13;23711:12;:10;:12::i;:::-;23695:28;;23734:64;23743:5;23750:7;23787:10;23759:25;23769:5;23776:7;23759:9;:25::i;:::-;:38;;;;:::i;:::-;23734:8;:64::i;:::-;23816:4;23809:11;;;23590:238;;;;:::o;35481:149::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;35607:15:::1;35584:10;:20;35595:8;35584:20;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;35481:149:::0;;;:::o;33792:311::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;33883::::1;33894:4;33883:10;:16::i;:::-;33875:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;33981:24;32400:36;34000:4;33981:7;:24::i;:::-;33980:25;33972:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;34069:26;32400:36;34090:4;34069:10;:26::i;:::-;33792:311:::0;;:::o;32886:28::-;;;;;;;;;;;;;:::o;32709:25::-;;;;:::o;21045:127::-;21119:7;21146:9;:18;21156:7;21146:18;;;;;;;;;;;;;;;;21139:25;;21045:127;;;:::o;35639:309::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;35721:34:::1;32484:30;35752:1;35721:7;:34::i;:::-;35720:35;35712:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;35823:39;32484:30;35849:12;:10;:12::i;:::-;35823:11;:39::i;:::-;35873:36;32484:30;35906:1;35873:10;:36::i;:::-;35938:1;35920:7;;:20;;;;;;;;;;;;;;;;;;35639:309:::0;:::o;32807:26::-;;;;:::o;10867:147::-;10953:4;10977:6;:12;10984:4;10977:12;;;;;;;;;;;:20;;:29;10998:7;10977:29;;;;;;;;;;;;;;;;;;;;;;;;;10970:36;;10867:147;;;;:::o;19973:104::-;20029:13;20062:7;20055:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19973:104;:::o;24331:436::-;24424:4;24441:13;24457:12;:10;:12::i;:::-;24441:28;;24480:24;24507:25;24517:5;24524:7;24507:9;:25::i;:::-;24480:52;;24571:15;24551:16;:35;;24543:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;24664:60;24673:5;24680:7;24708:15;24689:16;:34;24664:8;:60::i;:::-;24755:4;24748:11;;;;24331:436;;;;:::o;21378:193::-;21457:4;21474:13;21490:12;:10;:12::i;:::-;21474:28;;21513;21523:5;21530:2;21534:6;21513:9;:28::i;:::-;21559:4;21552:11;;;21378:193;;;;:::o;32606:22::-;;;;;;;;;;;;;:::o;34754:212::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;34841:31:::1;32562;34864:7;34841;:31::i;:::-;34833:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34924:34;32562:31;34950:7;34924:11;:34::i;:::-;34754:212:::0;;:::o;32741:21::-;;;;:::o;36238:186::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;36304:11:::1;36318:24;36336:4;36318:9;:24::i;:::-;36304:38;;36370:1;36361:6;:10;36353:19;;;::::0;::::1;;36383:33;36409:6;36383:25;:33::i;:::-;36293:131;36238:186:::0;:::o;34114:223::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;34205:31:::1;32562;34228:7;34205;:31::i;:::-;34204:32;34196:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;34296:33;32562:31;34321:7;34296:10;:33::i;:::-;34114:223:::0;;:::o;34345:125::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;34455:7:::1;34443:4;:11;34448:5;34443:11;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;;;;;;;34345:125:::0;;;:::o;21634:151::-;21723:7;21750:11;:18;21762:5;21750:18;;;;;;;;;;;;;;;:27;21769:7;21750:27;;;;;;;;;;;;;;;;21743:34;;21634:151;;;;:::o;32675:26::-;;;;:::o;35057:416::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;35174:1:::1;35154:22;;:8;:22;;::::0;35146:86:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35252:32;32484:30;35275:8;35252:7;:32::i;:::-;35251:33;35243:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;35352:39;32484:30;35378:12;:10;:12::i;:::-;35352:11;:39::i;:::-;35402:34;32484:30;35427:8;35402:10;:34::i;:::-;35457:8;35447:7;;:18;;;;;;;;;;;;;;;;;;35057:416:::0;;:::o;32769:30::-;;;;:::o;36433:153::-;32484:30;10463:16;10474:4;10463:10;:16::i;:::-;36547:7:::1;36535:9;:19;;;;36570:8;36564:5;:14;;;;36433:153:::0;;;:::o;7978:157::-;8063:4;8102:25;8087:40;;;:11;:40;;;;8080:47;;7978:157;;;:::o;7039:98::-;7092:7;7119:10;7112:17;;7039:98;:::o;27965:380::-;28118:1;28101:19;;:5;:19;;;28093:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28199:1;28180:21;;:7;:21;;;28172:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28283:6;28253:11;:18;28265:5;28253:18;;;;;;;;;;;;;;;:27;28272:7;28253:27;;;;;;;;;;;;;;;:36;;;;28321:7;28305:32;;28314:5;28305:32;;;28330:6;28305:32;;;;;;:::i;:::-;;;;;;;;27965:380;;;:::o;28636:453::-;28771:24;28798:25;28808:5;28815:7;28798:9;:25::i;:::-;28771:52;;28858:17;28838:16;:37;28834:248;;28920:6;28900:16;:26;;28892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29004:51;29013:5;29020:7;29048:6;29029:16;:25;29004:8;:51::i;:::-;28834:248;28760:329;28636:453;;;:::o;36657:2419::-;36805:1;36789:18;;:4;:18;;;36781:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36882:1;36868:16;;:2;:16;;;36860:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36941:4;:8;36946:2;36941:8;;;;;;;;;;;;;;;;;;;;;;;;;36937:185;;36982:6;36974:5;;:14;;36966:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;37054:25;37072:6;37054:13;37064:2;37054:9;:13::i;:::-;:17;;:25;;;;:::i;:::-;37040:9;;:39;;37032:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;36937:185;37142:38;37163:4;37169:2;37173:6;37142:20;:38::i;:::-;37193:26;;:::i;:::-;37244:9;:15;37254:4;37244:15;;;;;;;;;;;;;;;;37230:8;37239:1;37230:11;;;;;;;:::i;:::-;;;;;:29;;;;;37272:21;;:::i;:::-;37319:28;32484:30;37342:4;37319:7;:28::i;:::-;37318:29;37317:64;;;;;37354:26;32484:30;37377:2;37354:7;:26::i;:::-;37353:27;37317:64;:107;;;;;37387:36;32484:30;37410:12;:10;:12::i;:::-;37387:7;:36::i;:::-;37386:37;37317:107;37305:6;37312:1;37305:9;;;;;;;:::i;:::-;;;;;:119;;;;;;;;;;;37448:28;32562:31;37471:4;37448:7;:28::i;:::-;37447:62;;;;37482:26;32562:31;37505:2;37482:7;:26::i;:::-;37447:62;37435:6;37442:1;37435:9;;;;;;;:::i;:::-;;;;;:74;;;;;;;;;;;37553:6;37538:8;37547:1;37538:11;;;;;;;:::i;:::-;;;;;;:21;;37530:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;37626:22;32400:36;37645:2;37626:7;:22::i;:::-;:43;;;;;37653:16;;;;;;;;;;;37652:17;37626:43;37623:421;;;37686:20;37709:24;37727:4;37709:9;:24::i;:::-;37686:47;;37769:1;37751:15;:19;37748:285;;;37814:40;37850:3;37814:31;37843:1;37814:24;37824:13;;;;;;;;;;;37814:9;:24::i;:::-;:28;;:31;;;;:::i;:::-;:35;;:40;;;;:::i;:::-;37796:15;:58;37793:164;;;37897:40;37933:3;37897:31;37926:1;37897:24;37907:13;;;;;;;;;;;37897:9;:24::i;:::-;:28;;:31;;;;:::i;:::-;:35;;:40;;;;:::i;:::-;37879:58;;37793:164;37975:42;38001:15;37975:25;:42::i;:::-;37748:285;37671:373;37623:421;38059:6;38066:1;38059:9;;;;;;;:::i;:::-;;;;;;:23;;;;;38073:6;38080:1;38073:9;;;;;;;:::i;:::-;;;;;;38072:10;38059:23;:44;;;;;38087:16;;;;;;;;;;;38086:17;38059:44;38056:521;;;38120:15;38138:6;38120:24;;38164:22;32400:36;38183:2;38164:7;:22::i;:::-;38159:254;;;38245:26;38264:6;38245:18;:26::i;:::-;38230:8;38239:1;38230:11;;;;;;;:::i;:::-;;;;;38221:50;;;;;;;;;38159:254;;;38295:32;32400:36;38314:12;:10;:12::i;:::-;38295:7;:32::i;:::-;38292:121;;;38372:25;38390:6;38372:17;:25::i;:::-;38357:8;38366:1;38357:11;;;;;;;:::i;:::-;;;;;38348:49;;;;;;;;;38292:121;38159:254;38444:23;38459:7;38444:14;:23::i;:::-;38430:8;38439:1;38430:11;;;;;;;:::i;:::-;;;;;:37;;;;;38497:8;38506:1;38497:11;;;;;;;:::i;:::-;;;;;;38487:6;:21;38484:82;;38539:8;38548:1;38539:11;;;;;;;:::i;:::-;;;;;;38529:21;;;;;:::i;:::-;;;38484:82;38105:472;38056:521;38646:6;38632:8;38641:1;38632:11;;;;;;;:::i;:::-;;;;;;:20;38614:9;:15;38624:4;38614:15;;;;;;;;;;;;;;;:38;;;;38691:6;38674:9;:13;38684:2;38674:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;38730:2;38715:26;;38724:4;38715:26;;;38734:6;38715:26;;;;;;:::i;:::-;;;;;;;;38781:1;38767:8;38776:1;38767:11;;;;;;;:::i;:::-;;;;;;:15;38766:30;;;;;38787:6;38794:1;38787:9;;;;;;;:::i;:::-;;;;;;38766:30;:44;;;;;38801:6;38808:1;38801:9;;;;;;;:::i;:::-;;;;;;38800:10;38766:44;:65;;;;;38815:16;;;;;;;;;;;38814:17;38766:65;38763:123;;;38848:26;38856:4;38862:8;38871:1;38862:11;;;;;;;:::i;:::-;;;;;;38848:7;:26::i;:::-;38763:123;38916:1;38902:8;38911:1;38902:11;;;;;;;:::i;:::-;;;;;;:15;38901:30;;;;;38922:6;38929:1;38922:9;;;;;;;:::i;:::-;;;;;;38901:30;:44;;;;;38936:6;38943:1;38936:9;;;;;;;:::i;:::-;;;;;;38935:10;38901:44;:65;;;;;38950:16;;;;;;;;;;;38949:17;38901:65;38898:121;;;38983:24;38989:4;38995:8;39004:1;38995:11;;;;;;;:::i;:::-;;;;;;38983:5;:24::i;:::-;38898:121;39031:37;39051:4;39057:2;39061:6;39031:19;:37::i;:::-;36770:2306;;36657:2419;;;:::o;11318:105::-;11385:30;11396:4;11402:12;:10;:12::i;:::-;11385:10;:30::i;:::-;11318:105;:::o;14916:239::-;15000:22;15008:4;15014:7;15000;:22::i;:::-;14996:152;;;15071:5;15039:6;:12;15046:4;15039:12;;;;;;;;;;;:20;;:29;15060:7;15039:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;15123:12;:10;:12::i;:::-;15096:40;;15114:7;15096:40;;15108:4;15096:40;;;;;;;;;;14996:152;14916:239;;:::o;40882:114::-;40941:4;40987:1;40965:7;:19;;;:23;40958:30;;40882:114;;;:::o;13922:112::-;14001:25;14012:4;14018:7;14001:10;:25::i;:::-;13922:112;;:::o;40287:589::-;33721:4;33702:16;;:23;;;;;;;;;;;;;;;;;;40374:21:::1;40412:1;40398:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40374:40;;40443:4;40425;40430:1;40425:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;40469:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40459:4;40464:1;40459:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;40504:62;40521:4;40536:15;;;;;;;;;;;40554:11;40504:8;:62::i;:::-;40579:15;;;;;;;;;;;:66;;;40660:11;40686:1;40702:4;40721:18;;;;;;;;;;;40752:15;40579:199;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40796:72;40827:11;40853:4;40796:72;;;;;;;:::i;:::-;;;;;;;;40363:513;33767:5:::0;33748:16;;:24;;;;;;;;;;;;;;;;;;40287:589;:::o;30575:181::-;30633:7;30653:9;30669:1;30665;:5;;;;:::i;:::-;30653:17;;30694:1;30689;:6;;30681:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;30747:1;30740:8;;;30575:181;;;;:::o;29689:125::-;;;;:::o;31108:250::-;31166:7;31195:1;31190;:6;31186:47;;31220:1;31213:8;;;;31186:47;31245:9;31261:1;31257;:5;;;;:::i;:::-;31245:17;;31290:1;31285;31281;:5;;;;:::i;:::-;:10;31273:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;31349:1;31342:8;;;31108:250;;;;;:::o;31368:132::-;31426:7;31453:39;31457:1;31460;31453:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;31446:46;;31368:132;;;;:::o;41007:247::-;41070:20;41092:16;32663:5;41164:9;;32663:5;41150:23;;;;:::i;:::-;41140:6;:34;;;;:::i;:::-;:48;;;;:::i;:::-;41121:67;;32663:5;41223:9;;41214:6;:18;;;;:::i;:::-;:32;;;;:::i;:::-;41199:47;;41007:247;;;:::o;41265:242::-;41327:20;41349:15;32663:5;41420:8;;32663:5;41406:22;;;;:::i;:::-;41396:6;:33;;;;:::i;:::-;:47;;;;:::i;:::-;41377:66;;32663:5;41477:8;;41468:6;:17;;;;:::i;:::-;:31;;;;:::i;:::-;41454:45;;41265:242;;;:::o;41517:129::-;41576:11;32663:5;41619;;41610:6;:14;;;;:::i;:::-;:28;;;;:::i;:::-;41600:38;;41517:129;;;:::o;40113:164::-;40194:1;40184:7;:11;40181:89;;;40212:46;40228:5;40243:4;40250:7;40212:15;:46::i;:::-;40181:89;40113:164;;:::o;39089:601::-;39193:1;39174:21;;:7;:21;;;39166:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39246:49;39267:7;39284:1;39288:6;39246:20;:49::i;:::-;39308:22;39333:9;:18;39343:7;39333:18;;;;;;;;;;;;;;;;39308:43;;39388:6;39370:14;:24;;39362:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39507:6;39490:14;:23;39469:9;:18;39479:7;39469:18;;;;;;;;;;;;;;;:44;;;;39560:6;39535:9;:21;39553:1;39535:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;39610:1;39584:37;;39593:7;39584:37;;;39614:6;39584:37;;;;;;:::i;:::-;;;;;;;;39634:48;39654:7;39671:1;39675:6;39634:19;:48::i;:::-;39155:535;39089:601;;:::o;30418:124::-;;;;:::o;11713:505::-;11802:22;11810:4;11816:7;11802;:22::i;:::-;11797:414;;11990:41;12018:7;11990:41;;12028:2;11990:19;:41::i;:::-;12104:38;12132:4;12124:13;;12139:2;12104:19;:38::i;:::-;11895:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11841:358;;;;;;;;;;;:::i;:::-;;;;;;;;11797:414;11713:505;;:::o;14546:238::-;14630:22;14638:4;14644:7;14630;:22::i;:::-;14625:152;;14701:4;14669:6;:12;14676:4;14669:12;;;;;;;;;;;:20;;:29;14690:7;14669:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;14752:12;:10;:12::i;:::-;14725:40;;14743:7;14725:40;;14737:4;14725:40;;;;;;;;;;14625:152;14546:238;;:::o;31508:278::-;31594:7;31626:1;31622;:5;31629:12;31614:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;31653:9;31669:1;31665;:5;;;;:::i;:::-;31653:17;;31777:1;31770:8;;;31508:278;;;;;:::o;25246:671::-;25393:1;25377:18;;:4;:18;;;25369:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25470:1;25456:16;;:2;:16;;;25448:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25525:38;25546:4;25552:2;25556:6;25525:20;:38::i;:::-;25576:19;25598:9;:15;25608:4;25598:15;;;;;;;;;;;;;;;;25576:37;;25647:6;25632:11;:21;;25624:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;25764:6;25750:11;:20;25732:9;:15;25742:4;25732:15;;;;;;;;;;;;;;;:38;;;;25809:6;25792:9;:13;25802:2;25792:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;25848:2;25833:26;;25842:4;25833:26;;;25852:6;25833:26;;;;;;:::i;:::-;;;;;;;;25872:37;25892:4;25898:2;25902:6;25872:19;:37::i;:::-;25358:559;25246:671;;;:::o;16716:451::-;16791:13;16817:19;16862:1;16853:6;16849:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16839:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16817:47;;16875:15;:6;16882:1;16875:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16901;:6;16908:1;16901:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;16932:9;16957:1;16948:6;16944:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16932:26;;16927:135;16964:1;16960;:5;16927:135;;;16999:12;17020:3;17012:5;:11;16999:25;;;;;;;:::i;:::-;;;;;16987:6;16994:1;16987:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;17049:1;17039:11;;;;;16967:3;;;;:::i;:::-;;;16927:135;;;;17089:1;17080:5;:10;17072:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17152:6;17138:21;;;16716:451;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:77::-;3404:7;3433:5;3422:16;;3367:77;;;:::o;3450:122::-;3523:24;3541:5;3523:24;:::i;:::-;3516:5;3513:35;3503:63;;3562:1;3559;3552:12;3503:63;3450:122;:::o;3578:139::-;3624:5;3662:6;3649:20;3640:29;;3678:33;3705:5;3678:33;:::i;:::-;3578:139;;;;:::o;3723:474::-;3791:6;3799;3848:2;3836:9;3827:7;3823:23;3819:32;3816:119;;;3854:79;;:::i;:::-;3816:119;3974:1;3999:53;4044:7;4035:6;4024:9;4020:22;3999:53;:::i;:::-;3989:63;;3945:117;4101:2;4127:53;4172:7;4163:6;4152:9;4148:22;4127:53;:::i;:::-;4117:63;;4072:118;3723:474;;;;;:::o;4203:60::-;4231:3;4252:5;4245:12;;4203:60;;;:::o;4269:142::-;4319:9;4352:53;4370:34;4379:24;4397:5;4379:24;:::i;:::-;4370:34;:::i;:::-;4352:53;:::i;:::-;4339:66;;4269:142;;;:::o;4417:126::-;4467:9;4500:37;4531:5;4500:37;:::i;:::-;4487:50;;4417:126;;;:::o;4549:152::-;4625:9;4658:37;4689:5;4658:37;:::i;:::-;4645:50;;4549:152;;;:::o;4707:183::-;4820:63;4877:5;4820:63;:::i;:::-;4815:3;4808:76;4707:183;;:::o;4896:274::-;5015:4;5053:2;5042:9;5038:18;5030:26;;5066:97;5160:1;5149:9;5145:17;5136:6;5066:97;:::i;:::-;4896:274;;;;:::o;5176:329::-;5235:6;5284:2;5272:9;5263:7;5259:23;5255:32;5252:119;;;5290:79;;:::i;:::-;5252:119;5410:1;5435:53;5480:7;5471:6;5460:9;5456:22;5435:53;:::i;:::-;5425:63;;5381:117;5176:329;;;;:::o;5511:118::-;5598:24;5616:5;5598:24;:::i;:::-;5593:3;5586:37;5511:118;;:::o;5635:222::-;5728:4;5766:2;5755:9;5751:18;5743:26;;5779:71;5847:1;5836:9;5832:17;5823:6;5779:71;:::i;:::-;5635:222;;;;:::o;5863:619::-;5940:6;5948;5956;6005:2;5993:9;5984:7;5980:23;5976:32;5973:119;;;6011:79;;:::i;:::-;5973:119;6131:1;6156:53;6201:7;6192:6;6181:9;6177:22;6156:53;:::i;:::-;6146:63;;6102:117;6258:2;6284:53;6329:7;6320:6;6309:9;6305:22;6284:53;:::i;:::-;6274:63;;6229:118;6386:2;6412:53;6457:7;6448:6;6437:9;6433:22;6412:53;:::i;:::-;6402:63;;6357:118;5863:619;;;;;:::o;6488:77::-;6525:7;6554:5;6543:16;;6488:77;;;:::o;6571:122::-;6644:24;6662:5;6644:24;:::i;:::-;6637:5;6634:35;6624:63;;6683:1;6680;6673:12;6624:63;6571:122;:::o;6699:139::-;6745:5;6783:6;6770:20;6761:29;;6799:33;6826:5;6799:33;:::i;:::-;6699:139;;;;:::o;6844:329::-;6903:6;6952:2;6940:9;6931:7;6927:23;6923:32;6920:119;;;6958:79;;:::i;:::-;6920:119;7078:1;7103:53;7148:7;7139:6;7128:9;7124:22;7103:53;:::i;:::-;7093:63;;7049:117;6844:329;;;;:::o;7179:118::-;7266:24;7284:5;7266:24;:::i;:::-;7261:3;7254:37;7179:118;;:::o;7303:222::-;7396:4;7434:2;7423:9;7419:18;7411:26;;7447:71;7515:1;7504:9;7500:17;7491:6;7447:71;:::i;:::-;7303:222;;;;:::o;7531:86::-;7566:7;7606:4;7599:5;7595:16;7584:27;;7531:86;;;:::o;7623:112::-;7706:22;7722:5;7706:22;:::i;:::-;7701:3;7694:35;7623:112;;:::o;7741:214::-;7830:4;7868:2;7857:9;7853:18;7845:26;;7881:67;7945:1;7934:9;7930:17;7921:6;7881:67;:::i;:::-;7741:214;;;;:::o;7961:474::-;8029:6;8037;8086:2;8074:9;8065:7;8061:23;8057:32;8054:119;;;8092:79;;:::i;:::-;8054:119;8212:1;8237:53;8282:7;8273:6;8262:9;8258:22;8237:53;:::i;:::-;8227:63;;8183:117;8339:2;8365:53;8410:7;8401:6;8390:9;8386:22;8365:53;:::i;:::-;8355:63;;8310:118;7961:474;;;;;:::o;8441:116::-;8511:21;8526:5;8511:21;:::i;:::-;8504:5;8501:32;8491:60;;8547:1;8544;8537:12;8491:60;8441:116;:::o;8563:133::-;8606:5;8644:6;8631:20;8622:29;;8660:30;8684:5;8660:30;:::i;:::-;8563:133;;;;:::o;8702:468::-;8767:6;8775;8824:2;8812:9;8803:7;8799:23;8795:32;8792:119;;;8830:79;;:::i;:::-;8792:119;8950:1;8975:53;9020:7;9011:6;9000:9;8996:22;8975:53;:::i;:::-;8965:63;;8921:117;9077:2;9103:50;9145:7;9136:6;9125:9;9121:22;9103:50;:::i;:::-;9093:60;;9048:115;8702:468;;;;;:::o;9176:118::-;9263:24;9281:5;9263:24;:::i;:::-;9258:3;9251:37;9176:118;;:::o;9300:222::-;9393:4;9431:2;9420:9;9416:18;9408:26;;9444:71;9512:1;9501:9;9497:17;9488:6;9444:71;:::i;:::-;9300:222;;;;:::o;9528:474::-;9596:6;9604;9653:2;9641:9;9632:7;9628:23;9624:32;9621:119;;;9659:79;;:::i;:::-;9621:119;9779:1;9804:53;9849:7;9840:6;9829:9;9825:22;9804:53;:::i;:::-;9794:63;;9750:117;9906:2;9932:53;9977:7;9968:6;9957:9;9953:22;9932:53;:::i;:::-;9922:63;;9877:118;9528:474;;;;;:::o;10008:::-;10076:6;10084;10133:2;10121:9;10112:7;10108:23;10104:32;10101:119;;;10139:79;;:::i;:::-;10101:119;10259:1;10284:53;10329:7;10320:6;10309:9;10305:22;10284:53;:::i;:::-;10274:63;;10230:117;10386:2;10412:53;10457:7;10448:6;10437:9;10433:22;10412:53;:::i;:::-;10402:63;;10357:118;10008:474;;;;;:::o;10488:180::-;10536:77;10533:1;10526:88;10633:4;10630:1;10623:15;10657:4;10654:1;10647:15;10674:320;10718:6;10755:1;10749:4;10745:12;10735:22;;10802:1;10796:4;10792:12;10823:18;10813:81;;10879:4;10871:6;10867:17;10857:27;;10813:81;10941:2;10933:6;10930:14;10910:18;10907:38;10904:84;;10960:18;;:::i;:::-;10904:84;10725:269;10674:320;;;:::o;11000:229::-;11140:34;11136:1;11128:6;11124:14;11117:58;11209:12;11204:2;11196:6;11192:15;11185:37;11000:229;:::o;11235:366::-;11377:3;11398:67;11462:2;11457:3;11398:67;:::i;:::-;11391:74;;11474:93;11563:3;11474:93;:::i;:::-;11592:2;11587:3;11583:12;11576:19;;11235:366;;;:::o;11607:419::-;11773:4;11811:2;11800:9;11796:18;11788:26;;11860:9;11854:4;11850:20;11846:1;11835:9;11831:17;11824:47;11888:131;12014:4;11888:131;:::i;:::-;11880:139;;11607:419;;;:::o;12032:234::-;12172:34;12168:1;12160:6;12156:14;12149:58;12241:17;12236:2;12228:6;12224:15;12217:42;12032:234;:::o;12272:366::-;12414:3;12435:67;12499:2;12494:3;12435:67;:::i;:::-;12428:74;;12511:93;12600:3;12511:93;:::i;:::-;12629:2;12624:3;12620:12;12613:19;;12272:366;;;:::o;12644:419::-;12810:4;12848:2;12837:9;12833:18;12825:26;;12897:9;12891:4;12887:20;12883:1;12872:9;12868:17;12861:47;12925:131;13051:4;12925:131;:::i;:::-;12917:139;;12644:419;;;:::o;13069:180::-;13117:77;13114:1;13107:88;13214:4;13211:1;13204:15;13238:4;13235:1;13228:15;13255:191;13295:3;13314:20;13332:1;13314:20;:::i;:::-;13309:25;;13348:20;13366:1;13348:20;:::i;:::-;13343:25;;13391:1;13388;13384:9;13377:16;;13412:3;13409:1;13406:10;13403:36;;;13419:18;;:::i;:::-;13403:36;13255:191;;;;:::o;13452:244::-;13592:34;13588:1;13580:6;13576:14;13569:58;13661:27;13656:2;13648:6;13644:15;13637:52;13452:244;:::o;13702:366::-;13844:3;13865:67;13929:2;13924:3;13865:67;:::i;:::-;13858:74;;13941:93;14030:3;13941:93;:::i;:::-;14059:2;14054:3;14050:12;14043:19;;13702:366;;;:::o;14074:419::-;14240:4;14278:2;14267:9;14263:18;14255:26;;14327:9;14321:4;14317:20;14313:1;14302:9;14298:17;14291:47;14355:131;14481:4;14355:131;:::i;:::-;14347:139;;14074:419;;;:::o;14499:235::-;14639:34;14635:1;14627:6;14623:14;14616:58;14708:18;14703:2;14695:6;14691:15;14684:43;14499:235;:::o;14740:366::-;14882:3;14903:67;14967:2;14962:3;14903:67;:::i;:::-;14896:74;;14979:93;15068:3;14979:93;:::i;:::-;15097:2;15092:3;15088:12;15081:19;;14740:366;;;:::o;15112:419::-;15278:4;15316:2;15305:9;15301:18;15293:26;;15365:9;15359:4;15355:20;15351:1;15340:9;15336:17;15329:47;15393:131;15519:4;15393:131;:::i;:::-;15385:139;;15112:419;;;:::o;15537:239::-;15677:34;15673:1;15665:6;15661:14;15654:58;15746:22;15741:2;15733:6;15729:15;15722:47;15537:239;:::o;15782:366::-;15924:3;15945:67;16009:2;16004:3;15945:67;:::i;:::-;15938:74;;16021:93;16110:3;16021:93;:::i;:::-;16139:2;16134:3;16130:12;16123:19;;15782:366;;;:::o;16154:419::-;16320:4;16358:2;16347:9;16343:18;16335:26;;16407:9;16401:4;16397:20;16393:1;16382:9;16378:17;16371:47;16435:131;16561:4;16435:131;:::i;:::-;16427:139;;16154:419;;;:::o;16579:224::-;16719:34;16715:1;16707:6;16703:14;16696:58;16788:7;16783:2;16775:6;16771:15;16764:32;16579:224;:::o;16809:366::-;16951:3;16972:67;17036:2;17031:3;16972:67;:::i;:::-;16965:74;;17048:93;17137:3;17048:93;:::i;:::-;17166:2;17161:3;17157:12;17150:19;;16809:366;;;:::o;17181:419::-;17347:4;17385:2;17374:9;17370:18;17362:26;;17434:9;17428:4;17424:20;17420:1;17409:9;17405:17;17398:47;17462:131;17588:4;17462:131;:::i;:::-;17454:139;;17181:419;;;:::o;17606:224::-;17746:34;17742:1;17734:6;17730:14;17723:58;17815:7;17810:2;17802:6;17798:15;17791:32;17606:224;:::o;17836:366::-;17978:3;17999:67;18063:2;18058:3;17999:67;:::i;:::-;17992:74;;18075:93;18164:3;18075:93;:::i;:::-;18193:2;18188:3;18184:12;18177:19;;17836:366;;;:::o;18208:419::-;18374:4;18412:2;18401:9;18397:18;18389:26;;18461:9;18455:4;18451:20;18447:1;18436:9;18432:17;18425:47;18489:131;18615:4;18489:131;:::i;:::-;18481:139;;18208:419;;;:::o;18633:231::-;18773:34;18769:1;18761:6;18757:14;18750:58;18842:14;18837:2;18829:6;18825:15;18818:39;18633:231;:::o;18870:366::-;19012:3;19033:67;19097:2;19092:3;19033:67;:::i;:::-;19026:74;;19109:93;19198:3;19109:93;:::i;:::-;19227:2;19222:3;19218:12;19211:19;;18870:366;;;:::o;19242:419::-;19408:4;19446:2;19435:9;19431:18;19423:26;;19495:9;19489:4;19485:20;19481:1;19470:9;19466:17;19459:47;19523:131;19649:4;19523:131;:::i;:::-;19515:139;;19242:419;;;:::o;19667:238::-;19807:34;19803:1;19795:6;19791:14;19784:58;19876:21;19871:2;19863:6;19859:15;19852:46;19667:238;:::o;19911:366::-;20053:3;20074:67;20138:2;20133:3;20074:67;:::i;:::-;20067:74;;20150:93;20239:3;20150:93;:::i;:::-;20268:2;20263:3;20259:12;20252:19;;19911:366;;;:::o;20283:419::-;20449:4;20487:2;20476:9;20472:18;20464:26;;20536:9;20530:4;20526:20;20522:1;20511:9;20507:17;20500:47;20564:131;20690:4;20564:131;:::i;:::-;20556:139;;20283:419;;;:::o;20708:223::-;20848:34;20844:1;20836:6;20832:14;20825:58;20917:6;20912:2;20904:6;20900:15;20893:31;20708:223;:::o;20937:366::-;21079:3;21100:67;21164:2;21159:3;21100:67;:::i;:::-;21093:74;;21176:93;21265:3;21176:93;:::i;:::-;21294:2;21289:3;21285:12;21278:19;;20937:366;;;:::o;21309:419::-;21475:4;21513:2;21502:9;21498:18;21490:26;;21562:9;21556:4;21552:20;21548:1;21537:9;21533:17;21526:47;21590:131;21716:4;21590:131;:::i;:::-;21582:139;;21309:419;;;:::o;21734:221::-;21874:34;21870:1;21862:6;21858:14;21851:58;21943:4;21938:2;21930:6;21926:15;21919:29;21734:221;:::o;21961:366::-;22103:3;22124:67;22188:2;22183:3;22124:67;:::i;:::-;22117:74;;22200:93;22289:3;22200:93;:::i;:::-;22318:2;22313:3;22309:12;22302:19;;21961:366;;;:::o;22333:419::-;22499:4;22537:2;22526:9;22522:18;22514:26;;22586:9;22580:4;22576:20;22572:1;22561:9;22557:17;22550:47;22614:131;22740:4;22614:131;:::i;:::-;22606:139;;22333:419;;;:::o;22758:179::-;22898:31;22894:1;22886:6;22882:14;22875:55;22758:179;:::o;22943:366::-;23085:3;23106:67;23170:2;23165:3;23106:67;:::i;:::-;23099:74;;23182:93;23271:3;23182:93;:::i;:::-;23300:2;23295:3;23291:12;23284:19;;22943:366;;;:::o;23315:419::-;23481:4;23519:2;23508:9;23504:18;23496:26;;23568:9;23562:4;23558:20;23554:1;23543:9;23539:17;23532:47;23596:131;23722:4;23596:131;:::i;:::-;23588:139;;23315:419;;;:::o;23740:224::-;23880:34;23876:1;23868:6;23864:14;23857:58;23949:7;23944:2;23936:6;23932:15;23925:32;23740:224;:::o;23970:366::-;24112:3;24133:67;24197:2;24192:3;24133:67;:::i;:::-;24126:74;;24209:93;24298:3;24209:93;:::i;:::-;24327:2;24322:3;24318:12;24311:19;;23970:366;;;:::o;24342:419::-;24508:4;24546:2;24535:9;24531:18;24523:26;;24595:9;24589:4;24585:20;24581:1;24570:9;24566:17;24559:47;24623:131;24749:4;24623:131;:::i;:::-;24615:139;;24342:419;;;:::o;24767:222::-;24907:34;24903:1;24895:6;24891:14;24884:58;24976:5;24971:2;24963:6;24959:15;24952:30;24767:222;:::o;24995:366::-;25137:3;25158:67;25222:2;25217:3;25158:67;:::i;:::-;25151:74;;25234:93;25323:3;25234:93;:::i;:::-;25352:2;25347:3;25343:12;25336:19;;24995:366;;;:::o;25367:419::-;25533:4;25571:2;25560:9;25556:18;25548:26;;25620:9;25614:4;25610:20;25606:1;25595:9;25591:17;25584:47;25648:131;25774:4;25648:131;:::i;:::-;25640:139;;25367:419;;;:::o;25792:175::-;25932:27;25928:1;25920:6;25916:14;25909:51;25792:175;:::o;25973:366::-;26115:3;26136:67;26200:2;26195:3;26136:67;:::i;:::-;26129:74;;26212:93;26301:3;26212:93;:::i;:::-;26330:2;26325:3;26321:12;26314:19;;25973:366;;;:::o;26345:419::-;26511:4;26549:2;26538:9;26534:18;26526:26;;26598:9;26592:4;26588:20;26584:1;26573:9;26569:17;26562:47;26626:131;26752:4;26626:131;:::i;:::-;26618:139;;26345:419;;;:::o;26770:176::-;26910:28;26906:1;26898:6;26894:14;26887:52;26770:176;:::o;26952:366::-;27094:3;27115:67;27179:2;27174:3;27115:67;:::i;:::-;27108:74;;27191:93;27280:3;27191:93;:::i;:::-;27309:2;27304:3;27300:12;27293:19;;26952:366;;;:::o;27324:419::-;27490:4;27528:2;27517:9;27513:18;27505:26;;27577:9;27571:4;27567:20;27563:1;27552:9;27548:17;27541:47;27605:131;27731:4;27605:131;:::i;:::-;27597:139;;27324:419;;;:::o;27749:180::-;27797:77;27794:1;27787:88;27894:4;27891:1;27884:15;27918:4;27915:1;27908:15;27935:225;28075:34;28071:1;28063:6;28059:14;28052:58;28144:8;28139:2;28131:6;28127:15;28120:33;27935:225;:::o;28166:366::-;28308:3;28329:67;28393:2;28388:3;28329:67;:::i;:::-;28322:74;;28405:93;28494:3;28405:93;:::i;:::-;28523:2;28518:3;28514:12;28507:19;;28166:366;;;:::o;28538:419::-;28704:4;28742:2;28731:9;28727:18;28719:26;;28791:9;28785:4;28781:20;28777:1;28766:9;28762:17;28755:47;28819:131;28945:4;28819:131;:::i;:::-;28811:139;;28538:419;;;:::o;28963:194::-;29003:4;29023:20;29041:1;29023:20;:::i;:::-;29018:25;;29057:20;29075:1;29057:20;:::i;:::-;29052:25;;29101:1;29098;29094:9;29086:17;;29125:1;29119:4;29116:11;29113:37;;;29130:18;;:::i;:::-;29113:37;28963:194;;;;:::o;29163:180::-;29211:77;29208:1;29201:88;29308:4;29305:1;29298:15;29332:4;29329:1;29322:15;29349:143;29406:5;29437:6;29431:13;29422:22;;29453:33;29480:5;29453:33;:::i;:::-;29349:143;;;;:::o;29498:351::-;29568:6;29617:2;29605:9;29596:7;29592:23;29588:32;29585:119;;;29623:79;;:::i;:::-;29585:119;29743:1;29768:64;29824:7;29815:6;29804:9;29800:22;29768:64;:::i;:::-;29758:74;;29714:128;29498:351;;;;:::o;29855:85::-;29900:7;29929:5;29918:16;;29855:85;;;:::o;29946:158::-;30004:9;30037:61;30055:42;30064:32;30090:5;30064:32;:::i;:::-;30055:42;:::i;:::-;30037:61;:::i;:::-;30024:74;;29946:158;;;:::o;30110:147::-;30205:45;30244:5;30205:45;:::i;:::-;30200:3;30193:58;30110:147;;:::o;30263:114::-;30330:6;30364:5;30358:12;30348:22;;30263:114;;;:::o;30383:184::-;30482:11;30516:6;30511:3;30504:19;30556:4;30551:3;30547:14;30532:29;;30383:184;;;;:::o;30573:132::-;30640:4;30663:3;30655:11;;30693:4;30688:3;30684:14;30676:22;;30573:132;;;:::o;30711:108::-;30788:24;30806:5;30788:24;:::i;:::-;30783:3;30776:37;30711:108;;:::o;30825:179::-;30894:10;30915:46;30957:3;30949:6;30915:46;:::i;:::-;30993:4;30988:3;30984:14;30970:28;;30825:179;;;;:::o;31010:113::-;31080:4;31112;31107:3;31103:14;31095:22;;31010:113;;;:::o;31159:732::-;31278:3;31307:54;31355:5;31307:54;:::i;:::-;31377:86;31456:6;31451:3;31377:86;:::i;:::-;31370:93;;31487:56;31537:5;31487:56;:::i;:::-;31566:7;31597:1;31582:284;31607:6;31604:1;31601:13;31582:284;;;31683:6;31677:13;31710:63;31769:3;31754:13;31710:63;:::i;:::-;31703:70;;31796:60;31849:6;31796:60;:::i;:::-;31786:70;;31642:224;31629:1;31626;31622:9;31617:14;;31582:284;;;31586:14;31882:3;31875:10;;31283:608;;;31159:732;;;;:::o;31897:831::-;32160:4;32198:3;32187:9;32183:19;32175:27;;32212:71;32280:1;32269:9;32265:17;32256:6;32212:71;:::i;:::-;32293:80;32369:2;32358:9;32354:18;32345:6;32293:80;:::i;:::-;32420:9;32414:4;32410:20;32405:2;32394:9;32390:18;32383:48;32448:108;32551:4;32542:6;32448:108;:::i;:::-;32440:116;;32566:72;32634:2;32623:9;32619:18;32610:6;32566:72;:::i;:::-;32648:73;32716:3;32705:9;32701:19;32692:6;32648:73;:::i;:::-;31897:831;;;;;;;;:::o;32734:483::-;32905:4;32943:2;32932:9;32928:18;32920:26;;32956:71;33024:1;33013:9;33009:17;33000:6;32956:71;:::i;:::-;33074:9;33068:4;33064:20;33059:2;33048:9;33044:18;33037:48;33102:108;33205:4;33196:6;33102:108;:::i;:::-;33094:116;;32734:483;;;;;:::o;33223:177::-;33363:29;33359:1;33351:6;33347:14;33340:53;33223:177;:::o;33406:366::-;33548:3;33569:67;33633:2;33628:3;33569:67;:::i;:::-;33562:74;;33645:93;33734:3;33645:93;:::i;:::-;33763:2;33758:3;33754:12;33747:19;;33406:366;;;:::o;33778:419::-;33944:4;33982:2;33971:9;33967:18;33959:26;;34031:9;34025:4;34021:20;34017:1;34006:9;34002:17;33995:47;34059:131;34185:4;34059:131;:::i;:::-;34051:139;;33778:419;;;:::o;34203:410::-;34243:7;34266:20;34284:1;34266:20;:::i;:::-;34261:25;;34300:20;34318:1;34300:20;:::i;:::-;34295:25;;34355:1;34352;34348:9;34377:30;34395:11;34377:30;:::i;:::-;34366:41;;34556:1;34547:7;34543:15;34540:1;34537:22;34517:1;34510:9;34490:83;34467:139;;34586:18;;:::i;:::-;34467:139;34251:362;34203:410;;;;:::o;34619:180::-;34667:77;34664:1;34657:88;34764:4;34761:1;34754:15;34788:4;34785:1;34778:15;34805:185;34845:1;34862:20;34880:1;34862:20;:::i;:::-;34857:25;;34896:20;34914:1;34896:20;:::i;:::-;34891:25;;34935:1;34925:35;;34940:18;;:::i;:::-;34925:35;34982:1;34979;34975:9;34970:14;;34805:185;;;;:::o;34996:220::-;35136:34;35132:1;35124:6;35120:14;35113:58;35205:3;35200:2;35192:6;35188:15;35181:28;34996:220;:::o;35222:366::-;35364:3;35385:67;35449:2;35444:3;35385:67;:::i;:::-;35378:74;;35461:93;35550:3;35461:93;:::i;:::-;35579:2;35574:3;35570:12;35563:19;;35222:366;;;:::o;35594:419::-;35760:4;35798:2;35787:9;35783:18;35775:26;;35847:9;35841:4;35837:20;35833:1;35822:9;35818:17;35811:47;35875:131;36001:4;35875:131;:::i;:::-;35867:139;;35594:419;;;:::o;36019:220::-;36159:34;36155:1;36147:6;36143:14;36136:58;36228:3;36223:2;36215:6;36211:15;36204:28;36019:220;:::o;36245:366::-;36387:3;36408:67;36472:2;36467:3;36408:67;:::i;:::-;36401:74;;36484:93;36573:3;36484:93;:::i;:::-;36602:2;36597:3;36593:12;36586:19;;36245:366;;;:::o;36617:419::-;36783:4;36821:2;36810:9;36806:18;36798:26;;36870:9;36864:4;36860:20;36856:1;36845:9;36841:17;36834:47;36898:131;37024:4;36898:131;:::i;:::-;36890:139;;36617:419;;;:::o;37042:221::-;37182:34;37178:1;37170:6;37166:14;37159:58;37251:4;37246:2;37238:6;37234:15;37227:29;37042:221;:::o;37269:366::-;37411:3;37432:67;37496:2;37491:3;37432:67;:::i;:::-;37425:74;;37508:93;37597:3;37508:93;:::i;:::-;37626:2;37621:3;37617:12;37610:19;;37269:366;;;:::o;37641:419::-;37807:4;37845:2;37834:9;37830:18;37822:26;;37894:9;37888:4;37884:20;37880:1;37869:9;37865:17;37858:47;37922:131;38048:4;37922:131;:::i;:::-;37914:139;;37641:419;;;:::o;38066:148::-;38168:11;38205:3;38190:18;;38066:148;;;;:::o;38220:173::-;38360:25;38356:1;38348:6;38344:14;38337:49;38220:173;:::o;38399:402::-;38559:3;38580:85;38662:2;38657:3;38580:85;:::i;:::-;38573:92;;38674:93;38763:3;38674:93;:::i;:::-;38792:2;38787:3;38783:12;38776:19;;38399:402;;;:::o;38807:390::-;38913:3;38941:39;38974:5;38941:39;:::i;:::-;38996:89;39078:6;39073:3;38996:89;:::i;:::-;38989:96;;39094:65;39152:6;39147:3;39140:4;39133:5;39129:16;39094:65;:::i;:::-;39184:6;39179:3;39175:16;39168:23;;38917:280;38807:390;;;;:::o;39203:167::-;39343:19;39339:1;39331:6;39327:14;39320:43;39203:167;:::o;39376:402::-;39536:3;39557:85;39639:2;39634:3;39557:85;:::i;:::-;39550:92;;39651:93;39740:3;39651:93;:::i;:::-;39769:2;39764:3;39760:12;39753:19;;39376:402;;;:::o;39784:967::-;40166:3;40188:148;40332:3;40188:148;:::i;:::-;40181:155;;40353:95;40444:3;40435:6;40353:95;:::i;:::-;40346:102;;40465:148;40609:3;40465:148;:::i;:::-;40458:155;;40630:95;40721:3;40712:6;40630:95;:::i;:::-;40623:102;;40742:3;40735:10;;39784:967;;;;;:::o;40757:171::-;40796:3;40819:24;40837:5;40819:24;:::i;:::-;40810:33;;40865:4;40858:5;40855:15;40852:41;;40873:18;;:::i;:::-;40852:41;40920:1;40913:5;40909:13;40902:20;;40757:171;;;:::o;40934:182::-;41074:34;41070:1;41062:6;41058:14;41051:58;40934:182;:::o;41122:366::-;41264:3;41285:67;41349:2;41344:3;41285:67;:::i;:::-;41278:74;;41361:93;41450:3;41361:93;:::i;:::-;41479:2;41474:3;41470:12;41463:19;;41122:366;;;:::o;41494:419::-;41660:4;41698:2;41687:9;41683:18;41675:26;;41747:9;41741:4;41737:20;41733:1;41722:9;41718:17;41711:47;41775:131;41901:4;41775:131;:::i;:::-;41767:139;;41494:419;;;:::o

Swarm Source

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