ETH Price: $2,445.84 (+1.80%)

Token

Fancy-Nouns (FANCY-NOUNS)
 

Overview

Max Total Supply

3,333 FANCY-NOUNS

Holders

2,119

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 FANCY-NOUNS
0x796117f03c112a773c66ccfa74dbee1ea3fc12b6
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:
FancyNouns

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-17
*/

// Sources flattened with hardhat v2.14.0 https://hardhat.org
// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/utils/math/[email protected]


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @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 up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (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; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 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.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            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 (rounding == Rounding.Up && 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 down.
     *
     * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * 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 + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * 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 10, 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 + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 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);
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @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://diligence.consensys.net/posts/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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @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, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * 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.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @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`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage);
        }
    }
}


// File contracts/ERC721A.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 1;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // Mapping from token ID to approved address
  mapping(uint256 => address) private _tokenApprovals;

  // Mapping from owner to operator approvals
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex - 1;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721A: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @dev See {IERC721Metadata-name}.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

  /**
   * @dev See {IERC721Metadata-symbol}.
   */
  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString()))
        : "";
  }

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

  /**
   * @dev See {IERC721-approve}.
   */
  function approve(address to, uint256 tokenId) public override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721A: approve caller is not owner nor approved for all"
    );

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_msgSender(), operator, approved);
  }

  /**
   * @dev See {IERC721-isApprovedForAll}.
   */
  function isApprovedForAll(address owner, address operator)
    public
    view
    virtual
    override
    returns (bool)
  {
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    _transfer(from, to, tokenId);
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

    // Clear approvals from the previous owner
    _approve(address(0), tokenId, prevOwnership.addr);

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

  /**
   * @dev Approve `to` to operate on `tokenId`
   *
   * Emits a {Approval} event.
   */
  function _approve(
    address to,
    uint256 tokenId,
    address owner
  ) private {
    _tokenApprovals[tokenId] = to;
    emit Approval(owner, to, tokenId);
  }

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}


// File @openzeppelin/contracts/security/[email protected]


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File contracts/FancyNouns.sol



pragma solidity ^0.8.9;




contract FancyNouns is Ownable, ERC721A, ReentrancyGuard {
  uint256 public immutable maxPerAddressDuringMint;
  string private _baseTokenURI;

  constructor(
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) ERC721A("Fancy-Nouns", "FANCY-NOUNS", maxBatchSize_, collectionSize_) {
    maxPerAddressDuringMint = maxBatchSize_;
  }

  mapping(address => uint256) public allowlist;

  function uploadAllowlist(address[] memory addresses)
    external
    onlyOwner
  {
    for (uint256 i = 0; i < addresses.length; i++) {
      allowlist[addresses[i]] = 1;
    }
  }

  function FancyMintNouns(uint256 quantity) external {
    require(
      totalSupply() + quantity <= collectionSize,
      "too many already minted"
    );
    require(allowlist[msg.sender] == 1, "not in whitelist");
    require(
      balanceOf(msg.sender) + quantity <= maxBatchSize, "can only have nfts less than maxBatchSize"
    );
    _safeMint(msg.sender, quantity);
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }

  function setBaseURI(string calldata baseURI) external onlyOwner {
    _baseTokenURI = baseURI;
  }

  function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
    _setOwnersExplicit(quantity);
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

  function getOwnershipData(uint256 tokenId)
    external
    view
    returns (TokenOwnership memory)
  {
    return ownershipOf(tokenId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxBatchSize_","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"previousOwner","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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"FancyMintNouns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","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":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"tokenId","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"uploadAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040526001805560006008553480156200001a57600080fd5b506040516200500e3803806200500e8339818101604052810190620000409190620002b6565b6040518060400160405280600b81526020017f46616e63792d4e6f756e730000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f46414e43592d4e4f554e530000000000000000000000000000000000000000008152508383620000ce620000c2620001aa60201b60201c565b620001b260201b60201c565b6000811162000114576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010b9062000384565b60405180910390fd5b600082116200015a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000151906200041c565b60405180910390fd5b83600290816200016b9190620006ae565b5082600390816200017d9190620006ae565b508160a0818152505080608081815250505050505060016009819055508160c08181525050505062000795565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b6000819050919050565b62000290816200027b565b81146200029c57600080fd5b50565b600081519050620002b08162000285565b92915050565b60008060408385031215620002d057620002cf62000276565b5b6000620002e0858286016200029f565b9250506020620002f3858286016200029f565b9150509250929050565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60006200036c602e83620002fd565b915062000379826200030e565b604082019050919050565b600060208201905081810360008301526200039f816200035d565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b600062000404602783620002fd565b91506200041182620003a6565b604082019050919050565b600060208201905081810360008301526200043781620003f5565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004c057607f821691505b602082108103620004d657620004d562000478565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000501565b6200054c868362000501565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200058f6200058962000583846200027b565b62000564565b6200027b565b9050919050565b6000819050919050565b620005ab836200056e565b620005c3620005ba8262000596565b8484546200050e565b825550505050565b600090565b620005da620005cb565b620005e7818484620005a0565b505050565b5b818110156200060f5762000603600082620005d0565b600181019050620005ed565b5050565b601f8211156200065e576200062881620004dc565b6200063384620004f1565b8101602085101562000643578190505b6200065b6200065285620004f1565b830182620005ec565b50505b505050565b600082821c905092915050565b6000620006836000198460080262000663565b1980831691505092915050565b60006200069e838362000670565b9150826002028217905092915050565b620006b9826200043e565b67ffffffffffffffff811115620006d557620006d462000449565b5b620006e18254620004a7565b620006ee82828562000613565b600060209050601f83116001811462000726576000841562000711578287015190505b6200071d858262000690565b8655506200078d565b601f1984166200073686620004dc565b60005b82811015620007605784890151825560018201915060208501945060208101905062000739565b868310156200078057848901516200077c601f89168262000670565b8355505b6001600288020188555050505b505050505050565b60805160a05160c051614826620007e86000396000610f16015260008181610d8101528181611e9401528181611ebd01526125a3015260008181610c8a01528181611bf50152611c2901526148266000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a7cd52cb11610097578063d7224ba011610071578063d7224ba014610515578063dc33e68114610533578063e985e9c514610563578063f2fde38b14610593576101c4565b8063a7cd52cb14610499578063b88d4fde146104c9578063c87b56dd146104e5576101c4565b80638da5cb5b116100d35780638da5cb5b146104115780639231ab2a1461042f57806395d89b411461045f578063a22cb4651461047d576101c4565b806370a08231146103b9578063715018a6146103e95780638bc35c2f146103f3576101c4565b80632f745c59116101665780634f6ccce7116101405780634f6ccce71461032157806355f804b31461035157806359b9e80d1461036d5780636352211e14610389576101c4565b80632f745c59146102b9578063361b5b35146102e957806342842e0e14610305576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632d20fb601461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612bdd565b6105af565b6040516101f09190612c25565b60405180910390f35b6102016106f9565b60405161020e9190612cd0565b60405180910390f35b610231600480360381019061022c9190612d28565b61078b565b60405161023e9190612d96565b60405180910390f35b610261600480360381019061025c9190612ddd565b610810565b005b61026b610928565b6040516102789190612e2c565b60405180910390f35b61029b60048036038101906102969190612e47565b61093d565b005b6102b760048036038101906102b29190612d28565b61094d565b005b6102d360048036038101906102ce9190612ddd565b610971565b6040516102e09190612e2c565b60405180910390f35b61030360048036038101906102fe9190612fe2565b610b6d565b005b61031f600480360381019061031a9190612e47565b610bf7565b005b61033b60048036038101906103369190612d28565b610c17565b6040516103489190612e2c565b60405180910390f35b61036b60048036038101906103669190613086565b610c6a565b005b61038760048036038101906103829190612d28565b610c88565b005b6103a3600480360381019061039e9190612d28565b610e02565b6040516103b09190612d96565b60405180910390f35b6103d360048036038101906103ce91906130d3565b610e18565b6040516103e09190612e2c565b60405180910390f35b6103f1610f00565b005b6103fb610f14565b6040516104089190612e2c565b60405180910390f35b610419610f38565b6040516104269190612d96565b60405180910390f35b61044960048036038101906104449190612d28565b610f61565b6040516104569190613161565b60405180910390f35b610467610f79565b6040516104749190612cd0565b60405180910390f35b610497600480360381019061049291906131a8565b61100b565b005b6104b360048036038101906104ae91906130d3565b61118b565b6040516104c09190612e2c565b60405180910390f35b6104e360048036038101906104de919061329d565b6111a3565b005b6104ff60048036038101906104fa9190612d28565b6111ff565b60405161050c9190612cd0565b60405180910390f35b61051d6112a6565b60405161052a9190612e2c565b60405180910390f35b61054d600480360381019061054891906130d3565b6112ac565b60405161055a9190612e2c565b60405180910390f35b61057d60048036038101906105789190613320565b6112be565b60405161058a9190612c25565b60405180910390f35b6105ad60048036038101906105a891906130d3565b611352565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f257506106f1826113d5565b5b9050919050565b6060600280546107089061338f565b80601f01602080910402602001604051908101604052809291908181526020018280546107349061338f565b80156107815780601f1061075657610100808354040283529160200191610781565b820191906000526020600020905b81548152906001019060200180831161076457829003601f168201915b5050505050905090565b60006107968261143f565b6107d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cc90613432565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081b82610e02565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361088b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610882906134c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108aa61144d565b73ffffffffffffffffffffffffffffffffffffffff1614806108d957506108d8816108d361144d565b6112be565b5b610918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090f90613556565b60405180910390fd5b610923838383611455565b505050565b60006001805461093891906135a5565b905090565b610948838383611507565b505050565b610955611abe565b61095d611b3c565b61096681611b8b565b61096e611e18565b50565b600061097c83610e18565b82106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b49061364b565b60405180910390fd5b60006109c7610928565b905060008060005b83811015610b2b576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ac157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b1757868403610b08578195505050505050610b67565b8380610b139061366b565b9450505b508080610b239061366b565b9150506109cf565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90613725565b60405180910390fd5b92915050565b610b75611abe565b60005b8151811015610bf3576001600b6000848481518110610b9a57610b99613745565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610beb9061366b565b915050610b78565b5050565b610c12838383604051806020016040528060008152506111a3565b505050565b6000610c21610928565b8210610c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c59906137e6565b60405180910390fd5b819050919050565b610c72611abe565b8181600a9182610c839291906139bd565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081610cb2610928565b610cbc9190613a8d565b1115610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf490613b0d565b60405180910390fd5b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613b79565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081610daa33610e18565b610db49190613a8d565b1115610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90613c0b565b60405180910390fd5b610dff3382611e22565b50565b6000610e0d82611e40565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90613c9d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610f08611abe565b610f126000612043565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f69612b37565b610f7282611e40565b9050919050565b606060038054610f889061338f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb49061338f565b80156110015780601f10610fd657610100808354040283529160200191611001565b820191906000526020600020905b815481529060010190602001808311610fe457829003601f168201915b5050505050905090565b61101361144d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107790613d09565b60405180910390fd5b806007600061108d61144d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661113a61144d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161117f9190612c25565b60405180910390a35050565b600b6020528060005260406000206000915090505481565b6111ae848484611507565b6111ba84848484612107565b6111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090613d9b565b60405180910390fd5b50505050565b606061120a8261143f565b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613e2d565b60405180910390fd5b600061125361228e565b90506000815111611273576040518060200160405280600081525061129e565b8061127d84612320565b60405160200161128e929190613e89565b6040516020818303038152906040525b915050919050565b60085481565b60006112b7826123ee565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61135a611abe565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090613f1f565b60405180910390fd5b6113d281612043565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061151282611e40565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661153961144d565b73ffffffffffffffffffffffffffffffffffffffff161480611595575061155e61144d565b73ffffffffffffffffffffffffffffffffffffffff1661157d8461078b565b73ffffffffffffffffffffffffffffffffffffffff16145b806115b157506115b082600001516115ab61144d565b6112be565b5b9050806115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90613fb1565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90614043565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb906140d5565b60405180910390fd5b6116e185858560016124d6565b6116f16000848460000151611455565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661175f9190614111565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166118039190614155565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846119099190613a8d565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a4e5761197e8161143f565b15611a4d576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ab686868660016124dc565b505050505050565b611ac661144d565b73ffffffffffffffffffffffffffffffffffffffff16611ae4610f38565b73ffffffffffffffffffffffffffffffffffffffff1614611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b31906141e5565b60405180910390fd5b565b600260095403611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890614251565b60405180910390fd5b6002600981905550565b6000600854905060008211611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc906142bd565b60405180910390fd5b600060018383611be59190613a8d565b611bef91906135a5565b905060017f0000000000000000000000000000000000000000000000000000000000000000611c1e91906135a5565b811115611c555760017f0000000000000000000000000000000000000000000000000000000000000000611c5291906135a5565b90505b611c5e8161143f565b611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c949061434f565b60405180910390fd5b60008290505b818111611dff57600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611dec576000611d1f82611e40565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b8080611df79061366b565b915050611ca3565b50600181611e0d9190613a8d565b600881905550505050565b6001600981905550565b611e3c8282604051806020016040528060008152506124e2565b5050565b611e48612b37565b611e518261143f565b611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e87906143e1565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310611ef45760017f000000000000000000000000000000000000000000000000000000000000000084611ee791906135a5565b611ef19190613a8d565b90505b60008390505b818110612002576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611fee5780935050505061203e565b508080611ffa90614401565b915050611efa565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120359061449c565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006121288473ffffffffffffffffffffffffffffffffffffffff166129c1565b15612281578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261215161144d565b8786866040518563ffffffff1660e01b81526004016121739493929190614511565b6020604051808303816000875af19250505080156121af57506040513d601f19601f820116820180604052508101906121ac9190614572565b60015b612231573d80600081146121df576040519150601f19603f3d011682016040523d82523d6000602084013e6121e4565b606091505b506000815103612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090613d9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612286565b600190505b949350505050565b6060600a805461229d9061338f565b80601f01602080910402602001604051908101604052809291908181526020018280546122c99061338f565b80156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b5050505050905090565b60606000600161232f846129e4565b01905060008167ffffffffffffffff81111561234e5761234d612e9f565b5b6040519080825280601f01601f1916602001820160405280156123805781602001600182028036833780820191505090505b509050600082602001820190505b6001156123e3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123d7576123d661459f565b5b0494506000850361238e575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361245e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245590614640565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f906146d2565b60405180910390fd5b6125618161143f565b156125a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125989061473e565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb906147d0565b60405180910390fd5b61261160008583866124d6565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161270e9190614155565b6fffffffffffffffffffffffffffffffff1681526020018583602001516127359190614155565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156129a457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129446000888488612107565b612983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297a90613d9b565b60405180910390fd5b818061298e9061366b565b925050808061299c9061366b565b9150506128d3565b50806001819055506129b960008785886124dc565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612a42577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612a3857612a3761459f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612a7f576d04ee2d6d415b85acef81000000008381612a7557612a7461459f565b5b0492506020810190505b662386f26fc100008310612aae57662386f26fc100008381612aa457612aa361459f565b5b0492506010810190505b6305f5e1008310612ad7576305f5e1008381612acd57612acc61459f565b5b0492506008810190505b6127108310612afc576127108381612af257612af161459f565b5b0492506004810190505b60648310612b1f5760648381612b1557612b1461459f565b5b0492506002810190505b600a8310612b2e576001810190505b80915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bba81612b85565b8114612bc557600080fd5b50565b600081359050612bd781612bb1565b92915050565b600060208284031215612bf357612bf2612b7b565b5b6000612c0184828501612bc8565b91505092915050565b60008115159050919050565b612c1f81612c0a565b82525050565b6000602082019050612c3a6000830184612c16565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c7a578082015181840152602081019050612c5f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ca282612c40565b612cac8185612c4b565b9350612cbc818560208601612c5c565b612cc581612c86565b840191505092915050565b60006020820190508181036000830152612cea8184612c97565b905092915050565b6000819050919050565b612d0581612cf2565b8114612d1057600080fd5b50565b600081359050612d2281612cfc565b92915050565b600060208284031215612d3e57612d3d612b7b565b5b6000612d4c84828501612d13565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d8082612d55565b9050919050565b612d9081612d75565b82525050565b6000602082019050612dab6000830184612d87565b92915050565b612dba81612d75565b8114612dc557600080fd5b50565b600081359050612dd781612db1565b92915050565b60008060408385031215612df457612df3612b7b565b5b6000612e0285828601612dc8565b9250506020612e1385828601612d13565b9150509250929050565b612e2681612cf2565b82525050565b6000602082019050612e416000830184612e1d565b92915050565b600080600060608486031215612e6057612e5f612b7b565b5b6000612e6e86828701612dc8565b9350506020612e7f86828701612dc8565b9250506040612e9086828701612d13565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ed782612c86565b810181811067ffffffffffffffff82111715612ef657612ef5612e9f565b5b80604052505050565b6000612f09612b71565b9050612f158282612ece565b919050565b600067ffffffffffffffff821115612f3557612f34612e9f565b5b602082029050602081019050919050565b600080fd5b6000612f5e612f5984612f1a565b612eff565b90508083825260208201905060208402830185811115612f8157612f80612f46565b5b835b81811015612faa5780612f968882612dc8565b845260208401935050602081019050612f83565b5050509392505050565b600082601f830112612fc957612fc8612e9a565b5b8135612fd9848260208601612f4b565b91505092915050565b600060208284031215612ff857612ff7612b7b565b5b600082013567ffffffffffffffff81111561301657613015612b80565b5b61302284828501612fb4565b91505092915050565b600080fd5b60008083601f84011261304657613045612e9a565b5b8235905067ffffffffffffffff8111156130635761306261302b565b5b60208301915083600182028301111561307f5761307e612f46565b5b9250929050565b6000806020838503121561309d5761309c612b7b565b5b600083013567ffffffffffffffff8111156130bb576130ba612b80565b5b6130c785828601613030565b92509250509250929050565b6000602082840312156130e9576130e8612b7b565b5b60006130f784828501612dc8565b91505092915050565b61310981612d75565b82525050565b600067ffffffffffffffff82169050919050565b61312c8161310f565b82525050565b6040820160008201516131486000850182613100565b50602082015161315b6020850182613123565b50505050565b60006040820190506131766000830184613132565b92915050565b61318581612c0a565b811461319057600080fd5b50565b6000813590506131a28161317c565b92915050565b600080604083850312156131bf576131be612b7b565b5b60006131cd85828601612dc8565b92505060206131de85828601613193565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561320857613207612e9f565b5b61321182612c86565b9050602081019050919050565b82818337600083830152505050565b600061324061323b846131ed565b612eff565b90508281526020810184848401111561325c5761325b6131e8565b5b61326784828561321e565b509392505050565b600082601f83011261328457613283612e9a565b5b813561329484826020860161322d565b91505092915050565b600080600080608085870312156132b7576132b6612b7b565b5b60006132c587828801612dc8565b94505060206132d687828801612dc8565b93505060406132e787828801612d13565b925050606085013567ffffffffffffffff81111561330857613307612b80565b5b6133148782880161326f565b91505092959194509250565b6000806040838503121561333757613336612b7b565b5b600061334585828601612dc8565b925050602061335685828601612dc8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133a757607f821691505b6020821081036133ba576133b9613360565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061341c602d83612c4b565b9150613427826133c0565b604082019050919050565b6000602082019050818103600083015261344b8161340f565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ae602283612c4b565b91506134b982613452565b604082019050919050565b600060208201905081810360008301526134dd816134a1565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613540603983612c4b565b915061354b826134e4565b604082019050919050565b6000602082019050818103600083015261356f81613533565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135b082612cf2565b91506135bb83612cf2565b92508282039050818111156135d3576135d2613576565b5b92915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613635602283612c4b565b9150613640826135d9565b604082019050919050565b6000602082019050818103600083015261366481613628565b9050919050565b600061367682612cf2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136a8576136a7613576565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061370f602e83612c4b565b915061371a826136b3565b604082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006137d0602383612c4b565b91506137db82613774565b604082019050919050565b600060208201905081810360008301526137ff816137c3565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613836565b61387d8683613836565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138ba6138b56138b084612cf2565b613895565b612cf2565b9050919050565b6000819050919050565b6138d48361389f565b6138e86138e0826138c1565b848454613843565b825550505050565b600090565b6138fd6138f0565b6139088184846138cb565b505050565b5b8181101561392c576139216000826138f5565b60018101905061390e565b5050565b601f8211156139715761394281613811565b61394b84613826565b8101602085101561395a578190505b61396e61396685613826565b83018261390d565b50505b505050565b600082821c905092915050565b600061399460001984600802613976565b1980831691505092915050565b60006139ad8383613983565b9150826002028217905092915050565b6139c78383613806565b67ffffffffffffffff8111156139e0576139df612e9f565b5b6139ea825461338f565b6139f5828285613930565b6000601f831160018114613a245760008415613a12578287013590505b613a1c85826139a1565b865550613a84565b601f198416613a3286613811565b60005b82811015613a5a57848901358255600182019150602085019450602081019050613a35565b86831015613a775784890135613a73601f891682613983565b8355505b6001600288020188555050505b50505050505050565b6000613a9882612cf2565b9150613aa383612cf2565b9250828201905080821115613abb57613aba613576565b5b92915050565b7f746f6f206d616e7920616c7265616479206d696e746564000000000000000000600082015250565b6000613af7601783612c4b565b9150613b0282613ac1565b602082019050919050565b60006020820190508181036000830152613b2681613aea565b9050919050565b7f6e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b6000613b63601083612c4b565b9150613b6e82613b2d565b602082019050919050565b60006020820190508181036000830152613b9281613b56565b9050919050565b7f63616e206f6e6c792068617665206e667473206c657373207468616e206d617860008201527f426174636853697a650000000000000000000000000000000000000000000000602082015250565b6000613bf5602983612c4b565b9150613c0082613b99565b604082019050919050565b60006020820190508181036000830152613c2481613be8565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613c87602b83612c4b565b9150613c9282613c2b565b604082019050919050565b60006020820190508181036000830152613cb681613c7a565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613cf3601a83612c4b565b9150613cfe82613cbd565b602082019050919050565b60006020820190508181036000830152613d2281613ce6565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613d85603383612c4b565b9150613d9082613d29565b604082019050919050565b60006020820190508181036000830152613db481613d78565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e17602f83612c4b565b9150613e2282613dbb565b604082019050919050565b60006020820190508181036000830152613e4681613e0a565b9050919050565b600081905092915050565b6000613e6382612c40565b613e6d8185613e4d565b9350613e7d818560208601612c5c565b80840191505092915050565b6000613e958285613e58565b9150613ea18284613e58565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f09602683612c4b565b9150613f1482613ead565b604082019050919050565b60006020820190508181036000830152613f3881613efc565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000613f9b603283612c4b565b9150613fa682613f3f565b604082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061402d602683612c4b565b915061403882613fd1565b604082019050919050565b6000602082019050818103600083015261405c81614020565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006140bf602583612c4b565b91506140ca82614063565b604082019050919050565b600060208201905081810360008301526140ee816140b2565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061411c826140f5565b9150614127836140f5565b925082820390506fffffffffffffffffffffffffffffffff81111561414f5761414e613576565b5b92915050565b6000614160826140f5565b915061416b836140f5565b925082820190506fffffffffffffffffffffffffffffffff81111561419357614192613576565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141cf602083612c4b565b91506141da82614199565b602082019050919050565b600060208201905081810360008301526141fe816141c2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061423b601f83612c4b565b915061424682614205565b602082019050919050565b6000602082019050818103600083015261426a8161422e565b9050919050565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b60006142a7601883612c4b565b91506142b282614271565b602082019050919050565b600060208201905081810360008301526142d68161429a565b9050919050565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b6000614339602683612c4b565b9150614344826142dd565b604082019050919050565b600060208201905081810360008301526143688161432c565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006143cb602a83612c4b565b91506143d68261436f565b604082019050919050565b600060208201905081810360008301526143fa816143be565b9050919050565b600061440c82612cf2565b91506000820361441f5761441e613576565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614486602f83612c4b565b91506144918261442a565b604082019050919050565b600060208201905081810360008301526144b581614479565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006144e3826144bc565b6144ed81856144c7565b93506144fd818560208601612c5c565b61450681612c86565b840191505092915050565b60006080820190506145266000830187612d87565b6145336020830186612d87565b6145406040830185612e1d565b818103606083015261455281846144d8565b905095945050505050565b60008151905061456c81612bb1565b92915050565b60006020828403121561458857614587612b7b565b5b60006145968482850161455d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b600061462a603183612c4b565b9150614635826145ce565b604082019050919050565b600060208201905081810360008301526146598161461d565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146bc602183612c4b565b91506146c782614660565b604082019050919050565b600060208201905081810360008301526146eb816146af565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614728601d83612c4b565b9150614733826146f2565b602082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006147ba602283612c4b565b91506147c58261475e565b604082019050919050565b600060208201905081810360008301526147e9816147ad565b905091905056fea2646970667358221220afaa622abddd6c3d6ee117e999043a00b4d4d67bc6ccb67e3031bb0c19734cc664736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000d05

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a7cd52cb11610097578063d7224ba011610071578063d7224ba014610515578063dc33e68114610533578063e985e9c514610563578063f2fde38b14610593576101c4565b8063a7cd52cb14610499578063b88d4fde146104c9578063c87b56dd146104e5576101c4565b80638da5cb5b116100d35780638da5cb5b146104115780639231ab2a1461042f57806395d89b411461045f578063a22cb4651461047d576101c4565b806370a08231146103b9578063715018a6146103e95780638bc35c2f146103f3576101c4565b80632f745c59116101665780634f6ccce7116101405780634f6ccce71461032157806355f804b31461035157806359b9e80d1461036d5780636352211e14610389576101c4565b80632f745c59146102b9578063361b5b35146102e957806342842e0e14610305576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632d20fb601461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612bdd565b6105af565b6040516101f09190612c25565b60405180910390f35b6102016106f9565b60405161020e9190612cd0565b60405180910390f35b610231600480360381019061022c9190612d28565b61078b565b60405161023e9190612d96565b60405180910390f35b610261600480360381019061025c9190612ddd565b610810565b005b61026b610928565b6040516102789190612e2c565b60405180910390f35b61029b60048036038101906102969190612e47565b61093d565b005b6102b760048036038101906102b29190612d28565b61094d565b005b6102d360048036038101906102ce9190612ddd565b610971565b6040516102e09190612e2c565b60405180910390f35b61030360048036038101906102fe9190612fe2565b610b6d565b005b61031f600480360381019061031a9190612e47565b610bf7565b005b61033b60048036038101906103369190612d28565b610c17565b6040516103489190612e2c565b60405180910390f35b61036b60048036038101906103669190613086565b610c6a565b005b61038760048036038101906103829190612d28565b610c88565b005b6103a3600480360381019061039e9190612d28565b610e02565b6040516103b09190612d96565b60405180910390f35b6103d360048036038101906103ce91906130d3565b610e18565b6040516103e09190612e2c565b60405180910390f35b6103f1610f00565b005b6103fb610f14565b6040516104089190612e2c565b60405180910390f35b610419610f38565b6040516104269190612d96565b60405180910390f35b61044960048036038101906104449190612d28565b610f61565b6040516104569190613161565b60405180910390f35b610467610f79565b6040516104749190612cd0565b60405180910390f35b610497600480360381019061049291906131a8565b61100b565b005b6104b360048036038101906104ae91906130d3565b61118b565b6040516104c09190612e2c565b60405180910390f35b6104e360048036038101906104de919061329d565b6111a3565b005b6104ff60048036038101906104fa9190612d28565b6111ff565b60405161050c9190612cd0565b60405180910390f35b61051d6112a6565b60405161052a9190612e2c565b60405180910390f35b61054d600480360381019061054891906130d3565b6112ac565b60405161055a9190612e2c565b60405180910390f35b61057d60048036038101906105789190613320565b6112be565b60405161058a9190612c25565b60405180910390f35b6105ad60048036038101906105a891906130d3565b611352565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f257506106f1826113d5565b5b9050919050565b6060600280546107089061338f565b80601f01602080910402602001604051908101604052809291908181526020018280546107349061338f565b80156107815780601f1061075657610100808354040283529160200191610781565b820191906000526020600020905b81548152906001019060200180831161076457829003601f168201915b5050505050905090565b60006107968261143f565b6107d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cc90613432565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081b82610e02565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361088b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610882906134c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108aa61144d565b73ffffffffffffffffffffffffffffffffffffffff1614806108d957506108d8816108d361144d565b6112be565b5b610918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090f90613556565b60405180910390fd5b610923838383611455565b505050565b60006001805461093891906135a5565b905090565b610948838383611507565b505050565b610955611abe565b61095d611b3c565b61096681611b8b565b61096e611e18565b50565b600061097c83610e18565b82106109bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b49061364b565b60405180910390fd5b60006109c7610928565b905060008060005b83811015610b2b576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ac157806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b1757868403610b08578195505050505050610b67565b8380610b139061366b565b9450505b508080610b239061366b565b9150506109cf565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90613725565b60405180910390fd5b92915050565b610b75611abe565b60005b8151811015610bf3576001600b6000848481518110610b9a57610b99613745565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080610beb9061366b565b915050610b78565b5050565b610c12838383604051806020016040528060008152506111a3565b505050565b6000610c21610928565b8210610c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c59906137e6565b60405180910390fd5b819050919050565b610c72611abe565b8181600a9182610c839291906139bd565b505050565b7f0000000000000000000000000000000000000000000000000000000000000d0581610cb2610928565b610cbc9190613a8d565b1115610cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf490613b0d565b60405180910390fd5b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690613b79565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000481610daa33610e18565b610db49190613a8d565b1115610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90613c0b565b60405180910390fd5b610dff3382611e22565b50565b6000610e0d82611e40565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7f90613c9d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610f08611abe565b610f126000612043565b565b7f000000000000000000000000000000000000000000000000000000000000000481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f69612b37565b610f7282611e40565b9050919050565b606060038054610f889061338f565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb49061338f565b80156110015780601f10610fd657610100808354040283529160200191611001565b820191906000526020600020905b815481529060010190602001808311610fe457829003601f168201915b5050505050905090565b61101361144d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107790613d09565b60405180910390fd5b806007600061108d61144d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661113a61144d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161117f9190612c25565b60405180910390a35050565b600b6020528060005260406000206000915090505481565b6111ae848484611507565b6111ba84848484612107565b6111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090613d9b565b60405180910390fd5b50505050565b606061120a8261143f565b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613e2d565b60405180910390fd5b600061125361228e565b90506000815111611273576040518060200160405280600081525061129e565b8061127d84612320565b60405160200161128e929190613e89565b6040516020818303038152906040525b915050919050565b60085481565b60006112b7826123ee565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61135a611abe565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c090613f1f565b60405180910390fd5b6113d281612043565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061151282611e40565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661153961144d565b73ffffffffffffffffffffffffffffffffffffffff161480611595575061155e61144d565b73ffffffffffffffffffffffffffffffffffffffff1661157d8461078b565b73ffffffffffffffffffffffffffffffffffffffff16145b806115b157506115b082600001516115ab61144d565b6112be565b5b9050806115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90613fb1565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90614043565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036116d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cb906140d5565b60405180910390fd5b6116e185858560016124d6565b6116f16000848460000151611455565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661175f9190614111565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166118039190614155565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846119099190613a8d565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a4e5761197e8161143f565b15611a4d576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ab686868660016124dc565b505050505050565b611ac661144d565b73ffffffffffffffffffffffffffffffffffffffff16611ae4610f38565b73ffffffffffffffffffffffffffffffffffffffff1614611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b31906141e5565b60405180910390fd5b565b600260095403611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890614251565b60405180910390fd5b6002600981905550565b6000600854905060008211611bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcc906142bd565b60405180910390fd5b600060018383611be59190613a8d565b611bef91906135a5565b905060017f0000000000000000000000000000000000000000000000000000000000000d05611c1e91906135a5565b811115611c555760017f0000000000000000000000000000000000000000000000000000000000000d05611c5291906135a5565b90505b611c5e8161143f565b611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c949061434f565b60405180910390fd5b60008290505b818111611dff57600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611dec576000611d1f82611e40565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b8080611df79061366b565b915050611ca3565b50600181611e0d9190613a8d565b600881905550505050565b6001600981905550565b611e3c8282604051806020016040528060008152506124e2565b5050565b611e48612b37565b611e518261143f565b611e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e87906143e1565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000048310611ef45760017f000000000000000000000000000000000000000000000000000000000000000484611ee791906135a5565b611ef19190613a8d565b90505b60008390505b818110612002576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611fee5780935050505061203e565b508080611ffa90614401565b915050611efa565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120359061449c565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006121288473ffffffffffffffffffffffffffffffffffffffff166129c1565b15612281578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261215161144d565b8786866040518563ffffffff1660e01b81526004016121739493929190614511565b6020604051808303816000875af19250505080156121af57506040513d601f19601f820116820180604052508101906121ac9190614572565b60015b612231573d80600081146121df576040519150601f19603f3d011682016040523d82523d6000602084013e6121e4565b606091505b506000815103612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090613d9b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612286565b600190505b949350505050565b6060600a805461229d9061338f565b80601f01602080910402602001604051908101604052809291908181526020018280546122c99061338f565b80156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b5050505050905090565b60606000600161232f846129e4565b01905060008167ffffffffffffffff81111561234e5761234d612e9f565b5b6040519080825280601f01601f1916602001820160405280156123805781602001600182028036833780820191505090505b509050600082602001820190505b6001156123e3578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816123d7576123d661459f565b5b0494506000850361238e575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361245e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245590614640565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f906146d2565b60405180910390fd5b6125618161143f565b156125a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125989061473e565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000004831115612604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fb906147d0565b60405180910390fd5b61261160008583866124d6565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161270e9190614155565b6fffffffffffffffffffffffffffffffff1681526020018583602001516127359190614155565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156129a457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129446000888488612107565b612983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297a90613d9b565b60405180910390fd5b818061298e9061366b565b925050808061299c9061366b565b9150506128d3565b50806001819055506129b960008785886124dc565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612a42577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612a3857612a3761459f565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612a7f576d04ee2d6d415b85acef81000000008381612a7557612a7461459f565b5b0492506020810190505b662386f26fc100008310612aae57662386f26fc100008381612aa457612aa361459f565b5b0492506010810190505b6305f5e1008310612ad7576305f5e1008381612acd57612acc61459f565b5b0492506008810190505b6127108310612afc576127108381612af257612af161459f565b5b0492506004810190505b60648310612b1f5760648381612b1557612b1461459f565b5b0492506002810190505b600a8310612b2e576001810190505b80915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bba81612b85565b8114612bc557600080fd5b50565b600081359050612bd781612bb1565b92915050565b600060208284031215612bf357612bf2612b7b565b5b6000612c0184828501612bc8565b91505092915050565b60008115159050919050565b612c1f81612c0a565b82525050565b6000602082019050612c3a6000830184612c16565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c7a578082015181840152602081019050612c5f565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ca282612c40565b612cac8185612c4b565b9350612cbc818560208601612c5c565b612cc581612c86565b840191505092915050565b60006020820190508181036000830152612cea8184612c97565b905092915050565b6000819050919050565b612d0581612cf2565b8114612d1057600080fd5b50565b600081359050612d2281612cfc565b92915050565b600060208284031215612d3e57612d3d612b7b565b5b6000612d4c84828501612d13565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d8082612d55565b9050919050565b612d9081612d75565b82525050565b6000602082019050612dab6000830184612d87565b92915050565b612dba81612d75565b8114612dc557600080fd5b50565b600081359050612dd781612db1565b92915050565b60008060408385031215612df457612df3612b7b565b5b6000612e0285828601612dc8565b9250506020612e1385828601612d13565b9150509250929050565b612e2681612cf2565b82525050565b6000602082019050612e416000830184612e1d565b92915050565b600080600060608486031215612e6057612e5f612b7b565b5b6000612e6e86828701612dc8565b9350506020612e7f86828701612dc8565b9250506040612e9086828701612d13565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ed782612c86565b810181811067ffffffffffffffff82111715612ef657612ef5612e9f565b5b80604052505050565b6000612f09612b71565b9050612f158282612ece565b919050565b600067ffffffffffffffff821115612f3557612f34612e9f565b5b602082029050602081019050919050565b600080fd5b6000612f5e612f5984612f1a565b612eff565b90508083825260208201905060208402830185811115612f8157612f80612f46565b5b835b81811015612faa5780612f968882612dc8565b845260208401935050602081019050612f83565b5050509392505050565b600082601f830112612fc957612fc8612e9a565b5b8135612fd9848260208601612f4b565b91505092915050565b600060208284031215612ff857612ff7612b7b565b5b600082013567ffffffffffffffff81111561301657613015612b80565b5b61302284828501612fb4565b91505092915050565b600080fd5b60008083601f84011261304657613045612e9a565b5b8235905067ffffffffffffffff8111156130635761306261302b565b5b60208301915083600182028301111561307f5761307e612f46565b5b9250929050565b6000806020838503121561309d5761309c612b7b565b5b600083013567ffffffffffffffff8111156130bb576130ba612b80565b5b6130c785828601613030565b92509250509250929050565b6000602082840312156130e9576130e8612b7b565b5b60006130f784828501612dc8565b91505092915050565b61310981612d75565b82525050565b600067ffffffffffffffff82169050919050565b61312c8161310f565b82525050565b6040820160008201516131486000850182613100565b50602082015161315b6020850182613123565b50505050565b60006040820190506131766000830184613132565b92915050565b61318581612c0a565b811461319057600080fd5b50565b6000813590506131a28161317c565b92915050565b600080604083850312156131bf576131be612b7b565b5b60006131cd85828601612dc8565b92505060206131de85828601613193565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561320857613207612e9f565b5b61321182612c86565b9050602081019050919050565b82818337600083830152505050565b600061324061323b846131ed565b612eff565b90508281526020810184848401111561325c5761325b6131e8565b5b61326784828561321e565b509392505050565b600082601f83011261328457613283612e9a565b5b813561329484826020860161322d565b91505092915050565b600080600080608085870312156132b7576132b6612b7b565b5b60006132c587828801612dc8565b94505060206132d687828801612dc8565b93505060406132e787828801612d13565b925050606085013567ffffffffffffffff81111561330857613307612b80565b5b6133148782880161326f565b91505092959194509250565b6000806040838503121561333757613336612b7b565b5b600061334585828601612dc8565b925050602061335685828601612dc8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133a757607f821691505b6020821081036133ba576133b9613360565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061341c602d83612c4b565b9150613427826133c0565b604082019050919050565b6000602082019050818103600083015261344b8161340f565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ae602283612c4b565b91506134b982613452565b604082019050919050565b600060208201905081810360008301526134dd816134a1565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613540603983612c4b565b915061354b826134e4565b604082019050919050565b6000602082019050818103600083015261356f81613533565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135b082612cf2565b91506135bb83612cf2565b92508282039050818111156135d3576135d2613576565b5b92915050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613635602283612c4b565b9150613640826135d9565b604082019050919050565b6000602082019050818103600083015261366481613628565b9050919050565b600061367682612cf2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136a8576136a7613576565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061370f602e83612c4b565b915061371a826136b3565b604082019050919050565b6000602082019050818103600083015261373e81613702565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006137d0602383612c4b565b91506137db82613774565b604082019050919050565b600060208201905081810360008301526137ff816137c3565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613836565b61387d8683613836565b95508019841693508086168417925050509392505050565b6000819050919050565b60006138ba6138b56138b084612cf2565b613895565b612cf2565b9050919050565b6000819050919050565b6138d48361389f565b6138e86138e0826138c1565b848454613843565b825550505050565b600090565b6138fd6138f0565b6139088184846138cb565b505050565b5b8181101561392c576139216000826138f5565b60018101905061390e565b5050565b601f8211156139715761394281613811565b61394b84613826565b8101602085101561395a578190505b61396e61396685613826565b83018261390d565b50505b505050565b600082821c905092915050565b600061399460001984600802613976565b1980831691505092915050565b60006139ad8383613983565b9150826002028217905092915050565b6139c78383613806565b67ffffffffffffffff8111156139e0576139df612e9f565b5b6139ea825461338f565b6139f5828285613930565b6000601f831160018114613a245760008415613a12578287013590505b613a1c85826139a1565b865550613a84565b601f198416613a3286613811565b60005b82811015613a5a57848901358255600182019150602085019450602081019050613a35565b86831015613a775784890135613a73601f891682613983565b8355505b6001600288020188555050505b50505050505050565b6000613a9882612cf2565b9150613aa383612cf2565b9250828201905080821115613abb57613aba613576565b5b92915050565b7f746f6f206d616e7920616c7265616479206d696e746564000000000000000000600082015250565b6000613af7601783612c4b565b9150613b0282613ac1565b602082019050919050565b60006020820190508181036000830152613b2681613aea565b9050919050565b7f6e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b6000613b63601083612c4b565b9150613b6e82613b2d565b602082019050919050565b60006020820190508181036000830152613b9281613b56565b9050919050565b7f63616e206f6e6c792068617665206e667473206c657373207468616e206d617860008201527f426174636853697a650000000000000000000000000000000000000000000000602082015250565b6000613bf5602983612c4b565b9150613c0082613b99565b604082019050919050565b60006020820190508181036000830152613c2481613be8565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613c87602b83612c4b565b9150613c9282613c2b565b604082019050919050565b60006020820190508181036000830152613cb681613c7a565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613cf3601a83612c4b565b9150613cfe82613cbd565b602082019050919050565b60006020820190508181036000830152613d2281613ce6565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613d85603383612c4b565b9150613d9082613d29565b604082019050919050565b60006020820190508181036000830152613db481613d78565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e17602f83612c4b565b9150613e2282613dbb565b604082019050919050565b60006020820190508181036000830152613e4681613e0a565b9050919050565b600081905092915050565b6000613e6382612c40565b613e6d8185613e4d565b9350613e7d818560208601612c5c565b80840191505092915050565b6000613e958285613e58565b9150613ea18284613e58565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f09602683612c4b565b9150613f1482613ead565b604082019050919050565b60006020820190508181036000830152613f3881613efc565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000613f9b603283612c4b565b9150613fa682613f3f565b604082019050919050565b60006020820190508181036000830152613fca81613f8e565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061402d602683612c4b565b915061403882613fd1565b604082019050919050565b6000602082019050818103600083015261405c81614020565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006140bf602583612c4b565b91506140ca82614063565b604082019050919050565b600060208201905081810360008301526140ee816140b2565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061411c826140f5565b9150614127836140f5565b925082820390506fffffffffffffffffffffffffffffffff81111561414f5761414e613576565b5b92915050565b6000614160826140f5565b915061416b836140f5565b925082820190506fffffffffffffffffffffffffffffffff81111561419357614192613576565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141cf602083612c4b565b91506141da82614199565b602082019050919050565b600060208201905081810360008301526141fe816141c2565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061423b601f83612c4b565b915061424682614205565b602082019050919050565b6000602082019050818103600083015261426a8161422e565b9050919050565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b60006142a7601883612c4b565b91506142b282614271565b602082019050919050565b600060208201905081810360008301526142d68161429a565b9050919050565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b6000614339602683612c4b565b9150614344826142dd565b604082019050919050565b600060208201905081810360008301526143688161432c565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006143cb602a83612c4b565b91506143d68261436f565b604082019050919050565b600060208201905081810360008301526143fa816143be565b9050919050565b600061440c82612cf2565b91506000820361441f5761441e613576565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614486602f83612c4b565b91506144918261442a565b604082019050919050565b600060208201905081810360008301526144b581614479565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006144e3826144bc565b6144ed81856144c7565b93506144fd818560208601612c5c565b61450681612c86565b840191505092915050565b60006080820190506145266000830187612d87565b6145336020830186612d87565b6145406040830185612e1d565b818103606083015261455281846144d8565b905095945050505050565b60008151905061456c81612bb1565b92915050565b60006020828403121561458857614587612b7b565b5b60006145968482850161455d565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b600061462a603183612c4b565b9150614635826145ce565b604082019050919050565b600060208201905081810360008301526146598161461d565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006146bc602183612c4b565b91506146c782614660565b604082019050919050565b600060208201905081810360008301526146eb816146af565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614728601d83612c4b565b9150614733826146f2565b602082019050919050565b600060208201905081810360008301526147578161471b565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60006147ba602283612c4b565b91506147c58261475e565b604082019050919050565b600060208201905081810360008301526147e9816147ad565b905091905056fea2646970667358221220afaa622abddd6c3d6ee117e999043a00b4d4d67bc6ccb67e3031bb0c19734cc664736f6c63430008120033

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

00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000d05

-----Decoded View---------------
Arg [0] : maxBatchSize_ (uint256): 4
Arg [1] : collectionSize_ (uint256): 3333

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000d05


Deployed Bytecode Sourcemap

57480:1597:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42147:370;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43873:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45398:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44961:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40704:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46248:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58690:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41339:744;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57884:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46453:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40871:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58584:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58078:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43696:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42573:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2886:103;;;:::i;:::-;;57542:48;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2238:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58927:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44028:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45666:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57833:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46673:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44189:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51088:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58814:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46003:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3144:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42147:370;42274:4;42319:25;42304:40;;;:11;:40;;;;:99;;;;42370:33;42355:48;;;:11;:48;;;;42304:99;:160;;;;42429:35;42414:50;;;:11;:50;;;;42304:160;:207;;;;42475:36;42499:11;42475:23;:36::i;:::-;42304:207;42290:221;;42147:370;;;:::o;43873:94::-;43927:13;43956:5;43949:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43873:94;:::o;45398:204::-;45466:7;45490:16;45498:7;45490;:16::i;:::-;45482:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45572:15;:24;45588:7;45572:24;;;;;;;;;;;;;;;;;;;;;45565:31;;45398:204;;;:::o;44961:379::-;45030:13;45046:24;45062:7;45046:15;:24::i;:::-;45030:40;;45091:5;45085:11;;:2;:11;;;45077:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45176:5;45160:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45185:37;45202:5;45209:12;:10;:12::i;:::-;45185:16;:37::i;:::-;45160:62;45144:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45306:28;45315:2;45319:7;45328:5;45306:8;:28::i;:::-;45023:317;44961:379;;:::o;40704:98::-;40757:7;40795:1;40780:12;;:16;;;;:::i;:::-;40773:23;;40704:98;:::o;46248:142::-;46356:28;46366:4;46372:2;46376:7;46356:9;:28::i;:::-;46248:142;;;:::o;58690:118::-;2124:13;:11;:13::i;:::-;56804:21:::1;:19;:21::i;:::-;58774:28:::2;58793:8;58774:18;:28::i;:::-;56848:20:::1;:18;:20::i;:::-;58690:118:::0;:::o;41339:744::-;41448:7;41483:16;41493:5;41483:9;:16::i;:::-;41475:5;:24;41467:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41545:22;41570:13;:11;:13::i;:::-;41545:38;;41590:19;41620:25;41670:9;41665:350;41689:14;41685:1;:18;41665:350;;;41719:31;41753:11;:14;41765:1;41753:14;;;;;;;;;;;41719:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41806:1;41780:28;;:9;:14;;;:28;;;41776:89;;41841:9;:14;;;41821:34;;41776:89;41898:5;41877:26;;:17;:26;;;41873:135;;41935:5;41920:11;:20;41916:59;;41962:1;41955:8;;;;;;;;;41916:59;41985:13;;;;;:::i;:::-;;;;41873:135;41710:305;41705:3;;;;;:::i;:::-;;;;41665:350;;;;42021:56;;;;;;;;;;:::i;:::-;;;;;;;;41339:744;;;;;:::o;57884:188::-;2124:13;:11;:13::i;:::-;57981:9:::1;57976:91;58000:9;:16;57996:1;:20;57976:91;;;58058:1;58032:9;:23;58042:9;58052:1;58042:12;;;;;;;;:::i;:::-;;;;;;;;58032:23;;;;;;;;;;;;;;;:27;;;;58018:3;;;;;:::i;:::-;;;;57976:91;;;;57884:188:::0;:::o;46453:157::-;46565:39;46582:4;46588:2;46592:7;46565:39;;;;;;;;;;;;:16;:39::i;:::-;46453:157;;;:::o;40871:177::-;40938:7;40970:13;:11;:13::i;:::-;40962:5;:21;40954:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41037:5;41030:12;;40871:177;;;:::o;58584:100::-;2124:13;:11;:13::i;:::-;58671:7:::1;;58655:13;:23;;;;;;;:::i;:::-;;58584:100:::0;;:::o;58078:386::-;58180:14;58168:8;58152:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;58136:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;58275:1;58250:9;:21;58260:10;58250:21;;;;;;;;;;;;;;;;:26;58242:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;58356:12;58344:8;58320:21;58330:10;58320:9;:21::i;:::-;:32;;;;:::i;:::-;:48;;58304:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;58427:31;58437:10;58449:8;58427:9;:31::i;:::-;58078:386;:::o;43696:118::-;43760:7;43783:20;43795:7;43783:11;:20::i;:::-;:25;;;43776:32;;43696:118;;;:::o;42573:211::-;42637:7;42678:1;42661:19;;:5;:19;;;42653:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;42750:12;:19;42763:5;42750:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42742:36;;42735:43;;42573:211;;;:::o;2886:103::-;2124:13;:11;:13::i;:::-;2951:30:::1;2978:1;2951:18;:30::i;:::-;2886:103::o:0;57542:48::-;;;:::o;2238:87::-;2284:7;2311:6;;;;;;;;;;;2304:13;;2238:87;:::o;58927:147::-;59008:21;;:::i;:::-;59048:20;59060:7;59048:11;:20::i;:::-;59041:27;;58927:147;;;:::o;44028:98::-;44084:13;44113:7;44106:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44028:98;:::o;45666:274::-;45769:12;:10;:12::i;:::-;45757:24;;:8;:24;;;45749:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;45866:8;45821:18;:32;45840:12;:10;:12::i;:::-;45821:32;;;;;;;;;;;;;;;:42;45854:8;45821:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;45915:8;45886:48;;45901:12;:10;:12::i;:::-;45886:48;;;45925:8;45886:48;;;;;;:::i;:::-;;;;;;;;45666:274;;:::o;57833:44::-;;;;;;;;;;;;;;;;;:::o;46673:311::-;46810:28;46820:4;46826:2;46830:7;46810:9;:28::i;:::-;46861:48;46884:4;46890:2;46894:7;46903:5;46861:22;:48::i;:::-;46845:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;46673:311;;;;:::o;44189:394::-;44287:13;44328:16;44336:7;44328;:16::i;:::-;44312:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;44418:21;44442:10;:8;:10::i;:::-;44418:34;;44497:1;44479:7;44473:21;:25;:104;;;;;;;;;;;;;;;;;44534:7;44543:18;:7;:16;:18::i;:::-;44517:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44473:104;44459:118;;;44189:394;;;:::o;51088:43::-;;;;:::o;58814:107::-;58872:7;58895:20;58909:5;58895:13;:20::i;:::-;58888:27;;58814:107;;;:::o;46003:186::-;46125:4;46148:18;:25;46167:5;46148:25;;;;;;;;;;;;;;;:35;46174:8;46148:35;;;;;;;;;;;;;;;;;;;;;;;;;46141:42;;46003:186;;;;:::o;3144:201::-;2124:13;:11;:13::i;:::-;3253:1:::1;3233:22;;:8;:22;;::::0;3225:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3309:28;3328:8;3309:18;:28::i;:::-;3144:201:::0;:::o;12514:157::-;12599:4;12638:25;12623:40;;;:11;:40;;;;12616:47;;12514:157;;;:::o;47223:105::-;47280:4;47310:12;;47300:7;:22;47293:29;;47223:105;;;:::o;783:98::-;836:7;863:10;856:17;;783:98;:::o;50910:172::-;51034:2;51007:15;:24;51023:7;51007:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51068:7;51064:2;51048:28;;51057:5;51048:28;;;;;;;;;;;;50910:172;;;:::o;49275:1529::-;49372:35;49410:20;49422:7;49410:11;:20::i;:::-;49372:58;;49439:22;49481:13;:18;;;49465:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;49534:12;:10;:12::i;:::-;49510:36;;:20;49522:7;49510:11;:20::i;:::-;:36;;;49465:81;:142;;;;49557:50;49574:13;:18;;;49594:12;:10;:12::i;:::-;49557:16;:50::i;:::-;49465:142;49439:169;;49633:17;49617:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;49765:4;49743:26;;:13;:18;;;:26;;;49727:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;49854:1;49840:16;;:2;:16;;;49832:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49907:43;49929:4;49935:2;49939:7;49948:1;49907:21;:43::i;:::-;50007:49;50024:1;50028:7;50037:13;:18;;;50007:8;:49::i;:::-;50095:1;50065:12;:18;50078:4;50065:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50131:1;50103:12;:16;50116:2;50103:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50162:43;;;;;;;;50177:2;50162:43;;;;;;50188:15;50162:43;;;;;50139:11;:20;50151:7;50139:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50433:19;50465:1;50455:7;:11;;;;:::i;:::-;50433:33;;50518:1;50477:43;;:11;:24;50489:11;50477:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50473:236;;50535:20;50543:11;50535:7;:20::i;:::-;50531:171;;;50595:97;;;;;;;;50622:13;:18;;;50595:97;;;;;;50653:13;:28;;;50595:97;;;;;50568:11;:24;50580:11;50568:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50531:171;50473:236;50741:7;50737:2;50722:27;;50731:4;50722:27;;;;;;;;;;;;50756:42;50777:4;50783:2;50787:7;50796:1;50756:20;:42::i;:::-;49365:1439;;;49275:1529;;;:::o;2403:132::-;2478:12;:10;:12::i;:::-;2467:23;;:7;:5;:7::i;:::-;:23;;;2459:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2403:132::o;56884:293::-;56286:1;57018:7;;:19;57010:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56286:1;57151:7;:18;;;;56884:293::o;51236:846::-;51298:25;51326:24;;51298:52;;51376:1;51365:8;:12;51357:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51413:16;51463:1;51452:8;51432:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;51413:51;;51503:1;51486:14;:18;;;;:::i;:::-;51475:8;:29;51471:81;;;51543:1;51526:14;:18;;;;:::i;:::-;51515:29;;51471:81;51667:17;51675:8;51667:7;:17::i;:::-;51659:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51739:9;51751:17;51739:29;;51734:297;51775:8;51770:1;:13;51734:297;;51834:1;51803:33;;:11;:14;51815:1;51803:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;51799:225;;51849:31;51883:14;51895:1;51883:11;:14::i;:::-;51849:48;;51925:89;;;;;;;;51952:9;:14;;;51925:89;;;;;;51979:9;:24;;;51925:89;;;;;51908:11;:14;51920:1;51908:14;;;;;;;;;;;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51838:186;51799:225;51785:3;;;;;:::i;:::-;;;;51734:297;;;;52075:1;52064:8;:12;;;;:::i;:::-;52037:24;:39;;;;51291:791;;51236:846;:::o;57185:213::-;56242:1;57368:7;:22;;;;57185:213::o;47334:98::-;47399:27;47409:2;47413:8;47399:27;;;;;;;;;;;;:9;:27::i;:::-;47334:98;;:::o;43036:606::-;43112:21;;:::i;:::-;43153:16;43161:7;43153;:16::i;:::-;43145:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43225:26;43273:12;43262:7;:23;43258:93;;43342:1;43327:12;43317:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;43296:47;;43258:93;43364:12;43379:7;43364:22;;43359:212;43396:18;43388:4;:26;43359:212;;43433:31;43467:11;:17;43479:4;43467:17;;;;;;;;;;;43433:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43523:1;43497:28;;:9;:14;;;:28;;;43493:71;;43545:9;43538:16;;;;;;;43493:71;43424:147;43416:6;;;;;:::i;:::-;;;;43359:212;;;;43579:57;;;;;;;;;;:::i;:::-;;;;;;;;43036:606;;;;:::o;3505:191::-;3579:16;3598:6;;;;;;;;;;;3579:25;;3624:8;3615:6;;:17;;;;;;;;;;;;;;;;;;3679:8;3648:40;;3669:8;3648:40;;;;;;;;;;;;3568:128;3505:191;:::o;52625:690::-;52762:4;52779:15;:2;:13;;;:15::i;:::-;52775:535;;;52834:2;52818:36;;;52855:12;:10;:12::i;:::-;52869:4;52875:7;52884:5;52818:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52805:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53066:1;53049:6;:13;:18;53045:215;;53082:61;;;;;;;;;;:::i;:::-;;;;;;;;53045:215;53228:6;53222:13;53213:6;53209:2;53205:15;53198:38;52805:464;52950:45;;;52940:55;;;:6;:55;;;;52933:62;;;;;52775:535;53298:4;53291:11;;52625:690;;;;;;;:::o;58470:108::-;58530:13;58559;58552:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58470:108;:::o;25997:716::-;26053:13;26104:14;26141:1;26121:17;26132:5;26121:10;:17::i;:::-;:21;26104:38;;26157:20;26191:6;26180:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26157:41;;26213:11;26342:6;26338:2;26334:15;26326:6;26322:28;26315:35;;26379:288;26386:4;26379:288;;;26411:5;;;;;;;;26553:8;26548:2;26541:5;26537:14;26532:30;26527:3;26519:44;26609:2;26600:11;;;;;;:::i;:::-;;;;;26643:1;26634:5;:10;26379:288;26630:21;26379:288;26688:6;26681:13;;;;;25997:716;;;:::o;42790:240::-;42851:7;42900:1;42883:19;;:5;:19;;;42867:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;42991:12;:19;43004:5;42991:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;42983:41;;42976:48;;42790:240;;;:::o;53777:141::-;;;;;:::o;54304:140::-;;;;;:::o;47771:1272::-;47876:20;47899:12;;47876:35;;47940:1;47926:16;;:2;:16;;;47918:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48117:21;48125:12;48117:7;:21::i;:::-;48116:22;48108:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48199:12;48187:8;:24;;48179:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48259:61;48289:1;48293:2;48297:12;48311:8;48259:21;:61::i;:::-;48329:30;48362:12;:16;48375:2;48362:16;;;;;;;;;;;;;;;48329:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48404:119;;;;;;;;48454:8;48424:11;:19;;;:39;;;;:::i;:::-;48404:119;;;;;;48507:8;48472:11;:24;;;:44;;;;:::i;:::-;48404:119;;;;;48385:12;:16;48398:2;48385:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48558:43;;;;;;;;48573:2;48558:43;;;;;;48584:15;48558:43;;;;;48530:11;:25;48542:12;48530:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48610:20;48633:12;48610:35;;48659:9;48654:281;48678:8;48674:1;:12;48654:281;;;48732:12;48728:2;48707:38;;48724:1;48707:38;;;;;;;;;;;;48772:59;48803:1;48807:2;48811:12;48825:5;48772:22;:59::i;:::-;48754:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;48913:14;;;;;:::i;:::-;;;;48688:3;;;;;:::i;:::-;;;;48654:281;;;;48958:12;48943;:27;;;;48977:60;49006:1;49010:2;49014:12;49028:8;48977:20;:60::i;:::-;47869:1174;;;47771:1272;;;:::o;30194:326::-;30254:4;30511:1;30489:7;:19;;;:23;30482:30;;30194:326;;;:::o;22857:922::-;22910:7;22930:14;22947:1;22930:18;;22997:6;22988:5;:15;22984:102;;23033:6;23024:15;;;;;;:::i;:::-;;;;;23068:2;23058:12;;;;22984:102;23113:6;23104:5;:15;23100:102;;23149:6;23140:15;;;;;;:::i;:::-;;;;;23184:2;23174:12;;;;23100:102;23229:6;23220:5;:15;23216:102;;23265:6;23256:15;;;;;;:::i;:::-;;;;;23300:2;23290:12;;;;23216:102;23345:5;23336;:14;23332:99;;23380:5;23371:14;;;;;;:::i;:::-;;;;;23414:1;23404:11;;;;23332:99;23458:5;23449;:14;23445:99;;23493:5;23484:14;;;;;;:::i;:::-;;;;;23527:1;23517:11;;;;23445:99;23571:5;23562;:14;23558:99;;23606:5;23597:14;;;;;;:::i;:::-;;;;;23640:1;23630:11;;;;23558:99;23684:5;23675;:14;23671:66;;23720:1;23710:11;;;;23671:66;23765:6;23758:13;;;22857:922;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:180;6038:77;6035:1;6028:88;6135:4;6132:1;6125:15;6159:4;6156:1;6149:15;6176:281;6259:27;6281:4;6259:27;:::i;:::-;6251:6;6247:40;6389:6;6377:10;6374:22;6353:18;6341:10;6338:34;6335:62;6332:88;;;6400:18;;:::i;:::-;6332:88;6440:10;6436:2;6429:22;6219:238;6176:281;;:::o;6463:129::-;6497:6;6524:20;;:::i;:::-;6514:30;;6553:33;6581:4;6573:6;6553:33;:::i;:::-;6463:129;;;:::o;6598:311::-;6675:4;6765:18;6757:6;6754:30;6751:56;;;6787:18;;:::i;:::-;6751:56;6837:4;6829:6;6825:17;6817:25;;6897:4;6891;6887:15;6879:23;;6598:311;;;:::o;6915:117::-;7024:1;7021;7014:12;7055:710;7151:5;7176:81;7192:64;7249:6;7192:64;:::i;:::-;7176:81;:::i;:::-;7167:90;;7277:5;7306:6;7299:5;7292:21;7340:4;7333:5;7329:16;7322:23;;7393:4;7385:6;7381:17;7373:6;7369:30;7422:3;7414:6;7411:15;7408:122;;;7441:79;;:::i;:::-;7408:122;7556:6;7539:220;7573:6;7568:3;7565:15;7539:220;;;7648:3;7677:37;7710:3;7698:10;7677:37;:::i;:::-;7672:3;7665:50;7744:4;7739:3;7735:14;7728:21;;7615:144;7599:4;7594:3;7590:14;7583:21;;7539:220;;;7543:21;7157:608;;7055:710;;;;;:::o;7788:370::-;7859:5;7908:3;7901:4;7893:6;7889:17;7885:27;7875:122;;7916:79;;:::i;:::-;7875:122;8033:6;8020:20;8058:94;8148:3;8140:6;8133:4;8125:6;8121:17;8058:94;:::i;:::-;8049:103;;7865:293;7788:370;;;;:::o;8164:539::-;8248:6;8297:2;8285:9;8276:7;8272:23;8268:32;8265:119;;;8303:79;;:::i;:::-;8265:119;8451:1;8440:9;8436:17;8423:31;8481:18;8473:6;8470:30;8467:117;;;8503:79;;:::i;:::-;8467:117;8608:78;8678:7;8669:6;8658:9;8654:22;8608:78;:::i;:::-;8598:88;;8394:302;8164:539;;;;:::o;8709:117::-;8818:1;8815;8808:12;8846:553;8904:8;8914:6;8964:3;8957:4;8949:6;8945:17;8941:27;8931:122;;8972:79;;:::i;:::-;8931:122;9085:6;9072:20;9062:30;;9115:18;9107:6;9104:30;9101:117;;;9137:79;;:::i;:::-;9101:117;9251:4;9243:6;9239:17;9227:29;;9305:3;9297:4;9289:6;9285:17;9275:8;9271:32;9268:41;9265:128;;;9312:79;;:::i;:::-;9265:128;8846:553;;;;;:::o;9405:529::-;9476:6;9484;9533:2;9521:9;9512:7;9508:23;9504:32;9501:119;;;9539:79;;:::i;:::-;9501:119;9687:1;9676:9;9672:17;9659:31;9717:18;9709:6;9706:30;9703:117;;;9739:79;;:::i;:::-;9703:117;9852:65;9909:7;9900:6;9889:9;9885:22;9852:65;:::i;:::-;9834:83;;;;9630:297;9405:529;;;;;:::o;9940:329::-;9999:6;10048:2;10036:9;10027:7;10023:23;10019:32;10016:119;;;10054:79;;:::i;:::-;10016:119;10174:1;10199:53;10244:7;10235:6;10224:9;10220:22;10199:53;:::i;:::-;10189:63;;10145:117;9940:329;;;;:::o;10275:108::-;10352:24;10370:5;10352:24;:::i;:::-;10347:3;10340:37;10275:108;;:::o;10389:101::-;10425:7;10465:18;10458:5;10454:30;10443:41;;10389:101;;;:::o;10496:105::-;10571:23;10588:5;10571:23;:::i;:::-;10566:3;10559:36;10496:105;;:::o;10677:529::-;10838:4;10833:3;10829:14;10925:4;10918:5;10914:16;10908:23;10944:63;11001:4;10996:3;10992:14;10978:12;10944:63;:::i;:::-;10853:164;11109:4;11102:5;11098:16;11092:23;11128:61;11183:4;11178:3;11174:14;11160:12;11128:61;:::i;:::-;11027:172;10807:399;10677:529;;:::o;11212:350::-;11369:4;11407:2;11396:9;11392:18;11384:26;;11420:135;11552:1;11541:9;11537:17;11528:6;11420:135;:::i;:::-;11212:350;;;;:::o;11568:116::-;11638:21;11653:5;11638:21;:::i;:::-;11631:5;11628:32;11618:60;;11674:1;11671;11664:12;11618:60;11568:116;:::o;11690:133::-;11733:5;11771:6;11758:20;11749:29;;11787:30;11811:5;11787:30;:::i;:::-;11690:133;;;;:::o;11829:468::-;11894:6;11902;11951:2;11939:9;11930:7;11926:23;11922:32;11919:119;;;11957:79;;:::i;:::-;11919:119;12077:1;12102:53;12147:7;12138:6;12127:9;12123:22;12102:53;:::i;:::-;12092:63;;12048:117;12204:2;12230:50;12272:7;12263:6;12252:9;12248:22;12230:50;:::i;:::-;12220:60;;12175:115;11829:468;;;;;:::o;12303:117::-;12412:1;12409;12402:12;12426:307;12487:4;12577:18;12569:6;12566:30;12563:56;;;12599:18;;:::i;:::-;12563:56;12637:29;12659:6;12637:29;:::i;:::-;12629:37;;12721:4;12715;12711:15;12703:23;;12426:307;;;:::o;12739:146::-;12836:6;12831:3;12826;12813:30;12877:1;12868:6;12863:3;12859:16;12852:27;12739:146;;;:::o;12891:423::-;12968:5;12993:65;13009:48;13050:6;13009:48;:::i;:::-;12993:65;:::i;:::-;12984:74;;13081:6;13074:5;13067:21;13119:4;13112:5;13108:16;13157:3;13148:6;13143:3;13139:16;13136:25;13133:112;;;13164:79;;:::i;:::-;13133:112;13254:54;13301:6;13296:3;13291;13254:54;:::i;:::-;12974:340;12891:423;;;;;:::o;13333:338::-;13388:5;13437:3;13430:4;13422:6;13418:17;13414:27;13404:122;;13445:79;;:::i;:::-;13404:122;13562:6;13549:20;13587:78;13661:3;13653:6;13646:4;13638:6;13634:17;13587:78;:::i;:::-;13578:87;;13394:277;13333:338;;;;:::o;13677:943::-;13772:6;13780;13788;13796;13845:3;13833:9;13824:7;13820:23;13816:33;13813:120;;;13852:79;;:::i;:::-;13813:120;13972:1;13997:53;14042:7;14033:6;14022:9;14018:22;13997:53;:::i;:::-;13987:63;;13943:117;14099:2;14125:53;14170:7;14161:6;14150:9;14146:22;14125:53;:::i;:::-;14115:63;;14070:118;14227:2;14253:53;14298:7;14289:6;14278:9;14274:22;14253:53;:::i;:::-;14243:63;;14198:118;14383:2;14372:9;14368:18;14355:32;14414:18;14406:6;14403:30;14400:117;;;14436:79;;:::i;:::-;14400:117;14541:62;14595:7;14586:6;14575:9;14571:22;14541:62;:::i;:::-;14531:72;;14326:287;13677:943;;;;;;;:::o;14626:474::-;14694:6;14702;14751:2;14739:9;14730:7;14726:23;14722:32;14719:119;;;14757:79;;:::i;:::-;14719:119;14877:1;14902:53;14947:7;14938:6;14927:9;14923:22;14902:53;:::i;:::-;14892:63;;14848:117;15004:2;15030:53;15075:7;15066:6;15055:9;15051:22;15030:53;:::i;:::-;15020:63;;14975:118;14626:474;;;;;:::o;15106:180::-;15154:77;15151:1;15144:88;15251:4;15248:1;15241:15;15275:4;15272:1;15265:15;15292:320;15336:6;15373:1;15367:4;15363:12;15353:22;;15420:1;15414:4;15410:12;15441:18;15431:81;;15497:4;15489:6;15485:17;15475:27;;15431:81;15559:2;15551:6;15548:14;15528:18;15525:38;15522:84;;15578:18;;:::i;:::-;15522:84;15343:269;15292:320;;;:::o;15618:232::-;15758:34;15754:1;15746:6;15742:14;15735:58;15827:15;15822:2;15814:6;15810:15;15803:40;15618:232;:::o;15856:366::-;15998:3;16019:67;16083:2;16078:3;16019:67;:::i;:::-;16012:74;;16095:93;16184:3;16095:93;:::i;:::-;16213:2;16208:3;16204:12;16197:19;;15856:366;;;:::o;16228:419::-;16394:4;16432:2;16421:9;16417:18;16409:26;;16481:9;16475:4;16471:20;16467:1;16456:9;16452:17;16445:47;16509:131;16635:4;16509:131;:::i;:::-;16501:139;;16228:419;;;:::o;16653:221::-;16793:34;16789:1;16781:6;16777:14;16770:58;16862:4;16857:2;16849:6;16845:15;16838:29;16653:221;:::o;16880:366::-;17022:3;17043:67;17107:2;17102:3;17043:67;:::i;:::-;17036:74;;17119:93;17208:3;17119:93;:::i;:::-;17237:2;17232:3;17228:12;17221:19;;16880:366;;;:::o;17252:419::-;17418:4;17456:2;17445:9;17441:18;17433:26;;17505:9;17499:4;17495:20;17491:1;17480:9;17476:17;17469:47;17533:131;17659:4;17533:131;:::i;:::-;17525:139;;17252:419;;;:::o;17677:244::-;17817:34;17813:1;17805:6;17801:14;17794:58;17886:27;17881:2;17873:6;17869:15;17862:52;17677:244;:::o;17927:366::-;18069:3;18090:67;18154:2;18149:3;18090:67;:::i;:::-;18083:74;;18166:93;18255:3;18166:93;:::i;:::-;18284:2;18279:3;18275:12;18268:19;;17927:366;;;:::o;18299:419::-;18465:4;18503:2;18492:9;18488:18;18480:26;;18552:9;18546:4;18542:20;18538:1;18527:9;18523:17;18516:47;18580:131;18706:4;18580:131;:::i;:::-;18572:139;;18299:419;;;:::o;18724:180::-;18772:77;18769:1;18762:88;18869:4;18866:1;18859:15;18893:4;18890:1;18883:15;18910:194;18950:4;18970:20;18988:1;18970:20;:::i;:::-;18965:25;;19004:20;19022:1;19004:20;:::i;:::-;18999:25;;19048:1;19045;19041:9;19033:17;;19072:1;19066:4;19063:11;19060:37;;;19077:18;;:::i;:::-;19060:37;18910:194;;;;:::o;19110:221::-;19250:34;19246:1;19238:6;19234:14;19227:58;19319:4;19314:2;19306:6;19302:15;19295:29;19110:221;:::o;19337:366::-;19479:3;19500:67;19564:2;19559:3;19500:67;:::i;:::-;19493:74;;19576:93;19665:3;19576:93;:::i;:::-;19694:2;19689:3;19685:12;19678:19;;19337:366;;;:::o;19709:419::-;19875:4;19913:2;19902:9;19898:18;19890:26;;19962:9;19956:4;19952:20;19948:1;19937:9;19933:17;19926:47;19990:131;20116:4;19990:131;:::i;:::-;19982:139;;19709:419;;;:::o;20134:233::-;20173:3;20196:24;20214:5;20196:24;:::i;:::-;20187:33;;20242:66;20235:5;20232:77;20229:103;;20312:18;;:::i;:::-;20229:103;20359:1;20352:5;20348:13;20341:20;;20134:233;;;:::o;20373:::-;20513:34;20509:1;20501:6;20497:14;20490:58;20582:16;20577:2;20569:6;20565:15;20558:41;20373:233;:::o;20612:366::-;20754:3;20775:67;20839:2;20834:3;20775:67;:::i;:::-;20768:74;;20851:93;20940:3;20851:93;:::i;:::-;20969:2;20964:3;20960:12;20953:19;;20612:366;;;:::o;20984:419::-;21150:4;21188:2;21177:9;21173:18;21165:26;;21237:9;21231:4;21227:20;21223:1;21212:9;21208:17;21201:47;21265:131;21391:4;21265:131;:::i;:::-;21257:139;;20984:419;;;:::o;21409:180::-;21457:77;21454:1;21447:88;21554:4;21551:1;21544:15;21578:4;21575:1;21568:15;21595:222;21735:34;21731:1;21723:6;21719:14;21712:58;21804:5;21799:2;21791:6;21787:15;21780:30;21595:222;:::o;21823:366::-;21965:3;21986:67;22050:2;22045:3;21986:67;:::i;:::-;21979:74;;22062:93;22151:3;22062:93;:::i;:::-;22180:2;22175:3;22171:12;22164:19;;21823:366;;;:::o;22195:419::-;22361:4;22399:2;22388:9;22384:18;22376:26;;22448:9;22442:4;22438:20;22434:1;22423:9;22419:17;22412:47;22476:131;22602:4;22476:131;:::i;:::-;22468:139;;22195:419;;;:::o;22620:97::-;22679:6;22707:3;22697:13;;22620:97;;;;:::o;22723:141::-;22772:4;22795:3;22787:11;;22818:3;22815:1;22808:14;22852:4;22849:1;22839:18;22831:26;;22723:141;;;:::o;22870:93::-;22907:6;22954:2;22949;22942:5;22938:14;22934:23;22924:33;;22870:93;;;:::o;22969:107::-;23013:8;23063:5;23057:4;23053:16;23032:37;;22969:107;;;;:::o;23082:393::-;23151:6;23201:1;23189:10;23185:18;23224:97;23254:66;23243:9;23224:97;:::i;:::-;23342:39;23372:8;23361:9;23342:39;:::i;:::-;23330:51;;23414:4;23410:9;23403:5;23399:21;23390:30;;23463:4;23453:8;23449:19;23442:5;23439:30;23429:40;;23158:317;;23082:393;;;;;:::o;23481:60::-;23509:3;23530:5;23523:12;;23481:60;;;:::o;23547:142::-;23597:9;23630:53;23648:34;23657:24;23675:5;23657:24;:::i;:::-;23648:34;:::i;:::-;23630:53;:::i;:::-;23617:66;;23547:142;;;:::o;23695:75::-;23738:3;23759:5;23752:12;;23695:75;;;:::o;23776:269::-;23886:39;23917:7;23886:39;:::i;:::-;23947:91;23996:41;24020:16;23996:41;:::i;:::-;23988:6;23981:4;23975:11;23947:91;:::i;:::-;23941:4;23934:105;23852:193;23776:269;;;:::o;24051:73::-;24096:3;24051:73;:::o;24130:189::-;24207:32;;:::i;:::-;24248:65;24306:6;24298;24292:4;24248:65;:::i;:::-;24183:136;24130:189;;:::o;24325:186::-;24385:120;24402:3;24395:5;24392:14;24385:120;;;24456:39;24493:1;24486:5;24456:39;:::i;:::-;24429:1;24422:5;24418:13;24409:22;;24385:120;;;24325:186;;:::o;24517:543::-;24618:2;24613:3;24610:11;24607:446;;;24652:38;24684:5;24652:38;:::i;:::-;24736:29;24754:10;24736:29;:::i;:::-;24726:8;24722:44;24919:2;24907:10;24904:18;24901:49;;;24940:8;24925:23;;24901:49;24963:80;25019:22;25037:3;25019:22;:::i;:::-;25009:8;25005:37;24992:11;24963:80;:::i;:::-;24622:431;;24607:446;24517:543;;;:::o;25066:117::-;25120:8;25170:5;25164:4;25160:16;25139:37;;25066:117;;;;:::o;25189:169::-;25233:6;25266:51;25314:1;25310:6;25302:5;25299:1;25295:13;25266:51;:::i;:::-;25262:56;25347:4;25341;25337:15;25327:25;;25240:118;25189:169;;;;:::o;25363:295::-;25439:4;25585:29;25610:3;25604:4;25585:29;:::i;:::-;25577:37;;25647:3;25644:1;25640:11;25634:4;25631:21;25623:29;;25363:295;;;;:::o;25663:1403::-;25787:44;25827:3;25822;25787:44;:::i;:::-;25896:18;25888:6;25885:30;25882:56;;;25918:18;;:::i;:::-;25882:56;25962:38;25994:4;25988:11;25962:38;:::i;:::-;26047:67;26107:6;26099;26093:4;26047:67;:::i;:::-;26141:1;26170:2;26162:6;26159:14;26187:1;26182:632;;;;26858:1;26875:6;26872:84;;;26931:9;26926:3;26922:19;26909:33;26900:42;;26872:84;26982:67;27042:6;27035:5;26982:67;:::i;:::-;26976:4;26969:81;26831:229;26152:908;;26182:632;26234:4;26230:9;26222:6;26218:22;26268:37;26300:4;26268:37;:::i;:::-;26327:1;26341:215;26355:7;26352:1;26349:14;26341:215;;;26441:9;26436:3;26432:19;26419:33;26411:6;26404:49;26492:1;26484:6;26480:14;26470:24;;26539:2;26528:9;26524:18;26511:31;;26378:4;26375:1;26371:12;26366:17;;26341:215;;;26584:6;26575:7;26572:19;26569:186;;;26649:9;26644:3;26640:19;26627:33;26692:48;26734:4;26726:6;26722:17;26711:9;26692:48;:::i;:::-;26684:6;26677:64;26592:163;26569:186;26801:1;26797;26789:6;26785:14;26781:22;26775:4;26768:36;26189:625;;;26152:908;;25762:1304;;;25663:1403;;;:::o;27072:191::-;27112:3;27131:20;27149:1;27131:20;:::i;:::-;27126:25;;27165:20;27183:1;27165:20;:::i;:::-;27160:25;;27208:1;27205;27201:9;27194:16;;27229:3;27226:1;27223:10;27220:36;;;27236:18;;:::i;:::-;27220:36;27072:191;;;;:::o;27269:173::-;27409:25;27405:1;27397:6;27393:14;27386:49;27269:173;:::o;27448:366::-;27590:3;27611:67;27675:2;27670:3;27611:67;:::i;:::-;27604:74;;27687:93;27776:3;27687:93;:::i;:::-;27805:2;27800:3;27796:12;27789:19;;27448:366;;;:::o;27820:419::-;27986:4;28024:2;28013:9;28009:18;28001:26;;28073:9;28067:4;28063:20;28059:1;28048:9;28044:17;28037:47;28101:131;28227:4;28101:131;:::i;:::-;28093:139;;27820:419;;;:::o;28245:166::-;28385:18;28381:1;28373:6;28369:14;28362:42;28245:166;:::o;28417:366::-;28559:3;28580:67;28644:2;28639:3;28580:67;:::i;:::-;28573:74;;28656:93;28745:3;28656:93;:::i;:::-;28774:2;28769:3;28765:12;28758:19;;28417:366;;;:::o;28789:419::-;28955:4;28993:2;28982:9;28978:18;28970:26;;29042:9;29036:4;29032:20;29028:1;29017:9;29013:17;29006:47;29070:131;29196:4;29070:131;:::i;:::-;29062:139;;28789:419;;;:::o;29214:228::-;29354:34;29350:1;29342:6;29338:14;29331:58;29423:11;29418:2;29410:6;29406:15;29399:36;29214:228;:::o;29448:366::-;29590:3;29611:67;29675:2;29670:3;29611:67;:::i;:::-;29604:74;;29687:93;29776:3;29687:93;:::i;:::-;29805:2;29800:3;29796:12;29789:19;;29448:366;;;:::o;29820:419::-;29986:4;30024:2;30013:9;30009:18;30001:26;;30073:9;30067:4;30063:20;30059:1;30048:9;30044:17;30037:47;30101:131;30227:4;30101:131;:::i;:::-;30093:139;;29820:419;;;:::o;30245:230::-;30385:34;30381:1;30373:6;30369:14;30362:58;30454:13;30449:2;30441:6;30437:15;30430:38;30245:230;:::o;30481:366::-;30623:3;30644:67;30708:2;30703:3;30644:67;:::i;:::-;30637:74;;30720:93;30809:3;30720:93;:::i;:::-;30838:2;30833:3;30829:12;30822:19;;30481:366;;;:::o;30853:419::-;31019:4;31057:2;31046:9;31042:18;31034:26;;31106:9;31100:4;31096:20;31092:1;31081:9;31077:17;31070:47;31134:131;31260:4;31134:131;:::i;:::-;31126:139;;30853:419;;;:::o;31278:176::-;31418:28;31414:1;31406:6;31402:14;31395:52;31278:176;:::o;31460:366::-;31602:3;31623:67;31687:2;31682:3;31623:67;:::i;:::-;31616:74;;31699:93;31788:3;31699:93;:::i;:::-;31817:2;31812:3;31808:12;31801:19;;31460:366;;;:::o;31832:419::-;31998:4;32036:2;32025:9;32021:18;32013:26;;32085:9;32079:4;32075:20;32071:1;32060:9;32056:17;32049:47;32113:131;32239:4;32113:131;:::i;:::-;32105:139;;31832:419;;;:::o;32257:238::-;32397:34;32393:1;32385:6;32381:14;32374:58;32466:21;32461:2;32453:6;32449:15;32442:46;32257:238;:::o;32501:366::-;32643:3;32664:67;32728:2;32723:3;32664:67;:::i;:::-;32657:74;;32740:93;32829:3;32740:93;:::i;:::-;32858:2;32853:3;32849:12;32842:19;;32501:366;;;:::o;32873:419::-;33039:4;33077:2;33066:9;33062:18;33054:26;;33126:9;33120:4;33116:20;33112:1;33101:9;33097:17;33090:47;33154:131;33280:4;33154:131;:::i;:::-;33146:139;;32873:419;;;:::o;33298:234::-;33438:34;33434:1;33426:6;33422:14;33415:58;33507:17;33502:2;33494:6;33490:15;33483:42;33298:234;:::o;33538:366::-;33680:3;33701:67;33765:2;33760:3;33701:67;:::i;:::-;33694:74;;33777:93;33866:3;33777:93;:::i;:::-;33895:2;33890:3;33886:12;33879:19;;33538:366;;;:::o;33910:419::-;34076:4;34114:2;34103:9;34099:18;34091:26;;34163:9;34157:4;34153:20;34149:1;34138:9;34134:17;34127:47;34191:131;34317:4;34191:131;:::i;:::-;34183:139;;33910:419;;;:::o;34335:148::-;34437:11;34474:3;34459:18;;34335:148;;;;:::o;34489:390::-;34595:3;34623:39;34656:5;34623:39;:::i;:::-;34678:89;34760:6;34755:3;34678:89;:::i;:::-;34671:96;;34776:65;34834:6;34829:3;34822:4;34815:5;34811:16;34776:65;:::i;:::-;34866:6;34861:3;34857:16;34850:23;;34599:280;34489:390;;;;:::o;34885:435::-;35065:3;35087:95;35178:3;35169:6;35087:95;:::i;:::-;35080:102;;35199:95;35290:3;35281:6;35199:95;:::i;:::-;35192:102;;35311:3;35304:10;;34885:435;;;;;:::o;35326:225::-;35466:34;35462:1;35454:6;35450:14;35443:58;35535:8;35530:2;35522:6;35518:15;35511:33;35326:225;:::o;35557:366::-;35699:3;35720:67;35784:2;35779:3;35720:67;:::i;:::-;35713:74;;35796:93;35885:3;35796:93;:::i;:::-;35914:2;35909:3;35905:12;35898:19;;35557:366;;;:::o;35929:419::-;36095:4;36133:2;36122:9;36118:18;36110:26;;36182:9;36176:4;36172:20;36168:1;36157:9;36153:17;36146:47;36210:131;36336:4;36210:131;:::i;:::-;36202:139;;35929:419;;;:::o;36354:237::-;36494:34;36490:1;36482:6;36478:14;36471:58;36563:20;36558:2;36550:6;36546:15;36539:45;36354:237;:::o;36597:366::-;36739:3;36760:67;36824:2;36819:3;36760:67;:::i;:::-;36753:74;;36836:93;36925:3;36836:93;:::i;:::-;36954:2;36949:3;36945:12;36938:19;;36597:366;;;:::o;36969:419::-;37135:4;37173:2;37162:9;37158:18;37150:26;;37222:9;37216:4;37212:20;37208:1;37197:9;37193:17;37186:47;37250:131;37376:4;37250:131;:::i;:::-;37242:139;;36969:419;;;:::o;37394:225::-;37534:34;37530:1;37522:6;37518:14;37511:58;37603:8;37598:2;37590:6;37586:15;37579:33;37394:225;:::o;37625:366::-;37767:3;37788:67;37852:2;37847:3;37788:67;:::i;:::-;37781:74;;37864:93;37953:3;37864:93;:::i;:::-;37982:2;37977:3;37973:12;37966:19;;37625:366;;;:::o;37997:419::-;38163:4;38201:2;38190:9;38186:18;38178:26;;38250:9;38244:4;38240:20;38236:1;38225:9;38221:17;38214:47;38278:131;38404:4;38278:131;:::i;:::-;38270:139;;37997:419;;;:::o;38422:224::-;38562:34;38558:1;38550:6;38546:14;38539:58;38631:7;38626:2;38618:6;38614:15;38607:32;38422:224;:::o;38652:366::-;38794:3;38815:67;38879:2;38874:3;38815:67;:::i;:::-;38808:74;;38891:93;38980:3;38891:93;:::i;:::-;39009:2;39004:3;39000:12;38993:19;;38652:366;;;:::o;39024:419::-;39190:4;39228:2;39217:9;39213:18;39205:26;;39277:9;39271:4;39267:20;39263:1;39252:9;39248:17;39241:47;39305:131;39431:4;39305:131;:::i;:::-;39297:139;;39024:419;;;:::o;39449:118::-;39486:7;39526:34;39519:5;39515:46;39504:57;;39449:118;;;:::o;39573:227::-;39613:4;39633:20;39651:1;39633:20;:::i;:::-;39628:25;;39667:20;39685:1;39667:20;:::i;:::-;39662:25;;39711:1;39708;39704:9;39696:17;;39735:34;39729:4;39726:44;39723:70;;;39773:18;;:::i;:::-;39723:70;39573:227;;;;:::o;39806:224::-;39846:3;39865:20;39883:1;39865:20;:::i;:::-;39860:25;;39899:20;39917:1;39899:20;:::i;:::-;39894:25;;39942:1;39939;39935:9;39928:16;;39965:34;39960:3;39957:43;39954:69;;;40003:18;;:::i;:::-;39954:69;39806:224;;;;:::o;40036:182::-;40176:34;40172:1;40164:6;40160:14;40153:58;40036:182;:::o;40224:366::-;40366:3;40387:67;40451:2;40446:3;40387:67;:::i;:::-;40380:74;;40463:93;40552:3;40463:93;:::i;:::-;40581:2;40576:3;40572:12;40565:19;;40224:366;;;:::o;40596:419::-;40762:4;40800:2;40789:9;40785:18;40777:26;;40849:9;40843:4;40839:20;40835:1;40824:9;40820:17;40813:47;40877:131;41003:4;40877:131;:::i;:::-;40869:139;;40596:419;;;:::o;41021:181::-;41161:33;41157:1;41149:6;41145:14;41138:57;41021:181;:::o;41208:366::-;41350:3;41371:67;41435:2;41430:3;41371:67;:::i;:::-;41364:74;;41447:93;41536:3;41447:93;:::i;:::-;41565:2;41560:3;41556:12;41549:19;;41208:366;;;:::o;41580:419::-;41746:4;41784:2;41773:9;41769:18;41761:26;;41833:9;41827:4;41823:20;41819:1;41808:9;41804:17;41797:47;41861:131;41987:4;41861:131;:::i;:::-;41853:139;;41580:419;;;:::o;42005:174::-;42145:26;42141:1;42133:6;42129:14;42122:50;42005:174;:::o;42185:366::-;42327:3;42348:67;42412:2;42407:3;42348:67;:::i;:::-;42341:74;;42424:93;42513:3;42424:93;:::i;:::-;42542:2;42537:3;42533:12;42526:19;;42185:366;;;:::o;42557:419::-;42723:4;42761:2;42750:9;42746:18;42738:26;;42810:9;42804:4;42800:20;42796:1;42785:9;42781:17;42774:47;42838:131;42964:4;42838:131;:::i;:::-;42830:139;;42557:419;;;:::o;42982:225::-;43122:34;43118:1;43110:6;43106:14;43099:58;43191:8;43186:2;43178:6;43174:15;43167:33;42982:225;:::o;43213:366::-;43355:3;43376:67;43440:2;43435:3;43376:67;:::i;:::-;43369:74;;43452:93;43541:3;43452:93;:::i;:::-;43570:2;43565:3;43561:12;43554:19;;43213:366;;;:::o;43585:419::-;43751:4;43789:2;43778:9;43774:18;43766:26;;43838:9;43832:4;43828:20;43824:1;43813:9;43809:17;43802:47;43866:131;43992:4;43866:131;:::i;:::-;43858:139;;43585:419;;;:::o;44010:229::-;44150:34;44146:1;44138:6;44134:14;44127:58;44219:12;44214:2;44206:6;44202:15;44195:37;44010:229;:::o;44245:366::-;44387:3;44408:67;44472:2;44467:3;44408:67;:::i;:::-;44401:74;;44484:93;44573:3;44484:93;:::i;:::-;44602:2;44597:3;44593:12;44586:19;;44245:366;;;:::o;44617:419::-;44783:4;44821:2;44810:9;44806:18;44798:26;;44870:9;44864:4;44860:20;44856:1;44845:9;44841:17;44834:47;44898:131;45024:4;44898:131;:::i;:::-;44890:139;;44617:419;;;:::o;45042:171::-;45081:3;45104:24;45122:5;45104:24;:::i;:::-;45095:33;;45150:4;45143:5;45140:15;45137:41;;45158:18;;:::i;:::-;45137:41;45205:1;45198:5;45194:13;45187:20;;45042:171;;;:::o;45219:234::-;45359:34;45355:1;45347:6;45343:14;45336:58;45428:17;45423:2;45415:6;45411:15;45404:42;45219:234;:::o;45459:366::-;45601:3;45622:67;45686:2;45681:3;45622:67;:::i;:::-;45615:74;;45698:93;45787:3;45698:93;:::i;:::-;45816:2;45811:3;45807:12;45800:19;;45459:366;;;:::o;45831:419::-;45997:4;46035:2;46024:9;46020:18;46012:26;;46084:9;46078:4;46074:20;46070:1;46059:9;46055:17;46048:47;46112:131;46238:4;46112:131;:::i;:::-;46104:139;;45831:419;;;:::o;46256:98::-;46307:6;46341:5;46335:12;46325:22;;46256:98;;;:::o;46360:168::-;46443:11;46477:6;46472:3;46465:19;46517:4;46512:3;46508:14;46493:29;;46360:168;;;;:::o;46534:373::-;46620:3;46648:38;46680:5;46648:38;:::i;:::-;46702:70;46765:6;46760:3;46702:70;:::i;:::-;46695:77;;46781:65;46839:6;46834:3;46827:4;46820:5;46816:16;46781:65;:::i;:::-;46871:29;46893:6;46871:29;:::i;:::-;46866:3;46862:39;46855:46;;46624:283;46534:373;;;;:::o;46913:640::-;47108:4;47146:3;47135:9;47131:19;47123:27;;47160:71;47228:1;47217:9;47213:17;47204:6;47160:71;:::i;:::-;47241:72;47309:2;47298:9;47294:18;47285:6;47241:72;:::i;:::-;47323;47391:2;47380:9;47376:18;47367:6;47323:72;:::i;:::-;47442:9;47436:4;47432:20;47427:2;47416:9;47412:18;47405:48;47470:76;47541:4;47532:6;47470:76;:::i;:::-;47462:84;;46913:640;;;;;;;:::o;47559:141::-;47615:5;47646:6;47640:13;47631:22;;47662:32;47688:5;47662:32;:::i;:::-;47559:141;;;;:::o;47706:349::-;47775:6;47824:2;47812:9;47803:7;47799:23;47795:32;47792:119;;;47830:79;;:::i;:::-;47792:119;47950:1;47975:63;48030:7;48021:6;48010:9;48006:22;47975:63;:::i;:::-;47965:73;;47921:127;47706:349;;;;:::o;48061:180::-;48109:77;48106:1;48099:88;48206:4;48203:1;48196:15;48230:4;48227:1;48220:15;48247:236;48387:34;48383:1;48375:6;48371:14;48364:58;48456:19;48451:2;48443:6;48439:15;48432:44;48247:236;:::o;48489:366::-;48631:3;48652:67;48716:2;48711:3;48652:67;:::i;:::-;48645:74;;48728:93;48817:3;48728:93;:::i;:::-;48846:2;48841:3;48837:12;48830:19;;48489:366;;;:::o;48861:419::-;49027:4;49065:2;49054:9;49050:18;49042:26;;49114:9;49108:4;49104:20;49100:1;49089:9;49085:17;49078:47;49142:131;49268:4;49142:131;:::i;:::-;49134:139;;48861:419;;;:::o;49286:220::-;49426:34;49422:1;49414:6;49410:14;49403:58;49495:3;49490:2;49482:6;49478:15;49471:28;49286:220;:::o;49512:366::-;49654:3;49675:67;49739:2;49734:3;49675:67;:::i;:::-;49668:74;;49751:93;49840:3;49751:93;:::i;:::-;49869:2;49864:3;49860:12;49853:19;;49512:366;;;:::o;49884:419::-;50050:4;50088:2;50077:9;50073:18;50065:26;;50137:9;50131:4;50127:20;50123:1;50112:9;50108:17;50101:47;50165:131;50291:4;50165:131;:::i;:::-;50157:139;;49884:419;;;:::o;50309:179::-;50449:31;50445:1;50437:6;50433:14;50426:55;50309:179;:::o;50494:366::-;50636:3;50657:67;50721:2;50716:3;50657:67;:::i;:::-;50650:74;;50733:93;50822:3;50733:93;:::i;:::-;50851:2;50846:3;50842:12;50835:19;;50494:366;;;:::o;50866:419::-;51032:4;51070:2;51059:9;51055:18;51047:26;;51119:9;51113:4;51109:20;51105:1;51094:9;51090:17;51083:47;51147:131;51273:4;51147:131;:::i;:::-;51139:139;;50866:419;;;:::o;51291:221::-;51431:34;51427:1;51419:6;51415:14;51408:58;51500:4;51495:2;51487:6;51483:15;51476:29;51291:221;:::o;51518:366::-;51660:3;51681:67;51745:2;51740:3;51681:67;:::i;:::-;51674:74;;51757:93;51846:3;51757:93;:::i;:::-;51875:2;51870:3;51866:12;51859:19;;51518:366;;;:::o;51890:419::-;52056:4;52094:2;52083:9;52079:18;52071:26;;52143:9;52137:4;52133:20;52129:1;52118:9;52114:17;52107:47;52171:131;52297:4;52171:131;:::i;:::-;52163:139;;51890:419;;;:::o

Swarm Source

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