ETH Price: $2,632.01 (+1.02%)

Q Doge404 (DOGE404)
 

Overview

TokenID

758

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 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:
Doge404

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 4: FERC404.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC404.sol";

contract Doge404 is ERC404 {

    uint256 public maxSupply = 3333;
    uint256 public freeAmount = 1;
    uint256 public price;
    string uri = "ipfs://bafybeiapzrloor7oauza5xse7wpdffkvhipw62ylybqpaw7bz4kqr2jqpy/";

    constructor(
    ) ERC404("Q Doge404", "DOGE404", 18, maxSupply, msg.sender) {
        balanceOf[msg.sender] = maxSupply * 10 ** 18;
        price = 0.002 ether;
    }

    function mint(uint256 amt, address to) public payable {
        require(msg.sender == tx.origin);
        require(msg.value >= (amt - freeAmount) * price);
        require(minted + amt  <= maxSupply);
        _transfer(owner, to, amt * 10 ** 18);
    }

    function setTx(uint256 _price, uint256 _free) public onlyOwner {
        price = _price;
        freeAmount = _free;
    }

    function seturi(string memory _uri) public onlyOwner {
        uri = _uri;
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        return string(abi.encodePacked(uri, _toString(id%maxSupply), ".json"));
    }

    function totalSupply() external view returns (uint256) {
        return minted;
    }


    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)

         // Update the free memory pointer to allocate.
         mstore(0x40, ptr)

         // Cache the end of the memory to calculate the length later.
         let end := ptr

         // We write the string from the rightmost digit to the leftmost digit.
         // The following is essentially a do-while loop that also handles the zero case.
         // Costs a bit more than early returning for the zero case,
         // but cheaper in terms of deployment and overall runtime costs.
         for { 
             // Initialize and perform the first pass without check.
             let temp := value
                 // Move the pointer 1 byte leftwards to point to an empty character slot.
                 ptr := sub(ptr, 1)
                 // Write the character to the pointer. 48 is the ASCII index of '0'.
                 mstore8(ptr, add(48, mod(temp, 10)))
                 temp := div(temp, 10)
         } temp { 
             // Keep dividing `temp` until zero.
        temp := div(temp, 10)
         } { 
             // Body of the for loop.
        ptr := sub(ptr, 1)
         mstore8(ptr, add(48, mod(temp, 10)))
         }

     let length := sub(end, ptr)
         // Move the pointer 32 bytes leftwards to make room for the length.
         ptr := sub(ptr, 32)
         // Store the length.
         mstore(ptr, length)
        }
    }

}

File 1 of 4: ERC404.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    // uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        // totalSupply = _totalNativeSupply * (10 ** decimals);
        whitelist[owner] = true;
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(
        address spender,
        uint256 amountOrId
    ) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(
        address from,
        address to,
        uint256 amountOrId
    ) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (
                msg.sender != from &&
                !isApprovedForAll[from][msg.sender] &&
                msg.sender != getApproved[amountOrId]
            ) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

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

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

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

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

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

    function _setNameSymbol(
        string memory _name,
        string memory _symbol
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}

File 3 of 4: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

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

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

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

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

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

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
     * denominator == 0.
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
     * Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
            // works in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
     * towards zero.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

File 4 of 4: SignedMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","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":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","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":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[],"name":"freeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_free","type":"uint256"}],"name":"setTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","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":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

610d05600c556001600d55610120604052604360a08181529062001e3b60c039600f906200002e90826200021f565b503480156200003b575f80fd5b50604051806040016040528060098152602001681448111bd9d94d0c0d60ba1b815250604051806040016040528060078152602001661113d1d14d0c0d60ca1b8152506012600c5433805f6001600160a01b0316816001600160a01b031603620000b8576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060016200010e86826200021f565b5060026200011d85826200021f565b50505060ff1660805250505f80546001600160a01b03168152600b60205260409020805460ff19166001179055600c546200016190670de0b6b3a7640000620002eb565b335f9081526004602052604090205566071afd498d0000600e5562000315565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620001aa57607f821691505b602082108103620001c957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200021a57805f5260205f20601f840160051c81016020851015620001f65750805b601f840160051c820191505b8181101562000217575f815560010162000202565b50505b505050565b81516001600160401b038111156200023b576200023b62000181565b62000253816200024c845462000195565b84620001cf565b602080601f83116001811462000289575f8415620002715750858301515b5f19600386901b1c1916600185901b178555620002e3565b5f85815260208120601f198616915b82811015620002b95788860151825594840194600190910190840162000298565b5085821015620002d757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b80820281158282048414176200030f57634e487b7160e01b5f52601160045260245ffd5b92915050565b608051611b06620003355f395f81816102d10152610fa70152611b065ff3fe6080604052600436106101af575f3560e01c806394bf804d116100e7578063c87b56dd11610087578063e985e9c511610062578063e985e9c5146104f1578063f2fde38b1461052a578063f648498014610549578063fd73fe9514610568575f80fd5b8063c87b56dd14610487578063d5abeb01146104a6578063dd62ed3e146104bb575f80fd5b8063a035b1fe116100c2578063a035b1fe14610415578063a22cb4651461042a578063a9059cbb14610449578063b88d4fde14610468575f80fd5b806394bf804d146103c057806395d89b41146103d35780639b19251a146103e7575f80fd5b8063313ce5671161015257806353d6fd591161012d57806353d6fd59146103395780636352211e1461035857806370a08231146103775780638da5cb5b146103a2575f80fd5b8063313ce567146102c057806342842e0e146103055780634f02c42014610324575f80fd5b8063095ea7b31161018d578063095ea7b31461024857806318160ddd1461027757806323b872dd1461028b5780632b968958146102ac575f80fd5b80630451a9f1146101b357806306fdde03146101db578063081812fc146101fc575b5f80fd5b3480156101be575f80fd5b506101c8600d5481565b6040519081526020015b60405180910390f35b3480156101e6575f80fd5b506101ef610587565b6040516101d29190611411565b348015610207575f80fd5b50610230610216366004611443565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b348015610253575f80fd5b50610267610262366004611470565b610613565b60405190151581526020016101d2565b348015610282575f80fd5b506003546101c8565b348015610296575f80fd5b506102aa6102a5366004611498565b61075e565b005b3480156102b7575f80fd5b506102aa610ada565b3480156102cb575f80fd5b506102f37f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101d2565b348015610310575f80fd5b506102aa61031f366004611498565b610b3e565b34801561032f575f80fd5b506101c860035481565b348015610344575f80fd5b506102aa6103533660046114d1565b610c0f565b348015610363575f80fd5b50610230610372366004611443565b610c62565b348015610382575f80fd5b506101c861039136600461150a565b60046020525f908152604090205481565b3480156103ad575f80fd5b505f54610230906001600160a01b031681565b6102aa6103ce366004611523565b610c9c565b3480156103de575f80fd5b506101ef610d0e565b3480156103f2575f80fd5b5061026761040136600461150a565b600b6020525f908152604090205460ff1681565b348015610420575f80fd5b506101c8600e5481565b348015610435575f80fd5b506102aa6104443660046114d1565b610d1b565b348015610454575f80fd5b50610267610463366004611470565b610d86565b348015610473575f80fd5b506102aa61048236600461154d565b610d99565b348015610492575f80fd5b506101ef6104a1366004611443565b610e59565b3480156104b1575f80fd5b506101c8600c5481565b3480156104c6575f80fd5b506101c86104d53660046115e0565b600560209081525f928352604080842090915290825290205481565b3480156104fc575f80fd5b5061026761050b3660046115e0565b600760209081525f928352604080842090915290825290205460ff1681565b348015610535575f80fd5b506102aa61054436600461150a565b610e9a565b348015610554575f80fd5b506102aa61056336600461161c565b610f34565b348015610573575f80fd5b506102aa6105823660046116c7565b610f6d565b60018054610594906116e7565b80601f01602080910402602001604051908101604052809291908181526020018280546105c0906116e7565b801561060b5780601f106105e25761010080835404028352916020019161060b565b820191905f5260205f20905b8154815290600101906020018083116105ee57829003601f168201915b505050505081565b5f600354821115801561062557505f82115b156106f9575f828152600860205260409020546001600160a01b031633811480159061067457506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff16155b15610691576040516282b42960e81b815260040160405180910390fd5b5f8381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610754565b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b6003548111610a6e575f818152600860205260409020546001600160a01b038481169116146107a057604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166107c757604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061080357506001600160a01b0383165f90815260076020908152604080832033845290915290205460ff16155b801561082557505f818152600660205260409020546001600160a01b03163314155b15610842576040516282b42960e81b815260040160405180910390fd5b61084a610fa1565b6001600160a01b0384165f9081526004602052604081208054909190610871908490611733565b9091555061087f9050610fa1565b6001600160a01b038084165f81815260046020908152604080832080549096019095558582526008815284822080546001600160a01b0319908116909417905560068152848220805490931690925591861682526009905290812080546108e890600190611733565b815481106108f8576108f8611746565b5f9182526020808320909101546001600160a01b0387168352600982526040808420868552600a9093529092205481549293508392811061093b5761093b611746565b5f9182526020808320909101929092556001600160a01b038616815260099091526040902080548061096f5761096f61175a565b5f828152602080822083015f19908101839055909201909255838252600a8152604080832054848452818420556001600160a01b0386168084526009835290832080546001818101835582865293852001869055925290546109d19190611733565b5f838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610a57610fa1565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526005602090815260408083203384529091529020545f198114610ac757610aa38282611733565b6001600160a01b0385165f9081526005602090815260408083203384529091529020555b610ad2848484610fd2565b50505b505050565b5f546001600160a01b03163314610b03576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610b4983838361075e565b6001600160a01b0382163b15801590610bf15750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610bc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be4919061176e565b6001600160e01b03191614155b15610ad557604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610c38576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f818152600860205260409020546001600160a01b031680610c975760405163c5723b5160e01b815260040160405180910390fd5b919050565b333214610ca7575f80fd5b600e54600d54610cb79084611733565b610cc19190611795565b341015610ccc575f80fd5b600c5482600354610cdd91906117ac565b1115610ce7575f80fd5b5f54610ad5906001600160a01b031682610d0985670de0b6b3a7640000611795565b610fd2565b60028054610594906116e7565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610d92338484610fd2565b9392505050565b610da485858561075e565b6001600160a01b0384163b15801590610e3b5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610dee9033908a908990899089906004016117bf565b6020604051808303815f875af1158015610e0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2e919061176e565b6001600160e01b03191614155b15610ad257604051633da6393160e01b815260040160405180910390fd5b6060600f610e73600c5484610e6e9190611825565b611177565b604051602001610e84929190611838565b6040516020818303038152906040529050919050565b5f546001600160a01b03163314610ec3576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116610eea576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f546001600160a01b03163314610f5d576040516282b42960e81b815260040160405180910390fd5b600f610f69828261190f565b5050565b5f546001600160a01b03163314610f96576040516282b42960e81b815260040160405180910390fd5b600e91909155600d55565b5f610fcd7f0000000000000000000000000000000000000000000000000000000000000000600a611aaf565b905090565b5f80610fdc610fa1565b6001600160a01b038087165f818152600460205260408082208054948a16835290822054928252939450919290918691906110178386611733565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff166110a6576001600160a01b0387165f90815260046020526040812054611072908590611abd565b61107c8585611abd565b6110869190611733565b90505f5b818110156110a35761109b896111c6565b60010161108a565b50505b6001600160a01b0386165f908152600b602052604090205460ff1661111d575f6110d08483611abd565b6001600160a01b0388165f908152600460205260409020546110f3908690611abd565b6110fd9190611733565b90505f5b8181101561111a57611112886112e7565b600101611101565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161116291815260200190565b60405180910390a35060019695505050505050565b604080516080810191829052607f0190826030600a8206018353600a90045b80156111b457600183039250600a81066030018353600a9004611196565b50819003601f19909101908152919050565b6001600160a01b0381166111ed57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600960205260408120805461121290600190611733565b8154811061122257611222611746565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f2080548061125f5761125f61175a565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661130e57604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b03161561134e5760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526009835290832080546001818101835582865293852001859055925290546113a59190611733565b5f828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b838110156114095781810151838201526020016113f1565b50505f910152565b602081525f825180602084015261142f8160408501602087016113ef565b601f01601f19169190910160400192915050565b5f60208284031215611453575f80fd5b5035919050565b80356001600160a01b0381168114610c97575f80fd5b5f8060408385031215611481575f80fd5b61148a8361145a565b946020939093013593505050565b5f805f606084860312156114aa575f80fd5b6114b38461145a565b92506114c16020850161145a565b9150604084013590509250925092565b5f80604083850312156114e2575f80fd5b6114eb8361145a565b9150602083013580151581146114ff575f80fd5b809150509250929050565b5f6020828403121561151a575f80fd5b610d928261145a565b5f8060408385031215611534575f80fd5b823591506115446020840161145a565b90509250929050565b5f805f805f60808688031215611561575f80fd5b61156a8661145a565b94506115786020870161145a565b935060408601359250606086013567ffffffffffffffff8082111561159b575f80fd5b818801915088601f8301126115ae575f80fd5b8135818111156115bc575f80fd5b8960208285010111156115cd575f80fd5b9699959850939650602001949392505050565b5f80604083850312156115f1575f80fd5b6115fa8361145a565b91506115446020840161145a565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561162c575f80fd5b813567ffffffffffffffff80821115611643575f80fd5b818401915084601f830112611656575f80fd5b81358181111561166857611668611608565b604051601f8201601f19908116603f0116810190838211818310171561169057611690611608565b816040528281528760208487010111156116a8575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f80604083850312156116d8575f80fd5b50508035926020909101359150565b600181811c908216806116fb57607f821691505b60208210810361171957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156107585761075861171f565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561177e575f80fd5b81516001600160e01b031981168114610d92575f80fd5b80820281158282048414176107585761075861171f565b808201808211156107585761075861171f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261183357611833611811565b500690565b5f808454611845816116e7565b6001828116801561185d57600181146118725761189e565b60ff198416875282151583028701945061189e565b885f526020805f205f5b858110156118955781548a82015290840190820161187c565b50505082870194505b5050505083516118b28183602088016113ef565b64173539b7b760d91b9101908152600501949350505050565b601f821115610ad557805f5260205f20601f840160051c810160208510156118f05750805b601f840160051c820191505b81811015610ad2575f81556001016118fc565b815167ffffffffffffffff81111561192957611929611608565b61193d8161193784546116e7565b846118cb565b602080601f831160018114611970575f84156119595750858301515b5f19600386901b1c1916600185901b1785556119c7565b5f85815260208120601f198616915b8281101561199e5788860151825594840194600190910190840161197f565b50858210156119bb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b80851115611a0957815f19048211156119ef576119ef61171f565b808516156119fc57918102915b93841c93908002906119d4565b509250929050565b5f82611a1f57506001610758565b81611a2b57505f610758565b8160018114611a415760028114611a4b57611a67565b6001915050610758565b60ff841115611a5c57611a5c61171f565b50506001821b610758565b5060208310610133831016604e8410600b8410161715611a8a575081810a610758565b611a9483836119cf565b805f1904821115611aa757611aa761171f565b029392505050565b5f610d9260ff841683611a11565b5f82611acb57611acb611811565b50049056fea26469706673582212201eb722fd93d86b164efad4669864f1c8f0d77b5d5836aedbbedbb87691f9878764736f6c63430008180033697066733a2f2f6261667962656961707a726c6f6f72376f61757a61357873653777706466666b76686970773632796c79627170617737627a346b7172326a7170792f

Deployed Bytecode

0x6080604052600436106101af575f3560e01c806394bf804d116100e7578063c87b56dd11610087578063e985e9c511610062578063e985e9c5146104f1578063f2fde38b1461052a578063f648498014610549578063fd73fe9514610568575f80fd5b8063c87b56dd14610487578063d5abeb01146104a6578063dd62ed3e146104bb575f80fd5b8063a035b1fe116100c2578063a035b1fe14610415578063a22cb4651461042a578063a9059cbb14610449578063b88d4fde14610468575f80fd5b806394bf804d146103c057806395d89b41146103d35780639b19251a146103e7575f80fd5b8063313ce5671161015257806353d6fd591161012d57806353d6fd59146103395780636352211e1461035857806370a08231146103775780638da5cb5b146103a2575f80fd5b8063313ce567146102c057806342842e0e146103055780634f02c42014610324575f80fd5b8063095ea7b31161018d578063095ea7b31461024857806318160ddd1461027757806323b872dd1461028b5780632b968958146102ac575f80fd5b80630451a9f1146101b357806306fdde03146101db578063081812fc146101fc575b5f80fd5b3480156101be575f80fd5b506101c8600d5481565b6040519081526020015b60405180910390f35b3480156101e6575f80fd5b506101ef610587565b6040516101d29190611411565b348015610207575f80fd5b50610230610216366004611443565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b348015610253575f80fd5b50610267610262366004611470565b610613565b60405190151581526020016101d2565b348015610282575f80fd5b506003546101c8565b348015610296575f80fd5b506102aa6102a5366004611498565b61075e565b005b3480156102b7575f80fd5b506102aa610ada565b3480156102cb575f80fd5b506102f37f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101d2565b348015610310575f80fd5b506102aa61031f366004611498565b610b3e565b34801561032f575f80fd5b506101c860035481565b348015610344575f80fd5b506102aa6103533660046114d1565b610c0f565b348015610363575f80fd5b50610230610372366004611443565b610c62565b348015610382575f80fd5b506101c861039136600461150a565b60046020525f908152604090205481565b3480156103ad575f80fd5b505f54610230906001600160a01b031681565b6102aa6103ce366004611523565b610c9c565b3480156103de575f80fd5b506101ef610d0e565b3480156103f2575f80fd5b5061026761040136600461150a565b600b6020525f908152604090205460ff1681565b348015610420575f80fd5b506101c8600e5481565b348015610435575f80fd5b506102aa6104443660046114d1565b610d1b565b348015610454575f80fd5b50610267610463366004611470565b610d86565b348015610473575f80fd5b506102aa61048236600461154d565b610d99565b348015610492575f80fd5b506101ef6104a1366004611443565b610e59565b3480156104b1575f80fd5b506101c8600c5481565b3480156104c6575f80fd5b506101c86104d53660046115e0565b600560209081525f928352604080842090915290825290205481565b3480156104fc575f80fd5b5061026761050b3660046115e0565b600760209081525f928352604080842090915290825290205460ff1681565b348015610535575f80fd5b506102aa61054436600461150a565b610e9a565b348015610554575f80fd5b506102aa61056336600461161c565b610f34565b348015610573575f80fd5b506102aa6105823660046116c7565b610f6d565b60018054610594906116e7565b80601f01602080910402602001604051908101604052809291908181526020018280546105c0906116e7565b801561060b5780601f106105e25761010080835404028352916020019161060b565b820191905f5260205f20905b8154815290600101906020018083116105ee57829003601f168201915b505050505081565b5f600354821115801561062557505f82115b156106f9575f828152600860205260409020546001600160a01b031633811480159061067457506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff16155b15610691576040516282b42960e81b815260040160405180910390fd5b5f8381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610754565b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b6003548111610a6e575f818152600860205260409020546001600160a01b038481169116146107a057604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0382166107c757604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061080357506001600160a01b0383165f90815260076020908152604080832033845290915290205460ff16155b801561082557505f818152600660205260409020546001600160a01b03163314155b15610842576040516282b42960e81b815260040160405180910390fd5b61084a610fa1565b6001600160a01b0384165f9081526004602052604081208054909190610871908490611733565b9091555061087f9050610fa1565b6001600160a01b038084165f81815260046020908152604080832080549096019095558582526008815284822080546001600160a01b0319908116909417905560068152848220805490931690925591861682526009905290812080546108e890600190611733565b815481106108f8576108f8611746565b5f9182526020808320909101546001600160a01b0387168352600982526040808420868552600a9093529092205481549293508392811061093b5761093b611746565b5f9182526020808320909101929092556001600160a01b038616815260099091526040902080548061096f5761096f61175a565b5f828152602080822083015f19908101839055909201909255838252600a8152604080832054848452818420556001600160a01b0386168084526009835290832080546001818101835582865293852001869055925290546109d19190611733565b5f838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610a57610fa1565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526005602090815260408083203384529091529020545f198114610ac757610aa38282611733565b6001600160a01b0385165f9081526005602090815260408083203384529091529020555b610ad2848484610fd2565b50505b505050565b5f546001600160a01b03163314610b03576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610b4983838361075e565b6001600160a01b0382163b15801590610bf15750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610bc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be4919061176e565b6001600160e01b03191614155b15610ad557604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610c38576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f818152600860205260409020546001600160a01b031680610c975760405163c5723b5160e01b815260040160405180910390fd5b919050565b333214610ca7575f80fd5b600e54600d54610cb79084611733565b610cc19190611795565b341015610ccc575f80fd5b600c5482600354610cdd91906117ac565b1115610ce7575f80fd5b5f54610ad5906001600160a01b031682610d0985670de0b6b3a7640000611795565b610fd2565b60028054610594906116e7565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610d92338484610fd2565b9392505050565b610da485858561075e565b6001600160a01b0384163b15801590610e3b5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610dee9033908a908990899089906004016117bf565b6020604051808303815f875af1158015610e0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2e919061176e565b6001600160e01b03191614155b15610ad257604051633da6393160e01b815260040160405180910390fd5b6060600f610e73600c5484610e6e9190611825565b611177565b604051602001610e84929190611838565b6040516020818303038152906040529050919050565b5f546001600160a01b03163314610ec3576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116610eea576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f546001600160a01b03163314610f5d576040516282b42960e81b815260040160405180910390fd5b600f610f69828261190f565b5050565b5f546001600160a01b03163314610f96576040516282b42960e81b815260040160405180910390fd5b600e91909155600d55565b5f610fcd7f0000000000000000000000000000000000000000000000000000000000000012600a611aaf565b905090565b5f80610fdc610fa1565b6001600160a01b038087165f818152600460205260408082208054948a16835290822054928252939450919290918691906110178386611733565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff166110a6576001600160a01b0387165f90815260046020526040812054611072908590611abd565b61107c8585611abd565b6110869190611733565b90505f5b818110156110a35761109b896111c6565b60010161108a565b50505b6001600160a01b0386165f908152600b602052604090205460ff1661111d575f6110d08483611abd565b6001600160a01b0388165f908152600460205260409020546110f3908690611abd565b6110fd9190611733565b90505f5b8181101561111a57611112886112e7565b600101611101565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161116291815260200190565b60405180910390a35060019695505050505050565b604080516080810191829052607f0190826030600a8206018353600a90045b80156111b457600183039250600a81066030018353600a9004611196565b50819003601f19909101908152919050565b6001600160a01b0381166111ed57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600960205260408120805461121290600190611733565b8154811061122257611222611746565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f2080548061125f5761125f61175a565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661130e57604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b03161561134e5760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558084526009835290832080546001818101835582865293852001859055925290546113a59190611733565b5f828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f5b838110156114095781810151838201526020016113f1565b50505f910152565b602081525f825180602084015261142f8160408501602087016113ef565b601f01601f19169190910160400192915050565b5f60208284031215611453575f80fd5b5035919050565b80356001600160a01b0381168114610c97575f80fd5b5f8060408385031215611481575f80fd5b61148a8361145a565b946020939093013593505050565b5f805f606084860312156114aa575f80fd5b6114b38461145a565b92506114c16020850161145a565b9150604084013590509250925092565b5f80604083850312156114e2575f80fd5b6114eb8361145a565b9150602083013580151581146114ff575f80fd5b809150509250929050565b5f6020828403121561151a575f80fd5b610d928261145a565b5f8060408385031215611534575f80fd5b823591506115446020840161145a565b90509250929050565b5f805f805f60808688031215611561575f80fd5b61156a8661145a565b94506115786020870161145a565b935060408601359250606086013567ffffffffffffffff8082111561159b575f80fd5b818801915088601f8301126115ae575f80fd5b8135818111156115bc575f80fd5b8960208285010111156115cd575f80fd5b9699959850939650602001949392505050565b5f80604083850312156115f1575f80fd5b6115fa8361145a565b91506115446020840161145a565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561162c575f80fd5b813567ffffffffffffffff80821115611643575f80fd5b818401915084601f830112611656575f80fd5b81358181111561166857611668611608565b604051601f8201601f19908116603f0116810190838211818310171561169057611690611608565b816040528281528760208487010111156116a8575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f80604083850312156116d8575f80fd5b50508035926020909101359150565b600181811c908216806116fb57607f821691505b60208210810361171957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156107585761075861171f565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561177e575f80fd5b81516001600160e01b031981168114610d92575f80fd5b80820281158282048414176107585761075861171f565b808201808211156107585761075861171f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261183357611833611811565b500690565b5f808454611845816116e7565b6001828116801561185d57600181146118725761189e565b60ff198416875282151583028701945061189e565b885f526020805f205f5b858110156118955781548a82015290840190820161187c565b50505082870194505b5050505083516118b28183602088016113ef565b64173539b7b760d91b9101908152600501949350505050565b601f821115610ad557805f5260205f20601f840160051c810160208510156118f05750805b601f840160051c820191505b81811015610ad2575f81556001016118fc565b815167ffffffffffffffff81111561192957611929611608565b61193d8161193784546116e7565b846118cb565b602080601f831160018114611970575f84156119595750858301515b5f19600386901b1c1916600185901b1785556119c7565b5f85815260208120601f198616915b8281101561199e5788860151825594840194600190910190840161197f565b50858210156119bb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b80851115611a0957815f19048211156119ef576119ef61171f565b808516156119fc57918102915b93841c93908002906119d4565b509250929050565b5f82611a1f57506001610758565b81611a2b57505f610758565b8160018114611a415760028114611a4b57611a67565b6001915050610758565b60ff841115611a5c57611a5c61171f565b50506001821b610758565b5060208310610133831016604e8410600b8410161715611a8a575081810a610758565b611a9483836119cf565b805f1904821115611aa757611aa761171f565b029392505050565b5f610d9260ff841683611a11565b5f82611acb57611acb611811565b50049056fea26469706673582212201eb722fd93d86b164efad4669864f1c8f0d77b5d5836aedbbedbb87691f9878764736f6c63430008180033

Deployed Bytecode Sourcemap

82:3065:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;153:29;;;;;;;;;;;;;;;;;;;160:25:4;;;148:2;133:18;153:29:1;;;;;;;;2696:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3388:46::-;;;;;;;;;;-1:-1:-1;3388:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3388:46:0;;;;;;-1:-1:-1;;;;;1201:32:4;;;1183:51;;1171:2;1156:18;3388:46:0;1037:203:4;5204:621:0;;;;;;;;;;-1:-1:-1;5204:621:0;;;;;:::i;:::-;;:::i;:::-;;;1847:14:4;;1840:22;1822:41;;1810:2;1795:18;5204:621:0;1682:187:4;1116:85:1;;;;;;;;;;-1:-1:-1;1188:6:1;;1116:85;;6221:1663:0;;;;;;;;;;-1:-1:-1;6221:1663:0;;;;;:::i;:::-;;:::i;:::-;;764:147;;;;;;;;;;;;;:::i;2826:31::-;;;;;;;;;;;;;;;;;;2379:4:4;2367:17;;;2349:36;;2337:2;2322:18;2826:31:0;2207:184:4;8169:391:0;;;;;;;;;;-1:-1:-1;8169:391:0;;;;;:::i;:::-;;:::i;3058:21::-;;;;;;;;;;;;;;;;4551:109;;;;;;;;;;-1:-1:-1;4551:109:0;;;;;:::i;:::-;;:::i;4729:187::-;;;;;;;;;;-1:-1:-1;4729:187:0;;;;;:::i;:::-;;:::i;3160:44::-;;;;;;;;;;-1:-1:-1;3160:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;229:20;;;;;;;;;;-1:-1:-1;229:20:0;;;;-1:-1:-1;;;;;229:20:0;;;476:252:1;;;;;;:::i;:::-;;:::i;2747:20:0:-;;;;;;;;;;;;;:::i;3984:41::-;;;;;;;;;;-1:-1:-1;3984:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;188:20:1;;;;;;;;;;;;;;;;5873:203:0;;;;;;;;;;-1:-1:-1;5873:203:0;;;;;:::i;:::-;;:::i;7940:155::-;;;;;;;;;;-1:-1:-1;7940:155:0;;;;;:::i;:::-;;:::i;8652:422::-;;;;;;;;;;-1:-1:-1;8652:422:0;;;;;:::i;:::-;;:::i;948:162:1:-;;;;;;;;;;-1:-1:-1;948:162:1;;;;;:::i;:::-;;:::i;116:31::-;;;;;;;;;;;;;;;;3271:64:0;;;;;;;;;;-1:-1:-1;3271:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;3496:68;;;;;;;;;;-1:-1:-1;3496:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;545:213;;;;;;;;;;-1:-1:-1;545:213:0;;;;;:::i;:::-;;:::i;862:80:1:-;;;;;;;;;;-1:-1:-1;862:80:1;;;;;:::i;:::-;;:::i;734:122::-;;;;;;;;;;-1:-1:-1;734:122:1;;;;;:::i;:::-;;:::i;2696:18:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5204:621::-;5304:4;5338:6;;5324:10;:20;;:38;;;;;5361:1;5348:10;:14;5324:38;5320:477;;;5378:13;5394:20;;;:8;:20;;;;;;-1:-1:-1;;;;;5394:20:0;5433:10;:19;;;;;:59;;-1:-1:-1;;;;;;5457:23:0;;;;;;:16;:23;;;;;;;;5481:10;5457:35;;;;;;;;;;5456:36;5433:59;5429:119;;;5519:14;;-1:-1:-1;;;5519:14:0;;;;;;;;;;;5429:119;5562:23;;;;:11;:23;;;;;;;;;:33;;-1:-1:-1;;;;;;5562:33:0;-1:-1:-1;;;;;5562:33:0;;;;;;;;;5615:36;;160:25:4;;;5615:36:0;;;;;;133:18:4;5615:36:0;;;;;;;5364:298;5320:477;;;5692:10;5682:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;5682:30:0;;;;;;;;;;;;:43;;;5745:41;160:25:4;;;5682:30:0;;5692:10;5745:41;;133:18:4;5745:41:0;;;;;;;5320:477;-1:-1:-1;5814:4:0;5204:621;;;;;:::o;6221:1663::-;6362:6;;6348:10;:20;6344:1534;;6396:20;;;;:8;:20;;;;;;-1:-1:-1;;;;;6388:28:0;;;6396:20;;6388:28;6384:89;;6443:15;;-1:-1:-1;;;6443:15:0;;;;;;;;;;;6384:89;-1:-1:-1;;;;;6491:16:0;;6487:80;;6534:18;;-1:-1:-1;;;6534:18:0;;;;;;;;;;;6487:80;6602:10;-1:-1:-1;;;;;6602:18:0;;;;;;:73;;-1:-1:-1;;;;;;6641:22:0;;;;;;:16;:22;;;;;;;;6664:10;6641:34;;;;;;;;;;6640:35;6602:73;:130;;;;-1:-1:-1;6709:23:0;;;;:11;:23;;;;;;-1:-1:-1;;;;;6709:23:0;6695:10;:37;;6602:130;6581:220;;;6772:14;;-1:-1:-1;;;6772:14:0;;;;;;;;;;;6581:220;6834:10;:8;:10::i;:::-;-1:-1:-1;;;;;6815:15:0;;;;;;:9;:15;;;;;:29;;:15;;;:29;;;;;:::i;:::-;;;;-1:-1:-1;6904:10:0;;-1:-1:-1;6904:8:0;:10::i;:::-;-1:-1:-1;;;;;6887:13:0;;;;;;;:9;:13;;;;;;;;:27;;;;;;;;6943:20;;;:8;:20;;;;;:25;;-1:-1:-1;;;;;;6943:25:0;;;;;;;;6989:11;:23;;;;;6982:30;;;;;;;;7087:12;;;;;:6;:12;;;;;7100:19;;:23;;-1:-1:-1;;7100:23:0;:::i;:::-;7087:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7138:12:0;;;;:6;:12;;;;;;7151:23;;;:11;:23;;;;;;;7138:37;;7087;;-1:-1:-1;7087:37:0;;7138;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;-1:-1:-1;;;;;7220:12:0;;;;:6;:12;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;7220:18:0;;;;;;;;;;;;7322:23;;;:11;:23;;;;;;;7297:22;;;;;;:48;-1:-1:-1;;;;;7397:10:0;;;;;:6;:10;;;;;:27;;7220:18;7397:27;;;;;;;;;;;;;;;7505:10;;:17;;:21;;7220:18;7505:21;:::i;:::-;7479:23;;;;:11;:23;;;;;;:47;;;;7546:30;;7491:10;;-1:-1:-1;;;;;7546:30:0;;;;;;;;;;;7615:2;-1:-1:-1;;;;;7595:35:0;7609:4;-1:-1:-1;;;;;7595:35:0;;7619:10;:8;:10::i;:::-;7595:35;;160:25:4;;;148:2;133:18;7595:35:0;;;;;;;6370:1271;6221:1663;;;:::o;6344:1534::-;-1:-1:-1;;;;;7679:15:0;;7661;7679;;;:9;:15;;;;;;;;7695:10;7679:27;;;;;;;;-1:-1:-1;;7725:28:0;;7721:100;;7801:20;7811:10;7801:7;:20;:::i;:::-;-1:-1:-1;;;;;7771:15:0;;;;;;:9;:15;;;;;;;;7787:10;7771:27;;;;;;;:50;7721:100;7836:31;7846:4;7852:2;7856:10;7836:9;:31::i;:::-;;7647:231;6344:1534;6221:1663;;;:::o;764:147::-;313:5;;-1:-1:-1;;;;;313:5:0;299:10;:19;295:46;;327:14;;-1:-1:-1;;;327:14:0;;;;;;;;;;;295:46;842:1:::1;826:18:::0;;-1:-1:-1;;;;;;826:18:0::1;::::0;;860:44:::1;::::0;881:10:::1;::::0;860:44:::1;::::0;842:1;;860:44:::1;764:147::o:0;8169:391::-;8288:26;8301:4;8307:2;8311;8288:12;:26::i;:::-;-1:-1:-1;;;;;8342:14:0;;;:19;;;;:152;;-1:-1:-1;8377:61:0;;-1:-1:-1;;;8377:61:0;;;8413:10;8377:61;;;6807:34:4;-1:-1:-1;;;;;6877:15:4;;;6857:18;;;6850:43;6909:18;;;6902:34;;;6972:3;6952:18;;;6945:31;-1:-1:-1;6992:19:4;;;6985:30;8454:40:0;;8377:35;;;;8454:40;;7032:19:4;;8377:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;8377:117:0;;;8342:152;8325:229;;;8526:17;;-1:-1:-1;;;8526:17:0;;;;;;;;;;;4551:109;313:5;;-1:-1:-1;;;;;313:5:0;299:10;:19;295:46;;327:14;;-1:-1:-1;;;327:14:0;;;;;;;;;;;295:46;-1:-1:-1;;;;;4628:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;4628:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;4551:109::o;4729:187::-;4787:13;4820:12;;;:8;:12;;;;;;-1:-1:-1;;;;;4820:12:0;;4843:67;;4889:10;;-1:-1:-1;;;4889:10:0;;;;;;;;;;;4843:67;4729:187;;;:::o;476:252:1:-;548:10;562:9;548:23;540:32;;;;;;624:5;;610:10;;604:16;;:3;:16;:::i;:::-;603:26;;;;:::i;:::-;590:9;:39;;582:48;;;;;;665:9;;657:3;648:6;;:12;;;;:::i;:::-;:26;;640:35;;;;;;695:5;;685:36;;-1:-1:-1;;;;;695:5:1;702:2;706:14;:3;712:8;706:14;:::i;:::-;685:9;:36::i;2747:20:0:-;;;;;;;:::i;5873:203::-;5975:10;5958:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;5958:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;5958:49:0;;;;;;;;;;6023:46;;1822:41:4;;;5958:38:0;;5975:10;6023:46;;1795:18:4;6023:46:0;;;;;;;5873:203;;:::o;7940:155::-;8032:4;8055:33;8065:10;8077:2;8081:6;8055:9;:33::i;:::-;8048:40;7940:155;-1:-1:-1;;;7940:155:0:o;8652:422::-;8800:26;8813:4;8819:2;8823;8800:12;:26::i;:::-;-1:-1:-1;;;;;8854:14:0;;;:19;;;;:154;;-1:-1:-1;8889:63:0;;-1:-1:-1;;;8889:63:0;;;8968:40;-1:-1:-1;;;;;8889:35:0;;;8968:40;;8889:63;;8925:10;;8937:4;;8943:2;;8947:4;;;;8889:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;8889:119:0;;;8854:154;8837:231;;;9040:17;;-1:-1:-1;;;9040:17:0;;;;;;;;;;;948:162:1;1008:13;1064:3;1069:23;1082:9;;1079:2;:12;;;;:::i;:::-;1069:9;:23::i;:::-;1047:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1033:70;;948:162;;;:::o;545:213:0:-;313:5;;-1:-1:-1;;;;;313:5:0;299:10;:19;295:46;;327:14;;-1:-1:-1;;;327:14:0;;;;;;;;;;;295:46;-1:-1:-1;;;;;627:20:0;::::1;623:47;;656:14;;-1:-1:-1::0;;;656:14:0::1;;;;;;;;;;;623:47;681:5;:14:::0;;-1:-1:-1;;;;;;681:14:0::1;-1:-1:-1::0;;;;;681:14:0;::::1;::::0;;::::1;::::0;;711:40:::1;::::0;681:14;;732:10:::1;::::0;711:40:::1;::::0;681:5;711:40:::1;545:213:::0;:::o;862:80:1:-;313:5:0;;-1:-1:-1;;;;;313:5:0;299:10;:19;295:46;;327:14;;-1:-1:-1;;;327:14:0;;;;;;;;;;;295:46;925:3:1::1;:10;931:4:::0;925:3;:10:::1;:::i;:::-;;862:80:::0;:::o;734:122::-;313:5:0;;-1:-1:-1;;;;;313:5:0;299:10;:19;295:46;;327:14;;-1:-1:-1;;;327:14:0;;;;;;;;;;;295:46;807:5:1::1;:14:::0;;;;831:10:::1;:18:::0;734:122::o;10233:90:0:-;10276:7;10302:14;10308:8;10302:2;:14;:::i;:::-;10295:21;;10233:90;:::o;9139:1058::-;9248:4;9264:12;9279:10;:8;:10::i;:::-;-1:-1:-1;;;;;9329:15:0;;;9299:27;9329:15;;;:9;:15;;;;;;;;9386:13;;;;;;;;;9410:15;;;9264:25;;-1:-1:-1;9329:15:0;;9386:13;;9429:6;;9329:15;9410:25;9429:6;9329:15;9410:25;:::i;:::-;;;;-1:-1:-1;;;;;;;9470:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;9574:15;;;;;:9;:15;;;;;;9569:245;;-1:-1:-1;;;;;9678:15:0;;9605:22;9678:15;;;:9;:15;;;;;;:22;;9696:4;;9678:22;:::i;:::-;9631:26;9653:4;9631:19;:26;:::i;:::-;9630:71;;;;:::i;:::-;9605:96;;9720:9;9715:89;9739:14;9735:1;:18;9715:89;;;9778:11;9784:4;9778:5;:11::i;:::-;9755:3;;9715:89;;;;9591:223;9569:245;-1:-1:-1;;;;;9887:13:0;;;;;;:9;:13;;;;;;;;9882:241;;9916:22;9983:28;10007:4;9983:21;:28;:::i;:::-;-1:-1:-1;;;;;9942:13:0;;;;;;:9;:13;;;;;;:20;;9958:4;;9942:20;:::i;:::-;9941:71;;;;:::i;:::-;9916:96;;10031:9;10026:87;10050:14;10046:1;:18;10026:87;;;10089:9;10095:2;10089:5;:9::i;:::-;10066:3;;10026:87;;;;9902:221;9882:241;10158:2;-1:-1:-1;;;;;10138:31:0;10152:4;-1:-1:-1;;;;;10138:31:0;;10162:6;10138:31;;;;160:25:4;;148:2;133:18;;14:177;10138:31:0;;;;;;;;-1:-1:-1;10186:4:0;;9139:1058;-1:-1:-1;;;;;;9139:1058:0:o;1303:1841:1:-;1768:4;1762:11;;1775:3;1758:21;;1846:17;;;;2505:11;;;2384:5;2637:2;2651;2641:13;;2633:22;2505:11;2620:36;2692:2;2682:13;;2283:646;2707:4;2283:646;;;2870:1;2865:3;2861:11;2854:18;;2913:2;2907:4;2903:13;2899:2;2895:22;2890:3;2882:36;2790:2;2780:13;;2283:646;;;-1:-1:-1;2950:13:1;;;-1:-1:-1;;3057:12:1;;;3109:19;;;3057:12;1303:1841;-1:-1:-1;1303:1841:1:o;10789:361:0:-;-1:-1:-1;;;;;10849:18:0;;10845:71;;10890:15;;-1:-1:-1;;;10890:15:0;;;;;;;;;;;10845:71;-1:-1:-1;;;;;10939:12:0;;10926:10;10939:12;;;:6;:12;;;;;10952:19;;:23;;10974:1;;10952:23;:::i;:::-;10939:37;;;;;;;;:::i;:::-;;;;;;;;;10926:50;;10986:6;:12;10993:4;-1:-1:-1;;;;;10986:12:0;-1:-1:-1;;;;;10986:12:0;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;10986:18:0;;;;;;;;;;;;11021:15;;;:11;:15;;;;;;11014:22;;;11053:8;:12;;;;;11046:19;;-1:-1:-1;;;;;;11046:19:0;;;;;;11082:11;:15;;;;;;11075:22;;;;;;;;11113:30;11033:2;;10986:18;-1:-1:-1;;;;;11113:30:0;;;;;10986:18;;11113:30;10835:315;10789:361;:::o;10329:454::-;-1:-1:-1;;;;;10387:16:0;;10383:72;;10426:18;;-1:-1:-1;;;10426:18:0;;;;;;;;;;;10383:72;10489:6;:8;;;;;;;;:6;10552:12;;;:8;:12;;;;;;-1:-1:-1;;;;;10552:12:0;:26;10548:79;;10601:15;;-1:-1:-1;;;10601:15:0;;;;;;;;;;;10548:79;10637:12;;;;:8;:12;;;;;;;;:17;;-1:-1:-1;;;;;;10637:17:0;-1:-1:-1;;;;;10637:17:0;;;;;;;;10664:10;;;:6;:10;;;;;:19;;-1:-1:-1;10664:19:0;;;;;;;;;;;;;;;10711:10;;:17;;:21;;-1:-1:-1;10711:21:0;:::i;:::-;10693:15;;;;:11;:15;;;;;;:39;;;;10748:28;;10705:2;;-1:-1:-1;;;;;10748:28:0;;;;;10693:15;;10748:28;10373:410;10329:454;:::o;196:250:4:-;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:4;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:4;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:4:o;852:180::-;911:6;964:2;952:9;943:7;939:23;935:32;932:52;;;980:1;977;970:12;932:52;-1:-1:-1;1003:23:4;;852:180;-1:-1:-1;852:180:4:o;1245:173::-;1313:20;;-1:-1:-1;;;;;1362:31:4;;1352:42;;1342:70;;1408:1;1405;1398:12;1423:254;1491:6;1499;1552:2;1540:9;1531:7;1527:23;1523:32;1520:52;;;1568:1;1565;1558:12;1520:52;1591:29;1610:9;1591:29;:::i;:::-;1581:39;1667:2;1652:18;;;;1639:32;;-1:-1:-1;;;1423:254:4:o;1874:328::-;1951:6;1959;1967;2020:2;2008:9;1999:7;1995:23;1991:32;1988:52;;;2036:1;2033;2026:12;1988:52;2059:29;2078:9;2059:29;:::i;:::-;2049:39;;2107:38;2141:2;2130:9;2126:18;2107:38;:::i;:::-;2097:48;;2192:2;2181:9;2177:18;2164:32;2154:42;;1874:328;;;;;:::o;2396:347::-;2461:6;2469;2522:2;2510:9;2501:7;2497:23;2493:32;2490:52;;;2538:1;2535;2528:12;2490:52;2561:29;2580:9;2561:29;:::i;:::-;2551:39;;2640:2;2629:9;2625:18;2612:32;2687:5;2680:13;2673:21;2666:5;2663:32;2653:60;;2709:1;2706;2699:12;2653:60;2732:5;2722:15;;;2396:347;;;;;:::o;2748:186::-;2807:6;2860:2;2848:9;2839:7;2835:23;2831:32;2828:52;;;2876:1;2873;2866:12;2828:52;2899:29;2918:9;2899:29;:::i;2939:254::-;3007:6;3015;3068:2;3056:9;3047:7;3043:23;3039:32;3036:52;;;3084:1;3081;3074:12;3036:52;3120:9;3107:23;3097:33;;3149:38;3183:2;3172:9;3168:18;3149:38;:::i;:::-;3139:48;;2939:254;;;;;:::o;3198:808::-;3295:6;3303;3311;3319;3327;3380:3;3368:9;3359:7;3355:23;3351:33;3348:53;;;3397:1;3394;3387:12;3348:53;3420:29;3439:9;3420:29;:::i;:::-;3410:39;;3468:38;3502:2;3491:9;3487:18;3468:38;:::i;:::-;3458:48;;3553:2;3542:9;3538:18;3525:32;3515:42;;3608:2;3597:9;3593:18;3580:32;3631:18;3672:2;3664:6;3661:14;3658:34;;;3688:1;3685;3678:12;3658:34;3726:6;3715:9;3711:22;3701:32;;3771:7;3764:4;3760:2;3756:13;3752:27;3742:55;;3793:1;3790;3783:12;3742:55;3833:2;3820:16;3859:2;3851:6;3848:14;3845:34;;;3875:1;3872;3865:12;3845:34;3920:7;3915:2;3906:6;3902:2;3898:15;3894:24;3891:37;3888:57;;;3941:1;3938;3931:12;3888:57;3198:808;;;;-1:-1:-1;3198:808:4;;-1:-1:-1;3972:2:4;3964:11;;3994:6;3198:808;-1:-1:-1;;;3198:808:4:o;4011:260::-;4079:6;4087;4140:2;4128:9;4119:7;4115:23;4111:32;4108:52;;;4156:1;4153;4146:12;4108:52;4179:29;4198:9;4179:29;:::i;:::-;4169:39;;4227:38;4261:2;4250:9;4246:18;4227:38;:::i;4276:127::-;4337:10;4332:3;4328:20;4325:1;4318:31;4368:4;4365:1;4358:15;4392:4;4389:1;4382:15;4408:922;4477:6;4530:2;4518:9;4509:7;4505:23;4501:32;4498:52;;;4546:1;4543;4536:12;4498:52;4586:9;4573:23;4615:18;4656:2;4648:6;4645:14;4642:34;;;4672:1;4669;4662:12;4642:34;4710:6;4699:9;4695:22;4685:32;;4755:7;4748:4;4744:2;4740:13;4736:27;4726:55;;4777:1;4774;4767:12;4726:55;4813:2;4800:16;4835:2;4831;4828:10;4825:36;;;4841:18;;:::i;:::-;4916:2;4910:9;4884:2;4970:13;;-1:-1:-1;;4966:22:4;;;4990:2;4962:31;4958:40;4946:53;;;5014:18;;;5034:22;;;5011:46;5008:72;;;5060:18;;:::i;:::-;5100:10;5096:2;5089:22;5135:2;5127:6;5120:18;5175:7;5170:2;5165;5161;5157:11;5153:20;5150:33;5147:53;;;5196:1;5193;5186:12;5147:53;5252:2;5247;5243;5239:11;5234:2;5226:6;5222:15;5209:46;5297:1;5275:15;;;5292:2;5271:24;5264:35;;;;-1:-1:-1;5279:6:4;4408:922;-1:-1:-1;;;;;4408:922:4:o;5335:248::-;5403:6;5411;5464:2;5452:9;5443:7;5439:23;5435:32;5432:52;;;5480:1;5477;5470:12;5432:52;-1:-1:-1;;5503:23:4;;;5573:2;5558:18;;;5545:32;;-1:-1:-1;5335:248:4:o;5588:380::-;5667:1;5663:12;;;;5710;;;5731:61;;5785:4;5777:6;5773:17;5763:27;;5731:61;5838:2;5830:6;5827:14;5807:18;5804:38;5801:161;;5884:10;5879:3;5875:20;5872:1;5865:31;5919:4;5916:1;5909:15;5947:4;5944:1;5937:15;5801:161;;5588:380;;;:::o;5973:127::-;6034:10;6029:3;6025:20;6022:1;6015:31;6065:4;6062:1;6055:15;6089:4;6086:1;6079:15;6105:128;6172:9;;;6193:11;;;6190:37;;;6207:18;;:::i;6238:127::-;6299:10;6294:3;6290:20;6287:1;6280:31;6330:4;6327:1;6320:15;6354:4;6351:1;6344:15;6370:127;6431:10;6426:3;6422:20;6419:1;6412:31;6462:4;6459:1;6452:15;6486:4;6483:1;6476:15;7062:290;7131:6;7184:2;7172:9;7163:7;7159:23;7155:32;7152:52;;;7200:1;7197;7190:12;7152:52;7226:16;;-1:-1:-1;;;;;;7271:32:4;;7261:43;;7251:71;;7318:1;7315;7308:12;7357:168;7430:9;;;7461;;7478:15;;;7472:22;;7458:37;7448:71;;7499:18;;:::i;7530:125::-;7595:9;;;7616:10;;;7613:36;;;7629:18;;:::i;7660:662::-;-1:-1:-1;;;;;7939:15:4;;;7921:34;;7991:15;;7986:2;7971:18;;7964:43;8038:2;8023:18;;8016:34;;;8086:3;8081:2;8066:18;;8059:31;;;8106:19;;8099:35;;;7864:4;8127:6;8177;7901:3;8156:19;;8143:49;8242:1;8236:3;8227:6;8216:9;8212:22;8208:32;8201:43;8312:3;8305:2;8301:7;8296:2;8288:6;8284:15;8280:29;8269:9;8265:45;8261:55;8253:63;;7660:662;;;;;;;;:::o;8327:127::-;8388:10;8383:3;8379:20;8376:1;8369:31;8419:4;8416:1;8409:15;8443:4;8440:1;8433:15;8459:112;8491:1;8517;8507:35;;8522:18;;:::i;:::-;-1:-1:-1;8556:9:4;;8459:112::o;8702:1188::-;8979:3;9008:1;9041:6;9035:13;9071:36;9097:9;9071:36;:::i;:::-;9126:1;9143:17;;;9169:133;;;;9316:1;9311:358;;;;9136:533;;9169:133;-1:-1:-1;;9202:24:4;;9190:37;;9275:14;;9268:22;9256:35;;9247:45;;;-1:-1:-1;9169:133:4;;9311:358;9342:6;9339:1;9332:17;9372:4;9417;9414:1;9404:18;9444:1;9458:165;9472:6;9469:1;9466:13;9458:165;;;9550:14;;9537:11;;;9530:35;9593:16;;;;9487:10;;9458:165;;;9462:3;;;9652:6;9647:3;9643:16;9636:23;;9136:533;;;;;9700:6;9694:13;9716:68;9775:8;9770:3;9763:4;9755:6;9751:17;9716:68;:::i;:::-;-1:-1:-1;;;9806:18:4;;9833:22;;;9882:1;9871:13;;8702:1188;-1:-1:-1;;;;8702:1188:4:o;9895:518::-;9997:2;9992:3;9989:11;9986:421;;;10033:5;10030:1;10023:16;10077:4;10074:1;10064:18;10147:2;10135:10;10131:19;10128:1;10124:27;10118:4;10114:38;10183:4;10171:10;10168:20;10165:47;;;-1:-1:-1;10206:4:4;10165:47;10261:2;10256:3;10252:12;10249:1;10245:20;10239:4;10235:31;10225:41;;10316:81;10334:2;10327:5;10324:13;10316:81;;;10393:1;10379:16;;10360:1;10349:13;10316:81;;10589:1345;10715:3;10709:10;10742:18;10734:6;10731:30;10728:56;;;10764:18;;:::i;:::-;10793:97;10883:6;10843:38;10875:4;10869:11;10843:38;:::i;:::-;10837:4;10793:97;:::i;:::-;10945:4;;11002:2;10991:14;;11019:1;11014:663;;;;11721:1;11738:6;11735:89;;;-1:-1:-1;11790:19:4;;;11784:26;11735:89;-1:-1:-1;;10546:1:4;10542:11;;;10538:24;10534:29;10524:40;10570:1;10566:11;;;10521:57;11837:81;;10984:944;;11014:663;8649:1;8642:14;;;8686:4;8673:18;;-1:-1:-1;;11050:20:4;;;11168:236;11182:7;11179:1;11176:14;11168:236;;;11271:19;;;11265:26;11250:42;;11363:27;;;;11331:1;11319:14;;;;11198:19;;11168:236;;;11172:3;11432:6;11423:7;11420:19;11417:201;;;11493:19;;;11487:26;-1:-1:-1;;11576:1:4;11572:14;;;11588:3;11568:24;11564:37;11560:42;11545:58;11530:74;;11417:201;;;11664:1;11655:6;11652:1;11648:14;11644:22;11638:4;11631:36;10984:944;;;;;10589:1345;;:::o;11939:416::-;12028:1;12065:5;12028:1;12079:270;12100:7;12090:8;12087:21;12079:270;;;12159:4;12155:1;12151:6;12147:17;12141:4;12138:27;12135:53;;;12168:18;;:::i;:::-;12218:7;12208:8;12204:22;12201:55;;;12238:16;;;;12201:55;12317:22;;;;12277:15;;;;12079:270;;;12083:3;11939:416;;;;;:::o;12360:806::-;12409:5;12439:8;12429:80;;-1:-1:-1;12480:1:4;12494:5;;12429:80;12528:4;12518:76;;-1:-1:-1;12565:1:4;12579:5;;12518:76;12610:4;12628:1;12623:59;;;;12696:1;12691:130;;;;12603:218;;12623:59;12653:1;12644:10;;12667:5;;;12691:130;12728:3;12718:8;12715:17;12712:43;;;12735:18;;:::i;:::-;-1:-1:-1;;12791:1:4;12777:16;;12806:5;;12603:218;;12905:2;12895:8;12892:16;12886:3;12880:4;12877:13;12873:36;12867:2;12857:8;12854:16;12849:2;12843:4;12840:12;12836:35;12833:77;12830:159;;;-1:-1:-1;12942:19:4;;;12974:5;;12830:159;13021:34;13046:8;13040:4;13021:34;:::i;:::-;13091:6;13087:1;13083:6;13079:19;13070:7;13067:32;13064:58;;;13102:18;;:::i;:::-;13140:20;;12360:806;-1:-1:-1;;;12360:806:4:o;13171:140::-;13229:5;13258:47;13299:4;13289:8;13285:19;13279:4;13258:47;:::i;13316:120::-;13356:1;13382;13372:35;;13387:18;;:::i;:::-;-1:-1:-1;13421:9:4;;13316:120::o

Swarm Source

ipfs://1eb722fd93d86b164efad4669864f1c8f0d77b5d5836aedbbedbb87691f98787
Loading...
Loading
Loading...
Loading
[ 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.