ETH Price: $3,355.65 (-0.98%)

Token

RainbowPoop - from shit to rainbow poop (rainbowpoop.wtf)
 

Overview

Max Total Supply

354 rainbowpoop.wtf

Holders

53

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
0x4829.eth
Balance
2 rainbowpoop.wtf
0x6cd8af7445296213db504e3631ae66b3808c4829
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:
RainbowPoop

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-09
*/

/*  🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈
    RainbowPoop 
    not just a piece of shit
    but also a rainbow poop 🌈💩
    or probably another piece of shit
    or something
    or probably nothing
    or 'poopchip'
    Let's poop it! Hellyeah!
    https://rainbowpoop.wtf
    💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩
 */


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

// SPDX-License-Identifier: MIT

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]

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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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/interfaces/[email protected]

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount);
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

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

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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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/token/ERC721/extensions/[email protected]

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 tokenId);

    /**
     * @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/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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 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 = 0;

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index > 0 && 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 > 0 && 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 = totalSupply() + 1;
        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 += quantity;
        _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 contracts/Base64.sol

pragma solidity ^0.8.0;

/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

// File contracts/RainbowPoop.sol

pragma solidity ^0.8.0;

contract RainbowPoop is ERC721A, Ownable, IERC2981 {
    using Strings for uint256;
    using Strings for uint8;

    string[8] private RAINBOW_COLORS = ["url(#rainbow)", "#ff2f2b", "#ff5722", "#ffeb3b", "#4caf50", "#03a9f4", "#673ab7", "#9c27b0"];
    string[23] private GENERAL_COLORS = [
        "url(#rainbow)",
        "#fff",
        "#f44336",
        "#e91e63",
        "#9c27b0",
        "#673ab7",
        "#3f51b5",
        "#2196f3",
        "#03a9f4",
        "#00bcd4",
        "#009688",
        "#4caf50",
        "#8bc34a",
        "#cddc39",
        "#ffeb3b",
        "#ffc107",
        "#ff9800",
        "#ff5722",
        "#795548",
        "#9e9e9e",
        "#607d8b",
        "#000",
        "none"
    ];

    string[8] private HAIR_COLORS = ["url(#rainbow)", "#607d8b", "#f44336", "#fff", "#8bc34a", "#2196f3", "#ff9800", "#795548"];
    string[8] private HEAD_COLORS = ["url(#rainbow)", "#607d8b", "#f44336", "#fff", "#8bc34a", "#2196f3", "#ff9800", "#795548"];
    string[8] private BOTTOM_COLORS = ["url(#rainbow)", "#f44336", "#000", "#8bc34a", "#2196f3", "#607d8b", "#ff9800", "#795548"];

    struct Poop {
        uint8 background;
        uint8 hair;
        uint8 head;
        uint8 bottom;
        uint8 eyes;
        uint8 mouth;
        uint8 generation;
        uint8 shit;
    }

    string[8] private backgroundAttr = [unicode"🌈", "Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet"];
    string[8] private hairAttr = [unicode"🌈", "Goblin", "Punk", "Pure", "Zombie", "Ape", "Popcorn", "Poop"];
    string[8] private headAttr = [unicode"🌈", unicode"👽", unicode"👹", unicode"💀", unicode"🧟", unicode"🤖", unicode"🦹‍♂️", unicode"💩"];
    string[8] private bottomAttr = [unicode"🌈", "Beetrootpoop", "Poophole", "Veganpoop", "Poopman", "Koalapoop", "Shampoop", "Poopoop"];
    string[8] private eyesAttr = [unicode"🌈", "Laserpoop", "Cyclopoop", "Fasionpoop", "Poophole", "Pandapoop", "Koalapoop", "Poopoop"];
    string[8] private mouthAttr = [unicode"🌈", "Poopshit", "Freezingpoop", "Puppypoop", "Bitchpoop", "Boredpoop", "Nopoop", "Cheesepoop"];
    string[8] private generationAttr = [unicode"🌈", unicode"💩"];
    string[8] private shitAttr = ["L", "G", "B", "T", "Q", "I", "A", "P"];

    constructor() ERC721A("RainbowPoop - from shit to rainbow poop", "rainbowpoop.wtf", 10, 10000) {}

    function poop(uint256 quantity) external payable {
        require(quantity <= 2, "poop too much");
        require(quantity + totalSupply() <= collectionSize, "no more poop");
        require(balanceOf(msg.sender) + quantity <= maxBatchSize, "you own poooooop");
        _safeMint(msg.sender, quantity);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        Poop memory p = randomPoop(tokenId);
        string memory output = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Rainbow Poop #',
                        tokenId.toString(),
                        unicode'", "description": "RainbowPoop is not just a piece of shit, but also a rainbow poop 🌈💩. "',
                        ',"attributes":',
                        poopAttributes(p),
                        ',"image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(poopSVG(p))),
                        '"}'
                    )
                )
            )
        );
        return string(abi.encodePacked("data:application/json;base64,", output));
    }

    function poopSVG(uint256 tokenId) public view returns (string memory) {
        return poopSVG(randomPoop(tokenId));
    }

    function poopSVG(Poop memory p) private view returns (string memory) {
        string[9] memory parts = [
            '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60"><defs><linearGradient id="rainbow" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#ff2f2b"/><stop offset="17%" stop-color="#ff5722"/><stop offset="33%" stop-color="#ffeb3b"/><stop offset="50%" stop-color="#4caf50"/><stop offset="66%" stop-color="#03a9f4"/><stop offset="83%" stop-color="#673ab7"/><stop offset="100%" stop-color="#9c27b0"/></linearGradient></defs>',
            poopBackground(p.background),
            poopHair(p.hair),
            poopHead(p.head),
            poopBottom(p.bottom),
            poopEyes(p.eyes),
            poopMouth(p.mouth),
            poopGeneration(p.generation),
            "</svg>"
        ];

        return string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
    }

    function randomPoop(uint256 tokenId) private pure returns (Poop memory) {
        uint256 rand = uint256(keccak256(abi.encodePacked(tokenId)));

        return
            Poop({
                background: avgPoopIndex(uint8(rand & 255)),
                hair: seqPoopIndex(uint8((rand >> 8) & 255)),
                head: powPoopIndex(uint8((rand >> 16) & 255)),
                bottom: avgPoopIndex(uint8((rand >> 24) & 255)),
                eyes: seqPoopIndex(uint8((rand >> 32) & 255)),
                mouth: seqPoopIndex(uint8((rand >> 40) & 255)),
                generation: twoPoopIndex(uint8((rand >> 48) & 255)),
                shit: avgPoopIndex(uint8((rand >> 56) & 255))
            });
    }

    function avgPoopIndex(uint8 num) private pure returns (uint8) {
        return (num % 8);
    }

    function powPoopIndex(uint8 num) private pure returns (uint8) {
        if (num < 2) {
            return 0;
        }
        if (num < 4) {
            return 1;
        }
        if (num < 8) {
            return 2;
        }
        if (num < 16) {
            return 3;
        }
        if (num < 32) {
            return 4;
        }
        if (num < 64) {
            return 5;
        }
        if (num < 128) {
            return 6;
        }
        return 7;
    }

    function seqPoopIndex(uint8 num) private pure returns (uint8) {
        if (num < 8) {
            return 0;
        }
        if (num < 16) {
            return 1;
        }
        if (num < 24) {
            return 2;
        }
        if (num < 40) {
            return 3;
        }
        if (num < 64) {
            return 4;
        }
        if (num < 104) {
            return 5;
        }
        if (num < 168) {
            return 6;
        }
        return 7;
    }

    function twoPoopIndex(uint8 num) private pure returns (uint8) {
        return (num < 51) ? 0 : 1;
    }

    function poopBackground(uint8 index) private view returns (string memory) {
        return string(abi.encodePacked('<rect width="100%" height="100%" fill="', RAINBOW_COLORS[index], '" />'));
    }

    function poopHair(uint8 index) private view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<path d="M39 16c-2.5 4.99-9.02 7.2-15.86 8.38l-5.91.88c-.72.13-1.41.27-2.07.44C9.62 16.56 16.36 11.87 24 9c6.28-2.36 2-8 2-8 9 0 16 9 13 15z" fill="',
                    HAIR_COLORS[index],
                    '" stroke="#000"/>'
                )
            );
    }

    function poopHead(uint8 index) private view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<path d="M55 35a13 13 0 01-1.74 6.33c-2.59 4.49-8.34 8.87-19 11.91l-2.39.64A125 125 0 019 57a8 8 0 01-8-8c0-3 1.5-5.25 4.5-7a12 12 0 013-1.15 70 70 0 019.71-1.54l7-.86a61.68 61.68 0 008.19-1.78l12.37-7.02A34 34 0 0048 27s7 2 7 8z" fill="',
                    HEAD_COLORS[index],
                    '" stroke="#000"/>'
                    '<path d="M48 27a34 34 0 01-2.3 2.65l-12.37 7.02a61.68 61.68 0 01-8.19 1.78l-7.0.86c-3.2.2-6.5.8-9.71 1.54A8 8 0 016 35c0-5 3.43-8 9.16-9.3.66-.17 1.35-.31 2.07-.44l5.91-.88C29.98 23.2 36.5 20.99 39 16c10 0 9 11 9 11z" fill="',
                    HEAD_COLORS[index],
                    '" stroke="#000"/>'
                )
            );
    }

    function poopBottom(uint8 index) private view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<path d="M59 49a8 8 0 01-8 8H9a125 125 0 0022.83-3.12l2.39-.64c10.7-3.04 16.45-7.42 19-11.91A8 8 0 0159 49z" fill="',
                    BOTTOM_COLORS[index],
                    '" stroke="#000"/>'
                )
            );
    }

    function poopEyes(uint8 index) private view returns (string memory) {
        if (index == 0) {
            return string(abi.encodePacked(_poopCircle(21, 32, 8, 0), _poopCircle(40, 32, 8, 0), _poopRect(28, 30, 1, 5, 2, 0)));
        }
        if (index == 1) {
            return string(abi.encodePacked(_poopCircle(22, 32, 2, 2, 14), _poopCircle(38, 32, 2, 2, 14), _poopRect(6, 31, 1, 48, 2, 2, 14)));
        }
        if (index == 2) {
            return '<rect x="14" y="28" rx="4" width="33" height="8" stroke-width="3" fill="#03a9f4" stroke="#000" />';
            // return _poopRect(14, 28, 4, 33, 8, 8, 21, 'stroke-width="3"');
        }
        if (index == 3) {
            return string(abi.encodePacked(_poopRect(13, 26, 3, 16, 10, 8), _poopRect(32, 26, 3, 16, 10, 8), _poopRect(28, 29, 1, 5, 2, 0)));
        }
        if (index == 4) {
            return string(abi.encodePacked(_poopCircle(17, 32, 2, 20), _poopCircle(33, 32, 2, 20), _poopRect(13, 28, 1, 14, 2, 21), _poopRect(29, 28, 1, 14, 2, 21)));
        }
        if (index == 5) {
            return string(abi.encodePacked(_poopCircle(21, 32, 8, 21), _poopCircle(39, 32, 8, 21), _poopEllipse(22, 32, 4, 2, 20), _poopEllipse(39, 32, 4, 2, 20)));
        }
        if (index == 6) {
            return string(abi.encodePacked(_poopCircle(22, 32, 2, 20), _poopCircle(40, 32, 2, 20)));
        }
        return string(abi.encodePacked(_poopEye(true), _poopEye(false)));
    }

    function poopMouth(uint8 index) private view returns (string memory) {
        if (index == 0) {
            // pure
            return _poopPath("m21 43a10 24 10 0 0 19 1z", 0);
        }
        if (index == 1) {
            // shit
            return _poopPath("m22 40a10 8 0 0 0 20 4z", 2);
        }
        if (index == 2) {
            // freezing
            return
                string(
                    abi.encodePacked(
                        _poopRect(20, 44, 3, 20, 6, 2),
                        _poopLine(24, 44, 24, 50, 21),
                        _poopLine(28, 44, 28, 50, 21),
                        _poopLine(32, 44, 32, 50, 21),
                        _poopLine(36, 44, 36, 50, 21)
                    )
                );
        }
        if (index == 3) {
            // puppy
            return _poopPath("m36 45a10 6 0 0 1-10 0", 22);
        }
        if (index == 4) {
            // bitch
            return _poopEllipse(30, 46, 5, 6, 2, 21);
        }
        if (index == 5) {
            // bored
            return _poopPath("m28 45a12 6 0 0 1 13 1", 22);
        }
        if (index == 6) {
            // cheese
            return _poopPath("M30 54c7 0 9-5 10-9a1 1 0 00-1-1 26 26 0 01-17 0 1 1 0 00-1 1C20 48 22 54 30 54z", 2);
        }

        // none
        return "";
    }

    function poopGeneration(uint8 index) private pure returns (string memory) {
        return index == 0 ? string(abi.encodePacked('<text x="1" y="15" font-size="16">', unicode"🌈", "</text>")) : "";
    }

    function _poopPath(string memory d, uint8 fill) private view returns (string memory) {
        return string(abi.encodePacked('<path d="', d, '" style="stroke-linecap:round;stroke:#000;" fill="', GENERAL_COLORS[fill], '"/>'));
    }

    function _poopEye(bool isLeftEye) private view returns (string memory) {
        string memory cx0 = (isLeftEye ? 21 : 39).toString();
        string memory cx1 = (isLeftEye ? 22 : 38).toString();
        return
            string(
                abi.encodePacked(
                    '<ellipse cx="',
                    cx0,
                    '" cy="32" rx="7" ry="8" fill="',
                    GENERAL_COLORS[1],
                    '" stroke="#000"/><ellipse cx="',
                    cx1,
                    '" cy="32" fill="#052e43" rx="2.5" ry="3.5" /><ellipse cx="',
                    cx1,
                    '" cy="32" fill="#607d8b" rx="1" ry="1.6" />'
                )
            );
    }

    function _poopLine(
        uint8 x1,
        uint8 y1,
        uint8 x2,
        uint8 y2,
        uint8 stroke
    ) private view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<line x1="',
                    x1.toString(),
                    '" y1="',
                    y1.toString(),
                    '" x2="',
                    x2.toString(),
                    '" y2="',
                    y2.toString(),
                    '" stroke="',
                    GENERAL_COLORS[stroke],
                    '"/>'
                )
            );
    }

    function _poopEllipse(
        uint8 cx,
        uint8 cy,
        uint8 rx,
        uint8 ry,
        uint8 fill
    ) private view returns (string memory) {
        return _poopEllipse(cx, cy, rx, ry, fill, 22);
    }

    function _poopEllipse(
        uint8 cx,
        uint8 cy,
        uint8 rx,
        uint8 ry,
        uint8 fill,
        uint8 stroke
    ) private view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<ellipse cx="',
                    cx.toString(),
                    '" cy="',
                    cy.toString(),
                    '" rx="',
                    rx.toString(),
                    '" ry="',
                    ry.toString(),
                    '" fill="',
                    GENERAL_COLORS[fill],
                    '" stroke="',
                    GENERAL_COLORS[stroke],
                    '"/>'
                )
            );
    }

    function _poopRect(
        uint8 x,
        uint8 y,
        uint8 rx,
        uint8 width,
        uint8 height,
        uint8 fill
    ) private view returns (string memory) {
        return _poopRect(x, y, rx, width, height, fill, 21);
    }

    function _poopRect(
        uint8 x,
        uint8 y,
        uint8 rx,
        uint8 width,
        uint8 height,
        uint8 fill,
        uint8 stroke
    ) private view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<rect x="',
                    x.toString(),
                    '" y="',
                    y.toString(),
                    '" rx="',
                    rx.toString(),
                    '" width="',
                    width.toString(),
                    '" height="',
                    height.toString(),
                    '" fill="',
                    GENERAL_COLORS[fill],
                    '" stroke="',
                    GENERAL_COLORS[stroke],
                    '"/>"'
                )
            );
    }

    function _poopCircle(
        uint8 x,
        uint8 y,
        uint8 r,
        uint8 fill
    ) private view returns (string memory) {
        return _poopCircle(x, y, r, fill, 21);
    }

    function _poopCircle(
        uint8 x,
        uint8 y,
        uint8 r,
        uint8 fill,
        uint8 stroke
    ) private view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '<circle cx="',
                    x.toString(),
                    '" cy="',
                    y.toString(),
                    '" r="',
                    r.toString(),
                    '" fill="',
                    GENERAL_COLORS[fill],
                    '" stroke="',
                    GENERAL_COLORS[stroke],
                    '" />'
                )
            );
    }

    function poopAttributes(Poop memory p) private view returns (string memory) {
        return
            string(
                abi.encodePacked(
                    '[{"trait_type":"Background","value":"',
                    backgroundAttr[p.background],
                    '"},{"trait_type":"Hair","value":"',
                    hairAttr[p.hair],
                    '"},{"trait_type":"Head","value":"',
                    headAttr[p.head],
                    '"},{"trait_type":"Bottom","value":"',
                    bottomAttr[p.bottom],
                    '"},{"trait_type":"Eyes","value":"',
                    eyesAttr[p.eyes],
                    '"},{"trait_type":"Mouth","value":"',
                    mouthAttr[p.mouth],
                    '"},{"trait_type":"Generation","value":"',
                    generationAttr[p.generation],
                    '"},{"trait_type":"Shit","value":"',
                    shitAttr[p.shit],
                    '"}]'
                )
            );
    }

    function purePoop(uint256 quantity, address receiver) external onlyOwner {
        require(quantity + totalSupply() <= collectionSize, "no more poop");
        _safeMint(receiver, quantity);
    }

    function royaltyInfo(uint256, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount) {
        return (address(this), (salePrice * 7) / 100);
    }

    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{ value: address(this).balance }("");
        require(success, "no tips");
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"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":"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":"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":[],"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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"poop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"poopSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"purePoop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60008080556007908155600d6101c09081526c75726c28237261696e626f772960981b6101e05260c09081526102008281526611b3331933193160c91b6102205260e0526102408281526611b3331a9b991960c91b61026052610100526102808281526611b33332b119b160c91b6102a052610120526102c0828152660233463616635360cc1b6102e052610140526103008281526608cc0cd84e598d60ca1b6103205261016052610340828152662336373361623760c81b61036052610180526103c0604052610380918252660233963323762360cc1b6103a0526101a091909152620000f29060099060086200109f565b506040805161032081018252600d6102e082019081526c75726c28237261696e626f772960981b61030083015281528151808301835260048082526311b3333360e11b602083810191909152808401929092528351808501855260078082526611b31a1a19999b60c91b828501528486019190915284518086018652818152662365393165363360c81b81850152606085015284518086018652818152660233963323762360cc1b81850152608085015284518086018652818152662336373361623760c81b8185015260a085015284518086018652818152662333663531623560c81b8185015260c085015284518086018652818152662332313936663360c81b8185015260e0850152845180860186528181526608cc0cd84e598d60ca1b81850152610100850152845180860186528181526608cc0c1898d90d60ca1b8185015261012085015284518086018652818152660466060726c70760cb1b8185015261014085015284518086018652818152660233463616635360cc1b8185015261016085015284518086018652818152662338626333346160c81b8185015261018085015284518086018652818152662363646463333960c81b818501526101a0850152845180860186528181526611b33332b119b160c91b818501526101c085015284518086018652818152662366666331303760c81b818501526101e085015284518086018652818152660236666393830360cc1b81850152610200850152845180860186528181526611b3331a9b991960c91b8185015261022085015284518086018652818152660466e726a6a68760cb1b8185015261024085015284518086018652818152662339653965396560c81b818501526102608501528451808601865290815266119b181bb21c3160c91b8184015261028084015283518085018552818152630233030360e41b818401526102a084015283518085019094528352636e6f6e6560e01b908301526102c0810191909152620003db906011906017620010f6565b506040805161014081018252600d61010082019081526c75726c28237261696e626f772960981b610120830152815281518083018352600780825266119b181bb21c3160c91b60208381019190915280840192909252835180850185528181526611b31a1a19999b60c91b818401528385015283518085018552600481526311b3333360e11b81840152606084015283518085018552818152662338626333346160c81b81840152608084015283518085018552818152662332313936663360c81b8184015260a084015283518085018552818152660236666393830360cc1b8184015260c084015283518085019094528352660466e726a6a68760cb1b9083015260e0810191909152620004f59060289060086200109f565b506040805161014081018252600d61010082019081526c75726c28237261696e626f772960981b610120830152815281518083018352600780825266119b181bb21c3160c91b60208381019190915280840192909252835180850185528181526611b31a1a19999b60c91b818401528385015283518085018552600481526311b3333360e11b81840152606084015283518085018552818152662338626333346160c81b81840152608084015283518085018552818152662332313936663360c81b8184015260a084015283518085018552818152660236666393830360cc1b8184015260c084015283518085019094528352660466e726a6a68760cb1b9083015260e08101919091526200060f9060309060086200109f565b506040805161014081018252600d61010082019081526c75726c28237261696e626f772960981b61012083015281528151808301835260078082526611b31a1a19999b60c91b602083810191909152808401929092528351808501855260048152630233030360e41b818401528385015283518085018552818152662338626333346160c81b81840152606084015283518085018552818152662332313936663360c81b8184015260808401528351808501855281815266119b181bb21c3160c91b8184015260a084015283518085018552818152660236666393830360cc1b8184015260c084015283518085019094528352660466e726a6a68760cb1b9083015260e0810191909152620007299060389060086200109f565b50604080516101408101825260046101008201818152631e13f19160e31b610120840152825282518084018452600381526214995960ea1b60208281019190915280840191909152835180850185526006808252654f72616e676560d01b8284015284860191909152845180860186528181526559656c6c6f7760d01b81840152606085015284518086018652600581526423b932b2b760d91b8184015260808501528451808601865292835263426c756560e01b8383015260a08401929092528351808501855282815265496e6469676f60d01b8183015260c08401528351808501855291825265159a5bdb195d60d21b9082015260e082015262000832919060086200109f565b50604080516101408101825260046101008201818152631e13f19160e31b61012084015282528251808401845260068082526523b7b13634b760d11b60208381019190915280850192909252845180860186528381526350756e6b60e01b818401528486015284518086018652838152635075726560e01b81840152606085015284518086018652908152655a6f6d62696560d01b81830152608084015283518085018552600381526241706560e81b8183015260a08401528351808501855260078152662837b831b7b93760c91b8183015260c08401528351808501909452908352630506f6f760e41b9083015260e0810191909152620009399060489060086200109f565b50604080516101408101825260046101008201818152631e13f19160e31b61012084015282528251808401845281815263f09f91bd60e01b602082810191909152808401919091528351808501855282815263f09f91b960e01b8183015283850152835180850185528281526301e13f2560e71b8183015260608401528351808501855282815263f09fa79f60e01b8183015260808401528351808501855282815263784fd24b60e11b8183015260a084015283518085018552600d81526cf09fa6b9e2808de29982efb88f60981b8183015260c0840152835180850190945290835263f09f92a960e01b9083015260e081019190915262000a409060509060086200109f565b50604051806101000160405280604051806040016040528060048152602001631e13f19160e31b81525081526020016040518060400160405280600c81526020016b042656574726f6f74706f6f760a41b815250815260200160405180604001604052806008815260200167506f6f70686f6c6560c01b8152508152602001604051806040016040528060098152602001680566567616e706f6f760bc1b8152508152602001604051806040016040528060078152602001662837b7b836b0b760c91b81525081526020016040518060400160405280600981526020016804b6f616c61706f6f760bc1b81525081526020016040518060400160405280600881526020016705368616d706f6f760c41b8152508152602001604051806040016040528060078152602001660506f6f706f6f760cc1b815250815250605890600862000b8d9291906200109f565b50604051806101000160405280604051806040016040528060048152602001631e13f19160e31b81525081526020016040518060400160405280600981526020016804c61736572706f6f760bc1b81525081526020016040518060400160405280600981526020016804379636c6f706f6f760bc1b81525081526020016040518060400160405280600a8152602001690466173696f6e706f6f760b41b815250815260200160405180604001604052806008815260200167506f6f70686f6c6560c01b815250815260200160405180604001604052806009815260200168050616e6461706f6f760bc1b81525081526020016040518060400160405280600981526020016804b6f616c61706f6f760bc1b8152508152602001604051806040016040528060078152602001660506f6f706f6f760cc1b815250815250606090600862000cdb9291906200109f565b50604080516101408101825260046101008201908152631e13f19160e31b610120830152815281518083018352600880825267141bdbdc1cda1a5d60c21b6020838101919091528084019290925283518085018552600c81526b0467265657a696e67706f6f760a41b81840152838501528351808501855260098082526805075707079706f6f760bc1b828501526060850191909152845180860186528181526804269746368706f6f760bc1b81850152608085015284518086018652908152680426f726564706f6f760bc1b8184015260a084015283518085018552600681526504e6f706f6f760d41b8184015260c08401528351808501909452600a8452690436865657365706f6f760b41b9184019190915260e082019290925262000e0791606891906200109f565b50604080516080810182526004818301818152631e13f19160e31b606084015282528251808401909352825263f09f92a960e01b60208381019190915281019190915262000e5a9060709060026200113b565b50604080516101408101825260016101008201818152601360fa1b610120840152825282518084018452818152604760f81b6020828101919091528084019190915283518085018552828152602160f91b818301528385015283518085018552828152601560fa1b81830152606084015283518085018552828152605160f81b81830152608084015283518085018552828152604960f81b8183015260a084015283518085018552828152604160f81b8183015260c08401528351808501909452908352600560fc1b9083015260e081019190915262000f3f9060789060086200109f565b5034801562000f4d57600080fd5b50604051806060016040528060278152602001620055686027913960408051808201909152600f81526e3930b4b73137bbb837b7b8173bba3360891b6020820152600a61271062000fa2565b60405180910390fd5b60008211620010045760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000f99565b83516200101990600190602087019062001180565b5082516200102f90600290602086019062001180565b5060a09190915260805250620010479050336200104d565b620012c2565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8260088101928215620010e4579160200282015b82811115620010e45782518051620010d391849160209091019062001180565b5091602001919060010190620010b3565b50620010f29291506200120b565b5090565b8260178101928215620010e4579160200282015b82811115620010e457825180516200112a91849160209091019062001180565b50916020019190600101906200110a565b8260088101928215620010e4579160200282015b82811115620010e457825180516200116f91849160209091019062001180565b50916020019190600101906200114f565b8280546200118e9062001285565b90600052602060002090601f016020900481019282620011b25760008555620011fd565b82601f10620011cd57805160ff1916838001178555620011fd565b82800160010185558215620011fd579182015b82811115620011fd578251825591602001919060010190620011e0565b50620010f29291506200122c565b80821115620010f257600062001222828262001243565b506001016200120b565b5b80821115620010f257600081556001016200122d565b508054620012519062001285565b6000825580601f1062001262575050565b601f0160209004906000526020600020908101906200128291906200122c565b50565b600181811c908216806200129a57607f821691505b60208210811415620012bc57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516142646200130460003960008181610cc50152818161164b015281816116750152612492015260008181610c540152610e3001526142646000f3fe60806040526004361061016a5760003560e01c80636352211e116100d1578063a8170e0e1161008a578063cceec2a311610064578063cceec2a314610435578063d7224ba014610455578063e985e9c51461046b578063f2fde38b146104b457600080fd5b8063a8170e0e146103e2578063b88d4fde146103f5578063c87b56dd1461041557600080fd5b80636352211e1461033a57806370a082311461035a578063715018a61461037a5780638da5cb5b1461038f57806395d89b41146103ad578063a22cb465146103c257600080fd5b806323b872dd1161012357806323b872dd146102665780632a55205a146102865780632f745c59146102c55780633ccfd60b146102e557806342842e0e146102fa5780634f6ccce71461031a57600080fd5b806301ffc9a71461017657806306fdde03146101ab578063081812fc146101cd578063095ea7b3146102055780631454d69c1461022757806318160ddd1461024757600080fd5b3661017157005b600080fd5b34801561018257600080fd5b50610196610191366004612c07565b6104d4565b60405190151581526020015b60405180910390f35b3480156101b757600080fd5b506101c0610541565b6040516101a29190613d17565b3480156101d957600080fd5b506101ed6101e8366004612c3f565b6105d3565b6040516001600160a01b0390911681526020016101a2565b34801561021157600080fd5b50610225610220366004612bde565b610661565b005b34801561023357600080fd5b506101c0610242366004612c3f565b610779565b34801561025357600080fd5b506000545b6040519081526020016101a2565b34801561027257600080fd5b50610225610281366004612a94565b61078c565b34801561029257600080fd5b506102a66102a1366004612c79565b610797565b604080516001600160a01b0390931683526020830191909152016101a2565b3480156102d157600080fd5b506102586102e0366004612bde565b6107bd565b3480156102f157600080fd5b5061022561092b565b34801561030657600080fd5b50610225610315366004612a94565b6109da565b34801561032657600080fd5b50610258610335366004612c3f565b6109f5565b34801561034657600080fd5b506101ed610355366004612c3f565b610a64565b34801561036657600080fd5b50610258610375366004612a41565b610a76565b34801561038657600080fd5b50610225610b07565b34801561039b57600080fd5b506008546001600160a01b03166101ed565b3480156103b957600080fd5b506101c0610b3d565b3480156103ce57600080fd5b506102256103dd366004612ba4565b610b4c565b6102256103f0366004612c3f565b610c11565b34801561040157600080fd5b50610225610410366004612acf565b610d43565b34801561042157600080fd5b506101c0610430366004612c3f565b610d7c565b34801561044157600080fd5b50610225610450366004612c57565b610e04565b34801561046157600080fd5b5061025860075481565b34801561047757600080fd5b50610196610486366004612a62565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156104c057600080fd5b506102256104cf366004612a41565b610ead565b60006001600160e01b031982166380ac58cd60e01b148061050557506001600160e01b03198216635b5e139f60e01b145b8061052057506001600160e01b0319821663780e9d6360e01b145b8061053b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461055090613ea1565b80601f016020809104026020016040519081016040528092919081815260200182805461057c90613ea1565b80156105c95780601f1061059e576101008083540402835291602001916105c9565b820191906000526020600020905b8154815290600101906020018083116105ac57829003601f168201915b5050505050905090565b60006105de82610f45565b6106455760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061066c82610a64565b9050806001600160a01b0316836001600160a01b031614156106db5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161063c565b336001600160a01b03821614806106f757506106f78133610486565b6107695760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161063c565b610774838383610f5a565b505050565b606061053b61078783610fb6565b6110ef565b610774838383611245565b6000803060646107a8856007613e00565b6107b29190613dec565b915091509250929050565b60006107c883610a76565b82106108215760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161063c565b600080549080805b838110156108cb576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561087c57805192505b876001600160a01b0316836001600160a01b031614156108b857868414156108aa5750935061053b92505050565b836108b481613edc565b9450505b50806108c381613edc565b915050610829565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161063c565b6008546001600160a01b031633146109555760405162461bcd60e51b815260040161063c90613d2a565b604051600090339047908381818185875af1925050503d8060008114610997576040519150601f19603f3d011682016040523d82523d6000602084013e61099c565b606091505b50509050806109d75760405162461bcd60e51b81526020600482015260076024820152666e6f207469707360c81b604482015260640161063c565b50565b61077483838360405180602001604052806000815250610d43565b60008082118015610a0857506000548211155b610a605760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161063c565b5090565b6000610a6f826115cb565b5192915050565b60006001600160a01b038216610ae25760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161063c565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b03163314610b315760405162461bcd60e51b815260040161063c90613d2a565b610b3b6000611773565b565b60606002805461055090613ea1565b6001600160a01b038216331415610ba55760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161063c565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002811115610c525760405162461bcd60e51b815260206004820152600d60248201526c0e0dedee040e8dede40daeac6d609b1b604482015260640161063c565b7f0000000000000000000000000000000000000000000000000000000000000000610c7c60005490565b610c869083613dd4565b1115610cc35760405162461bcd60e51b815260206004820152600c60248201526b06e6f206d6f726520706f6f760a41b604482015260640161063c565b7f000000000000000000000000000000000000000000000000000000000000000081610cee33610a76565b610cf89190613dd4565b1115610d395760405162461bcd60e51b815260206004820152601060248201526f0796f75206f776e20706f6f6f6f6f6f760841b604482015260640161063c565b6109d733826117c5565b610d4e848484611245565b610d5a848484846117df565b610d765760405162461bcd60e51b815260040161063c90613d5f565b50505050565b60606000610d8983610fb6565b90506000610dd9610d99856118ed565b610da284611a07565b610db3610dae866110ef565b611b7e565b604051602001610dc59392919061330d565b604051602081830303815290604052611b7e565b905080604051602001610dec91906137da565b60405160208183030381529060405292505050919050565b6008546001600160a01b03163314610e2e5760405162461bcd60e51b815260040161063c90613d2a565b7f0000000000000000000000000000000000000000000000000000000000000000610e5860005490565b610e629084613dd4565b1115610e9f5760405162461bcd60e51b815260206004820152600c60248201526b06e6f206d6f726520706f6f760a41b604482015260640161063c565b610ea981836117c5565b5050565b6008546001600160a01b03163314610ed75760405162461bcd60e51b815260040161063c90613d2a565b6001600160a01b038116610f3c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161063c565b6109d781611773565b6000808211801561053b575050600054101590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915260008260405160200161100c91815260200190565b60408051601f198184030181528282528051602090910120610100830190915291508061103b60ff8416611cf2565b60ff168152602001611053600884901c60ff16611cff565b60ff16815260200161106b601084901c60ff16611d95565b60ff168152602001611083601884901c60ff16611cf2565b60ff16815260200161109b602084901c60ff16611cff565b60ff1681526020016110b3602884901c60ff16611cff565b60ff1681526020016110cb603084901c60ff16611e23565b60ff1681526020016110e3603884901c60ff16611cf2565b60ff1690529392505050565b60606000604051806101200160405280604051806101e001604052806101b88152602001613fd66101b89139815260200161112d8560000151611e3f565b815260200161113f8560200151611e76565b81526020016111518560400151611ead565b81526020016111638560600151611f0a565b81526020016111758560800151611f41565b81526020016111878560a0015161214f565b81526020016111998560c0015161234e565b8152602001604051806040016040528060068152602001651e17b9bb339f60d11b8152508152509050806000600981106111e357634e487b7160e01b600052603260045260246000fd5b60209081029190910151828201516040808501516060860151608087015160a088015160c089015160e08a01516101008b0151965161122e9a96979596949593949293919201612eae565b604051602081830303815290604052915050919050565b6000611250826115cb565b80519091506000906001600160a01b0316336001600160a01b0316148061128757503361127c846105d3565b6001600160a01b0316145b80611299575081516112999033610486565b9050806113035760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161063c565b846001600160a01b031682600001516001600160a01b0316146113775760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161063c565b6001600160a01b0384166113db5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161063c565b6113eb6000848460000151610f5a565b6001600160a01b038516600090815260046020526040812080546001929061141d9084906001600160801b0316613e1f565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261146991859116613db2565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556114f1846001613dd4565b6000818152600360205260409020549091506001600160a01b03166115815761151981610f45565b156115815760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60408051808201909152600080825260208201526115e882610f45565b6116475760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161063c565b60007f000000000000000000000000000000000000000000000000000000000000000083106116a85761169a7f000000000000000000000000000000000000000000000000000000000000000084613e47565b6116a5906001613dd4565b90505b825b818110611712576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156116ff57949350505050565b508061170a81613e8a565b9150506116aa565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161063c565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610ea98282604051806020016040528060008152506123c9565b60006001600160a01b0384163b156118e157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611823903390899088908890600401613ce4565b602060405180830381600087803b15801561183d57600080fd5b505af192505050801561186d575060408051601f3d908101601f1916820190925261186a91810190612c23565b60015b6118c7573d80801561189b576040519150601f19603f3d011682016040523d82523d6000602084013e6118a0565b606091505b5080516118bf5760405162461bcd60e51b815260040161063c90613d5f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118e5565b5060015b949350505050565b6060816119115750506040805180820190915260018152600360fc1b602082015290565b8160005b811561193b578061192581613edc565b91506119349050600a83613dec565b9150611915565b60008167ffffffffffffffff81111561196457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561198e576020820181803683370190505b5090505b84156118e5576119a3600183613e47565b91506119b0600a86613ef7565b6119bb906030613dd4565b60f81b8183815181106119de57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611a00600a86613dec565b9450611992565b60606040826000015160ff1660088110611a3157634e487b7160e01b600052603260045260246000fd5b016048836020015160ff1660088110611a5a57634e487b7160e01b600052603260045260246000fd5b016050846040015160ff1660088110611a8357634e487b7160e01b600052603260045260246000fd5b016058856060015160ff1660088110611aac57634e487b7160e01b600052603260045260246000fd5b016060866080015160ff1660088110611ad557634e487b7160e01b600052603260045260246000fd5b0160688760a0015160ff1660088110611afe57634e487b7160e01b600052603260045260246000fd5b0160708860c0015160ff1660088110611b2757634e487b7160e01b600052603260045260246000fd5b0160788960e0015160ff1660088110611b5057634e487b7160e01b600052603260045260246000fd5b01604051602001611b6898979695949392919061381f565b6040516020818303038152906040529050919050565b805160609080611b9e575050604080516020810190915260008152919050565b60006003611bad836002613dd4565b611bb79190613dec565b611bc2906004613e00565b90506000611bd1826020613dd4565b67ffffffffffffffff811115611bf757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c21576020820181803683370190505b50905060006040518060600160405280604081526020016141ef604091399050600181016020830160005b86811015611cad576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611c4c565b506003860660018114611cc75760028114611cd857611ce4565b613d3d60f01b600119830152611ce4565b603d60f81b6000198301525b505050918152949350505050565b600061053b600883613f0b565b600060088260ff161015611d1557506000919050565b60108260ff161015611d2957506001919050565b60188260ff161015611d3d57506002919050565b60288260ff161015611d5157506003919050565b60408260ff161015611d6557506004919050565b60688260ff161015611d7957506005919050565b60a88260ff161015611d8d57506006919050565b506007919050565b600060028260ff161015611dab57506000919050565b60048260ff161015611dbf57506001919050565b60088260ff161015611dd357506002919050565b60108260ff161015611de757506003919050565b60208260ff161015611dfb57506004919050565b60408260ff161015611e0f57506005919050565b60808260ff161015611d8d57506006919050565b600060338260ff1610611e3757600161053b565b600092915050565b606060098260ff1660088110611e6557634e487b7160e01b600052603260045260246000fd5b01604051602001611b6891906132b7565b606060288260ff1660088110611e9c57634e487b7160e01b600052603260045260246000fd5b01604051602001611b689190613c23565b606060308260ff1660088110611ed357634e487b7160e01b600052603260045260246000fd5b0160308360ff1660088110611ef857634e487b7160e01b600052603260045260246000fd5b01604051602001611b6892919061303d565b606060388260ff1660088110611f3057634e487b7160e01b600052603260045260246000fd5b01604051602001611b68919061371f565b606060ff8216611f9157611f5b60156020600860006126c2565b611f6b60286020600860006126c2565b611f7f601c601e60016005600260006126db565b604051602001611b6893929190612da9565b8160ff1660011415611fd457611fae60166020600280600e6126f8565b611fbf60266020600280600e6126f8565b611f7f6006601f60016030600280600e612796565b8160ff1660021415611fff576040518060a001604052806061815260200161418e6061913992915050565b8160ff16600314156120475761201f600d601a60036010600a60086126db565b6120336020601a60036010600a60086126db565b611f7f601c601d60016005600260006126db565b8160ff16600414156120ae5761206360116020600260146126c2565b61207360216020600260146126c2565b612087600d601c6001600e600260156126db565b61209b601d601c6001600e600260156126db565b604051602001611b689493929190612dec565b8160ff16600514156120fe576120ca60156020600860156126c2565b6120da60276020600860156126c2565b6120ec60166020600460026014612850565b61209b60276020600460026014612850565b8160ff166006141561213b5761211a60166020600260146126c2565b61212a60286020600260146126c2565b604051602001611b68929190612d7a565b612145600161286b565b61212a600061286b565b606060ff82166121995761053b6040518060400160405280601981526020017f6d32312034336131302032342031302030203020313920317a0000000000000081525060006128be565b8160ff16600114156121e55761053b6040518060400160405280601781526020017f6d3232203430613130203820302030203020323020347a00000000000000000081525060026128be565b8160ff1660021415612261576122056014602c60036014600660026126db565b6122176018602c60186032601561290e565b612229601c602c601c6032601561290e565b61223b6020602c60206032601561290e565b61224d6024602c60246032601561290e565b604051602001611b68959493929190612e43565b8160ff16600314156122a65761053b6040518060400160405280601681526020017506d333620343561313020362030203020312d313020360541b81525060166128be565b8160ff16600414156122c65761053b601e602e6005600660026015612979565b8160ff166005141561230b5761053b604051806040016040528060168152602001756d32382034356131322036203020302031203133203160501b81525060166128be565b8160ff166006141561233a5761053b604051806080016040528060508152602001613f866050913960026128be565b505060408051602081019091526000815290565b606060ff82161561236e576040518060200160405280600081525061053b565b604051602001611b68907f3c7465787420783d22312220793d2231352220666f6e742d73697a653d223136815261111f60f11b6020820152631e13f19160e31b6022820152661e17ba32bc3a1f60c91b6026820152602d0190565b600080546123d8906001613dd4565b90506001600160a01b03841661243a5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161063c565b61244381610f45565b156124905760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161063c565b7f000000000000000000000000000000000000000000000000000000000000000083111561250b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161063c565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612567908790613db2565b6001600160801b031681526020018583602001516125859190613db2565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156126a55760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461266960008884886117df565b6126855760405162461bcd60e51b815260040161063c90613d5f565b8161268f81613edc565b925050808061269d90613edc565b91505061261c565b50846000808282546126b79190613dd4565b909155506115c39050565b60606126d28585858560156126f8565b95945050505050565b60606126ed8787878787876015612796565b979650505050505050565b60606127068660ff166118ed565b6127128660ff166118ed565b61271e8660ff166118ed565b60118660ff166017811061274257634e487b7160e01b600052603260045260246000fd5b0160118660ff166017811061276757634e487b7160e01b600052603260045260246000fd5b0160405160200161277c959493929190612f6e565b604051602081830303815290604052905095945050505050565b60606127a48860ff166118ed565b6127b08860ff166118ed565b6127bc8860ff166118ed565b6127c88860ff166118ed565b6127d48860ff166118ed565b60118860ff16601781106127f857634e487b7160e01b600052603260045260246000fd5b0160118860ff166017811061281d57634e487b7160e01b600052603260045260246000fd5b016040516020016128349796959493929190613b00565b6040516020818303038152906040529050979650505050505050565b606061286186868686866016612979565b9695505050505050565b606060006128898361287e576027612881565b60155b60ff166118ed565b905060006128a38461289c576026612881565b60166118ed565b604051909150610dec908390601290849081906020016135d7565b60608260118360ff16601781106128e557634e487b7160e01b600052603260045260246000fd5b016040516020016128f792919061344d565b604051602081830303815290604052905092915050565b606061291c8660ff166118ed565b6129288660ff166118ed565b6129348660ff166118ed565b6129408660ff166118ed565b60118660ff166017811061296457634e487b7160e01b600052603260045260246000fd5b0160405160200161277c959493929190613a29565b60606129878760ff166118ed565b6129938760ff166118ed565b61299f8760ff166118ed565b6129ab8760ff166118ed565b60118760ff16601781106129cf57634e487b7160e01b600052603260045260246000fd5b0160118760ff16601781106129f457634e487b7160e01b600052603260045260246000fd5b01604051602001612a0a969594939291906134d9565b60405160208183030381529060405290509695505050505050565b80356001600160a01b0381168114612a3c57600080fd5b919050565b600060208284031215612a52578081fd5b612a5b82612a25565b9392505050565b60008060408385031215612a74578081fd5b612a7d83612a25565b9150612a8b60208401612a25565b90509250929050565b600080600060608486031215612aa8578081fd5b612ab184612a25565b9250612abf60208501612a25565b9150604084013590509250925092565b60008060008060808587031215612ae4578081fd5b612aed85612a25565b9350612afb60208601612a25565b925060408501359150606085013567ffffffffffffffff80821115612b1e578283fd5b818701915087601f830112612b31578283fd5b813581811115612b4357612b43613f59565b604051601f8201601f19908116603f01168101908382118183101715612b6b57612b6b613f59565b816040528281528a6020848701011115612b83578586fd5b82602086016020830137918201602001949094529598949750929550505050565b60008060408385031215612bb6578182fd5b612bbf83612a25565b915060208301358015158114612bd3578182fd5b809150509250929050565b60008060408385031215612bf0578182fd5b612bf983612a25565b946020939093013593505050565b600060208284031215612c18578081fd5b8135612a5b81613f6f565b600060208284031215612c34578081fd5b8151612a5b81613f6f565b600060208284031215612c50578081fd5b5035919050565b60008060408385031215612c69578182fd5b82359150612a8b60208401612a25565b60008060408385031215612c8b578182fd5b50508035926020909101359150565b60008151808452612cb2816020860160208601613e5e565b601f01601f19169290920160200192915050565b60008151612cd8818560208601613e5e565b9290920192915050565b8054600090600181811c9080831680612cfc57607f831692505b6020808410821415612d1c57634e487b7160e01b86526022600452602486fd5b818015612d305760018114612d4157612d6e565b60ff19861689528489019650612d6e565b60008881526020902060005b86811015612d665781548b820152908501908301612d4d565b505084890196505b50505050505092915050565b60008351612d8c818460208801613e5e565b835190830190612da0818360208801613e5e565b01949350505050565b60008451612dbb818460208901613e5e565b845190830190612dcf818360208901613e5e565b8451910190612de2818360208801613e5e565b0195945050505050565b60008551612dfe818460208a01613e5e565b855190830190612e12818360208a01613e5e565b8551910190612e25818360208901613e5e565b8451910190612e38818360208801613e5e565b019695505050505050565b60008651612e55818460208b01613e5e565b865190830190612e69818360208b01613e5e565b8651910190612e7c818360208a01613e5e565b8551910190612e8f818360208901613e5e565b8451910190612ea2818360208801613e5e565b01979650505050505050565b60008a51612ec0818460208f01613e5e565b8a51612ed28183860160208f01613e5e565b8a519184010190612ee7818360208e01613e5e565b8951612ef98183850160208e01613e5e565b8951929091010190612f0f818360208c01613e5e565b8751612f218183850160208c01613e5e565b8751929091010190612f37818360208a01613e5e565b8551910190612f4a818360208901613e5e565b8451612f5c8183850160208901613e5e565b9101019b9a5050505050505050505050565b6b1e31b4b931b6329031bc1e9160a11b81528551600090612f9681600c850160208b01613e5e565b65111031bc9e9160d11b600c918401918201528651612fbc816012840160208b01613e5e565b641110391e9160d91b601292909101918201528551612fe2816017840160208a01613e5e565b6711103334b6361e9160c11b60179290910191820152613005601f820186612ce2565b69111039ba3937b5b29e9160b11b81529050613024600a820185612ce2565b631110179f60e11b815260040198975050505050505050565b7f3c7061746820643d224d353520333561313320313320302030312d312e37342081527f362e3333632d322e353920342e34392d382e333420382e38372d31392031312e60208201527f39316c2d322e33392e363441313235203132352030203031392035376138203860408201527f20302030312d382d3863302d3320312e352d352e323520342e352d376131322060608201527f31322030203031332d312e31352037302037302030203031392e37312d312e3560808201527f346c372d2e38366136312e36382036312e36382030203030382e31392d312e3760a08201527f386c31322e33372d372e3032413334203334203020303034382032377337203260c08201526c101b901c3d11103334b6361e9160991b60e0820152600061316960ed830185612ce2565b7f22207374726f6b653d2223303030222f3e3c7061746820643d224d343820323781527f61333420333420302030312d322e3320322e36356c2d31322e333720372e303260208201527f6136312e36382036312e363820302030312d382e313920312e37386c2d372e3060408201527f2e3836632d332e322e322d362e352e382d392e373120312e353441382038203060608201527f2030313620333563302d3520332e34332d3820392e31362d392e332e36362d2e60808201527f313720312e33352d2e333120322e30372d2e34346c352e39312d2e383843323960a08201527f2e39382032332e322033362e352032302e39392033392031366331302030203960c082015270101898901c901898bd11103334b6361e9160791b60e08201526126d261329a60f1830186612ce2565b70111039ba3937b5b29e911198181811179f60791b815260110190565b7f3c726563742077696474683d223130302522206865696768743d223130302522815266103334b6361e9160c91b602082015260006132f96027830184612ce2565b631110179f60e11b81526004019392505050565b7f7b226e616d65223a20225261696e626f7720506f6f7020230000000000000000815260008451613345816018850160208901613e5e565b7f222c20226465736372697074696f6e223a20225261696e626f77506f6f7020696018918401918201527f73206e6f74206a7573742061207069656365206f6620736869742c206275742060388201527f616c736f2061207261696e626f7720706f6f7020f09f8c88f09f92a92e20220060588201526d161130ba3a3934b13aba32b9911d60911b607782015284516133e5816085840160208901613e5e565b7f2c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160859290910191820152641cd94d8d0b60da1b60a582015283516134318160aa840160208801613e5e565b61227d60f01b60aa929091019182015260ac0195945050505050565b681e3830ba3410321e9160b91b81528251600090613472816009850160208801613e5e565b7f22207374796c653d227374726f6b652d6c696e656361703a726f756e643b7374600991840191820152713937b5b29d119818181d91103334b6361e9160711b60298201526134c4603b820185612ce2565b6211179f60e91b815260030195945050505050565b6c1e32b63634b839b29031bc1e9160991b8152865160009061350281600d850160208c01613e5e565b65111031bc9e9160d11b600d918401918201528751613528816013840160208c01613e5e565b651110393c1e9160d11b60139290910191820152865161354f816019840160208b01613e5e565b651110393c9e9160d11b60199290910191820152855161357681601f840160208a01613e5e565b6711103334b6361e9160c11b601f92909101918201526135996027820186612ce2565b69111039ba3937b5b29e9160b11b815290506135ca6135bb600a830186612ce2565b6211179f60e91b815260030190565b9998505050505050505050565b6c1e32b63634b839b29031bc1e9160991b8152845160009061360081600d850160208a01613e5e565b7f222063793d223332222072783d2237222072793d2238222066696c6c3d220000600d91840191820152613637602b820187612ce2565b90507f22207374726f6b653d2223303030222f3e3c656c6c697073652063783d2200008152845161366f81601e840160208901613e5e565b7f222063793d223332222066696c6c3d2223303532653433222072783d22322e35601e92909101918201527f222072793d22332e3522202f3e3c656c6c697073652063783d22000000000000603e82015283516136d3816058840160208801613e5e565b7f222063793d223332222066696c6c3d2223363037643862222072783d22312220605892909101918201526a393c9e9118971b1110179f60a91b60788201526083019695505050505050565b7f3c7061746820643d224d35392034396138203820302030312d3820384839613181527f323520313235203020303032322e38332d332e31326c322e33392d2e3634633160208201527f302e372d332e30342031362e34352d372e34322031392d31312e39314138203860408201527210181018189a9c901a1cbd11103334b6361e9160691b606082015260006137b96073830184612ce2565b70111039ba3937b5b29e911198181811179f60791b81526011019392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161381281601d850160208701613e5e565b91909101601d0192915050565b7f5b7b2274726169745f74797065223a224261636b67726f756e64222c2276616c815260006020643ab2911d1160d91b81840152613860602584018c612ce2565b7f227d2c7b2274726169745f74797065223a2248616972222c2276616c7565223a8152601160f91b82820181905261389b602183018d612ce2565b91507f227d2c7b2274726169745f74797065223a2248656164222c2276616c7565223a825280838301526138d2602183018c612ce2565b7f227d2c7b2274726169745f74797065223a22426f74746f6d222c2276616c7565815262111d1160e91b84820152915061390f602383018b612ce2565b91507f227d2c7b2274726169745f74797065223a2245796573222c2276616c7565223a82528083830152506139476021820189612ce2565b7f227d2c7b2274726169745f74797065223a224d6f757468222c2276616c7565228152611d1160f11b838201529050613a19613a0a613a046139d16139cb613992602287018d612ce2565b7f227d2c7b2274726169745f74797065223a2247656e65726174696f6e222c227681526630b63ab2911d1160c91b602082015260270190565b8a612ce2565b7f227d2c7b2274726169745f74797065223a2253686974222c2276616c7565223a8152601160f91b602082015260210190565b87612ce2565b62227d5d60e81b815260030190565b9c9b505050505050505050505050565b691e3634b732903c189e9160b11b81528551600090613a4f81600a850160208b01613e5e565b6511103c989e9160d11b600a918401918201528651613a75816010840160208b01613e5e565b6511103c191e9160d11b601092909101918201528551613a9c816016840160208a01613e5e565b6511103c991e9160d11b601692909101918201528451613ac381601c840160208901613e5e565b69111039ba3937b5b29e9160b11b601c9290910191820152613ae86026820185612ce2565b6211179f60e91b815260030198975050505050505050565b681e3932b1ba103c1e9160b91b81528751600090613b25816009850160208d01613e5e565b6411103c9e9160d91b6009918401918201528851613b4a81600e840160208d01613e5e565b651110393c1e9160d11b600e92909101918201528751613b71816014840160208c01613e5e565b6811103bb4b23a341e9160b91b601492909101918201528651613b9b81601d840160208b01613e5e565b6911103432b4b3b43a1e9160b11b601d9290910191820152613c15613c05613bff613be9613be3613bcf602787018c612cc6565b6711103334b6361e9160c11b815260080190565b89612ce2565b69111039ba3937b5b29e9160b11b8152600a0190565b86612ce2565b6311179f1160e11b815260040190565b9a9950505050505050505050565b7f3c7061746820643d224d3339203136632d322e3520342e39392d392e3032203781527f2e322d31352e383620382e33386c2d352e39312e3838632d2e37322e31332d3160208201527f2e34312e32372d322e30372e343443392e36322031362e35362031362e33362060408201527f31312e3837203234203963362e32382d322e333620322d3820322d382039203060608201527310189b101c90189990189abd11103334b6361e9160611b608082015260006137b96094830184612ce2565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061286190830184612c9a565b602081526000612a5b6020830184612c9a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b03808316818516808303821115612da057612da0613f2d565b60008219821115613de757613de7613f2d565b500190565b600082613dfb57613dfb613f43565b500490565b6000816000190483118215151615613e1a57613e1a613f2d565b500290565b60006001600160801b0383811690831681811015613e3f57613e3f613f2d565b039392505050565b600082821015613e5957613e59613f2d565b500390565b60005b83811015613e79578181015183820152602001613e61565b83811115610d765750506000910152565b600081613e9957613e99613f2d565b506000190190565b600181811c90821680613eb557607f821691505b60208210811415613ed657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613ef057613ef0613f2d565b5060010190565b600082613f0657613f06613f43565b500690565b600060ff831680613f1e57613f1e613f43565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146109d757600080fdfe4d33302035346337203020392d352031302d396131203120302030302d312d3120323620323620302030312d313720302031203120302030302d3120314332302034382032322035342033302035347a3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076696577426f783d22302030203630203630223e3c646566733e3c6c696e6561724772616469656e742069643d227261696e626f77222078313d223025222079313d223025222078323d223025222079323d2231303025223e3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2223666632663262222f3e3c73746f70206f66667365743d22313725222073746f702d636f6c6f723d2223666635373232222f3e3c73746f70206f66667365743d22333325222073746f702d636f6c6f723d2223666665623362222f3e3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2223346361663530222f3e3c73746f70206f66667365743d22363625222073746f702d636f6c6f723d2223303361396634222f3e3c73746f70206f66667365743d22383325222073746f702d636f6c6f723d2223363733616237222f3e3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d2223396332376230222f3e3c2f6c696e6561724772616469656e743e3c2f646566733e3c7265637420783d2231342220793d223238222072783d2234222077696474683d22333322206865696768743d223822207374726f6b652d77696474683d2233222066696c6c3d222330336139663422207374726f6b653d222330303022202f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220ee0e2fef1cf07355e2661d697a4ea072f754d81e0de072562dbc6bb1c2086d9e64736f6c634300080400335261696e626f77506f6f70202d2066726f6d207368697420746f207261696e626f7720706f6f70

Deployed Bytecode

0x60806040526004361061016a5760003560e01c80636352211e116100d1578063a8170e0e1161008a578063cceec2a311610064578063cceec2a314610435578063d7224ba014610455578063e985e9c51461046b578063f2fde38b146104b457600080fd5b8063a8170e0e146103e2578063b88d4fde146103f5578063c87b56dd1461041557600080fd5b80636352211e1461033a57806370a082311461035a578063715018a61461037a5780638da5cb5b1461038f57806395d89b41146103ad578063a22cb465146103c257600080fd5b806323b872dd1161012357806323b872dd146102665780632a55205a146102865780632f745c59146102c55780633ccfd60b146102e557806342842e0e146102fa5780634f6ccce71461031a57600080fd5b806301ffc9a71461017657806306fdde03146101ab578063081812fc146101cd578063095ea7b3146102055780631454d69c1461022757806318160ddd1461024757600080fd5b3661017157005b600080fd5b34801561018257600080fd5b50610196610191366004612c07565b6104d4565b60405190151581526020015b60405180910390f35b3480156101b757600080fd5b506101c0610541565b6040516101a29190613d17565b3480156101d957600080fd5b506101ed6101e8366004612c3f565b6105d3565b6040516001600160a01b0390911681526020016101a2565b34801561021157600080fd5b50610225610220366004612bde565b610661565b005b34801561023357600080fd5b506101c0610242366004612c3f565b610779565b34801561025357600080fd5b506000545b6040519081526020016101a2565b34801561027257600080fd5b50610225610281366004612a94565b61078c565b34801561029257600080fd5b506102a66102a1366004612c79565b610797565b604080516001600160a01b0390931683526020830191909152016101a2565b3480156102d157600080fd5b506102586102e0366004612bde565b6107bd565b3480156102f157600080fd5b5061022561092b565b34801561030657600080fd5b50610225610315366004612a94565b6109da565b34801561032657600080fd5b50610258610335366004612c3f565b6109f5565b34801561034657600080fd5b506101ed610355366004612c3f565b610a64565b34801561036657600080fd5b50610258610375366004612a41565b610a76565b34801561038657600080fd5b50610225610b07565b34801561039b57600080fd5b506008546001600160a01b03166101ed565b3480156103b957600080fd5b506101c0610b3d565b3480156103ce57600080fd5b506102256103dd366004612ba4565b610b4c565b6102256103f0366004612c3f565b610c11565b34801561040157600080fd5b50610225610410366004612acf565b610d43565b34801561042157600080fd5b506101c0610430366004612c3f565b610d7c565b34801561044157600080fd5b50610225610450366004612c57565b610e04565b34801561046157600080fd5b5061025860075481565b34801561047757600080fd5b50610196610486366004612a62565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156104c057600080fd5b506102256104cf366004612a41565b610ead565b60006001600160e01b031982166380ac58cd60e01b148061050557506001600160e01b03198216635b5e139f60e01b145b8061052057506001600160e01b0319821663780e9d6360e01b145b8061053b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461055090613ea1565b80601f016020809104026020016040519081016040528092919081815260200182805461057c90613ea1565b80156105c95780601f1061059e576101008083540402835291602001916105c9565b820191906000526020600020905b8154815290600101906020018083116105ac57829003601f168201915b5050505050905090565b60006105de82610f45565b6106455760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061066c82610a64565b9050806001600160a01b0316836001600160a01b031614156106db5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b606482015260840161063c565b336001600160a01b03821614806106f757506106f78133610486565b6107695760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161063c565b610774838383610f5a565b505050565b606061053b61078783610fb6565b6110ef565b610774838383611245565b6000803060646107a8856007613e00565b6107b29190613dec565b915091509250929050565b60006107c883610a76565b82106108215760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161063c565b600080549080805b838110156108cb576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561087c57805192505b876001600160a01b0316836001600160a01b031614156108b857868414156108aa5750935061053b92505050565b836108b481613edc565b9450505b50806108c381613edc565b915050610829565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b606482015260840161063c565b6008546001600160a01b031633146109555760405162461bcd60e51b815260040161063c90613d2a565b604051600090339047908381818185875af1925050503d8060008114610997576040519150601f19603f3d011682016040523d82523d6000602084013e61099c565b606091505b50509050806109d75760405162461bcd60e51b81526020600482015260076024820152666e6f207469707360c81b604482015260640161063c565b50565b61077483838360405180602001604052806000815250610d43565b60008082118015610a0857506000548211155b610a605760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b606482015260840161063c565b5090565b6000610a6f826115cb565b5192915050565b60006001600160a01b038216610ae25760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b606482015260840161063c565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b03163314610b315760405162461bcd60e51b815260040161063c90613d2a565b610b3b6000611773565b565b60606002805461055090613ea1565b6001600160a01b038216331415610ba55760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161063c565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002811115610c525760405162461bcd60e51b815260206004820152600d60248201526c0e0dedee040e8dede40daeac6d609b1b604482015260640161063c565b7f0000000000000000000000000000000000000000000000000000000000002710610c7c60005490565b610c869083613dd4565b1115610cc35760405162461bcd60e51b815260206004820152600c60248201526b06e6f206d6f726520706f6f760a41b604482015260640161063c565b7f000000000000000000000000000000000000000000000000000000000000000a81610cee33610a76565b610cf89190613dd4565b1115610d395760405162461bcd60e51b815260206004820152601060248201526f0796f75206f776e20706f6f6f6f6f6f760841b604482015260640161063c565b6109d733826117c5565b610d4e848484611245565b610d5a848484846117df565b610d765760405162461bcd60e51b815260040161063c90613d5f565b50505050565b60606000610d8983610fb6565b90506000610dd9610d99856118ed565b610da284611a07565b610db3610dae866110ef565b611b7e565b604051602001610dc59392919061330d565b604051602081830303815290604052611b7e565b905080604051602001610dec91906137da565b60405160208183030381529060405292505050919050565b6008546001600160a01b03163314610e2e5760405162461bcd60e51b815260040161063c90613d2a565b7f0000000000000000000000000000000000000000000000000000000000002710610e5860005490565b610e629084613dd4565b1115610e9f5760405162461bcd60e51b815260206004820152600c60248201526b06e6f206d6f726520706f6f760a41b604482015260640161063c565b610ea981836117c5565b5050565b6008546001600160a01b03163314610ed75760405162461bcd60e51b815260040161063c90613d2a565b6001600160a01b038116610f3c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161063c565b6109d781611773565b6000808211801561053b575050600054101590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915260008260405160200161100c91815260200190565b60408051601f198184030181528282528051602090910120610100830190915291508061103b60ff8416611cf2565b60ff168152602001611053600884901c60ff16611cff565b60ff16815260200161106b601084901c60ff16611d95565b60ff168152602001611083601884901c60ff16611cf2565b60ff16815260200161109b602084901c60ff16611cff565b60ff1681526020016110b3602884901c60ff16611cff565b60ff1681526020016110cb603084901c60ff16611e23565b60ff1681526020016110e3603884901c60ff16611cf2565b60ff1690529392505050565b60606000604051806101200160405280604051806101e001604052806101b88152602001613fd66101b89139815260200161112d8560000151611e3f565b815260200161113f8560200151611e76565b81526020016111518560400151611ead565b81526020016111638560600151611f0a565b81526020016111758560800151611f41565b81526020016111878560a0015161214f565b81526020016111998560c0015161234e565b8152602001604051806040016040528060068152602001651e17b9bb339f60d11b8152508152509050806000600981106111e357634e487b7160e01b600052603260045260246000fd5b60209081029190910151828201516040808501516060860151608087015160a088015160c089015160e08a01516101008b0151965161122e9a96979596949593949293919201612eae565b604051602081830303815290604052915050919050565b6000611250826115cb565b80519091506000906001600160a01b0316336001600160a01b0316148061128757503361127c846105d3565b6001600160a01b0316145b80611299575081516112999033610486565b9050806113035760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161063c565b846001600160a01b031682600001516001600160a01b0316146113775760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161063c565b6001600160a01b0384166113db5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161063c565b6113eb6000848460000151610f5a565b6001600160a01b038516600090815260046020526040812080546001929061141d9084906001600160801b0316613e1f565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261146991859116613db2565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556114f1846001613dd4565b6000818152600360205260409020549091506001600160a01b03166115815761151981610f45565b156115815760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60408051808201909152600080825260208201526115e882610f45565b6116475760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b606482015260840161063c565b60007f000000000000000000000000000000000000000000000000000000000000000a83106116a85761169a7f000000000000000000000000000000000000000000000000000000000000000a84613e47565b6116a5906001613dd4565b90505b825b818110611712576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156116ff57949350505050565b508061170a81613e8a565b9150506116aa565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b606482015260840161063c565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610ea98282604051806020016040528060008152506123c9565b60006001600160a01b0384163b156118e157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611823903390899088908890600401613ce4565b602060405180830381600087803b15801561183d57600080fd5b505af192505050801561186d575060408051601f3d908101601f1916820190925261186a91810190612c23565b60015b6118c7573d80801561189b576040519150601f19603f3d011682016040523d82523d6000602084013e6118a0565b606091505b5080516118bf5760405162461bcd60e51b815260040161063c90613d5f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118e5565b5060015b949350505050565b6060816119115750506040805180820190915260018152600360fc1b602082015290565b8160005b811561193b578061192581613edc565b91506119349050600a83613dec565b9150611915565b60008167ffffffffffffffff81111561196457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561198e576020820181803683370190505b5090505b84156118e5576119a3600183613e47565b91506119b0600a86613ef7565b6119bb906030613dd4565b60f81b8183815181106119de57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611a00600a86613dec565b9450611992565b60606040826000015160ff1660088110611a3157634e487b7160e01b600052603260045260246000fd5b016048836020015160ff1660088110611a5a57634e487b7160e01b600052603260045260246000fd5b016050846040015160ff1660088110611a8357634e487b7160e01b600052603260045260246000fd5b016058856060015160ff1660088110611aac57634e487b7160e01b600052603260045260246000fd5b016060866080015160ff1660088110611ad557634e487b7160e01b600052603260045260246000fd5b0160688760a0015160ff1660088110611afe57634e487b7160e01b600052603260045260246000fd5b0160708860c0015160ff1660088110611b2757634e487b7160e01b600052603260045260246000fd5b0160788960e0015160ff1660088110611b5057634e487b7160e01b600052603260045260246000fd5b01604051602001611b6898979695949392919061381f565b6040516020818303038152906040529050919050565b805160609080611b9e575050604080516020810190915260008152919050565b60006003611bad836002613dd4565b611bb79190613dec565b611bc2906004613e00565b90506000611bd1826020613dd4565b67ffffffffffffffff811115611bf757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c21576020820181803683370190505b50905060006040518060600160405280604081526020016141ef604091399050600181016020830160005b86811015611cad576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611c4c565b506003860660018114611cc75760028114611cd857611ce4565b613d3d60f01b600119830152611ce4565b603d60f81b6000198301525b505050918152949350505050565b600061053b600883613f0b565b600060088260ff161015611d1557506000919050565b60108260ff161015611d2957506001919050565b60188260ff161015611d3d57506002919050565b60288260ff161015611d5157506003919050565b60408260ff161015611d6557506004919050565b60688260ff161015611d7957506005919050565b60a88260ff161015611d8d57506006919050565b506007919050565b600060028260ff161015611dab57506000919050565b60048260ff161015611dbf57506001919050565b60088260ff161015611dd357506002919050565b60108260ff161015611de757506003919050565b60208260ff161015611dfb57506004919050565b60408260ff161015611e0f57506005919050565b60808260ff161015611d8d57506006919050565b600060338260ff1610611e3757600161053b565b600092915050565b606060098260ff1660088110611e6557634e487b7160e01b600052603260045260246000fd5b01604051602001611b6891906132b7565b606060288260ff1660088110611e9c57634e487b7160e01b600052603260045260246000fd5b01604051602001611b689190613c23565b606060308260ff1660088110611ed357634e487b7160e01b600052603260045260246000fd5b0160308360ff1660088110611ef857634e487b7160e01b600052603260045260246000fd5b01604051602001611b6892919061303d565b606060388260ff1660088110611f3057634e487b7160e01b600052603260045260246000fd5b01604051602001611b68919061371f565b606060ff8216611f9157611f5b60156020600860006126c2565b611f6b60286020600860006126c2565b611f7f601c601e60016005600260006126db565b604051602001611b6893929190612da9565b8160ff1660011415611fd457611fae60166020600280600e6126f8565b611fbf60266020600280600e6126f8565b611f7f6006601f60016030600280600e612796565b8160ff1660021415611fff576040518060a001604052806061815260200161418e6061913992915050565b8160ff16600314156120475761201f600d601a60036010600a60086126db565b6120336020601a60036010600a60086126db565b611f7f601c601d60016005600260006126db565b8160ff16600414156120ae5761206360116020600260146126c2565b61207360216020600260146126c2565b612087600d601c6001600e600260156126db565b61209b601d601c6001600e600260156126db565b604051602001611b689493929190612dec565b8160ff16600514156120fe576120ca60156020600860156126c2565b6120da60276020600860156126c2565b6120ec60166020600460026014612850565b61209b60276020600460026014612850565b8160ff166006141561213b5761211a60166020600260146126c2565b61212a60286020600260146126c2565b604051602001611b68929190612d7a565b612145600161286b565b61212a600061286b565b606060ff82166121995761053b6040518060400160405280601981526020017f6d32312034336131302032342031302030203020313920317a0000000000000081525060006128be565b8160ff16600114156121e55761053b6040518060400160405280601781526020017f6d3232203430613130203820302030203020323020347a00000000000000000081525060026128be565b8160ff1660021415612261576122056014602c60036014600660026126db565b6122176018602c60186032601561290e565b612229601c602c601c6032601561290e565b61223b6020602c60206032601561290e565b61224d6024602c60246032601561290e565b604051602001611b68959493929190612e43565b8160ff16600314156122a65761053b6040518060400160405280601681526020017506d333620343561313020362030203020312d313020360541b81525060166128be565b8160ff16600414156122c65761053b601e602e6005600660026015612979565b8160ff166005141561230b5761053b604051806040016040528060168152602001756d32382034356131322036203020302031203133203160501b81525060166128be565b8160ff166006141561233a5761053b604051806080016040528060508152602001613f866050913960026128be565b505060408051602081019091526000815290565b606060ff82161561236e576040518060200160405280600081525061053b565b604051602001611b68907f3c7465787420783d22312220793d2231352220666f6e742d73697a653d223136815261111f60f11b6020820152631e13f19160e31b6022820152661e17ba32bc3a1f60c91b6026820152602d0190565b600080546123d8906001613dd4565b90506001600160a01b03841661243a5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161063c565b61244381610f45565b156124905760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161063c565b7f000000000000000000000000000000000000000000000000000000000000000a83111561250b5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b606482015260840161063c565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612567908790613db2565b6001600160801b031681526020018583602001516125859190613db2565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156126a55760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461266960008884886117df565b6126855760405162461bcd60e51b815260040161063c90613d5f565b8161268f81613edc565b925050808061269d90613edc565b91505061261c565b50846000808282546126b79190613dd4565b909155506115c39050565b60606126d28585858560156126f8565b95945050505050565b60606126ed8787878787876015612796565b979650505050505050565b60606127068660ff166118ed565b6127128660ff166118ed565b61271e8660ff166118ed565b60118660ff166017811061274257634e487b7160e01b600052603260045260246000fd5b0160118660ff166017811061276757634e487b7160e01b600052603260045260246000fd5b0160405160200161277c959493929190612f6e565b604051602081830303815290604052905095945050505050565b60606127a48860ff166118ed565b6127b08860ff166118ed565b6127bc8860ff166118ed565b6127c88860ff166118ed565b6127d48860ff166118ed565b60118860ff16601781106127f857634e487b7160e01b600052603260045260246000fd5b0160118860ff166017811061281d57634e487b7160e01b600052603260045260246000fd5b016040516020016128349796959493929190613b00565b6040516020818303038152906040529050979650505050505050565b606061286186868686866016612979565b9695505050505050565b606060006128898361287e576027612881565b60155b60ff166118ed565b905060006128a38461289c576026612881565b60166118ed565b604051909150610dec908390601290849081906020016135d7565b60608260118360ff16601781106128e557634e487b7160e01b600052603260045260246000fd5b016040516020016128f792919061344d565b604051602081830303815290604052905092915050565b606061291c8660ff166118ed565b6129288660ff166118ed565b6129348660ff166118ed565b6129408660ff166118ed565b60118660ff166017811061296457634e487b7160e01b600052603260045260246000fd5b0160405160200161277c959493929190613a29565b60606129878760ff166118ed565b6129938760ff166118ed565b61299f8760ff166118ed565b6129ab8760ff166118ed565b60118760ff16601781106129cf57634e487b7160e01b600052603260045260246000fd5b0160118760ff16601781106129f457634e487b7160e01b600052603260045260246000fd5b01604051602001612a0a969594939291906134d9565b60405160208183030381529060405290509695505050505050565b80356001600160a01b0381168114612a3c57600080fd5b919050565b600060208284031215612a52578081fd5b612a5b82612a25565b9392505050565b60008060408385031215612a74578081fd5b612a7d83612a25565b9150612a8b60208401612a25565b90509250929050565b600080600060608486031215612aa8578081fd5b612ab184612a25565b9250612abf60208501612a25565b9150604084013590509250925092565b60008060008060808587031215612ae4578081fd5b612aed85612a25565b9350612afb60208601612a25565b925060408501359150606085013567ffffffffffffffff80821115612b1e578283fd5b818701915087601f830112612b31578283fd5b813581811115612b4357612b43613f59565b604051601f8201601f19908116603f01168101908382118183101715612b6b57612b6b613f59565b816040528281528a6020848701011115612b83578586fd5b82602086016020830137918201602001949094529598949750929550505050565b60008060408385031215612bb6578182fd5b612bbf83612a25565b915060208301358015158114612bd3578182fd5b809150509250929050565b60008060408385031215612bf0578182fd5b612bf983612a25565b946020939093013593505050565b600060208284031215612c18578081fd5b8135612a5b81613f6f565b600060208284031215612c34578081fd5b8151612a5b81613f6f565b600060208284031215612c50578081fd5b5035919050565b60008060408385031215612c69578182fd5b82359150612a8b60208401612a25565b60008060408385031215612c8b578182fd5b50508035926020909101359150565b60008151808452612cb2816020860160208601613e5e565b601f01601f19169290920160200192915050565b60008151612cd8818560208601613e5e565b9290920192915050565b8054600090600181811c9080831680612cfc57607f831692505b6020808410821415612d1c57634e487b7160e01b86526022600452602486fd5b818015612d305760018114612d4157612d6e565b60ff19861689528489019650612d6e565b60008881526020902060005b86811015612d665781548b820152908501908301612d4d565b505084890196505b50505050505092915050565b60008351612d8c818460208801613e5e565b835190830190612da0818360208801613e5e565b01949350505050565b60008451612dbb818460208901613e5e565b845190830190612dcf818360208901613e5e565b8451910190612de2818360208801613e5e565b0195945050505050565b60008551612dfe818460208a01613e5e565b855190830190612e12818360208a01613e5e565b8551910190612e25818360208901613e5e565b8451910190612e38818360208801613e5e565b019695505050505050565b60008651612e55818460208b01613e5e565b865190830190612e69818360208b01613e5e565b8651910190612e7c818360208a01613e5e565b8551910190612e8f818360208901613e5e565b8451910190612ea2818360208801613e5e565b01979650505050505050565b60008a51612ec0818460208f01613e5e565b8a51612ed28183860160208f01613e5e565b8a519184010190612ee7818360208e01613e5e565b8951612ef98183850160208e01613e5e565b8951929091010190612f0f818360208c01613e5e565b8751612f218183850160208c01613e5e565b8751929091010190612f37818360208a01613e5e565b8551910190612f4a818360208901613e5e565b8451612f5c8183850160208901613e5e565b9101019b9a5050505050505050505050565b6b1e31b4b931b6329031bc1e9160a11b81528551600090612f9681600c850160208b01613e5e565b65111031bc9e9160d11b600c918401918201528651612fbc816012840160208b01613e5e565b641110391e9160d91b601292909101918201528551612fe2816017840160208a01613e5e565b6711103334b6361e9160c11b60179290910191820152613005601f820186612ce2565b69111039ba3937b5b29e9160b11b81529050613024600a820185612ce2565b631110179f60e11b815260040198975050505050505050565b7f3c7061746820643d224d353520333561313320313320302030312d312e37342081527f362e3333632d322e353920342e34392d382e333420382e38372d31392031312e60208201527f39316c2d322e33392e363441313235203132352030203031392035376138203860408201527f20302030312d382d3863302d3320312e352d352e323520342e352d376131322060608201527f31322030203031332d312e31352037302037302030203031392e37312d312e3560808201527f346c372d2e38366136312e36382036312e36382030203030382e31392d312e3760a08201527f386c31322e33372d372e3032413334203334203020303034382032377337203260c08201526c101b901c3d11103334b6361e9160991b60e0820152600061316960ed830185612ce2565b7f22207374726f6b653d2223303030222f3e3c7061746820643d224d343820323781527f61333420333420302030312d322e3320322e36356c2d31322e333720372e303260208201527f6136312e36382036312e363820302030312d382e313920312e37386c2d372e3060408201527f2e3836632d332e322e322d362e352e382d392e373120312e353441382038203060608201527f2030313620333563302d3520332e34332d3820392e31362d392e332e36362d2e60808201527f313720312e33352d2e333120322e30372d2e34346c352e39312d2e383843323960a08201527f2e39382032332e322033362e352032302e39392033392031366331302030203960c082015270101898901c901898bd11103334b6361e9160791b60e08201526126d261329a60f1830186612ce2565b70111039ba3937b5b29e911198181811179f60791b815260110190565b7f3c726563742077696474683d223130302522206865696768743d223130302522815266103334b6361e9160c91b602082015260006132f96027830184612ce2565b631110179f60e11b81526004019392505050565b7f7b226e616d65223a20225261696e626f7720506f6f7020230000000000000000815260008451613345816018850160208901613e5e565b7f222c20226465736372697074696f6e223a20225261696e626f77506f6f7020696018918401918201527f73206e6f74206a7573742061207069656365206f6620736869742c206275742060388201527f616c736f2061207261696e626f7720706f6f7020f09f8c88f09f92a92e20220060588201526d161130ba3a3934b13aba32b9911d60911b607782015284516133e5816085840160208901613e5e565b7f2c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160859290910191820152641cd94d8d0b60da1b60a582015283516134318160aa840160208801613e5e565b61227d60f01b60aa929091019182015260ac0195945050505050565b681e3830ba3410321e9160b91b81528251600090613472816009850160208801613e5e565b7f22207374796c653d227374726f6b652d6c696e656361703a726f756e643b7374600991840191820152713937b5b29d119818181d91103334b6361e9160711b60298201526134c4603b820185612ce2565b6211179f60e91b815260030195945050505050565b6c1e32b63634b839b29031bc1e9160991b8152865160009061350281600d850160208c01613e5e565b65111031bc9e9160d11b600d918401918201528751613528816013840160208c01613e5e565b651110393c1e9160d11b60139290910191820152865161354f816019840160208b01613e5e565b651110393c9e9160d11b60199290910191820152855161357681601f840160208a01613e5e565b6711103334b6361e9160c11b601f92909101918201526135996027820186612ce2565b69111039ba3937b5b29e9160b11b815290506135ca6135bb600a830186612ce2565b6211179f60e91b815260030190565b9998505050505050505050565b6c1e32b63634b839b29031bc1e9160991b8152845160009061360081600d850160208a01613e5e565b7f222063793d223332222072783d2237222072793d2238222066696c6c3d220000600d91840191820152613637602b820187612ce2565b90507f22207374726f6b653d2223303030222f3e3c656c6c697073652063783d2200008152845161366f81601e840160208901613e5e565b7f222063793d223332222066696c6c3d2223303532653433222072783d22322e35601e92909101918201527f222072793d22332e3522202f3e3c656c6c697073652063783d22000000000000603e82015283516136d3816058840160208801613e5e565b7f222063793d223332222066696c6c3d2223363037643862222072783d22312220605892909101918201526a393c9e9118971b1110179f60a91b60788201526083019695505050505050565b7f3c7061746820643d224d35392034396138203820302030312d3820384839613181527f323520313235203020303032322e38332d332e31326c322e33392d2e3634633160208201527f302e372d332e30342031362e34352d372e34322031392d31312e39314138203860408201527210181018189a9c901a1cbd11103334b6361e9160691b606082015260006137b96073830184612ce2565b70111039ba3937b5b29e911198181811179f60791b81526011019392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161381281601d850160208701613e5e565b91909101601d0192915050565b7f5b7b2274726169745f74797065223a224261636b67726f756e64222c2276616c815260006020643ab2911d1160d91b81840152613860602584018c612ce2565b7f227d2c7b2274726169745f74797065223a2248616972222c2276616c7565223a8152601160f91b82820181905261389b602183018d612ce2565b91507f227d2c7b2274726169745f74797065223a2248656164222c2276616c7565223a825280838301526138d2602183018c612ce2565b7f227d2c7b2274726169745f74797065223a22426f74746f6d222c2276616c7565815262111d1160e91b84820152915061390f602383018b612ce2565b91507f227d2c7b2274726169745f74797065223a2245796573222c2276616c7565223a82528083830152506139476021820189612ce2565b7f227d2c7b2274726169745f74797065223a224d6f757468222c2276616c7565228152611d1160f11b838201529050613a19613a0a613a046139d16139cb613992602287018d612ce2565b7f227d2c7b2274726169745f74797065223a2247656e65726174696f6e222c227681526630b63ab2911d1160c91b602082015260270190565b8a612ce2565b7f227d2c7b2274726169745f74797065223a2253686974222c2276616c7565223a8152601160f91b602082015260210190565b87612ce2565b62227d5d60e81b815260030190565b9c9b505050505050505050505050565b691e3634b732903c189e9160b11b81528551600090613a4f81600a850160208b01613e5e565b6511103c989e9160d11b600a918401918201528651613a75816010840160208b01613e5e565b6511103c191e9160d11b601092909101918201528551613a9c816016840160208a01613e5e565b6511103c991e9160d11b601692909101918201528451613ac381601c840160208901613e5e565b69111039ba3937b5b29e9160b11b601c9290910191820152613ae86026820185612ce2565b6211179f60e91b815260030198975050505050505050565b681e3932b1ba103c1e9160b91b81528751600090613b25816009850160208d01613e5e565b6411103c9e9160d91b6009918401918201528851613b4a81600e840160208d01613e5e565b651110393c1e9160d11b600e92909101918201528751613b71816014840160208c01613e5e565b6811103bb4b23a341e9160b91b601492909101918201528651613b9b81601d840160208b01613e5e565b6911103432b4b3b43a1e9160b11b601d9290910191820152613c15613c05613bff613be9613be3613bcf602787018c612cc6565b6711103334b6361e9160c11b815260080190565b89612ce2565b69111039ba3937b5b29e9160b11b8152600a0190565b86612ce2565b6311179f1160e11b815260040190565b9a9950505050505050505050565b7f3c7061746820643d224d3339203136632d322e3520342e39392d392e3032203781527f2e322d31352e383620382e33386c2d352e39312e3838632d2e37322e31332d3160208201527f2e34312e32372d322e30372e343443392e36322031362e35362031362e33362060408201527f31312e3837203234203963362e32382d322e333620322d3820322d382039203060608201527310189b101c90189990189abd11103334b6361e9160611b608082015260006137b96094830184612ce2565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061286190830184612c9a565b602081526000612a5b6020830184612c9a565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60006001600160801b03808316818516808303821115612da057612da0613f2d565b60008219821115613de757613de7613f2d565b500190565b600082613dfb57613dfb613f43565b500490565b6000816000190483118215151615613e1a57613e1a613f2d565b500290565b60006001600160801b0383811690831681811015613e3f57613e3f613f2d565b039392505050565b600082821015613e5957613e59613f2d565b500390565b60005b83811015613e79578181015183820152602001613e61565b83811115610d765750506000910152565b600081613e9957613e99613f2d565b506000190190565b600181811c90821680613eb557607f821691505b60208210811415613ed657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613ef057613ef0613f2d565b5060010190565b600082613f0657613f06613f43565b500690565b600060ff831680613f1e57613f1e613f43565b8060ff84160691505092915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146109d757600080fdfe4d33302035346337203020392d352031302d396131203120302030302d312d3120323620323620302030312d313720302031203120302030302d3120314332302034382032322035342033302035347a3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076696577426f783d22302030203630203630223e3c646566733e3c6c696e6561724772616469656e742069643d227261696e626f77222078313d223025222079313d223025222078323d223025222079323d2231303025223e3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2223666632663262222f3e3c73746f70206f66667365743d22313725222073746f702d636f6c6f723d2223666635373232222f3e3c73746f70206f66667365743d22333325222073746f702d636f6c6f723d2223666665623362222f3e3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d2223346361663530222f3e3c73746f70206f66667365743d22363625222073746f702d636f6c6f723d2223303361396634222f3e3c73746f70206f66667365743d22383325222073746f702d636f6c6f723d2223363733616237222f3e3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d2223396332376230222f3e3c2f6c696e6561724772616469656e743e3c2f646566733e3c7265637420783d2231342220793d223238222072783d2234222077696474683d22333322206865696768743d223822207374726f6b652d77696474683d2233222066696c6c3d222330336139663422207374726f6b653d222330303022202f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220ee0e2fef1cf07355e2661d697a4ea072f754d81e0de072562dbc6bb1c2086d9e64736f6c63430008040033

Deployed Bytecode Sourcemap

42850:18069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27846:372;;;;;;;;;;-1:-1:-1;27846:372:0;;;;;:::i;:::-;;:::i;:::-;;;34147:14:1;;34140:22;34122:41;;34110:2;34095:18;27846:372:0;;;;;;;;29651:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31175:214::-;;;;;;;;;;-1:-1:-1;31175:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;33166:32:1;;;33148:51;;33136:2;33121:18;31175:214:0;33103:102:1;30733:376:0;;;;;;;;;;-1:-1:-1;30733:376:0;;;;;:::i;:::-;;:::i;:::-;;46519:124;;;;;;;;;;-1:-1:-1;46519:124:0;;;;;:::i;:::-;;:::i;26270:100::-;;;;;;;;;;-1:-1:-1;26323:7:0;26350:12;26270:100;;;43549:25:1;;;43537:2;43522:18;26270:100:0;43504:76:1;32051:162:0;;;;;;;;;;-1:-1:-1;32051:162:0;;;;;:::i;:::-;;:::i;60510:186::-;;;;;;;;;;-1:-1:-1;60510:186:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;33895:32:1;;;33877:51;;33959:2;33944:18;;33937:34;;;;33850:18;60510:186:0;33832:145:1;26951:823:0;;;;;;;;;;-1:-1:-1;26951:823:0;;;;;:::i;:::-;;:::i;60704:175::-;;;;;;;;;;;;;:::i;32284:177::-;;;;;;;;;;-1:-1:-1;32284:177:0;;;;;:::i;:::-;;:::i;26447:201::-;;;;;;;;;;-1:-1:-1;26447:201:0;;;;;:::i;:::-;;:::i;29460:124::-;;;;;;;;;;-1:-1:-1;29460:124:0;;;;;:::i;:::-;;:::i;28282:221::-;;;;;;;;;;-1:-1:-1;28282:221:0;;;;;:::i;:::-;;:::i;2960:94::-;;;;;;;;;;;;;:::i;2309:87::-;;;;;;;;;;-1:-1:-1;2382:6:0;;-1:-1:-1;;;;;2382:6:0;2309:87;;29820:104;;;;;;;;;;;;;:::i;31461:288::-;;;;;;;;;;-1:-1:-1;31461:288:0;;;;;:::i;:::-;;:::i;45300:315::-;;;;;;:::i;:::-;;:::i;32532:318::-;;;;;;;;;;-1:-1:-1;32532:318:0;;;;;:::i;:::-;;:::i;45623:888::-;;;;;;;;;;-1:-1:-1;45623:888:0;;;;;:::i;:::-;;:::i;60303:199::-;;;;;;;;;;-1:-1:-1;60303:199:0;;;;;:::i;:::-;;:::i;37147:43::-;;;;;;;;;;;;;;;;31820:164;;;;;;;;;;-1:-1:-1;31820:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31941:25:0;;;31917:4;31941:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31820:164;3209:192;;;;;;;;;;-1:-1:-1;3209:192:0;;;;;:::i;:::-;;:::i;27846:372::-;27948:4;-1:-1:-1;;;;;;27985:40:0;;-1:-1:-1;;;27985:40:0;;:105;;-1:-1:-1;;;;;;;28042:48:0;;-1:-1:-1;;;28042:48:0;27985:105;:172;;;-1:-1:-1;;;;;;;28107:50:0;;-1:-1:-1;;;28107:50:0;27985:172;:225;;;-1:-1:-1;;;;;;;;;;23833:40:0;;;28174:36;27965:245;27846:372;-1:-1:-1;;27846:372:0:o;29651:100::-;29705:13;29738:5;29731:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29651:100;:::o;31175:214::-;31243:7;31271:16;31279:7;31271;:16::i;:::-;31263:74;;;;-1:-1:-1;;;31263:74:0;;42788:2:1;31263:74:0;;;42770:21:1;42827:2;42807:18;;;42800:30;42866:34;42846:18;;;42839:62;-1:-1:-1;;;42917:18:1;;;42910:43;42970:19;;31263:74:0;;;;;;;;;-1:-1:-1;31357:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31357:24:0;;31175:214::o;30733:376::-;30806:13;30822:24;30838:7;30822:15;:24::i;:::-;30806:40;;30871:5;-1:-1:-1;;;;;30865:11:0;:2;-1:-1:-1;;;;;30865:11:0;;;30857:58;;;;-1:-1:-1;;;30857:58:0;;40032:2:1;30857:58:0;;;40014:21:1;40071:2;40051:18;;;40044:30;40110:34;40090:18;;;40083:62;-1:-1:-1;;;40161:18:1;;;40154:32;40203:19;;30857:58:0;40004:224:1;30857:58:0;1177:10;-1:-1:-1;;;;;30936:21:0;;;;:62;;-1:-1:-1;30961:37:0;30978:5;1177:10;31820:164;:::i;30961:37::-;30928:132;;;;-1:-1:-1;;;30928:132:0;;36972:2:1;30928:132:0;;;36954:21:1;37011:2;36991:18;;;36984:30;37050:34;37030:18;;;37023:62;37121:27;37101:18;;;37094:55;37166:19;;30928:132:0;36944:247:1;30928:132:0;31073:28;31082:2;31086:7;31095:5;31073:8;:28::i;:::-;30733:376;;;:::o;46519:124::-;46574:13;46607:28;46615:19;46626:7;46615:10;:19::i;:::-;46607:7;:28::i;32051:162::-;32177:28;32187:4;32193:2;32197:7;32177:9;:28::i;60510:186::-;60591:16;;60659:4;60684:3;60667:13;:9;60679:1;60667:13;:::i;:::-;60666:21;;;;:::i;:::-;60643:45;;;;60510:186;;;;;:::o;26951:823::-;27040:7;27076:16;27086:5;27076:9;:16::i;:::-;27068:5;:24;27060:71;;;;-1:-1:-1;;;27060:71:0;;34600:2:1;27060:71:0;;;34582:21:1;34639:2;34619:18;;;34612:30;34678:34;34658:18;;;34651:62;-1:-1:-1;;;34729:18:1;;;34722:32;34771:19;;27060:71:0;34572:224:1;27060:71:0;27142:22;26350:12;;;27142:22;;27274:426;27298:14;27294:1;:18;27274:426;;;27334:31;27368:14;;;:11;:14;;;;;;;;;27334:48;;;;;;;;;-1:-1:-1;;;;;27334:48:0;;;;;-1:-1:-1;;;27334:48:0;;;;;;;;;;;;27401:28;27397:103;;27470:14;;;-1:-1:-1;27397:103:0;27539:5;-1:-1:-1;;;;;27518:26:0;:17;-1:-1:-1;;;;;27518:26:0;;27514:175;;;27584:5;27569:11;:20;27565:77;;;-1:-1:-1;27621:1:0;-1:-1:-1;27614:8:0;;-1:-1:-1;;;27614:8:0;27565:77;27660:13;;;;:::i;:::-;;;;27514:175;-1:-1:-1;27314:3:0;;;;:::i;:::-;;;;27274:426;;;-1:-1:-1;27710:56:0;;-1:-1:-1;;;27710:56:0;;41957:2:1;27710:56:0;;;41939:21:1;41996:2;41976:18;;;41969:30;42035:34;42015:18;;;42008:62;-1:-1:-1;;;42086:18:1;;;42079:44;42140:19;;27710:56:0;41929:236:1;60704:175:0;2382:6;;-1:-1:-1;;;;;2382:6:0;1177:10;2529:23;2521:68;;;;-1:-1:-1;;;2521:68:0;;;;;;;:::i;:::-;60773:60:::1;::::0;60755:12:::1;::::0;60781:10:::1;::::0;60806:21:::1;::::0;60755:12;60773:60;60755:12;60773:60;60806:21;60781:10;60773:60:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60754:79;;;60852:7;60844:27;;;::::0;-1:-1:-1;;;60844:27:0;;39352:2:1;60844:27:0::1;::::0;::::1;39334:21:1::0;39391:1;39371:18;;;39364:29;-1:-1:-1;;;39409:18:1;;;39402:37;39456:18;;60844:27:0::1;39324:156:1::0;60844:27:0::1;2600:1;60704:175::o:0;32284:177::-;32414:39;32431:4;32437:2;32441:7;32414:39;;;;;;;;;;;;:16;:39::i;26447:201::-;26514:7;26550:1;26542:5;:9;:35;;;;-1:-1:-1;26323:7:0;26350:12;26555:5;:22;;26542:35;26534:83;;;;-1:-1:-1;;;26534:83:0;;35821:2:1;26534:83:0;;;35803:21:1;35860:2;35840:18;;;35833:30;35899:34;35879:18;;;35872:62;-1:-1:-1;;;35950:18:1;;;35943:33;35993:19;;26534:83:0;35793:225:1;26534:83:0;-1:-1:-1;26635:5:0;26447:201::o;29460:124::-;29524:7;29551:20;29563:7;29551:11;:20::i;:::-;:25;;29460:124;-1:-1:-1;;29460:124:0:o;28282:221::-;28346:7;-1:-1:-1;;;;;28374:19:0;;28366:75;;;;-1:-1:-1;;;28366:75:0;;37398:2:1;28366:75:0;;;37380:21:1;37437:2;37417:18;;;37410:30;37476:34;37456:18;;;37449:62;-1:-1:-1;;;37527:18:1;;;37520:41;37578:19;;28366:75:0;37370:233:1;28366:75:0;-1:-1:-1;;;;;;28467:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;28467:27:0;;28282:221::o;2960:94::-;2382:6;;-1:-1:-1;;;;;2382:6:0;1177:10;2529:23;2521:68;;;;-1:-1:-1;;;2521:68:0;;;;;;;:::i;:::-;3025:21:::1;3043:1;3025:9;:21::i;:::-;2960:94::o:0;29820:104::-;29876:13;29909:7;29902:14;;;;;:::i;31461:288::-;-1:-1:-1;;;;;31556:24:0;;1177:10;31556:24;;31548:63;;;;-1:-1:-1;;;31548:63:0;;38578:2:1;31548:63:0;;;38560:21:1;38617:2;38597:18;;;38590:30;38656:28;38636:18;;;38629:56;38702:18;;31548:63:0;38550:176:1;31548:63:0;1177:10;31624:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31624:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31624:53:0;;;;;;;;;;31693:48;;34122:41:1;;;31624:42:0;;1177:10;31693:48;;34095:18:1;31693:48:0;;;;;;;31461:288;;:::o;45300:315::-;45380:1;45368:8;:13;;45360:39;;;;-1:-1:-1;;;45360:39:0;;41213:2:1;45360:39:0;;;41195:21:1;41252:2;41232:18;;;41225:30;-1:-1:-1;;;41271:18:1;;;41264:43;41324:18;;45360:39:0;41185:163:1;45360:39:0;45446:14;45429:13;26323:7;26350:12;;26270:100;45429:13;45418:24;;:8;:24;:::i;:::-;:42;;45410:67;;;;-1:-1:-1;;;45410:67:0;;36631:2:1;45410:67:0;;;36613:21:1;36670:2;36650:18;;;36643:30;-1:-1:-1;;;36689:18:1;;;36682:42;36741:18;;45410:67:0;36603:162:1;45410:67:0;45532:12;45520:8;45496:21;45506:10;45496:9;:21::i;:::-;:32;;;;:::i;:::-;:48;;45488:77;;;;-1:-1:-1;;;45488:77:0;;39687:2:1;45488:77:0;;;39669:21:1;39726:2;39706:18;;;39699:30;-1:-1:-1;;;39745:18:1;;;39738:46;39801:18;;45488:77:0;39659:166:1;45488:77:0;45576:31;45586:10;45598:8;45576:9;:31::i;32532:318::-;32691:28;32701:4;32707:2;32711:7;32691:9;:28::i;:::-;32738:48;32761:4;32767:2;32771:7;32780:5;32738:22;:48::i;:::-;32730:112;;;;-1:-1:-1;;;32730:112:0;;;;;;;:::i;:::-;32532:318;;;;:::o;45623:888::-;45688:13;45714;45730:19;45741:7;45730:10;:19::i;:::-;45714:35;;45760:20;45783:637;45960:18;:7;:16;:18::i;:::-;46179:17;46194:1;46179:14;:17::i;:::-;46289:32;46309:10;46317:1;46309:7;:10::i;:::-;46289:13;:32::i;:::-;45864:511;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45783:13;:637::i;:::-;45760:660;;46495:6;46445:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;46431:72;;;;45623:888;;;:::o;60303:199::-;2382:6;;-1:-1:-1;;;;;2382:6:0;1177:10;2529:23;2521:68;;;;-1:-1:-1;;;2521:68:0;;;;;;;:::i;:::-;60423:14:::1;60406:13;26323:7:::0;26350:12;;26270:100;60406:13:::1;60395:24;::::0;:8;:24:::1;:::i;:::-;:42;;60387:67;;;::::0;-1:-1:-1;;;60387:67:0;;36631:2:1;60387:67:0::1;::::0;::::1;36613:21:1::0;36670:2;36650:18;;;36643:30;-1:-1:-1;;;36689:18:1;;;36682:42;36741:18;;60387:67:0::1;36603:162:1::0;60387:67:0::1;60465:29;60475:8;60485;60465:9;:29::i;:::-;60303:199:::0;;:::o;3209:192::-;2382:6;;-1:-1:-1;;;;;2382:6:0;1177:10;2529:23;2521:68;;;;-1:-1:-1;;;2521:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3298:22:0;::::1;3290:73;;;::::0;-1:-1:-1;;;3290:73:0;;35003:2:1;3290:73:0::1;::::0;::::1;34985:21:1::0;35042:2;35022:18;;;35015:30;35081:34;35061:18;;;35054:62;-1:-1:-1;;;35132:18:1;;;35125:36;35178:19;;3290:73:0::1;34975:228:1::0;3290:73:0::1;3374:19;3384:8;3374:9;:19::i;33105:127::-:0;33162:4;33196:1;33186:7;:11;:38;;;;-1:-1:-1;;33212:12:0;;-1:-1:-1;33201:23:0;;33105:127::o;36943:196::-;37058:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;37058:29:0;-1:-1:-1;;;;;37058:29:0;;;;;;;;;37103:28;;37058:24;;37103:28;;;;;;;36943:196;;;:::o;47644:723::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47727:12:0;47777:7;47760:25;;;;;;32944:19:1;;32988:2;32979:12;;32934:63;47760:25:0;;;;-1:-1:-1;;47760:25:0;;;;;;;;;47750:36;;47760:25;47750:36;;;;47820:539;;;;;;47750:36;-1:-1:-1;47760:25:0;47856:31;47882:3;47875:10;;47856:12;:31::i;:::-;47820:539;;;;;;47912:38;47940:1;47932:4;:9;;47945:3;47931:17;47912:12;:38::i;:::-;47820:539;;;;;;47975:39;48003:2;47995:4;:10;;48009:3;47994:18;47975:12;:39::i;:::-;47820:539;;;;;;48041:39;48069:2;48061:4;:10;;48075:3;48060:18;48041:12;:39::i;:::-;47820:539;;;;;;48105:39;48133:2;48125:4;:10;;48139:3;48124:18;48105:12;:39::i;:::-;47820:539;;;;;;48170:39;48198:2;48190:4;:10;;48204:3;48189:18;48170:12;:39::i;:::-;47820:539;;;;;;48240:39;48268:2;48260:4;:10;;48274:3;48259:18;48240:12;:39::i;:::-;47820:539;;;;;;48304:39;48332:2;48324:4;:10;;48338:3;48323:18;48304:12;:39::i;:::-;47820:539;;;;47800:559;47644:723;-1:-1:-1;;;47644:723:0:o;46651:985::-;46705:13;46731:22;:763;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47228:28;47243:1;:12;;;47228:14;:28::i;:::-;46731:763;;;;47271:16;47280:1;:6;;;47271:8;:16::i;:::-;46731:763;;;;47302:16;47311:1;:6;;;47302:8;:16::i;:::-;46731:763;;;;47333:20;47344:1;:8;;;47333:10;:20::i;:::-;46731:763;;;;47368:16;47377:1;:6;;;47368:8;:16::i;:::-;46731:763;;;;47399:18;47409:1;:7;;;47399:9;:18::i;:::-;46731:763;;;;47432:28;47447:1;:12;;;47432:14;:28::i;:::-;46731:763;;;;;;;;;;;;;;;;;-1:-1:-1;;;46731:763:0;;;;;;;;47538:5;47544:1;47538:8;;;;;-1:-1:-1;;;47538:8:0;;;;;;;;;;;;;;;;;;47548;;;;47558;;;;;47568;;;;47578;;;;47588;;;;47598;;;;47608;;;;47618;;;;47521:106;;;;47558:8;;47568;;47578;;47588;;47598;;47608;;47521:106;;:::i;:::-;;;;;;;;;;;;;47507:121;;;46651:985;;;:::o;35277:1548::-;35392:35;35430:20;35442:7;35430:11;:20::i;:::-;35505:18;;35392:58;;-1:-1:-1;35463:22:0;;-1:-1:-1;;;;;35489:34:0;1177:10;-1:-1:-1;;;;;35489:34:0;;:74;;;-1:-1:-1;1177:10:0;35527:20;35539:7;35527:11;:20::i;:::-;-1:-1:-1;;;;;35527:36:0;;35489:74;:128;;;-1:-1:-1;35584:18:0;;35567:50;;1177:10;31820:164;:::i;35567:50::-;35463:155;;35639:17;35631:80;;;;-1:-1:-1;;;35631:80:0;;38933:2:1;35631:80:0;;;38915:21:1;38972:2;38952:18;;;38945:30;39011:34;38991:18;;;38984:62;-1:-1:-1;;;39062:18:1;;;39055:48;39120:19;;35631:80:0;38905:240:1;35631:80:0;35754:4;-1:-1:-1;;;;;35732:26:0;:13;:18;;;-1:-1:-1;;;;;35732:26:0;;35724:77;;;;-1:-1:-1;;;35724:77:0;;37810:2:1;35724:77:0;;;37792:21:1;37849:2;37829:18;;;37822:30;37888:34;37868:18;;;37861:62;-1:-1:-1;;;37939:18:1;;;37932:36;37985:19;;35724:77:0;37782:228:1;35724:77:0;-1:-1:-1;;;;;35820:16:0;;35812:66;;;;-1:-1:-1;;;35812:66:0;;36225:2:1;35812:66:0;;;36207:21:1;36264:2;36244:18;;;36237:30;36303:34;36283:18;;;36276:62;-1:-1:-1;;;36354:18:1;;;36347:35;36399:19;;35812:66:0;36197:227:1;35812:66:0;35999:49;36016:1;36020:7;36029:13;:18;;;35999:8;:49::i;:::-;-1:-1:-1;;;;;36061:18:0;;;;;;:12;:18;;;;;:31;;36091:1;;36061:18;:31;;36091:1;;-1:-1:-1;;;;;36061:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;36061:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;36103:16:0;;-1:-1:-1;36103:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;36103:16:0;;:29;;-1:-1:-1;;36103:29:0;;:::i;:::-;;;-1:-1:-1;;;;;36103:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36166:43:0;;;;;;;;-1:-1:-1;;;;;36166:43:0;;;;;;36192:15;36166:43;;;;;;;;;-1:-1:-1;36143:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;36143:66:0;-1:-1:-1;;;;;;36143:66:0;;;;;;;;;;;36471:11;36155:7;-1:-1:-1;36471:11:0;:::i;:::-;36538:1;36497:24;;;:11;:24;;;;;:29;36449:33;;-1:-1:-1;;;;;;36497:29:0;36493:227;;36561:20;36569:11;36561:7;:20::i;:::-;36557:152;;;36629:64;;;;;;;;36644:18;;-1:-1:-1;;;;;36629:64:0;;;;;;36664:28;;;;36629:64;;;;;;;;;;-1:-1:-1;36602:24:0;;;:11;:24;;;;;;;:91;;;;;;;;;-1:-1:-1;;;36602:91:0;-1:-1:-1;;;;;;36602:91:0;;;;;;;;;;;;36557:152;36756:7;36752:2;-1:-1:-1;;;;;36737:27:0;36746:4;-1:-1:-1;;;;;36737:27:0;;;;;;;;;;;36775:42;35277:1548;;;;;;:::o;28748:650::-;-1:-1:-1;;;;;;;;;;;;;;;;;28851:16:0;28859:7;28851;:16::i;:::-;28843:71;;;;-1:-1:-1;;;28843:71:0;;35410:2:1;28843:71:0;;;35392:21:1;35449:2;35429:18;;;35422:30;35488:34;35468:18;;;35461:62;-1:-1:-1;;;35539:18:1;;;35532:40;35589:19;;28843:71:0;35382:232:1;28843:71:0;28927:26;28979:12;28968:7;:23;28964:103;;29029:22;29039:12;29029:7;:22;:::i;:::-;:26;;29054:1;29029:26;:::i;:::-;29008:47;;28964:103;29099:7;29079:242;29116:18;29108:4;:26;29079:242;;29159:31;29193:17;;;:11;:17;;;;;;;;;29159:51;;;;;;;;;-1:-1:-1;;;;;29159:51:0;;;;;-1:-1:-1;;;29159:51:0;;;;;;;;;;;;29229:28;29225:85;;29285:9;28748:650;-1:-1:-1;;;;28748:650:0:o;29225:85::-;-1:-1:-1;29136:6:0;;;;:::i;:::-;;;;29079:242;;;-1:-1:-1;29333:57:0;;-1:-1:-1;;;29333:57:0;;42372:2:1;29333:57:0;;;42354:21:1;42411:2;42391:18;;;42384:30;42450:34;42430:18;;;42423:62;-1:-1:-1;;;42501:18:1;;;42494:45;42556:19;;29333:57:0;42344:237:1;3409:173:0;3484:6;;;-1:-1:-1;;;;;3501:17:0;;;-1:-1:-1;;;;;;3501:17:0;;;;;;;3534:40;;3484:6;;;3501:17;3484:6;;3534:40;;3465:16;;3534:40;3409:173;;:::o;33240:104::-;33309:27;33319:2;33323:8;33309:27;;;;;;;;;;;;:9;:27::i;38757:804::-;38912:4;-1:-1:-1;;;;;38933:13:0;;15914:20;15962:8;38929:625;;38969:72;;-1:-1:-1;;;38969:72:0;;-1:-1:-1;;;;;38969:36:0;;;;;:72;;1177:10;;39020:4;;39026:7;;39035:5;;38969:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38969:72:0;;;;;;;;-1:-1:-1;;38969:72:0;;;;;;;;;;;;:::i;:::-;;;38965:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39215:13:0;;39211:273;;39258:61;;-1:-1:-1;;;39258:61:0;;;;;;;:::i;39211:273::-;39434:6;39428:13;39419:6;39415:2;39411:15;39404:38;38965:534;-1:-1:-1;;;;;;39092:55:0;-1:-1:-1;;;39092:55:0;;-1:-1:-1;39085:62:0;;38929:625;-1:-1:-1;39538:4:0;38929:625;38757:804;;;;;;:::o;5575:723::-;5631:13;5852:10;5848:53;;-1:-1:-1;;5879:10:0;;;;;;;;;;;;-1:-1:-1;;;5879:10:0;;;;;5575:723::o;5848:53::-;5926:5;5911:12;5967:78;5974:9;;5967:78;;6000:8;;;;:::i;:::-;;-1:-1:-1;6023:10:0;;-1:-1:-1;6031:2:0;6023:10;;:::i;:::-;;;5967:78;;;6055:19;6087:6;6077:17;;;;;;-1:-1:-1;;;6077:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6077:17:0;;6055:39;;6105:154;6112:10;;6105:154;;6139:11;6149:1;6139:11;;:::i;:::-;;-1:-1:-1;6208:10:0;6216:2;6208:5;:10;:::i;:::-;6195:24;;:2;:24;:::i;:::-;6182:39;;6165:6;6172;6165:14;;;;;;-1:-1:-1;;;6165:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;6165:56:0;;;;;;;;-1:-1:-1;6236:11:0;6245:2;6236:11;;:::i;:::-;;;6105:154;;59258:1037;59319:13;59491:14;59506:1;:12;;;59491:28;;;;;;;-1:-1:-1;;;59491:28:0;;;;;;;;;;59600:8;59609:1;:6;;;59600:16;;;;;;;-1:-1:-1;;;59600:16:0;;;;;;;;;;59697:8;59706:1;:6;;;59697:16;;;;;;;-1:-1:-1;;;59697:16:0;;;;;;;;;;59796:10;59807:1;:8;;;59796:20;;;;;;;-1:-1:-1;;;59796:20:0;;;;;;;;;;59897:8;59906:1;:6;;;59897:16;;;;;;;-1:-1:-1;;;59897:16:0;;;;;;;;;;59995:9;60005:1;:7;;;59995:18;;;;;;;-1:-1:-1;;;59995:18:0;;;;;;;;;;60100:14;60115:1;:12;;;60100:28;;;;;;;-1:-1:-1;;;60100:28:0;;;;;;;;;;60209:8;60218:1;:6;;;60209:16;;;;;;;-1:-1:-1;;;60209:16:0;;;;;;;;;;59390:882;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59345:942;;59258:1037;;;:::o;41172:1607::-;41270:11;;41230:13;;41296:8;41292:23;;-1:-1:-1;;41306:9:0;;;;;;;;;-1:-1:-1;41306:9:0;;;41172:1607;-1:-1:-1;41172:1607:0:o;41292:23::-;41367:18;41405:1;41394:7;:3;41400:1;41394:7;:::i;:::-;41393:13;;;;:::i;:::-;41388:19;;:1;:19;:::i;:::-;41367:40;-1:-1:-1;41465:19:0;41497:15;41367:40;41510:2;41497:15;:::i;:::-;41487:26;;;;;;-1:-1:-1;;;41487:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41487:26:0;;41465:48;;41526:18;41547:5;;;;;;;;;;;;;;;;;41526:26;;41616:1;41609:5;41605:13;41661:2;41653:6;41649:15;41712:1;41680:777;41735:3;41732:1;41729:10;41680:777;;;41790:1;41833:12;;;;;41827:19;41928:4;41916:2;41912:14;;;;;41894:40;;41888:47;42037:2;42033:14;;;42029:25;;42015:40;;42009:47;42166:1;42162:13;;;42158:24;;42144:39;;42138:46;42286:16;;;;42272:31;;42266:38;41964:1;41960:11;;;42058:4;42005:58;;;41996:68;42089:11;;42134:57;;;42125:67;;;;42217:11;;42262:49;;42253:59;42341:3;42337:13;42370:22;;42440:1;42425:17;;;;41783:9;41680:777;;;41684:44;42489:1;42484:3;42480:11;42510:1;42505:84;;;;42608:1;42603:82;;;;42473:212;;42505:84;-1:-1:-1;;;;;42538:17:0;;42531:43;42505:84;;42603:82;-1:-1:-1;;;;;42636:17:0;;42629:41;42473:212;-1:-1:-1;;;42701:26:0;;;42708:6;41172:1607;-1:-1:-1;;;;41172:1607:0:o;48375:97::-;48430:5;48456:7;48462:1;48456:3;:7;:::i;48988:503::-;49043:5;49071:1;49065:3;:7;;;49061:48;;;-1:-1:-1;49096:1:0;;48988:503;-1:-1:-1;48988:503:0:o;49061:48::-;49129:2;49123:3;:8;;;49119:49;;;-1:-1:-1;49155:1:0;;48988:503;-1:-1:-1;48988:503:0:o;49119:49::-;49188:2;49182:3;:8;;;49178:49;;;-1:-1:-1;49214:1:0;;48988:503;-1:-1:-1;48988:503:0:o;49178:49::-;49247:2;49241:3;:8;;;49237:49;;;-1:-1:-1;49273:1:0;;48988:503;-1:-1:-1;48988:503:0:o;49237:49::-;49306:2;49300:3;:8;;;49296:49;;;-1:-1:-1;49332:1:0;;48988:503;-1:-1:-1;48988:503:0:o;49296:49::-;49365:3;49359;:9;;;49355:50;;;-1:-1:-1;49392:1:0;;48988:503;-1:-1:-1;48988:503:0:o;49355:50::-;49425:3;49419;:9;;;49415:50;;;-1:-1:-1;49452:1:0;;48988:503;-1:-1:-1;48988:503:0:o;49415:50::-;-1:-1:-1;49482:1:0;;48988:503;-1:-1:-1;48988:503:0:o;48480:500::-;48535:5;48563:1;48557:3;:7;;;48553:48;;;-1:-1:-1;48588:1:0;;48480:500;-1:-1:-1;48480:500:0:o;48553:48::-;48621:1;48615:3;:7;;;48611:48;;;-1:-1:-1;48646:1:0;;48480:500;-1:-1:-1;48480:500:0:o;48611:48::-;48679:1;48673:3;:7;;;48669:48;;;-1:-1:-1;48704:1:0;;48480:500;-1:-1:-1;48480:500:0:o;48669:48::-;48737:2;48731:3;:8;;;48727:49;;;-1:-1:-1;48763:1:0;;48480:500;-1:-1:-1;48480:500:0:o;48727:49::-;48796:2;48790:3;:8;;;48786:49;;;-1:-1:-1;48822:1:0;;48480:500;-1:-1:-1;48480:500:0:o;48786:49::-;48855:2;48849:3;:8;;;48845:49;;;-1:-1:-1;48881:1:0;;48480:500;-1:-1:-1;48480:500:0:o;48845:49::-;48914:3;48908;:9;;;48904:50;;;-1:-1:-1;48941:1:0;;48480:500;-1:-1:-1;48480:500:0:o;49499:106::-;49554:5;49586:2;49580:3;:8;;;49579:18;;49596:1;49579:18;;;49592:1;49572:25;49499:106;-1:-1:-1;;49499:106:0:o;49613:198::-;49672:13;49772:14;49787:5;49772:21;;;;;;;-1:-1:-1;;;49772:21:0;;;;;;;;;;49712:90;;;;;;;;:::i;49819:438::-;49872:13;50155:11;50167:5;50155:18;;;;;;;-1:-1:-1;;;50155:18:0;;;;;;;;;;49943:291;;;;;;;;:::i;50265:858::-;50318:13;50690:11;50702:5;50690:18;;;;;;;-1:-1:-1;;;50690:18:0;;;;;;;;;;51021:11;51033:5;51021:18;;;;;;;-1:-1:-1;;;51021:18:0;;;;;;;;;;50389:711;;;;;;;;;:::i;51131:409::-;51186:13;51436;51450:5;51436:20;;;;;;;-1:-1:-1;;;51436:20:0;;;;;;;;;;51257:260;;;;;;;;:::i;51548:1470::-;51601:13;51631:10;;;51627:159;;51689:25;51701:2;51705;51709:1;51712;51689:11;:25::i;:::-;51716;51728:2;51732;51736:1;51739;51716:11;:25::i;:::-;51743:29;51753:2;51757;51761:1;51764;51767;51770;51743:9;:29::i;:::-;51672:101;;;;;;;;;;:::i;51627:159::-;51800:5;:10;;51809:1;51800:10;51796:171;;;51858:29;51870:2;51874;51878:1;51881;51884:2;51858:11;:29::i;:::-;51889;51901:2;51905;51909:1;51912;51915:2;51889:11;:29::i;:::-;51920:33;51930:1;51933:2;51937:1;51940:2;51944:1;51947;51950:2;51920:9;:33::i;51796:171::-;51981:5;:10;;51990:1;51981:10;51977:228;;;52008:106;;;;;;;;;;;;;;;;;;51548:1470;-1:-1:-1;;51548:1470:0:o;51977:228::-;52219:5;:10;;52228:1;52219:10;52215:171;;;52277:31;52287:2;52291;52295:1;52298:2;52302;52306:1;52277:9;:31::i;:::-;52310;52320:2;52324;52328:1;52331:2;52335;52339:1;52310:9;:31::i;:::-;52343:29;52353:2;52357;52361:1;52364;52367;52370;52343:9;:29::i;52215:171::-;52400:5;:10;;52409:1;52400:10;52396:196;;;52458:26;52470:2;52474;52478:1;52481:2;52458:11;:26::i;:::-;52486;52498:2;52502;52506:1;52509:2;52486:11;:26::i;:::-;52514:31;52524:2;52528;52532:1;52535:2;52539:1;52542:2;52514:9;:31::i;:::-;52547;52557:2;52561;52565:1;52568:2;52572:1;52575:2;52547:9;:31::i;:::-;52441:138;;;;;;;;;;;:::i;52396:196::-;52606:5;:10;;52615:1;52606:10;52602:194;;;52664:26;52676:2;52680;52684:1;52687:2;52664:11;:26::i;:::-;52692;52704:2;52708;52712:1;52715:2;52692:11;:26::i;:::-;52720:30;52733:2;52737;52741:1;52744;52747:2;52720:12;:30::i;:::-;52752;52765:2;52769;52773:1;52776;52779:2;52752:12;:30::i;52602:194::-;52810:5;:10;;52819:1;52810:10;52806:130;;;52868:26;52880:2;52884;52888:1;52891:2;52868:11;:26::i;:::-;52896;52908:2;52912;52916:1;52919:2;52896:11;:26::i;:::-;52851:72;;;;;;;;;:::i;52806:130::-;52977:14;52986:4;52977:8;:14::i;:::-;52993:15;53002:5;52993:8;:15::i;53026:1364::-;53080:13;53110:10;;;53106:112;;53165:41;;;;;;;;;;;;;;;;;;53204:1;53165:9;:41::i;53106:112::-;53232:5;:10;;53241:1;53232:10;53228:110;;;53287:39;;;;;;;;;;;;;;;;;;53324:1;53287:9;:39::i;53228:110::-;53352:5;:10;;53361:1;53352:10;53348:460;;;53500:30;53510:2;53514;53518:1;53521:2;53525:1;53528;53500:9;:30::i;:::-;53557:29;53567:2;53571;53575;53579;53583;53557:9;:29::i;:::-;53613;53623:2;53627;53631;53635;53639;53613:9;:29::i;:::-;53669;53679:2;53683;53687;53691;53695;53669:9;:29::i;:::-;53725;53735:2;53739;53743;53747;53751;53725:9;:29::i;:::-;53457:320;;;;;;;;;;;;:::i;53348:460::-;53822:5;:10;;53831:1;53822:10;53818:111;;;53878:39;;;;;;;;;;;;;;-1:-1:-1;;;53878:39:0;;;53914:2;53878:9;:39::i;53818:111::-;53943:5;:10;;53952:1;53943:10;53939:105;;;53999:33;54012:2;54016;54020:1;54023;54026;54029:2;53999:12;:33::i;53939:105::-;54058:5;:10;;54067:1;54058:10;54054:111;;;54114:39;;;;;;;;;;;;;;-1:-1:-1;;;54114:39:0;;;54150:2;54114:9;:39::i;54054:111::-;54179:5;:10;;54188:1;54179:10;54175:169;;;54236:96;;;;;;;;;;;;;;;;;;54330:1;54236:9;:96::i;54175:169::-;-1:-1:-1;;54373:9:0;;;;;;;;;-1:-1:-1;54373:9:0;;;53026:1364::o;54398:206::-;54457:13;54490:10;;;;:106;;;;;;;;;;;;;;;;;54510:80;;;;;;29380:66:1;29368:79;;-1:-1:-1;;;29472:2:1;29463:12;;29456:36;-1:-1:-1;;;29517:2:1;29508:12;;29501:42;-1:-1:-1;;;29568:2:1;29559:12;;29552:31;29608:2;29599:12;;29358:259;33707:1316:0;33830:20;26350:12;;33853:17;;33869:1;33853:17;:::i;:::-;33830:40;-1:-1:-1;;;;;;33889:16:0;;33881:62;;;;-1:-1:-1;;;33881:62:0;;41555:2:1;33881:62:0;;;41537:21:1;41594:2;41574:18;;;41567:30;41633:34;41613:18;;;41606:62;-1:-1:-1;;;41684:18:1;;;41677:31;41725:19;;33881:62:0;41527:223:1;33881:62:0;34088:21;34096:12;34088:7;:21::i;:::-;34087:22;34079:64;;;;-1:-1:-1;;;34079:64:0;;40855:2:1;34079:64:0;;;40837:21:1;40894:2;40874:18;;;40867:30;40933:31;40913:18;;;40906:59;40982:18;;34079:64:0;40827:179:1;34079:64:0;34174:12;34162:8;:24;;34154:71;;;;-1:-1:-1;;;34154:71:0;;43202:2:1;34154:71:0;;;43184:21:1;43241:2;43221:18;;;43214:30;43280:34;43260:18;;;43253:62;-1:-1:-1;;;43331:18:1;;;43324:32;43373:19;;34154:71:0;43174:224:1;34154:71:0;-1:-1:-1;;;;;34345:16:0;;34312:30;34345:16;;;:12;:16;;;;;;;;;34312:49;;;;;;;;;-1:-1:-1;;;;;34312:49:0;;;;;-1:-1:-1;;;34312:49:0;;;;;;;;;;;34391:98;;;;;;;;34403:19;;34312:49;;34391:98;;;34403:39;;34433:8;;34403:39;:::i;:::-;-1:-1:-1;;;;;34391:98:0;;;;;34479:8;34444:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;34391:98:0;;;;;;-1:-1:-1;;;;;34372:16:0;;;;;;;:12;:16;;;;;;;;:117;;;;;;;;-1:-1:-1;;;34372:117:0;;;;;;;;;;;;34528:43;;;;;;;;;;;34554:15;34528:43;;;;;;;;34500:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;34500:71:0;-1:-1:-1;;;;;;34500:71:0;;;;;;;;;;;;;;;;;;34512:12;;34632:276;34656:8;34652:1;:12;34632:276;;;34691:38;;34716:12;;-1:-1:-1;;;;;34691:38:0;;;34708:1;;34691:38;;34708:1;;34691:38;34752:59;34783:1;34787:2;34791:12;34805:5;34752:22;:59::i;:::-;34744:123;;;;-1:-1:-1;;;34744:123:0;;;;;;;:::i;:::-;34882:14;;;;:::i;:::-;;;;34666:3;;;;;:::i;:::-;;;;34632:276;;;;34936:8;34920:12;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;34955:60:0;;-1:-1:-1;32532:318:0;58381:196;58506:13;58539:30;58551:1;58554;58557;58560:4;58566:2;58539:11;:30::i;:::-;58532:37;58381:196;-1:-1:-1;;;;;58381:196:0:o;57256:254::-;57425:13;57458:44;57468:1;57471;57474:2;57478:5;57485:6;57493:4;57499:2;57458:9;:44::i;:::-;57451:51;57256:254;-1:-1:-1;;;;;;;57256:254:0:o;58585:665::-;58733:13;58880:12;:1;:10;;;:12::i;:::-;58946;:1;:10;;;:12::i;:::-;59011;:1;:10;;;:12::i;:::-;59079:14;59094:4;59079:20;;;;;;;-1:-1:-1;;;59079:20:0;;;;;;;;;;59157:14;59172:6;59157:22;;;;;;;-1:-1:-1;;;59157:22:0;;;;;;;;;;58804:423;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58759:483;;58585:665;;;;;;;:::o;57518:855::-;57710:13;57854:12;:1;:10;;;:12::i;:::-;57919;:1;:10;;;:12::i;:::-;57985:13;:2;:11;;;:13::i;:::-;58055:16;:5;:14;;;:16::i;:::-;58129:17;:6;:15;;;:17::i;:::-;58202:14;58217:4;58202:20;;;;;;;-1:-1:-1;;;58202:20:0;;;;;;;;;;58280:14;58295:6;58280:22;;;;;;;-1:-1:-1;;;58280:22:0;;;;;;;;;;57781:569;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57736:629;;57518:855;;;;;;;;;:::o;56254:227::-;56402:13;56435:38;56448:2;56452;56456;56460;56464:4;56470:2;56435:12;:38::i;:::-;56428:45;56254:227;-1:-1:-1;;;;;;56254:227:0:o;54854:728::-;54910:13;54936:17;54956:32;54957:9;:19;;54974:2;54957:19;;;54969:2;54957:19;54956:30;;;:32::i;:::-;54936:52;;54999:17;55019:32;55020:9;:19;;55037:2;55020:19;;;55032:2;55019:30;:32::i;:::-;55107:452;;54999:52;;-1:-1:-1;55107:452:0;;55184:3;;55265:17;;54999:52;;;;55107:452;;;:::i;54612:234::-;54682:13;54752:1;54809:14;54824:4;54809:20;;;;;;;-1:-1:-1;;;54809:20:0;;;;;;;;;;54722:115;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54708:130;;54612:234;;;;:::o;55590:656::-;55737:13;55882;:2;:11;;;:13::i;:::-;55949;:2;:11;;;:13::i;:::-;56016;:2;:11;;;:13::i;:::-;56083;:2;:11;;;:13::i;:::-;56154:14;56169:6;56154:22;;;;;;;-1:-1:-1;;;56154:22:0;;;;;;;;;;55808:415;;;;;;;;;;;;:::i;56489:759::-;56660:13;56808;:2;:11;;;:13::i;:::-;56875;:2;:11;;;:13::i;:::-;56942;:2;:11;;;:13::i;:::-;57009;:2;:11;;;:13::i;:::-;57078:14;57093:4;57078:20;;;;;;;-1:-1:-1;;;57078:20:0;;;;;;;;;;57156:14;57171:6;57156:22;;;;;;;-1:-1:-1;;;57156:22:0;;;;;;;;;;56731:494;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56686:554;;56489:759;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;:::-;343:39;262:126;-1:-1:-1;;;262:126:1:o;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;745:6;753;761;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:1183::-;1106:6;1114;1122;1130;1183:3;1171:9;1162:7;1158:23;1154:33;1151:2;;;1205:6;1197;1190:22;1151:2;1233:29;1252:9;1233:29;:::i;:::-;1223:39;;1281:38;1315:2;1304:9;1300:18;1281:38;:::i;:::-;1271:48;;1366:2;1355:9;1351:18;1338:32;1328:42;;1421:2;1410:9;1406:18;1393:32;1444:18;1485:2;1477:6;1474:14;1471:2;;;1506:6;1498;1491:22;1471:2;1549:6;1538:9;1534:22;1524:32;;1594:7;1587:4;1583:2;1579:13;1575:27;1565:2;;1621:6;1613;1606:22;1565:2;1662;1649:16;1684:2;1680;1677:10;1674:2;;;1690:18;;:::i;:::-;1765:2;1759:9;1733:2;1819:13;;-1:-1:-1;;1815:22:1;;;1839:2;1811:31;1807:40;1795:53;;;1863:18;;;1883:22;;;1860:46;1857:2;;;1909:18;;:::i;:::-;1949:10;1945:2;1938:22;1984:2;1976:6;1969:18;2024:7;2019:2;2014;2010;2006:11;2002:20;1999:33;1996:2;;;2050:6;2042;2035:22;1996:2;2111;2106;2102;2098:11;2093:2;2085:6;2081:15;2068:46;2134:15;;;2151:2;2130:24;2123:40;;;;1141:1053;;;;-1:-1:-1;1141:1053:1;;-1:-1:-1;;;;1141:1053:1:o;2199:367::-;2264:6;2272;2325:2;2313:9;2304:7;2300:23;2296:32;2293:2;;;2346:6;2338;2331:22;2293:2;2374:29;2393:9;2374:29;:::i;:::-;2364:39;;2453:2;2442:9;2438:18;2425:32;2500:5;2493:13;2486:21;2479:5;2476:32;2466:2;;2527:6;2519;2512:22;2466:2;2555:5;2545:15;;;2283:283;;;;;:::o;2571:264::-;2639:6;2647;2700:2;2688:9;2679:7;2675:23;2671:32;2668:2;;;2721:6;2713;2706:22;2668:2;2749:29;2768:9;2749:29;:::i;:::-;2739:39;2825:2;2810:18;;;;2797:32;;-1:-1:-1;;;2658:177:1:o;2840:255::-;2898:6;2951:2;2939:9;2930:7;2926:23;2922:32;2919:2;;;2972:6;2964;2957:22;2919:2;3016:9;3003:23;3035:30;3059:5;3035:30;:::i;3100:259::-;3169:6;3222:2;3210:9;3201:7;3197:23;3193:32;3190:2;;;3243:6;3235;3228:22;3190:2;3280:9;3274:16;3299:30;3323:5;3299:30;:::i;3364:190::-;3423:6;3476:2;3464:9;3455:7;3451:23;3447:32;3444:2;;;3497:6;3489;3482:22;3444:2;-1:-1:-1;3525:23:1;;3434:120;-1:-1:-1;3434:120:1:o;3559:264::-;3627:6;3635;3688:2;3676:9;3667:7;3663:23;3659:32;3656:2;;;3709:6;3701;3694:22;3656:2;3750:9;3737:23;3727:33;;3779:38;3813:2;3802:9;3798:18;3779:38;:::i;3828:258::-;3896:6;3904;3957:2;3945:9;3936:7;3932:23;3928:32;3925:2;;;3978:6;3970;3963:22;3925:2;-1:-1:-1;;4006:23:1;;;4076:2;4061:18;;;4048:32;;-1:-1:-1;3915:171:1:o;4091:257::-;4132:3;4170:5;4164:12;4197:6;4192:3;4185:19;4213:63;4269:6;4262:4;4257:3;4253:14;4246:4;4239:5;4235:16;4213:63;:::i;:::-;4330:2;4309:15;-1:-1:-1;;4305:29:1;4296:39;;;;4337:4;4292:50;;4140:208;-1:-1:-1;;4140:208:1:o;4353:185::-;4395:3;4433:5;4427:12;4448:52;4493:6;4488:3;4481:4;4474:5;4470:16;4448:52;:::i;:::-;4516:16;;;;;4403:135;-1:-1:-1;;4403:135:1:o;4543:979::-;4628:12;;4593:3;;4685:1;4705:18;;;;4758;;;;4785:2;;4839:4;4831:6;4827:17;4817:27;;4785:2;4865;4913;4905:6;4902:14;4882:18;4879:38;4876:2;;;-1:-1:-1;;;4940:33:1;;4996:4;4993:1;4986:15;5026:4;4947:3;5014:17;4876:2;5057:18;5084:104;;;;5202:1;5197:319;;;;5050:466;;5084:104;-1:-1:-1;;5117:24:1;;5105:37;;5162:16;;;;-1:-1:-1;5084:104:1;;5197:319;43632:4;43651:17;;;43701:4;43685:21;;5291:1;5305:165;5319:6;5316:1;5313:13;5305:165;;;5397:14;;5384:11;;;5377:35;5440:16;;;;5334:10;;5305:165;;;5309:3;;5499:6;5494:3;5490:16;5483:23;;5050:466;;;;;;;4601:921;;;;:::o;6851:470::-;7030:3;7068:6;7062:13;7084:53;7130:6;7125:3;7118:4;7110:6;7106:17;7084:53;:::i;:::-;7200:13;;7159:16;;;;7222:57;7200:13;7159:16;7256:4;7244:17;;7222:57;:::i;:::-;7295:20;;7038:283;-1:-1:-1;;;;7038:283:1:o;7326:664::-;7553:3;7591:6;7585:13;7607:53;7653:6;7648:3;7641:4;7633:6;7629:17;7607:53;:::i;:::-;7723:13;;7682:16;;;;7745:57;7723:13;7682:16;7779:4;7767:17;;7745:57;:::i;:::-;7869:13;;7824:20;;;7891:57;7869:13;7824:20;7925:4;7913:17;;7891:57;:::i;:::-;7964:20;;7561:429;-1:-1:-1;;;;;7561:429:1:o;7995:858::-;8270:3;8308:6;8302:13;8324:53;8370:6;8365:3;8358:4;8350:6;8346:17;8324:53;:::i;:::-;8440:13;;8399:16;;;;8462:57;8440:13;8399:16;8496:4;8484:17;;8462:57;:::i;:::-;8586:13;;8541:20;;;8608:57;8586:13;8541:20;8642:4;8630:17;;8608:57;:::i;:::-;8732:13;;8687:20;;;8754:57;8732:13;8687:20;8788:4;8776:17;;8754:57;:::i;:::-;8827:20;;8278:575;-1:-1:-1;;;;;;8278:575:1:o;8858:1052::-;9181:3;9219:6;9213:13;9235:53;9281:6;9276:3;9269:4;9261:6;9257:17;9235:53;:::i;:::-;9351:13;;9310:16;;;;9373:57;9351:13;9310:16;9407:4;9395:17;;9373:57;:::i;:::-;9497:13;;9452:20;;;9519:57;9497:13;9452:20;9553:4;9541:17;;9519:57;:::i;:::-;9643:13;;9598:20;;;9665:57;9643:13;9598:20;9699:4;9687:17;;9665:57;:::i;:::-;9789:13;;9744:20;;;9811:57;9789:13;9744:20;9845:4;9833:17;;9811:57;:::i;:::-;9884:20;;9189:721;-1:-1:-1;;;;;;;9189:721:1:o;9915:1776::-;10430:3;10468:6;10462:13;10484:53;10530:6;10525:3;10518:4;10510:6;10506:17;10484:53;:::i;:::-;10568:6;10562:13;10584:68;10643:8;10634:6;10629:3;10625:16;10618:4;10610:6;10606:17;10584:68;:::i;:::-;10730:13;;10678:16;;;10674:31;;10752:57;10730:13;10674:31;10786:4;10774:17;;10752:57;:::i;:::-;10840:6;10834:13;10856:72;10919:8;10908;10901:5;10897:20;10890:4;10882:6;10878:17;10856:72;:::i;:::-;11010:13;;10954:20;;;;10950:35;;11032:57;11010:13;10950:35;11066:4;11054:17;;11032:57;:::i;:::-;11120:6;11114:13;11136:72;11199:8;11188;11181:5;11177:20;11170:4;11162:6;11158:17;11136:72;:::i;:::-;11290:13;;11234:20;;;;11230:35;;11312:57;11290:13;11230:35;11346:4;11334:17;;11312:57;:::i;:::-;11436:13;;11391:20;;;11458:57;11436:13;11391:20;11492:4;11480:17;;11458:57;:::i;:::-;11546:6;11540:13;11562:72;11625:8;11614;11607:5;11603:20;11596:4;11588:6;11584:17;11562:72;:::i;:::-;11654:20;;11650:35;;10438:1253;-1:-1:-1;;;;;;;;;;;10438:1253:1:o;11696:1844::-;-1:-1:-1;;;12637:49:1;;12709:13;;12619:3;;12731:62;12709:13;12781:2;12772:12;;12765:4;12753:17;;12731:62;:::i;:::-;-1:-1:-1;;;12852:2:1;12812:16;;;12844:11;;;12837:45;12907:13;;12929:63;12907:13;12978:2;12970:11;;12963:4;12951:17;;12929:63;:::i;:::-;-1:-1:-1;;;13052:2:1;13011:17;;;;13044:11;;;13037:43;13105:13;;13127:63;13105:13;13176:2;13168:11;;13161:4;13149:17;;13127:63;:::i;:::-;-1:-1:-1;;;13250:2:1;13209:17;;;;13242:11;;;13235:49;13303:46;13345:2;13337:11;;13329:6;13303:46;:::i;:::-;-1:-1:-1;;;13358:44:1;;13293:56;-1:-1:-1;13421:46:1;13463:2;13455:11;;13447:6;13421:46;:::i;:::-;-1:-1:-1;;;13476:32:1;;13532:1;13524:10;;12627:913;-1:-1:-1;;;;;;;;12627:913:1:o;13545:1754::-;14051:66;14039:79;;14148:34;14143:2;14134:12;;14127:56;14213:34;14208:2;14199:12;;14192:56;14278:34;14273:2;14264:12;;14257:56;14344:34;14338:3;14329:13;;14322:57;14410:34;14404:3;14395:13;;14388:57;14476:34;14470:3;14461:13;;14454:57;-1:-1:-1;;;14536:3:1;14527:13;;14520:61;-1:-1:-1;14600:48:1;14643:3;14634:13;;14626:6;14600:48;:::i;:::-;14668:66;14657:78;;14764:34;14759:2;14751:11;;14744:55;14828:34;14823:2;14815:11;;14808:55;14892:34;14887:2;14879:11;;14872:55;14957:34;14951:3;14943:12;;14936:56;15022:34;15016:3;15008:12;;15001:56;15087:34;15081:3;15073:12;;15066:56;-1:-1:-1;;;15146:3:1;15138:12;;15131:68;15215:78;15245:47;15287:3;15279:12;;15271:6;15245:47;:::i;:::-;-1:-1:-1;;;6753:59:1;;6837:2;6828:12;;6743:103;15304:623;15664:66;15652:79;;-1:-1:-1;;;15756:2:1;15747:12;;15740:48;-1:-1:-1;15807:47:1;15850:2;15841:12;;15833:6;15807:47;:::i;:::-;-1:-1:-1;;;15863:32:1;;15919:1;15911:10;;15642:285;-1:-1:-1;;;15642:285:1:o;15932:1806::-;16694:66;16689:3;16682:79;16664:3;16790:6;16784:13;16806:62;16861:6;16856:2;16851:3;16847:12;16840:4;16832:6;16828:17;16806:62;:::i;:::-;16932:66;16927:2;16887:16;;;16919:11;;;16912:87;17028:34;17023:2;17015:11;;17008:55;17092:66;17087:2;17079:11;;17072:87;-1:-1:-1;;;17183:3:1;17175:12;;17168:62;17255:13;;17277:64;17255:13;17326:3;17318:12;;17311:4;17299:17;;17277:64;:::i;:::-;17407:66;17401:3;17360:17;;;;17393:12;;;17386:88;-1:-1:-1;;;17498:3:1;17490:12;;17483:29;17537:13;;17559:64;17537:13;17608:3;17600:12;;17593:4;17581:17;;17559:64;:::i;:::-;-1:-1:-1;;;17683:3:1;17642:17;;;;17675:12;;;17668:36;17728:3;17720:12;;16672:1066;-1:-1:-1;;;;;16672:1066:1:o;17743:989::-;-1:-1:-1;;;18240:43:1;;18306:13;;18222:3;;18328:61;18306:13;18378:1;18369:11;;18362:4;18350:17;;18328:61;:::i;:::-;18452:66;18448:1;18408:16;;;18440:10;;;18433:86;-1:-1:-1;;;18543:2:1;18535:11;;18528:69;18616:46;18658:2;18650:11;;18642:6;18616:46;:::i;:::-;-1:-1:-1;;;18671:29:1;;18724:1;18716:10;;18230:502;-1:-1:-1;;;;;18230:502:1:o;18737:2158::-;-1:-1:-1;;;19827:51:1;;19901:13;;19809:3;;19923:62;19901:13;19973:2;19964:12;;19957:4;19945:17;;19923:62;:::i;:::-;-1:-1:-1;;;20044:2:1;20004:16;;;20036:11;;;20029:45;20099:13;;20121:63;20099:13;20170:2;20162:11;;20155:4;20143:17;;20121:63;:::i;:::-;-1:-1:-1;;;20244:2:1;20203:17;;;;20236:11;;;20229:45;20299:13;;20321:63;20299:13;20370:2;20362:11;;20355:4;20343:17;;20321:63;:::i;:::-;-1:-1:-1;;;20444:2:1;20403:17;;;;20436:11;;;20429:45;20499:13;;20521:63;20499:13;20570:2;20562:11;;20555:4;20543:17;;20521:63;:::i;:::-;-1:-1:-1;;;20644:2:1;20603:17;;;;20636:11;;;20629:49;20697:46;20739:2;20731:11;;20723:6;20697:46;:::i;:::-;-1:-1:-1;;;20752:44:1;;20687:56;-1:-1:-1;20812:77:1;20842:46;20884:2;20876:11;;20868:6;20842:46;:::i;:::-;-1:-1:-1;;;6250:30:1;;6305:1;6296:11;;6240:73;20812:77;20805:84;19817:1078;-1:-1:-1;;;;;;;;;19817:1078:1:o;20900:1915::-;-1:-1:-1;;;21695:51:1;;21769:13;;21677:3;;21791:62;21769:13;21841:2;21832:12;;21825:4;21813:17;;21791:62;:::i;:::-;21917:66;21912:2;21872:16;;;21904:11;;;21897:87;22003:46;22045:2;22037:11;;22029:6;22003:46;:::i;:::-;21993:56;;22069:66;22065:2;22058:78;22167:6;22161:13;22183:63;22237:8;22232:2;22228;22224:11;22217:4;22209:6;22205:17;22183:63;:::i;:::-;22311:66;22306:2;22265:17;;;;22298:11;;;22291:87;22407:66;22402:2;22394:11;;22387:87;22499:13;;22521:63;22499:13;22570:2;22562:11;;22555:4;22543:17;;22521:63;:::i;:::-;22649:66;22644:2;22603:17;;;;22636:11;;;22629:87;-1:-1:-1;;;22740:3:1;22732:12;;22725:56;22805:3;22797:12;;21685:1130;-1:-1:-1;;;;;;21685:1130:1:o;22820:805::-;23180:66;23168:79;;23277:34;23272:2;23263:12;;23256:56;23342:34;23337:2;23328:12;;23321:56;-1:-1:-1;;;23402:2:1;23393:12;;23386:72;-1:-1:-1;23477:48:1;23520:3;23511:13;;23503:6;23477:48;:::i;:::-;-1:-1:-1;;;23534:58:1;;23616:2;23608:11;;23158:467;-1:-1:-1;;;23158:467:1:o;23630:448::-;23892:31;23887:3;23880:44;23862:3;23953:6;23947:13;23969:62;24024:6;24019:2;24014:3;24010:12;24003:4;23995:6;23991:17;23969:62;:::i;:::-;24051:16;;;;24069:2;24047:25;;23870:208;-1:-1:-1;;23870:208:1:o;24083:2733::-;25465:66;25460:3;25453:79;25435:3;25551:2;25592:12;25587:3;25583:22;25578:2;25573:3;25569:12;25562:44;25625:47;25668:2;25663:3;25659:12;25651:6;25625:47;:::i;:::-;25692:66;25681:78;;-1:-1:-1;;;25806:11:1;;;25799:23;;;25841:46;25883:2;25875:11;;25867:6;25841:46;:::i;:::-;25831:56;;25907:66;25903:2;25896:78;26003:2;25998;25994;25990:11;25983:23;26025:46;26067:2;26063;26059:11;26051:6;26025:46;:::i;:::-;26091:66;26080:78;;-1:-1:-1;;;26174:11:1;;;26167:38;26015:56;-1:-1:-1;26224:46:1;26266:2;26258:11;;26250:6;26224:46;:::i;:::-;26214:56;;26290:66;26286:2;26279:78;26386:2;26381;26377;26373:11;26366:23;;26408:46;26450:2;26446;26442:11;26434:6;26408:46;:::i;:::-;26474:66;26463:78;;-1:-1:-1;;;26557:11:1;;;26550:35;26398:56;-1:-1:-1;26601:209:1;26631:178;26665:143;26695:112;26729:77;26759:46;26801:2;26793:11;;26785:6;26759:46;:::i;:::-;6022:66;6010:79;;-1:-1:-1;;;6114:2:1;6105:12;;6098:48;6171:2;6162:12;;6000:180;26729:77;26721:6;26695:112;:::i;:::-;6395:66;6383:79;;-1:-1:-1;;;6487:2:1;6478:12;;6471:34;6530:2;6521:12;;6373:166;26665:143;26657:6;26631:178;:::i;:::-;-1:-1:-1;;;5877:30:1;;5932:1;5923:11;;5867:73;26601:209;26594:216;25443:1373;-1:-1:-1;;;;;;;;;;;;25443:1373:1:o;27031:1928::-;-1:-1:-1;;;27975:45:1;;28043:13;;27957:3;;28065:62;28043:13;28115:2;28106:12;;28099:4;28087:17;;28065:62;:::i;:::-;-1:-1:-1;;;28186:2:1;28146:16;;;28178:11;;;28171:45;28241:13;;28263:63;28241:13;28312:2;28304:11;;28297:4;28285:17;;28263:63;:::i;:::-;-1:-1:-1;;;28386:2:1;28345:17;;;;28378:11;;;28371:45;28441:13;;28463:63;28441:13;28512:2;28504:11;;28497:4;28485:17;;28463:63;:::i;:::-;-1:-1:-1;;;28586:2:1;28545:17;;;;28578:11;;;28571:45;28641:13;;28663:63;28641:13;28712:2;28704:11;;28697:4;28685:17;;28663:63;:::i;:::-;-1:-1:-1;;;28786:2:1;28745:17;;;;28778:11;;;28771:53;28843:46;28885:2;28877:11;;28869:6;28843:46;:::i;:::-;-1:-1:-1;;;28898:29:1;;28951:1;28943:10;;27965:994;-1:-1:-1;;;;;;;;27965:994:1:o;29622:2311::-;-1:-1:-1;;;30861:43:1;;30927:13;;30843:3;;30949:61;30927:13;30999:1;30990:11;;30983:4;30971:17;;30949:61;:::i;:::-;-1:-1:-1;;;31069:1:1;31029:16;;;31061:10;;;31054:42;31121:13;;31143:63;31121:13;31192:2;31184:11;;31177:4;31165:17;;31143:63;:::i;:::-;-1:-1:-1;;;31266:2:1;31225:17;;;;31258:11;;;31251:45;31321:13;;31343:63;31321:13;31392:2;31384:11;;31377:4;31365:17;;31343:63;:::i;:::-;-1:-1:-1;;;31466:2:1;31425:17;;;;31458:11;;;31451:51;31527:13;;31549:63;31527:13;31598:2;31590:11;;31583:4;31571:17;;31549:63;:::i;:::-;-1:-1:-1;;;31672:2:1;31631:17;;;;31664:11;;;31657:53;31726:201;31756:170;31790:135;31820:104;31854:69;31884:38;31918:2;31910:11;;31902:6;31884:38;:::i;:::-;-1:-1:-1;;;6609:41:1;;6675:1;6666:11;;6599:84;31854:69;31846:6;31820:104;:::i;:::-;-1:-1:-1;;;5728:45:1;;5798:2;5789:12;;5718:89;31790:135;31782:6;31756:170;:::i;:::-;-1:-1:-1;;;5592:33:1;;5650:1;5641:11;;5582:76;31726:201;31719:208;30851:1082;-1:-1:-1;;;;;;;;;;30851:1082:1:o;31938:872::-;32298:66;32286:79;;32395:34;32390:2;32381:12;;32374:56;32460:34;32455:2;32446:12;;32439:56;32525:34;32520:2;32511:12;;32504:56;-1:-1:-1;;;32585:3:1;32576:13;;32569:74;-1:-1:-1;32662:48:1;32705:3;32696:13;;32688:6;32662:48;:::i;33210:488::-;-1:-1:-1;;;;;33479:15:1;;;33461:34;;33531:15;;33526:2;33511:18;;33504:43;33578:2;33563:18;;33556:34;;;33626:3;33621:2;33606:18;;33599:31;;;33404:4;;33647:45;;33672:19;;33664:6;33647:45;:::i;34174:219::-;34323:2;34312:9;34305:21;34286:4;34343:44;34383:2;34372:9;34368:18;34360:6;34343:44;:::i;38015:356::-;38217:2;38199:21;;;38236:18;;;38229:30;38295:34;38290:2;38275:18;;38268:62;38362:2;38347:18;;38189:182::o;40233:415::-;40435:2;40417:21;;;40474:2;40454:18;;;40447:30;40513:34;40508:2;40493:18;;40486:62;-1:-1:-1;;;40579:2:1;40564:18;;40557:49;40638:3;40623:19;;40407:241::o;43717:253::-;43757:3;-1:-1:-1;;;;;43846:2:1;43843:1;43839:10;43876:2;43873:1;43869:10;43907:3;43903:2;43899:12;43894:3;43891:21;43888:2;;;43915:18;;:::i;43975:128::-;44015:3;44046:1;44042:6;44039:1;44036:13;44033:2;;;44052:18;;:::i;:::-;-1:-1:-1;44088:9:1;;44023:80::o;44108:120::-;44148:1;44174;44164:2;;44179:18;;:::i;:::-;-1:-1:-1;44213:9:1;;44154:74::o;44233:168::-;44273:7;44339:1;44335;44331:6;44327:14;44324:1;44321:21;44316:1;44309:9;44302:17;44298:45;44295:2;;;44346:18;;:::i;:::-;-1:-1:-1;44386:9:1;;44285:116::o;44406:246::-;44446:4;-1:-1:-1;;;;;44559:10:1;;;;44529;;44581:12;;;44578:2;;;44596:18;;:::i;:::-;44633:13;;44455:197;-1:-1:-1;;;44455:197:1:o;44657:125::-;44697:4;44725:1;44722;44719:8;44716:2;;;44730:18;;:::i;:::-;-1:-1:-1;44767:9:1;;44706:76::o;44787:258::-;44859:1;44869:113;44883:6;44880:1;44877:13;44869:113;;;44959:11;;;44953:18;44940:11;;;44933:39;44905:2;44898:10;44869:113;;;45000:6;44997:1;44994:13;44991:2;;;-1:-1:-1;;45035:1:1;45017:16;;45010:27;44840:205::o;45050:136::-;45089:3;45117:5;45107:2;;45126:18;;:::i;:::-;-1:-1:-1;;;45162:18:1;;45097:89::o;45191:380::-;45270:1;45266:12;;;;45313;;;45334:2;;45388:4;45380:6;45376:17;45366:27;;45334:2;45441;45433:6;45430:14;45410:18;45407:38;45404:2;;;45487:10;45482:3;45478:20;45475:1;45468:31;45522:4;45519:1;45512:15;45550:4;45547:1;45540:15;45404:2;;45246:325;;;:::o;45576:135::-;45615:3;-1:-1:-1;;45636:17:1;;45633:2;;;45656:18;;:::i;:::-;-1:-1:-1;45703:1:1;45692:13;;45623:88::o;45716:112::-;45748:1;45774;45764:2;;45779:18;;:::i;:::-;-1:-1:-1;45813:9:1;;45754:74::o;45833:157::-;45863:1;45897:4;45894:1;45890:12;45921:3;45911:2;;45928:18;;:::i;:::-;45980:3;45973:4;45970:1;45966:12;45962:22;45957:27;;;45869:121;;;;:::o;45995:127::-;46056:10;46051:3;46047:20;46044:1;46037:31;46087:4;46084:1;46077:15;46111:4;46108:1;46101:15;46127:127;46188:10;46183:3;46179:20;46176:1;46169:31;46219:4;46216:1;46209:15;46243:4;46240:1;46233:15;46259:127;46320:10;46315:3;46311:20;46308:1;46301:31;46351:4;46348:1;46341:15;46375:4;46372:1;46365:15;46391:131;-1:-1:-1;;;;;;46465:32:1;;46455:43;;46445:2;;46512:1;46509;46502:12

Swarm Source

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