ETH Price: $1,945.58 (-2.08%)
Gas: 0.05 Gwei
 

Overview

Max Total Supply

988.776906 ERC20 ***

Holders

13

Transfers

-
22 ( 1,000.00%)

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 6 Decimals)

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:
BoringVault

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2025-10-29
*/

// SPDX-License-Identifier: MIT
pragma solidity =0.8.21 >=0.8.0 ^0.8.20;

// lib/solmate/src/auth/Auth.sol

/// @notice Provides a flexible and updatable auth pattern which is completely separate from application logic.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
abstract contract Auth {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    event AuthorityUpdated(address indexed user, Authority indexed newAuthority);

    address public owner;

    Authority public authority;

    constructor(address _owner, Authority _authority) {
        owner = _owner;
        authority = _authority;

        emit OwnershipTransferred(msg.sender, _owner);
        emit AuthorityUpdated(msg.sender, _authority);
    }

    modifier requiresAuth() virtual {
        require(isAuthorized(msg.sender, msg.sig), "UNAUTHORIZED");

        _;
    }

    function isAuthorized(address user, bytes4 functionSig) internal view virtual returns (bool) {
        Authority auth = authority; // Memoizing authority saves us a warm SLOAD, around 100 gas.

        // Checking if the caller is the owner only after calling the authority saves gas in most cases, but be
        // aware that this makes protected functions uncallable even to the owner if the authority is out of order.
        return (address(auth) != address(0) && auth.canCall(user, address(this), functionSig)) || user == owner;
    }

    function setAuthority(Authority newAuthority) public virtual {
        // We check if the caller is the owner first because we want to ensure they can
        // always swap out the authority even if it's reverting or using up a lot of gas.
        require(msg.sender == owner || authority.canCall(msg.sender, address(this), msg.sig));

        authority = newAuthority;

        emit AuthorityUpdated(msg.sender, newAuthority);
    }

    function transferOwnership(address newOwner) public virtual requiresAuth {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

/// @notice A generic interface for a contract which provides authorization data to an Auth instance.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Auth.sol)
/// @author Modified from Dappsys (https://github.com/dapphub/ds-auth/blob/master/src/auth.sol)
interface Authority {
    function canCall(
        address user,
        address target,
        bytes4 functionSig
    ) external view returns (bool);
}

// src/interfaces/BeforeTransferHook.sol

interface BeforeTransferHook {

    function beforeTransfer(address from) external view;

}

// lib/solmate/src/tokens/ERC20.sol

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

// lib/openzeppelin-contracts/contracts/utils/Errors.sol

/**
 * @dev Collection of common custom errors used in multiple contracts
 *
 * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
 * It is recommended to avoid relying on the error API for critical functionality.
 */
library Errors {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error InsufficientBalance(uint256 balance, uint256 needed);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedCall();

    /**
     * @dev The deployment failed.
     */
    error FailedDeployment();

    /**
     * @dev A necessary precompile is missing.
     */
    error MissingPrecompile(address);
}

// lib/solmate/src/utils/FixedPointMathLib.sol

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant MAX_UINT256 = 2**256 - 1;

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }

    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }

    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }

    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
    }

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // Divide x * y by the denominator.
            z := div(mul(x, y), denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // If x * y modulo the denominator is strictly greater than 0,
            // 1 is added to round up the division of x * y by the denominator.
            z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
        }
    }

    function rpow(
        uint256 x,
        uint256 n,
        uint256 scalar
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := scalar
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store scalar in z for now.
                    z := scalar
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, scalar)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, scalar)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, scalar)
                    }
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            let y := x // We start y at x, which will help us make our initial estimate.

            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // We check y >= 2^(k + 8) but shift right by k bits
            // each branch to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }

            // Goal was to get z*z*y within a small factor of x. More iterations could
            // get y in a tighter range. Currently, we will have y in [256, 256*2^16).
            // We ensured y >= 256 so that the relative difference between y and y+1 is small.
            // That's not possible if x < 256 but we can just verify those cases exhaustively.

            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.

            // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
            // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.

            // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
            // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.

            // There is no overflow risk here since y < 2^136 after the first branch above.
            z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
            // If you don't care whether the floor or ceil square root is returned, you can remove this statement.
            z := sub(z, lt(div(x, z), z))
        }
    }

    function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Mod x by y. Note this will return
            // 0 instead of reverting if y is zero.
            z := mod(x, y)
        }
    }

    function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            // Divide x by y. Note this will return
            // 0 instead of reverting if y is zero.
            r := div(x, y)
        }
    }

    function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Add 1 to x * y if x % y > 0. Note this will
            // return 0 instead of reverting if y is zero.
            z := add(gt(mod(x, y), 0), div(x, y))
        }
    }
}

// lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC 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);
}

// lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol)

/**
 * @title ERC-721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC-721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be
     * reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// lib/openzeppelin-contracts/contracts/utils/Address.sol

// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert Errors.InsufficientBalance(address(this).balance, amount);
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert Errors.FailedCall();
        }
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason or custom error, it is bubbled
     * up by this function (like regular Solidity function calls). However, if
     * the call reverted with no returned reason, this function reverts with a
     * {Errors.FailedCall} error.
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case
     * of an unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {Errors.FailedCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert Errors.FailedCall();
        }
    }
}

// lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol

// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC-165 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);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/utils/ERC721Holder.sol)

/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or
 * {IERC721-setApprovalForAll}.
 */
abstract contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

// lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/IERC1155Receiver.sol)

/**
 * @dev Interface that must be implemented by smart contracts in order to receive
 * ERC-1155 token transfers.
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC-1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC-1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// lib/solmate/src/utils/SafeTransferLib.sol

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

// lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC1155/utils/ERC1155Holder.sol)

/**
 * @dev Simple implementation of `IERC1155Receiver` that will allow a contract to hold ERC-1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 */
abstract contract ERC1155Holder is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }

    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

// src/base/BoringVault.sol

/**
 * @title BoringVault
 * @custom:security-contact security@molecularlabs.io
 */
contract BoringVault is ERC20, Auth, ERC721Holder, ERC1155Holder {

    using Address for address;
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint256;

    // ========================================= STATE =========================================

    /**
     * @notice Contract responsible for implementing `beforeTransfer`.
     */
    BeforeTransferHook public hook;

    //============================== EVENTS ===============================

    event Enter(address indexed from, address indexed asset, uint256 amount, address indexed to, uint256 shares);
    event Exit(address indexed to, address indexed asset, uint256 amount, address indexed from, uint256 shares);

    //============================== CONSTRUCTOR ===============================

    constructor(
        address _owner,
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    )
        ERC20(_name, _symbol, _decimals)
        Auth(_owner, Authority(address(0)))
    { }

    //============================== MANAGE ===============================

    /**
     * @notice Allows manager to make an arbitrary function call from this contract.
     * @dev Callable by MANAGER_ROLE.
     */
    function manage(
        address target,
        bytes calldata data,
        uint256 value
    )
        external
        requiresAuth
        returns (bytes memory result)
    {
        result = target.functionCallWithValue(data, value);
    }

    /**
     * @notice Allows manager to make arbitrary function calls from this contract.
     * @dev Callable by MANAGER_ROLE.
     */
    function manage(
        address[] calldata targets,
        bytes[] calldata data,
        uint256[] calldata values
    )
        external
        requiresAuth
        returns (bytes[] memory results)
    {
        uint256 targetsLength = targets.length;
        results = new bytes[](targetsLength);
        for (uint256 i; i < targetsLength; ++i) {
            results[i] = targets[i].functionCallWithValue(data[i], values[i]);
        }
    }

    //============================== ENTER ===============================

    /**
     * @notice Allows minter to mint shares, in exchange for assets.
     * @dev If assetAmount is zero, no assets are transferred in.
     * @dev Callable by MINTER_ROLE.
     */
    function enter(
        address from,
        ERC20 asset,
        uint256 assetAmount,
        address to,
        uint256 shareAmount
    )
        external
        requiresAuth
    {
        // Transfer assets in
        if (assetAmount > 0) asset.safeTransferFrom(from, address(this), assetAmount);

        // Mint shares.
        _mint(to, shareAmount);

        emit Enter(from, address(asset), assetAmount, to, shareAmount);
    }

    //============================== EXIT ===============================

    /**
     * @notice Allows burner to burn shares, in exchange for assets.
     * @dev If assetAmount is zero, no assets are transferred out.
     * @dev Callable by BURNER_ROLE.
     */
    function exit(
        address to,
        ERC20 asset,
        uint256 assetAmount,
        address from,
        uint256 shareAmount
    )
        external
        requiresAuth
    {
        // Burn shares.
        _burn(from, shareAmount);

        // Transfer assets out.
        if (assetAmount > 0) asset.safeTransfer(to, assetAmount);

        emit Exit(to, address(asset), assetAmount, from, shareAmount);
    }

    //============================== BEFORE TRANSFER HOOK ===============================
    /**
     * @notice Sets the share locker.
     * @notice If set to zero address, the share locker logic is disabled.
     * @dev Callable by OWNER_ROLE.
     */
    function setBeforeTransferHook(address _hook) external requiresAuth {
        hook = BeforeTransferHook(_hook);
    }

    /**
     * @notice Check if from addresses shares are locked, reverting if so.
     */
    function _callBeforeTransfer(address from) internal view {
        if (address(hook) != address(0)) hook.beforeTransfer(from);
    }

    function transfer(address to, uint256 amount) public override returns (bool) {
        _callBeforeTransfer(msg.sender);
        return super.transfer(to, amount);
    }

    function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
        _callBeforeTransfer(from);
        return super.transferFrom(from, to, amount);
    }

    function setNameAndSymbol(string memory _name, string memory _symbol) external requiresAuth {
        name = _name;
        symbol = _symbol;
    }

    //============================== RECEIVE ===============================

    receive() external payable { }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[],"name":"FailedCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Enter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","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":[],"name":"authority","outputs":[{"internalType":"contract Authority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"contract ERC20","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"enter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"contract ERC20","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"shareAmount","type":"uint256"}],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hook","outputs":[{"internalType":"contract BeforeTransferHook","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"manage","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"manage","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Authority","name":"newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hook","type":"address"}],"name":"setBeforeTransferHook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameAndSymbol","outputs":[],"stateMutability":"nonpayable","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"},{"stateMutability":"payable","type":"receive"}]

60e060405234801562000010575f80fd5b50604051620023f8380380620023f8833981016040819052620000339162000263565b835f848484836200004584826200038c565b5060016200005483826200038c565b5060ff81166080524660a0526200006a6200010b565b60c0525050600680546001600160a01b038086166001600160a01b03199283168117909355600780549186169190921617905560405190915033907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a36040516001600160a01b0382169033907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a3505050505050620004ce565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516200013d919062000454565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112620001c9575f80fd5b81516001600160401b0380821115620001e657620001e6620001a5565b604051601f8301601f19908116603f01168101908282118183101715620002115762000211620001a5565b816040528381526020925086838588010111156200022d575f80fd5b5f91505b8382101562000250578582018301518183018401529082019062000231565b5f93810190920192909252949350505050565b5f805f806080858703121562000277575f80fd5b84516001600160a01b03811681146200028e575f80fd5b60208601519094506001600160401b0380821115620002ab575f80fd5b620002b988838901620001b9565b94506040870151915080821115620002cf575f80fd5b50620002de87828801620001b9565b925050606085015160ff81168114620002f5575f80fd5b939692955090935050565b600181811c908216806200031557607f821691505b6020821081036200033457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000387575f81815260208120601f850160051c81016020861015620003625750805b601f850160051c820191505b8181101562000383578281556001016200036e565b5050505b505050565b81516001600160401b03811115620003a857620003a8620001a5565b620003c081620003b9845462000300565b846200033a565b602080601f831160018114620003f6575f8415620003de5750858301515b5f19600386901b1c1916600185901b17855562000383565b5f85815260208120601f198616915b82811015620004265788860151825594840194600190910190840162000405565b50858210156200044457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f808354620004638162000300565b600182811680156200047e57600181146200049457620004c2565b60ff1984168752821515830287019450620004c2565b875f526020805f205f5b85811015620004b95781548a8201529084019082016200049e565b50505082870194505b50929695505050505050565b60805160a05160c051611eff620004f95f395f61096001525f61092b01525f6102fa0152611eff5ff3fe608060405260043610610198575f3560e01c80637a9e5e4b116100e7578063bc197c8111610087578063dd62ed3e11610062578063dd62ed3e14610506578063f23a6e611461053c578063f2fde38b14610567578063f6e715d014610586575f80fd5b8063bc197c811461049d578063bf7e214f146104c8578063d505accf146104e7575f80fd5b80638929565f116100c25780638929565f1461042c5780638da5cb5b1461044b57806395d89b411461046a578063a9059cbb1461047e575f80fd5b80637a9e5e4b146103ab5780637ecebe00146103ca5780637f5a7c7b146103f5575f80fd5b8063224d8703116101525780633644e5151161012d5780633644e5151461032e57806339d6ba32146103425780635a4462151461036157806370a0823114610380575f80fd5b8063224d87031461029e57806323b872dd146102ca578063313ce567146102e9575f80fd5b806301ffc9a7146101a357806306fdde03146101d7578063095ea7b3146101f8578063150b7a021461021757806318160ddd1461025a57806318457e611461027d575f80fd5b3661019f57005b5f80fd5b3480156101ae575f80fd5b506101c26101bd3660046114f0565b6105a5565b60405190151581526020015b60405180910390f35b3480156101e2575f80fd5b506101eb6105db565b6040516101ce9190611564565b348015610203575f80fd5b506101c261021236600461158a565b610666565b348015610222575f80fd5b50610241610231366004611663565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101ce565b348015610265575f80fd5b5061026f60025481565b6040519081526020016101ce565b348015610288575f80fd5b5061029c6102973660046116ca565b6106d1565b005b3480156102a9575f80fd5b506102bd6102b8366004611768565b610796565b6040516101ce91906117fa565b3480156102d5575f80fd5b506101c26102e436600461185a565b610909565b3480156102f4575f80fd5b5061031c7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101ce565b348015610339575f80fd5b5061026f610928565b34801561034d575f80fd5b5061029c61035c3660046116ca565b610982565b34801561036c575f80fd5b5061029c61037b366004611898565b610a30565b34801561038b575f80fd5b5061026f61039a3660046118f7565b60036020525f908152604090205481565b3480156103b6575f80fd5b5061029c6103c53660046118f7565b610a7e565b3480156103d5575f80fd5b5061026f6103e43660046118f7565b60056020525f908152604090205481565b348015610400575f80fd5b50600854610414906001600160a01b031681565b6040516001600160a01b0390911681526020016101ce565b348015610437575f80fd5b5061029c6104463660046118f7565b610b63565b348015610456575f80fd5b50600654610414906001600160a01b031681565b348015610475575f80fd5b506101eb610bb6565b348015610489575f80fd5b506101c261049836600461158a565b610bc3565b3480156104a8575f80fd5b506102416104b736600461198e565b63bc197c8160e01b95945050505050565b3480156104d3575f80fd5b50600754610414906001600160a01b031681565b3480156104f2575f80fd5b5061029c610501366004611a34565b610bd7565b348015610511575f80fd5b5061026f610520366004611aa5565b600460209081525f928352604080842090915290825290205481565b348015610547575f80fd5b50610241610556366004611adc565b63f23a6e6160e01b95945050505050565b348015610572575f80fd5b5061029c6105813660046118f7565b610e15565b348015610591575f80fd5b506101eb6105a0366004611b3f565b610e91565b5f6001600160e01b03198216630271189760e51b14806105d557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80546105e790611bc2565b80601f016020809104026020016040519081016040528092919081815260200182805461061390611bc2565b801561065e5780601f106106355761010080835404028352916020019161065e565b820191905f5260205f20905b81548152906001019060200180831161064157829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106c09086815260200190565b60405180910390a350600192915050565b6106e6335f356001600160e01b031916610f17565b61070b5760405162461bcd60e51b815260040161070290611bfa565b60405180910390fd5b6107158282610fbe565b821561072f5761072f6001600160a01b0385168685611025565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc60438685604051610787929190918252602082015260400190565b60405180910390a45050505050565b60606107ad335f356001600160e01b031916610f17565b6107c95760405162461bcd60e51b815260040161070290611bfa565b85806001600160401b038111156107e2576107e26115b4565b60405190808252806020026020018201604052801561081557816020015b60608152602001906001900390816108005790505b5091505f5b818110156108fd576108cf87878381811061083757610837611c20565b90506020028101906108499190611c34565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925088915085905081811061089157610891611c20565b905060200201358b8b858181106108aa576108aa611c20565b90506020020160208101906108bf91906118f7565b6001600160a01b031691906110a8565b8382815181106108e1576108e1611c20565b6020026020010181905250806108f690611c8a565b905061081a565b50509695505050505050565b5f61091384611148565b61091e8484846111b6565b90505b9392505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000461461095d57610958611290565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b610997335f356001600160e01b031916610f17565b6109b35760405162461bcd60e51b815260040161070290611bfa565b82156109ce576109ce6001600160a01b038516863086611328565b6109d882826113b9565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fea00f88768a86184a6e515238a549c171769fe7460a011d6fd0bcd48ca078ea48685604051610787929190918252602082015260400190565b610a45335f356001600160e01b031916610f17565b610a615760405162461bcd60e51b815260040161070290611bfa565b5f610a6c8382611cef565b506001610a798282611cef565b505050565b6006546001600160a01b0316331480610b10575060075460405163b700961360e01b81526001600160a01b039091169063b700961390610ad190339030906001600160e01b03195f351690600401611daa565b602060405180830381865afa158015610aec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b109190611dd7565b610b18575f80fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b610b78335f356001600160e01b031916610f17565b610b945760405162461bcd60e51b815260040161070290611bfa565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600180546105e790611bc2565b5f610bcd33611148565b6109218383611408565b42841015610c275760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610702565b5f6001610c32610928565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610d3a573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610d705750876001600160a01b0316816001600160a01b0316145b610dad5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610702565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b610e2a335f356001600160e01b031916610f17565b610e465760405162461bcd60e51b815260040161070290611bfa565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6060610ea8335f356001600160e01b031916610f17565b610ec45760405162461bcd60e51b815260040161070290611bfa565b610f0e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b038816919050846110a8565b95945050505050565b6007545f906001600160a01b03168015801590610f9e575060405163b700961360e01b81526001600160a01b0382169063b700961390610f5f90879030908890600401611daa565b602060405180830381865afa158015610f7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9e9190611dd7565b80610fb657506006546001600160a01b038581169116145b949350505050565b6001600160a01b0382165f9081526003602052604081208054839290610fe5908490611df6565b90915550506002805482900390556040518181525f906001600160a01b038416905f80516020611eaa833981519152906020015b60405180910390a35050565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f5114161716915050806110a25760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610702565b50505050565b6060814710156110d45760405163cf47918160e01b815247600482015260248101839052604401610702565b5f80856001600160a01b031684866040516110ef9190611e09565b5f6040518083038185875af1925050503d805f8114611129576040519150601f19603f3d011682016040523d82523d5f602084013e61112e565b606091505b509150915061113e86838361146b565b9695505050505050565b6008546001600160a01b0316156111b35760085460405163e83931af60e01b81526001600160a01b0383811660048301529091169063e83931af906024015f6040518083038186803b15801561119c575f80fd5b505afa1580156111ae573d5f803e3d5ffd5b505050505b50565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f19811461120f576111eb8382611df6565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f9081526003602052604081208054859290611236908490611df6565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716905f80516020611eaa8339815191529061127d9087815260200190565b60405180910390a3506001949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516112c09190611e24565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af13d15601f3d1160015f5114161716915050806111ae5760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610702565b8060025f8282546113ca9190611e96565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481525f80516020611eaa8339815191529101611019565b335f90815260036020526040812080548391908390611428908490611df6565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133905f80516020611eaa833981519152906106c09086815260200190565b6060826114805761147b826114c7565b610921565b815115801561149757506001600160a01b0384163b155b156114c057604051639996b31560e01b81526001600160a01b0385166004820152602401610702565b5080610921565b8051156114d75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f60208284031215611500575f80fd5b81356001600160e01b031981168114610921575f80fd5b5f5b83811015611531578181015183820152602001611519565b50505f910152565b5f8151808452611550816020860160208601611517565b601f01601f19169290920160200192915050565b602081525f6109216020830184611539565b6001600160a01b03811681146111b3575f80fd5b5f806040838503121561159b575f80fd5b82356115a681611576565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115f0576115f06115b4565b604052919050565b5f82601f830112611607575f80fd5b81356001600160401b03811115611620576116206115b4565b611633601f8201601f19166020016115c8565b818152846020838601011115611647575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611676575f80fd5b843561168181611576565b9350602085013561169181611576565b92506040850135915060608501356001600160401b038111156116b2575f80fd5b6116be878288016115f8565b91505092959194509250565b5f805f805f60a086880312156116de575f80fd5b85356116e981611576565b945060208601356116f981611576565b935060408601359250606086013561171081611576565b949793965091946080013592915050565b5f8083601f840112611731575f80fd5b5081356001600160401b03811115611747575f80fd5b6020830191508360208260051b8501011115611761575f80fd5b9250929050565b5f805f805f806060878903121561177d575f80fd5b86356001600160401b0380821115611793575f80fd5b61179f8a838b01611721565b909850965060208901359150808211156117b7575f80fd5b6117c38a838b01611721565b909650945060408901359150808211156117db575f80fd5b506117e889828a01611721565b979a9699509497509295939492505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b8281101561184d57603f1988860301845261183b858351611539565b9450928501929085019060010161181f565b5092979650505050505050565b5f805f6060848603121561186c575f80fd5b833561187781611576565b9250602084013561188781611576565b929592945050506040919091013590565b5f80604083850312156118a9575f80fd5b82356001600160401b03808211156118bf575f80fd5b6118cb868387016115f8565b935060208501359150808211156118e0575f80fd5b506118ed858286016115f8565b9150509250929050565b5f60208284031215611907575f80fd5b813561092181611576565b5f82601f830112611921575f80fd5b813560206001600160401b0382111561193c5761193c6115b4565b8160051b61194b8282016115c8565b9283528481018201928281019087851115611964575f80fd5b83870192505b848310156119835782358252918301919083019061196a565b979650505050505050565b5f805f805f60a086880312156119a2575f80fd5b85356119ad81611576565b945060208601356119bd81611576565b935060408601356001600160401b03808211156119d8575f80fd5b6119e489838a01611912565b945060608801359150808211156119f9575f80fd5b611a0589838a01611912565b93506080880135915080821115611a1a575f80fd5b50611a27888289016115f8565b9150509295509295909350565b5f805f805f805f60e0888a031215611a4a575f80fd5b8735611a5581611576565b96506020880135611a6581611576565b95506040880135945060608801359350608088013560ff81168114611a88575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611ab6575f80fd5b8235611ac181611576565b91506020830135611ad181611576565b809150509250929050565b5f805f805f60a08688031215611af0575f80fd5b8535611afb81611576565b94506020860135611b0b81611576565b9350604086013592506060860135915060808601356001600160401b03811115611b33575f80fd5b611a27888289016115f8565b5f805f8060608587031215611b52575f80fd5b8435611b5d81611576565b935060208501356001600160401b0380821115611b78575f80fd5b818701915087601f830112611b8b575f80fd5b813581811115611b99575f80fd5b886020828501011115611baa575f80fd5b95986020929092019750949560400135945092505050565b600181811c90821680611bd657607f821691505b602082108103611bf457634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112611c49575f80fd5b8301803591506001600160401b03821115611c62575f80fd5b602001915036819003821315611761575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201611c9b57611c9b611c76565b5060010190565b601f821115610a79575f81815260208120601f850160051c81016020861015611cc85750805b601f850160051c820191505b81811015611ce757828155600101611cd4565b505050505050565b81516001600160401b03811115611d0857611d086115b4565b611d1c81611d168454611bc2565b84611ca2565b602080601f831160018114611d4f575f8415611d385750858301515b5f19600386901b1c1916600185901b178555611ce7565b5f85815260208120601f198616915b82811015611d7d57888601518255948401946001909101908401611d5e565b5085821015611d9a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215611de7575f80fd5b81518015158114610921575f80fd5b818103818111156105d5576105d5611c76565b5f8251611e1a818460208701611517565b9190910192915050565b5f808354611e3181611bc2565b60018281168015611e495760018114611e5e57611e8a565b60ff1984168752821515830287019450611e8a565b875f526020805f205f5b85811015611e815781548a820152908401908201611e68565b50505082870194505b50929695505050505050565b808201808211156105d5576105d5611c7656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204eadaa960d3575be33dbbcd5dd4451ae75b3ee65cfa9b1261597850f26b3c19064736f6c6343000815003300000000000000000000000012341ed9cb38ae1b15016c6ed9f88e247f2af76f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000094561726e2055534443000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086561726e55534443000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405260043610610198575f3560e01c80637a9e5e4b116100e7578063bc197c8111610087578063dd62ed3e11610062578063dd62ed3e14610506578063f23a6e611461053c578063f2fde38b14610567578063f6e715d014610586575f80fd5b8063bc197c811461049d578063bf7e214f146104c8578063d505accf146104e7575f80fd5b80638929565f116100c25780638929565f1461042c5780638da5cb5b1461044b57806395d89b411461046a578063a9059cbb1461047e575f80fd5b80637a9e5e4b146103ab5780637ecebe00146103ca5780637f5a7c7b146103f5575f80fd5b8063224d8703116101525780633644e5151161012d5780633644e5151461032e57806339d6ba32146103425780635a4462151461036157806370a0823114610380575f80fd5b8063224d87031461029e57806323b872dd146102ca578063313ce567146102e9575f80fd5b806301ffc9a7146101a357806306fdde03146101d7578063095ea7b3146101f8578063150b7a021461021757806318160ddd1461025a57806318457e611461027d575f80fd5b3661019f57005b5f80fd5b3480156101ae575f80fd5b506101c26101bd3660046114f0565b6105a5565b60405190151581526020015b60405180910390f35b3480156101e2575f80fd5b506101eb6105db565b6040516101ce9190611564565b348015610203575f80fd5b506101c261021236600461158a565b610666565b348015610222575f80fd5b50610241610231366004611663565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016101ce565b348015610265575f80fd5b5061026f60025481565b6040519081526020016101ce565b348015610288575f80fd5b5061029c6102973660046116ca565b6106d1565b005b3480156102a9575f80fd5b506102bd6102b8366004611768565b610796565b6040516101ce91906117fa565b3480156102d5575f80fd5b506101c26102e436600461185a565b610909565b3480156102f4575f80fd5b5061031c7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff90911681526020016101ce565b348015610339575f80fd5b5061026f610928565b34801561034d575f80fd5b5061029c61035c3660046116ca565b610982565b34801561036c575f80fd5b5061029c61037b366004611898565b610a30565b34801561038b575f80fd5b5061026f61039a3660046118f7565b60036020525f908152604090205481565b3480156103b6575f80fd5b5061029c6103c53660046118f7565b610a7e565b3480156103d5575f80fd5b5061026f6103e43660046118f7565b60056020525f908152604090205481565b348015610400575f80fd5b50600854610414906001600160a01b031681565b6040516001600160a01b0390911681526020016101ce565b348015610437575f80fd5b5061029c6104463660046118f7565b610b63565b348015610456575f80fd5b50600654610414906001600160a01b031681565b348015610475575f80fd5b506101eb610bb6565b348015610489575f80fd5b506101c261049836600461158a565b610bc3565b3480156104a8575f80fd5b506102416104b736600461198e565b63bc197c8160e01b95945050505050565b3480156104d3575f80fd5b50600754610414906001600160a01b031681565b3480156104f2575f80fd5b5061029c610501366004611a34565b610bd7565b348015610511575f80fd5b5061026f610520366004611aa5565b600460209081525f928352604080842090915290825290205481565b348015610547575f80fd5b50610241610556366004611adc565b63f23a6e6160e01b95945050505050565b348015610572575f80fd5b5061029c6105813660046118f7565b610e15565b348015610591575f80fd5b506101eb6105a0366004611b3f565b610e91565b5f6001600160e01b03198216630271189760e51b14806105d557506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80546105e790611bc2565b80601f016020809104026020016040519081016040528092919081815260200182805461061390611bc2565b801561065e5780601f106106355761010080835404028352916020019161065e565b820191905f5260205f20905b81548152906001019060200180831161064157829003601f168201915b505050505081565b335f8181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106c09086815260200190565b60405180910390a350600192915050565b6106e6335f356001600160e01b031916610f17565b61070b5760405162461bcd60e51b815260040161070290611bfa565b60405180910390fd5b6107158282610fbe565b821561072f5761072f6001600160a01b0385168685611025565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fe0c82280a1164680e0cf43be7db4c4c9f985423623ad7a544fb76c772bdc60438685604051610787929190918252602082015260400190565b60405180910390a45050505050565b60606107ad335f356001600160e01b031916610f17565b6107c95760405162461bcd60e51b815260040161070290611bfa565b85806001600160401b038111156107e2576107e26115b4565b60405190808252806020026020018201604052801561081557816020015b60608152602001906001900390816108005790505b5091505f5b818110156108fd576108cf87878381811061083757610837611c20565b90506020028101906108499190611c34565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925088915085905081811061089157610891611c20565b905060200201358b8b858181106108aa576108aa611c20565b90506020020160208101906108bf91906118f7565b6001600160a01b031691906110a8565b8382815181106108e1576108e1611c20565b6020026020010181905250806108f690611c8a565b905061081a565b50509695505050505050565b5f61091384611148565b61091e8484846111b6565b90505b9392505050565b5f7f0000000000000000000000000000000000000000000000000000000000000001461461095d57610958611290565b905090565b507fb4c9bd8ae753feae425c384fdcecae3557ebea8d3cb085050fc8652a205c9ad890565b610997335f356001600160e01b031916610f17565b6109b35760405162461bcd60e51b815260040161070290611bfa565b82156109ce576109ce6001600160a01b038516863086611328565b6109d882826113b9565b816001600160a01b0316846001600160a01b0316866001600160a01b03167fea00f88768a86184a6e515238a549c171769fe7460a011d6fd0bcd48ca078ea48685604051610787929190918252602082015260400190565b610a45335f356001600160e01b031916610f17565b610a615760405162461bcd60e51b815260040161070290611bfa565b5f610a6c8382611cef565b506001610a798282611cef565b505050565b6006546001600160a01b0316331480610b10575060075460405163b700961360e01b81526001600160a01b039091169063b700961390610ad190339030906001600160e01b03195f351690600401611daa565b602060405180830381865afa158015610aec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b109190611dd7565b610b18575f80fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907fa3396fd7f6e0a21b50e5089d2da70d5ac0a3bbbd1f617a93f134b76389980198905f90a350565b610b78335f356001600160e01b031916610f17565b610b945760405162461bcd60e51b815260040161070290611bfa565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600180546105e790611bc2565b5f610bcd33611148565b6109218383611408565b42841015610c275760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610702565b5f6001610c32610928565b6001600160a01b038a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610d3a573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610d705750876001600160a01b0316816001600160a01b0316145b610dad5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610702565b6001600160a01b039081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b610e2a335f356001600160e01b031916610f17565b610e465760405162461bcd60e51b815260040161070290611bfa565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6060610ea8335f356001600160e01b031916610f17565b610ec45760405162461bcd60e51b815260040161070290611bfa565b610f0e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050506001600160a01b038816919050846110a8565b95945050505050565b6007545f906001600160a01b03168015801590610f9e575060405163b700961360e01b81526001600160a01b0382169063b700961390610f5f90879030908890600401611daa565b602060405180830381865afa158015610f7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9e9190611dd7565b80610fb657506006546001600160a01b038581169116145b949350505050565b6001600160a01b0382165f9081526003602052604081208054839290610fe5908490611df6565b90915550506002805482900390556040518181525f906001600160a01b038416905f80516020611eaa833981519152906020015b60405180910390a35050565b5f60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f5114161716915050806110a25760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610702565b50505050565b6060814710156110d45760405163cf47918160e01b815247600482015260248101839052604401610702565b5f80856001600160a01b031684866040516110ef9190611e09565b5f6040518083038185875af1925050503d805f8114611129576040519150601f19603f3d011682016040523d82523d5f602084013e61112e565b606091505b509150915061113e86838361146b565b9695505050505050565b6008546001600160a01b0316156111b35760085460405163e83931af60e01b81526001600160a01b0383811660048301529091169063e83931af906024015f6040518083038186803b15801561119c575f80fd5b505afa1580156111ae573d5f803e3d5ffd5b505050505b50565b6001600160a01b0383165f9081526004602090815260408083203384529091528120545f19811461120f576111eb8382611df6565b6001600160a01b0386165f9081526004602090815260408083203384529091529020555b6001600160a01b0385165f9081526003602052604081208054859290611236908490611df6565b90915550506001600160a01b038085165f81815260036020526040908190208054870190555190918716905f80516020611eaa8339815191529061127d9087815260200190565b60405180910390a3506001949350505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516112c09190611e24565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f6040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b038416602482015282604482015260205f6064835f8a5af13d15601f3d1160015f5114161716915050806111ae5760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610702565b8060025f8282546113ca9190611e96565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481525f80516020611eaa8339815191529101611019565b335f90815260036020526040812080548391908390611428908490611df6565b90915550506001600160a01b0383165f81815260036020526040908190208054850190555133905f80516020611eaa833981519152906106c09086815260200190565b6060826114805761147b826114c7565b610921565b815115801561149757506001600160a01b0384163b155b156114c057604051639996b31560e01b81526001600160a01b0385166004820152602401610702565b5080610921565b8051156114d75780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f60208284031215611500575f80fd5b81356001600160e01b031981168114610921575f80fd5b5f5b83811015611531578181015183820152602001611519565b50505f910152565b5f8151808452611550816020860160208601611517565b601f01601f19169290920160200192915050565b602081525f6109216020830184611539565b6001600160a01b03811681146111b3575f80fd5b5f806040838503121561159b575f80fd5b82356115a681611576565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115f0576115f06115b4565b604052919050565b5f82601f830112611607575f80fd5b81356001600160401b03811115611620576116206115b4565b611633601f8201601f19166020016115c8565b818152846020838601011115611647575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611676575f80fd5b843561168181611576565b9350602085013561169181611576565b92506040850135915060608501356001600160401b038111156116b2575f80fd5b6116be878288016115f8565b91505092959194509250565b5f805f805f60a086880312156116de575f80fd5b85356116e981611576565b945060208601356116f981611576565b935060408601359250606086013561171081611576565b949793965091946080013592915050565b5f8083601f840112611731575f80fd5b5081356001600160401b03811115611747575f80fd5b6020830191508360208260051b8501011115611761575f80fd5b9250929050565b5f805f805f806060878903121561177d575f80fd5b86356001600160401b0380821115611793575f80fd5b61179f8a838b01611721565b909850965060208901359150808211156117b7575f80fd5b6117c38a838b01611721565b909650945060408901359150808211156117db575f80fd5b506117e889828a01611721565b979a9699509497509295939492505050565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b8281101561184d57603f1988860301845261183b858351611539565b9450928501929085019060010161181f565b5092979650505050505050565b5f805f6060848603121561186c575f80fd5b833561187781611576565b9250602084013561188781611576565b929592945050506040919091013590565b5f80604083850312156118a9575f80fd5b82356001600160401b03808211156118bf575f80fd5b6118cb868387016115f8565b935060208501359150808211156118e0575f80fd5b506118ed858286016115f8565b9150509250929050565b5f60208284031215611907575f80fd5b813561092181611576565b5f82601f830112611921575f80fd5b813560206001600160401b0382111561193c5761193c6115b4565b8160051b61194b8282016115c8565b9283528481018201928281019087851115611964575f80fd5b83870192505b848310156119835782358252918301919083019061196a565b979650505050505050565b5f805f805f60a086880312156119a2575f80fd5b85356119ad81611576565b945060208601356119bd81611576565b935060408601356001600160401b03808211156119d8575f80fd5b6119e489838a01611912565b945060608801359150808211156119f9575f80fd5b611a0589838a01611912565b93506080880135915080821115611a1a575f80fd5b50611a27888289016115f8565b9150509295509295909350565b5f805f805f805f60e0888a031215611a4a575f80fd5b8735611a5581611576565b96506020880135611a6581611576565b95506040880135945060608801359350608088013560ff81168114611a88575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611ab6575f80fd5b8235611ac181611576565b91506020830135611ad181611576565b809150509250929050565b5f805f805f60a08688031215611af0575f80fd5b8535611afb81611576565b94506020860135611b0b81611576565b9350604086013592506060860135915060808601356001600160401b03811115611b33575f80fd5b611a27888289016115f8565b5f805f8060608587031215611b52575f80fd5b8435611b5d81611576565b935060208501356001600160401b0380821115611b78575f80fd5b818701915087601f830112611b8b575f80fd5b813581811115611b99575f80fd5b886020828501011115611baa575f80fd5b95986020929092019750949560400135945092505050565b600181811c90821680611bd657607f821691505b602082108103611bf457634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112611c49575f80fd5b8301803591506001600160401b03821115611c62575f80fd5b602001915036819003821315611761575f80fd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201611c9b57611c9b611c76565b5060010190565b601f821115610a79575f81815260208120601f850160051c81016020861015611cc85750805b601f850160051c820191505b81811015611ce757828155600101611cd4565b505050505050565b81516001600160401b03811115611d0857611d086115b4565b611d1c81611d168454611bc2565b84611ca2565b602080601f831160018114611d4f575f8415611d385750858301515b5f19600386901b1c1916600185901b178555611ce7565b5f85815260208120601f198616915b82811015611d7d57888601518255948401946001909101908401611d5e565b5085821015611d9a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b5f60208284031215611de7575f80fd5b81518015158114610921575f80fd5b818103818111156105d5576105d5611c76565b5f8251611e1a818460208701611517565b9190910192915050565b5f808354611e3181611bc2565b60018281168015611e495760018114611e5e57611e8a565b60ff1984168752821515830287019450611e8a565b875f526020805f205f5b85811015611e815781548a820152908401908201611e68565b50505082870194505b50929695505050505050565b808201808211156105d5576105d5611c7656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204eadaa960d3575be33dbbcd5dd4451ae75b3ee65cfa9b1261597850f26b3c19064736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000012341ed9cb38ae1b15016c6ed9f88e247f2af76f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000094561726e2055534443000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086561726e55534443000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _owner (address): 0x12341eD9cb38Ae1b15016c6eD9F88e247f2AF76f
Arg [1] : _name (string): Earn USDC
Arg [2] : _symbol (string): earnUSDC
Arg [3] : _decimals (uint8): 6

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000012341ed9cb38ae1b15016c6ed9f88e247f2af76f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 4561726e20555344430000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [7] : 6561726e55534443000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

41166:4867:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40319:223;;;;;;;;;;-1:-1:-1;40319:223:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;40319:223:0;;;;;;;;3847:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5324:217::-;;;;;;;;;;-1:-1:-1;5324:217:0;;;;;:::i;:::-;;:::i;30595:155::-;;;;;;;;;;-1:-1:-1;30595:155:0;;;;;:::i;:::-;-1:-1:-1;;;30595:155:0;;;;;;;;;;-1:-1:-1;;;;;;3488:33:1;;;3470:52;;3458:2;3443:18;30595:155:0;3326:202:1;4130:26:0;;;;;;;;;;;;;;;;;;;3679:25:1;;;3667:2;3652:18;4130:26:0;3533:177:1;44312:436:0;;;;;;;;;;-1:-1:-1;44312:436:0;;;;;:::i;:::-;;:::i;:::-;;42838:461;;;;;;;;;;-1:-1:-1;42838:461:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45559:193::-;;;;;;;;;;-1:-1:-1;45559:193:0;;;;;:::i;:::-;;:::i;3903:31::-;;;;;;;;;;;;;;;;;;7315:4:1;7303:17;;;7285:36;;7273:2;7258:18;3903:31:0;7143:184:1;8284:179:0;;;;;;;;;;;;;:::i;43578:455::-;;;;;;;;;;-1:-1:-1;43578:455:0;;;;;:::i;:::-;;:::i;45760:150::-;;;;;;;;;;-1:-1:-1;45760:150:0;;;;;:::i;:::-;;:::i;4165:44::-;;;;;;;;;;-1:-1:-1;4165:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;1602:442;;;;;;;;;;-1:-1:-1;1602:442:0;;;;;:::i;:::-;;:::i;4591:41::-;;;;;;;;;;-1:-1:-1;4591:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;41544:30;;;;;;;;;;-1:-1:-1;41544:30:0;;;;-1:-1:-1;;;;;41544:30:0;;;;;;-1:-1:-1;;;;;8771:32:1;;;8753:51;;8741:2;8726:18;41544:30:0;8581:229:1;45017:119:0;;;;;;;;;;-1:-1:-1;45017:119:0;;;;;:::i;:::-;;:::i;615:20::-;;;;;;;;;;-1:-1:-1;615:20:0;;;;-1:-1:-1;;;;;615:20:0;;;3874;;;;;;;;;;;;;:::i;45380:171::-;;;;;;;;;;-1:-1:-1;45380:171:0;;;;;:::i;:::-;;:::i;40785:255::-;;;;;;;;;;-1:-1:-1;40785:255:0;;;;;:::i;:::-;-1:-1:-1;;;40785:255:0;;;;;;;;644:26;;;;;;;;;;-1:-1:-1;644:26:0;;;;-1:-1:-1;;;;;644:26:0;;;6749:1527;;;;;;;;;;-1:-1:-1;6749:1527:0;;;;;:::i;:::-;;:::i;4218:64::-;;;;;;;;;;-1:-1:-1;4218:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;40550:227;;;;;;;;;;-1:-1:-1;40550:227:0;;;;;:::i;:::-;-1:-1:-1;;;40550:227:0;;;;;;;;2052:168;;;;;;;;;;-1:-1:-1;2052:168:0;;;;;:::i;:::-;;:::i;42434:255::-;;;;;;;;;;-1:-1:-1;42434:255:0;;;;;:::i;:::-;;:::i;40319:223::-;40421:4;-1:-1:-1;;;;;;40445:49:0;;-1:-1:-1;;;40445:49:0;;:89;;-1:-1:-1;;;;;;;;;;29922:40:0;;;40498:36;40438:96;40319:223;-1:-1:-1;;40319:223:0:o;3847:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5324:217::-;5425:10;5398:4;5415:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;5415:30:0;;;;;;;;;;:39;;;5472:37;5398:4;;5415:30;;5472:37;;;;5448:6;3679:25:1;;3667:2;3652:18;;3533:177;5472:37:0;;;;;;;;-1:-1:-1;5529:4:0;5324:217;;;;:::o;44312:436::-;968:33;981:10;993:7;;-1:-1:-1;;;;;;993:7:0;968:12;:33::i;:::-;960:58;;;;-1:-1:-1;;;960:58:0;;;;;;;:::i;:::-;;;;;;;;;44540:24:::1;44546:4;44552:11;44540:5;:24::i;:::-;44614:15:::0;;44610:56:::1;;44631:35;-1:-1:-1::0;;;;;44631:18:0;::::1;44650:2:::0;44654:11;44631:18:::1;:35::i;:::-;44722:4;-1:-1:-1::0;;;;;44684:56:0::1;44701:5;-1:-1:-1::0;;;;;44684:56:0::1;44689:2;-1:-1:-1::0;;;;;44684:56:0::1;;44709:11;44728;44684:56;;;;;;14929:25:1::0;;;14985:2;14970:18;;14963:34;14917:2;14902:18;;14755:248;44684:56:0::1;;;;;;;;44312:436:::0;;;;;:::o;42838:461::-;43024:22;968:33;981:10;993:7;;-1:-1:-1;;;;;;993:7:0;968:12;:33::i;:::-;960:58;;;;-1:-1:-1;;;960:58:0;;;;;;;:::i;:::-;43088:7;;-1:-1:-1;;;;;43123:26:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43113:36;;43165:9;43160:132;43180:13;43176:1;:17;43160:132;;;43228:52;43261:4;;43266:1;43261:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;43228:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;43270:6:0;;-1:-1:-1;43270:6:0;;-1:-1:-1;43277:1:0;;-1:-1:-1;43270:9:0;;::::1;;;;;:::i;:::-;;;;;;;43228:7;;43236:1;43228:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43228:32:0::1;::::0;:52;:32:::1;:52::i;:::-;43215:7;43223:1;43215:10;;;;;;;;:::i;:::-;;;;;;:65;;;;43195:3;;;;:::i;:::-;;;43160:132;;;;43053:246;42838:461:::0;;;;;;;;:::o;45559:193::-;45648:4;45665:25;45685:4;45665:19;:25::i;:::-;45708:36;45727:4;45733:2;45737:6;45708:18;:36::i;:::-;45701:43;;45559:193;;;;;;:::o;8284:179::-;8341:7;8385:16;8368:13;:33;:87;;8431:24;:22;:24::i;:::-;8361:94;;8284:179;:::o;8368:87::-;-1:-1:-1;8404:24:0;;8284:179::o;43578:455::-;968:33;981:10;993:7;;-1:-1:-1;;;;;;993:7:0;968:12;:33::i;:::-;960:58;;;;-1:-1:-1;;;960:58:0;;;;;;;:::i;:::-;43817:15;;43813:77:::1;;43834:56;-1:-1:-1::0;;;;;43834:22:0;::::1;43857:4:::0;43871::::1;43878:11:::0;43834:22:::1;:56::i;:::-;43928:22;43934:2;43938:11;43928:5;:22::i;:::-;44009:2;-1:-1:-1::0;;;;;43968:57:0::1;43988:5;-1:-1:-1::0;;;;;43968:57:0::1;43974:4;-1:-1:-1::0;;;;;43968:57:0::1;;43996:11;44013;43968:57;;;;;;14929:25:1::0;;;14985:2;14970:18;;14963:34;14917:2;14902:18;;14755:248;45760:150:0;968:33;981:10;993:7;;-1:-1:-1;;;;;;993:7:0;968:12;:33::i;:::-;960:58;;;;-1:-1:-1;;;960:58:0;;;;;;;:::i;:::-;45863:4:::1;:12;45870:5:::0;45863:4;:12:::1;:::i;:::-;-1:-1:-1::0;45886:6:0::1;:16;45895:7:::0;45886:6;:16:::1;:::i;:::-;;45760:150:::0;;:::o;1602:442::-;1876:5;;-1:-1:-1;;;;;1876:5:0;1862:10;:19;;:76;;-1:-1:-1;1885:9:0;;:53;;-1:-1:-1;;;1885:53:0;;-1:-1:-1;;;;;1885:9:0;;;;:17;;:53;;1903:10;;1923:4;;-1:-1:-1;;;;;;1885:9:0;1930:7;;;1885:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1854:85;;;;;;1952:9;:24;;-1:-1:-1;;;;;;1952:24:0;-1:-1:-1;;;;;1952:24:0;;;;;;;;1994:42;;2011:10;;1994:42;;-1:-1:-1;;1994:42:0;1602:442;:::o;45017:119::-;968:33;981:10;993:7;;-1:-1:-1;;;;;;993:7:0;968:12;:33::i;:::-;960:58;;;;-1:-1:-1;;;960:58:0;;;;;;;:::i;:::-;45096:4:::1;:32:::0;;-1:-1:-1;;;;;;45096:32:0::1;-1:-1:-1::0;;;;;45096:32:0;;;::::1;::::0;;;::::1;::::0;;45017:119::o;3874:20::-;;;;;;;:::i;45380:171::-;45451:4;45468:31;45488:10;45468:19;:31::i;:::-;45517:26;45532:2;45536:6;45517:14;:26::i;6749:1527::-;6977:15;6965:8;:27;;6957:63;;;;-1:-1:-1;;;6957:63:0;;19031:2:1;6957:63:0;;;19013:21:1;19070:2;19050:18;;;19043:30;19109:25;19089:18;;;19082:53;19152:18;;6957:63:0;18829:347:1;6957:63:0;7190:24;7217:827;7357:18;:16;:18::i;:::-;-1:-1:-1;;;;;7811:13:0;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;7442:458;;7487:167;7442:458;;;19468:25:1;19547:18;;;19540:43;;;;19619:15;;;19599:18;;;19592:43;19651:18;;;19644:34;;;19694:19;;;19687:35;;;;19738:19;;;;19731:35;;;7442:458:0;;;;;;;;;;19440:19:1;;;7442:458:0;;;7402:525;;;;;;;;-1:-1:-1;;;7277:673:0;;;20035:27:1;20078:11;;;20071:27;;;;20114:12;;;20107:28;;;;20151:12;;7277:673:0;;;-1:-1:-1;;7277:673:0;;;;;;;;;7245:724;;7277:673;7245:724;;;;7217:827;;;;;;;;;20401:25:1;20474:4;20462:17;;20442:18;;;20435:45;20496:18;;;20489:34;;;20539:18;;;20532:34;;;20373:19;;7217:827:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7217:827:0;;-1:-1:-1;;7217:827:0;;;-1:-1:-1;;;;;;;8069:30:0;;;;;;:59;;;8123:5;-1:-1:-1;;;;;8103:25:0;:16;-1:-1:-1;;;;;8103:25:0;;8069:59;8061:86;;;;-1:-1:-1;;;8061:86:0;;20779:2:1;8061:86:0;;;20761:21:1;20818:2;20798:18;;;20791:30;-1:-1:-1;;;20837:18:1;;;20830:44;20891:18;;8061:86:0;20577:338:1;8061:86:0;-1:-1:-1;;;;;8164:27:0;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;8237:31;3679:25:1;;;8164:36:0;;8237:31;;;;;3652:18:1;8237:31:0;;;;;;;6749:1527;;;;;;;:::o;2052:168::-;968:33;981:10;993:7;;-1:-1:-1;;;;;;993:7:0;968:12;:33::i;:::-;960:58;;;;-1:-1:-1;;;960:58:0;;;;;;;:::i;:::-;2136:5:::1;:16:::0;;-1:-1:-1;;;;;;2136:16:0::1;-1:-1:-1::0;;;;;2136:16:0;::::1;::::0;;::::1;::::0;;;2170:42:::1;::::0;2191:10:::1;::::0;2170:42:::1;::::0;-1:-1:-1;;2170:42:0::1;2052:168:::0;:::o;42434:255::-;42594:19;968:33;981:10;993:7;;-1:-1:-1;;;;;;993:7:0;968:12;:33::i;:::-;960:58;;;;-1:-1:-1;;;960:58:0;;;;;;;:::i;:::-;42640:41:::1;42669:4;;42640:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;42640:28:0;::::1;::::0;;-1:-1:-1;42675:5:0;42640:28:::1;:41::i;:::-;42631:50:::0;42434:255;-1:-1:-1;;;;;42434:255:0:o;1048:546::-;1169:9;;1135:4;;-1:-1:-1;;;;;1169:9:0;1491:27;;;;;:77;;-1:-1:-1;1522:46:0;;-1:-1:-1;;;1522:46:0;;-1:-1:-1;;;;;1522:12:0;;;;;:46;;1535:4;;1549;;1556:11;;1522:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1490:96;;;-1:-1:-1;1581:5:0;;-1:-1:-1;;;;;1573:13:0;;;1581:5;;1573:13;1490:96;1483:103;1048:546;-1:-1:-1;;;;1048:546:0:o;9471:338::-;-1:-1:-1;;;;;9544:15:0;;;;;;:9;:15;;;;;:25;;9563:6;;9544:15;:25;;9563:6;;9544:25;:::i;:::-;;;;-1:-1:-1;;9717:11:0;:21;;;;;;;9767:34;;3679:25:1;;;-1:-1:-1;;;;;;;9767:34:0;;;-1:-1:-1;;;;;;;;;;;9767:34:0;3667:2:1;3652:18;9767:34:0;;;;;;;;9471:338;;:::o;36479:1637::-;36596:12;36771:4;36765:11;-1:-1:-1;;;36897:17:0;36890:93;-1:-1:-1;;;;;37035:2:0;37031:51;37027:1;37008:17;37004:25;36997:86;37170:6;37165:2;37146:17;37142:26;37135:42;38032:2;38029:1;38025:2;38006:17;38003:1;37996:5;37989;37984:51;37548:16;37541:24;37535:2;37517:16;37514:24;37510:1;37506;37500:8;37497:15;37493:46;37490:76;37287:763;37276:774;;;38081:7;38073:35;;;;-1:-1:-1;;;38073:35:0;;21255:2:1;38073:35:0;;;21237:21:1;21294:2;21274:18;;;21267:30;-1:-1:-1;;;21313:18:1;;;21306:45;21368:18;;38073:35:0;21053:339:1;38073:35:0;36585:1531;36479:1637;;;:::o;25881:413::-;25980:12;26033:5;26009:21;:29;26005:125;;;26062:56;;-1:-1:-1;;;26062:56:0;;26089:21;26062:56;;;14929:25:1;14970:18;;;14963:34;;;14902:18;;26062:56:0;14755:248:1;26005:125:0;26141:12;26155:23;26182:6;-1:-1:-1;;;;;26182:11:0;26201:5;26208:4;26182:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26140:73;;;;26231:55;26258:6;26266:7;26275:10;26231:26;:55::i;:::-;26224:62;25881:413;-1:-1:-1;;;;;;25881:413:0:o;45238:134::-;45318:4;;-1:-1:-1;;;;;45318:4:0;45310:27;45306:58;;45339:4;;:25;;-1:-1:-1;;;45339:25:0;;-1:-1:-1;;;;;8771:32:1;;;45339:25:0;;;8753:51:1;45339:4:0;;;;:19;;8726:18:1;;45339:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45306:58;45238:134;:::o;5942:612::-;-1:-1:-1;;;;;6099:15:0;;6064:4;6099:15;;;:9;:15;;;;;;;;6115:10;6099:27;;;;;;;;-1:-1:-1;;6179:28:0;;6175:80;;6239:16;6249:6;6239:7;:16;:::i;:::-;-1:-1:-1;;;;;6209:15:0;;;;;;:9;:15;;;;;;;;6225:10;6209:27;;;;;;;:46;6175:80;-1:-1:-1;;;;;6268:15:0;;;;;;:9;:15;;;;;:25;;6287:6;;6268:15;:25;;6287:6;;6268:25;:::i;:::-;;;;-1:-1:-1;;;;;;;6444:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;6496:26;6444:13;;6496:26;;;-1:-1:-1;;;;;;;;;;;6496:26:0;;;6461:6;3679:25:1;;3667:2;3652:18;;3533:177;6496:26:0;;;;;;;;-1:-1:-1;6542:4:0;;5942:612;-1:-1:-1;;;;5942:612:0:o;8471:457::-;8536:7;8637:95;8771:4;8755:22;;;;;;:::i;:::-;;;;;;;;;;8604:301;;;22797:25:1;;;;22838:18;;22831:34;;;;8800:14:0;22881:18:1;;;22874:34;8837:13:0;22924:18:1;;;22917:34;8881:4:0;22967:19:1;;;22960:61;22769:19;;8604:301:0;;;;;;;;;;;;8576:344;;;;;;8556:364;;8471:457;:::o;34657:1814::-;34801:12;34976:4;34970:11;-1:-1:-1;;;35102:17:0;35095:93;-1:-1:-1;;;;;35240:4:0;35236:53;35232:1;35213:17;35209:25;35202:88;-1:-1:-1;;;;;35383:2:0;35379:51;35374:2;35355:17;35351:26;35344:87;35518:6;35513:2;35494:17;35490:26;35483:42;36382:2;36379:1;36374:3;36355:17;36352:1;36345:5;36338;36333:52;35896:16;35889:24;35883:2;35865:16;35862:24;35858:1;35854;35848:8;35845:15;35841:46;35838:76;35635:765;35624:776;;;36431:7;36423:40;;;;-1:-1:-1;;;36423:40:0;;23234:2:1;36423:40:0;;;23216:21:1;23273:2;23253:18;;;23246:30;-1:-1:-1;;;23292:18:1;;;23285:50;23352:18;;36423:40:0;23032:344:1;9128:335:0;9214:6;9199:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;9371:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;9423:32;3679:25:1;;;-1:-1:-1;;;;;;;;;;;9423:32:0;3652:18:1;9423:32:0;3533:177:1;5549:385:0;5646:10;5619:4;5636:21;;;:9;:21;;;;;:31;;5661:6;;5636:21;5619:4;;5636:31;;5661:6;;5636:31;:::i;:::-;;;;-1:-1:-1;;;;;;;5818:13:0;;;;;;:9;:13;;;;;;;:23;;;;;;5870:32;5879:10;;-1:-1:-1;;;;;;;;;;;5870:32:0;;;5835:6;3679:25:1;;3667:2;3652:18;;3533:177;27374:597:0;27522:12;27552:7;27547:417;;27576:19;27584:10;27576:7;:19::i;:::-;27547:417;;;27804:17;;:22;:49;;;;-1:-1:-1;;;;;;27830:18:0;;;:23;27804:49;27800:121;;;27881:24;;-1:-1:-1;;;27881:24:0;;-1:-1:-1;;;;;8771:32:1;;27881:24:0;;;8753:51:1;8726:18;;27881:24:0;8581:229:1;27800:121:0;-1:-1:-1;27942:10:0;27935:17;;28528:530;28661:17;;:21;28657:394;;28893:10;28887:17;28950:15;28937:10;28933:2;28929:19;28922:44;28657:394;29020:19;;-1:-1:-1;;;29020:19:0;;;;;;;;;;;14:286:1;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:250;582:1;592:113;606:6;603:1;600:13;592:113;;;682:11;;;676:18;663:11;;;656:39;628:2;621:10;592:113;;;-1:-1:-1;;739:1:1;721:16;;714:27;497:250::o;752:271::-;794:3;832:5;826:12;859:6;854:3;847:19;875:76;944:6;937:4;932:3;928:14;921:4;914:5;910:16;875:76;:::i;:::-;1005:2;984:15;-1:-1:-1;;980:29:1;971:39;;;;1012:4;967:50;;752:271;-1:-1:-1;;752:271:1:o;1028:220::-;1177:2;1166:9;1159:21;1140:4;1197:45;1238:2;1227:9;1223:18;1215:6;1197:45;:::i;1253:131::-;-1:-1:-1;;;;;1328:31:1;;1318:42;;1308:70;;1374:1;1371;1364:12;1389:315;1457:6;1465;1518:2;1506:9;1497:7;1493:23;1489:32;1486:52;;;1534:1;1531;1524:12;1486:52;1573:9;1560:23;1592:31;1617:5;1592:31;:::i;:::-;1642:5;1694:2;1679:18;;;;1666:32;;-1:-1:-1;;;1389:315:1:o;1709:127::-;1770:10;1765:3;1761:20;1758:1;1751:31;1801:4;1798:1;1791:15;1825:4;1822:1;1815:15;1841:275;1912:2;1906:9;1977:2;1958:13;;-1:-1:-1;;1954:27:1;1942:40;;-1:-1:-1;;;;;1997:34:1;;2033:22;;;1994:62;1991:88;;;2059:18;;:::i;:::-;2095:2;2088:22;1841:275;;-1:-1:-1;1841:275:1:o;2121:530::-;2163:5;2216:3;2209:4;2201:6;2197:17;2193:27;2183:55;;2234:1;2231;2224:12;2183:55;2270:6;2257:20;-1:-1:-1;;;;;2292:2:1;2289:26;2286:52;;;2318:18;;:::i;:::-;2362:55;2405:2;2386:13;;-1:-1:-1;;2382:27:1;2411:4;2378:38;2362:55;:::i;:::-;2442:2;2433:7;2426:19;2488:3;2481:4;2476:2;2468:6;2464:15;2460:26;2457:35;2454:55;;;2505:1;2502;2495:12;2454:55;2570:2;2563:4;2555:6;2551:17;2544:4;2535:7;2531:18;2518:55;2618:1;2593:16;;;2611:4;2589:27;2582:38;;;;2597:7;2121:530;-1:-1:-1;;;2121:530:1:o;2656:665::-;2751:6;2759;2767;2775;2828:3;2816:9;2807:7;2803:23;2799:33;2796:53;;;2845:1;2842;2835:12;2796:53;2884:9;2871:23;2903:31;2928:5;2903:31;:::i;:::-;2953:5;-1:-1:-1;3010:2:1;2995:18;;2982:32;3023:33;2982:32;3023:33;:::i;:::-;3075:7;-1:-1:-1;3129:2:1;3114:18;;3101:32;;-1:-1:-1;3184:2:1;3169:18;;3156:32;-1:-1:-1;;;;;3200:30:1;;3197:50;;;3243:1;3240;3233:12;3197:50;3266:49;3307:7;3298:6;3287:9;3283:22;3266:49;:::i;:::-;3256:59;;;2656:665;;;;;;;:::o;3715:680::-;3823:6;3831;3839;3847;3855;3908:3;3896:9;3887:7;3883:23;3879:33;3876:53;;;3925:1;3922;3915:12;3876:53;3964:9;3951:23;3983:31;4008:5;3983:31;:::i;:::-;4033:5;-1:-1:-1;4090:2:1;4075:18;;4062:32;4103:33;4062:32;4103:33;:::i;:::-;4155:7;-1:-1:-1;4209:2:1;4194:18;;4181:32;;-1:-1:-1;4265:2:1;4250:18;;4237:32;4278:33;4237:32;4278:33;:::i;:::-;3715:680;;;;-1:-1:-1;3715:680:1;;4384:3;4369:19;4356:33;;3715:680;-1:-1:-1;;3715:680:1:o;4400:367::-;4463:8;4473:6;4527:3;4520:4;4512:6;4508:17;4504:27;4494:55;;4545:1;4542;4535:12;4494:55;-1:-1:-1;4568:20:1;;-1:-1:-1;;;;;4600:30:1;;4597:50;;;4643:1;4640;4633:12;4597:50;4680:4;4672:6;4668:17;4656:29;;4740:3;4733:4;4723:6;4720:1;4716:14;4708:6;4704:27;4700:38;4697:47;4694:67;;;4757:1;4754;4747:12;4694:67;4400:367;;;;;:::o;4772:1099::-;4941:6;4949;4957;4965;4973;4981;5034:2;5022:9;5013:7;5009:23;5005:32;5002:52;;;5050:1;5047;5040:12;5002:52;5090:9;5077:23;-1:-1:-1;;;;;5160:2:1;5152:6;5149:14;5146:34;;;5176:1;5173;5166:12;5146:34;5215:70;5277:7;5268:6;5257:9;5253:22;5215:70;:::i;:::-;5304:8;;-1:-1:-1;5189:96:1;-1:-1:-1;5392:2:1;5377:18;;5364:32;;-1:-1:-1;5408:16:1;;;5405:36;;;5437:1;5434;5427:12;5405:36;5476:72;5540:7;5529:8;5518:9;5514:24;5476:72;:::i;:::-;5567:8;;-1:-1:-1;5450:98:1;-1:-1:-1;5655:2:1;5640:18;;5627:32;;-1:-1:-1;5671:16:1;;;5668:36;;;5700:1;5697;5690:12;5668:36;;5739:72;5803:7;5792:8;5781:9;5777:24;5739:72;:::i;:::-;4772:1099;;;;-1:-1:-1;4772:1099:1;;-1:-1:-1;4772:1099:1;;5830:8;;4772:1099;-1:-1:-1;;;4772:1099:1:o;5876:801::-;6036:4;6065:2;6105;6094:9;6090:18;6135:2;6124:9;6117:21;6158:6;6193;6187:13;6224:6;6216;6209:22;6262:2;6251:9;6247:18;6240:25;;6324:2;6314:6;6311:1;6307:14;6296:9;6292:30;6288:39;6274:53;;6362:2;6354:6;6350:15;6383:1;6393:255;6407:6;6404:1;6401:13;6393:255;;;6500:2;6496:7;6484:9;6476:6;6472:22;6468:36;6463:3;6456:49;6528:40;6561:6;6552;6546:13;6528:40;:::i;:::-;6518:50;-1:-1:-1;6626:12:1;;;;6591:15;;;;6429:1;6422:9;6393:255;;;-1:-1:-1;6665:6:1;;5876:801;-1:-1:-1;;;;;;;5876:801:1:o;6682:456::-;6759:6;6767;6775;6828:2;6816:9;6807:7;6803:23;6799:32;6796:52;;;6844:1;6841;6834:12;6796:52;6883:9;6870:23;6902:31;6927:5;6902:31;:::i;:::-;6952:5;-1:-1:-1;7009:2:1;6994:18;;6981:32;7022:33;6981:32;7022:33;:::i;:::-;6682:456;;7074:7;;-1:-1:-1;;;7128:2:1;7113:18;;;;7100:32;;6682:456::o;7514:541::-;7602:6;7610;7663:2;7651:9;7642:7;7638:23;7634:32;7631:52;;;7679:1;7676;7669:12;7631:52;7719:9;7706:23;-1:-1:-1;;;;;7789:2:1;7781:6;7778:14;7775:34;;;7805:1;7802;7795:12;7775:34;7828:49;7869:7;7860:6;7849:9;7845:22;7828:49;:::i;:::-;7818:59;;7930:2;7919:9;7915:18;7902:32;7886:48;;7959:2;7949:8;7946:16;7943:36;;;7975:1;7972;7965:12;7943:36;;7998:51;8041:7;8030:8;8019:9;8015:24;7998:51;:::i;:::-;7988:61;;;7514:541;;;;;:::o;8060:247::-;8119:6;8172:2;8160:9;8151:7;8147:23;8143:32;8140:52;;;8188:1;8185;8178:12;8140:52;8227:9;8214:23;8246:31;8271:5;8246:31;:::i;9023:712::-;9077:5;9130:3;9123:4;9115:6;9111:17;9107:27;9097:55;;9148:1;9145;9138:12;9097:55;9184:6;9171:20;9210:4;-1:-1:-1;;;;;9229:2:1;9226:26;9223:52;;;9255:18;;:::i;:::-;9301:2;9298:1;9294:10;9324:28;9348:2;9344;9340:11;9324:28;:::i;:::-;9386:15;;;9456;;;9452:24;;;9417:12;;;;9488:15;;;9485:35;;;9516:1;9513;9506:12;9485:35;9552:2;9544:6;9540:15;9529:26;;9564:142;9580:6;9575:3;9572:15;9564:142;;;9646:17;;9634:30;;9597:12;;;;9684;;;;9564:142;;;9724:5;9023:712;-1:-1:-1;;;;;;;9023:712:1:o;9740:1071::-;9894:6;9902;9910;9918;9926;9979:3;9967:9;9958:7;9954:23;9950:33;9947:53;;;9996:1;9993;9986:12;9947:53;10035:9;10022:23;10054:31;10079:5;10054:31;:::i;:::-;10104:5;-1:-1:-1;10161:2:1;10146:18;;10133:32;10174:33;10133:32;10174:33;:::i;:::-;10226:7;-1:-1:-1;10284:2:1;10269:18;;10256:32;-1:-1:-1;;;;;10337:14:1;;;10334:34;;;10364:1;10361;10354:12;10334:34;10387:61;10440:7;10431:6;10420:9;10416:22;10387:61;:::i;:::-;10377:71;;10501:2;10490:9;10486:18;10473:32;10457:48;;10530:2;10520:8;10517:16;10514:36;;;10546:1;10543;10536:12;10514:36;10569:63;10624:7;10613:8;10602:9;10598:24;10569:63;:::i;:::-;10559:73;;10685:3;10674:9;10670:19;10657:33;10641:49;;10715:2;10705:8;10702:16;10699:36;;;10731:1;10728;10721:12;10699:36;;10754:51;10797:7;10786:8;10775:9;10771:24;10754:51;:::i;:::-;10744:61;;;9740:1071;;;;;;;;:::o;11041:829::-;11152:6;11160;11168;11176;11184;11192;11200;11253:3;11241:9;11232:7;11228:23;11224:33;11221:53;;;11270:1;11267;11260:12;11221:53;11309:9;11296:23;11328:31;11353:5;11328:31;:::i;:::-;11378:5;-1:-1:-1;11435:2:1;11420:18;;11407:32;11448:33;11407:32;11448:33;:::i;:::-;11500:7;-1:-1:-1;11554:2:1;11539:18;;11526:32;;-1:-1:-1;11605:2:1;11590:18;;11577:32;;-1:-1:-1;11661:3:1;11646:19;;11633:33;11710:4;11697:18;;11685:31;;11675:59;;11730:1;11727;11720:12;11675:59;11041:829;;;;-1:-1:-1;11041:829:1;;;;11753:7;11807:3;11792:19;;11779:33;;-1:-1:-1;11859:3:1;11844:19;;;11831:33;;11041:829;-1:-1:-1;;11041:829:1:o;11875:388::-;11943:6;11951;12004:2;11992:9;11983:7;11979:23;11975:32;11972:52;;;12020:1;12017;12010:12;11972:52;12059:9;12046:23;12078:31;12103:5;12078:31;:::i;:::-;12128:5;-1:-1:-1;12185:2:1;12170:18;;12157:32;12198:33;12157:32;12198:33;:::i;:::-;12250:7;12240:17;;;11875:388;;;;;:::o;12268:734::-;12372:6;12380;12388;12396;12404;12457:3;12445:9;12436:7;12432:23;12428:33;12425:53;;;12474:1;12471;12464:12;12425:53;12513:9;12500:23;12532:31;12557:5;12532:31;:::i;:::-;12582:5;-1:-1:-1;12639:2:1;12624:18;;12611:32;12652:33;12611:32;12652:33;:::i;:::-;12704:7;-1:-1:-1;12758:2:1;12743:18;;12730:32;;-1:-1:-1;12809:2:1;12794:18;;12781:32;;-1:-1:-1;12864:3:1;12849:19;;12836:33;-1:-1:-1;;;;;12881:30:1;;12878:50;;;12924:1;12921;12914:12;12878:50;12947:49;12988:7;12979:6;12968:9;12964:22;12947:49;:::i;13007:794::-;13095:6;13103;13111;13119;13172:2;13160:9;13151:7;13147:23;13143:32;13140:52;;;13188:1;13185;13178:12;13140:52;13227:9;13214:23;13246:31;13271:5;13246:31;:::i;:::-;13296:5;-1:-1:-1;13352:2:1;13337:18;;13324:32;-1:-1:-1;;;;;13405:14:1;;;13402:34;;;13432:1;13429;13422:12;13402:34;13470:6;13459:9;13455:22;13445:32;;13515:7;13508:4;13504:2;13500:13;13496:27;13486:55;;13537:1;13534;13527:12;13486:55;13577:2;13564:16;13603:2;13595:6;13592:14;13589:34;;;13619:1;13616;13609:12;13589:34;13664:7;13659:2;13650:6;13646:2;13642:15;13638:24;13635:37;13632:57;;;13685:1;13682;13675:12;13632:57;13007:794;;13716:2;13708:11;;;;;-1:-1:-1;13738:6:1;;13791:2;13776:18;13763:32;;-1:-1:-1;13007:794:1;-1:-1:-1;;;13007:794:1:o;14029:380::-;14108:1;14104:12;;;;14151;;;14172:61;;14226:4;14218:6;14214:17;14204:27;;14172:61;14279:2;14271:6;14268:14;14248:18;14245:38;14242:161;;14325:10;14320:3;14316:20;14313:1;14306:31;14360:4;14357:1;14350:15;14388:4;14385:1;14378:15;14242:161;;14029:380;;;:::o;14414:336::-;14616:2;14598:21;;;14655:2;14635:18;;;14628:30;-1:-1:-1;;;14689:2:1;14674:18;;14667:42;14741:2;14726:18;;14414:336::o;15008:127::-;15069:10;15064:3;15060:20;15057:1;15050:31;15100:4;15097:1;15090:15;15124:4;15121:1;15114:15;15140:521;15217:4;15223:6;15283:11;15270:25;15377:2;15373:7;15362:8;15346:14;15342:29;15338:43;15318:18;15314:68;15304:96;;15396:1;15393;15386:12;15304:96;15423:33;;15475:20;;;-1:-1:-1;;;;;;15507:30:1;;15504:50;;;15550:1;15547;15540:12;15504:50;15583:4;15571:17;;-1:-1:-1;15614:14:1;15610:27;;;15600:38;;15597:58;;;15651:1;15648;15641:12;15666:127;15727:10;15722:3;15718:20;15715:1;15708:31;15758:4;15755:1;15748:15;15782:4;15779:1;15772:15;15798:135;15837:3;15858:17;;;15855:43;;15878:18;;:::i;:::-;-1:-1:-1;15925:1:1;15914:13;;15798:135::o;16064:545::-;16166:2;16161:3;16158:11;16155:448;;;16202:1;16227:5;16223:2;16216:17;16272:4;16268:2;16258:19;16342:2;16330:10;16326:19;16323:1;16319:27;16313:4;16309:38;16378:4;16366:10;16363:20;16360:47;;;-1:-1:-1;16401:4:1;16360:47;16456:2;16451:3;16447:12;16444:1;16440:20;16434:4;16430:31;16420:41;;16511:82;16529:2;16522:5;16519:13;16511:82;;;16574:17;;;16555:1;16544:13;16511:82;;;16515:3;;;16064:545;;;:::o;16785:1352::-;16911:3;16905:10;-1:-1:-1;;;;;16930:6:1;16927:30;16924:56;;;16960:18;;:::i;:::-;16989:97;17079:6;17039:38;17071:4;17065:11;17039:38;:::i;:::-;17033:4;16989:97;:::i;:::-;17141:4;;17205:2;17194:14;;17222:1;17217:663;;;;17924:1;17941:6;17938:89;;;-1:-1:-1;17993:19:1;;;17987:26;17938:89;-1:-1:-1;;16742:1:1;16738:11;;;16734:24;16730:29;16720:40;16766:1;16762:11;;;16717:57;18040:81;;17187:944;;17217:663;16011:1;16004:14;;;16048:4;16035:18;;-1:-1:-1;;17253:20:1;;;17371:236;17385:7;17382:1;17379:14;17371:236;;;17474:19;;;17468:26;17453:42;;17566:27;;;;17534:1;17522:14;;;;17401:19;;17371:236;;;17375:3;17635:6;17626:7;17623:19;17620:201;;;17696:19;;;17690:26;-1:-1:-1;;17779:1:1;17775:14;;;17791:3;17771:24;17767:37;17763:42;17748:58;17733:74;;17620:201;-1:-1:-1;;;;;17867:1:1;17851:14;;;17847:22;17834:36;;-1:-1:-1;16785:1352:1:o;18142:400::-;-1:-1:-1;;;;;18398:15:1;;;18380:34;;18450:15;;;;18445:2;18430:18;;18423:43;-1:-1:-1;;;;;;18502:33:1;;;18497:2;18482:18;;18475:61;18330:2;18315:18;;18142:400::o;18547:277::-;18614:6;18667:2;18655:9;18646:7;18642:23;18638:32;18635:52;;;18683:1;18680;18673:12;18635:52;18715:9;18709:16;18768:5;18761:13;18754:21;18747:5;18744:32;18734:60;;18790:1;18787;18780:12;20920:128;20987:9;;;21008:11;;;21005:37;;;21022:18;;:::i;21397:287::-;21526:3;21564:6;21558:13;21580:66;21639:6;21634:3;21627:4;21619:6;21615:17;21580:66;:::i;:::-;21662:16;;;;;21397:287;-1:-1:-1;;21397:287:1:o;21689:844::-;21819:3;21848:1;21881:6;21875:13;21911:36;21937:9;21911:36;:::i;:::-;21966:1;21983:18;;;22010:133;;;;22157:1;22152:356;;;;21976:532;;22010:133;-1:-1:-1;;22043:24:1;;22031:37;;22116:14;;22109:22;22097:35;;22088:45;;;-1:-1:-1;22010:133:1;;22152:356;22183:6;22180:1;22173:17;22213:4;22258:2;22255:1;22245:16;22283:1;22297:165;22311:6;22308:1;22305:13;22297:165;;;22389:14;;22376:11;;;22369:35;22432:16;;;;22326:10;;22297:165;;;22301:3;;;22491:6;22486:3;22482:16;22475:23;;21976:532;-1:-1:-1;22524:3:1;;21689:844;-1:-1:-1;;;;;;21689:844:1:o;23381:125::-;23446:9;;;23467:10;;;23464:36;;;23480:18;;:::i

Swarm Source

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